1#![allow(non_snake_case, dead_code)]
4use wowlab_types::{combat::ResourceType, game::SpecId};
5use wowlab_engine_domain::dbc::ProcAttributes;
6use wowlab_engine_combat::{
7 CombatSystemBuilder, CombatSystemDraft, AuraDefinitionDraft, LocalAuraIdx,
8 LocalSpellIdx, SpellDefinitionDraft,
9};
10use wowlab_engine_ports::{
11 DeclaredSpecMetadata, SpecDescriptor, SpecHandler, HeroTalentTreeDesc,
12 DeclaredServerProcEntry,
13};
14use wowlab_engine_gamedata::ResolvedGameData;
15pub(crate) mod SPELL {
16 pub(crate) const FROSTBOLT: u32 = 116;
18 pub(crate) const ICE_LANCE: u32 = 30455;
20 pub(crate) const FLURRY: u32 = 44614;
22 pub(crate) const GLACIAL_SPIKE: u32 = 199_786;
24 pub(crate) const FROZEN_ORB: u32 = 84714;
26 pub(crate) const FROZEN_ORB_BOLT: u32 = 84721;
28 pub(crate) const FLURRY_BOLT: u32 = 228_354;
30 pub(crate) const SHATTER_ICE_LANCE: u32 = 1_246_949;
32 pub(crate) const FROST_SPLINTER: u32 = 443_722;
34 pub(crate) const BLIZZARD: u32 = 190_356;
36 pub(crate) const COMET_STORM: u32 = 153_595;
38 pub(crate) const RAY_OF_FROST: u32 = 205_021;
40 pub(crate) const HAND_OF_FROST: u32 = 1_262_769;
42 pub(crate) const CONE_OF_COLD: u32 = 120;
44 pub(crate) const ARCANE_INTELLECT: u32 = 1459;
46}
47pub(crate) mod AURA {
48 pub(crate) const FINGERS_OF_FROST: u32 = 44544;
50 pub(crate) const BRAIN_FREEZE: u32 = 190_446;
52 pub(crate) const GLACIAL_SPIKE: u32 = 1_222_865;
54 pub(crate) const RAPID_REFREEZING: u32 = 1_310_248;
56 pub(crate) const COMET_STORM: u32 = 1_247_778;
58 pub(crate) const FREEZING: u32 = 1_221_389;
60 pub(crate) const SPLINTERSTORM: u32 = 1_247_908;
62 pub(crate) const THERMAL_VOID: u32 = 1_247_730;
64 pub(crate) const FREEZING_RAIN: u32 = 270_232;
66 pub(crate) const PERMAFROST_LANCES: u32 = 455_122;
68 pub(crate) const HAND_OF_FROST: u32 = 1_263_263;
70 pub(crate) const FROSTFIRE_EMPOWERMENT: u32 = 431_177;
72 pub(crate) const ARCANE_INTELLECT_HIGHLIGHT: u32 = 1459;
74 pub(crate) const IMPROVED_SHATTER: u32 = 1_246_811;
76}
77pub(crate) mod TALENT {
78 pub(crate) const AUGURY_ABOUNDS: u32 = 1_280_165;
80 pub(crate) const BLIZZARD_1: u32 = 190_356;
82 pub(crate) const BLIZZARD_2: u32 = 1_248_829;
84 pub(crate) const BRAIN_FREEZE: u32 = 190_447;
86 pub(crate) const COLD_SNAP: u32 = 235_219;
88 pub(crate) const COMET_STORM: u32 = 153_595;
90 pub(crate) const CONE_OF_FROST: u32 = 378_835;
92 pub(crate) const CRYSTALLINE_REFRACTION: u32 = 1_247_544;
94 pub(crate) const DEEP_SHATTER: u32 = 1_247_025;
96 pub(crate) const EVERLASTING_FROST: u32 = 385_167;
98 pub(crate) const FINGERS_OF_FROST: u32 = 112_965;
100 pub(crate) const FLASH_FREEZE: u32 = 379_993;
102 pub(crate) const FLURRY: u32 = 44614;
104 pub(crate) const FORCE_OF_WILL: u32 = 444_719;
106 pub(crate) const FRACTURED_FROST: u32 = 378_448;
108 pub(crate) const FREEZING_RAIN: u32 = 270_233;
110 pub(crate) const FROSTBITE: u32 = 1_248_825;
112 pub(crate) const FROZEN_ORB: u32 = 84714;
114 pub(crate) const FROZEN_TOUCH: u32 = 205_030;
116 pub(crate) const GLACIAL_ASSAULT: u32 = 378_947;
118 pub(crate) const GLACIAL_SHATTER: u32 = 451_022;
120 pub(crate) const GLACIATE: u32 = 1_247_798;
122 pub(crate) const HAND_OF_FROST_1: u32 = 1_262_935;
124 pub(crate) const HAND_OF_FROST_2: u32 = 1_262_981;
126 pub(crate) const HAND_OF_FROST_3: u32 = 1_263_249;
128 pub(crate) const HEART_OF_ICE: u32 = 1_247_799;
130 pub(crate) const ICE_LANCE: u32 = 30455;
132 pub(crate) const ICICLES: u32 = 1_246_832;
134 pub(crate) const IMPROVED_FLURRY: u32 = 1_247_769;
136 pub(crate) const INFUSED_SPLINTERS: u32 = 1_261_080;
138 pub(crate) const LONELY_WINTER: u32 = 205_024;
140 pub(crate) const PERMAFROST_LANCES: u32 = 460_590;
142 pub(crate) const PIERCING_COLD: u32 = 378_919;
144 pub(crate) const POLISHED_FOCUS: u32 = 1_261_082;
146 pub(crate) const RAY_OF_FROST: u32 = 205_021;
148 pub(crate) const SIGNATURE_SPELL: u32 = 470_021;
150 pub(crate) const SPELLFROST_TEACHINGS: u32 = 444_986;
152 pub(crate) const SPLINTERING_ORBS: u32 = 444_256;
154 pub(crate) const SPLINTERING_RAY: u32 = 418_733;
156 pub(crate) const SPLINTERING_SORCERY: u32 = 443_739;
158 pub(crate) const SPLINTERSTORM: u32 = 443_783;
160 pub(crate) const SPLITTING_ICE: u32 = 56377;
162 pub(crate) const SUMMON_WATER_ELEMENTAL: u32 = 205_024;
164 pub(crate) const THERMAL_VOID: u32 = 451_030;
166 pub(crate) const THERMAL_VOID_TRAIT: u32 = 1_247_729;
168 pub(crate) const WHITE_OUT: u32 = 451_117;
170 pub(crate) const WINTERTIDE: u32 = 378_398;
172 pub(crate) const WINTERTIDE_TRAIT: u32 = 378_406;
174}
175pub(crate) mod SET_BONUS {
176 pub(crate) const MID2_FROST_2PC: u32 = 1_296_585;
178 pub(crate) const MID2_FROST_4PC: u32 = 1_296_586;
180}
181pub(crate) mod REPORTED_SPELL {
182 pub(crate) const BLIZZARD_DAMAGE: u32 = 190_357;
184 pub(crate) const CRYSTALLINE_REFRACTION_DAMAGE: u32 = 1_247_554;
186 pub(crate) const FLURRY: u32 = 228_596;
188 pub(crate) const FROSTBOLT: u32 = 228_597;
190 pub(crate) const FROSTFIRE_BOLT_DAMAGE: u32 = 468_655;
192 pub(crate) const GLACIAL_SPIKE: u32 = 228_600;
194 pub(crate) const ICE_LANCE: u32 = 228_598;
196 pub(crate) const SPLINTERSTORM_DAMAGE: u32 = 443_763;
198 pub(crate) const WATER_JET: u32 = 157_997;
200}
201pub(crate) mod HERO {
202 pub(crate) mod FROSTFIRE {
203 pub(crate) mod SPELL {
204 pub(crate) const DUALITY_PYROBLAST: u32 = 1_262_863;
206 pub(crate) const FLASH_FREEZEBURN_DAMAGE: u32 = 1_278_079;
208 pub(crate) const FROSTFIRE_BOLT: u32 = 431_044;
210 pub(crate) const FROSTFIRE_EMPOWERMENT_DAMAGE: u32 = 431_186;
212 pub(crate) const ISOTHERMIC_METEOR: u32 = 351_140;
214 pub(crate) const MOLTEN_CHILL_IGNITE: u32 = 1_262_887;
216 }
217 pub(crate) mod AURA {
218 pub(crate) const FROSTFIRE_EMPOWERMENT: u32 = 431_177;
220 }
221 }
222 pub(crate) mod SPELLSLINGER {
223 pub(crate) mod SPELL {
224 pub(crate) const CONTROLLED_INSTINCTS: u32 = 444_487;
226 pub(crate) const GLACIAL_ASSAULT: u32 = 379_029;
228 pub(crate) const HAND_OF_FROST: u32 = 1_262_769;
230 pub(crate) const SPLINTER: u32 = 443_722;
232 pub(crate) const WINTERS_END: u32 = 1_280_757;
234 }
235 pub(crate) mod AURA {
236 pub(crate) const SPLINTERSTORM: u32 = 1_247_908;
238 }
239 }
240}
241static HERO_TREE_FROSTFIRE_SPELLS: &[(&str, u32)] = &[
242 ("DUALITY_PYROBLAST", 1_262_863),
243 ("FLASH_FREEZEBURN_DAMAGE", 1_278_079),
244 ("FROSTFIRE_BOLT", 431_044),
245 ("FROSTFIRE_EMPOWERMENT_DAMAGE", 431_186),
246 ("ISOTHERMIC_METEOR", 351_140),
247 ("MOLTEN_CHILL_IGNITE", 1_262_887),
248];
249static HERO_TREE_FROSTFIRE_AURAS: &[(&str, u32)] = &[("FROSTFIRE_EMPOWERMENT", 431_177)];
250static HERO_TREE_SPELLSLINGER_SPELLS: &[(&str, u32)] = &[
251 ("CONTROLLED_INSTINCTS", 444_487),
252 ("GLACIAL_ASSAULT", 379_029),
253 ("HAND_OF_FROST", 1_262_769),
254 ("SPLINTER", 443_722),
255 ("WINTERS_END", 1_280_757),
256];
257static HERO_TREE_SPELLSLINGER_AURAS: &[(&str, u32)] = &[("SPLINTERSTORM", 1_247_908)];
258pub(crate) mod DAMAGE_SPELL {
259 pub(crate) const FROSTBOLT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_116;
260 pub(crate) const ICE_LANCE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_30455;
261 pub(crate) const FLURRY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_44614;
262 pub(crate) const GLACIAL_SPIKE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_199786;
263 pub(crate) const FROZEN_ORB: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_84714;
264 pub(crate) const FROZEN_ORB_BOLT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_84721;
265 pub(crate) const FLURRY_BOLT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_228354;
266 pub(crate) const SHATTER_ICE_LANCE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_1246949;
267 pub(crate) const FROST_SPLINTER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_443722;
268 pub(crate) const BLIZZARD: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_190356;
269 pub(crate) const COMET_STORM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_153595;
270 pub(crate) const RAY_OF_FROST: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_205021;
271 pub(crate) const HAND_OF_FROST: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_1262769;
272 pub(crate) const CONE_OF_COLD: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_120;
273 pub(crate) const ARCANE_INTELLECT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_1459;
274 pub(crate) const DUALITY_PYROBLAST: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_1262863;
275 pub(crate) const FLASH_FREEZEBURN_DAMAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_1278079;
276 pub(crate) const FROSTFIRE_BOLT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_431044;
277 pub(crate) const FROSTFIRE_EMPOWERMENT_DAMAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_431186;
278 pub(crate) const ISOTHERMIC_METEOR: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_351140;
279 pub(crate) const MOLTEN_CHILL_IGNITE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_1262887;
280 pub(crate) const CONTROLLED_INSTINCTS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_444487;
281 pub(crate) const GLACIAL_ASSAULT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_379029;
282 pub(crate) const SPLINTER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_443722;
283 pub(crate) const WINTERS_END: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_1280757;
284}
285pub(crate) mod DAMAGE_AURA {
286 pub(crate) const FINGERS_OF_FROST: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_44544;
287 pub(crate) const BRAIN_FREEZE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_190446;
288 pub(crate) const GLACIAL_SPIKE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_1222865;
289 pub(crate) const RAPID_REFREEZING: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_1310248;
290 pub(crate) const COMET_STORM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_1247778;
291 pub(crate) const FREEZING: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_1221389;
292 pub(crate) const SPLINTERSTORM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_1247908;
293 pub(crate) const THERMAL_VOID: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_1247730;
294 pub(crate) const FREEZING_RAIN: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_270232;
295 pub(crate) const PERMAFROST_LANCES: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_455122;
296 pub(crate) const HAND_OF_FROST: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_1263263;
297 pub(crate) const FROSTFIRE_EMPOWERMENT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_431177;
298 pub(crate) const ARCANE_INTELLECT_HIGHLIGHT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_1459;
299 pub(crate) const IMPROVED_SHATTER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_1246811;
300}
301pub(crate) mod DAMAGE_TALENT {
302 pub(crate) const AUGURY_ABOUNDS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_1280165;
303 pub(crate) const BLIZZARD_1: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_190356;
304 pub(crate) const BLIZZARD_2: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_1248829;
305 pub(crate) const BRAIN_FREEZE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_190447;
306 pub(crate) const COLD_SNAP: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_235219;
307 pub(crate) const COMET_STORM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_153595;
308 pub(crate) const CONE_OF_FROST: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_378835;
309 pub(crate) const CRYSTALLINE_REFRACTION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_1247544;
310 pub(crate) const DEEP_SHATTER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_1247025;
311 pub(crate) const EVERLASTING_FROST: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_385167;
312 pub(crate) const FINGERS_OF_FROST: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_112965;
313 pub(crate) const FLASH_FREEZE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_379993;
314 pub(crate) const FLURRY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_44614;
315 pub(crate) const FORCE_OF_WILL: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_444719;
316 pub(crate) const FRACTURED_FROST: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_378448;
317 pub(crate) const FREEZING_RAIN: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_270233;
318 pub(crate) const FROSTBITE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_1248825;
319 pub(crate) const FROZEN_ORB: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_84714;
320 pub(crate) const FROZEN_TOUCH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_205030;
321 pub(crate) const GLACIAL_ASSAULT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_378947;
322 pub(crate) const GLACIAL_SHATTER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_451022;
323 pub(crate) const GLACIATE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_1247798;
324 pub(crate) const HAND_OF_FROST_1: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_1262935;
325 pub(crate) const HAND_OF_FROST_2: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_1262981;
326 pub(crate) const HAND_OF_FROST_3: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_1263249;
327 pub(crate) const HEART_OF_ICE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_1247799;
328 pub(crate) const ICE_LANCE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_30455;
329 pub(crate) const ICICLES: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_1246832;
330 pub(crate) const IMPROVED_FLURRY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_1247769;
331 pub(crate) const INFUSED_SPLINTERS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_1261080;
332 pub(crate) const LONELY_WINTER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_205024;
333 pub(crate) const PERMAFROST_LANCES: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_460590;
334 pub(crate) const PIERCING_COLD: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_378919;
335 pub(crate) const POLISHED_FOCUS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_1261082;
336 pub(crate) const RAY_OF_FROST: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_205021;
337 pub(crate) const SIGNATURE_SPELL: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_470021;
338 pub(crate) const SPELLFROST_TEACHINGS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_444986;
339 pub(crate) const SPLINTERING_ORBS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_444256;
340 pub(crate) const SPLINTERING_RAY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_418733;
341 pub(crate) const SPLINTERING_SORCERY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_443739;
342 pub(crate) const SPLINTERSTORM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_443783;
343 pub(crate) const SPLITTING_ICE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_56377;
344 pub(crate) const SUMMON_WATER_ELEMENTAL: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_205024;
345 pub(crate) const THERMAL_VOID: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_451030;
346 pub(crate) const THERMAL_VOID_TRAIT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_1247729;
347 pub(crate) const WHITE_OUT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_451117;
348 pub(crate) const WINTERTIDE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_378398;
349 pub(crate) const WINTERTIDE_TRAIT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_378406;
350}
351pub(crate) mod DAMAGE_REPORTED {
352 pub(crate) const BLIZZARD_DAMAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_190357;
353 pub(crate) const CRYSTALLINE_REFRACTION_DAMAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_1247554;
354 pub(crate) const FLURRY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_228596;
355 pub(crate) const FROSTBOLT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_228597;
356 pub(crate) const FROSTFIRE_BOLT_DAMAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_468655;
357 pub(crate) const GLACIAL_SPIKE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_228600;
358 pub(crate) const ICE_LANCE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_228598;
359 pub(crate) const SPLINTERSTORM_DAMAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_443763;
360 pub(crate) const WATER_JET: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ACTION::SPELL_157997;
361}
362pub(crate) mod DAMAGE_EFFECT {
363 pub(crate) const BRAIN_FREEZE_CHANCE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::EFFECT::SPELL_190447_EFFECT_1;
364 pub(crate) const DEEP_SHATTER_BONUS: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::EFFECT::SPELL_1247025_EFFECT_1;
365 pub(crate) const FINGERS_OF_FROST_CHANCE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::EFFECT::SPELL_112965_EFFECT_1;
366 pub(crate) const FLASH_FREEZE_FOF_CHANCE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::EFFECT::SPELL_379993_EFFECT_1;
367 pub(crate) const FLURRY_BOLT_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::EFFECT::SPELL_228354_EFFECT_1;
368 pub(crate) const FREEZE_AND_SHATTER_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::EFFECT::SPELL_1246752_EFFECT_1;
369 pub(crate) const FREEZE_AND_SHATTER_LABEL_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::EFFECT::SPELL_1246752_EFFECT_5;
370 pub(crate) const FREEZE_AND_SHATTER_PERIODIC: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::EFFECT::SPELL_1246752_EFFECT_3;
371 pub(crate) const FREEZE_AND_SHATTER_SHATTER_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::EFFECT::SPELL_1246752_EFFECT_2;
372 pub(crate) const FREEZE_AND_SHATTER_SHATTER_PERIODIC: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::EFFECT::SPELL_1246752_EFFECT_4;
373 pub(crate) const FROST_SPLINTER_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::EFFECT::SPELL_443722_EFFECT_1;
374 pub(crate) const FROZEN_ORB_BOLT_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::EFFECT::SPELL_84721_EFFECT_1;
375 pub(crate) const GLACIAL_ASSAULT_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::EFFECT::SPELL_379029_EFFECT_1;
376 pub(crate) const HAND_OF_FROST_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::EFFECT::SPELL_1262769_EFFECT_1;
377 pub(crate) const HAND_OF_FROST_CHANCE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::EFFECT::SPELL_1262981_EFFECT_1;
378 pub(crate) const ICICLES_PERIOD: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::EFFECT::SPELL_1246832_EFFECT_1;
379 pub(crate) const MID2_FROST_2PC_ICICLE_CHANCE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::EFFECT::SPELL_1296585_EFFECT_2;
380 pub(crate) const SHATTER_ICE_LANCE_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::frost_mage::damage::EFFECT::SPELL_1246949_EFFECT_1;
381}
382pub(crate) const AURA_FINGERS_OF_FROST: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::frost_mage::AURA_FINGERS_OF_FROST
383 .bind(wowlab_engine_combat::generated_identities::specs::frost_mage::PROOF);
384pub(crate) const AURA_BRAIN_FREEZE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::frost_mage::AURA_BRAIN_FREEZE
385 .bind(wowlab_engine_combat::generated_identities::specs::frost_mage::PROOF);
386pub(crate) const AURA_GLACIAL_SPIKE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::frost_mage::AURA_GLACIAL_SPIKE
387 .bind(wowlab_engine_combat::generated_identities::specs::frost_mage::PROOF);
388pub(crate) const AURA_RAPID_REFREEZING: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::frost_mage::AURA_RAPID_REFREEZING
389 .bind(wowlab_engine_combat::generated_identities::specs::frost_mage::PROOF);
390pub(crate) const AURA_COMET_STORM: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::frost_mage::AURA_COMET_STORM
391 .bind(wowlab_engine_combat::generated_identities::specs::frost_mage::PROOF);
392pub(crate) const AURA_FREEZING: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::frost_mage::AURA_FREEZING
393 .bind(wowlab_engine_combat::generated_identities::specs::frost_mage::PROOF);
394pub(crate) const AURA_SPLINTERSTORM: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::frost_mage::AURA_SPLINTERSTORM
395 .bind(wowlab_engine_combat::generated_identities::specs::frost_mage::PROOF);
396pub(crate) const AURA_THERMAL_VOID: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::frost_mage::AURA_THERMAL_VOID
397 .bind(wowlab_engine_combat::generated_identities::specs::frost_mage::PROOF);
398pub(crate) const AURA_FREEZING_RAIN: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::frost_mage::AURA_FREEZING_RAIN
399 .bind(wowlab_engine_combat::generated_identities::specs::frost_mage::PROOF);
400pub(crate) const AURA_PERMAFROST_LANCES: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::frost_mage::AURA_PERMAFROST_LANCES
401 .bind(wowlab_engine_combat::generated_identities::specs::frost_mage::PROOF);
402pub(crate) const AURA_HAND_OF_FROST: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::frost_mage::AURA_HAND_OF_FROST
403 .bind(wowlab_engine_combat::generated_identities::specs::frost_mage::PROOF);
404pub(crate) const AURA_FROSTFIRE_EMPOWERMENT: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::frost_mage::AURA_FROSTFIRE_EMPOWERMENT
405 .bind(wowlab_engine_combat::generated_identities::specs::frost_mage::PROOF);
406pub(crate) const AURA_ARCANE_INTELLECT_HIGHLIGHT: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::frost_mage::AURA_ARCANE_INTELLECT_HIGHLIGHT
407 .bind(wowlab_engine_combat::generated_identities::specs::frost_mage::PROOF);
408pub(crate) const AURA_IMPROVED_SHATTER: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::frost_mage::AURA_IMPROVED_SHATTER
409 .bind(wowlab_engine_combat::generated_identities::specs::frost_mage::PROOF);
410pub(crate) const AURA_COUNT: usize = 14;
411const _: () = assert!(
412 AURA_COUNT == 14, "AURA index ABI: count changed -- update positional hook consumers"
413);
414pub(crate) const SPELL_FROSTBOLT: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::frost_mage::SPELL_FROSTBOLT
415 .bind(wowlab_engine_combat::generated_identities::specs::frost_mage::PROOF);
416pub(crate) const SPELL_ICE_LANCE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::frost_mage::SPELL_ICE_LANCE
417 .bind(wowlab_engine_combat::generated_identities::specs::frost_mage::PROOF);
418pub(crate) const SPELL_FLURRY: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::frost_mage::SPELL_FLURRY
419 .bind(wowlab_engine_combat::generated_identities::specs::frost_mage::PROOF);
420pub(crate) const SPELL_GLACIAL_SPIKE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::frost_mage::SPELL_GLACIAL_SPIKE
421 .bind(wowlab_engine_combat::generated_identities::specs::frost_mage::PROOF);
422pub(crate) const SPELL_FROZEN_ORB: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::frost_mage::SPELL_FROZEN_ORB
423 .bind(wowlab_engine_combat::generated_identities::specs::frost_mage::PROOF);
424pub(crate) const SPELL_FROZEN_ORB_BOLT: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::frost_mage::SPELL_FROZEN_ORB_BOLT
425 .bind(wowlab_engine_combat::generated_identities::specs::frost_mage::PROOF);
426pub(crate) const SPELL_FLURRY_BOLT: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::frost_mage::SPELL_FLURRY_BOLT
427 .bind(wowlab_engine_combat::generated_identities::specs::frost_mage::PROOF);
428pub(crate) const SPELL_SHATTER_ICE_LANCE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::frost_mage::SPELL_SHATTER_ICE_LANCE
429 .bind(wowlab_engine_combat::generated_identities::specs::frost_mage::PROOF);
430pub(crate) const SPELL_FROST_SPLINTER: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::frost_mage::SPELL_FROST_SPLINTER
431 .bind(wowlab_engine_combat::generated_identities::specs::frost_mage::PROOF);
432pub(crate) const SPELL_BLIZZARD: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::frost_mage::SPELL_BLIZZARD
433 .bind(wowlab_engine_combat::generated_identities::specs::frost_mage::PROOF);
434pub(crate) const SPELL_COMET_STORM: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::frost_mage::SPELL_COMET_STORM
435 .bind(wowlab_engine_combat::generated_identities::specs::frost_mage::PROOF);
436pub(crate) const SPELL_RAY_OF_FROST: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::frost_mage::SPELL_RAY_OF_FROST
437 .bind(wowlab_engine_combat::generated_identities::specs::frost_mage::PROOF);
438pub(crate) const SPELL_HAND_OF_FROST: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::frost_mage::SPELL_HAND_OF_FROST
439 .bind(wowlab_engine_combat::generated_identities::specs::frost_mage::PROOF);
440pub(crate) const SPELL_CONE_OF_COLD: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::frost_mage::SPELL_CONE_OF_COLD
441 .bind(wowlab_engine_combat::generated_identities::specs::frost_mage::PROOF);
442pub(crate) const SPELL_ARCANE_INTELLECT: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::frost_mage::SPELL_ARCANE_INTELLECT
443 .bind(wowlab_engine_combat::generated_identities::specs::frost_mage::PROOF);
444pub(crate) const SPELL_COUNT: usize = 15;
445const _: () = assert!(
446 SPELL_COUNT == 15,
447 "SPELL index ABI: count changed -- update positional hook consumers"
448);
449pub(crate) mod EFFECT {
450 pub(crate) const BRAIN_FREEZE_CHANCE: (u32, u8) = (190_447, 1);
452 pub(crate) const DEEP_SHATTER_BONUS: (u32, u8) = (1_247_025, 1);
454 pub(crate) const FINGERS_OF_FROST_CHANCE: (u32, u8) = (112_965, 1);
456 pub(crate) const FLASH_FREEZE_FOF_CHANCE: (u32, u8) = (379_993, 1);
458 pub(crate) const FLURRY_BOLT_DAMAGE: (u32, u8) = (228_354, 1);
460 pub(crate) const FREEZE_AND_SHATTER_DAMAGE: (u32, u8) = (1_246_752, 1);
462 pub(crate) const FREEZE_AND_SHATTER_LABEL_DAMAGE: (u32, u8) = (1_246_752, 5);
464 pub(crate) const FREEZE_AND_SHATTER_PERIODIC: (u32, u8) = (1_246_752, 3);
466 pub(crate) const FREEZE_AND_SHATTER_SHATTER_DAMAGE: (u32, u8) = (1_246_752, 2);
468 pub(crate) const FREEZE_AND_SHATTER_SHATTER_PERIODIC: (u32, u8) = (1_246_752, 4);
470 pub(crate) const FROST_SPLINTER_DAMAGE: (u32, u8) = (443_722, 1);
472 pub(crate) const FROZEN_ORB_BOLT_DAMAGE: (u32, u8) = (84721, 1);
474 pub(crate) const GLACIAL_ASSAULT_DAMAGE: (u32, u8) = (379_029, 1);
476 pub(crate) const HAND_OF_FROST_DAMAGE: (u32, u8) = (1_262_769, 1);
478 pub(crate) const HAND_OF_FROST_CHANCE: (u32, u8) = (1_262_981, 1);
480 pub(crate) const ICICLES_PERIOD: (u32, u8) = (1_246_832, 1);
482 pub(crate) const MID2_FROST_2PC_ICICLE_CHANCE: (u32, u8) = (1_296_585, 2);
484 pub(crate) const SHATTER_ICE_LANCE_DAMAGE: (u32, u8) = (1_246_949, 1);
486}
487static REPORTED_SPELLS: &[(&str, u32)] = &[
488 ("blizzard_damage", 190_357),
489 ("crystalline_refraction_damage", 1_247_554),
490 ("flurry", 228_596),
491 ("frostbolt", 228_597),
492 ("frostfire_bolt_damage", 468_655),
493 ("glacial_spike", 228_600),
494 ("ice_lance", 228_598),
495 ("splinterstorm_damage", 443_763),
496 ("water_jet", 157_997),
497];
498static DECLARED_SPELL_IDS: &[u32] = &[
499 116, 30455, 44614, 199_786, 84714, 84721, 228_354, 1_246_949, 443_722, 190_356,
500 153_595, 205_021, 1_262_769, 120, 1459, 44544, 190_446, 1_222_865, 1_310_248,
501 1_247_778, 1_221_389, 1_247_908, 1_247_730, 270_232, 455_122, 1_263_263, 431_177,
502 1_246_811, 1_280_165, 1_248_829, 190_447, 235_219, 378_835, 1_247_544, 1_247_025,
503 385_167, 112_965, 379_993, 444_719, 378_448, 270_233, 1_248_825, 205_030, 378_947,
504 451_022, 1_247_798, 1_262_935, 1_262_981, 1_263_249, 1_247_799, 1_246_832, 1_247_769,
505 1_261_080, 205_024, 460_590, 378_919, 1_261_082, 470_021, 444_986, 444_256, 418_733,
506 443_739, 443_783, 56377, 451_030, 1_247_729, 451_117, 378_398, 378_406, 157_997,
507 190_357, 228_596, 228_597, 228_598, 228_600, 379_029, 443_763, 468_655, 1_246_752,
508 1_247_554, 1_296_585, 1_262_863, 1_278_079, 431_044, 431_186, 351_140, 1_262_887,
509 444_487, 1_280_757,
510];
511static DECLARED_AURA_IDS: &[u32] = &[
512 44544, 190_446, 1_222_865, 1_310_248, 1_247_778, 1_221_389, 1_247_908, 1_247_730,
513 270_232, 455_122, 1_263_263, 431_177, 1459, 1_246_811, 431_177, 1_247_908,
514];
515static TALENTS: &[(&str, u32)] = &[
516 ("AUGURY_ABOUNDS", TALENT::AUGURY_ABOUNDS),
517 ("BLIZZARD_1", TALENT::BLIZZARD_1),
518 ("BLIZZARD_2", TALENT::BLIZZARD_2),
519 ("BRAIN_FREEZE", TALENT::BRAIN_FREEZE),
520 ("COLD_SNAP", TALENT::COLD_SNAP),
521 ("COMET_STORM", TALENT::COMET_STORM),
522 ("CONE_OF_FROST", TALENT::CONE_OF_FROST),
523 ("CRYSTALLINE_REFRACTION", TALENT::CRYSTALLINE_REFRACTION),
524 ("DEEP_SHATTER", TALENT::DEEP_SHATTER),
525 ("EVERLASTING_FROST", TALENT::EVERLASTING_FROST),
526 ("FINGERS_OF_FROST", TALENT::FINGERS_OF_FROST),
527 ("FLASH_FREEZE", TALENT::FLASH_FREEZE),
528 ("FLURRY", TALENT::FLURRY),
529 ("FORCE_OF_WILL", TALENT::FORCE_OF_WILL),
530 ("FRACTURED_FROST", TALENT::FRACTURED_FROST),
531 ("FREEZING_RAIN", TALENT::FREEZING_RAIN),
532 ("FROSTBITE", TALENT::FROSTBITE),
533 ("FROZEN_ORB", TALENT::FROZEN_ORB),
534 ("FROZEN_TOUCH", TALENT::FROZEN_TOUCH),
535 ("GLACIAL_ASSAULT", TALENT::GLACIAL_ASSAULT),
536 ("GLACIAL_SHATTER", TALENT::GLACIAL_SHATTER),
537 ("GLACIATE", TALENT::GLACIATE),
538 ("HAND_OF_FROST_1", TALENT::HAND_OF_FROST_1),
539 ("HAND_OF_FROST_2", TALENT::HAND_OF_FROST_2),
540 ("HAND_OF_FROST_3", TALENT::HAND_OF_FROST_3),
541 ("HEART_OF_ICE", TALENT::HEART_OF_ICE),
542 ("ICE_LANCE", TALENT::ICE_LANCE),
543 ("ICICLES", TALENT::ICICLES),
544 ("IMPROVED_FLURRY", TALENT::IMPROVED_FLURRY),
545 ("INFUSED_SPLINTERS", TALENT::INFUSED_SPLINTERS),
546 ("LONELY_WINTER", TALENT::LONELY_WINTER),
547 ("PERMAFROST_LANCES", TALENT::PERMAFROST_LANCES),
548 ("PIERCING_COLD", TALENT::PIERCING_COLD),
549 ("POLISHED_FOCUS", TALENT::POLISHED_FOCUS),
550 ("RAY_OF_FROST", TALENT::RAY_OF_FROST),
551 ("SIGNATURE_SPELL", TALENT::SIGNATURE_SPELL),
552 ("SPELLFROST_TEACHINGS", TALENT::SPELLFROST_TEACHINGS),
553 ("SPLINTERING_ORBS", TALENT::SPLINTERING_ORBS),
554 ("SPLINTERING_RAY", TALENT::SPLINTERING_RAY),
555 ("SPLINTERING_SORCERY", TALENT::SPLINTERING_SORCERY),
556 ("SPLINTERSTORM", TALENT::SPLINTERSTORM),
557 ("SPLITTING_ICE", TALENT::SPLITTING_ICE),
558 ("SUMMON_WATER_ELEMENTAL", TALENT::SUMMON_WATER_ELEMENTAL),
559 ("THERMAL_VOID", TALENT::THERMAL_VOID),
560 ("THERMAL_VOID_TRAIT", TALENT::THERMAL_VOID_TRAIT),
561 ("WHITE_OUT", TALENT::WHITE_OUT),
562 ("WINTERTIDE", TALENT::WINTERTIDE),
563 ("WINTERTIDE_TRAIT", TALENT::WINTERTIDE_TRAIT),
564];
565pub(crate) mod FROST_MAGE {
566 pub(crate) const FROSTBOLT_CASTS: u32 = 0;
567 pub(crate) const ICE_LANCE_CASTS: u32 = 1;
568 pub(crate) const FLURRY_CASTS: u32 = 2;
569 pub(crate) const GLACIAL_SPIKE_CASTS: u32 = 3;
570 pub(crate) const FROZEN_ORB_CASTS: u32 = 4;
571 pub(crate) const RAY_OF_FROST_CASTS: u32 = 5;
572 pub(crate) const COMET_STORM_CASTS: u32 = 6;
573 pub(crate) const FINGERS_OF_FROST_UPTIME_MS: u32 = 7;
574}
575fn aura_fingers_of_frost(
576 a: AuraDefinitionDraft,
577 data: &ResolvedGameData,
578) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
579 Ok(
580 a
581 .on_player()
582 .apply_base_from_data(data, 44544)?
583 .max_stacks(
584 data
585 .require_aura_max_stacks(
586 wowlab_types::sim::SpellIdx::from_raw(44544),
587 )?,
588 ),
589 )
590}
591fn aura_brain_freeze(
592 a: AuraDefinitionDraft,
593 data: &ResolvedGameData,
594) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
595 Ok(
596 a
597 .on_player()
598 .apply_base_from_data(data, 190_446)?
599 .max_stacks(
600 data
601 .require_aura_max_stacks(
602 wowlab_types::sim::SpellIdx::from_raw(190_446),
603 )?,
604 ),
605 )
606}
607fn aura_glacial_spike(
608 a: AuraDefinitionDraft,
609 data: &ResolvedGameData,
610) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
611 Ok(
612 a
613 .on_player()
614 .apply_base_from_data(data, 1_222_865)?
615 .max_stacks(
616 wowlab_engine_combat::validated_max_stacks(
617 5.0,
618 1_222_865,
619 "aura.max_stacks",
620 )?,
621 ),
622 )
623}
624fn aura_rapid_refreezing(
625 a: AuraDefinitionDraft,
626 data: &ResolvedGameData,
627) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
628 Ok(
629 a
630 .on_player()
631 .apply_base_from_data(data, 1_310_248)?
632 .max_stacks(
633 data
634 .require_aura_max_stacks(
635 wowlab_types::sim::SpellIdx::from_raw(1_310_248),
636 )?,
637 ),
638 )
639}
640fn aura_comet_storm(
641 a: AuraDefinitionDraft,
642 data: &ResolvedGameData,
643) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
644 Ok(
645 a
646 .on_player()
647 .apply_base_from_data(data, 1_247_778)?
648 .max_stacks(
649 data
650 .require_aura_max_stacks(
651 wowlab_types::sim::SpellIdx::from_raw(1_247_778),
652 )?,
653 ),
654 )
655}
656fn aura_freezing(
657 a: AuraDefinitionDraft,
658 data: &ResolvedGameData,
659) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
660 Ok(
661 a
662 .on_target()
663 .apply_base_from_data(data, 1_221_389)?
664 .max_stacks(
665 data
666 .require_aura_max_stacks(
667 wowlab_types::sim::SpellIdx::from_raw(1_221_389),
668 )?,
669 ),
670 )
671}
672fn aura_splinterstorm(
673 a: AuraDefinitionDraft,
674 data: &ResolvedGameData,
675) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
676 Ok(
677 a
678 .on_player()
679 .apply_base_from_data(data, 1_247_908)?
680 .max_stacks(
681 data
682 .require_aura_max_stacks(
683 wowlab_types::sim::SpellIdx::from_raw(1_247_908),
684 )?,
685 ),
686 )
687}
688fn aura_thermal_void(
689 a: AuraDefinitionDraft,
690 data: &ResolvedGameData,
691) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
692 Ok(
693 a
694 .on_player()
695 .apply_base_from_data(data, 1_247_730)?
696 .max_stacks(
697 data
698 .require_aura_max_stacks(
699 wowlab_types::sim::SpellIdx::from_raw(1_247_730),
700 )?,
701 ),
702 )
703}
704fn aura_freezing_rain(
705 a: AuraDefinitionDraft,
706 data: &ResolvedGameData,
707) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
708 Ok(
709 a
710 .on_player()
711 .apply_base_from_data(data, 270_232)?
712 .max_stacks(
713 data
714 .require_aura_max_stacks(
715 wowlab_types::sim::SpellIdx::from_raw(270_232),
716 )?,
717 ),
718 )
719}
720fn aura_permafrost_lances(
721 a: AuraDefinitionDraft,
722 data: &ResolvedGameData,
723) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
724 Ok(
725 a
726 .on_player()
727 .apply_base_from_data(data, 455_122)?
728 .max_stacks(
729 data
730 .require_aura_max_stacks(
731 wowlab_types::sim::SpellIdx::from_raw(455_122),
732 )?,
733 ),
734 )
735}
736fn aura_hand_of_frost(
737 a: AuraDefinitionDraft,
738 data: &ResolvedGameData,
739) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
740 Ok(
741 a
742 .on_player()
743 .apply_base_from_data(data, 1_263_263)?
744 .max_stacks(
745 data
746 .require_aura_max_stacks(
747 wowlab_types::sim::SpellIdx::from_raw(1_263_263),
748 )?,
749 )
750 .async_stacks(),
751 )
752}
753fn aura_frostfire_empowerment(
754 a: AuraDefinitionDraft,
755 data: &ResolvedGameData,
756) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
757 Ok(
758 a
759 .on_player()
760 .apply_base_from_data(data, 431_177)?
761 .max_stacks(
762 data
763 .require_aura_max_stacks(
764 wowlab_types::sim::SpellIdx::from_raw(431_177),
765 )?,
766 ),
767 )
768}
769fn aura_arcane_intellect_highlight(
770 a: AuraDefinitionDraft,
771 data: &ResolvedGameData,
772) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
773 Ok(
774 a
775 .on_player()
776 .apply_base_from_data(data, 1459)?
777 .max_stacks(
778 data
779 .require_aura_max_stacks(
780 wowlab_types::sim::SpellIdx::from_raw(1459),
781 )?,
782 ),
783 )
784}
785fn aura_improved_shatter(
786 a: AuraDefinitionDraft,
787 data: &ResolvedGameData,
788) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
789 Ok(
790 a
791 .on_player()
792 .apply_base_from_data(data, 1_246_811)?
793 .max_stacks(
794 data
795 .require_aura_max_stacks(
796 wowlab_types::sim::SpellIdx::from_raw(1_246_811),
797 )?,
798 ),
799 )
800}
801fn spell_frostbolt(
802 s: SpellDefinitionDraft,
803 data: &ResolvedGameData,
804) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
805 Ok(
806 s
807 .apply_base_from_data(data, 116)?
808 .apply_aoe_from_data(data)
809 .on_cast(crate::hooks::frost_mage::frostbolt_hook)
810 .overridden_by(SPELL::GLACIAL_SPIKE, AURA::GLACIAL_SPIKE)
811 .override_at_min_stacks(5),
812 )
813}
814fn spell_ice_lance(
815 s: SpellDefinitionDraft,
816 data: &ResolvedGameData,
817) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
818 Ok(
819 s
820 .apply_base_from_data(data, 30455)?
821 .damage_sp_from_data(
822 wowlab_engine_domain::dbc::EffectLookup::new(
823 data,
824 wowlab_types::sim::EffectRef::new(
825 wowlab_types::sim::SpellIdx::from_raw(228_598),
826 1,
827 ),
828 ),
829 )?
830 .apply_aoe_from_data(data)
831 .on_cast(crate::hooks::frost_mage::ice_lance_hook),
832 )
833}
834fn spell_flurry(
835 s: SpellDefinitionDraft,
836 data: &ResolvedGameData,
837) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
838 Ok(
839 s
840 .apply_base_from_data(data, 44614)?
841 .damage_flat(0.0)
842 .apply_aoe_from_data(data)
843 .on_cast(crate::hooks::frost_mage::flurry_hook),
844 )
845}
846fn spell_glacial_spike(
847 s: SpellDefinitionDraft,
848 data: &ResolvedGameData,
849) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
850 Ok(
851 s
852 .apply_base_from_data(data, 199_786)?
853 .damage_sp_from_data(
854 wowlab_engine_domain::dbc::EffectLookup::new(
855 data,
856 wowlab_types::sim::EffectRef::new(
857 wowlab_types::sim::SpellIdx::from_raw(228_600),
858 1,
859 ),
860 ),
861 )?
862 .applies_inferred_aura(AURA_GLACIAL_SPIKE, 1_222_865)
863 .apply_aoe_from_data(data)
864 .on_cast(crate::hooks::frost_mage::glacial_spike_hook),
865 )
866}
867fn spell_frozen_orb(
868 s: SpellDefinitionDraft,
869 data: &ResolvedGameData,
870) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
871 Ok(
872 s
873 .apply_base_from_data(data, 84714)?
874 .apply_aoe_from_data(data)
875 .on_cast(crate::hooks::frost_mage::frozen_orb_hook),
876 )
877}
878fn spell_frozen_orb_bolt(
879 s: SpellDefinitionDraft,
880 data: &ResolvedGameData,
881) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
882 Ok(s.apply_base_from_data(data, 84721)?.apply_aoe_from_data(data))
883}
884fn spell_flurry_bolt(
885 s: SpellDefinitionDraft,
886 data: &ResolvedGameData,
887) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
888 Ok(s.apply_base_from_data(data, 228_354)?.apply_aoe_from_data(data))
889}
890fn spell_shatter_ice_lance(
891 s: SpellDefinitionDraft,
892 data: &ResolvedGameData,
893) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
894 Ok(s.apply_base_from_data(data, 1_246_949)?.apply_aoe_from_data(data))
895}
896fn spell_frost_splinter(
897 s: SpellDefinitionDraft,
898 data: &ResolvedGameData,
899) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
900 Ok(s.apply_base_from_data(data, 443_722)?.apply_aoe_from_data(data))
901}
902fn spell_blizzard(
903 s: SpellDefinitionDraft,
904 data: &ResolvedGameData,
905) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
906 Ok(s.apply_base_from_data(data, 190_356)?.apply_aoe_from_data(data))
907}
908fn spell_comet_storm(
909 s: SpellDefinitionDraft,
910 data: &ResolvedGameData,
911) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
912 Ok(
913 s
914 .apply_base_from_data(data, 153_595)?
915 .applies_aura(AURA_COMET_STORM)
916 .apply_aoe_from_data(data),
917 )
918}
919fn spell_ray_of_frost(
920 s: SpellDefinitionDraft,
921 data: &ResolvedGameData,
922) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
923 Ok(
924 s
925 .apply_base_from_data(data, 205_021)?
926 .apply_aoe_from_data(data)
927 .channel(
928 wowlab_engine_combat::validated_channel_tick_count(
929 8.0,
930 205_021,
931 "channel.tick_count",
932 )?,
933 )
934 .channel_tick_damage_sp_from_data(
935 wowlab_engine_domain::dbc::EffectLookup::new(
936 data,
937 wowlab_types::sim::EffectRef::new(
938 wowlab_types::sim::SpellIdx::from_raw(205_021),
939 1,
940 ),
941 ),
942 )?
943 .on_cast(crate::hooks::frost_mage::ray_of_frost_hook),
944 )
945}
946fn spell_hand_of_frost(
947 s: SpellDefinitionDraft,
948 data: &ResolvedGameData,
949) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
950 Ok(
951 s
952 .apply_base_from_data(data, 1_262_769)?
953 .applies_inferred_aura(AURA_HAND_OF_FROST, 1_263_263)
954 .apply_aoe_from_data(data),
955 )
956}
957fn spell_cone_of_cold(
958 s: SpellDefinitionDraft,
959 data: &ResolvedGameData,
960) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
961 Ok(s.apply_base_from_data(data, 120)?.apply_aoe_from_data(data))
962}
963fn spell_arcane_intellect(
964 s: SpellDefinitionDraft,
965 data: &ResolvedGameData,
966) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
967 Ok(
968 s
969 .apply_base_from_data(data, 1459)?
970 .without_data_damage()
971 .applies_inferred_aura(AURA_ARCANE_INTELLECT_HIGHLIGHT, 1459)
972 .apply_aoe_from_data(data),
973 )
974}
975pub(crate) fn build_combat_system_draft(
976 params: &wowlab_engine_ports::HandlerParams<'_>,
977) -> Result<CombatSystemDraft, wowlab_engine_ports::EngineError> {
978 let builder = CombatSystemBuilder::new(params.stats.clone())
979 .spec_id(SpecId::FrostMage)
980 .spec_identity(
981 wowlab_engine_combat::generated_identities::specs::frost_mage::PROOF,
982 )
983 .hero_talent_trees(DECLARED_METADATA.hero_talent_trees)
984 .effect_identities(
985 wowlab_engine_combat::generated_identities::specs::frost_mage::damage::ALL,
986 )
987 .effect_identities(wowlab_engine_combat::generated_identities::shared::ALL)
988 .mastery_spell(1_246_752)
989 .mastery_hook(crate::hooks::frost_mage::mastery)
990 .resource(
991 "mana",
992 100_000.0,
993 params
994 .game_data
995 .power_regen_for_max(0, 100_000.0)
996 .ok_or_else(|| {
997 wowlab_engine_ports::EngineError::spec_construction(
998 "missing power-type power_regen_for_max for type_id 0",
999 )
1000 })?,
1001 )
1002 .resource_type_id(0)
1003 .resource_start(100_000.0)
1004 .mastery_crit_damage_hook(crate::hooks::frost_mage::crit_damage)
1005 .aura(
1006 "fingers_of_frost",
1007 AURA::FINGERS_OF_FROST,
1008 |a| aura_fingers_of_frost(a, ¶ms.game_data),
1009 )
1010 .aura(
1011 "brain_freeze",
1012 AURA::BRAIN_FREEZE,
1013 |a| aura_brain_freeze(a, ¶ms.game_data),
1014 )
1015 .aura(
1016 "glacial_spike",
1017 AURA::GLACIAL_SPIKE,
1018 |a| aura_glacial_spike(a, ¶ms.game_data),
1019 )
1020 .aura(
1021 "rapid_refreezing",
1022 AURA::RAPID_REFREEZING,
1023 |a| aura_rapid_refreezing(a, ¶ms.game_data),
1024 )
1025 .aura(
1026 "comet_storm",
1027 AURA::COMET_STORM,
1028 |a| aura_comet_storm(a, ¶ms.game_data),
1029 )
1030 .aura("freezing", AURA::FREEZING, |a| aura_freezing(a, ¶ms.game_data))
1031 .aura(
1032 "splinterstorm",
1033 AURA::SPLINTERSTORM,
1034 |a| aura_splinterstorm(a, ¶ms.game_data),
1035 )
1036 .aura(
1037 "thermal_void",
1038 AURA::THERMAL_VOID,
1039 |a| aura_thermal_void(a, ¶ms.game_data),
1040 )
1041 .aura(
1042 "freezing_rain",
1043 AURA::FREEZING_RAIN,
1044 |a| aura_freezing_rain(a, ¶ms.game_data),
1045 )
1046 .aura(
1047 "permafrost_lances",
1048 AURA::PERMAFROST_LANCES,
1049 |a| aura_permafrost_lances(a, ¶ms.game_data),
1050 )
1051 .aura(
1052 "hand_of_frost",
1053 AURA::HAND_OF_FROST,
1054 |a| aura_hand_of_frost(a, ¶ms.game_data),
1055 )
1056 .aura(
1057 "frostfire_empowerment",
1058 AURA::FROSTFIRE_EMPOWERMENT,
1059 |a| aura_frostfire_empowerment(a, ¶ms.game_data),
1060 )
1061 .aura(
1062 "arcane_intellect_highlight",
1063 AURA::ARCANE_INTELLECT_HIGHLIGHT,
1064 |a| aura_arcane_intellect_highlight(a, ¶ms.game_data),
1065 )
1066 .aura(
1067 "improved_shatter",
1068 AURA::IMPROVED_SHATTER,
1069 |a| aura_improved_shatter(a, ¶ms.game_data),
1070 )
1071 .spell("frostbolt", SPELL::FROSTBOLT, |s| spell_frostbolt(s, ¶ms.game_data))
1072 .spell("ice_lance", SPELL::ICE_LANCE, |s| spell_ice_lance(s, ¶ms.game_data))
1073 .spell("flurry", SPELL::FLURRY, |s| spell_flurry(s, ¶ms.game_data))
1074 .spell(
1075 "glacial_spike",
1076 SPELL::GLACIAL_SPIKE,
1077 |s| spell_glacial_spike(s, ¶ms.game_data),
1078 )
1079 .spell(
1080 "frozen_orb",
1081 SPELL::FROZEN_ORB,
1082 |s| spell_frozen_orb(s, ¶ms.game_data),
1083 )
1084 .spell(
1085 "frozen_orb_bolt",
1086 SPELL::FROZEN_ORB_BOLT,
1087 |s| spell_frozen_orb_bolt(s, ¶ms.game_data),
1088 )
1089 .spell(
1090 "flurry_bolt",
1091 SPELL::FLURRY_BOLT,
1092 |s| spell_flurry_bolt(s, ¶ms.game_data),
1093 )
1094 .spell(
1095 "shatter_ice_lance",
1096 SPELL::SHATTER_ICE_LANCE,
1097 |s| spell_shatter_ice_lance(s, ¶ms.game_data),
1098 )
1099 .spell(
1100 "frost_splinter",
1101 SPELL::FROST_SPLINTER,
1102 |s| spell_frost_splinter(s, ¶ms.game_data),
1103 )
1104 .spell("blizzard", SPELL::BLIZZARD, |s| spell_blizzard(s, ¶ms.game_data))
1105 .spell(
1106 "comet_storm",
1107 SPELL::COMET_STORM,
1108 |s| spell_comet_storm(s, ¶ms.game_data),
1109 )
1110 .spell(
1111 "ray_of_frost",
1112 SPELL::RAY_OF_FROST,
1113 |s| spell_ray_of_frost(s, ¶ms.game_data),
1114 )
1115 .spell(
1116 "hand_of_frost",
1117 SPELL::HAND_OF_FROST,
1118 |s| spell_hand_of_frost(s, ¶ms.game_data),
1119 )
1120 .spell(
1121 "cone_of_cold",
1122 SPELL::CONE_OF_COLD,
1123 |s| spell_cone_of_cold(s, ¶ms.game_data),
1124 )
1125 .spell(
1126 "arcane_intellect",
1127 SPELL::ARCANE_INTELLECT,
1128 |s| spell_arcane_intellect(s, ¶ms.game_data),
1129 )
1130 .game_data(params.game_data.clone())
1131 .talent_spell_ids(TALENTS)
1132 .talent_selections(params.talent_selections)
1133 .set_bonus_auras(params.set_bonus_auras)
1134 .encounter(params.encounter.clone());
1135 let builder = crate::generated::items::register_equipped(
1136 builder,
1137 ¶ms.game_data,
1138 params.equipped_items,
1139 )?;
1140
1141 builder.into_draft()
1142}
1143fn new_handler(
1144 params: wowlab_engine_ports::HandlerParams<'_>,
1145) -> Result<Box<dyn SpecHandler>, wowlab_engine_ports::EngineError> {
1146 let handler = crate::composition::compose_handler(
1147 build_combat_system_draft,
1148 ¶ms,
1149 crate::hooks::frost_mage::FrostHandler::try_new,
1150 )?;
1151
1152 Ok(Box::new(handler))
1153}
1154static DECLARED_METADATA: DeclaredSpecMetadata = DeclaredSpecMetadata {
1155 primary_resource: ResourceType::Mana,
1156 secondary_resource: None,
1157 spell_ids: DECLARED_SPELL_IDS,
1158 aura_ids: DECLARED_AURA_IDS,
1159 server_proc_entries: &[
1160 DeclaredServerProcEntry {
1161 spell_id: 44544,
1162 attributes: ProcAttributes::USE_STACKS_FOR_CHARGES.bits(),
1163 },
1164 ],
1165 talents: TALENTS,
1166 rotation_field_schema: &[],
1167 metrics_plugin_id: None,
1168 hero_talent_trees: &[
1169 HeroTalentTreeDesc {
1170 name: "Frostfire",
1171 spells: HERO_TREE_FROSTFIRE_SPELLS,
1172 auras: HERO_TREE_FROSTFIRE_AURAS,
1173 },
1174 HeroTalentTreeDesc {
1175 name: "Spellslinger",
1176 spells: HERO_TREE_SPELLSLINGER_SPELLS,
1177 auras: HERO_TREE_SPELLSLINGER_AURAS,
1178 },
1179 ],
1180 reported_spells: REPORTED_SPELLS,
1181 masked_passive_effects: &[],
1182 passive_effect_overrides: &[],
1183};
1184pub(super) const SPEC_DESCRIPTOR: SpecDescriptor = SpecDescriptor {
1185 spec_id: SpecId::FrostMage,
1186 display_name: "Frost Mage",
1187 metadata: DECLARED_METADATA,
1188 handler_factory: new_handler,
1189};
1190wowlab_engine_combat::smoke_test!(build_combat_system_draft);