Skip to main content

wowlab_engine_content/generated/specs/
frost_death_knight.rs

1//! @generated by codegen-cli from manifests/specs/death_knight/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_combat::{
6    CombatSystemBuilder, CombatSystemDraft, AuraDefinitionDraft, LocalAuraIdx,
7    LocalSpellIdx, SpellDefinitionDraft,
8};
9use wowlab_engine_ports::{
10    DeclaredSpecMetadata, SpecDescriptor, SpecHandler, HeroTalentTreeDesc,
11};
12use wowlab_engine_gamedata::ResolvedGameData;
13pub(crate) mod SPELL {
14    ///<https://wowlab.gg/inspect/spell/49020>
15    pub(crate) const OBLITERATE: u32 = 49020;
16    ///<https://wowlab.gg/inspect/spell/49143>
17    pub(crate) const FROST_STRIKE: u32 = 49143;
18    ///<https://wowlab.gg/inspect/spell/49184>
19    pub(crate) const HOWLING_BLAST: u32 = 49184;
20    ///<https://wowlab.gg/inspect/spell/51271>
21    pub(crate) const PILLAR_OF_FROST: u32 = 51271;
22    ///<https://wowlab.gg/inspect/spell/47568>
23    pub(crate) const EMPOWER_RUNE_WEAPON: u32 = 47568;
24    ///<https://wowlab.gg/inspect/spell/279302>
25    pub(crate) const FROSTWYRMS_FURY: u32 = 279_302;
26    ///<https://wowlab.gg/inspect/spell/194913>
27    pub(crate) const GLACIAL_ADVANCE: u32 = 194_913;
28    ///<https://wowlab.gg/inspect/spell/207230>
29    pub(crate) const FROSTSCYTHE: u32 = 207_230;
30    ///<https://wowlab.gg/inspect/spell/343294>
31    pub(crate) const SOUL_REAPER: u32 = 343_294;
32    ///<https://wowlab.gg/inspect/spell/316239>
33    pub(crate) const RUNE_STRIKE: u32 = 316_239;
34    ///<https://wowlab.gg/inspect/spell/196770>
35    pub(crate) const REMORSELESS_WINTER: u32 = 196_770;
36    ///<https://wowlab.gg/inspect/spell/1249658>
37    pub(crate) const BREATH_OF_SINDRAGOSA: u32 = 1_249_658;
38    ///<https://wowlab.gg/inspect/spell/439843>
39    pub(crate) const REAPERS_MARK: u32 = 439_843;
40}
41pub(crate) mod AURA {
42    ///<https://wowlab.gg/inspect/spell/51124>
43    pub(crate) const KILLING_MACHINE: u32 = 51124;
44    ///<https://wowlab.gg/inspect/spell/59052>
45    pub(crate) const RIME: u32 = 59052;
46    ///<https://wowlab.gg/inspect/spell/51271>
47    pub(crate) const PILLAR_OF_FROST: u32 = 51271;
48    ///<https://wowlab.gg/inspect/spell/1230959>
49    pub(crate) const EMPOWER_RUNE_WEAPON: u32 = 1_230_959;
50    ///<https://wowlab.gg/inspect/spell/194879>
51    pub(crate) const ICY_TALONS: u32 = 194_879;
52    ///<https://wowlab.gg/inspect/spell/1265630>
53    pub(crate) const CHOSEN_OF_FROSTBROOD_HASTE: u32 = 1_265_630;
54    ///<https://wowlab.gg/inspect/spell/1229310>
55    pub(crate) const FROSTBANE: u32 = 1_229_310;
56    ///<https://wowlab.gg/inspect/spell/1230273>
57    pub(crate) const ICY_ONSLAUGHT: u32 = 1_230_273;
58    ///<https://wowlab.gg/inspect/spell/1230916>
59    pub(crate) const KILLING_STREAK: u32 = 1_230_916;
60    ///<https://wowlab.gg/inspect/spell/443595>
61    pub(crate) const DARK_TALONS_ICY_TALONS: u32 = 443_595;
62    ///<https://wowlab.gg/inspect/spell/55095>
63    pub(crate) const FROST_FEVER: u32 = 55095;
64    ///<https://wowlab.gg/inspect/spell/377101>
65    pub(crate) const BONEGRINDER_CRIT: u32 = 377_101;
66    ///<https://wowlab.gg/inspect/spell/377103>
67    pub(crate) const BONEGRINDER_FROST: u32 = 377_103;
68    ///<https://wowlab.gg/inspect/spell/374585>
69    pub(crate) const RUNE_MASTERY: u32 = 374_585;
70    ///<https://wowlab.gg/inspect/spell/51714>
71    pub(crate) const RAZORICE: u32 = 51714;
72    ///<https://wowlab.gg/inspect/spell/374557>
73    pub(crate) const BRITTLE: u32 = 374_557;
74    ///<https://wowlab.gg/inspect/spell/1233351>
75    pub(crate) const FROSTREAPER: u32 = 1_233_351;
76    ///<https://wowlab.gg/inspect/spell/377226>
77    pub(crate) const FROZEN_DOMINION: u32 = 377_226;
78    ///<https://wowlab.gg/inspect/spell/1249658>
79    pub(crate) const BREATH_OF_SINDRAGOSA: u32 = 1_249_658;
80    ///<https://wowlab.gg/inspect/spell/1233152>
81    pub(crate) const REMORSELESS_WINTER: u32 = 1_233_152;
82    ///<https://wowlab.gg/inspect/spell/1297365>
83    pub(crate) const FREEZING_TEMPEST: u32 = 1_297_365;
84    ///<https://wowlab.gg/inspect/spell/377253>
85    pub(crate) const FROZEN_DOMINION_MASTERY: u32 = 377_253;
86    ///<https://wowlab.gg/inspect/spell/441416>
87    pub(crate) const EXTERMINATE: u32 = 441_416;
88}
89pub(crate) mod TALENT {
90    ///<https://wowlab.gg/inspect/spell/1249658>
91    pub(crate) const BREATH_OF_SINDRAGOSA: u32 = 1_249_658;
92    ///<https://wowlab.gg/inspect/spell/374504>
93    pub(crate) const BRITTLE: u32 = 374_504;
94    ///<https://wowlab.gg/inspect/spell/1265632>
95    pub(crate) const CHOSEN_OF_FROSTBROOD: u32 = 1_265_632;
96    ///<https://wowlab.gg/inspect/spell/47568>
97    pub(crate) const EMPOWER_RUNE_WEAPON: u32 = 47568;
98    ///<https://wowlab.gg/inspect/spell/1230301>
99    pub(crate) const FROSTREAPER: u32 = 1_230_301;
100    ///<https://wowlab.gg/inspect/spell/207230>
101    pub(crate) const FROSTSCYTHE: u32 = 207_230;
102    ///<https://wowlab.gg/inspect/spell/279302>
103    pub(crate) const FROSTWYRMS_FURY: u32 = 279_302;
104    ///<https://wowlab.gg/inspect/spell/49143>
105    pub(crate) const FROST_STRIKE: u32 = 49143;
106    ///<https://wowlab.gg/inspect/spell/377226>
107    pub(crate) const FROZEN_DOMINION: u32 = 377_226;
108    ///<https://wowlab.gg/inspect/spell/194913>
109    pub(crate) const GLACIAL_ADVANCE: u32 = 194_913;
110    ///<https://wowlab.gg/inspect/spell/49184>
111    pub(crate) const HOWLING_BLAST: u32 = 49184;
112    ///<https://wowlab.gg/inspect/spell/51128>
113    pub(crate) const KILLING_MACHINE: u32 = 51128;
114    ///<https://wowlab.gg/inspect/spell/49020>
115    pub(crate) const OBLITERATE: u32 = 49020;
116    ///<https://wowlab.gg/inspect/spell/281238>
117    pub(crate) const OBLITERATION: u32 = 281_238;
118    ///<https://wowlab.gg/inspect/spell/51271>
119    pub(crate) const PILLAR_OF_FROST: u32 = 51271;
120    ///<https://wowlab.gg/inspect/spell/439843>
121    pub(crate) const REAPERS_MARK: u32 = 439_843;
122    ///<https://wowlab.gg/inspect/spell/343294>
123    pub(crate) const SOUL_REAPER: u32 = 343_294;
124}
125pub(crate) mod SET_BONUS {
126    ///<https://wowlab.gg/inspect/spell/1296652>
127    pub(crate) const MID2_FROST_2PC: u32 = 1_296_652;
128    ///<https://wowlab.gg/inspect/spell/1296653>
129    pub(crate) const MID2_FROST_4PC: u32 = 1_296_653;
130}
131pub(crate) mod REPORTED_SPELL {
132    ///<https://wowlab.gg/inspect/spell/155166>
133    pub(crate) const BREATH_OF_SINDRAGOSA_DAMAGE: u32 = 155_166;
134    ///<https://wowlab.gg/inspect/spell/1265384>
135    pub(crate) const CHOSEN_OF_FROSTBROOD_RECALL: u32 = 1_265_384;
136    ///<https://wowlab.gg/inspect/spell/458169>
137    pub(crate) const HYPERPYREXIA: u32 = 458_169;
138}
139pub(crate) mod HERO {
140    pub(crate) mod DEATHBRINGER {
141        pub(crate) mod SPELL {
142            ///<https://wowlab.gg/inspect/spell/441424>
143            pub(crate) const EXTERMINATE: u32 = 441_424;
144            ///<https://wowlab.gg/inspect/spell/441426>
145            pub(crate) const EXTERMINATE_AOE: u32 = 441_426;
146            ///<https://wowlab.gg/inspect/spell/439843>
147            pub(crate) const REAPERS_MARK: u32 = 439_843;
148            ///<https://wowlab.gg/inspect/spell/436304>
149            pub(crate) const REAPERS_MARK_EXPLOSION: u32 = 436_304;
150            ///<https://wowlab.gg/inspect/spell/435802>
151            pub(crate) const WAVE_OF_SOULS: u32 = 435_802;
152        }
153        pub(crate) mod AURA {
154            ///<https://wowlab.gg/inspect/spell/443532>
155            pub(crate) const BIND_IN_DARKNESS: u32 = 443_532;
156            ///<https://wowlab.gg/inspect/spell/441416>
157            pub(crate) const EXTERMINATE_BUFF: u32 = 441_416;
158            ///<https://wowlab.gg/inspect/spell/434765>
159            pub(crate) const REAPERS_MARK_DEBUFF: u32 = 434_765;
160        }
161    }
162    pub(crate) mod FROST {
163        pub(crate) mod SPELL {
164            ///<https://wowlab.gg/inspect/spell/1265384>
165            pub(crate) const CHOSEN_OF_FROSTBROOD: u32 = 1_265_384;
166            ///<https://wowlab.gg/inspect/spell/1233619>
167            pub(crate) const FROSTREAPER: u32 = 1_233_619;
168            ///<https://wowlab.gg/inspect/spell/195975>
169            pub(crate) const GLACIAL_ADVANCE_ARCTIC_ASSAULT_OBLITERATE: u32 = 195_975;
170            ///<https://wowlab.gg/inspect/spell/1231083>
171            pub(crate) const HOWLING_BLADES_FIRST: u32 = 1_231_083;
172            ///<https://wowlab.gg/inspect/spell/1231082>
173            pub(crate) const HOWLING_BLADES_SECOND: u32 = 1_231_082;
174            ///<https://wowlab.gg/inspect/spell/458169>
175            pub(crate) const HYPERPYREXIA: u32 = 458_169;
176            ///<https://wowlab.gg/inspect/spell/439539>
177            pub(crate) const ICY_DEATH_TORRENT: u32 = 439_539;
178            ///<https://wowlab.gg/inspect/spell/1264084>
179            pub(crate) const OBLITERATE_FROST: u32 = 1_264_084;
180        }
181    }
182}
183static HERO_TREE_DEATHBRINGER_SPELLS: &[(&str, u32)] = &[
184    ("EXTERMINATE", 441_424),
185    ("EXTERMINATE_AOE", 441_426),
186    ("REAPERS_MARK", 439_843),
187    ("REAPERS_MARK_EXPLOSION", 436_304),
188    ("WAVE_OF_SOULS", 435_802),
189];
190static HERO_TREE_DEATHBRINGER_AURAS: &[(&str, u32)] = &[
191    ("BIND_IN_DARKNESS", 443_532),
192    ("EXTERMINATE_BUFF", 441_416),
193    ("REAPERS_MARK_DEBUFF", 434_765),
194];
195static HERO_TREE_FROST_SPELLS: &[(&str, u32)] = &[
196    ("CHOSEN_OF_FROSTBROOD", 1_265_384),
197    ("FROSTREAPER", 1_233_619),
198    ("GLACIAL_ADVANCE_ARCTIC_ASSAULT_OBLITERATE", 195_975),
199    ("HOWLING_BLADES_FIRST", 1_231_083),
200    ("HOWLING_BLADES_SECOND", 1_231_082),
201    ("HYPERPYREXIA", 458_169),
202    ("ICY_DEATH_TORRENT", 439_539),
203    ("OBLITERATE_FROST", 1_264_084),
204];
205static HERO_TREE_FROST_AURAS: &[(&str, u32)] = &[];
206pub(crate) mod DAMAGE_SPELL {
207    pub(crate) const OBLITERATE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::ACTION::SPELL_49020;
208    pub(crate) const FROST_STRIKE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::ACTION::SPELL_49143;
209    pub(crate) const HOWLING_BLAST: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::ACTION::SPELL_49184;
210    pub(crate) const PILLAR_OF_FROST: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::ACTION::SPELL_51271;
211    pub(crate) const EMPOWER_RUNE_WEAPON: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::ACTION::SPELL_47568;
212    pub(crate) const FROSTWYRMS_FURY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::ACTION::SPELL_279302;
213    pub(crate) const GLACIAL_ADVANCE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::ACTION::SPELL_194913;
214    pub(crate) const FROSTSCYTHE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::ACTION::SPELL_207230;
215    pub(crate) const SOUL_REAPER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::ACTION::SPELL_343294;
216    pub(crate) const RUNE_STRIKE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::ACTION::SPELL_316239;
217    pub(crate) const REMORSELESS_WINTER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::ACTION::SPELL_196770;
218    pub(crate) const BREATH_OF_SINDRAGOSA: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::ACTION::SPELL_1249658;
219    pub(crate) const REAPERS_MARK: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::ACTION::SPELL_439843;
220    pub(crate) const EXTERMINATE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::ACTION::SPELL_441424;
221    pub(crate) const EXTERMINATE_AOE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::ACTION::SPELL_441426;
222    pub(crate) const REAPERS_MARK_EXPLOSION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::ACTION::SPELL_436304;
223    pub(crate) const WAVE_OF_SOULS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::ACTION::SPELL_435802;
224    pub(crate) const CHOSEN_OF_FROSTBROOD: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::ACTION::SPELL_1265384;
225    pub(crate) const FROSTREAPER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::ACTION::SPELL_1233619;
226    pub(crate) const GLACIAL_ADVANCE_ARCTIC_ASSAULT_OBLITERATE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::ACTION::SPELL_195975;
227    pub(crate) const HOWLING_BLADES_FIRST: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::ACTION::SPELL_1231083;
228    pub(crate) const HOWLING_BLADES_SECOND: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::ACTION::SPELL_1231082;
229    pub(crate) const HYPERPYREXIA: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::ACTION::SPELL_458169;
230    pub(crate) const ICY_DEATH_TORRENT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::ACTION::SPELL_439539;
231    pub(crate) const OBLITERATE_FROST: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::ACTION::SPELL_1264084;
232}
233pub(crate) mod DAMAGE_AURA {
234    pub(crate) const KILLING_MACHINE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::ACTION::SPELL_51124;
235    pub(crate) const RIME: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::ACTION::SPELL_59052;
236    pub(crate) const PILLAR_OF_FROST: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::ACTION::SPELL_51271;
237    pub(crate) const EMPOWER_RUNE_WEAPON: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::ACTION::SPELL_1230959;
238    pub(crate) const ICY_TALONS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::ACTION::SPELL_194879;
239    pub(crate) const CHOSEN_OF_FROSTBROOD_HASTE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::ACTION::SPELL_1265630;
240    pub(crate) const FROSTBANE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::ACTION::SPELL_1229310;
241    pub(crate) const ICY_ONSLAUGHT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::ACTION::SPELL_1230273;
242    pub(crate) const KILLING_STREAK: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::ACTION::SPELL_1230916;
243    pub(crate) const DARK_TALONS_ICY_TALONS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::ACTION::SPELL_443595;
244    pub(crate) const FROST_FEVER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::ACTION::SPELL_55095;
245    pub(crate) const BONEGRINDER_CRIT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::ACTION::SPELL_377101;
246    pub(crate) const BONEGRINDER_FROST: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::ACTION::SPELL_377103;
247    pub(crate) const RUNE_MASTERY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::ACTION::SPELL_374585;
248    pub(crate) const RAZORICE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::ACTION::SPELL_51714;
249    pub(crate) const BRITTLE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::ACTION::SPELL_374557;
250    pub(crate) const FROSTREAPER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::ACTION::SPELL_1233351;
251    pub(crate) const FROZEN_DOMINION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::ACTION::SPELL_377226;
252    pub(crate) const BREATH_OF_SINDRAGOSA: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::ACTION::SPELL_1249658;
253    pub(crate) const REMORSELESS_WINTER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::ACTION::SPELL_1233152;
254    pub(crate) const FREEZING_TEMPEST: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::ACTION::SPELL_1297365;
255    pub(crate) const FROZEN_DOMINION_MASTERY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::ACTION::SPELL_377253;
256    pub(crate) const EXTERMINATE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::ACTION::SPELL_441416;
257}
258pub(crate) mod DAMAGE_TALENT {
259    pub(crate) const BREATH_OF_SINDRAGOSA: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::ACTION::SPELL_1249658;
260    pub(crate) const BRITTLE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::ACTION::SPELL_374504;
261    pub(crate) const CHOSEN_OF_FROSTBROOD: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::ACTION::SPELL_1265632;
262    pub(crate) const EMPOWER_RUNE_WEAPON: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::ACTION::SPELL_47568;
263    pub(crate) const FROSTREAPER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::ACTION::SPELL_1230301;
264    pub(crate) const FROSTSCYTHE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::ACTION::SPELL_207230;
265    pub(crate) const FROSTWYRMS_FURY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::ACTION::SPELL_279302;
266    pub(crate) const FROST_STRIKE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::ACTION::SPELL_49143;
267    pub(crate) const FROZEN_DOMINION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::ACTION::SPELL_377226;
268    pub(crate) const GLACIAL_ADVANCE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::ACTION::SPELL_194913;
269    pub(crate) const HOWLING_BLAST: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::ACTION::SPELL_49184;
270    pub(crate) const KILLING_MACHINE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::ACTION::SPELL_51128;
271    pub(crate) const OBLITERATE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::ACTION::SPELL_49020;
272    pub(crate) const OBLITERATION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::ACTION::SPELL_281238;
273    pub(crate) const PILLAR_OF_FROST: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::ACTION::SPELL_51271;
274    pub(crate) const REAPERS_MARK: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::ACTION::SPELL_439843;
275    pub(crate) const SOUL_REAPER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::ACTION::SPELL_343294;
276}
277pub(crate) mod DAMAGE_REPORTED {
278    pub(crate) const BREATH_OF_SINDRAGOSA_DAMAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::ACTION::SPELL_155166;
279    pub(crate) const CHOSEN_OF_FROSTBROOD_RECALL: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::ACTION::SPELL_1265384;
280    pub(crate) const HYPERPYREXIA: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::ACTION::SPELL_458169;
281}
282pub(crate) mod DAMAGE_EFFECT {
283    pub(crate) const ARCTIC_ASSAULT_PCT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::EFFECT::SPELL_456230_EFFECT_1;
284    pub(crate) const BIND_IN_DARKNESS_HB_PCT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::EFFECT::SPELL_440031_EFFECT_4;
285    pub(crate) const BOS_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::EFFECT::SPELL_155166_EFFECT_2;
286    pub(crate) const BOS_RUNE_REFUND: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::EFFECT::SPELL_1234304_EFFECT_1;
287    pub(crate) const COF_FWF_PCT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::EFFECT::SPELL_1265637_EFFECT_1;
288    pub(crate) const COF_SPELLS_PCT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::EFFECT::SPELL_1265637_EFFECT_3;
289    pub(crate) const DARK_TALONS_CHANCE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::EFFECT::SPELL_436687_EFFECT_1;
290    pub(crate) const DEATHLY_BLOWS_FS_PCT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::EFFECT::SPELL_1265932_EFFECT_1;
291    pub(crate) const ECHOING_FURY_STACKS: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::EFFECT::SPELL_1265855_EFFECT_1;
292    pub(crate) const ERW_RP: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::EFFECT::SPELL_1230959_EFFECT_1;
293    pub(crate) const EXTERMINATE_AOE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::EFFECT::SPELL_441426_EFFECT_2;
294    pub(crate) const EXTERMINATE_HIT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::EFFECT::SPELL_441424_EFFECT_2;
295    pub(crate) const EXTERMINATE_STACKS: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::EFFECT::SPELL_441378_EFFECT_3;
296    pub(crate) const FRIGID_EXECUTIONER_PCT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::EFFECT::SPELL_377073_EFFECT_2;
297    pub(crate) const FROSTREAPER_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::EFFECT::SPELL_1233619_EFFECT_1;
298    pub(crate) const FROSTWYRMS_FURY_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::EFFECT::SPELL_279303_EFFECT_1;
299    pub(crate) const FROST_DK_SPEC_PCT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::EFFECT::SPELL_137006_EFFECT_1;
300    pub(crate) const FROST_STRIKE_2H: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::EFFECT::SPELL_325464_EFFECT_1;
301    pub(crate) const GLACIAL_ADVANCE_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::EFFECT::SPELL_195975_EFFECT_1;
302    pub(crate) const GRIM_REAPER_MAX_PCT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::EFFECT::SPELL_434905_EFFECT_1;
303    pub(crate) const HOWLING_BLADES_FIRST: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::EFFECT::SPELL_1231083_EFFECT_1;
304    pub(crate) const HOWLING_BLADES_KM_PCT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::EFFECT::SPELL_1230223_EFFECT_1;
305    pub(crate) const HOWLING_BLADES_SECOND: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::EFFECT::SPELL_1231082_EFFECT_1;
306    pub(crate) const HOWLING_BLAST_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::EFFECT::SPELL_49184_EFFECT_1;
307    pub(crate) const HYPERPYREXIA_PORTION_PCT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::EFFECT::SPELL_456238_EFFECT_1;
308    pub(crate) const ICEBREAKER_PCT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::EFFECT::SPELL_392950_EFFECT_1;
309    pub(crate) const ICY_DEATH_TORRENT_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::EFFECT::SPELL_439539_EFFECT_1;
310    pub(crate) const MOTFW_ALL_PCT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::EFFECT::SPELL_81333_EFFECT_2;
311    pub(crate) const MURDEROUS_EFFICIENCY_PCT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::EFFECT::SPELL_207061_EFFECT_1;
312    pub(crate) const NORTHWINDS_RIME_PCT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::EFFECT::SPELL_1230284_EFFECT_1;
313    pub(crate) const OBLITERATE_FROST: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::EFFECT::SPELL_1264084_EFFECT_1;
314    pub(crate) const OBLITERATE_PHYS: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::EFFECT::SPELL_325461_EFFECT_1;
315    pub(crate) const OBLITERATION_RUNE_PCT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::EFFECT::SPELL_281238_EFFECT_2;
316    pub(crate) const RAGE_OF_FROZEN_CHAMPION_RP: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::EFFECT::SPELL_377077_EFFECT_1;
317    pub(crate) const REAPERS_MARK_EXPLOSION: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::EFFECT::SPELL_436304_EFFECT_2;
318    pub(crate) const REAPERS_MARK_STACKS: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::EFFECT::SPELL_434765_EFFECT_1;
319    pub(crate) const RIME_HB_BONUS_PCT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::EFFECT::SPELL_59052_EFFECT_2;
320    pub(crate) const RIME_PROC_PCT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::EFFECT::SPELL_59057_EFFECT_2;
321    pub(crate) const RUNIC_EMPOWERMENT_PCT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::EFFECT::SPELL_81229_EFFECT_1;
322    pub(crate) const RUNIC_OVERFLOW_FS_PCT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::EFFECT::SPELL_316803_EFFECT_1;
323    pub(crate) const WAVE_OF_SOULS_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::EFFECT::SPELL_435802_EFFECT_2;
324}
325pub(crate) const AURA_KILLING_MACHINE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::frost_death_knight::AURA_KILLING_MACHINE
326    .bind(wowlab_engine_combat::generated_identities::specs::frost_death_knight::PROOF);
327pub(crate) const AURA_RIME: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::frost_death_knight::AURA_RIME
328    .bind(wowlab_engine_combat::generated_identities::specs::frost_death_knight::PROOF);
329pub(crate) const AURA_PILLAR_OF_FROST: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::frost_death_knight::AURA_PILLAR_OF_FROST
330    .bind(wowlab_engine_combat::generated_identities::specs::frost_death_knight::PROOF);
331pub(crate) const AURA_EMPOWER_RUNE_WEAPON: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::frost_death_knight::AURA_EMPOWER_RUNE_WEAPON
332    .bind(wowlab_engine_combat::generated_identities::specs::frost_death_knight::PROOF);
333pub(crate) const AURA_ICY_TALONS: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::frost_death_knight::AURA_ICY_TALONS
334    .bind(wowlab_engine_combat::generated_identities::specs::frost_death_knight::PROOF);
335pub(crate) const AURA_CHOSEN_OF_FROSTBROOD_HASTE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::frost_death_knight::AURA_CHOSEN_OF_FROSTBROOD_HASTE
336    .bind(wowlab_engine_combat::generated_identities::specs::frost_death_knight::PROOF);
337pub(crate) const AURA_FROSTBANE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::frost_death_knight::AURA_FROSTBANE
338    .bind(wowlab_engine_combat::generated_identities::specs::frost_death_knight::PROOF);
339pub(crate) const AURA_ICY_ONSLAUGHT: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::frost_death_knight::AURA_ICY_ONSLAUGHT
340    .bind(wowlab_engine_combat::generated_identities::specs::frost_death_knight::PROOF);
341pub(crate) const AURA_KILLING_STREAK: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::frost_death_knight::AURA_KILLING_STREAK
342    .bind(wowlab_engine_combat::generated_identities::specs::frost_death_knight::PROOF);
343pub(crate) const AURA_DARK_TALONS_ICY_TALONS: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::frost_death_knight::AURA_DARK_TALONS_ICY_TALONS
344    .bind(wowlab_engine_combat::generated_identities::specs::frost_death_knight::PROOF);
345pub(crate) const AURA_FROST_FEVER: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::frost_death_knight::AURA_FROST_FEVER
346    .bind(wowlab_engine_combat::generated_identities::specs::frost_death_knight::PROOF);
347pub(crate) const AURA_BONEGRINDER_CRIT: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::frost_death_knight::AURA_BONEGRINDER_CRIT
348    .bind(wowlab_engine_combat::generated_identities::specs::frost_death_knight::PROOF);
349pub(crate) const AURA_BONEGRINDER_FROST: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::frost_death_knight::AURA_BONEGRINDER_FROST
350    .bind(wowlab_engine_combat::generated_identities::specs::frost_death_knight::PROOF);
351pub(crate) const AURA_RUNE_MASTERY: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::frost_death_knight::AURA_RUNE_MASTERY
352    .bind(wowlab_engine_combat::generated_identities::specs::frost_death_knight::PROOF);
353pub(crate) const AURA_RAZORICE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::frost_death_knight::AURA_RAZORICE
354    .bind(wowlab_engine_combat::generated_identities::specs::frost_death_knight::PROOF);
355pub(crate) const AURA_BRITTLE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::frost_death_knight::AURA_BRITTLE
356    .bind(wowlab_engine_combat::generated_identities::specs::frost_death_knight::PROOF);
357pub(crate) const AURA_FROSTREAPER: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::frost_death_knight::AURA_FROSTREAPER
358    .bind(wowlab_engine_combat::generated_identities::specs::frost_death_knight::PROOF);
359pub(crate) const AURA_FROZEN_DOMINION: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::frost_death_knight::AURA_FROZEN_DOMINION
360    .bind(wowlab_engine_combat::generated_identities::specs::frost_death_knight::PROOF);
361pub(crate) const AURA_BREATH_OF_SINDRAGOSA: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::frost_death_knight::AURA_BREATH_OF_SINDRAGOSA
362    .bind(wowlab_engine_combat::generated_identities::specs::frost_death_knight::PROOF);
363pub(crate) const AURA_REMORSELESS_WINTER: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::frost_death_knight::AURA_REMORSELESS_WINTER
364    .bind(wowlab_engine_combat::generated_identities::specs::frost_death_knight::PROOF);
365pub(crate) const AURA_FREEZING_TEMPEST: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::frost_death_knight::AURA_FREEZING_TEMPEST
366    .bind(wowlab_engine_combat::generated_identities::specs::frost_death_knight::PROOF);
367pub(crate) const AURA_FROZEN_DOMINION_MASTERY: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::frost_death_knight::AURA_FROZEN_DOMINION_MASTERY
368    .bind(wowlab_engine_combat::generated_identities::specs::frost_death_knight::PROOF);
369pub(crate) const AURA_EXTERMINATE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::frost_death_knight::AURA_EXTERMINATE
370    .bind(wowlab_engine_combat::generated_identities::specs::frost_death_knight::PROOF);
371pub(crate) const AURA_COUNT: usize = 23;
372const _: () = assert!(
373    AURA_COUNT == 23, "AURA index ABI: count changed -- update positional hook consumers"
374);
375pub(crate) const SPELL_OBLITERATE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::frost_death_knight::SPELL_OBLITERATE
376    .bind(wowlab_engine_combat::generated_identities::specs::frost_death_knight::PROOF);
377pub(crate) const SPELL_FROST_STRIKE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::frost_death_knight::SPELL_FROST_STRIKE
378    .bind(wowlab_engine_combat::generated_identities::specs::frost_death_knight::PROOF);
379pub(crate) const SPELL_HOWLING_BLAST: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::frost_death_knight::SPELL_HOWLING_BLAST
380    .bind(wowlab_engine_combat::generated_identities::specs::frost_death_knight::PROOF);
381pub(crate) const SPELL_PILLAR_OF_FROST: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::frost_death_knight::SPELL_PILLAR_OF_FROST
382    .bind(wowlab_engine_combat::generated_identities::specs::frost_death_knight::PROOF);
383pub(crate) const SPELL_EMPOWER_RUNE_WEAPON: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::frost_death_knight::SPELL_EMPOWER_RUNE_WEAPON
384    .bind(wowlab_engine_combat::generated_identities::specs::frost_death_knight::PROOF);
385pub(crate) const SPELL_FROSTWYRMS_FURY: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::frost_death_knight::SPELL_FROSTWYRMS_FURY
386    .bind(wowlab_engine_combat::generated_identities::specs::frost_death_knight::PROOF);
387pub(crate) const SPELL_GLACIAL_ADVANCE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::frost_death_knight::SPELL_GLACIAL_ADVANCE
388    .bind(wowlab_engine_combat::generated_identities::specs::frost_death_knight::PROOF);
389pub(crate) const SPELL_FROSTSCYTHE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::frost_death_knight::SPELL_FROSTSCYTHE
390    .bind(wowlab_engine_combat::generated_identities::specs::frost_death_knight::PROOF);
391pub(crate) const SPELL_SOUL_REAPER: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::frost_death_knight::SPELL_SOUL_REAPER
392    .bind(wowlab_engine_combat::generated_identities::specs::frost_death_knight::PROOF);
393pub(crate) const SPELL_RUNE_STRIKE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::frost_death_knight::SPELL_RUNE_STRIKE
394    .bind(wowlab_engine_combat::generated_identities::specs::frost_death_knight::PROOF);
395pub(crate) const SPELL_REMORSELESS_WINTER: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::frost_death_knight::SPELL_REMORSELESS_WINTER
396    .bind(wowlab_engine_combat::generated_identities::specs::frost_death_knight::PROOF);
397pub(crate) const SPELL_BREATH_OF_SINDRAGOSA: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::frost_death_knight::SPELL_BREATH_OF_SINDRAGOSA
398    .bind(wowlab_engine_combat::generated_identities::specs::frost_death_knight::PROOF);
399pub(crate) const SPELL_REAPERS_MARK: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::frost_death_knight::SPELL_REAPERS_MARK
400    .bind(wowlab_engine_combat::generated_identities::specs::frost_death_knight::PROOF);
401pub(crate) const SPELL_COUNT: usize = 13;
402const _: () = assert!(
403    SPELL_COUNT == 13,
404    "SPELL index ABI: count changed -- update positional hook consumers"
405);
406pub(crate) mod EFFECT {
407    ///<https://wowlab.gg/inspect/spell/456230>
408    pub(crate) const ARCTIC_ASSAULT_PCT: (u32, u8) = (456_230, 1);
409    ///<https://wowlab.gg/inspect/spell/440031>
410    pub(crate) const BIND_IN_DARKNESS_HB_PCT: (u32, u8) = (440_031, 4);
411    ///<https://wowlab.gg/inspect/spell/155166>
412    pub(crate) const BOS_DAMAGE: (u32, u8) = (155_166, 2);
413    ///<https://wowlab.gg/inspect/spell/1234304>
414    pub(crate) const BOS_RUNE_REFUND: (u32, u8) = (1_234_304, 1);
415    ///<https://wowlab.gg/inspect/spell/1265637>
416    pub(crate) const COF_FWF_PCT: (u32, u8) = (1_265_637, 1);
417    ///<https://wowlab.gg/inspect/spell/1265637>
418    pub(crate) const COF_SPELLS_PCT: (u32, u8) = (1_265_637, 3);
419    ///<https://wowlab.gg/inspect/spell/436687>
420    pub(crate) const DARK_TALONS_CHANCE: (u32, u8) = (436_687, 1);
421    ///<https://wowlab.gg/inspect/spell/1265932>
422    pub(crate) const DEATHLY_BLOWS_FS_PCT: (u32, u8) = (1_265_932, 1);
423    ///<https://wowlab.gg/inspect/spell/1265855>
424    pub(crate) const ECHOING_FURY_STACKS: (u32, u8) = (1_265_855, 1);
425    ///<https://wowlab.gg/inspect/spell/1230959>
426    pub(crate) const ERW_RP: (u32, u8) = (1_230_959, 1);
427    ///<https://wowlab.gg/inspect/spell/441426>
428    pub(crate) const EXTERMINATE_AOE: (u32, u8) = (441_426, 2);
429    ///<https://wowlab.gg/inspect/spell/441424>
430    pub(crate) const EXTERMINATE_HIT: (u32, u8) = (441_424, 2);
431    ///<https://wowlab.gg/inspect/spell/441378>
432    pub(crate) const EXTERMINATE_STACKS: (u32, u8) = (441_378, 3);
433    ///<https://wowlab.gg/inspect/spell/377073>
434    pub(crate) const FRIGID_EXECUTIONER_PCT: (u32, u8) = (377_073, 2);
435    ///<https://wowlab.gg/inspect/spell/1233619>
436    pub(crate) const FROSTREAPER_DAMAGE: (u32, u8) = (1_233_619, 1);
437    ///<https://wowlab.gg/inspect/spell/279303>
438    pub(crate) const FROSTWYRMS_FURY_DAMAGE: (u32, u8) = (279_303, 1);
439    ///<https://wowlab.gg/inspect/spell/137006>
440    pub(crate) const FROST_DK_SPEC_PCT: (u32, u8) = (137_006, 1);
441    ///<https://wowlab.gg/inspect/spell/325464>
442    pub(crate) const FROST_STRIKE_2H: (u32, u8) = (325_464, 1);
443    ///<https://wowlab.gg/inspect/spell/195975>
444    pub(crate) const GLACIAL_ADVANCE_DAMAGE: (u32, u8) = (195_975, 1);
445    ///<https://wowlab.gg/inspect/spell/434905>
446    pub(crate) const GRIM_REAPER_MAX_PCT: (u32, u8) = (434_905, 1);
447    ///<https://wowlab.gg/inspect/spell/1231083>
448    pub(crate) const HOWLING_BLADES_FIRST: (u32, u8) = (1_231_083, 1);
449    ///<https://wowlab.gg/inspect/spell/1230223>
450    pub(crate) const HOWLING_BLADES_KM_PCT: (u32, u8) = (1_230_223, 1);
451    ///<https://wowlab.gg/inspect/spell/1231082>
452    pub(crate) const HOWLING_BLADES_SECOND: (u32, u8) = (1_231_082, 1);
453    ///<https://wowlab.gg/inspect/spell/49184>
454    pub(crate) const HOWLING_BLAST_DAMAGE: (u32, u8) = (49184, 1);
455    ///<https://wowlab.gg/inspect/spell/456238>
456    pub(crate) const HYPERPYREXIA_PORTION_PCT: (u32, u8) = (456_238, 1);
457    ///<https://wowlab.gg/inspect/spell/392950>
458    pub(crate) const ICEBREAKER_PCT: (u32, u8) = (392_950, 1);
459    ///<https://wowlab.gg/inspect/spell/439539>
460    pub(crate) const ICY_DEATH_TORRENT_DAMAGE: (u32, u8) = (439_539, 1);
461    ///<https://wowlab.gg/inspect/spell/81333>
462    pub(crate) const MOTFW_ALL_PCT: (u32, u8) = (81333, 2);
463    ///<https://wowlab.gg/inspect/spell/207061>
464    pub(crate) const MURDEROUS_EFFICIENCY_PCT: (u32, u8) = (207_061, 1);
465    ///<https://wowlab.gg/inspect/spell/1230284>
466    pub(crate) const NORTHWINDS_RIME_PCT: (u32, u8) = (1_230_284, 1);
467    ///<https://wowlab.gg/inspect/spell/1264084>
468    pub(crate) const OBLITERATE_FROST: (u32, u8) = (1_264_084, 1);
469    ///<https://wowlab.gg/inspect/spell/325461>
470    pub(crate) const OBLITERATE_PHYS: (u32, u8) = (325_461, 1);
471    ///<https://wowlab.gg/inspect/spell/281238>
472    pub(crate) const OBLITERATION_RUNE_PCT: (u32, u8) = (281_238, 2);
473    ///<https://wowlab.gg/inspect/spell/377077>
474    pub(crate) const RAGE_OF_FROZEN_CHAMPION_RP: (u32, u8) = (377_077, 1);
475    ///<https://wowlab.gg/inspect/spell/436304>
476    pub(crate) const REAPERS_MARK_EXPLOSION: (u32, u8) = (436_304, 2);
477    ///<https://wowlab.gg/inspect/spell/434765>
478    pub(crate) const REAPERS_MARK_STACKS: (u32, u8) = (434_765, 1);
479    ///<https://wowlab.gg/inspect/spell/59052>
480    pub(crate) const RIME_HB_BONUS_PCT: (u32, u8) = (59052, 2);
481    ///<https://wowlab.gg/inspect/spell/59057>
482    pub(crate) const RIME_PROC_PCT: (u32, u8) = (59057, 2);
483    ///<https://wowlab.gg/inspect/spell/81229>
484    pub(crate) const RUNIC_EMPOWERMENT_PCT: (u32, u8) = (81229, 1);
485    ///<https://wowlab.gg/inspect/spell/316803>
486    pub(crate) const RUNIC_OVERFLOW_FS_PCT: (u32, u8) = (316_803, 1);
487    ///<https://wowlab.gg/inspect/spell/435802>
488    pub(crate) const WAVE_OF_SOULS_DAMAGE: (u32, u8) = (435_802, 2);
489}
490static REPORTED_SPELLS: &[(&str, u32)] = &[
491    ("breath_of_sindragosa_damage", 155_166),
492    ("chosen_of_frostbrood_recall", 1_265_384),
493    ("hyperpyrexia", 458_169),
494];
495static DECLARED_SPELL_IDS: &[u32] = &[
496    49020, 49143, 49184, 51271, 47568, 279_302, 194_913, 207_230, 343_294, 316_239,
497    196_770, 1_249_658, 439_843, 51124, 59052, 1_230_959, 194_879, 1_265_630, 1_229_310,
498    1_230_273, 1_230_916, 443_595, 55095, 377_101, 377_103, 374_585, 51714, 374_557,
499    1_233_351, 377_226, 1_233_152, 1_297_365, 377_253, 441_416, 374_504, 1_265_632,
500    1_230_301, 51128, 281_238, 6603, 59057, 77514, 81229, 81333, 137_006, 155_166,
501    194_878, 195_975, 196_771, 207_061, 279_303, 316_803, 325_461, 325_464, 374_574,
502    377_073, 377_077, 392_950, 434_765, 434_905, 435_802, 436_304, 436_687, 439_539,
503    440_031, 441_378, 441_424, 441_426, 456_230, 456_238, 458_169, 1_230_223, 1_230_284,
504    1_231_082, 1_231_083, 1_233_619, 1_234_304, 1_264_084, 1_265_384, 1_265_637,
505    1_265_855, 1_265_932, 443_532,
506];
507static DECLARED_AURA_IDS: &[u32] = &[
508    51124, 59052, 51271, 1_230_959, 194_879, 1_265_630, 1_229_310, 1_230_273, 1_230_916,
509    443_595, 55095, 377_101, 377_103, 374_585, 51714, 374_557, 1_233_351, 377_226,
510    1_249_658, 1_233_152, 1_297_365, 377_253, 441_416, 443_532, 441_416, 434_765,
511];
512static TALENTS: &[(&str, u32)] = &[
513    ("BREATH_OF_SINDRAGOSA", TALENT::BREATH_OF_SINDRAGOSA),
514    ("BRITTLE", TALENT::BRITTLE),
515    ("CHOSEN_OF_FROSTBROOD", TALENT::CHOSEN_OF_FROSTBROOD),
516    ("EMPOWER_RUNE_WEAPON", TALENT::EMPOWER_RUNE_WEAPON),
517    ("FROSTREAPER", TALENT::FROSTREAPER),
518    ("FROSTSCYTHE", TALENT::FROSTSCYTHE),
519    ("FROSTWYRMS_FURY", TALENT::FROSTWYRMS_FURY),
520    ("FROST_STRIKE", TALENT::FROST_STRIKE),
521    ("FROZEN_DOMINION", TALENT::FROZEN_DOMINION),
522    ("GLACIAL_ADVANCE", TALENT::GLACIAL_ADVANCE),
523    ("HOWLING_BLAST", TALENT::HOWLING_BLAST),
524    ("KILLING_MACHINE", TALENT::KILLING_MACHINE),
525    ("OBLITERATE", TALENT::OBLITERATE),
526    ("OBLITERATION", TALENT::OBLITERATION),
527    ("PILLAR_OF_FROST", TALENT::PILLAR_OF_FROST),
528    ("REAPERS_MARK", TALENT::REAPERS_MARK),
529    ("SOUL_REAPER", TALENT::SOUL_REAPER),
530];
531pub(crate) mod FROST_DK {
532    pub(crate) const OBLITERATE_CASTS: u32 = 0;
533    pub(crate) const FROST_STRIKE_CASTS: u32 = 1;
534    pub(crate) const HOWLING_BLAST_CASTS: u32 = 2;
535    pub(crate) const PILLAR_OF_FROST_CASTS: u32 = 3;
536    pub(crate) const BREATH_OF_SINDRAGOSA_CASTS: u32 = 4;
537    pub(crate) const REMORSELESS_WINTER_CASTS: u32 = 5;
538    pub(crate) const FROSTWYRMS_FURY_CASTS: u32 = 6;
539    pub(crate) const KILLING_MACHINE_UPTIME_MS: u32 = 7;
540    pub(crate) const PILLAR_OF_FROST_UPTIME_MS: u32 = 8;
541}
542fn aura_killing_machine(
543    a: AuraDefinitionDraft,
544    data: &ResolvedGameData,
545) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
546    Ok(
547        a
548            .on_player()
549            .apply_base_from_data(data, 51124)?
550            .max_stacks(
551                data
552                    .require_aura_max_stacks(
553                        wowlab_types::sim::SpellIdx::from_raw(51124),
554                    )?,
555            )
556            .on_consume_extend(
557                AURA_BREATH_OF_SINDRAGOSA,
558                wowlab_engine_combat::validated_milliseconds(
559                    data
560                        .base_points(
561                            wowlab_types::sim::SpellIdx::from_raw(1_249_658),
562                            3,
563                        ),
564                    51124,
565                    "aura.on_consume.extend_aura.amount_ms",
566                )?,
567            ),
568    )
569}
570fn aura_rime(
571    a: AuraDefinitionDraft,
572    data: &ResolvedGameData,
573) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
574    Ok(
575        a
576            .on_player()
577            .apply_base_from_data(data, 59052)?
578            .max_stacks(
579                data
580                    .require_aura_max_stacks(
581                        wowlab_types::sim::SpellIdx::from_raw(59052),
582                    )?,
583            )
584            .on_consume_extend(
585                AURA_BREATH_OF_SINDRAGOSA,
586                wowlab_engine_combat::validated_milliseconds(
587                    data
588                        .base_points(
589                            wowlab_types::sim::SpellIdx::from_raw(1_249_658),
590                            3,
591                        ),
592                    59052,
593                    "aura.on_consume.extend_aura.amount_ms",
594                )?,
595            ),
596    )
597}
598fn aura_pillar_of_frost(
599    a: AuraDefinitionDraft,
600    data: &ResolvedGameData,
601) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
602    a.on_player()
603        .apply_base_from_data(data, 51271)?
604        .max_stacks(
605            data.require_aura_max_stacks(wowlab_types::sim::SpellIdx::from_raw(51271))?,
606        )
607        .primary_pct_per_stack(
608            data.base_points(wowlab_types::sim::SpellIdx::from_raw(51271), 1),
609        )
610}
611fn aura_empower_rune_weapon(
612    a: AuraDefinitionDraft,
613    data: &ResolvedGameData,
614) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
615    Ok(
616        a
617            .on_player()
618            .apply_base_from_data(data, 1_230_959)?
619            .max_stacks(
620                data
621                    .require_aura_max_stacks(
622                        wowlab_types::sim::SpellIdx::from_raw(1_230_959),
623                    )?,
624            ),
625    )
626}
627fn aura_icy_talons(
628    a: AuraDefinitionDraft,
629    data: &ResolvedGameData,
630) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
631    Ok(
632        a
633            .on_player()
634            .apply_base_from_data(data, 194_879)?
635            .max_stacks(
636                data
637                    .require_aura_max_stacks(
638                        wowlab_types::sim::SpellIdx::from_raw(194_879),
639                    )?,
640            ),
641    )
642}
643fn aura_chosen_of_frostbrood_haste(
644    a: AuraDefinitionDraft,
645    data: &ResolvedGameData,
646) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
647    Ok(
648        a
649            .on_player()
650            .apply_base_from_data(data, 1_265_630)?
651            .max_stacks(
652                data
653                    .require_aura_max_stacks(
654                        wowlab_types::sim::SpellIdx::from_raw(1_265_630),
655                    )?,
656            ),
657    )
658}
659fn aura_frostbane(
660    a: AuraDefinitionDraft,
661    data: &ResolvedGameData,
662) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
663    Ok(
664        a
665            .on_player()
666            .apply_base_from_data(data, 1_229_310)?
667            .max_stacks(
668                data
669                    .require_aura_max_stacks(
670                        wowlab_types::sim::SpellIdx::from_raw(1_229_310),
671                    )?,
672            ),
673    )
674}
675fn aura_icy_onslaught(
676    a: AuraDefinitionDraft,
677    data: &ResolvedGameData,
678) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
679    Ok(
680        a
681            .on_player()
682            .apply_base_from_data(data, 1_230_273)?
683            .max_stacks(
684                data
685                    .require_aura_max_stacks(
686                        wowlab_types::sim::SpellIdx::from_raw(1_230_273),
687                    )?,
688            ),
689    )
690}
691fn aura_killing_streak(
692    a: AuraDefinitionDraft,
693    data: &ResolvedGameData,
694) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
695    Ok(
696        a
697            .on_player()
698            .apply_base_from_data(data, 1_230_916)?
699            .max_stacks(
700                data
701                    .require_aura_max_stacks(
702                        wowlab_types::sim::SpellIdx::from_raw(1_230_916),
703                    )?,
704            )
705            .haste_per_stack(
706                (data.base_points(wowlab_types::sim::SpellIdx::from_raw(1_230_916), 1))
707                    * 0.1,
708            )?
709            .async_stacks(),
710    )
711}
712fn aura_dark_talons_icy_talons(
713    a: AuraDefinitionDraft,
714    data: &ResolvedGameData,
715) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
716    a.on_player()
717        .apply_base_from_data(data, 443_595)?
718        .max_stacks(
719            data.require_aura_max_stacks(wowlab_types::sim::SpellIdx::from_raw(443_595))?,
720        )
721        .attack_speed_per_stack(
722            (data.base_points(wowlab_types::sim::SpellIdx::from_raw(194_878), 1)) * 3.0,
723        )?
724        .auto_attack_damage_per_stack(
725            (data.base_points(wowlab_types::sim::SpellIdx::from_raw(194_879), 2)) * 3.0,
726        )
727}
728fn aura_frost_fever(
729    a: AuraDefinitionDraft,
730    data: &ResolvedGameData,
731) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
732    Ok(
733        a
734            .on_target()
735            .apply_base_from_data(data, 55095)?
736            .max_stacks(
737                data
738                    .require_aura_max_stacks(
739                        wowlab_types::sim::SpellIdx::from_raw(55095),
740                    )?,
741            )
742            .periodic_hook(
743                wowlab_engine_combat::validated_milliseconds(
744                    data.period(wowlab_types::sim::SpellIdx::from_raw(55095), 1),
745                    55095,
746                    "periodic_hook.tick_ms",
747                )?,
748            )
749            .apply_periodic_behavior_from_data(data, 55095)?
750            .tick_hook(crate::hooks::frost_death_knight::frost_fever_tick_hook),
751    )
752}
753fn aura_bonegrinder_crit(
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, 377_101)?
761            .max_stacks(
762                wowlab_engine_combat::validated_max_stacks(
763                    5.0,
764                    377_101,
765                    "aura.max_stacks",
766                )?,
767            ),
768    )
769}
770fn aura_bonegrinder_frost(
771    a: AuraDefinitionDraft,
772    data: &ResolvedGameData,
773) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
774    Ok(
775        a
776            .on_player()
777            .apply_base_from_data(data, 377_103)?
778            .max_stacks(
779                data
780                    .require_aura_max_stacks(
781                        wowlab_types::sim::SpellIdx::from_raw(377_103),
782                    )?,
783            ),
784    )
785}
786fn aura_rune_mastery(
787    a: AuraDefinitionDraft,
788    data: &ResolvedGameData,
789) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
790    a.on_player()
791        .apply_base_from_data(data, 374_585)?
792        .max_stacks(
793            data.require_aura_max_stacks(wowlab_types::sim::SpellIdx::from_raw(374_585))?,
794        )
795        .primary_pct_per_stack(
796            data.base_points(wowlab_types::sim::SpellIdx::from_raw(374_574), 1),
797        )
798}
799fn aura_razorice(
800    a: AuraDefinitionDraft,
801    data: &ResolvedGameData,
802) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
803    Ok(
804        a
805            .on_target()
806            .apply_base_from_data(data, 51714)?
807            .max_stacks(
808                data
809                    .require_aura_max_stacks(
810                        wowlab_types::sim::SpellIdx::from_raw(51714),
811                    )?,
812            ),
813    )
814}
815fn aura_brittle(
816    a: AuraDefinitionDraft,
817    data: &ResolvedGameData,
818) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
819    Ok(
820        a
821            .on_target()
822            .apply_base_from_data(data, 374_557)?
823            .max_stacks(
824                data
825                    .require_aura_max_stacks(
826                        wowlab_types::sim::SpellIdx::from_raw(374_557),
827                    )?,
828            ),
829    )
830}
831fn aura_frostreaper(
832    a: AuraDefinitionDraft,
833    data: &ResolvedGameData,
834) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
835    Ok(
836        a
837            .on_target()
838            .apply_base_from_data(data, 1_233_351)?
839            .max_stacks(
840                data
841                    .require_aura_max_stacks(
842                        wowlab_types::sim::SpellIdx::from_raw(1_233_351),
843                    )?,
844            ),
845    )
846}
847fn aura_frozen_dominion(
848    a: AuraDefinitionDraft,
849    data: &ResolvedGameData,
850) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
851    Ok(
852        a
853            .on_player()
854            .apply_base_from_data(data, 377_226)?
855            .max_stacks(
856                data
857                    .require_aura_max_stacks(
858                        wowlab_types::sim::SpellIdx::from_raw(377_226),
859                    )?,
860            ),
861    )
862}
863fn aura_breath_of_sindragosa(
864    a: AuraDefinitionDraft,
865    data: &ResolvedGameData,
866) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
867    Ok(
868        a
869            .on_player()
870            .apply_base_from_data(data, 1_249_658)?
871            .max_stacks(
872                data
873                    .require_aura_max_stacks(
874                        wowlab_types::sim::SpellIdx::from_raw(1_249_658),
875                    )?,
876            )
877            .periodic_hook(
878                wowlab_engine_combat::validated_milliseconds(
879                    data.period(wowlab_types::sim::SpellIdx::from_raw(1_249_658), 1),
880                    1_249_658,
881                    "periodic_hook.tick_ms",
882                )?,
883            )
884            .apply_periodic_behavior_from_data(data, 1_249_658)?
885            .on_expire(
886                crate::hooks::frost_death_knight::breath_of_sindragosa_expire_hook,
887            )
888            .tick_hook(crate::hooks::frost_death_knight::breath_of_sindragosa_tick_hook),
889    )
890}
891fn aura_remorseless_winter(
892    a: AuraDefinitionDraft,
893    data: &ResolvedGameData,
894) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
895    Ok(
896        a
897            .on_player()
898            .apply_base_from_data(data, 1_233_152)?
899            .max_stacks(
900                data
901                    .require_aura_max_stacks(
902                        wowlab_types::sim::SpellIdx::from_raw(1_233_152),
903                    )?,
904            )
905            .periodic_damage_from_spell(
906                wowlab_engine_combat::validated_milliseconds(
907                    1000.0,
908                    1_233_152,
909                    "periodic_damage.tick_ms",
910                )?,
911                wowlab_engine_combat::DamagePayload::new(
912                    196_771,
913                    ((data.ap_coef(wowlab_types::sim::SpellIdx::from_raw(196_771), 1))
914                        * 100_000.0)
915                        .round() / 100_000.0,
916                    wowlab_engine_combat::DamageFlags::empty(),
917                ),
918            )
919            .apply_periodic_behavior_from_data(data, 1_233_152)?
920            .tick_hook(crate::hooks::frost_death_knight::remorseless_winter_tick_hook),
921    )
922}
923fn aura_freezing_tempest(
924    a: AuraDefinitionDraft,
925    data: &ResolvedGameData,
926) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
927    Ok(
928        a
929            .on_player()
930            .apply_base_from_data(data, 1_297_365)?
931            .max_stacks(
932                data
933                    .require_aura_max_stacks(
934                        wowlab_types::sim::SpellIdx::from_raw(1_297_365),
935                    )?,
936            ),
937    )
938}
939fn aura_frozen_dominion_mastery(
940    a: AuraDefinitionDraft,
941    data: &ResolvedGameData,
942) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
943    Ok(
944        a
945            .on_player()
946            .apply_base_from_data(data, 377_253)?
947            .max_stacks(
948                data
949                    .require_aura_max_stacks(
950                        wowlab_types::sim::SpellIdx::from_raw(377_253),
951                    )?,
952            ),
953    )
954}
955fn aura_exterminate(
956    a: AuraDefinitionDraft,
957    data: &ResolvedGameData,
958) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
959    Ok(
960        a
961            .on_player()
962            .apply_base_from_data(data, 441_416)?
963            .max_stacks(
964                data
965                    .require_aura_max_stacks(
966                        wowlab_types::sim::SpellIdx::from_raw(441_416),
967                    )?,
968            ),
969    )
970}
971fn spell_obliterate(
972    s: SpellDefinitionDraft,
973    data: &ResolvedGameData,
974) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
975    Ok(
976        s
977            .apply_base_from_data(data, 49020)?
978            .without_data_damage()
979            .apply_aoe_from_data(data)
980            .on_cast(crate::hooks::frost_death_knight::obliterate_hook)
981            .cost_free_when_aura(1_230_959),
982    )
983}
984fn spell_frost_strike(
985    s: SpellDefinitionDraft,
986    data: &ResolvedGameData,
987) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
988    Ok(
989        s
990            .apply_base_from_data(data, 49143)?
991            .without_data_damage()
992            .apply_aoe_from_data(data)
993            .on_cast(crate::hooks::frost_death_knight::frost_strike_hook),
994    )
995}
996fn spell_howling_blast(
997    s: SpellDefinitionDraft,
998    data: &ResolvedGameData,
999) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1000    Ok(
1001        s
1002            .apply_base_from_data(data, 49184)?
1003            .without_data_damage()
1004            .apply_aoe_from_data(data)
1005            .on_cast(crate::hooks::frost_death_knight::howling_blast_hook)
1006            .cost_free_when_aura(59052),
1007    )
1008}
1009fn spell_pillar_of_frost(
1010    s: SpellDefinitionDraft,
1011    data: &ResolvedGameData,
1012) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1013    Ok(
1014        s
1015            .apply_base_from_data(data, 51271)?
1016            .applies_inferred_aura(AURA_PILLAR_OF_FROST, 51271)
1017            .apply_aoe_from_data(data)
1018            .on_cast(crate::hooks::frost_death_knight::pillar_of_frost_hook),
1019    )
1020}
1021fn spell_empower_rune_weapon(
1022    s: SpellDefinitionDraft,
1023    data: &ResolvedGameData,
1024) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1025    Ok(
1026        s
1027            .apply_base_from_data(data, 47568)?
1028            .applies_inferred_aura(AURA_EMPOWER_RUNE_WEAPON, 1_230_959)
1029            .apply_aoe_from_data(data)
1030            .on_cast(crate::hooks::frost_death_knight::empower_rune_weapon_hook),
1031    )
1032}
1033fn spell_frostwyrms_fury(
1034    s: SpellDefinitionDraft,
1035    data: &ResolvedGameData,
1036) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1037    Ok(
1038        s
1039            .apply_base_from_data(data, 279_302)?
1040            .without_data_damage()
1041            .apply_aoe_from_data(data)
1042            .on_cast(crate::hooks::frost_death_knight::frostwyrms_fury_hook),
1043    )
1044}
1045fn spell_glacial_advance(
1046    s: SpellDefinitionDraft,
1047    data: &ResolvedGameData,
1048) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1049    Ok(
1050        s
1051            .apply_base_from_data(data, 194_913)?
1052            .damage_ap_from_data(
1053                wowlab_engine_domain::dbc::EffectLookup::new(
1054                    data,
1055                    wowlab_types::sim::EffectRef::new(
1056                        wowlab_types::sim::SpellIdx::from_raw(195_975),
1057                        1,
1058                    ),
1059                ),
1060            )?
1061            .apply_aoe_from_data(data),
1062    )
1063}
1064fn spell_frostscythe(
1065    s: SpellDefinitionDraft,
1066    data: &ResolvedGameData,
1067) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1068    Ok(s.apply_base_from_data(data, 207_230)?.apply_aoe_from_data(data))
1069}
1070fn spell_soul_reaper(
1071    s: SpellDefinitionDraft,
1072    data: &ResolvedGameData,
1073) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1074    Ok(s.apply_base_from_data(data, 343_294)?.apply_aoe_from_data(data))
1075}
1076fn spell_rune_strike(
1077    s: SpellDefinitionDraft,
1078    data: &ResolvedGameData,
1079) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1080    Ok(s.apply_base_from_data(data, 316_239)?.apply_aoe_from_data(data))
1081}
1082fn spell_remorseless_winter(
1083    s: SpellDefinitionDraft,
1084    data: &ResolvedGameData,
1085) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1086    Ok(
1087        s
1088            .apply_base_from_data(data, 196_770)?
1089            .applies_inferred_aura(AURA_REMORSELESS_WINTER, 1_233_152)
1090            .apply_aoe_from_data(data)
1091            .on_cast(crate::hooks::frost_death_knight::remorseless_winter_hook),
1092    )
1093}
1094fn spell_breath_of_sindragosa(
1095    s: SpellDefinitionDraft,
1096    data: &ResolvedGameData,
1097) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1098    Ok(
1099        s
1100            .apply_base_from_data(data, 1_249_658)?
1101            .without_data_damage()
1102            .applies_aura(AURA_BREATH_OF_SINDRAGOSA)
1103            .apply_aoe_from_data(data)
1104            .on_cast(crate::hooks::frost_death_knight::breath_of_sindragosa_hook),
1105    )
1106}
1107fn spell_reapers_mark(
1108    s: SpellDefinitionDraft,
1109    data: &ResolvedGameData,
1110) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1111    Ok(
1112        s
1113            .apply_base_from_data(data, 439_843)?
1114            .apply_aoe_from_data(data)
1115            .on_cast(crate::hooks::frost_death_knight::reapers_mark_hook),
1116    )
1117}
1118pub(crate) fn build_combat_system_draft(
1119    params: &wowlab_engine_ports::HandlerParams<'_>,
1120) -> Result<CombatSystemDraft, wowlab_engine_ports::EngineError> {
1121    let builder = CombatSystemBuilder::new(params.stats.clone())
1122        .spec_id(SpecId::FrostDK)
1123        .spec_identity(
1124            wowlab_engine_combat::generated_identities::specs::frost_death_knight::PROOF,
1125        )
1126        .hero_talent_trees(DECLARED_METADATA.hero_talent_trees)
1127        .effect_identities(
1128            wowlab_engine_combat::generated_identities::specs::frost_death_knight::damage::ALL,
1129        )
1130        .effect_identities(wowlab_engine_combat::generated_identities::shared::ALL)
1131        .mastery_spell(77514)
1132        .mastery_hook(crate::hooks::frost_death_knight::mastery)
1133        .resource("runes", 6.0, 0.0)
1134        .resource_type_id(5)
1135        .resource_start(6.0)
1136        .secondary_resource("runic_power", 100.0)
1137        .secondary_resource_type_id(6)
1138        .aura(
1139            "killing_machine",
1140            AURA::KILLING_MACHINE,
1141            |a| aura_killing_machine(a, &params.game_data),
1142        )
1143        .aura("rime", AURA::RIME, |a| aura_rime(a, &params.game_data))
1144        .aura(
1145            "pillar_of_frost",
1146            AURA::PILLAR_OF_FROST,
1147            |a| aura_pillar_of_frost(a, &params.game_data),
1148        )
1149        .aura(
1150            "empower_rune_weapon",
1151            AURA::EMPOWER_RUNE_WEAPON,
1152            |a| aura_empower_rune_weapon(a, &params.game_data),
1153        )
1154        .aura("icy_talons", AURA::ICY_TALONS, |a| aura_icy_talons(a, &params.game_data))
1155        .aura(
1156            "chosen_of_frostbrood_haste",
1157            AURA::CHOSEN_OF_FROSTBROOD_HASTE,
1158            |a| aura_chosen_of_frostbrood_haste(a, &params.game_data),
1159        )
1160        .aura("frostbane", AURA::FROSTBANE, |a| aura_frostbane(a, &params.game_data))
1161        .aura(
1162            "icy_onslaught",
1163            AURA::ICY_ONSLAUGHT,
1164            |a| aura_icy_onslaught(a, &params.game_data),
1165        )
1166        .aura(
1167            "killing_streak",
1168            AURA::KILLING_STREAK,
1169            |a| aura_killing_streak(a, &params.game_data),
1170        )
1171        .aura(
1172            "dark_talons_icy_talons",
1173            AURA::DARK_TALONS_ICY_TALONS,
1174            |a| aura_dark_talons_icy_talons(a, &params.game_data),
1175        )
1176        .aura(
1177            "frost_fever",
1178            AURA::FROST_FEVER,
1179            |a| aura_frost_fever(a, &params.game_data),
1180        )
1181        .aura(
1182            "bonegrinder_crit",
1183            AURA::BONEGRINDER_CRIT,
1184            |a| aura_bonegrinder_crit(a, &params.game_data),
1185        )
1186        .aura(
1187            "bonegrinder_frost",
1188            AURA::BONEGRINDER_FROST,
1189            |a| aura_bonegrinder_frost(a, &params.game_data),
1190        )
1191        .aura(
1192            "rune_mastery",
1193            AURA::RUNE_MASTERY,
1194            |a| aura_rune_mastery(a, &params.game_data),
1195        )
1196        .aura("razorice", AURA::RAZORICE, |a| aura_razorice(a, &params.game_data))
1197        .aura("brittle", AURA::BRITTLE, |a| aura_brittle(a, &params.game_data))
1198        .aura(
1199            "frostreaper",
1200            AURA::FROSTREAPER,
1201            |a| aura_frostreaper(a, &params.game_data),
1202        )
1203        .aura(
1204            "frozen_dominion",
1205            AURA::FROZEN_DOMINION,
1206            |a| aura_frozen_dominion(a, &params.game_data),
1207        )
1208        .aura(
1209            "breath_of_sindragosa",
1210            AURA::BREATH_OF_SINDRAGOSA,
1211            |a| aura_breath_of_sindragosa(a, &params.game_data),
1212        )
1213        .aura(
1214            "remorseless_winter",
1215            AURA::REMORSELESS_WINTER,
1216            |a| aura_remorseless_winter(a, &params.game_data),
1217        )
1218        .aura(
1219            "freezing_tempest",
1220            AURA::FREEZING_TEMPEST,
1221            |a| aura_freezing_tempest(a, &params.game_data),
1222        )
1223        .aura(
1224            "frozen_dominion_mastery",
1225            AURA::FROZEN_DOMINION_MASTERY,
1226            |a| aura_frozen_dominion_mastery(a, &params.game_data),
1227        )
1228        .aura(
1229            "exterminate",
1230            AURA::EXTERMINATE,
1231            |a| aura_exterminate(a, &params.game_data),
1232        )
1233        .spell(
1234            "obliterate",
1235            SPELL::OBLITERATE,
1236            |s| spell_obliterate(s, &params.game_data),
1237        )
1238        .spell(
1239            "frost_strike",
1240            SPELL::FROST_STRIKE,
1241            |s| spell_frost_strike(s, &params.game_data),
1242        )
1243        .spell(
1244            "howling_blast",
1245            SPELL::HOWLING_BLAST,
1246            |s| spell_howling_blast(s, &params.game_data),
1247        )
1248        .spell(
1249            "pillar_of_frost",
1250            SPELL::PILLAR_OF_FROST,
1251            |s| spell_pillar_of_frost(s, &params.game_data),
1252        )
1253        .spell(
1254            "empower_rune_weapon",
1255            SPELL::EMPOWER_RUNE_WEAPON,
1256            |s| spell_empower_rune_weapon(s, &params.game_data),
1257        )
1258        .spell(
1259            "frostwyrms_fury",
1260            SPELL::FROSTWYRMS_FURY,
1261            |s| spell_frostwyrms_fury(s, &params.game_data),
1262        )
1263        .spell(
1264            "glacial_advance",
1265            SPELL::GLACIAL_ADVANCE,
1266            |s| spell_glacial_advance(s, &params.game_data),
1267        )
1268        .spell(
1269            "frostscythe",
1270            SPELL::FROSTSCYTHE,
1271            |s| spell_frostscythe(s, &params.game_data),
1272        )
1273        .spell(
1274            "soul_reaper",
1275            SPELL::SOUL_REAPER,
1276            |s| spell_soul_reaper(s, &params.game_data),
1277        )
1278        .spell(
1279            "rune_strike",
1280            SPELL::RUNE_STRIKE,
1281            |s| spell_rune_strike(s, &params.game_data),
1282        )
1283        .spell(
1284            "remorseless_winter",
1285            SPELL::REMORSELESS_WINTER,
1286            |s| spell_remorseless_winter(s, &params.game_data),
1287        )
1288        .spell(
1289            "breath_of_sindragosa",
1290            SPELL::BREATH_OF_SINDRAGOSA,
1291            |s| spell_breath_of_sindragosa(s, &params.game_data),
1292        )
1293        .spell(
1294            "reapers_mark",
1295            SPELL::REAPERS_MARK,
1296            |s| spell_reapers_mark(s, &params.game_data),
1297        )
1298        .auto_attack(|a| {
1299            a
1300                .spell_id(6603)
1301                .swing_ms(3600)
1302                .apply_base_from_data(&params.game_data)
1303                .on_swing(crate::hooks::frost_death_knight::swing_hook)
1304        })
1305        .game_data(params.game_data.clone())
1306        .talent_spell_ids(TALENTS)
1307        .talent_selections(params.talent_selections)
1308        .set_bonus_auras(params.set_bonus_auras)
1309        .encounter(params.encounter.clone());
1310    let builder = crate::generated::items::register_equipped(
1311        builder,
1312        &params.game_data,
1313        params.equipped_items,
1314    )?;
1315
1316    builder.into_draft()
1317}
1318fn new_handler(
1319    params: wowlab_engine_ports::HandlerParams<'_>,
1320) -> Result<Box<dyn SpecHandler>, wowlab_engine_ports::EngineError> {
1321    let handler = crate::composition::compose_handler(
1322        build_combat_system_draft,
1323        &params,
1324        crate::hooks::frost_death_knight::FrostDkHandler::try_new,
1325    )?;
1326
1327    Ok(Box::new(handler))
1328}
1329static DECLARED_METADATA: DeclaredSpecMetadata = DeclaredSpecMetadata {
1330    primary_resource: ResourceType::Runes,
1331    secondary_resource: Some(ResourceType::RunicPower),
1332    spell_ids: DECLARED_SPELL_IDS,
1333    aura_ids: DECLARED_AURA_IDS,
1334    server_proc_entries: &[],
1335    talents: TALENTS,
1336    rotation_field_schema: &[],
1337    metrics_plugin_id: None,
1338    hero_talent_trees: &[
1339        HeroTalentTreeDesc {
1340            name: "Deathbringer",
1341            spells: HERO_TREE_DEATHBRINGER_SPELLS,
1342            auras: HERO_TREE_DEATHBRINGER_AURAS,
1343        },
1344        HeroTalentTreeDesc {
1345            name: "Frost",
1346            spells: HERO_TREE_FROST_SPELLS,
1347            auras: HERO_TREE_FROST_AURAS,
1348        },
1349    ],
1350    reported_spells: REPORTED_SPELLS,
1351    masked_passive_effects: &[],
1352    passive_effect_overrides: &[],
1353};
1354pub(super) const SPEC_DESCRIPTOR: SpecDescriptor = SpecDescriptor {
1355    spec_id: SpecId::FrostDK,
1356    display_name: "Frost Death Knight",
1357    metadata: DECLARED_METADATA,
1358    handler_factory: new_handler,
1359};
1360wowlab_engine_combat::smoke_test!(build_combat_system_draft);