Skip to main content

wowlab_engine_content/generated/specs/
havoc_demon_hunter.rs

1//! @generated by codegen-cli from manifests/specs/demon_hunter/havoc/manifest.toml -- do not edit by hand.
2// Generated code: naming follows game data conventions
3#![allow(non_snake_case, dead_code)]
4use wowlab_types::{combat::ResourceType, game::SpecId};
5use wowlab_engine_combat::{
6    CombatSystemBuilder, CombatSystemDraft, AuraDefinitionDraft, LocalAuraIdx,
7    LocalSpellIdx, SpellDefinitionDraft,
8};
9use wowlab_engine_ports::{
10    DeclaredSpecMetadata, SpecDescriptor, SpecHandler, HeroTalentTreeDesc,
11};
12use wowlab_engine_gamedata::ResolvedGameData;
13pub(crate) mod SPELL {
14    ///<https://wowlab.gg/inspect/spell/162794>
15    pub(crate) const CHAOS_STRIKE: u32 = 162_794;
16    ///<https://wowlab.gg/inspect/spell/201427>
17    pub(crate) const ANNIHILATION: u32 = 201_427;
18    ///<https://wowlab.gg/inspect/spell/188499>
19    pub(crate) const BLADE_DANCE: u32 = 188_499;
20    ///<https://wowlab.gg/inspect/spell/210152>
21    pub(crate) const DEATH_SWEEP: u32 = 210_152;
22    ///<https://wowlab.gg/inspect/spell/191427>
23    pub(crate) const METAMORPHOSIS: u32 = 191_427;
24    ///<https://wowlab.gg/inspect/spell/185123>
25    pub(crate) const THROW_GLAIVE: u32 = 185_123;
26    ///<https://wowlab.gg/inspect/spell/195072>
27    pub(crate) const FEL_RUSH: u32 = 195_072;
28    ///<https://wowlab.gg/inspect/spell/198793>
29    pub(crate) const VENGEFUL_RETREAT: u32 = 198_793;
30    ///<https://wowlab.gg/inspect/spell/258860>
31    pub(crate) const ESSENCE_BREAK: u32 = 258_860;
32    ///<https://wowlab.gg/inspect/spell/232893>
33    pub(crate) const FELBLADE: u32 = 232_893;
34    ///<https://wowlab.gg/inspect/spell/198013>
35    pub(crate) const EYE_BEAM: u32 = 198_013;
36    ///<https://wowlab.gg/inspect/spell/452497>
37    pub(crate) const ABYSSAL_GAZE: u32 = 452_497;
38    ///<https://wowlab.gg/inspect/spell/258920>
39    pub(crate) const IMMOLATION_AURA: u32 = 258_920;
40    ///<https://wowlab.gg/inspect/spell/370965>
41    pub(crate) const THE_HUNT: u32 = 370_965;
42}
43pub(crate) mod AURA {
44    ///<https://wowlab.gg/inspect/spell/162264>
45    pub(crate) const METAMORPHOSIS: u32 = 162_264;
46    ///<https://wowlab.gg/inspect/spell/320338>
47    pub(crate) const ESSENCE_BREAK: u32 = 320_338;
48    ///<https://wowlab.gg/inspect/spell/427640>
49    pub(crate) const INERTIA: u32 = 427_640;
50    ///<https://wowlab.gg/inspect/spell/1214887>
51    pub(crate) const CYCLE_OF_HATRED: u32 = 1_214_887;
52    ///<https://wowlab.gg/inspect/spell/343312>
53    pub(crate) const FURIOUS_GAZE: u32 = 343_312;
54    ///<https://wowlab.gg/inspect/spell/453239>
55    pub(crate) const STUDENT_OF_SUFFERING: u32 = 453_239;
56    ///<https://wowlab.gg/inspect/spell/452489>
57    pub(crate) const DEMONIC_INTENSITY: u32 = 452_489;
58    ///<https://wowlab.gg/inspect/spell/1271144>
59    pub(crate) const EMPOWERED_EYE_BEAM: u32 = 1_271_144;
60    ///<https://wowlab.gg/inspect/spell/442294>
61    pub(crate) const REAVERS_GLAIVE: u32 = 442_294;
62    ///<https://wowlab.gg/inspect/spell/442266>
63    pub(crate) const EXERGY: u32 = 442_266;
64    ///<https://wowlab.gg/inspect/spell/258920>
65    pub(crate) const IMMOLATION_AURA: u32 = 258_920;
66    ///<https://wowlab.gg/inspect/spell/370969>
67    pub(crate) const THE_HUNT_DOT: u32 = 370_969;
68    ///<https://wowlab.gg/inspect/spell/453177>
69    pub(crate) const BURNING_BLADES: u32 = 453_177;
70    ///<https://wowlab.gg/inspect/spell/390155>
71    pub(crate) const SERRATED_GLAIVE: u32 = 390_155;
72    ///<https://wowlab.gg/inspect/spell/390181>
73    pub(crate) const SOULSCAR: u32 = 390_181;
74}
75pub(crate) mod TALENT {
76    ///<https://wowlab.gg/inspect/spell/203550>
77    pub(crate) const BLIND_FURY: u32 = 203_550;
78    ///<https://wowlab.gg/inspect/spell/388112>
79    pub(crate) const CHAOTIC_TRANSFORMATION: u32 = 388_112;
80    ///<https://wowlab.gg/inspect/spell/258887>
81    pub(crate) const CYCLE_OF_HATRED: u32 = 258_887;
82    ///<https://wowlab.gg/inspect/spell/213410>
83    pub(crate) const DEMONIC: u32 = 213_410;
84    ///<https://wowlab.gg/inspect/spell/258860>
85    pub(crate) const ESSENCE_BREAK: u32 = 258_860;
86    ///<https://wowlab.gg/inspect/spell/1270898>
87    pub(crate) const ETERNAL_HUNT: u32 = 1_270_898;
88    ///<https://wowlab.gg/inspect/spell/1270900>
89    pub(crate) const ETERNAL_HUNT_RANK_2: u32 = 1_270_900;
90    ///<https://wowlab.gg/inspect/spell/198013>
91    pub(crate) const EYE_BEAM: u32 = 198_013;
92    ///<https://wowlab.gg/inspect/spell/232893>
93    pub(crate) const FELBLADE: u32 = 232_893;
94    ///<https://wowlab.gg/inspect/spell/206416>
95    pub(crate) const FIRST_BLOOD: u32 = 206_416;
96    ///<https://wowlab.gg/inspect/spell/343311>
97    pub(crate) const FURIOUS_GAZE: u32 = 343_311;
98    ///<https://wowlab.gg/inspect/spell/393029>
99    pub(crate) const FURIOUS_THROWS: u32 = 393_029;
100    ///<https://wowlab.gg/inspect/spell/427794>
101    pub(crate) const NEVER_SAY_DIE: u32 = 427_794;
102    ///<https://wowlab.gg/inspect/spell/1220506>
103    pub(crate) const SCREAMING_BRUTALITY: u32 = 1_220_506;
104    ///<https://wowlab.gg/inspect/spell/390154>
105    pub(crate) const SERRATED_GLAIVE: u32 = 390_154;
106    ///<https://wowlab.gg/inspect/spell/388106>
107    pub(crate) const SOULSCAR: u32 = 388_106;
108    ///<https://wowlab.gg/inspect/spell/370965>
109    pub(crate) const THE_HUNT: u32 = 370_965;
110    ///<https://wowlab.gg/inspect/spell/258881>
111    pub(crate) const TRAIL_OF_RUIN: u32 = 258_881;
112}
113pub(crate) mod SET_BONUS {
114    ///<https://wowlab.gg/inspect/spell/1296611>
115    pub(crate) const MID2_HAVOC_2PC: u32 = 1_296_611;
116    ///<https://wowlab.gg/inspect/spell/1296612>
117    pub(crate) const MID2_HAVOC_4PC: u32 = 1_296_612;
118}
119pub(crate) mod REPORTED_SPELL {
120    ///<https://wowlab.gg/inspect/spell/227518>
121    pub(crate) const ANNIHILATION_DAMAGE_1: u32 = 227_518;
122    ///<https://wowlab.gg/inspect/spell/201428>
123    pub(crate) const ANNIHILATION_DAMAGE_2: u32 = 201_428;
124    ///<https://wowlab.gg/inspect/spell/6603>
125    pub(crate) const AUTO_ATTACK: u32 = 6603;
126    ///<https://wowlab.gg/inspect/spell/199552>
127    pub(crate) const BLADE_DANCE_DAMAGE: u32 = 199_552;
128    ///<https://wowlab.gg/inspect/spell/200685>
129    pub(crate) const BLADE_DANCE_DAMAGE_4: u32 = 200_685;
130    ///<https://wowlab.gg/inspect/spell/391374>
131    pub(crate) const BLADE_DANCE_FIRST_BLOOD: u32 = 391_374;
132    ///<https://wowlab.gg/inspect/spell/391378>
133    pub(crate) const BLADE_DANCE_FIRST_BLOOD_4: u32 = 391_378;
134    ///<https://wowlab.gg/inspect/spell/453177>
135    pub(crate) const BURNING_BLADES: u32 = 453_177;
136    ///<https://wowlab.gg/inspect/spell/222031>
137    pub(crate) const CHAOS_STRIKE_DAMAGE_1: u32 = 222_031;
138    ///<https://wowlab.gg/inspect/spell/199547>
139    pub(crate) const CHAOS_STRIKE_DAMAGE_2: u32 = 199_547;
140    ///<https://wowlab.gg/inspect/spell/393055>
141    pub(crate) const DEATH_SWEEP_FIRST_BLOOD: u32 = 393_055;
142    ///<https://wowlab.gg/inspect/spell/393054>
143    pub(crate) const DEATH_SWEEP_FIRST_BLOOD_4: u32 = 393_054;
144    ///<https://wowlab.gg/inspect/spell/203796>
145    pub(crate) const DEMON_BLADES: u32 = 203_796;
146    ///<https://wowlab.gg/inspect/spell/198030>
147    pub(crate) const EYE_BEAM_TICK: u32 = 198_030;
148    ///<https://wowlab.gg/inspect/spell/192611>
149    pub(crate) const FEL_RUSH_DAMAGE: u32 = 192_611;
150    ///<https://wowlab.gg/inspect/spell/213243>
151    pub(crate) const FELBLADE_DAMAGE: u32 = 213_243;
152    ///<https://wowlab.gg/inspect/spell/258921>
153    pub(crate) const IMMOLATION_AURA_DAMAGE: u32 = 258_921;
154    ///<https://wowlab.gg/inspect/spell/390181>
155    pub(crate) const SOULSCAR: u32 = 390_181;
156    ///<https://wowlab.gg/inspect/spell/370966>
157    pub(crate) const THE_HUNT_DAMAGE: u32 = 370_966;
158    ///<https://wowlab.gg/inspect/spell/337819>
159    pub(crate) const THROW_GLAIVE_DAMAGE: u32 = 337_819;
160    ///<https://wowlab.gg/inspect/spell/393035>
161    pub(crate) const THROW_GLAIVE_FURIOUS_THROWS: u32 = 393_035;
162    ///<https://wowlab.gg/inspect/spell/258883>
163    pub(crate) const TRAIL_OF_RUIN: u32 = 258_883;
164    ///<https://wowlab.gg/inspect/spell/198813>
165    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            ///<https://wowlab.gg/inspect/spell/444810>
171            pub(crate) const ART_OF_THE_GLAIVE_DAMAGE: u32 = 444_810;
172            ///<https://wowlab.gg/inspect/spell/444806>
173            pub(crate) const FURY_OF_THE_ALDRACHI: u32 = 444_806;
174            ///<https://wowlab.gg/inspect/spell/442294>
175            pub(crate) const REAVERS_GLAIVE: u32 = 442_294;
176            ///<https://wowlab.gg/inspect/spell/444686>
177            pub(crate) const REAVERS_GLAIVE_HAVOC: u32 = 444_686;
178            ///<https://wowlab.gg/inspect/spell/442808>
179            pub(crate) const WOUNDED_QUARRY_DAMAGE: u32 = 442_808;
180        }
181        pub(crate) mod AURA {
182            ///<https://wowlab.gg/inspect/spell/444929>
183            pub(crate) const EVASIVE_ACTION: u32 = 444_929;
184            ///<https://wowlab.gg/inspect/spell/442435>
185            pub(crate) const GLAIVE_FLURRY: u32 = 442_435;
186            ///<https://wowlab.gg/inspect/spell/442294>
187            pub(crate) const REAVERS_GLAIVE_BUFF: u32 = 442_294;
188            ///<https://wowlab.gg/inspect/spell/442624>
189            pub(crate) const REAVERS_MARK: u32 = 442_624;
190            ///<https://wowlab.gg/inspect/spell/442442>
191            pub(crate) const RENDING_STRIKE: u32 = 442_442;
192            ///<https://wowlab.gg/inspect/spell/442695>
193            pub(crate) const THRILL_OF_THE_FIGHT: u32 = 442_695;
194        }
195    }
196    pub(crate) mod FEL_SCARRED {
197        pub(crate) mod SPELL {
198            ///<https://wowlab.gg/inspect/spell/452408>
199            pub(crate) const BURNING_BLADES: u32 = 452_408;
200            ///<https://wowlab.gg/inspect/spell/452415>
201            pub(crate) const DEMONIC_INTENSITY: u32 = 452_415;
202            ///<https://wowlab.gg/inspect/spell/452402>
203            pub(crate) const DEMONSURGE: u32 = 452_402;
204            ///<https://wowlab.gg/inspect/spell/452437>
205            pub(crate) const SPIRIT_BURST: u32 = 452_437;
206            ///<https://wowlab.gg/inspect/spell/452412>
207            pub(crate) const STUDENT_OF_SUFFERING: u32 = 452_412;
208            ///<https://wowlab.gg/inspect/spell/453236>
209            pub(crate) const STUDENT_OF_SUFFERING_FURY: u32 = 453_236;
210            ///<https://wowlab.gg/inspect/spell/1272453>
211            pub(crate) const VOLATILE_INSTINCT: u32 = 1_272_453;
212        }
213        pub(crate) mod AURA {
214            ///<https://wowlab.gg/inspect/spell/452416>
215            pub(crate) const DEMONSURGE: u32 = 452_416;
216            ///<https://wowlab.gg/inspect/spell/453239>
217            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    ///<https://wowlab.gg/inspect/spell/200685>
443    pub(crate) const BLADE_DANCE_FINAL: (u32, u8) = (200_685, 2);
444    ///<https://wowlab.gg/inspect/spell/199552>
445    pub(crate) const BLADE_DANCE_HIT: (u32, u8) = (199_552, 2);
446    ///<https://wowlab.gg/inspect/spell/203550>
447    pub(crate) const BLIND_FURY_FURY: (u32, u8) = (203_550, 3);
448    ///<https://wowlab.gg/inspect/spell/452408>
449    pub(crate) const BURNING_BLADES_FRACTION: (u32, u8) = (452_408, 1);
450    ///<https://wowlab.gg/inspect/spell/193840>
451    pub(crate) const CHAOS_STRIKE_FURY_REFUND: (u32, u8) = (193_840, 1);
452    ///<https://wowlab.gg/inspect/spell/197125>
453    pub(crate) const CHAOS_STRIKE_REFUND_PROC: (u32, u8) = (197_125, 1);
454    ///<https://wowlab.gg/inspect/spell/258887>
455    pub(crate) const CYCLE_OF_HATRED_CDR: (u32, u8) = (258_887, 1);
456    ///<https://wowlab.gg/inspect/spell/393054>
457    pub(crate) const DEATH_SWEEP_FIRST_BLOOD_FINAL: (u32, u8) = (393_054, 2);
458    ///<https://wowlab.gg/inspect/spell/393055>
459    pub(crate) const DEATH_SWEEP_FIRST_BLOOD_HIT: (u32, u8) = (393_055, 2);
460    ///<https://wowlab.gg/inspect/spell/213410>
461    pub(crate) const DEMONIC_EXTENSION: (u32, u8) = (213_410, 1);
462    ///<https://wowlab.gg/inspect/spell/452416>
463    pub(crate) const DEMONSURGE_DAMAGE: (u32, u8) = (452_416, 1);
464    ///<https://wowlab.gg/inspect/spell/452416>
465    pub(crate) const DEMONSURGE_STACK_PCT: (u32, u8) = (452_416, 2);
466    ///<https://wowlab.gg/inspect/spell/203796>
467    pub(crate) const DEMON_BLADES_DAMAGE: (u32, u8) = (203_796, 1);
468    ///<https://wowlab.gg/inspect/spell/203796>
469    pub(crate) const DEMON_BLADES_FURY: (u32, u8) = (203_796, 2);
470    ///<https://wowlab.gg/inspect/spell/1287949>
471    pub(crate) const EMPOWERED_EYE_BEAM_DAMAGE: (u32, u8) = (1_287_949, 1);
472    ///<https://wowlab.gg/inspect/spell/1270900>
473    pub(crate) const ETERNAL_HUNT_COOLDOWN_MS: (u32, u8) = (1_270_900, 2);
474    ///<https://wowlab.gg/inspect/spell/1270900>
475    pub(crate) const ETERNAL_HUNT_DAMAGE_PCT: (u32, u8) = (1_270_900, 1);
476    ///<https://wowlab.gg/inspect/spell/1270900>
477    pub(crate) const ETERNAL_HUNT_PERIODIC_PCT: (u32, u8) = (1_270_900, 4);
478    ///<https://wowlab.gg/inspect/spell/198030>
479    pub(crate) const EYE_BEAM_DAMAGE: (u32, u8) = (198_030, 1);
480    ///<https://wowlab.gg/inspect/spell/391378>
481    pub(crate) const FIRST_BLOOD_FINAL: (u32, u8) = (391_378, 2);
482    ///<https://wowlab.gg/inspect/spell/391374>
483    pub(crate) const FIRST_BLOOD_HIT: (u32, u8) = (391_374, 2);
484    ///<https://wowlab.gg/inspect/spell/206416>
485    pub(crate) const FIRST_BLOOD_MULT: (u32, u8) = (206_416, 1);
486    ///<https://wowlab.gg/inspect/spell/393035>
487    pub(crate) const FURIOUS_THROWS_DAMAGE: (u32, u8) = (393_035, 1);
488    ///<https://wowlab.gg/inspect/spell/212612>
489    pub(crate) const HAVOC_AURA_DIRECT: (u32, u8) = (212_612, 1);
490    ///<https://wowlab.gg/inspect/spell/185164>
491    pub(crate) const MASTERY_DIRECT_BONUS: (u32, u8) = (185_164, 1);
492    ///<https://wowlab.gg/inspect/spell/185164>
493    pub(crate) const MASTERY_PERIODIC_BONUS: (u32, u8) = (185_164, 2);
494    ///<https://wowlab.gg/inspect/spell/1220506>
495    pub(crate) const SB_FULL_PCT: (u32, u8) = (1_220_506, 3);
496    ///<https://wowlab.gg/inspect/spell/1220506>
497    pub(crate) const SB_SLASH_CHANCE: (u32, u8) = (1_220_506, 2);
498    ///<https://wowlab.gg/inspect/spell/1220506>
499    pub(crate) const SB_SLASH_PCT: (u32, u8) = (1_220_506, 1);
500    ///<https://wowlab.gg/inspect/spell/390154>
501    pub(crate) const SERRATED_GLAIVE_PCT: (u32, u8) = (390_154, 1);
502    ///<https://wowlab.gg/inspect/spell/388106>
503    pub(crate) const SOULSCAR_FRACTION: (u32, u8) = (388_106, 1);
504    ///<https://wowlab.gg/inspect/spell/337819>
505    pub(crate) const THROW_GLAIVE_DAMAGE: (u32, u8) = (337_819, 1);
506    ///<https://wowlab.gg/inspect/spell/258883>
507    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, &params.game_data),
1090        )
1091        .aura(
1092            "essence_break",
1093            AURA::ESSENCE_BREAK,
1094            |a| aura_essence_break(a, &params.game_data),
1095        )
1096        .aura("inertia", AURA::INERTIA, |a| aura_inertia(a, &params.game_data))
1097        .aura(
1098            "cycle_of_hatred",
1099            AURA::CYCLE_OF_HATRED,
1100            |a| aura_cycle_of_hatred(a, &params.game_data),
1101        )
1102        .aura(
1103            "furious_gaze",
1104            AURA::FURIOUS_GAZE,
1105            |a| aura_furious_gaze(a, &params.game_data),
1106        )
1107        .aura(
1108            "student_of_suffering",
1109            AURA::STUDENT_OF_SUFFERING,
1110            |a| aura_student_of_suffering(a, &params.game_data),
1111        )
1112        .aura(
1113            "demonic_intensity",
1114            AURA::DEMONIC_INTENSITY,
1115            |a| aura_demonic_intensity(a, &params.game_data),
1116        )
1117        .aura(
1118            "empowered_eye_beam",
1119            AURA::EMPOWERED_EYE_BEAM,
1120            |a| aura_empowered_eye_beam(a, &params.game_data),
1121        )
1122        .aura(
1123            "reavers_glaive",
1124            AURA::REAVERS_GLAIVE,
1125            |a| aura_reavers_glaive(a, &params.game_data),
1126        )
1127        .aura("exergy", AURA::EXERGY, |a| aura_exergy(a, &params.game_data))
1128        .aura(
1129            "immolation_aura",
1130            AURA::IMMOLATION_AURA,
1131            |a| aura_immolation_aura(a, &params.game_data),
1132        )
1133        .aura(
1134            "the_hunt_dot",
1135            AURA::THE_HUNT_DOT,
1136            |a| aura_the_hunt_dot(a, &params.game_data),
1137        )
1138        .aura(
1139            "burning_blades",
1140            AURA::BURNING_BLADES,
1141            |a| aura_burning_blades(a, &params.game_data),
1142        )
1143        .aura(
1144            "serrated_glaive",
1145            AURA::SERRATED_GLAIVE,
1146            |a| aura_serrated_glaive(a, &params.game_data),
1147        )
1148        .aura("soulscar", AURA::SOULSCAR, |a| aura_soulscar(a, &params.game_data))
1149        .spell(
1150            "chaos_strike",
1151            SPELL::CHAOS_STRIKE,
1152            |s| spell_chaos_strike(s, &params.game_data),
1153        )
1154        .spell(
1155            "annihilation",
1156            SPELL::ANNIHILATION,
1157            |s| spell_annihilation(s, &params.game_data),
1158        )
1159        .spell(
1160            "blade_dance",
1161            SPELL::BLADE_DANCE,
1162            |s| spell_blade_dance(s, &params.game_data),
1163        )
1164        .spell(
1165            "death_sweep",
1166            SPELL::DEATH_SWEEP,
1167            |s| spell_death_sweep(s, &params.game_data),
1168        )
1169        .spell(
1170            "metamorphosis",
1171            SPELL::METAMORPHOSIS,
1172            |s| spell_metamorphosis(s, &params.game_data),
1173        )
1174        .spell(
1175            "throw_glaive",
1176            SPELL::THROW_GLAIVE,
1177            |s| spell_throw_glaive(s, &params.game_data),
1178        )
1179        .spell("fel_rush", SPELL::FEL_RUSH, |s| spell_fel_rush(s, &params.game_data))
1180        .spell(
1181            "vengeful_retreat",
1182            SPELL::VENGEFUL_RETREAT,
1183            |s| spell_vengeful_retreat(s, &params.game_data),
1184        )
1185        .spell(
1186            "essence_break",
1187            SPELL::ESSENCE_BREAK,
1188            |s| spell_essence_break(s, &params.game_data),
1189        )
1190        .spell("felblade", SPELL::FELBLADE, |s| spell_felblade(s, &params.game_data))
1191        .spell("eye_beam", SPELL::EYE_BEAM, |s| spell_eye_beam(s, &params.game_data))
1192        .spell(
1193            "abyssal_gaze",
1194            SPELL::ABYSSAL_GAZE,
1195            |s| spell_abyssal_gaze(s, &params.game_data),
1196        )
1197        .spell(
1198            "immolation_aura",
1199            SPELL::IMMOLATION_AURA,
1200            |s| spell_immolation_aura(s, &params.game_data),
1201        )
1202        .spell("the_hunt", SPELL::THE_HUNT, |s| spell_the_hunt(s, &params.game_data))
1203        .auto_attack(|a| {
1204            a
1205                .spell_id(6603)
1206                .swing_ms(2600)
1207                .apply_base_from_data(&params.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(&params.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        &params.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        &params,
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);