1#![allow(non_snake_case, dead_code)]
4use wowlab_types::{combat::ResourceType, game::SpecId};
5use wowlab_engine_domain::dbc::ProcAttributes;
6use wowlab_engine_combat::{
7 CombatSystemBuilder, CombatSystemDraft, AuraDefinitionDraft, LocalAuraIdx,
8 LocalSpellIdx, SpellDefinitionDraft,
9};
10use wowlab_engine_ports::{
11 DeclaredSpecMetadata, SpecDescriptor, SpecHandler, HeroTalentTreeDesc,
12 DeclaredServerProcEntry,
13};
14use wowlab_engine_gamedata::ResolvedGameData;
15pub(crate) mod SPELL {
16 pub(crate) const STORMSTRIKE: u32 = 17364;
18 pub(crate) const LAVA_LASH: u32 = 60103;
20 pub(crate) const CRASH_LIGHTNING: u32 = 187_874;
22 pub(crate) const LIGHTNING_BOLT: u32 = 188_196;
24 pub(crate) const CHAIN_LIGHTNING: u32 = 188_443;
26 pub(crate) const FLAME_SHOCK: u32 = 188_389;
28 pub(crate) const FROST_SHOCK: u32 = 196_840;
30 pub(crate) const SUNDERING: u32 = 197_214;
32 pub(crate) const DOOM_WINDS: u32 = 384_352;
34 pub(crate) const ASCENDANCE: u32 = 114_051;
36 pub(crate) const TEMPEST: u32 = 452_201;
38 pub(crate) const VOLTAIC_BLAZE: u32 = 470_057;
40 pub(crate) const SKYFURY: u32 = 462_854;
42 pub(crate) const LIGHTNING_SHIELD: u32 = 192_106;
44 pub(crate) const STORMSTRIKE_MH: u32 = 32175;
46 pub(crate) const STORMSTRIKE_OFFHAND: u32 = 32176;
48 pub(crate) const SUNDERING_SPLITSTREAM: u32 = 467_283;
50 pub(crate) const STORMBLAST: u32 = 390_287;
52 pub(crate) const CRASH_LIGHTNING_UNLEASHED: u32 = 1_252_431;
54 pub(crate) const PRIMORDIAL_STORM: u32 = 1_218_090;
56 pub(crate) const PRIMORDIAL_FIRE: u32 = 1_218_113;
58 pub(crate) const PRIMORDIAL_FROST: u32 = 1_218_116;
60 pub(crate) const PRIMORDIAL_LIGHTNING: u32 = 1_218_118;
62 pub(crate) const SURGING_TOTEM: u32 = 444_995;
64 pub(crate) const TREMOR: u32 = 455_622;
66 pub(crate) const SURGING_BOLT: u32 = 458_267;
68 pub(crate) const SEARING_BOLT: u32 = 3606;
70 pub(crate) const SEARING_VOLLEY: u32 = 458_147;
72 pub(crate) const WINDFURY_WEAPON: u32 = 33757;
74 pub(crate) const FLAMETONGUE_WEAPON: u32 = 318_038;
76 pub(crate) const WINDFURY_ATTACK: u32 = 25504;
78 pub(crate) const FLAMETONGUE_ATTACK: u32 = 10444;
80 pub(crate) const FLAMETONGUE_ATTACK_IMBUEMENT_MASTERY: u32 = 467_386;
82 pub(crate) const MAELSTROM_WEAPON_DRIVER: u32 = 187_880;
84 pub(crate) const HOT_HAND_DRIVER: u32 = 201_900;
86 pub(crate) const STORMSURGE_DRIVER: u32 = 201_845;
88}
89pub(crate) mod AURA {
90 pub(crate) const ASCENDANCE: u32 = 114_051;
92 pub(crate) const DOOM_WINDS: u32 = 466_772;
94 pub(crate) const STORM_UNLEASHED: u32 = 1_262_830;
96 pub(crate) const CRASH_LIGHTNING: u32 = 1_252_415;
98 pub(crate) const CONVERGING_STORMS: u32 = 198_300;
100 pub(crate) const MOLTEN_WEAPON: u32 = 224_125;
102 pub(crate) const CRACKLING_SURGE: u32 = 224_127;
104 pub(crate) const TEMPEST: u32 = 454_015;
106 pub(crate) const UNLIMITED_POWER: u32 = 454_394;
108 pub(crate) const FLAME_SHOCK: u32 = 188_389;
110 pub(crate) const LIGHTNING_SHIELD: u32 = 192_106;
112 pub(crate) const PRIMORDIAL_STORM: u32 = 1_218_125;
114 pub(crate) const OVERFLOWING_MAELSTROM: u32 = 384_143;
116 pub(crate) const LASHING_FLAMES: u32 = 334_168;
118 pub(crate) const SKYFURY_HIGHLIGHT: u32 = 462_854;
120 pub(crate) const THORIM_S_INVOCATION: u32 = 384_444;
122 pub(crate) const BURNING_CORE: u32 = 1_299_975;
124 pub(crate) const SHORT_CIRCUIT: u32 = 1_299_991;
126 pub(crate) const LIVELY_TOTEMS: u32 = 461_242;
128 pub(crate) const AMPLIFICATION_CORE: u32 = 456_369;
130 pub(crate) const SURGING_TOTEM: u32 = 1_221_347;
132 pub(crate) const WHIRLING_FIRE: u32 = 453_405;
134 pub(crate) const WHIRLING_EARTH: u32 = 453_406;
136 pub(crate) const WHIRLING_AIR: u32 = 453_409;
138 pub(crate) const TOTEMIC_REBOUND: u32 = 458_269;
140 pub(crate) const MAELSTROM_WEAPON: u32 = 344_179;
142 pub(crate) const HOT_HAND: u32 = 215_785;
144 pub(crate) const STORMSURGE: u32 = 201_846;
146 pub(crate) const WINDFURY_WEAPON: u32 = 319_773;
148 pub(crate) const FLAMETONGUE_WEAPON: u32 = 319_778;
150}
151pub(crate) mod TALENT {
152 pub(crate) const ASCENDANCE: u32 = 114_051;
154 pub(crate) const ASHEN_CATALYST: u32 = 390_370;
156 pub(crate) const CRASH_LIGHTNING: u32 = 187_874;
158 pub(crate) const DEEPLY_ROOTED_ELEMENTS: u32 = 378_270;
160 pub(crate) const DOOM_WINDS: u32 = 384_352;
162 pub(crate) const ELEMENTAL_ASSAULT: u32 = 210_853;
164 pub(crate) const ELEMENTAL_BLAST: u32 = 117_014;
166 pub(crate) const ELEMENTAL_TEMPO: u32 = 1_250_364;
168 pub(crate) const ELEMENTAL_WEAPONS: u32 = 384_355;
170 pub(crate) const FERAL_SPIRIT: u32 = 469_314;
172 pub(crate) const FLAMETONGUE_WEAPON: u32 = 318_038;
174 pub(crate) const FORCEFUL_WINDS: u32 = 262_647;
176 pub(crate) const HOT_HAND: u32 = 201_900;
178 pub(crate) const IMBUEMENT_MASTERY: u32 = 445_028;
180 pub(crate) const LAVA_LASH: u32 = 60103;
182 pub(crate) const LIVELY_TOTEMS: u32 = 445_034;
184 pub(crate) const MAELSTROM_WEAPON: u32 = 187_880;
186 pub(crate) const OVERFLOWING_MAELSTROM: u32 = 384_143;
188 pub(crate) const PRIMORDIAL_STORM: u32 = 1_218_047;
190 pub(crate) const RAGING_MAELSTROM: u32 = 384_149;
192 pub(crate) const SPLITSTREAM: u32 = 445_035;
194 pub(crate) const STORMBLAST: u32 = 319_930;
196 pub(crate) const STORMFLURRY: u32 = 344_357;
198 pub(crate) const STORMS_WRATH: u32 = 392_352;
200 pub(crate) const STORM_UNLEASHED: u32 = 1_262_713;
202 pub(crate) const STORM_UNLEASHED_REPEATS: u32 = 1_252_373;
204 pub(crate) const SUNDERING: u32 = 197_214;
206 pub(crate) const THORIMS_INVOCATION: u32 = 384_444;
208 pub(crate) const TOTEMIC_MOMENTUM: u32 = 1_260_644;
210 pub(crate) const UNRULY_WINDS: u32 = 390_288;
212 pub(crate) const VOLTAIC_BLAZE: u32 = 470_057;
214 pub(crate) const WINDFURY_WEAPON: u32 = 33757;
216}
217pub(crate) mod SET_BONUS {
218 pub(crate) const MID2_ENHANCEMENT_2PC: u32 = 1_296_627;
220 pub(crate) const MID2_ENHANCEMENT_4PC: u32 = 1_296_628;
222}
223pub(crate) mod REPORTED_SPELL {
224 pub(crate) const CRASH_LIGHTNING_PROC: u32 = 195_592;
226 pub(crate) const CRASH_LIGHTNING_UNLEASHED: u32 = 1_252_431;
228 pub(crate) const DOOM_WINDS_DAMAGE: u32 = 469_270;
230 pub(crate) const ELEMENTAL_WEAPONS_MODIFIER: u32 = 408_390;
232 pub(crate) const FLAMETONGUE_ATTACK_IMBUEMENT_MASTERY: u32 = 467_386;
234 pub(crate) const PRIMORDIAL_FIRE: u32 = 1_218_113;
236 pub(crate) const PRIMORDIAL_FROST: u32 = 1_218_116;
238 pub(crate) const PRIMORDIAL_LIGHTNING: u32 = 1_218_118;
240 pub(crate) const SEARING_VOLLEY: u32 = 458_147;
242 pub(crate) const STORMBLAST: u32 = 390_287;
244 pub(crate) const SUNDERING_SPLITSTREAM: u32 = 467_283;
246 pub(crate) const VOLTAIC_BLAZE_DAMAGE: u32 = 1_259_101;
248}
249pub(crate) mod HERO {
250 pub(crate) mod STORMBRINGER {
251 pub(crate) mod SPELL {
252 pub(crate) const TEMPEST: u32 = 452_201;
254 }
255 pub(crate) mod AURA {
256 pub(crate) const ARC_DISCHARGE: u32 = 470_532;
258 pub(crate) const AWAKENING_STORMS: u32 = 455_129;
260 pub(crate) const STORM_SWELL: u32 = 455_089;
262 pub(crate) const TEMPEST: u32 = 454_015;
264 pub(crate) const UNLIMITED_POWER: u32 = 454_394;
266 }
267 }
268 pub(crate) mod TOTEMIC {
269 pub(crate) mod SPELL {
270 pub(crate) const SURGING_TOTEM: u32 = 444_995;
272 }
273 pub(crate) mod AURA {
274 pub(crate) const AMPLIFICATION_CORE: u32 = 456_369;
276 pub(crate) const LIVELY_TOTEMS: u32 = 461_242;
278 pub(crate) const SURGING_TOTEM: u32 = 1_221_347;
280 pub(crate) const TOTEMIC_REBOUND: u32 = 458_269;
282 pub(crate) const WHIRLING_AIR: u32 = 453_409;
284 pub(crate) const WHIRLING_EARTH: u32 = 453_406;
286 pub(crate) const WHIRLING_FIRE: u32 = 453_405;
288 }
289 }
290}
291static HERO_TREE_STORMBRINGER_SPELLS: &[(&str, u32)] = &[("TEMPEST", 452_201)];
292static HERO_TREE_STORMBRINGER_AURAS: &[(&str, u32)] = &[
293 ("ARC_DISCHARGE", 470_532),
294 ("AWAKENING_STORMS", 455_129),
295 ("STORM_SWELL", 455_089),
296 ("TEMPEST", 454_015),
297 ("UNLIMITED_POWER", 454_394),
298];
299static HERO_TREE_TOTEMIC_SPELLS: &[(&str, u32)] = &[("SURGING_TOTEM", 444_995)];
300static HERO_TREE_TOTEMIC_AURAS: &[(&str, u32)] = &[
301 ("AMPLIFICATION_CORE", 456_369),
302 ("LIVELY_TOTEMS", 461_242),
303 ("SURGING_TOTEM", 1_221_347),
304 ("TOTEMIC_REBOUND", 458_269),
305 ("WHIRLING_AIR", 453_409),
306 ("WHIRLING_EARTH", 453_406),
307 ("WHIRLING_FIRE", 453_405),
308];
309pub(crate) mod DAMAGE_SPELL {
310 pub(crate) const STORMSTRIKE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_17364;
311 pub(crate) const LAVA_LASH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_60103;
312 pub(crate) const CRASH_LIGHTNING: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_187874;
313 pub(crate) const LIGHTNING_BOLT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_188196;
314 pub(crate) const CHAIN_LIGHTNING: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_188443;
315 pub(crate) const FLAME_SHOCK: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_188389;
316 pub(crate) const FROST_SHOCK: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_196840;
317 pub(crate) const SUNDERING: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_197214;
318 pub(crate) const DOOM_WINDS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_384352;
319 pub(crate) const ASCENDANCE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_114051;
320 pub(crate) const TEMPEST: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_452201;
321 pub(crate) const VOLTAIC_BLAZE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_470057;
322 pub(crate) const SKYFURY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_462854;
323 pub(crate) const LIGHTNING_SHIELD: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_192106;
324 pub(crate) const STORMSTRIKE_MH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_32175;
325 pub(crate) const STORMSTRIKE_OFFHAND: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_32176;
326 pub(crate) const SUNDERING_SPLITSTREAM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_467283;
327 pub(crate) const STORMBLAST: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_390287;
328 pub(crate) const CRASH_LIGHTNING_UNLEASHED: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_1252431;
329 pub(crate) const PRIMORDIAL_STORM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_1218090;
330 pub(crate) const PRIMORDIAL_FIRE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_1218113;
331 pub(crate) const PRIMORDIAL_FROST: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_1218116;
332 pub(crate) const PRIMORDIAL_LIGHTNING: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_1218118;
333 pub(crate) const SURGING_TOTEM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_444995;
334 pub(crate) const TREMOR: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_455622;
335 pub(crate) const SURGING_BOLT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_458267;
336 pub(crate) const SEARING_BOLT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_3606;
337 pub(crate) const SEARING_VOLLEY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_458147;
338 pub(crate) const WINDFURY_WEAPON: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_33757;
339 pub(crate) const FLAMETONGUE_WEAPON: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_318038;
340 pub(crate) const WINDFURY_ATTACK: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_25504;
341 pub(crate) const FLAMETONGUE_ATTACK: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_10444;
342 pub(crate) const FLAMETONGUE_ATTACK_IMBUEMENT_MASTERY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_467386;
343 pub(crate) const MAELSTROM_WEAPON_DRIVER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_187880;
344 pub(crate) const HOT_HAND_DRIVER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_201900;
345 pub(crate) const STORMSURGE_DRIVER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_201845;
346}
347pub(crate) mod DAMAGE_AURA {
348 pub(crate) const ASCENDANCE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_114051;
349 pub(crate) const DOOM_WINDS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_466772;
350 pub(crate) const STORM_UNLEASHED: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_1262830;
351 pub(crate) const CRASH_LIGHTNING: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_1252415;
352 pub(crate) const CONVERGING_STORMS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_198300;
353 pub(crate) const MOLTEN_WEAPON: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_224125;
354 pub(crate) const CRACKLING_SURGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_224127;
355 pub(crate) const TEMPEST: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_454015;
356 pub(crate) const UNLIMITED_POWER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_454394;
357 pub(crate) const FLAME_SHOCK: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_188389;
358 pub(crate) const LIGHTNING_SHIELD: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_192106;
359 pub(crate) const PRIMORDIAL_STORM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_1218125;
360 pub(crate) const OVERFLOWING_MAELSTROM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_384143;
361 pub(crate) const LASHING_FLAMES: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_334168;
362 pub(crate) const SKYFURY_HIGHLIGHT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_462854;
363 pub(crate) const THORIM_S_INVOCATION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_384444;
364 pub(crate) const BURNING_CORE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_1299975;
365 pub(crate) const SHORT_CIRCUIT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_1299991;
366 pub(crate) const LIVELY_TOTEMS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_461242;
367 pub(crate) const AMPLIFICATION_CORE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_456369;
368 pub(crate) const SURGING_TOTEM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_1221347;
369 pub(crate) const WHIRLING_FIRE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_453405;
370 pub(crate) const WHIRLING_EARTH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_453406;
371 pub(crate) const WHIRLING_AIR: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_453409;
372 pub(crate) const TOTEMIC_REBOUND: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_458269;
373 pub(crate) const MAELSTROM_WEAPON: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_344179;
374 pub(crate) const HOT_HAND: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_215785;
375 pub(crate) const STORMSURGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_201846;
376 pub(crate) const WINDFURY_WEAPON: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_319773;
377 pub(crate) const FLAMETONGUE_WEAPON: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_319778;
378}
379pub(crate) mod DAMAGE_TALENT {
380 pub(crate) const ASCENDANCE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_114051;
381 pub(crate) const ASHEN_CATALYST: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_390370;
382 pub(crate) const CRASH_LIGHTNING: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_187874;
383 pub(crate) const DEEPLY_ROOTED_ELEMENTS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_378270;
384 pub(crate) const DOOM_WINDS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_384352;
385 pub(crate) const ELEMENTAL_ASSAULT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_210853;
386 pub(crate) const ELEMENTAL_BLAST: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_117014;
387 pub(crate) const ELEMENTAL_TEMPO: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_1250364;
388 pub(crate) const ELEMENTAL_WEAPONS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_384355;
389 pub(crate) const FERAL_SPIRIT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_469314;
390 pub(crate) const FLAMETONGUE_WEAPON: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_318038;
391 pub(crate) const FORCEFUL_WINDS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_262647;
392 pub(crate) const HOT_HAND: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_201900;
393 pub(crate) const IMBUEMENT_MASTERY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_445028;
394 pub(crate) const LAVA_LASH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_60103;
395 pub(crate) const LIVELY_TOTEMS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_445034;
396 pub(crate) const MAELSTROM_WEAPON: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_187880;
397 pub(crate) const OVERFLOWING_MAELSTROM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_384143;
398 pub(crate) const PRIMORDIAL_STORM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_1218047;
399 pub(crate) const RAGING_MAELSTROM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_384149;
400 pub(crate) const SPLITSTREAM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_445035;
401 pub(crate) const STORMBLAST: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_319930;
402 pub(crate) const STORMFLURRY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_344357;
403 pub(crate) const STORMS_WRATH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_392352;
404 pub(crate) const STORM_UNLEASHED: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_1262713;
405 pub(crate) const STORM_UNLEASHED_REPEATS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_1252373;
406 pub(crate) const SUNDERING: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_197214;
407 pub(crate) const THORIMS_INVOCATION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_384444;
408 pub(crate) const TOTEMIC_MOMENTUM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_1260644;
409 pub(crate) const UNRULY_WINDS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_390288;
410 pub(crate) const VOLTAIC_BLAZE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_470057;
411 pub(crate) const WINDFURY_WEAPON: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_33757;
412}
413pub(crate) mod DAMAGE_REPORTED {
414 pub(crate) const CRASH_LIGHTNING_PROC: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_195592;
415 pub(crate) const CRASH_LIGHTNING_UNLEASHED: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_1252431;
416 pub(crate) const DOOM_WINDS_DAMAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_469270;
417 pub(crate) const ELEMENTAL_WEAPONS_MODIFIER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_408390;
418 pub(crate) const FLAMETONGUE_ATTACK_IMBUEMENT_MASTERY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_467386;
419 pub(crate) const PRIMORDIAL_FIRE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_1218113;
420 pub(crate) const PRIMORDIAL_FROST: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_1218116;
421 pub(crate) const PRIMORDIAL_LIGHTNING: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_1218118;
422 pub(crate) const SEARING_VOLLEY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_458147;
423 pub(crate) const STORMBLAST: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_390287;
424 pub(crate) const SUNDERING_SPLITSTREAM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_467283;
425 pub(crate) const VOLTAIC_BLAZE_DAMAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ACTION::SPELL_1259101;
426}
427pub(crate) mod DAMAGE_EFFECT {
428 pub(crate) const ASHEN_CATALYST_CDR: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::EFFECT::SPELL_390370_EFFECT_1;
429 pub(crate) const CHAIN_LIGHTNING_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::EFFECT::SPELL_188443_EFFECT_1;
430 pub(crate) const CRASH_LIGHTNING_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::EFFECT::SPELL_1252415_EFFECT_1;
431 pub(crate) const CRASH_LIGHTNING_UNLEASHED_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::EFFECT::SPELL_1252431_EFFECT_1;
432 pub(crate) const ELEMENTAL_TEMPO_CDR: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::EFFECT::SPELL_1250364_EFFECT_3;
433 pub(crate) const ELEMENTAL_WEAPONS_BONUS: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::EFFECT::SPELL_384355_EFFECT_1;
434 pub(crate) const ELEMENTAL_WEAPONS_DIRECT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::EFFECT::SPELL_408390_EFFECT_1;
435 pub(crate) const ELEMENTAL_WEAPONS_PERIODIC: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::EFFECT::SPELL_408390_EFFECT_2;
436 pub(crate) const FLAMETONGUE_ATTACK_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::EFFECT::SPELL_10444_EFFECT_1;
437 pub(crate) const FLAMETONGUE_IMBUEMENT_MASTERY_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::EFFECT::SPELL_467386_EFFECT_1;
438 pub(crate) const FIRE_NOVA_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::EFFECT::SPELL_333977_EFFECT_1;
439 pub(crate) const LAVA_LASH_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::EFFECT::SPELL_60103_EFFECT_1;
440 pub(crate) const LIGHTNING_BOLT_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::EFFECT::SPELL_188196_EFFECT_1;
441 pub(crate) const PRIMORDIAL_FIRE_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::EFFECT::SPELL_1218113_EFFECT_1;
442 pub(crate) const PRIMORDIAL_FROST_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::EFFECT::SPELL_1218116_EFFECT_1;
443 pub(crate) const PRIMORDIAL_LIGHTNING_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::EFFECT::SPELL_1218118_EFFECT_1;
444 pub(crate) const SEARING_BOLT_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::EFFECT::SPELL_3606_EFFECT_1;
445 pub(crate) const SEARING_VOLLEY_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::EFFECT::SPELL_458147_EFFECT_1;
446 pub(crate) const SPLITSTREAM_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::EFFECT::SPELL_445035_EFFECT_1;
447 pub(crate) const STORMBLAST_BONUS: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::EFFECT::SPELL_319930_EFFECT_1;
448 pub(crate) const STORMSTRIKE_MH_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::EFFECT::SPELL_32175_EFFECT_1;
449 pub(crate) const STORMSTRIKE_OH_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::EFFECT::SPELL_32176_EFFECT_1;
450 pub(crate) const STORMSURGE_MASTERY: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::EFFECT::SPELL_77223_EFFECT_3;
451 pub(crate) const STORM_UNLEASHED_CHANCE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::EFFECT::SPELL_1262713_EFFECT_1;
452 pub(crate) const SUNDERING_SPLITSTREAM_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::EFFECT::SPELL_467283_EFFECT_1;
453 pub(crate) const SURGING_BOLT_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::EFFECT::SPELL_458267_EFFECT_1;
454 pub(crate) const TOTEMIC_MOMENTUM_BONUS: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::EFFECT::SPELL_1260644_EFFECT_1;
455 pub(crate) const TREMOR_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::EFFECT::SPELL_455622_EFFECT_1;
456 pub(crate) const VOLTAIC_BLAZE_MAELSTROM_STACKS: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::EFFECT::SPELL_470057_EFFECT_2;
457 pub(crate) const MID2_FIRE_NOVA_PRIMARY_BONUS: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::EFFECT::SPELL_1296627_EFFECT_1;
458 pub(crate) const MID2_FIRE_NOVA_CRASH_CDR_MS: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::EFFECT::SPELL_1296628_EFFECT_1;
459 pub(crate) const MID2_SHORT_CIRCUIT_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::EFFECT::SPELL_1299991_EFFECT_1;
460 pub(crate) const WINDFURY_ATTACK_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::EFFECT::SPELL_25504_EFFECT_1;
461 pub(crate) const WINDFURY_MASTERY: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::EFFECT::SPELL_77223_EFFECT_4;
462 pub(crate) const WINDFURY_PROC: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::EFFECT::SPELL_319773_EFFECT_1;
463 pub(crate) const TOTEMIC_REBOUND_RPPM_DRIVER: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::EFFECT::SPELL_445025_EFFECT_1;
464}
465pub(crate) const AURA_ASCENDANCE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::AURA_ASCENDANCE
466 .bind(wowlab_engine_combat::generated_identities::specs::enhancement_shaman::PROOF);
467pub(crate) const AURA_DOOM_WINDS: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::AURA_DOOM_WINDS
468 .bind(wowlab_engine_combat::generated_identities::specs::enhancement_shaman::PROOF);
469pub(crate) const AURA_STORM_UNLEASHED: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::AURA_STORM_UNLEASHED
470 .bind(wowlab_engine_combat::generated_identities::specs::enhancement_shaman::PROOF);
471pub(crate) const AURA_CRASH_LIGHTNING: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::AURA_CRASH_LIGHTNING
472 .bind(wowlab_engine_combat::generated_identities::specs::enhancement_shaman::PROOF);
473pub(crate) const AURA_CONVERGING_STORMS: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::AURA_CONVERGING_STORMS
474 .bind(wowlab_engine_combat::generated_identities::specs::enhancement_shaman::PROOF);
475pub(crate) const AURA_MOLTEN_WEAPON: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::AURA_MOLTEN_WEAPON
476 .bind(wowlab_engine_combat::generated_identities::specs::enhancement_shaman::PROOF);
477pub(crate) const AURA_CRACKLING_SURGE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::AURA_CRACKLING_SURGE
478 .bind(wowlab_engine_combat::generated_identities::specs::enhancement_shaman::PROOF);
479pub(crate) const AURA_TEMPEST: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::AURA_TEMPEST
480 .bind(wowlab_engine_combat::generated_identities::specs::enhancement_shaman::PROOF);
481pub(crate) const AURA_UNLIMITED_POWER: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::AURA_UNLIMITED_POWER
482 .bind(wowlab_engine_combat::generated_identities::specs::enhancement_shaman::PROOF);
483pub(crate) const AURA_FLAME_SHOCK: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::AURA_FLAME_SHOCK
484 .bind(wowlab_engine_combat::generated_identities::specs::enhancement_shaman::PROOF);
485pub(crate) const AURA_LIGHTNING_SHIELD: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::AURA_LIGHTNING_SHIELD
486 .bind(wowlab_engine_combat::generated_identities::specs::enhancement_shaman::PROOF);
487pub(crate) const AURA_PRIMORDIAL_STORM: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::AURA_PRIMORDIAL_STORM
488 .bind(wowlab_engine_combat::generated_identities::specs::enhancement_shaman::PROOF);
489pub(crate) const AURA_OVERFLOWING_MAELSTROM: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::AURA_OVERFLOWING_MAELSTROM
490 .bind(wowlab_engine_combat::generated_identities::specs::enhancement_shaman::PROOF);
491pub(crate) const AURA_LASHING_FLAMES: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::AURA_LASHING_FLAMES
492 .bind(wowlab_engine_combat::generated_identities::specs::enhancement_shaman::PROOF);
493pub(crate) const AURA_SKYFURY_HIGHLIGHT: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::AURA_SKYFURY_HIGHLIGHT
494 .bind(wowlab_engine_combat::generated_identities::specs::enhancement_shaman::PROOF);
495pub(crate) const AURA_THORIM_S_INVOCATION: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::AURA_THORIM_S_INVOCATION
496 .bind(wowlab_engine_combat::generated_identities::specs::enhancement_shaman::PROOF);
497pub(crate) const AURA_BURNING_CORE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::AURA_BURNING_CORE
498 .bind(wowlab_engine_combat::generated_identities::specs::enhancement_shaman::PROOF);
499pub(crate) const AURA_SHORT_CIRCUIT: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::AURA_SHORT_CIRCUIT
500 .bind(wowlab_engine_combat::generated_identities::specs::enhancement_shaman::PROOF);
501pub(crate) const AURA_LIVELY_TOTEMS: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::AURA_LIVELY_TOTEMS
502 .bind(wowlab_engine_combat::generated_identities::specs::enhancement_shaman::PROOF);
503pub(crate) const AURA_AMPLIFICATION_CORE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::AURA_AMPLIFICATION_CORE
504 .bind(wowlab_engine_combat::generated_identities::specs::enhancement_shaman::PROOF);
505pub(crate) const AURA_SURGING_TOTEM: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::AURA_SURGING_TOTEM
506 .bind(wowlab_engine_combat::generated_identities::specs::enhancement_shaman::PROOF);
507pub(crate) const AURA_WHIRLING_FIRE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::AURA_WHIRLING_FIRE
508 .bind(wowlab_engine_combat::generated_identities::specs::enhancement_shaman::PROOF);
509pub(crate) const AURA_WHIRLING_EARTH: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::AURA_WHIRLING_EARTH
510 .bind(wowlab_engine_combat::generated_identities::specs::enhancement_shaman::PROOF);
511pub(crate) const AURA_WHIRLING_AIR: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::AURA_WHIRLING_AIR
512 .bind(wowlab_engine_combat::generated_identities::specs::enhancement_shaman::PROOF);
513pub(crate) const AURA_TOTEMIC_REBOUND: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::AURA_TOTEMIC_REBOUND
514 .bind(wowlab_engine_combat::generated_identities::specs::enhancement_shaman::PROOF);
515pub(crate) const AURA_MAELSTROM_WEAPON: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::AURA_MAELSTROM_WEAPON
516 .bind(wowlab_engine_combat::generated_identities::specs::enhancement_shaman::PROOF);
517pub(crate) const AURA_HOT_HAND: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::AURA_HOT_HAND
518 .bind(wowlab_engine_combat::generated_identities::specs::enhancement_shaman::PROOF);
519pub(crate) const AURA_STORMSURGE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::AURA_STORMSURGE
520 .bind(wowlab_engine_combat::generated_identities::specs::enhancement_shaman::PROOF);
521pub(crate) const AURA_WINDFURY_WEAPON: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::AURA_WINDFURY_WEAPON
522 .bind(wowlab_engine_combat::generated_identities::specs::enhancement_shaman::PROOF);
523pub(crate) const AURA_FLAMETONGUE_WEAPON: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::AURA_FLAMETONGUE_WEAPON
524 .bind(wowlab_engine_combat::generated_identities::specs::enhancement_shaman::PROOF);
525pub(crate) const AURA_COUNT: usize = 30;
526const _: () = assert!(
527 AURA_COUNT == 30, "AURA index ABI: count changed -- update positional hook consumers"
528);
529pub(crate) const SPELL_STORMSTRIKE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::SPELL_STORMSTRIKE
530 .bind(wowlab_engine_combat::generated_identities::specs::enhancement_shaman::PROOF);
531pub(crate) const SPELL_LAVA_LASH: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::SPELL_LAVA_LASH
532 .bind(wowlab_engine_combat::generated_identities::specs::enhancement_shaman::PROOF);
533pub(crate) const SPELL_CRASH_LIGHTNING: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::SPELL_CRASH_LIGHTNING
534 .bind(wowlab_engine_combat::generated_identities::specs::enhancement_shaman::PROOF);
535pub(crate) const SPELL_LIGHTNING_BOLT: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::SPELL_LIGHTNING_BOLT
536 .bind(wowlab_engine_combat::generated_identities::specs::enhancement_shaman::PROOF);
537pub(crate) const SPELL_CHAIN_LIGHTNING: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::SPELL_CHAIN_LIGHTNING
538 .bind(wowlab_engine_combat::generated_identities::specs::enhancement_shaman::PROOF);
539pub(crate) const SPELL_FLAME_SHOCK: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::SPELL_FLAME_SHOCK
540 .bind(wowlab_engine_combat::generated_identities::specs::enhancement_shaman::PROOF);
541pub(crate) const SPELL_FROST_SHOCK: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::SPELL_FROST_SHOCK
542 .bind(wowlab_engine_combat::generated_identities::specs::enhancement_shaman::PROOF);
543pub(crate) const SPELL_SUNDERING: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::SPELL_SUNDERING
544 .bind(wowlab_engine_combat::generated_identities::specs::enhancement_shaman::PROOF);
545pub(crate) const SPELL_DOOM_WINDS: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::SPELL_DOOM_WINDS
546 .bind(wowlab_engine_combat::generated_identities::specs::enhancement_shaman::PROOF);
547pub(crate) const SPELL_ASCENDANCE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::SPELL_ASCENDANCE
548 .bind(wowlab_engine_combat::generated_identities::specs::enhancement_shaman::PROOF);
549pub(crate) const SPELL_TEMPEST: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::SPELL_TEMPEST
550 .bind(wowlab_engine_combat::generated_identities::specs::enhancement_shaman::PROOF);
551pub(crate) const SPELL_VOLTAIC_BLAZE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::SPELL_VOLTAIC_BLAZE
552 .bind(wowlab_engine_combat::generated_identities::specs::enhancement_shaman::PROOF);
553pub(crate) const SPELL_SKYFURY: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::SPELL_SKYFURY
554 .bind(wowlab_engine_combat::generated_identities::specs::enhancement_shaman::PROOF);
555pub(crate) const SPELL_LIGHTNING_SHIELD: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::SPELL_LIGHTNING_SHIELD
556 .bind(wowlab_engine_combat::generated_identities::specs::enhancement_shaman::PROOF);
557pub(crate) const SPELL_STORMSTRIKE_MH: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::SPELL_STORMSTRIKE_MH
558 .bind(wowlab_engine_combat::generated_identities::specs::enhancement_shaman::PROOF);
559pub(crate) const SPELL_STORMSTRIKE_OFFHAND: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::SPELL_STORMSTRIKE_OFFHAND
560 .bind(wowlab_engine_combat::generated_identities::specs::enhancement_shaman::PROOF);
561pub(crate) const SPELL_SUNDERING_SPLITSTREAM: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::SPELL_SUNDERING_SPLITSTREAM
562 .bind(wowlab_engine_combat::generated_identities::specs::enhancement_shaman::PROOF);
563pub(crate) const SPELL_STORMBLAST: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::SPELL_STORMBLAST
564 .bind(wowlab_engine_combat::generated_identities::specs::enhancement_shaman::PROOF);
565pub(crate) const SPELL_CRASH_LIGHTNING_UNLEASHED: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::SPELL_CRASH_LIGHTNING_UNLEASHED
566 .bind(wowlab_engine_combat::generated_identities::specs::enhancement_shaman::PROOF);
567pub(crate) const SPELL_PRIMORDIAL_STORM: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::SPELL_PRIMORDIAL_STORM
568 .bind(wowlab_engine_combat::generated_identities::specs::enhancement_shaman::PROOF);
569pub(crate) const SPELL_PRIMORDIAL_FIRE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::SPELL_PRIMORDIAL_FIRE
570 .bind(wowlab_engine_combat::generated_identities::specs::enhancement_shaman::PROOF);
571pub(crate) const SPELL_PRIMORDIAL_FROST: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::SPELL_PRIMORDIAL_FROST
572 .bind(wowlab_engine_combat::generated_identities::specs::enhancement_shaman::PROOF);
573pub(crate) const SPELL_PRIMORDIAL_LIGHTNING: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::SPELL_PRIMORDIAL_LIGHTNING
574 .bind(wowlab_engine_combat::generated_identities::specs::enhancement_shaman::PROOF);
575pub(crate) const SPELL_SURGING_TOTEM: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::SPELL_SURGING_TOTEM
576 .bind(wowlab_engine_combat::generated_identities::specs::enhancement_shaman::PROOF);
577pub(crate) const SPELL_TREMOR: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::SPELL_TREMOR
578 .bind(wowlab_engine_combat::generated_identities::specs::enhancement_shaman::PROOF);
579pub(crate) const SPELL_SURGING_BOLT: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::SPELL_SURGING_BOLT
580 .bind(wowlab_engine_combat::generated_identities::specs::enhancement_shaman::PROOF);
581pub(crate) const SPELL_SEARING_BOLT: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::SPELL_SEARING_BOLT
582 .bind(wowlab_engine_combat::generated_identities::specs::enhancement_shaman::PROOF);
583pub(crate) const SPELL_SEARING_VOLLEY: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::SPELL_SEARING_VOLLEY
584 .bind(wowlab_engine_combat::generated_identities::specs::enhancement_shaman::PROOF);
585pub(crate) const SPELL_WINDFURY_WEAPON: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::SPELL_WINDFURY_WEAPON
586 .bind(wowlab_engine_combat::generated_identities::specs::enhancement_shaman::PROOF);
587pub(crate) const SPELL_FLAMETONGUE_WEAPON: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::SPELL_FLAMETONGUE_WEAPON
588 .bind(wowlab_engine_combat::generated_identities::specs::enhancement_shaman::PROOF);
589pub(crate) const SPELL_WINDFURY_ATTACK: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::SPELL_WINDFURY_ATTACK
590 .bind(wowlab_engine_combat::generated_identities::specs::enhancement_shaman::PROOF);
591pub(crate) const SPELL_FLAMETONGUE_ATTACK: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::SPELL_FLAMETONGUE_ATTACK
592 .bind(wowlab_engine_combat::generated_identities::specs::enhancement_shaman::PROOF);
593pub(crate) const SPELL_FLAMETONGUE_ATTACK_IMBUEMENT_MASTERY: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::SPELL_FLAMETONGUE_ATTACK_IMBUEMENT_MASTERY
594 .bind(wowlab_engine_combat::generated_identities::specs::enhancement_shaman::PROOF);
595pub(crate) const SPELL_MAELSTROM_WEAPON_DRIVER: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::SPELL_MAELSTROM_WEAPON_DRIVER
596 .bind(wowlab_engine_combat::generated_identities::specs::enhancement_shaman::PROOF);
597pub(crate) const SPELL_HOT_HAND_DRIVER: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::SPELL_HOT_HAND_DRIVER
598 .bind(wowlab_engine_combat::generated_identities::specs::enhancement_shaman::PROOF);
599pub(crate) const SPELL_STORMSURGE_DRIVER: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::enhancement_shaman::SPELL_STORMSURGE_DRIVER
600 .bind(wowlab_engine_combat::generated_identities::specs::enhancement_shaman::PROOF);
601pub(crate) const SPELL_COUNT: usize = 36;
602const _: () = assert!(
603 SPELL_COUNT == 36,
604 "SPELL index ABI: count changed -- update positional hook consumers"
605);
606pub(crate) mod EFFECT {
607 pub(crate) const ASHEN_CATALYST_CDR: (u32, u8) = (390_370, 1);
609 pub(crate) const CHAIN_LIGHTNING_DAMAGE: (u32, u8) = (188_443, 1);
611 pub(crate) const CRASH_LIGHTNING_DAMAGE: (u32, u8) = (1_252_415, 1);
613 pub(crate) const CRASH_LIGHTNING_UNLEASHED_DAMAGE: (u32, u8) = (1_252_431, 1);
615 pub(crate) const ELEMENTAL_TEMPO_CDR: (u32, u8) = (1_250_364, 3);
617 pub(crate) const ELEMENTAL_WEAPONS_BONUS: (u32, u8) = (384_355, 1);
619 pub(crate) const ELEMENTAL_WEAPONS_DIRECT: (u32, u8) = (408_390, 1);
621 pub(crate) const ELEMENTAL_WEAPONS_PERIODIC: (u32, u8) = (408_390, 2);
623 pub(crate) const FLAMETONGUE_ATTACK_DAMAGE: (u32, u8) = (10444, 1);
625 pub(crate) const FLAMETONGUE_IMBUEMENT_MASTERY_DAMAGE: (u32, u8) = (467_386, 1);
627 pub(crate) const FIRE_NOVA_DAMAGE: (u32, u8) = (333_977, 1);
629 pub(crate) const LAVA_LASH_DAMAGE: (u32, u8) = (60103, 1);
631 pub(crate) const LIGHTNING_BOLT_DAMAGE: (u32, u8) = (188_196, 1);
633 pub(crate) const PRIMORDIAL_FIRE_DAMAGE: (u32, u8) = (1_218_113, 1);
635 pub(crate) const PRIMORDIAL_FROST_DAMAGE: (u32, u8) = (1_218_116, 1);
637 pub(crate) const PRIMORDIAL_LIGHTNING_DAMAGE: (u32, u8) = (1_218_118, 1);
639 pub(crate) const SEARING_BOLT_DAMAGE: (u32, u8) = (3606, 1);
641 pub(crate) const SEARING_VOLLEY_DAMAGE: (u32, u8) = (458_147, 1);
643 pub(crate) const SPLITSTREAM_DAMAGE: (u32, u8) = (445_035, 1);
645 pub(crate) const STORMBLAST_BONUS: (u32, u8) = (319_930, 1);
647 pub(crate) const STORMSTRIKE_MH_DAMAGE: (u32, u8) = (32175, 1);
649 pub(crate) const STORMSTRIKE_OH_DAMAGE: (u32, u8) = (32176, 1);
651 pub(crate) const STORMSURGE_MASTERY: (u32, u8) = (77223, 3);
653 pub(crate) const STORM_UNLEASHED_CHANCE: (u32, u8) = (1_262_713, 1);
655 pub(crate) const SUNDERING_SPLITSTREAM_DAMAGE: (u32, u8) = (467_283, 1);
657 pub(crate) const SURGING_BOLT_DAMAGE: (u32, u8) = (458_267, 1);
659 pub(crate) const TOTEMIC_MOMENTUM_BONUS: (u32, u8) = (1_260_644, 1);
661 pub(crate) const TREMOR_DAMAGE: (u32, u8) = (455_622, 1);
663 pub(crate) const VOLTAIC_BLAZE_MAELSTROM_STACKS: (u32, u8) = (470_057, 2);
665 pub(crate) const MID2_FIRE_NOVA_PRIMARY_BONUS: (u32, u8) = (1_296_627, 1);
667 pub(crate) const MID2_FIRE_NOVA_CRASH_CDR_MS: (u32, u8) = (1_296_628, 1);
669 pub(crate) const MID2_SHORT_CIRCUIT_DAMAGE: (u32, u8) = (1_299_991, 1);
671 pub(crate) const WINDFURY_ATTACK_DAMAGE: (u32, u8) = (25504, 1);
673 pub(crate) const WINDFURY_MASTERY: (u32, u8) = (77223, 4);
675 pub(crate) const WINDFURY_PROC: (u32, u8) = (319_773, 1);
677 pub(crate) const TOTEMIC_REBOUND_RPPM_DRIVER: (u32, u8) = (445_025, 1);
679}
680static REPORTED_SPELLS: &[(&str, u32)] = &[
681 ("crash_lightning_proc", 195_592),
682 ("crash_lightning_unleashed", 1_252_431),
683 ("doom_winds_damage", 469_270),
684 ("elemental_weapons_modifier", 408_390),
685 ("flametongue_attack_imbuement_mastery", 467_386),
686 ("primordial_fire", 1_218_113),
687 ("primordial_frost", 1_218_116),
688 ("primordial_lightning", 1_218_118),
689 ("searing_volley", 458_147),
690 ("stormblast", 390_287),
691 ("sundering_splitstream", 467_283),
692 ("voltaic_blaze_damage", 1_259_101),
693];
694static DECLARED_SPELL_IDS: &[u32] = &[
695 17364, 60103, 187_874, 188_196, 188_443, 188_389, 196_840, 197_214, 384_352, 114_051,
696 452_201, 470_057, 462_854, 192_106, 32175, 32176, 467_283, 390_287, 1_252_431,
697 1_218_090, 1_218_113, 1_218_116, 1_218_118, 444_995, 455_622, 458_267, 3606, 458_147,
698 33757, 318_038, 25504, 10444, 467_386, 187_880, 201_900, 201_845, 466_772, 1_262_830,
699 1_252_415, 198_300, 224_125, 224_127, 454_015, 454_394, 1_218_125, 384_143, 334_168,
700 384_444, 1_299_975, 1_299_991, 461_242, 456_369, 1_221_347, 453_405, 453_406,
701 453_409, 458_269, 344_179, 215_785, 201_846, 319_773, 319_778, 390_370, 378_270,
702 210_853, 117_014, 1_250_364, 384_355, 469_314, 262_647, 445_028, 445_034, 1_218_047,
703 384_149, 445_035, 319_930, 344_357, 392_352, 1_262_713, 1_252_373, 1_260_644,
704 390_288, 6603, 77223, 195_592, 333_977, 408_390, 445_025, 455_593, 469_270,
705 1_259_101, 1_296_627, 1_296_628, 470_532, 455_129, 455_089,
706];
707static DECLARED_AURA_IDS: &[u32] = &[
708 114_051, 466_772, 1_262_830, 1_252_415, 198_300, 224_125, 224_127, 454_015, 454_394,
709 188_389, 192_106, 1_218_125, 384_143, 334_168, 462_854, 384_444, 1_299_975,
710 1_299_991, 461_242, 456_369, 1_221_347, 453_405, 453_406, 453_409, 458_269, 344_179,
711 215_785, 201_846, 319_773, 319_778, 470_532, 455_129, 455_089, 454_015, 454_394,
712 456_369, 461_242, 1_221_347, 458_269, 453_409, 453_406, 453_405,
713];
714static TALENTS: &[(&str, u32)] = &[
715 ("ASCENDANCE", TALENT::ASCENDANCE),
716 ("ASHEN_CATALYST", TALENT::ASHEN_CATALYST),
717 ("CRASH_LIGHTNING", TALENT::CRASH_LIGHTNING),
718 ("DEEPLY_ROOTED_ELEMENTS", TALENT::DEEPLY_ROOTED_ELEMENTS),
719 ("DOOM_WINDS", TALENT::DOOM_WINDS),
720 ("ELEMENTAL_ASSAULT", TALENT::ELEMENTAL_ASSAULT),
721 ("ELEMENTAL_BLAST", TALENT::ELEMENTAL_BLAST),
722 ("ELEMENTAL_TEMPO", TALENT::ELEMENTAL_TEMPO),
723 ("ELEMENTAL_WEAPONS", TALENT::ELEMENTAL_WEAPONS),
724 ("FERAL_SPIRIT", TALENT::FERAL_SPIRIT),
725 ("FLAMETONGUE_WEAPON", TALENT::FLAMETONGUE_WEAPON),
726 ("FORCEFUL_WINDS", TALENT::FORCEFUL_WINDS),
727 ("HOT_HAND", TALENT::HOT_HAND),
728 ("IMBUEMENT_MASTERY", TALENT::IMBUEMENT_MASTERY),
729 ("LAVA_LASH", TALENT::LAVA_LASH),
730 ("LIVELY_TOTEMS", TALENT::LIVELY_TOTEMS),
731 ("MAELSTROM_WEAPON", TALENT::MAELSTROM_WEAPON),
732 ("OVERFLOWING_MAELSTROM", TALENT::OVERFLOWING_MAELSTROM),
733 ("PRIMORDIAL_STORM", TALENT::PRIMORDIAL_STORM),
734 ("RAGING_MAELSTROM", TALENT::RAGING_MAELSTROM),
735 ("SPLITSTREAM", TALENT::SPLITSTREAM),
736 ("STORMBLAST", TALENT::STORMBLAST),
737 ("STORMFLURRY", TALENT::STORMFLURRY),
738 ("STORMS_WRATH", TALENT::STORMS_WRATH),
739 ("STORM_UNLEASHED", TALENT::STORM_UNLEASHED),
740 ("STORM_UNLEASHED_REPEATS", TALENT::STORM_UNLEASHED_REPEATS),
741 ("SUNDERING", TALENT::SUNDERING),
742 ("THORIMS_INVOCATION", TALENT::THORIMS_INVOCATION),
743 ("TOTEMIC_MOMENTUM", TALENT::TOTEMIC_MOMENTUM),
744 ("UNRULY_WINDS", TALENT::UNRULY_WINDS),
745 ("VOLTAIC_BLAZE", TALENT::VOLTAIC_BLAZE),
746 ("WINDFURY_WEAPON", TALENT::WINDFURY_WEAPON),
747];
748pub(crate) mod ENHANCEMENT_SHAMAN {
749 pub(crate) const STORMSTRIKE_CASTS: u32 = 0;
750 pub(crate) const LAVA_LASH_CASTS: u32 = 1;
751 pub(crate) const CRASH_LIGHTNING_CASTS: u32 = 2;
752 pub(crate) const LIGHTNING_BOLT_CASTS: u32 = 3;
753 pub(crate) const DOOM_WINDS_CASTS: u32 = 4;
754 pub(crate) const ASCENDANCE_CASTS: u32 = 5;
755 pub(crate) const TEMPEST_CASTS: u32 = 6;
756 pub(crate) const MAELSTROM_WEAPON_CONSUMED: u32 = 7;
757}
758fn aura_ascendance(
759 a: AuraDefinitionDraft,
760 data: &ResolvedGameData,
761) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
762 a.on_player()
763 .apply_base_from_data(data, 114_051)?
764 .max_stacks(
765 data.require_aura_max_stacks(wowlab_types::sim::SpellIdx::from_raw(114_051))?,
766 )
767 .damage_multiplier(1.2)
768}
769fn aura_doom_winds(
770 a: AuraDefinitionDraft,
771 data: &ResolvedGameData,
772) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
773 a.on_player()
774 .apply_base_from_data(data, 466_772)?
775 .max_stacks(
776 data.require_aura_max_stacks(wowlab_types::sim::SpellIdx::from_raw(466_772))?,
777 )
778 .periodic_damage_from_spell(
779 wowlab_engine_combat::validated_milliseconds(
780 data.period(wowlab_types::sim::SpellIdx::from_raw(466_772), 3),
781 466_772,
782 "periodic_damage.tick_ms",
783 )?,
784 wowlab_engine_combat::DamagePayload::new(
785 469_270,
786 ((data.ap_coef(wowlab_types::sim::SpellIdx::from_raw(469_270), 1))
787 * 10.0)
788 .round() / 10.0,
789 wowlab_engine_combat::DamageFlags::empty(),
790 ),
791 )
792 .apply_periodic_behavior_from_data(data, 466_772)
793}
794fn aura_storm_unleashed(
795 a: AuraDefinitionDraft,
796 data: &ResolvedGameData,
797) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
798 Ok(
799 a
800 .on_player()
801 .apply_base_from_data(data, 1_262_830)?
802 .max_stacks(
803 data
804 .require_aura_max_stacks(
805 wowlab_types::sim::SpellIdx::from_raw(1_262_830),
806 )?,
807 ),
808 )
809}
810fn aura_crash_lightning(
811 a: AuraDefinitionDraft,
812 data: &ResolvedGameData,
813) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
814 Ok(
815 a
816 .on_player()
817 .apply_base_from_data(data, 1_252_415)?
818 .max_stacks(
819 data
820 .require_aura_max_stacks(
821 wowlab_types::sim::SpellIdx::from_raw(1_252_415),
822 )?,
823 )
824 .async_stacks()
825 .on_expire(crate::hooks::enhancement_shaman::crash_lightning_expire_hook),
826 )
827}
828fn aura_converging_storms(
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, 198_300)?
836 .max_stacks(
837 data
838 .require_aura_max_stacks(
839 wowlab_types::sim::SpellIdx::from_raw(198_300),
840 )?,
841 ),
842 )
843}
844fn aura_molten_weapon(
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, 224_125)?
852 .max_stacks(
853 data
854 .require_aura_max_stacks(
855 wowlab_types::sim::SpellIdx::from_raw(224_125),
856 )?,
857 ),
858 )
859}
860fn aura_crackling_surge(
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, 224_127)?
868 .max_stacks(
869 data
870 .require_aura_max_stacks(
871 wowlab_types::sim::SpellIdx::from_raw(224_127),
872 )?,
873 ),
874 )
875}
876fn aura_tempest(
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, 454_015)?
884 .max_stacks(
885 data
886 .require_aura_max_stacks(
887 wowlab_types::sim::SpellIdx::from_raw(454_015),
888 )?,
889 ),
890 )
891}
892fn aura_unlimited_power(
893 a: AuraDefinitionDraft,
894 data: &ResolvedGameData,
895) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
896 a.on_player()
897 .apply_base_from_data(data, 454_394)?
898 .max_stacks(
899 data.require_aura_max_stacks(wowlab_types::sim::SpellIdx::from_raw(454_394))?,
900 )
901 .haste_per_stack(
902 (data.base_points(wowlab_types::sim::SpellIdx::from_raw(454_394), 1)) * 2.0,
903 )
904}
905fn aura_flame_shock(
906 a: AuraDefinitionDraft,
907 data: &ResolvedGameData,
908) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
909 a.on_target()
910 .apply_base_from_data(data, 188_389)?
911 .max_stacks(
912 data.require_aura_max_stacks(wowlab_types::sim::SpellIdx::from_raw(188_389))?,
913 )
914 .periodic_damage(
915 wowlab_engine_combat::validated_milliseconds(
916 data.period(wowlab_types::sim::SpellIdx::from_raw(188_389), 2),
917 188_389,
918 "periodic_damage.tick_ms",
919 )?,
920 ((data.sp_coef(wowlab_types::sim::SpellIdx::from_raw(188_389), 2)) * 10000.0)
921 .round() / 10000.0,
922 wowlab_engine_combat::DamageFlags::empty(),
923 )
924 .apply_periodic_behavior_from_data(data, 188_389)
925}
926fn aura_lightning_shield(
927 a: AuraDefinitionDraft,
928 data: &ResolvedGameData,
929) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
930 Ok(
931 a
932 .on_player()
933 .apply_base_from_data(data, 192_106)?
934 .max_stacks(
935 data
936 .require_aura_max_stacks(
937 wowlab_types::sim::SpellIdx::from_raw(192_106),
938 )?,
939 ),
940 )
941}
942fn aura_primordial_storm(
943 a: AuraDefinitionDraft,
944 data: &ResolvedGameData,
945) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
946 Ok(
947 a
948 .on_player()
949 .apply_base_from_data(data, 1_218_125)?
950 .max_stacks(
951 data
952 .require_aura_max_stacks(
953 wowlab_types::sim::SpellIdx::from_raw(1_218_125),
954 )?,
955 ),
956 )
957}
958fn aura_overflowing_maelstrom(
959 a: AuraDefinitionDraft,
960 data: &ResolvedGameData,
961) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
962 Ok(
963 a
964 .on_player()
965 .apply_base_from_data(data, 384_143)?
966 .max_stacks(
967 data
968 .require_aura_max_stacks(
969 wowlab_types::sim::SpellIdx::from_raw(384_143),
970 )?,
971 ),
972 )
973}
974fn aura_lashing_flames(
975 a: AuraDefinitionDraft,
976 data: &ResolvedGameData,
977) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
978 Ok(
979 a
980 .on_target()
981 .apply_base_from_data(data, 334_168)?
982 .max_stacks(
983 data
984 .require_aura_max_stacks(
985 wowlab_types::sim::SpellIdx::from_raw(334_168),
986 )?,
987 ),
988 )
989}
990fn aura_skyfury_highlight(
991 a: AuraDefinitionDraft,
992 data: &ResolvedGameData,
993) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
994 Ok(
995 a
996 .on_player()
997 .apply_base_from_data(data, 462_854)?
998 .max_stacks(
999 data
1000 .require_aura_max_stacks(
1001 wowlab_types::sim::SpellIdx::from_raw(462_854),
1002 )?,
1003 ),
1004 )
1005}
1006fn aura_thorim_s_invocation(
1007 a: AuraDefinitionDraft,
1008 data: &ResolvedGameData,
1009) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1010 Ok(
1011 a
1012 .on_player()
1013 .apply_base_from_data(data, 384_444)?
1014 .max_stacks(
1015 data
1016 .require_aura_max_stacks(
1017 wowlab_types::sim::SpellIdx::from_raw(384_444),
1018 )?,
1019 ),
1020 )
1021}
1022fn aura_burning_core(
1023 a: AuraDefinitionDraft,
1024 data: &ResolvedGameData,
1025) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1026 Ok(
1027 a
1028 .on_target()
1029 .apply_base_from_data(data, 1_299_975)?
1030 .max_stacks(
1031 data
1032 .require_aura_max_stacks(
1033 wowlab_types::sim::SpellIdx::from_raw(1_299_975),
1034 )?,
1035 )
1036 .periodic_hook(
1037 wowlab_engine_combat::validated_milliseconds(
1038 data.period(wowlab_types::sim::SpellIdx::from_raw(1_299_975), 1),
1039 1_299_975,
1040 "periodic_hook.tick_ms",
1041 )?,
1042 )
1043 .apply_periodic_behavior_from_data(data, 1_299_975)?
1044 .tick_hook(crate::hooks::enhancement_shaman::burning_core_tick_hook),
1045 )
1046}
1047fn aura_short_circuit(
1048 a: AuraDefinitionDraft,
1049 data: &ResolvedGameData,
1050) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1051 Ok(
1052 a
1053 .on_player()
1054 .apply_base_from_data(data, 1_299_991)?
1055 .max_stacks(
1056 wowlab_engine_combat::validated_max_stacks(
1057 5.0,
1058 1_299_991,
1059 "aura.max_stacks",
1060 )?,
1061 ),
1062 )
1063}
1064fn aura_lively_totems(
1065 a: AuraDefinitionDraft,
1066 data: &ResolvedGameData,
1067) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1068 Ok(
1069 a
1070 .on_player()
1071 .apply_base_from_data(data, 461_242)?
1072 .max_stacks(
1073 data
1074 .require_aura_max_stacks(
1075 wowlab_types::sim::SpellIdx::from_raw(461_242),
1076 )?,
1077 ),
1078 )
1079}
1080fn aura_amplification_core(
1081 a: AuraDefinitionDraft,
1082 data: &ResolvedGameData,
1083) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1084 Ok(
1085 a
1086 .on_player()
1087 .apply_base_from_data(data, 456_369)?
1088 .max_stacks(
1089 data
1090 .require_aura_max_stacks(
1091 wowlab_types::sim::SpellIdx::from_raw(456_369),
1092 )?,
1093 ),
1094 )
1095}
1096fn aura_surging_totem(
1097 a: AuraDefinitionDraft,
1098 data: &ResolvedGameData,
1099) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1100 Ok(
1101 a
1102 .on_player()
1103 .apply_base_from_data(data, 1_221_347)?
1104 .max_stacks(
1105 data
1106 .require_aura_max_stacks(
1107 wowlab_types::sim::SpellIdx::from_raw(1_221_347),
1108 )?,
1109 )
1110 .periodic_hook(
1111 wowlab_engine_combat::validated_milliseconds(
1112 data.period(wowlab_types::sim::SpellIdx::from_raw(455_593), 1),
1113 1_221_347,
1114 "periodic_hook.tick_ms",
1115 )?,
1116 )
1117 .apply_periodic_behavior_from_data(data, 455_593)?
1118 .hasted_periodic()
1119 .tick_hook(crate::hooks::enhancement_shaman::surging_totem_pulse_hook),
1120 )
1121}
1122fn aura_whirling_fire(
1123 a: AuraDefinitionDraft,
1124 data: &ResolvedGameData,
1125) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1126 Ok(
1127 a
1128 .on_player()
1129 .apply_base_from_data(data, 453_405)?
1130 .max_stacks(
1131 data
1132 .require_aura_max_stacks(
1133 wowlab_types::sim::SpellIdx::from_raw(453_405),
1134 )?,
1135 ),
1136 )
1137}
1138fn aura_whirling_earth(
1139 a: AuraDefinitionDraft,
1140 data: &ResolvedGameData,
1141) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1142 Ok(
1143 a
1144 .on_player()
1145 .apply_base_from_data(data, 453_406)?
1146 .max_stacks(
1147 data
1148 .require_aura_max_stacks(
1149 wowlab_types::sim::SpellIdx::from_raw(453_406),
1150 )?,
1151 ),
1152 )
1153}
1154fn aura_whirling_air(
1155 a: AuraDefinitionDraft,
1156 data: &ResolvedGameData,
1157) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1158 Ok(
1159 a
1160 .on_player()
1161 .apply_base_from_data(data, 453_409)?
1162 .max_stacks(
1163 data
1164 .require_aura_max_stacks(
1165 wowlab_types::sim::SpellIdx::from_raw(453_409),
1166 )?,
1167 ),
1168 )
1169}
1170fn aura_totemic_rebound(
1171 a: AuraDefinitionDraft,
1172 data: &ResolvedGameData,
1173) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1174 Ok(
1175 a
1176 .on_player()
1177 .apply_base_from_data(data, 458_269)?
1178 .max_stacks(
1179 data
1180 .require_aura_max_stacks(
1181 wowlab_types::sim::SpellIdx::from_raw(458_269),
1182 )?,
1183 ),
1184 )
1185}
1186fn aura_maelstrom_weapon(
1187 a: AuraDefinitionDraft,
1188 data: &ResolvedGameData,
1189) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1190 Ok(
1191 a
1192 .on_player()
1193 .apply_base_from_data(data, 344_179)?
1194 .max_stacks(
1195 data
1196 .require_aura_max_stacks(
1197 wowlab_types::sim::SpellIdx::from_raw(344_179),
1198 )?,
1199 ),
1200 )
1201}
1202fn aura_hot_hand(
1203 a: AuraDefinitionDraft,
1204 data: &ResolvedGameData,
1205) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1206 Ok(
1207 a
1208 .on_player()
1209 .apply_base_from_data(data, 215_785)?
1210 .max_stacks(
1211 data
1212 .require_aura_max_stacks(
1213 wowlab_types::sim::SpellIdx::from_raw(215_785),
1214 )?,
1215 ),
1216 )
1217}
1218fn aura_stormsurge(
1219 a: AuraDefinitionDraft,
1220 data: &ResolvedGameData,
1221) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1222 Ok(
1223 a
1224 .on_player()
1225 .apply_base_from_data(data, 201_846)?
1226 .max_stacks(
1227 data
1228 .require_aura_max_stacks(
1229 wowlab_types::sim::SpellIdx::from_raw(201_846),
1230 )?,
1231 ),
1232 )
1233}
1234fn aura_windfury_weapon(
1235 a: AuraDefinitionDraft,
1236 data: &ResolvedGameData,
1237) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1238 Ok(
1239 a
1240 .on_player()
1241 .apply_base_from_data(data, 319_773)?
1242 .max_stacks(
1243 data
1244 .require_aura_max_stacks(
1245 wowlab_types::sim::SpellIdx::from_raw(319_773),
1246 )?,
1247 ),
1248 )
1249}
1250fn aura_flametongue_weapon(
1251 a: AuraDefinitionDraft,
1252 data: &ResolvedGameData,
1253) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1254 Ok(
1255 a
1256 .on_player()
1257 .apply_base_from_data(data, 319_778)?
1258 .max_stacks(
1259 data
1260 .require_aura_max_stacks(
1261 wowlab_types::sim::SpellIdx::from_raw(319_778),
1262 )?,
1263 ),
1264 )
1265}
1266fn spell_stormstrike(
1267 s: SpellDefinitionDraft,
1268 data: &ResolvedGameData,
1269) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1270 Ok(
1271 s
1272 .apply_base_from_data(data, 17364)?
1273 .without_primary_data_damage()
1274 .trigger_program_predicate(
1275 1,
1276 crate::hooks::enhancement_shaman::hook_owned_damage_trigger_disabled,
1277 )
1278 .trigger_program_predicate(
1279 2,
1280 crate::hooks::enhancement_shaman::hook_owned_damage_trigger_disabled,
1281 )
1282 .apply_aoe_from_data(data)
1283 .on_cast(crate::hooks::enhancement_shaman::stormstrike_hook),
1284 )
1285}
1286fn spell_lava_lash(
1287 s: SpellDefinitionDraft,
1288 data: &ResolvedGameData,
1289) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1290 Ok(
1291 s
1292 .apply_base_from_data(data, 60103)?
1293 .apply_aoe_from_data(data)
1294 .on_cast(crate::hooks::enhancement_shaman::lava_lash_hook),
1295 )
1296}
1297fn spell_crash_lightning(
1298 s: SpellDefinitionDraft,
1299 data: &ResolvedGameData,
1300) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1301 Ok(
1302 s
1303 .apply_base_from_data(data, 187_874)?
1304 .applies_aura(AURA_CRASH_LIGHTNING)
1305 .apply_aoe_from_data(data)
1306 .on_cast(crate::hooks::enhancement_shaman::crash_lightning_hook)
1307 .cooldown_bypass_when_aura(AURA::STORM_UNLEASHED),
1308 )
1309}
1310fn spell_lightning_bolt(
1311 s: SpellDefinitionDraft,
1312 data: &ResolvedGameData,
1313) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1314 Ok(
1315 s
1316 .apply_base_from_data(data, 188_196)?
1317 .cast_time(
1318 wowlab_engine_combat::validated_milliseconds(
1319 0.0,
1320 188_196,
1321 "spell.cast_time_ms",
1322 )?,
1323 )
1324 .apply_aoe_from_data(data)
1325 .on_cast(crate::hooks::enhancement_shaman::lightning_bolt_hook),
1326 )
1327}
1328fn spell_chain_lightning(
1329 s: SpellDefinitionDraft,
1330 data: &ResolvedGameData,
1331) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1332 Ok(
1333 s
1334 .apply_base_from_data(data, 188_443)?
1335 .apply_aoe_from_data(data)
1336 .on_cast(crate::hooks::enhancement_shaman::chain_lightning_hook),
1337 )
1338}
1339fn spell_flame_shock(
1340 s: SpellDefinitionDraft,
1341 data: &ResolvedGameData,
1342) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1343 Ok(
1344 s
1345 .apply_base_from_data(data, 188_389)?
1346 .applies_inferred_aura(AURA_FLAME_SHOCK, 188_389)
1347 .apply_aoe_from_data(data),
1348 )
1349}
1350fn spell_frost_shock(
1351 s: SpellDefinitionDraft,
1352 data: &ResolvedGameData,
1353) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1354 Ok(s.apply_base_from_data(data, 196_840)?.apply_aoe_from_data(data))
1355}
1356fn spell_sundering(
1357 s: SpellDefinitionDraft,
1358 data: &ResolvedGameData,
1359) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1360 Ok(
1361 s
1362 .apply_base_from_data(data, 197_214)?
1363 .damage_ap(
1364 data.ap_coef(wowlab_types::sim::SpellIdx::from_raw(197_214), 1),
1365 wowlab_engine_combat::DamageFlags::empty(),
1366 )
1367 .applies_aura(AURA_PRIMORDIAL_STORM)
1368 .apply_aoe_from_data(data)
1369 .on_cast(crate::hooks::enhancement_shaman::sundering_hook),
1370 )
1371}
1372fn spell_doom_winds(
1373 s: SpellDefinitionDraft,
1374 data: &ResolvedGameData,
1375) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1376 Ok(
1377 s
1378 .apply_base_from_data(data, 384_352)?
1379 .without_primary_data_damage()
1380 .apply_aoe_from_data(data)
1381 .on_cast(crate::hooks::enhancement_shaman::doom_winds_hook),
1382 )
1383}
1384fn spell_ascendance(
1385 s: SpellDefinitionDraft,
1386 data: &ResolvedGameData,
1387) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1388 Ok(
1389 s
1390 .apply_base_from_data(data, 114_051)?
1391 .applies_inferred_aura(AURA_ASCENDANCE, 114_051)
1392 .apply_aoe_from_data(data)
1393 .on_cast(crate::hooks::enhancement_shaman::ascendance_hook),
1394 )
1395}
1396fn spell_tempest(
1397 s: SpellDefinitionDraft,
1398 data: &ResolvedGameData,
1399) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1400 Ok(
1401 s
1402 .apply_base_from_data(data, 452_201)?
1403 .applies_aura(AURA_TEMPEST)
1404 .apply_aoe_from_data(data),
1405 )
1406}
1407fn spell_voltaic_blaze(
1408 s: SpellDefinitionDraft,
1409 data: &ResolvedGameData,
1410) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1411 Ok(
1412 s
1413 .apply_base_from_data(data, 470_057)?
1414 .damage_sp_from_data(
1415 wowlab_engine_domain::dbc::EffectLookup::new(
1416 data,
1417 wowlab_types::sim::EffectRef::new(
1418 wowlab_types::sim::SpellIdx::from_raw(1_259_101),
1419 1,
1420 ),
1421 ),
1422 )?
1423 .applies_aura(AURA_FLAME_SHOCK)
1424 .guaranteed_crit()
1425 .apply_aoe_from_data(data)
1426 .on_cast(crate::hooks::enhancement_shaman::voltaic_blaze_hook),
1427 )
1428}
1429fn spell_skyfury(
1430 s: SpellDefinitionDraft,
1431 data: &ResolvedGameData,
1432) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1433 Ok(
1434 s
1435 .apply_base_from_data(data, 462_854)?
1436 .without_data_damage()
1437 .applies_aura(AURA_SKYFURY_HIGHLIGHT)
1438 .apply_aoe_from_data(data),
1439 )
1440}
1441fn spell_lightning_shield(
1442 s: SpellDefinitionDraft,
1443 data: &ResolvedGameData,
1444) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1445 Ok(
1446 s
1447 .apply_base_from_data(data, 192_106)?
1448 .applies_inferred_aura(AURA_LIGHTNING_SHIELD, 192_106)
1449 .apply_aoe_from_data(data),
1450 )
1451}
1452fn spell_stormstrike_mh(
1453 s: SpellDefinitionDraft,
1454 data: &ResolvedGameData,
1455) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1456 Ok(s.apply_base_from_data(data, 32175)?.apply_aoe_from_data(data))
1457}
1458fn spell_stormstrike_offhand(
1459 s: SpellDefinitionDraft,
1460 data: &ResolvedGameData,
1461) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1462 Ok(s.apply_base_from_data(data, 32176)?.apply_aoe_from_data(data))
1463}
1464fn spell_sundering_splitstream(
1465 s: SpellDefinitionDraft,
1466 data: &ResolvedGameData,
1467) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1468 Ok(s.apply_base_from_data(data, 467_283)?.apply_aoe_from_data(data))
1469}
1470fn spell_stormblast(
1471 s: SpellDefinitionDraft,
1472 data: &ResolvedGameData,
1473) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1474 Ok(s.apply_base_from_data(data, 390_287)?.apply_aoe_from_data(data))
1475}
1476fn spell_crash_lightning_unleashed(
1477 s: SpellDefinitionDraft,
1478 data: &ResolvedGameData,
1479) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1480 Ok(s.apply_base_from_data(data, 1_252_431)?.apply_aoe_from_data(data))
1481}
1482fn spell_primordial_storm(
1483 s: SpellDefinitionDraft,
1484 data: &ResolvedGameData,
1485) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1486 Ok(
1487 s
1488 .apply_base_from_data(data, 1_218_090)?
1489 .without_primary_data_damage()
1490 .trigger_program_predicate(
1491 1,
1492 crate::hooks::enhancement_shaman::hook_owned_damage_trigger_disabled,
1493 )
1494 .trigger_program_predicate(
1495 2,
1496 crate::hooks::enhancement_shaman::hook_owned_damage_trigger_disabled,
1497 )
1498 .trigger_program_predicate(
1499 3,
1500 crate::hooks::enhancement_shaman::hook_owned_damage_trigger_disabled,
1501 )
1502 .applies_inferred_aura(AURA_PRIMORDIAL_STORM, 1_218_125)
1503 .apply_aoe_from_data(data)
1504 .on_cast(crate::hooks::enhancement_shaman::primordial_storm_hook),
1505 )
1506}
1507fn spell_primordial_fire(
1508 s: SpellDefinitionDraft,
1509 data: &ResolvedGameData,
1510) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1511 Ok(s.apply_base_from_data(data, 1_218_113)?.apply_aoe_from_data(data))
1512}
1513fn spell_primordial_frost(
1514 s: SpellDefinitionDraft,
1515 data: &ResolvedGameData,
1516) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1517 Ok(s.apply_base_from_data(data, 1_218_116)?.apply_aoe_from_data(data))
1518}
1519fn spell_primordial_lightning(
1520 s: SpellDefinitionDraft,
1521 data: &ResolvedGameData,
1522) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1523 Ok(s.apply_base_from_data(data, 1_218_118)?.apply_aoe_from_data(data))
1524}
1525fn spell_surging_totem(
1526 s: SpellDefinitionDraft,
1527 data: &ResolvedGameData,
1528) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1529 Ok(
1530 s
1531 .apply_base_from_data(data, 444_995)?
1532 .applies_aura(AURA_SURGING_TOTEM)
1533 .apply_aoe_from_data(data)
1534 .on_cast(crate::hooks::enhancement_shaman::surging_totem_hook),
1535 )
1536}
1537fn spell_tremor(
1538 s: SpellDefinitionDraft,
1539 data: &ResolvedGameData,
1540) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1541 Ok(s.apply_base_from_data(data, 455_622)?.apply_aoe_from_data(data))
1542}
1543fn spell_surging_bolt(
1544 s: SpellDefinitionDraft,
1545 data: &ResolvedGameData,
1546) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1547 Ok(s.apply_base_from_data(data, 458_267)?.apply_aoe_from_data(data))
1548}
1549fn spell_searing_bolt(
1550 s: SpellDefinitionDraft,
1551 data: &ResolvedGameData,
1552) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1553 Ok(s.apply_base_from_data(data, 3606)?.apply_aoe_from_data(data))
1554}
1555fn spell_searing_volley(
1556 s: SpellDefinitionDraft,
1557 data: &ResolvedGameData,
1558) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1559 Ok(s.apply_base_from_data(data, 458_147)?.apply_aoe_from_data(data))
1560}
1561fn spell_windfury_weapon(
1562 s: SpellDefinitionDraft,
1563 data: &ResolvedGameData,
1564) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1565 Ok(
1566 s
1567 .apply_base_from_data(data, 33757)?
1568 .applies_aura(AURA_WINDFURY_WEAPON)
1569 .apply_aoe_from_data(data),
1570 )
1571}
1572fn spell_flametongue_weapon(
1573 s: SpellDefinitionDraft,
1574 data: &ResolvedGameData,
1575) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1576 Ok(
1577 s
1578 .apply_base_from_data(data, 318_038)?
1579 .applies_aura(AURA_FLAMETONGUE_WEAPON)
1580 .apply_aoe_from_data(data),
1581 )
1582}
1583fn spell_windfury_attack(
1584 s: SpellDefinitionDraft,
1585 data: &ResolvedGameData,
1586) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1587 Ok(s.apply_base_from_data(data, 25504)?.apply_aoe_from_data(data))
1588}
1589fn spell_flametongue_attack(
1590 s: SpellDefinitionDraft,
1591 data: &ResolvedGameData,
1592) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1593 Ok(s.apply_base_from_data(data, 10444)?.apply_aoe_from_data(data))
1594}
1595fn spell_flametongue_attack_imbuement_mastery(
1596 s: SpellDefinitionDraft,
1597 data: &ResolvedGameData,
1598) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1599 Ok(s.apply_base_from_data(data, 467_386)?.apply_aoe_from_data(data))
1600}
1601fn spell_maelstrom_weapon_driver(
1602 s: SpellDefinitionDraft,
1603 data: &ResolvedGameData,
1604) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1605 Ok(s.apply_base_from_data(data, 187_880)?.apply_aoe_from_data(data))
1606}
1607fn spell_hot_hand_driver(
1608 s: SpellDefinitionDraft,
1609 data: &ResolvedGameData,
1610) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1611 Ok(s.apply_base_from_data(data, 201_900)?.apply_aoe_from_data(data))
1612}
1613fn spell_stormsurge_driver(
1614 s: SpellDefinitionDraft,
1615 data: &ResolvedGameData,
1616) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1617 Ok(s.apply_base_from_data(data, 201_845)?.apply_aoe_from_data(data))
1618}
1619pub(crate) fn build_combat_system_draft(
1620 params: &wowlab_engine_ports::HandlerParams<'_>,
1621) -> Result<CombatSystemDraft, wowlab_engine_ports::EngineError> {
1622 let builder = CombatSystemBuilder::new(params.stats.clone())
1623 .spec_id(SpecId::Enhancement)
1624 .spec_identity(
1625 wowlab_engine_combat::generated_identities::specs::enhancement_shaman::PROOF,
1626 )
1627 .hero_talent_trees(DECLARED_METADATA.hero_talent_trees)
1628 .effect_identities(
1629 wowlab_engine_combat::generated_identities::specs::enhancement_shaman::damage::ALL,
1630 )
1631 .effect_identities(wowlab_engine_combat::generated_identities::shared::ALL)
1632 .mastery_spell(77223)
1633 .mastery_hook(crate::hooks::enhancement_shaman::mastery)
1634 .resource(
1635 "maelstrom",
1636 150.0,
1637 params
1638 .game_data
1639 .power_regen_for_max(11, 150.0)
1640 .ok_or_else(|| {
1641 wowlab_engine_ports::EngineError::spec_construction(
1642 "missing power-type power_regen_for_max for type_id 11",
1643 )
1644 })?,
1645 )
1646 .resource_type_id(11)
1647 .resource_start(
1648 params
1649 .game_data
1650 .power_default(11)
1651 .ok_or_else(|| {
1652 wowlab_engine_ports::EngineError::spec_construction(
1653 "missing power-type power_default for type_id 11",
1654 )
1655 })?,
1656 )
1657 .aura("ascendance", AURA::ASCENDANCE, |a| aura_ascendance(a, ¶ms.game_data))
1658 .aura("doom_winds", AURA::DOOM_WINDS, |a| aura_doom_winds(a, ¶ms.game_data))
1659 .aura(
1660 "storm_unleashed",
1661 AURA::STORM_UNLEASHED,
1662 |a| aura_storm_unleashed(a, ¶ms.game_data),
1663 )
1664 .aura(
1665 "crash_lightning",
1666 AURA::CRASH_LIGHTNING,
1667 |a| aura_crash_lightning(a, ¶ms.game_data),
1668 )
1669 .aura(
1670 "converging_storms",
1671 AURA::CONVERGING_STORMS,
1672 |a| aura_converging_storms(a, ¶ms.game_data),
1673 )
1674 .aura(
1675 "molten_weapon",
1676 AURA::MOLTEN_WEAPON,
1677 |a| aura_molten_weapon(a, ¶ms.game_data),
1678 )
1679 .aura(
1680 "crackling_surge",
1681 AURA::CRACKLING_SURGE,
1682 |a| aura_crackling_surge(a, ¶ms.game_data),
1683 )
1684 .aura("tempest", AURA::TEMPEST, |a| aura_tempest(a, ¶ms.game_data))
1685 .aura(
1686 "unlimited_power",
1687 AURA::UNLIMITED_POWER,
1688 |a| aura_unlimited_power(a, ¶ms.game_data),
1689 )
1690 .aura(
1691 "flame_shock",
1692 AURA::FLAME_SHOCK,
1693 |a| aura_flame_shock(a, ¶ms.game_data),
1694 )
1695 .aura(
1696 "lightning_shield",
1697 AURA::LIGHTNING_SHIELD,
1698 |a| aura_lightning_shield(a, ¶ms.game_data),
1699 )
1700 .aura(
1701 "primordial_storm",
1702 AURA::PRIMORDIAL_STORM,
1703 |a| aura_primordial_storm(a, ¶ms.game_data),
1704 )
1705 .aura(
1706 "overflowing_maelstrom",
1707 AURA::OVERFLOWING_MAELSTROM,
1708 |a| aura_overflowing_maelstrom(a, ¶ms.game_data),
1709 )
1710 .aura(
1711 "lashing_flames",
1712 AURA::LASHING_FLAMES,
1713 |a| aura_lashing_flames(a, ¶ms.game_data),
1714 )
1715 .aura(
1716 "skyfury_highlight",
1717 AURA::SKYFURY_HIGHLIGHT,
1718 |a| aura_skyfury_highlight(a, ¶ms.game_data),
1719 )
1720 .aura(
1721 "thorims_invocation",
1722 AURA::THORIM_S_INVOCATION,
1723 |a| aura_thorim_s_invocation(a, ¶ms.game_data),
1724 )
1725 .aura(
1726 "burning_core",
1727 AURA::BURNING_CORE,
1728 |a| aura_burning_core(a, ¶ms.game_data),
1729 )
1730 .aura(
1731 "short_circuit",
1732 AURA::SHORT_CIRCUIT,
1733 |a| aura_short_circuit(a, ¶ms.game_data),
1734 )
1735 .aura(
1736 "lively_totems",
1737 AURA::LIVELY_TOTEMS,
1738 |a| aura_lively_totems(a, ¶ms.game_data),
1739 )
1740 .aura(
1741 "amplification_core",
1742 AURA::AMPLIFICATION_CORE,
1743 |a| aura_amplification_core(a, ¶ms.game_data),
1744 )
1745 .aura(
1746 "surging_totem",
1747 AURA::SURGING_TOTEM,
1748 |a| aura_surging_totem(a, ¶ms.game_data),
1749 )
1750 .aura(
1751 "whirling_fire",
1752 AURA::WHIRLING_FIRE,
1753 |a| aura_whirling_fire(a, ¶ms.game_data),
1754 )
1755 .aura(
1756 "whirling_earth",
1757 AURA::WHIRLING_EARTH,
1758 |a| aura_whirling_earth(a, ¶ms.game_data),
1759 )
1760 .aura(
1761 "whirling_air",
1762 AURA::WHIRLING_AIR,
1763 |a| aura_whirling_air(a, ¶ms.game_data),
1764 )
1765 .aura(
1766 "totemic_rebound",
1767 AURA::TOTEMIC_REBOUND,
1768 |a| aura_totemic_rebound(a, ¶ms.game_data),
1769 )
1770 .aura(
1771 "maelstrom_weapon",
1772 AURA::MAELSTROM_WEAPON,
1773 |a| aura_maelstrom_weapon(a, ¶ms.game_data),
1774 )
1775 .aura("hot_hand", AURA::HOT_HAND, |a| aura_hot_hand(a, ¶ms.game_data))
1776 .aura("stormsurge", AURA::STORMSURGE, |a| aura_stormsurge(a, ¶ms.game_data))
1777 .aura(
1778 "windfury_weapon",
1779 AURA::WINDFURY_WEAPON,
1780 |a| aura_windfury_weapon(a, ¶ms.game_data),
1781 )
1782 .aura(
1783 "flametongue_weapon",
1784 AURA::FLAMETONGUE_WEAPON,
1785 |a| aura_flametongue_weapon(a, ¶ms.game_data),
1786 )
1787 .spell(
1788 "stormstrike",
1789 SPELL::STORMSTRIKE,
1790 |s| spell_stormstrike(s, ¶ms.game_data),
1791 )
1792 .spell("lava_lash", SPELL::LAVA_LASH, |s| spell_lava_lash(s, ¶ms.game_data))
1793 .spell(
1794 "crash_lightning",
1795 SPELL::CRASH_LIGHTNING,
1796 |s| spell_crash_lightning(s, ¶ms.game_data),
1797 )
1798 .spell(
1799 "lightning_bolt",
1800 SPELL::LIGHTNING_BOLT,
1801 |s| spell_lightning_bolt(s, ¶ms.game_data),
1802 )
1803 .spell(
1804 "chain_lightning",
1805 SPELL::CHAIN_LIGHTNING,
1806 |s| spell_chain_lightning(s, ¶ms.game_data),
1807 )
1808 .spell(
1809 "flame_shock",
1810 SPELL::FLAME_SHOCK,
1811 |s| spell_flame_shock(s, ¶ms.game_data),
1812 )
1813 .spell(
1814 "frost_shock",
1815 SPELL::FROST_SHOCK,
1816 |s| spell_frost_shock(s, ¶ms.game_data),
1817 )
1818 .spell("sundering", SPELL::SUNDERING, |s| spell_sundering(s, ¶ms.game_data))
1819 .spell(
1820 "doom_winds",
1821 SPELL::DOOM_WINDS,
1822 |s| spell_doom_winds(s, ¶ms.game_data),
1823 )
1824 .spell(
1825 "ascendance",
1826 SPELL::ASCENDANCE,
1827 |s| spell_ascendance(s, ¶ms.game_data),
1828 )
1829 .spell("tempest", SPELL::TEMPEST, |s| spell_tempest(s, ¶ms.game_data))
1830 .spell(
1831 "voltaic_blaze",
1832 SPELL::VOLTAIC_BLAZE,
1833 |s| spell_voltaic_blaze(s, ¶ms.game_data),
1834 )
1835 .spell("skyfury", SPELL::SKYFURY, |s| spell_skyfury(s, ¶ms.game_data))
1836 .spell(
1837 "lightning_shield",
1838 SPELL::LIGHTNING_SHIELD,
1839 |s| spell_lightning_shield(s, ¶ms.game_data),
1840 )
1841 .spell(
1842 "stormstrike_mh",
1843 SPELL::STORMSTRIKE_MH,
1844 |s| spell_stormstrike_mh(s, ¶ms.game_data),
1845 )
1846 .spell(
1847 "stormstrike_offhand",
1848 SPELL::STORMSTRIKE_OFFHAND,
1849 |s| spell_stormstrike_offhand(s, ¶ms.game_data),
1850 )
1851 .spell(
1852 "sundering_splitstream",
1853 SPELL::SUNDERING_SPLITSTREAM,
1854 |s| spell_sundering_splitstream(s, ¶ms.game_data),
1855 )
1856 .spell(
1857 "stormblast",
1858 SPELL::STORMBLAST,
1859 |s| spell_stormblast(s, ¶ms.game_data),
1860 )
1861 .spell(
1862 "crash_lightning_unleashed",
1863 SPELL::CRASH_LIGHTNING_UNLEASHED,
1864 |s| spell_crash_lightning_unleashed(s, ¶ms.game_data),
1865 )
1866 .spell(
1867 "primordial_storm",
1868 SPELL::PRIMORDIAL_STORM,
1869 |s| spell_primordial_storm(s, ¶ms.game_data),
1870 )
1871 .spell(
1872 "primordial_fire",
1873 SPELL::PRIMORDIAL_FIRE,
1874 |s| spell_primordial_fire(s, ¶ms.game_data),
1875 )
1876 .spell(
1877 "primordial_frost",
1878 SPELL::PRIMORDIAL_FROST,
1879 |s| spell_primordial_frost(s, ¶ms.game_data),
1880 )
1881 .spell(
1882 "primordial_lightning",
1883 SPELL::PRIMORDIAL_LIGHTNING,
1884 |s| spell_primordial_lightning(s, ¶ms.game_data),
1885 )
1886 .spell(
1887 "surging_totem",
1888 SPELL::SURGING_TOTEM,
1889 |s| spell_surging_totem(s, ¶ms.game_data),
1890 )
1891 .spell("tremor", SPELL::TREMOR, |s| spell_tremor(s, ¶ms.game_data))
1892 .spell(
1893 "surging_bolt",
1894 SPELL::SURGING_BOLT,
1895 |s| spell_surging_bolt(s, ¶ms.game_data),
1896 )
1897 .spell(
1898 "searing_bolt",
1899 SPELL::SEARING_BOLT,
1900 |s| spell_searing_bolt(s, ¶ms.game_data),
1901 )
1902 .spell(
1903 "searing_volley",
1904 SPELL::SEARING_VOLLEY,
1905 |s| spell_searing_volley(s, ¶ms.game_data),
1906 )
1907 .spell(
1908 "windfury_weapon",
1909 SPELL::WINDFURY_WEAPON,
1910 |s| spell_windfury_weapon(s, ¶ms.game_data),
1911 )
1912 .spell(
1913 "flametongue_weapon",
1914 SPELL::FLAMETONGUE_WEAPON,
1915 |s| spell_flametongue_weapon(s, ¶ms.game_data),
1916 )
1917 .spell(
1918 "windfury_attack",
1919 SPELL::WINDFURY_ATTACK,
1920 |s| spell_windfury_attack(s, ¶ms.game_data),
1921 )
1922 .spell(
1923 "flametongue_attack",
1924 SPELL::FLAMETONGUE_ATTACK,
1925 |s| spell_flametongue_attack(s, ¶ms.game_data),
1926 )
1927 .spell(
1928 "flametongue_attack_imbuement_mastery",
1929 SPELL::FLAMETONGUE_ATTACK_IMBUEMENT_MASTERY,
1930 |s| spell_flametongue_attack_imbuement_mastery(s, ¶ms.game_data),
1931 )
1932 .spell(
1933 "maelstrom_weapon_driver",
1934 SPELL::MAELSTROM_WEAPON_DRIVER,
1935 |s| spell_maelstrom_weapon_driver(s, ¶ms.game_data),
1936 )
1937 .spell(
1938 "hot_hand_driver",
1939 SPELL::HOT_HAND_DRIVER,
1940 |s| spell_hot_hand_driver(s, ¶ms.game_data),
1941 )
1942 .spell(
1943 "stormsurge_driver",
1944 SPELL::STORMSURGE_DRIVER,
1945 |s| spell_stormsurge_driver(s, ¶ms.game_data),
1946 )
1947 .auto_attack(|a| {
1948 a
1949 .spell_id(6603)
1950 .swing_ms(2600)
1951 .apply_base_from_data(¶ms.game_data)
1952 .on_swing(crate::hooks::enhancement_shaman::swing_hook)
1953 })
1954 .auto_attack(|a| {
1955 a
1956 .spell_id(6603)
1957 .swing_ms(2600)
1958 .apply_base_from_data(¶ms.game_data)
1959 .on_swing(crate::hooks::enhancement_shaman::swing_hook)
1960 })
1961 .game_data(params.game_data.clone())
1962 .talent_spell_ids(TALENTS)
1963 .talent_selections(params.talent_selections)
1964 .set_bonus_auras(params.set_bonus_auras)
1965 .encounter(params.encounter.clone());
1966 let builder = crate::generated::items::register_equipped(
1967 builder,
1968 ¶ms.game_data,
1969 params.equipped_items,
1970 )?;
1971
1972 builder.into_draft()
1973}
1974fn new_handler(
1975 params: wowlab_engine_ports::HandlerParams<'_>,
1976) -> Result<Box<dyn SpecHandler>, wowlab_engine_ports::EngineError> {
1977 let handler = crate::composition::compose_handler(
1978 build_combat_system_draft,
1979 ¶ms,
1980 crate::hooks::enhancement_shaman::EnhancementHandler::try_new,
1981 )?;
1982
1983 Ok(Box::new(handler))
1984}
1985static DECLARED_METADATA: DeclaredSpecMetadata = DeclaredSpecMetadata {
1986 primary_resource: ResourceType::Maelstrom,
1987 secondary_resource: None,
1988 spell_ids: DECLARED_SPELL_IDS,
1989 aura_ids: DECLARED_AURA_IDS,
1990 server_proc_entries: &[
1991 DeclaredServerProcEntry {
1992 spell_id: 198_300,
1993 attributes: ProcAttributes::USE_STACKS_FOR_CHARGES.bits(),
1994 },
1995 ],
1996 talents: TALENTS,
1997 rotation_field_schema: &[],
1998 metrics_plugin_id: None,
1999 hero_talent_trees: &[
2000 HeroTalentTreeDesc {
2001 name: "Stormbringer",
2002 spells: HERO_TREE_STORMBRINGER_SPELLS,
2003 auras: HERO_TREE_STORMBRINGER_AURAS,
2004 },
2005 HeroTalentTreeDesc {
2006 name: "Totemic",
2007 spells: HERO_TREE_TOTEMIC_SPELLS,
2008 auras: HERO_TREE_TOTEMIC_AURAS,
2009 },
2010 ],
2011 reported_spells: REPORTED_SPELLS,
2012 masked_passive_effects: &[],
2013 passive_effect_overrides: &[
2014 wowlab_engine_ports::DeclaredPassiveEffectOverride {
2015 spell_id: 1_251_026,
2016 effect: 2,
2017 source: Some((1_251_026, 2)),
2018 value: 0.0,
2019 multiplier: 0.5,
2020 },
2021 ],
2022};
2023pub(super) const SPEC_DESCRIPTOR: SpecDescriptor = SpecDescriptor {
2024 spec_id: SpecId::Enhancement,
2025 display_name: "Enhancement Shaman",
2026 metadata: DECLARED_METADATA,
2027 handler_factory: new_handler,
2028};
2029wowlab_engine_combat::smoke_test!(build_combat_system_draft);