Skip to main content

wowlab_engine_content/generated/specs/
destruction_warlock.rs

1//! @generated by codegen-cli from manifests/specs/warlock/destruction/manifest.toml -- do not edit by hand.
2// Generated code: naming follows game data conventions
3#![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    ///<https://wowlab.gg/inspect/spell/691>
17    pub(crate) const SUMMON_FELHUNTER: u32 = 691;
18    ///<https://wowlab.gg/inspect/spell/688>
19    pub(crate) const SUMMON_IMP: u32 = 688;
20    ///<https://wowlab.gg/inspect/spell/108503>
21    pub(crate) const GRIMOIRE_OF_SACRIFICE: u32 = 108_503;
22    ///<https://wowlab.gg/inspect/spell/348>
23    pub(crate) const IMMOLATE: u32 = 348;
24    ///<https://wowlab.gg/inspect/spell/29722>
25    pub(crate) const INCINERATE: u32 = 29722;
26    ///<https://wowlab.gg/inspect/spell/17962>
27    pub(crate) const CONFLAGRATE: u32 = 17962;
28    ///<https://wowlab.gg/inspect/spell/116858>
29    pub(crate) const CHAOS_BOLT: u32 = 116_858;
30    ///<https://wowlab.gg/inspect/spell/5740>
31    pub(crate) const RAIN_OF_FIRE: u32 = 5740;
32    ///<https://wowlab.gg/inspect/spell/17877>
33    pub(crate) const SHADOWBURN: u32 = 17877;
34    ///<https://wowlab.gg/inspect/spell/6353>
35    pub(crate) const SOUL_FIRE: u32 = 6353;
36    ///<https://wowlab.gg/inspect/spell/152108>
37    pub(crate) const CATACLYSM: u32 = 152_108;
38    ///<https://wowlab.gg/inspect/spell/196447>
39    pub(crate) const CHANNEL_DEMONFIRE: u32 = 196_447;
40    ///<https://wowlab.gg/inspect/spell/196448>
41    pub(crate) const CHANNEL_DEMONFIRE_TICK: u32 = 196_448;
42    ///<https://wowlab.gg/inspect/spell/80240>
43    pub(crate) const HAVOC: u32 = 80240;
44    ///<https://wowlab.gg/inspect/spell/686>
45    pub(crate) const SHADOW_BOLT: u32 = 686;
46    ///<https://wowlab.gg/inspect/spell/172>
47    pub(crate) const CORRUPTION: u32 = 172;
48    ///<https://wowlab.gg/inspect/spell/430014>
49    pub(crate) const MALEVOLENCE: u32 = 430_014;
50    ///<https://wowlab.gg/inspect/spell/234153>
51    pub(crate) const DRAIN_LIFE: u32 = 234_153;
52    ///<https://wowlab.gg/inspect/spell/434506>
53    pub(crate) const INFERNAL_BOLT: u32 = 434_506;
54    ///<https://wowlab.gg/inspect/spell/434635>
55    pub(crate) const RUINATION: u32 = 434_635;
56    ///<https://wowlab.gg/inspect/spell/1122>
57    pub(crate) const SUMMON_INFERNAL: u32 = 1122;
58}
59pub(crate) mod AURA {
60    ///<https://wowlab.gg/inspect/spell/157736>
61    pub(crate) const IMMOLATE: u32 = 157_736;
62    ///<https://wowlab.gg/inspect/spell/117828>
63    pub(crate) const BACKDRAFT: u32 = 117_828;
64    ///<https://wowlab.gg/inspect/spell/266030>
65    pub(crate) const REVERSE_ENTROPY: u32 = 266_030;
66    ///<https://wowlab.gg/inspect/spell/205148>
67    pub(crate) const REVERSE_ENTROPY_TALENT: u32 = 205_148;
68    ///<https://wowlab.gg/inspect/spell/387263>
69    pub(crate) const FLASHPOINT: u32 = 387_263;
70    ///<https://wowlab.gg/inspect/spell/1245664>
71    pub(crate) const FIENDISH_CRUELTY: u32 = 1_245_664;
72    ///<https://wowlab.gg/inspect/spell/1245633>
73    pub(crate) const FIENDISH_CRUELTY_TALENT: u32 = 1_245_633;
74    ///<https://wowlab.gg/inspect/spell/387108>
75    pub(crate) const CONFLAGRATION_OF_CHAOS_TALENT: u32 = 387_108;
76    ///<https://wowlab.gg/inspect/spell/1244860>
77    pub(crate) const CHAOTIC_INFERNO: u32 = 1_244_860;
78    ///<https://wowlab.gg/inspect/spell/1244788>
79    pub(crate) const CHAOTIC_INFERNO_TALENT: u32 = 1_244_788;
80    ///<https://wowlab.gg/inspect/spell/80240>
81    pub(crate) const HAVOC: u32 = 80240;
82    ///<https://wowlab.gg/inspect/spell/387157>
83    pub(crate) const RITUAL_OF_RUIN: u32 = 387_157;
84    ///<https://wowlab.gg/inspect/spell/196099>
85    pub(crate) const GRIMOIRE_OF_SACRIFICE: u32 = 196_099;
86    ///<https://wowlab.gg/inspect/spell/445474>
87    pub(crate) const WITHER: u32 = 445_474;
88    ///<https://wowlab.gg/inspect/spell/442726>
89    pub(crate) const MALEVOLENCE: u32 = 442_726;
90    ///<https://wowlab.gg/inspect/spell/196447>
91    pub(crate) const CHANNEL_DEMONFIRE: u32 = 196_447;
92    ///<https://wowlab.gg/inspect/spell/1288970>
93    pub(crate) const RECENTLY_DEMON_HAS_BEEN_SUMMONED_DNT: u32 = 1_288_970;
94    ///<https://wowlab.gg/inspect/spell/462599>
95    pub(crate) const TRACK_PETS: u32 = 462_599;
96    ///<https://wowlab.gg/inspect/spell/1305711>
97    pub(crate) const DARK_TITANS_MARK: u32 = 1_305_711;
98    ///<https://wowlab.gg/inspect/spell/433891>
99    pub(crate) const INFERNAL_BOLT: u32 = 433_891;
100    ///<https://wowlab.gg/inspect/spell/433885>
101    pub(crate) const RUINATION: u32 = 433_885;
102    ///<https://wowlab.gg/inspect/spell/428514>
103    pub(crate) const DIABOLIC_RITUAL_TALENT: u32 = 428_514;
104    ///<https://wowlab.gg/inspect/spell/431944>
105    pub(crate) const DIABOLIC_RITUAL_OVERLORD: u32 = 431_944;
106    ///<https://wowlab.gg/inspect/spell/432815>
107    pub(crate) const DIABOLIC_RITUAL_MOTHER: u32 = 432_815;
108    ///<https://wowlab.gg/inspect/spell/432816>
109    pub(crate) const DIABOLIC_RITUAL_PIT_LORD: u32 = 432_816;
110    ///<https://wowlab.gg/inspect/spell/428524>
111    pub(crate) const DEMONIC_ART_OVERLORD: u32 = 428_524;
112    ///<https://wowlab.gg/inspect/spell/432794>
113    pub(crate) const DEMONIC_ART_MOTHER: u32 = 432_794;
114    ///<https://wowlab.gg/inspect/spell/432795>
115    pub(crate) const DEMONIC_ART_PIT_LORD: u32 = 432_795;
116    ///<https://wowlab.gg/inspect/spell/1269643>
117    pub(crate) const DEMONIC_OCULI: u32 = 1_269_643;
118    ///<https://wowlab.gg/inspect/spell/1268709>
119    pub(crate) const DIABOLIC_OCULI_TALENT: u32 = 1_268_709;
120    ///<https://wowlab.gg/inspect/spell/1268713>
121    pub(crate) const LOOKS_THAT_KILL_TALENT: u32 = 1_268_713;
122    ///<https://wowlab.gg/inspect/spell/1268716>
123    pub(crate) const MINDS_EYES_TALENT: u32 = 1_268_716;
124    ///<https://wowlab.gg/inspect/spell/1269879>
125    pub(crate) const MINDS_EYES: u32 = 1_269_879;
126    ///<https://wowlab.gg/inspect/spell/457578>
127    pub(crate) const OVERFIEND: u32 = 457_578;
128    ///<https://wowlab.gg/inspect/spell/1245089>
129    pub(crate) const AVATAR_OF_DESTRUCTION_TALENT: u32 = 1_245_089;
130    ///<https://wowlab.gg/inspect/spell/1265770>
131    pub(crate) const EMBERS_OF_NIHILAM_1_TALENT: u32 = 1_265_770;
132    ///<https://wowlab.gg/inspect/spell/1265772>
133    pub(crate) const EMBERS_OF_NIHILAM_2_TALENT: u32 = 1_265_772;
134    ///<https://wowlab.gg/inspect/spell/1265774>
135    pub(crate) const EMBERS_OF_NIHILAM_3_TALENT: u32 = 1_265_774;
136    ///<https://wowlab.gg/inspect/spell/1265939>
137    pub(crate) const VISION_OF_NIHILAM: u32 = 1_265_939;
138    ///<https://wowlab.gg/inspect/spell/264364>
139    pub(crate) const INFERNAL_EMBERS: u32 = 264_364;
140    ///<https://wowlab.gg/inspect/spell/266087>
141    pub(crate) const RAIN_OF_CHAOS: u32 = 266_087;
142    ///<https://wowlab.gg/inspect/spell/417282>
143    pub(crate) const CRASHING_CHAOS: u32 = 417_282;
144}
145pub(crate) mod TALENT {
146    ///<https://wowlab.gg/inspect/spell/1245089>
147    pub(crate) const AVATAR_OF_DESTRUCTION: u32 = 1_245_089;
148    ///<https://wowlab.gg/inspect/spell/196406>
149    pub(crate) const BACKDRAFT: u32 = 196_406;
150    ///<https://wowlab.gg/inspect/spell/152108>
151    pub(crate) const CATACLYSM: u32 = 152_108;
152    ///<https://wowlab.gg/inspect/spell/196447>
153    pub(crate) const CHANNEL_DEMONFIRE: u32 = 196_447;
154    ///<https://wowlab.gg/inspect/spell/387275>
155    pub(crate) const CHAOS_INCARNATE: u32 = 387_275;
156    ///<https://wowlab.gg/inspect/spell/1244788>
157    pub(crate) const CHAOTIC_INFERNO: u32 = 1_244_788;
158    ///<https://wowlab.gg/inspect/spell/17962>
159    pub(crate) const CONFLAGRATE: u32 = 17962;
160    ///<https://wowlab.gg/inspect/spell/387108>
161    pub(crate) const CONFLAGRATION_OF_CHAOS: u32 = 387_108;
162    ///<https://wowlab.gg/inspect/spell/417234>
163    pub(crate) const CRASHING_CHAOS: u32 = 417_234;
164    ///<https://wowlab.gg/inspect/spell/1214442>
165    pub(crate) const DEMONFIRE_INFUSION: u32 = 1_214_442;
166    ///<https://wowlab.gg/inspect/spell/387173>
167    pub(crate) const DIABOLIC_EMBERS: u32 = 387_173;
168    ///<https://wowlab.gg/inspect/spell/1268709>
169    pub(crate) const DIABOLIC_OCULI: u32 = 1_268_709;
170    ///<https://wowlab.gg/inspect/spell/428514>
171    pub(crate) const DIABOLIC_RITUAL: u32 = 428_514;
172    ///<https://wowlab.gg/inspect/spell/454744>
173    pub(crate) const EMBERSTORM: u32 = 454_744;
174    ///<https://wowlab.gg/inspect/spell/1265770>
175    pub(crate) const EMBERS_OF_NIHILAM_1: u32 = 1_265_770;
176    ///<https://wowlab.gg/inspect/spell/1265772>
177    pub(crate) const EMBERS_OF_NIHILAM_2: u32 = 1_265_772;
178    ///<https://wowlab.gg/inspect/spell/1265774>
179    pub(crate) const EMBERS_OF_NIHILAM_3: u32 = 1_265_774;
180    ///<https://wowlab.gg/inspect/spell/1245633>
181    pub(crate) const FIENDISH_CRUELTY: u32 = 1_245_633;
182    ///<https://wowlab.gg/inspect/spell/196408>
183    pub(crate) const FIRE_AND_BRIMSTONE: u32 = 196_408;
184    ///<https://wowlab.gg/inspect/spell/387259>
185    pub(crate) const FLASHPOINT: u32 = 387_259;
186    ///<https://wowlab.gg/inspect/spell/108503>
187    pub(crate) const GRIMOIRE_OF_SACRIFICE: u32 = 108_503;
188    ///<https://wowlab.gg/inspect/spell/80240>
189    pub(crate) const HAVOC: u32 = 80240;
190    ///<https://wowlab.gg/inspect/spell/231793>
191    pub(crate) const IMPROVED_CONFLAGRATE: u32 = 231_793;
192    ///<https://wowlab.gg/inspect/spell/1280483>
193    pub(crate) const INFERNO: u32 = 1_280_483;
194    ///<https://wowlab.gg/inspect/spell/266134>
195    pub(crate) const INTERNAL_COMBUSTION: u32 = 266_134;
196    ///<https://wowlab.gg/inspect/spell/1268713>
197    pub(crate) const LOOKS_THAT_KILL: u32 = 1_268_713;
198    ///<https://wowlab.gg/inspect/spell/430014>
199    pub(crate) const MALEVOLENCE: u32 = 430_014;
200    ///<https://wowlab.gg/inspect/spell/387506>
201    pub(crate) const MAYHEM: u32 = 387_506;
202    ///<https://wowlab.gg/inspect/spell/1268716>
203    pub(crate) const MINDS_EYES: u32 = 1_268_716;
204    ///<https://wowlab.gg/inspect/spell/387166>
205    pub(crate) const RAGING_DEMONFIRE: u32 = 387_166;
206    ///<https://wowlab.gg/inspect/spell/266086>
207    pub(crate) const RAIN_OF_CHAOS: u32 = 266_086;
208    ///<https://wowlab.gg/inspect/spell/5740>
209    pub(crate) const RAIN_OF_FIRE: u32 = 5740;
210    ///<https://wowlab.gg/inspect/spell/205148>
211    pub(crate) const REVERSE_ENTROPY: u32 = 205_148;
212    ///<https://wowlab.gg/inspect/spell/1244310>
213    pub(crate) const ROARING_BLAZE: u32 = 1_244_310;
214    ///<https://wowlab.gg/inspect/spell/17877>
215    pub(crate) const SHADOWBURN: u32 = 17877;
216    ///<https://wowlab.gg/inspect/spell/6353>
217    pub(crate) const SOUL_FIRE: u32 = 6353;
218    ///<https://wowlab.gg/inspect/spell/1122>
219    pub(crate) const SUMMON_INFERNAL: u32 = 1122;
220}
221pub(crate) mod SET_BONUS {
222    ///<https://wowlab.gg/inspect/spell/1296571>
223    pub(crate) const MID2_DESTRUCTION_2PC: u32 = 1_296_571;
224    ///<https://wowlab.gg/inspect/spell/1296572>
225    pub(crate) const MID2_DESTRUCTION_4PC: u32 = 1_296_572;
226}
227pub(crate) mod REPORTED_SPELL {
228    ///<https://wowlab.gg/inspect/spell/432596>
229    pub(crate) const CHAOS_SALVO: u32 = 432_596;
230    ///<https://wowlab.gg/inspect/spell/1269892>
231    pub(crate) const DIABOLIC_GAZE_1: u32 = 1_269_892;
232    ///<https://wowlab.gg/inspect/spell/1269886>
233    pub(crate) const DIABOLIC_GAZE_2: u32 = 1_269_886;
234    ///<https://wowlab.gg/inspect/spell/1269885>
235    pub(crate) const DIABOLIC_GAZE_3: u32 = 1_269_885;
236    ///<https://wowlab.gg/inspect/spell/1265884>
237    pub(crate) const ECHO_OF_SARGERAS: u32 = 1_265_884;
238    ///<https://wowlab.gg/inspect/spell/1277879>
239    pub(crate) const ECHO_OF_SARGERAS_CB: u32 = 1_277_879;
240    ///<https://wowlab.gg/inspect/spell/1265774>
241    pub(crate) const ECHO_OF_SARGERAS_SB: u32 = 1_265_774;
242    ///<https://wowlab.gg/inspect/spell/1269800>
243    pub(crate) const EYE_EXPLOSION: u32 = 1_269_800;
244    ///<https://wowlab.gg/inspect/spell/434404>
245    pub(crate) const FELSEEKER: u32 = 434_404;
246    ///<https://wowlab.gg/inspect/spell/20153>
247    pub(crate) const IMMOLATION: u32 = 20153;
248    ///<https://wowlab.gg/inspect/spell/111685>
249    pub(crate) const INFERNAL_MELEE: u32 = 111_685;
250    ///<https://wowlab.gg/inspect/spell/7814>
251    pub(crate) const LASH_OF_PAIN: u32 = 7814;
252    ///<https://wowlab.gg/inspect/spell/432120>
253    pub(crate) const WICKED_CLEAVE: u32 = 432_120;
254}
255pub(crate) mod HERO {
256    pub(crate) mod HELLCALLER {
257        pub(crate) mod SPELL {
258            ///<https://wowlab.gg/inspect/spell/445736>
259            pub(crate) const BLACKENED_SOUL_DAMAGE: u32 = 445_736;
260            ///<https://wowlab.gg/inspect/spell/445731>
261            pub(crate) const BLACKENED_SOUL_TRIGGER: u32 = 445_731;
262            ///<https://wowlab.gg/inspect/spell/430014>
263            pub(crate) const MALEVOLENCE: u32 = 430_014;
264            ///<https://wowlab.gg/inspect/spell/446285>
265            pub(crate) const MALEVOLENCE_DAMAGE: u32 = 446_285;
266            ///<https://wowlab.gg/inspect/spell/445465>
267            pub(crate) const WITHER: u32 = 445_465;
268            ///<https://wowlab.gg/inspect/spell/445468>
269            pub(crate) const WITHER_DIRECT: u32 = 445_468;
270        }
271        pub(crate) mod AURA {
272            ///<https://wowlab.gg/inspect/spell/445731>
273            pub(crate) const BLACKENED_SOUL: u32 = 445_731;
274            ///<https://wowlab.gg/inspect/spell/442726>
275            pub(crate) const MALEVOLENCE_BUFF: u32 = 442_726;
276            ///<https://wowlab.gg/inspect/spell/445474>
277            pub(crate) const WITHER_DOT: u32 = 445_474;
278        }
279    }
280    pub(crate) mod DIABOLIST {
281        pub(crate) mod SPELL {
282            ///<https://wowlab.gg/inspect/spell/434506>
283            pub(crate) const INFERNAL_BOLT: u32 = 434_506;
284            ///<https://wowlab.gg/inspect/spell/434635>
285            pub(crate) const RUINATION: u32 = 434_635;
286            ///<https://wowlab.gg/inspect/spell/434636>
287            pub(crate) const RUINATION_IMPACT: u32 = 434_636;
288        }
289        pub(crate) mod AURA {
290            ///<https://wowlab.gg/inspect/spell/434424>
291            pub(crate) const CLOVEN_SOUL: u32 = 434_424;
292            ///<https://wowlab.gg/inspect/spell/432794>
293            pub(crate) const DEMONIC_ART_MOTHER: u32 = 432_794;
294            ///<https://wowlab.gg/inspect/spell/428524>
295            pub(crate) const DEMONIC_ART_OVERLORD: u32 = 428_524;
296            ///<https://wowlab.gg/inspect/spell/432795>
297            pub(crate) const DEMONIC_ART_PIT_LORD: u32 = 432_795;
298            ///<https://wowlab.gg/inspect/spell/1269643>
299            pub(crate) const DEMONIC_OCULI: u32 = 1_269_643;
300            ///<https://wowlab.gg/inspect/spell/432815>
301            pub(crate) const DIABOLIC_RITUAL_MOTHER: u32 = 432_815;
302            ///<https://wowlab.gg/inspect/spell/431944>
303            pub(crate) const DIABOLIC_RITUAL_OVERLORD: u32 = 431_944;
304            ///<https://wowlab.gg/inspect/spell/432816>
305            pub(crate) const DIABOLIC_RITUAL_PIT_LORD: u32 = 432_816;
306            ///<https://wowlab.gg/inspect/spell/433891>
307            pub(crate) const INFERNAL_BOLT_BUFF: u32 = 433_891;
308            ///<https://wowlab.gg/inspect/spell/1269879>
309            pub(crate) const MINDS_EYES: u32 = 1_269_879;
310            ///<https://wowlab.gg/inspect/spell/433885>
311            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    ///<https://wowlab.gg/inspect/spell/20153>
627    pub(crate) const IMMOLATION_DAMAGE: (u32, u8) = (20153, 1);
628    ///<https://wowlab.gg/inspect/spell/1296571>
629    pub(crate) const MID2_DESTRUCTION_2PC_INCINERATE: (u32, u8) = (1_296_571, 1);
630    ///<https://wowlab.gg/inspect/spell/1296571>
631    pub(crate) const MID2_DESTRUCTION_2PC_ECHO_CHANCE: (u32, u8) = (1_296_571, 2);
632    ///<https://wowlab.gg/inspect/spell/116858>
633    pub(crate) const CHAOS_BOLT_DAMAGE: (u32, u8) = (116_858, 1);
634    ///<https://wowlab.gg/inspect/spell/1265884>
635    pub(crate) const ECHO_OF_SARGERAS_DAMAGE: (u32, u8) = (1_265_884, 1);
636    ///<https://wowlab.gg/inspect/spell/7814>
637    pub(crate) const LASH_OF_PAIN_DAMAGE: (u32, u8) = (7814, 1);
638    ///<https://wowlab.gg/inspect/spell/42223>
639    pub(crate) const RAIN_OF_FIRE_DAMAGE: (u32, u8) = (42223, 1);
640    ///<https://wowlab.gg/inspect/spell/5740>
641    pub(crate) const RAIN_OF_FIRE_TIMING: (u32, u8) = (5740, 3);
642    ///<https://wowlab.gg/inspect/spell/432120>
643    pub(crate) const WICKED_CLEAVE_DAMAGE: (u32, u8) = (432_120, 1);
644    ///<https://wowlab.gg/inspect/spell/432596>
645    pub(crate) const CHAOS_SALVO_DAMAGE: (u32, u8) = (432_596, 1);
646    ///<https://wowlab.gg/inspect/spell/434404>
647    pub(crate) const FELSEEKER_DAMAGE: (u32, u8) = (434_404, 1);
648    ///<https://wowlab.gg/inspect/spell/1269800>
649    pub(crate) const EYE_EXPLOSION_DAMAGE: (u32, u8) = (1_269_800, 1);
650    ///<https://wowlab.gg/inspect/spell/1269892>
651    pub(crate) const DIABOLIC_GAZE_1_DAMAGE: (u32, u8) = (1_269_892, 1);
652    ///<https://wowlab.gg/inspect/spell/1269886>
653    pub(crate) const DIABOLIC_GAZE_2_DAMAGE: (u32, u8) = (1_269_886, 1);
654    ///<https://wowlab.gg/inspect/spell/1269885>
655    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, &params.game_data))
1742        .aura("backdraft", AURA::BACKDRAFT, |a| aura_backdraft(a, &params.game_data))
1743        .aura(
1744            "reverse_entropy",
1745            AURA::REVERSE_ENTROPY,
1746            |a| aura_reverse_entropy(a, &params.game_data),
1747        )
1748        .aura(
1749            "reverse_entropy_talent",
1750            AURA::REVERSE_ENTROPY_TALENT,
1751            |a| aura_reverse_entropy_talent(a, &params.game_data),
1752        )
1753        .aura("flashpoint", AURA::FLASHPOINT, |a| aura_flashpoint(a, &params.game_data))
1754        .aura(
1755            "fiendish_cruelty",
1756            AURA::FIENDISH_CRUELTY,
1757            |a| aura_fiendish_cruelty(a, &params.game_data),
1758        )
1759        .aura(
1760            "fiendish_cruelty_talent",
1761            AURA::FIENDISH_CRUELTY_TALENT,
1762            |a| aura_fiendish_cruelty_talent(a, &params.game_data),
1763        )
1764        .aura(
1765            "conflagration_of_chaos_talent",
1766            AURA::CONFLAGRATION_OF_CHAOS_TALENT,
1767            |a| aura_conflagration_of_chaos_talent(a, &params.game_data),
1768        )
1769        .aura(
1770            "chaotic_inferno",
1771            AURA::CHAOTIC_INFERNO,
1772            |a| aura_chaotic_inferno(a, &params.game_data),
1773        )
1774        .aura(
1775            "chaotic_inferno_talent",
1776            AURA::CHAOTIC_INFERNO_TALENT,
1777            |a| aura_chaotic_inferno_talent(a, &params.game_data),
1778        )
1779        .aura("havoc", AURA::HAVOC, |a| aura_havoc(a, &params.game_data))
1780        .aura(
1781            "ritual_of_ruin",
1782            AURA::RITUAL_OF_RUIN,
1783            |a| aura_ritual_of_ruin(a, &params.game_data),
1784        )
1785        .aura(
1786            "grimoire_of_sacrifice",
1787            AURA::GRIMOIRE_OF_SACRIFICE,
1788            |a| aura_grimoire_of_sacrifice(a, &params.game_data),
1789        )
1790        .aura("wither", AURA::WITHER, |a| aura_wither(a, &params.game_data))
1791        .aura(
1792            "malevolence",
1793            AURA::MALEVOLENCE,
1794            |a| aura_malevolence(a, &params.game_data),
1795        )
1796        .aura(
1797            "channel_demonfire",
1798            AURA::CHANNEL_DEMONFIRE,
1799            |a| aura_channel_demonfire(a, &params.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, &params.game_data),
1805        )
1806        .aura("track_pets", AURA::TRACK_PETS, |a| aura_track_pets(a, &params.game_data))
1807        .aura(
1808            "dark_titans_mark",
1809            AURA::DARK_TITANS_MARK,
1810            |a| aura_dark_titans_mark(a, &params.game_data),
1811        )
1812        .aura(
1813            "infernal_bolt",
1814            AURA::INFERNAL_BOLT,
1815            |a| aura_infernal_bolt(a, &params.game_data),
1816        )
1817        .aura("ruination", AURA::RUINATION, |a| aura_ruination(a, &params.game_data))
1818        .aura(
1819            "diabolic_ritual_talent",
1820            AURA::DIABOLIC_RITUAL_TALENT,
1821            |a| aura_diabolic_ritual_talent(a, &params.game_data),
1822        )
1823        .aura(
1824            "diabolic_ritual_overlord",
1825            AURA::DIABOLIC_RITUAL_OVERLORD,
1826            |a| aura_diabolic_ritual_overlord(a, &params.game_data),
1827        )
1828        .aura(
1829            "diabolic_ritual_mother",
1830            AURA::DIABOLIC_RITUAL_MOTHER,
1831            |a| aura_diabolic_ritual_mother(a, &params.game_data),
1832        )
1833        .aura(
1834            "diabolic_ritual_pit_lord",
1835            AURA::DIABOLIC_RITUAL_PIT_LORD,
1836            |a| aura_diabolic_ritual_pit_lord(a, &params.game_data),
1837        )
1838        .aura(
1839            "demonic_art_overlord",
1840            AURA::DEMONIC_ART_OVERLORD,
1841            |a| aura_demonic_art_overlord(a, &params.game_data),
1842        )
1843        .aura(
1844            "demonic_art_mother",
1845            AURA::DEMONIC_ART_MOTHER,
1846            |a| aura_demonic_art_mother(a, &params.game_data),
1847        )
1848        .aura(
1849            "demonic_art_pit_lord",
1850            AURA::DEMONIC_ART_PIT_LORD,
1851            |a| aura_demonic_art_pit_lord(a, &params.game_data),
1852        )
1853        .aura(
1854            "demonic_oculi",
1855            AURA::DEMONIC_OCULI,
1856            |a| aura_demonic_oculi(a, &params.game_data),
1857        )
1858        .aura(
1859            "diabolic_oculi_talent",
1860            AURA::DIABOLIC_OCULI_TALENT,
1861            |a| aura_diabolic_oculi_talent(a, &params.game_data),
1862        )
1863        .aura(
1864            "looks_that_kill_talent",
1865            AURA::LOOKS_THAT_KILL_TALENT,
1866            |a| aura_looks_that_kill_talent(a, &params.game_data),
1867        )
1868        .aura(
1869            "minds_eyes_talent",
1870            AURA::MINDS_EYES_TALENT,
1871            |a| aura_minds_eyes_talent(a, &params.game_data),
1872        )
1873        .aura("minds_eyes", AURA::MINDS_EYES, |a| aura_minds_eyes(a, &params.game_data))
1874        .aura("overfiend", AURA::OVERFIEND, |a| aura_overfiend(a, &params.game_data))
1875        .aura(
1876            "avatar_of_destruction_talent",
1877            AURA::AVATAR_OF_DESTRUCTION_TALENT,
1878            |a| aura_avatar_of_destruction_talent(a, &params.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, &params.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, &params.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, &params.game_data),
1894        )
1895        .aura(
1896            "vision_of_nihilam",
1897            AURA::VISION_OF_NIHILAM,
1898            |a| aura_vision_of_nihilam(a, &params.game_data),
1899        )
1900        .aura(
1901            "infernal_embers",
1902            AURA::INFERNAL_EMBERS,
1903            |a| aura_infernal_embers(a, &params.game_data),
1904        )
1905        .aura(
1906            "rain_of_chaos",
1907            AURA::RAIN_OF_CHAOS,
1908            |a| aura_rain_of_chaos(a, &params.game_data),
1909        )
1910        .aura(
1911            "crashing_chaos",
1912            AURA::CRASHING_CHAOS,
1913            |a| aura_crashing_chaos(a, &params.game_data),
1914        )
1915        .spell(
1916            "summon_felhunter",
1917            SPELL::SUMMON_FELHUNTER,
1918            |s| spell_summon_felhunter(s, &params.game_data),
1919        )
1920        .spell(
1921            "summon_imp",
1922            SPELL::SUMMON_IMP,
1923            |s| spell_summon_imp(s, &params.game_data),
1924        )
1925        .spell(
1926            "grimoire_of_sacrifice",
1927            SPELL::GRIMOIRE_OF_SACRIFICE,
1928            |s| spell_grimoire_of_sacrifice(s, &params.game_data),
1929        )
1930        .spell("immolate", SPELL::IMMOLATE, |s| spell_immolate(s, &params.game_data))
1931        .spell(
1932            "incinerate",
1933            SPELL::INCINERATE,
1934            |s| spell_incinerate(s, &params.game_data),
1935        )
1936        .spell(
1937            "conflagrate",
1938            SPELL::CONFLAGRATE,
1939            |s| spell_conflagrate(s, &params.game_data),
1940        )
1941        .spell(
1942            "chaos_bolt",
1943            SPELL::CHAOS_BOLT,
1944            |s| spell_chaos_bolt(s, &params.game_data),
1945        )
1946        .spell(
1947            "rain_of_fire",
1948            SPELL::RAIN_OF_FIRE,
1949            |s| spell_rain_of_fire(s, &params.game_data),
1950        )
1951        .spell(
1952            "shadowburn",
1953            SPELL::SHADOWBURN,
1954            |s| spell_shadowburn(s, &params.game_data),
1955        )
1956        .spell("soul_fire", SPELL::SOUL_FIRE, |s| spell_soul_fire(s, &params.game_data))
1957        .spell("cataclysm", SPELL::CATACLYSM, |s| spell_cataclysm(s, &params.game_data))
1958        .spell(
1959            "channel_demonfire",
1960            SPELL::CHANNEL_DEMONFIRE,
1961            |s| spell_channel_demonfire(s, &params.game_data),
1962        )
1963        .spell(
1964            "channel_demonfire_tick",
1965            SPELL::CHANNEL_DEMONFIRE_TICK,
1966            |s| spell_channel_demonfire_tick(s, &params.game_data),
1967        )
1968        .spell("havoc", SPELL::HAVOC, |s| spell_havoc(s, &params.game_data))
1969        .spell(
1970            "shadow_bolt",
1971            SPELL::SHADOW_BOLT,
1972            |s| spell_shadow_bolt(s, &params.game_data),
1973        )
1974        .spell(
1975            "corruption",
1976            SPELL::CORRUPTION,
1977            |s| spell_corruption(s, &params.game_data),
1978        )
1979        .spell(
1980            "malevolence",
1981            SPELL::MALEVOLENCE,
1982            |s| spell_malevolence(s, &params.game_data),
1983        )
1984        .spell(
1985            "drain_life",
1986            SPELL::DRAIN_LIFE,
1987            |s| spell_drain_life(s, &params.game_data),
1988        )
1989        .spell(
1990            "infernal_bolt",
1991            SPELL::INFERNAL_BOLT,
1992            |s| spell_infernal_bolt(s, &params.game_data),
1993        )
1994        .spell("ruination", SPELL::RUINATION, |s| spell_ruination(s, &params.game_data))
1995        .spell(
1996            "summon_infernal",
1997            SPELL::SUMMON_INFERNAL,
1998            |s| spell_summon_infernal(s, &params.game_data),
1999        )
2000        .auto_attack(|a| {
2001            a
2002                .spell_id(1)
2003                .swing_ms(3000)
2004                .apply_base_from_data(&params.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        &params.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        &params,
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);