Skip to main content

wowlab_engine_content/generated/specs/
elemental_shaman.rs

1//! @generated by codegen-cli from manifests/specs/shaman/elemental/manifest.toml -- do not edit by hand.
2// Generated code: naming follows game data conventions
3#![allow(non_snake_case, dead_code)]
4use wowlab_types::{combat::ResourceType, game::SpecId};
5use wowlab_engine_combat::{
6    CombatSystemBuilder, CombatSystemDraft, AuraDefinitionDraft, LocalAuraIdx,
7    LocalSpellIdx, SpellDefinitionDraft,
8};
9use wowlab_engine_ports::{
10    DeclaredSpecMetadata, SpecDescriptor, SpecHandler, HeroTalentTreeDesc,
11};
12use wowlab_engine_gamedata::ResolvedGameData;
13pub(crate) mod SPELL {
14    ///<https://wowlab.gg/inspect/spell/188196>
15    pub(crate) const LIGHTNING_BOLT: u32 = 188_196;
16    ///<https://wowlab.gg/inspect/spell/188443>
17    pub(crate) const CHAIN_LIGHTNING: u32 = 188_443;
18    ///<https://wowlab.gg/inspect/spell/51505>
19    pub(crate) const LAVA_BURST: u32 = 51505;
20    ///<https://wowlab.gg/inspect/spell/8042>
21    pub(crate) const EARTH_SHOCK: u32 = 8042;
22    ///<https://wowlab.gg/inspect/spell/117014>
23    pub(crate) const ELEMENTAL_BLAST: u32 = 117_014;
24    ///<https://wowlab.gg/inspect/spell/61882>
25    pub(crate) const EARTHQUAKE: u32 = 61882;
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/452201>
31    pub(crate) const TEMPEST: u32 = 452_201;
32    ///<https://wowlab.gg/inspect/spell/191634>
33    pub(crate) const STORMKEEPER: u32 = 191_634;
34    ///<https://wowlab.gg/inspect/spell/1219480>
35    pub(crate) const ASCENDANCE: u32 = 1_219_480;
36    ///<https://wowlab.gg/inspect/spell/443454>
37    pub(crate) const ANCESTRAL_SWIFTNESS: u32 = 443_454;
38    ///<https://wowlab.gg/inspect/spell/318038>
39    pub(crate) const FLAMETONGUE_WEAPON: u32 = 318_038;
40    ///<https://wowlab.gg/inspect/spell/462757>
41    pub(crate) const THUNDERSTRIKE_WARD: u32 = 462_757;
42    ///<https://wowlab.gg/inspect/spell/192106>
43    pub(crate) const LIGHTNING_SHIELD: u32 = 192_106;
44    ///<https://wowlab.gg/inspect/spell/188592>
45    pub(crate) const FIRE_ELEMENTAL: u32 = 188_592;
46    ///<https://wowlab.gg/inspect/spell/57984>
47    pub(crate) const FIRE_BLAST: u32 = 57984;
48    ///<https://wowlab.gg/inspect/spell/117588>
49    pub(crate) const METEOR: u32 = 117_588;
50    ///<https://wowlab.gg/inspect/spell/118297>
51    pub(crate) const IMMOLATE: u32 = 118_297;
52    ///<https://wowlab.gg/inspect/spell/157331>
53    pub(crate) const WIND_GUST: u32 = 157_331;
54    ///<https://wowlab.gg/inspect/spell/157348>
55    pub(crate) const CALL_LIGHTNING: u32 = 157_348;
56    ///<https://wowlab.gg/inspect/spell/269005>
57    pub(crate) const STORMFURY: u32 = 269_005;
58    ///<https://wowlab.gg/inspect/spell/45284>
59    pub(crate) const LIGHTNING_BOLT_OVERLOAD: u32 = 45284;
60    ///<https://wowlab.gg/inspect/spell/45297>
61    pub(crate) const CHAIN_LIGHTNING_OVERLOAD: u32 = 45297;
62    ///<https://wowlab.gg/inspect/spell/285466>
63    pub(crate) const LAVA_BURST_OVERLOAD: u32 = 285_466;
64    ///<https://wowlab.gg/inspect/spell/120588>
65    pub(crate) const ELEMENTAL_BLAST_OVERLOAD: u32 = 120_588;
66    ///<https://wowlab.gg/inspect/spell/463351>
67    pub(crate) const TEMPEST_OVERLOAD: u32 = 463_351;
68    ///<https://wowlab.gg/inspect/spell/1235840>
69    pub(crate) const STORMS_EYE: u32 = 1_235_840;
70    ///<https://wowlab.gg/inspect/spell/197568>
71    pub(crate) const LIGHTNING_ROD_DAMAGE: u32 = 197_568;
72    ///<https://wowlab.gg/inspect/spell/462854>
73    pub(crate) const SKYFURY: u32 = 462_854;
74}
75pub(crate) mod AURA {
76    ///<https://wowlab.gg/inspect/spell/1219480>
77    pub(crate) const ASCENDANCE: u32 = 1_219_480;
78    ///<https://wowlab.gg/inspect/spell/191634>
79    pub(crate) const STORMKEEPER: u32 = 191_634;
80    ///<https://wowlab.gg/inspect/spell/1300219>
81    pub(crate) const FLOWING_ELEMENTS: u32 = 1_300_219;
82    ///<https://wowlab.gg/inspect/spell/1300222>
83    pub(crate) const OVERCHARGE_TIER: u32 = 1_300_222;
84    ///<https://wowlab.gg/inspect/spell/260734>
85    pub(crate) const MASTER_OF_THE_ELEMENTS: u32 = 260_734;
86    ///<https://wowlab.gg/inspect/spell/77762>
87    pub(crate) const LAVA_SURGE: u32 = 77762;
88    ///<https://wowlab.gg/inspect/spell/454015>
89    pub(crate) const TEMPEST: u32 = 454_015;
90    ///<https://wowlab.gg/inspect/spell/1272101>
91    pub(crate) const THUNDEROUS_VELOCITY: u32 = 1_272_101;
92    ///<https://wowlab.gg/inspect/spell/191877>
93    pub(crate) const POWER_OF_THE_MAELSTROM: u32 = 191_877;
94    ///<https://wowlab.gg/inspect/spell/454394>
95    pub(crate) const UNLIMITED_POWER: u32 = 454_394;
96    ///<https://wowlab.gg/inspect/spell/118522>
97    pub(crate) const ELEMENTAL_BLAST_CRIT: u32 = 118_522;
98    ///<https://wowlab.gg/inspect/spell/173183>
99    pub(crate) const ELEMENTAL_BLAST_HASTE: u32 = 173_183;
100    ///<https://wowlab.gg/inspect/spell/173184>
101    pub(crate) const ELEMENTAL_BLAST_MASTERY: u32 = 173_184;
102    ///<https://wowlab.gg/inspect/spell/443454>
103    pub(crate) const ANCESTRAL_SWIFTNESS: u32 = 443_454;
104    ///<https://wowlab.gg/inspect/spell/188389>
105    pub(crate) const FLAME_SHOCK: u32 = 188_389;
106    ///<https://wowlab.gg/inspect/spell/210689>
107    pub(crate) const LIGHTNING_ROD: u32 = 210_689;
108    ///<https://wowlab.gg/inspect/spell/1259491>
109    pub(crate) const PURGING_FLAMES: u32 = 1_259_491;
110    ///<https://wowlab.gg/inspect/spell/192106>
111    pub(crate) const LIGHTNING_SHIELD: u32 = 192_106;
112    ///<https://wowlab.gg/inspect/spell/462757>
113    pub(crate) const THUNDERSTRIKE_WARD: u32 = 462_757;
114    ///<https://wowlab.gg/inspect/spell/382027>
115    pub(crate) const IMPROVED_FLAMETONGUE_WEAPON: u32 = 382_027;
116    ///<https://wowlab.gg/inspect/spell/319778>
117    pub(crate) const FLAMETONGUE_WEAPON: u32 = 319_778;
118    ///<https://wowlab.gg/inspect/spell/384088>
119    pub(crate) const ECHOES_OF_GREAT_SUNDERING: u32 = 384_088;
120    ///<https://wowlab.gg/inspect/spell/263806>
121    pub(crate) const WIND_GUST: u32 = 263_806;
122    ///<https://wowlab.gg/inspect/spell/188592>
123    pub(crate) const FIRE_ELEMENTAL: u32 = 188_592;
124    ///<https://wowlab.gg/inspect/spell/157299>
125    pub(crate) const STORM_ELEMENTAL: u32 = 157_299;
126    ///<https://wowlab.gg/inspect/spell/1239315>
127    pub(crate) const STORMS_EYE: u32 = 1_239_315;
128    ///<https://wowlab.gg/inspect/spell/462854>
129    pub(crate) const SKYFURY_HIGHLIGHT: u32 = 462_854;
130}
131pub(crate) mod TALENT {
132    ///<https://wowlab.gg/inspect/spell/273221>
133    pub(crate) const AFTERSHOCK: u32 = 273_221;
134    ///<https://wowlab.gg/inspect/spell/443454>
135    pub(crate) const ANCESTRAL_SWIFTNESS: u32 = 443_454;
136    ///<https://wowlab.gg/inspect/spell/455096>
137    pub(crate) const ARC_DISCHARGE: u32 = 455_096;
138    ///<https://wowlab.gg/inspect/spell/114050>
139    pub(crate) const ASCENDANCE: u32 = 114_050;
140    ///<https://wowlab.gg/inspect/spell/455129>
141    pub(crate) const AWAKENING_STORMS: u32 = 455_129;
142    ///<https://wowlab.gg/inspect/spell/378255>
143    pub(crate) const CALL_OF_FIRE: u32 = 378_255;
144    ///<https://wowlab.gg/inspect/spell/117014>
145    pub(crate) const ELEMENTAL_BLAST: u32 = 117_014;
146    ///<https://wowlab.gg/inspect/spell/462866>
147    pub(crate) const ELEMENTAL_UNITY: u32 = 462_866;
148    ///<https://wowlab.gg/inspect/spell/1270064>
149    pub(crate) const FEEDBACK_LOOP_3: u32 = 1_270_064;
150    ///<https://wowlab.gg/inspect/spell/188592>
151    pub(crate) const FIRE_ELEMENTAL: u32 = 188_592;
152    ///<https://wowlab.gg/inspect/spell/318038>
153    pub(crate) const FLAMETONGUE_WEAPON: u32 = 318_038;
154    ///<https://wowlab.gg/inspect/spell/191717>
155    pub(crate) const FURY_OF_THE_STORMS: u32 = 191_717;
156    ///<https://wowlab.gg/inspect/spell/462840>
157    pub(crate) const FUSION_OF_ELEMENTS: u32 = 462_840;
158    ///<https://wowlab.gg/inspect/spell/1259047>
159    pub(crate) const INFERNO_ARC: u32 = 1_259_047;
160    ///<https://wowlab.gg/inspect/spell/462862>
161    pub(crate) const LIGHTNING_CAPACITOR: u32 = 462_862;
162    ///<https://wowlab.gg/inspect/spell/210689>
163    pub(crate) const LIGHTNING_ROD: u32 = 210_689;
164    ///<https://wowlab.gg/inspect/spell/16166>
165    pub(crate) const MASTER_OF_THE_ELEMENTS: u32 = 16166;
166    ///<https://wowlab.gg/inspect/spell/381726>
167    pub(crate) const MOUNTAINS_WILL_FALL: u32 = 381_726;
168    ///<https://wowlab.gg/inspect/spell/191861>
169    pub(crate) const POWER_OF_THE_MAELSTROM: u32 = 191_861;
170    ///<https://wowlab.gg/inspect/spell/117013>
171    pub(crate) const PRIMAL_ELEMENTALIST: u32 = 117_013;
172    ///<https://wowlab.gg/inspect/spell/443448>
173    pub(crate) const PRIMORDIAL_CAPACITY: u32 = 443_448;
174    ///<https://wowlab.gg/inspect/spell/381782>
175    pub(crate) const SEARING_FLAMES: u32 = 381_782;
176    ///<https://wowlab.gg/inspect/spell/191634>
177    pub(crate) const STORMKEEPER: u32 = 191_634;
178    ///<https://wowlab.gg/inspect/spell/1264762>
179    pub(crate) const STORMWELL: u32 = 1_264_762;
180    ///<https://wowlab.gg/inspect/spell/157299>
181    pub(crate) const STORM_ELEMENTAL: u32 = 157_299;
182    ///<https://wowlab.gg/inspect/spell/455110>
183    pub(crate) const SUPERCHARGE: u32 = 455_110;
184    ///<https://wowlab.gg/inspect/spell/381707>
185    pub(crate) const SWELLING_MAELSTROM: u32 = 381_707;
186    ///<https://wowlab.gg/inspect/spell/454009>
187    pub(crate) const TEMPEST_TALENT: u32 = 454_009;
188    ///<https://wowlab.gg/inspect/spell/462757>
189    pub(crate) const THUNDERSTRIKE_WARD: u32 = 462_757;
190    ///<https://wowlab.gg/inspect/spell/454391>
191    pub(crate) const UNLIMITED_POWER: u32 = 454_391;
192    ///<https://wowlab.gg/inspect/spell/1259101>
193    pub(crate) const VOLTAIC_BLAZE: u32 = 1_259_101;
194}
195pub(crate) mod SET_BONUS {
196    ///<https://wowlab.gg/inspect/spell/1296625>
197    pub(crate) const MID2_ELEMENTAL_2PC: u32 = 1_296_625;
198    ///<https://wowlab.gg/inspect/spell/1296626>
199    pub(crate) const MID2_ELEMENTAL_4PC: u32 = 1_296_626;
200    ///<https://wowlab.gg/inspect/spell/1236408>
201    pub(crate) const TWW3_STORMBRINGER_2PC: u32 = 1_236_408;
202    ///<https://wowlab.gg/inspect/spell/1236409>
203    pub(crate) const TWW3_STORMBRINGER_4PC: u32 = 1_236_409;
204}
205pub(crate) mod HERO {
206    pub(crate) mod STORMBRINGER {
207        pub(crate) mod SPELL {
208            ///<https://wowlab.gg/inspect/spell/452201>
209            pub(crate) const TEMPEST: u32 = 452_201;
210            ///<https://wowlab.gg/inspect/spell/463351>
211            pub(crate) const TEMPEST_OVERLOAD: u32 = 463_351;
212        }
213        pub(crate) mod AURA {
214            ///<https://wowlab.gg/inspect/spell/470532>
215            pub(crate) const ARC_DISCHARGE: u32 = 470_532;
216            ///<https://wowlab.gg/inspect/spell/455129>
217            pub(crate) const AWAKENING_STORMS: u32 = 455_129;
218            ///<https://wowlab.gg/inspect/spell/455089>
219            pub(crate) const STORM_SWELL: u32 = 455_089;
220            ///<https://wowlab.gg/inspect/spell/454015>
221            pub(crate) const TEMPEST: u32 = 454_015;
222            ///<https://wowlab.gg/inspect/spell/454394>
223            pub(crate) const UNLIMITED_POWER: u32 = 454_394;
224        }
225    }
226    pub(crate) mod FARSEER {
227        pub(crate) mod SPELL {
228            ///<https://wowlab.gg/inspect/spell/443454>
229            pub(crate) const ANCESTRAL_SWIFTNESS: u32 = 443_454;
230            ///<https://wowlab.gg/inspect/spell/447244>
231            pub(crate) const CALL_OF_THE_ANCESTORS: u32 = 447_244;
232        }
233        pub(crate) mod AURA {
234            ///<https://wowlab.gg/inspect/spell/443454>
235            pub(crate) const ANCESTRAL_SWIFTNESS: u32 = 443_454;
236            ///<https://wowlab.gg/inspect/spell/447244>
237            pub(crate) const CALL_OF_THE_ANCESTORS: u32 = 447_244;
238            ///<https://wowlab.gg/inspect/spell/443448>
239            pub(crate) const PRIMORDIAL_CAPACITY: u32 = 443_448;
240        }
241    }
242    pub(crate) mod TOTEMIC {
243        pub(crate) mod SPELL {
244            ///<https://wowlab.gg/inspect/spell/1221347>
245            pub(crate) const SURGING_TOTEM: u32 = 1_221_347;
246        }
247        pub(crate) mod AURA {
248            ///<https://wowlab.gg/inspect/spell/456369>
249            pub(crate) const AMPLIFICATION_CORE: u32 = 456_369;
250            ///<https://wowlab.gg/inspect/spell/461242>
251            pub(crate) const LIVELY_TOTEMS: u32 = 461_242;
252            ///<https://wowlab.gg/inspect/spell/1221347>
253            pub(crate) const SURGING_TOTEM: u32 = 1_221_347;
254            ///<https://wowlab.gg/inspect/spell/458269>
255            pub(crate) const TOTEMIC_REBOUND: u32 = 458_269;
256        }
257    }
258}
259static HERO_TREE_STORMBRINGER_SPELLS: &[(&str, u32)] = &[
260    ("TEMPEST", 452_201),
261    ("TEMPEST_OVERLOAD", 463_351),
262];
263static HERO_TREE_STORMBRINGER_AURAS: &[(&str, u32)] = &[
264    ("ARC_DISCHARGE", 470_532),
265    ("AWAKENING_STORMS", 455_129),
266    ("STORM_SWELL", 455_089),
267    ("TEMPEST", 454_015),
268    ("UNLIMITED_POWER", 454_394),
269];
270static HERO_TREE_FARSEER_SPELLS: &[(&str, u32)] = &[
271    ("ANCESTRAL_SWIFTNESS", 443_454),
272    ("CALL_OF_THE_ANCESTORS", 447_244),
273];
274static HERO_TREE_FARSEER_AURAS: &[(&str, u32)] = &[
275    ("ANCESTRAL_SWIFTNESS", 443_454),
276    ("CALL_OF_THE_ANCESTORS", 447_244),
277    ("PRIMORDIAL_CAPACITY", 443_448),
278];
279static HERO_TREE_TOTEMIC_SPELLS: &[(&str, u32)] = &[("SURGING_TOTEM", 1_221_347)];
280static HERO_TREE_TOTEMIC_AURAS: &[(&str, u32)] = &[
281    ("AMPLIFICATION_CORE", 456_369),
282    ("LIVELY_TOTEMS", 461_242),
283    ("SURGING_TOTEM", 1_221_347),
284    ("TOTEMIC_REBOUND", 458_269),
285];
286pub(crate) mod DAMAGE_SPELL {
287    pub(crate) const LIGHTNING_BOLT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_188196;
288    pub(crate) const CHAIN_LIGHTNING: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_188443;
289    pub(crate) const LAVA_BURST: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_51505;
290    pub(crate) const EARTH_SHOCK: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_8042;
291    pub(crate) const ELEMENTAL_BLAST: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_117014;
292    pub(crate) const EARTHQUAKE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_61882;
293    pub(crate) const FLAME_SHOCK: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_188389;
294    pub(crate) const FROST_SHOCK: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_196840;
295    pub(crate) const TEMPEST: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_452201;
296    pub(crate) const STORMKEEPER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_191634;
297    pub(crate) const ASCENDANCE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_1219480;
298    pub(crate) const ANCESTRAL_SWIFTNESS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_443454;
299    pub(crate) const FLAMETONGUE_WEAPON: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_318038;
300    pub(crate) const THUNDERSTRIKE_WARD: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_462757;
301    pub(crate) const LIGHTNING_SHIELD: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_192106;
302    pub(crate) const FIRE_ELEMENTAL: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_188592;
303    pub(crate) const FIRE_BLAST: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_57984;
304    pub(crate) const METEOR: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_117588;
305    pub(crate) const IMMOLATE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_118297;
306    pub(crate) const WIND_GUST: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_157331;
307    pub(crate) const CALL_LIGHTNING: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_157348;
308    pub(crate) const STORMFURY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_269005;
309    pub(crate) const LIGHTNING_BOLT_OVERLOAD: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_45284;
310    pub(crate) const CHAIN_LIGHTNING_OVERLOAD: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_45297;
311    pub(crate) const LAVA_BURST_OVERLOAD: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_285466;
312    pub(crate) const ELEMENTAL_BLAST_OVERLOAD: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_120588;
313    pub(crate) const TEMPEST_OVERLOAD: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_463351;
314    pub(crate) const STORMS_EYE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_1235840;
315    pub(crate) const LIGHTNING_ROD_DAMAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_197568;
316    pub(crate) const SKYFURY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_462854;
317    pub(crate) const CALL_OF_THE_ANCESTORS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_447244;
318    pub(crate) const SURGING_TOTEM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_1221347;
319}
320pub(crate) mod DAMAGE_AURA {
321    pub(crate) const ASCENDANCE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_1219480;
322    pub(crate) const STORMKEEPER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_191634;
323    pub(crate) const FLOWING_ELEMENTS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_1300219;
324    pub(crate) const OVERCHARGE_TIER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_1300222;
325    pub(crate) const MASTER_OF_THE_ELEMENTS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_260734;
326    pub(crate) const LAVA_SURGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_77762;
327    pub(crate) const TEMPEST: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_454015;
328    pub(crate) const THUNDEROUS_VELOCITY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_1272101;
329    pub(crate) const POWER_OF_THE_MAELSTROM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_191877;
330    pub(crate) const UNLIMITED_POWER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_454394;
331    pub(crate) const ELEMENTAL_BLAST_CRIT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_118522;
332    pub(crate) const ELEMENTAL_BLAST_HASTE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_173183;
333    pub(crate) const ELEMENTAL_BLAST_MASTERY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_173184;
334    pub(crate) const ANCESTRAL_SWIFTNESS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_443454;
335    pub(crate) const FLAME_SHOCK: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_188389;
336    pub(crate) const LIGHTNING_ROD: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_210689;
337    pub(crate) const PURGING_FLAMES: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_1259491;
338    pub(crate) const LIGHTNING_SHIELD: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_192106;
339    pub(crate) const THUNDERSTRIKE_WARD: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_462757;
340    pub(crate) const IMPROVED_FLAMETONGUE_WEAPON: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_382027;
341    pub(crate) const FLAMETONGUE_WEAPON: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_319778;
342    pub(crate) const ECHOES_OF_GREAT_SUNDERING: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_384088;
343    pub(crate) const WIND_GUST: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_263806;
344    pub(crate) const FIRE_ELEMENTAL: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_188592;
345    pub(crate) const STORM_ELEMENTAL: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_157299;
346    pub(crate) const STORMS_EYE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_1239315;
347    pub(crate) const SKYFURY_HIGHLIGHT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_462854;
348}
349pub(crate) mod DAMAGE_TALENT {
350    pub(crate) const AFTERSHOCK: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_273221;
351    pub(crate) const ANCESTRAL_SWIFTNESS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_443454;
352    pub(crate) const ARC_DISCHARGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_455096;
353    pub(crate) const ASCENDANCE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_114050;
354    pub(crate) const AWAKENING_STORMS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_455129;
355    pub(crate) const CALL_OF_FIRE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_378255;
356    pub(crate) const ELEMENTAL_BLAST: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_117014;
357    pub(crate) const ELEMENTAL_UNITY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_462866;
358    pub(crate) const FEEDBACK_LOOP_3: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_1270064;
359    pub(crate) const FIRE_ELEMENTAL: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_188592;
360    pub(crate) const FLAMETONGUE_WEAPON: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_318038;
361    pub(crate) const FURY_OF_THE_STORMS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_191717;
362    pub(crate) const FUSION_OF_ELEMENTS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_462840;
363    pub(crate) const INFERNO_ARC: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_1259047;
364    pub(crate) const LIGHTNING_CAPACITOR: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_462862;
365    pub(crate) const LIGHTNING_ROD: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_210689;
366    pub(crate) const MASTER_OF_THE_ELEMENTS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_16166;
367    pub(crate) const MOUNTAINS_WILL_FALL: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_381726;
368    pub(crate) const POWER_OF_THE_MAELSTROM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_191861;
369    pub(crate) const PRIMAL_ELEMENTALIST: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_117013;
370    pub(crate) const PRIMORDIAL_CAPACITY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_443448;
371    pub(crate) const SEARING_FLAMES: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_381782;
372    pub(crate) const STORMKEEPER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_191634;
373    pub(crate) const STORMWELL: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_1264762;
374    pub(crate) const STORM_ELEMENTAL: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_157299;
375    pub(crate) const SUPERCHARGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_455110;
376    pub(crate) const SWELLING_MAELSTROM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_381707;
377    pub(crate) const TEMPEST_TALENT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_454009;
378    pub(crate) const THUNDERSTRIKE_WARD: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_462757;
379    pub(crate) const UNLIMITED_POWER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_454391;
380    pub(crate) const VOLTAIC_BLAZE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ACTION::SPELL_1259101;
381}
382pub(crate) mod DAMAGE_REPORTED {}
383pub(crate) mod DAMAGE_EFFECT {
384    pub(crate) const CALL_LIGHTNING_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::EFFECT::SPELL_157348_EFFECT_1;
385    pub(crate) const CALL_LIGHTNING_DAMAGE_BONUS: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::EFFECT::SPELL_157348_EFFECT_2;
386    pub(crate) const CHAIN_LIGHTNING_OVERLOAD: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::EFFECT::SPELL_45297_EFFECT_1;
387    pub(crate) const ELEMENTAL_BLAST_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::EFFECT::SPELL_117014_EFFECT_1;
388    pub(crate) const ELEMENTAL_BLAST_OVERLOAD: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::EFFECT::SPELL_120588_EFFECT_1;
389    pub(crate) const EARTHQUAKE_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::EFFECT::SPELL_77478_EFFECT_1;
390    pub(crate) const EARTHQUAKE_TIMING: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::EFFECT::SPELL_61882_EFFECT_2;
391    pub(crate) const FEEDBACK_LOOP_BONUS: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::EFFECT::SPELL_1270064_EFFECT_1;
392    pub(crate) const FIRE_BLAST_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::EFFECT::SPELL_57984_EFFECT_1;
393    pub(crate) const FUSION_OF_ELEMENTS_BONUS: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::EFFECT::SPELL_462840_EFFECT_1;
394    pub(crate) const IMMOLATE_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::EFFECT::SPELL_118297_EFFECT_1;
395    pub(crate) const IMMOLATE_PERIODIC_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::EFFECT::SPELL_118297_EFFECT_2;
396    pub(crate) const LAVA_BURST_OVERLOAD: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::EFFECT::SPELL_285466_EFFECT_1;
397    pub(crate) const LIGHTNING_BOLT_OVERLOAD: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::EFFECT::SPELL_45284_EFFECT_1;
398    pub(crate) const MASTERY_DIRECT_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::EFFECT::SPELL_168534_EFFECT_3;
399    pub(crate) const MASTERY_PERIODIC_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::EFFECT::SPELL_168534_EFFECT_4;
400    pub(crate) const MASTERY_PET_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::EFFECT::SPELL_168534_EFFECT_5;
401    pub(crate) const METEOR_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::EFFECT::SPELL_117588_EFFECT_1;
402    pub(crate) const MID2_SPENDER_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::EFFECT::SPELL_1296625_EFFECT_1;
403    pub(crate) const MOUNTAINS_WILL_FALL_BONUS: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::EFFECT::SPELL_381726_EFFECT_1;
404    pub(crate) const STORMFURY_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::EFFECT::SPELL_269005_EFFECT_1;
405    pub(crate) const STORMS_EYE_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::EFFECT::SPELL_1235840_EFFECT_2;
406    pub(crate) const TEMPEST_OVERLOAD: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::EFFECT::SPELL_463351_EFFECT_1;
407    pub(crate) const WIND_GUST_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::EFFECT::SPELL_157331_EFFECT_1;
408    pub(crate) const OVERLOAD_CHANCE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::EFFECT::SPELL_168534_EFFECT_1;
409    pub(crate) const OVERLOAD_PENALTY: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::EFFECT::SPELL_168534_EFFECT_2;
410    pub(crate) const SUPERCHARGE_CHANCE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::EFFECT::SPELL_455110_EFFECT_1;
411    pub(crate) const AFTERSHOCK_CHANCE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::EFFECT::SPELL_273221_EFFECT_1;
412    pub(crate) const TEMPEST_TALENT_CHANCE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::EFFECT::SPELL_454009_EFFECT_1;
413    pub(crate) const AWAKENING_STORMS_CHANCE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::EFFECT::SPELL_455129_EFFECT_3;
414    pub(crate) const POWER_OF_THE_MAELSTROM_CHANCE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::EFFECT::SPELL_191861_EFFECT_1;
415    pub(crate) const LAVA_BURST_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::EFFECT::SPELL_285452_EFFECT_1;
416    pub(crate) const LIGHTNING_ROD_PERCENT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::EFFECT::SPELL_210689_EFFECT_2;
417    pub(crate) const STORMFURY_RAMP: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::EFFECT::SPELL_157375_EFFECT_2;
418    pub(crate) const STORMKEEPER_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::EFFECT::SPELL_191634_EFFECT_2;
419    pub(crate) const ELEMENTAL_UNITY_FIRE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::EFFECT::SPELL_462866_EFFECT_1;
420    pub(crate) const ELEMENTAL_UNITY_STORM: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::EFFECT::SPELL_462866_EFFECT_3;
421    pub(crate) const FIRE_ELEMENTAL_UNITY: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::EFFECT::SPELL_188592_EFFECT_4;
422    pub(crate) const FIRE_ELEMENTAL_UNITY_PERIODIC: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::EFFECT::SPELL_188592_EFFECT_5;
423    pub(crate) const STORM_ELEMENTAL_UNITY: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::EFFECT::SPELL_157299_EFFECT_3;
424    pub(crate) const STORM_ELEMENTAL_UNITY_PET: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::EFFECT::SPELL_157299_EFFECT_4;
425    pub(crate) const LIGHTNING_CAPACITOR_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::EFFECT::SPELL_462862_EFFECT_3;
426    pub(crate) const IMPROVED_FLAMETONGUE_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::EFFECT::SPELL_382028_EFFECT_1;
427    pub(crate) const STORMWELL_SK_MAELSTROM: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::EFFECT::SPELL_1264762_EFFECT_2;
428}
429pub(crate) const AURA_ASCENDANCE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::elemental_shaman::AURA_ASCENDANCE
430    .bind(wowlab_engine_combat::generated_identities::specs::elemental_shaman::PROOF);
431pub(crate) const AURA_STORMKEEPER: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::elemental_shaman::AURA_STORMKEEPER
432    .bind(wowlab_engine_combat::generated_identities::specs::elemental_shaman::PROOF);
433pub(crate) const AURA_FLOWING_ELEMENTS: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::elemental_shaman::AURA_FLOWING_ELEMENTS
434    .bind(wowlab_engine_combat::generated_identities::specs::elemental_shaman::PROOF);
435pub(crate) const AURA_OVERCHARGE_TIER: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::elemental_shaman::AURA_OVERCHARGE_TIER
436    .bind(wowlab_engine_combat::generated_identities::specs::elemental_shaman::PROOF);
437pub(crate) const AURA_MASTER_OF_THE_ELEMENTS: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::elemental_shaman::AURA_MASTER_OF_THE_ELEMENTS
438    .bind(wowlab_engine_combat::generated_identities::specs::elemental_shaman::PROOF);
439pub(crate) const AURA_LAVA_SURGE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::elemental_shaman::AURA_LAVA_SURGE
440    .bind(wowlab_engine_combat::generated_identities::specs::elemental_shaman::PROOF);
441pub(crate) const AURA_TEMPEST: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::elemental_shaman::AURA_TEMPEST
442    .bind(wowlab_engine_combat::generated_identities::specs::elemental_shaman::PROOF);
443pub(crate) const AURA_THUNDEROUS_VELOCITY: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::elemental_shaman::AURA_THUNDEROUS_VELOCITY
444    .bind(wowlab_engine_combat::generated_identities::specs::elemental_shaman::PROOF);
445pub(crate) const AURA_POWER_OF_THE_MAELSTROM: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::elemental_shaman::AURA_POWER_OF_THE_MAELSTROM
446    .bind(wowlab_engine_combat::generated_identities::specs::elemental_shaman::PROOF);
447pub(crate) const AURA_UNLIMITED_POWER: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::elemental_shaman::AURA_UNLIMITED_POWER
448    .bind(wowlab_engine_combat::generated_identities::specs::elemental_shaman::PROOF);
449pub(crate) const AURA_ELEMENTAL_BLAST_CRIT: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::elemental_shaman::AURA_ELEMENTAL_BLAST_CRIT
450    .bind(wowlab_engine_combat::generated_identities::specs::elemental_shaman::PROOF);
451pub(crate) const AURA_ELEMENTAL_BLAST_HASTE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::elemental_shaman::AURA_ELEMENTAL_BLAST_HASTE
452    .bind(wowlab_engine_combat::generated_identities::specs::elemental_shaman::PROOF);
453pub(crate) const AURA_ELEMENTAL_BLAST_MASTERY: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::elemental_shaman::AURA_ELEMENTAL_BLAST_MASTERY
454    .bind(wowlab_engine_combat::generated_identities::specs::elemental_shaman::PROOF);
455pub(crate) const AURA_ANCESTRAL_SWIFTNESS: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::elemental_shaman::AURA_ANCESTRAL_SWIFTNESS
456    .bind(wowlab_engine_combat::generated_identities::specs::elemental_shaman::PROOF);
457pub(crate) const AURA_FLAME_SHOCK: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::elemental_shaman::AURA_FLAME_SHOCK
458    .bind(wowlab_engine_combat::generated_identities::specs::elemental_shaman::PROOF);
459pub(crate) const AURA_LIGHTNING_ROD: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::elemental_shaman::AURA_LIGHTNING_ROD
460    .bind(wowlab_engine_combat::generated_identities::specs::elemental_shaman::PROOF);
461pub(crate) const AURA_PURGING_FLAMES: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::elemental_shaman::AURA_PURGING_FLAMES
462    .bind(wowlab_engine_combat::generated_identities::specs::elemental_shaman::PROOF);
463pub(crate) const AURA_LIGHTNING_SHIELD: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::elemental_shaman::AURA_LIGHTNING_SHIELD
464    .bind(wowlab_engine_combat::generated_identities::specs::elemental_shaman::PROOF);
465pub(crate) const AURA_THUNDERSTRIKE_WARD: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::elemental_shaman::AURA_THUNDERSTRIKE_WARD
466    .bind(wowlab_engine_combat::generated_identities::specs::elemental_shaman::PROOF);
467pub(crate) const AURA_IMPROVED_FLAMETONGUE_WEAPON: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::elemental_shaman::AURA_IMPROVED_FLAMETONGUE_WEAPON
468    .bind(wowlab_engine_combat::generated_identities::specs::elemental_shaman::PROOF);
469pub(crate) const AURA_FLAMETONGUE_WEAPON: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::elemental_shaman::AURA_FLAMETONGUE_WEAPON
470    .bind(wowlab_engine_combat::generated_identities::specs::elemental_shaman::PROOF);
471pub(crate) const AURA_ECHOES_OF_GREAT_SUNDERING: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::elemental_shaman::AURA_ECHOES_OF_GREAT_SUNDERING
472    .bind(wowlab_engine_combat::generated_identities::specs::elemental_shaman::PROOF);
473pub(crate) const AURA_WIND_GUST: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::elemental_shaman::AURA_WIND_GUST
474    .bind(wowlab_engine_combat::generated_identities::specs::elemental_shaman::PROOF);
475pub(crate) const AURA_FIRE_ELEMENTAL: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::elemental_shaman::AURA_FIRE_ELEMENTAL
476    .bind(wowlab_engine_combat::generated_identities::specs::elemental_shaman::PROOF);
477pub(crate) const AURA_STORM_ELEMENTAL: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::elemental_shaman::AURA_STORM_ELEMENTAL
478    .bind(wowlab_engine_combat::generated_identities::specs::elemental_shaman::PROOF);
479pub(crate) const AURA_STORMS_EYE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::elemental_shaman::AURA_STORMS_EYE
480    .bind(wowlab_engine_combat::generated_identities::specs::elemental_shaman::PROOF);
481pub(crate) const AURA_SKYFURY_HIGHLIGHT: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::elemental_shaman::AURA_SKYFURY_HIGHLIGHT
482    .bind(wowlab_engine_combat::generated_identities::specs::elemental_shaman::PROOF);
483pub(crate) const AURA_COUNT: usize = 27;
484const _: () = assert!(
485    AURA_COUNT == 27, "AURA index ABI: count changed -- update positional hook consumers"
486);
487pub(crate) const SPELL_LIGHTNING_BOLT: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::elemental_shaman::SPELL_LIGHTNING_BOLT
488    .bind(wowlab_engine_combat::generated_identities::specs::elemental_shaman::PROOF);
489pub(crate) const SPELL_CHAIN_LIGHTNING: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::elemental_shaman::SPELL_CHAIN_LIGHTNING
490    .bind(wowlab_engine_combat::generated_identities::specs::elemental_shaman::PROOF);
491pub(crate) const SPELL_LAVA_BURST: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::elemental_shaman::SPELL_LAVA_BURST
492    .bind(wowlab_engine_combat::generated_identities::specs::elemental_shaman::PROOF);
493pub(crate) const SPELL_EARTH_SHOCK: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::elemental_shaman::SPELL_EARTH_SHOCK
494    .bind(wowlab_engine_combat::generated_identities::specs::elemental_shaman::PROOF);
495pub(crate) const SPELL_ELEMENTAL_BLAST: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::elemental_shaman::SPELL_ELEMENTAL_BLAST
496    .bind(wowlab_engine_combat::generated_identities::specs::elemental_shaman::PROOF);
497pub(crate) const SPELL_EARTHQUAKE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::elemental_shaman::SPELL_EARTHQUAKE
498    .bind(wowlab_engine_combat::generated_identities::specs::elemental_shaman::PROOF);
499pub(crate) const SPELL_FLAME_SHOCK: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::elemental_shaman::SPELL_FLAME_SHOCK
500    .bind(wowlab_engine_combat::generated_identities::specs::elemental_shaman::PROOF);
501pub(crate) const SPELL_FROST_SHOCK: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::elemental_shaman::SPELL_FROST_SHOCK
502    .bind(wowlab_engine_combat::generated_identities::specs::elemental_shaman::PROOF);
503pub(crate) const SPELL_TEMPEST: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::elemental_shaman::SPELL_TEMPEST
504    .bind(wowlab_engine_combat::generated_identities::specs::elemental_shaman::PROOF);
505pub(crate) const SPELL_STORMKEEPER: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::elemental_shaman::SPELL_STORMKEEPER
506    .bind(wowlab_engine_combat::generated_identities::specs::elemental_shaman::PROOF);
507pub(crate) const SPELL_ASCENDANCE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::elemental_shaman::SPELL_ASCENDANCE
508    .bind(wowlab_engine_combat::generated_identities::specs::elemental_shaman::PROOF);
509pub(crate) const SPELL_ANCESTRAL_SWIFTNESS: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::elemental_shaman::SPELL_ANCESTRAL_SWIFTNESS
510    .bind(wowlab_engine_combat::generated_identities::specs::elemental_shaman::PROOF);
511pub(crate) const SPELL_FLAMETONGUE_WEAPON: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::elemental_shaman::SPELL_FLAMETONGUE_WEAPON
512    .bind(wowlab_engine_combat::generated_identities::specs::elemental_shaman::PROOF);
513pub(crate) const SPELL_THUNDERSTRIKE_WARD: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::elemental_shaman::SPELL_THUNDERSTRIKE_WARD
514    .bind(wowlab_engine_combat::generated_identities::specs::elemental_shaman::PROOF);
515pub(crate) const SPELL_LIGHTNING_SHIELD: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::elemental_shaman::SPELL_LIGHTNING_SHIELD
516    .bind(wowlab_engine_combat::generated_identities::specs::elemental_shaman::PROOF);
517pub(crate) const SPELL_FIRE_ELEMENTAL: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::elemental_shaman::SPELL_FIRE_ELEMENTAL
518    .bind(wowlab_engine_combat::generated_identities::specs::elemental_shaman::PROOF);
519pub(crate) const SPELL_FIRE_BLAST: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::elemental_shaman::SPELL_FIRE_BLAST
520    .bind(wowlab_engine_combat::generated_identities::specs::elemental_shaman::PROOF);
521pub(crate) const SPELL_METEOR: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::elemental_shaman::SPELL_METEOR
522    .bind(wowlab_engine_combat::generated_identities::specs::elemental_shaman::PROOF);
523pub(crate) const SPELL_IMMOLATE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::elemental_shaman::SPELL_IMMOLATE
524    .bind(wowlab_engine_combat::generated_identities::specs::elemental_shaman::PROOF);
525pub(crate) const SPELL_WIND_GUST: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::elemental_shaman::SPELL_WIND_GUST
526    .bind(wowlab_engine_combat::generated_identities::specs::elemental_shaman::PROOF);
527pub(crate) const SPELL_CALL_LIGHTNING: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::elemental_shaman::SPELL_CALL_LIGHTNING
528    .bind(wowlab_engine_combat::generated_identities::specs::elemental_shaman::PROOF);
529pub(crate) const SPELL_STORMFURY: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::elemental_shaman::SPELL_STORMFURY
530    .bind(wowlab_engine_combat::generated_identities::specs::elemental_shaman::PROOF);
531pub(crate) const SPELL_LIGHTNING_BOLT_OVERLOAD: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::elemental_shaman::SPELL_LIGHTNING_BOLT_OVERLOAD
532    .bind(wowlab_engine_combat::generated_identities::specs::elemental_shaman::PROOF);
533pub(crate) const SPELL_CHAIN_LIGHTNING_OVERLOAD: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::elemental_shaman::SPELL_CHAIN_LIGHTNING_OVERLOAD
534    .bind(wowlab_engine_combat::generated_identities::specs::elemental_shaman::PROOF);
535pub(crate) const SPELL_LAVA_BURST_OVERLOAD: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::elemental_shaman::SPELL_LAVA_BURST_OVERLOAD
536    .bind(wowlab_engine_combat::generated_identities::specs::elemental_shaman::PROOF);
537pub(crate) const SPELL_ELEMENTAL_BLAST_OVERLOAD: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::elemental_shaman::SPELL_ELEMENTAL_BLAST_OVERLOAD
538    .bind(wowlab_engine_combat::generated_identities::specs::elemental_shaman::PROOF);
539pub(crate) const SPELL_TEMPEST_OVERLOAD: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::elemental_shaman::SPELL_TEMPEST_OVERLOAD
540    .bind(wowlab_engine_combat::generated_identities::specs::elemental_shaman::PROOF);
541pub(crate) const SPELL_STORMS_EYE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::elemental_shaman::SPELL_STORMS_EYE
542    .bind(wowlab_engine_combat::generated_identities::specs::elemental_shaman::PROOF);
543pub(crate) const SPELL_LIGHTNING_ROD_DAMAGE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::elemental_shaman::SPELL_LIGHTNING_ROD_DAMAGE
544    .bind(wowlab_engine_combat::generated_identities::specs::elemental_shaman::PROOF);
545pub(crate) const SPELL_SKYFURY: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::elemental_shaman::SPELL_SKYFURY
546    .bind(wowlab_engine_combat::generated_identities::specs::elemental_shaman::PROOF);
547pub(crate) const SPELL_COUNT: usize = 30;
548const _: () = assert!(
549    SPELL_COUNT == 30,
550    "SPELL index ABI: count changed -- update positional hook consumers"
551);
552pub(crate) mod EFFECT {
553    ///<https://wowlab.gg/inspect/spell/157348>
554    pub(crate) const CALL_LIGHTNING_DAMAGE: (u32, u8) = (157_348, 1);
555    ///<https://wowlab.gg/inspect/spell/157348>
556    pub(crate) const CALL_LIGHTNING_DAMAGE_BONUS: (u32, u8) = (157_348, 2);
557    ///<https://wowlab.gg/inspect/spell/45297>
558    pub(crate) const CHAIN_LIGHTNING_OVERLOAD: (u32, u8) = (45297, 1);
559    ///<https://wowlab.gg/inspect/spell/117014>
560    pub(crate) const ELEMENTAL_BLAST_DAMAGE: (u32, u8) = (117_014, 1);
561    ///<https://wowlab.gg/inspect/spell/120588>
562    pub(crate) const ELEMENTAL_BLAST_OVERLOAD: (u32, u8) = (120_588, 1);
563    ///<https://wowlab.gg/inspect/spell/77478>
564    pub(crate) const EARTHQUAKE_DAMAGE: (u32, u8) = (77478, 1);
565    ///<https://wowlab.gg/inspect/spell/61882>
566    pub(crate) const EARTHQUAKE_TIMING: (u32, u8) = (61882, 2);
567    ///<https://wowlab.gg/inspect/spell/1270064>
568    pub(crate) const FEEDBACK_LOOP_BONUS: (u32, u8) = (1_270_064, 1);
569    ///<https://wowlab.gg/inspect/spell/57984>
570    pub(crate) const FIRE_BLAST_DAMAGE: (u32, u8) = (57984, 1);
571    ///<https://wowlab.gg/inspect/spell/462840>
572    pub(crate) const FUSION_OF_ELEMENTS_BONUS: (u32, u8) = (462_840, 1);
573    ///<https://wowlab.gg/inspect/spell/118297>
574    pub(crate) const IMMOLATE_DAMAGE: (u32, u8) = (118_297, 1);
575    ///<https://wowlab.gg/inspect/spell/118297>
576    pub(crate) const IMMOLATE_PERIODIC_DAMAGE: (u32, u8) = (118_297, 2);
577    ///<https://wowlab.gg/inspect/spell/285466>
578    pub(crate) const LAVA_BURST_OVERLOAD: (u32, u8) = (285_466, 1);
579    ///<https://wowlab.gg/inspect/spell/45284>
580    pub(crate) const LIGHTNING_BOLT_OVERLOAD: (u32, u8) = (45284, 1);
581    ///<https://wowlab.gg/inspect/spell/168534>
582    pub(crate) const MASTERY_DIRECT_DAMAGE: (u32, u8) = (168_534, 3);
583    ///<https://wowlab.gg/inspect/spell/168534>
584    pub(crate) const MASTERY_PERIODIC_DAMAGE: (u32, u8) = (168_534, 4);
585    ///<https://wowlab.gg/inspect/spell/168534>
586    pub(crate) const MASTERY_PET_DAMAGE: (u32, u8) = (168_534, 5);
587    ///<https://wowlab.gg/inspect/spell/117588>
588    pub(crate) const METEOR_DAMAGE: (u32, u8) = (117_588, 1);
589    ///<https://wowlab.gg/inspect/spell/1296625>
590    pub(crate) const MID2_SPENDER_DAMAGE: (u32, u8) = (1_296_625, 1);
591    ///<https://wowlab.gg/inspect/spell/381726>
592    pub(crate) const MOUNTAINS_WILL_FALL_BONUS: (u32, u8) = (381_726, 1);
593    ///<https://wowlab.gg/inspect/spell/269005>
594    pub(crate) const STORMFURY_DAMAGE: (u32, u8) = (269_005, 1);
595    ///<https://wowlab.gg/inspect/spell/1235840>
596    pub(crate) const STORMS_EYE_DAMAGE: (u32, u8) = (1_235_840, 2);
597    ///<https://wowlab.gg/inspect/spell/463351>
598    pub(crate) const TEMPEST_OVERLOAD: (u32, u8) = (463_351, 1);
599    ///<https://wowlab.gg/inspect/spell/157331>
600    pub(crate) const WIND_GUST_DAMAGE: (u32, u8) = (157_331, 1);
601    ///<https://wowlab.gg/inspect/spell/168534>
602    pub(crate) const OVERLOAD_CHANCE: (u32, u8) = (168_534, 1);
603    ///<https://wowlab.gg/inspect/spell/168534>
604    pub(crate) const OVERLOAD_PENALTY: (u32, u8) = (168_534, 2);
605    ///<https://wowlab.gg/inspect/spell/455110>
606    pub(crate) const SUPERCHARGE_CHANCE: (u32, u8) = (455_110, 1);
607    ///<https://wowlab.gg/inspect/spell/273221>
608    pub(crate) const AFTERSHOCK_CHANCE: (u32, u8) = (273_221, 1);
609    ///<https://wowlab.gg/inspect/spell/454009>
610    pub(crate) const TEMPEST_TALENT_CHANCE: (u32, u8) = (454_009, 1);
611    ///<https://wowlab.gg/inspect/spell/455129>
612    pub(crate) const AWAKENING_STORMS_CHANCE: (u32, u8) = (455_129, 3);
613    ///<https://wowlab.gg/inspect/spell/191861>
614    pub(crate) const POWER_OF_THE_MAELSTROM_CHANCE: (u32, u8) = (191_861, 1);
615    ///<https://wowlab.gg/inspect/spell/285452>
616    pub(crate) const LAVA_BURST_DAMAGE: (u32, u8) = (285_452, 1);
617    ///<https://wowlab.gg/inspect/spell/210689>
618    pub(crate) const LIGHTNING_ROD_PERCENT: (u32, u8) = (210_689, 2);
619    ///<https://wowlab.gg/inspect/spell/157375>
620    pub(crate) const STORMFURY_RAMP: (u32, u8) = (157_375, 2);
621    ///<https://wowlab.gg/inspect/spell/191634>
622    pub(crate) const STORMKEEPER_DAMAGE: (u32, u8) = (191_634, 2);
623    ///<https://wowlab.gg/inspect/spell/462866>
624    pub(crate) const ELEMENTAL_UNITY_FIRE: (u32, u8) = (462_866, 1);
625    ///<https://wowlab.gg/inspect/spell/462866>
626    pub(crate) const ELEMENTAL_UNITY_STORM: (u32, u8) = (462_866, 3);
627    ///<https://wowlab.gg/inspect/spell/188592>
628    pub(crate) const FIRE_ELEMENTAL_UNITY: (u32, u8) = (188_592, 4);
629    ///<https://wowlab.gg/inspect/spell/188592>
630    pub(crate) const FIRE_ELEMENTAL_UNITY_PERIODIC: (u32, u8) = (188_592, 5);
631    ///<https://wowlab.gg/inspect/spell/157299>
632    pub(crate) const STORM_ELEMENTAL_UNITY: (u32, u8) = (157_299, 3);
633    ///<https://wowlab.gg/inspect/spell/157299>
634    pub(crate) const STORM_ELEMENTAL_UNITY_PET: (u32, u8) = (157_299, 4);
635    ///<https://wowlab.gg/inspect/spell/462862>
636    pub(crate) const LIGHTNING_CAPACITOR_DAMAGE: (u32, u8) = (462_862, 3);
637    ///<https://wowlab.gg/inspect/spell/382028>
638    pub(crate) const IMPROVED_FLAMETONGUE_DAMAGE: (u32, u8) = (382_028, 1);
639    ///<https://wowlab.gg/inspect/spell/1264762>
640    pub(crate) const STORMWELL_SK_MAELSTROM: (u32, u8) = (1_264_762, 2);
641}
642static REPORTED_SPELLS: &[(&str, u32)] = &[];
643static DECLARED_SPELL_IDS: &[u32] = &[
644    188_196, 188_443, 51505, 8042, 117_014, 61882, 188_389, 196_840, 452_201, 191_634,
645    1_219_480, 443_454, 318_038, 462_757, 192_106, 188_592, 57984, 117_588, 118_297,
646    157_331, 157_348, 269_005, 45284, 45297, 285_466, 120_588, 463_351, 1_235_840,
647    197_568, 462_854, 1_300_219, 1_300_222, 260_734, 77762, 454_015, 1_272_101, 191_877,
648    454_394, 118_522, 173_183, 173_184, 210_689, 1_259_491, 382_027, 319_778, 384_088,
649    263_806, 157_299, 1_239_315, 273_221, 455_096, 114_050, 455_129, 378_255, 462_866,
650    1_270_064, 191_717, 462_840, 1_259_047, 462_862, 16166, 381_726, 191_861, 117_013,
651    443_448, 381_782, 1_264_762, 455_110, 381_707, 454_009, 454_391, 1_259_101, 77478,
652    157_375, 168_534, 285_452, 382_028, 1_296_625, 470_532, 455_089, 447_244, 1_221_347,
653    456_369, 461_242, 458_269,
654];
655static DECLARED_AURA_IDS: &[u32] = &[
656    1_219_480, 191_634, 1_300_219, 1_300_222, 260_734, 77762, 454_015, 1_272_101,
657    191_877, 454_394, 118_522, 173_183, 173_184, 443_454, 188_389, 210_689, 1_259_491,
658    192_106, 462_757, 382_027, 319_778, 384_088, 263_806, 188_592, 157_299, 1_239_315,
659    462_854, 470_532, 455_129, 455_089, 454_015, 454_394, 443_454, 447_244, 443_448,
660    456_369, 461_242, 1_221_347, 458_269,
661];
662static TALENTS: &[(&str, u32)] = &[
663    ("AFTERSHOCK", TALENT::AFTERSHOCK),
664    ("ANCESTRAL_SWIFTNESS", TALENT::ANCESTRAL_SWIFTNESS),
665    ("ARC_DISCHARGE", TALENT::ARC_DISCHARGE),
666    ("ASCENDANCE", TALENT::ASCENDANCE),
667    ("AWAKENING_STORMS", TALENT::AWAKENING_STORMS),
668    ("CALL_OF_FIRE", TALENT::CALL_OF_FIRE),
669    ("ELEMENTAL_BLAST", TALENT::ELEMENTAL_BLAST),
670    ("ELEMENTAL_UNITY", TALENT::ELEMENTAL_UNITY),
671    ("FEEDBACK_LOOP_3", TALENT::FEEDBACK_LOOP_3),
672    ("FIRE_ELEMENTAL", TALENT::FIRE_ELEMENTAL),
673    ("FLAMETONGUE_WEAPON", TALENT::FLAMETONGUE_WEAPON),
674    ("FURY_OF_THE_STORMS", TALENT::FURY_OF_THE_STORMS),
675    ("FUSION_OF_ELEMENTS", TALENT::FUSION_OF_ELEMENTS),
676    ("INFERNO_ARC", TALENT::INFERNO_ARC),
677    ("LIGHTNING_CAPACITOR", TALENT::LIGHTNING_CAPACITOR),
678    ("LIGHTNING_ROD", TALENT::LIGHTNING_ROD),
679    ("MASTER_OF_THE_ELEMENTS", TALENT::MASTER_OF_THE_ELEMENTS),
680    ("MOUNTAINS_WILL_FALL", TALENT::MOUNTAINS_WILL_FALL),
681    ("POWER_OF_THE_MAELSTROM", TALENT::POWER_OF_THE_MAELSTROM),
682    ("PRIMAL_ELEMENTALIST", TALENT::PRIMAL_ELEMENTALIST),
683    ("PRIMORDIAL_CAPACITY", TALENT::PRIMORDIAL_CAPACITY),
684    ("SEARING_FLAMES", TALENT::SEARING_FLAMES),
685    ("STORMKEEPER", TALENT::STORMKEEPER),
686    ("STORMWELL", TALENT::STORMWELL),
687    ("STORM_ELEMENTAL", TALENT::STORM_ELEMENTAL),
688    ("SUPERCHARGE", TALENT::SUPERCHARGE),
689    ("SWELLING_MAELSTROM", TALENT::SWELLING_MAELSTROM),
690    ("TEMPEST_TALENT", TALENT::TEMPEST_TALENT),
691    ("THUNDERSTRIKE_WARD", TALENT::THUNDERSTRIKE_WARD),
692    ("UNLIMITED_POWER", TALENT::UNLIMITED_POWER),
693    ("VOLTAIC_BLAZE", TALENT::VOLTAIC_BLAZE),
694];
695pub(crate) mod ELEMENTAL_SHAMAN {
696    pub(crate) const LIGHTNING_BOLT_CASTS: u32 = 0;
697    pub(crate) const LAVA_BURST_CASTS: u32 = 1;
698    pub(crate) const EARTH_SHOCK_CASTS: u32 = 2;
699    pub(crate) const ELEMENTAL_BLAST_CASTS: u32 = 3;
700    pub(crate) const STORMKEEPER_CASTS: u32 = 4;
701    pub(crate) const ASCENDANCE_CASTS: u32 = 5;
702    pub(crate) const FLAME_SHOCK_UPTIME_MS: u32 = 6;
703    pub(crate) const TEMPEST_CASTS: u32 = 7;
704}
705fn aura_ascendance(
706    a: AuraDefinitionDraft,
707    data: &ResolvedGameData,
708) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
709    Ok(
710        a
711            .on_player()
712            .apply_base_from_data(data, 1_219_480)?
713            .max_stacks(
714                data
715                    .require_aura_max_stacks(
716                        wowlab_types::sim::SpellIdx::from_raw(1_219_480),
717                    )?,
718            )
719            .damage_percent_spells(
720                data.base_points(wowlab_types::sim::SpellIdx::from_raw(1_219_480), 8),
721                &[45284, 45297, 285_466, 120_588, 463_351],
722            )?
723            .on_expire(crate::hooks::elemental_shaman::ascendance_expire_hook),
724    )
725}
726fn aura_stormkeeper(
727    a: AuraDefinitionDraft,
728    data: &ResolvedGameData,
729) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
730    Ok(
731        a
732            .on_player()
733            .apply_base_from_data(data, 191_634)?
734            .max_stacks(
735                wowlab_engine_combat::validated_max_stacks(
736                    1.0,
737                    191_634,
738                    "aura.max_stacks",
739                )?,
740            )
741            .on_expire(crate::hooks::elemental_shaman::stormkeeper_expire_hook),
742    )
743}
744fn aura_flowing_elements(
745    a: AuraDefinitionDraft,
746    data: &ResolvedGameData,
747) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
748    a.on_player()
749        .apply_base_from_data(data, 1_300_219)?
750        .max_stacks(
751            wowlab_engine_combat::validated_max_stacks(
752                4.0,
753                1_300_219,
754                "aura.max_stacks",
755            )?,
756        )
757        .damage_percent_spells(
758            data.base_points(wowlab_types::sim::SpellIdx::from_raw(1_300_219), 1),
759            &[188_196, 188_443, 51505],
760        )
761}
762fn aura_overcharge_tier(
763    a: AuraDefinitionDraft,
764    data: &ResolvedGameData,
765) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
766    a.on_player()
767        .apply_base_from_data(data, 1_300_222)?
768        .max_stacks(
769            data
770                .require_aura_max_stacks(
771                    wowlab_types::sim::SpellIdx::from_raw(1_300_222),
772                )?,
773        )
774        .spell_cost_percent(
775            data.base_points(wowlab_types::sim::SpellIdx::from_raw(1_300_222), 1),
776            &[8042, 117_014, 61882],
777        )
778}
779fn aura_master_of_the_elements(
780    a: AuraDefinitionDraft,
781    data: &ResolvedGameData,
782) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
783    a.on_player()
784        .apply_base_from_data(data, 260_734)?
785        .max_stacks(
786            data.require_aura_max_stacks(wowlab_types::sim::SpellIdx::from_raw(260_734))?,
787        )
788        .damage_multiplier(
789            ((data.base_points(wowlab_types::sim::SpellIdx::from_raw(16166), 2)) * 0.01)
790                + 1.0,
791        )
792}
793fn aura_lava_surge(
794    a: AuraDefinitionDraft,
795    data: &ResolvedGameData,
796) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
797    Ok(
798        a
799            .on_player()
800            .apply_base_from_data(data, 77762)?
801            .max_stacks(
802                data
803                    .require_aura_max_stacks(
804                        wowlab_types::sim::SpellIdx::from_raw(77762),
805                    )?,
806            ),
807    )
808}
809fn aura_tempest(
810    a: AuraDefinitionDraft,
811    data: &ResolvedGameData,
812) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
813    Ok(
814        a
815            .on_player()
816            .apply_base_from_data(data, 454_015)?
817            .max_stacks(
818                data
819                    .require_aura_max_stacks(
820                        wowlab_types::sim::SpellIdx::from_raw(454_015),
821                    )?,
822            ),
823    )
824}
825fn aura_thunderous_velocity(
826    a: AuraDefinitionDraft,
827    data: &ResolvedGameData,
828) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
829    Ok(
830        a
831            .on_player()
832            .apply_base_from_data(data, 1_272_101)?
833            .max_stacks(
834                data
835                    .require_aura_max_stacks(
836                        wowlab_types::sim::SpellIdx::from_raw(1_272_101),
837                    )?,
838            ),
839    )
840}
841fn aura_power_of_the_maelstrom(
842    a: AuraDefinitionDraft,
843    data: &ResolvedGameData,
844) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
845    Ok(
846        a
847            .on_player()
848            .apply_base_from_data(data, 191_877)?
849            .max_stacks(
850                data
851                    .require_aura_max_stacks(
852                        wowlab_types::sim::SpellIdx::from_raw(191_877),
853                    )?,
854            ),
855    )
856}
857fn aura_unlimited_power(
858    a: AuraDefinitionDraft,
859    data: &ResolvedGameData,
860) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
861    Ok(
862        a
863            .on_player()
864            .apply_base_from_data(data, 454_394)?
865            .max_stacks(
866                data
867                    .require_aura_max_stacks(
868                        wowlab_types::sim::SpellIdx::from_raw(454_394),
869                    )?,
870            ),
871    )
872}
873fn aura_elemental_blast_crit(
874    a: AuraDefinitionDraft,
875    data: &ResolvedGameData,
876) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
877    Ok(
878        a
879            .on_player()
880            .apply_base_from_data(data, 118_522)?
881            .max_stacks(
882                data
883                    .require_aura_max_stacks(
884                        wowlab_types::sim::SpellIdx::from_raw(118_522),
885                    )?,
886            ),
887    )
888}
889fn aura_elemental_blast_haste(
890    a: AuraDefinitionDraft,
891    data: &ResolvedGameData,
892) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
893    Ok(
894        a
895            .on_player()
896            .apply_base_from_data(data, 173_183)?
897            .max_stacks(
898                data
899                    .require_aura_max_stacks(
900                        wowlab_types::sim::SpellIdx::from_raw(173_183),
901                    )?,
902            ),
903    )
904}
905fn aura_elemental_blast_mastery(
906    a: AuraDefinitionDraft,
907    data: &ResolvedGameData,
908) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
909    Ok(
910        a
911            .on_player()
912            .apply_base_from_data(data, 173_184)?
913            .max_stacks(
914                data
915                    .require_aura_max_stacks(
916                        wowlab_types::sim::SpellIdx::from_raw(173_184),
917                    )?,
918            ),
919    )
920}
921fn aura_ancestral_swiftness(
922    a: AuraDefinitionDraft,
923    data: &ResolvedGameData,
924) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
925    Ok(
926        a
927            .on_player()
928            .apply_base_from_data(data, 443_454)?
929            .max_stacks(
930                data
931                    .require_aura_max_stacks(
932                        wowlab_types::sim::SpellIdx::from_raw(443_454),
933                    )?,
934            ),
935    )
936}
937fn aura_flame_shock(
938    a: AuraDefinitionDraft,
939    data: &ResolvedGameData,
940) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
941    a.on_target()
942        .apply_base_from_data(data, 188_389)?
943        .max_stacks(
944            data.require_aura_max_stacks(wowlab_types::sim::SpellIdx::from_raw(188_389))?,
945        )
946        .crit_chance_spells(100.0, &[51505, 285_466])
947}
948fn aura_lightning_rod(
949    a: AuraDefinitionDraft,
950    data: &ResolvedGameData,
951) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
952    Ok(
953        a
954            .on_target()
955            .apply_base_from_data(data, 210_689)?
956            .max_stacks(
957                data
958                    .require_aura_max_stacks(
959                        wowlab_types::sim::SpellIdx::from_raw(210_689),
960                    )?,
961            ),
962    )
963}
964fn aura_purging_flames(
965    a: AuraDefinitionDraft,
966    data: &ResolvedGameData,
967) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
968    Ok(
969        a
970            .on_player()
971            .apply_base_from_data(data, 1_259_491)?
972            .max_stacks(
973                data
974                    .require_aura_max_stacks(
975                        wowlab_types::sim::SpellIdx::from_raw(1_259_491),
976                    )?,
977            ),
978    )
979}
980fn aura_lightning_shield(
981    a: AuraDefinitionDraft,
982    data: &ResolvedGameData,
983) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
984    a.on_player()
985        .apply_base_from_data(data, 192_106)?
986        .max_stacks(
987            data.require_aura_max_stacks(wowlab_types::sim::SpellIdx::from_raw(192_106))?,
988        )
989        .primary_pct_per_stack(
990            data.base_points(wowlab_types::sim::SpellIdx::from_raw(192_106), 4),
991        )
992}
993fn aura_thunderstrike_ward(
994    a: AuraDefinitionDraft,
995    data: &ResolvedGameData,
996) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
997    Ok(
998        a
999            .on_player()
1000            .apply_base_from_data(data, 462_757)?
1001            .max_stacks(
1002                data
1003                    .require_aura_max_stacks(
1004                        wowlab_types::sim::SpellIdx::from_raw(462_757),
1005                    )?,
1006            ),
1007    )
1008}
1009fn aura_improved_flametongue_weapon(
1010    a: AuraDefinitionDraft,
1011    data: &ResolvedGameData,
1012) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1013    Ok(
1014        a
1015            .on_player()
1016            .apply_base_from_data(data, 382_027)?
1017            .max_stacks(
1018                data
1019                    .require_aura_max_stacks(
1020                        wowlab_types::sim::SpellIdx::from_raw(382_027),
1021                    )?,
1022            ),
1023    )
1024}
1025fn aura_flametongue_weapon(
1026    a: AuraDefinitionDraft,
1027    data: &ResolvedGameData,
1028) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1029    Ok(
1030        a
1031            .on_player()
1032            .apply_base_from_data(data, 319_778)?
1033            .max_stacks(
1034                data
1035                    .require_aura_max_stacks(
1036                        wowlab_types::sim::SpellIdx::from_raw(319_778),
1037                    )?,
1038            ),
1039    )
1040}
1041fn aura_echoes_of_great_sundering(
1042    a: AuraDefinitionDraft,
1043    data: &ResolvedGameData,
1044) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1045    Ok(
1046        a
1047            .on_player()
1048            .apply_base_from_data(data, 384_088)?
1049            .max_stacks(
1050                data
1051                    .require_aura_max_stacks(
1052                        wowlab_types::sim::SpellIdx::from_raw(384_088),
1053                    )?,
1054            ),
1055    )
1056}
1057fn aura_wind_gust(
1058    a: AuraDefinitionDraft,
1059    data: &ResolvedGameData,
1060) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1061    Ok(
1062        a
1063            .on_player()
1064            .apply_base_from_data(data, 263_806)?
1065            .max_stacks(
1066                data
1067                    .require_aura_max_stacks(
1068                        wowlab_types::sim::SpellIdx::from_raw(263_806),
1069                    )?,
1070            ),
1071    )
1072}
1073fn aura_fire_elemental(
1074    a: AuraDefinitionDraft,
1075    data: &ResolvedGameData,
1076) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1077    Ok(
1078        a
1079            .on_player()
1080            .apply_base_from_data(data, 188_592)?
1081            .max_stacks(
1082                data
1083                    .require_aura_max_stacks(
1084                        wowlab_types::sim::SpellIdx::from_raw(188_592),
1085                    )?,
1086            ),
1087    )
1088}
1089fn aura_storm_elemental(
1090    a: AuraDefinitionDraft,
1091    data: &ResolvedGameData,
1092) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1093    a.on_player()
1094        .duration_ms(
1095            wowlab_engine_combat::validated_milliseconds(
1096                (((f64::from(
1097                    data
1098                        .require_aura_duration_ms(
1099                            wowlab_types::sim::SpellIdx::from_raw(157_299),
1100                        )?,
1101                )) * 1.028_571_428_571_428_5) * 1.0)
1102                    .round() / 1.0,
1103                157_299,
1104                "aura.duration_ms",
1105            )?,
1106        )
1107        .apply_periodic_effect_from_data(data, 157_299)?
1108        .apply_duration_behavior_from_data(data, 157_299)?
1109        .apply_timing_modifiers_from_data(data, 157_299)?
1110        .max_stacks(
1111            data.require_aura_max_stacks(wowlab_types::sim::SpellIdx::from_raw(157_299))?,
1112        )
1113        .apply_periodic_behavior_from_data(data, 157_299)
1114}
1115fn aura_storms_eye(
1116    a: AuraDefinitionDraft,
1117    data: &ResolvedGameData,
1118) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1119    Ok(
1120        a
1121            .on_player()
1122            .apply_base_from_data(data, 1_239_315)?
1123            .max_stacks(
1124                data
1125                    .require_aura_max_stacks(
1126                        wowlab_types::sim::SpellIdx::from_raw(1_239_315),
1127                    )?,
1128            ),
1129    )
1130}
1131fn aura_skyfury_highlight(
1132    a: AuraDefinitionDraft,
1133    data: &ResolvedGameData,
1134) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1135    Ok(
1136        a
1137            .on_player()
1138            .apply_base_from_data(data, 462_854)?
1139            .max_stacks(
1140                data
1141                    .require_aura_max_stacks(
1142                        wowlab_types::sim::SpellIdx::from_raw(462_854),
1143                    )?,
1144            ),
1145    )
1146}
1147fn spell_lightning_bolt(
1148    s: SpellDefinitionDraft,
1149    data: &ResolvedGameData,
1150) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1151    Ok(
1152        s
1153            .apply_base_from_data(data, 188_196)?
1154            .gain(6.0)
1155            .apply_aoe_from_data(data)
1156            .on_cast(crate::hooks::elemental_shaman::lightning_bolt_hook),
1157    )
1158}
1159fn spell_chain_lightning(
1160    s: SpellDefinitionDraft,
1161    data: &ResolvedGameData,
1162) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1163    Ok(
1164        s
1165            .apply_base_from_data(data, 188_443)?
1166            .gain(2.0)
1167            .apply_aoe_from_data(data)
1168            .on_cast(crate::hooks::elemental_shaman::chain_lightning_hook),
1169    )
1170}
1171fn spell_lava_burst(
1172    s: SpellDefinitionDraft,
1173    data: &ResolvedGameData,
1174) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1175    Ok(
1176        s
1177            .apply_base_from_data(data, 51505)?
1178            .apply_aoe_from_data(data)
1179            .on_cast(crate::hooks::elemental_shaman::lava_burst_hook),
1180    )
1181}
1182fn spell_earth_shock(
1183    s: SpellDefinitionDraft,
1184    data: &ResolvedGameData,
1185) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1186    Ok(
1187        s
1188            .apply_base_from_data(data, 8042)?
1189            .apply_aoe_from_data(data)
1190            .on_cast(crate::hooks::elemental_shaman::earth_shock_hook),
1191    )
1192}
1193fn spell_elemental_blast(
1194    s: SpellDefinitionDraft,
1195    data: &ResolvedGameData,
1196) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1197    Ok(
1198        s
1199            .apply_base_from_data(data, 117_014)?
1200            .apply_aoe_from_data(data)
1201            .on_cast(crate::hooks::elemental_shaman::elemental_blast_hook)
1202            .cost_free_when_aura(443_454),
1203    )
1204}
1205fn spell_earthquake(
1206    s: SpellDefinitionDraft,
1207    data: &ResolvedGameData,
1208) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1209    Ok(
1210        s
1211            .apply_base_from_data(data, 61882)?
1212            .apply_aoe_from_data(data)
1213            .on_cast(crate::hooks::elemental_shaman::earthquake_hook),
1214    )
1215}
1216fn spell_flame_shock(
1217    s: SpellDefinitionDraft,
1218    data: &ResolvedGameData,
1219) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1220    Ok(
1221        s
1222            .apply_base_from_data(data, 188_389)?
1223            .gain(3.0)
1224            .applies_inferred_aura(AURA_FLAME_SHOCK, 188_389)
1225            .apply_aoe_from_data(data),
1226    )
1227}
1228fn spell_frost_shock(
1229    s: SpellDefinitionDraft,
1230    data: &ResolvedGameData,
1231) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1232    Ok(s.apply_base_from_data(data, 196_840)?.apply_aoe_from_data(data))
1233}
1234fn spell_tempest(
1235    s: SpellDefinitionDraft,
1236    data: &ResolvedGameData,
1237) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1238    Ok(
1239        s
1240            .apply_base_from_data(data, 452_201)?
1241            .apply_aoe_from_data(data)
1242            .on_cast(crate::hooks::elemental_shaman::tempest_hook),
1243    )
1244}
1245fn spell_stormkeeper(
1246    s: SpellDefinitionDraft,
1247    data: &ResolvedGameData,
1248) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1249    Ok(
1250        s
1251            .apply_base_from_data(data, 191_634)?
1252            .cast_time(
1253                wowlab_engine_combat::validated_milliseconds(
1254                    0.0,
1255                    191_634,
1256                    "spell.cast_time_ms",
1257                )?,
1258            )
1259            .gain(10.0)
1260            .applies_inferred_aura(AURA_STORMKEEPER, 191_634)
1261            .apply_aoe_from_data(data)
1262            .on_cast(crate::hooks::elemental_shaman::stormkeeper_hook),
1263    )
1264}
1265fn spell_ascendance(
1266    s: SpellDefinitionDraft,
1267    data: &ResolvedGameData,
1268) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1269    Ok(
1270        s
1271            .apply_base_from_data(data, 1_219_480)?
1272            .applies_inferred_aura(AURA_ASCENDANCE, 1_219_480)
1273            .apply_aoe_from_data(data)
1274            .on_cast(crate::hooks::elemental_shaman::ascendance_hook),
1275    )
1276}
1277fn spell_ancestral_swiftness(
1278    s: SpellDefinitionDraft,
1279    data: &ResolvedGameData,
1280) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1281    Ok(
1282        s
1283            .apply_base_from_data(data, 443_454)?
1284            .applies_inferred_aura(AURA_ANCESTRAL_SWIFTNESS, 443_454)
1285            .apply_aoe_from_data(data),
1286    )
1287}
1288fn spell_flametongue_weapon(
1289    s: SpellDefinitionDraft,
1290    data: &ResolvedGameData,
1291) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1292    Ok(
1293        s
1294            .apply_base_from_data(data, 318_038)?
1295            .applies_aura(AURA_FLAMETONGUE_WEAPON)
1296            .apply_aoe_from_data(data),
1297    )
1298}
1299fn spell_thunderstrike_ward(
1300    s: SpellDefinitionDraft,
1301    data: &ResolvedGameData,
1302) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1303    Ok(
1304        s
1305            .apply_base_from_data(data, 462_757)?
1306            .applies_inferred_aura(AURA_THUNDERSTRIKE_WARD, 462_757)
1307            .apply_aoe_from_data(data),
1308    )
1309}
1310fn spell_lightning_shield(
1311    s: SpellDefinitionDraft,
1312    data: &ResolvedGameData,
1313) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1314    Ok(
1315        s
1316            .apply_base_from_data(data, 192_106)?
1317            .applies_inferred_aura(AURA_LIGHTNING_SHIELD, 192_106)
1318            .apply_aoe_from_data(data),
1319    )
1320}
1321fn spell_fire_elemental(
1322    s: SpellDefinitionDraft,
1323    data: &ResolvedGameData,
1324) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1325    Ok(
1326        s
1327            .apply_base_from_data(data, 188_592)?
1328            .applies_inferred_aura(AURA_FIRE_ELEMENTAL, 188_592)
1329            .apply_aoe_from_data(data),
1330    )
1331}
1332fn spell_fire_blast(
1333    s: SpellDefinitionDraft,
1334    data: &ResolvedGameData,
1335) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1336    Ok(s.apply_base_from_data(data, 57984)?.apply_aoe_from_data(data))
1337}
1338fn spell_meteor(
1339    s: SpellDefinitionDraft,
1340    data: &ResolvedGameData,
1341) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1342    Ok(s.apply_base_from_data(data, 117_588)?.apply_aoe_from_data(data))
1343}
1344fn spell_immolate(
1345    s: SpellDefinitionDraft,
1346    data: &ResolvedGameData,
1347) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1348    Ok(s.apply_base_from_data(data, 118_297)?.apply_aoe_from_data(data))
1349}
1350fn spell_wind_gust(
1351    s: SpellDefinitionDraft,
1352    data: &ResolvedGameData,
1353) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1354    Ok(s.apply_base_from_data(data, 157_331)?.apply_aoe_from_data(data))
1355}
1356fn spell_call_lightning(
1357    s: SpellDefinitionDraft,
1358    data: &ResolvedGameData,
1359) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1360    Ok(s.apply_base_from_data(data, 157_348)?.apply_aoe_from_data(data))
1361}
1362fn spell_stormfury(
1363    s: SpellDefinitionDraft,
1364    data: &ResolvedGameData,
1365) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1366    Ok(s.apply_base_from_data(data, 269_005)?.apply_aoe_from_data(data))
1367}
1368fn spell_lightning_bolt_overload(
1369    s: SpellDefinitionDraft,
1370    data: &ResolvedGameData,
1371) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1372    Ok(s.apply_base_from_data(data, 45284)?.apply_aoe_from_data(data))
1373}
1374fn spell_chain_lightning_overload(
1375    s: SpellDefinitionDraft,
1376    data: &ResolvedGameData,
1377) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1378    Ok(s.apply_base_from_data(data, 45297)?.apply_aoe_from_data(data))
1379}
1380fn spell_lava_burst_overload(
1381    s: SpellDefinitionDraft,
1382    data: &ResolvedGameData,
1383) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1384    Ok(s.apply_base_from_data(data, 285_466)?.apply_aoe_from_data(data))
1385}
1386fn spell_elemental_blast_overload(
1387    s: SpellDefinitionDraft,
1388    data: &ResolvedGameData,
1389) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1390    Ok(s.apply_base_from_data(data, 120_588)?.apply_aoe_from_data(data))
1391}
1392fn spell_tempest_overload(
1393    s: SpellDefinitionDraft,
1394    data: &ResolvedGameData,
1395) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1396    Ok(s.apply_base_from_data(data, 463_351)?.apply_aoe_from_data(data))
1397}
1398fn spell_storms_eye(
1399    s: SpellDefinitionDraft,
1400    data: &ResolvedGameData,
1401) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1402    Ok(
1403        s
1404            .apply_base_from_data(data, 1_235_840)?
1405            .applies_inferred_aura(AURA_STORMS_EYE, 1_239_315)
1406            .apply_aoe_from_data(data),
1407    )
1408}
1409fn spell_lightning_rod_damage(
1410    s: SpellDefinitionDraft,
1411    data: &ResolvedGameData,
1412) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1413    Ok(s.apply_base_from_data(data, 197_568)?.apply_aoe_from_data(data))
1414}
1415fn spell_skyfury(
1416    s: SpellDefinitionDraft,
1417    data: &ResolvedGameData,
1418) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1419    Ok(
1420        s
1421            .apply_base_from_data(data, 462_854)?
1422            .without_data_damage()
1423            .applies_aura(AURA_SKYFURY_HIGHLIGHT)
1424            .apply_aoe_from_data(data),
1425    )
1426}
1427pub(crate) fn build_combat_system_draft(
1428    params: &wowlab_engine_ports::HandlerParams<'_>,
1429) -> Result<CombatSystemDraft, wowlab_engine_ports::EngineError> {
1430    let builder = CombatSystemBuilder::new(params.stats.clone())
1431        .spec_id(SpecId::Elemental)
1432        .spec_identity(
1433            wowlab_engine_combat::generated_identities::specs::elemental_shaman::PROOF,
1434        )
1435        .hero_talent_trees(DECLARED_METADATA.hero_talent_trees)
1436        .effect_identities(
1437            wowlab_engine_combat::generated_identities::specs::elemental_shaman::damage::ALL,
1438        )
1439        .effect_identities(wowlab_engine_combat::generated_identities::shared::ALL)
1440        .mastery_spell(168_534)
1441        .mastery_hook(crate::hooks::elemental_shaman::mastery)
1442        .resource(
1443            "maelstrom",
1444            params
1445                .game_data
1446                .power_max(11)
1447                .ok_or_else(|| {
1448                    wowlab_engine_ports::EngineError::spec_construction(
1449                        "missing power-type power_max for type_id 11",
1450                    )
1451                })?,
1452            params
1453                .game_data
1454                .power_regen_for_max(
1455                    11,
1456                    params
1457                        .game_data
1458                        .power_max(11)
1459                        .ok_or_else(|| {
1460                            wowlab_engine_ports::EngineError::spec_construction(
1461                                "missing power-type power_max for type_id 11",
1462                            )
1463                        })?,
1464                )
1465                .ok_or_else(|| {
1466                    wowlab_engine_ports::EngineError::spec_construction(
1467                        "missing power-type power_regen_for_max for type_id 11",
1468                    )
1469                })?,
1470        )
1471        .resource_type_id(11)
1472        .resource_start(
1473            params
1474                .game_data
1475                .power_default(11)
1476                .ok_or_else(|| {
1477                    wowlab_engine_ports::EngineError::spec_construction(
1478                        "missing power-type power_default for type_id 11",
1479                    )
1480                })?,
1481        )
1482        .aura("ascendance", AURA::ASCENDANCE, |a| aura_ascendance(a, &params.game_data))
1483        .aura(
1484            "stormkeeper",
1485            AURA::STORMKEEPER,
1486            |a| aura_stormkeeper(a, &params.game_data),
1487        )
1488        .aura(
1489            "flowing_elements",
1490            AURA::FLOWING_ELEMENTS,
1491            |a| aura_flowing_elements(a, &params.game_data),
1492        )
1493        .aura(
1494            "overcharge_tier",
1495            AURA::OVERCHARGE_TIER,
1496            |a| aura_overcharge_tier(a, &params.game_data),
1497        )
1498        .aura(
1499            "master_of_the_elements",
1500            AURA::MASTER_OF_THE_ELEMENTS,
1501            |a| aura_master_of_the_elements(a, &params.game_data),
1502        )
1503        .aura("lava_surge", AURA::LAVA_SURGE, |a| aura_lava_surge(a, &params.game_data))
1504        .aura("tempest", AURA::TEMPEST, |a| aura_tempest(a, &params.game_data))
1505        .aura(
1506            "thunderous_velocity",
1507            AURA::THUNDEROUS_VELOCITY,
1508            |a| aura_thunderous_velocity(a, &params.game_data),
1509        )
1510        .aura(
1511            "power_of_the_maelstrom",
1512            AURA::POWER_OF_THE_MAELSTROM,
1513            |a| aura_power_of_the_maelstrom(a, &params.game_data),
1514        )
1515        .aura(
1516            "unlimited_power",
1517            AURA::UNLIMITED_POWER,
1518            |a| aura_unlimited_power(a, &params.game_data),
1519        )
1520        .aura(
1521            "elemental_blast_crit",
1522            AURA::ELEMENTAL_BLAST_CRIT,
1523            |a| aura_elemental_blast_crit(a, &params.game_data),
1524        )
1525        .aura(
1526            "elemental_blast_haste",
1527            AURA::ELEMENTAL_BLAST_HASTE,
1528            |a| aura_elemental_blast_haste(a, &params.game_data),
1529        )
1530        .aura(
1531            "elemental_blast_mastery",
1532            AURA::ELEMENTAL_BLAST_MASTERY,
1533            |a| aura_elemental_blast_mastery(a, &params.game_data),
1534        )
1535        .aura(
1536            "ancestral_swiftness",
1537            AURA::ANCESTRAL_SWIFTNESS,
1538            |a| aura_ancestral_swiftness(a, &params.game_data),
1539        )
1540        .aura(
1541            "flame_shock",
1542            AURA::FLAME_SHOCK,
1543            |a| aura_flame_shock(a, &params.game_data),
1544        )
1545        .aura(
1546            "lightning_rod",
1547            AURA::LIGHTNING_ROD,
1548            |a| aura_lightning_rod(a, &params.game_data),
1549        )
1550        .aura(
1551            "purging_flames",
1552            AURA::PURGING_FLAMES,
1553            |a| aura_purging_flames(a, &params.game_data),
1554        )
1555        .aura(
1556            "lightning_shield",
1557            AURA::LIGHTNING_SHIELD,
1558            |a| aura_lightning_shield(a, &params.game_data),
1559        )
1560        .aura(
1561            "thunderstrike_ward",
1562            AURA::THUNDERSTRIKE_WARD,
1563            |a| aura_thunderstrike_ward(a, &params.game_data),
1564        )
1565        .aura(
1566            "improved_flametongue_weapon",
1567            AURA::IMPROVED_FLAMETONGUE_WEAPON,
1568            |a| aura_improved_flametongue_weapon(a, &params.game_data),
1569        )
1570        .aura(
1571            "flametongue_weapon",
1572            AURA::FLAMETONGUE_WEAPON,
1573            |a| aura_flametongue_weapon(a, &params.game_data),
1574        )
1575        .aura(
1576            "echoes_of_great_sundering",
1577            AURA::ECHOES_OF_GREAT_SUNDERING,
1578            |a| aura_echoes_of_great_sundering(a, &params.game_data),
1579        )
1580        .aura("wind_gust", AURA::WIND_GUST, |a| aura_wind_gust(a, &params.game_data))
1581        .aura(
1582            "fire_elemental",
1583            AURA::FIRE_ELEMENTAL,
1584            |a| aura_fire_elemental(a, &params.game_data),
1585        )
1586        .aura(
1587            "storm_elemental",
1588            AURA::STORM_ELEMENTAL,
1589            |a| aura_storm_elemental(a, &params.game_data),
1590        )
1591        .aura("storms_eye", AURA::STORMS_EYE, |a| aura_storms_eye(a, &params.game_data))
1592        .aura(
1593            "skyfury_highlight",
1594            AURA::SKYFURY_HIGHLIGHT,
1595            |a| aura_skyfury_highlight(a, &params.game_data),
1596        )
1597        .spell(
1598            "lightning_bolt",
1599            SPELL::LIGHTNING_BOLT,
1600            |s| spell_lightning_bolt(s, &params.game_data),
1601        )
1602        .spell(
1603            "chain_lightning",
1604            SPELL::CHAIN_LIGHTNING,
1605            |s| spell_chain_lightning(s, &params.game_data),
1606        )
1607        .spell(
1608            "lava_burst",
1609            SPELL::LAVA_BURST,
1610            |s| spell_lava_burst(s, &params.game_data),
1611        )
1612        .spell(
1613            "earth_shock",
1614            SPELL::EARTH_SHOCK,
1615            |s| spell_earth_shock(s, &params.game_data),
1616        )
1617        .spell(
1618            "elemental_blast",
1619            SPELL::ELEMENTAL_BLAST,
1620            |s| spell_elemental_blast(s, &params.game_data),
1621        )
1622        .spell(
1623            "earthquake",
1624            SPELL::EARTHQUAKE,
1625            |s| spell_earthquake(s, &params.game_data),
1626        )
1627        .spell(
1628            "flame_shock",
1629            SPELL::FLAME_SHOCK,
1630            |s| spell_flame_shock(s, &params.game_data),
1631        )
1632        .spell(
1633            "frost_shock",
1634            SPELL::FROST_SHOCK,
1635            |s| spell_frost_shock(s, &params.game_data),
1636        )
1637        .spell("tempest", SPELL::TEMPEST, |s| spell_tempest(s, &params.game_data))
1638        .spell(
1639            "stormkeeper",
1640            SPELL::STORMKEEPER,
1641            |s| spell_stormkeeper(s, &params.game_data),
1642        )
1643        .spell(
1644            "ascendance",
1645            SPELL::ASCENDANCE,
1646            |s| spell_ascendance(s, &params.game_data),
1647        )
1648        .spell(
1649            "ancestral_swiftness",
1650            SPELL::ANCESTRAL_SWIFTNESS,
1651            |s| spell_ancestral_swiftness(s, &params.game_data),
1652        )
1653        .spell(
1654            "flametongue_weapon",
1655            SPELL::FLAMETONGUE_WEAPON,
1656            |s| spell_flametongue_weapon(s, &params.game_data),
1657        )
1658        .spell(
1659            "thunderstrike_ward",
1660            SPELL::THUNDERSTRIKE_WARD,
1661            |s| spell_thunderstrike_ward(s, &params.game_data),
1662        )
1663        .spell(
1664            "lightning_shield",
1665            SPELL::LIGHTNING_SHIELD,
1666            |s| spell_lightning_shield(s, &params.game_data),
1667        )
1668        .spell(
1669            "fire_elemental",
1670            SPELL::FIRE_ELEMENTAL,
1671            |s| spell_fire_elemental(s, &params.game_data),
1672        )
1673        .spell(
1674            "fire_blast",
1675            SPELL::FIRE_BLAST,
1676            |s| spell_fire_blast(s, &params.game_data),
1677        )
1678        .spell("meteor", SPELL::METEOR, |s| spell_meteor(s, &params.game_data))
1679        .spell("immolate", SPELL::IMMOLATE, |s| spell_immolate(s, &params.game_data))
1680        .spell("wind_gust", SPELL::WIND_GUST, |s| spell_wind_gust(s, &params.game_data))
1681        .spell(
1682            "call_lightning",
1683            SPELL::CALL_LIGHTNING,
1684            |s| spell_call_lightning(s, &params.game_data),
1685        )
1686        .spell("stormfury", SPELL::STORMFURY, |s| spell_stormfury(s, &params.game_data))
1687        .spell(
1688            "lightning_bolt_overload",
1689            SPELL::LIGHTNING_BOLT_OVERLOAD,
1690            |s| spell_lightning_bolt_overload(s, &params.game_data),
1691        )
1692        .spell(
1693            "chain_lightning_overload",
1694            SPELL::CHAIN_LIGHTNING_OVERLOAD,
1695            |s| spell_chain_lightning_overload(s, &params.game_data),
1696        )
1697        .spell(
1698            "lava_burst_overload",
1699            SPELL::LAVA_BURST_OVERLOAD,
1700            |s| spell_lava_burst_overload(s, &params.game_data),
1701        )
1702        .spell(
1703            "elemental_blast_overload",
1704            SPELL::ELEMENTAL_BLAST_OVERLOAD,
1705            |s| spell_elemental_blast_overload(s, &params.game_data),
1706        )
1707        .spell(
1708            "tempest_overload",
1709            SPELL::TEMPEST_OVERLOAD,
1710            |s| spell_tempest_overload(s, &params.game_data),
1711        )
1712        .spell(
1713            "storms_eye",
1714            SPELL::STORMS_EYE,
1715            |s| spell_storms_eye(s, &params.game_data),
1716        )
1717        .spell(
1718            "lightning_rod_damage",
1719            SPELL::LIGHTNING_ROD_DAMAGE,
1720            |s| spell_lightning_rod_damage(s, &params.game_data),
1721        )
1722        .spell("skyfury", SPELL::SKYFURY, |s| spell_skyfury(s, &params.game_data))
1723        .game_data(params.game_data.clone())
1724        .talent_spell_ids(TALENTS)
1725        .talent_selections(params.talent_selections)
1726        .set_bonus_auras(params.set_bonus_auras)
1727        .encounter(params.encounter.clone());
1728    let builder = crate::generated::items::register_equipped(
1729        builder,
1730        &params.game_data,
1731        params.equipped_items,
1732    )?;
1733
1734    builder.into_draft()
1735}
1736fn new_handler(
1737    params: wowlab_engine_ports::HandlerParams<'_>,
1738) -> Result<Box<dyn SpecHandler>, wowlab_engine_ports::EngineError> {
1739    let handler = crate::composition::compose_handler(
1740        build_combat_system_draft,
1741        &params,
1742        crate::hooks::elemental_shaman::ElementalHandler::new,
1743    )?;
1744
1745    Ok(Box::new(handler))
1746}
1747static DECLARED_METADATA: DeclaredSpecMetadata = DeclaredSpecMetadata {
1748    primary_resource: ResourceType::Maelstrom,
1749    secondary_resource: None,
1750    spell_ids: DECLARED_SPELL_IDS,
1751    aura_ids: DECLARED_AURA_IDS,
1752    server_proc_entries: &[],
1753    talents: TALENTS,
1754    rotation_field_schema: &[],
1755    metrics_plugin_id: None,
1756    hero_talent_trees: &[
1757        HeroTalentTreeDesc {
1758            name: "Stormbringer",
1759            spells: HERO_TREE_STORMBRINGER_SPELLS,
1760            auras: HERO_TREE_STORMBRINGER_AURAS,
1761        },
1762        HeroTalentTreeDesc {
1763            name: "Farseer",
1764            spells: HERO_TREE_FARSEER_SPELLS,
1765            auras: HERO_TREE_FARSEER_AURAS,
1766        },
1767        HeroTalentTreeDesc {
1768            name: "Totemic",
1769            spells: HERO_TREE_TOTEMIC_SPELLS,
1770            auras: HERO_TREE_TOTEMIC_AURAS,
1771        },
1772    ],
1773    reported_spells: REPORTED_SPELLS,
1774    masked_passive_effects: &[],
1775    passive_effect_overrides: &[],
1776};
1777pub(super) const SPEC_DESCRIPTOR: SpecDescriptor = SpecDescriptor {
1778    spec_id: SpecId::Elemental,
1779    display_name: "Elemental Shaman",
1780    metadata: DECLARED_METADATA,
1781    handler_factory: new_handler,
1782};
1783wowlab_engine_combat::smoke_test!(build_combat_system_draft);