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 CHAOS_STRIKE: u32 = 162_794;
16 pub(crate) const ANNIHILATION: u32 = 201_427;
18 pub(crate) const BLADE_DANCE: u32 = 188_499;
20 pub(crate) const DEATH_SWEEP: u32 = 210_152;
22 pub(crate) const METAMORPHOSIS: u32 = 191_427;
24 pub(crate) const THROW_GLAIVE: u32 = 185_123;
26 pub(crate) const FEL_RUSH: u32 = 195_072;
28 pub(crate) const VENGEFUL_RETREAT: u32 = 198_793;
30 pub(crate) const ESSENCE_BREAK: u32 = 258_860;
32 pub(crate) const FELBLADE: u32 = 232_893;
34 pub(crate) const EYE_BEAM: u32 = 198_013;
36 pub(crate) const ABYSSAL_GAZE: u32 = 452_497;
38 pub(crate) const IMMOLATION_AURA: u32 = 258_920;
40 pub(crate) const THE_HUNT: u32 = 370_965;
42}
43pub(crate) mod AURA {
44 pub(crate) const METAMORPHOSIS: u32 = 162_264;
46 pub(crate) const ESSENCE_BREAK: u32 = 320_338;
48 pub(crate) const INERTIA: u32 = 427_640;
50 pub(crate) const CYCLE_OF_HATRED: u32 = 1_214_887;
52 pub(crate) const FURIOUS_GAZE: u32 = 343_312;
54 pub(crate) const STUDENT_OF_SUFFERING: u32 = 453_239;
56 pub(crate) const DEMONIC_INTENSITY: u32 = 452_489;
58 pub(crate) const EMPOWERED_EYE_BEAM: u32 = 1_271_144;
60 pub(crate) const REAVERS_GLAIVE: u32 = 442_294;
62 pub(crate) const EXERGY: u32 = 442_266;
64 pub(crate) const IMMOLATION_AURA: u32 = 258_920;
66 pub(crate) const THE_HUNT_DOT: u32 = 370_969;
68 pub(crate) const BURNING_BLADES: u32 = 453_177;
70 pub(crate) const SERRATED_GLAIVE: u32 = 390_155;
72 pub(crate) const SOULSCAR: u32 = 390_181;
74}
75pub(crate) mod TALENT {
76 pub(crate) const BLIND_FURY: u32 = 203_550;
78 pub(crate) const CHAOTIC_TRANSFORMATION: u32 = 388_112;
80 pub(crate) const CYCLE_OF_HATRED: u32 = 258_887;
82 pub(crate) const DEMONIC: u32 = 213_410;
84 pub(crate) const ESSENCE_BREAK: u32 = 258_860;
86 pub(crate) const ETERNAL_HUNT: u32 = 1_270_898;
88 pub(crate) const ETERNAL_HUNT_RANK_2: u32 = 1_270_900;
90 pub(crate) const EYE_BEAM: u32 = 198_013;
92 pub(crate) const FELBLADE: u32 = 232_893;
94 pub(crate) const FIRST_BLOOD: u32 = 206_416;
96 pub(crate) const FURIOUS_GAZE: u32 = 343_311;
98 pub(crate) const FURIOUS_THROWS: u32 = 393_029;
100 pub(crate) const NEVER_SAY_DIE: u32 = 427_794;
102 pub(crate) const SCREAMING_BRUTALITY: u32 = 1_220_506;
104 pub(crate) const SERRATED_GLAIVE: u32 = 390_154;
106 pub(crate) const SOULSCAR: u32 = 388_106;
108 pub(crate) const THE_HUNT: u32 = 370_965;
110 pub(crate) const TRAIL_OF_RUIN: u32 = 258_881;
112}
113pub(crate) mod SET_BONUS {
114 pub(crate) const MID2_HAVOC_2PC: u32 = 1_296_611;
116 pub(crate) const MID2_HAVOC_4PC: u32 = 1_296_612;
118}
119pub(crate) mod REPORTED_SPELL {
120 pub(crate) const ANNIHILATION_DAMAGE_1: u32 = 227_518;
122 pub(crate) const ANNIHILATION_DAMAGE_2: u32 = 201_428;
124 pub(crate) const AUTO_ATTACK: u32 = 6603;
126 pub(crate) const BLADE_DANCE_DAMAGE: u32 = 199_552;
128 pub(crate) const BLADE_DANCE_DAMAGE_4: u32 = 200_685;
130 pub(crate) const BLADE_DANCE_FIRST_BLOOD: u32 = 391_374;
132 pub(crate) const BLADE_DANCE_FIRST_BLOOD_4: u32 = 391_378;
134 pub(crate) const BURNING_BLADES: u32 = 453_177;
136 pub(crate) const CHAOS_STRIKE_DAMAGE_1: u32 = 222_031;
138 pub(crate) const CHAOS_STRIKE_DAMAGE_2: u32 = 199_547;
140 pub(crate) const DEATH_SWEEP_FIRST_BLOOD: u32 = 393_055;
142 pub(crate) const DEATH_SWEEP_FIRST_BLOOD_4: u32 = 393_054;
144 pub(crate) const DEMON_BLADES: u32 = 203_796;
146 pub(crate) const EYE_BEAM_TICK: u32 = 198_030;
148 pub(crate) const FEL_RUSH_DAMAGE: u32 = 192_611;
150 pub(crate) const FELBLADE_DAMAGE: u32 = 213_243;
152 pub(crate) const IMMOLATION_AURA_DAMAGE: u32 = 258_921;
154 pub(crate) const SOULSCAR: u32 = 390_181;
156 pub(crate) const THE_HUNT_DAMAGE: u32 = 370_966;
158 pub(crate) const THROW_GLAIVE_DAMAGE: u32 = 337_819;
160 pub(crate) const THROW_GLAIVE_FURIOUS_THROWS: u32 = 393_035;
162 pub(crate) const TRAIL_OF_RUIN: u32 = 258_883;
164 pub(crate) const VENGEFUL_RETREAT_DAMAGE: u32 = 198_813;
166}
167pub(crate) mod HERO {
168 pub(crate) mod ALDRACHI_REAVER {
169 pub(crate) mod SPELL {
170 pub(crate) const ART_OF_THE_GLAIVE_DAMAGE: u32 = 444_810;
172 pub(crate) const FURY_OF_THE_ALDRACHI: u32 = 444_806;
174 pub(crate) const REAVERS_GLAIVE: u32 = 442_294;
176 pub(crate) const REAVERS_GLAIVE_HAVOC: u32 = 444_686;
178 pub(crate) const WOUNDED_QUARRY_DAMAGE: u32 = 442_808;
180 }
181 pub(crate) mod AURA {
182 pub(crate) const EVASIVE_ACTION: u32 = 444_929;
184 pub(crate) const GLAIVE_FLURRY: u32 = 442_435;
186 pub(crate) const REAVERS_GLAIVE_BUFF: u32 = 442_294;
188 pub(crate) const REAVERS_MARK: u32 = 442_624;
190 pub(crate) const RENDING_STRIKE: u32 = 442_442;
192 pub(crate) const THRILL_OF_THE_FIGHT: u32 = 442_695;
194 }
195 }
196 pub(crate) mod FEL_SCARRED {
197 pub(crate) mod SPELL {
198 pub(crate) const BURNING_BLADES: u32 = 452_408;
200 pub(crate) const DEMONIC_INTENSITY: u32 = 452_415;
202 pub(crate) const DEMONSURGE: u32 = 452_402;
204 pub(crate) const SPIRIT_BURST: u32 = 452_437;
206 pub(crate) const STUDENT_OF_SUFFERING: u32 = 452_412;
208 pub(crate) const STUDENT_OF_SUFFERING_FURY: u32 = 453_236;
210 pub(crate) const VOLATILE_INSTINCT: u32 = 1_272_453;
212 }
213 pub(crate) mod AURA {
214 pub(crate) const DEMONSURGE: u32 = 452_416;
216 pub(crate) const STUDENT_OF_SUFFERING: u32 = 453_239;
218 }
219 }
220}
221static HERO_TREE_ALDRACHI_REAVER_SPELLS: &[(&str, u32)] = &[
222 ("ART_OF_THE_GLAIVE_DAMAGE", 444_810),
223 ("FURY_OF_THE_ALDRACHI", 444_806),
224 ("REAVERS_GLAIVE", 442_294),
225 ("REAVERS_GLAIVE_HAVOC", 444_686),
226 ("WOUNDED_QUARRY_DAMAGE", 442_808),
227];
228static HERO_TREE_ALDRACHI_REAVER_AURAS: &[(&str, u32)] = &[
229 ("EVASIVE_ACTION", 444_929),
230 ("GLAIVE_FLURRY", 442_435),
231 ("REAVERS_GLAIVE_BUFF", 442_294),
232 ("REAVERS_MARK", 442_624),
233 ("RENDING_STRIKE", 442_442),
234 ("THRILL_OF_THE_FIGHT", 442_695),
235];
236static HERO_TREE_FEL_SCARRED_SPELLS: &[(&str, u32)] = &[
237 ("BURNING_BLADES", 452_408),
238 ("DEMONIC_INTENSITY", 452_415),
239 ("DEMONSURGE", 452_402),
240 ("SPIRIT_BURST", 452_437),
241 ("STUDENT_OF_SUFFERING", 452_412),
242 ("STUDENT_OF_SUFFERING_FURY", 453_236),
243 ("VOLATILE_INSTINCT", 1_272_453),
244];
245static HERO_TREE_FEL_SCARRED_AURAS: &[(&str, u32)] = &[
246 ("DEMONSURGE", 452_416),
247 ("STUDENT_OF_SUFFERING", 453_239),
248];
249pub(crate) mod DAMAGE_SPELL {
250 pub(crate) const CHAOS_STRIKE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::ACTION::SPELL_162794;
251 pub(crate) const ANNIHILATION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::ACTION::SPELL_201427;
252 pub(crate) const BLADE_DANCE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::ACTION::SPELL_188499;
253 pub(crate) const DEATH_SWEEP: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::ACTION::SPELL_210152;
254 pub(crate) const METAMORPHOSIS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::ACTION::SPELL_191427;
255 pub(crate) const THROW_GLAIVE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::ACTION::SPELL_185123;
256 pub(crate) const FEL_RUSH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::ACTION::SPELL_195072;
257 pub(crate) const VENGEFUL_RETREAT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::ACTION::SPELL_198793;
258 pub(crate) const ESSENCE_BREAK: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::ACTION::SPELL_258860;
259 pub(crate) const FELBLADE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::ACTION::SPELL_232893;
260 pub(crate) const EYE_BEAM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::ACTION::SPELL_198013;
261 pub(crate) const ABYSSAL_GAZE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::ACTION::SPELL_452497;
262 pub(crate) const IMMOLATION_AURA: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::ACTION::SPELL_258920;
263 pub(crate) const THE_HUNT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::ACTION::SPELL_370965;
264 pub(crate) const ART_OF_THE_GLAIVE_DAMAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::ACTION::SPELL_444810;
265 pub(crate) const FURY_OF_THE_ALDRACHI: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::ACTION::SPELL_444806;
266 pub(crate) const REAVERS_GLAIVE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::ACTION::SPELL_442294;
267 pub(crate) const REAVERS_GLAIVE_HAVOC: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::ACTION::SPELL_444686;
268 pub(crate) const WOUNDED_QUARRY_DAMAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::ACTION::SPELL_442808;
269 pub(crate) const BURNING_BLADES: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::ACTION::SPELL_452408;
270 pub(crate) const DEMONIC_INTENSITY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::ACTION::SPELL_452415;
271 pub(crate) const DEMONSURGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::ACTION::SPELL_452402;
272 pub(crate) const SPIRIT_BURST: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::ACTION::SPELL_452437;
273 pub(crate) const STUDENT_OF_SUFFERING: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::ACTION::SPELL_452412;
274 pub(crate) const STUDENT_OF_SUFFERING_FURY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::ACTION::SPELL_453236;
275 pub(crate) const VOLATILE_INSTINCT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::ACTION::SPELL_1272453;
276}
277pub(crate) mod DAMAGE_AURA {
278 pub(crate) const METAMORPHOSIS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::ACTION::SPELL_162264;
279 pub(crate) const ESSENCE_BREAK: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::ACTION::SPELL_320338;
280 pub(crate) const INERTIA: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::ACTION::SPELL_427640;
281 pub(crate) const CYCLE_OF_HATRED: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::ACTION::SPELL_1214887;
282 pub(crate) const FURIOUS_GAZE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::ACTION::SPELL_343312;
283 pub(crate) const STUDENT_OF_SUFFERING: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::ACTION::SPELL_453239;
284 pub(crate) const DEMONIC_INTENSITY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::ACTION::SPELL_452489;
285 pub(crate) const EMPOWERED_EYE_BEAM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::ACTION::SPELL_1271144;
286 pub(crate) const REAVERS_GLAIVE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::ACTION::SPELL_442294;
287 pub(crate) const EXERGY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::ACTION::SPELL_442266;
288 pub(crate) const IMMOLATION_AURA: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::ACTION::SPELL_258920;
289 pub(crate) const THE_HUNT_DOT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::ACTION::SPELL_370969;
290 pub(crate) const BURNING_BLADES: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::ACTION::SPELL_453177;
291 pub(crate) const SERRATED_GLAIVE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::ACTION::SPELL_390155;
292 pub(crate) const SOULSCAR: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::ACTION::SPELL_390181;
293}
294pub(crate) mod DAMAGE_TALENT {
295 pub(crate) const BLIND_FURY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::ACTION::SPELL_203550;
296 pub(crate) const CHAOTIC_TRANSFORMATION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::ACTION::SPELL_388112;
297 pub(crate) const CYCLE_OF_HATRED: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::ACTION::SPELL_258887;
298 pub(crate) const DEMONIC: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::ACTION::SPELL_213410;
299 pub(crate) const ESSENCE_BREAK: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::ACTION::SPELL_258860;
300 pub(crate) const ETERNAL_HUNT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::ACTION::SPELL_1270898;
301 pub(crate) const ETERNAL_HUNT_RANK_2: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::ACTION::SPELL_1270900;
302 pub(crate) const EYE_BEAM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::ACTION::SPELL_198013;
303 pub(crate) const FELBLADE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::ACTION::SPELL_232893;
304 pub(crate) const FIRST_BLOOD: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::ACTION::SPELL_206416;
305 pub(crate) const FURIOUS_GAZE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::ACTION::SPELL_343311;
306 pub(crate) const FURIOUS_THROWS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::ACTION::SPELL_393029;
307 pub(crate) const NEVER_SAY_DIE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::ACTION::SPELL_427794;
308 pub(crate) const SCREAMING_BRUTALITY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::ACTION::SPELL_1220506;
309 pub(crate) const SERRATED_GLAIVE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::ACTION::SPELL_390154;
310 pub(crate) const SOULSCAR: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::ACTION::SPELL_388106;
311 pub(crate) const THE_HUNT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::ACTION::SPELL_370965;
312 pub(crate) const TRAIL_OF_RUIN: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::ACTION::SPELL_258881;
313}
314pub(crate) mod DAMAGE_REPORTED {
315 pub(crate) const ANNIHILATION_DAMAGE_1: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::ACTION::SPELL_227518;
316 pub(crate) const ANNIHILATION_DAMAGE_2: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::ACTION::SPELL_201428;
317 pub(crate) const AUTO_ATTACK: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::ACTION::SPELL_6603;
318 pub(crate) const BLADE_DANCE_DAMAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::ACTION::SPELL_199552;
319 pub(crate) const BLADE_DANCE_DAMAGE_4: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::ACTION::SPELL_200685;
320 pub(crate) const BLADE_DANCE_FIRST_BLOOD: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::ACTION::SPELL_391374;
321 pub(crate) const BLADE_DANCE_FIRST_BLOOD_4: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::ACTION::SPELL_391378;
322 pub(crate) const BURNING_BLADES: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::ACTION::SPELL_453177;
323 pub(crate) const CHAOS_STRIKE_DAMAGE_1: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::ACTION::SPELL_222031;
324 pub(crate) const CHAOS_STRIKE_DAMAGE_2: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::ACTION::SPELL_199547;
325 pub(crate) const DEATH_SWEEP_FIRST_BLOOD: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::ACTION::SPELL_393055;
326 pub(crate) const DEATH_SWEEP_FIRST_BLOOD_4: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::ACTION::SPELL_393054;
327 pub(crate) const DEMON_BLADES: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::ACTION::SPELL_203796;
328 pub(crate) const EYE_BEAM_TICK: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::ACTION::SPELL_198030;
329 pub(crate) const FEL_RUSH_DAMAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::ACTION::SPELL_192611;
330 pub(crate) const FELBLADE_DAMAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::ACTION::SPELL_213243;
331 pub(crate) const IMMOLATION_AURA_DAMAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::ACTION::SPELL_258921;
332 pub(crate) const SOULSCAR: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::ACTION::SPELL_390181;
333 pub(crate) const THE_HUNT_DAMAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::ACTION::SPELL_370966;
334 pub(crate) const THROW_GLAIVE_DAMAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::ACTION::SPELL_337819;
335 pub(crate) const THROW_GLAIVE_FURIOUS_THROWS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::ACTION::SPELL_393035;
336 pub(crate) const TRAIL_OF_RUIN: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::ACTION::SPELL_258883;
337 pub(crate) const VENGEFUL_RETREAT_DAMAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::ACTION::SPELL_198813;
338}
339pub(crate) mod DAMAGE_EFFECT {
340 pub(crate) const BLADE_DANCE_FINAL: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::EFFECT::SPELL_200685_EFFECT_2;
341 pub(crate) const BLADE_DANCE_HIT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::EFFECT::SPELL_199552_EFFECT_2;
342 pub(crate) const BLIND_FURY_FURY: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::EFFECT::SPELL_203550_EFFECT_3;
343 pub(crate) const BURNING_BLADES_FRACTION: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::EFFECT::SPELL_452408_EFFECT_1;
344 pub(crate) const CHAOS_STRIKE_FURY_REFUND: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::EFFECT::SPELL_193840_EFFECT_1;
345 pub(crate) const CHAOS_STRIKE_REFUND_PROC: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::EFFECT::SPELL_197125_EFFECT_1;
346 pub(crate) const CYCLE_OF_HATRED_CDR: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::EFFECT::SPELL_258887_EFFECT_1;
347 pub(crate) const DEATH_SWEEP_FIRST_BLOOD_FINAL: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::EFFECT::SPELL_393054_EFFECT_2;
348 pub(crate) const DEATH_SWEEP_FIRST_BLOOD_HIT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::EFFECT::SPELL_393055_EFFECT_2;
349 pub(crate) const DEMONIC_EXTENSION: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::EFFECT::SPELL_213410_EFFECT_1;
350 pub(crate) const DEMONSURGE_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::EFFECT::SPELL_452416_EFFECT_1;
351 pub(crate) const DEMONSURGE_STACK_PCT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::EFFECT::SPELL_452416_EFFECT_2;
352 pub(crate) const DEMON_BLADES_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::EFFECT::SPELL_203796_EFFECT_1;
353 pub(crate) const DEMON_BLADES_FURY: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::EFFECT::SPELL_203796_EFFECT_2;
354 pub(crate) const EMPOWERED_EYE_BEAM_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::EFFECT::SPELL_1287949_EFFECT_1;
355 pub(crate) const ETERNAL_HUNT_COOLDOWN_MS: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::EFFECT::SPELL_1270900_EFFECT_2;
356 pub(crate) const ETERNAL_HUNT_DAMAGE_PCT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::EFFECT::SPELL_1270900_EFFECT_1;
357 pub(crate) const ETERNAL_HUNT_PERIODIC_PCT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::EFFECT::SPELL_1270900_EFFECT_4;
358 pub(crate) const EYE_BEAM_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::EFFECT::SPELL_198030_EFFECT_1;
359 pub(crate) const FIRST_BLOOD_FINAL: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::EFFECT::SPELL_391378_EFFECT_2;
360 pub(crate) const FIRST_BLOOD_HIT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::EFFECT::SPELL_391374_EFFECT_2;
361 pub(crate) const FIRST_BLOOD_MULT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::EFFECT::SPELL_206416_EFFECT_1;
362 pub(crate) const FURIOUS_THROWS_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::EFFECT::SPELL_393035_EFFECT_1;
363 pub(crate) const HAVOC_AURA_DIRECT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::EFFECT::SPELL_212612_EFFECT_1;
364 pub(crate) const MASTERY_DIRECT_BONUS: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::EFFECT::SPELL_185164_EFFECT_1;
365 pub(crate) const MASTERY_PERIODIC_BONUS: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::EFFECT::SPELL_185164_EFFECT_2;
366 pub(crate) const SB_FULL_PCT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::EFFECT::SPELL_1220506_EFFECT_3;
367 pub(crate) const SB_SLASH_CHANCE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::EFFECT::SPELL_1220506_EFFECT_2;
368 pub(crate) const SB_SLASH_PCT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::EFFECT::SPELL_1220506_EFFECT_1;
369 pub(crate) const SERRATED_GLAIVE_PCT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::EFFECT::SPELL_390154_EFFECT_1;
370 pub(crate) const SOULSCAR_FRACTION: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::EFFECT::SPELL_388106_EFFECT_1;
371 pub(crate) const THROW_GLAIVE_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::EFFECT::SPELL_337819_EFFECT_1;
372 pub(crate) const TRAIL_OF_RUIN_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::EFFECT::SPELL_258883_EFFECT_1;
373}
374pub(crate) const AURA_METAMORPHOSIS: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::AURA_METAMORPHOSIS
375 .bind(wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::PROOF);
376pub(crate) const AURA_ESSENCE_BREAK: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::AURA_ESSENCE_BREAK
377 .bind(wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::PROOF);
378pub(crate) const AURA_INERTIA: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::AURA_INERTIA
379 .bind(wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::PROOF);
380pub(crate) const AURA_CYCLE_OF_HATRED: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::AURA_CYCLE_OF_HATRED
381 .bind(wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::PROOF);
382pub(crate) const AURA_FURIOUS_GAZE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::AURA_FURIOUS_GAZE
383 .bind(wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::PROOF);
384pub(crate) const AURA_STUDENT_OF_SUFFERING: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::AURA_STUDENT_OF_SUFFERING
385 .bind(wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::PROOF);
386pub(crate) const AURA_DEMONIC_INTENSITY: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::AURA_DEMONIC_INTENSITY
387 .bind(wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::PROOF);
388pub(crate) const AURA_EMPOWERED_EYE_BEAM: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::AURA_EMPOWERED_EYE_BEAM
389 .bind(wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::PROOF);
390pub(crate) const AURA_REAVERS_GLAIVE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::AURA_REAVERS_GLAIVE
391 .bind(wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::PROOF);
392pub(crate) const AURA_EXERGY: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::AURA_EXERGY
393 .bind(wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::PROOF);
394pub(crate) const AURA_IMMOLATION_AURA: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::AURA_IMMOLATION_AURA
395 .bind(wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::PROOF);
396pub(crate) const AURA_THE_HUNT_DOT: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::AURA_THE_HUNT_DOT
397 .bind(wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::PROOF);
398pub(crate) const AURA_BURNING_BLADES: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::AURA_BURNING_BLADES
399 .bind(wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::PROOF);
400pub(crate) const AURA_SERRATED_GLAIVE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::AURA_SERRATED_GLAIVE
401 .bind(wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::PROOF);
402pub(crate) const AURA_SOULSCAR: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::AURA_SOULSCAR
403 .bind(wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::PROOF);
404pub(crate) const AURA_COUNT: usize = 15;
405const _: () = assert!(
406 AURA_COUNT == 15, "AURA index ABI: count changed -- update positional hook consumers"
407);
408pub(crate) const SPELL_CHAOS_STRIKE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::SPELL_CHAOS_STRIKE
409 .bind(wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::PROOF);
410pub(crate) const SPELL_ANNIHILATION: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::SPELL_ANNIHILATION
411 .bind(wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::PROOF);
412pub(crate) const SPELL_BLADE_DANCE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::SPELL_BLADE_DANCE
413 .bind(wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::PROOF);
414pub(crate) const SPELL_DEATH_SWEEP: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::SPELL_DEATH_SWEEP
415 .bind(wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::PROOF);
416pub(crate) const SPELL_METAMORPHOSIS: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::SPELL_METAMORPHOSIS
417 .bind(wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::PROOF);
418pub(crate) const SPELL_THROW_GLAIVE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::SPELL_THROW_GLAIVE
419 .bind(wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::PROOF);
420pub(crate) const SPELL_FEL_RUSH: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::SPELL_FEL_RUSH
421 .bind(wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::PROOF);
422pub(crate) const SPELL_VENGEFUL_RETREAT: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::SPELL_VENGEFUL_RETREAT
423 .bind(wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::PROOF);
424pub(crate) const SPELL_ESSENCE_BREAK: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::SPELL_ESSENCE_BREAK
425 .bind(wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::PROOF);
426pub(crate) const SPELL_FELBLADE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::SPELL_FELBLADE
427 .bind(wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::PROOF);
428pub(crate) const SPELL_EYE_BEAM: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::SPELL_EYE_BEAM
429 .bind(wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::PROOF);
430pub(crate) const SPELL_ABYSSAL_GAZE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::SPELL_ABYSSAL_GAZE
431 .bind(wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::PROOF);
432pub(crate) const SPELL_IMMOLATION_AURA: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::SPELL_IMMOLATION_AURA
433 .bind(wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::PROOF);
434pub(crate) const SPELL_THE_HUNT: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::SPELL_THE_HUNT
435 .bind(wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::PROOF);
436pub(crate) const SPELL_COUNT: usize = 14;
437const _: () = assert!(
438 SPELL_COUNT == 14,
439 "SPELL index ABI: count changed -- update positional hook consumers"
440);
441pub(crate) mod EFFECT {
442 pub(crate) const BLADE_DANCE_FINAL: (u32, u8) = (200_685, 2);
444 pub(crate) const BLADE_DANCE_HIT: (u32, u8) = (199_552, 2);
446 pub(crate) const BLIND_FURY_FURY: (u32, u8) = (203_550, 3);
448 pub(crate) const BURNING_BLADES_FRACTION: (u32, u8) = (452_408, 1);
450 pub(crate) const CHAOS_STRIKE_FURY_REFUND: (u32, u8) = (193_840, 1);
452 pub(crate) const CHAOS_STRIKE_REFUND_PROC: (u32, u8) = (197_125, 1);
454 pub(crate) const CYCLE_OF_HATRED_CDR: (u32, u8) = (258_887, 1);
456 pub(crate) const DEATH_SWEEP_FIRST_BLOOD_FINAL: (u32, u8) = (393_054, 2);
458 pub(crate) const DEATH_SWEEP_FIRST_BLOOD_HIT: (u32, u8) = (393_055, 2);
460 pub(crate) const DEMONIC_EXTENSION: (u32, u8) = (213_410, 1);
462 pub(crate) const DEMONSURGE_DAMAGE: (u32, u8) = (452_416, 1);
464 pub(crate) const DEMONSURGE_STACK_PCT: (u32, u8) = (452_416, 2);
466 pub(crate) const DEMON_BLADES_DAMAGE: (u32, u8) = (203_796, 1);
468 pub(crate) const DEMON_BLADES_FURY: (u32, u8) = (203_796, 2);
470 pub(crate) const EMPOWERED_EYE_BEAM_DAMAGE: (u32, u8) = (1_287_949, 1);
472 pub(crate) const ETERNAL_HUNT_COOLDOWN_MS: (u32, u8) = (1_270_900, 2);
474 pub(crate) const ETERNAL_HUNT_DAMAGE_PCT: (u32, u8) = (1_270_900, 1);
476 pub(crate) const ETERNAL_HUNT_PERIODIC_PCT: (u32, u8) = (1_270_900, 4);
478 pub(crate) const EYE_BEAM_DAMAGE: (u32, u8) = (198_030, 1);
480 pub(crate) const FIRST_BLOOD_FINAL: (u32, u8) = (391_378, 2);
482 pub(crate) const FIRST_BLOOD_HIT: (u32, u8) = (391_374, 2);
484 pub(crate) const FIRST_BLOOD_MULT: (u32, u8) = (206_416, 1);
486 pub(crate) const FURIOUS_THROWS_DAMAGE: (u32, u8) = (393_035, 1);
488 pub(crate) const HAVOC_AURA_DIRECT: (u32, u8) = (212_612, 1);
490 pub(crate) const MASTERY_DIRECT_BONUS: (u32, u8) = (185_164, 1);
492 pub(crate) const MASTERY_PERIODIC_BONUS: (u32, u8) = (185_164, 2);
494 pub(crate) const SB_FULL_PCT: (u32, u8) = (1_220_506, 3);
496 pub(crate) const SB_SLASH_CHANCE: (u32, u8) = (1_220_506, 2);
498 pub(crate) const SB_SLASH_PCT: (u32, u8) = (1_220_506, 1);
500 pub(crate) const SERRATED_GLAIVE_PCT: (u32, u8) = (390_154, 1);
502 pub(crate) const SOULSCAR_FRACTION: (u32, u8) = (388_106, 1);
504 pub(crate) const THROW_GLAIVE_DAMAGE: (u32, u8) = (337_819, 1);
506 pub(crate) const TRAIL_OF_RUIN_DAMAGE: (u32, u8) = (258_883, 1);
508}
509static REPORTED_SPELLS: &[(&str, u32)] = &[
510 ("annihilation_damage_1", 227_518),
511 ("annihilation_damage_2", 201_428),
512 ("auto_attack", 6603),
513 ("blade_dance_damage", 199_552),
514 ("blade_dance_damage_4", 200_685),
515 ("blade_dance_first_blood", 391_374),
516 ("blade_dance_first_blood_4", 391_378),
517 ("burning_blades", 453_177),
518 ("chaos_strike_damage_1", 222_031),
519 ("chaos_strike_damage_2", 199_547),
520 ("death_sweep_first_blood", 393_055),
521 ("death_sweep_first_blood_4", 393_054),
522 ("demon_blades", 203_796),
523 ("eye_beam_tick", 198_030),
524 ("fel_rush_damage", 192_611),
525 ("felblade_damage", 213_243),
526 ("immolation_aura_damage", 258_921),
527 ("soulscar", 390_181),
528 ("the_hunt_damage", 370_966),
529 ("throw_glaive_damage", 337_819),
530 ("throw_glaive_furious_throws", 393_035),
531 ("trail_of_ruin", 258_883),
532 ("vengeful_retreat_damage", 198_813),
533];
534static DECLARED_SPELL_IDS: &[u32] = &[
535 162_794, 201_427, 188_499, 210_152, 191_427, 185_123, 195_072, 198_793, 258_860,
536 232_893, 198_013, 452_497, 258_920, 370_965, 162_264, 320_338, 427_640, 1_214_887,
537 343_312, 453_239, 452_489, 1_271_144, 442_294, 442_266, 370_969, 453_177, 390_155,
538 390_181, 203_550, 388_112, 258_887, 213_410, 1_270_898, 1_270_900, 206_416, 343_311,
539 393_029, 427_794, 1_220_506, 390_154, 388_106, 258_881, 6603, 185_164, 192_611,
540 193_840, 197_125, 198_030, 198_813, 199_547, 199_552, 200_685, 201_428, 203_796,
541 212_612, 213_243, 222_031, 227_518, 258_883, 258_921, 258_922, 337_819, 370_966,
542 391_374, 391_378, 393_035, 393_054, 393_055, 452_408, 452_416, 453_236, 1_287_949,
543 444_810, 444_806, 444_686, 442_808, 444_929, 442_435, 442_624, 442_442, 442_695,
544 452_415, 452_402, 452_437, 452_412, 1_272_453,
545];
546static DECLARED_AURA_IDS: &[u32] = &[
547 162_264, 320_338, 427_640, 1_214_887, 343_312, 453_239, 452_489, 1_271_144, 442_294,
548 442_266, 258_920, 370_969, 453_177, 390_155, 390_181, 444_929, 442_435, 442_294,
549 442_624, 442_442, 442_695, 452_416, 453_239,
550];
551static TALENTS: &[(&str, u32)] = &[
552 ("BLIND_FURY", TALENT::BLIND_FURY),
553 ("CHAOTIC_TRANSFORMATION", TALENT::CHAOTIC_TRANSFORMATION),
554 ("CYCLE_OF_HATRED", TALENT::CYCLE_OF_HATRED),
555 ("DEMONIC", TALENT::DEMONIC),
556 ("ESSENCE_BREAK", TALENT::ESSENCE_BREAK),
557 ("ETERNAL_HUNT", TALENT::ETERNAL_HUNT),
558 ("ETERNAL_HUNT_RANK_2", TALENT::ETERNAL_HUNT_RANK_2),
559 ("EYE_BEAM", TALENT::EYE_BEAM),
560 ("FELBLADE", TALENT::FELBLADE),
561 ("FIRST_BLOOD", TALENT::FIRST_BLOOD),
562 ("FURIOUS_GAZE", TALENT::FURIOUS_GAZE),
563 ("FURIOUS_THROWS", TALENT::FURIOUS_THROWS),
564 ("NEVER_SAY_DIE", TALENT::NEVER_SAY_DIE),
565 ("SCREAMING_BRUTALITY", TALENT::SCREAMING_BRUTALITY),
566 ("SERRATED_GLAIVE", TALENT::SERRATED_GLAIVE),
567 ("SOULSCAR", TALENT::SOULSCAR),
568 ("THE_HUNT", TALENT::THE_HUNT),
569 ("TRAIL_OF_RUIN", TALENT::TRAIL_OF_RUIN),
570];
571fn aura_metamorphosis(
572 a: AuraDefinitionDraft,
573 data: &ResolvedGameData,
574) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
575 Ok(
576 a
577 .on_player()
578 .apply_base_from_data(data, 162_264)?
579 .max_stacks(
580 data
581 .require_aura_max_stacks(
582 wowlab_types::sim::SpellIdx::from_raw(162_264),
583 )?,
584 ),
585 )
586}
587fn aura_essence_break(
588 a: AuraDefinitionDraft,
589 data: &ResolvedGameData,
590) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
591 Ok(
592 a
593 .on_target()
594 .apply_base_from_data(data, 320_338)?
595 .max_stacks(
596 data
597 .require_aura_max_stacks(
598 wowlab_types::sim::SpellIdx::from_raw(320_338),
599 )?,
600 ),
601 )
602}
603fn aura_inertia(
604 a: AuraDefinitionDraft,
605 data: &ResolvedGameData,
606) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
607 Ok(
608 a
609 .on_player()
610 .apply_base_from_data(data, 427_640)?
611 .max_stacks(
612 data
613 .require_aura_max_stacks(
614 wowlab_types::sim::SpellIdx::from_raw(427_640),
615 )?,
616 ),
617 )
618}
619fn aura_cycle_of_hatred(
620 a: AuraDefinitionDraft,
621 data: &ResolvedGameData,
622) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
623 Ok(
624 a
625 .on_player()
626 .apply_base_from_data(data, 1_214_887)?
627 .max_stacks(
628 data
629 .require_aura_max_stacks(
630 wowlab_types::sim::SpellIdx::from_raw(1_214_887),
631 )?,
632 ),
633 )
634}
635fn aura_furious_gaze(
636 a: AuraDefinitionDraft,
637 data: &ResolvedGameData,
638) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
639 Ok(
640 a
641 .on_player()
642 .apply_base_from_data(data, 343_312)?
643 .max_stacks(
644 data
645 .require_aura_max_stacks(
646 wowlab_types::sim::SpellIdx::from_raw(343_312),
647 )?,
648 ),
649 )
650}
651fn aura_student_of_suffering(
652 a: AuraDefinitionDraft,
653 data: &ResolvedGameData,
654) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
655 a.on_player()
656 .apply_base_from_data(data, 453_239)?
657 .max_stacks(
658 data.require_aura_max_stacks(wowlab_types::sim::SpellIdx::from_raw(453_239))?,
659 )
660 .periodic_resource(
661 wowlab_engine_combat::validated_milliseconds(
662 data.period(wowlab_types::sim::SpellIdx::from_raw(453_239), 2),
663 453_239,
664 "periodic_resource.tick_ms",
665 )?,
666 data.base_points(wowlab_types::sim::SpellIdx::from_raw(453_236), 1),
667 )
668 .apply_periodic_behavior_from_data(data, 453_239)
669}
670fn aura_demonic_intensity(
671 a: AuraDefinitionDraft,
672 data: &ResolvedGameData,
673) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
674 Ok(
675 a
676 .on_player()
677 .apply_base_from_data(data, 452_489)?
678 .max_stacks(
679 data
680 .require_aura_max_stacks(
681 wowlab_types::sim::SpellIdx::from_raw(452_489),
682 )?,
683 ),
684 )
685}
686fn aura_empowered_eye_beam(
687 a: AuraDefinitionDraft,
688 data: &ResolvedGameData,
689) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
690 Ok(
691 a
692 .on_player()
693 .apply_base_from_data(data, 1_271_144)?
694 .max_stacks(
695 data
696 .require_aura_max_stacks(
697 wowlab_types::sim::SpellIdx::from_raw(1_271_144),
698 )?,
699 ),
700 )
701}
702fn aura_reavers_glaive(
703 a: AuraDefinitionDraft,
704 data: &ResolvedGameData,
705) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
706 Ok(
707 a
708 .on_player()
709 .apply_base_from_data(data, 442_294)?
710 .max_stacks(
711 data
712 .require_aura_max_stacks(
713 wowlab_types::sim::SpellIdx::from_raw(442_294),
714 )?,
715 ),
716 )
717}
718fn aura_exergy(
719 a: AuraDefinitionDraft,
720 data: &ResolvedGameData,
721) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
722 Ok(
723 a
724 .on_player()
725 .apply_base_from_data(data, 442_266)?
726 .max_stacks(
727 data
728 .require_aura_max_stacks(
729 wowlab_types::sim::SpellIdx::from_raw(442_266),
730 )?,
731 ),
732 )
733}
734fn aura_immolation_aura(
735 a: AuraDefinitionDraft,
736 data: &ResolvedGameData,
737) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
738 a.on_player()
739 .apply_base_from_data(data, 258_920)?
740 .max_stacks(
741 data.require_aura_max_stacks(wowlab_types::sim::SpellIdx::from_raw(258_920))?,
742 )
743 .periodic_damage_ap_from_data(
744 data,
745 wowlab_engine_combat::PeriodicDamageDataInput {
746 tick_ms: wowlab_engine_combat::validated_milliseconds(
747 data.period(wowlab_types::sim::SpellIdx::from_raw(258_920), 1),
748 258_920,
749 "periodic_damage.tick_ms",
750 )?,
751 spell_id: 258_922,
752 effect_index: 1,
753 multiplier: 1.0,
754 offset: 0.0,
755 round_decimals: Some(4),
756 },
757 wowlab_engine_combat::PeriodicDamageMode::Standard,
758 )?
759 .periodic_resource(
760 wowlab_engine_combat::validated_milliseconds(
761 data.period(wowlab_types::sim::SpellIdx::from_raw(258_920), 1),
762 258_920,
763 "periodic_resource.tick_ms",
764 )?,
765 data.base_points(wowlab_types::sim::SpellIdx::from_raw(258_922), 2),
766 )
767 .apply_periodic_behavior_from_data(data, 258_920)
768}
769fn aura_the_hunt_dot(
770 a: AuraDefinitionDraft,
771 data: &ResolvedGameData,
772) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
773 Ok(
774 a
775 .on_target()
776 .apply_base_from_data(data, 370_969)?
777 .max_stacks(
778 data
779 .require_aura_max_stacks(
780 wowlab_types::sim::SpellIdx::from_raw(370_969),
781 )?,
782 ),
783 )
784}
785fn aura_burning_blades(
786 a: AuraDefinitionDraft,
787 data: &ResolvedGameData,
788) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
789 a.on_target()
790 .apply_base_from_data(data, 453_177)?
791 .max_stacks(
792 data.require_aura_max_stacks(wowlab_types::sim::SpellIdx::from_raw(453_177))?,
793 )
794 .periodic_residual_damage(
795 wowlab_engine_combat::validated_milliseconds(
796 data.period(wowlab_types::sim::SpellIdx::from_raw(453_177), 1),
797 453_177,
798 "periodic_residual_damage.tick_ms",
799 )?,
800 )
801 .apply_periodic_behavior_from_data(data, 453_177)
802}
803fn aura_serrated_glaive(
804 a: AuraDefinitionDraft,
805 data: &ResolvedGameData,
806) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
807 a.on_target()
808 .apply_base_from_data(data, 390_155)?
809 .max_stacks(
810 data.require_aura_max_stacks(wowlab_types::sim::SpellIdx::from_raw(390_155))?,
811 )
812 .damage_taken_from_caster_spells(
813 data,
814 data.base_points(wowlab_types::sim::SpellIdx::from_raw(390_154), 1),
815 )
816}
817fn aura_soulscar(
818 a: AuraDefinitionDraft,
819 data: &ResolvedGameData,
820) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
821 a.on_target()
822 .apply_base_from_data(data, 390_181)?
823 .max_stacks(
824 data.require_aura_max_stacks(wowlab_types::sim::SpellIdx::from_raw(390_181))?,
825 )
826 .periodic_residual_damage(
827 wowlab_engine_combat::validated_milliseconds(
828 data.period(wowlab_types::sim::SpellIdx::from_raw(390_181), 1),
829 390_181,
830 "periodic_residual_damage.tick_ms",
831 )?,
832 )
833 .apply_periodic_behavior_from_data(data, 390_181)
834}
835fn spell_chaos_strike(
836 s: SpellDefinitionDraft,
837 data: &ResolvedGameData,
838) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
839 Ok(
840 s
841 .apply_base_from_data(data, 162_794)?
842 .apply_aoe_from_data(data)
843 .on_cast(crate::hooks::havoc_demon_hunter::chaos_strike_hook)
844 .overridden_by(SPELL::ANNIHILATION, AURA::METAMORPHOSIS)
845 .override_preserves_aura(),
846 )
847}
848fn spell_annihilation(
849 s: SpellDefinitionDraft,
850 data: &ResolvedGameData,
851) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
852 Ok(
853 s
854 .apply_base_from_data(data, 201_427)?
855 .apply_aoe_from_data(data)
856 .on_cast(crate::hooks::havoc_demon_hunter::annihilation_hook),
857 )
858}
859fn spell_blade_dance(
860 s: SpellDefinitionDraft,
861 data: &ResolvedGameData,
862) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
863 Ok(
864 s
865 .apply_base_from_data(data, 188_499)?
866 .without_data_damage()
867 .apply_aoe_from_data(data)
868 .on_cast(crate::hooks::havoc_demon_hunter::blade_dance_hook)
869 .overridden_by(SPELL::DEATH_SWEEP, AURA::METAMORPHOSIS)
870 .override_shares_base_cooldown()
871 .override_preserves_aura(),
872 )
873}
874fn spell_death_sweep(
875 s: SpellDefinitionDraft,
876 data: &ResolvedGameData,
877) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
878 Ok(
879 s
880 .apply_base_from_data(data, 210_152)?
881 .without_data_damage()
882 .apply_aoe_from_data(data)
883 .on_cast(crate::hooks::havoc_demon_hunter::death_sweep_hook),
884 )
885}
886fn spell_metamorphosis(
887 s: SpellDefinitionDraft,
888 data: &ResolvedGameData,
889) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
890 Ok(
891 s
892 .apply_base_from_data(data, 191_427)?
893 .applies_aura(AURA_METAMORPHOSIS)
894 .apply_aoe_from_data(data)
895 .on_cast(crate::hooks::havoc_demon_hunter::metamorphosis_hook),
896 )
897}
898fn spell_throw_glaive(
899 s: SpellDefinitionDraft,
900 data: &ResolvedGameData,
901) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
902 Ok(
903 s
904 .apply_base_from_data(data, 185_123)?
905 .apply_aoe_from_data(data)
906 .on_cast(crate::hooks::havoc_demon_hunter::throw_glaive_hook),
907 )
908}
909fn spell_fel_rush(
910 s: SpellDefinitionDraft,
911 data: &ResolvedGameData,
912) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
913 Ok(
914 s
915 .apply_base_from_data(data, 195_072)?
916 .damage_ap_from_data(
917 wowlab_engine_domain::dbc::EffectLookup::new(
918 data,
919 wowlab_types::sim::EffectRef::new(
920 wowlab_types::sim::SpellIdx::from_raw(192_611),
921 1,
922 ),
923 ),
924 )?
925 .apply_aoe_from_data(data),
926 )
927}
928fn spell_vengeful_retreat(
929 s: SpellDefinitionDraft,
930 data: &ResolvedGameData,
931) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
932 Ok(s.apply_base_from_data(data, 198_793)?.apply_aoe_from_data(data))
933}
934fn spell_essence_break(
935 s: SpellDefinitionDraft,
936 data: &ResolvedGameData,
937) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
938 Ok(
939 s
940 .apply_base_from_data(data, 258_860)?
941 .applies_aura(AURA_ESSENCE_BREAK)
942 .apply_aoe_from_data(data)
943 .on_cast(crate::hooks::havoc_demon_hunter::essence_break_hook),
944 )
945}
946fn spell_felblade(
947 s: SpellDefinitionDraft,
948 data: &ResolvedGameData,
949) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
950 Ok(
951 s
952 .apply_base_from_data(data, 232_893)?
953 .gain(data.base_points(wowlab_types::sim::SpellIdx::from_raw(213_243), 3))
954 .damage_ap_from_data(
955 wowlab_engine_domain::dbc::EffectLookup::new(
956 data,
957 wowlab_types::sim::EffectRef::new(
958 wowlab_types::sim::SpellIdx::from_raw(213_243),
959 2,
960 ),
961 ),
962 )?
963 .apply_aoe_from_data(data),
964 )
965}
966fn spell_eye_beam(
967 s: SpellDefinitionDraft,
968 data: &ResolvedGameData,
969) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
970 Ok(
971 s
972 .apply_base_from_data(data, 198_013)?
973 .apply_aoe_from_data(data)
974 .channel(
975 wowlab_engine_combat::validated_channel_tick_count(
976 10.0,
977 198_013,
978 "channel.tick_count",
979 )?,
980 )
981 .on_channel_tick(crate::hooks::havoc_demon_hunter::eye_beam_tick_hook)
982 .on_cast(crate::hooks::havoc_demon_hunter::eye_beam_hook)
983 .overridden_by(SPELL::ABYSSAL_GAZE, AURA::DEMONIC_INTENSITY)
984 .override_shares_base_cooldown(),
985 )
986}
987fn spell_abyssal_gaze(
988 s: SpellDefinitionDraft,
989 data: &ResolvedGameData,
990) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
991 Ok(
992 s
993 .apply_base_from_data(data, 452_497)?
994 .apply_aoe_from_data(data)
995 .channel(
996 wowlab_engine_combat::validated_channel_tick_count(
997 10.0,
998 452_497,
999 "channel.tick_count",
1000 )?,
1001 )
1002 .on_channel_tick(crate::hooks::havoc_demon_hunter::eye_beam_tick_hook)
1003 .on_cast(crate::hooks::havoc_demon_hunter::abyssal_gaze_hook),
1004 )
1005}
1006fn spell_immolation_aura(
1007 s: SpellDefinitionDraft,
1008 data: &ResolvedGameData,
1009) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1010 Ok(
1011 s
1012 .apply_base_from_data(data, 258_920)?
1013 .damage_ap_from_data(
1014 wowlab_engine_domain::dbc::EffectLookup::new(
1015 data,
1016 wowlab_types::sim::EffectRef::new(
1017 wowlab_types::sim::SpellIdx::from_raw(258_921),
1018 1,
1019 ),
1020 ),
1021 )?
1022 .applies_inferred_aura(AURA_IMMOLATION_AURA, 258_920)
1023 .apply_aoe_from_data(data)
1024 .on_cast(crate::hooks::havoc_demon_hunter::consuming_fire_hook),
1025 )
1026}
1027fn spell_the_hunt(
1028 s: SpellDefinitionDraft,
1029 data: &ResolvedGameData,
1030) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1031 Ok(
1032 s
1033 .apply_base_from_data(data, 370_965)?
1034 .damage_ap_from_data(
1035 wowlab_engine_domain::dbc::EffectLookup::new(
1036 data,
1037 wowlab_types::sim::EffectRef::new(
1038 wowlab_types::sim::SpellIdx::from_raw(370_966),
1039 1,
1040 ),
1041 ),
1042 )?
1043 .applies_aura(AURA_THE_HUNT_DOT)
1044 .apply_aoe_from_data(data)
1045 .on_cast(crate::hooks::havoc_demon_hunter::the_hunt_hook),
1046 )
1047}
1048pub(crate) fn build_combat_system_draft(
1049 params: &wowlab_engine_ports::HandlerParams<'_>,
1050) -> Result<CombatSystemDraft, wowlab_engine_ports::EngineError> {
1051 let builder = CombatSystemBuilder::new(params.stats.clone())
1052 .spec_id(SpecId::Havoc)
1053 .spec_identity(
1054 wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::PROOF,
1055 )
1056 .hero_talent_trees(DECLARED_METADATA.hero_talent_trees)
1057 .effect_identities(
1058 wowlab_engine_combat::generated_identities::specs::havoc_demon_hunter::damage::ALL,
1059 )
1060 .effect_identities(wowlab_engine_combat::generated_identities::shared::ALL)
1061 .mastery_spell(185_164)
1062 .mastery_hook(crate::hooks::havoc_demon_hunter::mastery)
1063 .resource(
1064 "fury",
1065 120.0,
1066 params
1067 .game_data
1068 .power_regen_for_max(17, 120.0)
1069 .ok_or_else(|| {
1070 wowlab_engine_ports::EngineError::spec_construction(
1071 "missing power-type power_regen_for_max for type_id 17",
1072 )
1073 })?,
1074 )
1075 .resource_type_id(17)
1076 .resource_start(
1077 params
1078 .game_data
1079 .power_default(17)
1080 .ok_or_else(|| {
1081 wowlab_engine_ports::EngineError::spec_construction(
1082 "missing power-type power_default for type_id 17",
1083 )
1084 })?,
1085 )
1086 .aura(
1087 "metamorphosis",
1088 AURA::METAMORPHOSIS,
1089 |a| aura_metamorphosis(a, ¶ms.game_data),
1090 )
1091 .aura(
1092 "essence_break",
1093 AURA::ESSENCE_BREAK,
1094 |a| aura_essence_break(a, ¶ms.game_data),
1095 )
1096 .aura("inertia", AURA::INERTIA, |a| aura_inertia(a, ¶ms.game_data))
1097 .aura(
1098 "cycle_of_hatred",
1099 AURA::CYCLE_OF_HATRED,
1100 |a| aura_cycle_of_hatred(a, ¶ms.game_data),
1101 )
1102 .aura(
1103 "furious_gaze",
1104 AURA::FURIOUS_GAZE,
1105 |a| aura_furious_gaze(a, ¶ms.game_data),
1106 )
1107 .aura(
1108 "student_of_suffering",
1109 AURA::STUDENT_OF_SUFFERING,
1110 |a| aura_student_of_suffering(a, ¶ms.game_data),
1111 )
1112 .aura(
1113 "demonic_intensity",
1114 AURA::DEMONIC_INTENSITY,
1115 |a| aura_demonic_intensity(a, ¶ms.game_data),
1116 )
1117 .aura(
1118 "empowered_eye_beam",
1119 AURA::EMPOWERED_EYE_BEAM,
1120 |a| aura_empowered_eye_beam(a, ¶ms.game_data),
1121 )
1122 .aura(
1123 "reavers_glaive",
1124 AURA::REAVERS_GLAIVE,
1125 |a| aura_reavers_glaive(a, ¶ms.game_data),
1126 )
1127 .aura("exergy", AURA::EXERGY, |a| aura_exergy(a, ¶ms.game_data))
1128 .aura(
1129 "immolation_aura",
1130 AURA::IMMOLATION_AURA,
1131 |a| aura_immolation_aura(a, ¶ms.game_data),
1132 )
1133 .aura(
1134 "the_hunt_dot",
1135 AURA::THE_HUNT_DOT,
1136 |a| aura_the_hunt_dot(a, ¶ms.game_data),
1137 )
1138 .aura(
1139 "burning_blades",
1140 AURA::BURNING_BLADES,
1141 |a| aura_burning_blades(a, ¶ms.game_data),
1142 )
1143 .aura(
1144 "serrated_glaive",
1145 AURA::SERRATED_GLAIVE,
1146 |a| aura_serrated_glaive(a, ¶ms.game_data),
1147 )
1148 .aura("soulscar", AURA::SOULSCAR, |a| aura_soulscar(a, ¶ms.game_data))
1149 .spell(
1150 "chaos_strike",
1151 SPELL::CHAOS_STRIKE,
1152 |s| spell_chaos_strike(s, ¶ms.game_data),
1153 )
1154 .spell(
1155 "annihilation",
1156 SPELL::ANNIHILATION,
1157 |s| spell_annihilation(s, ¶ms.game_data),
1158 )
1159 .spell(
1160 "blade_dance",
1161 SPELL::BLADE_DANCE,
1162 |s| spell_blade_dance(s, ¶ms.game_data),
1163 )
1164 .spell(
1165 "death_sweep",
1166 SPELL::DEATH_SWEEP,
1167 |s| spell_death_sweep(s, ¶ms.game_data),
1168 )
1169 .spell(
1170 "metamorphosis",
1171 SPELL::METAMORPHOSIS,
1172 |s| spell_metamorphosis(s, ¶ms.game_data),
1173 )
1174 .spell(
1175 "throw_glaive",
1176 SPELL::THROW_GLAIVE,
1177 |s| spell_throw_glaive(s, ¶ms.game_data),
1178 )
1179 .spell("fel_rush", SPELL::FEL_RUSH, |s| spell_fel_rush(s, ¶ms.game_data))
1180 .spell(
1181 "vengeful_retreat",
1182 SPELL::VENGEFUL_RETREAT,
1183 |s| spell_vengeful_retreat(s, ¶ms.game_data),
1184 )
1185 .spell(
1186 "essence_break",
1187 SPELL::ESSENCE_BREAK,
1188 |s| spell_essence_break(s, ¶ms.game_data),
1189 )
1190 .spell("felblade", SPELL::FELBLADE, |s| spell_felblade(s, ¶ms.game_data))
1191 .spell("eye_beam", SPELL::EYE_BEAM, |s| spell_eye_beam(s, ¶ms.game_data))
1192 .spell(
1193 "abyssal_gaze",
1194 SPELL::ABYSSAL_GAZE,
1195 |s| spell_abyssal_gaze(s, ¶ms.game_data),
1196 )
1197 .spell(
1198 "immolation_aura",
1199 SPELL::IMMOLATION_AURA,
1200 |s| spell_immolation_aura(s, ¶ms.game_data),
1201 )
1202 .spell("the_hunt", SPELL::THE_HUNT, |s| spell_the_hunt(s, ¶ms.game_data))
1203 .auto_attack(|a| {
1204 a
1205 .spell_id(6603)
1206 .swing_ms(2600)
1207 .apply_base_from_data(¶ms.game_data)
1208 .on_swing(crate::hooks::havoc_demon_hunter::swing_hook)
1209 })
1210 .auto_attack(|a| {
1211 a
1212 .spell_id(6603)
1213 .swing_ms(2600)
1214 .apply_base_from_data(¶ms.game_data)
1215 .on_swing(crate::hooks::havoc_demon_hunter::swing_hook)
1216 })
1217 .game_data(params.game_data.clone())
1218 .talent_spell_ids(TALENTS)
1219 .talent_selections(params.talent_selections)
1220 .set_bonus_auras(params.set_bonus_auras)
1221 .encounter(params.encounter.clone());
1222 let builder = crate::generated::items::register_equipped(
1223 builder,
1224 ¶ms.game_data,
1225 params.equipped_items,
1226 )?;
1227
1228 builder.into_draft()
1229}
1230fn new_handler(
1231 params: wowlab_engine_ports::HandlerParams<'_>,
1232) -> Result<Box<dyn SpecHandler>, wowlab_engine_ports::EngineError> {
1233 let handler = crate::composition::compose_handler(
1234 build_combat_system_draft,
1235 ¶ms,
1236 crate::hooks::havoc_demon_hunter::HavocHandler::new,
1237 )?;
1238
1239 Ok(Box::new(handler))
1240}
1241static DECLARED_METADATA: DeclaredSpecMetadata = DeclaredSpecMetadata {
1242 primary_resource: ResourceType::Fury,
1243 secondary_resource: None,
1244 spell_ids: DECLARED_SPELL_IDS,
1245 aura_ids: DECLARED_AURA_IDS,
1246 server_proc_entries: &[],
1247 talents: TALENTS,
1248 rotation_field_schema: &[],
1249 metrics_plugin_id: None,
1250 hero_talent_trees: &[
1251 HeroTalentTreeDesc {
1252 name: "Aldrachi Reaver",
1253 spells: HERO_TREE_ALDRACHI_REAVER_SPELLS,
1254 auras: HERO_TREE_ALDRACHI_REAVER_AURAS,
1255 },
1256 HeroTalentTreeDesc {
1257 name: "Fel Scarred",
1258 spells: HERO_TREE_FEL_SCARRED_SPELLS,
1259 auras: HERO_TREE_FEL_SCARRED_AURAS,
1260 },
1261 ],
1262 reported_spells: REPORTED_SPELLS,
1263 masked_passive_effects: &[],
1264 passive_effect_overrides: &[
1265 wowlab_engine_ports::DeclaredPassiveEffectOverride {
1266 spell_id: 388_118,
1267 effect: 2,
1268 source: Some((388_118, 2)),
1269 value: 0.0,
1270 multiplier: 0.5,
1271 },
1272 wowlab_engine_ports::DeclaredPassiveEffectOverride {
1273 spell_id: 427_794,
1274 effect: 4,
1275 source: Some((427_794, 1)),
1276 value: 0.0,
1277 multiplier: 1.0,
1278 },
1279 wowlab_engine_ports::DeclaredPassiveEffectOverride {
1280 spell_id: 427_794,
1281 effect: 5,
1282 source: Some((427_794, 1)),
1283 value: 0.0,
1284 multiplier: 1.0,
1285 },
1286 ],
1287};
1288pub(super) const SPEC_DESCRIPTOR: SpecDescriptor = SpecDescriptor {
1289 spec_id: SpecId::Havoc,
1290 display_name: "Havoc Demon Hunter",
1291 metadata: DECLARED_METADATA,
1292 handler_factory: new_handler,
1293};
1294wowlab_engine_combat::smoke_test!(build_combat_system_draft);