1#![allow(non_snake_case, dead_code)]
4use wowlab_types::{combat::ResourceType, game::SpecId};
5use wowlab_engine_combat::{
6 CombatSystemBuilder, CombatSystemDraft, AuraDefinitionDraft, LocalAuraIdx,
7 LocalSpellIdx, SpellDefinitionDraft,
8};
9use wowlab_engine_ports::{
10 DeclaredSpecMetadata, SpecDescriptor, SpecHandler, HeroTalentTreeDesc,
11};
12use wowlab_engine_gamedata::ResolvedGameData;
13pub(crate) mod SPELL {
14 pub(crate) const LIGHTNING_BOLT: u32 = 188_196;
16 pub(crate) const CHAIN_LIGHTNING: u32 = 188_443;
18 pub(crate) const LAVA_BURST: u32 = 51505;
20 pub(crate) const EARTH_SHOCK: u32 = 8042;
22 pub(crate) const ELEMENTAL_BLAST: u32 = 117_014;
24 pub(crate) const EARTHQUAKE: u32 = 61882;
26 pub(crate) const FLAME_SHOCK: u32 = 188_389;
28 pub(crate) const FROST_SHOCK: u32 = 196_840;
30 pub(crate) const TEMPEST: u32 = 452_201;
32 pub(crate) const STORMKEEPER: u32 = 191_634;
34 pub(crate) const ASCENDANCE: u32 = 1_219_480;
36 pub(crate) const ANCESTRAL_SWIFTNESS: u32 = 443_454;
38 pub(crate) const FLAMETONGUE_WEAPON: u32 = 318_038;
40 pub(crate) const THUNDERSTRIKE_WARD: u32 = 462_757;
42 pub(crate) const LIGHTNING_SHIELD: u32 = 192_106;
44 pub(crate) const FIRE_ELEMENTAL: u32 = 188_592;
46 pub(crate) const FIRE_BLAST: u32 = 57984;
48 pub(crate) const METEOR: u32 = 117_588;
50 pub(crate) const IMMOLATE: u32 = 118_297;
52 pub(crate) const WIND_GUST: u32 = 157_331;
54 pub(crate) const CALL_LIGHTNING: u32 = 157_348;
56 pub(crate) const STORMFURY: u32 = 269_005;
58 pub(crate) const LIGHTNING_BOLT_OVERLOAD: u32 = 45284;
60 pub(crate) const CHAIN_LIGHTNING_OVERLOAD: u32 = 45297;
62 pub(crate) const LAVA_BURST_OVERLOAD: u32 = 285_466;
64 pub(crate) const ELEMENTAL_BLAST_OVERLOAD: u32 = 120_588;
66 pub(crate) const TEMPEST_OVERLOAD: u32 = 463_351;
68 pub(crate) const STORMS_EYE: u32 = 1_235_840;
70 pub(crate) const LIGHTNING_ROD_DAMAGE: u32 = 197_568;
72 pub(crate) const SKYFURY: u32 = 462_854;
74}
75pub(crate) mod AURA {
76 pub(crate) const ASCENDANCE: u32 = 1_219_480;
78 pub(crate) const STORMKEEPER: u32 = 191_634;
80 pub(crate) const FLOWING_ELEMENTS: u32 = 1_300_219;
82 pub(crate) const OVERCHARGE_TIER: u32 = 1_300_222;
84 pub(crate) const MASTER_OF_THE_ELEMENTS: u32 = 260_734;
86 pub(crate) const LAVA_SURGE: u32 = 77762;
88 pub(crate) const TEMPEST: u32 = 454_015;
90 pub(crate) const THUNDEROUS_VELOCITY: u32 = 1_272_101;
92 pub(crate) const POWER_OF_THE_MAELSTROM: u32 = 191_877;
94 pub(crate) const UNLIMITED_POWER: u32 = 454_394;
96 pub(crate) const ELEMENTAL_BLAST_CRIT: u32 = 118_522;
98 pub(crate) const ELEMENTAL_BLAST_HASTE: u32 = 173_183;
100 pub(crate) const ELEMENTAL_BLAST_MASTERY: u32 = 173_184;
102 pub(crate) const ANCESTRAL_SWIFTNESS: u32 = 443_454;
104 pub(crate) const FLAME_SHOCK: u32 = 188_389;
106 pub(crate) const LIGHTNING_ROD: u32 = 210_689;
108 pub(crate) const PURGING_FLAMES: u32 = 1_259_491;
110 pub(crate) const LIGHTNING_SHIELD: u32 = 192_106;
112 pub(crate) const THUNDERSTRIKE_WARD: u32 = 462_757;
114 pub(crate) const IMPROVED_FLAMETONGUE_WEAPON: u32 = 382_027;
116 pub(crate) const FLAMETONGUE_WEAPON: u32 = 319_778;
118 pub(crate) const ECHOES_OF_GREAT_SUNDERING: u32 = 384_088;
120 pub(crate) const WIND_GUST: u32 = 263_806;
122 pub(crate) const FIRE_ELEMENTAL: u32 = 188_592;
124 pub(crate) const STORM_ELEMENTAL: u32 = 157_299;
126 pub(crate) const STORMS_EYE: u32 = 1_239_315;
128 pub(crate) const SKYFURY_HIGHLIGHT: u32 = 462_854;
130}
131pub(crate) mod TALENT {
132 pub(crate) const AFTERSHOCK: u32 = 273_221;
134 pub(crate) const ANCESTRAL_SWIFTNESS: u32 = 443_454;
136 pub(crate) const ARC_DISCHARGE: u32 = 455_096;
138 pub(crate) const ASCENDANCE: u32 = 114_050;
140 pub(crate) const AWAKENING_STORMS: u32 = 455_129;
142 pub(crate) const CALL_OF_FIRE: u32 = 378_255;
144 pub(crate) const ELEMENTAL_BLAST: u32 = 117_014;
146 pub(crate) const ELEMENTAL_UNITY: u32 = 462_866;
148 pub(crate) const FEEDBACK_LOOP_3: u32 = 1_270_064;
150 pub(crate) const FIRE_ELEMENTAL: u32 = 188_592;
152 pub(crate) const FLAMETONGUE_WEAPON: u32 = 318_038;
154 pub(crate) const FURY_OF_THE_STORMS: u32 = 191_717;
156 pub(crate) const FUSION_OF_ELEMENTS: u32 = 462_840;
158 pub(crate) const INFERNO_ARC: u32 = 1_259_047;
160 pub(crate) const LIGHTNING_CAPACITOR: u32 = 462_862;
162 pub(crate) const LIGHTNING_ROD: u32 = 210_689;
164 pub(crate) const MASTER_OF_THE_ELEMENTS: u32 = 16166;
166 pub(crate) const MOUNTAINS_WILL_FALL: u32 = 381_726;
168 pub(crate) const POWER_OF_THE_MAELSTROM: u32 = 191_861;
170 pub(crate) const PRIMAL_ELEMENTALIST: u32 = 117_013;
172 pub(crate) const PRIMORDIAL_CAPACITY: u32 = 443_448;
174 pub(crate) const SEARING_FLAMES: u32 = 381_782;
176 pub(crate) const STORMKEEPER: u32 = 191_634;
178 pub(crate) const STORMWELL: u32 = 1_264_762;
180 pub(crate) const STORM_ELEMENTAL: u32 = 157_299;
182 pub(crate) const SUPERCHARGE: u32 = 455_110;
184 pub(crate) const SWELLING_MAELSTROM: u32 = 381_707;
186 pub(crate) const TEMPEST_TALENT: u32 = 454_009;
188 pub(crate) const THUNDERSTRIKE_WARD: u32 = 462_757;
190 pub(crate) const UNLIMITED_POWER: u32 = 454_391;
192 pub(crate) const VOLTAIC_BLAZE: u32 = 1_259_101;
194}
195pub(crate) mod SET_BONUS {
196 pub(crate) const MID2_ELEMENTAL_2PC: u32 = 1_296_625;
198 pub(crate) const MID2_ELEMENTAL_4PC: u32 = 1_296_626;
200 pub(crate) const TWW3_STORMBRINGER_2PC: u32 = 1_236_408;
202 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 pub(crate) const TEMPEST: u32 = 452_201;
210 pub(crate) const TEMPEST_OVERLOAD: u32 = 463_351;
212 }
213 pub(crate) mod AURA {
214 pub(crate) const ARC_DISCHARGE: u32 = 470_532;
216 pub(crate) const AWAKENING_STORMS: u32 = 455_129;
218 pub(crate) const STORM_SWELL: u32 = 455_089;
220 pub(crate) const TEMPEST: u32 = 454_015;
222 pub(crate) const UNLIMITED_POWER: u32 = 454_394;
224 }
225 }
226 pub(crate) mod FARSEER {
227 pub(crate) mod SPELL {
228 pub(crate) const ANCESTRAL_SWIFTNESS: u32 = 443_454;
230 pub(crate) const CALL_OF_THE_ANCESTORS: u32 = 447_244;
232 }
233 pub(crate) mod AURA {
234 pub(crate) const ANCESTRAL_SWIFTNESS: u32 = 443_454;
236 pub(crate) const CALL_OF_THE_ANCESTORS: u32 = 447_244;
238 pub(crate) const PRIMORDIAL_CAPACITY: u32 = 443_448;
240 }
241 }
242 pub(crate) mod TOTEMIC {
243 pub(crate) mod SPELL {
244 pub(crate) const SURGING_TOTEM: u32 = 1_221_347;
246 }
247 pub(crate) mod AURA {
248 pub(crate) const AMPLIFICATION_CORE: u32 = 456_369;
250 pub(crate) const LIVELY_TOTEMS: u32 = 461_242;
252 pub(crate) const SURGING_TOTEM: u32 = 1_221_347;
254 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 pub(crate) const CALL_LIGHTNING_DAMAGE: (u32, u8) = (157_348, 1);
555 pub(crate) const CALL_LIGHTNING_DAMAGE_BONUS: (u32, u8) = (157_348, 2);
557 pub(crate) const CHAIN_LIGHTNING_OVERLOAD: (u32, u8) = (45297, 1);
559 pub(crate) const ELEMENTAL_BLAST_DAMAGE: (u32, u8) = (117_014, 1);
561 pub(crate) const ELEMENTAL_BLAST_OVERLOAD: (u32, u8) = (120_588, 1);
563 pub(crate) const EARTHQUAKE_DAMAGE: (u32, u8) = (77478, 1);
565 pub(crate) const EARTHQUAKE_TIMING: (u32, u8) = (61882, 2);
567 pub(crate) const FEEDBACK_LOOP_BONUS: (u32, u8) = (1_270_064, 1);
569 pub(crate) const FIRE_BLAST_DAMAGE: (u32, u8) = (57984, 1);
571 pub(crate) const FUSION_OF_ELEMENTS_BONUS: (u32, u8) = (462_840, 1);
573 pub(crate) const IMMOLATE_DAMAGE: (u32, u8) = (118_297, 1);
575 pub(crate) const IMMOLATE_PERIODIC_DAMAGE: (u32, u8) = (118_297, 2);
577 pub(crate) const LAVA_BURST_OVERLOAD: (u32, u8) = (285_466, 1);
579 pub(crate) const LIGHTNING_BOLT_OVERLOAD: (u32, u8) = (45284, 1);
581 pub(crate) const MASTERY_DIRECT_DAMAGE: (u32, u8) = (168_534, 3);
583 pub(crate) const MASTERY_PERIODIC_DAMAGE: (u32, u8) = (168_534, 4);
585 pub(crate) const MASTERY_PET_DAMAGE: (u32, u8) = (168_534, 5);
587 pub(crate) const METEOR_DAMAGE: (u32, u8) = (117_588, 1);
589 pub(crate) const MID2_SPENDER_DAMAGE: (u32, u8) = (1_296_625, 1);
591 pub(crate) const MOUNTAINS_WILL_FALL_BONUS: (u32, u8) = (381_726, 1);
593 pub(crate) const STORMFURY_DAMAGE: (u32, u8) = (269_005, 1);
595 pub(crate) const STORMS_EYE_DAMAGE: (u32, u8) = (1_235_840, 2);
597 pub(crate) const TEMPEST_OVERLOAD: (u32, u8) = (463_351, 1);
599 pub(crate) const WIND_GUST_DAMAGE: (u32, u8) = (157_331, 1);
601 pub(crate) const OVERLOAD_CHANCE: (u32, u8) = (168_534, 1);
603 pub(crate) const OVERLOAD_PENALTY: (u32, u8) = (168_534, 2);
605 pub(crate) const SUPERCHARGE_CHANCE: (u32, u8) = (455_110, 1);
607 pub(crate) const AFTERSHOCK_CHANCE: (u32, u8) = (273_221, 1);
609 pub(crate) const TEMPEST_TALENT_CHANCE: (u32, u8) = (454_009, 1);
611 pub(crate) const AWAKENING_STORMS_CHANCE: (u32, u8) = (455_129, 3);
613 pub(crate) const POWER_OF_THE_MAELSTROM_CHANCE: (u32, u8) = (191_861, 1);
615 pub(crate) const LAVA_BURST_DAMAGE: (u32, u8) = (285_452, 1);
617 pub(crate) const LIGHTNING_ROD_PERCENT: (u32, u8) = (210_689, 2);
619 pub(crate) const STORMFURY_RAMP: (u32, u8) = (157_375, 2);
621 pub(crate) const STORMKEEPER_DAMAGE: (u32, u8) = (191_634, 2);
623 pub(crate) const ELEMENTAL_UNITY_FIRE: (u32, u8) = (462_866, 1);
625 pub(crate) const ELEMENTAL_UNITY_STORM: (u32, u8) = (462_866, 3);
627 pub(crate) const FIRE_ELEMENTAL_UNITY: (u32, u8) = (188_592, 4);
629 pub(crate) const FIRE_ELEMENTAL_UNITY_PERIODIC: (u32, u8) = (188_592, 5);
631 pub(crate) const STORM_ELEMENTAL_UNITY: (u32, u8) = (157_299, 3);
633 pub(crate) const STORM_ELEMENTAL_UNITY_PET: (u32, u8) = (157_299, 4);
635 pub(crate) const LIGHTNING_CAPACITOR_DAMAGE: (u32, u8) = (462_862, 3);
637 pub(crate) const IMPROVED_FLAMETONGUE_DAMAGE: (u32, u8) = (382_028, 1);
639 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, ¶ms.game_data))
1483 .aura(
1484 "stormkeeper",
1485 AURA::STORMKEEPER,
1486 |a| aura_stormkeeper(a, ¶ms.game_data),
1487 )
1488 .aura(
1489 "flowing_elements",
1490 AURA::FLOWING_ELEMENTS,
1491 |a| aura_flowing_elements(a, ¶ms.game_data),
1492 )
1493 .aura(
1494 "overcharge_tier",
1495 AURA::OVERCHARGE_TIER,
1496 |a| aura_overcharge_tier(a, ¶ms.game_data),
1497 )
1498 .aura(
1499 "master_of_the_elements",
1500 AURA::MASTER_OF_THE_ELEMENTS,
1501 |a| aura_master_of_the_elements(a, ¶ms.game_data),
1502 )
1503 .aura("lava_surge", AURA::LAVA_SURGE, |a| aura_lava_surge(a, ¶ms.game_data))
1504 .aura("tempest", AURA::TEMPEST, |a| aura_tempest(a, ¶ms.game_data))
1505 .aura(
1506 "thunderous_velocity",
1507 AURA::THUNDEROUS_VELOCITY,
1508 |a| aura_thunderous_velocity(a, ¶ms.game_data),
1509 )
1510 .aura(
1511 "power_of_the_maelstrom",
1512 AURA::POWER_OF_THE_MAELSTROM,
1513 |a| aura_power_of_the_maelstrom(a, ¶ms.game_data),
1514 )
1515 .aura(
1516 "unlimited_power",
1517 AURA::UNLIMITED_POWER,
1518 |a| aura_unlimited_power(a, ¶ms.game_data),
1519 )
1520 .aura(
1521 "elemental_blast_crit",
1522 AURA::ELEMENTAL_BLAST_CRIT,
1523 |a| aura_elemental_blast_crit(a, ¶ms.game_data),
1524 )
1525 .aura(
1526 "elemental_blast_haste",
1527 AURA::ELEMENTAL_BLAST_HASTE,
1528 |a| aura_elemental_blast_haste(a, ¶ms.game_data),
1529 )
1530 .aura(
1531 "elemental_blast_mastery",
1532 AURA::ELEMENTAL_BLAST_MASTERY,
1533 |a| aura_elemental_blast_mastery(a, ¶ms.game_data),
1534 )
1535 .aura(
1536 "ancestral_swiftness",
1537 AURA::ANCESTRAL_SWIFTNESS,
1538 |a| aura_ancestral_swiftness(a, ¶ms.game_data),
1539 )
1540 .aura(
1541 "flame_shock",
1542 AURA::FLAME_SHOCK,
1543 |a| aura_flame_shock(a, ¶ms.game_data),
1544 )
1545 .aura(
1546 "lightning_rod",
1547 AURA::LIGHTNING_ROD,
1548 |a| aura_lightning_rod(a, ¶ms.game_data),
1549 )
1550 .aura(
1551 "purging_flames",
1552 AURA::PURGING_FLAMES,
1553 |a| aura_purging_flames(a, ¶ms.game_data),
1554 )
1555 .aura(
1556 "lightning_shield",
1557 AURA::LIGHTNING_SHIELD,
1558 |a| aura_lightning_shield(a, ¶ms.game_data),
1559 )
1560 .aura(
1561 "thunderstrike_ward",
1562 AURA::THUNDERSTRIKE_WARD,
1563 |a| aura_thunderstrike_ward(a, ¶ms.game_data),
1564 )
1565 .aura(
1566 "improved_flametongue_weapon",
1567 AURA::IMPROVED_FLAMETONGUE_WEAPON,
1568 |a| aura_improved_flametongue_weapon(a, ¶ms.game_data),
1569 )
1570 .aura(
1571 "flametongue_weapon",
1572 AURA::FLAMETONGUE_WEAPON,
1573 |a| aura_flametongue_weapon(a, ¶ms.game_data),
1574 )
1575 .aura(
1576 "echoes_of_great_sundering",
1577 AURA::ECHOES_OF_GREAT_SUNDERING,
1578 |a| aura_echoes_of_great_sundering(a, ¶ms.game_data),
1579 )
1580 .aura("wind_gust", AURA::WIND_GUST, |a| aura_wind_gust(a, ¶ms.game_data))
1581 .aura(
1582 "fire_elemental",
1583 AURA::FIRE_ELEMENTAL,
1584 |a| aura_fire_elemental(a, ¶ms.game_data),
1585 )
1586 .aura(
1587 "storm_elemental",
1588 AURA::STORM_ELEMENTAL,
1589 |a| aura_storm_elemental(a, ¶ms.game_data),
1590 )
1591 .aura("storms_eye", AURA::STORMS_EYE, |a| aura_storms_eye(a, ¶ms.game_data))
1592 .aura(
1593 "skyfury_highlight",
1594 AURA::SKYFURY_HIGHLIGHT,
1595 |a| aura_skyfury_highlight(a, ¶ms.game_data),
1596 )
1597 .spell(
1598 "lightning_bolt",
1599 SPELL::LIGHTNING_BOLT,
1600 |s| spell_lightning_bolt(s, ¶ms.game_data),
1601 )
1602 .spell(
1603 "chain_lightning",
1604 SPELL::CHAIN_LIGHTNING,
1605 |s| spell_chain_lightning(s, ¶ms.game_data),
1606 )
1607 .spell(
1608 "lava_burst",
1609 SPELL::LAVA_BURST,
1610 |s| spell_lava_burst(s, ¶ms.game_data),
1611 )
1612 .spell(
1613 "earth_shock",
1614 SPELL::EARTH_SHOCK,
1615 |s| spell_earth_shock(s, ¶ms.game_data),
1616 )
1617 .spell(
1618 "elemental_blast",
1619 SPELL::ELEMENTAL_BLAST,
1620 |s| spell_elemental_blast(s, ¶ms.game_data),
1621 )
1622 .spell(
1623 "earthquake",
1624 SPELL::EARTHQUAKE,
1625 |s| spell_earthquake(s, ¶ms.game_data),
1626 )
1627 .spell(
1628 "flame_shock",
1629 SPELL::FLAME_SHOCK,
1630 |s| spell_flame_shock(s, ¶ms.game_data),
1631 )
1632 .spell(
1633 "frost_shock",
1634 SPELL::FROST_SHOCK,
1635 |s| spell_frost_shock(s, ¶ms.game_data),
1636 )
1637 .spell("tempest", SPELL::TEMPEST, |s| spell_tempest(s, ¶ms.game_data))
1638 .spell(
1639 "stormkeeper",
1640 SPELL::STORMKEEPER,
1641 |s| spell_stormkeeper(s, ¶ms.game_data),
1642 )
1643 .spell(
1644 "ascendance",
1645 SPELL::ASCENDANCE,
1646 |s| spell_ascendance(s, ¶ms.game_data),
1647 )
1648 .spell(
1649 "ancestral_swiftness",
1650 SPELL::ANCESTRAL_SWIFTNESS,
1651 |s| spell_ancestral_swiftness(s, ¶ms.game_data),
1652 )
1653 .spell(
1654 "flametongue_weapon",
1655 SPELL::FLAMETONGUE_WEAPON,
1656 |s| spell_flametongue_weapon(s, ¶ms.game_data),
1657 )
1658 .spell(
1659 "thunderstrike_ward",
1660 SPELL::THUNDERSTRIKE_WARD,
1661 |s| spell_thunderstrike_ward(s, ¶ms.game_data),
1662 )
1663 .spell(
1664 "lightning_shield",
1665 SPELL::LIGHTNING_SHIELD,
1666 |s| spell_lightning_shield(s, ¶ms.game_data),
1667 )
1668 .spell(
1669 "fire_elemental",
1670 SPELL::FIRE_ELEMENTAL,
1671 |s| spell_fire_elemental(s, ¶ms.game_data),
1672 )
1673 .spell(
1674 "fire_blast",
1675 SPELL::FIRE_BLAST,
1676 |s| spell_fire_blast(s, ¶ms.game_data),
1677 )
1678 .spell("meteor", SPELL::METEOR, |s| spell_meteor(s, ¶ms.game_data))
1679 .spell("immolate", SPELL::IMMOLATE, |s| spell_immolate(s, ¶ms.game_data))
1680 .spell("wind_gust", SPELL::WIND_GUST, |s| spell_wind_gust(s, ¶ms.game_data))
1681 .spell(
1682 "call_lightning",
1683 SPELL::CALL_LIGHTNING,
1684 |s| spell_call_lightning(s, ¶ms.game_data),
1685 )
1686 .spell("stormfury", SPELL::STORMFURY, |s| spell_stormfury(s, ¶ms.game_data))
1687 .spell(
1688 "lightning_bolt_overload",
1689 SPELL::LIGHTNING_BOLT_OVERLOAD,
1690 |s| spell_lightning_bolt_overload(s, ¶ms.game_data),
1691 )
1692 .spell(
1693 "chain_lightning_overload",
1694 SPELL::CHAIN_LIGHTNING_OVERLOAD,
1695 |s| spell_chain_lightning_overload(s, ¶ms.game_data),
1696 )
1697 .spell(
1698 "lava_burst_overload",
1699 SPELL::LAVA_BURST_OVERLOAD,
1700 |s| spell_lava_burst_overload(s, ¶ms.game_data),
1701 )
1702 .spell(
1703 "elemental_blast_overload",
1704 SPELL::ELEMENTAL_BLAST_OVERLOAD,
1705 |s| spell_elemental_blast_overload(s, ¶ms.game_data),
1706 )
1707 .spell(
1708 "tempest_overload",
1709 SPELL::TEMPEST_OVERLOAD,
1710 |s| spell_tempest_overload(s, ¶ms.game_data),
1711 )
1712 .spell(
1713 "storms_eye",
1714 SPELL::STORMS_EYE,
1715 |s| spell_storms_eye(s, ¶ms.game_data),
1716 )
1717 .spell(
1718 "lightning_rod_damage",
1719 SPELL::LIGHTNING_ROD_DAMAGE,
1720 |s| spell_lightning_rod_damage(s, ¶ms.game_data),
1721 )
1722 .spell("skyfury", SPELL::SKYFURY, |s| spell_skyfury(s, ¶ms.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 ¶ms.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 ¶ms,
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);