1#![allow(non_snake_case, dead_code)]
4use wowlab_types::{combat::ResourceType, game::SpecId};
5use wowlab_engine_combat::{
6 CombatSystemBuilder, CombatSystemDraft, AuraDefinitionDraft, LocalAuraIdx,
7 LocalSpellIdx, SpellDefinitionDraft,
8};
9use wowlab_engine_ports::{
10 DeclaredSpecMetadata, SpecDescriptor, SpecHandler, HeroTalentTreeDesc,
11};
12use wowlab_engine_gamedata::ResolvedGameData;
13pub(crate) mod SPELL {
14 pub(crate) const OBLITERATE: u32 = 49020;
16 pub(crate) const FROST_STRIKE: u32 = 49143;
18 pub(crate) const HOWLING_BLAST: u32 = 49184;
20 pub(crate) const PILLAR_OF_FROST: u32 = 51271;
22 pub(crate) const EMPOWER_RUNE_WEAPON: u32 = 47568;
24 pub(crate) const FROSTWYRMS_FURY: u32 = 279_302;
26 pub(crate) const GLACIAL_ADVANCE: u32 = 194_913;
28 pub(crate) const FROSTSCYTHE: u32 = 207_230;
30 pub(crate) const SOUL_REAPER: u32 = 343_294;
32 pub(crate) const RUNE_STRIKE: u32 = 316_239;
34 pub(crate) const REMORSELESS_WINTER: u32 = 196_770;
36 pub(crate) const BREATH_OF_SINDRAGOSA: u32 = 1_249_658;
38 pub(crate) const REAPERS_MARK: u32 = 439_843;
40}
41pub(crate) mod AURA {
42 pub(crate) const KILLING_MACHINE: u32 = 51124;
44 pub(crate) const RIME: u32 = 59052;
46 pub(crate) const PILLAR_OF_FROST: u32 = 51271;
48 pub(crate) const EMPOWER_RUNE_WEAPON: u32 = 1_230_959;
50 pub(crate) const ICY_TALONS: u32 = 194_879;
52 pub(crate) const CHOSEN_OF_FROSTBROOD_HASTE: u32 = 1_265_630;
54 pub(crate) const FROSTBANE: u32 = 1_229_310;
56 pub(crate) const ICY_ONSLAUGHT: u32 = 1_230_273;
58 pub(crate) const KILLING_STREAK: u32 = 1_230_916;
60 pub(crate) const DARK_TALONS_ICY_TALONS: u32 = 443_595;
62 pub(crate) const FROST_FEVER: u32 = 55095;
64 pub(crate) const BONEGRINDER_CRIT: u32 = 377_101;
66 pub(crate) const BONEGRINDER_FROST: u32 = 377_103;
68 pub(crate) const RUNE_MASTERY: u32 = 374_585;
70 pub(crate) const RAZORICE: u32 = 51714;
72 pub(crate) const BRITTLE: u32 = 374_557;
74 pub(crate) const FROSTREAPER: u32 = 1_233_351;
76 pub(crate) const FROZEN_DOMINION: u32 = 377_226;
78 pub(crate) const BREATH_OF_SINDRAGOSA: u32 = 1_249_658;
80 pub(crate) const REMORSELESS_WINTER: u32 = 1_233_152;
82 pub(crate) const FREEZING_TEMPEST: u32 = 1_297_365;
84 pub(crate) const FROZEN_DOMINION_MASTERY: u32 = 377_253;
86 pub(crate) const EXTERMINATE: u32 = 441_416;
88}
89pub(crate) mod TALENT {
90 pub(crate) const BREATH_OF_SINDRAGOSA: u32 = 1_249_658;
92 pub(crate) const BRITTLE: u32 = 374_504;
94 pub(crate) const CHOSEN_OF_FROSTBROOD: u32 = 1_265_632;
96 pub(crate) const EMPOWER_RUNE_WEAPON: u32 = 47568;
98 pub(crate) const FROSTREAPER: u32 = 1_230_301;
100 pub(crate) const FROSTSCYTHE: u32 = 207_230;
102 pub(crate) const FROSTWYRMS_FURY: u32 = 279_302;
104 pub(crate) const FROST_STRIKE: u32 = 49143;
106 pub(crate) const FROZEN_DOMINION: u32 = 377_226;
108 pub(crate) const GLACIAL_ADVANCE: u32 = 194_913;
110 pub(crate) const HOWLING_BLAST: u32 = 49184;
112 pub(crate) const KILLING_MACHINE: u32 = 51128;
114 pub(crate) const OBLITERATE: u32 = 49020;
116 pub(crate) const OBLITERATION: u32 = 281_238;
118 pub(crate) const PILLAR_OF_FROST: u32 = 51271;
120 pub(crate) const REAPERS_MARK: u32 = 439_843;
122 pub(crate) const SOUL_REAPER: u32 = 343_294;
124}
125pub(crate) mod SET_BONUS {
126 pub(crate) const MID2_FROST_2PC: u32 = 1_296_652;
128 pub(crate) const MID2_FROST_4PC: u32 = 1_296_653;
130}
131pub(crate) mod REPORTED_SPELL {
132 pub(crate) const BREATH_OF_SINDRAGOSA_DAMAGE: u32 = 155_166;
134 pub(crate) const CHOSEN_OF_FROSTBROOD_RECALL: u32 = 1_265_384;
136 pub(crate) const HYPERPYREXIA: u32 = 458_169;
138}
139pub(crate) mod HERO {
140 pub(crate) mod DEATHBRINGER {
141 pub(crate) mod SPELL {
142 pub(crate) const EXTERMINATE: u32 = 441_424;
144 pub(crate) const EXTERMINATE_AOE: u32 = 441_426;
146 pub(crate) const REAPERS_MARK: u32 = 439_843;
148 pub(crate) const REAPERS_MARK_EXPLOSION: u32 = 436_304;
150 pub(crate) const WAVE_OF_SOULS: u32 = 435_802;
152 }
153 pub(crate) mod AURA {
154 pub(crate) const BIND_IN_DARKNESS: u32 = 443_532;
156 pub(crate) const EXTERMINATE_BUFF: u32 = 441_416;
158 pub(crate) const REAPERS_MARK_DEBUFF: u32 = 434_765;
160 }
161 }
162 pub(crate) mod FROST {
163 pub(crate) mod SPELL {
164 pub(crate) const CHOSEN_OF_FROSTBROOD: u32 = 1_265_384;
166 pub(crate) const FROSTREAPER: u32 = 1_233_619;
168 pub(crate) const GLACIAL_ADVANCE_ARCTIC_ASSAULT_OBLITERATE: u32 = 195_975;
170 pub(crate) const HOWLING_BLADES_FIRST: u32 = 1_231_083;
172 pub(crate) const HOWLING_BLADES_SECOND: u32 = 1_231_082;
174 pub(crate) const HYPERPYREXIA: u32 = 458_169;
176 pub(crate) const ICY_DEATH_TORRENT: u32 = 439_539;
178 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 pub(crate) const ARCTIC_ASSAULT_PCT: (u32, u8) = (456_230, 1);
409 pub(crate) const BIND_IN_DARKNESS_HB_PCT: (u32, u8) = (440_031, 4);
411 pub(crate) const BOS_DAMAGE: (u32, u8) = (155_166, 2);
413 pub(crate) const BOS_RUNE_REFUND: (u32, u8) = (1_234_304, 1);
415 pub(crate) const COF_FWF_PCT: (u32, u8) = (1_265_637, 1);
417 pub(crate) const COF_SPELLS_PCT: (u32, u8) = (1_265_637, 3);
419 pub(crate) const DARK_TALONS_CHANCE: (u32, u8) = (436_687, 1);
421 pub(crate) const DEATHLY_BLOWS_FS_PCT: (u32, u8) = (1_265_932, 1);
423 pub(crate) const ECHOING_FURY_STACKS: (u32, u8) = (1_265_855, 1);
425 pub(crate) const ERW_RP: (u32, u8) = (1_230_959, 1);
427 pub(crate) const EXTERMINATE_AOE: (u32, u8) = (441_426, 2);
429 pub(crate) const EXTERMINATE_HIT: (u32, u8) = (441_424, 2);
431 pub(crate) const EXTERMINATE_STACKS: (u32, u8) = (441_378, 3);
433 pub(crate) const FRIGID_EXECUTIONER_PCT: (u32, u8) = (377_073, 2);
435 pub(crate) const FROSTREAPER_DAMAGE: (u32, u8) = (1_233_619, 1);
437 pub(crate) const FROSTWYRMS_FURY_DAMAGE: (u32, u8) = (279_303, 1);
439 pub(crate) const FROST_DK_SPEC_PCT: (u32, u8) = (137_006, 1);
441 pub(crate) const FROST_STRIKE_2H: (u32, u8) = (325_464, 1);
443 pub(crate) const GLACIAL_ADVANCE_DAMAGE: (u32, u8) = (195_975, 1);
445 pub(crate) const GRIM_REAPER_MAX_PCT: (u32, u8) = (434_905, 1);
447 pub(crate) const HOWLING_BLADES_FIRST: (u32, u8) = (1_231_083, 1);
449 pub(crate) const HOWLING_BLADES_KM_PCT: (u32, u8) = (1_230_223, 1);
451 pub(crate) const HOWLING_BLADES_SECOND: (u32, u8) = (1_231_082, 1);
453 pub(crate) const HOWLING_BLAST_DAMAGE: (u32, u8) = (49184, 1);
455 pub(crate) const HYPERPYREXIA_PORTION_PCT: (u32, u8) = (456_238, 1);
457 pub(crate) const ICEBREAKER_PCT: (u32, u8) = (392_950, 1);
459 pub(crate) const ICY_DEATH_TORRENT_DAMAGE: (u32, u8) = (439_539, 1);
461 pub(crate) const MOTFW_ALL_PCT: (u32, u8) = (81333, 2);
463 pub(crate) const MURDEROUS_EFFICIENCY_PCT: (u32, u8) = (207_061, 1);
465 pub(crate) const NORTHWINDS_RIME_PCT: (u32, u8) = (1_230_284, 1);
467 pub(crate) const OBLITERATE_FROST: (u32, u8) = (1_264_084, 1);
469 pub(crate) const OBLITERATE_PHYS: (u32, u8) = (325_461, 1);
471 pub(crate) const OBLITERATION_RUNE_PCT: (u32, u8) = (281_238, 2);
473 pub(crate) const RAGE_OF_FROZEN_CHAMPION_RP: (u32, u8) = (377_077, 1);
475 pub(crate) const REAPERS_MARK_EXPLOSION: (u32, u8) = (436_304, 2);
477 pub(crate) const REAPERS_MARK_STACKS: (u32, u8) = (434_765, 1);
479 pub(crate) const RIME_HB_BONUS_PCT: (u32, u8) = (59052, 2);
481 pub(crate) const RIME_PROC_PCT: (u32, u8) = (59057, 2);
483 pub(crate) const RUNIC_EMPOWERMENT_PCT: (u32, u8) = (81229, 1);
485 pub(crate) const RUNIC_OVERFLOW_FS_PCT: (u32, u8) = (316_803, 1);
487 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, ¶ms.game_data),
1142 )
1143 .aura("rime", AURA::RIME, |a| aura_rime(a, ¶ms.game_data))
1144 .aura(
1145 "pillar_of_frost",
1146 AURA::PILLAR_OF_FROST,
1147 |a| aura_pillar_of_frost(a, ¶ms.game_data),
1148 )
1149 .aura(
1150 "empower_rune_weapon",
1151 AURA::EMPOWER_RUNE_WEAPON,
1152 |a| aura_empower_rune_weapon(a, ¶ms.game_data),
1153 )
1154 .aura("icy_talons", AURA::ICY_TALONS, |a| aura_icy_talons(a, ¶ms.game_data))
1155 .aura(
1156 "chosen_of_frostbrood_haste",
1157 AURA::CHOSEN_OF_FROSTBROOD_HASTE,
1158 |a| aura_chosen_of_frostbrood_haste(a, ¶ms.game_data),
1159 )
1160 .aura("frostbane", AURA::FROSTBANE, |a| aura_frostbane(a, ¶ms.game_data))
1161 .aura(
1162 "icy_onslaught",
1163 AURA::ICY_ONSLAUGHT,
1164 |a| aura_icy_onslaught(a, ¶ms.game_data),
1165 )
1166 .aura(
1167 "killing_streak",
1168 AURA::KILLING_STREAK,
1169 |a| aura_killing_streak(a, ¶ms.game_data),
1170 )
1171 .aura(
1172 "dark_talons_icy_talons",
1173 AURA::DARK_TALONS_ICY_TALONS,
1174 |a| aura_dark_talons_icy_talons(a, ¶ms.game_data),
1175 )
1176 .aura(
1177 "frost_fever",
1178 AURA::FROST_FEVER,
1179 |a| aura_frost_fever(a, ¶ms.game_data),
1180 )
1181 .aura(
1182 "bonegrinder_crit",
1183 AURA::BONEGRINDER_CRIT,
1184 |a| aura_bonegrinder_crit(a, ¶ms.game_data),
1185 )
1186 .aura(
1187 "bonegrinder_frost",
1188 AURA::BONEGRINDER_FROST,
1189 |a| aura_bonegrinder_frost(a, ¶ms.game_data),
1190 )
1191 .aura(
1192 "rune_mastery",
1193 AURA::RUNE_MASTERY,
1194 |a| aura_rune_mastery(a, ¶ms.game_data),
1195 )
1196 .aura("razorice", AURA::RAZORICE, |a| aura_razorice(a, ¶ms.game_data))
1197 .aura("brittle", AURA::BRITTLE, |a| aura_brittle(a, ¶ms.game_data))
1198 .aura(
1199 "frostreaper",
1200 AURA::FROSTREAPER,
1201 |a| aura_frostreaper(a, ¶ms.game_data),
1202 )
1203 .aura(
1204 "frozen_dominion",
1205 AURA::FROZEN_DOMINION,
1206 |a| aura_frozen_dominion(a, ¶ms.game_data),
1207 )
1208 .aura(
1209 "breath_of_sindragosa",
1210 AURA::BREATH_OF_SINDRAGOSA,
1211 |a| aura_breath_of_sindragosa(a, ¶ms.game_data),
1212 )
1213 .aura(
1214 "remorseless_winter",
1215 AURA::REMORSELESS_WINTER,
1216 |a| aura_remorseless_winter(a, ¶ms.game_data),
1217 )
1218 .aura(
1219 "freezing_tempest",
1220 AURA::FREEZING_TEMPEST,
1221 |a| aura_freezing_tempest(a, ¶ms.game_data),
1222 )
1223 .aura(
1224 "frozen_dominion_mastery",
1225 AURA::FROZEN_DOMINION_MASTERY,
1226 |a| aura_frozen_dominion_mastery(a, ¶ms.game_data),
1227 )
1228 .aura(
1229 "exterminate",
1230 AURA::EXTERMINATE,
1231 |a| aura_exterminate(a, ¶ms.game_data),
1232 )
1233 .spell(
1234 "obliterate",
1235 SPELL::OBLITERATE,
1236 |s| spell_obliterate(s, ¶ms.game_data),
1237 )
1238 .spell(
1239 "frost_strike",
1240 SPELL::FROST_STRIKE,
1241 |s| spell_frost_strike(s, ¶ms.game_data),
1242 )
1243 .spell(
1244 "howling_blast",
1245 SPELL::HOWLING_BLAST,
1246 |s| spell_howling_blast(s, ¶ms.game_data),
1247 )
1248 .spell(
1249 "pillar_of_frost",
1250 SPELL::PILLAR_OF_FROST,
1251 |s| spell_pillar_of_frost(s, ¶ms.game_data),
1252 )
1253 .spell(
1254 "empower_rune_weapon",
1255 SPELL::EMPOWER_RUNE_WEAPON,
1256 |s| spell_empower_rune_weapon(s, ¶ms.game_data),
1257 )
1258 .spell(
1259 "frostwyrms_fury",
1260 SPELL::FROSTWYRMS_FURY,
1261 |s| spell_frostwyrms_fury(s, ¶ms.game_data),
1262 )
1263 .spell(
1264 "glacial_advance",
1265 SPELL::GLACIAL_ADVANCE,
1266 |s| spell_glacial_advance(s, ¶ms.game_data),
1267 )
1268 .spell(
1269 "frostscythe",
1270 SPELL::FROSTSCYTHE,
1271 |s| spell_frostscythe(s, ¶ms.game_data),
1272 )
1273 .spell(
1274 "soul_reaper",
1275 SPELL::SOUL_REAPER,
1276 |s| spell_soul_reaper(s, ¶ms.game_data),
1277 )
1278 .spell(
1279 "rune_strike",
1280 SPELL::RUNE_STRIKE,
1281 |s| spell_rune_strike(s, ¶ms.game_data),
1282 )
1283 .spell(
1284 "remorseless_winter",
1285 SPELL::REMORSELESS_WINTER,
1286 |s| spell_remorseless_winter(s, ¶ms.game_data),
1287 )
1288 .spell(
1289 "breath_of_sindragosa",
1290 SPELL::BREATH_OF_SINDRAGOSA,
1291 |s| spell_breath_of_sindragosa(s, ¶ms.game_data),
1292 )
1293 .spell(
1294 "reapers_mark",
1295 SPELL::REAPERS_MARK,
1296 |s| spell_reapers_mark(s, ¶ms.game_data),
1297 )
1298 .auto_attack(|a| {
1299 a
1300 .spell_id(6603)
1301 .swing_ms(3600)
1302 .apply_base_from_data(¶ms.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 ¶ms.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 ¶ms,
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);