1#![allow(non_snake_case, dead_code)]
4use wowlab_types::{combat::ResourceType, game::SpecId};
5use wowlab_engine_combat::{
6 CombatSystemBuilder, CombatSystemDraft, AuraDefinitionDraft, LocalAuraIdx,
7 LocalSpellIdx, SpellDefinitionDraft,
8};
9use wowlab_engine_ports::{
10 DeclaredSpecMetadata, SpecDescriptor, SpecHandler, HeroTalentTreeDesc,
11};
12use wowlab_engine_gamedata::ResolvedGameData;
13pub(crate) mod SPELL {
14 pub(crate) const SOUL_CLEAVE: u32 = 228_477;
16 pub(crate) const IMMOLATION_AURA: u32 = 258_920;
18 pub(crate) const FEL_DEVASTATION: u32 = 212_084;
20 pub(crate) const SIGIL_OF_FLAME: u32 = 204_596;
22 pub(crate) const SHEAR: u32 = 203_782;
24 pub(crate) const METAMORPHOSIS: u32 = 187_827;
26 pub(crate) const THROW_GLAIVE: u32 = 204_157;
28 pub(crate) const SOUL_CARVER: u32 = 207_407;
30 pub(crate) const SPIRIT_BOMB: u32 = 247_454;
32 pub(crate) const SIGIL_OF_SPITE: u32 = 390_163;
34 pub(crate) const FRACTURE: u32 = 263_642;
36}
37pub(crate) mod AURA {
38 pub(crate) const SIGIL_OF_FLAME: u32 = 204_598;
40 pub(crate) const SOUL_FRAGMENTS: u32 = 203_981;
42 pub(crate) const REAVERS_GLAIVE: u32 = 442_294;
44 pub(crate) const RENDING_STRIKE: u32 = 442_442;
46 pub(crate) const GLAIVE_FLURRY: u32 = 442_435;
48 pub(crate) const VOIDFALL_BUILDING: u32 = 1_256_301;
50 pub(crate) const VOIDFALL_SPENDING: u32 = 1_256_302;
52 pub(crate) const VOIDFALL_FINAL_HOUR: u32 = 1_256_322;
54 pub(crate) const CATASTROPHE: u32 = 1_256_667;
56 pub(crate) const DARK_MATTER: u32 = 1_256_308;
58 pub(crate) const UNTETHERED_RAGE: u32 = 1_270_476;
60 pub(crate) const SEETHING_ANGER: u32 = 1_270_547;
62}
63pub(crate) mod TALENT {
64 pub(crate) const SIGIL_OF_SPITE: u32 = 390_163;
66 pub(crate) const SOUL_CARVER: u32 = 207_407;
68 pub(crate) const SPIRIT_BOMB: u32 = 247_454;
70 pub(crate) const UNTETHERED_RAGE_1: u32 = 1_270_444;
72 pub(crate) const UNTETHERED_RAGE_2: u32 = 1_270_448;
74 pub(crate) const UNTETHERED_RAGE_3: u32 = 1_270_449;
76}
77pub(crate) mod SET_BONUS {
78 pub(crate) const MID2_VENGEANCE_2PC: u32 = 1_296_613;
80 pub(crate) const MID2_VENGEANCE_4PC: u32 = 1_296_614;
82}
83pub(crate) mod REPORTED_SPELL {
84 pub(crate) const FRACTURE_MH: u32 = 225_919;
86 pub(crate) const FRACTURE_OH: u32 = 225_921;
88 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 pub(crate) const ART_OF_THE_GLAIVE_DAMAGE: u32 = 444_810;
96 pub(crate) const FURY_OF_THE_ALDRACHI: u32 = 444_806;
98 pub(crate) const REAVERS_GLAIVE: u32 = 442_294;
100 pub(crate) const REAVERS_GLAIVE_VENGEANCE: u32 = 444_764;
102 pub(crate) const WOUNDED_QUARRY_DAMAGE: u32 = 442_808;
104 }
105 pub(crate) mod AURA {
106 pub(crate) const EVASIVE_ACTION: u32 = 444_929;
108 pub(crate) const GLAIVE_FLURRY: u32 = 442_435;
110 pub(crate) const REAVERS_GLAIVE_BUFF: u32 = 442_294;
112 pub(crate) const REAVERS_MARK: u32 = 442_624;
114 pub(crate) const RENDING_STRIKE: u32 = 442_442;
116 pub(crate) const THRILL_OF_THE_FIGHT: u32 = 442_695;
118 }
119 }
120 pub(crate) mod ANNIHILATOR {
121 pub(crate) mod SPELL {
122 pub(crate) const CATASTROPHE: u32 = 1_253_769;
124 pub(crate) const CATASTROPHE_DOT: u32 = 1_256_667;
126 pub(crate) const DARK_MATTER: u32 = 1_256_307;
128 pub(crate) const FINAL_HOUR: u32 = 1_253_805;
130 pub(crate) const HARNESS_THE_COSMOS: u32 = 1_279_247;
132 pub(crate) const MASS_ACCELERATION: u32 = 1_256_295;
134 pub(crate) const METEORIC_FALL: u32 = 1_253_391;
136 pub(crate) const METEORIC_RISE: u32 = 1_253_377;
138 pub(crate) const METEOR_SHOWER_DAMAGE: u32 = 1_264_130;
140 pub(crate) const OTHERWORLDLY_FOCUS: u32 = 1_253_817;
142 pub(crate) const SWIFT_ERASURE: u32 = 1_253_668;
144 pub(crate) const VOIDFALL: u32 = 1_253_304;
146 pub(crate) const VOIDFALL_METEOR_DAMAGE: u32 = 1_256_306;
148 pub(crate) const WORLD_KILLER: u32 = 1_256_353;
150 pub(crate) const WORLD_KILLER_DAMAGE: u32 = 1_256_617;
152 }
153 pub(crate) mod AURA {
154 pub(crate) const DARK_MATTER: u32 = 1_256_308;
156 pub(crate) const VOIDFALL_BUILDING: u32 = 1_256_301;
158 pub(crate) const VOIDFALL_FINAL_HOUR: u32 = 1_256_322;
160 pub(crate) const VOIDFALL_SPENDING: u32 = 1_256_302;
162 }
163 }
164 pub(crate) mod FEL_SCARRED {
165 pub(crate) mod SPELL {
166 pub(crate) const DEMONSURGE_DAMAGE: u32 = 451_263;
168 pub(crate) const SPIRIT_BURST: u32 = 452_437;
170 pub(crate) const STUDENT_OF_SUFFERING_FURY: u32 = 453_236;
172 }
173 pub(crate) mod AURA {
174 pub(crate) const BURNING_BLADES: u32 = 452_408;
176 pub(crate) const DEMONIC_INTENSITY: u32 = 452_415;
178 pub(crate) const DEMONSURGE: u32 = 452_416;
180 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 pub(crate) const FEL_BLOOD: (u32, u8) = (321_299, 1);
419 pub(crate) const FRACTURE_FRAGMENTS: (u32, u8) = (263_642, 1);
421 pub(crate) const SPIRIT_BOMB_DAMAGE: (u32, u8) = (247_455, 1);
423 pub(crate) const VOIDFALL_CHANCE: (u32, u8) = (1_253_304, 3);
425 pub(crate) const VOIDFALL_STACKS: (u32, u8) = (1_253_304, 1);
427 pub(crate) const VOIDFALL_METEOR_COEF: (u32, u8) = (1_256_306, 1);
429 pub(crate) const WORLD_KILLER_COEF: (u32, u8) = (1_256_617, 1);
431 pub(crate) const WORLD_KILLER_META_CDR: (u32, u8) = (1_256_353, 3);
433 pub(crate) const CATASTROPHE_PCT: (u32, u8) = (1_253_769, 1);
435 pub(crate) const METEOR_SHOWER_TICKS: (u32, u8) = (1_256_307, 1);
437 pub(crate) const METEOR_SHOWER_COEF: (u32, u8) = (1_264_130, 1);
439 pub(crate) const MASS_ACCELERATION_STACKS: (u32, u8) = (1_256_295, 1);
441 pub(crate) const OTHERWORLDLY_FOCUS_PCT: (u32, u8) = (1_253_817, 1);
443 pub(crate) const HARNESS_THE_COSMOS_PCT: (u32, u8) = (1_279_247, 1);
445 pub(crate) const MID2_2PC_SIGIL_EXTENSION_MS: (u32, u8) = (1_296_613, 2);
447 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, ¶ms.game_data),
846 )
847 .aura(
848 "soul_fragments",
849 AURA::SOUL_FRAGMENTS,
850 |a| aura_soul_fragments(a, ¶ms.game_data),
851 )
852 .aura(
853 "reavers_glaive",
854 AURA::REAVERS_GLAIVE,
855 |a| aura_reavers_glaive(a, ¶ms.game_data),
856 )
857 .aura(
858 "rending_strike",
859 AURA::RENDING_STRIKE,
860 |a| aura_rending_strike(a, ¶ms.game_data),
861 )
862 .aura(
863 "glaive_flurry",
864 AURA::GLAIVE_FLURRY,
865 |a| aura_glaive_flurry(a, ¶ms.game_data),
866 )
867 .aura(
868 "voidfall_building",
869 AURA::VOIDFALL_BUILDING,
870 |a| aura_voidfall_building(a, ¶ms.game_data),
871 )
872 .aura(
873 "voidfall_spending",
874 AURA::VOIDFALL_SPENDING,
875 |a| aura_voidfall_spending(a, ¶ms.game_data),
876 )
877 .aura(
878 "voidfall_final_hour",
879 AURA::VOIDFALL_FINAL_HOUR,
880 |a| aura_voidfall_final_hour(a, ¶ms.game_data),
881 )
882 .aura(
883 "catastrophe",
884 AURA::CATASTROPHE,
885 |a| aura_catastrophe(a, ¶ms.game_data),
886 )
887 .aura(
888 "dark_matter",
889 AURA::DARK_MATTER,
890 |a| aura_dark_matter(a, ¶ms.game_data),
891 )
892 .aura(
893 "untethered_rage",
894 AURA::UNTETHERED_RAGE,
895 |a| aura_untethered_rage(a, ¶ms.game_data),
896 )
897 .aura(
898 "seething_anger",
899 AURA::SEETHING_ANGER,
900 |a| aura_seething_anger(a, ¶ms.game_data),
901 )
902 .spell(
903 "soul_cleave",
904 SPELL::SOUL_CLEAVE,
905 |s| spell_soul_cleave(s, ¶ms.game_data),
906 )
907 .spell(
908 "immolation_aura",
909 SPELL::IMMOLATION_AURA,
910 |s| spell_immolation_aura(s, ¶ms.game_data),
911 )
912 .spell(
913 "fel_devastation",
914 SPELL::FEL_DEVASTATION,
915 |s| spell_fel_devastation(s, ¶ms.game_data),
916 )
917 .spell(
918 "sigil_of_flame",
919 SPELL::SIGIL_OF_FLAME,
920 |s| spell_sigil_of_flame(s, ¶ms.game_data),
921 )
922 .spell("shear", SPELL::SHEAR, |s| spell_shear(s, ¶ms.game_data))
923 .spell(
924 "metamorphosis",
925 SPELL::METAMORPHOSIS,
926 |s| spell_metamorphosis(s, ¶ms.game_data),
927 )
928 .spell(
929 "throw_glaive",
930 SPELL::THROW_GLAIVE,
931 |s| spell_throw_glaive(s, ¶ms.game_data),
932 )
933 .spell(
934 "soul_carver",
935 SPELL::SOUL_CARVER,
936 |s| spell_soul_carver(s, ¶ms.game_data),
937 )
938 .spell(
939 "spirit_bomb",
940 SPELL::SPIRIT_BOMB,
941 |s| spell_spirit_bomb(s, ¶ms.game_data),
942 )
943 .spell(
944 "sigil_of_spite",
945 SPELL::SIGIL_OF_SPITE,
946 |s| spell_sigil_of_spite(s, ¶ms.game_data),
947 )
948 .spell("fracture", SPELL::FRACTURE, |s| spell_fracture(s, ¶ms.game_data))
949 .auto_attack(|a| {
950 a.spell_id(6603).swing_ms(2600).apply_base_from_data(¶ms.game_data)
951 })
952 .auto_attack(|a| {
953 a.spell_id(6603).swing_ms(2600).apply_base_from_data(¶ms.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 ¶ms.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 ¶ms,
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);