1#![allow(non_snake_case, dead_code)]
4use wowlab_types::{combat::ResourceType, game::SpecId};
5use wowlab_engine_combat::{
6 CombatSystemBuilder, CombatSystemDraft, AuraDefinitionDraft, LocalAuraIdx,
7 LocalSpellIdx, SpellDefinitionDraft,
8};
9use wowlab_engine_ports::{
10 DeclaredSpecMetadata, SpecDescriptor, SpecHandler, HeroTalentTreeDesc,
11};
12use wowlab_engine_gamedata::ResolvedGameData;
13pub(crate) mod SPELL {
14 pub(crate) const MIND_BLAST: u32 = 8092;
16 pub(crate) const SHADOW_WORD_PAIN: u32 = 589;
18 pub(crate) const VAMPIRIC_TOUCH: u32 = 34914;
20 pub(crate) const SHADOW_WORD_MADNESS: u32 = 335_467;
22 pub(crate) const VOIDFORM: u32 = 228_260;
24 pub(crate) const VOID_VOLLEY: u32 = 1_242_173;
26 pub(crate) const VOID_TORRENT: u32 = 263_165;
28 pub(crate) const MIND_FLAY: u32 = 15407;
30 pub(crate) const SHADOW_WORD_DEATH: u32 = 32379;
32 pub(crate) const HALO: u32 = 120_644;
34 pub(crate) const POWER_INFUSION: u32 = 10060;
36 pub(crate) const SHADOWFORM: u32 = 232_698;
38 pub(crate) const POWER_WORD_FORTITUDE: u32 = 21562;
40 pub(crate) const SHADOWY_APPARITION: u32 = 413_231;
42 pub(crate) const VOID_APPARITION: u32 = 1_264_176;
44 pub(crate) const VOID_BOLT: u32 = 1_264_177;
46 pub(crate) const TENTACLE_SLAM: u32 = 1_227_280;
48 pub(crate) const TENTACLE_SLAM_DAMAGE: u32 = 1_227_621;
50}
51pub(crate) mod AURA {
52 pub(crate) const SHADOWFORM: u32 = 232_698;
54 pub(crate) const VOIDFORM: u32 = 194_249;
56 pub(crate) const VOID_VOLLEY_CHARGES: u32 = 1_242_171;
58 pub(crate) const VOID_VOLLEY_SET_BONUS: u32 = 1_296_580;
60 pub(crate) const ANCIENT_MADNESS_EXTENSION: u32 = 1_231_346;
62 pub(crate) const ANCIENT_MADNESS: u32 = 1_304_485;
64 pub(crate) const SHADOW_WORD_PAIN: u32 = 589;
66 pub(crate) const VAMPIRIC_TOUCH: u32 = 34914;
68 pub(crate) const SHADOW_WORD_MADNESS: u32 = 335_467;
70 pub(crate) const SHADOWY_INSIGHT: u32 = 375_981;
72 pub(crate) const MIND_DEVOURER: u32 = 373_204;
74 pub(crate) const MIND_FLAY_INSANITY: u32 = 391_401;
76 pub(crate) const SCREAMS_OF_THE_VOID: u32 = 393_919;
78 pub(crate) const DEATHSPEAKER: u32 = 392_507;
80 pub(crate) const MISERY: u32 = 238_558;
82 pub(crate) const POWER_WORD_FORTITUDE_HIGHLIGHT: u32 = 1_271_911;
84 pub(crate) const POWER_INFUSION: u32 = 10060;
86 pub(crate) const VOID_TORRENT: u32 = 289_577;
88 pub(crate) const INSIDIOUS_IRE: u32 = 373_212;
90 pub(crate) const SHATTERED_PSYCHE: u32 = 391_092;
92 pub(crate) const VOID_BLAST: u32 = 450_983;
94 pub(crate) const VOIDTOUCHED: u32 = 407_430;
96 pub(crate) const CRUSHING_VOID: u32 = 1_279_437;
98 pub(crate) const TENTACLE_SLAM: u32 = 1_227_280;
100 pub(crate) const ENTROPIC_RIFT: u32 = 447_448;
102 pub(crate) const VOIDHEART: u32 = 449_887;
104}
105pub(crate) mod TALENT {
106 pub(crate) const ANCIENT_MADNESS: u32 = 1_231_346;
108 pub(crate) const AUSPICIOUS_SPIRITS: u32 = 155_271;
110 pub(crate) const COLLAPSING_VOID: u32 = 448_403;
112 pub(crate) const CRUSHING_VOID: u32 = 1_279_437;
114 pub(crate) const DARKENING_HORIZON: u32 = 449_912;
116 pub(crate) const DEATHSPEAKER: u32 = 392_507;
118 pub(crate) const HALO: u32 = 120_644;
120 pub(crate) const IDOL_OF_CTHUN: u32 = 377_349;
122 pub(crate) const IDOL_OF_NZOTH: u32 = 373_280;
124 pub(crate) const IDOL_OF_YOGGSARON: u32 = 373_273;
126 pub(crate) const IMPROVED_VOIDFORM: u32 = 341_240;
128 pub(crate) const INSIDIOUS_IRE: u32 = 373_212;
130 pub(crate) const MADDENING_TENTACLES: u32 = 1_279_353;
132 pub(crate) const MADNESS_WEAVING: u32 = 1_240_394;
134 pub(crate) const MIND_DEVOURER: u32 = 373_202;
136 pub(crate) const MISERY: u32 = 238_558;
138 pub(crate) const POWER_INFUSION: u32 = 10060;
140 pub(crate) const PSYCHIC_LINK: u32 = 199_484;
142 pub(crate) const SCREAMS_OF_THE_VOID: u32 = 375_767;
144 pub(crate) const SHADEBURST: u32 = 73510;
146 pub(crate) const SHADOWY_APPARITIONS: u32 = 341_491;
148 pub(crate) const SHADOWY_INSIGHT: u32 = 375_888;
150 pub(crate) const SHADOW_WORD_MADNESS: u32 = 335_467;
152 pub(crate) const SHATTERED_PSYCHE: u32 = 391_090;
154 pub(crate) const SURGE_OF_INSANITY: u32 = 391_399;
156 pub(crate) const TENTACLE_SLAM: u32 = 1_227_280;
158 pub(crate) const TORMENTED_SPIRITS: u32 = 391_284;
160 pub(crate) const VOIDFORM: u32 = 228_260;
162 pub(crate) const VOIDHEART: u32 = 449_880;
164 pub(crate) const VOID_APPARITIONS_1: u32 = 1_264_096;
166 pub(crate) const VOID_APPARITIONS_2: u32 = 1_264_104;
168 pub(crate) const VOID_APPARITIONS_3: u32 = 1_264_107;
170 pub(crate) const VOID_BLAST: u32 = 450_405;
172 pub(crate) const VOID_TORRENT: u32 = 263_165;
174}
175pub(crate) mod SET_BONUS {
176 pub(crate) const MID2_SHADOW_2PC: u32 = 1_296_579;
178 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 pub(crate) const HALO_DAMAGE: u32 = 120_696;
186 pub(crate) const MIND_FLAY_INSANITY: u32 = 391_403;
188 pub(crate) const VOID_VOLLEY_DAMAGE: u32 = 1_242_189;
190 pub(crate) const VOID_VOLLEY_MISSILE: u32 = 1_242_173;
192 }
193 pub(crate) mod AURA {
194 pub(crate) const MIND_FLAY_INSANITY_BUFF: u32 = 391_401;
196 pub(crate) const POWER_SURGE: u32 = 453_112;
198 pub(crate) const RESONANT_ENERGY: u32 = 453_850;
200 pub(crate) const SUSTAINED_POTENCY: u32 = 454_002;
202 }
203 }
204 pub(crate) mod VOIDWEAVER {
205 pub(crate) mod SPELL {
206 pub(crate) const COLLAPSING_VOID: u32 = 448_405;
208 pub(crate) const ENTROPIC_RIFT_DAMAGE: u32 = 447_448;
210 pub(crate) const VOIDWRAITH: u32 = 451_235;
212 }
213 pub(crate) mod AURA {
214 pub(crate) const ENTROPIC_RIFT_DRIVER: u32 = 459_314;
216 pub(crate) const VOIDHEART_BUFF: u32 = 449_887;
218 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 pub(crate) const MIND_BLAST_DAMAGE: (u32, u8) = (8092, 1);
471 pub(crate) const VOID_BLAST_DAMAGE: (u32, u8) = (450_983, 1);
473 pub(crate) const COLLAPSING_VOID_DAMAGE: (u32, u8) = (448_405, 1);
475 pub(crate) const COLLAPSING_VOID_PCT: (u32, u8) = (448_403, 3);
477 pub(crate) const DARKENING_HORIZON_MAX: (u32, u8) = (449_912, 2);
479 pub(crate) const DARKENING_HORIZON_EXT: (u32, u8) = (449_912, 3);
481 pub(crate) const TENTACLE_SLAM_DAMAGE: (u32, u8) = (1_227_621, 1);
483 pub(crate) const SHADOWY_APPARITION_DAMAGE: (u32, u8) = (413_231, 1);
485 pub(crate) const VOID_APPARITION_DAMAGE: (u32, u8) = (1_264_176, 1);
487 pub(crate) const VOID_BOLT_DAMAGE: (u32, u8) = (1_264_177, 1);
489 pub(crate) const SHADEBURST_DAMAGE: (u32, u8) = (1_231_479, 1);
491 pub(crate) const VOID_VOLLEY_BOLT_DAMAGE: (u32, u8) = (1_242_189, 1);
493 pub(crate) const VOID_APPARITIONS_CHANCE: (u32, u8) = (1_264_104, 2);
495 pub(crate) const AUSPICIOUS_SPIRITS_INSANITY: (u32, u8) = (155_271, 2);
497 pub(crate) const INSIDIOUS_IRE_BONUS: (u32, u8) = (373_212, 1);
499 pub(crate) const MIND_FLAY_TICK_INSANITY: (u32, u8) = (15407, 3);
501 pub(crate) const SHADOW_WORD_DEATH_DAMAGE: (u32, u8) = (32379, 2);
503 pub(crate) const SHADOW_WORD_DEATH_EXECUTE: (u32, u8) = (32379, 4);
505 pub(crate) const SHADOW_WORD_DEATH_THRESHOLD: (u32, u8) = (32379, 3);
507 pub(crate) const SURGE_OF_INSANITY_GEN: (u32, u8) = (391_399, 2);
509 pub(crate) const MID2_2PC_TENTACLE_DAMAGE: (u32, u8) = (1_296_579, 1);
511 pub(crate) const MID2_2PC_TENTACLE_COOLDOWN: (u32, u8) = (1_296_579, 2);
513 pub(crate) const MID2_4PC_VOLLEY_CHANCE: (u32, u8) = (1_296_580, 1);
515 pub(crate) const MID2_4PC_VOLLEY_EFFECTIVENESS: (u32, u8) = (1_296_580, 2);
517 pub(crate) const VOIDFORM_VOLLEY_CHARGES: (u32, u8) = (228_260, 3);
519 pub(crate) const VOID_VOLLEY_BOLT_COUNT: (u32, u8) = (1_242_173, 1);
521 pub(crate) const VOID_VOLLEY_INSANITY: (u32, u8) = (1_242_173, 2);
523 pub(crate) const VOID_VOLLEY_SECONDARY_BOLT_COUNT: (u32, u8) = (1_242_173, 3);
525 pub(crate) const VOID_VOLLEY_TARGETS: (u32, u8) = (1_242_173, 1);
527 pub(crate) const ANCIENT_MADNESS_EXTENSION_MAX: (u32, u8) = (194_249, 13);
529 pub(crate) const ANCIENT_MADNESS_EXTENSION_MS: (u32, u8) = (194_249, 14);
531 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, ¶ms.game_data))
1388 .aura("voidform", AURA::VOIDFORM, |a| aura_voidform(a, ¶ms.game_data))
1389 .aura(
1390 "void_volley_charges",
1391 AURA::VOID_VOLLEY_CHARGES,
1392 |a| aura_void_volley_charges(a, ¶ms.game_data),
1393 )
1394 .aura(
1395 "void_volley_set_bonus",
1396 AURA::VOID_VOLLEY_SET_BONUS,
1397 |a| aura_void_volley_set_bonus(a, ¶ms.game_data),
1398 )
1399 .aura(
1400 "ancient_madness_extension",
1401 AURA::ANCIENT_MADNESS_EXTENSION,
1402 |a| aura_ancient_madness_extension(a, ¶ms.game_data),
1403 )
1404 .aura(
1405 "ancient_madness",
1406 AURA::ANCIENT_MADNESS,
1407 |a| aura_ancient_madness(a, ¶ms.game_data),
1408 )
1409 .aura(
1410 "shadow_word_pain",
1411 AURA::SHADOW_WORD_PAIN,
1412 |a| aura_shadow_word_pain(a, ¶ms.game_data),
1413 )
1414 .aura(
1415 "vampiric_touch",
1416 AURA::VAMPIRIC_TOUCH,
1417 |a| aura_vampiric_touch(a, ¶ms.game_data),
1418 )
1419 .aura(
1420 "shadow_word_madness",
1421 AURA::SHADOW_WORD_MADNESS,
1422 |a| aura_shadow_word_madness(a, ¶ms.game_data),
1423 )
1424 .aura(
1425 "shadowy_insight",
1426 AURA::SHADOWY_INSIGHT,
1427 |a| aura_shadowy_insight(a, ¶ms.game_data),
1428 )
1429 .aura(
1430 "mind_devourer",
1431 AURA::MIND_DEVOURER,
1432 |a| aura_mind_devourer(a, ¶ms.game_data),
1433 )
1434 .aura(
1435 "mind_flay_insanity",
1436 AURA::MIND_FLAY_INSANITY,
1437 |a| aura_mind_flay_insanity(a, ¶ms.game_data),
1438 )
1439 .aura(
1440 "screams_of_the_void",
1441 AURA::SCREAMS_OF_THE_VOID,
1442 |a| aura_screams_of_the_void(a, ¶ms.game_data),
1443 )
1444 .aura(
1445 "deathspeaker",
1446 AURA::DEATHSPEAKER,
1447 |a| aura_deathspeaker(a, ¶ms.game_data),
1448 )
1449 .aura("misery", AURA::MISERY, |a| aura_misery(a, ¶ms.game_data))
1450 .aura(
1451 "power_word_fortitude_highlight",
1452 AURA::POWER_WORD_FORTITUDE_HIGHLIGHT,
1453 |a| aura_power_word_fortitude_highlight(a, ¶ms.game_data),
1454 )
1455 .aura(
1456 "power_infusion",
1457 AURA::POWER_INFUSION,
1458 |a| aura_power_infusion(a, ¶ms.game_data),
1459 )
1460 .aura(
1461 "void_torrent",
1462 AURA::VOID_TORRENT,
1463 |a| aura_void_torrent(a, ¶ms.game_data),
1464 )
1465 .aura(
1466 "insidious_ire",
1467 AURA::INSIDIOUS_IRE,
1468 |a| aura_insidious_ire(a, ¶ms.game_data),
1469 )
1470 .aura(
1471 "shattered_psyche",
1472 AURA::SHATTERED_PSYCHE,
1473 |a| aura_shattered_psyche(a, ¶ms.game_data),
1474 )
1475 .aura("void_blast", AURA::VOID_BLAST, |a| aura_void_blast(a, ¶ms.game_data))
1476 .aura(
1477 "voidtouched",
1478 AURA::VOIDTOUCHED,
1479 |a| aura_voidtouched(a, ¶ms.game_data),
1480 )
1481 .aura(
1482 "crushing_void",
1483 AURA::CRUSHING_VOID,
1484 |a| aura_crushing_void(a, ¶ms.game_data),
1485 )
1486 .aura(
1487 "tentacle_slam",
1488 AURA::TENTACLE_SLAM,
1489 |a| aura_tentacle_slam(a, ¶ms.game_data),
1490 )
1491 .aura(
1492 "entropic_rift",
1493 AURA::ENTROPIC_RIFT,
1494 |a| aura_entropic_rift(a, ¶ms.game_data),
1495 )
1496 .aura("voidheart", AURA::VOIDHEART, |a| aura_voidheart(a, ¶ms.game_data))
1497 .spell(
1498 "mind_blast",
1499 SPELL::MIND_BLAST,
1500 |s| spell_mind_blast(s, ¶ms.game_data),
1501 )
1502 .spell(
1503 "shadow_word_pain",
1504 SPELL::SHADOW_WORD_PAIN,
1505 |s| spell_shadow_word_pain(s, ¶ms.game_data),
1506 )
1507 .spell(
1508 "vampiric_touch",
1509 SPELL::VAMPIRIC_TOUCH,
1510 |s| spell_vampiric_touch(s, ¶ms.game_data),
1511 )
1512 .spell(
1513 "shadow_word_madness",
1514 SPELL::SHADOW_WORD_MADNESS,
1515 |s| spell_shadow_word_madness(s, ¶ms.game_data),
1516 )
1517 .spell("voidform", SPELL::VOIDFORM, |s| spell_voidform(s, ¶ms.game_data))
1518 .spell(
1519 "void_volley",
1520 SPELL::VOID_VOLLEY,
1521 |s| spell_void_volley(s, ¶ms.game_data),
1522 )
1523 .spell(
1524 "void_torrent",
1525 SPELL::VOID_TORRENT,
1526 |s| spell_void_torrent(s, ¶ms.game_data),
1527 )
1528 .spell("mind_flay", SPELL::MIND_FLAY, |s| spell_mind_flay(s, ¶ms.game_data))
1529 .spell(
1530 "shadow_word_death",
1531 SPELL::SHADOW_WORD_DEATH,
1532 |s| spell_shadow_word_death(s, ¶ms.game_data),
1533 )
1534 .spell("halo", SPELL::HALO, |s| spell_halo(s, ¶ms.game_data))
1535 .spell(
1536 "power_infusion",
1537 SPELL::POWER_INFUSION,
1538 |s| spell_power_infusion(s, ¶ms.game_data),
1539 )
1540 .spell(
1541 "shadowform",
1542 SPELL::SHADOWFORM,
1543 |s| spell_shadowform(s, ¶ms.game_data),
1544 )
1545 .spell(
1546 "power_word_fortitude",
1547 SPELL::POWER_WORD_FORTITUDE,
1548 |s| spell_power_word_fortitude(s, ¶ms.game_data),
1549 )
1550 .spell(
1551 "shadowy_apparition",
1552 SPELL::SHADOWY_APPARITION,
1553 |s| spell_shadowy_apparition(s, ¶ms.game_data),
1554 )
1555 .spell(
1556 "void_apparition",
1557 SPELL::VOID_APPARITION,
1558 |s| spell_void_apparition(s, ¶ms.game_data),
1559 )
1560 .spell("void_bolt", SPELL::VOID_BOLT, |s| spell_void_bolt(s, ¶ms.game_data))
1561 .spell(
1562 "tentacle_slam",
1563 SPELL::TENTACLE_SLAM,
1564 |s| spell_tentacle_slam(s, ¶ms.game_data),
1565 )
1566 .spell(
1567 "tentacle_slam_damage",
1568 SPELL::TENTACLE_SLAM_DAMAGE,
1569 |s| spell_tentacle_slam_damage(s, ¶ms.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 ¶ms.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 ¶ms,
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);