Skip to main content

wowlab_engine_content/generated/specs/
frost_mage.rs

1//! @generated by codegen-cli from manifests/specs/mage/frost/manifest.toml -- do not edit by hand.
2// Generated code: naming follows game data conventions
3#![allow(non_snake_case, dead_code)]
4use wowlab_types::{combat::ResourceType, game::SpecId};
5use wowlab_engine_domain::dbc::ProcAttributes;
6use wowlab_engine_combat::{
7    CombatSystemBuilder, CombatSystemDraft, AuraDefinitionDraft, LocalAuraIdx,
8    LocalSpellIdx, SpellDefinitionDraft,
9};
10use wowlab_engine_ports::{
11    DeclaredSpecMetadata, SpecDescriptor, SpecHandler, HeroTalentTreeDesc,
12    DeclaredServerProcEntry,
13};
14use wowlab_engine_gamedata::ResolvedGameData;
15pub(crate) mod SPELL {
16    ///<https://wowlab.gg/inspect/spell/116>
17    pub(crate) const FROSTBOLT: u32 = 116;
18    ///<https://wowlab.gg/inspect/spell/30455>
19    pub(crate) const ICE_LANCE: u32 = 30455;
20    ///<https://wowlab.gg/inspect/spell/44614>
21    pub(crate) const FLURRY: u32 = 44614;
22    ///<https://wowlab.gg/inspect/spell/199786>
23    pub(crate) const GLACIAL_SPIKE: u32 = 199_786;
24    ///<https://wowlab.gg/inspect/spell/84714>
25    pub(crate) const FROZEN_ORB: u32 = 84714;
26    ///<https://wowlab.gg/inspect/spell/84721>
27    pub(crate) const FROZEN_ORB_BOLT: u32 = 84721;
28    ///<https://wowlab.gg/inspect/spell/228354>
29    pub(crate) const FLURRY_BOLT: u32 = 228_354;
30    ///<https://wowlab.gg/inspect/spell/1246949>
31    pub(crate) const SHATTER_ICE_LANCE: u32 = 1_246_949;
32    ///<https://wowlab.gg/inspect/spell/443722>
33    pub(crate) const FROST_SPLINTER: u32 = 443_722;
34    ///<https://wowlab.gg/inspect/spell/190356>
35    pub(crate) const BLIZZARD: u32 = 190_356;
36    ///<https://wowlab.gg/inspect/spell/153595>
37    pub(crate) const COMET_STORM: u32 = 153_595;
38    ///<https://wowlab.gg/inspect/spell/205021>
39    pub(crate) const RAY_OF_FROST: u32 = 205_021;
40    ///<https://wowlab.gg/inspect/spell/1262769>
41    pub(crate) const HAND_OF_FROST: u32 = 1_262_769;
42    ///<https://wowlab.gg/inspect/spell/120>
43    pub(crate) const CONE_OF_COLD: u32 = 120;
44    ///<https://wowlab.gg/inspect/spell/1459>
45    pub(crate) const ARCANE_INTELLECT: u32 = 1459;
46}
47pub(crate) mod AURA {
48    ///<https://wowlab.gg/inspect/spell/44544>
49    pub(crate) const FINGERS_OF_FROST: u32 = 44544;
50    ///<https://wowlab.gg/inspect/spell/190446>
51    pub(crate) const BRAIN_FREEZE: u32 = 190_446;
52    ///<https://wowlab.gg/inspect/spell/1222865>
53    pub(crate) const GLACIAL_SPIKE: u32 = 1_222_865;
54    ///<https://wowlab.gg/inspect/spell/1310248>
55    pub(crate) const RAPID_REFREEZING: u32 = 1_310_248;
56    ///<https://wowlab.gg/inspect/spell/1247778>
57    pub(crate) const COMET_STORM: u32 = 1_247_778;
58    ///<https://wowlab.gg/inspect/spell/1221389>
59    pub(crate) const FREEZING: u32 = 1_221_389;
60    ///<https://wowlab.gg/inspect/spell/1247908>
61    pub(crate) const SPLINTERSTORM: u32 = 1_247_908;
62    ///<https://wowlab.gg/inspect/spell/1247730>
63    pub(crate) const THERMAL_VOID: u32 = 1_247_730;
64    ///<https://wowlab.gg/inspect/spell/270232>
65    pub(crate) const FREEZING_RAIN: u32 = 270_232;
66    ///<https://wowlab.gg/inspect/spell/455122>
67    pub(crate) const PERMAFROST_LANCES: u32 = 455_122;
68    ///<https://wowlab.gg/inspect/spell/1263263>
69    pub(crate) const HAND_OF_FROST: u32 = 1_263_263;
70    ///<https://wowlab.gg/inspect/spell/431177>
71    pub(crate) const FROSTFIRE_EMPOWERMENT: u32 = 431_177;
72    ///<https://wowlab.gg/inspect/spell/1459>
73    pub(crate) const ARCANE_INTELLECT_HIGHLIGHT: u32 = 1459;
74    ///<https://wowlab.gg/inspect/spell/1246811>
75    pub(crate) const IMPROVED_SHATTER: u32 = 1_246_811;
76}
77pub(crate) mod TALENT {
78    ///<https://wowlab.gg/inspect/spell/1280165>
79    pub(crate) const AUGURY_ABOUNDS: u32 = 1_280_165;
80    ///<https://wowlab.gg/inspect/spell/190356>
81    pub(crate) const BLIZZARD_1: u32 = 190_356;
82    ///<https://wowlab.gg/inspect/spell/1248829>
83    pub(crate) const BLIZZARD_2: u32 = 1_248_829;
84    ///<https://wowlab.gg/inspect/spell/190447>
85    pub(crate) const BRAIN_FREEZE: u32 = 190_447;
86    ///<https://wowlab.gg/inspect/spell/235219>
87    pub(crate) const COLD_SNAP: u32 = 235_219;
88    ///<https://wowlab.gg/inspect/spell/153595>
89    pub(crate) const COMET_STORM: u32 = 153_595;
90    ///<https://wowlab.gg/inspect/spell/378835>
91    pub(crate) const CONE_OF_FROST: u32 = 378_835;
92    ///<https://wowlab.gg/inspect/spell/1247544>
93    pub(crate) const CRYSTALLINE_REFRACTION: u32 = 1_247_544;
94    ///<https://wowlab.gg/inspect/spell/1247025>
95    pub(crate) const DEEP_SHATTER: u32 = 1_247_025;
96    ///<https://wowlab.gg/inspect/spell/385167>
97    pub(crate) const EVERLASTING_FROST: u32 = 385_167;
98    ///<https://wowlab.gg/inspect/spell/112965>
99    pub(crate) const FINGERS_OF_FROST: u32 = 112_965;
100    ///<https://wowlab.gg/inspect/spell/379993>
101    pub(crate) const FLASH_FREEZE: u32 = 379_993;
102    ///<https://wowlab.gg/inspect/spell/44614>
103    pub(crate) const FLURRY: u32 = 44614;
104    ///<https://wowlab.gg/inspect/spell/444719>
105    pub(crate) const FORCE_OF_WILL: u32 = 444_719;
106    ///<https://wowlab.gg/inspect/spell/378448>
107    pub(crate) const FRACTURED_FROST: u32 = 378_448;
108    ///<https://wowlab.gg/inspect/spell/270233>
109    pub(crate) const FREEZING_RAIN: u32 = 270_233;
110    ///<https://wowlab.gg/inspect/spell/1248825>
111    pub(crate) const FROSTBITE: u32 = 1_248_825;
112    ///<https://wowlab.gg/inspect/spell/84714>
113    pub(crate) const FROZEN_ORB: u32 = 84714;
114    ///<https://wowlab.gg/inspect/spell/205030>
115    pub(crate) const FROZEN_TOUCH: u32 = 205_030;
116    ///<https://wowlab.gg/inspect/spell/378947>
117    pub(crate) const GLACIAL_ASSAULT: u32 = 378_947;
118    ///<https://wowlab.gg/inspect/spell/451022>
119    pub(crate) const GLACIAL_SHATTER: u32 = 451_022;
120    ///<https://wowlab.gg/inspect/spell/1247798>
121    pub(crate) const GLACIATE: u32 = 1_247_798;
122    ///<https://wowlab.gg/inspect/spell/1262935>
123    pub(crate) const HAND_OF_FROST_1: u32 = 1_262_935;
124    ///<https://wowlab.gg/inspect/spell/1262981>
125    pub(crate) const HAND_OF_FROST_2: u32 = 1_262_981;
126    ///<https://wowlab.gg/inspect/spell/1263249>
127    pub(crate) const HAND_OF_FROST_3: u32 = 1_263_249;
128    ///<https://wowlab.gg/inspect/spell/1247799>
129    pub(crate) const HEART_OF_ICE: u32 = 1_247_799;
130    ///<https://wowlab.gg/inspect/spell/30455>
131    pub(crate) const ICE_LANCE: u32 = 30455;
132    ///<https://wowlab.gg/inspect/spell/1246832>
133    pub(crate) const ICICLES: u32 = 1_246_832;
134    ///<https://wowlab.gg/inspect/spell/1247769>
135    pub(crate) const IMPROVED_FLURRY: u32 = 1_247_769;
136    ///<https://wowlab.gg/inspect/spell/1261080>
137    pub(crate) const INFUSED_SPLINTERS: u32 = 1_261_080;
138    ///<https://wowlab.gg/inspect/spell/205024>
139    pub(crate) const LONELY_WINTER: u32 = 205_024;
140    ///<https://wowlab.gg/inspect/spell/460590>
141    pub(crate) const PERMAFROST_LANCES: u32 = 460_590;
142    ///<https://wowlab.gg/inspect/spell/378919>
143    pub(crate) const PIERCING_COLD: u32 = 378_919;
144    ///<https://wowlab.gg/inspect/spell/1261082>
145    pub(crate) const POLISHED_FOCUS: u32 = 1_261_082;
146    ///<https://wowlab.gg/inspect/spell/205021>
147    pub(crate) const RAY_OF_FROST: u32 = 205_021;
148    ///<https://wowlab.gg/inspect/spell/470021>
149    pub(crate) const SIGNATURE_SPELL: u32 = 470_021;
150    ///<https://wowlab.gg/inspect/spell/444986>
151    pub(crate) const SPELLFROST_TEACHINGS: u32 = 444_986;
152    ///<https://wowlab.gg/inspect/spell/444256>
153    pub(crate) const SPLINTERING_ORBS: u32 = 444_256;
154    ///<https://wowlab.gg/inspect/spell/418733>
155    pub(crate) const SPLINTERING_RAY: u32 = 418_733;
156    ///<https://wowlab.gg/inspect/spell/443739>
157    pub(crate) const SPLINTERING_SORCERY: u32 = 443_739;
158    ///<https://wowlab.gg/inspect/spell/443783>
159    pub(crate) const SPLINTERSTORM: u32 = 443_783;
160    ///<https://wowlab.gg/inspect/spell/56377>
161    pub(crate) const SPLITTING_ICE: u32 = 56377;
162    ///<https://wowlab.gg/inspect/spell/205024>
163    pub(crate) const SUMMON_WATER_ELEMENTAL: u32 = 205_024;
164    ///<https://wowlab.gg/inspect/spell/451030>
165    pub(crate) const THERMAL_VOID: u32 = 451_030;
166    ///<https://wowlab.gg/inspect/spell/1247729>
167    pub(crate) const THERMAL_VOID_TRAIT: u32 = 1_247_729;
168    ///<https://wowlab.gg/inspect/spell/451117>
169    pub(crate) const WHITE_OUT: u32 = 451_117;
170    ///<https://wowlab.gg/inspect/spell/378398>
171    pub(crate) const WINTERTIDE: u32 = 378_398;
172    ///<https://wowlab.gg/inspect/spell/378406>
173    pub(crate) const WINTERTIDE_TRAIT: u32 = 378_406;
174}
175pub(crate) mod SET_BONUS {
176    ///<https://wowlab.gg/inspect/spell/1296585>
177    pub(crate) const MID2_FROST_2PC: u32 = 1_296_585;
178    ///<https://wowlab.gg/inspect/spell/1296586>
179    pub(crate) const MID2_FROST_4PC: u32 = 1_296_586;
180}
181pub(crate) mod REPORTED_SPELL {
182    ///<https://wowlab.gg/inspect/spell/190357>
183    pub(crate) const BLIZZARD_DAMAGE: u32 = 190_357;
184    ///<https://wowlab.gg/inspect/spell/1247554>
185    pub(crate) const CRYSTALLINE_REFRACTION_DAMAGE: u32 = 1_247_554;
186    ///<https://wowlab.gg/inspect/spell/228596>
187    pub(crate) const FLURRY: u32 = 228_596;
188    ///<https://wowlab.gg/inspect/spell/228597>
189    pub(crate) const FROSTBOLT: u32 = 228_597;
190    ///<https://wowlab.gg/inspect/spell/468655>
191    pub(crate) const FROSTFIRE_BOLT_DAMAGE: u32 = 468_655;
192    ///<https://wowlab.gg/inspect/spell/228600>
193    pub(crate) const GLACIAL_SPIKE: u32 = 228_600;
194    ///<https://wowlab.gg/inspect/spell/228598>
195    pub(crate) const ICE_LANCE: u32 = 228_598;
196    ///<https://wowlab.gg/inspect/spell/443763>
197    pub(crate) const SPLINTERSTORM_DAMAGE: u32 = 443_763;
198    ///<https://wowlab.gg/inspect/spell/157997>
199    pub(crate) const WATER_JET: u32 = 157_997;
200}
201pub(crate) mod HERO {
202    pub(crate) mod FROSTFIRE {
203        pub(crate) mod SPELL {
204            ///<https://wowlab.gg/inspect/spell/1262863>
205            pub(crate) const DUALITY_PYROBLAST: u32 = 1_262_863;
206            ///<https://wowlab.gg/inspect/spell/1278079>
207            pub(crate) const FLASH_FREEZEBURN_DAMAGE: u32 = 1_278_079;
208            ///<https://wowlab.gg/inspect/spell/431044>
209            pub(crate) const FROSTFIRE_BOLT: u32 = 431_044;
210            ///<https://wowlab.gg/inspect/spell/431186>
211            pub(crate) const FROSTFIRE_EMPOWERMENT_DAMAGE: u32 = 431_186;
212            ///<https://wowlab.gg/inspect/spell/351140>
213            pub(crate) const ISOTHERMIC_METEOR: u32 = 351_140;
214            ///<https://wowlab.gg/inspect/spell/1262887>
215            pub(crate) const MOLTEN_CHILL_IGNITE: u32 = 1_262_887;
216        }
217        pub(crate) mod AURA {
218            ///<https://wowlab.gg/inspect/spell/431177>
219            pub(crate) const FROSTFIRE_EMPOWERMENT: u32 = 431_177;
220        }
221    }
222    pub(crate) mod SPELLSLINGER {
223        pub(crate) mod SPELL {
224            ///<https://wowlab.gg/inspect/spell/444487>
225            pub(crate) const CONTROLLED_INSTINCTS: u32 = 444_487;
226            ///<https://wowlab.gg/inspect/spell/379029>
227            pub(crate) const GLACIAL_ASSAULT: u32 = 379_029;
228            ///<https://wowlab.gg/inspect/spell/1262769>
229            pub(crate) const HAND_OF_FROST: u32 = 1_262_769;
230            ///<https://wowlab.gg/inspect/spell/443722>
231            pub(crate) const SPLINTER: u32 = 443_722;
232            ///<https://wowlab.gg/inspect/spell/1280757>
233            pub(crate) const WINTERS_END: u32 = 1_280_757;
234        }
235        pub(crate) mod AURA {
236            ///<https://wowlab.gg/inspect/spell/1247908>
237            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    ///<https://wowlab.gg/inspect/spell/190447>
451    pub(crate) const BRAIN_FREEZE_CHANCE: (u32, u8) = (190_447, 1);
452    ///<https://wowlab.gg/inspect/spell/1247025>
453    pub(crate) const DEEP_SHATTER_BONUS: (u32, u8) = (1_247_025, 1);
454    ///<https://wowlab.gg/inspect/spell/112965>
455    pub(crate) const FINGERS_OF_FROST_CHANCE: (u32, u8) = (112_965, 1);
456    ///<https://wowlab.gg/inspect/spell/379993>
457    pub(crate) const FLASH_FREEZE_FOF_CHANCE: (u32, u8) = (379_993, 1);
458    ///<https://wowlab.gg/inspect/spell/228354>
459    pub(crate) const FLURRY_BOLT_DAMAGE: (u32, u8) = (228_354, 1);
460    ///<https://wowlab.gg/inspect/spell/1246752>
461    pub(crate) const FREEZE_AND_SHATTER_DAMAGE: (u32, u8) = (1_246_752, 1);
462    ///<https://wowlab.gg/inspect/spell/1246752>
463    pub(crate) const FREEZE_AND_SHATTER_LABEL_DAMAGE: (u32, u8) = (1_246_752, 5);
464    ///<https://wowlab.gg/inspect/spell/1246752>
465    pub(crate) const FREEZE_AND_SHATTER_PERIODIC: (u32, u8) = (1_246_752, 3);
466    ///<https://wowlab.gg/inspect/spell/1246752>
467    pub(crate) const FREEZE_AND_SHATTER_SHATTER_DAMAGE: (u32, u8) = (1_246_752, 2);
468    ///<https://wowlab.gg/inspect/spell/1246752>
469    pub(crate) const FREEZE_AND_SHATTER_SHATTER_PERIODIC: (u32, u8) = (1_246_752, 4);
470    ///<https://wowlab.gg/inspect/spell/443722>
471    pub(crate) const FROST_SPLINTER_DAMAGE: (u32, u8) = (443_722, 1);
472    ///<https://wowlab.gg/inspect/spell/84721>
473    pub(crate) const FROZEN_ORB_BOLT_DAMAGE: (u32, u8) = (84721, 1);
474    ///<https://wowlab.gg/inspect/spell/379029>
475    pub(crate) const GLACIAL_ASSAULT_DAMAGE: (u32, u8) = (379_029, 1);
476    ///<https://wowlab.gg/inspect/spell/1262769>
477    pub(crate) const HAND_OF_FROST_DAMAGE: (u32, u8) = (1_262_769, 1);
478    ///<https://wowlab.gg/inspect/spell/1262981>
479    pub(crate) const HAND_OF_FROST_CHANCE: (u32, u8) = (1_262_981, 1);
480    ///<https://wowlab.gg/inspect/spell/1246832>
481    pub(crate) const ICICLES_PERIOD: (u32, u8) = (1_246_832, 1);
482    ///<https://wowlab.gg/inspect/spell/1296585>
483    pub(crate) const MID2_FROST_2PC_ICICLE_CHANCE: (u32, u8) = (1_296_585, 2);
484    ///<https://wowlab.gg/inspect/spell/1246949>
485    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, &params.game_data),
1009        )
1010        .aura(
1011            "brain_freeze",
1012            AURA::BRAIN_FREEZE,
1013            |a| aura_brain_freeze(a, &params.game_data),
1014        )
1015        .aura(
1016            "glacial_spike",
1017            AURA::GLACIAL_SPIKE,
1018            |a| aura_glacial_spike(a, &params.game_data),
1019        )
1020        .aura(
1021            "rapid_refreezing",
1022            AURA::RAPID_REFREEZING,
1023            |a| aura_rapid_refreezing(a, &params.game_data),
1024        )
1025        .aura(
1026            "comet_storm",
1027            AURA::COMET_STORM,
1028            |a| aura_comet_storm(a, &params.game_data),
1029        )
1030        .aura("freezing", AURA::FREEZING, |a| aura_freezing(a, &params.game_data))
1031        .aura(
1032            "splinterstorm",
1033            AURA::SPLINTERSTORM,
1034            |a| aura_splinterstorm(a, &params.game_data),
1035        )
1036        .aura(
1037            "thermal_void",
1038            AURA::THERMAL_VOID,
1039            |a| aura_thermal_void(a, &params.game_data),
1040        )
1041        .aura(
1042            "freezing_rain",
1043            AURA::FREEZING_RAIN,
1044            |a| aura_freezing_rain(a, &params.game_data),
1045        )
1046        .aura(
1047            "permafrost_lances",
1048            AURA::PERMAFROST_LANCES,
1049            |a| aura_permafrost_lances(a, &params.game_data),
1050        )
1051        .aura(
1052            "hand_of_frost",
1053            AURA::HAND_OF_FROST,
1054            |a| aura_hand_of_frost(a, &params.game_data),
1055        )
1056        .aura(
1057            "frostfire_empowerment",
1058            AURA::FROSTFIRE_EMPOWERMENT,
1059            |a| aura_frostfire_empowerment(a, &params.game_data),
1060        )
1061        .aura(
1062            "arcane_intellect_highlight",
1063            AURA::ARCANE_INTELLECT_HIGHLIGHT,
1064            |a| aura_arcane_intellect_highlight(a, &params.game_data),
1065        )
1066        .aura(
1067            "improved_shatter",
1068            AURA::IMPROVED_SHATTER,
1069            |a| aura_improved_shatter(a, &params.game_data),
1070        )
1071        .spell("frostbolt", SPELL::FROSTBOLT, |s| spell_frostbolt(s, &params.game_data))
1072        .spell("ice_lance", SPELL::ICE_LANCE, |s| spell_ice_lance(s, &params.game_data))
1073        .spell("flurry", SPELL::FLURRY, |s| spell_flurry(s, &params.game_data))
1074        .spell(
1075            "glacial_spike",
1076            SPELL::GLACIAL_SPIKE,
1077            |s| spell_glacial_spike(s, &params.game_data),
1078        )
1079        .spell(
1080            "frozen_orb",
1081            SPELL::FROZEN_ORB,
1082            |s| spell_frozen_orb(s, &params.game_data),
1083        )
1084        .spell(
1085            "frozen_orb_bolt",
1086            SPELL::FROZEN_ORB_BOLT,
1087            |s| spell_frozen_orb_bolt(s, &params.game_data),
1088        )
1089        .spell(
1090            "flurry_bolt",
1091            SPELL::FLURRY_BOLT,
1092            |s| spell_flurry_bolt(s, &params.game_data),
1093        )
1094        .spell(
1095            "shatter_ice_lance",
1096            SPELL::SHATTER_ICE_LANCE,
1097            |s| spell_shatter_ice_lance(s, &params.game_data),
1098        )
1099        .spell(
1100            "frost_splinter",
1101            SPELL::FROST_SPLINTER,
1102            |s| spell_frost_splinter(s, &params.game_data),
1103        )
1104        .spell("blizzard", SPELL::BLIZZARD, |s| spell_blizzard(s, &params.game_data))
1105        .spell(
1106            "comet_storm",
1107            SPELL::COMET_STORM,
1108            |s| spell_comet_storm(s, &params.game_data),
1109        )
1110        .spell(
1111            "ray_of_frost",
1112            SPELL::RAY_OF_FROST,
1113            |s| spell_ray_of_frost(s, &params.game_data),
1114        )
1115        .spell(
1116            "hand_of_frost",
1117            SPELL::HAND_OF_FROST,
1118            |s| spell_hand_of_frost(s, &params.game_data),
1119        )
1120        .spell(
1121            "cone_of_cold",
1122            SPELL::CONE_OF_COLD,
1123            |s| spell_cone_of_cold(s, &params.game_data),
1124        )
1125        .spell(
1126            "arcane_intellect",
1127            SPELL::ARCANE_INTELLECT,
1128            |s| spell_arcane_intellect(s, &params.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        &params.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        &params,
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);