Skip to main content

wowlab_engine_content/generated/specs/
shadow_priest.rs

1//! @generated by codegen-cli from manifests/specs/priest/shadow/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/8092>
15    pub(crate) const MIND_BLAST: u32 = 8092;
16    ///<https://wowlab.gg/inspect/spell/589>
17    pub(crate) const SHADOW_WORD_PAIN: u32 = 589;
18    ///<https://wowlab.gg/inspect/spell/34914>
19    pub(crate) const VAMPIRIC_TOUCH: u32 = 34914;
20    ///<https://wowlab.gg/inspect/spell/335467>
21    pub(crate) const SHADOW_WORD_MADNESS: u32 = 335_467;
22    ///<https://wowlab.gg/inspect/spell/228260>
23    pub(crate) const VOIDFORM: u32 = 228_260;
24    ///<https://wowlab.gg/inspect/spell/1242173>
25    pub(crate) const VOID_VOLLEY: u32 = 1_242_173;
26    ///<https://wowlab.gg/inspect/spell/263165>
27    pub(crate) const VOID_TORRENT: u32 = 263_165;
28    ///<https://wowlab.gg/inspect/spell/15407>
29    pub(crate) const MIND_FLAY: u32 = 15407;
30    ///<https://wowlab.gg/inspect/spell/32379>
31    pub(crate) const SHADOW_WORD_DEATH: u32 = 32379;
32    ///<https://wowlab.gg/inspect/spell/120644>
33    pub(crate) const HALO: u32 = 120_644;
34    ///<https://wowlab.gg/inspect/spell/10060>
35    pub(crate) const POWER_INFUSION: u32 = 10060;
36    ///<https://wowlab.gg/inspect/spell/232698>
37    pub(crate) const SHADOWFORM: u32 = 232_698;
38    ///<https://wowlab.gg/inspect/spell/21562>
39    pub(crate) const POWER_WORD_FORTITUDE: u32 = 21562;
40    ///<https://wowlab.gg/inspect/spell/413231>
41    pub(crate) const SHADOWY_APPARITION: u32 = 413_231;
42    ///<https://wowlab.gg/inspect/spell/1264176>
43    pub(crate) const VOID_APPARITION: u32 = 1_264_176;
44    ///<https://wowlab.gg/inspect/spell/1264177>
45    pub(crate) const VOID_BOLT: u32 = 1_264_177;
46    ///<https://wowlab.gg/inspect/spell/1227280>
47    pub(crate) const TENTACLE_SLAM: u32 = 1_227_280;
48    ///<https://wowlab.gg/inspect/spell/1227621>
49    pub(crate) const TENTACLE_SLAM_DAMAGE: u32 = 1_227_621;
50}
51pub(crate) mod AURA {
52    ///<https://wowlab.gg/inspect/spell/232698>
53    pub(crate) const SHADOWFORM: u32 = 232_698;
54    ///<https://wowlab.gg/inspect/spell/194249>
55    pub(crate) const VOIDFORM: u32 = 194_249;
56    ///<https://wowlab.gg/inspect/spell/1242171>
57    pub(crate) const VOID_VOLLEY_CHARGES: u32 = 1_242_171;
58    ///<https://wowlab.gg/inspect/spell/1296580>
59    pub(crate) const VOID_VOLLEY_SET_BONUS: u32 = 1_296_580;
60    ///<https://wowlab.gg/inspect/spell/1231346>
61    pub(crate) const ANCIENT_MADNESS_EXTENSION: u32 = 1_231_346;
62    ///<https://wowlab.gg/inspect/spell/1304485>
63    pub(crate) const ANCIENT_MADNESS: u32 = 1_304_485;
64    ///<https://wowlab.gg/inspect/spell/589>
65    pub(crate) const SHADOW_WORD_PAIN: u32 = 589;
66    ///<https://wowlab.gg/inspect/spell/34914>
67    pub(crate) const VAMPIRIC_TOUCH: u32 = 34914;
68    ///<https://wowlab.gg/inspect/spell/335467>
69    pub(crate) const SHADOW_WORD_MADNESS: u32 = 335_467;
70    ///<https://wowlab.gg/inspect/spell/375981>
71    pub(crate) const SHADOWY_INSIGHT: u32 = 375_981;
72    ///<https://wowlab.gg/inspect/spell/373204>
73    pub(crate) const MIND_DEVOURER: u32 = 373_204;
74    ///<https://wowlab.gg/inspect/spell/391401>
75    pub(crate) const MIND_FLAY_INSANITY: u32 = 391_401;
76    ///<https://wowlab.gg/inspect/spell/393919>
77    pub(crate) const SCREAMS_OF_THE_VOID: u32 = 393_919;
78    ///<https://wowlab.gg/inspect/spell/392507>
79    pub(crate) const DEATHSPEAKER: u32 = 392_507;
80    ///<https://wowlab.gg/inspect/spell/238558>
81    pub(crate) const MISERY: u32 = 238_558;
82    ///<https://wowlab.gg/inspect/spell/1271911>
83    pub(crate) const POWER_WORD_FORTITUDE_HIGHLIGHT: u32 = 1_271_911;
84    ///<https://wowlab.gg/inspect/spell/10060>
85    pub(crate) const POWER_INFUSION: u32 = 10060;
86    ///<https://wowlab.gg/inspect/spell/289577>
87    pub(crate) const VOID_TORRENT: u32 = 289_577;
88    ///<https://wowlab.gg/inspect/spell/373212>
89    pub(crate) const INSIDIOUS_IRE: u32 = 373_212;
90    ///<https://wowlab.gg/inspect/spell/391092>
91    pub(crate) const SHATTERED_PSYCHE: u32 = 391_092;
92    ///<https://wowlab.gg/inspect/spell/450983>
93    pub(crate) const VOID_BLAST: u32 = 450_983;
94    ///<https://wowlab.gg/inspect/spell/407430>
95    pub(crate) const VOIDTOUCHED: u32 = 407_430;
96    ///<https://wowlab.gg/inspect/spell/1279437>
97    pub(crate) const CRUSHING_VOID: u32 = 1_279_437;
98    ///<https://wowlab.gg/inspect/spell/1227280>
99    pub(crate) const TENTACLE_SLAM: u32 = 1_227_280;
100    ///<https://wowlab.gg/inspect/spell/447448>
101    pub(crate) const ENTROPIC_RIFT: u32 = 447_448;
102    ///<https://wowlab.gg/inspect/spell/449887>
103    pub(crate) const VOIDHEART: u32 = 449_887;
104}
105pub(crate) mod TALENT {
106    ///<https://wowlab.gg/inspect/spell/1231346>
107    pub(crate) const ANCIENT_MADNESS: u32 = 1_231_346;
108    ///<https://wowlab.gg/inspect/spell/155271>
109    pub(crate) const AUSPICIOUS_SPIRITS: u32 = 155_271;
110    ///<https://wowlab.gg/inspect/spell/448403>
111    pub(crate) const COLLAPSING_VOID: u32 = 448_403;
112    ///<https://wowlab.gg/inspect/spell/1279437>
113    pub(crate) const CRUSHING_VOID: u32 = 1_279_437;
114    ///<https://wowlab.gg/inspect/spell/449912>
115    pub(crate) const DARKENING_HORIZON: u32 = 449_912;
116    ///<https://wowlab.gg/inspect/spell/392507>
117    pub(crate) const DEATHSPEAKER: u32 = 392_507;
118    ///<https://wowlab.gg/inspect/spell/120644>
119    pub(crate) const HALO: u32 = 120_644;
120    ///<https://wowlab.gg/inspect/spell/377349>
121    pub(crate) const IDOL_OF_CTHUN: u32 = 377_349;
122    ///<https://wowlab.gg/inspect/spell/373280>
123    pub(crate) const IDOL_OF_NZOTH: u32 = 373_280;
124    ///<https://wowlab.gg/inspect/spell/373273>
125    pub(crate) const IDOL_OF_YOGGSARON: u32 = 373_273;
126    ///<https://wowlab.gg/inspect/spell/341240>
127    pub(crate) const IMPROVED_VOIDFORM: u32 = 341_240;
128    ///<https://wowlab.gg/inspect/spell/373212>
129    pub(crate) const INSIDIOUS_IRE: u32 = 373_212;
130    ///<https://wowlab.gg/inspect/spell/1279353>
131    pub(crate) const MADDENING_TENTACLES: u32 = 1_279_353;
132    ///<https://wowlab.gg/inspect/spell/1240394>
133    pub(crate) const MADNESS_WEAVING: u32 = 1_240_394;
134    ///<https://wowlab.gg/inspect/spell/373202>
135    pub(crate) const MIND_DEVOURER: u32 = 373_202;
136    ///<https://wowlab.gg/inspect/spell/238558>
137    pub(crate) const MISERY: u32 = 238_558;
138    ///<https://wowlab.gg/inspect/spell/10060>
139    pub(crate) const POWER_INFUSION: u32 = 10060;
140    ///<https://wowlab.gg/inspect/spell/199484>
141    pub(crate) const PSYCHIC_LINK: u32 = 199_484;
142    ///<https://wowlab.gg/inspect/spell/375767>
143    pub(crate) const SCREAMS_OF_THE_VOID: u32 = 375_767;
144    ///<https://wowlab.gg/inspect/spell/73510>
145    pub(crate) const SHADEBURST: u32 = 73510;
146    ///<https://wowlab.gg/inspect/spell/341491>
147    pub(crate) const SHADOWY_APPARITIONS: u32 = 341_491;
148    ///<https://wowlab.gg/inspect/spell/375888>
149    pub(crate) const SHADOWY_INSIGHT: u32 = 375_888;
150    ///<https://wowlab.gg/inspect/spell/335467>
151    pub(crate) const SHADOW_WORD_MADNESS: u32 = 335_467;
152    ///<https://wowlab.gg/inspect/spell/391090>
153    pub(crate) const SHATTERED_PSYCHE: u32 = 391_090;
154    ///<https://wowlab.gg/inspect/spell/391399>
155    pub(crate) const SURGE_OF_INSANITY: u32 = 391_399;
156    ///<https://wowlab.gg/inspect/spell/1227280>
157    pub(crate) const TENTACLE_SLAM: u32 = 1_227_280;
158    ///<https://wowlab.gg/inspect/spell/391284>
159    pub(crate) const TORMENTED_SPIRITS: u32 = 391_284;
160    ///<https://wowlab.gg/inspect/spell/228260>
161    pub(crate) const VOIDFORM: u32 = 228_260;
162    ///<https://wowlab.gg/inspect/spell/449880>
163    pub(crate) const VOIDHEART: u32 = 449_880;
164    ///<https://wowlab.gg/inspect/spell/1264096>
165    pub(crate) const VOID_APPARITIONS_1: u32 = 1_264_096;
166    ///<https://wowlab.gg/inspect/spell/1264104>
167    pub(crate) const VOID_APPARITIONS_2: u32 = 1_264_104;
168    ///<https://wowlab.gg/inspect/spell/1264107>
169    pub(crate) const VOID_APPARITIONS_3: u32 = 1_264_107;
170    ///<https://wowlab.gg/inspect/spell/450405>
171    pub(crate) const VOID_BLAST: u32 = 450_405;
172    ///<https://wowlab.gg/inspect/spell/263165>
173    pub(crate) const VOID_TORRENT: u32 = 263_165;
174}
175pub(crate) mod SET_BONUS {
176    ///<https://wowlab.gg/inspect/spell/1296579>
177    pub(crate) const MID2_SHADOW_2PC: u32 = 1_296_579;
178    ///<https://wowlab.gg/inspect/spell/1296580>
179    pub(crate) const MID2_SHADOW_4PC: u32 = 1_296_580;
180}
181pub(crate) mod HERO {
182    pub(crate) mod ARCHON {
183        pub(crate) mod SPELL {
184            ///<https://wowlab.gg/inspect/spell/120696>
185            pub(crate) const HALO_DAMAGE: u32 = 120_696;
186            ///<https://wowlab.gg/inspect/spell/391403>
187            pub(crate) const MIND_FLAY_INSANITY: u32 = 391_403;
188            ///<https://wowlab.gg/inspect/spell/1242189>
189            pub(crate) const VOID_VOLLEY_DAMAGE: u32 = 1_242_189;
190            ///<https://wowlab.gg/inspect/spell/1242173>
191            pub(crate) const VOID_VOLLEY_MISSILE: u32 = 1_242_173;
192        }
193        pub(crate) mod AURA {
194            ///<https://wowlab.gg/inspect/spell/391401>
195            pub(crate) const MIND_FLAY_INSANITY_BUFF: u32 = 391_401;
196            ///<https://wowlab.gg/inspect/spell/453112>
197            pub(crate) const POWER_SURGE: u32 = 453_112;
198            ///<https://wowlab.gg/inspect/spell/453850>
199            pub(crate) const RESONANT_ENERGY: u32 = 453_850;
200            ///<https://wowlab.gg/inspect/spell/454002>
201            pub(crate) const SUSTAINED_POTENCY: u32 = 454_002;
202        }
203    }
204    pub(crate) mod VOIDWEAVER {
205        pub(crate) mod SPELL {
206            ///<https://wowlab.gg/inspect/spell/448405>
207            pub(crate) const COLLAPSING_VOID: u32 = 448_405;
208            ///<https://wowlab.gg/inspect/spell/447448>
209            pub(crate) const ENTROPIC_RIFT_DAMAGE: u32 = 447_448;
210            ///<https://wowlab.gg/inspect/spell/451235>
211            pub(crate) const VOIDWRAITH: u32 = 451_235;
212        }
213        pub(crate) mod AURA {
214            ///<https://wowlab.gg/inspect/spell/459314>
215            pub(crate) const ENTROPIC_RIFT_DRIVER: u32 = 459_314;
216            ///<https://wowlab.gg/inspect/spell/449887>
217            pub(crate) const VOIDHEART_BUFF: u32 = 449_887;
218            ///<https://wowlab.gg/inspect/spell/450138>
219            pub(crate) const VOID_EMPOWERMENT: u32 = 450_138;
220        }
221    }
222}
223static HERO_TREE_ARCHON_SPELLS: &[(&str, u32)] = &[
224    ("HALO_DAMAGE", 120_696),
225    ("MIND_FLAY_INSANITY", 391_403),
226    ("VOID_VOLLEY_DAMAGE", 1_242_189),
227    ("VOID_VOLLEY_MISSILE", 1_242_173),
228];
229static HERO_TREE_ARCHON_AURAS: &[(&str, u32)] = &[
230    ("MIND_FLAY_INSANITY_BUFF", 391_401),
231    ("POWER_SURGE", 453_112),
232    ("RESONANT_ENERGY", 453_850),
233    ("SUSTAINED_POTENCY", 454_002),
234];
235static HERO_TREE_VOIDWEAVER_SPELLS: &[(&str, u32)] = &[
236    ("COLLAPSING_VOID", 448_405),
237    ("ENTROPIC_RIFT_DAMAGE", 447_448),
238    ("VOIDWRAITH", 451_235),
239];
240static HERO_TREE_VOIDWEAVER_AURAS: &[(&str, u32)] = &[
241    ("ENTROPIC_RIFT_DRIVER", 459_314),
242    ("VOIDHEART_BUFF", 449_887),
243    ("VOID_EMPOWERMENT", 450_138),
244];
245pub(crate) mod DAMAGE_SPELL {
246    pub(crate) const MIND_BLAST: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_8092;
247    pub(crate) const SHADOW_WORD_PAIN: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_589;
248    pub(crate) const VAMPIRIC_TOUCH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_34914;
249    pub(crate) const SHADOW_WORD_MADNESS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_335467;
250    pub(crate) const VOIDFORM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_228260;
251    pub(crate) const VOID_VOLLEY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_1242173;
252    pub(crate) const VOID_TORRENT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_263165;
253    pub(crate) const MIND_FLAY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_15407;
254    pub(crate) const SHADOW_WORD_DEATH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_32379;
255    pub(crate) const HALO: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_120644;
256    pub(crate) const POWER_INFUSION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_10060;
257    pub(crate) const SHADOWFORM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_232698;
258    pub(crate) const POWER_WORD_FORTITUDE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_21562;
259    pub(crate) const SHADOWY_APPARITION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_413231;
260    pub(crate) const VOID_APPARITION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_1264176;
261    pub(crate) const VOID_BOLT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_1264177;
262    pub(crate) const TENTACLE_SLAM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_1227280;
263    pub(crate) const TENTACLE_SLAM_DAMAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_1227621;
264    pub(crate) const HALO_DAMAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_120696;
265    pub(crate) const MIND_FLAY_INSANITY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_391403;
266    pub(crate) const VOID_VOLLEY_DAMAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_1242189;
267    pub(crate) const VOID_VOLLEY_MISSILE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_1242173;
268    pub(crate) const COLLAPSING_VOID: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_448405;
269    pub(crate) const ENTROPIC_RIFT_DAMAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_447448;
270    pub(crate) const VOIDWRAITH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_451235;
271}
272pub(crate) mod DAMAGE_AURA {
273    pub(crate) const SHADOWFORM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_232698;
274    pub(crate) const VOIDFORM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_194249;
275    pub(crate) const VOID_VOLLEY_CHARGES: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_1242171;
276    pub(crate) const VOID_VOLLEY_SET_BONUS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_1296580;
277    pub(crate) const ANCIENT_MADNESS_EXTENSION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_1231346;
278    pub(crate) const ANCIENT_MADNESS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_1304485;
279    pub(crate) const SHADOW_WORD_PAIN: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_589;
280    pub(crate) const VAMPIRIC_TOUCH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_34914;
281    pub(crate) const SHADOW_WORD_MADNESS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_335467;
282    pub(crate) const SHADOWY_INSIGHT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_375981;
283    pub(crate) const MIND_DEVOURER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_373204;
284    pub(crate) const MIND_FLAY_INSANITY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_391401;
285    pub(crate) const SCREAMS_OF_THE_VOID: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_393919;
286    pub(crate) const DEATHSPEAKER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_392507;
287    pub(crate) const MISERY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_238558;
288    pub(crate) const POWER_WORD_FORTITUDE_HIGHLIGHT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_1271911;
289    pub(crate) const POWER_INFUSION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_10060;
290    pub(crate) const VOID_TORRENT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_289577;
291    pub(crate) const INSIDIOUS_IRE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_373212;
292    pub(crate) const SHATTERED_PSYCHE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_391092;
293    pub(crate) const VOID_BLAST: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_450983;
294    pub(crate) const VOIDTOUCHED: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_407430;
295    pub(crate) const CRUSHING_VOID: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_1279437;
296    pub(crate) const TENTACLE_SLAM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_1227280;
297    pub(crate) const ENTROPIC_RIFT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_447448;
298    pub(crate) const VOIDHEART: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_449887;
299}
300pub(crate) mod DAMAGE_TALENT {
301    pub(crate) const ANCIENT_MADNESS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_1231346;
302    pub(crate) const AUSPICIOUS_SPIRITS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_155271;
303    pub(crate) const COLLAPSING_VOID: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_448403;
304    pub(crate) const CRUSHING_VOID: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_1279437;
305    pub(crate) const DARKENING_HORIZON: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_449912;
306    pub(crate) const DEATHSPEAKER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_392507;
307    pub(crate) const HALO: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_120644;
308    pub(crate) const IDOL_OF_CTHUN: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_377349;
309    pub(crate) const IDOL_OF_NZOTH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_373280;
310    pub(crate) const IDOL_OF_YOGGSARON: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_373273;
311    pub(crate) const IMPROVED_VOIDFORM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_341240;
312    pub(crate) const INSIDIOUS_IRE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_373212;
313    pub(crate) const MADDENING_TENTACLES: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_1279353;
314    pub(crate) const MADNESS_WEAVING: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_1240394;
315    pub(crate) const MIND_DEVOURER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_373202;
316    pub(crate) const MISERY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_238558;
317    pub(crate) const POWER_INFUSION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_10060;
318    pub(crate) const PSYCHIC_LINK: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_199484;
319    pub(crate) const SCREAMS_OF_THE_VOID: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_375767;
320    pub(crate) const SHADEBURST: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_73510;
321    pub(crate) const SHADOWY_APPARITIONS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_341491;
322    pub(crate) const SHADOWY_INSIGHT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_375888;
323    pub(crate) const SHADOW_WORD_MADNESS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_335467;
324    pub(crate) const SHATTERED_PSYCHE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_391090;
325    pub(crate) const SURGE_OF_INSANITY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_391399;
326    pub(crate) const TENTACLE_SLAM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_1227280;
327    pub(crate) const TORMENTED_SPIRITS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_391284;
328    pub(crate) const VOIDFORM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_228260;
329    pub(crate) const VOIDHEART: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_449880;
330    pub(crate) const VOID_APPARITIONS_1: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_1264096;
331    pub(crate) const VOID_APPARITIONS_2: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_1264104;
332    pub(crate) const VOID_APPARITIONS_3: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_1264107;
333    pub(crate) const VOID_BLAST: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_450405;
334    pub(crate) const VOID_TORRENT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ACTION::SPELL_263165;
335}
336pub(crate) mod DAMAGE_REPORTED {}
337pub(crate) mod DAMAGE_EFFECT {
338    pub(crate) const MIND_BLAST_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::EFFECT::SPELL_8092_EFFECT_1;
339    pub(crate) const VOID_BLAST_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::EFFECT::SPELL_450983_EFFECT_1;
340    pub(crate) const COLLAPSING_VOID_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::EFFECT::SPELL_448405_EFFECT_1;
341    pub(crate) const COLLAPSING_VOID_PCT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::EFFECT::SPELL_448403_EFFECT_3;
342    pub(crate) const DARKENING_HORIZON_MAX: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::EFFECT::SPELL_449912_EFFECT_2;
343    pub(crate) const DARKENING_HORIZON_EXT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::EFFECT::SPELL_449912_EFFECT_3;
344    pub(crate) const TENTACLE_SLAM_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::EFFECT::SPELL_1227621_EFFECT_1;
345    pub(crate) const SHADOWY_APPARITION_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::EFFECT::SPELL_413231_EFFECT_1;
346    pub(crate) const VOID_APPARITION_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::EFFECT::SPELL_1264176_EFFECT_1;
347    pub(crate) const VOID_BOLT_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::EFFECT::SPELL_1264177_EFFECT_1;
348    pub(crate) const SHADEBURST_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::EFFECT::SPELL_1231479_EFFECT_1;
349    pub(crate) const VOID_VOLLEY_BOLT_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::EFFECT::SPELL_1242189_EFFECT_1;
350    pub(crate) const VOID_APPARITIONS_CHANCE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::EFFECT::SPELL_1264104_EFFECT_2;
351    pub(crate) const AUSPICIOUS_SPIRITS_INSANITY: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::EFFECT::SPELL_155271_EFFECT_2;
352    pub(crate) const INSIDIOUS_IRE_BONUS: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::EFFECT::SPELL_373212_EFFECT_1;
353    pub(crate) const MIND_FLAY_TICK_INSANITY: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::EFFECT::SPELL_15407_EFFECT_3;
354    pub(crate) const SHADOW_WORD_DEATH_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::EFFECT::SPELL_32379_EFFECT_2;
355    pub(crate) const SHADOW_WORD_DEATH_EXECUTE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::EFFECT::SPELL_32379_EFFECT_4;
356    pub(crate) const SHADOW_WORD_DEATH_THRESHOLD: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::EFFECT::SPELL_32379_EFFECT_3;
357    pub(crate) const SURGE_OF_INSANITY_GEN: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::EFFECT::SPELL_391399_EFFECT_2;
358    pub(crate) const MID2_2PC_TENTACLE_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::EFFECT::SPELL_1296579_EFFECT_1;
359    pub(crate) const MID2_2PC_TENTACLE_COOLDOWN: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::EFFECT::SPELL_1296579_EFFECT_2;
360    pub(crate) const MID2_4PC_VOLLEY_CHANCE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::EFFECT::SPELL_1296580_EFFECT_1;
361    pub(crate) const MID2_4PC_VOLLEY_EFFECTIVENESS: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::EFFECT::SPELL_1296580_EFFECT_2;
362    pub(crate) const VOIDFORM_VOLLEY_CHARGES: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::EFFECT::SPELL_228260_EFFECT_3;
363    pub(crate) const VOID_VOLLEY_BOLT_COUNT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::EFFECT::SPELL_1242173_EFFECT_1;
364    pub(crate) const VOID_VOLLEY_INSANITY: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::EFFECT::SPELL_1242173_EFFECT_2;
365    pub(crate) const VOID_VOLLEY_SECONDARY_BOLT_COUNT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::EFFECT::SPELL_1242173_EFFECT_3;
366    pub(crate) const VOID_VOLLEY_TARGETS: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::EFFECT::SPELL_1242173_EFFECT_1;
367    pub(crate) const ANCIENT_MADNESS_EXTENSION_MAX: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::EFFECT::SPELL_194249_EFFECT_13;
368    pub(crate) const ANCIENT_MADNESS_EXTENSION_MS: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::EFFECT::SPELL_194249_EFFECT_14;
369    pub(crate) const ANCIENT_MADNESS_FULL_HASTE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::EFFECT::SPELL_1304485_EFFECT_1;
370}
371pub(crate) const AURA_SHADOWFORM: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::shadow_priest::AURA_SHADOWFORM
372    .bind(wowlab_engine_combat::generated_identities::specs::shadow_priest::PROOF);
373pub(crate) const AURA_VOIDFORM: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::shadow_priest::AURA_VOIDFORM
374    .bind(wowlab_engine_combat::generated_identities::specs::shadow_priest::PROOF);
375pub(crate) const AURA_VOID_VOLLEY_CHARGES: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::shadow_priest::AURA_VOID_VOLLEY_CHARGES
376    .bind(wowlab_engine_combat::generated_identities::specs::shadow_priest::PROOF);
377pub(crate) const AURA_VOID_VOLLEY_SET_BONUS: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::shadow_priest::AURA_VOID_VOLLEY_SET_BONUS
378    .bind(wowlab_engine_combat::generated_identities::specs::shadow_priest::PROOF);
379pub(crate) const AURA_ANCIENT_MADNESS_EXTENSION: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::shadow_priest::AURA_ANCIENT_MADNESS_EXTENSION
380    .bind(wowlab_engine_combat::generated_identities::specs::shadow_priest::PROOF);
381pub(crate) const AURA_ANCIENT_MADNESS: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::shadow_priest::AURA_ANCIENT_MADNESS
382    .bind(wowlab_engine_combat::generated_identities::specs::shadow_priest::PROOF);
383pub(crate) const AURA_SHADOW_WORD_PAIN: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::shadow_priest::AURA_SHADOW_WORD_PAIN
384    .bind(wowlab_engine_combat::generated_identities::specs::shadow_priest::PROOF);
385pub(crate) const AURA_VAMPIRIC_TOUCH: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::shadow_priest::AURA_VAMPIRIC_TOUCH
386    .bind(wowlab_engine_combat::generated_identities::specs::shadow_priest::PROOF);
387pub(crate) const AURA_SHADOW_WORD_MADNESS: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::shadow_priest::AURA_SHADOW_WORD_MADNESS
388    .bind(wowlab_engine_combat::generated_identities::specs::shadow_priest::PROOF);
389pub(crate) const AURA_SHADOWY_INSIGHT: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::shadow_priest::AURA_SHADOWY_INSIGHT
390    .bind(wowlab_engine_combat::generated_identities::specs::shadow_priest::PROOF);
391pub(crate) const AURA_MIND_DEVOURER: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::shadow_priest::AURA_MIND_DEVOURER
392    .bind(wowlab_engine_combat::generated_identities::specs::shadow_priest::PROOF);
393pub(crate) const AURA_MIND_FLAY_INSANITY: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::shadow_priest::AURA_MIND_FLAY_INSANITY
394    .bind(wowlab_engine_combat::generated_identities::specs::shadow_priest::PROOF);
395pub(crate) const AURA_SCREAMS_OF_THE_VOID: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::shadow_priest::AURA_SCREAMS_OF_THE_VOID
396    .bind(wowlab_engine_combat::generated_identities::specs::shadow_priest::PROOF);
397pub(crate) const AURA_DEATHSPEAKER: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::shadow_priest::AURA_DEATHSPEAKER
398    .bind(wowlab_engine_combat::generated_identities::specs::shadow_priest::PROOF);
399pub(crate) const AURA_MISERY: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::shadow_priest::AURA_MISERY
400    .bind(wowlab_engine_combat::generated_identities::specs::shadow_priest::PROOF);
401pub(crate) const AURA_POWER_WORD_FORTITUDE_HIGHLIGHT: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::shadow_priest::AURA_POWER_WORD_FORTITUDE_HIGHLIGHT
402    .bind(wowlab_engine_combat::generated_identities::specs::shadow_priest::PROOF);
403pub(crate) const AURA_POWER_INFUSION: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::shadow_priest::AURA_POWER_INFUSION
404    .bind(wowlab_engine_combat::generated_identities::specs::shadow_priest::PROOF);
405pub(crate) const AURA_VOID_TORRENT: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::shadow_priest::AURA_VOID_TORRENT
406    .bind(wowlab_engine_combat::generated_identities::specs::shadow_priest::PROOF);
407pub(crate) const AURA_INSIDIOUS_IRE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::shadow_priest::AURA_INSIDIOUS_IRE
408    .bind(wowlab_engine_combat::generated_identities::specs::shadow_priest::PROOF);
409pub(crate) const AURA_SHATTERED_PSYCHE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::shadow_priest::AURA_SHATTERED_PSYCHE
410    .bind(wowlab_engine_combat::generated_identities::specs::shadow_priest::PROOF);
411pub(crate) const AURA_VOID_BLAST: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::shadow_priest::AURA_VOID_BLAST
412    .bind(wowlab_engine_combat::generated_identities::specs::shadow_priest::PROOF);
413pub(crate) const AURA_VOIDTOUCHED: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::shadow_priest::AURA_VOIDTOUCHED
414    .bind(wowlab_engine_combat::generated_identities::specs::shadow_priest::PROOF);
415pub(crate) const AURA_CRUSHING_VOID: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::shadow_priest::AURA_CRUSHING_VOID
416    .bind(wowlab_engine_combat::generated_identities::specs::shadow_priest::PROOF);
417pub(crate) const AURA_TENTACLE_SLAM: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::shadow_priest::AURA_TENTACLE_SLAM
418    .bind(wowlab_engine_combat::generated_identities::specs::shadow_priest::PROOF);
419pub(crate) const AURA_ENTROPIC_RIFT: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::shadow_priest::AURA_ENTROPIC_RIFT
420    .bind(wowlab_engine_combat::generated_identities::specs::shadow_priest::PROOF);
421pub(crate) const AURA_VOIDHEART: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::shadow_priest::AURA_VOIDHEART
422    .bind(wowlab_engine_combat::generated_identities::specs::shadow_priest::PROOF);
423pub(crate) const AURA_COUNT: usize = 26;
424const _: () = assert!(
425    AURA_COUNT == 26, "AURA index ABI: count changed -- update positional hook consumers"
426);
427pub(crate) const SPELL_MIND_BLAST: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::shadow_priest::SPELL_MIND_BLAST
428    .bind(wowlab_engine_combat::generated_identities::specs::shadow_priest::PROOF);
429pub(crate) const SPELL_SHADOW_WORD_PAIN: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::shadow_priest::SPELL_SHADOW_WORD_PAIN
430    .bind(wowlab_engine_combat::generated_identities::specs::shadow_priest::PROOF);
431pub(crate) const SPELL_VAMPIRIC_TOUCH: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::shadow_priest::SPELL_VAMPIRIC_TOUCH
432    .bind(wowlab_engine_combat::generated_identities::specs::shadow_priest::PROOF);
433pub(crate) const SPELL_SHADOW_WORD_MADNESS: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::shadow_priest::SPELL_SHADOW_WORD_MADNESS
434    .bind(wowlab_engine_combat::generated_identities::specs::shadow_priest::PROOF);
435pub(crate) const SPELL_VOIDFORM: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::shadow_priest::SPELL_VOIDFORM
436    .bind(wowlab_engine_combat::generated_identities::specs::shadow_priest::PROOF);
437pub(crate) const SPELL_VOID_VOLLEY: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::shadow_priest::SPELL_VOID_VOLLEY
438    .bind(wowlab_engine_combat::generated_identities::specs::shadow_priest::PROOF);
439pub(crate) const SPELL_VOID_TORRENT: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::shadow_priest::SPELL_VOID_TORRENT
440    .bind(wowlab_engine_combat::generated_identities::specs::shadow_priest::PROOF);
441pub(crate) const SPELL_MIND_FLAY: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::shadow_priest::SPELL_MIND_FLAY
442    .bind(wowlab_engine_combat::generated_identities::specs::shadow_priest::PROOF);
443pub(crate) const SPELL_SHADOW_WORD_DEATH: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::shadow_priest::SPELL_SHADOW_WORD_DEATH
444    .bind(wowlab_engine_combat::generated_identities::specs::shadow_priest::PROOF);
445pub(crate) const SPELL_HALO: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::shadow_priest::SPELL_HALO
446    .bind(wowlab_engine_combat::generated_identities::specs::shadow_priest::PROOF);
447pub(crate) const SPELL_POWER_INFUSION: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::shadow_priest::SPELL_POWER_INFUSION
448    .bind(wowlab_engine_combat::generated_identities::specs::shadow_priest::PROOF);
449pub(crate) const SPELL_SHADOWFORM: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::shadow_priest::SPELL_SHADOWFORM
450    .bind(wowlab_engine_combat::generated_identities::specs::shadow_priest::PROOF);
451pub(crate) const SPELL_POWER_WORD_FORTITUDE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::shadow_priest::SPELL_POWER_WORD_FORTITUDE
452    .bind(wowlab_engine_combat::generated_identities::specs::shadow_priest::PROOF);
453pub(crate) const SPELL_SHADOWY_APPARITION: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::shadow_priest::SPELL_SHADOWY_APPARITION
454    .bind(wowlab_engine_combat::generated_identities::specs::shadow_priest::PROOF);
455pub(crate) const SPELL_VOID_APPARITION: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::shadow_priest::SPELL_VOID_APPARITION
456    .bind(wowlab_engine_combat::generated_identities::specs::shadow_priest::PROOF);
457pub(crate) const SPELL_VOID_BOLT: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::shadow_priest::SPELL_VOID_BOLT
458    .bind(wowlab_engine_combat::generated_identities::specs::shadow_priest::PROOF);
459pub(crate) const SPELL_TENTACLE_SLAM: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::shadow_priest::SPELL_TENTACLE_SLAM
460    .bind(wowlab_engine_combat::generated_identities::specs::shadow_priest::PROOF);
461pub(crate) const SPELL_TENTACLE_SLAM_DAMAGE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::shadow_priest::SPELL_TENTACLE_SLAM_DAMAGE
462    .bind(wowlab_engine_combat::generated_identities::specs::shadow_priest::PROOF);
463pub(crate) const SPELL_COUNT: usize = 18;
464const _: () = assert!(
465    SPELL_COUNT == 18,
466    "SPELL index ABI: count changed -- update positional hook consumers"
467);
468pub(crate) mod EFFECT {
469    ///<https://wowlab.gg/inspect/spell/8092>
470    pub(crate) const MIND_BLAST_DAMAGE: (u32, u8) = (8092, 1);
471    ///<https://wowlab.gg/inspect/spell/450983>
472    pub(crate) const VOID_BLAST_DAMAGE: (u32, u8) = (450_983, 1);
473    ///<https://wowlab.gg/inspect/spell/448405>
474    pub(crate) const COLLAPSING_VOID_DAMAGE: (u32, u8) = (448_405, 1);
475    ///<https://wowlab.gg/inspect/spell/448403>
476    pub(crate) const COLLAPSING_VOID_PCT: (u32, u8) = (448_403, 3);
477    ///<https://wowlab.gg/inspect/spell/449912>
478    pub(crate) const DARKENING_HORIZON_MAX: (u32, u8) = (449_912, 2);
479    ///<https://wowlab.gg/inspect/spell/449912>
480    pub(crate) const DARKENING_HORIZON_EXT: (u32, u8) = (449_912, 3);
481    ///<https://wowlab.gg/inspect/spell/1227621>
482    pub(crate) const TENTACLE_SLAM_DAMAGE: (u32, u8) = (1_227_621, 1);
483    ///<https://wowlab.gg/inspect/spell/413231>
484    pub(crate) const SHADOWY_APPARITION_DAMAGE: (u32, u8) = (413_231, 1);
485    ///<https://wowlab.gg/inspect/spell/1264176>
486    pub(crate) const VOID_APPARITION_DAMAGE: (u32, u8) = (1_264_176, 1);
487    ///<https://wowlab.gg/inspect/spell/1264177>
488    pub(crate) const VOID_BOLT_DAMAGE: (u32, u8) = (1_264_177, 1);
489    ///<https://wowlab.gg/inspect/spell/1231479>
490    pub(crate) const SHADEBURST_DAMAGE: (u32, u8) = (1_231_479, 1);
491    ///<https://wowlab.gg/inspect/spell/1242189>
492    pub(crate) const VOID_VOLLEY_BOLT_DAMAGE: (u32, u8) = (1_242_189, 1);
493    ///<https://wowlab.gg/inspect/spell/1264104>
494    pub(crate) const VOID_APPARITIONS_CHANCE: (u32, u8) = (1_264_104, 2);
495    ///<https://wowlab.gg/inspect/spell/155271>
496    pub(crate) const AUSPICIOUS_SPIRITS_INSANITY: (u32, u8) = (155_271, 2);
497    ///<https://wowlab.gg/inspect/spell/373212>
498    pub(crate) const INSIDIOUS_IRE_BONUS: (u32, u8) = (373_212, 1);
499    ///<https://wowlab.gg/inspect/spell/15407>
500    pub(crate) const MIND_FLAY_TICK_INSANITY: (u32, u8) = (15407, 3);
501    ///<https://wowlab.gg/inspect/spell/32379>
502    pub(crate) const SHADOW_WORD_DEATH_DAMAGE: (u32, u8) = (32379, 2);
503    ///<https://wowlab.gg/inspect/spell/32379>
504    pub(crate) const SHADOW_WORD_DEATH_EXECUTE: (u32, u8) = (32379, 4);
505    ///<https://wowlab.gg/inspect/spell/32379>
506    pub(crate) const SHADOW_WORD_DEATH_THRESHOLD: (u32, u8) = (32379, 3);
507    ///<https://wowlab.gg/inspect/spell/391399>
508    pub(crate) const SURGE_OF_INSANITY_GEN: (u32, u8) = (391_399, 2);
509    ///<https://wowlab.gg/inspect/spell/1296579>
510    pub(crate) const MID2_2PC_TENTACLE_DAMAGE: (u32, u8) = (1_296_579, 1);
511    ///<https://wowlab.gg/inspect/spell/1296579>
512    pub(crate) const MID2_2PC_TENTACLE_COOLDOWN: (u32, u8) = (1_296_579, 2);
513    ///<https://wowlab.gg/inspect/spell/1296580>
514    pub(crate) const MID2_4PC_VOLLEY_CHANCE: (u32, u8) = (1_296_580, 1);
515    ///<https://wowlab.gg/inspect/spell/1296580>
516    pub(crate) const MID2_4PC_VOLLEY_EFFECTIVENESS: (u32, u8) = (1_296_580, 2);
517    ///<https://wowlab.gg/inspect/spell/228260>
518    pub(crate) const VOIDFORM_VOLLEY_CHARGES: (u32, u8) = (228_260, 3);
519    ///<https://wowlab.gg/inspect/spell/1242173>
520    pub(crate) const VOID_VOLLEY_BOLT_COUNT: (u32, u8) = (1_242_173, 1);
521    ///<https://wowlab.gg/inspect/spell/1242173>
522    pub(crate) const VOID_VOLLEY_INSANITY: (u32, u8) = (1_242_173, 2);
523    ///<https://wowlab.gg/inspect/spell/1242173>
524    pub(crate) const VOID_VOLLEY_SECONDARY_BOLT_COUNT: (u32, u8) = (1_242_173, 3);
525    ///<https://wowlab.gg/inspect/spell/1242173>
526    pub(crate) const VOID_VOLLEY_TARGETS: (u32, u8) = (1_242_173, 1);
527    ///<https://wowlab.gg/inspect/spell/194249>
528    pub(crate) const ANCIENT_MADNESS_EXTENSION_MAX: (u32, u8) = (194_249, 13);
529    ///<https://wowlab.gg/inspect/spell/194249>
530    pub(crate) const ANCIENT_MADNESS_EXTENSION_MS: (u32, u8) = (194_249, 14);
531    ///<https://wowlab.gg/inspect/spell/1304485>
532    pub(crate) const ANCIENT_MADNESS_FULL_HASTE: (u32, u8) = (1_304_485, 1);
533}
534static REPORTED_SPELLS: &[(&str, u32)] = &[];
535static DECLARED_SPELL_IDS: &[u32] = &[
536    8092, 589, 34914, 335_467, 228_260, 1_242_173, 263_165, 15407, 32379, 120_644, 10060,
537    232_698, 21562, 413_231, 1_264_176, 1_264_177, 1_227_280, 1_227_621, 194_249,
538    1_242_171, 1_296_580, 1_231_346, 1_304_485, 375_981, 373_204, 391_401, 393_919,
539    392_507, 238_558, 1_271_911, 289_577, 373_212, 391_092, 450_983, 407_430, 1_279_437,
540    447_448, 449_887, 155_271, 448_403, 449_912, 377_349, 373_280, 373_273, 341_240,
541    1_279_353, 1_240_394, 373_202, 199_484, 375_767, 73510, 341_491, 375_888, 391_090,
542    391_399, 391_284, 449_880, 1_264_096, 1_264_104, 1_264_107, 450_405, 343_690,
543    390_964, 448_405, 459_314, 1_231_479, 1_242_189, 1_296_579, 120_696, 391_403,
544    453_112, 453_850, 454_002, 451_235, 450_138,
545];
546static DECLARED_AURA_IDS: &[u32] = &[
547    232_698, 194_249, 1_242_171, 1_296_580, 1_231_346, 1_304_485, 589, 34914, 335_467,
548    375_981, 373_204, 391_401, 393_919, 392_507, 238_558, 1_271_911, 10060, 289_577,
549    373_212, 391_092, 450_983, 407_430, 1_279_437, 1_227_280, 447_448, 449_887, 391_401,
550    453_112, 453_850, 454_002, 459_314, 449_887, 450_138,
551];
552static TALENTS: &[(&str, u32)] = &[
553    ("ANCIENT_MADNESS", TALENT::ANCIENT_MADNESS),
554    ("AUSPICIOUS_SPIRITS", TALENT::AUSPICIOUS_SPIRITS),
555    ("COLLAPSING_VOID", TALENT::COLLAPSING_VOID),
556    ("CRUSHING_VOID", TALENT::CRUSHING_VOID),
557    ("DARKENING_HORIZON", TALENT::DARKENING_HORIZON),
558    ("DEATHSPEAKER", TALENT::DEATHSPEAKER),
559    ("HALO", TALENT::HALO),
560    ("IDOL_OF_CTHUN", TALENT::IDOL_OF_CTHUN),
561    ("IDOL_OF_NZOTH", TALENT::IDOL_OF_NZOTH),
562    ("IDOL_OF_YOGGSARON", TALENT::IDOL_OF_YOGGSARON),
563    ("IMPROVED_VOIDFORM", TALENT::IMPROVED_VOIDFORM),
564    ("INSIDIOUS_IRE", TALENT::INSIDIOUS_IRE),
565    ("MADDENING_TENTACLES", TALENT::MADDENING_TENTACLES),
566    ("MADNESS_WEAVING", TALENT::MADNESS_WEAVING),
567    ("MIND_DEVOURER", TALENT::MIND_DEVOURER),
568    ("MISERY", TALENT::MISERY),
569    ("POWER_INFUSION", TALENT::POWER_INFUSION),
570    ("PSYCHIC_LINK", TALENT::PSYCHIC_LINK),
571    ("SCREAMS_OF_THE_VOID", TALENT::SCREAMS_OF_THE_VOID),
572    ("SHADEBURST", TALENT::SHADEBURST),
573    ("SHADOWY_APPARITIONS", TALENT::SHADOWY_APPARITIONS),
574    ("SHADOWY_INSIGHT", TALENT::SHADOWY_INSIGHT),
575    ("SHADOW_WORD_MADNESS", TALENT::SHADOW_WORD_MADNESS),
576    ("SHATTERED_PSYCHE", TALENT::SHATTERED_PSYCHE),
577    ("SURGE_OF_INSANITY", TALENT::SURGE_OF_INSANITY),
578    ("TENTACLE_SLAM", TALENT::TENTACLE_SLAM),
579    ("TORMENTED_SPIRITS", TALENT::TORMENTED_SPIRITS),
580    ("VOIDFORM", TALENT::VOIDFORM),
581    ("VOIDHEART", TALENT::VOIDHEART),
582    ("VOID_APPARITIONS_1", TALENT::VOID_APPARITIONS_1),
583    ("VOID_APPARITIONS_2", TALENT::VOID_APPARITIONS_2),
584    ("VOID_APPARITIONS_3", TALENT::VOID_APPARITIONS_3),
585    ("VOID_BLAST", TALENT::VOID_BLAST),
586    ("VOID_TORRENT", TALENT::VOID_TORRENT),
587];
588pub(crate) mod SHADOW_PRIEST {
589    pub(crate) const MIND_BLAST_CASTS: u32 = 0;
590    pub(crate) const SHADOW_WORD_MADNESS_CASTS: u32 = 1;
591    pub(crate) const VOIDFORM_CASTS: u32 = 2;
592    pub(crate) const VOID_TORRENT_CASTS: u32 = 3;
593    pub(crate) const SHADOW_WORD_DEATH_CASTS: u32 = 4;
594    pub(crate) const HALO_CASTS: u32 = 5;
595    pub(crate) const TENTACLE_SLAM_CASTS: u32 = 6;
596    pub(crate) const MIND_FLAY_CASTS: u32 = 7;
597    pub(crate) const VOIDFORM_UPTIME_MS: u32 = 8;
598    pub(crate) const SHADOW_WORD_PAIN_UPTIME_MS: u32 = 9;
599    pub(crate) const VAMPIRIC_TOUCH_UPTIME_MS: u32 = 10;
600}
601fn aura_shadowform(
602    a: AuraDefinitionDraft,
603    data: &ResolvedGameData,
604) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
605    Ok(
606        a
607            .on_player()
608            .apply_base_from_data(data, 232_698)?
609            .max_stacks(
610                data
611                    .require_aura_max_stacks(
612                        wowlab_types::sim::SpellIdx::from_raw(232_698),
613                    )?,
614            ),
615    )
616}
617fn aura_voidform(
618    a: AuraDefinitionDraft,
619    data: &ResolvedGameData,
620) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
621    Ok(
622        a
623            .on_player()
624            .apply_base_from_data(data, 194_249)?
625            .max_stacks(
626                data
627                    .require_aura_max_stacks(
628                        wowlab_types::sim::SpellIdx::from_raw(194_249),
629                    )?,
630            )
631            .on_expire(crate::hooks::shadow_priest::voidform_expire_hook),
632    )
633}
634fn aura_void_volley_charges(
635    a: AuraDefinitionDraft,
636    data: &ResolvedGameData,
637) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
638    Ok(
639        a
640            .on_player()
641            .apply_base_from_data(data, 1_242_171)?
642            .max_stacks(
643                wowlab_engine_combat::validated_max_stacks(
644                    10.0,
645                    1_242_171,
646                    "aura.max_stacks",
647                )?,
648            ),
649    )
650}
651fn aura_void_volley_set_bonus(
652    a: AuraDefinitionDraft,
653    data: &ResolvedGameData,
654) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
655    Ok(
656        a
657            .on_player()
658            .apply_base_from_data(data, 1_296_580)?
659            .max_stacks(
660                wowlab_engine_combat::validated_max_stacks(
661                    10.0,
662                    1_296_580,
663                    "aura.max_stacks",
664                )?,
665            ),
666    )
667}
668fn aura_ancient_madness_extension(
669    a: AuraDefinitionDraft,
670    data: &ResolvedGameData,
671) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
672    Ok(
673        a
674            .on_player()
675            .duration_ms(
676                wowlab_engine_combat::validated_milliseconds(
677                    0.0,
678                    1_231_346,
679                    "aura.duration_ms",
680                )?,
681            )
682            .apply_periodic_effect_from_data(data, 1_231_346)?
683            .max_stacks(
684                wowlab_engine_combat::validated_max_stacks(
685                    5.0,
686                    1_231_346,
687                    "aura.max_stacks",
688                )?,
689            ),
690    )
691}
692fn aura_ancient_madness(
693    a: AuraDefinitionDraft,
694    data: &ResolvedGameData,
695) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
696    Ok(
697        a
698            .on_player()
699            .apply_base_from_data(data, 1_304_485)?
700            .max_stacks(
701                wowlab_engine_combat::validated_max_stacks(
702                    10.0,
703                    1_304_485,
704                    "aura.max_stacks",
705                )?,
706            )
707            .haste_per_stack(1.0)?
708            .periodic_remove_stack(
709                wowlab_engine_combat::validated_milliseconds(
710                    data.period(wowlab_types::sim::SpellIdx::from_raw(1_304_485), 2),
711                    1_304_485,
712                    "periodic_remove_stack.tick_ms",
713                )?,
714            ),
715    )
716}
717fn aura_shadow_word_pain(
718    a: AuraDefinitionDraft,
719    data: &ResolvedGameData,
720) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
721    a.on_target()
722        .apply_base_from_data(data, 589)?
723        .max_stacks(
724            data.require_aura_max_stacks(wowlab_types::sim::SpellIdx::from_raw(589))?,
725        )
726        .periodic_damage_sp(
727            wowlab_engine_combat::validated_milliseconds(
728                data.period(wowlab_types::sim::SpellIdx::from_raw(589), 2),
729                589,
730                "periodic_damage.tick_ms",
731            )?,
732            ((data.sp_coef(wowlab_types::sim::SpellIdx::from_raw(589), 2)) * 10000.0)
733                .round() / 10000.0,
734            wowlab_engine_combat::DamageFlags::empty(),
735        )
736        .apply_periodic_behavior_from_data(data, 589)
737}
738fn aura_vampiric_touch(
739    a: AuraDefinitionDraft,
740    data: &ResolvedGameData,
741) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
742    a.on_target()
743        .apply_base_from_data(data, 34914)?
744        .max_stacks(
745            data.require_aura_max_stacks(wowlab_types::sim::SpellIdx::from_raw(34914))?,
746        )
747        .periodic_damage_sp(
748            wowlab_engine_combat::validated_milliseconds(
749                data.period(wowlab_types::sim::SpellIdx::from_raw(34914), 2),
750                34914,
751                "periodic_damage.tick_ms",
752            )?,
753            ((data.sp_coef(wowlab_types::sim::SpellIdx::from_raw(34914), 2)) * 10000.0)
754                .round() / 10000.0,
755            wowlab_engine_combat::DamageFlags::empty(),
756        )
757        .apply_periodic_behavior_from_data(data, 34914)
758}
759fn aura_shadow_word_madness(
760    a: AuraDefinitionDraft,
761    data: &ResolvedGameData,
762) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
763    a.on_target()
764        .apply_base_from_data(data, 335_467)?
765        .max_stacks(
766            data.require_aura_max_stacks(wowlab_types::sim::SpellIdx::from_raw(335_467))?,
767        )
768        .periodic_damage_sp(
769            wowlab_engine_combat::validated_milliseconds(
770                data.period(wowlab_types::sim::SpellIdx::from_raw(335_467), 3),
771                335_467,
772                "periodic_damage.tick_ms",
773            )?,
774            ((data.sp_coef(wowlab_types::sim::SpellIdx::from_raw(335_467), 3)) * 1000.0)
775                .round() / 1000.0,
776            wowlab_engine_combat::DamageFlags::empty(),
777        )
778        .apply_periodic_behavior_from_data(data, 335_467)
779}
780fn aura_shadowy_insight(
781    a: AuraDefinitionDraft,
782    data: &ResolvedGameData,
783) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
784    Ok(
785        a
786            .on_player()
787            .apply_base_from_data(data, 375_981)?
788            .max_stacks(
789                data
790                    .require_aura_max_stacks(
791                        wowlab_types::sim::SpellIdx::from_raw(375_981),
792                    )?,
793            ),
794    )
795}
796fn aura_mind_devourer(
797    a: AuraDefinitionDraft,
798    data: &ResolvedGameData,
799) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
800    Ok(
801        a
802            .on_player()
803            .apply_base_from_data(data, 373_204)?
804            .max_stacks(
805                data
806                    .require_aura_max_stacks(
807                        wowlab_types::sim::SpellIdx::from_raw(373_204),
808                    )?,
809            ),
810    )
811}
812fn aura_mind_flay_insanity(
813    a: AuraDefinitionDraft,
814    data: &ResolvedGameData,
815) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
816    Ok(
817        a
818            .on_player()
819            .apply_base_from_data(data, 391_401)?
820            .max_stacks(
821                data
822                    .require_aura_max_stacks(
823                        wowlab_types::sim::SpellIdx::from_raw(391_401),
824                    )?,
825            ),
826    )
827}
828fn aura_screams_of_the_void(
829    a: AuraDefinitionDraft,
830    data: &ResolvedGameData,
831) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
832    Ok(
833        a
834            .on_player()
835            .apply_base_from_data(data, 393_919)?
836            .max_stacks(
837                data
838                    .require_aura_max_stacks(
839                        wowlab_types::sim::SpellIdx::from_raw(393_919),
840                    )?,
841            ),
842    )
843}
844fn aura_deathspeaker(
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, 392_507)?
852            .max_stacks(
853                data
854                    .require_aura_max_stacks(
855                        wowlab_types::sim::SpellIdx::from_raw(392_507),
856                    )?,
857            ),
858    )
859}
860fn aura_misery(
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, 238_558)?
868            .max_stacks(
869                data
870                    .require_aura_max_stacks(
871                        wowlab_types::sim::SpellIdx::from_raw(238_558),
872                    )?,
873            ),
874    )
875}
876fn aura_power_word_fortitude_highlight(
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, 1_271_911)?
884            .max_stacks(
885                data
886                    .require_aura_max_stacks(
887                        wowlab_types::sim::SpellIdx::from_raw(1_271_911),
888                    )?,
889            ),
890    )
891}
892fn aura_power_infusion(
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, 10060)?
900            .max_stacks(
901                data
902                    .require_aura_max_stacks(
903                        wowlab_types::sim::SpellIdx::from_raw(10060),
904                    )?,
905            ),
906    )
907}
908fn aura_void_torrent(
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, 289_577)?
916            .max_stacks(
917                data
918                    .require_aura_max_stacks(
919                        wowlab_types::sim::SpellIdx::from_raw(289_577),
920                    )?,
921            ),
922    )
923}
924fn aura_insidious_ire(
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, 373_212)?
932            .max_stacks(
933                data
934                    .require_aura_max_stacks(
935                        wowlab_types::sim::SpellIdx::from_raw(373_212),
936                    )?,
937            ),
938    )
939}
940fn aura_shattered_psyche(
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, 391_092)?
948            .max_stacks(
949                data
950                    .require_aura_max_stacks(
951                        wowlab_types::sim::SpellIdx::from_raw(391_092),
952                    )?,
953            ),
954    )
955}
956fn aura_void_blast(
957    a: AuraDefinitionDraft,
958    data: &ResolvedGameData,
959) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
960    a.on_player()
961        .duration_ms(
962            wowlab_engine_combat::validated_milliseconds(
963                f64::from(
964                    data
965                        .require_aura_duration_ms(
966                            wowlab_types::sim::SpellIdx::from_raw(459_314),
967                        )?,
968                ),
969                450_983,
970                "aura.duration_ms",
971            )?,
972        )
973        .apply_periodic_effect_from_data(data, 450_983)?
974        .apply_duration_behavior_from_data(data, 459_314)?
975        .apply_timing_modifiers_from_data(data, 450_983)?
976        .max_stacks(
977            data.require_aura_max_stacks(wowlab_types::sim::SpellIdx::from_raw(450_983))?,
978        )
979        .apply_periodic_behavior_from_data(data, 459_314)
980}
981fn aura_voidtouched(
982    a: AuraDefinitionDraft,
983    data: &ResolvedGameData,
984) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
985    Ok(
986        a
987            .on_player()
988            .apply_base_from_data(data, 407_430)?
989            .max_stacks(
990                data
991                    .require_aura_max_stacks(
992                        wowlab_types::sim::SpellIdx::from_raw(407_430),
993                    )?,
994            ),
995    )
996}
997fn aura_crushing_void(
998    a: AuraDefinitionDraft,
999    data: &ResolvedGameData,
1000) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1001    Ok(
1002        a
1003            .on_player()
1004            .apply_base_from_data(data, 1_279_437)?
1005            .max_stacks(
1006                data
1007                    .require_aura_max_stacks(
1008                        wowlab_types::sim::SpellIdx::from_raw(1_279_437),
1009                    )?,
1010            ),
1011    )
1012}
1013fn aura_tentacle_slam(
1014    a: AuraDefinitionDraft,
1015    data: &ResolvedGameData,
1016) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1017    Ok(
1018        a
1019            .on_player()
1020            .apply_base_from_data(data, 1_227_280)?
1021            .max_stacks(
1022                data
1023                    .require_aura_max_stacks(
1024                        wowlab_types::sim::SpellIdx::from_raw(1_227_280),
1025                    )?,
1026            ),
1027    )
1028}
1029fn aura_entropic_rift(
1030    a: AuraDefinitionDraft,
1031    data: &ResolvedGameData,
1032) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1033    Ok(
1034        a
1035            .on_player()
1036            .duration_ms(
1037                wowlab_engine_combat::validated_milliseconds(
1038                    f64::from(
1039                        data
1040                            .require_aura_duration_ms(
1041                                wowlab_types::sim::SpellIdx::from_raw(459_314),
1042                            )?,
1043                    ),
1044                    447_448,
1045                    "aura.duration_ms",
1046                )?,
1047            )
1048            .apply_periodic_effect_from_data(data, 447_448)?
1049            .apply_duration_behavior_from_data(data, 459_314)?
1050            .apply_timing_modifiers_from_data(data, 447_448)?
1051            .max_stacks(
1052                data
1053                    .require_aura_max_stacks(
1054                        wowlab_types::sim::SpellIdx::from_raw(447_448),
1055                    )?,
1056            )
1057            .no_pandemic()
1058            .periodic_damage_sp_from_data(
1059                data,
1060                wowlab_engine_combat::PeriodicDamageDataInput {
1061                    tick_ms: wowlab_engine_combat::validated_milliseconds(
1062                        data.period(wowlab_types::sim::SpellIdx::from_raw(459_314), 1),
1063                        447_448,
1064                        "periodic_damage.tick_ms",
1065                    )?,
1066                    spell_id: 447_448,
1067                    effect_index: 1,
1068                    multiplier: 1.0,
1069                    offset: 0.0,
1070                    round_decimals: Some(1),
1071                },
1072            )?
1073            .apply_periodic_behavior_from_data(data, 459_314)?
1074            .on_expire(crate::hooks::shadow_priest::entropic_rift_expire_hook),
1075    )
1076}
1077fn aura_voidheart(
1078    a: AuraDefinitionDraft,
1079    data: &ResolvedGameData,
1080) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1081    Ok(
1082        a
1083            .on_player()
1084            .apply_base_from_data(data, 449_887)?
1085            .max_stacks(
1086                data
1087                    .require_aura_max_stacks(
1088                        wowlab_types::sim::SpellIdx::from_raw(449_887),
1089                    )?,
1090            )
1091            .no_pandemic(),
1092    )
1093}
1094fn spell_mind_blast(
1095    s: SpellDefinitionDraft,
1096    data: &ResolvedGameData,
1097) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1098    Ok(
1099        s
1100            .apply_base_from_data(data, 8092)?
1101            .hasted_cooldown()
1102            .damage_sp(0.0, wowlab_engine_combat::DamageFlags::empty())
1103            .apply_aoe_from_data(data)
1104            .on_cast(crate::hooks::shadow_priest::mind_blast_hook),
1105    )
1106}
1107fn spell_shadow_word_pain(
1108    s: SpellDefinitionDraft,
1109    data: &ResolvedGameData,
1110) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1111    Ok(
1112        s
1113            .apply_base_from_data(data, 589)?
1114            .applies_inferred_aura(AURA_SHADOW_WORD_PAIN, 589)
1115            .apply_aoe_from_data(data)
1116            .on_cast(crate::hooks::shadow_priest::shadow_word_pain_hook),
1117    )
1118}
1119fn spell_vampiric_touch(
1120    s: SpellDefinitionDraft,
1121    data: &ResolvedGameData,
1122) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1123    Ok(
1124        s
1125            .apply_base_from_data(data, 34914)?
1126            .damage_sp(0.0, wowlab_engine_combat::DamageFlags::empty())
1127            .applies_inferred_aura(AURA_VAMPIRIC_TOUCH, 34914)
1128            .apply_aoe_from_data(data)
1129            .on_cast(crate::hooks::shadow_priest::vampiric_touch_hook),
1130    )
1131}
1132fn spell_shadow_word_madness(
1133    s: SpellDefinitionDraft,
1134    data: &ResolvedGameData,
1135) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1136    Ok(
1137        s
1138            .apply_base_from_data(data, 335_467)?
1139            .cost(
1140                wowlab_engine_combat::validated_nonnegative(40.0, 335_467, "spell.cost")?,
1141            )
1142            .applies_inferred_aura(AURA_SHADOW_WORD_MADNESS, 335_467)
1143            .apply_aoe_from_data(data)
1144            .on_cast(crate::hooks::shadow_priest::shadow_word_madness_hook),
1145    )
1146}
1147fn spell_voidform(
1148    s: SpellDefinitionDraft,
1149    data: &ResolvedGameData,
1150) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1151    Ok(
1152        s
1153            .apply_base_from_data(data, 228_260)?
1154            .gain(data.base_points(wowlab_types::sim::SpellIdx::from_raw(341_240), 1))
1155            .applies_aura(AURA_VOIDFORM)
1156            .apply_aoe_from_data(data)
1157            .on_cast(crate::hooks::shadow_priest::voidform_hook),
1158    )
1159}
1160fn spell_void_volley(
1161    s: SpellDefinitionDraft,
1162    data: &ResolvedGameData,
1163) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1164    Ok(
1165        s
1166            .apply_base_from_data(data, 1_242_173)?
1167            .damage_sp(0.0, wowlab_engine_combat::DamageFlags::empty())
1168            .apply_aoe_from_data(data)
1169            .on_cast(crate::hooks::shadow_priest::void_volley_hook)
1170            .requires_aura_at_min_stacks(1_242_171, 0),
1171    )
1172}
1173fn spell_void_torrent(
1174    s: SpellDefinitionDraft,
1175    data: &ResolvedGameData,
1176) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1177    Ok(
1178        s
1179            .apply_base_from_data(data, 263_165)?
1180            .damage_sp(0.0, wowlab_engine_combat::DamageFlags::empty())
1181            .applies_inferred_aura(AURA_VOID_TORRENT, 289_577)
1182            .apply_aoe_from_data(data)
1183            .channel(
1184                wowlab_engine_combat::validated_channel_tick_count(
1185                    4.0,
1186                    263_165,
1187                    "channel.tick_count",
1188                )?,
1189            )
1190            .channel_tick_damage_sp_from_data(
1191                wowlab_engine_domain::dbc::EffectLookup::new(
1192                    data,
1193                    wowlab_types::sim::EffectRef::new(
1194                        wowlab_types::sim::SpellIdx::from_raw(263_165),
1195                        1,
1196                    ),
1197                ),
1198            )?
1199            .channel_complete_extend_aura(
1200                AURA_ENTROPIC_RIFT,
1201                wowlab_engine_combat::validated_milliseconds(
1202                    f64::from(
1203                        data
1204                            .require_aura_duration_ms(
1205                                wowlab_types::sim::SpellIdx::from_raw(263_165),
1206                            )?,
1207                    ),
1208                    263_165,
1209                    "channel.complete_effects.extend_aura.amount_ms",
1210                )?,
1211            )
1212            .channel_complete_extend_aura(
1213                AURA_VOIDHEART,
1214                wowlab_engine_combat::validated_milliseconds(
1215                    f64::from(
1216                        data
1217                            .require_aura_duration_ms(
1218                                wowlab_types::sim::SpellIdx::from_raw(263_165),
1219                            )?,
1220                    ),
1221                    263_165,
1222                    "channel.complete_effects.extend_aura.amount_ms",
1223                )?,
1224            )
1225            .on_cast(crate::hooks::shadow_priest::void_torrent_hook),
1226    )
1227}
1228fn spell_mind_flay(
1229    s: SpellDefinitionDraft,
1230    data: &ResolvedGameData,
1231) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1232    Ok(
1233        s
1234            .apply_base_from_data(data, 15407)?
1235            .damage_sp(0.0, wowlab_engine_combat::DamageFlags::empty())
1236            .apply_aoe_from_data(data)
1237            .channel(
1238                wowlab_engine_combat::validated_channel_tick_count(
1239                    6.0,
1240                    15407,
1241                    "channel.tick_count",
1242                )?,
1243            )
1244            .channel_tick_damage_sp_from_data(
1245                wowlab_engine_domain::dbc::EffectLookup::new(
1246                    data,
1247                    wowlab_types::sim::EffectRef::new(
1248                        wowlab_types::sim::SpellIdx::from_raw(15407),
1249                        1,
1250                    ),
1251                ),
1252            )?
1253            .on_channel_tick(crate::hooks::shadow_priest::mind_flay_tick_hook),
1254    )
1255}
1256fn spell_shadow_word_death(
1257    s: SpellDefinitionDraft,
1258    data: &ResolvedGameData,
1259) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1260    Ok(
1261        s
1262            .apply_base_from_data(data, 32379)?
1263            .gain(4.0)
1264            .damage_sp(0.0, wowlab_engine_combat::DamageFlags::empty())
1265            .apply_aoe_from_data(data)
1266            .on_cast(crate::hooks::shadow_priest::shadow_word_death_hook),
1267    )
1268}
1269fn spell_halo(
1270    s: SpellDefinitionDraft,
1271    data: &ResolvedGameData,
1272) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1273    Ok(
1274        s
1275            .apply_base_from_data(data, 120_644)?
1276            .damage_sp_from_data(
1277                wowlab_engine_domain::dbc::EffectLookup::new(
1278                    data,
1279                    wowlab_types::sim::EffectRef::new(
1280                        wowlab_types::sim::SpellIdx::from_raw(390_964),
1281                        1,
1282                    ),
1283                ),
1284            )?
1285            .apply_aoe_from_data(data),
1286    )
1287}
1288fn spell_power_infusion(
1289    s: SpellDefinitionDraft,
1290    data: &ResolvedGameData,
1291) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1292    Ok(
1293        s
1294            .apply_base_from_data(data, 10060)?
1295            .without_data_damage()
1296            .applies_inferred_aura(AURA_POWER_INFUSION, 10060)
1297            .apply_aoe_from_data(data),
1298    )
1299}
1300fn spell_shadowform(
1301    s: SpellDefinitionDraft,
1302    data: &ResolvedGameData,
1303) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1304    Ok(
1305        s
1306            .apply_base_from_data(data, 232_698)?
1307            .applies_inferred_aura(AURA_SHADOWFORM, 232_698)
1308            .apply_aoe_from_data(data),
1309    )
1310}
1311fn spell_power_word_fortitude(
1312    s: SpellDefinitionDraft,
1313    data: &ResolvedGameData,
1314) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1315    Ok(
1316        s
1317            .apply_base_from_data(data, 21562)?
1318            .without_data_damage()
1319            .apply_aoe_from_data(data),
1320    )
1321}
1322fn spell_shadowy_apparition(
1323    s: SpellDefinitionDraft,
1324    data: &ResolvedGameData,
1325) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1326    Ok(s.apply_base_from_data(data, 413_231)?.apply_aoe_from_data(data))
1327}
1328fn spell_void_apparition(
1329    s: SpellDefinitionDraft,
1330    data: &ResolvedGameData,
1331) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1332    Ok(s.apply_base_from_data(data, 1_264_176)?.apply_aoe_from_data(data))
1333}
1334fn spell_void_bolt(
1335    s: SpellDefinitionDraft,
1336    data: &ResolvedGameData,
1337) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1338    Ok(s.apply_base_from_data(data, 1_264_177)?.apply_aoe_from_data(data))
1339}
1340fn spell_tentacle_slam(
1341    s: SpellDefinitionDraft,
1342    data: &ResolvedGameData,
1343) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1344    Ok(
1345        s
1346            .apply_base_from_data(data, 1_227_280)?
1347            .applies_aura(AURA_VAMPIRIC_TOUCH)
1348            .apply_aoe_from_data(data)
1349            .on_cast(crate::hooks::shadow_priest::tentacle_slam_hook),
1350    )
1351}
1352fn spell_tentacle_slam_damage(
1353    s: SpellDefinitionDraft,
1354    data: &ResolvedGameData,
1355) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1356    Ok(s.apply_base_from_data(data, 1_227_621)?.apply_aoe_from_data(data))
1357}
1358pub(crate) fn build_combat_system_draft(
1359    params: &wowlab_engine_ports::HandlerParams<'_>,
1360) -> Result<CombatSystemDraft, wowlab_engine_ports::EngineError> {
1361    let builder = CombatSystemBuilder::new(params.stats.clone())
1362        .spec_id(SpecId::Shadow)
1363        .spec_identity(
1364            wowlab_engine_combat::generated_identities::specs::shadow_priest::PROOF,
1365        )
1366        .hero_talent_trees(DECLARED_METADATA.hero_talent_trees)
1367        .effect_identities(
1368            wowlab_engine_combat::generated_identities::specs::shadow_priest::damage::ALL,
1369        )
1370        .effect_identities(wowlab_engine_combat::generated_identities::shared::ALL)
1371        .mastery_spell(343_690)
1372        .mastery_hook(crate::hooks::shadow_priest::mastery)
1373        .resource(
1374            "insanity",
1375            100.0,
1376            params
1377                .game_data
1378                .power_regen_for_max(13, 100.0)
1379                .ok_or_else(|| {
1380                    wowlab_engine_ports::EngineError::spec_construction(
1381                        "missing power-type power_regen_for_max for type_id 13",
1382                    )
1383                })?,
1384        )
1385        .resource_type_id(13)
1386        .resource_start(0.0)
1387        .aura("shadowform", AURA::SHADOWFORM, |a| aura_shadowform(a, &params.game_data))
1388        .aura("voidform", AURA::VOIDFORM, |a| aura_voidform(a, &params.game_data))
1389        .aura(
1390            "void_volley_charges",
1391            AURA::VOID_VOLLEY_CHARGES,
1392            |a| aura_void_volley_charges(a, &params.game_data),
1393        )
1394        .aura(
1395            "void_volley_set_bonus",
1396            AURA::VOID_VOLLEY_SET_BONUS,
1397            |a| aura_void_volley_set_bonus(a, &params.game_data),
1398        )
1399        .aura(
1400            "ancient_madness_extension",
1401            AURA::ANCIENT_MADNESS_EXTENSION,
1402            |a| aura_ancient_madness_extension(a, &params.game_data),
1403        )
1404        .aura(
1405            "ancient_madness",
1406            AURA::ANCIENT_MADNESS,
1407            |a| aura_ancient_madness(a, &params.game_data),
1408        )
1409        .aura(
1410            "shadow_word_pain",
1411            AURA::SHADOW_WORD_PAIN,
1412            |a| aura_shadow_word_pain(a, &params.game_data),
1413        )
1414        .aura(
1415            "vampiric_touch",
1416            AURA::VAMPIRIC_TOUCH,
1417            |a| aura_vampiric_touch(a, &params.game_data),
1418        )
1419        .aura(
1420            "shadow_word_madness",
1421            AURA::SHADOW_WORD_MADNESS,
1422            |a| aura_shadow_word_madness(a, &params.game_data),
1423        )
1424        .aura(
1425            "shadowy_insight",
1426            AURA::SHADOWY_INSIGHT,
1427            |a| aura_shadowy_insight(a, &params.game_data),
1428        )
1429        .aura(
1430            "mind_devourer",
1431            AURA::MIND_DEVOURER,
1432            |a| aura_mind_devourer(a, &params.game_data),
1433        )
1434        .aura(
1435            "mind_flay_insanity",
1436            AURA::MIND_FLAY_INSANITY,
1437            |a| aura_mind_flay_insanity(a, &params.game_data),
1438        )
1439        .aura(
1440            "screams_of_the_void",
1441            AURA::SCREAMS_OF_THE_VOID,
1442            |a| aura_screams_of_the_void(a, &params.game_data),
1443        )
1444        .aura(
1445            "deathspeaker",
1446            AURA::DEATHSPEAKER,
1447            |a| aura_deathspeaker(a, &params.game_data),
1448        )
1449        .aura("misery", AURA::MISERY, |a| aura_misery(a, &params.game_data))
1450        .aura(
1451            "power_word_fortitude_highlight",
1452            AURA::POWER_WORD_FORTITUDE_HIGHLIGHT,
1453            |a| aura_power_word_fortitude_highlight(a, &params.game_data),
1454        )
1455        .aura(
1456            "power_infusion",
1457            AURA::POWER_INFUSION,
1458            |a| aura_power_infusion(a, &params.game_data),
1459        )
1460        .aura(
1461            "void_torrent",
1462            AURA::VOID_TORRENT,
1463            |a| aura_void_torrent(a, &params.game_data),
1464        )
1465        .aura(
1466            "insidious_ire",
1467            AURA::INSIDIOUS_IRE,
1468            |a| aura_insidious_ire(a, &params.game_data),
1469        )
1470        .aura(
1471            "shattered_psyche",
1472            AURA::SHATTERED_PSYCHE,
1473            |a| aura_shattered_psyche(a, &params.game_data),
1474        )
1475        .aura("void_blast", AURA::VOID_BLAST, |a| aura_void_blast(a, &params.game_data))
1476        .aura(
1477            "voidtouched",
1478            AURA::VOIDTOUCHED,
1479            |a| aura_voidtouched(a, &params.game_data),
1480        )
1481        .aura(
1482            "crushing_void",
1483            AURA::CRUSHING_VOID,
1484            |a| aura_crushing_void(a, &params.game_data),
1485        )
1486        .aura(
1487            "tentacle_slam",
1488            AURA::TENTACLE_SLAM,
1489            |a| aura_tentacle_slam(a, &params.game_data),
1490        )
1491        .aura(
1492            "entropic_rift",
1493            AURA::ENTROPIC_RIFT,
1494            |a| aura_entropic_rift(a, &params.game_data),
1495        )
1496        .aura("voidheart", AURA::VOIDHEART, |a| aura_voidheart(a, &params.game_data))
1497        .spell(
1498            "mind_blast",
1499            SPELL::MIND_BLAST,
1500            |s| spell_mind_blast(s, &params.game_data),
1501        )
1502        .spell(
1503            "shadow_word_pain",
1504            SPELL::SHADOW_WORD_PAIN,
1505            |s| spell_shadow_word_pain(s, &params.game_data),
1506        )
1507        .spell(
1508            "vampiric_touch",
1509            SPELL::VAMPIRIC_TOUCH,
1510            |s| spell_vampiric_touch(s, &params.game_data),
1511        )
1512        .spell(
1513            "shadow_word_madness",
1514            SPELL::SHADOW_WORD_MADNESS,
1515            |s| spell_shadow_word_madness(s, &params.game_data),
1516        )
1517        .spell("voidform", SPELL::VOIDFORM, |s| spell_voidform(s, &params.game_data))
1518        .spell(
1519            "void_volley",
1520            SPELL::VOID_VOLLEY,
1521            |s| spell_void_volley(s, &params.game_data),
1522        )
1523        .spell(
1524            "void_torrent",
1525            SPELL::VOID_TORRENT,
1526            |s| spell_void_torrent(s, &params.game_data),
1527        )
1528        .spell("mind_flay", SPELL::MIND_FLAY, |s| spell_mind_flay(s, &params.game_data))
1529        .spell(
1530            "shadow_word_death",
1531            SPELL::SHADOW_WORD_DEATH,
1532            |s| spell_shadow_word_death(s, &params.game_data),
1533        )
1534        .spell("halo", SPELL::HALO, |s| spell_halo(s, &params.game_data))
1535        .spell(
1536            "power_infusion",
1537            SPELL::POWER_INFUSION,
1538            |s| spell_power_infusion(s, &params.game_data),
1539        )
1540        .spell(
1541            "shadowform",
1542            SPELL::SHADOWFORM,
1543            |s| spell_shadowform(s, &params.game_data),
1544        )
1545        .spell(
1546            "power_word_fortitude",
1547            SPELL::POWER_WORD_FORTITUDE,
1548            |s| spell_power_word_fortitude(s, &params.game_data),
1549        )
1550        .spell(
1551            "shadowy_apparition",
1552            SPELL::SHADOWY_APPARITION,
1553            |s| spell_shadowy_apparition(s, &params.game_data),
1554        )
1555        .spell(
1556            "void_apparition",
1557            SPELL::VOID_APPARITION,
1558            |s| spell_void_apparition(s, &params.game_data),
1559        )
1560        .spell("void_bolt", SPELL::VOID_BOLT, |s| spell_void_bolt(s, &params.game_data))
1561        .spell(
1562            "tentacle_slam",
1563            SPELL::TENTACLE_SLAM,
1564            |s| spell_tentacle_slam(s, &params.game_data),
1565        )
1566        .spell(
1567            "tentacle_slam_damage",
1568            SPELL::TENTACLE_SLAM_DAMAGE,
1569            |s| spell_tentacle_slam_damage(s, &params.game_data),
1570        )
1571        .game_data(params.game_data.clone())
1572        .talent_spell_ids(TALENTS)
1573        .talent_selections(params.talent_selections)
1574        .set_bonus_auras(params.set_bonus_auras)
1575        .encounter(params.encounter.clone());
1576    let builder = crate::generated::items::register_equipped(
1577        builder,
1578        &params.game_data,
1579        params.equipped_items,
1580    )?;
1581
1582    builder.into_draft()
1583}
1584fn new_handler(
1585    params: wowlab_engine_ports::HandlerParams<'_>,
1586) -> Result<Box<dyn SpecHandler>, wowlab_engine_ports::EngineError> {
1587    let handler = crate::composition::compose_handler(
1588        build_combat_system_draft,
1589        &params,
1590        crate::hooks::shadow_priest::ShadowPriestHandler::new,
1591    )?;
1592
1593    Ok(Box::new(handler))
1594}
1595static DECLARED_METADATA: DeclaredSpecMetadata = DeclaredSpecMetadata {
1596    primary_resource: ResourceType::Insanity,
1597    secondary_resource: None,
1598    spell_ids: DECLARED_SPELL_IDS,
1599    aura_ids: DECLARED_AURA_IDS,
1600    server_proc_entries: &[],
1601    talents: TALENTS,
1602    rotation_field_schema: &[],
1603    metrics_plugin_id: None,
1604    hero_talent_trees: &[
1605        HeroTalentTreeDesc {
1606            name: "Archon",
1607            spells: HERO_TREE_ARCHON_SPELLS,
1608            auras: HERO_TREE_ARCHON_AURAS,
1609        },
1610        HeroTalentTreeDesc {
1611            name: "Voidweaver",
1612            spells: HERO_TREE_VOIDWEAVER_SPELLS,
1613            auras: HERO_TREE_VOIDWEAVER_AURAS,
1614        },
1615    ],
1616    reported_spells: REPORTED_SPELLS,
1617    masked_passive_effects: &[],
1618    passive_effect_overrides: &[],
1619};
1620pub(super) const SPEC_DESCRIPTOR: SpecDescriptor = SpecDescriptor {
1621    spec_id: SpecId::Shadow,
1622    display_name: "Shadow Priest",
1623    metadata: DECLARED_METADATA,
1624    handler_factory: new_handler,
1625};
1626wowlab_engine_combat::smoke_test!(build_combat_system_draft);