1#![allow(non_snake_case, dead_code)]
4use wowlab_types::{combat::ResourceType, game::SpecId};
5use wowlab_engine_combat::{
6 CombatSystemBuilder, CombatSystemDraft, AuraDefinitionDraft, LocalAuraIdx,
7 LocalSpellIdx, SpellDefinitionDraft,
8};
9use wowlab_engine_ports::{
10 DeclaredSpecMetadata, SpecDescriptor, SpecHandler, HeroTalentTreeDesc,
11};
12use wowlab_engine_gamedata::ResolvedGameData;
13pub(crate) mod SPELL {
14 pub(crate) const SHADOW_BOLT: u32 = 686;
16 pub(crate) const DEMONBOLT: u32 = 264_178;
18 pub(crate) const HAND_OF_GULDAN: u32 = 105_174;
20 pub(crate) const POWER_SIPHON: u32 = 334_581;
22 pub(crate) const DRAIN_LIFE: u32 = 234_153;
24 pub(crate) const SUMMON_FELGUARD: u32 = 30146;
26 pub(crate) const SUMMON_FELHUNTER: u32 = 691;
28 pub(crate) const SUMMON_IMP: u32 = 688;
30 pub(crate) const CALL_DREADSTALKERS: u32 = 104_316;
32 pub(crate) const SUMMON_DEMONIC_TYRANT: u32 = 265_187;
34 pub(crate) const SUMMON_VILEFIEND: u32 = 264_119;
36 pub(crate) const IMPLOSION: u32 = 196_277;
38 pub(crate) const GRIMOIRE_IMP_LORD: u32 = 1_276_452;
40 pub(crate) const GRIMOIRE_FEL_RAVAGER: u32 = 1_276_467;
42 pub(crate) const SUMMON_DOOMGUARD: u32 = 1_276_672;
44 pub(crate) const INFERNAL_BOLT: u32 = 434_506;
46 pub(crate) const RUINATION: u32 = 434_635;
48}
49pub(crate) mod AURA {
50 pub(crate) const DEMONIC_CORE: u32 = 264_173;
52 pub(crate) const CARNIVOROUS_STALKERS_TALENT: u32 = 386_194;
54 pub(crate) const POWER_SIPHON: u32 = 334_581;
56 pub(crate) const DOOM: u32 = 460_553;
58 pub(crate) const TYRANTS_OBLATION: u32 = 1_276_767;
60 pub(crate) const HELLBENT_COMMANDER: u32 = 1_281_559;
62 pub(crate) const INNER_DEMONS: u32 = 267_216;
64 pub(crate) const DOMINION_OF_ARGUS: u32 = 1_276_166;
66 pub(crate) const SUCCULENT_SOUL: u32 = 449_793;
68 pub(crate) const MANIFESTED_DEMONIC_SOUL: u32 = 1_269_042;
70 pub(crate) const GRIMOIRE_OF_SACRIFICE: u32 = 196_099;
72 pub(crate) const WILD_IMPS: u32 = 104_317;
74 pub(crate) const DREADSTALKERS: u32 = 193_332;
76 pub(crate) const TRACK_PETS: u32 = 462_599;
78 pub(crate) const FLAMETOUCHED_TALENT: u32 = 453_699;
80 pub(crate) const INFERNAL_BOLT: u32 = 433_891;
82 pub(crate) const RUINATION: u32 = 433_885;
84 pub(crate) const DIABOLIC_RITUAL_TALENT: u32 = 428_514;
86 pub(crate) const DIABOLIC_RITUAL_OVERLORD: u32 = 431_944;
88 pub(crate) const DIABOLIC_RITUAL_MOTHER: u32 = 432_815;
90 pub(crate) const DIABOLIC_RITUAL_PIT_LORD: u32 = 432_816;
92 pub(crate) const DEMONIC_ART_OVERLORD: u32 = 428_524;
94 pub(crate) const DEMONIC_ART_MOTHER: u32 = 432_794;
96 pub(crate) const DEMONIC_ART_PIT_LORD: u32 = 432_795;
98 pub(crate) const DEMONIC_OCULI: u32 = 1_269_643;
100 pub(crate) const DIABOLIC_OCULI_TALENT: u32 = 1_268_709;
102 pub(crate) const LOOKS_THAT_KILL_TALENT: u32 = 1_268_713;
104 pub(crate) const MINDS_EYES_TALENT: u32 = 1_268_716;
106 pub(crate) const MINDS_EYES: u32 = 1_269_879;
108 pub(crate) const ABYSSAL_DOMINION: u32 = 456_323;
110 pub(crate) const ABYSSAL_DOMINION_TALENT: u32 = 429_581;
112 pub(crate) const CLOVEN_SOUL: u32 = 434_424;
114}
115pub(crate) mod TALENT {
116 pub(crate) const ABYSSAL_DOMINION_TALENT: u32 = 429_581;
118 pub(crate) const ANTORAN_ARMAMENTS: u32 = 1_250_921;
120 pub(crate) const BLIGHTED_MAW: u32 = 1_276_956;
122 pub(crate) const CALL_DREADSTALKERS: u32 = 104_316;
124 pub(crate) const CARNIVOROUS_STALKERS: u32 = 386_194;
126 pub(crate) const DEMONIAC: u32 = 426_115;
128 pub(crate) const DEMONIC_BRUTALITY: u32 = 453_908;
130 pub(crate) const DEMONIC_CALLING: u32 = 1_276_947;
132 pub(crate) const DEMONIC_KNOWLEDGE: u32 = 386_185;
134 pub(crate) const DIABOLIC_OCULI: u32 = 1_268_709;
136 pub(crate) const DIABOLIC_RITUAL: u32 = 428_514;
138 pub(crate) const DOMINION_OF_ARGUS: u32 = 1_276_163;
140 pub(crate) const DOMINION_OF_ARGUS_2: u32 = 1_276_190;
142 pub(crate) const DOMINION_OF_ARGUS_3: u32 = 1_276_222;
144 pub(crate) const DOOM: u32 = 460_551;
146 pub(crate) const DREADLASH: u32 = 264_078;
148 pub(crate) const FLAMETOUCHED: u32 = 453_699;
150 pub(crate) const GLOOM_OF_NATHREZA: u32 = 429_899;
152 pub(crate) const GRIMOIRE_FEL_RAVAGER: u32 = 1_276_467;
154 pub(crate) const GRIMOIRE_IMP_LORD: u32 = 1_276_452;
156 pub(crate) const HAND_OF_GULDAN: u32 = 1_250_273;
158 pub(crate) const HELLBENT_COMMANDER: u32 = 1_250_897;
160 pub(crate) const IMPLOSION: u32 = 196_277;
162 pub(crate) const IMP_GANG_BOSS: u32 = 1_250_768;
164 pub(crate) const INFERNAL_RAPIDITY: u32 = 1_263_941;
166 pub(crate) const INNER_DEMONS: u32 = 267_216;
168 pub(crate) const LOOKS_THAT_KILL: u32 = 1_268_713;
170 pub(crate) const MARK_OF_SHATUG: u32 = 455_449;
172 pub(crate) const MINDS_EYES: u32 = 1_268_716;
174 pub(crate) const POWER_SIPHON: u32 = 264_130;
176 pub(crate) const REIGN_OF_TYRANNY: u32 = 1_276_748;
178 pub(crate) const SACRIFICED_SOULS: u32 = 267_214;
180 pub(crate) const SPITEFUL_RECONSTITUTION: u32 = 428_394;
182 pub(crate) const SUMMON_DEMONIC_TYRANT: u32 = 265_187;
184 pub(crate) const SUMMON_DOOMGUARD: u32 = 1_276_672;
186 pub(crate) const SUMMON_VILEFIEND: u32 = 1_251_778;
188 pub(crate) const SUMMON_VILEFIEND_CASTABLE: u32 = 264_119;
190 pub(crate) const TO_HELL_AND_BACK: u32 = 1_281_511;
192 pub(crate) const TYRANTS_OBLATION: u32 = 1_276_746;
194}
195pub(crate) mod SET_BONUS {
196 pub(crate) const MID2_DEMONOLOGY_2PC: u32 = 1_296_573;
198 pub(crate) const MID2_DEMONOLOGY_4PC: u32 = 1_296_574;
200}
201pub(crate) mod REPORTED_SPELL {
202 pub(crate) const ANTORAN_INQUISITOR: u32 = 1_276_283;
204 pub(crate) const ANTORAN_JAILER: u32 = 1_276_182;
206 pub(crate) const BILE_SPIT: u32 = 267_997;
208 pub(crate) const BLAZE_MISSILE: u32 = 1_282_534;
210 pub(crate) const BLIGHTED_MAW: u32 = 1_276_960;
212 pub(crate) const BURNING_CLEAVE: u32 = 1_264_093;
214 pub(crate) const CHAOS_SALVO: u32 = 432_596;
216 pub(crate) const DIABOLIC_GAZE_1: u32 = 1_269_892;
218 pub(crate) const DIABOLIC_GAZE_2: u32 = 1_269_886;
220 pub(crate) const DIABOLIC_GAZE_3: u32 = 1_269_885;
222 pub(crate) const DREADBITE: u32 = 271_971;
224 pub(crate) const DREADSTALKER_MELEE: u32 = 193_332;
226 pub(crate) const EYE_EXPLOSION: u32 = 1_269_800;
228 pub(crate) const FELSEEKER: u32 = 434_404;
230 pub(crate) const FELSTORM: u32 = 89753;
232 pub(crate) const FEL_FIREBOLT: u32 = 104_318;
234 pub(crate) const GLOOM_SLASH: u32 = 455_491;
236 pub(crate) const GRAND_WARLOCK_ALYTHESS: u32 = 1_282_502;
238 pub(crate) const HAND_OF_GULDAN_IMPACT: u32 = 86040;
240 pub(crate) const HEADBUTT: u32 = 267_999;
242 pub(crate) const ISOLATED_IMPLOSION: u32 = 1_306_077;
244 pub(crate) const ISOLATED_IMPLOSION_DRIVER: u32 = 1_309_535;
246 pub(crate) const LADY_SACROLASH: u32 = 1_282_501;
248 pub(crate) const LEGION_STRIKE: u32 = 30213;
250 pub(crate) const MIND_SEAR_CHANNEL: u32 = 1_280_460;
252 pub(crate) const SHADOW_NOVA: u32 = 1_282_507;
254 pub(crate) const SOUL_BARRAGE_CAST: u32 = 1_292_391;
256 pub(crate) const UNSTABLE_GANG_BOSS: u32 = 1_281_512;
258 pub(crate) const VILEFIEND: u32 = 1_251_781;
260 pub(crate) const WICKED_CLEAVE: u32 = 432_120;
262}
263pub(crate) mod HERO {
264 pub(crate) mod SOUL_HARVESTER {
265 pub(crate) mod SPELL {
266 pub(crate) const DEMONIC_SOUL_DAMAGE: u32 = 449_801;
268 pub(crate) const SHADOW_OF_DEATH_ENERGIZE: u32 = 449_858;
270 pub(crate) const SHARED_FATE: u32 = 450_591;
272 pub(crate) const SOUL_ANATHEMA: u32 = 450_538;
274 pub(crate) const WICKED_REAPING: u32 = 449_826;
276 }
277 pub(crate) mod AURA {
278 pub(crate) const MANIFESTED_DEMONIC_SOUL: u32 = 1_269_042;
280 pub(crate) const SUCCULENT_SOUL: u32 = 449_793;
282 }
283 }
284 pub(crate) mod DIABOLIST {
285 pub(crate) mod SPELL {
286 pub(crate) const INFERNAL_BOLT: u32 = 434_506;
288 pub(crate) const RUINATION: u32 = 434_635;
290 pub(crate) const RUINATION_IMPACT: u32 = 434_636;
292 }
293 pub(crate) mod AURA {
294 pub(crate) const ABYSSAL_DOMINION: u32 = 456_323;
296 pub(crate) const CLOVEN_SOUL: u32 = 434_424;
298 pub(crate) const DEMONIC_ART_MOTHER: u32 = 432_794;
300 pub(crate) const DEMONIC_ART_OVERLORD: u32 = 428_524;
302 pub(crate) const DEMONIC_ART_PIT_LORD: u32 = 432_795;
304 pub(crate) const DEMONIC_OCULI: u32 = 1_269_643;
306 pub(crate) const DIABOLIC_RITUAL_MOTHER: u32 = 432_815;
308 pub(crate) const DIABOLIC_RITUAL_OVERLORD: u32 = 431_944;
310 pub(crate) const DIABOLIC_RITUAL_PIT_LORD: u32 = 432_816;
312 pub(crate) const INFERNAL_BOLT_BUFF: u32 = 433_891;
314 pub(crate) const MINDS_EYES: u32 = 1_269_879;
316 pub(crate) const RUINATION_BUFF: u32 = 433_885;
318 }
319 }
320}
321static HERO_TREE_SOUL_HARVESTER_SPELLS: &[(&str, u32)] = &[
322 ("DEMONIC_SOUL_DAMAGE", 449_801),
323 ("SHADOW_OF_DEATH_ENERGIZE", 449_858),
324 ("SHARED_FATE", 450_591),
325 ("SOUL_ANATHEMA", 450_538),
326 ("WICKED_REAPING", 449_826),
327];
328static HERO_TREE_SOUL_HARVESTER_AURAS: &[(&str, u32)] = &[
329 ("MANIFESTED_DEMONIC_SOUL", 1_269_042),
330 ("SUCCULENT_SOUL", 449_793),
331];
332static HERO_TREE_DIABOLIST_SPELLS: &[(&str, u32)] = &[
333 ("INFERNAL_BOLT", 434_506),
334 ("RUINATION", 434_635),
335 ("RUINATION_IMPACT", 434_636),
336];
337static HERO_TREE_DIABOLIST_AURAS: &[(&str, u32)] = &[
338 ("ABYSSAL_DOMINION", 456_323),
339 ("CLOVEN_SOUL", 434_424),
340 ("DEMONIC_ART_MOTHER", 432_794),
341 ("DEMONIC_ART_OVERLORD", 428_524),
342 ("DEMONIC_ART_PIT_LORD", 432_795),
343 ("DEMONIC_OCULI", 1_269_643),
344 ("DIABOLIC_RITUAL_MOTHER", 432_815),
345 ("DIABOLIC_RITUAL_OVERLORD", 431_944),
346 ("DIABOLIC_RITUAL_PIT_LORD", 432_816),
347 ("INFERNAL_BOLT_BUFF", 433_891),
348 ("MINDS_EYES", 1_269_879),
349 ("RUINATION_BUFF", 433_885),
350];
351pub(crate) mod DAMAGE_SPELL {
352 pub(crate) const SHADOW_BOLT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_686;
353 pub(crate) const DEMONBOLT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_264178;
354 pub(crate) const HAND_OF_GULDAN: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_105174;
355 pub(crate) const POWER_SIPHON: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_334581;
356 pub(crate) const DRAIN_LIFE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_234153;
357 pub(crate) const SUMMON_FELGUARD: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_30146;
358 pub(crate) const SUMMON_FELHUNTER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_691;
359 pub(crate) const SUMMON_IMP: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_688;
360 pub(crate) const CALL_DREADSTALKERS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_104316;
361 pub(crate) const SUMMON_DEMONIC_TYRANT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_265187;
362 pub(crate) const SUMMON_VILEFIEND: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_264119;
363 pub(crate) const IMPLOSION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_196277;
364 pub(crate) const GRIMOIRE_IMP_LORD: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_1276452;
365 pub(crate) const GRIMOIRE_FEL_RAVAGER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_1276467;
366 pub(crate) const SUMMON_DOOMGUARD: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_1276672;
367 pub(crate) const INFERNAL_BOLT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_434506;
368 pub(crate) const RUINATION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_434635;
369 pub(crate) const DEMONIC_SOUL_DAMAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_449801;
370 pub(crate) const SHADOW_OF_DEATH_ENERGIZE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_449858;
371 pub(crate) const SHARED_FATE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_450591;
372 pub(crate) const SOUL_ANATHEMA: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_450538;
373 pub(crate) const WICKED_REAPING: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_449826;
374 pub(crate) const RUINATION_IMPACT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_434636;
375}
376pub(crate) mod DAMAGE_AURA {
377 pub(crate) const DEMONIC_CORE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_264173;
378 pub(crate) const CARNIVOROUS_STALKERS_TALENT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_386194;
379 pub(crate) const POWER_SIPHON: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_334581;
380 pub(crate) const DOOM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_460553;
381 pub(crate) const TYRANTS_OBLATION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_1276767;
382 pub(crate) const HELLBENT_COMMANDER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_1281559;
383 pub(crate) const INNER_DEMONS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_267216;
384 pub(crate) const DOMINION_OF_ARGUS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_1276166;
385 pub(crate) const SUCCULENT_SOUL: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_449793;
386 pub(crate) const MANIFESTED_DEMONIC_SOUL: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_1269042;
387 pub(crate) const GRIMOIRE_OF_SACRIFICE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_196099;
388 pub(crate) const WILD_IMPS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_104317;
389 pub(crate) const DREADSTALKERS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_193332;
390 pub(crate) const TRACK_PETS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_462599;
391 pub(crate) const FLAMETOUCHED_TALENT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_453699;
392 pub(crate) const INFERNAL_BOLT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_433891;
393 pub(crate) const RUINATION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_433885;
394 pub(crate) const DIABOLIC_RITUAL_TALENT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_428514;
395 pub(crate) const DIABOLIC_RITUAL_OVERLORD: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_431944;
396 pub(crate) const DIABOLIC_RITUAL_MOTHER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_432815;
397 pub(crate) const DIABOLIC_RITUAL_PIT_LORD: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_432816;
398 pub(crate) const DEMONIC_ART_OVERLORD: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_428524;
399 pub(crate) const DEMONIC_ART_MOTHER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_432794;
400 pub(crate) const DEMONIC_ART_PIT_LORD: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_432795;
401 pub(crate) const DEMONIC_OCULI: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_1269643;
402 pub(crate) const DIABOLIC_OCULI_TALENT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_1268709;
403 pub(crate) const LOOKS_THAT_KILL_TALENT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_1268713;
404 pub(crate) const MINDS_EYES_TALENT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_1268716;
405 pub(crate) const MINDS_EYES: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_1269879;
406 pub(crate) const ABYSSAL_DOMINION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_456323;
407 pub(crate) const ABYSSAL_DOMINION_TALENT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_429581;
408 pub(crate) const CLOVEN_SOUL: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_434424;
409}
410pub(crate) mod DAMAGE_TALENT {
411 pub(crate) const ABYSSAL_DOMINION_TALENT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_429581;
412 pub(crate) const ANTORAN_ARMAMENTS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_1250921;
413 pub(crate) const BLIGHTED_MAW: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_1276956;
414 pub(crate) const CALL_DREADSTALKERS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_104316;
415 pub(crate) const CARNIVOROUS_STALKERS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_386194;
416 pub(crate) const DEMONIAC: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_426115;
417 pub(crate) const DEMONIC_BRUTALITY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_453908;
418 pub(crate) const DEMONIC_CALLING: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_1276947;
419 pub(crate) const DEMONIC_KNOWLEDGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_386185;
420 pub(crate) const DIABOLIC_OCULI: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_1268709;
421 pub(crate) const DIABOLIC_RITUAL: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_428514;
422 pub(crate) const DOMINION_OF_ARGUS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_1276163;
423 pub(crate) const DOMINION_OF_ARGUS_2: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_1276190;
424 pub(crate) const DOMINION_OF_ARGUS_3: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_1276222;
425 pub(crate) const DOOM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_460551;
426 pub(crate) const DREADLASH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_264078;
427 pub(crate) const FLAMETOUCHED: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_453699;
428 pub(crate) const GLOOM_OF_NATHREZA: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_429899;
429 pub(crate) const GRIMOIRE_FEL_RAVAGER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_1276467;
430 pub(crate) const GRIMOIRE_IMP_LORD: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_1276452;
431 pub(crate) const HAND_OF_GULDAN: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_1250273;
432 pub(crate) const HELLBENT_COMMANDER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_1250897;
433 pub(crate) const IMPLOSION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_196277;
434 pub(crate) const IMP_GANG_BOSS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_1250768;
435 pub(crate) const INFERNAL_RAPIDITY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_1263941;
436 pub(crate) const INNER_DEMONS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_267216;
437 pub(crate) const LOOKS_THAT_KILL: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_1268713;
438 pub(crate) const MARK_OF_SHATUG: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_455449;
439 pub(crate) const MINDS_EYES: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_1268716;
440 pub(crate) const POWER_SIPHON: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_264130;
441 pub(crate) const REIGN_OF_TYRANNY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_1276748;
442 pub(crate) const SACRIFICED_SOULS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_267214;
443 pub(crate) const SPITEFUL_RECONSTITUTION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_428394;
444 pub(crate) const SUMMON_DEMONIC_TYRANT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_265187;
445 pub(crate) const SUMMON_DOOMGUARD: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_1276672;
446 pub(crate) const SUMMON_VILEFIEND: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_1251778;
447 pub(crate) const SUMMON_VILEFIEND_CASTABLE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_264119;
448 pub(crate) const TO_HELL_AND_BACK: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_1281511;
449 pub(crate) const TYRANTS_OBLATION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_1276746;
450}
451pub(crate) mod DAMAGE_REPORTED {
452 pub(crate) const ANTORAN_INQUISITOR: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_1276283;
453 pub(crate) const ANTORAN_JAILER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_1276182;
454 pub(crate) const BILE_SPIT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_267997;
455 pub(crate) const BLAZE_MISSILE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_1282534;
456 pub(crate) const BLIGHTED_MAW: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_1276960;
457 pub(crate) const BURNING_CLEAVE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_1264093;
458 pub(crate) const CHAOS_SALVO: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_432596;
459 pub(crate) const DIABOLIC_GAZE_1: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_1269892;
460 pub(crate) const DIABOLIC_GAZE_2: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_1269886;
461 pub(crate) const DIABOLIC_GAZE_3: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_1269885;
462 pub(crate) const DREADBITE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_271971;
463 pub(crate) const DREADSTALKER_MELEE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_193332;
464 pub(crate) const EYE_EXPLOSION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_1269800;
465 pub(crate) const FELSEEKER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_434404;
466 pub(crate) const FELSTORM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_89753;
467 pub(crate) const FEL_FIREBOLT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_104318;
468 pub(crate) const GLOOM_SLASH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_455491;
469 pub(crate) const GRAND_WARLOCK_ALYTHESS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_1282502;
470 pub(crate) const HAND_OF_GULDAN_IMPACT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_86040;
471 pub(crate) const HEADBUTT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_267999;
472 pub(crate) const ISOLATED_IMPLOSION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_1306077;
473 pub(crate) const ISOLATED_IMPLOSION_DRIVER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_1309535;
474 pub(crate) const LADY_SACROLASH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_1282501;
475 pub(crate) const LEGION_STRIKE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_30213;
476 pub(crate) const MIND_SEAR_CHANNEL: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_1280460;
477 pub(crate) const SHADOW_NOVA: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_1282507;
478 pub(crate) const SOUL_BARRAGE_CAST: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_1292391;
479 pub(crate) const UNSTABLE_GANG_BOSS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_1281512;
480 pub(crate) const VILEFIEND: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_1251781;
481 pub(crate) const WICKED_CLEAVE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ACTION::SPELL_432120;
482}
483pub(crate) mod DAMAGE_EFFECT {
484 pub(crate) const BURNING_CLEAVE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::EFFECT::SPELL_1264093_EFFECT_1;
485 pub(crate) const FEL_FIREBOLT_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::EFFECT::SPELL_104318_EFFECT_1;
486 pub(crate) const SHADOW_NOVA_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::EFFECT::SPELL_1282507_EFFECT_1;
487 pub(crate) const BLAZE_MISSILE_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::EFFECT::SPELL_1282534_EFFECT_1;
488 pub(crate) const MIND_SEAR_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::EFFECT::SPELL_1280460_EFFECT_2;
489 pub(crate) const SOUL_BARRAGE_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::EFFECT::SPELL_1292391_EFFECT_1;
490 pub(crate) const HAND_OF_GULDAN_IMPACT_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::EFFECT::SPELL_86040_EFFECT_1;
491 pub(crate) const BILE_SPIT_DIRECT_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::EFFECT::SPELL_267997_EFFECT_1;
492 pub(crate) const BILE_SPIT_TICK_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::EFFECT::SPELL_267997_EFFECT_2;
493 pub(crate) const HEADBUTT_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::EFFECT::SPELL_267999_EFFECT_1;
494 pub(crate) const GLOOM_SLASH_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::EFFECT::SPELL_455491_EFFECT_1;
495 pub(crate) const LEGION_STRIKE_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::EFFECT::SPELL_30213_EFFECT_1;
496 pub(crate) const FELSTORM_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::EFFECT::SPELL_89753_EFFECT_1;
497 pub(crate) const DREADBITE_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::EFFECT::SPELL_271971_EFFECT_1;
498 pub(crate) const DEMONIC_CORE_IMP_CHANCE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::EFFECT::SPELL_267102_EFFECT_1;
499 pub(crate) const IMPLOSION_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::EFFECT::SPELL_196278_EFFECT_1;
500 pub(crate) const MID2_DEMONOLOGY_2PC_IMP: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::EFFECT::SPELL_1296573_EFFECT_1;
501 pub(crate) const MID2_DEMONOLOGY_2PC_IMPLOSION: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::EFFECT::SPELL_1296573_EFFECT_2;
502 pub(crate) const MID2_DEMONOLOGY_4PC_MAIN: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::EFFECT::SPELL_1296574_EFFECT_1;
503 pub(crate) const MID2_DEMONOLOGY_4PC_SECONDARY: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::EFFECT::SPELL_1296574_EFFECT_2;
504 pub(crate) const MID2_DEMONOLOGY_4PC_CHANCE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::EFFECT::SPELL_1296574_EFFECT_3;
505 pub(crate) const WICKED_CLEAVE_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::EFFECT::SPELL_432120_EFFECT_1;
506 pub(crate) const CHAOS_SALVO_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::EFFECT::SPELL_432596_EFFECT_1;
507 pub(crate) const FELSEEKER_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::EFFECT::SPELL_434404_EFFECT_1;
508 pub(crate) const EYE_EXPLOSION_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::EFFECT::SPELL_1269800_EFFECT_1;
509 pub(crate) const DIABOLIC_GAZE_1_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::EFFECT::SPELL_1269892_EFFECT_1;
510 pub(crate) const DIABOLIC_GAZE_2_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::EFFECT::SPELL_1269886_EFFECT_1;
511 pub(crate) const DIABOLIC_GAZE_3_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::EFFECT::SPELL_1269885_EFFECT_1;
512}
513pub(crate) const AURA_DEMONIC_CORE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::demonology_warlock::AURA_DEMONIC_CORE
514 .bind(wowlab_engine_combat::generated_identities::specs::demonology_warlock::PROOF);
515pub(crate) const AURA_CARNIVOROUS_STALKERS_TALENT: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::demonology_warlock::AURA_CARNIVOROUS_STALKERS_TALENT
516 .bind(wowlab_engine_combat::generated_identities::specs::demonology_warlock::PROOF);
517pub(crate) const AURA_POWER_SIPHON: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::demonology_warlock::AURA_POWER_SIPHON
518 .bind(wowlab_engine_combat::generated_identities::specs::demonology_warlock::PROOF);
519pub(crate) const AURA_DOOM: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::demonology_warlock::AURA_DOOM
520 .bind(wowlab_engine_combat::generated_identities::specs::demonology_warlock::PROOF);
521pub(crate) const AURA_TYRANTS_OBLATION: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::demonology_warlock::AURA_TYRANTS_OBLATION
522 .bind(wowlab_engine_combat::generated_identities::specs::demonology_warlock::PROOF);
523pub(crate) const AURA_HELLBENT_COMMANDER: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::demonology_warlock::AURA_HELLBENT_COMMANDER
524 .bind(wowlab_engine_combat::generated_identities::specs::demonology_warlock::PROOF);
525pub(crate) const AURA_INNER_DEMONS: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::demonology_warlock::AURA_INNER_DEMONS
526 .bind(wowlab_engine_combat::generated_identities::specs::demonology_warlock::PROOF);
527pub(crate) const AURA_DOMINION_OF_ARGUS: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::demonology_warlock::AURA_DOMINION_OF_ARGUS
528 .bind(wowlab_engine_combat::generated_identities::specs::demonology_warlock::PROOF);
529pub(crate) const AURA_SUCCULENT_SOUL: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::demonology_warlock::AURA_SUCCULENT_SOUL
530 .bind(wowlab_engine_combat::generated_identities::specs::demonology_warlock::PROOF);
531pub(crate) const AURA_MANIFESTED_DEMONIC_SOUL: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::demonology_warlock::AURA_MANIFESTED_DEMONIC_SOUL
532 .bind(wowlab_engine_combat::generated_identities::specs::demonology_warlock::PROOF);
533pub(crate) const AURA_GRIMOIRE_OF_SACRIFICE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::demonology_warlock::AURA_GRIMOIRE_OF_SACRIFICE
534 .bind(wowlab_engine_combat::generated_identities::specs::demonology_warlock::PROOF);
535pub(crate) const AURA_WILD_IMPS: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::demonology_warlock::AURA_WILD_IMPS
536 .bind(wowlab_engine_combat::generated_identities::specs::demonology_warlock::PROOF);
537pub(crate) const AURA_DREADSTALKERS: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::demonology_warlock::AURA_DREADSTALKERS
538 .bind(wowlab_engine_combat::generated_identities::specs::demonology_warlock::PROOF);
539pub(crate) const AURA_TRACK_PETS: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::demonology_warlock::AURA_TRACK_PETS
540 .bind(wowlab_engine_combat::generated_identities::specs::demonology_warlock::PROOF);
541pub(crate) const AURA_FLAMETOUCHED_TALENT: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::demonology_warlock::AURA_FLAMETOUCHED_TALENT
542 .bind(wowlab_engine_combat::generated_identities::specs::demonology_warlock::PROOF);
543pub(crate) const AURA_INFERNAL_BOLT: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::demonology_warlock::AURA_INFERNAL_BOLT
544 .bind(wowlab_engine_combat::generated_identities::specs::demonology_warlock::PROOF);
545pub(crate) const AURA_RUINATION: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::demonology_warlock::AURA_RUINATION
546 .bind(wowlab_engine_combat::generated_identities::specs::demonology_warlock::PROOF);
547pub(crate) const AURA_DIABOLIC_RITUAL_TALENT: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::demonology_warlock::AURA_DIABOLIC_RITUAL_TALENT
548 .bind(wowlab_engine_combat::generated_identities::specs::demonology_warlock::PROOF);
549pub(crate) const AURA_DIABOLIC_RITUAL_OVERLORD: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::demonology_warlock::AURA_DIABOLIC_RITUAL_OVERLORD
550 .bind(wowlab_engine_combat::generated_identities::specs::demonology_warlock::PROOF);
551pub(crate) const AURA_DIABOLIC_RITUAL_MOTHER: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::demonology_warlock::AURA_DIABOLIC_RITUAL_MOTHER
552 .bind(wowlab_engine_combat::generated_identities::specs::demonology_warlock::PROOF);
553pub(crate) const AURA_DIABOLIC_RITUAL_PIT_LORD: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::demonology_warlock::AURA_DIABOLIC_RITUAL_PIT_LORD
554 .bind(wowlab_engine_combat::generated_identities::specs::demonology_warlock::PROOF);
555pub(crate) const AURA_DEMONIC_ART_OVERLORD: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::demonology_warlock::AURA_DEMONIC_ART_OVERLORD
556 .bind(wowlab_engine_combat::generated_identities::specs::demonology_warlock::PROOF);
557pub(crate) const AURA_DEMONIC_ART_MOTHER: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::demonology_warlock::AURA_DEMONIC_ART_MOTHER
558 .bind(wowlab_engine_combat::generated_identities::specs::demonology_warlock::PROOF);
559pub(crate) const AURA_DEMONIC_ART_PIT_LORD: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::demonology_warlock::AURA_DEMONIC_ART_PIT_LORD
560 .bind(wowlab_engine_combat::generated_identities::specs::demonology_warlock::PROOF);
561pub(crate) const AURA_DEMONIC_OCULI: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::demonology_warlock::AURA_DEMONIC_OCULI
562 .bind(wowlab_engine_combat::generated_identities::specs::demonology_warlock::PROOF);
563pub(crate) const AURA_DIABOLIC_OCULI_TALENT: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::demonology_warlock::AURA_DIABOLIC_OCULI_TALENT
564 .bind(wowlab_engine_combat::generated_identities::specs::demonology_warlock::PROOF);
565pub(crate) const AURA_LOOKS_THAT_KILL_TALENT: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::demonology_warlock::AURA_LOOKS_THAT_KILL_TALENT
566 .bind(wowlab_engine_combat::generated_identities::specs::demonology_warlock::PROOF);
567pub(crate) const AURA_MINDS_EYES_TALENT: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::demonology_warlock::AURA_MINDS_EYES_TALENT
568 .bind(wowlab_engine_combat::generated_identities::specs::demonology_warlock::PROOF);
569pub(crate) const AURA_MINDS_EYES: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::demonology_warlock::AURA_MINDS_EYES
570 .bind(wowlab_engine_combat::generated_identities::specs::demonology_warlock::PROOF);
571pub(crate) const AURA_ABYSSAL_DOMINION: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::demonology_warlock::AURA_ABYSSAL_DOMINION
572 .bind(wowlab_engine_combat::generated_identities::specs::demonology_warlock::PROOF);
573pub(crate) const AURA_ABYSSAL_DOMINION_TALENT: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::demonology_warlock::AURA_ABYSSAL_DOMINION_TALENT
574 .bind(wowlab_engine_combat::generated_identities::specs::demonology_warlock::PROOF);
575pub(crate) const AURA_CLOVEN_SOUL: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::demonology_warlock::AURA_CLOVEN_SOUL
576 .bind(wowlab_engine_combat::generated_identities::specs::demonology_warlock::PROOF);
577pub(crate) const AURA_COUNT: usize = 32;
578const _: () = assert!(
579 AURA_COUNT == 32, "AURA index ABI: count changed -- update positional hook consumers"
580);
581pub(crate) const SPELL_SHADOW_BOLT: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::demonology_warlock::SPELL_SHADOW_BOLT
582 .bind(wowlab_engine_combat::generated_identities::specs::demonology_warlock::PROOF);
583pub(crate) const SPELL_DEMONBOLT: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::demonology_warlock::SPELL_DEMONBOLT
584 .bind(wowlab_engine_combat::generated_identities::specs::demonology_warlock::PROOF);
585pub(crate) const SPELL_HAND_OF_GULDAN: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::demonology_warlock::SPELL_HAND_OF_GULDAN
586 .bind(wowlab_engine_combat::generated_identities::specs::demonology_warlock::PROOF);
587pub(crate) const SPELL_POWER_SIPHON: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::demonology_warlock::SPELL_POWER_SIPHON
588 .bind(wowlab_engine_combat::generated_identities::specs::demonology_warlock::PROOF);
589pub(crate) const SPELL_DRAIN_LIFE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::demonology_warlock::SPELL_DRAIN_LIFE
590 .bind(wowlab_engine_combat::generated_identities::specs::demonology_warlock::PROOF);
591pub(crate) const SPELL_SUMMON_FELGUARD: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::demonology_warlock::SPELL_SUMMON_FELGUARD
592 .bind(wowlab_engine_combat::generated_identities::specs::demonology_warlock::PROOF);
593pub(crate) const SPELL_SUMMON_FELHUNTER: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::demonology_warlock::SPELL_SUMMON_FELHUNTER
594 .bind(wowlab_engine_combat::generated_identities::specs::demonology_warlock::PROOF);
595pub(crate) const SPELL_SUMMON_IMP: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::demonology_warlock::SPELL_SUMMON_IMP
596 .bind(wowlab_engine_combat::generated_identities::specs::demonology_warlock::PROOF);
597pub(crate) const SPELL_CALL_DREADSTALKERS: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::demonology_warlock::SPELL_CALL_DREADSTALKERS
598 .bind(wowlab_engine_combat::generated_identities::specs::demonology_warlock::PROOF);
599pub(crate) const SPELL_SUMMON_DEMONIC_TYRANT: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::demonology_warlock::SPELL_SUMMON_DEMONIC_TYRANT
600 .bind(wowlab_engine_combat::generated_identities::specs::demonology_warlock::PROOF);
601pub(crate) const SPELL_SUMMON_VILEFIEND: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::demonology_warlock::SPELL_SUMMON_VILEFIEND
602 .bind(wowlab_engine_combat::generated_identities::specs::demonology_warlock::PROOF);
603pub(crate) const SPELL_IMPLOSION: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::demonology_warlock::SPELL_IMPLOSION
604 .bind(wowlab_engine_combat::generated_identities::specs::demonology_warlock::PROOF);
605pub(crate) const SPELL_GRIMOIRE_IMP_LORD: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::demonology_warlock::SPELL_GRIMOIRE_IMP_LORD
606 .bind(wowlab_engine_combat::generated_identities::specs::demonology_warlock::PROOF);
607pub(crate) const SPELL_GRIMOIRE_FEL_RAVAGER: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::demonology_warlock::SPELL_GRIMOIRE_FEL_RAVAGER
608 .bind(wowlab_engine_combat::generated_identities::specs::demonology_warlock::PROOF);
609pub(crate) const SPELL_SUMMON_DOOMGUARD: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::demonology_warlock::SPELL_SUMMON_DOOMGUARD
610 .bind(wowlab_engine_combat::generated_identities::specs::demonology_warlock::PROOF);
611pub(crate) const SPELL_INFERNAL_BOLT: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::demonology_warlock::SPELL_INFERNAL_BOLT
612 .bind(wowlab_engine_combat::generated_identities::specs::demonology_warlock::PROOF);
613pub(crate) const SPELL_RUINATION: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::demonology_warlock::SPELL_RUINATION
614 .bind(wowlab_engine_combat::generated_identities::specs::demonology_warlock::PROOF);
615pub(crate) const SPELL_COUNT: usize = 17;
616const _: () = assert!(
617 SPELL_COUNT == 17,
618 "SPELL index ABI: count changed -- update positional hook consumers"
619);
620pub(crate) mod EFFECT {
621 pub(crate) const BURNING_CLEAVE: (u32, u8) = (1_264_093, 1);
623 pub(crate) const FEL_FIREBOLT_DAMAGE: (u32, u8) = (104_318, 1);
625 pub(crate) const SHADOW_NOVA_DAMAGE: (u32, u8) = (1_282_507, 1);
627 pub(crate) const BLAZE_MISSILE_DAMAGE: (u32, u8) = (1_282_534, 1);
629 pub(crate) const MIND_SEAR_DAMAGE: (u32, u8) = (1_280_460, 2);
631 pub(crate) const SOUL_BARRAGE_DAMAGE: (u32, u8) = (1_292_391, 1);
633 pub(crate) const HAND_OF_GULDAN_IMPACT_DAMAGE: (u32, u8) = (86040, 1);
635 pub(crate) const BILE_SPIT_DIRECT_DAMAGE: (u32, u8) = (267_997, 1);
637 pub(crate) const BILE_SPIT_TICK_DAMAGE: (u32, u8) = (267_997, 2);
639 pub(crate) const HEADBUTT_DAMAGE: (u32, u8) = (267_999, 1);
641 pub(crate) const GLOOM_SLASH_DAMAGE: (u32, u8) = (455_491, 1);
643 pub(crate) const LEGION_STRIKE_DAMAGE: (u32, u8) = (30213, 1);
645 pub(crate) const FELSTORM_DAMAGE: (u32, u8) = (89753, 1);
647 pub(crate) const DREADBITE_DAMAGE: (u32, u8) = (271_971, 1);
649 pub(crate) const DEMONIC_CORE_IMP_CHANCE: (u32, u8) = (267_102, 1);
651 pub(crate) const IMPLOSION_DAMAGE: (u32, u8) = (196_278, 1);
653 pub(crate) const MID2_DEMONOLOGY_2PC_IMP: (u32, u8) = (1_296_573, 1);
655 pub(crate) const MID2_DEMONOLOGY_2PC_IMPLOSION: (u32, u8) = (1_296_573, 2);
657 pub(crate) const MID2_DEMONOLOGY_4PC_MAIN: (u32, u8) = (1_296_574, 1);
659 pub(crate) const MID2_DEMONOLOGY_4PC_SECONDARY: (u32, u8) = (1_296_574, 2);
661 pub(crate) const MID2_DEMONOLOGY_4PC_CHANCE: (u32, u8) = (1_296_574, 3);
663 pub(crate) const WICKED_CLEAVE_DAMAGE: (u32, u8) = (432_120, 1);
665 pub(crate) const CHAOS_SALVO_DAMAGE: (u32, u8) = (432_596, 1);
667 pub(crate) const FELSEEKER_DAMAGE: (u32, u8) = (434_404, 1);
669 pub(crate) const EYE_EXPLOSION_DAMAGE: (u32, u8) = (1_269_800, 1);
671 pub(crate) const DIABOLIC_GAZE_1_DAMAGE: (u32, u8) = (1_269_892, 1);
673 pub(crate) const DIABOLIC_GAZE_2_DAMAGE: (u32, u8) = (1_269_886, 1);
675 pub(crate) const DIABOLIC_GAZE_3_DAMAGE: (u32, u8) = (1_269_885, 1);
677}
678static REPORTED_SPELLS: &[(&str, u32)] = &[
679 ("antoran_inquisitor", 1_276_283),
680 ("antoran_jailer", 1_276_182),
681 ("bile_spit", 267_997),
682 ("blaze_missile", 1_282_534),
683 ("blighted_maw", 1_276_960),
684 ("burning_cleave", 1_264_093),
685 ("chaos_salvo", 432_596),
686 ("diabolic_gaze_1", 1_269_892),
687 ("diabolic_gaze_2", 1_269_886),
688 ("diabolic_gaze_3", 1_269_885),
689 ("dreadbite", 271_971),
690 ("dreadstalker_melee", 193_332),
691 ("eye_explosion", 1_269_800),
692 ("felseeker", 434_404),
693 ("felstorm", 89753),
694 ("fel_firebolt", 104_318),
695 ("gloom_slash", 455_491),
696 ("grand_warlock_alythess", 1_282_502),
697 ("hand_of_guldan_impact", 86040),
698 ("headbutt", 267_999),
699 ("isolated_implosion", 1_306_077),
700 ("isolated_implosion_driver", 1_309_535),
701 ("lady_sacrolash", 1_282_501),
702 ("legion_strike", 30213),
703 ("mind_sear_channel", 1_280_460),
704 ("shadow_nova", 1_282_507),
705 ("soul_barrage_cast", 1_292_391),
706 ("unstable_gang_boss", 1_281_512),
707 ("vilefiend", 1_251_781),
708 ("wicked_cleave", 432_120),
709];
710static DECLARED_SPELL_IDS: &[u32] = &[
711 686, 264_178, 105_174, 334_581, 234_153, 30146, 691, 688, 104_316, 265_187, 264_119,
712 196_277, 1_276_452, 1_276_467, 1_276_672, 434_506, 434_635, 264_173, 386_194,
713 460_553, 1_276_767, 1_281_559, 267_216, 1_276_166, 449_793, 1_269_042, 196_099,
714 104_317, 193_332, 462_599, 453_699, 433_891, 433_885, 428_514, 431_944, 432_815,
715 432_816, 428_524, 432_794, 432_795, 1_269_643, 1_268_709, 1_268_713, 1_268_716,
716 1_269_879, 456_323, 429_581, 434_424, 1_250_921, 1_276_956, 426_115, 453_908,
717 1_276_947, 386_185, 1_276_163, 1_276_190, 1_276_222, 460_551, 264_078, 429_899,
718 1_250_273, 1_250_897, 1_250_768, 1_263_941, 455_449, 264_130, 1_276_748, 267_214,
719 428_394, 1_251_778, 1_281_511, 1_276_746, 1, 30213, 77219, 86040, 89753, 104_318,
720 196_278, 267_102, 267_997, 267_999, 271_971, 432_120, 432_596, 434_404, 455_491,
721 1_251_781, 1_264_093, 1_269_800, 1_269_885, 1_269_886, 1_269_892, 1_276_182,
722 1_276_283, 1_276_960, 1_280_460, 1_281_512, 1_282_501, 1_282_502, 1_282_507,
723 1_282_534, 1_292_391, 1_296_573, 1_296_574, 1_306_077, 1_309_535, 449_801, 449_858,
724 450_591, 450_538, 449_826, 434_636,
725];
726static DECLARED_AURA_IDS: &[u32] = &[
727 264_173, 386_194, 334_581, 460_553, 1_276_767, 1_281_559, 267_216, 1_276_166,
728 449_793, 1_269_042, 196_099, 104_317, 193_332, 462_599, 453_699, 433_891, 433_885,
729 428_514, 431_944, 432_815, 432_816, 428_524, 432_794, 432_795, 1_269_643, 1_268_709,
730 1_268_713, 1_268_716, 1_269_879, 456_323, 429_581, 434_424, 1_269_042, 449_793,
731 456_323, 434_424, 432_794, 428_524, 432_795, 1_269_643, 432_815, 431_944, 432_816,
732 433_891, 1_269_879, 433_885,
733];
734static TALENTS: &[(&str, u32)] = &[
735 ("ABYSSAL_DOMINION_TALENT", TALENT::ABYSSAL_DOMINION_TALENT),
736 ("ANTORAN_ARMAMENTS", TALENT::ANTORAN_ARMAMENTS),
737 ("BLIGHTED_MAW", TALENT::BLIGHTED_MAW),
738 ("CALL_DREADSTALKERS", TALENT::CALL_DREADSTALKERS),
739 ("CARNIVOROUS_STALKERS", TALENT::CARNIVOROUS_STALKERS),
740 ("DEMONIAC", TALENT::DEMONIAC),
741 ("DEMONIC_BRUTALITY", TALENT::DEMONIC_BRUTALITY),
742 ("DEMONIC_CALLING", TALENT::DEMONIC_CALLING),
743 ("DEMONIC_KNOWLEDGE", TALENT::DEMONIC_KNOWLEDGE),
744 ("DIABOLIC_OCULI", TALENT::DIABOLIC_OCULI),
745 ("DIABOLIC_RITUAL", TALENT::DIABOLIC_RITUAL),
746 ("DOMINION_OF_ARGUS", TALENT::DOMINION_OF_ARGUS),
747 ("DOMINION_OF_ARGUS_2", TALENT::DOMINION_OF_ARGUS_2),
748 ("DOMINION_OF_ARGUS_3", TALENT::DOMINION_OF_ARGUS_3),
749 ("DOOM", TALENT::DOOM),
750 ("DREADLASH", TALENT::DREADLASH),
751 ("FLAMETOUCHED", TALENT::FLAMETOUCHED),
752 ("GLOOM_OF_NATHREZA", TALENT::GLOOM_OF_NATHREZA),
753 ("GRIMOIRE_FEL_RAVAGER", TALENT::GRIMOIRE_FEL_RAVAGER),
754 ("GRIMOIRE_IMP_LORD", TALENT::GRIMOIRE_IMP_LORD),
755 ("HAND_OF_GULDAN", TALENT::HAND_OF_GULDAN),
756 ("HELLBENT_COMMANDER", TALENT::HELLBENT_COMMANDER),
757 ("IMPLOSION", TALENT::IMPLOSION),
758 ("IMP_GANG_BOSS", TALENT::IMP_GANG_BOSS),
759 ("INFERNAL_RAPIDITY", TALENT::INFERNAL_RAPIDITY),
760 ("INNER_DEMONS", TALENT::INNER_DEMONS),
761 ("LOOKS_THAT_KILL", TALENT::LOOKS_THAT_KILL),
762 ("MARK_OF_SHATUG", TALENT::MARK_OF_SHATUG),
763 ("MINDS_EYES", TALENT::MINDS_EYES),
764 ("POWER_SIPHON", TALENT::POWER_SIPHON),
765 ("REIGN_OF_TYRANNY", TALENT::REIGN_OF_TYRANNY),
766 ("SACRIFICED_SOULS", TALENT::SACRIFICED_SOULS),
767 ("SPITEFUL_RECONSTITUTION", TALENT::SPITEFUL_RECONSTITUTION),
768 ("SUMMON_DEMONIC_TYRANT", TALENT::SUMMON_DEMONIC_TYRANT),
769 ("SUMMON_DOOMGUARD", TALENT::SUMMON_DOOMGUARD),
770 ("SUMMON_VILEFIEND", TALENT::SUMMON_VILEFIEND),
771 ("SUMMON_VILEFIEND_CASTABLE", TALENT::SUMMON_VILEFIEND_CASTABLE),
772 ("TO_HELL_AND_BACK", TALENT::TO_HELL_AND_BACK),
773 ("TYRANTS_OBLATION", TALENT::TYRANTS_OBLATION),
774];
775pub(crate) mod DEMONOLOGY_WARLOCK {
776 pub(crate) const SHADOW_BOLT_CASTS: u32 = 0;
777 pub(crate) const DEMONBOLT_CASTS: u32 = 1;
778 pub(crate) const HAND_OF_GULDAN_CASTS: u32 = 2;
779 pub(crate) const CALL_DREADSTALKERS_CASTS: u32 = 3;
780 pub(crate) const SUMMON_DEMONIC_TYRANT_CASTS: u32 = 4;
781 pub(crate) const POWER_SIPHON_CASTS: u32 = 5;
782 pub(crate) const DEMONIC_CORE_UPTIME_MS: u32 = 6;
783 pub(crate) const TYRANT_UPTIME_MS: u32 = 7;
784}
785fn aura_demonic_core(
786 a: AuraDefinitionDraft,
787 data: &ResolvedGameData,
788) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
789 Ok(
790 a
791 .on_player()
792 .apply_base_from_data(data, 264_173)?
793 .max_stacks(
794 data
795 .require_aura_max_stacks(
796 wowlab_types::sim::SpellIdx::from_raw(264_173),
797 )?,
798 ),
799 )
800}
801fn aura_carnivorous_stalkers_talent(
802 a: AuraDefinitionDraft,
803 data: &ResolvedGameData,
804) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
805 Ok(
806 a
807 .on_player()
808 .apply_base_from_data(data, 386_194)?
809 .max_stacks(
810 data
811 .require_aura_max_stacks(
812 wowlab_types::sim::SpellIdx::from_raw(386_194),
813 )?,
814 ),
815 )
816}
817fn aura_power_siphon(
818 a: AuraDefinitionDraft,
819 data: &ResolvedGameData,
820) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
821 a.on_player()
822 .apply_base_from_data(data, 334_581)?
823 .max_stacks(
824 data.require_aura_max_stacks(wowlab_types::sim::SpellIdx::from_raw(334_581))?,
825 )
826 .damage_percent_spells_linear(30.0, &[264_178])
827}
828fn aura_doom(
829 a: AuraDefinitionDraft,
830 data: &ResolvedGameData,
831) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
832 Ok(
833 a
834 .on_target()
835 .apply_base_from_data(data, 460_553)?
836 .max_stacks(
837 data
838 .require_aura_max_stacks(
839 wowlab_types::sim::SpellIdx::from_raw(460_553),
840 )?,
841 ),
842 )
843}
844fn aura_tyrants_oblation(
845 a: AuraDefinitionDraft,
846 data: &ResolvedGameData,
847) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
848 Ok(
849 a
850 .on_player()
851 .apply_base_from_data(data, 1_276_767)?
852 .max_stacks(
853 data
854 .require_aura_max_stacks(
855 wowlab_types::sim::SpellIdx::from_raw(1_276_767),
856 )?,
857 ),
858 )
859}
860fn aura_hellbent_commander(
861 a: AuraDefinitionDraft,
862 data: &ResolvedGameData,
863) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
864 Ok(
865 a
866 .on_player()
867 .apply_base_from_data(data, 1_281_559)?
868 .max_stacks(
869 data
870 .require_aura_max_stacks(
871 wowlab_types::sim::SpellIdx::from_raw(1_281_559),
872 )?,
873 ),
874 )
875}
876fn aura_inner_demons(
877 a: AuraDefinitionDraft,
878 data: &ResolvedGameData,
879) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
880 Ok(
881 a
882 .on_player()
883 .apply_base_from_data(data, 267_216)?
884 .max_stacks(
885 data
886 .require_aura_max_stacks(
887 wowlab_types::sim::SpellIdx::from_raw(267_216),
888 )?,
889 ),
890 )
891}
892fn aura_dominion_of_argus(
893 a: AuraDefinitionDraft,
894 data: &ResolvedGameData,
895) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
896 Ok(
897 a
898 .on_player()
899 .apply_base_from_data(data, 1_276_166)?
900 .max_stacks(
901 data
902 .require_aura_max_stacks(
903 wowlab_types::sim::SpellIdx::from_raw(1_276_166),
904 )?,
905 ),
906 )
907}
908fn aura_succulent_soul(
909 a: AuraDefinitionDraft,
910 data: &ResolvedGameData,
911) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
912 Ok(
913 a
914 .on_player()
915 .apply_base_from_data(data, 449_793)?
916 .max_stacks(
917 data
918 .require_aura_max_stacks(
919 wowlab_types::sim::SpellIdx::from_raw(449_793),
920 )?,
921 ),
922 )
923}
924fn aura_manifested_demonic_soul(
925 a: AuraDefinitionDraft,
926 data: &ResolvedGameData,
927) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
928 Ok(
929 a
930 .on_player()
931 .apply_base_from_data(data, 1_269_042)?
932 .max_stacks(
933 data
934 .require_aura_max_stacks(
935 wowlab_types::sim::SpellIdx::from_raw(1_269_042),
936 )?,
937 ),
938 )
939}
940fn aura_grimoire_of_sacrifice(
941 a: AuraDefinitionDraft,
942 data: &ResolvedGameData,
943) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
944 Ok(
945 a
946 .on_player()
947 .apply_base_from_data(data, 196_099)?
948 .max_stacks(
949 data
950 .require_aura_max_stacks(
951 wowlab_types::sim::SpellIdx::from_raw(196_099),
952 )?,
953 ),
954 )
955}
956fn aura_wild_imps(
957 a: AuraDefinitionDraft,
958 data: &ResolvedGameData,
959) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
960 Ok(
961 a
962 .on_player()
963 .apply_base_from_data(data, 104_317)?
964 .max_stacks(
965 data
966 .require_aura_max_stacks(
967 wowlab_types::sim::SpellIdx::from_raw(104_317),
968 )?,
969 ),
970 )
971}
972fn aura_dreadstalkers(
973 a: AuraDefinitionDraft,
974 data: &ResolvedGameData,
975) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
976 Ok(
977 a
978 .on_player()
979 .apply_base_from_data(data, 193_332)?
980 .max_stacks(
981 data
982 .require_aura_max_stacks(
983 wowlab_types::sim::SpellIdx::from_raw(193_332),
984 )?,
985 ),
986 )
987}
988fn aura_track_pets(
989 a: AuraDefinitionDraft,
990 data: &ResolvedGameData,
991) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
992 Ok(
993 a
994 .on_player()
995 .apply_base_from_data(data, 462_599)?
996 .max_stacks(
997 data
998 .require_aura_max_stacks(
999 wowlab_types::sim::SpellIdx::from_raw(462_599),
1000 )?,
1001 ),
1002 )
1003}
1004fn aura_flametouched_talent(
1005 a: AuraDefinitionDraft,
1006 data: &ResolvedGameData,
1007) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1008 Ok(
1009 a
1010 .on_player()
1011 .apply_base_from_data(data, 453_699)?
1012 .max_stacks(
1013 data
1014 .require_aura_max_stacks(
1015 wowlab_types::sim::SpellIdx::from_raw(453_699),
1016 )?,
1017 ),
1018 )
1019}
1020fn aura_infernal_bolt(
1021 a: AuraDefinitionDraft,
1022 data: &ResolvedGameData,
1023) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1024 Ok(
1025 a
1026 .on_player()
1027 .apply_base_from_data(data, 433_891)?
1028 .max_stacks(
1029 data
1030 .require_aura_max_stacks(
1031 wowlab_types::sim::SpellIdx::from_raw(433_891),
1032 )?,
1033 ),
1034 )
1035}
1036fn aura_ruination(
1037 a: AuraDefinitionDraft,
1038 data: &ResolvedGameData,
1039) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1040 Ok(
1041 a
1042 .on_player()
1043 .apply_base_from_data(data, 433_885)?
1044 .max_stacks(
1045 data
1046 .require_aura_max_stacks(
1047 wowlab_types::sim::SpellIdx::from_raw(433_885),
1048 )?,
1049 ),
1050 )
1051}
1052fn aura_diabolic_ritual_talent(
1053 a: AuraDefinitionDraft,
1054 data: &ResolvedGameData,
1055) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1056 Ok(
1057 a
1058 .on_player()
1059 .apply_base_from_data(data, 428_514)?
1060 .max_stacks(
1061 data
1062 .require_aura_max_stacks(
1063 wowlab_types::sim::SpellIdx::from_raw(428_514),
1064 )?,
1065 ),
1066 )
1067}
1068fn aura_diabolic_ritual_overlord(
1069 a: AuraDefinitionDraft,
1070 data: &ResolvedGameData,
1071) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1072 Ok(
1073 a
1074 .on_player()
1075 .apply_base_from_data(data, 431_944)?
1076 .max_stacks(
1077 data
1078 .require_aura_max_stacks(
1079 wowlab_types::sim::SpellIdx::from_raw(431_944),
1080 )?,
1081 )
1082 .on_expire(
1083 crate::hooks::demonology_warlock::demonology_diabolic_ritual_overlord_expire_hook,
1084 ),
1085 )
1086}
1087fn aura_diabolic_ritual_mother(
1088 a: AuraDefinitionDraft,
1089 data: &ResolvedGameData,
1090) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1091 Ok(
1092 a
1093 .on_player()
1094 .apply_base_from_data(data, 432_815)?
1095 .max_stacks(
1096 data
1097 .require_aura_max_stacks(
1098 wowlab_types::sim::SpellIdx::from_raw(432_815),
1099 )?,
1100 )
1101 .on_expire(
1102 crate::hooks::demonology_warlock::demonology_diabolic_ritual_mother_expire_hook,
1103 ),
1104 )
1105}
1106fn aura_diabolic_ritual_pit_lord(
1107 a: AuraDefinitionDraft,
1108 data: &ResolvedGameData,
1109) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1110 Ok(
1111 a
1112 .on_player()
1113 .apply_base_from_data(data, 432_816)?
1114 .max_stacks(
1115 data
1116 .require_aura_max_stacks(
1117 wowlab_types::sim::SpellIdx::from_raw(432_816),
1118 )?,
1119 )
1120 .on_expire(
1121 crate::hooks::demonology_warlock::demonology_diabolic_ritual_pit_lord_expire_hook,
1122 ),
1123 )
1124}
1125fn aura_demonic_art_overlord(
1126 a: AuraDefinitionDraft,
1127 data: &ResolvedGameData,
1128) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1129 Ok(
1130 a
1131 .on_player()
1132 .apply_base_from_data(data, 428_524)?
1133 .max_stacks(
1134 data
1135 .require_aura_max_stacks(
1136 wowlab_types::sim::SpellIdx::from_raw(428_524),
1137 )?,
1138 )
1139 .on_expire(
1140 crate::hooks::demonology_warlock::demonology_demonic_art_overlord_expire_hook,
1141 ),
1142 )
1143}
1144fn aura_demonic_art_mother(
1145 a: AuraDefinitionDraft,
1146 data: &ResolvedGameData,
1147) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1148 Ok(
1149 a
1150 .on_player()
1151 .apply_base_from_data(data, 432_794)?
1152 .max_stacks(
1153 data
1154 .require_aura_max_stacks(
1155 wowlab_types::sim::SpellIdx::from_raw(432_794),
1156 )?,
1157 )
1158 .on_expire(
1159 crate::hooks::demonology_warlock::demonology_demonic_art_mother_expire_hook,
1160 ),
1161 )
1162}
1163fn aura_demonic_art_pit_lord(
1164 a: AuraDefinitionDraft,
1165 data: &ResolvedGameData,
1166) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1167 Ok(
1168 a
1169 .on_player()
1170 .apply_base_from_data(data, 432_795)?
1171 .max_stacks(
1172 data
1173 .require_aura_max_stacks(
1174 wowlab_types::sim::SpellIdx::from_raw(432_795),
1175 )?,
1176 )
1177 .on_expire(
1178 crate::hooks::demonology_warlock::demonology_demonic_art_pit_lord_expire_hook,
1179 ),
1180 )
1181}
1182fn aura_demonic_oculi(
1183 a: AuraDefinitionDraft,
1184 data: &ResolvedGameData,
1185) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1186 Ok(
1187 a
1188 .on_player()
1189 .apply_base_from_data(data, 1_269_643)?
1190 .max_stacks(
1191 data
1192 .require_aura_max_stacks(
1193 wowlab_types::sim::SpellIdx::from_raw(1_269_643),
1194 )?,
1195 ),
1196 )
1197}
1198fn aura_diabolic_oculi_talent(
1199 a: AuraDefinitionDraft,
1200 data: &ResolvedGameData,
1201) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1202 Ok(
1203 a
1204 .on_player()
1205 .apply_base_from_data(data, 1_268_709)?
1206 .max_stacks(
1207 data
1208 .require_aura_max_stacks(
1209 wowlab_types::sim::SpellIdx::from_raw(1_268_709),
1210 )?,
1211 ),
1212 )
1213}
1214fn aura_looks_that_kill_talent(
1215 a: AuraDefinitionDraft,
1216 data: &ResolvedGameData,
1217) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1218 Ok(
1219 a
1220 .on_player()
1221 .apply_base_from_data(data, 1_268_713)?
1222 .max_stacks(
1223 data
1224 .require_aura_max_stacks(
1225 wowlab_types::sim::SpellIdx::from_raw(1_268_713),
1226 )?,
1227 ),
1228 )
1229}
1230fn aura_minds_eyes_talent(
1231 a: AuraDefinitionDraft,
1232 data: &ResolvedGameData,
1233) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1234 Ok(
1235 a
1236 .on_player()
1237 .apply_base_from_data(data, 1_268_716)?
1238 .max_stacks(
1239 data
1240 .require_aura_max_stacks(
1241 wowlab_types::sim::SpellIdx::from_raw(1_268_716),
1242 )?,
1243 ),
1244 )
1245}
1246fn aura_minds_eyes(
1247 a: AuraDefinitionDraft,
1248 data: &ResolvedGameData,
1249) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1250 a.on_player()
1251 .apply_base_from_data(data, 1_269_879)?
1252 .max_stacks(
1253 data
1254 .require_aura_max_stacks(
1255 wowlab_types::sim::SpellIdx::from_raw(1_269_879),
1256 )?,
1257 )
1258 .primary_pct_per_stack(
1259 data.base_points(wowlab_types::sim::SpellIdx::from_raw(1_269_879), 1),
1260 )
1261}
1262fn aura_abyssal_dominion(
1263 a: AuraDefinitionDraft,
1264 data: &ResolvedGameData,
1265) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1266 a.on_player()
1267 .apply_base_from_data(data, 456_323)?
1268 .max_stacks(
1269 data.require_aura_max_stacks(wowlab_types::sim::SpellIdx::from_raw(456_323))?,
1270 )
1271 .pet_damage_multiplier(
1272 ((data.base_points(wowlab_types::sim::SpellIdx::from_raw(456_323), 1))
1273 * 0.01) + 1.0,
1274 )
1275}
1276fn aura_abyssal_dominion_talent(
1277 a: AuraDefinitionDraft,
1278 data: &ResolvedGameData,
1279) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1280 Ok(
1281 a
1282 .on_player()
1283 .apply_base_from_data(data, 429_581)?
1284 .max_stacks(
1285 data
1286 .require_aura_max_stacks(
1287 wowlab_types::sim::SpellIdx::from_raw(429_581),
1288 )?,
1289 ),
1290 )
1291}
1292fn aura_cloven_soul(
1293 a: AuraDefinitionDraft,
1294 data: &ResolvedGameData,
1295) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1296 Ok(
1297 a
1298 .on_target()
1299 .apply_base_from_data(data, 434_424)?
1300 .max_stacks(
1301 data
1302 .require_aura_max_stacks(
1303 wowlab_types::sim::SpellIdx::from_raw(434_424),
1304 )?,
1305 ),
1306 )
1307}
1308fn spell_shadow_bolt(
1309 s: SpellDefinitionDraft,
1310 data: &ResolvedGameData,
1311) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1312 Ok(s.apply_base_from_data(data, 686)?.gain(1.0).apply_aoe_from_data(data))
1313}
1314fn spell_demonbolt(
1315 s: SpellDefinitionDraft,
1316 data: &ResolvedGameData,
1317) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1318 Ok(
1319 s
1320 .apply_base_from_data(data, 264_178)?
1321 .gain(2.0)
1322 .apply_aoe_from_data(data)
1323 .on_cast(crate::hooks::demonology_warlock::demonbolt_hook)
1324 .instant_when_aura(AURA::DEMONIC_CORE),
1325 )
1326}
1327fn spell_hand_of_guldan(
1328 s: SpellDefinitionDraft,
1329 data: &ResolvedGameData,
1330) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1331 Ok(
1332 s
1333 .apply_base_from_data(data, 105_174)?
1334 .apply_aoe_from_data(data)
1335 .on_cast(crate::hooks::demonology_warlock::hand_of_guldan_hook),
1336 )
1337}
1338fn spell_power_siphon(
1339 s: SpellDefinitionDraft,
1340 data: &ResolvedGameData,
1341) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1342 Ok(
1343 s
1344 .apply_base_from_data(data, 334_581)?
1345 .without_data_damage()
1346 .apply_aoe_from_data(data)
1347 .on_cast(crate::hooks::demonology_warlock::power_siphon_hook),
1348 )
1349}
1350fn spell_drain_life(
1351 s: SpellDefinitionDraft,
1352 data: &ResolvedGameData,
1353) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1354 Ok(s.apply_base_from_data(data, 234_153)?.apply_aoe_from_data(data))
1355}
1356fn spell_summon_felguard(
1357 s: SpellDefinitionDraft,
1358 data: &ResolvedGameData,
1359) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1360 Ok(s.apply_base_from_data(data, 30146)?.apply_aoe_from_data(data))
1361}
1362fn spell_summon_felhunter(
1363 s: SpellDefinitionDraft,
1364 data: &ResolvedGameData,
1365) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1366 Ok(s.apply_base_from_data(data, 691)?.apply_aoe_from_data(data))
1367}
1368fn spell_summon_imp(
1369 s: SpellDefinitionDraft,
1370 data: &ResolvedGameData,
1371) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1372 Ok(s.apply_base_from_data(data, 688)?.apply_aoe_from_data(data))
1373}
1374fn spell_call_dreadstalkers(
1375 s: SpellDefinitionDraft,
1376 data: &ResolvedGameData,
1377) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1378 Ok(
1379 s
1380 .apply_base_from_data(data, 104_316)?
1381 .apply_aoe_from_data(data)
1382 .on_cast(crate::hooks::demonology_warlock::call_dreadstalkers_hook),
1383 )
1384}
1385fn spell_summon_demonic_tyrant(
1386 s: SpellDefinitionDraft,
1387 data: &ResolvedGameData,
1388) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1389 Ok(
1390 s
1391 .apply_base_from_data(data, 265_187)?
1392 .apply_aoe_from_data(data)
1393 .on_cast(crate::hooks::demonology_warlock::summon_demonic_tyrant_hook),
1394 )
1395}
1396fn spell_summon_vilefiend(
1397 s: SpellDefinitionDraft,
1398 data: &ResolvedGameData,
1399) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1400 Ok(s.apply_base_from_data(data, 264_119)?.apply_aoe_from_data(data))
1401}
1402fn spell_implosion(
1403 s: SpellDefinitionDraft,
1404 data: &ResolvedGameData,
1405) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1406 Ok(s.apply_base_from_data(data, 196_277)?.apply_aoe_from_data(data))
1407}
1408fn spell_grimoire_imp_lord(
1409 s: SpellDefinitionDraft,
1410 data: &ResolvedGameData,
1411) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1412 Ok(s.apply_base_from_data(data, 1_276_452)?.apply_aoe_from_data(data))
1413}
1414fn spell_grimoire_fel_ravager(
1415 s: SpellDefinitionDraft,
1416 data: &ResolvedGameData,
1417) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1418 Ok(s.apply_base_from_data(data, 1_276_467)?.apply_aoe_from_data(data))
1419}
1420fn spell_summon_doomguard(
1421 s: SpellDefinitionDraft,
1422 data: &ResolvedGameData,
1423) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1424 Ok(s.apply_base_from_data(data, 1_276_672)?.apply_aoe_from_data(data))
1425}
1426fn spell_infernal_bolt(
1427 s: SpellDefinitionDraft,
1428 data: &ResolvedGameData,
1429) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1430 Ok(
1431 s
1432 .apply_base_from_data(data, 434_506)?
1433 .gain(
1434 (data.base_points(wowlab_types::sim::SpellIdx::from_raw(434_506), 2))
1435 * 0.1,
1436 )
1437 .apply_aoe_from_data(data)
1438 .requires_aura_at_min_stacks(433_891, 0)
1439 .consume_aura_on_cast(433_891),
1440 )
1441}
1442fn spell_ruination(
1443 s: SpellDefinitionDraft,
1444 data: &ResolvedGameData,
1445) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1446 Ok(
1447 s
1448 .apply_base_from_data(data, 434_635)?
1449 .travel_time(
1450 wowlab_engine_combat::validated_milliseconds(
1451 1000.0,
1452 434_635,
1453 "spell.travel_time_ms",
1454 )?,
1455 )
1456 .apply_aoe_from_data(data)
1457 .on_cast(crate::hooks::demonology_warlock::ruination_hook)
1458 .requires_aura_at_min_stacks(433_885, 0)
1459 .consume_aura_on_cast(433_885),
1460 )
1461}
1462pub(crate) fn build_combat_system_draft(
1463 params: &wowlab_engine_ports::HandlerParams<'_>,
1464) -> Result<CombatSystemDraft, wowlab_engine_ports::EngineError> {
1465 let builder = CombatSystemBuilder::new(params.stats.clone())
1466 .spec_id(SpecId::Demonology)
1467 .spec_identity(
1468 wowlab_engine_combat::generated_identities::specs::demonology_warlock::PROOF,
1469 )
1470 .hero_talent_trees(DECLARED_METADATA.hero_talent_trees)
1471 .effect_identities(
1472 wowlab_engine_combat::generated_identities::specs::demonology_warlock::damage::ALL,
1473 )
1474 .effect_identities(wowlab_engine_combat::generated_identities::shared::ALL)
1475 .mastery_spell(77219)
1476 .mastery_hook(crate::hooks::demonology_warlock::mastery)
1477 .resource(
1478 "soul_shards",
1479 5.0,
1480 params
1481 .game_data
1482 .power_regen_for_max(7, 5.0)
1483 .ok_or_else(|| {
1484 wowlab_engine_ports::EngineError::spec_construction(
1485 "missing power-type power_regen_for_max for type_id 7",
1486 )
1487 })?,
1488 )
1489 .resource_type_id(7)
1490 .resource_start(3.0)
1491 .mastery_crit_damage_hook(crate::hooks::demonology_warlock::crit_damage)
1492 .has_pet(true)
1493 .aura(
1494 "demonic_core",
1495 AURA::DEMONIC_CORE,
1496 |a| aura_demonic_core(a, ¶ms.game_data),
1497 )
1498 .aura(
1499 "carnivorous_stalkers_talent",
1500 AURA::CARNIVOROUS_STALKERS_TALENT,
1501 |a| aura_carnivorous_stalkers_talent(a, ¶ms.game_data),
1502 )
1503 .aura(
1504 "power_siphon",
1505 AURA::POWER_SIPHON,
1506 |a| aura_power_siphon(a, ¶ms.game_data),
1507 )
1508 .aura("doom", AURA::DOOM, |a| aura_doom(a, ¶ms.game_data))
1509 .aura(
1510 "tyrants_oblation",
1511 AURA::TYRANTS_OBLATION,
1512 |a| aura_tyrants_oblation(a, ¶ms.game_data),
1513 )
1514 .aura(
1515 "hellbent_commander",
1516 AURA::HELLBENT_COMMANDER,
1517 |a| aura_hellbent_commander(a, ¶ms.game_data),
1518 )
1519 .aura(
1520 "inner_demons",
1521 AURA::INNER_DEMONS,
1522 |a| aura_inner_demons(a, ¶ms.game_data),
1523 )
1524 .aura(
1525 "dominion_of_argus",
1526 AURA::DOMINION_OF_ARGUS,
1527 |a| aura_dominion_of_argus(a, ¶ms.game_data),
1528 )
1529 .aura(
1530 "succulent_soul",
1531 AURA::SUCCULENT_SOUL,
1532 |a| aura_succulent_soul(a, ¶ms.game_data),
1533 )
1534 .aura(
1535 "manifested_demonic_soul",
1536 AURA::MANIFESTED_DEMONIC_SOUL,
1537 |a| aura_manifested_demonic_soul(a, ¶ms.game_data),
1538 )
1539 .aura(
1540 "grimoire_of_sacrifice",
1541 AURA::GRIMOIRE_OF_SACRIFICE,
1542 |a| aura_grimoire_of_sacrifice(a, ¶ms.game_data),
1543 )
1544 .aura("wild_imps", AURA::WILD_IMPS, |a| aura_wild_imps(a, ¶ms.game_data))
1545 .aura(
1546 "dreadstalkers",
1547 AURA::DREADSTALKERS,
1548 |a| aura_dreadstalkers(a, ¶ms.game_data),
1549 )
1550 .aura("track_pets", AURA::TRACK_PETS, |a| aura_track_pets(a, ¶ms.game_data))
1551 .aura(
1552 "flametouched_talent",
1553 AURA::FLAMETOUCHED_TALENT,
1554 |a| aura_flametouched_talent(a, ¶ms.game_data),
1555 )
1556 .aura(
1557 "infernal_bolt",
1558 AURA::INFERNAL_BOLT,
1559 |a| aura_infernal_bolt(a, ¶ms.game_data),
1560 )
1561 .aura("ruination", AURA::RUINATION, |a| aura_ruination(a, ¶ms.game_data))
1562 .aura(
1563 "diabolic_ritual_talent",
1564 AURA::DIABOLIC_RITUAL_TALENT,
1565 |a| aura_diabolic_ritual_talent(a, ¶ms.game_data),
1566 )
1567 .aura(
1568 "diabolic_ritual_overlord",
1569 AURA::DIABOLIC_RITUAL_OVERLORD,
1570 |a| aura_diabolic_ritual_overlord(a, ¶ms.game_data),
1571 )
1572 .aura(
1573 "diabolic_ritual_mother",
1574 AURA::DIABOLIC_RITUAL_MOTHER,
1575 |a| aura_diabolic_ritual_mother(a, ¶ms.game_data),
1576 )
1577 .aura(
1578 "diabolic_ritual_pit_lord",
1579 AURA::DIABOLIC_RITUAL_PIT_LORD,
1580 |a| aura_diabolic_ritual_pit_lord(a, ¶ms.game_data),
1581 )
1582 .aura(
1583 "demonic_art_overlord",
1584 AURA::DEMONIC_ART_OVERLORD,
1585 |a| aura_demonic_art_overlord(a, ¶ms.game_data),
1586 )
1587 .aura(
1588 "demonic_art_mother",
1589 AURA::DEMONIC_ART_MOTHER,
1590 |a| aura_demonic_art_mother(a, ¶ms.game_data),
1591 )
1592 .aura(
1593 "demonic_art_pit_lord",
1594 AURA::DEMONIC_ART_PIT_LORD,
1595 |a| aura_demonic_art_pit_lord(a, ¶ms.game_data),
1596 )
1597 .aura(
1598 "demonic_oculi",
1599 AURA::DEMONIC_OCULI,
1600 |a| aura_demonic_oculi(a, ¶ms.game_data),
1601 )
1602 .aura(
1603 "diabolic_oculi_talent",
1604 AURA::DIABOLIC_OCULI_TALENT,
1605 |a| aura_diabolic_oculi_talent(a, ¶ms.game_data),
1606 )
1607 .aura(
1608 "looks_that_kill_talent",
1609 AURA::LOOKS_THAT_KILL_TALENT,
1610 |a| aura_looks_that_kill_talent(a, ¶ms.game_data),
1611 )
1612 .aura(
1613 "minds_eyes_talent",
1614 AURA::MINDS_EYES_TALENT,
1615 |a| aura_minds_eyes_talent(a, ¶ms.game_data),
1616 )
1617 .aura("minds_eyes", AURA::MINDS_EYES, |a| aura_minds_eyes(a, ¶ms.game_data))
1618 .aura(
1619 "abyssal_dominion",
1620 AURA::ABYSSAL_DOMINION,
1621 |a| aura_abyssal_dominion(a, ¶ms.game_data),
1622 )
1623 .aura(
1624 "abyssal_dominion_talent",
1625 AURA::ABYSSAL_DOMINION_TALENT,
1626 |a| aura_abyssal_dominion_talent(a, ¶ms.game_data),
1627 )
1628 .aura(
1629 "cloven_soul",
1630 AURA::CLOVEN_SOUL,
1631 |a| aura_cloven_soul(a, ¶ms.game_data),
1632 )
1633 .spell(
1634 "shadow_bolt",
1635 SPELL::SHADOW_BOLT,
1636 |s| spell_shadow_bolt(s, ¶ms.game_data),
1637 )
1638 .spell("demonbolt", SPELL::DEMONBOLT, |s| spell_demonbolt(s, ¶ms.game_data))
1639 .spell(
1640 "hand_of_guldan",
1641 SPELL::HAND_OF_GULDAN,
1642 |s| spell_hand_of_guldan(s, ¶ms.game_data),
1643 )
1644 .spell(
1645 "power_siphon",
1646 SPELL::POWER_SIPHON,
1647 |s| spell_power_siphon(s, ¶ms.game_data),
1648 )
1649 .spell(
1650 "drain_life",
1651 SPELL::DRAIN_LIFE,
1652 |s| spell_drain_life(s, ¶ms.game_data),
1653 )
1654 .spell(
1655 "summon_felguard",
1656 SPELL::SUMMON_FELGUARD,
1657 |s| spell_summon_felguard(s, ¶ms.game_data),
1658 )
1659 .spell(
1660 "summon_felhunter",
1661 SPELL::SUMMON_FELHUNTER,
1662 |s| spell_summon_felhunter(s, ¶ms.game_data),
1663 )
1664 .spell(
1665 "summon_imp",
1666 SPELL::SUMMON_IMP,
1667 |s| spell_summon_imp(s, ¶ms.game_data),
1668 )
1669 .spell(
1670 "call_dreadstalkers",
1671 SPELL::CALL_DREADSTALKERS,
1672 |s| spell_call_dreadstalkers(s, ¶ms.game_data),
1673 )
1674 .spell(
1675 "summon_demonic_tyrant",
1676 SPELL::SUMMON_DEMONIC_TYRANT,
1677 |s| spell_summon_demonic_tyrant(s, ¶ms.game_data),
1678 )
1679 .spell(
1680 "summon_vilefiend",
1681 SPELL::SUMMON_VILEFIEND,
1682 |s| spell_summon_vilefiend(s, ¶ms.game_data),
1683 )
1684 .spell("implosion", SPELL::IMPLOSION, |s| spell_implosion(s, ¶ms.game_data))
1685 .spell(
1686 "grimoire_imp_lord",
1687 SPELL::GRIMOIRE_IMP_LORD,
1688 |s| spell_grimoire_imp_lord(s, ¶ms.game_data),
1689 )
1690 .spell(
1691 "grimoire_fel_ravager",
1692 SPELL::GRIMOIRE_FEL_RAVAGER,
1693 |s| spell_grimoire_fel_ravager(s, ¶ms.game_data),
1694 )
1695 .spell(
1696 "summon_doomguard",
1697 SPELL::SUMMON_DOOMGUARD,
1698 |s| spell_summon_doomguard(s, ¶ms.game_data),
1699 )
1700 .spell(
1701 "infernal_bolt",
1702 SPELL::INFERNAL_BOLT,
1703 |s| spell_infernal_bolt(s, ¶ms.game_data),
1704 )
1705 .spell("ruination", SPELL::RUINATION, |s| spell_ruination(s, ¶ms.game_data))
1706 .auto_attack(|a| {
1707 a
1708 .spell_id(1)
1709 .swing_ms(2000)
1710 .apply_base_from_data(¶ms.game_data)
1711 .ap_coef(0.7297)
1712 .is_pet()
1713 .uses_spell_power()
1714 })
1715 .game_data(params.game_data.clone())
1716 .talent_spell_ids(TALENTS)
1717 .talent_selections(params.talent_selections)
1718 .talent_companion_aura(
1719 TALENT::ABYSSAL_DOMINION_TALENT,
1720 AURA_ABYSSAL_DOMINION_TALENT,
1721 )
1722 .talent_companion_aura(
1723 TALENT::CARNIVOROUS_STALKERS,
1724 AURA_CARNIVOROUS_STALKERS_TALENT,
1725 )
1726 .talent_companion_aura(TALENT::DIABOLIC_OCULI, AURA_DIABOLIC_OCULI_TALENT)
1727 .talent_companion_aura(TALENT::DIABOLIC_RITUAL, AURA_DIABOLIC_RITUAL_TALENT)
1728 .talent_companion_aura(TALENT::FLAMETOUCHED, AURA_FLAMETOUCHED_TALENT)
1729 .talent_companion_aura(TALENT::LOOKS_THAT_KILL, AURA_LOOKS_THAT_KILL_TALENT)
1730 .talent_companion_aura(TALENT::MINDS_EYES, AURA_MINDS_EYES_TALENT)
1731 .set_bonus_auras(params.set_bonus_auras)
1732 .encounter(params.encounter.clone());
1733 let builder = crate::generated::items::register_equipped(
1734 builder,
1735 ¶ms.game_data,
1736 params.equipped_items,
1737 )?;
1738
1739 builder.into_draft()
1740}
1741fn new_handler(
1742 params: wowlab_engine_ports::HandlerParams<'_>,
1743) -> Result<Box<dyn SpecHandler>, wowlab_engine_ports::EngineError> {
1744 let handler = crate::composition::compose_handler(
1745 build_combat_system_draft,
1746 ¶ms,
1747 crate::hooks::demonology_warlock::DemonologyHandler::new,
1748 )?;
1749
1750 Ok(Box::new(handler))
1751}
1752static DECLARED_METADATA: DeclaredSpecMetadata = DeclaredSpecMetadata {
1753 primary_resource: ResourceType::SoulShards,
1754 secondary_resource: None,
1755 spell_ids: DECLARED_SPELL_IDS,
1756 aura_ids: DECLARED_AURA_IDS,
1757 server_proc_entries: &[],
1758 talents: TALENTS,
1759 rotation_field_schema: &[],
1760 metrics_plugin_id: None,
1761 hero_talent_trees: &[
1762 HeroTalentTreeDesc {
1763 name: "Soul Harvester",
1764 spells: HERO_TREE_SOUL_HARVESTER_SPELLS,
1765 auras: HERO_TREE_SOUL_HARVESTER_AURAS,
1766 },
1767 HeroTalentTreeDesc {
1768 name: "Diabolist",
1769 spells: HERO_TREE_DIABOLIST_SPELLS,
1770 auras: HERO_TREE_DIABOLIST_AURAS,
1771 },
1772 ],
1773 reported_spells: REPORTED_SPELLS,
1774 masked_passive_effects: &[],
1775 passive_effect_overrides: &[],
1776};
1777pub(super) const SPEC_DESCRIPTOR: SpecDescriptor = SpecDescriptor {
1778 spec_id: SpecId::Demonology,
1779 display_name: "Demonology Warlock",
1780 metadata: DECLARED_METADATA,
1781 handler_factory: new_handler,
1782};
1783wowlab_engine_combat::smoke_test!(build_combat_system_draft);