Skip to content

Commit 0205bcb

Browse files
committed
[Paladin] Add basically all remaining Paladin glyphs
1 parent cfd60c6 commit 0205bcb

2 files changed

Lines changed: 282 additions & 1 deletion

File tree

sim/paladin/glyphs.go

Lines changed: 275 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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.
102224
func (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.
114253
func (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.
129292
func (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.
176371
func (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%.
241479
func (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.
257512
func (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.
290565
func (paladin *Paladin) registerGlyphOfTheAlabasterShield() {
291566
spellMod := paladin.AddDynamicMod(core.SpellModConfig{

sim/paladin/spell_masks.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,13 @@ const (
3434
SpellMaskHolyWrath
3535

3636
// Holy abilities
37+
SpellMaskDenounce
3738
SpellMaskDivineLight
39+
SpellMaskDivinePlea
3840
SpellMaskHolyRadiance
39-
SpellMaskHolyShock
41+
SpellMaskHolyShockDamage
42+
SpellMaskHolyShockHeal
43+
SpellMaskLightOfDawn
4044

4145
// Talents
4246
SpellMaskEternalFlame
@@ -84,6 +88,8 @@ const SpellMaskSanctityOfBattleProt = SpellMaskSanctityOfBattleBase |
8488
SpellMaskAvengersShield |
8589
SpellMaskShieldOfTheRighteous
8690

91+
const SpellMaskHolyShock = SpellMaskHolyShockDamage | SpellMaskHolyShockHeal
92+
8793
const SpellMaskSanctityOfBattleHoly = SpellMaskSanctityOfBattleBase |
8894
SpellMaskHolyShock
8995

0 commit comments

Comments
 (0)