diff --git a/proto/paladin.proto b/proto/paladin.proto index 7e945f7df7..5a219a25c8 100644 --- a/proto/paladin.proto +++ b/proto/paladin.proto @@ -64,6 +64,7 @@ enum PaladinRune { RuneCloakShieldOfRighteousness = 440658; RuneCloakVindicator = 440666; + RuneCloakShockAndAwe = 462834; RuneCloakRighteousVengeance = 440672; RuneChestDivineStorm = 407778; diff --git a/sim/paladin/avenging_wrath.go b/sim/paladin/avenging_wrath.go new file mode 100644 index 0000000000..97c74fecd3 --- /dev/null +++ b/sim/paladin/avenging_wrath.go @@ -0,0 +1,49 @@ +package paladin + +import ( + "time" + + "github.com/wowsims/sod/sim/core" +) + +func (paladin *Paladin) registerAvengingWrath() { + actionID := core.ActionID{SpellID: 407788} + + AvengingWrathAura := paladin.RegisterAura(core.Aura{ + Label: "Avenging Wrath", + ActionID: actionID, + Duration: time.Second * 20, + OnGain: func(aura *core.Aura, sim *core.Simulation) { + aura.Unit.PseudoStats.DamageDealtMultiplier *= 1.2 + }, + OnExpire: func(aura *core.Aura, sim *core.Simulation) { + aura.Unit.PseudoStats.DamageDealtMultiplier /= 1.2 + }, + }) + core.RegisterPercentDamageModifierEffect(AvengingWrathAura, 1.2) + + AvengingWrath := paladin.RegisterSpell(core.SpellConfig{ + ActionID: actionID, + Flags: core.SpellFlagNoOnCastComplete | core.SpellFlagAPL, + + ManaCost: core.ManaCostOptions{ + BaseCost: 0.08, + }, + Cast: core.CastConfig{ + CD: core.Cooldown{ + Timer: paladin.NewTimer(), + Duration: time.Minute*3, + }, + + }, + ApplyEffects: func(sim *core.Simulation, _ *core.Unit, _ *core.Spell) { + AvengingWrathAura.Activate(sim) + }, + }) + + paladin.AddMajorCooldown(core.MajorCooldown{ + Spell: AvengingWrath, + Type: core.CooldownTypeDPS, + + }) +} diff --git a/sim/paladin/holy_shock.go b/sim/paladin/holy_shock.go index d5a306c293..cac63ef19a 100644 --- a/sim/paladin/holy_shock.go +++ b/sim/paladin/holy_shock.go @@ -9,9 +9,18 @@ import ( ) func (paladin *Paladin) registerHolyShock() { + + hasInfusionOfLight := paladin.hasRune(proto.PaladinRune_RuneWaistInfusionOfLight) + + cdTime := time.Second * 30 + if hasInfusionOfLight { + cdTime = time.Second * 6 + } + + paladin.holyShockCooldown = &core.Cooldown{ Timer: paladin.NewTimer(), - Duration: time.Second * 15, + Duration: cdTime, } if !paladin.Talents.HolyShock { @@ -30,11 +39,11 @@ func (paladin *Paladin) registerHolyShock() { {level: 56, spellID: 20930, manaCost: 325, minDamage: 365, maxDamage: 395}, } - hasInfusionOfLight := paladin.hasRune(proto.PaladinRune_RuneWaistInfusionOfLight) - damageMultiplier := core.TernaryFloat64(hasInfusionOfLight, 1.2, 1.0) + + damageMultiplier := core.TernaryFloat64(hasInfusionOfLight, 1.5, 1.0) - hasArtOfWar := paladin.hasRune(proto.PaladinRune_RuneFeetTheArtOfWar) - manaCostMultiplier := core.TernaryFloat64(hasArtOfWar, 0.2, 1.0) + //hasArtOfWar := paladin.hasRune(proto.PaladinRune_RuneFeetTheArtOfWar) + manaCostMultiplier := 1.0//core.TernaryFloat64(hasArtOfWar, 0.2, 1.0) hasWrath := paladin.hasRune(proto.PaladinRune_RuneHeadWrath) @@ -88,7 +97,7 @@ func (paladin *Paladin) registerHolyShock() { if hasInfusionOfLight && result.Outcome.Matches(core.OutcomeCrit) { paladin.AddMana(sim, rank.manaCost, manaMetrics) paladin.holyShockCooldown.Reset() - paladin.exorcismCooldown.Reset() + //paladin.exorcismCooldown.Reset() } }, }) diff --git a/sim/paladin/paladin.go b/sim/paladin/paladin.go index 0f491b85e6..c4b368cd11 100644 --- a/sim/paladin/paladin.go +++ b/sim/paladin/paladin.go @@ -76,6 +76,7 @@ func (paladin *Paladin) Initialize() { paladin.registerDivineFavor() paladin.registerHammerOfWrath() paladin.registerHolyWrath() + paladin.registerAvengingWrath() } func (paladin *Paladin) Reset(_ *core.Simulation) { diff --git a/sim/paladin/retribution/TestRetribution.results b/sim/paladin/retribution/TestRetribution.results index 6cf084e9ce..1ae2d6eaeb 100644 --- a/sim/paladin/retribution/TestRetribution.results +++ b/sim/paladin/retribution/TestRetribution.results @@ -148,12 +148,12 @@ character_stats_results: { stat_weights_results: { key: "TestRetribution-Lvl25-StatWeights-Default" value: { - weights: 0.44437 - weights: 0.25095 + weights: 0.45643 + weights: 0.25634 weights: 0 weights: 0 weights: 0 - weights: 0.13219 + weights: 0.13576 weights: 0 weights: 0 weights: 0 @@ -161,13 +161,13 @@ stat_weights_results: { weights: 0 weights: 0 weights: 0 - weights: 0.47516 + weights: 0.49331 weights: 0 weights: 0 weights: 0 - weights: 0.20199 - weights: 1.35498 - weights: 2.17677 + weights: 0.20747 + weights: 1.40292 + weights: 2.23139 weights: 0 weights: 0 weights: 0 @@ -197,12 +197,12 @@ stat_weights_results: { stat_weights_results: { key: "TestRetribution-Lvl40-StatWeights-Default" value: { - weights: 0.67625 - weights: 0.58429 + weights: 0.66485 + weights: 0.57659 weights: 0 weights: 0 weights: 0 - weights: 0.27466 + weights: 0.23304 weights: 0 weights: 0 weights: 0 @@ -210,13 +210,13 @@ stat_weights_results: { weights: 0 weights: 0 weights: 0 - weights: 2.24056 - weights: 0.06754 + weights: 1.51742 + weights: 0.11162 weights: 0 weights: 0 - weights: 0.30738 - weights: 6.47424 - weights: 7.27739 + weights: 0.3022 + weights: 5.84228 + weights: 4.88324 weights: 0 weights: 0 weights: 0 @@ -246,12 +246,12 @@ stat_weights_results: { stat_weights_results: { key: "TestRetribution-Lvl50-StatWeights-Default" value: { - weights: 1.14339 - weights: 0.81896 + weights: 1.04322 + weights: 1.79414 weights: 0 weights: 0 weights: 0 - weights: 0.44187 + weights: 0.31582 weights: 0 weights: 0 weights: 0 @@ -259,13 +259,13 @@ stat_weights_results: { weights: 0 weights: 0 weights: 0 - weights: 4.89254 - weights: 0.45426 + weights: 2.77618 + weights: 0.58401 weights: 0 weights: 0 - weights: 0.43748 - weights: 7.0091 - weights: 5.43287 + weights: 0.36323 + weights: 15.17741 + weights: 9.11836 weights: 0 weights: 0 weights: 0 @@ -295,315 +295,315 @@ stat_weights_results: { dps_results: { key: "TestRetribution-Lvl25-AllItems-SoulforgeArmor" value: { - dps: 195.69663 - tps: 197.43613 + dps: 201.0554 + tps: 202.7949 } } dps_results: { key: "TestRetribution-Lvl25-Average-Default" value: { - dps: 248.30532 - tps: 254.55191 + dps: 255.06965 + tps: 261.88319 } } dps_results: { key: "TestRetribution-Lvl25-Settings-Dwarf-p1ret-P1 Seal of Command Ret-p1ret-FullBuffs-Phase 1 Consumes-LongMultiTarget" value: { - dps: 173.67039 - tps: 296.83671 + dps: 178.91614 + tps: 318.10113 } } dps_results: { key: "TestRetribution-Lvl25-Settings-Dwarf-p1ret-P1 Seal of Command Ret-p1ret-FullBuffs-Phase 1 Consumes-LongSingleTarget" value: { - dps: 91.55348 - tps: 97.71179 + dps: 94.46404 + tps: 101.42328 } } dps_results: { key: "TestRetribution-Lvl25-Settings-Dwarf-p1ret-P1 Seal of Command Ret-p1ret-FullBuffs-Phase 1 Consumes-ShortSingleTarget" value: { - dps: 99.41627 - tps: 104.11419 + dps: 107.16608 + tps: 116.22147 } } dps_results: { key: "TestRetribution-Lvl25-Settings-Dwarf-p1ret-P1 Seal of Command Ret-p1ret-NoBuffs-Phase 1 Consumes-LongMultiTarget" value: { - dps: 94.47486 - tps: 199.75155 + dps: 96.90556 + tps: 202.09185 } } dps_results: { key: "TestRetribution-Lvl25-Settings-Dwarf-p1ret-P1 Seal of Command Ret-p1ret-NoBuffs-Phase 1 Consumes-LongSingleTarget" value: { - dps: 49.4182 - tps: 54.68203 + dps: 50.7845 + tps: 56.04381 } } dps_results: { key: "TestRetribution-Lvl25-Settings-Dwarf-p1ret-P1 Seal of Command Ret-p1ret-NoBuffs-Phase 1 Consumes-ShortSingleTarget" value: { - dps: 58.58523 - tps: 66.57844 + dps: 63.1924 + tps: 71.18118 } } dps_results: { key: "TestRetribution-Lvl25-Settings-Human-p1ret-P1 Seal of Command Ret-p1ret-FullBuffs-Phase 1 Consumes-LongMultiTarget" value: { - dps: 175.1736 - tps: 299.51203 + dps: 180.45432 + tps: 320.71241 } } dps_results: { key: "TestRetribution-Lvl25-Settings-Human-p1ret-P1 Seal of Command Ret-p1ret-FullBuffs-Phase 1 Consumes-LongSingleTarget" value: { - dps: 92.46098 - tps: 98.6779 + dps: 95.353 + tps: 102.36591 } } dps_results: { key: "TestRetribution-Lvl25-Settings-Human-p1ret-P1 Seal of Command Ret-p1ret-FullBuffs-Phase 1 Consumes-ShortSingleTarget" value: { - dps: 100.05152 - tps: 104.81132 + dps: 107.7788 + tps: 116.88888 } } dps_results: { key: "TestRetribution-Lvl25-Settings-Human-p1ret-P1 Seal of Command Ret-p1ret-NoBuffs-Phase 1 Consumes-LongMultiTarget" value: { - dps: 95.53462 - tps: 201.50639 + dps: 97.93417 + tps: 204.22265 } } dps_results: { key: "TestRetribution-Lvl25-Settings-Human-p1ret-P1 Seal of Command Ret-p1ret-NoBuffs-Phase 1 Consumes-LongSingleTarget" value: { - dps: 49.78055 - tps: 55.07914 + dps: 51.1797 + tps: 56.49412 } } dps_results: { key: "TestRetribution-Lvl25-Settings-Human-p1ret-P1 Seal of Command Ret-p1ret-NoBuffs-Phase 1 Consumes-ShortSingleTarget" value: { - dps: 58.75774 - tps: 66.81345 + dps: 63.3497 + tps: 71.39219 } } dps_results: { key: "TestRetribution-Lvl25-SwitchInFrontOfTarget-Default" value: { - dps: 233.06986 - tps: 239.28678 + dps: 239.48638 + tps: 246.49929 } } dps_results: { key: "TestRetribution-Lvl40-AllItems-SoulforgeArmor" value: { - dps: 330.98056 - tps: 337.96005 + dps: 339.33932 + tps: 346.32483 } } dps_results: { key: "TestRetribution-Lvl40-Average-Default" value: { - dps: 609.3635 - tps: 623.26834 + dps: 573.23614 + tps: 586.48727 } } dps_results: { key: "TestRetribution-Lvl40-Settings-Dwarf-p2retsoc-P2 Seal of Command Ret-p2ret-FullBuffs-Phase 2 Consumes-LongMultiTarget" value: { - dps: 386.86802 - tps: 637.52066 + dps: 374.71716 + tps: 619.00123 } } dps_results: { key: "TestRetribution-Lvl40-Settings-Dwarf-p2retsoc-P2 Seal of Command Ret-p2ret-FullBuffs-Phase 2 Consumes-LongSingleTarget" value: { - dps: 214.76758 - tps: 226.98389 + dps: 207.35619 + tps: 219.23196 } } dps_results: { key: "TestRetribution-Lvl40-Settings-Dwarf-p2retsoc-P2 Seal of Command Ret-p2ret-FullBuffs-Phase 2 Consumes-ShortSingleTarget" value: { - dps: 228.62839 - tps: 240.62646 + dps: 230.23541 + tps: 241.9534 } } dps_results: { key: "TestRetribution-Lvl40-Settings-Dwarf-p2retsoc-P2 Seal of Command Ret-p2ret-NoBuffs-Phase 2 Consumes-LongMultiTarget" value: { - dps: 203.18803 - tps: 367.93449 + dps: 201.66489 + tps: 364.25761 } } dps_results: { key: "TestRetribution-Lvl40-Settings-Dwarf-p2retsoc-P2 Seal of Command Ret-p2ret-NoBuffs-Phase 2 Consumes-LongSingleTarget" value: { - dps: 107.82413 - tps: 115.88333 + dps: 105.88523 + tps: 113.91097 } } dps_results: { key: "TestRetribution-Lvl40-Settings-Dwarf-p2retsoc-P2 Seal of Command Ret-p2ret-NoBuffs-Phase 2 Consumes-ShortSingleTarget" value: { - dps: 126.06416 - tps: 136.6733 + dps: 129.08361 + tps: 139.80772 } } dps_results: { key: "TestRetribution-Lvl40-Settings-Human-p2retsoc-P2 Seal of Command Ret-p2ret-FullBuffs-Phase 2 Consumes-LongMultiTarget" value: { - dps: 386.0649 - tps: 635.99805 + dps: 374.37825 + tps: 618.02471 } } dps_results: { key: "TestRetribution-Lvl40-Settings-Human-p2retsoc-P2 Seal of Command Ret-p2ret-FullBuffs-Phase 2 Consumes-LongSingleTarget" value: { - dps: 215.03086 - tps: 227.13257 + dps: 207.29434 + tps: 219.14243 } } dps_results: { key: "TestRetribution-Lvl40-Settings-Human-p2retsoc-P2 Seal of Command Ret-p2ret-FullBuffs-Phase 2 Consumes-ShortSingleTarget" value: { - dps: 229.57138 - tps: 241.60916 + dps: 231.14567 + tps: 242.86397 } } dps_results: { key: "TestRetribution-Lvl40-Settings-Human-p2retsoc-P2 Seal of Command Ret-p2ret-NoBuffs-Phase 2 Consumes-LongMultiTarget" value: { - dps: 203.99603 - tps: 371.03548 + dps: 200.88112 + tps: 361.7774 } } dps_results: { key: "TestRetribution-Lvl40-Settings-Human-p2retsoc-P2 Seal of Command Ret-p2ret-NoBuffs-Phase 2 Consumes-LongSingleTarget" value: { - dps: 108.09974 - tps: 116.04617 + dps: 106.00914 + tps: 114.10304 } } dps_results: { key: "TestRetribution-Lvl40-Settings-Human-p2retsoc-P2 Seal of Command Ret-p2ret-NoBuffs-Phase 2 Consumes-ShortSingleTarget" value: { - dps: 126.25589 - tps: 136.90979 + dps: 129.3688 + tps: 140.1492 } } dps_results: { key: "TestRetribution-Lvl40-SwitchInFrontOfTarget-Default" value: { - dps: 575.43515 - tps: 589.28541 + dps: 541.83406 + tps: 554.98077 } } dps_results: { key: "TestRetribution-Lvl50-AllItems-SoulforgeArmor" value: { - dps: 741.66325 - tps: 776.17463 + dps: 761.90011 + tps: 796.75547 } } dps_results: { key: "TestRetribution-Lvl50-Average-Default" value: { - dps: 1329.56773 - tps: 1362.19869 + dps: 1193.28664 + tps: 1232.29722 } } dps_results: { key: "TestRetribution-Lvl50-Settings-Dwarf-p3retsom-P3 Seal of Martyrdom Ret-p3ret-FullBuffs-Phase 3 Consumes-LongMultiTarget" value: { - dps: 1305.3738 - tps: 1856.68396 + dps: 1355.78224 + tps: 1901.51578 } } dps_results: { key: "TestRetribution-Lvl50-Settings-Dwarf-p3retsom-P3 Seal of Martyrdom Ret-p3ret-FullBuffs-Phase 3 Consumes-LongSingleTarget" value: { - dps: 357.69694 - tps: 385.32774 + dps: 337.31289 + tps: 364.58807 } } dps_results: { key: "TestRetribution-Lvl50-Settings-Dwarf-p3retsom-P3 Seal of Martyrdom Ret-p3ret-FullBuffs-Phase 3 Consumes-ShortSingleTarget" value: { - dps: 412.50145 - tps: 443.46695 + dps: 403.65778 + tps: 431.41418 } } dps_results: { key: "TestRetribution-Lvl50-Settings-Dwarf-p3retsom-P3 Seal of Martyrdom Ret-p3ret-NoBuffs-Phase 3 Consumes-LongMultiTarget" value: { - dps: 446.5218 - tps: 720.29695 + dps: 469.97354 + tps: 743.85142 } } dps_results: { key: "TestRetribution-Lvl50-Settings-Dwarf-p3retsom-P3 Seal of Martyrdom Ret-p3ret-NoBuffs-Phase 3 Consumes-LongSingleTarget" value: { - dps: 134.88055 - tps: 148.56931 + dps: 131.15389 + tps: 144.84778 } } dps_results: { key: "TestRetribution-Lvl50-Settings-Dwarf-p3retsom-P3 Seal of Martyrdom Ret-p3ret-NoBuffs-Phase 3 Consumes-ShortSingleTarget" value: { - dps: 186.34123 - tps: 204.07747 + dps: 186.6835 + tps: 204.48484 } } dps_results: { key: "TestRetribution-Lvl50-Settings-Human-p3retsom-P3 Seal of Martyrdom Ret-p3ret-FullBuffs-Phase 3 Consumes-LongMultiTarget" value: { - dps: 1311.8285 - tps: 1864.49867 + dps: 1361.08895 + tps: 1909.62289 } } dps_results: { key: "TestRetribution-Lvl50-Settings-Human-p3retsom-P3 Seal of Martyrdom Ret-p3ret-FullBuffs-Phase 3 Consumes-LongSingleTarget" value: { - dps: 360.49712 - tps: 388.16937 + dps: 341.68087 + tps: 369.07226 } } dps_results: { key: "TestRetribution-Lvl50-Settings-Human-p3retsom-P3 Seal of Martyrdom Ret-p3ret-FullBuffs-Phase 3 Consumes-ShortSingleTarget" value: { - dps: 415.31569 - tps: 446.44973 + dps: 406.8862 + tps: 434.73159 } } dps_results: { key: "TestRetribution-Lvl50-Settings-Human-p3retsom-P3 Seal of Martyrdom Ret-p3ret-NoBuffs-Phase 3 Consumes-LongMultiTarget" value: { - dps: 419.2515 - tps: 693.89363 + dps: 458.78293 + tps: 733.82615 } } dps_results: { key: "TestRetribution-Lvl50-Settings-Human-p3retsom-P3 Seal of Martyrdom Ret-p3ret-NoBuffs-Phase 3 Consumes-LongSingleTarget" value: { - dps: 141.8012 - tps: 155.53331 + dps: 134.81793 + tps: 148.57009 } } dps_results: { key: "TestRetribution-Lvl50-Settings-Human-p3retsom-P3 Seal of Martyrdom Ret-p3ret-NoBuffs-Phase 3 Consumes-ShortSingleTarget" value: { - dps: 186.9483 - tps: 204.77703 + dps: 187.03007 + tps: 204.91934 } } dps_results: { key: "TestRetribution-Lvl50-SwitchInFrontOfTarget-Default" value: { - dps: 1247.39828 - tps: 1280.07407 + dps: 1132.19417 + tps: 1170.69885 } } diff --git a/sim/paladin/retribution/TestShockadin.results b/sim/paladin/retribution/TestShockadin.results index f5dcee7eea..e2d03304c9 100644 --- a/sim/paladin/retribution/TestShockadin.results +++ b/sim/paladin/retribution/TestShockadin.results @@ -50,12 +50,12 @@ character_stats_results: { stat_weights_results: { key: "TestShockadin-Lvl40-StatWeights-Default" value: { - weights: 0.70109 - weights: 0.37829 + weights: 0.73113 + weights: -0.00711 weights: 0 weights: 0 weights: 0 - weights: 0.28292 + weights: 0.20397 weights: 0 weights: 0 weights: 0 @@ -63,13 +63,13 @@ stat_weights_results: { weights: 0 weights: 0 weights: 0 - weights: 2.42539 - weights: 0.41781 + weights: 1.99055 + weights: 0.18737 weights: 0 weights: 0 - weights: 0.28971 - weights: -8.78577 - weights: -6.31697 + weights: 0.30212 + weights: 6.84241 + weights: 4.8278 weights: 0 weights: 0 weights: 0 @@ -99,105 +99,105 @@ stat_weights_results: { dps_results: { key: "TestShockadin-Lvl40-AllItems-SoulforgeArmor" value: { - dps: 377.29661 - tps: 395.94838 + dps: 408.89236 + tps: 429.42808 } } dps_results: { key: "TestShockadin-Lvl40-Average-Default" value: { - dps: 564.94819 - tps: 583.48281 + dps: 547.59415 + tps: 572.00863 } } dps_results: { key: "TestShockadin-Lvl40-Settings-Dwarf-p2retsom-P2 Seal of Martyrdom Shockadin-p2ret-FullBuffs-Phase 2 Consumes-LongMultiTarget" value: { - dps: 574.03314 - tps: 859.7505 + dps: 515.95475 + tps: 794.84944 } } dps_results: { key: "TestShockadin-Lvl40-Settings-Dwarf-p2retsom-P2 Seal of Martyrdom Shockadin-p2ret-FullBuffs-Phase 2 Consumes-LongSingleTarget" value: { - dps: 168.02008 - tps: 182.30423 + dps: 149.76546 + tps: 163.69094 } } dps_results: { key: "TestShockadin-Lvl40-Settings-Dwarf-p2retsom-P2 Seal of Martyrdom Shockadin-p2ret-FullBuffs-Phase 2 Consumes-ShortSingleTarget" value: { - dps: 184.6647 - tps: 200.29594 + dps: 176.69829 + tps: 192.55602 } } dps_results: { key: "TestShockadin-Lvl40-Settings-Dwarf-p2retsom-P2 Seal of Martyrdom Shockadin-p2ret-NoBuffs-Phase 2 Consumes-LongMultiTarget" value: { - dps: 284.11197 - tps: 468.77024 + dps: 242.06285 + tps: 427.00913 } } dps_results: { key: "TestShockadin-Lvl40-Settings-Dwarf-p2retsom-P2 Seal of Martyrdom Shockadin-p2ret-NoBuffs-Phase 2 Consumes-LongSingleTarget" value: { - dps: 85.86582 - tps: 95.09873 + dps: 76.02769 + tps: 85.275 } } dps_results: { key: "TestShockadin-Lvl40-Settings-Dwarf-p2retsom-P2 Seal of Martyrdom Shockadin-p2ret-NoBuffs-Phase 2 Consumes-ShortSingleTarget" value: { - dps: 110.29138 - tps: 121.01506 + dps: 103.55904 + tps: 114.48926 } } dps_results: { key: "TestShockadin-Lvl40-Settings-Human-p2retsom-P2 Seal of Martyrdom Shockadin-p2ret-FullBuffs-Phase 2 Consumes-LongMultiTarget" value: { - dps: 576.19125 - tps: 863.55893 + dps: 534.38432 + tps: 813.56919 } } dps_results: { key: "TestShockadin-Lvl40-Settings-Human-p2retsom-P2 Seal of Martyrdom Shockadin-p2ret-FullBuffs-Phase 2 Consumes-LongSingleTarget" value: { - dps: 170.00941 - tps: 184.39817 + dps: 149.23947 + tps: 163.22428 } } dps_results: { key: "TestShockadin-Lvl40-Settings-Human-p2retsom-P2 Seal of Martyrdom Shockadin-p2ret-FullBuffs-Phase 2 Consumes-ShortSingleTarget" value: { - dps: 186.49174 - tps: 202.17974 + dps: 178.16161 + tps: 194.04776 } } dps_results: { key: "TestShockadin-Lvl40-Settings-Human-p2retsom-P2 Seal of Martyrdom Shockadin-p2ret-NoBuffs-Phase 2 Consumes-LongMultiTarget" value: { - dps: 282.59127 - tps: 468.61772 + dps: 248.90445 + tps: 435.18173 } } dps_results: { key: "TestShockadin-Lvl40-Settings-Human-p2retsom-P2 Seal of Martyrdom Shockadin-p2ret-NoBuffs-Phase 2 Consumes-LongSingleTarget" value: { - dps: 87.46112 - tps: 96.76244 + dps: 76.20154 + tps: 85.5154 } } dps_results: { key: "TestShockadin-Lvl40-Settings-Human-p2retsom-P2 Seal of Martyrdom Shockadin-p2ret-NoBuffs-Phase 2 Consumes-ShortSingleTarget" value: { - dps: 111.90114 - tps: 122.69324 + dps: 105.03447 + tps: 116.0252 } } dps_results: { key: "TestShockadin-Lvl40-SwitchInFrontOfTarget-Default" value: { - dps: 548.08357 - tps: 566.95366 + dps: 510.7834 + tps: 535.02541 } } diff --git a/sim/paladin/runes.go b/sim/paladin/runes.go index 9b9dc29e61..6bd374887e 100644 --- a/sim/paladin/runes.go +++ b/sim/paladin/runes.go @@ -12,6 +12,7 @@ func (paladin *Paladin) ApplyRunes() { paladin.registerTheArtOfWar() paladin.registerSheathOfLight() paladin.registerGuardedByTheLight() + paladin.registerShockAndAwe() // "RuneHeadFanaticism" is handled in Exorcism, Holy Shock, SoC, and SoR // "RuneHeadWrath" is handled in Exorcism, Holy Shock, Consecration (and Holy Wrath once implemented) @@ -32,8 +33,7 @@ func (paladin *Paladin) registerTheArtOfWar() { paladin.RegisterAura(core.Aura{ Label: "The Art of War", - Duration: core.NeverExpires, - ActionID: core.ActionID{SpellID: 426157}, + Duration: core.NeverExpires, OnReset: func(aura *core.Aura, sim *core.Simulation) { aura.Activate(sim) }, @@ -41,8 +41,8 @@ func (paladin *Paladin) registerTheArtOfWar() { if !spell.ProcMask.Matches(core.ProcMaskMelee) || !result.Outcome.Matches(core.OutcomeCrit) { return } - paladin.holyShockCooldown.Reset() - paladin.exorcismCooldown.Reset() + //paladin.holyShockCooldown.Reset() + paladin.exorcismCooldown.Set(sim.CurrentTime + max(0, paladin.exorcismCooldown.TimeToReady(sim) - (time.Second * 2))) }, }) } @@ -70,8 +70,7 @@ func (paladin *Paladin) registerSheathOfLight() { }) paladin.RegisterAura(core.Aura{ Label: "Sheath of Light (rune)", - Duration: core.NeverExpires, - ActionID: core.ActionID{SpellID: 426158}, + Duration: core.NeverExpires, OnReset: func(aura *core.Aura, sim *core.Simulation) { aura.Activate(sim) }, @@ -84,6 +83,42 @@ func (paladin *Paladin) registerSheathOfLight() { }) } +func (paladin *Paladin) registerShockAndAwe() { + + if !paladin.hasRune(proto.PaladinRune_RuneCloakShockAndAwe) { + return + } + + dep := paladin.NewDynamicStatDependency( + stats.Intellect, stats.SpellDamage, 1.0, + ) + + shockAndAweAura := paladin.RegisterAura(core.Aura{ + Label: "Shock and Awe", + Duration: time.Second * 60, + ActionID: core.ActionID{SpellID: 462834}, + OnGain: func(aura *core.Aura, sim *core.Simulation) { + paladin.EnableDynamicStatDep(sim, dep) + }, + OnExpire: func(aura *core.Aura, sim *core.Simulation) { + paladin.DisableDynamicStatDep(sim, dep) + }, + }) + paladin.RegisterAura(core.Aura{ + Label: "Shock and Awe (rune)", + Duration: core.NeverExpires, + OnReset: func(aura *core.Aura, sim *core.Simulation) { + aura.Activate(sim) + }, + OnSpellHitDealt: func(aura *core.Aura, sim *core.Simulation, spell *core.Spell, result *core.SpellResult) { + if spell.SpellCode != SpellCode_PaladinHolyShock { + return + } + shockAndAweAura.Activate(sim) + }, + }) +} + func (paladin *Paladin) registerGuardedByTheLight() { if !paladin.hasRune(proto.PaladinRune_RuneFeetGuardedByTheLight) { return diff --git a/sim/paladin/sor.go b/sim/paladin/sor.go index f5a8f0201d..37c2feb508 100644 --- a/sim/paladin/sor.go +++ b/sim/paladin/sor.go @@ -103,7 +103,7 @@ func (paladin *Paladin) registerSealOfRighteousness() { ActionID: core.ActionID{SpellID: rank.proc.spellID}, SpellSchool: core.SpellSchoolHoly, DefenseType: core.DefenseTypeMelee, - ProcMask: core.ProcMaskEmpty, + ProcMask: core.ProcMaskMeleeMHSpecial,//changed to ProcMaskMeleeMHSpecial, to fix procs from weapons/oils which do proc from SoR, Idk side effects, does WS proc from SoR? Flags: core.SpellFlagMeleeMetrics, //BonusCritRating: paladin.holyCrit(), // TODO to be tested, but unlikely diff --git a/sim/paladin/talents.go b/sim/paladin/talents.go index 5028699c3d..837853f6a9 100644 --- a/sim/paladin/talents.go +++ b/sim/paladin/talents.go @@ -29,6 +29,9 @@ func (paladin *Paladin) ApplyTalents() { if paladin.Talents.Vengeance > 0 { paladin.applyVengeance() } + if paladin.Talents.Vindication > 0 { + paladin.applyVindication() + } // paladin.applyRighteousVengeance() // paladin.applyRedoubt() // paladin.applyReckoning() @@ -186,25 +189,47 @@ func (paladin *Paladin) applyVengeance() { }) } -// func (paladin *Paladin) applyVindication() { -// if paladin.Talents.Vindication == 0 { -// return -// } + func (paladin *Paladin) applyVindication() { + if paladin.Talents.Vindication == 0 { + return + } + //vindicationMultiplier := []float64{1, 1.05, 1.10, 1.15}[paladin.Talents.Vengeance] + vindicationMultiplier := []*stats.StatDependency{ + paladin.NewDynamicMultiplyStat(stats.AttackPower, 1.00), + paladin.NewDynamicMultiplyStat(stats.AttackPower, 1.05), + paladin.NewDynamicMultiplyStat(stats.AttackPower, 1.10), + paladin.NewDynamicMultiplyStat(stats.AttackPower, 1.15), + + } + vindicationAura := paladin.RegisterAura(core.Aura{ + Label: "Vindication Proc", + ActionID: core.ActionID{SpellID: 26021}, + Duration: time.Second * 30, + OnInit: func(aura *core.Aura, sim *core.Simulation) { + paladin.EnableDynamicStatDep(sim, vindicationMultiplier[0]) + }, + OnGain: func(aura *core.Aura, sim *core.Simulation) { + paladin.EnableDynamicStatDep(sim, vindicationMultiplier[paladin.Talents.Vindication]) + }, + OnExpire: func(aura *core.Aura, sim *core.Simulation) { + paladin.DisableDynamicStatDep(sim, vindicationMultiplier[paladin.Talents.Vindication]) + }, + }) // vindicationAuras := paladin.NewEnemyAuraArray(func(target *core.Unit) *core.Aura { // return core.VindicationAura(target, paladin.Talents.Vindication) // }) -// paladin.RegisterAura(core.Aura{ -// Label: "Vindication Talent", -// Duration: core.NeverExpires, -// OnReset: func(aura *core.Aura, sim *core.Simulation) { -// aura.Activate(sim) -// }, -// OnSpellHitDealt: func(aura *core.Aura, sim *core.Simulation, spell *core.Spell, result *core.SpellResult) { -// // TODO: Replace with actual proc mask / proc chance -// if result.Landed() && spell.ProcMask.Matches(core.ProcMaskMelee) { -// vindicationAuras.Get(result.Target).Activate(sim) -// } -// }, -// }) -// } + paladin.RegisterAura(core.Aura{ + Label: "Vindication Talent", + Duration: core.NeverExpires, + OnReset: func(aura *core.Aura, sim *core.Simulation) { + aura.Activate(sim) + }, + OnSpellHitDealt: func(aura *core.Aura, sim *core.Simulation, spell *core.Spell, result *core.SpellResult) { + // TODO: Replace with actual proc mask / proc chance + if result.Landed() && spell.ProcMask.Matches(core.ProcMaskMelee) { + vindicationAura.Activate(sim) + } + }, + }) + }