Skip to main content

wowlab_engine_content/generated/specs/
enhancement_shaman.rs

1//! @generated by codegen-cli from manifests/specs/shaman/enhancement/manifest.toml -- do not edit by hand.
2// Generated code: naming follows game data conventions
3#![allow(non_snake_case, dead_code)]
4use wowlab_types::{combat::ResourceType, game::SpecId};
5use wowlab_engine_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    ///<https://wowlab.gg/inspect/spell/17364>
17    pub(crate) const STORMSTRIKE: u32 = 17364;
18    ///<https://wowlab.gg/inspect/spell/60103>
19    pub(crate) const LAVA_LASH: u32 = 60103;
20    ///<https://wowlab.gg/inspect/spell/187874>
21    pub(crate) const CRASH_LIGHTNING: u32 = 187_874;
22    ///<https://wowlab.gg/inspect/spell/188196>
23    pub(crate) const LIGHTNING_BOLT: u32 = 188_196;
24    ///<https://wowlab.gg/inspect/spell/188443>
25    pub(crate) const CHAIN_LIGHTNING: u32 = 188_443;
26    ///<https://wowlab.gg/inspect/spell/188389>
27    pub(crate) const FLAME_SHOCK: u32 = 188_389;
28    ///<https://wowlab.gg/inspect/spell/196840>
29    pub(crate) const FROST_SHOCK: u32 = 196_840;
30    ///<https://wowlab.gg/inspect/spell/197214>
31    pub(crate) const SUNDERING: u32 = 197_214;
32    ///<https://wowlab.gg/inspect/spell/384352>
33    pub(crate) const DOOM_WINDS: u32 = 384_352;
34    ///<https://wowlab.gg/inspect/spell/114051>
35    pub(crate) const ASCENDANCE: u32 = 114_051;
36    ///<https://wowlab.gg/inspect/spell/452201>
37    pub(crate) const TEMPEST: u32 = 452_201;
38    ///<https://wowlab.gg/inspect/spell/470057>
39    pub(crate) const VOLTAIC_BLAZE: u32 = 470_057;
40    ///<https://wowlab.gg/inspect/spell/462854>
41    pub(crate) const SKYFURY: u32 = 462_854;
42    ///<https://wowlab.gg/inspect/spell/192106>
43    pub(crate) const LIGHTNING_SHIELD: u32 = 192_106;
44    ///<https://wowlab.gg/inspect/spell/32175>
45    pub(crate) const STORMSTRIKE_MH: u32 = 32175;
46    ///<https://wowlab.gg/inspect/spell/32176>
47    pub(crate) const STORMSTRIKE_OFFHAND: u32 = 32176;
48    ///<https://wowlab.gg/inspect/spell/467283>
49    pub(crate) const SUNDERING_SPLITSTREAM: u32 = 467_283;
50    ///<https://wowlab.gg/inspect/spell/390287>
51    pub(crate) const STORMBLAST: u32 = 390_287;
52    ///<https://wowlab.gg/inspect/spell/1252431>
53    pub(crate) const CRASH_LIGHTNING_UNLEASHED: u32 = 1_252_431;
54    ///<https://wowlab.gg/inspect/spell/1218090>
55    pub(crate) const PRIMORDIAL_STORM: u32 = 1_218_090;
56    ///<https://wowlab.gg/inspect/spell/1218113>
57    pub(crate) const PRIMORDIAL_FIRE: u32 = 1_218_113;
58    ///<https://wowlab.gg/inspect/spell/1218116>
59    pub(crate) const PRIMORDIAL_FROST: u32 = 1_218_116;
60    ///<https://wowlab.gg/inspect/spell/1218118>
61    pub(crate) const PRIMORDIAL_LIGHTNING: u32 = 1_218_118;
62    ///<https://wowlab.gg/inspect/spell/444995>
63    pub(crate) const SURGING_TOTEM: u32 = 444_995;
64    ///<https://wowlab.gg/inspect/spell/455622>
65    pub(crate) const TREMOR: u32 = 455_622;
66    ///<https://wowlab.gg/inspect/spell/458267>
67    pub(crate) const SURGING_BOLT: u32 = 458_267;
68    ///<https://wowlab.gg/inspect/spell/3606>
69    pub(crate) const SEARING_BOLT: u32 = 3606;
70    ///<https://wowlab.gg/inspect/spell/458147>
71    pub(crate) const SEARING_VOLLEY: u32 = 458_147;
72    ///<https://wowlab.gg/inspect/spell/33757>
73    pub(crate) const WINDFURY_WEAPON: u32 = 33757;
74    ///<https://wowlab.gg/inspect/spell/318038>
75    pub(crate) const FLAMETONGUE_WEAPON: u32 = 318_038;
76    ///<https://wowlab.gg/inspect/spell/25504>
77    pub(crate) const WINDFURY_ATTACK: u32 = 25504;
78    ///<https://wowlab.gg/inspect/spell/10444>
79    pub(crate) const FLAMETONGUE_ATTACK: u32 = 10444;
80    ///<https://wowlab.gg/inspect/spell/467386>
81    pub(crate) const FLAMETONGUE_ATTACK_IMBUEMENT_MASTERY: u32 = 467_386;
82    ///<https://wowlab.gg/inspect/spell/187880>
83    pub(crate) const MAELSTROM_WEAPON_DRIVER: u32 = 187_880;
84    ///<https://wowlab.gg/inspect/spell/201900>
85    pub(crate) const HOT_HAND_DRIVER: u32 = 201_900;
86    ///<https://wowlab.gg/inspect/spell/201845>
87    pub(crate) const STORMSURGE_DRIVER: u32 = 201_845;
88}
89pub(crate) mod AURA {
90    ///<https://wowlab.gg/inspect/spell/114051>
91    pub(crate) const ASCENDANCE: u32 = 114_051;
92    ///<https://wowlab.gg/inspect/spell/466772>
93    pub(crate) const DOOM_WINDS: u32 = 466_772;
94    ///<https://wowlab.gg/inspect/spell/1262830>
95    pub(crate) const STORM_UNLEASHED: u32 = 1_262_830;
96    ///<https://wowlab.gg/inspect/spell/1252415>
97    pub(crate) const CRASH_LIGHTNING: u32 = 1_252_415;
98    ///<https://wowlab.gg/inspect/spell/198300>
99    pub(crate) const CONVERGING_STORMS: u32 = 198_300;
100    ///<https://wowlab.gg/inspect/spell/224125>
101    pub(crate) const MOLTEN_WEAPON: u32 = 224_125;
102    ///<https://wowlab.gg/inspect/spell/224127>
103    pub(crate) const CRACKLING_SURGE: u32 = 224_127;
104    ///<https://wowlab.gg/inspect/spell/454015>
105    pub(crate) const TEMPEST: u32 = 454_015;
106    ///<https://wowlab.gg/inspect/spell/454394>
107    pub(crate) const UNLIMITED_POWER: u32 = 454_394;
108    ///<https://wowlab.gg/inspect/spell/188389>
109    pub(crate) const FLAME_SHOCK: u32 = 188_389;
110    ///<https://wowlab.gg/inspect/spell/192106>
111    pub(crate) const LIGHTNING_SHIELD: u32 = 192_106;
112    ///<https://wowlab.gg/inspect/spell/1218125>
113    pub(crate) const PRIMORDIAL_STORM: u32 = 1_218_125;
114    ///<https://wowlab.gg/inspect/spell/384143>
115    pub(crate) const OVERFLOWING_MAELSTROM: u32 = 384_143;
116    ///<https://wowlab.gg/inspect/spell/334168>
117    pub(crate) const LASHING_FLAMES: u32 = 334_168;
118    ///<https://wowlab.gg/inspect/spell/462854>
119    pub(crate) const SKYFURY_HIGHLIGHT: u32 = 462_854;
120    ///<https://wowlab.gg/inspect/spell/384444>
121    pub(crate) const THORIM_S_INVOCATION: u32 = 384_444;
122    ///<https://wowlab.gg/inspect/spell/1299975>
123    pub(crate) const BURNING_CORE: u32 = 1_299_975;
124    ///<https://wowlab.gg/inspect/spell/1299991>
125    pub(crate) const SHORT_CIRCUIT: u32 = 1_299_991;
126    ///<https://wowlab.gg/inspect/spell/461242>
127    pub(crate) const LIVELY_TOTEMS: u32 = 461_242;
128    ///<https://wowlab.gg/inspect/spell/456369>
129    pub(crate) const AMPLIFICATION_CORE: u32 = 456_369;
130    ///<https://wowlab.gg/inspect/spell/1221347>
131    pub(crate) const SURGING_TOTEM: u32 = 1_221_347;
132    ///<https://wowlab.gg/inspect/spell/453405>
133    pub(crate) const WHIRLING_FIRE: u32 = 453_405;
134    ///<https://wowlab.gg/inspect/spell/453406>
135    pub(crate) const WHIRLING_EARTH: u32 = 453_406;
136    ///<https://wowlab.gg/inspect/spell/453409>
137    pub(crate) const WHIRLING_AIR: u32 = 453_409;
138    ///<https://wowlab.gg/inspect/spell/458269>
139    pub(crate) const TOTEMIC_REBOUND: u32 = 458_269;
140    ///<https://wowlab.gg/inspect/spell/344179>
141    pub(crate) const MAELSTROM_WEAPON: u32 = 344_179;
142    ///<https://wowlab.gg/inspect/spell/215785>
143    pub(crate) const HOT_HAND: u32 = 215_785;
144    ///<https://wowlab.gg/inspect/spell/201846>
145    pub(crate) const STORMSURGE: u32 = 201_846;
146    ///<https://wowlab.gg/inspect/spell/319773>
147    pub(crate) const WINDFURY_WEAPON: u32 = 319_773;
148    ///<https://wowlab.gg/inspect/spell/319778>
149    pub(crate) const FLAMETONGUE_WEAPON: u32 = 319_778;
150}
151pub(crate) mod TALENT {
152    ///<https://wowlab.gg/inspect/spell/114051>
153    pub(crate) const ASCENDANCE: u32 = 114_051;
154    ///<https://wowlab.gg/inspect/spell/390370>
155    pub(crate) const ASHEN_CATALYST: u32 = 390_370;
156    ///<https://wowlab.gg/inspect/spell/187874>
157    pub(crate) const CRASH_LIGHTNING: u32 = 187_874;
158    ///<https://wowlab.gg/inspect/spell/378270>
159    pub(crate) const DEEPLY_ROOTED_ELEMENTS: u32 = 378_270;
160    ///<https://wowlab.gg/inspect/spell/384352>
161    pub(crate) const DOOM_WINDS: u32 = 384_352;
162    ///<https://wowlab.gg/inspect/spell/210853>
163    pub(crate) const ELEMENTAL_ASSAULT: u32 = 210_853;
164    ///<https://wowlab.gg/inspect/spell/117014>
165    pub(crate) const ELEMENTAL_BLAST: u32 = 117_014;
166    ///<https://wowlab.gg/inspect/spell/1250364>
167    pub(crate) const ELEMENTAL_TEMPO: u32 = 1_250_364;
168    ///<https://wowlab.gg/inspect/spell/384355>
169    pub(crate) const ELEMENTAL_WEAPONS: u32 = 384_355;
170    ///<https://wowlab.gg/inspect/spell/469314>
171    pub(crate) const FERAL_SPIRIT: u32 = 469_314;
172    ///<https://wowlab.gg/inspect/spell/318038>
173    pub(crate) const FLAMETONGUE_WEAPON: u32 = 318_038;
174    ///<https://wowlab.gg/inspect/spell/262647>
175    pub(crate) const FORCEFUL_WINDS: u32 = 262_647;
176    ///<https://wowlab.gg/inspect/spell/201900>
177    pub(crate) const HOT_HAND: u32 = 201_900;
178    ///<https://wowlab.gg/inspect/spell/445028>
179    pub(crate) const IMBUEMENT_MASTERY: u32 = 445_028;
180    ///<https://wowlab.gg/inspect/spell/60103>
181    pub(crate) const LAVA_LASH: u32 = 60103;
182    ///<https://wowlab.gg/inspect/spell/445034>
183    pub(crate) const LIVELY_TOTEMS: u32 = 445_034;
184    ///<https://wowlab.gg/inspect/spell/187880>
185    pub(crate) const MAELSTROM_WEAPON: u32 = 187_880;
186    ///<https://wowlab.gg/inspect/spell/384143>
187    pub(crate) const OVERFLOWING_MAELSTROM: u32 = 384_143;
188    ///<https://wowlab.gg/inspect/spell/1218047>
189    pub(crate) const PRIMORDIAL_STORM: u32 = 1_218_047;
190    ///<https://wowlab.gg/inspect/spell/384149>
191    pub(crate) const RAGING_MAELSTROM: u32 = 384_149;
192    ///<https://wowlab.gg/inspect/spell/445035>
193    pub(crate) const SPLITSTREAM: u32 = 445_035;
194    ///<https://wowlab.gg/inspect/spell/319930>
195    pub(crate) const STORMBLAST: u32 = 319_930;
196    ///<https://wowlab.gg/inspect/spell/344357>
197    pub(crate) const STORMFLURRY: u32 = 344_357;
198    ///<https://wowlab.gg/inspect/spell/392352>
199    pub(crate) const STORMS_WRATH: u32 = 392_352;
200    ///<https://wowlab.gg/inspect/spell/1262713>
201    pub(crate) const STORM_UNLEASHED: u32 = 1_262_713;
202    ///<https://wowlab.gg/inspect/spell/1252373>
203    pub(crate) const STORM_UNLEASHED_REPEATS: u32 = 1_252_373;
204    ///<https://wowlab.gg/inspect/spell/197214>
205    pub(crate) const SUNDERING: u32 = 197_214;
206    ///<https://wowlab.gg/inspect/spell/384444>
207    pub(crate) const THORIMS_INVOCATION: u32 = 384_444;
208    ///<https://wowlab.gg/inspect/spell/1260644>
209    pub(crate) const TOTEMIC_MOMENTUM: u32 = 1_260_644;
210    ///<https://wowlab.gg/inspect/spell/390288>
211    pub(crate) const UNRULY_WINDS: u32 = 390_288;
212    ///<https://wowlab.gg/inspect/spell/470057>
213    pub(crate) const VOLTAIC_BLAZE: u32 = 470_057;
214    ///<https://wowlab.gg/inspect/spell/33757>
215    pub(crate) const WINDFURY_WEAPON: u32 = 33757;
216}
217pub(crate) mod SET_BONUS {
218    ///<https://wowlab.gg/inspect/spell/1296627>
219    pub(crate) const MID2_ENHANCEMENT_2PC: u32 = 1_296_627;
220    ///<https://wowlab.gg/inspect/spell/1296628>
221    pub(crate) const MID2_ENHANCEMENT_4PC: u32 = 1_296_628;
222}
223pub(crate) mod REPORTED_SPELL {
224    ///<https://wowlab.gg/inspect/spell/195592>
225    pub(crate) const CRASH_LIGHTNING_PROC: u32 = 195_592;
226    ///<https://wowlab.gg/inspect/spell/1252431>
227    pub(crate) const CRASH_LIGHTNING_UNLEASHED: u32 = 1_252_431;
228    ///<https://wowlab.gg/inspect/spell/469270>
229    pub(crate) const DOOM_WINDS_DAMAGE: u32 = 469_270;
230    ///<https://wowlab.gg/inspect/spell/408390>
231    pub(crate) const ELEMENTAL_WEAPONS_MODIFIER: u32 = 408_390;
232    ///<https://wowlab.gg/inspect/spell/467386>
233    pub(crate) const FLAMETONGUE_ATTACK_IMBUEMENT_MASTERY: u32 = 467_386;
234    ///<https://wowlab.gg/inspect/spell/1218113>
235    pub(crate) const PRIMORDIAL_FIRE: u32 = 1_218_113;
236    ///<https://wowlab.gg/inspect/spell/1218116>
237    pub(crate) const PRIMORDIAL_FROST: u32 = 1_218_116;
238    ///<https://wowlab.gg/inspect/spell/1218118>
239    pub(crate) const PRIMORDIAL_LIGHTNING: u32 = 1_218_118;
240    ///<https://wowlab.gg/inspect/spell/458147>
241    pub(crate) const SEARING_VOLLEY: u32 = 458_147;
242    ///<https://wowlab.gg/inspect/spell/390287>
243    pub(crate) const STORMBLAST: u32 = 390_287;
244    ///<https://wowlab.gg/inspect/spell/467283>
245    pub(crate) const SUNDERING_SPLITSTREAM: u32 = 467_283;
246    ///<https://wowlab.gg/inspect/spell/1259101>
247    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            ///<https://wowlab.gg/inspect/spell/452201>
253            pub(crate) const TEMPEST: u32 = 452_201;
254        }
255        pub(crate) mod AURA {
256            ///<https://wowlab.gg/inspect/spell/470532>
257            pub(crate) const ARC_DISCHARGE: u32 = 470_532;
258            ///<https://wowlab.gg/inspect/spell/455129>
259            pub(crate) const AWAKENING_STORMS: u32 = 455_129;
260            ///<https://wowlab.gg/inspect/spell/455089>
261            pub(crate) const STORM_SWELL: u32 = 455_089;
262            ///<https://wowlab.gg/inspect/spell/454015>
263            pub(crate) const TEMPEST: u32 = 454_015;
264            ///<https://wowlab.gg/inspect/spell/454394>
265            pub(crate) const UNLIMITED_POWER: u32 = 454_394;
266        }
267    }
268    pub(crate) mod TOTEMIC {
269        pub(crate) mod SPELL {
270            ///<https://wowlab.gg/inspect/spell/444995>
271            pub(crate) const SURGING_TOTEM: u32 = 444_995;
272        }
273        pub(crate) mod AURA {
274            ///<https://wowlab.gg/inspect/spell/456369>
275            pub(crate) const AMPLIFICATION_CORE: u32 = 456_369;
276            ///<https://wowlab.gg/inspect/spell/461242>
277            pub(crate) const LIVELY_TOTEMS: u32 = 461_242;
278            ///<https://wowlab.gg/inspect/spell/1221347>
279            pub(crate) const SURGING_TOTEM: u32 = 1_221_347;
280            ///<https://wowlab.gg/inspect/spell/458269>
281            pub(crate) const TOTEMIC_REBOUND: u32 = 458_269;
282            ///<https://wowlab.gg/inspect/spell/453409>
283            pub(crate) const WHIRLING_AIR: u32 = 453_409;
284            ///<https://wowlab.gg/inspect/spell/453406>
285            pub(crate) const WHIRLING_EARTH: u32 = 453_406;
286            ///<https://wowlab.gg/inspect/spell/453405>
287            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    ///<https://wowlab.gg/inspect/spell/390370>
608    pub(crate) const ASHEN_CATALYST_CDR: (u32, u8) = (390_370, 1);
609    ///<https://wowlab.gg/inspect/spell/188443>
610    pub(crate) const CHAIN_LIGHTNING_DAMAGE: (u32, u8) = (188_443, 1);
611    ///<https://wowlab.gg/inspect/spell/1252415>
612    pub(crate) const CRASH_LIGHTNING_DAMAGE: (u32, u8) = (1_252_415, 1);
613    ///<https://wowlab.gg/inspect/spell/1252431>
614    pub(crate) const CRASH_LIGHTNING_UNLEASHED_DAMAGE: (u32, u8) = (1_252_431, 1);
615    ///<https://wowlab.gg/inspect/spell/1250364>
616    pub(crate) const ELEMENTAL_TEMPO_CDR: (u32, u8) = (1_250_364, 3);
617    ///<https://wowlab.gg/inspect/spell/384355>
618    pub(crate) const ELEMENTAL_WEAPONS_BONUS: (u32, u8) = (384_355, 1);
619    ///<https://wowlab.gg/inspect/spell/408390>
620    pub(crate) const ELEMENTAL_WEAPONS_DIRECT: (u32, u8) = (408_390, 1);
621    ///<https://wowlab.gg/inspect/spell/408390>
622    pub(crate) const ELEMENTAL_WEAPONS_PERIODIC: (u32, u8) = (408_390, 2);
623    ///<https://wowlab.gg/inspect/spell/10444>
624    pub(crate) const FLAMETONGUE_ATTACK_DAMAGE: (u32, u8) = (10444, 1);
625    ///<https://wowlab.gg/inspect/spell/467386>
626    pub(crate) const FLAMETONGUE_IMBUEMENT_MASTERY_DAMAGE: (u32, u8) = (467_386, 1);
627    ///<https://wowlab.gg/inspect/spell/333977>
628    pub(crate) const FIRE_NOVA_DAMAGE: (u32, u8) = (333_977, 1);
629    ///<https://wowlab.gg/inspect/spell/60103>
630    pub(crate) const LAVA_LASH_DAMAGE: (u32, u8) = (60103, 1);
631    ///<https://wowlab.gg/inspect/spell/188196>
632    pub(crate) const LIGHTNING_BOLT_DAMAGE: (u32, u8) = (188_196, 1);
633    ///<https://wowlab.gg/inspect/spell/1218113>
634    pub(crate) const PRIMORDIAL_FIRE_DAMAGE: (u32, u8) = (1_218_113, 1);
635    ///<https://wowlab.gg/inspect/spell/1218116>
636    pub(crate) const PRIMORDIAL_FROST_DAMAGE: (u32, u8) = (1_218_116, 1);
637    ///<https://wowlab.gg/inspect/spell/1218118>
638    pub(crate) const PRIMORDIAL_LIGHTNING_DAMAGE: (u32, u8) = (1_218_118, 1);
639    ///<https://wowlab.gg/inspect/spell/3606>
640    pub(crate) const SEARING_BOLT_DAMAGE: (u32, u8) = (3606, 1);
641    ///<https://wowlab.gg/inspect/spell/458147>
642    pub(crate) const SEARING_VOLLEY_DAMAGE: (u32, u8) = (458_147, 1);
643    ///<https://wowlab.gg/inspect/spell/445035>
644    pub(crate) const SPLITSTREAM_DAMAGE: (u32, u8) = (445_035, 1);
645    ///<https://wowlab.gg/inspect/spell/319930>
646    pub(crate) const STORMBLAST_BONUS: (u32, u8) = (319_930, 1);
647    ///<https://wowlab.gg/inspect/spell/32175>
648    pub(crate) const STORMSTRIKE_MH_DAMAGE: (u32, u8) = (32175, 1);
649    ///<https://wowlab.gg/inspect/spell/32176>
650    pub(crate) const STORMSTRIKE_OH_DAMAGE: (u32, u8) = (32176, 1);
651    ///<https://wowlab.gg/inspect/spell/77223>
652    pub(crate) const STORMSURGE_MASTERY: (u32, u8) = (77223, 3);
653    ///<https://wowlab.gg/inspect/spell/1262713>
654    pub(crate) const STORM_UNLEASHED_CHANCE: (u32, u8) = (1_262_713, 1);
655    ///<https://wowlab.gg/inspect/spell/467283>
656    pub(crate) const SUNDERING_SPLITSTREAM_DAMAGE: (u32, u8) = (467_283, 1);
657    ///<https://wowlab.gg/inspect/spell/458267>
658    pub(crate) const SURGING_BOLT_DAMAGE: (u32, u8) = (458_267, 1);
659    ///<https://wowlab.gg/inspect/spell/1260644>
660    pub(crate) const TOTEMIC_MOMENTUM_BONUS: (u32, u8) = (1_260_644, 1);
661    ///<https://wowlab.gg/inspect/spell/455622>
662    pub(crate) const TREMOR_DAMAGE: (u32, u8) = (455_622, 1);
663    ///<https://wowlab.gg/inspect/spell/470057>
664    pub(crate) const VOLTAIC_BLAZE_MAELSTROM_STACKS: (u32, u8) = (470_057, 2);
665    ///<https://wowlab.gg/inspect/spell/1296627>
666    pub(crate) const MID2_FIRE_NOVA_PRIMARY_BONUS: (u32, u8) = (1_296_627, 1);
667    ///<https://wowlab.gg/inspect/spell/1296628>
668    pub(crate) const MID2_FIRE_NOVA_CRASH_CDR_MS: (u32, u8) = (1_296_628, 1);
669    ///<https://wowlab.gg/inspect/spell/1299991>
670    pub(crate) const MID2_SHORT_CIRCUIT_DAMAGE: (u32, u8) = (1_299_991, 1);
671    ///<https://wowlab.gg/inspect/spell/25504>
672    pub(crate) const WINDFURY_ATTACK_DAMAGE: (u32, u8) = (25504, 1);
673    ///<https://wowlab.gg/inspect/spell/77223>
674    pub(crate) const WINDFURY_MASTERY: (u32, u8) = (77223, 4);
675    ///<https://wowlab.gg/inspect/spell/319773>
676    pub(crate) const WINDFURY_PROC: (u32, u8) = (319_773, 1);
677    ///<https://wowlab.gg/inspect/spell/445025>
678    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, &params.game_data))
1658        .aura("doom_winds", AURA::DOOM_WINDS, |a| aura_doom_winds(a, &params.game_data))
1659        .aura(
1660            "storm_unleashed",
1661            AURA::STORM_UNLEASHED,
1662            |a| aura_storm_unleashed(a, &params.game_data),
1663        )
1664        .aura(
1665            "crash_lightning",
1666            AURA::CRASH_LIGHTNING,
1667            |a| aura_crash_lightning(a, &params.game_data),
1668        )
1669        .aura(
1670            "converging_storms",
1671            AURA::CONVERGING_STORMS,
1672            |a| aura_converging_storms(a, &params.game_data),
1673        )
1674        .aura(
1675            "molten_weapon",
1676            AURA::MOLTEN_WEAPON,
1677            |a| aura_molten_weapon(a, &params.game_data),
1678        )
1679        .aura(
1680            "crackling_surge",
1681            AURA::CRACKLING_SURGE,
1682            |a| aura_crackling_surge(a, &params.game_data),
1683        )
1684        .aura("tempest", AURA::TEMPEST, |a| aura_tempest(a, &params.game_data))
1685        .aura(
1686            "unlimited_power",
1687            AURA::UNLIMITED_POWER,
1688            |a| aura_unlimited_power(a, &params.game_data),
1689        )
1690        .aura(
1691            "flame_shock",
1692            AURA::FLAME_SHOCK,
1693            |a| aura_flame_shock(a, &params.game_data),
1694        )
1695        .aura(
1696            "lightning_shield",
1697            AURA::LIGHTNING_SHIELD,
1698            |a| aura_lightning_shield(a, &params.game_data),
1699        )
1700        .aura(
1701            "primordial_storm",
1702            AURA::PRIMORDIAL_STORM,
1703            |a| aura_primordial_storm(a, &params.game_data),
1704        )
1705        .aura(
1706            "overflowing_maelstrom",
1707            AURA::OVERFLOWING_MAELSTROM,
1708            |a| aura_overflowing_maelstrom(a, &params.game_data),
1709        )
1710        .aura(
1711            "lashing_flames",
1712            AURA::LASHING_FLAMES,
1713            |a| aura_lashing_flames(a, &params.game_data),
1714        )
1715        .aura(
1716            "skyfury_highlight",
1717            AURA::SKYFURY_HIGHLIGHT,
1718            |a| aura_skyfury_highlight(a, &params.game_data),
1719        )
1720        .aura(
1721            "thorims_invocation",
1722            AURA::THORIM_S_INVOCATION,
1723            |a| aura_thorim_s_invocation(a, &params.game_data),
1724        )
1725        .aura(
1726            "burning_core",
1727            AURA::BURNING_CORE,
1728            |a| aura_burning_core(a, &params.game_data),
1729        )
1730        .aura(
1731            "short_circuit",
1732            AURA::SHORT_CIRCUIT,
1733            |a| aura_short_circuit(a, &params.game_data),
1734        )
1735        .aura(
1736            "lively_totems",
1737            AURA::LIVELY_TOTEMS,
1738            |a| aura_lively_totems(a, &params.game_data),
1739        )
1740        .aura(
1741            "amplification_core",
1742            AURA::AMPLIFICATION_CORE,
1743            |a| aura_amplification_core(a, &params.game_data),
1744        )
1745        .aura(
1746            "surging_totem",
1747            AURA::SURGING_TOTEM,
1748            |a| aura_surging_totem(a, &params.game_data),
1749        )
1750        .aura(
1751            "whirling_fire",
1752            AURA::WHIRLING_FIRE,
1753            |a| aura_whirling_fire(a, &params.game_data),
1754        )
1755        .aura(
1756            "whirling_earth",
1757            AURA::WHIRLING_EARTH,
1758            |a| aura_whirling_earth(a, &params.game_data),
1759        )
1760        .aura(
1761            "whirling_air",
1762            AURA::WHIRLING_AIR,
1763            |a| aura_whirling_air(a, &params.game_data),
1764        )
1765        .aura(
1766            "totemic_rebound",
1767            AURA::TOTEMIC_REBOUND,
1768            |a| aura_totemic_rebound(a, &params.game_data),
1769        )
1770        .aura(
1771            "maelstrom_weapon",
1772            AURA::MAELSTROM_WEAPON,
1773            |a| aura_maelstrom_weapon(a, &params.game_data),
1774        )
1775        .aura("hot_hand", AURA::HOT_HAND, |a| aura_hot_hand(a, &params.game_data))
1776        .aura("stormsurge", AURA::STORMSURGE, |a| aura_stormsurge(a, &params.game_data))
1777        .aura(
1778            "windfury_weapon",
1779            AURA::WINDFURY_WEAPON,
1780            |a| aura_windfury_weapon(a, &params.game_data),
1781        )
1782        .aura(
1783            "flametongue_weapon",
1784            AURA::FLAMETONGUE_WEAPON,
1785            |a| aura_flametongue_weapon(a, &params.game_data),
1786        )
1787        .spell(
1788            "stormstrike",
1789            SPELL::STORMSTRIKE,
1790            |s| spell_stormstrike(s, &params.game_data),
1791        )
1792        .spell("lava_lash", SPELL::LAVA_LASH, |s| spell_lava_lash(s, &params.game_data))
1793        .spell(
1794            "crash_lightning",
1795            SPELL::CRASH_LIGHTNING,
1796            |s| spell_crash_lightning(s, &params.game_data),
1797        )
1798        .spell(
1799            "lightning_bolt",
1800            SPELL::LIGHTNING_BOLT,
1801            |s| spell_lightning_bolt(s, &params.game_data),
1802        )
1803        .spell(
1804            "chain_lightning",
1805            SPELL::CHAIN_LIGHTNING,
1806            |s| spell_chain_lightning(s, &params.game_data),
1807        )
1808        .spell(
1809            "flame_shock",
1810            SPELL::FLAME_SHOCK,
1811            |s| spell_flame_shock(s, &params.game_data),
1812        )
1813        .spell(
1814            "frost_shock",
1815            SPELL::FROST_SHOCK,
1816            |s| spell_frost_shock(s, &params.game_data),
1817        )
1818        .spell("sundering", SPELL::SUNDERING, |s| spell_sundering(s, &params.game_data))
1819        .spell(
1820            "doom_winds",
1821            SPELL::DOOM_WINDS,
1822            |s| spell_doom_winds(s, &params.game_data),
1823        )
1824        .spell(
1825            "ascendance",
1826            SPELL::ASCENDANCE,
1827            |s| spell_ascendance(s, &params.game_data),
1828        )
1829        .spell("tempest", SPELL::TEMPEST, |s| spell_tempest(s, &params.game_data))
1830        .spell(
1831            "voltaic_blaze",
1832            SPELL::VOLTAIC_BLAZE,
1833            |s| spell_voltaic_blaze(s, &params.game_data),
1834        )
1835        .spell("skyfury", SPELL::SKYFURY, |s| spell_skyfury(s, &params.game_data))
1836        .spell(
1837            "lightning_shield",
1838            SPELL::LIGHTNING_SHIELD,
1839            |s| spell_lightning_shield(s, &params.game_data),
1840        )
1841        .spell(
1842            "stormstrike_mh",
1843            SPELL::STORMSTRIKE_MH,
1844            |s| spell_stormstrike_mh(s, &params.game_data),
1845        )
1846        .spell(
1847            "stormstrike_offhand",
1848            SPELL::STORMSTRIKE_OFFHAND,
1849            |s| spell_stormstrike_offhand(s, &params.game_data),
1850        )
1851        .spell(
1852            "sundering_splitstream",
1853            SPELL::SUNDERING_SPLITSTREAM,
1854            |s| spell_sundering_splitstream(s, &params.game_data),
1855        )
1856        .spell(
1857            "stormblast",
1858            SPELL::STORMBLAST,
1859            |s| spell_stormblast(s, &params.game_data),
1860        )
1861        .spell(
1862            "crash_lightning_unleashed",
1863            SPELL::CRASH_LIGHTNING_UNLEASHED,
1864            |s| spell_crash_lightning_unleashed(s, &params.game_data),
1865        )
1866        .spell(
1867            "primordial_storm",
1868            SPELL::PRIMORDIAL_STORM,
1869            |s| spell_primordial_storm(s, &params.game_data),
1870        )
1871        .spell(
1872            "primordial_fire",
1873            SPELL::PRIMORDIAL_FIRE,
1874            |s| spell_primordial_fire(s, &params.game_data),
1875        )
1876        .spell(
1877            "primordial_frost",
1878            SPELL::PRIMORDIAL_FROST,
1879            |s| spell_primordial_frost(s, &params.game_data),
1880        )
1881        .spell(
1882            "primordial_lightning",
1883            SPELL::PRIMORDIAL_LIGHTNING,
1884            |s| spell_primordial_lightning(s, &params.game_data),
1885        )
1886        .spell(
1887            "surging_totem",
1888            SPELL::SURGING_TOTEM,
1889            |s| spell_surging_totem(s, &params.game_data),
1890        )
1891        .spell("tremor", SPELL::TREMOR, |s| spell_tremor(s, &params.game_data))
1892        .spell(
1893            "surging_bolt",
1894            SPELL::SURGING_BOLT,
1895            |s| spell_surging_bolt(s, &params.game_data),
1896        )
1897        .spell(
1898            "searing_bolt",
1899            SPELL::SEARING_BOLT,
1900            |s| spell_searing_bolt(s, &params.game_data),
1901        )
1902        .spell(
1903            "searing_volley",
1904            SPELL::SEARING_VOLLEY,
1905            |s| spell_searing_volley(s, &params.game_data),
1906        )
1907        .spell(
1908            "windfury_weapon",
1909            SPELL::WINDFURY_WEAPON,
1910            |s| spell_windfury_weapon(s, &params.game_data),
1911        )
1912        .spell(
1913            "flametongue_weapon",
1914            SPELL::FLAMETONGUE_WEAPON,
1915            |s| spell_flametongue_weapon(s, &params.game_data),
1916        )
1917        .spell(
1918            "windfury_attack",
1919            SPELL::WINDFURY_ATTACK,
1920            |s| spell_windfury_attack(s, &params.game_data),
1921        )
1922        .spell(
1923            "flametongue_attack",
1924            SPELL::FLAMETONGUE_ATTACK,
1925            |s| spell_flametongue_attack(s, &params.game_data),
1926        )
1927        .spell(
1928            "flametongue_attack_imbuement_mastery",
1929            SPELL::FLAMETONGUE_ATTACK_IMBUEMENT_MASTERY,
1930            |s| spell_flametongue_attack_imbuement_mastery(s, &params.game_data),
1931        )
1932        .spell(
1933            "maelstrom_weapon_driver",
1934            SPELL::MAELSTROM_WEAPON_DRIVER,
1935            |s| spell_maelstrom_weapon_driver(s, &params.game_data),
1936        )
1937        .spell(
1938            "hot_hand_driver",
1939            SPELL::HOT_HAND_DRIVER,
1940            |s| spell_hot_hand_driver(s, &params.game_data),
1941        )
1942        .spell(
1943            "stormsurge_driver",
1944            SPELL::STORMSURGE_DRIVER,
1945            |s| spell_stormsurge_driver(s, &params.game_data),
1946        )
1947        .auto_attack(|a| {
1948            a
1949                .spell_id(6603)
1950                .swing_ms(2600)
1951                .apply_base_from_data(&params.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(&params.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        &params.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        &params,
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);