Skip to main content

wowlab_engine_content/generated/specs/
vengeance_demon_hunter.rs

1//! @generated by codegen-cli from manifests/specs/demon_hunter/vengeance/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/228477>
15    pub(crate) const SOUL_CLEAVE: u32 = 228_477;
16    ///<https://wowlab.gg/inspect/spell/258920>
17    pub(crate) const IMMOLATION_AURA: u32 = 258_920;
18    ///<https://wowlab.gg/inspect/spell/212084>
19    pub(crate) const FEL_DEVASTATION: u32 = 212_084;
20    ///<https://wowlab.gg/inspect/spell/204596>
21    pub(crate) const SIGIL_OF_FLAME: u32 = 204_596;
22    ///<https://wowlab.gg/inspect/spell/203782>
23    pub(crate) const SHEAR: u32 = 203_782;
24    ///<https://wowlab.gg/inspect/spell/187827>
25    pub(crate) const METAMORPHOSIS: u32 = 187_827;
26    ///<https://wowlab.gg/inspect/spell/204157>
27    pub(crate) const THROW_GLAIVE: u32 = 204_157;
28    ///<https://wowlab.gg/inspect/spell/207407>
29    pub(crate) const SOUL_CARVER: u32 = 207_407;
30    ///<https://wowlab.gg/inspect/spell/247454>
31    pub(crate) const SPIRIT_BOMB: u32 = 247_454;
32    ///<https://wowlab.gg/inspect/spell/390163>
33    pub(crate) const SIGIL_OF_SPITE: u32 = 390_163;
34    ///<https://wowlab.gg/inspect/spell/263642>
35    pub(crate) const FRACTURE: u32 = 263_642;
36}
37pub(crate) mod AURA {
38    ///<https://wowlab.gg/inspect/spell/204598>
39    pub(crate) const SIGIL_OF_FLAME: u32 = 204_598;
40    ///<https://wowlab.gg/inspect/spell/203981>
41    pub(crate) const SOUL_FRAGMENTS: u32 = 203_981;
42    ///<https://wowlab.gg/inspect/spell/442294>
43    pub(crate) const REAVERS_GLAIVE: u32 = 442_294;
44    ///<https://wowlab.gg/inspect/spell/442442>
45    pub(crate) const RENDING_STRIKE: u32 = 442_442;
46    ///<https://wowlab.gg/inspect/spell/442435>
47    pub(crate) const GLAIVE_FLURRY: u32 = 442_435;
48    ///<https://wowlab.gg/inspect/spell/1256301>
49    pub(crate) const VOIDFALL_BUILDING: u32 = 1_256_301;
50    ///<https://wowlab.gg/inspect/spell/1256302>
51    pub(crate) const VOIDFALL_SPENDING: u32 = 1_256_302;
52    ///<https://wowlab.gg/inspect/spell/1256322>
53    pub(crate) const VOIDFALL_FINAL_HOUR: u32 = 1_256_322;
54    ///<https://wowlab.gg/inspect/spell/1256667>
55    pub(crate) const CATASTROPHE: u32 = 1_256_667;
56    ///<https://wowlab.gg/inspect/spell/1256308>
57    pub(crate) const DARK_MATTER: u32 = 1_256_308;
58    ///<https://wowlab.gg/inspect/spell/1270476>
59    pub(crate) const UNTETHERED_RAGE: u32 = 1_270_476;
60    ///<https://wowlab.gg/inspect/spell/1270547>
61    pub(crate) const SEETHING_ANGER: u32 = 1_270_547;
62}
63pub(crate) mod TALENT {
64    ///<https://wowlab.gg/inspect/spell/390163>
65    pub(crate) const SIGIL_OF_SPITE: u32 = 390_163;
66    ///<https://wowlab.gg/inspect/spell/207407>
67    pub(crate) const SOUL_CARVER: u32 = 207_407;
68    ///<https://wowlab.gg/inspect/spell/247454>
69    pub(crate) const SPIRIT_BOMB: u32 = 247_454;
70    ///<https://wowlab.gg/inspect/spell/1270444>
71    pub(crate) const UNTETHERED_RAGE_1: u32 = 1_270_444;
72    ///<https://wowlab.gg/inspect/spell/1270448>
73    pub(crate) const UNTETHERED_RAGE_2: u32 = 1_270_448;
74    ///<https://wowlab.gg/inspect/spell/1270449>
75    pub(crate) const UNTETHERED_RAGE_3: u32 = 1_270_449;
76}
77pub(crate) mod SET_BONUS {
78    ///<https://wowlab.gg/inspect/spell/1296613>
79    pub(crate) const MID2_VENGEANCE_2PC: u32 = 1_296_613;
80    ///<https://wowlab.gg/inspect/spell/1296614>
81    pub(crate) const MID2_VENGEANCE_4PC: u32 = 1_296_614;
82}
83pub(crate) mod REPORTED_SPELL {
84    ///<https://wowlab.gg/inspect/spell/225919>
85    pub(crate) const FRACTURE_MH: u32 = 225_919;
86    ///<https://wowlab.gg/inspect/spell/225921>
87    pub(crate) const FRACTURE_OH: u32 = 225_921;
88    ///<https://wowlab.gg/inspect/spell/228478>
89    pub(crate) const SOUL_CLEAVE_DAMAGE: u32 = 228_478;
90}
91pub(crate) mod HERO {
92    pub(crate) mod ALDRACHI_REAVER {
93        pub(crate) mod SPELL {
94            ///<https://wowlab.gg/inspect/spell/444810>
95            pub(crate) const ART_OF_THE_GLAIVE_DAMAGE: u32 = 444_810;
96            ///<https://wowlab.gg/inspect/spell/444806>
97            pub(crate) const FURY_OF_THE_ALDRACHI: u32 = 444_806;
98            ///<https://wowlab.gg/inspect/spell/442294>
99            pub(crate) const REAVERS_GLAIVE: u32 = 442_294;
100            ///<https://wowlab.gg/inspect/spell/444764>
101            pub(crate) const REAVERS_GLAIVE_VENGEANCE: u32 = 444_764;
102            ///<https://wowlab.gg/inspect/spell/442808>
103            pub(crate) const WOUNDED_QUARRY_DAMAGE: u32 = 442_808;
104        }
105        pub(crate) mod AURA {
106            ///<https://wowlab.gg/inspect/spell/444929>
107            pub(crate) const EVASIVE_ACTION: u32 = 444_929;
108            ///<https://wowlab.gg/inspect/spell/442435>
109            pub(crate) const GLAIVE_FLURRY: u32 = 442_435;
110            ///<https://wowlab.gg/inspect/spell/442294>
111            pub(crate) const REAVERS_GLAIVE_BUFF: u32 = 442_294;
112            ///<https://wowlab.gg/inspect/spell/442624>
113            pub(crate) const REAVERS_MARK: u32 = 442_624;
114            ///<https://wowlab.gg/inspect/spell/442442>
115            pub(crate) const RENDING_STRIKE: u32 = 442_442;
116            ///<https://wowlab.gg/inspect/spell/442695>
117            pub(crate) const THRILL_OF_THE_FIGHT: u32 = 442_695;
118        }
119    }
120    pub(crate) mod ANNIHILATOR {
121        pub(crate) mod SPELL {
122            ///<https://wowlab.gg/inspect/spell/1253769>
123            pub(crate) const CATASTROPHE: u32 = 1_253_769;
124            ///<https://wowlab.gg/inspect/spell/1256667>
125            pub(crate) const CATASTROPHE_DOT: u32 = 1_256_667;
126            ///<https://wowlab.gg/inspect/spell/1256307>
127            pub(crate) const DARK_MATTER: u32 = 1_256_307;
128            ///<https://wowlab.gg/inspect/spell/1253805>
129            pub(crate) const FINAL_HOUR: u32 = 1_253_805;
130            ///<https://wowlab.gg/inspect/spell/1279247>
131            pub(crate) const HARNESS_THE_COSMOS: u32 = 1_279_247;
132            ///<https://wowlab.gg/inspect/spell/1256295>
133            pub(crate) const MASS_ACCELERATION: u32 = 1_256_295;
134            ///<https://wowlab.gg/inspect/spell/1253391>
135            pub(crate) const METEORIC_FALL: u32 = 1_253_391;
136            ///<https://wowlab.gg/inspect/spell/1253377>
137            pub(crate) const METEORIC_RISE: u32 = 1_253_377;
138            ///<https://wowlab.gg/inspect/spell/1264130>
139            pub(crate) const METEOR_SHOWER_DAMAGE: u32 = 1_264_130;
140            ///<https://wowlab.gg/inspect/spell/1253817>
141            pub(crate) const OTHERWORLDLY_FOCUS: u32 = 1_253_817;
142            ///<https://wowlab.gg/inspect/spell/1253668>
143            pub(crate) const SWIFT_ERASURE: u32 = 1_253_668;
144            ///<https://wowlab.gg/inspect/spell/1253304>
145            pub(crate) const VOIDFALL: u32 = 1_253_304;
146            ///<https://wowlab.gg/inspect/spell/1256306>
147            pub(crate) const VOIDFALL_METEOR_DAMAGE: u32 = 1_256_306;
148            ///<https://wowlab.gg/inspect/spell/1256353>
149            pub(crate) const WORLD_KILLER: u32 = 1_256_353;
150            ///<https://wowlab.gg/inspect/spell/1256617>
151            pub(crate) const WORLD_KILLER_DAMAGE: u32 = 1_256_617;
152        }
153        pub(crate) mod AURA {
154            ///<https://wowlab.gg/inspect/spell/1256308>
155            pub(crate) const DARK_MATTER: u32 = 1_256_308;
156            ///<https://wowlab.gg/inspect/spell/1256301>
157            pub(crate) const VOIDFALL_BUILDING: u32 = 1_256_301;
158            ///<https://wowlab.gg/inspect/spell/1256322>
159            pub(crate) const VOIDFALL_FINAL_HOUR: u32 = 1_256_322;
160            ///<https://wowlab.gg/inspect/spell/1256302>
161            pub(crate) const VOIDFALL_SPENDING: u32 = 1_256_302;
162        }
163    }
164    pub(crate) mod FEL_SCARRED {
165        pub(crate) mod SPELL {
166            ///<https://wowlab.gg/inspect/spell/451263>
167            pub(crate) const DEMONSURGE_DAMAGE: u32 = 451_263;
168            ///<https://wowlab.gg/inspect/spell/452437>
169            pub(crate) const SPIRIT_BURST: u32 = 452_437;
170            ///<https://wowlab.gg/inspect/spell/453236>
171            pub(crate) const STUDENT_OF_SUFFERING_FURY: u32 = 453_236;
172        }
173        pub(crate) mod AURA {
174            ///<https://wowlab.gg/inspect/spell/452408>
175            pub(crate) const BURNING_BLADES: u32 = 452_408;
176            ///<https://wowlab.gg/inspect/spell/452415>
177            pub(crate) const DEMONIC_INTENSITY: u32 = 452_415;
178            ///<https://wowlab.gg/inspect/spell/452416>
179            pub(crate) const DEMONSURGE: u32 = 452_416;
180            ///<https://wowlab.gg/inspect/spell/453239>
181            pub(crate) const STUDENT_OF_SUFFERING: u32 = 453_239;
182        }
183    }
184}
185static HERO_TREE_ALDRACHI_REAVER_SPELLS: &[(&str, u32)] = &[
186    ("ART_OF_THE_GLAIVE_DAMAGE", 444_810),
187    ("FURY_OF_THE_ALDRACHI", 444_806),
188    ("REAVERS_GLAIVE", 442_294),
189    ("REAVERS_GLAIVE_VENGEANCE", 444_764),
190    ("WOUNDED_QUARRY_DAMAGE", 442_808),
191];
192static HERO_TREE_ALDRACHI_REAVER_AURAS: &[(&str, u32)] = &[
193    ("EVASIVE_ACTION", 444_929),
194    ("GLAIVE_FLURRY", 442_435),
195    ("REAVERS_GLAIVE_BUFF", 442_294),
196    ("REAVERS_MARK", 442_624),
197    ("RENDING_STRIKE", 442_442),
198    ("THRILL_OF_THE_FIGHT", 442_695),
199];
200static HERO_TREE_ANNIHILATOR_SPELLS: &[(&str, u32)] = &[
201    ("CATASTROPHE", 1_253_769),
202    ("CATASTROPHE_DOT", 1_256_667),
203    ("DARK_MATTER", 1_256_307),
204    ("FINAL_HOUR", 1_253_805),
205    ("HARNESS_THE_COSMOS", 1_279_247),
206    ("MASS_ACCELERATION", 1_256_295),
207    ("METEORIC_FALL", 1_253_391),
208    ("METEORIC_RISE", 1_253_377),
209    ("METEOR_SHOWER_DAMAGE", 1_264_130),
210    ("OTHERWORLDLY_FOCUS", 1_253_817),
211    ("SWIFT_ERASURE", 1_253_668),
212    ("VOIDFALL", 1_253_304),
213    ("VOIDFALL_METEOR_DAMAGE", 1_256_306),
214    ("WORLD_KILLER", 1_256_353),
215    ("WORLD_KILLER_DAMAGE", 1_256_617),
216];
217static HERO_TREE_ANNIHILATOR_AURAS: &[(&str, u32)] = &[
218    ("DARK_MATTER", 1_256_308),
219    ("VOIDFALL_BUILDING", 1_256_301),
220    ("VOIDFALL_FINAL_HOUR", 1_256_322),
221    ("VOIDFALL_SPENDING", 1_256_302),
222];
223static HERO_TREE_FEL_SCARRED_SPELLS: &[(&str, u32)] = &[
224    ("DEMONSURGE_DAMAGE", 451_263),
225    ("SPIRIT_BURST", 452_437),
226    ("STUDENT_OF_SUFFERING_FURY", 453_236),
227];
228static HERO_TREE_FEL_SCARRED_AURAS: &[(&str, u32)] = &[
229    ("BURNING_BLADES", 452_408),
230    ("DEMONIC_INTENSITY", 452_415),
231    ("DEMONSURGE", 452_416),
232    ("STUDENT_OF_SUFFERING", 453_239),
233];
234pub(crate) mod DAMAGE_SPELL {
235    pub(crate) const SOUL_CLEAVE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::damage::ACTION::SPELL_228477;
236    pub(crate) const IMMOLATION_AURA: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::damage::ACTION::SPELL_258920;
237    pub(crate) const FEL_DEVASTATION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::damage::ACTION::SPELL_212084;
238    pub(crate) const SIGIL_OF_FLAME: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::damage::ACTION::SPELL_204596;
239    pub(crate) const SHEAR: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::damage::ACTION::SPELL_203782;
240    pub(crate) const METAMORPHOSIS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::damage::ACTION::SPELL_187827;
241    pub(crate) const THROW_GLAIVE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::damage::ACTION::SPELL_204157;
242    pub(crate) const SOUL_CARVER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::damage::ACTION::SPELL_207407;
243    pub(crate) const SPIRIT_BOMB: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::damage::ACTION::SPELL_247454;
244    pub(crate) const SIGIL_OF_SPITE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::damage::ACTION::SPELL_390163;
245    pub(crate) const FRACTURE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::damage::ACTION::SPELL_263642;
246    pub(crate) const ART_OF_THE_GLAIVE_DAMAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::damage::ACTION::SPELL_444810;
247    pub(crate) const FURY_OF_THE_ALDRACHI: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::damage::ACTION::SPELL_444806;
248    pub(crate) const REAVERS_GLAIVE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::damage::ACTION::SPELL_442294;
249    pub(crate) const REAVERS_GLAIVE_VENGEANCE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::damage::ACTION::SPELL_444764;
250    pub(crate) const WOUNDED_QUARRY_DAMAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::damage::ACTION::SPELL_442808;
251    pub(crate) const CATASTROPHE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::damage::ACTION::SPELL_1253769;
252    pub(crate) const CATASTROPHE_DOT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::damage::ACTION::SPELL_1256667;
253    pub(crate) const DARK_MATTER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::damage::ACTION::SPELL_1256307;
254    pub(crate) const FINAL_HOUR: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::damage::ACTION::SPELL_1253805;
255    pub(crate) const HARNESS_THE_COSMOS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::damage::ACTION::SPELL_1279247;
256    pub(crate) const MASS_ACCELERATION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::damage::ACTION::SPELL_1256295;
257    pub(crate) const METEORIC_FALL: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::damage::ACTION::SPELL_1253391;
258    pub(crate) const METEORIC_RISE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::damage::ACTION::SPELL_1253377;
259    pub(crate) const METEOR_SHOWER_DAMAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::damage::ACTION::SPELL_1264130;
260    pub(crate) const OTHERWORLDLY_FOCUS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::damage::ACTION::SPELL_1253817;
261    pub(crate) const SWIFT_ERASURE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::damage::ACTION::SPELL_1253668;
262    pub(crate) const VOIDFALL: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::damage::ACTION::SPELL_1253304;
263    pub(crate) const VOIDFALL_METEOR_DAMAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::damage::ACTION::SPELL_1256306;
264    pub(crate) const WORLD_KILLER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::damage::ACTION::SPELL_1256353;
265    pub(crate) const WORLD_KILLER_DAMAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::damage::ACTION::SPELL_1256617;
266    pub(crate) const DEMONSURGE_DAMAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::damage::ACTION::SPELL_451263;
267    pub(crate) const SPIRIT_BURST: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::damage::ACTION::SPELL_452437;
268    pub(crate) const STUDENT_OF_SUFFERING_FURY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::damage::ACTION::SPELL_453236;
269}
270pub(crate) mod DAMAGE_AURA {
271    pub(crate) const SIGIL_OF_FLAME: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::damage::ACTION::SPELL_204598;
272    pub(crate) const SOUL_FRAGMENTS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::damage::ACTION::SPELL_203981;
273    pub(crate) const REAVERS_GLAIVE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::damage::ACTION::SPELL_442294;
274    pub(crate) const RENDING_STRIKE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::damage::ACTION::SPELL_442442;
275    pub(crate) const GLAIVE_FLURRY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::damage::ACTION::SPELL_442435;
276    pub(crate) const VOIDFALL_BUILDING: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::damage::ACTION::SPELL_1256301;
277    pub(crate) const VOIDFALL_SPENDING: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::damage::ACTION::SPELL_1256302;
278    pub(crate) const VOIDFALL_FINAL_HOUR: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::damage::ACTION::SPELL_1256322;
279    pub(crate) const CATASTROPHE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::damage::ACTION::SPELL_1256667;
280    pub(crate) const DARK_MATTER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::damage::ACTION::SPELL_1256308;
281    pub(crate) const UNTETHERED_RAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::damage::ACTION::SPELL_1270476;
282    pub(crate) const SEETHING_ANGER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::damage::ACTION::SPELL_1270547;
283}
284pub(crate) mod DAMAGE_TALENT {
285    pub(crate) const SIGIL_OF_SPITE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::damage::ACTION::SPELL_390163;
286    pub(crate) const SOUL_CARVER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::damage::ACTION::SPELL_207407;
287    pub(crate) const SPIRIT_BOMB: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::damage::ACTION::SPELL_247454;
288    pub(crate) const UNTETHERED_RAGE_1: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::damage::ACTION::SPELL_1270444;
289    pub(crate) const UNTETHERED_RAGE_2: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::damage::ACTION::SPELL_1270448;
290    pub(crate) const UNTETHERED_RAGE_3: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::damage::ACTION::SPELL_1270449;
291}
292pub(crate) mod DAMAGE_REPORTED {
293    pub(crate) const FRACTURE_MH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::damage::ACTION::SPELL_225919;
294    pub(crate) const FRACTURE_OH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::damage::ACTION::SPELL_225921;
295    pub(crate) const SOUL_CLEAVE_DAMAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::damage::ACTION::SPELL_228478;
296}
297pub(crate) mod DAMAGE_EFFECT {
298    pub(crate) const FEL_BLOOD: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::damage::EFFECT::SPELL_321299_EFFECT_1;
299    pub(crate) const FRACTURE_FRAGMENTS: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::damage::EFFECT::SPELL_263642_EFFECT_1;
300    pub(crate) const SPIRIT_BOMB_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::damage::EFFECT::SPELL_247455_EFFECT_1;
301    pub(crate) const VOIDFALL_CHANCE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::damage::EFFECT::SPELL_1253304_EFFECT_3;
302    pub(crate) const VOIDFALL_STACKS: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::damage::EFFECT::SPELL_1253304_EFFECT_1;
303    pub(crate) const VOIDFALL_METEOR_COEF: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::damage::EFFECT::SPELL_1256306_EFFECT_1;
304    pub(crate) const WORLD_KILLER_COEF: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::damage::EFFECT::SPELL_1256617_EFFECT_1;
305    pub(crate) const WORLD_KILLER_META_CDR: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::damage::EFFECT::SPELL_1256353_EFFECT_3;
306    pub(crate) const CATASTROPHE_PCT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::damage::EFFECT::SPELL_1253769_EFFECT_1;
307    pub(crate) const METEOR_SHOWER_TICKS: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::damage::EFFECT::SPELL_1256307_EFFECT_1;
308    pub(crate) const METEOR_SHOWER_COEF: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::damage::EFFECT::SPELL_1264130_EFFECT_1;
309    pub(crate) const MASS_ACCELERATION_STACKS: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::damage::EFFECT::SPELL_1256295_EFFECT_1;
310    pub(crate) const OTHERWORLDLY_FOCUS_PCT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::damage::EFFECT::SPELL_1253817_EFFECT_1;
311    pub(crate) const HARNESS_THE_COSMOS_PCT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::damage::EFFECT::SPELL_1279247_EFFECT_1;
312    pub(crate) const MID2_2PC_SIGIL_EXTENSION_MS: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::damage::EFFECT::SPELL_1296613_EFFECT_2;
313    pub(crate) const MID2_4PC_SIGIL_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::damage::EFFECT::SPELL_1296614_EFFECT_1;
314}
315pub(crate) const AURA_SIGIL_OF_FLAME: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::AURA_SIGIL_OF_FLAME
316    .bind(
317        wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::PROOF,
318    );
319pub(crate) const AURA_SOUL_FRAGMENTS: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::AURA_SOUL_FRAGMENTS
320    .bind(
321        wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::PROOF,
322    );
323pub(crate) const AURA_REAVERS_GLAIVE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::AURA_REAVERS_GLAIVE
324    .bind(
325        wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::PROOF,
326    );
327pub(crate) const AURA_RENDING_STRIKE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::AURA_RENDING_STRIKE
328    .bind(
329        wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::PROOF,
330    );
331pub(crate) const AURA_GLAIVE_FLURRY: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::AURA_GLAIVE_FLURRY
332    .bind(
333        wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::PROOF,
334    );
335pub(crate) const AURA_VOIDFALL_BUILDING: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::AURA_VOIDFALL_BUILDING
336    .bind(
337        wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::PROOF,
338    );
339pub(crate) const AURA_VOIDFALL_SPENDING: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::AURA_VOIDFALL_SPENDING
340    .bind(
341        wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::PROOF,
342    );
343pub(crate) const AURA_VOIDFALL_FINAL_HOUR: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::AURA_VOIDFALL_FINAL_HOUR
344    .bind(
345        wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::PROOF,
346    );
347pub(crate) const AURA_CATASTROPHE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::AURA_CATASTROPHE
348    .bind(
349        wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::PROOF,
350    );
351pub(crate) const AURA_DARK_MATTER: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::AURA_DARK_MATTER
352    .bind(
353        wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::PROOF,
354    );
355pub(crate) const AURA_UNTETHERED_RAGE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::AURA_UNTETHERED_RAGE
356    .bind(
357        wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::PROOF,
358    );
359pub(crate) const AURA_SEETHING_ANGER: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::AURA_SEETHING_ANGER
360    .bind(
361        wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::PROOF,
362    );
363pub(crate) const AURA_COUNT: usize = 12;
364const _: () = assert!(
365    AURA_COUNT == 12, "AURA index ABI: count changed -- update positional hook consumers"
366);
367pub(crate) const SPELL_SOUL_CLEAVE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::SPELL_SOUL_CLEAVE
368    .bind(
369        wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::PROOF,
370    );
371pub(crate) const SPELL_IMMOLATION_AURA: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::SPELL_IMMOLATION_AURA
372    .bind(
373        wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::PROOF,
374    );
375pub(crate) const SPELL_FEL_DEVASTATION: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::SPELL_FEL_DEVASTATION
376    .bind(
377        wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::PROOF,
378    );
379pub(crate) const SPELL_SIGIL_OF_FLAME: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::SPELL_SIGIL_OF_FLAME
380    .bind(
381        wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::PROOF,
382    );
383pub(crate) const SPELL_SHEAR: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::SPELL_SHEAR
384    .bind(
385        wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::PROOF,
386    );
387pub(crate) const SPELL_METAMORPHOSIS: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::SPELL_METAMORPHOSIS
388    .bind(
389        wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::PROOF,
390    );
391pub(crate) const SPELL_THROW_GLAIVE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::SPELL_THROW_GLAIVE
392    .bind(
393        wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::PROOF,
394    );
395pub(crate) const SPELL_SOUL_CARVER: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::SPELL_SOUL_CARVER
396    .bind(
397        wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::PROOF,
398    );
399pub(crate) const SPELL_SPIRIT_BOMB: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::SPELL_SPIRIT_BOMB
400    .bind(
401        wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::PROOF,
402    );
403pub(crate) const SPELL_SIGIL_OF_SPITE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::SPELL_SIGIL_OF_SPITE
404    .bind(
405        wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::PROOF,
406    );
407pub(crate) const SPELL_FRACTURE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::SPELL_FRACTURE
408    .bind(
409        wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::PROOF,
410    );
411pub(crate) const SPELL_COUNT: usize = 11;
412const _: () = assert!(
413    SPELL_COUNT == 11,
414    "SPELL index ABI: count changed -- update positional hook consumers"
415);
416pub(crate) mod EFFECT {
417    ///<https://wowlab.gg/inspect/spell/321299>
418    pub(crate) const FEL_BLOOD: (u32, u8) = (321_299, 1);
419    ///<https://wowlab.gg/inspect/spell/263642>
420    pub(crate) const FRACTURE_FRAGMENTS: (u32, u8) = (263_642, 1);
421    ///<https://wowlab.gg/inspect/spell/247455>
422    pub(crate) const SPIRIT_BOMB_DAMAGE: (u32, u8) = (247_455, 1);
423    ///<https://wowlab.gg/inspect/spell/1253304>
424    pub(crate) const VOIDFALL_CHANCE: (u32, u8) = (1_253_304, 3);
425    ///<https://wowlab.gg/inspect/spell/1253304>
426    pub(crate) const VOIDFALL_STACKS: (u32, u8) = (1_253_304, 1);
427    ///<https://wowlab.gg/inspect/spell/1256306>
428    pub(crate) const VOIDFALL_METEOR_COEF: (u32, u8) = (1_256_306, 1);
429    ///<https://wowlab.gg/inspect/spell/1256617>
430    pub(crate) const WORLD_KILLER_COEF: (u32, u8) = (1_256_617, 1);
431    ///<https://wowlab.gg/inspect/spell/1256353>
432    pub(crate) const WORLD_KILLER_META_CDR: (u32, u8) = (1_256_353, 3);
433    ///<https://wowlab.gg/inspect/spell/1253769>
434    pub(crate) const CATASTROPHE_PCT: (u32, u8) = (1_253_769, 1);
435    ///<https://wowlab.gg/inspect/spell/1256307>
436    pub(crate) const METEOR_SHOWER_TICKS: (u32, u8) = (1_256_307, 1);
437    ///<https://wowlab.gg/inspect/spell/1264130>
438    pub(crate) const METEOR_SHOWER_COEF: (u32, u8) = (1_264_130, 1);
439    ///<https://wowlab.gg/inspect/spell/1256295>
440    pub(crate) const MASS_ACCELERATION_STACKS: (u32, u8) = (1_256_295, 1);
441    ///<https://wowlab.gg/inspect/spell/1253817>
442    pub(crate) const OTHERWORLDLY_FOCUS_PCT: (u32, u8) = (1_253_817, 1);
443    ///<https://wowlab.gg/inspect/spell/1279247>
444    pub(crate) const HARNESS_THE_COSMOS_PCT: (u32, u8) = (1_279_247, 1);
445    ///<https://wowlab.gg/inspect/spell/1296613>
446    pub(crate) const MID2_2PC_SIGIL_EXTENSION_MS: (u32, u8) = (1_296_613, 2);
447    ///<https://wowlab.gg/inspect/spell/1296614>
448    pub(crate) const MID2_4PC_SIGIL_DAMAGE: (u32, u8) = (1_296_614, 1);
449}
450static REPORTED_SPELLS: &[(&str, u32)] = &[
451    ("fracture_mh", 225_919),
452    ("fracture_oh", 225_921),
453    ("soul_cleave_damage", 228_478),
454];
455static DECLARED_SPELL_IDS: &[u32] = &[
456    228_477, 258_920, 212_084, 204_596, 203_782, 187_827, 204_157, 207_407, 247_454,
457    390_163, 263_642, 204_598, 203_981, 442_294, 442_442, 442_435, 1_256_301, 1_256_302,
458    1_256_322, 1_256_667, 1_256_308, 1_270_476, 1_270_547, 1_270_444, 1_270_448,
459    1_270_449, 6603, 203_747, 204_255, 225_919, 225_921, 228_478, 247_455, 321_299,
460    1_253_304, 1_253_769, 1_253_817, 1_256_295, 1_256_306, 1_256_307, 1_256_353,
461    1_256_617, 1_264_130, 1_279_247, 1_296_613, 1_296_614, 444_810, 444_806, 444_764,
462    442_808, 444_929, 442_624, 442_695, 1_253_805, 1_253_391, 1_253_377, 1_253_668,
463    451_263, 452_437, 453_236, 452_408, 452_415, 452_416, 453_239,
464];
465static DECLARED_AURA_IDS: &[u32] = &[
466    204_598, 203_981, 442_294, 442_442, 442_435, 1_256_301, 1_256_302, 1_256_322,
467    1_256_667, 1_256_308, 1_270_476, 1_270_547, 444_929, 442_435, 442_294, 442_624,
468    442_442, 442_695, 1_256_308, 1_256_301, 1_256_322, 1_256_302, 452_408, 452_415,
469    452_416, 453_239,
470];
471static TALENTS: &[(&str, u32)] = &[
472    ("SIGIL_OF_SPITE", TALENT::SIGIL_OF_SPITE),
473    ("SOUL_CARVER", TALENT::SOUL_CARVER),
474    ("SPIRIT_BOMB", TALENT::SPIRIT_BOMB),
475    ("UNTETHERED_RAGE_1", TALENT::UNTETHERED_RAGE_1),
476    ("UNTETHERED_RAGE_2", TALENT::UNTETHERED_RAGE_2),
477    ("UNTETHERED_RAGE_3", TALENT::UNTETHERED_RAGE_3),
478];
479fn aura_sigil_of_flame(
480    a: AuraDefinitionDraft,
481    data: &ResolvedGameData,
482) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
483    Ok(
484        a
485            .on_target()
486            .apply_base_from_data(data, 204_598)?
487            .max_stacks(
488                data
489                    .require_aura_max_stacks(
490                        wowlab_types::sim::SpellIdx::from_raw(204_598),
491                    )?,
492            ),
493    )
494}
495fn aura_soul_fragments(
496    a: AuraDefinitionDraft,
497    data: &ResolvedGameData,
498) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
499    a.on_player()
500        .duration_ms(
501            wowlab_engine_combat::validated_milliseconds(
502                f64::from(
503                    data
504                        .require_aura_duration_ms(
505                            wowlab_types::sim::SpellIdx::from_raw(204_255),
506                        )?,
507                ),
508                203_981,
509                "aura.duration_ms",
510            )?,
511        )
512        .apply_periodic_effect_from_data(data, 203_981)?
513        .apply_duration_behavior_from_data(data, 204_255)?
514        .apply_timing_modifiers_from_data(data, 203_981)?
515        .max_stacks(
516            wowlab_engine_combat::validated_max_stacks(5.0, 203_981, "aura.max_stacks")?,
517        )
518        .apply_periodic_behavior_from_data(data, 204_255)
519}
520fn aura_reavers_glaive(
521    a: AuraDefinitionDraft,
522    data: &ResolvedGameData,
523) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
524    Ok(
525        a
526            .on_player()
527            .apply_base_from_data(data, 442_294)?
528            .max_stacks(
529                data
530                    .require_aura_max_stacks(
531                        wowlab_types::sim::SpellIdx::from_raw(442_294),
532                    )?,
533            ),
534    )
535}
536fn aura_rending_strike(
537    a: AuraDefinitionDraft,
538    data: &ResolvedGameData,
539) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
540    Ok(
541        a
542            .on_player()
543            .apply_base_from_data(data, 442_442)?
544            .max_stacks(
545                data
546                    .require_aura_max_stacks(
547                        wowlab_types::sim::SpellIdx::from_raw(442_442),
548                    )?,
549            ),
550    )
551}
552fn aura_glaive_flurry(
553    a: AuraDefinitionDraft,
554    data: &ResolvedGameData,
555) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
556    Ok(
557        a
558            .on_player()
559            .apply_base_from_data(data, 442_435)?
560            .max_stacks(
561                data
562                    .require_aura_max_stacks(
563                        wowlab_types::sim::SpellIdx::from_raw(442_435),
564                    )?,
565            ),
566    )
567}
568fn aura_voidfall_building(
569    a: AuraDefinitionDraft,
570    data: &ResolvedGameData,
571) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
572    Ok(
573        a
574            .on_player()
575            .apply_base_from_data(data, 1_256_301)?
576            .max_stacks(
577                data
578                    .require_aura_max_stacks(
579                        wowlab_types::sim::SpellIdx::from_raw(1_256_301),
580                    )?,
581            ),
582    )
583}
584fn aura_voidfall_spending(
585    a: AuraDefinitionDraft,
586    data: &ResolvedGameData,
587) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
588    Ok(
589        a
590            .on_player()
591            .apply_base_from_data(data, 1_256_302)?
592            .max_stacks(
593                data
594                    .require_aura_max_stacks(
595                        wowlab_types::sim::SpellIdx::from_raw(1_256_302),
596                    )?,
597            ),
598    )
599}
600fn aura_voidfall_final_hour(
601    a: AuraDefinitionDraft,
602    data: &ResolvedGameData,
603) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
604    Ok(
605        a
606            .on_player()
607            .apply_base_from_data(data, 1_256_322)?
608            .max_stacks(
609                data
610                    .require_aura_max_stacks(
611                        wowlab_types::sim::SpellIdx::from_raw(1_256_322),
612                    )?,
613            ),
614    )
615}
616fn aura_catastrophe(
617    a: AuraDefinitionDraft,
618    data: &ResolvedGameData,
619) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
620    a.on_target()
621        .apply_base_from_data(data, 1_256_667)?
622        .max_stacks(
623            data
624                .require_aura_max_stacks(
625                    wowlab_types::sim::SpellIdx::from_raw(1_256_667),
626                )?,
627        )
628        .periodic_residual_damage(
629            wowlab_engine_combat::validated_milliseconds(
630                data.period(wowlab_types::sim::SpellIdx::from_raw(1_256_667), 1),
631                1_256_667,
632                "periodic_residual_damage.tick_ms",
633            )?,
634        )
635        .apply_periodic_behavior_from_data(data, 1_256_667)
636}
637fn aura_dark_matter(
638    a: AuraDefinitionDraft,
639    data: &ResolvedGameData,
640) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
641    Ok(
642        a
643            .on_player()
644            .apply_base_from_data(data, 1_256_308)?
645            .max_stacks(
646                data
647                    .require_aura_max_stacks(
648                        wowlab_types::sim::SpellIdx::from_raw(1_256_308),
649                    )?,
650            ),
651    )
652}
653fn aura_untethered_rage(
654    a: AuraDefinitionDraft,
655    data: &ResolvedGameData,
656) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
657    Ok(
658        a
659            .on_player()
660            .apply_base_from_data(data, 1_270_476)?
661            .max_stacks(
662                data
663                    .require_aura_max_stacks(
664                        wowlab_types::sim::SpellIdx::from_raw(1_270_476),
665                    )?,
666            ),
667    )
668}
669fn aura_seething_anger(
670    a: AuraDefinitionDraft,
671    data: &ResolvedGameData,
672) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
673    Ok(
674        a
675            .on_player()
676            .apply_base_from_data(data, 1_270_547)?
677            .max_stacks(
678                data
679                    .require_aura_max_stacks(
680                        wowlab_types::sim::SpellIdx::from_raw(1_270_547),
681                    )?,
682            ),
683    )
684}
685fn spell_soul_cleave(
686    s: SpellDefinitionDraft,
687    data: &ResolvedGameData,
688) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
689    Ok(
690        s
691            .apply_base_from_data(data, 228_477)?
692            .without_primary_data_damage()
693            .apply_aoe_from_data(data)
694            .on_cast(crate::hooks::vengeance_demon_hunter::soul_cleave_hook),
695    )
696}
697fn spell_immolation_aura(
698    s: SpellDefinitionDraft,
699    data: &ResolvedGameData,
700) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
701    Ok(s.apply_base_from_data(data, 258_920)?.apply_aoe_from_data(data))
702}
703fn spell_fel_devastation(
704    s: SpellDefinitionDraft,
705    data: &ResolvedGameData,
706) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
707    Ok(s.apply_base_from_data(data, 212_084)?.apply_aoe_from_data(data))
708}
709fn spell_sigil_of_flame(
710    s: SpellDefinitionDraft,
711    data: &ResolvedGameData,
712) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
713    Ok(
714        s
715            .apply_base_from_data(data, 204_596)?
716            .damage_ap_from_data(
717                wowlab_engine_domain::dbc::EffectLookup::new(
718                    data,
719                    wowlab_types::sim::EffectRef::new(
720                        wowlab_types::sim::SpellIdx::from_raw(204_598),
721                        1,
722                    ),
723                ),
724            )?
725            .applies_aura(AURA_SIGIL_OF_FLAME)
726            .apply_aoe_from_data(data),
727    )
728}
729fn spell_shear(
730    s: SpellDefinitionDraft,
731    data: &ResolvedGameData,
732) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
733    Ok(s.apply_base_from_data(data, 203_782)?.apply_aoe_from_data(data))
734}
735fn spell_metamorphosis(
736    s: SpellDefinitionDraft,
737    data: &ResolvedGameData,
738) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
739    Ok(
740        s
741            .apply_base_from_data(data, 187_827)?
742            .apply_aoe_from_data(data)
743            .on_cast(crate::hooks::vengeance_demon_hunter::metamorphosis_hook),
744    )
745}
746fn spell_throw_glaive(
747    s: SpellDefinitionDraft,
748    data: &ResolvedGameData,
749) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
750    Ok(s.apply_base_from_data(data, 204_157)?.apply_aoe_from_data(data))
751}
752fn spell_soul_carver(
753    s: SpellDefinitionDraft,
754    data: &ResolvedGameData,
755) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
756    Ok(s.apply_base_from_data(data, 207_407)?.apply_aoe_from_data(data))
757}
758fn spell_spirit_bomb(
759    s: SpellDefinitionDraft,
760    data: &ResolvedGameData,
761) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
762    Ok(
763        s
764            .apply_base_from_data(data, 247_454)?
765            .apply_aoe_from_data(data)
766            .on_cast(crate::hooks::vengeance_demon_hunter::spirit_bomb_hook),
767    )
768}
769fn spell_sigil_of_spite(
770    s: SpellDefinitionDraft,
771    data: &ResolvedGameData,
772) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
773    Ok(s.apply_base_from_data(data, 390_163)?.apply_aoe_from_data(data))
774}
775fn spell_fracture(
776    s: SpellDefinitionDraft,
777    data: &ResolvedGameData,
778) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
779    Ok(
780        s
781            .apply_base_from_data(data, 263_642)?
782            .without_primary_data_damage()
783            .apply_aoe_from_data(data)
784            .on_cast(crate::hooks::vengeance_demon_hunter::fracture_hook),
785    )
786}
787pub(crate) fn build_combat_system_draft(
788    params: &wowlab_engine_ports::HandlerParams<'_>,
789) -> Result<CombatSystemDraft, wowlab_engine_ports::EngineError> {
790    let builder = CombatSystemBuilder::new(params.stats.clone())
791        .spec_id(SpecId::Vengeance)
792        .spec_identity(
793            wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::PROOF,
794        )
795        .hero_talent_trees(DECLARED_METADATA.hero_talent_trees)
796        .effect_identities(
797            wowlab_engine_combat::generated_identities::specs::vengeance_demon_hunter::damage::ALL,
798        )
799        .effect_identities(wowlab_engine_combat::generated_identities::shared::ALL)
800        .mastery_spell(203_747)
801        .mastery_hook(crate::hooks::vengeance_demon_hunter::mastery)
802        .resource(
803            "fury",
804            params
805                .game_data
806                .power_max(17)
807                .ok_or_else(|| {
808                    wowlab_engine_ports::EngineError::spec_construction(
809                        "missing power-type power_max for type_id 17",
810                    )
811                })?,
812            params
813                .game_data
814                .power_regen_for_max(
815                    17,
816                    params
817                        .game_data
818                        .power_max(17)
819                        .ok_or_else(|| {
820                            wowlab_engine_ports::EngineError::spec_construction(
821                                "missing power-type power_max for type_id 17",
822                            )
823                        })?,
824                )
825                .ok_or_else(|| {
826                    wowlab_engine_ports::EngineError::spec_construction(
827                        "missing power-type power_regen_for_max for type_id 17",
828                    )
829                })?,
830        )
831        .resource_type_id(17)
832        .resource_start(
833            params
834                .game_data
835                .power_default(17)
836                .ok_or_else(|| {
837                    wowlab_engine_ports::EngineError::spec_construction(
838                        "missing power-type power_default for type_id 17",
839                    )
840                })?,
841        )
842        .aura(
843            "sigil_of_flame",
844            AURA::SIGIL_OF_FLAME,
845            |a| aura_sigil_of_flame(a, &params.game_data),
846        )
847        .aura(
848            "soul_fragments",
849            AURA::SOUL_FRAGMENTS,
850            |a| aura_soul_fragments(a, &params.game_data),
851        )
852        .aura(
853            "reavers_glaive",
854            AURA::REAVERS_GLAIVE,
855            |a| aura_reavers_glaive(a, &params.game_data),
856        )
857        .aura(
858            "rending_strike",
859            AURA::RENDING_STRIKE,
860            |a| aura_rending_strike(a, &params.game_data),
861        )
862        .aura(
863            "glaive_flurry",
864            AURA::GLAIVE_FLURRY,
865            |a| aura_glaive_flurry(a, &params.game_data),
866        )
867        .aura(
868            "voidfall_building",
869            AURA::VOIDFALL_BUILDING,
870            |a| aura_voidfall_building(a, &params.game_data),
871        )
872        .aura(
873            "voidfall_spending",
874            AURA::VOIDFALL_SPENDING,
875            |a| aura_voidfall_spending(a, &params.game_data),
876        )
877        .aura(
878            "voidfall_final_hour",
879            AURA::VOIDFALL_FINAL_HOUR,
880            |a| aura_voidfall_final_hour(a, &params.game_data),
881        )
882        .aura(
883            "catastrophe",
884            AURA::CATASTROPHE,
885            |a| aura_catastrophe(a, &params.game_data),
886        )
887        .aura(
888            "dark_matter",
889            AURA::DARK_MATTER,
890            |a| aura_dark_matter(a, &params.game_data),
891        )
892        .aura(
893            "untethered_rage",
894            AURA::UNTETHERED_RAGE,
895            |a| aura_untethered_rage(a, &params.game_data),
896        )
897        .aura(
898            "seething_anger",
899            AURA::SEETHING_ANGER,
900            |a| aura_seething_anger(a, &params.game_data),
901        )
902        .spell(
903            "soul_cleave",
904            SPELL::SOUL_CLEAVE,
905            |s| spell_soul_cleave(s, &params.game_data),
906        )
907        .spell(
908            "immolation_aura",
909            SPELL::IMMOLATION_AURA,
910            |s| spell_immolation_aura(s, &params.game_data),
911        )
912        .spell(
913            "fel_devastation",
914            SPELL::FEL_DEVASTATION,
915            |s| spell_fel_devastation(s, &params.game_data),
916        )
917        .spell(
918            "sigil_of_flame",
919            SPELL::SIGIL_OF_FLAME,
920            |s| spell_sigil_of_flame(s, &params.game_data),
921        )
922        .spell("shear", SPELL::SHEAR, |s| spell_shear(s, &params.game_data))
923        .spell(
924            "metamorphosis",
925            SPELL::METAMORPHOSIS,
926            |s| spell_metamorphosis(s, &params.game_data),
927        )
928        .spell(
929            "throw_glaive",
930            SPELL::THROW_GLAIVE,
931            |s| spell_throw_glaive(s, &params.game_data),
932        )
933        .spell(
934            "soul_carver",
935            SPELL::SOUL_CARVER,
936            |s| spell_soul_carver(s, &params.game_data),
937        )
938        .spell(
939            "spirit_bomb",
940            SPELL::SPIRIT_BOMB,
941            |s| spell_spirit_bomb(s, &params.game_data),
942        )
943        .spell(
944            "sigil_of_spite",
945            SPELL::SIGIL_OF_SPITE,
946            |s| spell_sigil_of_spite(s, &params.game_data),
947        )
948        .spell("fracture", SPELL::FRACTURE, |s| spell_fracture(s, &params.game_data))
949        .auto_attack(|a| {
950            a.spell_id(6603).swing_ms(2600).apply_base_from_data(&params.game_data)
951        })
952        .auto_attack(|a| {
953            a.spell_id(6603).swing_ms(2600).apply_base_from_data(&params.game_data)
954        })
955        .game_data(params.game_data.clone())
956        .talent_spell_ids(TALENTS)
957        .talent_selections(params.talent_selections)
958        .set_bonus_auras(params.set_bonus_auras)
959        .encounter(params.encounter.clone());
960    let builder = crate::generated::items::register_equipped(
961        builder,
962        &params.game_data,
963        params.equipped_items,
964    )?;
965
966    builder.into_draft()
967}
968fn new_handler(
969    params: wowlab_engine_ports::HandlerParams<'_>,
970) -> Result<Box<dyn SpecHandler>, wowlab_engine_ports::EngineError> {
971    let handler = crate::composition::compose_handler(
972        build_combat_system_draft,
973        &params,
974        crate::hooks::vengeance_demon_hunter::VengeanceHandler::try_new,
975    )?;
976
977    Ok(Box::new(handler))
978}
979static DECLARED_METADATA: DeclaredSpecMetadata = DeclaredSpecMetadata {
980    primary_resource: ResourceType::Fury,
981    secondary_resource: None,
982    spell_ids: DECLARED_SPELL_IDS,
983    aura_ids: DECLARED_AURA_IDS,
984    server_proc_entries: &[],
985    talents: TALENTS,
986    rotation_field_schema: &[],
987    metrics_plugin_id: None,
988    hero_talent_trees: &[
989        HeroTalentTreeDesc {
990            name: "Aldrachi Reaver",
991            spells: HERO_TREE_ALDRACHI_REAVER_SPELLS,
992            auras: HERO_TREE_ALDRACHI_REAVER_AURAS,
993        },
994        HeroTalentTreeDesc {
995            name: "Annihilator",
996            spells: HERO_TREE_ANNIHILATOR_SPELLS,
997            auras: HERO_TREE_ANNIHILATOR_AURAS,
998        },
999        HeroTalentTreeDesc {
1000            name: "Fel Scarred",
1001            spells: HERO_TREE_FEL_SCARRED_SPELLS,
1002            auras: HERO_TREE_FEL_SCARRED_AURAS,
1003        },
1004    ],
1005    reported_spells: REPORTED_SPELLS,
1006    masked_passive_effects: &[],
1007    passive_effect_overrides: &[],
1008};
1009pub(super) const SPEC_DESCRIPTOR: SpecDescriptor = SpecDescriptor {
1010    spec_id: SpecId::Vengeance,
1011    display_name: "Vengeance Demon Hunter",
1012    metadata: DECLARED_METADATA,
1013    handler_factory: new_handler,
1014};
1015wowlab_engine_combat::smoke_test!(build_combat_system_draft);