1#![allow(non_snake_case, dead_code)]
4use wowlab_types::{combat::ResourceType, game::SpecId};
5use wowlab_engine_domain::dbc::ProcAttributes;
6use wowlab_engine_combat::{
7 CombatSystemBuilder, CombatSystemDraft, AuraDefinitionDraft, LocalAuraIdx,
8 LocalSpellIdx, SpellDefinitionDraft,
9};
10use wowlab_engine_ports::{
11 DeclaredSpecMetadata, SpecDescriptor, SpecHandler, HeroTalentTreeDesc,
12 DeclaredServerProcEntry,
13};
14use wowlab_engine_gamedata::ResolvedGameData;
15pub(crate) mod SPELL {
16 pub(crate) const SUMMON_FELHUNTER: u32 = 691;
18 pub(crate) const SUMMON_IMP: u32 = 688;
20 pub(crate) const GRIMOIRE_OF_SACRIFICE: u32 = 108_503;
22 pub(crate) const IMMOLATE: u32 = 348;
24 pub(crate) const INCINERATE: u32 = 29722;
26 pub(crate) const CONFLAGRATE: u32 = 17962;
28 pub(crate) const CHAOS_BOLT: u32 = 116_858;
30 pub(crate) const RAIN_OF_FIRE: u32 = 5740;
32 pub(crate) const SHADOWBURN: u32 = 17877;
34 pub(crate) const SOUL_FIRE: u32 = 6353;
36 pub(crate) const CATACLYSM: u32 = 152_108;
38 pub(crate) const CHANNEL_DEMONFIRE: u32 = 196_447;
40 pub(crate) const CHANNEL_DEMONFIRE_TICK: u32 = 196_448;
42 pub(crate) const HAVOC: u32 = 80240;
44 pub(crate) const SHADOW_BOLT: u32 = 686;
46 pub(crate) const CORRUPTION: u32 = 172;
48 pub(crate) const MALEVOLENCE: u32 = 430_014;
50 pub(crate) const DRAIN_LIFE: u32 = 234_153;
52 pub(crate) const INFERNAL_BOLT: u32 = 434_506;
54 pub(crate) const RUINATION: u32 = 434_635;
56 pub(crate) const SUMMON_INFERNAL: u32 = 1122;
58}
59pub(crate) mod AURA {
60 pub(crate) const IMMOLATE: u32 = 157_736;
62 pub(crate) const BACKDRAFT: u32 = 117_828;
64 pub(crate) const REVERSE_ENTROPY: u32 = 266_030;
66 pub(crate) const REVERSE_ENTROPY_TALENT: u32 = 205_148;
68 pub(crate) const FLASHPOINT: u32 = 387_263;
70 pub(crate) const FIENDISH_CRUELTY: u32 = 1_245_664;
72 pub(crate) const FIENDISH_CRUELTY_TALENT: u32 = 1_245_633;
74 pub(crate) const CONFLAGRATION_OF_CHAOS_TALENT: u32 = 387_108;
76 pub(crate) const CHAOTIC_INFERNO: u32 = 1_244_860;
78 pub(crate) const CHAOTIC_INFERNO_TALENT: u32 = 1_244_788;
80 pub(crate) const HAVOC: u32 = 80240;
82 pub(crate) const RITUAL_OF_RUIN: u32 = 387_157;
84 pub(crate) const GRIMOIRE_OF_SACRIFICE: u32 = 196_099;
86 pub(crate) const WITHER: u32 = 445_474;
88 pub(crate) const MALEVOLENCE: u32 = 442_726;
90 pub(crate) const CHANNEL_DEMONFIRE: u32 = 196_447;
92 pub(crate) const RECENTLY_DEMON_HAS_BEEN_SUMMONED_DNT: u32 = 1_288_970;
94 pub(crate) const TRACK_PETS: u32 = 462_599;
96 pub(crate) const DARK_TITANS_MARK: u32 = 1_305_711;
98 pub(crate) const INFERNAL_BOLT: u32 = 433_891;
100 pub(crate) const RUINATION: u32 = 433_885;
102 pub(crate) const DIABOLIC_RITUAL_TALENT: u32 = 428_514;
104 pub(crate) const DIABOLIC_RITUAL_OVERLORD: u32 = 431_944;
106 pub(crate) const DIABOLIC_RITUAL_MOTHER: u32 = 432_815;
108 pub(crate) const DIABOLIC_RITUAL_PIT_LORD: u32 = 432_816;
110 pub(crate) const DEMONIC_ART_OVERLORD: u32 = 428_524;
112 pub(crate) const DEMONIC_ART_MOTHER: u32 = 432_794;
114 pub(crate) const DEMONIC_ART_PIT_LORD: u32 = 432_795;
116 pub(crate) const DEMONIC_OCULI: u32 = 1_269_643;
118 pub(crate) const DIABOLIC_OCULI_TALENT: u32 = 1_268_709;
120 pub(crate) const LOOKS_THAT_KILL_TALENT: u32 = 1_268_713;
122 pub(crate) const MINDS_EYES_TALENT: u32 = 1_268_716;
124 pub(crate) const MINDS_EYES: u32 = 1_269_879;
126 pub(crate) const OVERFIEND: u32 = 457_578;
128 pub(crate) const AVATAR_OF_DESTRUCTION_TALENT: u32 = 1_245_089;
130 pub(crate) const EMBERS_OF_NIHILAM_1_TALENT: u32 = 1_265_770;
132 pub(crate) const EMBERS_OF_NIHILAM_2_TALENT: u32 = 1_265_772;
134 pub(crate) const EMBERS_OF_NIHILAM_3_TALENT: u32 = 1_265_774;
136 pub(crate) const VISION_OF_NIHILAM: u32 = 1_265_939;
138 pub(crate) const INFERNAL_EMBERS: u32 = 264_364;
140 pub(crate) const RAIN_OF_CHAOS: u32 = 266_087;
142 pub(crate) const CRASHING_CHAOS: u32 = 417_282;
144}
145pub(crate) mod TALENT {
146 pub(crate) const AVATAR_OF_DESTRUCTION: u32 = 1_245_089;
148 pub(crate) const BACKDRAFT: u32 = 196_406;
150 pub(crate) const CATACLYSM: u32 = 152_108;
152 pub(crate) const CHANNEL_DEMONFIRE: u32 = 196_447;
154 pub(crate) const CHAOS_INCARNATE: u32 = 387_275;
156 pub(crate) const CHAOTIC_INFERNO: u32 = 1_244_788;
158 pub(crate) const CONFLAGRATE: u32 = 17962;
160 pub(crate) const CONFLAGRATION_OF_CHAOS: u32 = 387_108;
162 pub(crate) const CRASHING_CHAOS: u32 = 417_234;
164 pub(crate) const DEMONFIRE_INFUSION: u32 = 1_214_442;
166 pub(crate) const DIABOLIC_EMBERS: u32 = 387_173;
168 pub(crate) const DIABOLIC_OCULI: u32 = 1_268_709;
170 pub(crate) const DIABOLIC_RITUAL: u32 = 428_514;
172 pub(crate) const EMBERSTORM: u32 = 454_744;
174 pub(crate) const EMBERS_OF_NIHILAM_1: u32 = 1_265_770;
176 pub(crate) const EMBERS_OF_NIHILAM_2: u32 = 1_265_772;
178 pub(crate) const EMBERS_OF_NIHILAM_3: u32 = 1_265_774;
180 pub(crate) const FIENDISH_CRUELTY: u32 = 1_245_633;
182 pub(crate) const FIRE_AND_BRIMSTONE: u32 = 196_408;
184 pub(crate) const FLASHPOINT: u32 = 387_259;
186 pub(crate) const GRIMOIRE_OF_SACRIFICE: u32 = 108_503;
188 pub(crate) const HAVOC: u32 = 80240;
190 pub(crate) const IMPROVED_CONFLAGRATE: u32 = 231_793;
192 pub(crate) const INFERNO: u32 = 1_280_483;
194 pub(crate) const INTERNAL_COMBUSTION: u32 = 266_134;
196 pub(crate) const LOOKS_THAT_KILL: u32 = 1_268_713;
198 pub(crate) const MALEVOLENCE: u32 = 430_014;
200 pub(crate) const MAYHEM: u32 = 387_506;
202 pub(crate) const MINDS_EYES: u32 = 1_268_716;
204 pub(crate) const RAGING_DEMONFIRE: u32 = 387_166;
206 pub(crate) const RAIN_OF_CHAOS: u32 = 266_086;
208 pub(crate) const RAIN_OF_FIRE: u32 = 5740;
210 pub(crate) const REVERSE_ENTROPY: u32 = 205_148;
212 pub(crate) const ROARING_BLAZE: u32 = 1_244_310;
214 pub(crate) const SHADOWBURN: u32 = 17877;
216 pub(crate) const SOUL_FIRE: u32 = 6353;
218 pub(crate) const SUMMON_INFERNAL: u32 = 1122;
220}
221pub(crate) mod SET_BONUS {
222 pub(crate) const MID2_DESTRUCTION_2PC: u32 = 1_296_571;
224 pub(crate) const MID2_DESTRUCTION_4PC: u32 = 1_296_572;
226}
227pub(crate) mod REPORTED_SPELL {
228 pub(crate) const CHAOS_SALVO: u32 = 432_596;
230 pub(crate) const DIABOLIC_GAZE_1: u32 = 1_269_892;
232 pub(crate) const DIABOLIC_GAZE_2: u32 = 1_269_886;
234 pub(crate) const DIABOLIC_GAZE_3: u32 = 1_269_885;
236 pub(crate) const ECHO_OF_SARGERAS: u32 = 1_265_884;
238 pub(crate) const ECHO_OF_SARGERAS_CB: u32 = 1_277_879;
240 pub(crate) const ECHO_OF_SARGERAS_SB: u32 = 1_265_774;
242 pub(crate) const EYE_EXPLOSION: u32 = 1_269_800;
244 pub(crate) const FELSEEKER: u32 = 434_404;
246 pub(crate) const IMMOLATION: u32 = 20153;
248 pub(crate) const INFERNAL_MELEE: u32 = 111_685;
250 pub(crate) const LASH_OF_PAIN: u32 = 7814;
252 pub(crate) const WICKED_CLEAVE: u32 = 432_120;
254}
255pub(crate) mod HERO {
256 pub(crate) mod HELLCALLER {
257 pub(crate) mod SPELL {
258 pub(crate) const BLACKENED_SOUL_DAMAGE: u32 = 445_736;
260 pub(crate) const BLACKENED_SOUL_TRIGGER: u32 = 445_731;
262 pub(crate) const MALEVOLENCE: u32 = 430_014;
264 pub(crate) const MALEVOLENCE_DAMAGE: u32 = 446_285;
266 pub(crate) const WITHER: u32 = 445_465;
268 pub(crate) const WITHER_DIRECT: u32 = 445_468;
270 }
271 pub(crate) mod AURA {
272 pub(crate) const BLACKENED_SOUL: u32 = 445_731;
274 pub(crate) const MALEVOLENCE_BUFF: u32 = 442_726;
276 pub(crate) const WITHER_DOT: u32 = 445_474;
278 }
279 }
280 pub(crate) mod DIABOLIST {
281 pub(crate) mod SPELL {
282 pub(crate) const INFERNAL_BOLT: u32 = 434_506;
284 pub(crate) const RUINATION: u32 = 434_635;
286 pub(crate) const RUINATION_IMPACT: u32 = 434_636;
288 }
289 pub(crate) mod AURA {
290 pub(crate) const CLOVEN_SOUL: u32 = 434_424;
292 pub(crate) const DEMONIC_ART_MOTHER: u32 = 432_794;
294 pub(crate) const DEMONIC_ART_OVERLORD: u32 = 428_524;
296 pub(crate) const DEMONIC_ART_PIT_LORD: u32 = 432_795;
298 pub(crate) const DEMONIC_OCULI: u32 = 1_269_643;
300 pub(crate) const DIABOLIC_RITUAL_MOTHER: u32 = 432_815;
302 pub(crate) const DIABOLIC_RITUAL_OVERLORD: u32 = 431_944;
304 pub(crate) const DIABOLIC_RITUAL_PIT_LORD: u32 = 432_816;
306 pub(crate) const INFERNAL_BOLT_BUFF: u32 = 433_891;
308 pub(crate) const MINDS_EYES: u32 = 1_269_879;
310 pub(crate) const RUINATION_BUFF: u32 = 433_885;
312 }
313 }
314}
315static HERO_TREE_HELLCALLER_SPELLS: &[(&str, u32)] = &[
316 ("BLACKENED_SOUL_DAMAGE", 445_736),
317 ("BLACKENED_SOUL_TRIGGER", 445_731),
318 ("MALEVOLENCE", 430_014),
319 ("MALEVOLENCE_DAMAGE", 446_285),
320 ("WITHER", 445_465),
321 ("WITHER_DIRECT", 445_468),
322];
323static HERO_TREE_HELLCALLER_AURAS: &[(&str, u32)] = &[
324 ("BLACKENED_SOUL", 445_731),
325 ("MALEVOLENCE_BUFF", 442_726),
326 ("WITHER_DOT", 445_474),
327];
328static HERO_TREE_DIABOLIST_SPELLS: &[(&str, u32)] = &[
329 ("INFERNAL_BOLT", 434_506),
330 ("RUINATION", 434_635),
331 ("RUINATION_IMPACT", 434_636),
332];
333static HERO_TREE_DIABOLIST_AURAS: &[(&str, u32)] = &[
334 ("CLOVEN_SOUL", 434_424),
335 ("DEMONIC_ART_MOTHER", 432_794),
336 ("DEMONIC_ART_OVERLORD", 428_524),
337 ("DEMONIC_ART_PIT_LORD", 432_795),
338 ("DEMONIC_OCULI", 1_269_643),
339 ("DIABOLIC_RITUAL_MOTHER", 432_815),
340 ("DIABOLIC_RITUAL_OVERLORD", 431_944),
341 ("DIABOLIC_RITUAL_PIT_LORD", 432_816),
342 ("INFERNAL_BOLT_BUFF", 433_891),
343 ("MINDS_EYES", 1_269_879),
344 ("RUINATION_BUFF", 433_885),
345];
346pub(crate) mod DAMAGE_SPELL {
347 pub(crate) const SUMMON_FELHUNTER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_691;
348 pub(crate) const SUMMON_IMP: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_688;
349 pub(crate) const GRIMOIRE_OF_SACRIFICE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_108503;
350 pub(crate) const IMMOLATE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_348;
351 pub(crate) const INCINERATE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_29722;
352 pub(crate) const CONFLAGRATE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_17962;
353 pub(crate) const CHAOS_BOLT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_116858;
354 pub(crate) const RAIN_OF_FIRE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_5740;
355 pub(crate) const SHADOWBURN: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_17877;
356 pub(crate) const SOUL_FIRE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_6353;
357 pub(crate) const CATACLYSM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_152108;
358 pub(crate) const CHANNEL_DEMONFIRE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_196447;
359 pub(crate) const CHANNEL_DEMONFIRE_TICK: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_196448;
360 pub(crate) const HAVOC: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_80240;
361 pub(crate) const SHADOW_BOLT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_686;
362 pub(crate) const CORRUPTION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_172;
363 pub(crate) const MALEVOLENCE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_430014;
364 pub(crate) const DRAIN_LIFE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_234153;
365 pub(crate) const INFERNAL_BOLT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_434506;
366 pub(crate) const RUINATION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_434635;
367 pub(crate) const SUMMON_INFERNAL: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_1122;
368 pub(crate) const BLACKENED_SOUL_DAMAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_445736;
369 pub(crate) const BLACKENED_SOUL_TRIGGER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_445731;
370 pub(crate) const MALEVOLENCE_DAMAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_446285;
371 pub(crate) const WITHER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_445465;
372 pub(crate) const WITHER_DIRECT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_445468;
373 pub(crate) const RUINATION_IMPACT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_434636;
374}
375pub(crate) mod DAMAGE_AURA {
376 pub(crate) const IMMOLATE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_157736;
377 pub(crate) const BACKDRAFT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_117828;
378 pub(crate) const REVERSE_ENTROPY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_266030;
379 pub(crate) const REVERSE_ENTROPY_TALENT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_205148;
380 pub(crate) const FLASHPOINT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_387263;
381 pub(crate) const FIENDISH_CRUELTY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_1245664;
382 pub(crate) const FIENDISH_CRUELTY_TALENT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_1245633;
383 pub(crate) const CONFLAGRATION_OF_CHAOS_TALENT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_387108;
384 pub(crate) const CHAOTIC_INFERNO: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_1244860;
385 pub(crate) const CHAOTIC_INFERNO_TALENT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_1244788;
386 pub(crate) const HAVOC: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_80240;
387 pub(crate) const RITUAL_OF_RUIN: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_387157;
388 pub(crate) const GRIMOIRE_OF_SACRIFICE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_196099;
389 pub(crate) const WITHER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_445474;
390 pub(crate) const MALEVOLENCE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_442726;
391 pub(crate) const CHANNEL_DEMONFIRE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_196447;
392 pub(crate) const RECENTLY_DEMON_HAS_BEEN_SUMMONED_DNT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_1288970;
393 pub(crate) const TRACK_PETS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_462599;
394 pub(crate) const DARK_TITANS_MARK: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_1305711;
395 pub(crate) const INFERNAL_BOLT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_433891;
396 pub(crate) const RUINATION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_433885;
397 pub(crate) const DIABOLIC_RITUAL_TALENT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_428514;
398 pub(crate) const DIABOLIC_RITUAL_OVERLORD: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_431944;
399 pub(crate) const DIABOLIC_RITUAL_MOTHER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_432815;
400 pub(crate) const DIABOLIC_RITUAL_PIT_LORD: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_432816;
401 pub(crate) const DEMONIC_ART_OVERLORD: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_428524;
402 pub(crate) const DEMONIC_ART_MOTHER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_432794;
403 pub(crate) const DEMONIC_ART_PIT_LORD: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_432795;
404 pub(crate) const DEMONIC_OCULI: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_1269643;
405 pub(crate) const DIABOLIC_OCULI_TALENT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_1268709;
406 pub(crate) const LOOKS_THAT_KILL_TALENT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_1268713;
407 pub(crate) const MINDS_EYES_TALENT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_1268716;
408 pub(crate) const MINDS_EYES: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_1269879;
409 pub(crate) const OVERFIEND: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_457578;
410 pub(crate) const AVATAR_OF_DESTRUCTION_TALENT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_1245089;
411 pub(crate) const EMBERS_OF_NIHILAM_1_TALENT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_1265770;
412 pub(crate) const EMBERS_OF_NIHILAM_2_TALENT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_1265772;
413 pub(crate) const EMBERS_OF_NIHILAM_3_TALENT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_1265774;
414 pub(crate) const VISION_OF_NIHILAM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_1265939;
415 pub(crate) const INFERNAL_EMBERS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_264364;
416 pub(crate) const RAIN_OF_CHAOS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_266087;
417 pub(crate) const CRASHING_CHAOS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_417282;
418}
419pub(crate) mod DAMAGE_TALENT {
420 pub(crate) const AVATAR_OF_DESTRUCTION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_1245089;
421 pub(crate) const BACKDRAFT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_196406;
422 pub(crate) const CATACLYSM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_152108;
423 pub(crate) const CHANNEL_DEMONFIRE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_196447;
424 pub(crate) const CHAOS_INCARNATE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_387275;
425 pub(crate) const CHAOTIC_INFERNO: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_1244788;
426 pub(crate) const CONFLAGRATE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_17962;
427 pub(crate) const CONFLAGRATION_OF_CHAOS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_387108;
428 pub(crate) const CRASHING_CHAOS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_417234;
429 pub(crate) const DEMONFIRE_INFUSION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_1214442;
430 pub(crate) const DIABOLIC_EMBERS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_387173;
431 pub(crate) const DIABOLIC_OCULI: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_1268709;
432 pub(crate) const DIABOLIC_RITUAL: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_428514;
433 pub(crate) const EMBERSTORM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_454744;
434 pub(crate) const EMBERS_OF_NIHILAM_1: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_1265770;
435 pub(crate) const EMBERS_OF_NIHILAM_2: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_1265772;
436 pub(crate) const EMBERS_OF_NIHILAM_3: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_1265774;
437 pub(crate) const FIENDISH_CRUELTY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_1245633;
438 pub(crate) const FIRE_AND_BRIMSTONE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_196408;
439 pub(crate) const FLASHPOINT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_387259;
440 pub(crate) const GRIMOIRE_OF_SACRIFICE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_108503;
441 pub(crate) const HAVOC: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_80240;
442 pub(crate) const IMPROVED_CONFLAGRATE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_231793;
443 pub(crate) const INFERNO: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_1280483;
444 pub(crate) const INTERNAL_COMBUSTION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_266134;
445 pub(crate) const LOOKS_THAT_KILL: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_1268713;
446 pub(crate) const MALEVOLENCE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_430014;
447 pub(crate) const MAYHEM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_387506;
448 pub(crate) const MINDS_EYES: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_1268716;
449 pub(crate) const RAGING_DEMONFIRE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_387166;
450 pub(crate) const RAIN_OF_CHAOS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_266086;
451 pub(crate) const RAIN_OF_FIRE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_5740;
452 pub(crate) const REVERSE_ENTROPY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_205148;
453 pub(crate) const ROARING_BLAZE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_1244310;
454 pub(crate) const SHADOWBURN: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_17877;
455 pub(crate) const SOUL_FIRE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_6353;
456 pub(crate) const SUMMON_INFERNAL: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_1122;
457}
458pub(crate) mod DAMAGE_REPORTED {
459 pub(crate) const CHAOS_SALVO: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_432596;
460 pub(crate) const DIABOLIC_GAZE_1: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_1269892;
461 pub(crate) const DIABOLIC_GAZE_2: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_1269886;
462 pub(crate) const DIABOLIC_GAZE_3: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_1269885;
463 pub(crate) const ECHO_OF_SARGERAS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_1265884;
464 pub(crate) const ECHO_OF_SARGERAS_CB: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_1277879;
465 pub(crate) const ECHO_OF_SARGERAS_SB: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_1265774;
466 pub(crate) const EYE_EXPLOSION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_1269800;
467 pub(crate) const FELSEEKER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_434404;
468 pub(crate) const IMMOLATION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_20153;
469 pub(crate) const INFERNAL_MELEE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_111685;
470 pub(crate) const LASH_OF_PAIN: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_7814;
471 pub(crate) const WICKED_CLEAVE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ACTION::SPELL_432120;
472}
473pub(crate) mod DAMAGE_EFFECT {
474 pub(crate) const IMMOLATION_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::EFFECT::SPELL_20153_EFFECT_1;
475 pub(crate) const MID2_DESTRUCTION_2PC_INCINERATE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::EFFECT::SPELL_1296571_EFFECT_1;
476 pub(crate) const MID2_DESTRUCTION_2PC_ECHO_CHANCE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::EFFECT::SPELL_1296571_EFFECT_2;
477 pub(crate) const CHAOS_BOLT_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::EFFECT::SPELL_116858_EFFECT_1;
478 pub(crate) const ECHO_OF_SARGERAS_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::EFFECT::SPELL_1265884_EFFECT_1;
479 pub(crate) const LASH_OF_PAIN_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::EFFECT::SPELL_7814_EFFECT_1;
480 pub(crate) const RAIN_OF_FIRE_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::EFFECT::SPELL_42223_EFFECT_1;
481 pub(crate) const RAIN_OF_FIRE_TIMING: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::EFFECT::SPELL_5740_EFFECT_3;
482 pub(crate) const WICKED_CLEAVE_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::EFFECT::SPELL_432120_EFFECT_1;
483 pub(crate) const CHAOS_SALVO_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::EFFECT::SPELL_432596_EFFECT_1;
484 pub(crate) const FELSEEKER_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::EFFECT::SPELL_434404_EFFECT_1;
485 pub(crate) const EYE_EXPLOSION_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::EFFECT::SPELL_1269800_EFFECT_1;
486 pub(crate) const DIABOLIC_GAZE_1_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::EFFECT::SPELL_1269892_EFFECT_1;
487 pub(crate) const DIABOLIC_GAZE_2_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::EFFECT::SPELL_1269886_EFFECT_1;
488 pub(crate) const DIABOLIC_GAZE_3_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::EFFECT::SPELL_1269885_EFFECT_1;
489}
490pub(crate) const AURA_IMMOLATE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::destruction_warlock::AURA_IMMOLATE
491 .bind(wowlab_engine_combat::generated_identities::specs::destruction_warlock::PROOF);
492pub(crate) const AURA_BACKDRAFT: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::destruction_warlock::AURA_BACKDRAFT
493 .bind(wowlab_engine_combat::generated_identities::specs::destruction_warlock::PROOF);
494pub(crate) const AURA_REVERSE_ENTROPY: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::destruction_warlock::AURA_REVERSE_ENTROPY
495 .bind(wowlab_engine_combat::generated_identities::specs::destruction_warlock::PROOF);
496pub(crate) const AURA_REVERSE_ENTROPY_TALENT: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::destruction_warlock::AURA_REVERSE_ENTROPY_TALENT
497 .bind(wowlab_engine_combat::generated_identities::specs::destruction_warlock::PROOF);
498pub(crate) const AURA_FLASHPOINT: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::destruction_warlock::AURA_FLASHPOINT
499 .bind(wowlab_engine_combat::generated_identities::specs::destruction_warlock::PROOF);
500pub(crate) const AURA_FIENDISH_CRUELTY: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::destruction_warlock::AURA_FIENDISH_CRUELTY
501 .bind(wowlab_engine_combat::generated_identities::specs::destruction_warlock::PROOF);
502pub(crate) const AURA_FIENDISH_CRUELTY_TALENT: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::destruction_warlock::AURA_FIENDISH_CRUELTY_TALENT
503 .bind(wowlab_engine_combat::generated_identities::specs::destruction_warlock::PROOF);
504pub(crate) const AURA_CONFLAGRATION_OF_CHAOS_TALENT: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::destruction_warlock::AURA_CONFLAGRATION_OF_CHAOS_TALENT
505 .bind(wowlab_engine_combat::generated_identities::specs::destruction_warlock::PROOF);
506pub(crate) const AURA_CHAOTIC_INFERNO: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::destruction_warlock::AURA_CHAOTIC_INFERNO
507 .bind(wowlab_engine_combat::generated_identities::specs::destruction_warlock::PROOF);
508pub(crate) const AURA_CHAOTIC_INFERNO_TALENT: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::destruction_warlock::AURA_CHAOTIC_INFERNO_TALENT
509 .bind(wowlab_engine_combat::generated_identities::specs::destruction_warlock::PROOF);
510pub(crate) const AURA_HAVOC: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::destruction_warlock::AURA_HAVOC
511 .bind(wowlab_engine_combat::generated_identities::specs::destruction_warlock::PROOF);
512pub(crate) const AURA_RITUAL_OF_RUIN: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::destruction_warlock::AURA_RITUAL_OF_RUIN
513 .bind(wowlab_engine_combat::generated_identities::specs::destruction_warlock::PROOF);
514pub(crate) const AURA_GRIMOIRE_OF_SACRIFICE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::destruction_warlock::AURA_GRIMOIRE_OF_SACRIFICE
515 .bind(wowlab_engine_combat::generated_identities::specs::destruction_warlock::PROOF);
516pub(crate) const AURA_WITHER: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::destruction_warlock::AURA_WITHER
517 .bind(wowlab_engine_combat::generated_identities::specs::destruction_warlock::PROOF);
518pub(crate) const AURA_MALEVOLENCE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::destruction_warlock::AURA_MALEVOLENCE
519 .bind(wowlab_engine_combat::generated_identities::specs::destruction_warlock::PROOF);
520pub(crate) const AURA_CHANNEL_DEMONFIRE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::destruction_warlock::AURA_CHANNEL_DEMONFIRE
521 .bind(wowlab_engine_combat::generated_identities::specs::destruction_warlock::PROOF);
522pub(crate) const AURA_RECENTLY_DEMON_HAS_BEEN_SUMMONED_DNT: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::destruction_warlock::AURA_RECENTLY_DEMON_HAS_BEEN_SUMMONED_DNT
523 .bind(wowlab_engine_combat::generated_identities::specs::destruction_warlock::PROOF);
524pub(crate) const AURA_TRACK_PETS: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::destruction_warlock::AURA_TRACK_PETS
525 .bind(wowlab_engine_combat::generated_identities::specs::destruction_warlock::PROOF);
526pub(crate) const AURA_DARK_TITANS_MARK: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::destruction_warlock::AURA_DARK_TITANS_MARK
527 .bind(wowlab_engine_combat::generated_identities::specs::destruction_warlock::PROOF);
528pub(crate) const AURA_INFERNAL_BOLT: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::destruction_warlock::AURA_INFERNAL_BOLT
529 .bind(wowlab_engine_combat::generated_identities::specs::destruction_warlock::PROOF);
530pub(crate) const AURA_RUINATION: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::destruction_warlock::AURA_RUINATION
531 .bind(wowlab_engine_combat::generated_identities::specs::destruction_warlock::PROOF);
532pub(crate) const AURA_DIABOLIC_RITUAL_TALENT: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::destruction_warlock::AURA_DIABOLIC_RITUAL_TALENT
533 .bind(wowlab_engine_combat::generated_identities::specs::destruction_warlock::PROOF);
534pub(crate) const AURA_DIABOLIC_RITUAL_OVERLORD: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::destruction_warlock::AURA_DIABOLIC_RITUAL_OVERLORD
535 .bind(wowlab_engine_combat::generated_identities::specs::destruction_warlock::PROOF);
536pub(crate) const AURA_DIABOLIC_RITUAL_MOTHER: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::destruction_warlock::AURA_DIABOLIC_RITUAL_MOTHER
537 .bind(wowlab_engine_combat::generated_identities::specs::destruction_warlock::PROOF);
538pub(crate) const AURA_DIABOLIC_RITUAL_PIT_LORD: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::destruction_warlock::AURA_DIABOLIC_RITUAL_PIT_LORD
539 .bind(wowlab_engine_combat::generated_identities::specs::destruction_warlock::PROOF);
540pub(crate) const AURA_DEMONIC_ART_OVERLORD: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::destruction_warlock::AURA_DEMONIC_ART_OVERLORD
541 .bind(wowlab_engine_combat::generated_identities::specs::destruction_warlock::PROOF);
542pub(crate) const AURA_DEMONIC_ART_MOTHER: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::destruction_warlock::AURA_DEMONIC_ART_MOTHER
543 .bind(wowlab_engine_combat::generated_identities::specs::destruction_warlock::PROOF);
544pub(crate) const AURA_DEMONIC_ART_PIT_LORD: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::destruction_warlock::AURA_DEMONIC_ART_PIT_LORD
545 .bind(wowlab_engine_combat::generated_identities::specs::destruction_warlock::PROOF);
546pub(crate) const AURA_DEMONIC_OCULI: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::destruction_warlock::AURA_DEMONIC_OCULI
547 .bind(wowlab_engine_combat::generated_identities::specs::destruction_warlock::PROOF);
548pub(crate) const AURA_DIABOLIC_OCULI_TALENT: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::destruction_warlock::AURA_DIABOLIC_OCULI_TALENT
549 .bind(wowlab_engine_combat::generated_identities::specs::destruction_warlock::PROOF);
550pub(crate) const AURA_LOOKS_THAT_KILL_TALENT: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::destruction_warlock::AURA_LOOKS_THAT_KILL_TALENT
551 .bind(wowlab_engine_combat::generated_identities::specs::destruction_warlock::PROOF);
552pub(crate) const AURA_MINDS_EYES_TALENT: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::destruction_warlock::AURA_MINDS_EYES_TALENT
553 .bind(wowlab_engine_combat::generated_identities::specs::destruction_warlock::PROOF);
554pub(crate) const AURA_MINDS_EYES: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::destruction_warlock::AURA_MINDS_EYES
555 .bind(wowlab_engine_combat::generated_identities::specs::destruction_warlock::PROOF);
556pub(crate) const AURA_OVERFIEND: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::destruction_warlock::AURA_OVERFIEND
557 .bind(wowlab_engine_combat::generated_identities::specs::destruction_warlock::PROOF);
558pub(crate) const AURA_AVATAR_OF_DESTRUCTION_TALENT: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::destruction_warlock::AURA_AVATAR_OF_DESTRUCTION_TALENT
559 .bind(wowlab_engine_combat::generated_identities::specs::destruction_warlock::PROOF);
560pub(crate) const AURA_EMBERS_OF_NIHILAM_1_TALENT: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::destruction_warlock::AURA_EMBERS_OF_NIHILAM_1_TALENT
561 .bind(wowlab_engine_combat::generated_identities::specs::destruction_warlock::PROOF);
562pub(crate) const AURA_EMBERS_OF_NIHILAM_2_TALENT: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::destruction_warlock::AURA_EMBERS_OF_NIHILAM_2_TALENT
563 .bind(wowlab_engine_combat::generated_identities::specs::destruction_warlock::PROOF);
564pub(crate) const AURA_EMBERS_OF_NIHILAM_3_TALENT: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::destruction_warlock::AURA_EMBERS_OF_NIHILAM_3_TALENT
565 .bind(wowlab_engine_combat::generated_identities::specs::destruction_warlock::PROOF);
566pub(crate) const AURA_VISION_OF_NIHILAM: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::destruction_warlock::AURA_VISION_OF_NIHILAM
567 .bind(wowlab_engine_combat::generated_identities::specs::destruction_warlock::PROOF);
568pub(crate) const AURA_INFERNAL_EMBERS: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::destruction_warlock::AURA_INFERNAL_EMBERS
569 .bind(wowlab_engine_combat::generated_identities::specs::destruction_warlock::PROOF);
570pub(crate) const AURA_RAIN_OF_CHAOS: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::destruction_warlock::AURA_RAIN_OF_CHAOS
571 .bind(wowlab_engine_combat::generated_identities::specs::destruction_warlock::PROOF);
572pub(crate) const AURA_CRASHING_CHAOS: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::destruction_warlock::AURA_CRASHING_CHAOS
573 .bind(wowlab_engine_combat::generated_identities::specs::destruction_warlock::PROOF);
574pub(crate) const AURA_COUNT: usize = 42;
575const _: () = assert!(
576 AURA_COUNT == 42, "AURA index ABI: count changed -- update positional hook consumers"
577);
578pub(crate) const SPELL_SUMMON_FELHUNTER: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::destruction_warlock::SPELL_SUMMON_FELHUNTER
579 .bind(wowlab_engine_combat::generated_identities::specs::destruction_warlock::PROOF);
580pub(crate) const SPELL_SUMMON_IMP: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::destruction_warlock::SPELL_SUMMON_IMP
581 .bind(wowlab_engine_combat::generated_identities::specs::destruction_warlock::PROOF);
582pub(crate) const SPELL_GRIMOIRE_OF_SACRIFICE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::destruction_warlock::SPELL_GRIMOIRE_OF_SACRIFICE
583 .bind(wowlab_engine_combat::generated_identities::specs::destruction_warlock::PROOF);
584pub(crate) const SPELL_IMMOLATE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::destruction_warlock::SPELL_IMMOLATE
585 .bind(wowlab_engine_combat::generated_identities::specs::destruction_warlock::PROOF);
586pub(crate) const SPELL_INCINERATE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::destruction_warlock::SPELL_INCINERATE
587 .bind(wowlab_engine_combat::generated_identities::specs::destruction_warlock::PROOF);
588pub(crate) const SPELL_CONFLAGRATE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::destruction_warlock::SPELL_CONFLAGRATE
589 .bind(wowlab_engine_combat::generated_identities::specs::destruction_warlock::PROOF);
590pub(crate) const SPELL_CHAOS_BOLT: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::destruction_warlock::SPELL_CHAOS_BOLT
591 .bind(wowlab_engine_combat::generated_identities::specs::destruction_warlock::PROOF);
592pub(crate) const SPELL_RAIN_OF_FIRE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::destruction_warlock::SPELL_RAIN_OF_FIRE
593 .bind(wowlab_engine_combat::generated_identities::specs::destruction_warlock::PROOF);
594pub(crate) const SPELL_SHADOWBURN: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::destruction_warlock::SPELL_SHADOWBURN
595 .bind(wowlab_engine_combat::generated_identities::specs::destruction_warlock::PROOF);
596pub(crate) const SPELL_SOUL_FIRE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::destruction_warlock::SPELL_SOUL_FIRE
597 .bind(wowlab_engine_combat::generated_identities::specs::destruction_warlock::PROOF);
598pub(crate) const SPELL_CATACLYSM: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::destruction_warlock::SPELL_CATACLYSM
599 .bind(wowlab_engine_combat::generated_identities::specs::destruction_warlock::PROOF);
600pub(crate) const SPELL_CHANNEL_DEMONFIRE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::destruction_warlock::SPELL_CHANNEL_DEMONFIRE
601 .bind(wowlab_engine_combat::generated_identities::specs::destruction_warlock::PROOF);
602pub(crate) const SPELL_CHANNEL_DEMONFIRE_TICK: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::destruction_warlock::SPELL_CHANNEL_DEMONFIRE_TICK
603 .bind(wowlab_engine_combat::generated_identities::specs::destruction_warlock::PROOF);
604pub(crate) const SPELL_HAVOC: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::destruction_warlock::SPELL_HAVOC
605 .bind(wowlab_engine_combat::generated_identities::specs::destruction_warlock::PROOF);
606pub(crate) const SPELL_SHADOW_BOLT: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::destruction_warlock::SPELL_SHADOW_BOLT
607 .bind(wowlab_engine_combat::generated_identities::specs::destruction_warlock::PROOF);
608pub(crate) const SPELL_CORRUPTION: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::destruction_warlock::SPELL_CORRUPTION
609 .bind(wowlab_engine_combat::generated_identities::specs::destruction_warlock::PROOF);
610pub(crate) const SPELL_MALEVOLENCE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::destruction_warlock::SPELL_MALEVOLENCE
611 .bind(wowlab_engine_combat::generated_identities::specs::destruction_warlock::PROOF);
612pub(crate) const SPELL_DRAIN_LIFE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::destruction_warlock::SPELL_DRAIN_LIFE
613 .bind(wowlab_engine_combat::generated_identities::specs::destruction_warlock::PROOF);
614pub(crate) const SPELL_INFERNAL_BOLT: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::destruction_warlock::SPELL_INFERNAL_BOLT
615 .bind(wowlab_engine_combat::generated_identities::specs::destruction_warlock::PROOF);
616pub(crate) const SPELL_RUINATION: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::destruction_warlock::SPELL_RUINATION
617 .bind(wowlab_engine_combat::generated_identities::specs::destruction_warlock::PROOF);
618pub(crate) const SPELL_SUMMON_INFERNAL: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::destruction_warlock::SPELL_SUMMON_INFERNAL
619 .bind(wowlab_engine_combat::generated_identities::specs::destruction_warlock::PROOF);
620pub(crate) const SPELL_COUNT: usize = 21;
621const _: () = assert!(
622 SPELL_COUNT == 21,
623 "SPELL index ABI: count changed -- update positional hook consumers"
624);
625pub(crate) mod EFFECT {
626 pub(crate) const IMMOLATION_DAMAGE: (u32, u8) = (20153, 1);
628 pub(crate) const MID2_DESTRUCTION_2PC_INCINERATE: (u32, u8) = (1_296_571, 1);
630 pub(crate) const MID2_DESTRUCTION_2PC_ECHO_CHANCE: (u32, u8) = (1_296_571, 2);
632 pub(crate) const CHAOS_BOLT_DAMAGE: (u32, u8) = (116_858, 1);
634 pub(crate) const ECHO_OF_SARGERAS_DAMAGE: (u32, u8) = (1_265_884, 1);
636 pub(crate) const LASH_OF_PAIN_DAMAGE: (u32, u8) = (7814, 1);
638 pub(crate) const RAIN_OF_FIRE_DAMAGE: (u32, u8) = (42223, 1);
640 pub(crate) const RAIN_OF_FIRE_TIMING: (u32, u8) = (5740, 3);
642 pub(crate) const WICKED_CLEAVE_DAMAGE: (u32, u8) = (432_120, 1);
644 pub(crate) const CHAOS_SALVO_DAMAGE: (u32, u8) = (432_596, 1);
646 pub(crate) const FELSEEKER_DAMAGE: (u32, u8) = (434_404, 1);
648 pub(crate) const EYE_EXPLOSION_DAMAGE: (u32, u8) = (1_269_800, 1);
650 pub(crate) const DIABOLIC_GAZE_1_DAMAGE: (u32, u8) = (1_269_892, 1);
652 pub(crate) const DIABOLIC_GAZE_2_DAMAGE: (u32, u8) = (1_269_886, 1);
654 pub(crate) const DIABOLIC_GAZE_3_DAMAGE: (u32, u8) = (1_269_885, 1);
656}
657static REPORTED_SPELLS: &[(&str, u32)] = &[
658 ("chaos_salvo", 432_596),
659 ("diabolic_gaze_1", 1_269_892),
660 ("diabolic_gaze_2", 1_269_886),
661 ("diabolic_gaze_3", 1_269_885),
662 ("echo_of_sargeras", 1_265_884),
663 ("echo_of_sargeras_cb", 1_277_879),
664 ("echo_of_sargeras_sb", 1_265_774),
665 ("eye_explosion", 1_269_800),
666 ("felseeker", 434_404),
667 ("immolation", 20153),
668 ("infernal_melee", 111_685),
669 ("lash_of_pain", 7814),
670 ("wicked_cleave", 432_120),
671];
672static DECLARED_SPELL_IDS: &[u32] = &[
673 691, 688, 108_503, 348, 29722, 17962, 116_858, 5740, 17877, 6353, 152_108, 196_447,
674 196_448, 80240, 686, 172, 430_014, 234_153, 434_506, 434_635, 1122, 157_736, 117_828,
675 266_030, 205_148, 387_263, 1_245_664, 1_245_633, 387_108, 1_244_860, 1_244_788,
676 387_157, 196_099, 445_474, 442_726, 1_288_970, 462_599, 1_305_711, 433_891, 433_885,
677 428_514, 431_944, 432_815, 432_816, 428_524, 432_794, 432_795, 1_269_643, 1_268_709,
678 1_268_713, 1_268_716, 1_269_879, 457_578, 1_245_089, 1_265_770, 1_265_772, 1_265_774,
679 1_265_939, 264_364, 266_087, 417_282, 196_406, 387_275, 417_234, 1_214_442, 387_173,
680 454_744, 196_408, 387_259, 231_793, 1_280_483, 266_134, 387_506, 387_166, 266_086,
681 1_244_310, 1, 7814, 20153, 42223, 77220, 111_685, 264_365, 281_490, 432_120, 432_596,
682 434_404, 1_265_884, 1_269_800, 1_269_885, 1_269_886, 1_269_892, 1_277_879, 1_296_571,
683 445_736, 445_731, 446_285, 445_465, 445_468, 434_636, 434_424,
684];
685static DECLARED_AURA_IDS: &[u32] = &[
686 157_736, 117_828, 266_030, 205_148, 387_263, 1_245_664, 1_245_633, 387_108,
687 1_244_860, 1_244_788, 80240, 387_157, 196_099, 445_474, 442_726, 196_447, 1_288_970,
688 462_599, 1_305_711, 433_891, 433_885, 428_514, 431_944, 432_815, 432_816, 428_524,
689 432_794, 432_795, 1_269_643, 1_268_709, 1_268_713, 1_268_716, 1_269_879, 457_578,
690 1_245_089, 1_265_770, 1_265_772, 1_265_774, 1_265_939, 264_364, 266_087, 417_282,
691 445_731, 442_726, 445_474, 434_424, 432_794, 428_524, 432_795, 1_269_643, 432_815,
692 431_944, 432_816, 433_891, 1_269_879, 433_885,
693];
694static TALENTS: &[(&str, u32)] = &[
695 ("AVATAR_OF_DESTRUCTION", TALENT::AVATAR_OF_DESTRUCTION),
696 ("BACKDRAFT", TALENT::BACKDRAFT),
697 ("CATACLYSM", TALENT::CATACLYSM),
698 ("CHANNEL_DEMONFIRE", TALENT::CHANNEL_DEMONFIRE),
699 ("CHAOS_INCARNATE", TALENT::CHAOS_INCARNATE),
700 ("CHAOTIC_INFERNO", TALENT::CHAOTIC_INFERNO),
701 ("CONFLAGRATE", TALENT::CONFLAGRATE),
702 ("CONFLAGRATION_OF_CHAOS", TALENT::CONFLAGRATION_OF_CHAOS),
703 ("CRASHING_CHAOS", TALENT::CRASHING_CHAOS),
704 ("DEMONFIRE_INFUSION", TALENT::DEMONFIRE_INFUSION),
705 ("DIABOLIC_EMBERS", TALENT::DIABOLIC_EMBERS),
706 ("DIABOLIC_OCULI", TALENT::DIABOLIC_OCULI),
707 ("DIABOLIC_RITUAL", TALENT::DIABOLIC_RITUAL),
708 ("EMBERSTORM", TALENT::EMBERSTORM),
709 ("EMBERS_OF_NIHILAM_1", TALENT::EMBERS_OF_NIHILAM_1),
710 ("EMBERS_OF_NIHILAM_2", TALENT::EMBERS_OF_NIHILAM_2),
711 ("EMBERS_OF_NIHILAM_3", TALENT::EMBERS_OF_NIHILAM_3),
712 ("FIENDISH_CRUELTY", TALENT::FIENDISH_CRUELTY),
713 ("FIRE_AND_BRIMSTONE", TALENT::FIRE_AND_BRIMSTONE),
714 ("FLASHPOINT", TALENT::FLASHPOINT),
715 ("GRIMOIRE_OF_SACRIFICE", TALENT::GRIMOIRE_OF_SACRIFICE),
716 ("HAVOC", TALENT::HAVOC),
717 ("IMPROVED_CONFLAGRATE", TALENT::IMPROVED_CONFLAGRATE),
718 ("INFERNO", TALENT::INFERNO),
719 ("INTERNAL_COMBUSTION", TALENT::INTERNAL_COMBUSTION),
720 ("LOOKS_THAT_KILL", TALENT::LOOKS_THAT_KILL),
721 ("MALEVOLENCE", TALENT::MALEVOLENCE),
722 ("MAYHEM", TALENT::MAYHEM),
723 ("MINDS_EYES", TALENT::MINDS_EYES),
724 ("RAGING_DEMONFIRE", TALENT::RAGING_DEMONFIRE),
725 ("RAIN_OF_CHAOS", TALENT::RAIN_OF_CHAOS),
726 ("RAIN_OF_FIRE", TALENT::RAIN_OF_FIRE),
727 ("REVERSE_ENTROPY", TALENT::REVERSE_ENTROPY),
728 ("ROARING_BLAZE", TALENT::ROARING_BLAZE),
729 ("SHADOWBURN", TALENT::SHADOWBURN),
730 ("SOUL_FIRE", TALENT::SOUL_FIRE),
731 ("SUMMON_INFERNAL", TALENT::SUMMON_INFERNAL),
732];
733pub(crate) mod DESTRUCTION_WARLOCK {
734 pub(crate) const INCINERATE_CASTS: u32 = 0;
735 pub(crate) const CHAOS_BOLT_CASTS: u32 = 1;
736 pub(crate) const CONFLAGRATE_CASTS: u32 = 2;
737 pub(crate) const SUMMON_INFERNAL_CASTS: u32 = 3;
738 pub(crate) const RAIN_OF_FIRE_CASTS: u32 = 4;
739 pub(crate) const SHADOWBURN_CASTS: u32 = 5;
740 pub(crate) const SOUL_FIRE_CASTS: u32 = 6;
741 pub(crate) const IMMOLATE_UPTIME_MS: u32 = 7;
742 pub(crate) const BACKDRAFT_UPTIME_MS: u32 = 8;
743}
744fn aura_immolate(
745 a: AuraDefinitionDraft,
746 data: &ResolvedGameData,
747) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
748 a.on_target()
749 .apply_base_from_data(data, 157_736)?
750 .max_stacks(
751 data.require_aura_max_stacks(wowlab_types::sim::SpellIdx::from_raw(157_736))?,
752 )
753 .periodic_damage_sp_from_data(
754 data,
755 wowlab_engine_combat::PeriodicDamageDataInput {
756 tick_ms: wowlab_engine_combat::validated_milliseconds(
757 data.period(wowlab_types::sim::SpellIdx::from_raw(157_736), 1),
758 157_736,
759 "periodic_damage.tick_ms",
760 )?,
761 spell_id: 157_736,
762 effect_index: 1,
763 multiplier: 1.0,
764 offset: 0.0,
765 round_decimals: Some(5),
766 },
767 )?
768 .periodic_damage_resource_gain(0.1)
769 .periodic_damage_crit_resource_gain(0.5, 0.1)
770 .apply_periodic_behavior_from_data(data, 157_736)
771}
772fn aura_backdraft(
773 a: AuraDefinitionDraft,
774 data: &ResolvedGameData,
775) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
776 Ok(
777 a
778 .on_player()
779 .apply_base_from_data(data, 117_828)?
780 .max_stacks(
781 data
782 .require_aura_max_stacks(
783 wowlab_types::sim::SpellIdx::from_raw(117_828),
784 )?,
785 ),
786 )
787}
788fn aura_reverse_entropy(
789 a: AuraDefinitionDraft,
790 data: &ResolvedGameData,
791) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
792 Ok(
793 a
794 .on_player()
795 .apply_base_from_data(data, 266_030)?
796 .max_stacks(
797 data
798 .require_aura_max_stacks(
799 wowlab_types::sim::SpellIdx::from_raw(266_030),
800 )?,
801 ),
802 )
803}
804fn aura_reverse_entropy_talent(
805 a: AuraDefinitionDraft,
806 data: &ResolvedGameData,
807) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
808 Ok(
809 a
810 .on_player()
811 .apply_base_from_data(data, 205_148)?
812 .max_stacks(
813 data
814 .require_aura_max_stacks(
815 wowlab_types::sim::SpellIdx::from_raw(205_148),
816 )?,
817 ),
818 )
819}
820fn aura_flashpoint(
821 a: AuraDefinitionDraft,
822 data: &ResolvedGameData,
823) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
824 Ok(
825 a
826 .on_player()
827 .apply_base_from_data(data, 387_263)?
828 .max_stacks(
829 data
830 .require_aura_max_stacks(
831 wowlab_types::sim::SpellIdx::from_raw(387_263),
832 )?,
833 ),
834 )
835}
836fn aura_fiendish_cruelty(
837 a: AuraDefinitionDraft,
838 data: &ResolvedGameData,
839) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
840 Ok(
841 a
842 .on_player()
843 .apply_base_from_data(data, 1_245_664)?
844 .max_stacks(
845 data
846 .require_aura_max_stacks(
847 wowlab_types::sim::SpellIdx::from_raw(1_245_664),
848 )?,
849 ),
850 )
851}
852fn aura_fiendish_cruelty_talent(
853 a: AuraDefinitionDraft,
854 data: &ResolvedGameData,
855) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
856 Ok(
857 a
858 .on_player()
859 .apply_base_from_data(data, 1_245_633)?
860 .max_stacks(
861 data
862 .require_aura_max_stacks(
863 wowlab_types::sim::SpellIdx::from_raw(1_245_633),
864 )?,
865 ),
866 )
867}
868fn aura_conflagration_of_chaos_talent(
869 a: AuraDefinitionDraft,
870 data: &ResolvedGameData,
871) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
872 Ok(
873 a
874 .on_player()
875 .apply_base_from_data(data, 387_108)?
876 .max_stacks(
877 data
878 .require_aura_max_stacks(
879 wowlab_types::sim::SpellIdx::from_raw(387_108),
880 )?,
881 ),
882 )
883}
884fn aura_chaotic_inferno(
885 a: AuraDefinitionDraft,
886 data: &ResolvedGameData,
887) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
888 Ok(
889 a
890 .on_player()
891 .apply_base_from_data(data, 1_244_860)?
892 .max_stacks(
893 data
894 .require_aura_max_stacks(
895 wowlab_types::sim::SpellIdx::from_raw(1_244_860),
896 )?,
897 ),
898 )
899}
900fn aura_chaotic_inferno_talent(
901 a: AuraDefinitionDraft,
902 data: &ResolvedGameData,
903) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
904 Ok(
905 a
906 .on_player()
907 .apply_base_from_data(data, 1_244_788)?
908 .max_stacks(
909 data
910 .require_aura_max_stacks(
911 wowlab_types::sim::SpellIdx::from_raw(1_244_788),
912 )?,
913 ),
914 )
915}
916fn aura_havoc(
917 a: AuraDefinitionDraft,
918 data: &ResolvedGameData,
919) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
920 Ok(
921 a
922 .on_target()
923 .apply_base_from_data(data, 80240)?
924 .max_stacks(
925 data
926 .require_aura_max_stacks(
927 wowlab_types::sim::SpellIdx::from_raw(80240),
928 )?,
929 ),
930 )
931}
932fn aura_ritual_of_ruin(
933 a: AuraDefinitionDraft,
934 data: &ResolvedGameData,
935) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
936 Ok(
937 a
938 .on_player()
939 .apply_base_from_data(data, 387_157)?
940 .max_stacks(
941 data
942 .require_aura_max_stacks(
943 wowlab_types::sim::SpellIdx::from_raw(387_157),
944 )?,
945 ),
946 )
947}
948fn aura_grimoire_of_sacrifice(
949 a: AuraDefinitionDraft,
950 data: &ResolvedGameData,
951) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
952 Ok(
953 a
954 .on_player()
955 .apply_base_from_data(data, 196_099)?
956 .max_stacks(
957 data
958 .require_aura_max_stacks(
959 wowlab_types::sim::SpellIdx::from_raw(196_099),
960 )?,
961 ),
962 )
963}
964fn aura_wither(
965 a: AuraDefinitionDraft,
966 data: &ResolvedGameData,
967) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
968 a.on_target()
969 .apply_base_from_data(data, 445_474)?
970 .max_stacks(
971 data.require_aura_max_stacks(wowlab_types::sim::SpellIdx::from_raw(445_474))?,
972 )
973 .periodic_damage_sp(
974 wowlab_engine_combat::validated_milliseconds(
975 3000.0,
976 445_474,
977 "periodic_damage.tick_ms",
978 )?,
979 0.16,
980 wowlab_engine_combat::DamageFlags::empty(),
981 )
982 .apply_periodic_behavior_from_data(data, 445_474)
983}
984fn aura_malevolence(
985 a: AuraDefinitionDraft,
986 data: &ResolvedGameData,
987) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
988 Ok(
989 a
990 .on_player()
991 .apply_base_from_data(data, 442_726)?
992 .max_stacks(
993 data
994 .require_aura_max_stacks(
995 wowlab_types::sim::SpellIdx::from_raw(442_726),
996 )?,
997 ),
998 )
999}
1000fn aura_channel_demonfire(
1001 a: AuraDefinitionDraft,
1002 data: &ResolvedGameData,
1003) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1004 Ok(
1005 a
1006 .on_player()
1007 .apply_base_from_data(data, 196_447)?
1008 .max_stacks(
1009 data
1010 .require_aura_max_stacks(
1011 wowlab_types::sim::SpellIdx::from_raw(196_447),
1012 )?,
1013 ),
1014 )
1015}
1016fn aura_recently_demon_has_been_summoned_dnt(
1017 a: AuraDefinitionDraft,
1018 data: &ResolvedGameData,
1019) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1020 Ok(
1021 a
1022 .on_player()
1023 .apply_base_from_data(data, 1_288_970)?
1024 .max_stacks(
1025 data
1026 .require_aura_max_stacks(
1027 wowlab_types::sim::SpellIdx::from_raw(1_288_970),
1028 )?,
1029 ),
1030 )
1031}
1032fn aura_track_pets(
1033 a: AuraDefinitionDraft,
1034 data: &ResolvedGameData,
1035) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1036 Ok(
1037 a
1038 .on_player()
1039 .apply_base_from_data(data, 462_599)?
1040 .max_stacks(
1041 data
1042 .require_aura_max_stacks(
1043 wowlab_types::sim::SpellIdx::from_raw(462_599),
1044 )?,
1045 ),
1046 )
1047}
1048fn aura_dark_titans_mark(
1049 a: AuraDefinitionDraft,
1050 data: &ResolvedGameData,
1051) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1052 Ok(
1053 a
1054 .on_target()
1055 .apply_base_from_data(data, 1_305_711)?
1056 .max_stacks(
1057 data
1058 .require_aura_max_stacks(
1059 wowlab_types::sim::SpellIdx::from_raw(1_305_711),
1060 )?,
1061 ),
1062 )
1063}
1064fn aura_infernal_bolt(
1065 a: AuraDefinitionDraft,
1066 data: &ResolvedGameData,
1067) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1068 Ok(
1069 a
1070 .on_player()
1071 .apply_base_from_data(data, 433_891)?
1072 .max_stacks(
1073 data
1074 .require_aura_max_stacks(
1075 wowlab_types::sim::SpellIdx::from_raw(433_891),
1076 )?,
1077 ),
1078 )
1079}
1080fn aura_ruination(
1081 a: AuraDefinitionDraft,
1082 data: &ResolvedGameData,
1083) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1084 Ok(
1085 a
1086 .on_player()
1087 .apply_base_from_data(data, 433_885)?
1088 .max_stacks(
1089 data
1090 .require_aura_max_stacks(
1091 wowlab_types::sim::SpellIdx::from_raw(433_885),
1092 )?,
1093 ),
1094 )
1095}
1096fn aura_diabolic_ritual_talent(
1097 a: AuraDefinitionDraft,
1098 data: &ResolvedGameData,
1099) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1100 Ok(
1101 a
1102 .on_player()
1103 .apply_base_from_data(data, 428_514)?
1104 .max_stacks(
1105 data
1106 .require_aura_max_stacks(
1107 wowlab_types::sim::SpellIdx::from_raw(428_514),
1108 )?,
1109 ),
1110 )
1111}
1112fn aura_diabolic_ritual_overlord(
1113 a: AuraDefinitionDraft,
1114 data: &ResolvedGameData,
1115) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1116 Ok(
1117 a
1118 .on_player()
1119 .apply_base_from_data(data, 431_944)?
1120 .max_stacks(
1121 data
1122 .require_aura_max_stacks(
1123 wowlab_types::sim::SpellIdx::from_raw(431_944),
1124 )?,
1125 )
1126 .on_expire(
1127 crate::hooks::destruction_warlock::destruction_diabolic_ritual_overlord_expire_hook,
1128 ),
1129 )
1130}
1131fn aura_diabolic_ritual_mother(
1132 a: AuraDefinitionDraft,
1133 data: &ResolvedGameData,
1134) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1135 Ok(
1136 a
1137 .on_player()
1138 .apply_base_from_data(data, 432_815)?
1139 .max_stacks(
1140 data
1141 .require_aura_max_stacks(
1142 wowlab_types::sim::SpellIdx::from_raw(432_815),
1143 )?,
1144 )
1145 .on_expire(
1146 crate::hooks::destruction_warlock::destruction_diabolic_ritual_mother_expire_hook,
1147 ),
1148 )
1149}
1150fn aura_diabolic_ritual_pit_lord(
1151 a: AuraDefinitionDraft,
1152 data: &ResolvedGameData,
1153) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1154 Ok(
1155 a
1156 .on_player()
1157 .apply_base_from_data(data, 432_816)?
1158 .max_stacks(
1159 data
1160 .require_aura_max_stacks(
1161 wowlab_types::sim::SpellIdx::from_raw(432_816),
1162 )?,
1163 )
1164 .on_expire(
1165 crate::hooks::destruction_warlock::destruction_diabolic_ritual_pit_lord_expire_hook,
1166 ),
1167 )
1168}
1169fn aura_demonic_art_overlord(
1170 a: AuraDefinitionDraft,
1171 data: &ResolvedGameData,
1172) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1173 Ok(
1174 a
1175 .on_player()
1176 .apply_base_from_data(data, 428_524)?
1177 .max_stacks(
1178 data
1179 .require_aura_max_stacks(
1180 wowlab_types::sim::SpellIdx::from_raw(428_524),
1181 )?,
1182 )
1183 .on_expire(
1184 crate::hooks::destruction_warlock::destruction_demonic_art_overlord_expire_hook,
1185 ),
1186 )
1187}
1188fn aura_demonic_art_mother(
1189 a: AuraDefinitionDraft,
1190 data: &ResolvedGameData,
1191) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1192 Ok(
1193 a
1194 .on_player()
1195 .apply_base_from_data(data, 432_794)?
1196 .max_stacks(
1197 data
1198 .require_aura_max_stacks(
1199 wowlab_types::sim::SpellIdx::from_raw(432_794),
1200 )?,
1201 )
1202 .on_expire(
1203 crate::hooks::destruction_warlock::destruction_demonic_art_mother_expire_hook,
1204 ),
1205 )
1206}
1207fn aura_demonic_art_pit_lord(
1208 a: AuraDefinitionDraft,
1209 data: &ResolvedGameData,
1210) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1211 Ok(
1212 a
1213 .on_player()
1214 .apply_base_from_data(data, 432_795)?
1215 .max_stacks(
1216 data
1217 .require_aura_max_stacks(
1218 wowlab_types::sim::SpellIdx::from_raw(432_795),
1219 )?,
1220 )
1221 .on_expire(
1222 crate::hooks::destruction_warlock::destruction_demonic_art_pit_lord_expire_hook,
1223 ),
1224 )
1225}
1226fn aura_demonic_oculi(
1227 a: AuraDefinitionDraft,
1228 data: &ResolvedGameData,
1229) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1230 Ok(
1231 a
1232 .on_player()
1233 .apply_base_from_data(data, 1_269_643)?
1234 .max_stacks(
1235 data
1236 .require_aura_max_stacks(
1237 wowlab_types::sim::SpellIdx::from_raw(1_269_643),
1238 )?,
1239 ),
1240 )
1241}
1242fn aura_diabolic_oculi_talent(
1243 a: AuraDefinitionDraft,
1244 data: &ResolvedGameData,
1245) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1246 Ok(
1247 a
1248 .on_player()
1249 .apply_base_from_data(data, 1_268_709)?
1250 .max_stacks(
1251 data
1252 .require_aura_max_stacks(
1253 wowlab_types::sim::SpellIdx::from_raw(1_268_709),
1254 )?,
1255 ),
1256 )
1257}
1258fn aura_looks_that_kill_talent(
1259 a: AuraDefinitionDraft,
1260 data: &ResolvedGameData,
1261) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1262 Ok(
1263 a
1264 .on_player()
1265 .apply_base_from_data(data, 1_268_713)?
1266 .max_stacks(
1267 data
1268 .require_aura_max_stacks(
1269 wowlab_types::sim::SpellIdx::from_raw(1_268_713),
1270 )?,
1271 ),
1272 )
1273}
1274fn aura_minds_eyes_talent(
1275 a: AuraDefinitionDraft,
1276 data: &ResolvedGameData,
1277) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1278 Ok(
1279 a
1280 .on_player()
1281 .apply_base_from_data(data, 1_268_716)?
1282 .max_stacks(
1283 data
1284 .require_aura_max_stacks(
1285 wowlab_types::sim::SpellIdx::from_raw(1_268_716),
1286 )?,
1287 ),
1288 )
1289}
1290fn aura_minds_eyes(
1291 a: AuraDefinitionDraft,
1292 data: &ResolvedGameData,
1293) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1294 a.on_player()
1295 .apply_base_from_data(data, 1_269_879)?
1296 .max_stacks(
1297 data
1298 .require_aura_max_stacks(
1299 wowlab_types::sim::SpellIdx::from_raw(1_269_879),
1300 )?,
1301 )
1302 .primary_pct_per_stack(
1303 data.base_points(wowlab_types::sim::SpellIdx::from_raw(1_269_879), 1),
1304 )
1305}
1306fn aura_overfiend(
1307 a: AuraDefinitionDraft,
1308 data: &ResolvedGameData,
1309) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1310 Ok(
1311 a
1312 .on_player()
1313 .apply_base_from_data(data, 457_578)?
1314 .max_stacks(
1315 data
1316 .require_aura_max_stacks(
1317 wowlab_types::sim::SpellIdx::from_raw(457_578),
1318 )?,
1319 ),
1320 )
1321}
1322fn aura_avatar_of_destruction_talent(
1323 a: AuraDefinitionDraft,
1324 data: &ResolvedGameData,
1325) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1326 Ok(
1327 a
1328 .on_player()
1329 .apply_base_from_data(data, 1_245_089)?
1330 .max_stacks(
1331 data
1332 .require_aura_max_stacks(
1333 wowlab_types::sim::SpellIdx::from_raw(1_245_089),
1334 )?,
1335 ),
1336 )
1337}
1338fn aura_embers_of_nihilam_1_talent(
1339 a: AuraDefinitionDraft,
1340 data: &ResolvedGameData,
1341) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1342 Ok(
1343 a
1344 .on_player()
1345 .apply_base_from_data(data, 1_265_770)?
1346 .max_stacks(
1347 data
1348 .require_aura_max_stacks(
1349 wowlab_types::sim::SpellIdx::from_raw(1_265_770),
1350 )?,
1351 ),
1352 )
1353}
1354fn aura_embers_of_nihilam_2_talent(
1355 a: AuraDefinitionDraft,
1356 data: &ResolvedGameData,
1357) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1358 Ok(
1359 a
1360 .on_player()
1361 .apply_base_from_data(data, 1_265_772)?
1362 .max_stacks(
1363 data
1364 .require_aura_max_stacks(
1365 wowlab_types::sim::SpellIdx::from_raw(1_265_772),
1366 )?,
1367 ),
1368 )
1369}
1370fn aura_embers_of_nihilam_3_talent(
1371 a: AuraDefinitionDraft,
1372 data: &ResolvedGameData,
1373) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1374 Ok(
1375 a
1376 .on_player()
1377 .apply_base_from_data(data, 1_265_774)?
1378 .max_stacks(
1379 data
1380 .require_aura_max_stacks(
1381 wowlab_types::sim::SpellIdx::from_raw(1_265_774),
1382 )?,
1383 ),
1384 )
1385}
1386fn aura_vision_of_nihilam(
1387 a: AuraDefinitionDraft,
1388 data: &ResolvedGameData,
1389) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1390 a.on_player()
1391 .apply_base_from_data(data, 1_265_939)?
1392 .max_stacks(
1393 data
1394 .require_aura_max_stacks(
1395 wowlab_types::sim::SpellIdx::from_raw(1_265_939),
1396 )?,
1397 )
1398 .haste_per_stack(
1399 (data.base_points(wowlab_types::sim::SpellIdx::from_raw(1_265_772), 1)) * 2.0,
1400 )?
1401 .crit_per_stack(
1402 (data.base_points(wowlab_types::sim::SpellIdx::from_raw(1_265_772), 1)) * 2.0,
1403 )
1404}
1405fn aura_infernal_embers(
1406 a: AuraDefinitionDraft,
1407 data: &ResolvedGameData,
1408) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1409 Ok(
1410 a
1411 .on_player()
1412 .duration_ms(
1413 wowlab_engine_combat::validated_milliseconds(
1414 f64::from(
1415 data
1416 .require_aura_duration_ms(
1417 wowlab_types::sim::SpellIdx::from_raw(111_685),
1418 )?,
1419 ),
1420 264_364,
1421 "aura.duration_ms",
1422 )?,
1423 )
1424 .apply_periodic_effect_from_data(data, 264_364)?
1425 .apply_duration_behavior_from_data(data, 111_685)?
1426 .apply_timing_modifiers_from_data(data, 264_364)?
1427 .max_stacks(
1428 data
1429 .require_aura_max_stacks(
1430 wowlab_types::sim::SpellIdx::from_raw(264_364),
1431 )?,
1432 )
1433 .periodic_resource(
1434 wowlab_engine_combat::validated_milliseconds(
1435 data.period(wowlab_types::sim::SpellIdx::from_raw(264_364), 1),
1436 264_364,
1437 "periodic_resource.tick_ms",
1438 )?,
1439 (data.base_points(wowlab_types::sim::SpellIdx::from_raw(264_365), 1))
1440 * 0.1,
1441 )
1442 .apply_periodic_behavior_from_data(data, 264_364)?
1443 .unhasted_periodic(),
1444 )
1445}
1446fn aura_rain_of_chaos(
1447 a: AuraDefinitionDraft,
1448 data: &ResolvedGameData,
1449) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1450 Ok(
1451 a
1452 .on_player()
1453 .apply_base_from_data(data, 266_087)?
1454 .max_stacks(
1455 data
1456 .require_aura_max_stacks(
1457 wowlab_types::sim::SpellIdx::from_raw(266_087),
1458 )?,
1459 ),
1460 )
1461}
1462fn aura_crashing_chaos(
1463 a: AuraDefinitionDraft,
1464 data: &ResolvedGameData,
1465) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1466 Ok(
1467 a
1468 .on_player()
1469 .apply_base_from_data(data, 417_282)?
1470 .max_stacks(
1471 data
1472 .require_aura_max_stacks(
1473 wowlab_types::sim::SpellIdx::from_raw(417_282),
1474 )?,
1475 ),
1476 )
1477}
1478fn spell_summon_felhunter(
1479 s: SpellDefinitionDraft,
1480 data: &ResolvedGameData,
1481) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1482 Ok(s.apply_base_from_data(data, 691)?.apply_aoe_from_data(data))
1483}
1484fn spell_summon_imp(
1485 s: SpellDefinitionDraft,
1486 data: &ResolvedGameData,
1487) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1488 Ok(s.apply_base_from_data(data, 688)?.apply_aoe_from_data(data))
1489}
1490fn spell_grimoire_of_sacrifice(
1491 s: SpellDefinitionDraft,
1492 data: &ResolvedGameData,
1493) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1494 Ok(
1495 s
1496 .apply_base_from_data(data, 108_503)?
1497 .applies_aura(AURA_GRIMOIRE_OF_SACRIFICE)
1498 .apply_aoe_from_data(data),
1499 )
1500}
1501fn spell_immolate(
1502 s: SpellDefinitionDraft,
1503 data: &ResolvedGameData,
1504) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1505 Ok(
1506 s
1507 .apply_base_from_data(data, 348)?
1508 .applies_aura(AURA_IMMOLATE)
1509 .apply_aoe_from_data(data),
1510 )
1511}
1512fn spell_incinerate(
1513 s: SpellDefinitionDraft,
1514 data: &ResolvedGameData,
1515) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1516 Ok(
1517 s
1518 .apply_base_from_data(data, 29722)?
1519 .gain(0.5)
1520 .apply_aoe_from_data(data)
1521 .on_cast(crate::hooks::destruction_warlock::incinerate_hook),
1522 )
1523}
1524fn spell_conflagrate(
1525 s: SpellDefinitionDraft,
1526 data: &ResolvedGameData,
1527) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1528 Ok(
1529 s
1530 .apply_base_from_data(data, 17962)?
1531 .hasted_cooldown()
1532 .gain(0.5)
1533 .apply_aoe_from_data(data)
1534 .on_cast(crate::hooks::destruction_warlock::conflagrate_hook),
1535 )
1536}
1537fn spell_chaos_bolt(
1538 s: SpellDefinitionDraft,
1539 data: &ResolvedGameData,
1540) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1541 Ok(
1542 s
1543 .apply_base_from_data(data, 116_858)?
1544 .guaranteed_crit()
1545 .apply_aoe_from_data(data)
1546 .on_cast(crate::hooks::destruction_warlock::chaos_bolt_hook),
1547 )
1548}
1549fn spell_rain_of_fire(
1550 s: SpellDefinitionDraft,
1551 data: &ResolvedGameData,
1552) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1553 Ok(
1554 s
1555 .apply_base_from_data(data, 5740)?
1556 .apply_aoe_from_data(data)
1557 .on_cast(crate::hooks::destruction_warlock::rain_of_fire_hook),
1558 )
1559}
1560fn spell_shadowburn(
1561 s: SpellDefinitionDraft,
1562 data: &ResolvedGameData,
1563) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1564 Ok(
1565 s
1566 .apply_base_from_data(data, 17877)?
1567 .apply_aoe_from_data(data)
1568 .on_cast(crate::hooks::destruction_warlock::shadowburn_hook)
1569 .cost_free_when_aura(1_245_664)
1570 .execute_below_pct(20.0),
1571 )
1572}
1573fn spell_soul_fire(
1574 s: SpellDefinitionDraft,
1575 data: &ResolvedGameData,
1576) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1577 Ok(
1578 s
1579 .apply_base_from_data(data, 6353)?
1580 .gain(
1581 (data.base_points(wowlab_types::sim::SpellIdx::from_raw(281_490), 1))
1582 * 0.1,
1583 )
1584 .apply_aoe_from_data(data)
1585 .on_cast(crate::hooks::destruction_warlock::soul_fire_hook),
1586 )
1587}
1588fn spell_cataclysm(
1589 s: SpellDefinitionDraft,
1590 data: &ResolvedGameData,
1591) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1592 Ok(s.apply_base_from_data(data, 152_108)?.apply_aoe_from_data(data))
1593}
1594fn spell_channel_demonfire(
1595 s: SpellDefinitionDraft,
1596 data: &ResolvedGameData,
1597) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1598 s.apply_base_from_data(data, 196_447)?
1599 .applies_inferred_aura(AURA_CHANNEL_DEMONFIRE, 196_447)
1600 .apply_aoe_from_data(data)
1601 .channel(
1602 data
1603 .require_channel_tick_count(
1604 wowlab_types::sim::SpellIdx::from_raw(196_447),
1605 )?,
1606 )
1607 .channel_tick_damage_sp_from_data(
1608 wowlab_engine_domain::dbc::EffectLookup::new(
1609 data,
1610 wowlab_types::sim::EffectRef::new(
1611 wowlab_types::sim::SpellIdx::from_raw(196_448),
1612 1,
1613 ),
1614 ),
1615 )
1616}
1617fn spell_channel_demonfire_tick(
1618 s: SpellDefinitionDraft,
1619 data: &ResolvedGameData,
1620) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1621 Ok(s.apply_base_from_data(data, 196_448)?.apply_aoe_from_data(data))
1622}
1623fn spell_havoc(
1624 s: SpellDefinitionDraft,
1625 data: &ResolvedGameData,
1626) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1627 Ok(
1628 s
1629 .apply_base_from_data(data, 80240)?
1630 .applies_inferred_aura(AURA_HAVOC, 80240)
1631 .apply_aoe_from_data(data),
1632 )
1633}
1634fn spell_shadow_bolt(
1635 s: SpellDefinitionDraft,
1636 data: &ResolvedGameData,
1637) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1638 Ok(s.apply_base_from_data(data, 686)?.apply_aoe_from_data(data))
1639}
1640fn spell_corruption(
1641 s: SpellDefinitionDraft,
1642 data: &ResolvedGameData,
1643) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1644 Ok(s.apply_base_from_data(data, 172)?.apply_aoe_from_data(data))
1645}
1646fn spell_malevolence(
1647 s: SpellDefinitionDraft,
1648 data: &ResolvedGameData,
1649) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1650 Ok(
1651 s
1652 .apply_base_from_data(data, 430_014)?
1653 .applies_aura(AURA_MALEVOLENCE)
1654 .apply_aoe_from_data(data),
1655 )
1656}
1657fn spell_drain_life(
1658 s: SpellDefinitionDraft,
1659 data: &ResolvedGameData,
1660) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1661 Ok(s.apply_base_from_data(data, 234_153)?.apply_aoe_from_data(data))
1662}
1663fn spell_infernal_bolt(
1664 s: SpellDefinitionDraft,
1665 data: &ResolvedGameData,
1666) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1667 Ok(
1668 s
1669 .apply_base_from_data(data, 434_506)?
1670 .gain(
1671 (data.base_points(wowlab_types::sim::SpellIdx::from_raw(434_506), 2))
1672 * 0.1,
1673 )
1674 .apply_aoe_from_data(data)
1675 .on_cast(crate::hooks::destruction_warlock::infernal_bolt_hook)
1676 .requires_aura_at_min_stacks(433_891, 0)
1677 .consume_aura_on_cast(433_891),
1678 )
1679}
1680fn spell_ruination(
1681 s: SpellDefinitionDraft,
1682 data: &ResolvedGameData,
1683) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1684 Ok(
1685 s
1686 .apply_base_from_data(data, 434_635)?
1687 .travel_time(
1688 wowlab_engine_combat::validated_milliseconds(
1689 1000.0,
1690 434_635,
1691 "spell.travel_time_ms",
1692 )?,
1693 )
1694 .apply_aoe_from_data(data)
1695 .on_cast(crate::hooks::destruction_warlock::ruination_hook)
1696 .requires_aura_at_min_stacks(433_885, 0)
1697 .consume_aura_on_cast(433_885),
1698 )
1699}
1700fn spell_summon_infernal(
1701 s: SpellDefinitionDraft,
1702 data: &ResolvedGameData,
1703) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1704 Ok(
1705 s
1706 .apply_base_from_data(data, 1122)?
1707 .apply_aoe_from_data(data)
1708 .on_cast(crate::hooks::destruction_warlock::summon_infernal_hook),
1709 )
1710}
1711pub(crate) fn build_combat_system_draft(
1712 params: &wowlab_engine_ports::HandlerParams<'_>,
1713) -> Result<CombatSystemDraft, wowlab_engine_ports::EngineError> {
1714 let builder = CombatSystemBuilder::new(params.stats.clone())
1715 .spec_id(SpecId::Destruction)
1716 .spec_identity(
1717 wowlab_engine_combat::generated_identities::specs::destruction_warlock::PROOF,
1718 )
1719 .hero_talent_trees(DECLARED_METADATA.hero_talent_trees)
1720 .effect_identities(
1721 wowlab_engine_combat::generated_identities::specs::destruction_warlock::damage::ALL,
1722 )
1723 .effect_identities(wowlab_engine_combat::generated_identities::shared::ALL)
1724 .mastery_spell(77220)
1725 .mastery_hook(crate::hooks::destruction_warlock::mastery)
1726 .resource(
1727 "soul_shards",
1728 5.0,
1729 params
1730 .game_data
1731 .power_regen_for_max(7, 5.0)
1732 .ok_or_else(|| {
1733 wowlab_engine_ports::EngineError::spec_construction(
1734 "missing power-type power_regen_for_max for type_id 7",
1735 )
1736 })?,
1737 )
1738 .resource_type_id(7)
1739 .resource_start(3.0)
1740 .has_pet(true)
1741 .aura("immolate", AURA::IMMOLATE, |a| aura_immolate(a, ¶ms.game_data))
1742 .aura("backdraft", AURA::BACKDRAFT, |a| aura_backdraft(a, ¶ms.game_data))
1743 .aura(
1744 "reverse_entropy",
1745 AURA::REVERSE_ENTROPY,
1746 |a| aura_reverse_entropy(a, ¶ms.game_data),
1747 )
1748 .aura(
1749 "reverse_entropy_talent",
1750 AURA::REVERSE_ENTROPY_TALENT,
1751 |a| aura_reverse_entropy_talent(a, ¶ms.game_data),
1752 )
1753 .aura("flashpoint", AURA::FLASHPOINT, |a| aura_flashpoint(a, ¶ms.game_data))
1754 .aura(
1755 "fiendish_cruelty",
1756 AURA::FIENDISH_CRUELTY,
1757 |a| aura_fiendish_cruelty(a, ¶ms.game_data),
1758 )
1759 .aura(
1760 "fiendish_cruelty_talent",
1761 AURA::FIENDISH_CRUELTY_TALENT,
1762 |a| aura_fiendish_cruelty_talent(a, ¶ms.game_data),
1763 )
1764 .aura(
1765 "conflagration_of_chaos_talent",
1766 AURA::CONFLAGRATION_OF_CHAOS_TALENT,
1767 |a| aura_conflagration_of_chaos_talent(a, ¶ms.game_data),
1768 )
1769 .aura(
1770 "chaotic_inferno",
1771 AURA::CHAOTIC_INFERNO,
1772 |a| aura_chaotic_inferno(a, ¶ms.game_data),
1773 )
1774 .aura(
1775 "chaotic_inferno_talent",
1776 AURA::CHAOTIC_INFERNO_TALENT,
1777 |a| aura_chaotic_inferno_talent(a, ¶ms.game_data),
1778 )
1779 .aura("havoc", AURA::HAVOC, |a| aura_havoc(a, ¶ms.game_data))
1780 .aura(
1781 "ritual_of_ruin",
1782 AURA::RITUAL_OF_RUIN,
1783 |a| aura_ritual_of_ruin(a, ¶ms.game_data),
1784 )
1785 .aura(
1786 "grimoire_of_sacrifice",
1787 AURA::GRIMOIRE_OF_SACRIFICE,
1788 |a| aura_grimoire_of_sacrifice(a, ¶ms.game_data),
1789 )
1790 .aura("wither", AURA::WITHER, |a| aura_wither(a, ¶ms.game_data))
1791 .aura(
1792 "malevolence",
1793 AURA::MALEVOLENCE,
1794 |a| aura_malevolence(a, ¶ms.game_data),
1795 )
1796 .aura(
1797 "channel_demonfire",
1798 AURA::CHANNEL_DEMONFIRE,
1799 |a| aura_channel_demonfire(a, ¶ms.game_data),
1800 )
1801 .aura(
1802 "recently_demon_has_been_summoned_dnt",
1803 AURA::RECENTLY_DEMON_HAS_BEEN_SUMMONED_DNT,
1804 |a| aura_recently_demon_has_been_summoned_dnt(a, ¶ms.game_data),
1805 )
1806 .aura("track_pets", AURA::TRACK_PETS, |a| aura_track_pets(a, ¶ms.game_data))
1807 .aura(
1808 "dark_titans_mark",
1809 AURA::DARK_TITANS_MARK,
1810 |a| aura_dark_titans_mark(a, ¶ms.game_data),
1811 )
1812 .aura(
1813 "infernal_bolt",
1814 AURA::INFERNAL_BOLT,
1815 |a| aura_infernal_bolt(a, ¶ms.game_data),
1816 )
1817 .aura("ruination", AURA::RUINATION, |a| aura_ruination(a, ¶ms.game_data))
1818 .aura(
1819 "diabolic_ritual_talent",
1820 AURA::DIABOLIC_RITUAL_TALENT,
1821 |a| aura_diabolic_ritual_talent(a, ¶ms.game_data),
1822 )
1823 .aura(
1824 "diabolic_ritual_overlord",
1825 AURA::DIABOLIC_RITUAL_OVERLORD,
1826 |a| aura_diabolic_ritual_overlord(a, ¶ms.game_data),
1827 )
1828 .aura(
1829 "diabolic_ritual_mother",
1830 AURA::DIABOLIC_RITUAL_MOTHER,
1831 |a| aura_diabolic_ritual_mother(a, ¶ms.game_data),
1832 )
1833 .aura(
1834 "diabolic_ritual_pit_lord",
1835 AURA::DIABOLIC_RITUAL_PIT_LORD,
1836 |a| aura_diabolic_ritual_pit_lord(a, ¶ms.game_data),
1837 )
1838 .aura(
1839 "demonic_art_overlord",
1840 AURA::DEMONIC_ART_OVERLORD,
1841 |a| aura_demonic_art_overlord(a, ¶ms.game_data),
1842 )
1843 .aura(
1844 "demonic_art_mother",
1845 AURA::DEMONIC_ART_MOTHER,
1846 |a| aura_demonic_art_mother(a, ¶ms.game_data),
1847 )
1848 .aura(
1849 "demonic_art_pit_lord",
1850 AURA::DEMONIC_ART_PIT_LORD,
1851 |a| aura_demonic_art_pit_lord(a, ¶ms.game_data),
1852 )
1853 .aura(
1854 "demonic_oculi",
1855 AURA::DEMONIC_OCULI,
1856 |a| aura_demonic_oculi(a, ¶ms.game_data),
1857 )
1858 .aura(
1859 "diabolic_oculi_talent",
1860 AURA::DIABOLIC_OCULI_TALENT,
1861 |a| aura_diabolic_oculi_talent(a, ¶ms.game_data),
1862 )
1863 .aura(
1864 "looks_that_kill_talent",
1865 AURA::LOOKS_THAT_KILL_TALENT,
1866 |a| aura_looks_that_kill_talent(a, ¶ms.game_data),
1867 )
1868 .aura(
1869 "minds_eyes_talent",
1870 AURA::MINDS_EYES_TALENT,
1871 |a| aura_minds_eyes_talent(a, ¶ms.game_data),
1872 )
1873 .aura("minds_eyes", AURA::MINDS_EYES, |a| aura_minds_eyes(a, ¶ms.game_data))
1874 .aura("overfiend", AURA::OVERFIEND, |a| aura_overfiend(a, ¶ms.game_data))
1875 .aura(
1876 "avatar_of_destruction_talent",
1877 AURA::AVATAR_OF_DESTRUCTION_TALENT,
1878 |a| aura_avatar_of_destruction_talent(a, ¶ms.game_data),
1879 )
1880 .aura(
1881 "embers_of_nihilam_1_talent",
1882 AURA::EMBERS_OF_NIHILAM_1_TALENT,
1883 |a| aura_embers_of_nihilam_1_talent(a, ¶ms.game_data),
1884 )
1885 .aura(
1886 "embers_of_nihilam_2_talent",
1887 AURA::EMBERS_OF_NIHILAM_2_TALENT,
1888 |a| aura_embers_of_nihilam_2_talent(a, ¶ms.game_data),
1889 )
1890 .aura(
1891 "embers_of_nihilam_3_talent",
1892 AURA::EMBERS_OF_NIHILAM_3_TALENT,
1893 |a| aura_embers_of_nihilam_3_talent(a, ¶ms.game_data),
1894 )
1895 .aura(
1896 "vision_of_nihilam",
1897 AURA::VISION_OF_NIHILAM,
1898 |a| aura_vision_of_nihilam(a, ¶ms.game_data),
1899 )
1900 .aura(
1901 "infernal_embers",
1902 AURA::INFERNAL_EMBERS,
1903 |a| aura_infernal_embers(a, ¶ms.game_data),
1904 )
1905 .aura(
1906 "rain_of_chaos",
1907 AURA::RAIN_OF_CHAOS,
1908 |a| aura_rain_of_chaos(a, ¶ms.game_data),
1909 )
1910 .aura(
1911 "crashing_chaos",
1912 AURA::CRASHING_CHAOS,
1913 |a| aura_crashing_chaos(a, ¶ms.game_data),
1914 )
1915 .spell(
1916 "summon_felhunter",
1917 SPELL::SUMMON_FELHUNTER,
1918 |s| spell_summon_felhunter(s, ¶ms.game_data),
1919 )
1920 .spell(
1921 "summon_imp",
1922 SPELL::SUMMON_IMP,
1923 |s| spell_summon_imp(s, ¶ms.game_data),
1924 )
1925 .spell(
1926 "grimoire_of_sacrifice",
1927 SPELL::GRIMOIRE_OF_SACRIFICE,
1928 |s| spell_grimoire_of_sacrifice(s, ¶ms.game_data),
1929 )
1930 .spell("immolate", SPELL::IMMOLATE, |s| spell_immolate(s, ¶ms.game_data))
1931 .spell(
1932 "incinerate",
1933 SPELL::INCINERATE,
1934 |s| spell_incinerate(s, ¶ms.game_data),
1935 )
1936 .spell(
1937 "conflagrate",
1938 SPELL::CONFLAGRATE,
1939 |s| spell_conflagrate(s, ¶ms.game_data),
1940 )
1941 .spell(
1942 "chaos_bolt",
1943 SPELL::CHAOS_BOLT,
1944 |s| spell_chaos_bolt(s, ¶ms.game_data),
1945 )
1946 .spell(
1947 "rain_of_fire",
1948 SPELL::RAIN_OF_FIRE,
1949 |s| spell_rain_of_fire(s, ¶ms.game_data),
1950 )
1951 .spell(
1952 "shadowburn",
1953 SPELL::SHADOWBURN,
1954 |s| spell_shadowburn(s, ¶ms.game_data),
1955 )
1956 .spell("soul_fire", SPELL::SOUL_FIRE, |s| spell_soul_fire(s, ¶ms.game_data))
1957 .spell("cataclysm", SPELL::CATACLYSM, |s| spell_cataclysm(s, ¶ms.game_data))
1958 .spell(
1959 "channel_demonfire",
1960 SPELL::CHANNEL_DEMONFIRE,
1961 |s| spell_channel_demonfire(s, ¶ms.game_data),
1962 )
1963 .spell(
1964 "channel_demonfire_tick",
1965 SPELL::CHANNEL_DEMONFIRE_TICK,
1966 |s| spell_channel_demonfire_tick(s, ¶ms.game_data),
1967 )
1968 .spell("havoc", SPELL::HAVOC, |s| spell_havoc(s, ¶ms.game_data))
1969 .spell(
1970 "shadow_bolt",
1971 SPELL::SHADOW_BOLT,
1972 |s| spell_shadow_bolt(s, ¶ms.game_data),
1973 )
1974 .spell(
1975 "corruption",
1976 SPELL::CORRUPTION,
1977 |s| spell_corruption(s, ¶ms.game_data),
1978 )
1979 .spell(
1980 "malevolence",
1981 SPELL::MALEVOLENCE,
1982 |s| spell_malevolence(s, ¶ms.game_data),
1983 )
1984 .spell(
1985 "drain_life",
1986 SPELL::DRAIN_LIFE,
1987 |s| spell_drain_life(s, ¶ms.game_data),
1988 )
1989 .spell(
1990 "infernal_bolt",
1991 SPELL::INFERNAL_BOLT,
1992 |s| spell_infernal_bolt(s, ¶ms.game_data),
1993 )
1994 .spell("ruination", SPELL::RUINATION, |s| spell_ruination(s, ¶ms.game_data))
1995 .spell(
1996 "summon_infernal",
1997 SPELL::SUMMON_INFERNAL,
1998 |s| spell_summon_infernal(s, ¶ms.game_data),
1999 )
2000 .auto_attack(|a| {
2001 a
2002 .spell_id(1)
2003 .swing_ms(3000)
2004 .apply_base_from_data(¶ms.game_data)
2005 .ap_coef(
2006 wowlab_engine_domain::damage::pet_swing_power_coefficient(
2007 0.575,
2008 3000,
2009 1.0,
2010 ),
2011 )
2012 .is_pet()
2013 .uses_spell_power()
2014 })
2015 .game_data(params.game_data.clone())
2016 .talent_spell_ids(TALENTS)
2017 .talent_selections(params.talent_selections)
2018 .talent_companion_aura(
2019 TALENT::AVATAR_OF_DESTRUCTION,
2020 AURA_AVATAR_OF_DESTRUCTION_TALENT,
2021 )
2022 .talent_companion_aura(TALENT::CHAOTIC_INFERNO, AURA_CHAOTIC_INFERNO_TALENT)
2023 .talent_companion_aura(
2024 TALENT::CONFLAGRATION_OF_CHAOS,
2025 AURA_CONFLAGRATION_OF_CHAOS_TALENT,
2026 )
2027 .talent_companion_aura(TALENT::DIABOLIC_OCULI, AURA_DIABOLIC_OCULI_TALENT)
2028 .talent_companion_aura(TALENT::DIABOLIC_RITUAL, AURA_DIABOLIC_RITUAL_TALENT)
2029 .talent_companion_aura(
2030 TALENT::EMBERS_OF_NIHILAM_1,
2031 AURA_EMBERS_OF_NIHILAM_1_TALENT,
2032 )
2033 .talent_companion_aura(
2034 TALENT::EMBERS_OF_NIHILAM_2,
2035 AURA_EMBERS_OF_NIHILAM_2_TALENT,
2036 )
2037 .talent_companion_aura(
2038 TALENT::EMBERS_OF_NIHILAM_3,
2039 AURA_EMBERS_OF_NIHILAM_3_TALENT,
2040 )
2041 .talent_companion_aura(TALENT::FIENDISH_CRUELTY, AURA_FIENDISH_CRUELTY_TALENT)
2042 .talent_companion_aura(TALENT::LOOKS_THAT_KILL, AURA_LOOKS_THAT_KILL_TALENT)
2043 .talent_companion_aura(TALENT::MINDS_EYES, AURA_MINDS_EYES_TALENT)
2044 .talent_companion_aura(TALENT::REVERSE_ENTROPY, AURA_REVERSE_ENTROPY_TALENT)
2045 .set_bonus_auras(params.set_bonus_auras)
2046 .encounter(params.encounter.clone());
2047 let builder = crate::generated::items::register_equipped(
2048 builder,
2049 ¶ms.game_data,
2050 params.equipped_items,
2051 )?;
2052
2053 builder.into_draft()
2054}
2055fn new_handler(
2056 params: wowlab_engine_ports::HandlerParams<'_>,
2057) -> Result<Box<dyn SpecHandler>, wowlab_engine_ports::EngineError> {
2058 let handler = crate::composition::compose_handler(
2059 build_combat_system_draft,
2060 ¶ms,
2061 crate::hooks::destruction_warlock::DestructionHandler::new,
2062 )?;
2063
2064 Ok(Box::new(handler))
2065}
2066static DECLARED_METADATA: DeclaredSpecMetadata = DeclaredSpecMetadata {
2067 primary_resource: ResourceType::SoulShards,
2068 secondary_resource: None,
2069 spell_ids: DECLARED_SPELL_IDS,
2070 aura_ids: DECLARED_AURA_IDS,
2071 server_proc_entries: &[
2072 DeclaredServerProcEntry {
2073 spell_id: 117_828,
2074 attributes: ProcAttributes::REQUIRE_SPELL_MODIFIER.bits()
2075 | ProcAttributes::USE_STACKS_FOR_CHARGES.bits(),
2076 },
2077 ],
2078 talents: TALENTS,
2079 rotation_field_schema: &[],
2080 metrics_plugin_id: None,
2081 hero_talent_trees: &[
2082 HeroTalentTreeDesc {
2083 name: "Hellcaller",
2084 spells: HERO_TREE_HELLCALLER_SPELLS,
2085 auras: HERO_TREE_HELLCALLER_AURAS,
2086 },
2087 HeroTalentTreeDesc {
2088 name: "Diabolist",
2089 spells: HERO_TREE_DIABOLIST_SPELLS,
2090 auras: HERO_TREE_DIABOLIST_AURAS,
2091 },
2092 ],
2093 reported_spells: REPORTED_SPELLS,
2094 masked_passive_effects: &[],
2095 passive_effect_overrides: &[],
2096};
2097pub(super) const SPEC_DESCRIPTOR: SpecDescriptor = SpecDescriptor {
2098 spec_id: SpecId::Destruction,
2099 display_name: "Destruction Warlock",
2100 metadata: DECLARED_METADATA,
2101 handler_factory: new_handler,
2102};
2103wowlab_engine_combat::smoke_test!(build_combat_system_draft);