@@ -12,21 +12,42 @@ func (paladin *Paladin) applyGlyphs() {
1212 if paladin .HasMajorGlyph (proto .PaladinMajorGlyph_GlyphOfAvengingWrath ) {
1313 paladin .registerGlyphOfAvengingWrath ()
1414 }
15+ if paladin .HasMajorGlyph (proto .PaladinMajorGlyph_GlyphOfTheBattleHealer ) {
16+ // TODO: Handle in seal_of_insight.go
17+ }
18+ if paladin .HasMajorGlyph (proto .PaladinMajorGlyph_GlyphOfBurdenOfGuilt ) {
19+ paladin .registerGlyphOfBurdenOfGuilt ()
20+ }
21+ if paladin .HasMajorGlyph (proto .PaladinMajorGlyph_GlyphOfDazingShield ) {
22+ paladin .registerGlyphOfDazingShield ()
23+ }
24+ if paladin .HasMajorGlyph (proto .PaladinMajorGlyph_GlyphOfDenounce ) {
25+ paladin .registerGlyphOfDenounce ()
26+ }
1527 if paladin .HasMajorGlyph (proto .PaladinMajorGlyph_GlyphOfDevotionAura ) {
1628 paladin .registerGlyphOfDevotionAura ()
1729 }
30+ if paladin .HasMajorGlyph (proto .PaladinMajorGlyph_GlyphOfDivinePlea ) {
31+ paladin .registerGlyphOfDivinePlea ()
32+ }
1833 if paladin .HasMajorGlyph (proto .PaladinMajorGlyph_GlyphOfDivineProtection ) {
1934 // Handled in divine_protection.go
2035 }
2136 if paladin .HasMajorGlyph (proto .PaladinMajorGlyph_GlyphOfDivineStorm ) {
2237 paladin .registerGlyphOfDivineStorm ()
2338 }
39+ if paladin .HasMajorGlyph (proto .PaladinMajorGlyph_GlyphOfDivinity ) {
40+ paladin .registerGlyphOfDivinity ()
41+ }
2442 if paladin .HasMajorGlyph (proto .PaladinMajorGlyph_GlyphOfDoubleJeopardy ) {
2543 paladin .registerGlyphOfDoubleJeopardy ()
2644 }
2745 if paladin .HasMajorGlyph (proto .PaladinMajorGlyph_GlyphOfFinalWrath ) {
2846 // Handled in protection/holy_wrath.go
2947 }
48+ if paladin .HasMajorGlyph (proto .PaladinMajorGlyph_GlyphOfFlashOfLight ) {
49+ paladin .registerGlyphOfFlashOfLight ()
50+ }
3051 if paladin .HasMajorGlyph (proto .PaladinMajorGlyph_GlyphOfFocusedShield ) {
3152 // Handled in protection/avengers_shield.go
3253 }
@@ -36,15 +57,27 @@ func (paladin *Paladin) applyGlyphs() {
3657 if paladin .HasMajorGlyph (proto .PaladinMajorGlyph_GlyphOfHarshWords ) {
3758 paladin .registerGlyphOfHarshWords ()
3859 }
60+ if paladin .HasMajorGlyph (proto .PaladinMajorGlyph_GlyphOfHolyShock ) {
61+ paladin .registerGlyphOfHolyShock ()
62+ }
63+ if paladin .HasMajorGlyph (proto .PaladinMajorGlyph_GlyphOfIllumination ) {
64+ paladin .registerGlyphOfIllumination ()
65+ }
3966 if paladin .HasMajorGlyph (proto .PaladinMajorGlyph_GlyphOfImmediateTruth ) {
4067 paladin .registerGlyphOfImmediateTruth ()
4168 }
69+ if paladin .HasMajorGlyph (proto .PaladinMajorGlyph_GlyphOfLightOfDawn ) {
70+ paladin .registerGlyphOfLightOfDawn ()
71+ }
4272 if paladin .HasMajorGlyph (proto .PaladinMajorGlyph_GlyphOfMassExorcism ) {
4373 // Handled in retribution/exorcism.go
4474 }
4575 if paladin .HasMajorGlyph (proto .PaladinMajorGlyph_GlyphOfProtectorOfTheInnocent ) {
4676 paladin .registerGlyphOfProtectorOfTheInnocent ()
4777 }
78+ if paladin .HasMajorGlyph (proto .PaladinMajorGlyph_GlyphOfTemplarsVerdict ) {
79+ paladin .registerGlyphOfTemplarsVerdict ()
80+ }
4881 if paladin .HasMajorGlyph (proto .PaladinMajorGlyph_GlyphOfTheAlabasterShield ) {
4982 paladin .registerGlyphOfTheAlabasterShield ()
5083 }
@@ -98,6 +131,95 @@ func (paladin *Paladin) registerGlyphOfAvengingWrath() {
98131 })
99132}
100133
134+ // Your Judgment hits fill your target with doubt and remorse, reducing movement speed by 50% for 2 sec.
135+ func (paladin * Paladin ) registerGlyphOfBurdenOfGuilt () {
136+ burdenOfGuiltAuras := paladin .NewEnemyAuraArray (func (unit * core.Unit ) * core.Aura {
137+ return unit .RegisterAura (core.Aura {
138+ Label : "Burden of Guilt" + unit .Label ,
139+ ActionID : core.ActionID {SpellID : 110300 },
140+ Duration : time .Second * 2 ,
141+ }).AttachMultiplicativePseudoStatBuff (& unit .PseudoStats .MovementSpeedMultiplier , 0.5 )
142+ })
143+
144+ core .MakeProcTriggerAura (& paladin .Unit , core.ProcTrigger {
145+ Name : "Glyph of Burden of Guilt" + paladin .Label ,
146+ ActionID : core.ActionID {SpellID : 54931 },
147+ Callback : core .CallbackOnSpellHitDealt ,
148+ ClassSpellMask : SpellMaskJudgment ,
149+ Outcome : core .OutcomeLanded ,
150+ Handler : func (sim * core.Simulation , spell * core.Spell , result * core.SpellResult ) {
151+ burdenOfGuiltAuras .Get (result .Target ).Activate (sim )
152+ },
153+ })
154+ }
155+
156+ // Your Avenger's Shield now also dazes targets for 10 sec.
157+ func (paladin * Paladin ) registerGlyphOfDazingShield () {
158+ if paladin .Spec != proto .Spec_SpecProtectionPaladin {
159+ return
160+ }
161+
162+ dazedAuras := paladin .NewEnemyAuraArray (func (unit * core.Unit ) * core.Aura {
163+ return unit .RegisterAura (core.Aura {
164+ Label : "Dazed - Avenger's Shield" + unit .Label ,
165+ ActionID : core.ActionID {SpellID : 63529 },
166+ Duration : time .Second * 10 ,
167+ }).AttachMultiplicativePseudoStatBuff (& unit .PseudoStats .MovementSpeedMultiplier , 0.5 )
168+ })
169+
170+ core .MakeProcTriggerAura (& paladin .Unit , core.ProcTrigger {
171+ Name : "Glyph of Dazing Shield" + paladin .Label ,
172+ ActionID : core.ActionID {SpellID : 56414 },
173+ Callback : core .CallbackOnSpellHitDealt ,
174+ ClassSpellMask : SpellMaskAvengersShield ,
175+ Outcome : core .OutcomeLanded ,
176+ Handler : func (sim * core.Simulation , spell * core.Spell , result * core.SpellResult ) {
177+ dazedAuras .Get (result .Target ).Activate (sim )
178+ },
179+ })
180+ }
181+
182+ // Your Holy Shocks reduce the cast time of your next Denounce by 0.5 sec. This effect stacks up to 3 times.
183+ func (paladin * Paladin ) registerGlyphOfDenounce () {
184+ if paladin .Spec != proto .Spec_SpecHolyPaladin {
185+ return
186+ }
187+
188+ cdMod := paladin .AddDynamicMod (core.SpellModConfig {
189+ Kind : core .SpellMod_Cooldown_Flat ,
190+ ClassMask : SpellMaskDenounce ,
191+ TimeValue : time .Millisecond * - 500 ,
192+ })
193+
194+ denounceAura := paladin .RegisterAura (core.Aura {
195+ Label : "Glyph of Denounce" + paladin .Label ,
196+ ActionID : core.ActionID {SpellID : 115654 },
197+ Duration : time .Second * 15 ,
198+ MaxStacks : 3 ,
199+ OnGain : func (aura * core.Aura , sim * core.Simulation ) {
200+ cdMod .Activate ()
201+ },
202+ OnStacksChange : func (aura * core.Aura , sim * core.Simulation , oldStacks , newStacks int32 ) {
203+ cdMod .UpdateTimeValue (time .Millisecond * time .Duration (- 500 * newStacks ))
204+ },
205+ OnExpire : func (aura * core.Aura , sim * core.Simulation ) {
206+ cdMod .Deactivate ()
207+ },
208+ })
209+
210+ core .MakeProcTriggerAura (& paladin .Unit , core.ProcTrigger {
211+ Name : "Glyph of Denounce Trigger" + paladin .Label ,
212+ ActionID : core.ActionID {SpellID : 56420 },
213+ Callback : core .CallbackOnSpellHitDealt ,
214+ ClassSpellMask : SpellMaskHolyShock ,
215+ Outcome : core .OutcomeLanded ,
216+ Handler : func (sim * core.Simulation , spell * core.Spell , result * core.SpellResult ) {
217+ denounceAura .Activate (sim )
218+ denounceAura .AddStack (sim )
219+ },
220+ })
221+ }
222+
101223// Devotion Aura no longer affects party or raid members, but the cooldown is reduced by 60 sec.
102224func (paladin * Paladin ) registerGlyphOfDevotionAura () {
103225 core .MakePermanent (paladin .RegisterAura (core.Aura {
@@ -110,8 +232,29 @@ func (paladin *Paladin) registerGlyphOfDevotionAura() {
110232 })
111233}
112234
235+ // Divine Plea returns 50% less mana but has a 50% shorter cooldown.
236+ func (paladin * Paladin ) registerGlyphOfDivinePlea () {
237+ if paladin .Spec != proto .Spec_SpecHolyPaladin {
238+ return
239+ }
240+
241+ // TODO: Handle the mana return part in holy/divine_plea.go
242+ core .MakePermanent (paladin .RegisterAura (core.Aura {
243+ Label : "Glyph of Divine Plea" + paladin .Label ,
244+ ActionID : core.ActionID {SpellID : 63223 },
245+ })).AttachSpellMod (core.SpellModConfig {
246+ Kind : core .SpellMod_Cooldown_Multiplier ,
247+ ClassMask : SpellMaskDivinePlea ,
248+ FloatValue : - 0.5 ,
249+ })
250+ }
251+
113252// Your Divine Storm also heals you for 5% of your maximum health.
114253func (paladin * Paladin ) registerGlyphOfDivineStorm () {
254+ if paladin .Spec != proto .Spec_SpecRetributionPaladin {
255+ return
256+ }
257+
115258 healthMetrics := paladin .NewHealthMetrics (core.ActionID {SpellID : 115515 })
116259 core .MakeProcTriggerAura (& paladin .Unit , core.ProcTrigger {
117260 Name : "Glyph of Divine Storm" + paladin .Label ,
@@ -125,6 +268,26 @@ func (paladin *Paladin) registerGlyphOfDivineStorm() {
125268 })
126269}
127270
271+ // Increases the cooldown of your Lay on Hands by 2 min but causes it to give you 10% of your maximum mana.
272+ func (paladin * Paladin ) registerGlyphOfDivinity () {
273+ manaMetrics := paladin .NewManaMetrics (core.ActionID {SpellID : 54986 })
274+
275+ core .MakePermanent (paladin .RegisterAura (core.Aura {
276+ Label : "Glyph of Divinity" + paladin .Label ,
277+ ActionID : core.ActionID {SpellID : 54939 },
278+ })).AttachProcTrigger (core.ProcTrigger {
279+ Callback : core .CallbackOnCastComplete ,
280+ ClassSpellMask : SpellMaskLayOnHands ,
281+ Handler : func (sim * core.Simulation , spell * core.Spell , result * core.SpellResult ) {
282+ paladin .AddMana (sim , paladin .MaxMana ()* 0.10 , manaMetrics )
283+ },
284+ }).AttachSpellMod (core.SpellModConfig {
285+ Kind : core .SpellMod_Cooldown_Flat ,
286+ ClassMask : SpellMaskLayOnHands ,
287+ TimeValue : time .Minute * 2 ,
288+ })
289+ }
290+
128291// Judging a target increases the damage of your next Judgment by 20%, but only if used on a second target.
129292func (paladin * Paladin ) registerGlyphOfDoubleJeopardy () {
130293 spellMod := paladin .AddDynamicMod (core.SpellModConfig {
@@ -171,6 +334,38 @@ func (paladin *Paladin) registerGlyphOfDoubleJeopardy() {
171334 })
172335}
173336
337+ // When you Flash of Light a target, it increases your next heal done to that target within 7 sec by 10%.
338+ func (paladin * Paladin ) registerGlyphOfFlashOfLight () {
339+ glyphAuras := paladin .NewAllyAuraArray (func (unit * core.Unit ) * core.Aura {
340+ return unit .RegisterAura (core.Aura {
341+ Label : "Glyph of Flash of Light" + unit .Label ,
342+ ActionID : core.ActionID {SpellID : 54957 },
343+ Duration : time .Second * 7 ,
344+ OnGain : func (aura * core.Aura , sim * core.Simulation ) {
345+ paladin .AttackTables [unit .UnitIndex ].HealingDealtMultiplier *= 1.1
346+ },
347+ OnExpire : func (aura * core.Aura , sim * core.Simulation ) {
348+ paladin .AttackTables [unit .UnitIndex ].HealingDealtMultiplier /= 1.1
349+ },
350+ OnHealTaken : func (aura * core.Aura , sim * core.Simulation , spell * core.Spell , result * core.SpellResult ) {
351+ if spell .Unit == & paladin .Unit {
352+ aura .Deactivate (sim )
353+ }
354+ },
355+ })
356+ })
357+
358+ core .MakeProcTriggerAura (& paladin .Unit , core.ProcTrigger {
359+ Name : "Glyph of Flash of Light Trigger" + paladin .Label ,
360+ ActionID : core.ActionID {SpellID : 57955 },
361+ Callback : core .CallbackOnHealDealt ,
362+ ClassSpellMask : SpellMaskFlashOfLight ,
363+ Handler : func (sim * core.Simulation , spell * core.Spell , result * core.SpellResult ) {
364+ glyphAuras .Get (result .Target ).Activate (sim )
365+ },
366+ })
367+ }
368+
174369// Your Word of Glory can now also be used on enemy targets, causing Holy damage approximately equal to the amount it would have healed.
175370// Does not work with Eternal Flame.
176371func (paladin * Paladin ) registerGlyphOfHarshWords () {
@@ -237,6 +432,49 @@ func (paladin *Paladin) registerGlyphOfHarshWords() {
237432 })
238433}
239434
435+ // Decreases the healing of Holy Shock by 50% but increases its damage by 50%.
436+ func (paladin * Paladin ) registerGlyphOfHolyShock () {
437+ if paladin .Spec != proto .Spec_SpecHolyPaladin {
438+ return
439+ }
440+
441+ core .MakePermanent (paladin .RegisterAura (core.Aura {
442+ Label : "Glyph of Holy Shock" + paladin .Label ,
443+ ActionID : core.ActionID {SpellID : 63224 },
444+ })).AttachSpellMod (core.SpellModConfig {
445+ Kind : core .SpellMod_DamageDone_Pct ,
446+ ClassMask : SpellMaskHolyShockDamage ,
447+ FloatValue : 0.5 ,
448+ }).AttachSpellMod (core.SpellModConfig {
449+ Kind : core .SpellMod_DamageDone_Pct ,
450+ ClassMask : SpellMaskHolyShockHeal ,
451+ FloatValue : - 0.5 ,
452+ })
453+ }
454+
455+ // Your Holy Shock criticals grant 1% mana return, but Holy Insight returns 10% less mana.
456+ // (800ms cooldown)
457+ func (paladin * Paladin ) registerGlyphOfIllumination () {
458+ if paladin .Spec != proto .Spec_SpecHolyPaladin {
459+ return
460+ }
461+
462+ manaMetrics := paladin .NewManaMetrics (core.ActionID {SpellID : 115314 })
463+
464+ // TODO: Handle the Holy Insight part in holy/holy.go
465+ core .MakeProcTriggerAura (& paladin .Unit , core.ProcTrigger {
466+ Name : "Glyph of Illumination" + paladin .Label ,
467+ ActionID : core.ActionID {SpellID : 54937 },
468+ Callback : core .CallbackOnSpellHitDealt | core .CallbackOnHealDealt ,
469+ Outcome : core .OutcomeLanded ,
470+ ClassSpellMask : SpellMaskHolyShock ,
471+ ICD : time .Millisecond * 800 ,
472+ Handler : func (sim * core.Simulation , spell * core.Spell , result * core.SpellResult ) {
473+ paladin .AddMana (sim , paladin .MaxMana ()* 0.01 , manaMetrics )
474+ },
475+ })
476+ }
477+
240478// Increases the instant damage done by Seal of Truth by 40%, but decreases the damage done by Censure by 50%.
241479func (paladin * Paladin ) registerGlyphOfImmediateTruth () {
242480 core .MakePermanent (paladin .RegisterAura (core.Aura {
@@ -253,6 +491,23 @@ func (paladin *Paladin) registerGlyphOfImmediateTruth() {
253491 })
254492}
255493
494+ // Light of Dawn affects 2 fewer targets, but heals each target for 25% more.
495+ func (paladin * Paladin ) registerGlyphOfLightOfDawn () {
496+ if paladin .Spec != proto .Spec_SpecHolyPaladin {
497+ return
498+ }
499+
500+ // TODO: Handle the target count part in holy/light_of_dawn.go
501+ core .MakePermanent (paladin .RegisterAura (core.Aura {
502+ Label : "Glyph of Light of Dawn" + paladin .Label ,
503+ ActionID : core.ActionID {SpellID : 54940 },
504+ })).AttachSpellMod (core.SpellModConfig {
505+ Kind : core .SpellMod_DamageDone_Pct ,
506+ ClassMask : SpellMaskLightOfDawn ,
507+ FloatValue : 0.25 ,
508+ })
509+ }
510+
256511// When you use Word of Glory to heal another target, it also heals you for 20% of the amount.
257512func (paladin * Paladin ) registerGlyphOfProtectorOfTheInnocent () {
258513 var lastHeal float64
@@ -286,6 +541,26 @@ func (paladin *Paladin) registerGlyphOfProtectorOfTheInnocent() {
286541 })
287542}
288543
544+ // You take 10% less damage for 6 sec after dealing damage with Templar's Verdict or Exorcism.
545+ func (paladin * Paladin ) registerGlyphOfTemplarsVerdict () {
546+ glyphOfTemplarVerdictAura := paladin .RegisterAura (core.Aura {
547+ Label : "Glyph of Templar's Verdict" + paladin .Label ,
548+ ActionID : core.ActionID {SpellID : 115668 },
549+ Duration : time .Second * 6 ,
550+ }).AttachMultiplicativePseudoStatBuff (& paladin .PseudoStats .DamageTakenMultiplier , 0.9 )
551+
552+ core .MakeProcTriggerAura (& paladin .Unit , core.ProcTrigger {
553+ Name : "Glyph of Templar's Verdict Trigger" + paladin .Label ,
554+ ActionID : core.ActionID {SpellID : 54926 },
555+ Callback : core .CallbackOnSpellHitDealt ,
556+ ClassSpellMask : SpellMaskTemplarsVerdict ,
557+ Outcome : core .OutcomeLanded ,
558+ Handler : func (sim * core.Simulation , spell * core.Spell , result * core.SpellResult ) {
559+ glyphOfTemplarVerdictAura .Activate (sim )
560+ },
561+ })
562+ }
563+
289564// Your successful blocks increase the damage of your next Shield of the Righteous by 10%. Stacks up to 3 times.
290565func (paladin * Paladin ) registerGlyphOfTheAlabasterShield () {
291566 spellMod := paladin .AddDynamicMod (core.SpellModConfig {
0 commit comments