1#![allow(non_snake_case, dead_code)]
4use wowlab_types::{combat::ResourceType, game::SpecId};
5use wowlab_engine_combat::{
6 CombatSystemBuilder, CombatSystemDraft, AuraDefinitionDraft, LocalAuraIdx,
7 LocalSpellIdx, SpellDefinitionDraft,
8};
9use wowlab_engine_ports::{
10 DeclaredSpecMetadata, SpecDescriptor, SpecHandler, HeroTalentTreeDesc,
11};
12use wowlab_engine_gamedata::ResolvedGameData;
13pub(crate) mod SPELL {
14 pub(crate) const CRUSADER_STRIKE: u32 = 35395;
16 pub(crate) const JUDGMENT: u32 = 20271;
18 pub(crate) const BLADE_OF_JUSTICE: u32 = 184_575;
20 pub(crate) const TEMPLARS_VERDICT: u32 = 85256;
22 pub(crate) const DIVINE_STORM: u32 = 53385;
24 pub(crate) const WAKE_OF_ASHES: u32 = 255_937;
26 pub(crate) const AVENGING_WRATH: u32 = 31884;
28 pub(crate) const FINAL_VERDICT: u32 = 383_328;
30 pub(crate) const CRUSADING_STRIKE: u32 = 408_385;
32 pub(crate) const LIGHT_WITHIN_BOJ: u32 = 1_261_160;
34 pub(crate) const HIGHLORDS_JUDGMENT: u32 = 383_921;
36 pub(crate) const JUDGMENT_DIVINE_TOLL: u32 = 406_957;
38 pub(crate) const HAMMER_OF_WRATH_DIVINE_TOLL: u32 = 1_279_408;
40 pub(crate) const DIVINE_TOLL: u32 = 375_576;
42 pub(crate) const HAMMER_OF_WRATH: u32 = 24275;
44 pub(crate) const EXECUTION_SENTENCE: u32 = 343_527;
46 pub(crate) const HAMMER_OF_LIGHT: u32 = 427_453;
48 pub(crate) const EMPYREAN_HAMMER: u32 = 431_398;
50}
51pub(crate) mod AURA {
52 pub(crate) const AVENGING_WRATH: u32 = 31884;
54 pub(crate) const EMPYREAN_POWER: u32 = 326_733;
56 pub(crate) const EMPYREAN_LEGACY: u32 = 387_178;
58 pub(crate) const DIVINE_PURPOSE: u32 = 408_458;
60 pub(crate) const DIVINE_POWER: u32 = 1_305_230;
62 pub(crate) const DIVINE_ARBITER_VERDICT: u32 = 1_306_161;
64 pub(crate) const DIVINE_ARBITER_DIVINE_STORM: u32 = 1_306_162;
66 pub(crate) const DIVINE_ARBITER_HAMMER_OF_LIGHT: u32 = 1_310_461;
68 pub(crate) const ART_OF_WAR: u32 = 406_086;
70 pub(crate) const RIGHTEOUS_CAUSE: u32 = 402_916;
72 pub(crate) const HAMMER_OF_WRATH: u32 = 1_277_026;
74 pub(crate) const JUDGMENT_DEBUFF: u32 = 197_277;
76 pub(crate) const SANCTIFY: u32 = 382_538;
78 pub(crate) const EXPURGATION: u32 = 383_346;
80 pub(crate) const TRUTHS_WAKE: u32 = 403_695;
82 pub(crate) const CRUSADING_STRIKES: u32 = 404_542;
84 pub(crate) const ZEALOTS_FERVOR: u32 = 403_509;
86 pub(crate) const CONSECRATED_BLADE_LOCKOUT: u32 = 407_475;
88 pub(crate) const SANCTIFICATION: u32 = 433_671;
90 pub(crate) const RUSH_OF_LIGHT: u32 = 407_065;
92 pub(crate) const EXECUTION_SENTENCE: u32 = 343_527;
94 pub(crate) const EXECUTION_SENTENCE_GATHER: u32 = 1_260_251;
96 pub(crate) const EXECUTION_SENTENCE_TRACKER: u32 = 1_234_189;
98 pub(crate) const HAMMER_OF_LIGHT: u32 = 427_441;
100 pub(crate) const HAMMER_OF_LIGHT_FREE: u32 = 433_732;
102 pub(crate) const SHAKE_THE_HEAVENS: u32 = 431_536;
104 pub(crate) const LIGHTS_DELIVERANCE: u32 = 433_674;
106 pub(crate) const UNDISPUTED_RULING: u32 = 432_629;
108 pub(crate) const DIVINE_HAMMER: u32 = 198_034;
110}
111pub(crate) mod TALENT {
112 pub(crate) const ART_OF_WAR: u32 = 406_064;
114 pub(crate) const BLADE_OF_JUSTICE: u32 = 184_575;
116 pub(crate) const BLADE_OF_VENGEANCE: u32 = 404_358;
118 pub(crate) const BLESSED_CHAMPION: u32 = 403_010;
120 pub(crate) const BURN_TO_ASH: u32 = 446_663;
122 pub(crate) const CONSECRATED_BLADE: u32 = 404_834;
124 pub(crate) const CRUSADE: u32 = 1_253_598;
126 pub(crate) const CRUSADING_STRIKES: u32 = 404_542;
128 pub(crate) const DIVINE_PURPOSE: u32 = 408_459;
130 pub(crate) const DIVINE_STORM: u32 = 53385;
132 pub(crate) const DIVINE_TOLL: u32 = 375_576;
134 pub(crate) const EMPYREAN_LEGACY: u32 = 387_170;
136 pub(crate) const EMPYREAN_POWER: u32 = 326_732;
138 pub(crate) const EXECUTION_SENTENCE: u32 = 343_527;
140 pub(crate) const EXPURGATION: u32 = 383_344;
142 pub(crate) const FINAL_VERDICT: u32 = 383_328;
144 pub(crate) const GREATER_JUDGMENT: u32 = 231_663;
146 pub(crate) const HAMMER_OF_WRATH_TALENT: u32 = 1_241_288;
148 pub(crate) const HEART_OF_THE_CRUSADER: u32 = 406_154;
150 pub(crate) const HIGHLORDS_WRATH: u32 = 404_512;
152 pub(crate) const HOLY_BLADE: u32 = 383_342;
154 pub(crate) const IMPROVED_JUDGMENT: u32 = 405_461;
156 pub(crate) const JUDGE_JURY_AND_EXECUTIONER: u32 = 453_433;
158 pub(crate) const LIGHT_OF_JUSTICE: u32 = 404_436;
160 pub(crate) const LIGHT_WITHIN: u32 = 1_261_113;
162 pub(crate) const LIGHT_WITHIN_VERDICT: u32 = 1_261_111;
164 pub(crate) const LIGHT_WITHIN_WAVE: u32 = 1_261_159;
166 pub(crate) const QUICKENED_INVOCATION: u32 = 379_391;
168 pub(crate) const RADIANT_GLORY: u32 = 458_359;
170 pub(crate) const RIGHTEOUS_CAUSE: u32 = 402_912;
172 pub(crate) const RUSH_OF_LIGHT: u32 = 407_067;
174 pub(crate) const SANCTIFY: u32 = 382_536;
176 pub(crate) const SEETHING_FLAMES: u32 = 405_355;
178 pub(crate) const TEMPEST_OF_THE_LIGHTBRINGER: u32 = 383_396;
180 pub(crate) const TEMPLAR_STRIKES: u32 = 406_646;
182 pub(crate) const VENGEFUL_WRATH: u32 = 1_241_958;
184 pub(crate) const WAKE_OF_ASHES: u32 = 255_937;
186 pub(crate) const ZEALOTS_FERVOR: u32 = 403_509;
188}
189pub(crate) mod SET_BONUS {
190 pub(crate) const MID2_RETRIBUTION_2PC: u32 = 1_296_660;
192 pub(crate) const MID2_RETRIBUTION_4PC: u32 = 1_296_661;
194}
195pub(crate) mod REPORTED_SPELL {
196 pub(crate) const BLADE_OF_VENGEANCE: u32 = 404_358;
198 pub(crate) const DIVINE_ARBITER: u32 = 1_306_923;
200 pub(crate) const EXECUTION_SENTENCE: u32 = 387_113;
202 pub(crate) const EXECUTION_SENTENCE_INIT: u32 = 1_260_251;
204 pub(crate) const EXPURGATION: u32 = 383_346;
206}
207pub(crate) mod HERO {
208 pub(crate) mod TEMPLAR {
209 pub(crate) mod SPELL {
210 pub(crate) const DIVINE_EXACTION: u32 = 1_260_429;
212 pub(crate) const DIVINE_HAMMER: u32 = 198_034;
214 pub(crate) const DIVINE_HAMMER_TALENT: u32 = 432_929;
216 pub(crate) const DIVINE_HAMMER_TICK: u32 = 198_137;
218 pub(crate) const EMPYREAN_HAMMER: u32 = 431_398;
220 pub(crate) const EMPYREAN_HAMMER_WD: u32 = 431_625;
222 pub(crate) const HAMMERFALL: u32 = 432_463;
224 pub(crate) const HAMMER_OF_LIGHT: u32 = 427_453;
226 pub(crate) const HIGHER_CALLING: u32 = 431_687;
228 pub(crate) const LIGHTS_DELIVERANCE_TALENT: u32 = 425_518;
230 pub(crate) const LIGHTS_GUIDANCE: u32 = 427_445;
232 pub(crate) const LIGHTS_JUDICATOR: u32 = 1_261_525;
234 pub(crate) const SANCTIFICATION_TALENT: u32 = 432_977;
236 pub(crate) const SHAKE_THE_HEAVENS_TALENT: u32 = 431_533;
238 pub(crate) const UNDISPUTED_RULING_TALENT: u32 = 432_626;
240 pub(crate) const ZEALOUS_VINDICATION: u32 = 431_463;
242 }
243 pub(crate) mod AURA {
244 pub(crate) const HAMMER_OF_LIGHT_READY: u32 = 427_441;
246 pub(crate) const LIGHTS_DELIVERANCE: u32 = 433_674;
248 pub(crate) const SANCTIFICATION: u32 = 433_671;
250 pub(crate) const SHAKE_THE_HEAVENS: u32 = 431_536;
252 pub(crate) const TEMPLAR_STRIKES: u32 = 406_648;
254 pub(crate) const UNDISPUTED_RULING: u32 = 432_629;
256 }
257 }
258 pub(crate) mod HERALD_OF_THE_SUN {
259 pub(crate) mod SPELL {
260 pub(crate) const SECOND_SUNRISE: u32 = 431_474;
262 pub(crate) const SUN_SEAR: u32 = 431_414;
264 }
265 pub(crate) mod AURA {
266 pub(crate) const BLESSING_OF_ANSHE: u32 = 445_206;
268 pub(crate) const BORN_IN_SUNLIGHT: u32 = 1_264_050;
270 pub(crate) const DAWNLIGHT: u32 = 431_522;
272 pub(crate) const MORNING_STAR: u32 = 431_539;
274 pub(crate) const SOLAR_GRACE: u32 = 431_404;
276 }
277 }
278}
279static HERO_TREE_TEMPLAR_SPELLS: &[(&str, u32)] = &[
280 ("DIVINE_EXACTION", 1_260_429),
281 ("DIVINE_HAMMER", 198_034),
282 ("DIVINE_HAMMER_TALENT", 432_929),
283 ("DIVINE_HAMMER_TICK", 198_137),
284 ("EMPYREAN_HAMMER", 431_398),
285 ("EMPYREAN_HAMMER_WD", 431_625),
286 ("HAMMERFALL", 432_463),
287 ("HAMMER_OF_LIGHT", 427_453),
288 ("HIGHER_CALLING", 431_687),
289 ("LIGHTS_DELIVERANCE_TALENT", 425_518),
290 ("LIGHTS_GUIDANCE", 427_445),
291 ("LIGHTS_JUDICATOR", 1_261_525),
292 ("SANCTIFICATION_TALENT", 432_977),
293 ("SHAKE_THE_HEAVENS_TALENT", 431_533),
294 ("UNDISPUTED_RULING_TALENT", 432_626),
295 ("ZEALOUS_VINDICATION", 431_463),
296];
297static HERO_TREE_TEMPLAR_AURAS: &[(&str, u32)] = &[
298 ("HAMMER_OF_LIGHT_READY", 427_441),
299 ("LIGHTS_DELIVERANCE", 433_674),
300 ("SANCTIFICATION", 433_671),
301 ("SHAKE_THE_HEAVENS", 431_536),
302 ("TEMPLAR_STRIKES", 406_648),
303 ("UNDISPUTED_RULING", 432_629),
304];
305static HERO_TREE_HERALD_OF_THE_SUN_SPELLS: &[(&str, u32)] = &[
306 ("SECOND_SUNRISE", 431_474),
307 ("SUN_SEAR", 431_414),
308];
309static HERO_TREE_HERALD_OF_THE_SUN_AURAS: &[(&str, u32)] = &[
310 ("BLESSING_OF_ANSHE", 445_206),
311 ("BORN_IN_SUNLIGHT", 1_264_050),
312 ("DAWNLIGHT", 431_522),
313 ("MORNING_STAR", 431_539),
314 ("SOLAR_GRACE", 431_404),
315];
316pub(crate) mod DAMAGE_SPELL {
317 pub(crate) const CRUSADER_STRIKE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_35395;
318 pub(crate) const JUDGMENT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_20271;
319 pub(crate) const BLADE_OF_JUSTICE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_184575;
320 pub(crate) const TEMPLARS_VERDICT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_85256;
321 pub(crate) const DIVINE_STORM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_53385;
322 pub(crate) const WAKE_OF_ASHES: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_255937;
323 pub(crate) const AVENGING_WRATH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_31884;
324 pub(crate) const FINAL_VERDICT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_383328;
325 pub(crate) const CRUSADING_STRIKE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_408385;
326 pub(crate) const LIGHT_WITHIN_BOJ: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_1261160;
327 pub(crate) const HIGHLORDS_JUDGMENT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_383921;
328 pub(crate) const JUDGMENT_DIVINE_TOLL: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_406957;
329 pub(crate) const HAMMER_OF_WRATH_DIVINE_TOLL: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_1279408;
330 pub(crate) const DIVINE_TOLL: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_375576;
331 pub(crate) const HAMMER_OF_WRATH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_24275;
332 pub(crate) const EXECUTION_SENTENCE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_343527;
333 pub(crate) const HAMMER_OF_LIGHT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_427453;
334 pub(crate) const EMPYREAN_HAMMER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_431398;
335 pub(crate) const DIVINE_EXACTION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_1260429;
336 pub(crate) const DIVINE_HAMMER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_198034;
337 pub(crate) const DIVINE_HAMMER_TALENT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_432929;
338 pub(crate) const DIVINE_HAMMER_TICK: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_198137;
339 pub(crate) const EMPYREAN_HAMMER_WD: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_431625;
340 pub(crate) const HAMMERFALL: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_432463;
341 pub(crate) const HIGHER_CALLING: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_431687;
342 pub(crate) const LIGHTS_DELIVERANCE_TALENT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_425518;
343 pub(crate) const LIGHTS_GUIDANCE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_427445;
344 pub(crate) const LIGHTS_JUDICATOR: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_1261525;
345 pub(crate) const SANCTIFICATION_TALENT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_432977;
346 pub(crate) const SHAKE_THE_HEAVENS_TALENT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_431533;
347 pub(crate) const UNDISPUTED_RULING_TALENT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_432626;
348 pub(crate) const ZEALOUS_VINDICATION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_431463;
349 pub(crate) const SECOND_SUNRISE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_431474;
350 pub(crate) const SUN_SEAR: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_431414;
351}
352pub(crate) mod DAMAGE_AURA {
353 pub(crate) const AVENGING_WRATH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_31884;
354 pub(crate) const EMPYREAN_POWER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_326733;
355 pub(crate) const EMPYREAN_LEGACY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_387178;
356 pub(crate) const DIVINE_PURPOSE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_408458;
357 pub(crate) const DIVINE_POWER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_1305230;
358 pub(crate) const DIVINE_ARBITER_VERDICT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_1306161;
359 pub(crate) const DIVINE_ARBITER_DIVINE_STORM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_1306162;
360 pub(crate) const DIVINE_ARBITER_HAMMER_OF_LIGHT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_1310461;
361 pub(crate) const ART_OF_WAR: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_406086;
362 pub(crate) const RIGHTEOUS_CAUSE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_402916;
363 pub(crate) const HAMMER_OF_WRATH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_1277026;
364 pub(crate) const JUDGMENT_DEBUFF: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_197277;
365 pub(crate) const SANCTIFY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_382538;
366 pub(crate) const EXPURGATION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_383346;
367 pub(crate) const TRUTHS_WAKE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_403695;
368 pub(crate) const CRUSADING_STRIKES: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_404542;
369 pub(crate) const ZEALOTS_FERVOR: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_403509;
370 pub(crate) const CONSECRATED_BLADE_LOCKOUT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_407475;
371 pub(crate) const SANCTIFICATION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_433671;
372 pub(crate) const RUSH_OF_LIGHT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_407065;
373 pub(crate) const EXECUTION_SENTENCE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_343527;
374 pub(crate) const EXECUTION_SENTENCE_GATHER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_1260251;
375 pub(crate) const EXECUTION_SENTENCE_TRACKER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_1234189;
376 pub(crate) const HAMMER_OF_LIGHT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_427441;
377 pub(crate) const HAMMER_OF_LIGHT_FREE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_433732;
378 pub(crate) const SHAKE_THE_HEAVENS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_431536;
379 pub(crate) const LIGHTS_DELIVERANCE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_433674;
380 pub(crate) const UNDISPUTED_RULING: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_432629;
381 pub(crate) const DIVINE_HAMMER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_198034;
382}
383pub(crate) mod DAMAGE_TALENT {
384 pub(crate) const ART_OF_WAR: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_406064;
385 pub(crate) const BLADE_OF_JUSTICE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_184575;
386 pub(crate) const BLADE_OF_VENGEANCE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_404358;
387 pub(crate) const BLESSED_CHAMPION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_403010;
388 pub(crate) const BURN_TO_ASH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_446663;
389 pub(crate) const CONSECRATED_BLADE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_404834;
390 pub(crate) const CRUSADE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_1253598;
391 pub(crate) const CRUSADING_STRIKES: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_404542;
392 pub(crate) const DIVINE_PURPOSE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_408459;
393 pub(crate) const DIVINE_STORM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_53385;
394 pub(crate) const DIVINE_TOLL: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_375576;
395 pub(crate) const EMPYREAN_LEGACY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_387170;
396 pub(crate) const EMPYREAN_POWER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_326732;
397 pub(crate) const EXECUTION_SENTENCE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_343527;
398 pub(crate) const EXPURGATION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_383344;
399 pub(crate) const FINAL_VERDICT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_383328;
400 pub(crate) const GREATER_JUDGMENT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_231663;
401 pub(crate) const HAMMER_OF_WRATH_TALENT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_1241288;
402 pub(crate) const HEART_OF_THE_CRUSADER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_406154;
403 pub(crate) const HIGHLORDS_WRATH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_404512;
404 pub(crate) const HOLY_BLADE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_383342;
405 pub(crate) const IMPROVED_JUDGMENT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_405461;
406 pub(crate) const JUDGE_JURY_AND_EXECUTIONER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_453433;
407 pub(crate) const LIGHT_OF_JUSTICE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_404436;
408 pub(crate) const LIGHT_WITHIN: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_1261113;
409 pub(crate) const LIGHT_WITHIN_VERDICT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_1261111;
410 pub(crate) const LIGHT_WITHIN_WAVE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_1261159;
411 pub(crate) const QUICKENED_INVOCATION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_379391;
412 pub(crate) const RADIANT_GLORY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_458359;
413 pub(crate) const RIGHTEOUS_CAUSE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_402912;
414 pub(crate) const RUSH_OF_LIGHT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_407067;
415 pub(crate) const SANCTIFY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_382536;
416 pub(crate) const SEETHING_FLAMES: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_405355;
417 pub(crate) const TEMPEST_OF_THE_LIGHTBRINGER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_383396;
418 pub(crate) const TEMPLAR_STRIKES: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_406646;
419 pub(crate) const VENGEFUL_WRATH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_1241958;
420 pub(crate) const WAKE_OF_ASHES: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_255937;
421 pub(crate) const ZEALOTS_FERVOR: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_403509;
422}
423pub(crate) mod DAMAGE_REPORTED {
424 pub(crate) const BLADE_OF_VENGEANCE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_404358;
425 pub(crate) const DIVINE_ARBITER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_1306923;
426 pub(crate) const EXECUTION_SENTENCE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_387113;
427 pub(crate) const EXECUTION_SENTENCE_INIT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_1260251;
428 pub(crate) const EXPURGATION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ACTION::SPELL_383346;
429}
430pub(crate) mod DAMAGE_EFFECT {
431 pub(crate) const BURN_TO_ASH_EXTEND: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::EFFECT::SPELL_446663_EFFECT_1;
432 pub(crate) const CONSECRATION_TIMING: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::EFFECT::SPELL_26573_EFFECT_1;
433 pub(crate) const CONSECRATION_GEOMETRY: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::EFFECT::SPELL_26573_EFFECT_3;
434 pub(crate) const CONSECRATION_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::EFFECT::SPELL_81297_EFFECT_1;
435 pub(crate) const EXECUTION_SENTENCE_ACCUM_PCT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::EFFECT::SPELL_343527_EFFECT_2;
436 pub(crate) const EXECUTION_SENTENCE_INIT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::EFFECT::SPELL_1260251_EFFECT_1;
437 pub(crate) const HIGHLORDS_MASTERY_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::EFFECT::SPELL_267316_EFFECT_1;
438 pub(crate) const HIGHLORDS_MASTERY_FACTOR: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::EFFECT::SPELL_267316_EFFECT_4;
439 pub(crate) const HIGHLORDS_WRATH_DIVISOR: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::EFFECT::SPELL_404512_EFFECT_2;
440 pub(crate) const DIVINE_ARBITER_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::EFFECT::SPELL_1306923_EFFECT_1;
441 pub(crate) const MID2_DIVINE_PURPOSE_CHANCE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::EFFECT::SPELL_1296660_EFFECT_1;
442 pub(crate) const HIGHLORDS_JUDGMENT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::EFFECT::SPELL_383921_EFFECT_1;
443 pub(crate) const HIGHLORDS_WRATH: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::EFFECT::SPELL_404512_EFFECT_3;
444 pub(crate) const ART_OF_WAR_CHANCE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::EFFECT::SPELL_406064_EFFECT_1;
445 pub(crate) const ART_OF_WAR_CRIT_BONUS: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::EFFECT::SPELL_406064_EFFECT_2;
446 pub(crate) const LIGHT_WITHIN: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::EFFECT::SPELL_1261160_EFFECT_1;
447 pub(crate) const LIGHT_WITHIN_VERDICT_BONUS: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::EFFECT::SPELL_1261111_EFFECT_1;
448 pub(crate) const LIGHT_WITHIN_WAVE_BONUS: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::EFFECT::SPELL_1261159_EFFECT_1;
449 pub(crate) const RIGHTEOUS_CAUSE_CHANCE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::EFFECT::SPELL_402912_EFFECT_1;
450 pub(crate) const CRUSADING_STRIKES_HP: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::EFFECT::SPELL_406834_EFFECT_1;
451 pub(crate) const EMPYREAN_POWER_CHANCE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::EFFECT::SPELL_326732_EFFECT_2;
452 pub(crate) const DIVINE_PURPOSE_CHANCE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::EFFECT::SPELL_408459_EFFECT_1;
453 pub(crate) const DIVINE_STORM_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::EFFECT::SPELL_53385_EFFECT_1;
454 pub(crate) const EMPYREAN_LEGACY_EFFECTIVENESS: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::EFFECT::SPELL_387170_EFFECT_2;
455 pub(crate) const EMPYREAN_HAMMER_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::EFFECT::SPELL_431398_EFFECT_1;
456 pub(crate) const HAMMER_OF_LIGHT_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::EFFECT::SPELL_427453_EFFECT_1;
457 pub(crate) const LIGHTS_GUIDANCE_COUNT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::EFFECT::SPELL_427445_EFFECT_2;
458 pub(crate) const LIGHTS_GUIDANCE_DELAY: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::EFFECT::SPELL_427445_EFFECT_4;
459 pub(crate) const LIGHTS_GUIDANCE_STAGGER: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::EFFECT::SPELL_427445_EFFECT_3;
460 pub(crate) const ZEALOUS_VINDICATION_COUNT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::EFFECT::SPELL_431463_EFFECT_1;
461 pub(crate) const HIGHER_CALLING_EXTEND: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::EFFECT::SPELL_431687_EFFECT_1;
462 pub(crate) const DIVINE_TOLL_HOW: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::EFFECT::SPELL_1279408_EFFECT_1;
463 pub(crate) const DIVINE_TOLL_JUDGMENT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::EFFECT::SPELL_406957_EFFECT_1;
464 pub(crate) const HAMMER_OF_WRATH_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::EFFECT::SPELL_24275_EFFECT_1;
465 pub(crate) const VENGEFUL_WRATH_MAX_BONUS: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::EFFECT::SPELL_1241958_EFFECT_1;
466 pub(crate) const DIVINE_TOLL_ECHO_MULT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::EFFECT::SPELL_375576_EFFECT_6;
467 pub(crate) const DIVINE_EXACTION_COUNT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::EFFECT::SPELL_1260429_EFFECT_1;
468 pub(crate) const DIVINE_EXACTION_MULT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::EFFECT::SPELL_1260429_EFFECT_2;
469 pub(crate) const JUDGMENT_DEBUFF_BONUS: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::EFFECT::SPELL_197277_EFFECT_1;
470 pub(crate) const HOLY_BLADE_ENERGIZE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::EFFECT::SPELL_383342_EFFECT_1;
471 pub(crate) const CRUSADE_HASTE_PER_STACK: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::EFFECT::SPELL_1253598_EFFECT_1;
472 pub(crate) const CRUSADE_HASTE_CAP: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::EFFECT::SPELL_1253598_EFFECT_2;
473 pub(crate) const AVENGING_WRATH_CRIT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::EFFECT::SPELL_31884_EFFECT_3;
474 pub(crate) const AVENGING_WRATH_PERIODIC_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::EFFECT::SPELL_31884_EFFECT_2;
475 pub(crate) const TRUTHS_WAKE_BURN_EFFECT_4: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::EFFECT::SPELL_403695_EFFECT_4;
476}
477pub(crate) const AURA_AVENGING_WRATH: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::retribution_paladin::AURA_AVENGING_WRATH
478 .bind(wowlab_engine_combat::generated_identities::specs::retribution_paladin::PROOF);
479pub(crate) const AURA_EMPYREAN_POWER: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::retribution_paladin::AURA_EMPYREAN_POWER
480 .bind(wowlab_engine_combat::generated_identities::specs::retribution_paladin::PROOF);
481pub(crate) const AURA_EMPYREAN_LEGACY: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::retribution_paladin::AURA_EMPYREAN_LEGACY
482 .bind(wowlab_engine_combat::generated_identities::specs::retribution_paladin::PROOF);
483pub(crate) const AURA_DIVINE_PURPOSE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::retribution_paladin::AURA_DIVINE_PURPOSE
484 .bind(wowlab_engine_combat::generated_identities::specs::retribution_paladin::PROOF);
485pub(crate) const AURA_DIVINE_POWER: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::retribution_paladin::AURA_DIVINE_POWER
486 .bind(wowlab_engine_combat::generated_identities::specs::retribution_paladin::PROOF);
487pub(crate) const AURA_DIVINE_ARBITER_VERDICT: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::retribution_paladin::AURA_DIVINE_ARBITER_VERDICT
488 .bind(wowlab_engine_combat::generated_identities::specs::retribution_paladin::PROOF);
489pub(crate) const AURA_DIVINE_ARBITER_DIVINE_STORM: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::retribution_paladin::AURA_DIVINE_ARBITER_DIVINE_STORM
490 .bind(wowlab_engine_combat::generated_identities::specs::retribution_paladin::PROOF);
491pub(crate) const AURA_DIVINE_ARBITER_HAMMER_OF_LIGHT: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::retribution_paladin::AURA_DIVINE_ARBITER_HAMMER_OF_LIGHT
492 .bind(wowlab_engine_combat::generated_identities::specs::retribution_paladin::PROOF);
493pub(crate) const AURA_ART_OF_WAR: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::retribution_paladin::AURA_ART_OF_WAR
494 .bind(wowlab_engine_combat::generated_identities::specs::retribution_paladin::PROOF);
495pub(crate) const AURA_RIGHTEOUS_CAUSE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::retribution_paladin::AURA_RIGHTEOUS_CAUSE
496 .bind(wowlab_engine_combat::generated_identities::specs::retribution_paladin::PROOF);
497pub(crate) const AURA_HAMMER_OF_WRATH: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::retribution_paladin::AURA_HAMMER_OF_WRATH
498 .bind(wowlab_engine_combat::generated_identities::specs::retribution_paladin::PROOF);
499pub(crate) const AURA_JUDGMENT_DEBUFF: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::retribution_paladin::AURA_JUDGMENT_DEBUFF
500 .bind(wowlab_engine_combat::generated_identities::specs::retribution_paladin::PROOF);
501pub(crate) const AURA_SANCTIFY: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::retribution_paladin::AURA_SANCTIFY
502 .bind(wowlab_engine_combat::generated_identities::specs::retribution_paladin::PROOF);
503pub(crate) const AURA_EXPURGATION: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::retribution_paladin::AURA_EXPURGATION
504 .bind(wowlab_engine_combat::generated_identities::specs::retribution_paladin::PROOF);
505pub(crate) const AURA_TRUTHS_WAKE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::retribution_paladin::AURA_TRUTHS_WAKE
506 .bind(wowlab_engine_combat::generated_identities::specs::retribution_paladin::PROOF);
507pub(crate) const AURA_CRUSADING_STRIKES: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::retribution_paladin::AURA_CRUSADING_STRIKES
508 .bind(wowlab_engine_combat::generated_identities::specs::retribution_paladin::PROOF);
509pub(crate) const AURA_ZEALOTS_FERVOR: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::retribution_paladin::AURA_ZEALOTS_FERVOR
510 .bind(wowlab_engine_combat::generated_identities::specs::retribution_paladin::PROOF);
511pub(crate) const AURA_CONSECRATED_BLADE_LOCKOUT: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::retribution_paladin::AURA_CONSECRATED_BLADE_LOCKOUT
512 .bind(wowlab_engine_combat::generated_identities::specs::retribution_paladin::PROOF);
513pub(crate) const AURA_SANCTIFICATION: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::retribution_paladin::AURA_SANCTIFICATION
514 .bind(wowlab_engine_combat::generated_identities::specs::retribution_paladin::PROOF);
515pub(crate) const AURA_RUSH_OF_LIGHT: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::retribution_paladin::AURA_RUSH_OF_LIGHT
516 .bind(wowlab_engine_combat::generated_identities::specs::retribution_paladin::PROOF);
517pub(crate) const AURA_EXECUTION_SENTENCE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::retribution_paladin::AURA_EXECUTION_SENTENCE
518 .bind(wowlab_engine_combat::generated_identities::specs::retribution_paladin::PROOF);
519pub(crate) const AURA_EXECUTION_SENTENCE_GATHER: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::retribution_paladin::AURA_EXECUTION_SENTENCE_GATHER
520 .bind(wowlab_engine_combat::generated_identities::specs::retribution_paladin::PROOF);
521pub(crate) const AURA_EXECUTION_SENTENCE_TRACKER: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::retribution_paladin::AURA_EXECUTION_SENTENCE_TRACKER
522 .bind(wowlab_engine_combat::generated_identities::specs::retribution_paladin::PROOF);
523pub(crate) const AURA_HAMMER_OF_LIGHT: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::retribution_paladin::AURA_HAMMER_OF_LIGHT
524 .bind(wowlab_engine_combat::generated_identities::specs::retribution_paladin::PROOF);
525pub(crate) const AURA_HAMMER_OF_LIGHT_FREE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::retribution_paladin::AURA_HAMMER_OF_LIGHT_FREE
526 .bind(wowlab_engine_combat::generated_identities::specs::retribution_paladin::PROOF);
527pub(crate) const AURA_SHAKE_THE_HEAVENS: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::retribution_paladin::AURA_SHAKE_THE_HEAVENS
528 .bind(wowlab_engine_combat::generated_identities::specs::retribution_paladin::PROOF);
529pub(crate) const AURA_LIGHTS_DELIVERANCE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::retribution_paladin::AURA_LIGHTS_DELIVERANCE
530 .bind(wowlab_engine_combat::generated_identities::specs::retribution_paladin::PROOF);
531pub(crate) const AURA_UNDISPUTED_RULING: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::retribution_paladin::AURA_UNDISPUTED_RULING
532 .bind(wowlab_engine_combat::generated_identities::specs::retribution_paladin::PROOF);
533pub(crate) const AURA_DIVINE_HAMMER: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::retribution_paladin::AURA_DIVINE_HAMMER
534 .bind(wowlab_engine_combat::generated_identities::specs::retribution_paladin::PROOF);
535pub(crate) const AURA_COUNT: usize = 29;
536const _: () = assert!(
537 AURA_COUNT == 29, "AURA index ABI: count changed -- update positional hook consumers"
538);
539pub(crate) const SPELL_CRUSADER_STRIKE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::retribution_paladin::SPELL_CRUSADER_STRIKE
540 .bind(wowlab_engine_combat::generated_identities::specs::retribution_paladin::PROOF);
541pub(crate) const SPELL_JUDGMENT: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::retribution_paladin::SPELL_JUDGMENT
542 .bind(wowlab_engine_combat::generated_identities::specs::retribution_paladin::PROOF);
543pub(crate) const SPELL_BLADE_OF_JUSTICE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::retribution_paladin::SPELL_BLADE_OF_JUSTICE
544 .bind(wowlab_engine_combat::generated_identities::specs::retribution_paladin::PROOF);
545pub(crate) const SPELL_TEMPLARS_VERDICT: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::retribution_paladin::SPELL_TEMPLARS_VERDICT
546 .bind(wowlab_engine_combat::generated_identities::specs::retribution_paladin::PROOF);
547pub(crate) const SPELL_DIVINE_STORM: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::retribution_paladin::SPELL_DIVINE_STORM
548 .bind(wowlab_engine_combat::generated_identities::specs::retribution_paladin::PROOF);
549pub(crate) const SPELL_WAKE_OF_ASHES: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::retribution_paladin::SPELL_WAKE_OF_ASHES
550 .bind(wowlab_engine_combat::generated_identities::specs::retribution_paladin::PROOF);
551pub(crate) const SPELL_AVENGING_WRATH: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::retribution_paladin::SPELL_AVENGING_WRATH
552 .bind(wowlab_engine_combat::generated_identities::specs::retribution_paladin::PROOF);
553pub(crate) const SPELL_FINAL_VERDICT: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::retribution_paladin::SPELL_FINAL_VERDICT
554 .bind(wowlab_engine_combat::generated_identities::specs::retribution_paladin::PROOF);
555pub(crate) const SPELL_CRUSADING_STRIKE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::retribution_paladin::SPELL_CRUSADING_STRIKE
556 .bind(wowlab_engine_combat::generated_identities::specs::retribution_paladin::PROOF);
557pub(crate) const SPELL_LIGHT_WITHIN_BOJ: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::retribution_paladin::SPELL_LIGHT_WITHIN_BOJ
558 .bind(wowlab_engine_combat::generated_identities::specs::retribution_paladin::PROOF);
559pub(crate) const SPELL_HIGHLORDS_JUDGMENT: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::retribution_paladin::SPELL_HIGHLORDS_JUDGMENT
560 .bind(wowlab_engine_combat::generated_identities::specs::retribution_paladin::PROOF);
561pub(crate) const SPELL_JUDGMENT_DIVINE_TOLL: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::retribution_paladin::SPELL_JUDGMENT_DIVINE_TOLL
562 .bind(wowlab_engine_combat::generated_identities::specs::retribution_paladin::PROOF);
563pub(crate) const SPELL_HAMMER_OF_WRATH_DIVINE_TOLL: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::retribution_paladin::SPELL_HAMMER_OF_WRATH_DIVINE_TOLL
564 .bind(wowlab_engine_combat::generated_identities::specs::retribution_paladin::PROOF);
565pub(crate) const SPELL_DIVINE_TOLL: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::retribution_paladin::SPELL_DIVINE_TOLL
566 .bind(wowlab_engine_combat::generated_identities::specs::retribution_paladin::PROOF);
567pub(crate) const SPELL_HAMMER_OF_WRATH: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::retribution_paladin::SPELL_HAMMER_OF_WRATH
568 .bind(wowlab_engine_combat::generated_identities::specs::retribution_paladin::PROOF);
569pub(crate) const SPELL_EXECUTION_SENTENCE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::retribution_paladin::SPELL_EXECUTION_SENTENCE
570 .bind(wowlab_engine_combat::generated_identities::specs::retribution_paladin::PROOF);
571pub(crate) const SPELL_HAMMER_OF_LIGHT: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::retribution_paladin::SPELL_HAMMER_OF_LIGHT
572 .bind(wowlab_engine_combat::generated_identities::specs::retribution_paladin::PROOF);
573pub(crate) const SPELL_EMPYREAN_HAMMER: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::retribution_paladin::SPELL_EMPYREAN_HAMMER
574 .bind(wowlab_engine_combat::generated_identities::specs::retribution_paladin::PROOF);
575pub(crate) const SPELL_COUNT: usize = 18;
576const _: () = assert!(
577 SPELL_COUNT == 18,
578 "SPELL index ABI: count changed -- update positional hook consumers"
579);
580pub(crate) mod EFFECT {
581 pub(crate) const BURN_TO_ASH_EXTEND: (u32, u8) = (446_663, 1);
583 pub(crate) const CONSECRATION_TIMING: (u32, u8) = (26573, 1);
585 pub(crate) const CONSECRATION_GEOMETRY: (u32, u8) = (26573, 3);
587 pub(crate) const CONSECRATION_DAMAGE: (u32, u8) = (81297, 1);
589 pub(crate) const EXECUTION_SENTENCE_ACCUM_PCT: (u32, u8) = (343_527, 2);
591 pub(crate) const EXECUTION_SENTENCE_INIT: (u32, u8) = (1_260_251, 1);
593 pub(crate) const HIGHLORDS_MASTERY_DAMAGE: (u32, u8) = (267_316, 1);
595 pub(crate) const HIGHLORDS_MASTERY_FACTOR: (u32, u8) = (267_316, 4);
597 pub(crate) const HIGHLORDS_WRATH_DIVISOR: (u32, u8) = (404_512, 2);
599 pub(crate) const DIVINE_ARBITER_DAMAGE: (u32, u8) = (1_306_923, 1);
601 pub(crate) const MID2_DIVINE_PURPOSE_CHANCE: (u32, u8) = (1_296_660, 1);
603 pub(crate) const HIGHLORDS_JUDGMENT: (u32, u8) = (383_921, 1);
605 pub(crate) const HIGHLORDS_WRATH: (u32, u8) = (404_512, 3);
607 pub(crate) const ART_OF_WAR_CHANCE: (u32, u8) = (406_064, 1);
609 pub(crate) const ART_OF_WAR_CRIT_BONUS: (u32, u8) = (406_064, 2);
611 pub(crate) const LIGHT_WITHIN: (u32, u8) = (1_261_160, 1);
613 pub(crate) const LIGHT_WITHIN_VERDICT_BONUS: (u32, u8) = (1_261_111, 1);
615 pub(crate) const LIGHT_WITHIN_WAVE_BONUS: (u32, u8) = (1_261_159, 1);
617 pub(crate) const RIGHTEOUS_CAUSE_CHANCE: (u32, u8) = (402_912, 1);
619 pub(crate) const CRUSADING_STRIKES_HP: (u32, u8) = (406_834, 1);
621 pub(crate) const EMPYREAN_POWER_CHANCE: (u32, u8) = (326_732, 2);
623 pub(crate) const DIVINE_PURPOSE_CHANCE: (u32, u8) = (408_459, 1);
625 pub(crate) const DIVINE_STORM_DAMAGE: (u32, u8) = (53385, 1);
627 pub(crate) const EMPYREAN_LEGACY_EFFECTIVENESS: (u32, u8) = (387_170, 2);
629 pub(crate) const EMPYREAN_HAMMER_DAMAGE: (u32, u8) = (431_398, 1);
631 pub(crate) const HAMMER_OF_LIGHT_DAMAGE: (u32, u8) = (427_453, 1);
633 pub(crate) const LIGHTS_GUIDANCE_COUNT: (u32, u8) = (427_445, 2);
635 pub(crate) const LIGHTS_GUIDANCE_DELAY: (u32, u8) = (427_445, 4);
637 pub(crate) const LIGHTS_GUIDANCE_STAGGER: (u32, u8) = (427_445, 3);
639 pub(crate) const ZEALOUS_VINDICATION_COUNT: (u32, u8) = (431_463, 1);
641 pub(crate) const HIGHER_CALLING_EXTEND: (u32, u8) = (431_687, 1);
643 pub(crate) const DIVINE_TOLL_HOW: (u32, u8) = (1_279_408, 1);
645 pub(crate) const DIVINE_TOLL_JUDGMENT: (u32, u8) = (406_957, 1);
647 pub(crate) const HAMMER_OF_WRATH_DAMAGE: (u32, u8) = (24275, 1);
649 pub(crate) const VENGEFUL_WRATH_MAX_BONUS: (u32, u8) = (1_241_958, 1);
651 pub(crate) const DIVINE_TOLL_ECHO_MULT: (u32, u8) = (375_576, 6);
653 pub(crate) const DIVINE_EXACTION_COUNT: (u32, u8) = (1_260_429, 1);
655 pub(crate) const DIVINE_EXACTION_MULT: (u32, u8) = (1_260_429, 2);
657 pub(crate) const JUDGMENT_DEBUFF_BONUS: (u32, u8) = (197_277, 1);
659 pub(crate) const HOLY_BLADE_ENERGIZE: (u32, u8) = (383_342, 1);
661 pub(crate) const CRUSADE_HASTE_PER_STACK: (u32, u8) = (1_253_598, 1);
663 pub(crate) const CRUSADE_HASTE_CAP: (u32, u8) = (1_253_598, 2);
665 pub(crate) const AVENGING_WRATH_CRIT: (u32, u8) = (31884, 3);
667 pub(crate) const AVENGING_WRATH_PERIODIC_DAMAGE: (u32, u8) = (31884, 2);
669 pub(crate) const TRUTHS_WAKE_BURN_EFFECT_4: (u32, u8) = (403_695, 4);
671}
672static REPORTED_SPELLS: &[(&str, u32)] = &[
673 ("blade_of_vengeance", 404_358),
674 ("divine_arbiter", 1_306_923),
675 ("execution_sentence", 387_113),
676 ("execution_sentence_init", 1_260_251),
677 ("expurgation", 383_346),
678];
679static DECLARED_SPELL_IDS: &[u32] = &[
680 35395, 20271, 184_575, 85256, 53385, 255_937, 31884, 383_328, 408_385, 1_261_160,
681 383_921, 406_957, 1_279_408, 375_576, 24275, 343_527, 427_453, 431_398, 326_733,
682 387_178, 408_458, 1_305_230, 1_306_161, 1_306_162, 1_310_461, 406_086, 402_916,
683 1_277_026, 197_277, 382_538, 383_346, 403_695, 404_542, 403_509, 407_475, 433_671,
684 407_065, 1_260_251, 1_234_189, 427_441, 433_732, 431_536, 433_674, 432_629, 198_034,
685 406_064, 404_358, 403_010, 446_663, 404_834, 1_253_598, 408_459, 387_170, 326_732,
686 383_344, 231_663, 1_241_288, 406_154, 404_512, 383_342, 405_461, 453_433, 404_436,
687 1_261_113, 1_261_111, 1_261_159, 379_391, 458_359, 402_912, 407_067, 382_536,
688 405_355, 383_396, 406_646, 1_241_958, 6603, 26573, 81297, 267_316, 387_113, 406_834,
689 427_445, 431_463, 431_687, 1_260_429, 1_296_660, 1_306_923, 432_929, 198_137,
690 431_625, 432_463, 425_518, 1_261_525, 432_977, 431_533, 432_626, 406_648, 431_474,
691 431_414, 445_206, 1_264_050, 431_522, 431_539, 431_404,
692];
693static DECLARED_AURA_IDS: &[u32] = &[
694 31884, 326_733, 387_178, 408_458, 1_305_230, 1_306_161, 1_306_162, 1_310_461,
695 406_086, 402_916, 1_277_026, 197_277, 382_538, 383_346, 403_695, 404_542, 403_509,
696 407_475, 433_671, 407_065, 343_527, 1_260_251, 1_234_189, 427_441, 433_732, 431_536,
697 433_674, 432_629, 198_034, 427_441, 433_674, 433_671, 431_536, 406_648, 432_629,
698 445_206, 1_264_050, 431_522, 431_539, 431_404,
699];
700static TALENTS: &[(&str, u32)] = &[
701 ("ART_OF_WAR", TALENT::ART_OF_WAR),
702 ("BLADE_OF_JUSTICE", TALENT::BLADE_OF_JUSTICE),
703 ("BLADE_OF_VENGEANCE", TALENT::BLADE_OF_VENGEANCE),
704 ("BLESSED_CHAMPION", TALENT::BLESSED_CHAMPION),
705 ("BURN_TO_ASH", TALENT::BURN_TO_ASH),
706 ("CONSECRATED_BLADE", TALENT::CONSECRATED_BLADE),
707 ("CRUSADE", TALENT::CRUSADE),
708 ("CRUSADING_STRIKES", TALENT::CRUSADING_STRIKES),
709 ("DIVINE_PURPOSE", TALENT::DIVINE_PURPOSE),
710 ("DIVINE_STORM", TALENT::DIVINE_STORM),
711 ("DIVINE_TOLL", TALENT::DIVINE_TOLL),
712 ("EMPYREAN_LEGACY", TALENT::EMPYREAN_LEGACY),
713 ("EMPYREAN_POWER", TALENT::EMPYREAN_POWER),
714 ("EXECUTION_SENTENCE", TALENT::EXECUTION_SENTENCE),
715 ("EXPURGATION", TALENT::EXPURGATION),
716 ("FINAL_VERDICT", TALENT::FINAL_VERDICT),
717 ("GREATER_JUDGMENT", TALENT::GREATER_JUDGMENT),
718 ("HAMMER_OF_WRATH_TALENT", TALENT::HAMMER_OF_WRATH_TALENT),
719 ("HEART_OF_THE_CRUSADER", TALENT::HEART_OF_THE_CRUSADER),
720 ("HIGHLORDS_WRATH", TALENT::HIGHLORDS_WRATH),
721 ("HOLY_BLADE", TALENT::HOLY_BLADE),
722 ("IMPROVED_JUDGMENT", TALENT::IMPROVED_JUDGMENT),
723 ("JUDGE_JURY_AND_EXECUTIONER", TALENT::JUDGE_JURY_AND_EXECUTIONER),
724 ("LIGHT_OF_JUSTICE", TALENT::LIGHT_OF_JUSTICE),
725 ("LIGHT_WITHIN", TALENT::LIGHT_WITHIN),
726 ("LIGHT_WITHIN_VERDICT", TALENT::LIGHT_WITHIN_VERDICT),
727 ("LIGHT_WITHIN_WAVE", TALENT::LIGHT_WITHIN_WAVE),
728 ("QUICKENED_INVOCATION", TALENT::QUICKENED_INVOCATION),
729 ("RADIANT_GLORY", TALENT::RADIANT_GLORY),
730 ("RIGHTEOUS_CAUSE", TALENT::RIGHTEOUS_CAUSE),
731 ("RUSH_OF_LIGHT", TALENT::RUSH_OF_LIGHT),
732 ("SANCTIFY", TALENT::SANCTIFY),
733 ("SEETHING_FLAMES", TALENT::SEETHING_FLAMES),
734 ("TEMPEST_OF_THE_LIGHTBRINGER", TALENT::TEMPEST_OF_THE_LIGHTBRINGER),
735 ("TEMPLAR_STRIKES", TALENT::TEMPLAR_STRIKES),
736 ("VENGEFUL_WRATH", TALENT::VENGEFUL_WRATH),
737 ("WAKE_OF_ASHES", TALENT::WAKE_OF_ASHES),
738 ("ZEALOTS_FERVOR", TALENT::ZEALOTS_FERVOR),
739];
740pub(crate) mod RETRIBUTION_PALADIN {
741 pub(crate) const CRUSADER_STRIKE_CASTS: u32 = 0;
742 pub(crate) const JUDGMENT_CASTS: u32 = 1;
743 pub(crate) const BLADE_OF_JUSTICE_CASTS: u32 = 2;
744 pub(crate) const TEMPLARS_VERDICT_CASTS: u32 = 3;
745 pub(crate) const DIVINE_STORM_CASTS: u32 = 4;
746 pub(crate) const WAKE_OF_ASHES_CASTS: u32 = 5;
747 pub(crate) const AVENGING_WRATH_CASTS: u32 = 6;
748 pub(crate) const AVENGING_WRATH_UPTIME_MS: u32 = 7;
749}
750fn aura_avenging_wrath(
751 a: AuraDefinitionDraft,
752 data: &ResolvedGameData,
753) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
754 Ok(
755 a
756 .on_player()
757 .apply_base_from_data(data, 31884)?
758 .max_stacks(
759 data
760 .require_aura_max_stacks(
761 wowlab_types::sim::SpellIdx::from_raw(31884),
762 )?,
763 )
764 .on_expire(crate::hooks::retribution_paladin::avenging_wrath_expire_hook),
765 )
766}
767fn aura_empyrean_power(
768 a: AuraDefinitionDraft,
769 data: &ResolvedGameData,
770) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
771 Ok(
772 a
773 .on_player()
774 .apply_base_from_data(data, 326_733)?
775 .max_stacks(
776 data
777 .require_aura_max_stacks(
778 wowlab_types::sim::SpellIdx::from_raw(326_733),
779 )?,
780 ),
781 )
782}
783fn aura_empyrean_legacy(
784 a: AuraDefinitionDraft,
785 data: &ResolvedGameData,
786) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
787 Ok(
788 a
789 .on_player()
790 .apply_base_from_data(data, 387_178)?
791 .max_stacks(
792 data
793 .require_aura_max_stacks(
794 wowlab_types::sim::SpellIdx::from_raw(387_178),
795 )?,
796 ),
797 )
798}
799fn aura_divine_purpose(
800 a: AuraDefinitionDraft,
801 data: &ResolvedGameData,
802) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
803 Ok(
804 a
805 .on_player()
806 .apply_base_from_data(data, 408_458)?
807 .max_stacks(
808 data
809 .require_aura_max_stacks(
810 wowlab_types::sim::SpellIdx::from_raw(408_458),
811 )?,
812 ),
813 )
814}
815fn aura_divine_power(
816 a: AuraDefinitionDraft,
817 data: &ResolvedGameData,
818) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
819 Ok(
820 a
821 .on_player()
822 .apply_base_from_data(data, 1_305_230)?
823 .max_stacks(
824 data
825 .require_aura_max_stacks(
826 wowlab_types::sim::SpellIdx::from_raw(1_305_230),
827 )?,
828 ),
829 )
830}
831fn aura_divine_arbiter_verdict(
832 a: AuraDefinitionDraft,
833 data: &ResolvedGameData,
834) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
835 Ok(
836 a
837 .on_player()
838 .apply_base_from_data(data, 1_306_161)?
839 .max_stacks(
840 data
841 .require_aura_max_stacks(
842 wowlab_types::sim::SpellIdx::from_raw(1_306_161),
843 )?,
844 ),
845 )
846}
847fn aura_divine_arbiter_divine_storm(
848 a: AuraDefinitionDraft,
849 data: &ResolvedGameData,
850) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
851 Ok(
852 a
853 .on_player()
854 .apply_base_from_data(data, 1_306_162)?
855 .max_stacks(
856 data
857 .require_aura_max_stacks(
858 wowlab_types::sim::SpellIdx::from_raw(1_306_162),
859 )?,
860 ),
861 )
862}
863fn aura_divine_arbiter_hammer_of_light(
864 a: AuraDefinitionDraft,
865 data: &ResolvedGameData,
866) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
867 Ok(
868 a
869 .on_player()
870 .apply_base_from_data(data, 1_310_461)?
871 .max_stacks(
872 data
873 .require_aura_max_stacks(
874 wowlab_types::sim::SpellIdx::from_raw(1_310_461),
875 )?,
876 ),
877 )
878}
879fn aura_art_of_war(
880 a: AuraDefinitionDraft,
881 data: &ResolvedGameData,
882) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
883 Ok(
884 a
885 .on_player()
886 .apply_base_from_data(data, 406_086)?
887 .max_stacks(
888 data
889 .require_aura_max_stacks(
890 wowlab_types::sim::SpellIdx::from_raw(406_086),
891 )?,
892 ),
893 )
894}
895fn aura_righteous_cause(
896 a: AuraDefinitionDraft,
897 data: &ResolvedGameData,
898) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
899 Ok(
900 a
901 .on_player()
902 .apply_base_from_data(data, 402_916)?
903 .max_stacks(
904 data
905 .require_aura_max_stacks(
906 wowlab_types::sim::SpellIdx::from_raw(402_916),
907 )?,
908 ),
909 )
910}
911fn aura_hammer_of_wrath(
912 a: AuraDefinitionDraft,
913 data: &ResolvedGameData,
914) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
915 Ok(
916 a
917 .on_player()
918 .apply_base_from_data(data, 1_277_026)?
919 .max_stacks(
920 data
921 .require_aura_max_stacks(
922 wowlab_types::sim::SpellIdx::from_raw(1_277_026),
923 )?,
924 ),
925 )
926}
927fn aura_judgment_debuff(
928 a: AuraDefinitionDraft,
929 data: &ResolvedGameData,
930) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
931 Ok(
932 a
933 .on_target()
934 .apply_base_from_data(data, 197_277)?
935 .max_stacks(
936 data
937 .require_aura_max_stacks(
938 wowlab_types::sim::SpellIdx::from_raw(197_277),
939 )?,
940 ),
941 )
942}
943fn aura_sanctify(
944 a: AuraDefinitionDraft,
945 data: &ResolvedGameData,
946) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
947 Ok(
948 a
949 .on_target()
950 .apply_base_from_data(data, 382_538)?
951 .max_stacks(
952 data
953 .require_aura_max_stacks(
954 wowlab_types::sim::SpellIdx::from_raw(382_538),
955 )?,
956 ),
957 )
958}
959fn aura_expurgation(
960 a: AuraDefinitionDraft,
961 data: &ResolvedGameData,
962) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
963 Ok(
964 a
965 .on_target()
966 .apply_base_from_data(data, 383_346)?
967 .max_stacks(
968 data
969 .require_aura_max_stacks(
970 wowlab_types::sim::SpellIdx::from_raw(383_346),
971 )?,
972 )
973 .snapshot(),
974 )
975}
976fn aura_truths_wake(
977 a: AuraDefinitionDraft,
978 data: &ResolvedGameData,
979) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
980 Ok(
981 a
982 .on_target()
983 .apply_base_from_data(data, 403_695)?
984 .max_stacks(
985 data
986 .require_aura_max_stacks(
987 wowlab_types::sim::SpellIdx::from_raw(403_695),
988 )?,
989 )
990 .snapshot()
991 .hasted_periodic(),
992 )
993}
994fn aura_crusading_strikes(
995 a: AuraDefinitionDraft,
996 data: &ResolvedGameData,
997) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
998 Ok(
999 a
1000 .on_player()
1001 .apply_base_from_data(data, 404_542)?
1002 .max_stacks(
1003 data
1004 .require_aura_max_stacks(
1005 wowlab_types::sim::SpellIdx::from_raw(404_542),
1006 )?,
1007 ),
1008 )
1009}
1010fn aura_zealots_fervor(
1011 a: AuraDefinitionDraft,
1012 data: &ResolvedGameData,
1013) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1014 Ok(
1015 a
1016 .on_player()
1017 .apply_base_from_data(data, 403_509)?
1018 .max_stacks(
1019 data
1020 .require_aura_max_stacks(
1021 wowlab_types::sim::SpellIdx::from_raw(403_509),
1022 )?,
1023 ),
1024 )
1025}
1026fn aura_consecrated_blade_lockout(
1027 a: AuraDefinitionDraft,
1028 data: &ResolvedGameData,
1029) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1030 Ok(
1031 a
1032 .on_player()
1033 .apply_base_from_data(data, 407_475)?
1034 .max_stacks(
1035 data
1036 .require_aura_max_stacks(
1037 wowlab_types::sim::SpellIdx::from_raw(407_475),
1038 )?,
1039 ),
1040 )
1041}
1042fn aura_sanctification(
1043 a: AuraDefinitionDraft,
1044 data: &ResolvedGameData,
1045) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1046 a.on_player()
1047 .duration_ms(
1048 wowlab_engine_combat::validated_milliseconds(
1049 (f64::from(
1050 data
1051 .require_aura_duration_ms(
1052 wowlab_types::sim::SpellIdx::from_raw(433_671),
1053 )?,
1054 )) * 0.833_333_333_333_333_4,
1055 433_671,
1056 "aura.duration_ms",
1057 )?,
1058 )
1059 .apply_periodic_effect_from_data(data, 433_671)?
1060 .apply_duration_behavior_from_data(data, 433_671)?
1061 .apply_timing_modifiers_from_data(data, 433_671)?
1062 .max_stacks(
1063 data.require_aura_max_stacks(wowlab_types::sim::SpellIdx::from_raw(433_671))?,
1064 )
1065 .async_stacks()
1066 .damage_percent_spells_linear(
1067 data.base_points(wowlab_types::sim::SpellIdx::from_raw(433_671), 1),
1068 &[431_398],
1069 )?
1070 .apply_periodic_behavior_from_data(data, 433_671)
1071}
1072fn aura_rush_of_light(
1073 a: AuraDefinitionDraft,
1074 data: &ResolvedGameData,
1075) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1076 Ok(
1077 a
1078 .on_player()
1079 .apply_base_from_data(data, 407_065)?
1080 .max_stacks(
1081 data
1082 .require_aura_max_stacks(
1083 wowlab_types::sim::SpellIdx::from_raw(407_065),
1084 )?,
1085 ),
1086 )
1087}
1088fn aura_execution_sentence(
1089 a: AuraDefinitionDraft,
1090 data: &ResolvedGameData,
1091) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1092 Ok(
1093 a
1094 .on_target()
1095 .apply_base_from_data(data, 343_527)?
1096 .max_stacks(
1097 data
1098 .require_aura_max_stacks(
1099 wowlab_types::sim::SpellIdx::from_raw(343_527),
1100 )?,
1101 )
1102 .no_pandemic()
1103 .on_expire(crate::hooks::retribution_paladin::execution_sentence_expire_hook),
1104 )
1105}
1106fn aura_execution_sentence_gather(
1107 a: AuraDefinitionDraft,
1108 data: &ResolvedGameData,
1109) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1110 Ok(
1111 a
1112 .on_target()
1113 .apply_base_from_data(data, 1_260_251)?
1114 .max_stacks(
1115 data
1116 .require_aura_max_stacks(
1117 wowlab_types::sim::SpellIdx::from_raw(1_260_251),
1118 )?,
1119 )
1120 .no_pandemic(),
1121 )
1122}
1123fn aura_execution_sentence_tracker(
1124 a: AuraDefinitionDraft,
1125 data: &ResolvedGameData,
1126) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1127 Ok(
1128 a
1129 .on_player()
1130 .apply_base_from_data(data, 1_234_189)?
1131 .max_stacks(
1132 data
1133 .require_aura_max_stacks(
1134 wowlab_types::sim::SpellIdx::from_raw(1_234_189),
1135 )?,
1136 ),
1137 )
1138}
1139fn aura_hammer_of_light(
1140 a: AuraDefinitionDraft,
1141 data: &ResolvedGameData,
1142) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1143 Ok(
1144 a
1145 .on_player()
1146 .apply_base_from_data(data, 427_441)?
1147 .max_stacks(
1148 data
1149 .require_aura_max_stacks(
1150 wowlab_types::sim::SpellIdx::from_raw(427_441),
1151 )?,
1152 )
1153 .on_expire(crate::hooks::retribution_paladin::lights_deliverance_check_hook),
1154 )
1155}
1156fn aura_hammer_of_light_free(
1157 a: AuraDefinitionDraft,
1158 data: &ResolvedGameData,
1159) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1160 Ok(
1161 a
1162 .on_player()
1163 .apply_base_from_data(data, 433_732)?
1164 .max_stacks(
1165 data
1166 .require_aura_max_stacks(
1167 wowlab_types::sim::SpellIdx::from_raw(433_732),
1168 )?,
1169 ),
1170 )
1171}
1172fn aura_shake_the_heavens(
1173 a: AuraDefinitionDraft,
1174 data: &ResolvedGameData,
1175) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1176 Ok(
1177 a
1178 .on_player()
1179 .apply_base_from_data(data, 431_536)?
1180 .max_stacks(
1181 data
1182 .require_aura_max_stacks(
1183 wowlab_types::sim::SpellIdx::from_raw(431_536),
1184 )?,
1185 )
1186 .periodic_hook(
1187 wowlab_engine_combat::validated_milliseconds(
1188 data.period(wowlab_types::sim::SpellIdx::from_raw(431_536), 1),
1189 431_536,
1190 "periodic_hook.tick_ms",
1191 )?,
1192 )
1193 .apply_periodic_behavior_from_data(data, 431_536)?
1194 .partial_tick()
1195 .tick_hook(crate::hooks::retribution_paladin::sth_pulse_hook),
1196 )
1197}
1198fn aura_lights_deliverance(
1199 a: AuraDefinitionDraft,
1200 data: &ResolvedGameData,
1201) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1202 Ok(
1203 a
1204 .on_player()
1205 .apply_base_from_data(data, 433_674)?
1206 .max_stacks(
1207 data
1208 .require_aura_max_stacks(
1209 wowlab_types::sim::SpellIdx::from_raw(433_674),
1210 )?,
1211 ),
1212 )
1213}
1214fn aura_undisputed_ruling(
1215 a: AuraDefinitionDraft,
1216 data: &ResolvedGameData,
1217) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1218 Ok(
1219 a
1220 .on_player()
1221 .apply_base_from_data(data, 432_629)?
1222 .max_stacks(
1223 data
1224 .require_aura_max_stacks(
1225 wowlab_types::sim::SpellIdx::from_raw(432_629),
1226 )?,
1227 ),
1228 )
1229}
1230fn aura_divine_hammer(
1231 a: AuraDefinitionDraft,
1232 data: &ResolvedGameData,
1233) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1234 Ok(
1235 a
1236 .on_player()
1237 .apply_base_from_data(data, 198_034)?
1238 .max_stacks(
1239 data
1240 .require_aura_max_stacks(
1241 wowlab_types::sim::SpellIdx::from_raw(198_034),
1242 )?,
1243 )
1244 .periodic_hook(
1245 wowlab_engine_combat::validated_milliseconds(
1246 data.period(wowlab_types::sim::SpellIdx::from_raw(198_034), 1),
1247 198_034,
1248 "periodic_hook.tick_ms",
1249 )?,
1250 )
1251 .apply_periodic_behavior_from_data(data, 198_034)?
1252 .partial_tick()
1253 .tick_hook(crate::hooks::retribution_paladin::divine_hammer_pulse_hook),
1254 )
1255}
1256fn spell_crusader_strike(
1257 s: SpellDefinitionDraft,
1258 data: &ResolvedGameData,
1259) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1260 Ok(s.apply_base_from_data(data, 35395)?.apply_aoe_from_data(data))
1261}
1262fn spell_judgment(
1263 s: SpellDefinitionDraft,
1264 data: &ResolvedGameData,
1265) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1266 Ok(
1267 s
1268 .apply_base_from_data(data, 20271)?
1269 .gain(1.0)
1270 .apply_aoe_from_data(data)
1271 .on_cast(crate::hooks::retribution_paladin::judgment_hook),
1272 )
1273}
1274fn spell_blade_of_justice(
1275 s: SpellDefinitionDraft,
1276 data: &ResolvedGameData,
1277) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1278 Ok(
1279 s
1280 .apply_base_from_data(data, 184_575)?
1281 .trigger_program_predicate(
1282 3,
1283 crate::hooks::retribution_paladin::blade_of_vengeance_trigger_disabled,
1284 )
1285 .apply_aoe_from_data(data)
1286 .on_cast(crate::hooks::retribution_paladin::blade_of_justice_hook),
1287 )
1288}
1289fn spell_templars_verdict(
1290 s: SpellDefinitionDraft,
1291 data: &ResolvedGameData,
1292) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1293 Ok(
1294 s
1295 .apply_base_from_data(data, 85256)?
1296 .apply_aoe_from_data(data)
1297 .on_cast(crate::hooks::retribution_paladin::templars_verdict_hook),
1298 )
1299}
1300fn spell_divine_storm(
1301 s: SpellDefinitionDraft,
1302 data: &ResolvedGameData,
1303) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1304 Ok(
1305 s
1306 .apply_base_from_data(data, 53385)?
1307 .apply_aoe_from_data(data)
1308 .on_cast(crate::hooks::retribution_paladin::divine_storm_hook),
1309 )
1310}
1311fn spell_wake_of_ashes(
1312 s: SpellDefinitionDraft,
1313 data: &ResolvedGameData,
1314) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1315 Ok(
1316 s
1317 .apply_base_from_data(data, 255_937)?
1318 .apply_aoe_from_data(data)
1319 .on_cast(crate::hooks::retribution_paladin::wake_of_ashes_hook),
1320 )
1321}
1322fn spell_avenging_wrath(
1323 s: SpellDefinitionDraft,
1324 data: &ResolvedGameData,
1325) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1326 Ok(
1327 s
1328 .apply_base_from_data(data, 31884)?
1329 .applies_inferred_aura(AURA_AVENGING_WRATH, 31884)
1330 .apply_aoe_from_data(data)
1331 .on_cast(crate::hooks::retribution_paladin::avenging_wrath_hook),
1332 )
1333}
1334fn spell_final_verdict(
1335 s: SpellDefinitionDraft,
1336 data: &ResolvedGameData,
1337) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1338 Ok(
1339 s
1340 .apply_base_from_data(data, 383_328)?
1341 .apply_aoe_from_data(data)
1342 .on_cast(crate::hooks::retribution_paladin::templars_verdict_hook),
1343 )
1344}
1345fn spell_crusading_strike(
1346 s: SpellDefinitionDraft,
1347 data: &ResolvedGameData,
1348) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1349 Ok(s.apply_base_from_data(data, 408_385)?.apply_aoe_from_data(data))
1350}
1351fn spell_light_within_boj(
1352 s: SpellDefinitionDraft,
1353 data: &ResolvedGameData,
1354) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1355 Ok(
1356 s
1357 .apply_base_from_data(data, 1_261_160)?
1358 .damage_flat(0.0)
1359 .apply_aoe_from_data(data),
1360 )
1361}
1362fn spell_highlords_judgment(
1363 s: SpellDefinitionDraft,
1364 data: &ResolvedGameData,
1365) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1366 Ok(s.apply_base_from_data(data, 383_921)?.damage_flat(0.0).apply_aoe_from_data(data))
1367}
1368fn spell_judgment_divine_toll(
1369 s: SpellDefinitionDraft,
1370 data: &ResolvedGameData,
1371) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1372 Ok(s.apply_base_from_data(data, 406_957)?.damage_flat(0.0).apply_aoe_from_data(data))
1373}
1374fn spell_hammer_of_wrath_divine_toll(
1375 s: SpellDefinitionDraft,
1376 data: &ResolvedGameData,
1377) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1378 Ok(
1379 s
1380 .apply_base_from_data(data, 1_279_408)?
1381 .damage_flat(0.0)
1382 .apply_aoe_from_data(data),
1383 )
1384}
1385fn spell_divine_toll(
1386 s: SpellDefinitionDraft,
1387 data: &ResolvedGameData,
1388) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1389 Ok(
1390 s
1391 .apply_base_from_data(data, 375_576)?
1392 .apply_aoe_from_data(data)
1393 .on_cast(crate::hooks::retribution_paladin::divine_toll_hook),
1394 )
1395}
1396fn spell_hammer_of_wrath(
1397 s: SpellDefinitionDraft,
1398 data: &ResolvedGameData,
1399) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1400 Ok(
1401 s
1402 .apply_base_from_data(data, 24275)?
1403 .damage_flat(0.0)
1404 .applies_inferred_aura(AURA_HAMMER_OF_WRATH, 1_277_026)
1405 .apply_aoe_from_data(data)
1406 .on_cast(crate::hooks::retribution_paladin::hammer_of_wrath_hook),
1407 )
1408}
1409fn spell_execution_sentence(
1410 s: SpellDefinitionDraft,
1411 data: &ResolvedGameData,
1412) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1413 Ok(
1414 s
1415 .apply_base_from_data(data, 343_527)?
1416 .without_primary_data_damage()
1417 .apply_aoe_from_data(data)
1418 .on_cast(crate::hooks::retribution_paladin::execution_sentence_hook),
1419 )
1420}
1421fn spell_hammer_of_light(
1422 s: SpellDefinitionDraft,
1423 data: &ResolvedGameData,
1424) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1425 Ok(
1426 s
1427 .apply_base_from_data(data, 427_453)?
1428 .cost(
1429 wowlab_engine_combat::validated_nonnegative(5.0, 427_453, "spell.cost")?,
1430 )
1431 .damage_flat(0.0)
1432 .applies_inferred_aura(AURA_HAMMER_OF_LIGHT, 427_441)
1433 .apply_aoe_from_data(data)
1434 .on_cast(crate::hooks::retribution_paladin::hammer_of_light_hook)
1435 .requires_aura_at_min_stacks(427_441, 0)
1436 .cost_free_when_aura(433_732),
1437 )
1438}
1439fn spell_empyrean_hammer(
1440 s: SpellDefinitionDraft,
1441 data: &ResolvedGameData,
1442) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1443 Ok(s.apply_base_from_data(data, 431_398)?.damage_flat(0.0).apply_aoe_from_data(data))
1444}
1445pub(crate) fn build_combat_system_draft(
1446 params: &wowlab_engine_ports::HandlerParams<'_>,
1447) -> Result<CombatSystemDraft, wowlab_engine_ports::EngineError> {
1448 let builder = CombatSystemBuilder::new(params.stats.clone())
1449 .spec_id(SpecId::Retribution)
1450 .spec_identity(
1451 wowlab_engine_combat::generated_identities::specs::retribution_paladin::PROOF,
1452 )
1453 .hero_talent_trees(DECLARED_METADATA.hero_talent_trees)
1454 .effect_identities(
1455 wowlab_engine_combat::generated_identities::specs::retribution_paladin::damage::ALL,
1456 )
1457 .effect_identities(wowlab_engine_combat::generated_identities::shared::ALL)
1458 .mastery_spell(267_316)
1459 .mastery_hook(crate::hooks::retribution_paladin::mastery)
1460 .resource(
1461 "holy_power",
1462 5.0,
1463 params
1464 .game_data
1465 .power_regen_for_max(9, 5.0)
1466 .ok_or_else(|| {
1467 wowlab_engine_ports::EngineError::spec_construction(
1468 "missing power-type power_regen_for_max for type_id 9",
1469 )
1470 })?,
1471 )
1472 .resource_type_id(9)
1473 .resource_start(
1474 params
1475 .game_data
1476 .power_default(9)
1477 .ok_or_else(|| {
1478 wowlab_engine_ports::EngineError::spec_construction(
1479 "missing power-type power_default for type_id 9",
1480 )
1481 })?,
1482 )
1483 .aura(
1484 "avenging_wrath",
1485 AURA::AVENGING_WRATH,
1486 |a| aura_avenging_wrath(a, ¶ms.game_data),
1487 )
1488 .aura(
1489 "empyrean_power",
1490 AURA::EMPYREAN_POWER,
1491 |a| aura_empyrean_power(a, ¶ms.game_data),
1492 )
1493 .aura(
1494 "empyrean_legacy",
1495 AURA::EMPYREAN_LEGACY,
1496 |a| aura_empyrean_legacy(a, ¶ms.game_data),
1497 )
1498 .aura(
1499 "divine_purpose",
1500 AURA::DIVINE_PURPOSE,
1501 |a| aura_divine_purpose(a, ¶ms.game_data),
1502 )
1503 .aura(
1504 "divine_power",
1505 AURA::DIVINE_POWER,
1506 |a| aura_divine_power(a, ¶ms.game_data),
1507 )
1508 .aura(
1509 "divine_arbiter_verdict",
1510 AURA::DIVINE_ARBITER_VERDICT,
1511 |a| aura_divine_arbiter_verdict(a, ¶ms.game_data),
1512 )
1513 .aura(
1514 "divine_arbiter_divine_storm",
1515 AURA::DIVINE_ARBITER_DIVINE_STORM,
1516 |a| aura_divine_arbiter_divine_storm(a, ¶ms.game_data),
1517 )
1518 .aura(
1519 "divine_arbiter_hammer_of_light",
1520 AURA::DIVINE_ARBITER_HAMMER_OF_LIGHT,
1521 |a| aura_divine_arbiter_hammer_of_light(a, ¶ms.game_data),
1522 )
1523 .aura("art_of_war", AURA::ART_OF_WAR, |a| aura_art_of_war(a, ¶ms.game_data))
1524 .aura(
1525 "righteous_cause",
1526 AURA::RIGHTEOUS_CAUSE,
1527 |a| aura_righteous_cause(a, ¶ms.game_data),
1528 )
1529 .aura(
1530 "hammer_of_wrath",
1531 AURA::HAMMER_OF_WRATH,
1532 |a| aura_hammer_of_wrath(a, ¶ms.game_data),
1533 )
1534 .aura(
1535 "judgment_debuff",
1536 AURA::JUDGMENT_DEBUFF,
1537 |a| aura_judgment_debuff(a, ¶ms.game_data),
1538 )
1539 .aura("sanctify", AURA::SANCTIFY, |a| aura_sanctify(a, ¶ms.game_data))
1540 .aura(
1541 "expurgation",
1542 AURA::EXPURGATION,
1543 |a| aura_expurgation(a, ¶ms.game_data),
1544 )
1545 .aura(
1546 "truths_wake",
1547 AURA::TRUTHS_WAKE,
1548 |a| aura_truths_wake(a, ¶ms.game_data),
1549 )
1550 .aura(
1551 "crusading_strikes",
1552 AURA::CRUSADING_STRIKES,
1553 |a| aura_crusading_strikes(a, ¶ms.game_data),
1554 )
1555 .aura(
1556 "zealots_fervor",
1557 AURA::ZEALOTS_FERVOR,
1558 |a| aura_zealots_fervor(a, ¶ms.game_data),
1559 )
1560 .aura(
1561 "consecrated_blade_lockout",
1562 AURA::CONSECRATED_BLADE_LOCKOUT,
1563 |a| aura_consecrated_blade_lockout(a, ¶ms.game_data),
1564 )
1565 .aura(
1566 "sanctification",
1567 AURA::SANCTIFICATION,
1568 |a| aura_sanctification(a, ¶ms.game_data),
1569 )
1570 .aura(
1571 "rush_of_light",
1572 AURA::RUSH_OF_LIGHT,
1573 |a| aura_rush_of_light(a, ¶ms.game_data),
1574 )
1575 .aura(
1576 "execution_sentence",
1577 AURA::EXECUTION_SENTENCE,
1578 |a| aura_execution_sentence(a, ¶ms.game_data),
1579 )
1580 .aura(
1581 "execution_sentence_gather",
1582 AURA::EXECUTION_SENTENCE_GATHER,
1583 |a| aura_execution_sentence_gather(a, ¶ms.game_data),
1584 )
1585 .aura(
1586 "execution_sentence_tracker",
1587 AURA::EXECUTION_SENTENCE_TRACKER,
1588 |a| aura_execution_sentence_tracker(a, ¶ms.game_data),
1589 )
1590 .aura(
1591 "hammer_of_light",
1592 AURA::HAMMER_OF_LIGHT,
1593 |a| aura_hammer_of_light(a, ¶ms.game_data),
1594 )
1595 .aura(
1596 "hammer_of_light_free",
1597 AURA::HAMMER_OF_LIGHT_FREE,
1598 |a| aura_hammer_of_light_free(a, ¶ms.game_data),
1599 )
1600 .aura(
1601 "shake_the_heavens",
1602 AURA::SHAKE_THE_HEAVENS,
1603 |a| aura_shake_the_heavens(a, ¶ms.game_data),
1604 )
1605 .aura(
1606 "lights_deliverance",
1607 AURA::LIGHTS_DELIVERANCE,
1608 |a| aura_lights_deliverance(a, ¶ms.game_data),
1609 )
1610 .aura(
1611 "undisputed_ruling",
1612 AURA::UNDISPUTED_RULING,
1613 |a| aura_undisputed_ruling(a, ¶ms.game_data),
1614 )
1615 .aura(
1616 "divine_hammer",
1617 AURA::DIVINE_HAMMER,
1618 |a| aura_divine_hammer(a, ¶ms.game_data),
1619 )
1620 .spell(
1621 "crusader_strike",
1622 SPELL::CRUSADER_STRIKE,
1623 |s| spell_crusader_strike(s, ¶ms.game_data),
1624 )
1625 .spell("judgment", SPELL::JUDGMENT, |s| spell_judgment(s, ¶ms.game_data))
1626 .spell(
1627 "blade_of_justice",
1628 SPELL::BLADE_OF_JUSTICE,
1629 |s| spell_blade_of_justice(s, ¶ms.game_data),
1630 )
1631 .spell(
1632 "templars_verdict",
1633 SPELL::TEMPLARS_VERDICT,
1634 |s| spell_templars_verdict(s, ¶ms.game_data),
1635 )
1636 .spell(
1637 "divine_storm",
1638 SPELL::DIVINE_STORM,
1639 |s| spell_divine_storm(s, ¶ms.game_data),
1640 )
1641 .spell(
1642 "wake_of_ashes",
1643 SPELL::WAKE_OF_ASHES,
1644 |s| spell_wake_of_ashes(s, ¶ms.game_data),
1645 )
1646 .spell(
1647 "avenging_wrath",
1648 SPELL::AVENGING_WRATH,
1649 |s| spell_avenging_wrath(s, ¶ms.game_data),
1650 )
1651 .spell(
1652 "final_verdict",
1653 SPELL::FINAL_VERDICT,
1654 |s| spell_final_verdict(s, ¶ms.game_data),
1655 )
1656 .spell(
1657 "crusading_strike",
1658 SPELL::CRUSADING_STRIKE,
1659 |s| spell_crusading_strike(s, ¶ms.game_data),
1660 )
1661 .spell(
1662 "light_within_boj",
1663 SPELL::LIGHT_WITHIN_BOJ,
1664 |s| spell_light_within_boj(s, ¶ms.game_data),
1665 )
1666 .spell(
1667 "highlords_judgment",
1668 SPELL::HIGHLORDS_JUDGMENT,
1669 |s| spell_highlords_judgment(s, ¶ms.game_data),
1670 )
1671 .spell(
1672 "judgment_divine_toll",
1673 SPELL::JUDGMENT_DIVINE_TOLL,
1674 |s| spell_judgment_divine_toll(s, ¶ms.game_data),
1675 )
1676 .spell(
1677 "hammer_of_wrath_divine_toll",
1678 SPELL::HAMMER_OF_WRATH_DIVINE_TOLL,
1679 |s| spell_hammer_of_wrath_divine_toll(s, ¶ms.game_data),
1680 )
1681 .spell(
1682 "divine_toll",
1683 SPELL::DIVINE_TOLL,
1684 |s| spell_divine_toll(s, ¶ms.game_data),
1685 )
1686 .spell(
1687 "hammer_of_wrath",
1688 SPELL::HAMMER_OF_WRATH,
1689 |s| spell_hammer_of_wrath(s, ¶ms.game_data),
1690 )
1691 .spell(
1692 "execution_sentence",
1693 SPELL::EXECUTION_SENTENCE,
1694 |s| spell_execution_sentence(s, ¶ms.game_data),
1695 )
1696 .spell(
1697 "hammer_of_light",
1698 SPELL::HAMMER_OF_LIGHT,
1699 |s| spell_hammer_of_light(s, ¶ms.game_data),
1700 )
1701 .spell(
1702 "empyrean_hammer",
1703 SPELL::EMPYREAN_HAMMER,
1704 |s| spell_empyrean_hammer(s, ¶ms.game_data),
1705 )
1706 .auto_attack(|a| {
1707 a
1708 .spell_id(6603)
1709 .swing_ms(3600)
1710 .apply_base_from_data(¶ms.game_data)
1711 .on_swing(crate::hooks::retribution_paladin::swing_hook)
1712 })
1713 .game_data(params.game_data.clone())
1714 .talent_spell_ids(TALENTS)
1715 .talent_selections(params.talent_selections)
1716 .talent_gated_aura_effect(TALENT::CRUSADE, AURA_AVENGING_WRATH, 31884, 11)
1717 .talent_gated_aura_effect(TALENT::BURN_TO_ASH, AURA_TRUTHS_WAKE, 403_695, 4)
1718 .talent_gated_aura_effect(TALENT::BURN_TO_ASH, AURA_TRUTHS_WAKE, 403_695, 5)
1719 .talent_gated_aura_effect(TALENT::BURN_TO_ASH, AURA_TRUTHS_WAKE, 403_695, 6)
1720 .set_bonus_auras(params.set_bonus_auras)
1721 .encounter(params.encounter.clone());
1722 let builder = crate::generated::items::register_equipped(
1723 builder,
1724 ¶ms.game_data,
1725 params.equipped_items,
1726 )?;
1727
1728 builder.into_draft()
1729}
1730fn new_handler(
1731 params: wowlab_engine_ports::HandlerParams<'_>,
1732) -> Result<Box<dyn SpecHandler>, wowlab_engine_ports::EngineError> {
1733 let handler = crate::composition::compose_handler(
1734 build_combat_system_draft,
1735 ¶ms,
1736 crate::hooks::retribution_paladin::RetributionHandler::new,
1737 )?;
1738
1739 Ok(Box::new(handler))
1740}
1741static DECLARED_METADATA: DeclaredSpecMetadata = DeclaredSpecMetadata {
1742 primary_resource: ResourceType::HolyPower,
1743 secondary_resource: None,
1744 spell_ids: DECLARED_SPELL_IDS,
1745 aura_ids: DECLARED_AURA_IDS,
1746 server_proc_entries: &[],
1747 talents: TALENTS,
1748 rotation_field_schema: &[],
1749 metrics_plugin_id: None,
1750 hero_talent_trees: &[
1751 HeroTalentTreeDesc {
1752 name: "Templar",
1753 spells: HERO_TREE_TEMPLAR_SPELLS,
1754 auras: HERO_TREE_TEMPLAR_AURAS,
1755 },
1756 HeroTalentTreeDesc {
1757 name: "Herald Of The Sun",
1758 spells: HERO_TREE_HERALD_OF_THE_SUN_SPELLS,
1759 auras: HERO_TREE_HERALD_OF_THE_SUN_AURAS,
1760 },
1761 ],
1762 reported_spells: REPORTED_SPELLS,
1763 masked_passive_effects: &[],
1764 passive_effect_overrides: &[],
1765};
1766pub(super) const SPEC_DESCRIPTOR: SpecDescriptor = SpecDescriptor {
1767 spec_id: SpecId::Retribution,
1768 display_name: "Retribution Paladin",
1769 metadata: DECLARED_METADATA,
1770 handler_factory: new_handler,
1771};
1772wowlab_engine_combat::smoke_test!(build_combat_system_draft);