Skip to main content

wowlab_engine_content/generated/specs/
affliction_warlock.rs

1//! @generated by codegen-cli from manifests/specs/warlock/affliction/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_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    ///<https://wowlab.gg/inspect/spell/691>
15    pub(crate) const SUMMON_FELHUNTER: u32 = 691;
16    ///<https://wowlab.gg/inspect/spell/688>
17    pub(crate) const SUMMON_IMP: u32 = 688;
18    ///<https://wowlab.gg/inspect/spell/108503>
19    pub(crate) const GRIMOIRE_OF_SACRIFICE: u32 = 108_503;
20    ///<https://wowlab.gg/inspect/spell/980>
21    pub(crate) const AGONY: u32 = 980;
22    ///<https://wowlab.gg/inspect/spell/172>
23    pub(crate) const CORRUPTION: u32 = 172;
24    ///<https://wowlab.gg/inspect/spell/1259790>
25    pub(crate) const UNSTABLE_AFFLICTION: u32 = 1_259_790;
26    ///<https://wowlab.gg/inspect/spell/27243>
27    pub(crate) const SEED_OF_CORRUPTION: u32 = 27243;
28    ///<https://wowlab.gg/inspect/spell/48181>
29    pub(crate) const HAUNT: u32 = 48181;
30    ///<https://wowlab.gg/inspect/spell/205180>
31    pub(crate) const SUMMON_DARKGLARE: u32 = 205_180;
32    ///<https://wowlab.gg/inspect/spell/1257052>
33    pub(crate) const DARK_HARVEST: u32 = 1_257_052;
34    ///<https://wowlab.gg/inspect/spell/686>
35    pub(crate) const SHADOW_BOLT: u32 = 686;
36    ///<https://wowlab.gg/inspect/spell/198590>
37    pub(crate) const DRAIN_SOUL: u32 = 198_590;
38    ///<https://wowlab.gg/inspect/spell/1261153>
39    pub(crate) const MALEFIC_GRASP: u32 = 1_261_153;
40    ///<https://wowlab.gg/inspect/spell/234153>
41    pub(crate) const DRAIN_LIFE: u32 = 234_153;
42    ///<https://wowlab.gg/inspect/spell/430014>
43    pub(crate) const MALEVOLENCE: u32 = 430_014;
44}
45pub(crate) mod AURA {
46    ///<https://wowlab.gg/inspect/spell/980>
47    pub(crate) const AGONY: u32 = 980;
48    ///<https://wowlab.gg/inspect/spell/146739>
49    pub(crate) const CORRUPTION: u32 = 146_739;
50    ///<https://wowlab.gg/inspect/spell/1259790>
51    pub(crate) const UNSTABLE_AFFLICTION: u32 = 1_259_790;
52    ///<https://wowlab.gg/inspect/spell/1305774>
53    pub(crate) const UNSTABLE_EMPOWERMENT: u32 = 1_305_774;
54    ///<https://wowlab.gg/inspect/spell/27243>
55    pub(crate) const SEED_OF_CORRUPTION: u32 = 27243;
56    ///<https://wowlab.gg/inspect/spell/1279998>
57    pub(crate) const SEED_OF_CORRUPTION_IS_OUT_DNT: u32 = 1_279_998;
58    ///<https://wowlab.gg/inspect/spell/1288970>
59    pub(crate) const RECENTLY_DEMON_HAS_BEEN_SUMMONED_DNT: u32 = 1_288_970;
60    ///<https://wowlab.gg/inspect/spell/264571>
61    pub(crate) const NIGHTFALL: u32 = 264_571;
62    ///<https://wowlab.gg/inspect/spell/48181>
63    pub(crate) const HAUNT: u32 = 48181;
64    ///<https://wowlab.gg/inspect/spell/1280663>
65    pub(crate) const DARKGLARE_PRESENCE: u32 = 1_280_663;
66    ///<https://wowlab.gg/inspect/spell/1260269>
67    pub(crate) const SHARD_INSTABILITY: u32 = 1_260_269;
68    ///<https://wowlab.gg/inspect/spell/1261125>
69    pub(crate) const CASCADING_CALAMITY: u32 = 1_261_125;
70    ///<https://wowlab.gg/inspect/spell/196099>
71    pub(crate) const GRIMOIRE_OF_SACRIFICE: u32 = 196_099;
72    ///<https://wowlab.gg/inspect/spell/445474>
73    pub(crate) const WITHER: u32 = 445_474;
74    ///<https://wowlab.gg/inspect/spell/442726>
75    pub(crate) const MALEVOLENCE: u32 = 442_726;
76    ///<https://wowlab.gg/inspect/spell/449793>
77    pub(crate) const SUCCULENT_SOUL: u32 = 449_793;
78    ///<https://wowlab.gg/inspect/spell/1269042>
79    pub(crate) const MANIFESTED_DEMONIC_SOUL: u32 = 1_269_042;
80    ///<https://wowlab.gg/inspect/spell/450538>
81    pub(crate) const SOUL_ANATHEMA: u32 = 450_538;
82    ///<https://wowlab.gg/inspect/spell/462599>
83    pub(crate) const TRACK_PETS: u32 = 462_599;
84}
85pub(crate) mod TALENT {
86    ///<https://wowlab.gg/inspect/spell/196103>
87    pub(crate) const ABSOLUTE_CORRUPTION: u32 = 196_103;
88    ///<https://wowlab.gg/inspect/spell/1261124>
89    pub(crate) const CASCADING_CALAMITY: u32 = 1_261_124;
90    ///<https://wowlab.gg/inspect/spell/264000>
91    pub(crate) const CREEPING_DEATH: u32 = 264_000;
92    ///<https://wowlab.gg/inspect/spell/453172>
93    pub(crate) const CUNNING_CRUELTY: u32 = 453_172;
94    ///<https://wowlab.gg/inspect/spell/1257052>
95    pub(crate) const DARK_HARVEST: u32 = 1_257_052;
96    ///<https://wowlab.gg/inspect/spell/234876>
97    pub(crate) const DEATHS_EMBRACE: u32 = 234_876;
98    ///<https://wowlab.gg/inspect/spell/449629>
99    pub(crate) const DEMONIACS_FERVOR: u32 = 449_629;
100    ///<https://wowlab.gg/inspect/spell/449614>
101    pub(crate) const DEMONIC_SOUL: u32 = 449_614;
102    ///<https://wowlab.gg/inspect/spell/388667>
103    pub(crate) const DRAIN_SOUL: u32 = 388_667;
104    ///<https://wowlab.gg/inspect/spell/1260229>
105    pub(crate) const FATAL_ECHOES: u32 = 1_260_229;
106    ///<https://wowlab.gg/inspect/spell/108503>
107    pub(crate) const GRIMOIRE_OF_SACRIFICE: u32 = 108_503;
108    ///<https://wowlab.gg/inspect/spell/48181>
109    pub(crate) const HAUNT: u32 = 48181;
110    ///<https://wowlab.gg/inspect/spell/1312998>
111    pub(crate) const IMPETUOUS_WRATH: u32 = 1_312_998;
112    ///<https://wowlab.gg/inspect/spell/453080>
113    pub(crate) const IMPROVED_SHADOW_BOLT: u32 = 453_080;
114    ///<https://wowlab.gg/inspect/spell/1261149>
115    pub(crate) const MALEFIC_GRASP: u32 = 1_261_149;
116    ///<https://wowlab.gg/inspect/spell/430014>
117    pub(crate) const MALEVOLENCE: u32 = 430_014;
118    ///<https://wowlab.gg/inspect/spell/1268884>
119    pub(crate) const MANIFESTED_AVARICE: u32 = 1_268_884;
120    ///<https://wowlab.gg/inspect/spell/108558>
121    pub(crate) const NIGHTFALL: u32 = 108_558;
122    ///<https://wowlab.gg/inspect/spell/1260271>
123    pub(crate) const NOCTURNAL_YIELD: u32 = 1_260_271;
124    ///<https://wowlab.gg/inspect/spell/459440>
125    pub(crate) const RAVENOUS_AFFLICTIONS: u32 = 459_440;
126    ///<https://wowlab.gg/inspect/spell/449638>
127    pub(crate) const SHADOW_OF_DEATH: u32 = 449_638;
128    ///<https://wowlab.gg/inspect/spell/1261984>
129    pub(crate) const SHADOW_OF_NATHREZA: u32 = 1_261_984;
130    ///<https://wowlab.gg/inspect/spell/1261990>
131    pub(crate) const SHADOW_OF_NATHREZA_2: u32 = 1_261_990;
132    ///<https://wowlab.gg/inspect/spell/1261992>
133    pub(crate) const SHADOW_OF_NATHREZA_3: u32 = 1_261_992;
134    ///<https://wowlab.gg/inspect/spell/1260264>
135    pub(crate) const SHARD_INSTABILITY: u32 = 1_260_264;
136    ///<https://wowlab.gg/inspect/spell/449624>
137    pub(crate) const SOUL_ANATHEMA: u32 = 449_624;
138    ///<https://wowlab.gg/inspect/spell/205180>
139    pub(crate) const SUMMON_DARKGLARE: u32 = 205_180;
140    ///<https://wowlab.gg/inspect/spell/386976>
141    pub(crate) const WITHERING_BOLT: u32 = 386_976;
142}
143pub(crate) mod SET_BONUS {
144    ///<https://wowlab.gg/inspect/spell/1296568>
145    pub(crate) const MID2_AFFLICTION_2PC: u32 = 1_296_568;
146    ///<https://wowlab.gg/inspect/spell/1296569>
147    pub(crate) const MID2_AFFLICTION_4PC: u32 = 1_296_569;
148}
149pub(crate) mod REPORTED_SPELL {
150    ///<https://wowlab.gg/inspect/spell/1257065>
151    pub(crate) const DARK_HARVEST_TICK: u32 = 1_257_065;
152    ///<https://wowlab.gg/inspect/spell/449801>
153    pub(crate) const DEMONIC_SOUL: u32 = 449_801;
154    ///<https://wowlab.gg/inspect/spell/205231>
155    pub(crate) const EYE_BEAM: u32 = 205_231;
156    ///<https://wowlab.gg/inspect/spell/1262710>
157    pub(crate) const SHADOW_OF_NATHREZA: u32 = 1_262_710;
158    ///<https://wowlab.gg/inspect/spell/1269049>
159    pub(crate) const SOUL_SWIPE: u32 = 1_269_049;
160    ///<https://wowlab.gg/inspect/spell/1278047>
161    pub(crate) const WRATH_OF_NATHREZA: u32 = 1_278_047;
162}
163pub(crate) mod HERO {
164    pub(crate) mod HELLCALLER {
165        pub(crate) mod SPELL {
166            ///<https://wowlab.gg/inspect/spell/445736>
167            pub(crate) const BLACKENED_SOUL_DAMAGE: u32 = 445_736;
168            ///<https://wowlab.gg/inspect/spell/445731>
169            pub(crate) const BLACKENED_SOUL_TRIGGER: u32 = 445_731;
170            ///<https://wowlab.gg/inspect/spell/430014>
171            pub(crate) const MALEVOLENCE: u32 = 430_014;
172            ///<https://wowlab.gg/inspect/spell/446285>
173            pub(crate) const MALEVOLENCE_DAMAGE: u32 = 446_285;
174            ///<https://wowlab.gg/inspect/spell/445465>
175            pub(crate) const WITHER: u32 = 445_465;
176            ///<https://wowlab.gg/inspect/spell/445468>
177            pub(crate) const WITHER_DIRECT: u32 = 445_468;
178        }
179        pub(crate) mod AURA {
180            ///<https://wowlab.gg/inspect/spell/445731>
181            pub(crate) const BLACKENED_SOUL: u32 = 445_731;
182            ///<https://wowlab.gg/inspect/spell/442726>
183            pub(crate) const MALEVOLENCE_BUFF: u32 = 442_726;
184            ///<https://wowlab.gg/inspect/spell/445474>
185            pub(crate) const WITHER_DOT: u32 = 445_474;
186        }
187    }
188    pub(crate) mod SOUL_HARVESTER {
189        pub(crate) mod SPELL {
190            ///<https://wowlab.gg/inspect/spell/449858>
191            pub(crate) const DARK_HARVEST_ENERGIZE: u32 = 449_858;
192            ///<https://wowlab.gg/inspect/spell/449801>
193            pub(crate) const DEMONIC_SOUL_DAMAGE: u32 = 449_801;
194            ///<https://wowlab.gg/inspect/spell/450591>
195            pub(crate) const SHARED_FATE: u32 = 450_591;
196            ///<https://wowlab.gg/inspect/spell/450538>
197            pub(crate) const SOUL_ANATHEMA: u32 = 450_538;
198            ///<https://wowlab.gg/inspect/spell/449826>
199            pub(crate) const WICKED_REAPING: u32 = 449_826;
200        }
201        pub(crate) mod AURA {
202            ///<https://wowlab.gg/inspect/spell/1269042>
203            pub(crate) const MANIFESTED_DEMONIC_SOUL: u32 = 1_269_042;
204            ///<https://wowlab.gg/inspect/spell/449793>
205            pub(crate) const SUCCULENT_SOUL: u32 = 449_793;
206        }
207    }
208}
209static HERO_TREE_HELLCALLER_SPELLS: &[(&str, u32)] = &[
210    ("BLACKENED_SOUL_DAMAGE", 445_736),
211    ("BLACKENED_SOUL_TRIGGER", 445_731),
212    ("MALEVOLENCE", 430_014),
213    ("MALEVOLENCE_DAMAGE", 446_285),
214    ("WITHER", 445_465),
215    ("WITHER_DIRECT", 445_468),
216];
217static HERO_TREE_HELLCALLER_AURAS: &[(&str, u32)] = &[
218    ("BLACKENED_SOUL", 445_731),
219    ("MALEVOLENCE_BUFF", 442_726),
220    ("WITHER_DOT", 445_474),
221];
222static HERO_TREE_SOUL_HARVESTER_SPELLS: &[(&str, u32)] = &[
223    ("DARK_HARVEST_ENERGIZE", 449_858),
224    ("DEMONIC_SOUL_DAMAGE", 449_801),
225    ("SHARED_FATE", 450_591),
226    ("SOUL_ANATHEMA", 450_538),
227    ("WICKED_REAPING", 449_826),
228];
229static HERO_TREE_SOUL_HARVESTER_AURAS: &[(&str, u32)] = &[
230    ("MANIFESTED_DEMONIC_SOUL", 1_269_042),
231    ("SUCCULENT_SOUL", 449_793),
232];
233pub(crate) mod DAMAGE_SPELL {
234    pub(crate) const SUMMON_FELHUNTER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_691;
235    pub(crate) const SUMMON_IMP: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_688;
236    pub(crate) const GRIMOIRE_OF_SACRIFICE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_108503;
237    pub(crate) const AGONY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_980;
238    pub(crate) const CORRUPTION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_172;
239    pub(crate) const UNSTABLE_AFFLICTION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_1259790;
240    pub(crate) const SEED_OF_CORRUPTION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_27243;
241    pub(crate) const HAUNT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_48181;
242    pub(crate) const SUMMON_DARKGLARE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_205180;
243    pub(crate) const DARK_HARVEST: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_1257052;
244    pub(crate) const SHADOW_BOLT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_686;
245    pub(crate) const DRAIN_SOUL: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_198590;
246    pub(crate) const MALEFIC_GRASP: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_1261153;
247    pub(crate) const DRAIN_LIFE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_234153;
248    pub(crate) const MALEVOLENCE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_430014;
249    pub(crate) const BLACKENED_SOUL_DAMAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_445736;
250    pub(crate) const BLACKENED_SOUL_TRIGGER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_445731;
251    pub(crate) const MALEVOLENCE_DAMAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_446285;
252    pub(crate) const WITHER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_445465;
253    pub(crate) const WITHER_DIRECT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_445468;
254    pub(crate) const DARK_HARVEST_ENERGIZE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_449858;
255    pub(crate) const DEMONIC_SOUL_DAMAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_449801;
256    pub(crate) const SHARED_FATE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_450591;
257    pub(crate) const SOUL_ANATHEMA: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_450538;
258    pub(crate) const WICKED_REAPING: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_449826;
259}
260pub(crate) mod DAMAGE_AURA {
261    pub(crate) const AGONY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_980;
262    pub(crate) const CORRUPTION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_146739;
263    pub(crate) const UNSTABLE_AFFLICTION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_1259790;
264    pub(crate) const UNSTABLE_EMPOWERMENT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_1305774;
265    pub(crate) const SEED_OF_CORRUPTION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_27243;
266    pub(crate) const SEED_OF_CORRUPTION_IS_OUT_DNT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_1279998;
267    pub(crate) const RECENTLY_DEMON_HAS_BEEN_SUMMONED_DNT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_1288970;
268    pub(crate) const NIGHTFALL: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_264571;
269    pub(crate) const HAUNT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_48181;
270    pub(crate) const DARKGLARE_PRESENCE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_1280663;
271    pub(crate) const SHARD_INSTABILITY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_1260269;
272    pub(crate) const CASCADING_CALAMITY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_1261125;
273    pub(crate) const GRIMOIRE_OF_SACRIFICE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_196099;
274    pub(crate) const WITHER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_445474;
275    pub(crate) const MALEVOLENCE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_442726;
276    pub(crate) const SUCCULENT_SOUL: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_449793;
277    pub(crate) const MANIFESTED_DEMONIC_SOUL: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_1269042;
278    pub(crate) const SOUL_ANATHEMA: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_450538;
279    pub(crate) const TRACK_PETS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_462599;
280}
281pub(crate) mod DAMAGE_TALENT {
282    pub(crate) const ABSOLUTE_CORRUPTION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_196103;
283    pub(crate) const CASCADING_CALAMITY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_1261124;
284    pub(crate) const CREEPING_DEATH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_264000;
285    pub(crate) const CUNNING_CRUELTY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_453172;
286    pub(crate) const DARK_HARVEST: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_1257052;
287    pub(crate) const DEATHS_EMBRACE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_234876;
288    pub(crate) const DEMONIACS_FERVOR: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_449629;
289    pub(crate) const DEMONIC_SOUL: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_449614;
290    pub(crate) const DRAIN_SOUL: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_388667;
291    pub(crate) const FATAL_ECHOES: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_1260229;
292    pub(crate) const GRIMOIRE_OF_SACRIFICE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_108503;
293    pub(crate) const HAUNT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_48181;
294    pub(crate) const IMPETUOUS_WRATH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_1312998;
295    pub(crate) const IMPROVED_SHADOW_BOLT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_453080;
296    pub(crate) const MALEFIC_GRASP: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_1261149;
297    pub(crate) const MALEVOLENCE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_430014;
298    pub(crate) const MANIFESTED_AVARICE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_1268884;
299    pub(crate) const NIGHTFALL: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_108558;
300    pub(crate) const NOCTURNAL_YIELD: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_1260271;
301    pub(crate) const RAVENOUS_AFFLICTIONS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_459440;
302    pub(crate) const SHADOW_OF_DEATH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_449638;
303    pub(crate) const SHADOW_OF_NATHREZA: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_1261984;
304    pub(crate) const SHADOW_OF_NATHREZA_2: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_1261990;
305    pub(crate) const SHADOW_OF_NATHREZA_3: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_1261992;
306    pub(crate) const SHARD_INSTABILITY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_1260264;
307    pub(crate) const SOUL_ANATHEMA: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_449624;
308    pub(crate) const SUMMON_DARKGLARE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_205180;
309    pub(crate) const WITHERING_BOLT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_386976;
310}
311pub(crate) mod DAMAGE_REPORTED {
312    pub(crate) const DARK_HARVEST_TICK: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_1257065;
313    pub(crate) const DEMONIC_SOUL: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_449801;
314    pub(crate) const EYE_BEAM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_205231;
315    pub(crate) const SHADOW_OF_NATHREZA: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_1262710;
316    pub(crate) const SOUL_SWIPE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_1269049;
317    pub(crate) const WRATH_OF_NATHREZA: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ACTION::SPELL_1278047;
318}
319pub(crate) mod DAMAGE_EFFECT {
320    pub(crate) const POTENT_AFFLICTIONS_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::EFFECT::SPELL_77215_EFFECT_1;
321    pub(crate) const POTENT_AFFLICTIONS_DIRECT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::EFFECT::SPELL_77215_EFFECT_2;
322    pub(crate) const POTENT_AFFLICTIONS_LABEL_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::EFFECT::SPELL_77215_EFFECT_3;
323    pub(crate) const MID2_AFFLICTION_2PC_CORRUPTION: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::EFFECT::SPELL_1296568_EFFECT_1;
324    pub(crate) const MID2_AFFLICTION_2PC_AGONY: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::EFFECT::SPELL_1296568_EFFECT_2;
325    pub(crate) const MID2_AFFLICTION_4PC_SEED: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::EFFECT::SPELL_1296569_EFFECT_1;
326    pub(crate) const IMPETUOUS_WRATH_NORMAL: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::EFFECT::SPELL_1312998_EFFECT_1;
327    pub(crate) const IMPETUOUS_WRATH_HAUNT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::EFFECT::SPELL_1312998_EFFECT_2;
328    pub(crate) const IMPETUOUS_WRATH_DARK_HARVEST: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::EFFECT::SPELL_1312998_EFFECT_3;
329    pub(crate) const IMPETUOUS_WRATH_DARK_HARVEST_HAUNT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::EFFECT::SPELL_1312998_EFFECT_4;
330    pub(crate) const EYE_BEAM_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::EFFECT::SPELL_205231_EFFECT_1;
331    pub(crate) const EYE_BEAM_PER_DOT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::EFFECT::SPELL_205180_EFFECT_3;
332    pub(crate) const DEMONIC_SOUL_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::EFFECT::SPELL_449801_EFFECT_1;
333    pub(crate) const DEMONIACS_FERVOR_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::EFFECT::SPELL_449629_EFFECT_1;
334    pub(crate) const SOUL_SWIPE_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::EFFECT::SPELL_1269049_EFFECT_1;
335    pub(crate) const SOUL_SWIPE_AOE_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::EFFECT::SPELL_1269049_EFFECT_2;
336    pub(crate) const SHADOW_OF_NATHREZA_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::EFFECT::SPELL_1262710_EFFECT_1;
337    pub(crate) const WRATH_OF_NATHREZA_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::EFFECT::SPELL_1278047_EFFECT_1;
338    pub(crate) const SHADOW_OF_DEATH_SHARDS: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::EFFECT::SPELL_449638_EFFECT_2;
339}
340pub(crate) const AURA_AGONY: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::affliction_warlock::AURA_AGONY
341    .bind(wowlab_engine_combat::generated_identities::specs::affliction_warlock::PROOF);
342pub(crate) const AURA_CORRUPTION: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::affliction_warlock::AURA_CORRUPTION
343    .bind(wowlab_engine_combat::generated_identities::specs::affliction_warlock::PROOF);
344pub(crate) const AURA_UNSTABLE_AFFLICTION: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::affliction_warlock::AURA_UNSTABLE_AFFLICTION
345    .bind(wowlab_engine_combat::generated_identities::specs::affliction_warlock::PROOF);
346pub(crate) const AURA_UNSTABLE_EMPOWERMENT: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::affliction_warlock::AURA_UNSTABLE_EMPOWERMENT
347    .bind(wowlab_engine_combat::generated_identities::specs::affliction_warlock::PROOF);
348pub(crate) const AURA_SEED_OF_CORRUPTION: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::affliction_warlock::AURA_SEED_OF_CORRUPTION
349    .bind(wowlab_engine_combat::generated_identities::specs::affliction_warlock::PROOF);
350pub(crate) const AURA_SEED_OF_CORRUPTION_IS_OUT_DNT: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::affliction_warlock::AURA_SEED_OF_CORRUPTION_IS_OUT_DNT
351    .bind(wowlab_engine_combat::generated_identities::specs::affliction_warlock::PROOF);
352pub(crate) const AURA_RECENTLY_DEMON_HAS_BEEN_SUMMONED_DNT: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::affliction_warlock::AURA_RECENTLY_DEMON_HAS_BEEN_SUMMONED_DNT
353    .bind(wowlab_engine_combat::generated_identities::specs::affliction_warlock::PROOF);
354pub(crate) const AURA_NIGHTFALL: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::affliction_warlock::AURA_NIGHTFALL
355    .bind(wowlab_engine_combat::generated_identities::specs::affliction_warlock::PROOF);
356pub(crate) const AURA_HAUNT: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::affliction_warlock::AURA_HAUNT
357    .bind(wowlab_engine_combat::generated_identities::specs::affliction_warlock::PROOF);
358pub(crate) const AURA_DARKGLARE_PRESENCE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::affliction_warlock::AURA_DARKGLARE_PRESENCE
359    .bind(wowlab_engine_combat::generated_identities::specs::affliction_warlock::PROOF);
360pub(crate) const AURA_SHARD_INSTABILITY: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::affliction_warlock::AURA_SHARD_INSTABILITY
361    .bind(wowlab_engine_combat::generated_identities::specs::affliction_warlock::PROOF);
362pub(crate) const AURA_CASCADING_CALAMITY: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::affliction_warlock::AURA_CASCADING_CALAMITY
363    .bind(wowlab_engine_combat::generated_identities::specs::affliction_warlock::PROOF);
364pub(crate) const AURA_GRIMOIRE_OF_SACRIFICE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::affliction_warlock::AURA_GRIMOIRE_OF_SACRIFICE
365    .bind(wowlab_engine_combat::generated_identities::specs::affliction_warlock::PROOF);
366pub(crate) const AURA_WITHER: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::affliction_warlock::AURA_WITHER
367    .bind(wowlab_engine_combat::generated_identities::specs::affliction_warlock::PROOF);
368pub(crate) const AURA_MALEVOLENCE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::affliction_warlock::AURA_MALEVOLENCE
369    .bind(wowlab_engine_combat::generated_identities::specs::affliction_warlock::PROOF);
370pub(crate) const AURA_SUCCULENT_SOUL: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::affliction_warlock::AURA_SUCCULENT_SOUL
371    .bind(wowlab_engine_combat::generated_identities::specs::affliction_warlock::PROOF);
372pub(crate) const AURA_MANIFESTED_DEMONIC_SOUL: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::affliction_warlock::AURA_MANIFESTED_DEMONIC_SOUL
373    .bind(wowlab_engine_combat::generated_identities::specs::affliction_warlock::PROOF);
374pub(crate) const AURA_SOUL_ANATHEMA: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::affliction_warlock::AURA_SOUL_ANATHEMA
375    .bind(wowlab_engine_combat::generated_identities::specs::affliction_warlock::PROOF);
376pub(crate) const AURA_TRACK_PETS: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::affliction_warlock::AURA_TRACK_PETS
377    .bind(wowlab_engine_combat::generated_identities::specs::affliction_warlock::PROOF);
378pub(crate) const AURA_COUNT: usize = 19;
379const _: () = assert!(
380    AURA_COUNT == 19, "AURA index ABI: count changed -- update positional hook consumers"
381);
382pub(crate) const SPELL_SUMMON_FELHUNTER: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::affliction_warlock::SPELL_SUMMON_FELHUNTER
383    .bind(wowlab_engine_combat::generated_identities::specs::affliction_warlock::PROOF);
384pub(crate) const SPELL_SUMMON_IMP: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::affliction_warlock::SPELL_SUMMON_IMP
385    .bind(wowlab_engine_combat::generated_identities::specs::affliction_warlock::PROOF);
386pub(crate) const SPELL_GRIMOIRE_OF_SACRIFICE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::affliction_warlock::SPELL_GRIMOIRE_OF_SACRIFICE
387    .bind(wowlab_engine_combat::generated_identities::specs::affliction_warlock::PROOF);
388pub(crate) const SPELL_AGONY: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::affliction_warlock::SPELL_AGONY
389    .bind(wowlab_engine_combat::generated_identities::specs::affliction_warlock::PROOF);
390pub(crate) const SPELL_CORRUPTION: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::affliction_warlock::SPELL_CORRUPTION
391    .bind(wowlab_engine_combat::generated_identities::specs::affliction_warlock::PROOF);
392pub(crate) const SPELL_UNSTABLE_AFFLICTION: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::affliction_warlock::SPELL_UNSTABLE_AFFLICTION
393    .bind(wowlab_engine_combat::generated_identities::specs::affliction_warlock::PROOF);
394pub(crate) const SPELL_SEED_OF_CORRUPTION: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::affliction_warlock::SPELL_SEED_OF_CORRUPTION
395    .bind(wowlab_engine_combat::generated_identities::specs::affliction_warlock::PROOF);
396pub(crate) const SPELL_HAUNT: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::affliction_warlock::SPELL_HAUNT
397    .bind(wowlab_engine_combat::generated_identities::specs::affliction_warlock::PROOF);
398pub(crate) const SPELL_SUMMON_DARKGLARE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::affliction_warlock::SPELL_SUMMON_DARKGLARE
399    .bind(wowlab_engine_combat::generated_identities::specs::affliction_warlock::PROOF);
400pub(crate) const SPELL_DARK_HARVEST: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::affliction_warlock::SPELL_DARK_HARVEST
401    .bind(wowlab_engine_combat::generated_identities::specs::affliction_warlock::PROOF);
402pub(crate) const SPELL_SHADOW_BOLT: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::affliction_warlock::SPELL_SHADOW_BOLT
403    .bind(wowlab_engine_combat::generated_identities::specs::affliction_warlock::PROOF);
404pub(crate) const SPELL_DRAIN_SOUL: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::affliction_warlock::SPELL_DRAIN_SOUL
405    .bind(wowlab_engine_combat::generated_identities::specs::affliction_warlock::PROOF);
406pub(crate) const SPELL_MALEFIC_GRASP: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::affliction_warlock::SPELL_MALEFIC_GRASP
407    .bind(wowlab_engine_combat::generated_identities::specs::affliction_warlock::PROOF);
408pub(crate) const SPELL_DRAIN_LIFE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::affliction_warlock::SPELL_DRAIN_LIFE
409    .bind(wowlab_engine_combat::generated_identities::specs::affliction_warlock::PROOF);
410pub(crate) const SPELL_MALEVOLENCE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::affliction_warlock::SPELL_MALEVOLENCE
411    .bind(wowlab_engine_combat::generated_identities::specs::affliction_warlock::PROOF);
412pub(crate) const SPELL_COUNT: usize = 15;
413const _: () = assert!(
414    SPELL_COUNT == 15,
415    "SPELL index ABI: count changed -- update positional hook consumers"
416);
417pub(crate) mod EFFECT {
418    ///<https://wowlab.gg/inspect/spell/77215>
419    pub(crate) const POTENT_AFFLICTIONS_DAMAGE: (u32, u8) = (77215, 1);
420    ///<https://wowlab.gg/inspect/spell/77215>
421    pub(crate) const POTENT_AFFLICTIONS_DIRECT: (u32, u8) = (77215, 2);
422    ///<https://wowlab.gg/inspect/spell/77215>
423    pub(crate) const POTENT_AFFLICTIONS_LABEL_DAMAGE: (u32, u8) = (77215, 3);
424    ///<https://wowlab.gg/inspect/spell/1296568>
425    pub(crate) const MID2_AFFLICTION_2PC_CORRUPTION: (u32, u8) = (1_296_568, 1);
426    ///<https://wowlab.gg/inspect/spell/1296568>
427    pub(crate) const MID2_AFFLICTION_2PC_AGONY: (u32, u8) = (1_296_568, 2);
428    ///<https://wowlab.gg/inspect/spell/1296569>
429    pub(crate) const MID2_AFFLICTION_4PC_SEED: (u32, u8) = (1_296_569, 1);
430    ///<https://wowlab.gg/inspect/spell/1312998>
431    pub(crate) const IMPETUOUS_WRATH_NORMAL: (u32, u8) = (1_312_998, 1);
432    ///<https://wowlab.gg/inspect/spell/1312998>
433    pub(crate) const IMPETUOUS_WRATH_HAUNT: (u32, u8) = (1_312_998, 2);
434    ///<https://wowlab.gg/inspect/spell/1312998>
435    pub(crate) const IMPETUOUS_WRATH_DARK_HARVEST: (u32, u8) = (1_312_998, 3);
436    ///<https://wowlab.gg/inspect/spell/1312998>
437    pub(crate) const IMPETUOUS_WRATH_DARK_HARVEST_HAUNT: (u32, u8) = (1_312_998, 4);
438    ///<https://wowlab.gg/inspect/spell/205231>
439    pub(crate) const EYE_BEAM_DAMAGE: (u32, u8) = (205_231, 1);
440    ///<https://wowlab.gg/inspect/spell/205180>
441    pub(crate) const EYE_BEAM_PER_DOT: (u32, u8) = (205_180, 3);
442    ///<https://wowlab.gg/inspect/spell/449801>
443    pub(crate) const DEMONIC_SOUL_DAMAGE: (u32, u8) = (449_801, 1);
444    ///<https://wowlab.gg/inspect/spell/449629>
445    pub(crate) const DEMONIACS_FERVOR_DAMAGE: (u32, u8) = (449_629, 1);
446    ///<https://wowlab.gg/inspect/spell/1269049>
447    pub(crate) const SOUL_SWIPE_DAMAGE: (u32, u8) = (1_269_049, 1);
448    ///<https://wowlab.gg/inspect/spell/1269049>
449    pub(crate) const SOUL_SWIPE_AOE_DAMAGE: (u32, u8) = (1_269_049, 2);
450    ///<https://wowlab.gg/inspect/spell/1262710>
451    pub(crate) const SHADOW_OF_NATHREZA_DAMAGE: (u32, u8) = (1_262_710, 1);
452    ///<https://wowlab.gg/inspect/spell/1278047>
453    pub(crate) const WRATH_OF_NATHREZA_DAMAGE: (u32, u8) = (1_278_047, 1);
454    ///<https://wowlab.gg/inspect/spell/449638>
455    pub(crate) const SHADOW_OF_DEATH_SHARDS: (u32, u8) = (449_638, 2);
456}
457static REPORTED_SPELLS: &[(&str, u32)] = &[
458    ("dark_harvest_tick", 1_257_065),
459    ("demonic_soul", 449_801),
460    ("eye_beam", 205_231),
461    ("shadow_of_nathreza", 1_262_710),
462    ("soul_swipe", 1_269_049),
463    ("wrath_of_nathreza", 1_278_047),
464];
465static DECLARED_SPELL_IDS: &[u32] = &[
466    691, 688, 108_503, 980, 172, 1_259_790, 27243, 48181, 205_180, 1_257_052, 686,
467    198_590, 1_261_153, 234_153, 430_014, 146_739, 1_305_774, 1_279_998, 1_288_970,
468    264_571, 1_280_663, 1_260_269, 1_261_125, 196_099, 445_474, 442_726, 449_793,
469    1_269_042, 450_538, 462_599, 196_103, 1_261_124, 264_000, 453_172, 234_876, 449_629,
470    449_614, 388_667, 1_260_229, 1_312_998, 453_080, 1_261_149, 1_268_884, 108_558,
471    1_260_271, 459_440, 449_638, 1_261_984, 1_261_990, 1_261_992, 1_260_264, 449_624,
472    386_976, 1, 77215, 205_231, 449_801, 1_257_065, 1_262_710, 1_269_049, 1_278_047,
473    1_296_568, 1_296_569, 445_736, 445_731, 446_285, 445_465, 445_468, 449_858, 450_591,
474    449_826,
475];
476static DECLARED_AURA_IDS: &[u32] = &[
477    980, 146_739, 1_259_790, 1_305_774, 27243, 1_279_998, 1_288_970, 264_571, 48181,
478    1_280_663, 1_260_269, 1_261_125, 196_099, 445_474, 442_726, 449_793, 1_269_042,
479    450_538, 462_599, 445_731, 442_726, 445_474, 1_269_042, 449_793,
480];
481static TALENTS: &[(&str, u32)] = &[
482    ("ABSOLUTE_CORRUPTION", TALENT::ABSOLUTE_CORRUPTION),
483    ("CASCADING_CALAMITY", TALENT::CASCADING_CALAMITY),
484    ("CREEPING_DEATH", TALENT::CREEPING_DEATH),
485    ("CUNNING_CRUELTY", TALENT::CUNNING_CRUELTY),
486    ("DARK_HARVEST", TALENT::DARK_HARVEST),
487    ("DEATHS_EMBRACE", TALENT::DEATHS_EMBRACE),
488    ("DEMONIACS_FERVOR", TALENT::DEMONIACS_FERVOR),
489    ("DEMONIC_SOUL", TALENT::DEMONIC_SOUL),
490    ("DRAIN_SOUL", TALENT::DRAIN_SOUL),
491    ("FATAL_ECHOES", TALENT::FATAL_ECHOES),
492    ("GRIMOIRE_OF_SACRIFICE", TALENT::GRIMOIRE_OF_SACRIFICE),
493    ("HAUNT", TALENT::HAUNT),
494    ("IMPETUOUS_WRATH", TALENT::IMPETUOUS_WRATH),
495    ("IMPROVED_SHADOW_BOLT", TALENT::IMPROVED_SHADOW_BOLT),
496    ("MALEFIC_GRASP", TALENT::MALEFIC_GRASP),
497    ("MALEVOLENCE", TALENT::MALEVOLENCE),
498    ("MANIFESTED_AVARICE", TALENT::MANIFESTED_AVARICE),
499    ("NIGHTFALL", TALENT::NIGHTFALL),
500    ("NOCTURNAL_YIELD", TALENT::NOCTURNAL_YIELD),
501    ("RAVENOUS_AFFLICTIONS", TALENT::RAVENOUS_AFFLICTIONS),
502    ("SHADOW_OF_DEATH", TALENT::SHADOW_OF_DEATH),
503    ("SHADOW_OF_NATHREZA", TALENT::SHADOW_OF_NATHREZA),
504    ("SHADOW_OF_NATHREZA_2", TALENT::SHADOW_OF_NATHREZA_2),
505    ("SHADOW_OF_NATHREZA_3", TALENT::SHADOW_OF_NATHREZA_3),
506    ("SHARD_INSTABILITY", TALENT::SHARD_INSTABILITY),
507    ("SOUL_ANATHEMA", TALENT::SOUL_ANATHEMA),
508    ("SUMMON_DARKGLARE", TALENT::SUMMON_DARKGLARE),
509    ("WITHERING_BOLT", TALENT::WITHERING_BOLT),
510];
511pub(crate) mod AFFLICTION_WARLOCK {
512    pub(crate) const AGONY_CASTS: u32 = 0;
513    pub(crate) const CORRUPTION_CASTS: u32 = 1;
514    pub(crate) const UNSTABLE_AFFLICTION_CASTS: u32 = 2;
515    pub(crate) const SHADOW_BOLT_CASTS: u32 = 3;
516    pub(crate) const HAUNT_CASTS: u32 = 4;
517    pub(crate) const SUMMON_DARKGLARE_CASTS: u32 = 5;
518    pub(crate) const DARK_HARVEST_CASTS: u32 = 6;
519    pub(crate) const AGONY_UPTIME_MS: u32 = 7;
520    pub(crate) const CORRUPTION_UPTIME_MS: u32 = 8;
521    pub(crate) const UNSTABLE_AFFLICTION_UPTIME_MS: u32 = 9;
522}
523fn aura_agony(
524    a: AuraDefinitionDraft,
525    data: &ResolvedGameData,
526) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
527    a.on_target()
528        .apply_base_from_data(data, 980)?
529        .max_stacks(
530            data.require_aura_max_stacks(wowlab_types::sim::SpellIdx::from_raw(980))?,
531        )
532        .snapshot()
533        .periodic_damage_sp_from_data(
534            data,
535            wowlab_engine_combat::PeriodicDamageDataInput {
536                tick_ms: wowlab_engine_combat::validated_milliseconds(
537                    data.period(wowlab_types::sim::SpellIdx::from_raw(980), 1),
538                    980,
539                    "periodic_damage.tick_ms",
540                )?,
541                spell_id: 980,
542                effect_index: 1,
543                multiplier: 8.0,
544                offset: -0.000_000_808_56,
545                round_decimals: Some(6),
546            },
547        )?
548        .apply_periodic_behavior_from_data(data, 980)
549}
550fn aura_corruption(
551    a: AuraDefinitionDraft,
552    data: &ResolvedGameData,
553) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
554    a.on_target()
555        .duration_ms(
556            wowlab_engine_combat::validated_milliseconds(
557                f64::from(
558                    data
559                        .require_aura_duration_ms(
560                            wowlab_types::sim::SpellIdx::from_raw(196_103),
561                        )?,
562                ),
563                146_739,
564                "aura.duration_ms",
565            )?,
566        )
567        .apply_periodic_effect_from_data(data, 146_739)?
568        .apply_duration_behavior_from_data(data, 196_103)?
569        .apply_timing_modifiers_from_data(data, 146_739)?
570        .max_stacks(
571            data.require_aura_max_stacks(wowlab_types::sim::SpellIdx::from_raw(146_739))?,
572        )
573        .snapshot()
574        .periodic_damage_sp_from_data(
575            data,
576            wowlab_engine_combat::PeriodicDamageDataInput {
577                tick_ms: wowlab_engine_combat::validated_milliseconds(
578                    data.period(wowlab_types::sim::SpellIdx::from_raw(146_739), 1),
579                    146_739,
580                    "periodic_damage.tick_ms",
581                )?,
582                spell_id: 146_739,
583                effect_index: 1,
584                multiplier: 1.15,
585                offset: 0.0,
586                round_decimals: Some(6),
587            },
588        )?
589        .apply_periodic_behavior_from_data(data, 146_739)
590}
591fn aura_unstable_affliction(
592    a: AuraDefinitionDraft,
593    data: &ResolvedGameData,
594) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
595    Ok(
596        a
597            .on_target()
598            .apply_base_from_data(data, 1_259_790)?
599            .max_stacks(
600                data
601                    .require_aura_max_stacks(
602                        wowlab_types::sim::SpellIdx::from_raw(1_259_790),
603                    )?,
604            )
605            .snapshot()
606            .on_expire(crate::hooks::affliction_warlock::unstable_affliction_expire_hook),
607    )
608}
609fn aura_unstable_empowerment(
610    a: AuraDefinitionDraft,
611    data: &ResolvedGameData,
612) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
613    Ok(
614        a
615            .on_player()
616            .apply_base_from_data(data, 1_305_774)?
617            .max_stacks(
618                data
619                    .require_aura_max_stacks(
620                        wowlab_types::sim::SpellIdx::from_raw(1_305_774),
621                    )?,
622            ),
623    )
624}
625fn aura_seed_of_corruption(
626    a: AuraDefinitionDraft,
627    data: &ResolvedGameData,
628) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
629    Ok(
630        a
631            .on_target()
632            .apply_base_from_data(data, 27243)?
633            .max_stacks(
634                data
635                    .require_aura_max_stacks(
636                        wowlab_types::sim::SpellIdx::from_raw(27243),
637                    )?,
638            ),
639    )
640}
641fn aura_seed_of_corruption_is_out_dnt(
642    a: AuraDefinitionDraft,
643    data: &ResolvedGameData,
644) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
645    Ok(
646        a
647            .on_player()
648            .apply_base_from_data(data, 1_279_998)?
649            .max_stacks(
650                data
651                    .require_aura_max_stacks(
652                        wowlab_types::sim::SpellIdx::from_raw(1_279_998),
653                    )?,
654            ),
655    )
656}
657fn aura_recently_demon_has_been_summoned_dnt(
658    a: AuraDefinitionDraft,
659    data: &ResolvedGameData,
660) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
661    Ok(
662        a
663            .on_player()
664            .apply_base_from_data(data, 1_288_970)?
665            .max_stacks(
666                data
667                    .require_aura_max_stacks(
668                        wowlab_types::sim::SpellIdx::from_raw(1_288_970),
669                    )?,
670            ),
671    )
672}
673fn aura_nightfall(
674    a: AuraDefinitionDraft,
675    data: &ResolvedGameData,
676) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
677    Ok(
678        a
679            .on_player()
680            .apply_base_from_data(data, 264_571)?
681            .max_stacks(
682                data
683                    .require_aura_max_stacks(
684                        wowlab_types::sim::SpellIdx::from_raw(264_571),
685                    )?,
686            ),
687    )
688}
689fn aura_haunt(
690    a: AuraDefinitionDraft,
691    data: &ResolvedGameData,
692) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
693    Ok(
694        a
695            .on_target()
696            .apply_base_from_data(data, 48181)?
697            .max_stacks(
698                data
699                    .require_aura_max_stacks(
700                        wowlab_types::sim::SpellIdx::from_raw(48181),
701                    )?,
702            )
703            .periodic_hook(
704                wowlab_engine_combat::validated_milliseconds(
705                    data.period(wowlab_types::sim::SpellIdx::from_raw(48181), 5),
706                    48181,
707                    "periodic_hook.tick_ms",
708                )?,
709            )
710            .apply_periodic_behavior_from_data(data, 48181)?
711            .tick_hook(crate::hooks::affliction_warlock::haunt_tick_hook),
712    )
713}
714fn aura_darkglare_presence(
715    a: AuraDefinitionDraft,
716    data: &ResolvedGameData,
717) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
718    Ok(
719        a
720            .on_player()
721            .apply_base_from_data(data, 1_280_663)?
722            .max_stacks(
723                data
724                    .require_aura_max_stacks(
725                        wowlab_types::sim::SpellIdx::from_raw(1_280_663),
726                    )?,
727            ),
728    )
729}
730fn aura_shard_instability(
731    a: AuraDefinitionDraft,
732    data: &ResolvedGameData,
733) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
734    Ok(
735        a
736            .on_player()
737            .apply_base_from_data(data, 1_260_269)?
738            .max_stacks(
739                data
740                    .require_aura_max_stacks(
741                        wowlab_types::sim::SpellIdx::from_raw(1_260_269),
742                    )?,
743            ),
744    )
745}
746fn aura_cascading_calamity(
747    a: AuraDefinitionDraft,
748    data: &ResolvedGameData,
749) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
750    Ok(
751        a
752            .on_player()
753            .apply_base_from_data(data, 1_261_125)?
754            .max_stacks(
755                data
756                    .require_aura_max_stacks(
757                        wowlab_types::sim::SpellIdx::from_raw(1_261_125),
758                    )?,
759            ),
760    )
761}
762fn aura_grimoire_of_sacrifice(
763    a: AuraDefinitionDraft,
764    data: &ResolvedGameData,
765) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
766    Ok(
767        a
768            .on_player()
769            .apply_base_from_data(data, 196_099)?
770            .max_stacks(
771                data
772                    .require_aura_max_stacks(
773                        wowlab_types::sim::SpellIdx::from_raw(196_099),
774                    )?,
775            ),
776    )
777}
778fn aura_wither(
779    a: AuraDefinitionDraft,
780    data: &ResolvedGameData,
781) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
782    a.on_target()
783        .apply_base_from_data(data, 445_474)?
784        .max_stacks(
785            data.require_aura_max_stacks(wowlab_types::sim::SpellIdx::from_raw(445_474))?,
786        )
787        .snapshot()
788        .periodic_damage_sp(
789            wowlab_engine_combat::validated_milliseconds(
790                2000.0,
791                445_474,
792                "periodic_damage.tick_ms",
793            )?,
794            0.112,
795            wowlab_engine_combat::DamageFlags::empty(),
796        )
797        .apply_periodic_behavior_from_data(data, 445_474)
798}
799fn aura_malevolence(
800    a: AuraDefinitionDraft,
801    data: &ResolvedGameData,
802) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
803    Ok(
804        a
805            .on_player()
806            .apply_base_from_data(data, 442_726)?
807            .max_stacks(
808                data
809                    .require_aura_max_stacks(
810                        wowlab_types::sim::SpellIdx::from_raw(442_726),
811                    )?,
812            ),
813    )
814}
815fn aura_succulent_soul(
816    a: AuraDefinitionDraft,
817    data: &ResolvedGameData,
818) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
819    Ok(
820        a
821            .on_player()
822            .apply_base_from_data(data, 449_793)?
823            .max_stacks(
824                data
825                    .require_aura_max_stacks(
826                        wowlab_types::sim::SpellIdx::from_raw(449_793),
827                    )?,
828            ),
829    )
830}
831fn aura_manifested_demonic_soul(
832    a: AuraDefinitionDraft,
833    data: &ResolvedGameData,
834) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
835    Ok(
836        a
837            .on_player()
838            .apply_base_from_data(data, 1_269_042)?
839            .max_stacks(
840                data
841                    .require_aura_max_stacks(
842                        wowlab_types::sim::SpellIdx::from_raw(1_269_042),
843                    )?,
844            ),
845    )
846}
847fn aura_soul_anathema(
848    a: AuraDefinitionDraft,
849    data: &ResolvedGameData,
850) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
851    Ok(
852        a
853            .on_target()
854            .apply_base_from_data(data, 450_538)?
855            .max_stacks(
856                data
857                    .require_aura_max_stacks(
858                        wowlab_types::sim::SpellIdx::from_raw(450_538),
859                    )?,
860            ),
861    )
862}
863fn aura_track_pets(
864    a: AuraDefinitionDraft,
865    data: &ResolvedGameData,
866) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
867    Ok(
868        a
869            .on_player()
870            .apply_base_from_data(data, 462_599)?
871            .max_stacks(
872                data
873                    .require_aura_max_stacks(
874                        wowlab_types::sim::SpellIdx::from_raw(462_599),
875                    )?,
876            ),
877    )
878}
879fn spell_summon_felhunter(
880    s: SpellDefinitionDraft,
881    data: &ResolvedGameData,
882) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
883    Ok(s.apply_base_from_data(data, 691)?.apply_aoe_from_data(data))
884}
885fn spell_summon_imp(
886    s: SpellDefinitionDraft,
887    data: &ResolvedGameData,
888) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
889    Ok(s.apply_base_from_data(data, 688)?.apply_aoe_from_data(data))
890}
891fn spell_grimoire_of_sacrifice(
892    s: SpellDefinitionDraft,
893    data: &ResolvedGameData,
894) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
895    Ok(
896        s
897            .apply_base_from_data(data, 108_503)?
898            .applies_aura(AURA_GRIMOIRE_OF_SACRIFICE)
899            .apply_aoe_from_data(data),
900    )
901}
902fn spell_agony(
903    s: SpellDefinitionDraft,
904    data: &ResolvedGameData,
905) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
906    Ok(
907        s
908            .apply_base_from_data(data, 980)?
909            .applies_inferred_aura(AURA_AGONY, 980)
910            .apply_aoe_from_data(data),
911    )
912}
913fn spell_corruption(
914    s: SpellDefinitionDraft,
915    data: &ResolvedGameData,
916) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
917    Ok(
918        s
919            .apply_base_from_data(data, 172)?
920            .applies_aura(AURA_CORRUPTION)
921            .apply_aoe_from_data(data),
922    )
923}
924fn spell_unstable_affliction(
925    s: SpellDefinitionDraft,
926    data: &ResolvedGameData,
927) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
928    Ok(
929        s
930            .apply_base_from_data(data, 1_259_790)?
931            .applies_inferred_aura(AURA_UNSTABLE_AFFLICTION, 1_259_790)
932            .apply_aoe_from_data(data)
933            .on_cast(crate::hooks::affliction_warlock::unstable_affliction_hook),
934    )
935}
936fn spell_seed_of_corruption(
937    s: SpellDefinitionDraft,
938    data: &ResolvedGameData,
939) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
940    Ok(
941        s
942            .apply_base_from_data(data, 27243)?
943            .applies_inferred_aura(AURA_SEED_OF_CORRUPTION, 27243)
944            .apply_aoe_from_data(data)
945            .on_cast(crate::hooks::affliction_warlock::seed_of_corruption_hook),
946    )
947}
948fn spell_haunt(
949    s: SpellDefinitionDraft,
950    data: &ResolvedGameData,
951) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
952    Ok(
953        s
954            .apply_base_from_data(data, 48181)?
955            .applies_inferred_aura(AURA_HAUNT, 48181)
956            .apply_aoe_from_data(data),
957    )
958}
959fn spell_summon_darkglare(
960    s: SpellDefinitionDraft,
961    data: &ResolvedGameData,
962) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
963    Ok(
964        s
965            .apply_base_from_data(data, 205_180)?
966            .apply_aoe_from_data(data)
967            .on_cast(crate::hooks::affliction_warlock::summon_darkglare_hook),
968    )
969}
970fn spell_dark_harvest(
971    s: SpellDefinitionDraft,
972    data: &ResolvedGameData,
973) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
974    Ok(
975        s
976            .apply_base_from_data(data, 1_257_052)?
977            .apply_aoe_from_data(data)
978            .channel(
979                wowlab_engine_combat::validated_channel_tick_count(
980                    4.0,
981                    1_257_052,
982                    "channel.tick_count",
983                )?,
984            )
985            .channel_tick_damage_sp_from_data(
986                wowlab_engine_domain::dbc::EffectLookup::new(
987                    data,
988                    wowlab_types::sim::EffectRef::new(
989                        wowlab_types::sim::SpellIdx::from_raw(1_257_065),
990                        1,
991                    ),
992                ),
993            )?
994            .on_channel_tick(crate::hooks::affliction_warlock::dark_harvest_tick_hook)
995            .on_cast(crate::hooks::affliction_warlock::dark_harvest_hook),
996    )
997}
998fn spell_shadow_bolt(
999    s: SpellDefinitionDraft,
1000    data: &ResolvedGameData,
1001) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1002    Ok(s.apply_base_from_data(data, 686)?.apply_aoe_from_data(data))
1003}
1004fn spell_drain_soul(
1005    s: SpellDefinitionDraft,
1006    data: &ResolvedGameData,
1007) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1008    Ok(s.apply_base_from_data(data, 198_590)?.apply_aoe_from_data(data))
1009}
1010fn spell_malefic_grasp(
1011    s: SpellDefinitionDraft,
1012    data: &ResolvedGameData,
1013) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1014    Ok(s.apply_base_from_data(data, 1_261_153)?.apply_aoe_from_data(data))
1015}
1016fn spell_drain_life(
1017    s: SpellDefinitionDraft,
1018    data: &ResolvedGameData,
1019) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1020    Ok(s.apply_base_from_data(data, 234_153)?.apply_aoe_from_data(data))
1021}
1022fn spell_malevolence(
1023    s: SpellDefinitionDraft,
1024    data: &ResolvedGameData,
1025) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1026    Ok(
1027        s
1028            .apply_base_from_data(data, 430_014)?
1029            .applies_aura(AURA_MALEVOLENCE)
1030            .apply_aoe_from_data(data),
1031    )
1032}
1033pub(crate) fn build_combat_system_draft(
1034    params: &wowlab_engine_ports::HandlerParams<'_>,
1035) -> Result<CombatSystemDraft, wowlab_engine_ports::EngineError> {
1036    let builder = CombatSystemBuilder::new(params.stats.clone())
1037        .spec_id(SpecId::Affliction)
1038        .spec_identity(
1039            wowlab_engine_combat::generated_identities::specs::affliction_warlock::PROOF,
1040        )
1041        .hero_talent_trees(DECLARED_METADATA.hero_talent_trees)
1042        .effect_identities(
1043            wowlab_engine_combat::generated_identities::specs::affliction_warlock::damage::ALL,
1044        )
1045        .effect_identities(wowlab_engine_combat::generated_identities::shared::ALL)
1046        .mastery_spell(77215)
1047        .mastery_hook(crate::hooks::affliction_warlock::mastery)
1048        .resource(
1049            "soul_shards",
1050            5.0,
1051            params
1052                .game_data
1053                .power_regen_for_max(7, 5.0)
1054                .ok_or_else(|| {
1055                    wowlab_engine_ports::EngineError::spec_construction(
1056                        "missing power-type power_regen_for_max for type_id 7",
1057                    )
1058                })?,
1059        )
1060        .resource_type_id(7)
1061        .resource_start(3.0)
1062        .has_pet(true)
1063        .aura("agony", AURA::AGONY, |a| aura_agony(a, &params.game_data))
1064        .aura("corruption", AURA::CORRUPTION, |a| aura_corruption(a, &params.game_data))
1065        .aura(
1066            "unstable_affliction",
1067            AURA::UNSTABLE_AFFLICTION,
1068            |a| aura_unstable_affliction(a, &params.game_data),
1069        )
1070        .aura(
1071            "unstable_empowerment",
1072            AURA::UNSTABLE_EMPOWERMENT,
1073            |a| aura_unstable_empowerment(a, &params.game_data),
1074        )
1075        .aura(
1076            "seed_of_corruption",
1077            AURA::SEED_OF_CORRUPTION,
1078            |a| aura_seed_of_corruption(a, &params.game_data),
1079        )
1080        .aura(
1081            "seed_of_corruption_is_out_dnt",
1082            AURA::SEED_OF_CORRUPTION_IS_OUT_DNT,
1083            |a| aura_seed_of_corruption_is_out_dnt(a, &params.game_data),
1084        )
1085        .aura(
1086            "recently_demon_has_been_summoned_dnt",
1087            AURA::RECENTLY_DEMON_HAS_BEEN_SUMMONED_DNT,
1088            |a| aura_recently_demon_has_been_summoned_dnt(a, &params.game_data),
1089        )
1090        .aura("nightfall", AURA::NIGHTFALL, |a| aura_nightfall(a, &params.game_data))
1091        .aura("haunt", AURA::HAUNT, |a| aura_haunt(a, &params.game_data))
1092        .aura(
1093            "darkglare_presence",
1094            AURA::DARKGLARE_PRESENCE,
1095            |a| aura_darkglare_presence(a, &params.game_data),
1096        )
1097        .aura(
1098            "shard_instability",
1099            AURA::SHARD_INSTABILITY,
1100            |a| aura_shard_instability(a, &params.game_data),
1101        )
1102        .aura(
1103            "cascading_calamity",
1104            AURA::CASCADING_CALAMITY,
1105            |a| aura_cascading_calamity(a, &params.game_data),
1106        )
1107        .aura(
1108            "grimoire_of_sacrifice",
1109            AURA::GRIMOIRE_OF_SACRIFICE,
1110            |a| aura_grimoire_of_sacrifice(a, &params.game_data),
1111        )
1112        .aura("wither", AURA::WITHER, |a| aura_wither(a, &params.game_data))
1113        .aura(
1114            "malevolence",
1115            AURA::MALEVOLENCE,
1116            |a| aura_malevolence(a, &params.game_data),
1117        )
1118        .aura(
1119            "succulent_soul",
1120            AURA::SUCCULENT_SOUL,
1121            |a| aura_succulent_soul(a, &params.game_data),
1122        )
1123        .aura(
1124            "manifested_demonic_soul",
1125            AURA::MANIFESTED_DEMONIC_SOUL,
1126            |a| aura_manifested_demonic_soul(a, &params.game_data),
1127        )
1128        .aura(
1129            "soul_anathema",
1130            AURA::SOUL_ANATHEMA,
1131            |a| aura_soul_anathema(a, &params.game_data),
1132        )
1133        .aura("track_pets", AURA::TRACK_PETS, |a| aura_track_pets(a, &params.game_data))
1134        .spell(
1135            "summon_felhunter",
1136            SPELL::SUMMON_FELHUNTER,
1137            |s| spell_summon_felhunter(s, &params.game_data),
1138        )
1139        .spell(
1140            "summon_imp",
1141            SPELL::SUMMON_IMP,
1142            |s| spell_summon_imp(s, &params.game_data),
1143        )
1144        .spell(
1145            "grimoire_of_sacrifice",
1146            SPELL::GRIMOIRE_OF_SACRIFICE,
1147            |s| spell_grimoire_of_sacrifice(s, &params.game_data),
1148        )
1149        .spell("agony", SPELL::AGONY, |s| spell_agony(s, &params.game_data))
1150        .spell(
1151            "corruption",
1152            SPELL::CORRUPTION,
1153            |s| spell_corruption(s, &params.game_data),
1154        )
1155        .spell(
1156            "unstable_affliction",
1157            SPELL::UNSTABLE_AFFLICTION,
1158            |s| spell_unstable_affliction(s, &params.game_data),
1159        )
1160        .spell(
1161            "seed_of_corruption",
1162            SPELL::SEED_OF_CORRUPTION,
1163            |s| spell_seed_of_corruption(s, &params.game_data),
1164        )
1165        .spell("haunt", SPELL::HAUNT, |s| spell_haunt(s, &params.game_data))
1166        .spell(
1167            "summon_darkglare",
1168            SPELL::SUMMON_DARKGLARE,
1169            |s| spell_summon_darkglare(s, &params.game_data),
1170        )
1171        .spell(
1172            "dark_harvest",
1173            SPELL::DARK_HARVEST,
1174            |s| spell_dark_harvest(s, &params.game_data),
1175        )
1176        .spell(
1177            "shadow_bolt",
1178            SPELL::SHADOW_BOLT,
1179            |s| spell_shadow_bolt(s, &params.game_data),
1180        )
1181        .spell(
1182            "drain_soul",
1183            SPELL::DRAIN_SOUL,
1184            |s| spell_drain_soul(s, &params.game_data),
1185        )
1186        .spell(
1187            "malefic_grasp",
1188            SPELL::MALEFIC_GRASP,
1189            |s| spell_malefic_grasp(s, &params.game_data),
1190        )
1191        .spell(
1192            "drain_life",
1193            SPELL::DRAIN_LIFE,
1194            |s| spell_drain_life(s, &params.game_data),
1195        )
1196        .spell(
1197            "malevolence",
1198            SPELL::MALEVOLENCE,
1199            |s| spell_malevolence(s, &params.game_data),
1200        )
1201        .auto_attack(|a| {
1202            a
1203                .spell_id(1)
1204                .swing_ms(2000)
1205                .apply_base_from_data(&params.game_data)
1206                .ap_coef(
1207                    wowlab_engine_domain::damage::pet_swing_power_coefficient(
1208                        0.575,
1209                        2000,
1210                        1.0,
1211                    ),
1212                )
1213                .is_pet()
1214                .uses_spell_power()
1215        })
1216        .game_data(params.game_data.clone())
1217        .talent_spell_ids(TALENTS)
1218        .talent_selections(params.talent_selections)
1219        .register_impact_effect_proc(
1220            wowlab_engine_combat::ImpactEffectProcDefinition::new(
1221                    wowlab_engine_combat::ImpactSource::Spell(SPELL::AGONY),
1222                )
1223                .chance(0.185)
1224                .periodic_only()
1225                .gain(1.0),
1226        )
1227        .set_bonus_auras(params.set_bonus_auras)
1228        .encounter(params.encounter.clone());
1229    let builder = crate::generated::items::register_equipped(
1230        builder,
1231        &params.game_data,
1232        params.equipped_items,
1233    )?;
1234
1235    builder.into_draft()
1236}
1237fn new_handler(
1238    params: wowlab_engine_ports::HandlerParams<'_>,
1239) -> Result<Box<dyn SpecHandler>, wowlab_engine_ports::EngineError> {
1240    let handler = crate::composition::compose_handler(
1241        build_combat_system_draft,
1242        &params,
1243        crate::hooks::affliction_warlock::AfflictionHandler::try_new,
1244    )?;
1245
1246    Ok(Box::new(handler))
1247}
1248static DECLARED_METADATA: DeclaredSpecMetadata = DeclaredSpecMetadata {
1249    primary_resource: ResourceType::SoulShards,
1250    secondary_resource: None,
1251    spell_ids: DECLARED_SPELL_IDS,
1252    aura_ids: DECLARED_AURA_IDS,
1253    server_proc_entries: &[],
1254    talents: TALENTS,
1255    rotation_field_schema: &[],
1256    metrics_plugin_id: None,
1257    hero_talent_trees: &[
1258        HeroTalentTreeDesc {
1259            name: "Hellcaller",
1260            spells: HERO_TREE_HELLCALLER_SPELLS,
1261            auras: HERO_TREE_HELLCALLER_AURAS,
1262        },
1263        HeroTalentTreeDesc {
1264            name: "Soul Harvester",
1265            spells: HERO_TREE_SOUL_HARVESTER_SPELLS,
1266            auras: HERO_TREE_SOUL_HARVESTER_AURAS,
1267        },
1268    ],
1269    reported_spells: REPORTED_SPELLS,
1270    masked_passive_effects: &[],
1271    passive_effect_overrides: &[],
1272};
1273pub(super) const SPEC_DESCRIPTOR: SpecDescriptor = SpecDescriptor {
1274    spec_id: SpecId::Affliction,
1275    display_name: "Affliction Warlock",
1276    metadata: DECLARED_METADATA,
1277    handler_factory: new_handler,
1278};
1279wowlab_engine_combat::smoke_test!(build_combat_system_draft);