1#![allow(non_snake_case, dead_code)]
4use wowlab_types::{combat::ResourceType, game::SpecId};
5use wowlab_engine_domain::dbc::ProcAttributes;
6use wowlab_engine_combat::{
7 CombatSystemBuilder, CombatSystemDraft, AuraDefinitionDraft, LocalAuraIdx,
8 LocalSpellIdx, SpellDefinitionDraft,
9};
10use wowlab_engine_ports::{
11 DeclaredSpecMetadata, SpecDescriptor, SpecHandler, HeroTalentTreeDesc,
12 DeclaredServerProcEntry,
13};
14use wowlab_engine_gamedata::ResolvedGameData;
15pub(crate) mod SPELL {
16 pub(crate) const BLOODTHIRST: u32 = 23881;
18 pub(crate) const RAGING_BLOW: u32 = 85288;
20 pub(crate) const RAMPAGE: u32 = 184_367;
22 pub(crate) const EXECUTE: u32 = 280_735;
24 pub(crate) const WHIRLWIND: u32 = 190_411;
26 pub(crate) const RECKLESSNESS: u32 = 1719;
28 pub(crate) const AVATAR: u32 = 107_574;
30 pub(crate) const BLOODBATH: u32 = 335_096;
32 pub(crate) const CRUSHING_BLOW: u32 = 335_097;
34 pub(crate) const THUNDER_CLAP: u32 = 6343;
36 pub(crate) const REND: u32 = 772;
38 pub(crate) const BATTLE_SHOUT: u32 = 6673;
40 pub(crate) const SLAM: u32 = 1464;
42 pub(crate) const HEROIC_THROW: u32 = 57755;
44 pub(crate) const BLADESTORM: u32 = 227_847;
46 pub(crate) const ODYNS_FURY: u32 = 385_059;
48 pub(crate) const RAVAGER: u32 = 228_920;
50 pub(crate) const SLAYERS_STRIKE: u32 = 445_579;
52 pub(crate) const REAP_THE_STORM_EXECUTE: u32 = 446_005;
54}
55pub(crate) mod AURA {
56 pub(crate) const ENRAGE: u32 = 184_362;
58 pub(crate) const RECKLESSNESS: u32 = 1719;
60 pub(crate) const MID2_RECKLESSNESS_CRIT: u32 = 1_296_646;
62 pub(crate) const WHIRLWIND: u32 = 85739;
64 pub(crate) const AVATAR: u32 = 107_574;
66 pub(crate) const FRENZY: u32 = 335_082;
68 pub(crate) const SUDDEN_DEATH: u32 = 52437;
70 pub(crate) const REND: u32 = 388_539;
72 pub(crate) const BLOODBATH_DOT: u32 = 113_344;
74 pub(crate) const GUSHING_WOUND: u32 = 385_042;
76 pub(crate) const BATTLE_SHOUT: u32 = 6673;
78 pub(crate) const RAMPAGE: u32 = 184_367;
80 pub(crate) const DEEP_WOUNDS: u32 = 262_115;
82 pub(crate) const WILD_STRIKES: u32 = 392_778;
84 pub(crate) const SURGE_OF_ADRENALINE: u32 = 1_265_560;
86 pub(crate) const BLOODBORNE: u32 = 1_265_406;
88 pub(crate) const BERSERKER_STANCE: u32 = 386_196;
90 pub(crate) const BLADESTORM: u32 = 227_847;
92 pub(crate) const ODYNS_FURY_DOT: u32 = 385_060;
94 pub(crate) const RAVAGER: u32 = 228_920;
96 pub(crate) const EXECUTIONER: u32 = 445_584;
98 pub(crate) const OVERWHELMED: u32 = 445_836;
100 pub(crate) const IMMINENT_DEMISE: u32 = 445_606;
102 pub(crate) const EXECUTIONERS_WRATH: u32 = 1_265_575;
104 pub(crate) const THUNDER_BLAST: u32 = 435_615;
106 pub(crate) const CRASHING_THUNDER: u32 = 436_707;
108}
109pub(crate) mod TALENT {
110 pub(crate) const ANGER_MANAGEMENT: u32 = 152_278;
112 pub(crate) const AVATAR: u32 = 107_574;
114 pub(crate) const BERSERKER_STANCE: u32 = 386_196;
116 pub(crate) const BLOODBORNE: u32 = 385_703;
118 pub(crate) const COLD_STEEL_HOT_BLOOD: u32 = 383_959;
120 pub(crate) const DEEP_WOUNDS: u32 = 1_261_060;
122 pub(crate) const EXECUTIONERS_WRATH: u32 = 1_265_570;
124 pub(crate) const FROTHING_BERSERKER: u32 = 392_792;
126 pub(crate) const HACK_AND_SLASH: u32 = 383_877;
128 pub(crate) const IMMINENT_DEMISE: u32 = 444_769;
130 pub(crate) const IMPROVED_EXECUTE: u32 = 316_402;
132 pub(crate) const IMPROVED_RAGING_BLOW: u32 = 383_854;
134 pub(crate) const IMPROVED_WHIRLWIND: u32 = 12950;
136 pub(crate) const MASSACRE: u32 = 206_315;
138 pub(crate) const OVERWHELMING_BLADES: u32 = 444_772;
140 pub(crate) const RAMPAGING_BERSERKER: u32 = 1_269_308;
142 pub(crate) const RAMPAGING_BERSERKER_2: u32 = 1_269_309;
144 pub(crate) const RAMPAGING_RUIN: u32 = 1_265_357;
146 pub(crate) const REAP_THE_STORM: u32 = 444_775;
148 pub(crate) const RECKLESS_ABANDON: u32 = 396_749;
150 pub(crate) const SLAYERS_DOMINANCE: u32 = 444_767;
152 pub(crate) const SLAYERS_MALICE: u32 = 444_779;
154 pub(crate) const SUDDEN_DEATH: u32 = 29725;
156 pub(crate) const SURGE_OF_ADRENALINE: u32 = 1_265_359;
158 pub(crate) const THUNDER_CLAP: u32 = 6343;
160 pub(crate) const UNHINGED: u32 = 386_628;
162 pub(crate) const UNRELENTING_ONSLAUGHT: u32 = 444_780;
164 pub(crate) const WAR_MACHINE: u32 = 262_231;
166 pub(crate) const WILD_STRIKES: u32 = 382_946;
168 pub(crate) const WRATH_AND_FURY: u32 = 392_936;
170}
171pub(crate) mod SET_BONUS {
172 pub(crate) const MID2_FURY_2PC: u32 = 1_296_645;
174 pub(crate) const MID2_FURY_4PC: u32 = 1_296_646;
176}
177pub(crate) mod REPORTED_SPELL {
178 pub(crate) const CRUSHING_BLOW_MAIN_HAND: u32 = 335_098;
180 pub(crate) const CRUSHING_BLOW_OFF_HAND: u32 = 335_100;
182 pub(crate) const RAGING_BLOW_MAIN_HAND: u32 = 96103;
184 pub(crate) const RAGING_BLOW_OFF_HAND: u32 = 85384;
186}
187pub(crate) mod HERO {
188 pub(crate) mod SLAYER {
189 pub(crate) mod SPELL {
190 pub(crate) const REAP_THE_STORM: u32 = 446_005;
192 pub(crate) const SLAYERS_STRIKE: u32 = 445_579;
194 }
195 pub(crate) mod AURA {
196 pub(crate) const BRUTAL_FINISH: u32 = 446_918;
198 pub(crate) const FIERCE_FOLLOWTHROUGH: u32 = 458_689;
200 pub(crate) const OPPORTUNIST: u32 = 456_120;
202 pub(crate) const VIOLENT_EUPHORIA: u32 = 1_270_731;
204 }
205 }
206 pub(crate) mod MOUNTAIN_THANE {
207 pub(crate) mod SPELL {
208 pub(crate) const GROUND_CURRENT: u32 = 460_670;
210 pub(crate) const LIGHTNING_STRIKE: u32 = 435_791;
212 pub(crate) const THUNDER_BLAST: u32 = 435_222;
214 }
215 pub(crate) mod AURA {
216 pub(crate) const BURST_OF_POWER: u32 = 437_121;
218 pub(crate) const THUNDER_BLAST_BUFF: u32 = 435_615;
220 }
221 }
222}
223static HERO_TREE_SLAYER_SPELLS: &[(&str, u32)] = &[
224 ("REAP_THE_STORM", 446_005),
225 ("SLAYERS_STRIKE", 445_579),
226];
227static HERO_TREE_SLAYER_AURAS: &[(&str, u32)] = &[
228 ("BRUTAL_FINISH", 446_918),
229 ("FIERCE_FOLLOWTHROUGH", 458_689),
230 ("OPPORTUNIST", 456_120),
231 ("VIOLENT_EUPHORIA", 1_270_731),
232];
233static HERO_TREE_MOUNTAIN_THANE_SPELLS: &[(&str, u32)] = &[
234 ("GROUND_CURRENT", 460_670),
235 ("LIGHTNING_STRIKE", 435_791),
236 ("THUNDER_BLAST", 435_222),
237];
238static HERO_TREE_MOUNTAIN_THANE_AURAS: &[(&str, u32)] = &[
239 ("BURST_OF_POWER", 437_121),
240 ("THUNDER_BLAST_BUFF", 435_615),
241];
242pub(crate) mod DAMAGE_SPELL {
243 pub(crate) const BLOODTHIRST: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ACTION::SPELL_23881;
244 pub(crate) const RAGING_BLOW: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ACTION::SPELL_85288;
245 pub(crate) const RAMPAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ACTION::SPELL_184367;
246 pub(crate) const EXECUTE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ACTION::SPELL_280735;
247 pub(crate) const WHIRLWIND: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ACTION::SPELL_190411;
248 pub(crate) const RECKLESSNESS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ACTION::SPELL_1719;
249 pub(crate) const AVATAR: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ACTION::SPELL_107574;
250 pub(crate) const BLOODBATH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ACTION::SPELL_335096;
251 pub(crate) const CRUSHING_BLOW: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ACTION::SPELL_335097;
252 pub(crate) const THUNDER_CLAP: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ACTION::SPELL_6343;
253 pub(crate) const REND: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ACTION::SPELL_772;
254 pub(crate) const BATTLE_SHOUT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ACTION::SPELL_6673;
255 pub(crate) const SLAM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ACTION::SPELL_1464;
256 pub(crate) const HEROIC_THROW: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ACTION::SPELL_57755;
257 pub(crate) const BLADESTORM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ACTION::SPELL_227847;
258 pub(crate) const ODYNS_FURY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ACTION::SPELL_385059;
259 pub(crate) const RAVAGER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ACTION::SPELL_228920;
260 pub(crate) const SLAYERS_STRIKE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ACTION::SPELL_445579;
261 pub(crate) const REAP_THE_STORM_EXECUTE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ACTION::SPELL_446005;
262 pub(crate) const REAP_THE_STORM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ACTION::SPELL_446005;
263 pub(crate) const GROUND_CURRENT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ACTION::SPELL_460670;
264 pub(crate) const LIGHTNING_STRIKE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ACTION::SPELL_435791;
265 pub(crate) const THUNDER_BLAST: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ACTION::SPELL_435222;
266}
267pub(crate) mod DAMAGE_AURA {
268 pub(crate) const ENRAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ACTION::SPELL_184362;
269 pub(crate) const RECKLESSNESS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ACTION::SPELL_1719;
270 pub(crate) const MID2_RECKLESSNESS_CRIT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ACTION::SPELL_1296646;
271 pub(crate) const WHIRLWIND: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ACTION::SPELL_85739;
272 pub(crate) const AVATAR: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ACTION::SPELL_107574;
273 pub(crate) const FRENZY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ACTION::SPELL_335082;
274 pub(crate) const SUDDEN_DEATH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ACTION::SPELL_52437;
275 pub(crate) const REND: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ACTION::SPELL_388539;
276 pub(crate) const BLOODBATH_DOT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ACTION::SPELL_113344;
277 pub(crate) const GUSHING_WOUND: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ACTION::SPELL_385042;
278 pub(crate) const BATTLE_SHOUT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ACTION::SPELL_6673;
279 pub(crate) const RAMPAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ACTION::SPELL_184367;
280 pub(crate) const DEEP_WOUNDS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ACTION::SPELL_262115;
281 pub(crate) const WILD_STRIKES: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ACTION::SPELL_392778;
282 pub(crate) const SURGE_OF_ADRENALINE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ACTION::SPELL_1265560;
283 pub(crate) const BLOODBORNE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ACTION::SPELL_1265406;
284 pub(crate) const BERSERKER_STANCE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ACTION::SPELL_386196;
285 pub(crate) const BLADESTORM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ACTION::SPELL_227847;
286 pub(crate) const ODYNS_FURY_DOT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ACTION::SPELL_385060;
287 pub(crate) const RAVAGER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ACTION::SPELL_228920;
288 pub(crate) const EXECUTIONER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ACTION::SPELL_445584;
289 pub(crate) const OVERWHELMED: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ACTION::SPELL_445836;
290 pub(crate) const IMMINENT_DEMISE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ACTION::SPELL_445606;
291 pub(crate) const EXECUTIONERS_WRATH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ACTION::SPELL_1265575;
292 pub(crate) const THUNDER_BLAST: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ACTION::SPELL_435615;
293 pub(crate) const CRASHING_THUNDER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ACTION::SPELL_436707;
294}
295pub(crate) mod DAMAGE_TALENT {
296 pub(crate) const ANGER_MANAGEMENT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ACTION::SPELL_152278;
297 pub(crate) const AVATAR: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ACTION::SPELL_107574;
298 pub(crate) const BERSERKER_STANCE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ACTION::SPELL_386196;
299 pub(crate) const BLOODBORNE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ACTION::SPELL_385703;
300 pub(crate) const COLD_STEEL_HOT_BLOOD: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ACTION::SPELL_383959;
301 pub(crate) const DEEP_WOUNDS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ACTION::SPELL_1261060;
302 pub(crate) const EXECUTIONERS_WRATH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ACTION::SPELL_1265570;
303 pub(crate) const FROTHING_BERSERKER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ACTION::SPELL_392792;
304 pub(crate) const HACK_AND_SLASH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ACTION::SPELL_383877;
305 pub(crate) const IMMINENT_DEMISE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ACTION::SPELL_444769;
306 pub(crate) const IMPROVED_EXECUTE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ACTION::SPELL_316402;
307 pub(crate) const IMPROVED_RAGING_BLOW: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ACTION::SPELL_383854;
308 pub(crate) const IMPROVED_WHIRLWIND: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ACTION::SPELL_12950;
309 pub(crate) const MASSACRE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ACTION::SPELL_206315;
310 pub(crate) const OVERWHELMING_BLADES: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ACTION::SPELL_444772;
311 pub(crate) const RAMPAGING_BERSERKER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ACTION::SPELL_1269308;
312 pub(crate) const RAMPAGING_BERSERKER_2: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ACTION::SPELL_1269309;
313 pub(crate) const RAMPAGING_RUIN: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ACTION::SPELL_1265357;
314 pub(crate) const REAP_THE_STORM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ACTION::SPELL_444775;
315 pub(crate) const RECKLESS_ABANDON: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ACTION::SPELL_396749;
316 pub(crate) const SLAYERS_DOMINANCE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ACTION::SPELL_444767;
317 pub(crate) const SLAYERS_MALICE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ACTION::SPELL_444779;
318 pub(crate) const SUDDEN_DEATH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ACTION::SPELL_29725;
319 pub(crate) const SURGE_OF_ADRENALINE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ACTION::SPELL_1265359;
320 pub(crate) const THUNDER_CLAP: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ACTION::SPELL_6343;
321 pub(crate) const UNHINGED: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ACTION::SPELL_386628;
322 pub(crate) const UNRELENTING_ONSLAUGHT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ACTION::SPELL_444780;
323 pub(crate) const WAR_MACHINE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ACTION::SPELL_262231;
324 pub(crate) const WILD_STRIKES: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ACTION::SPELL_382946;
325 pub(crate) const WRATH_AND_FURY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ACTION::SPELL_392936;
326}
327pub(crate) mod DAMAGE_REPORTED {
328 pub(crate) const CRUSHING_BLOW_MAIN_HAND: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ACTION::SPELL_335098;
329 pub(crate) const CRUSHING_BLOW_OFF_HAND: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ACTION::SPELL_335100;
330 pub(crate) const RAGING_BLOW_MAIN_HAND: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ACTION::SPELL_96103;
331 pub(crate) const RAGING_BLOW_OFF_HAND: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ACTION::SPELL_85384;
332}
333pub(crate) mod DAMAGE_EFFECT {
334 pub(crate) const BLOODTHIRST_ENRAGE_CHANCE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::EFFECT::SPELL_23881_EFFECT_3;
335 pub(crate) const BLOODTHIRST_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::EFFECT::SPELL_23881_EFFECT_1;
336 pub(crate) const BLOODTHIRST_RAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::EFFECT::SPELL_23881_EFFECT_2;
337 pub(crate) const BLOODBATH_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::EFFECT::SPELL_335096_EFFECT_1;
338 pub(crate) const BLOODBATH_RAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::EFFECT::SPELL_335096_EFFECT_2;
339 pub(crate) const BLADESTORM_PERIOD: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::EFFECT::SPELL_227847_EFFECT_1;
340 pub(crate) const RAMPAGING_BERSERKER_COST: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::EFFECT::SPELL_1269309_EFFECT_1;
341 pub(crate) const RAMPAGING_BERSERKER_DMG: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::EFFECT::SPELL_1269309_EFFECT_2;
342 pub(crate) const BLOODBATH_ENRAGE_CHANCE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::EFFECT::SPELL_335096_EFFECT_3;
343 pub(crate) const COLD_STEEL_HOT_BLOOD_RAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::EFFECT::SPELL_383978_EFFECT_1;
344 pub(crate) const RB_RESET_CHANCE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::EFFECT::SPELL_85288_EFFECT_1;
345 pub(crate) const WNF_RESET_CHANCE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::EFFECT::SPELL_392936_EFFECT_1;
346 pub(crate) const IMPROVED_EXECUTE_RAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::EFFECT::SPELL_316402_EFFECT_3;
347 pub(crate) const EXECUTIONERS_WRATH_RAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::EFFECT::SPELL_1265570_EFFECT_1;
348 pub(crate) const MASSACRE_EXECUTE_CDR_MS: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::EFFECT::SPELL_206315_EFFECT_3;
349 pub(crate) const MASSACRE_PCT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::EFFECT::SPELL_206315_EFFECT_2;
350 pub(crate) const SLAYERS_STRIKE_DMG: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::EFFECT::SPELL_445579_EFFECT_1;
351 pub(crate) const IMMINENT_DEMISE_EVERY: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::EFFECT::SPELL_444769_EFFECT_1;
352 pub(crate) const IMMINENT_DEMISE_REAP_CHANCE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::EFFECT::SPELL_444769_EFFECT_2;
353 pub(crate) const REAP_DMG: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::EFFECT::SPELL_446005_EFFECT_1;
354 pub(crate) const UNRELENTING_CDR_S: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::EFFECT::SPELL_444780_EFFECT_1;
355 pub(crate) const UNRELENTING_OVERWHELMED: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::EFFECT::SPELL_444780_EFFECT_2;
356 pub(crate) const ANGER_MANAGEMENT_DIV: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::EFFECT::SPELL_152278_EFFECT_3;
357 pub(crate) const FROTHING_REFUND: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::EFFECT::SPELL_392792_EFFECT_1;
358 pub(crate) const RECKLESS_ABANDON_RAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::EFFECT::SPELL_396749_EFFECT_1;
359 pub(crate) const MID2_RAGING_BLOW_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::EFFECT::SPELL_1296645_EFFECT_1;
360 pub(crate) const MID2_RECKLESSNESS_EXTENSION_MS: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::EFFECT::SPELL_1296645_EFFECT_2;
361 pub(crate) const MID2_RECKLESSNESS_EXTENSION_CAP: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::EFFECT::SPELL_1296645_EFFECT_3;
362 pub(crate) const MID2_BLOODTHIRST_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::EFFECT::SPELL_1296646_EFFECT_1;
363}
364pub(crate) const AURA_ENRAGE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::fury_warrior::AURA_ENRAGE
365 .bind(wowlab_engine_combat::generated_identities::specs::fury_warrior::PROOF);
366pub(crate) const AURA_RECKLESSNESS: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::fury_warrior::AURA_RECKLESSNESS
367 .bind(wowlab_engine_combat::generated_identities::specs::fury_warrior::PROOF);
368pub(crate) const AURA_MID2_RECKLESSNESS_CRIT: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::fury_warrior::AURA_MID2_RECKLESSNESS_CRIT
369 .bind(wowlab_engine_combat::generated_identities::specs::fury_warrior::PROOF);
370pub(crate) const AURA_WHIRLWIND: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::fury_warrior::AURA_WHIRLWIND
371 .bind(wowlab_engine_combat::generated_identities::specs::fury_warrior::PROOF);
372pub(crate) const AURA_AVATAR: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::fury_warrior::AURA_AVATAR
373 .bind(wowlab_engine_combat::generated_identities::specs::fury_warrior::PROOF);
374pub(crate) const AURA_FRENZY: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::fury_warrior::AURA_FRENZY
375 .bind(wowlab_engine_combat::generated_identities::specs::fury_warrior::PROOF);
376pub(crate) const AURA_SUDDEN_DEATH: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::fury_warrior::AURA_SUDDEN_DEATH
377 .bind(wowlab_engine_combat::generated_identities::specs::fury_warrior::PROOF);
378pub(crate) const AURA_REND: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::fury_warrior::AURA_REND
379 .bind(wowlab_engine_combat::generated_identities::specs::fury_warrior::PROOF);
380pub(crate) const AURA_BLOODBATH_DOT: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::fury_warrior::AURA_BLOODBATH_DOT
381 .bind(wowlab_engine_combat::generated_identities::specs::fury_warrior::PROOF);
382pub(crate) const AURA_GUSHING_WOUND: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::fury_warrior::AURA_GUSHING_WOUND
383 .bind(wowlab_engine_combat::generated_identities::specs::fury_warrior::PROOF);
384pub(crate) const AURA_BATTLE_SHOUT: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::fury_warrior::AURA_BATTLE_SHOUT
385 .bind(wowlab_engine_combat::generated_identities::specs::fury_warrior::PROOF);
386pub(crate) const AURA_RAMPAGE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::fury_warrior::AURA_RAMPAGE
387 .bind(wowlab_engine_combat::generated_identities::specs::fury_warrior::PROOF);
388pub(crate) const AURA_DEEP_WOUNDS: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::fury_warrior::AURA_DEEP_WOUNDS
389 .bind(wowlab_engine_combat::generated_identities::specs::fury_warrior::PROOF);
390pub(crate) const AURA_WILD_STRIKES: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::fury_warrior::AURA_WILD_STRIKES
391 .bind(wowlab_engine_combat::generated_identities::specs::fury_warrior::PROOF);
392pub(crate) const AURA_SURGE_OF_ADRENALINE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::fury_warrior::AURA_SURGE_OF_ADRENALINE
393 .bind(wowlab_engine_combat::generated_identities::specs::fury_warrior::PROOF);
394pub(crate) const AURA_BLOODBORNE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::fury_warrior::AURA_BLOODBORNE
395 .bind(wowlab_engine_combat::generated_identities::specs::fury_warrior::PROOF);
396pub(crate) const AURA_BERSERKER_STANCE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::fury_warrior::AURA_BERSERKER_STANCE
397 .bind(wowlab_engine_combat::generated_identities::specs::fury_warrior::PROOF);
398pub(crate) const AURA_BLADESTORM: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::fury_warrior::AURA_BLADESTORM
399 .bind(wowlab_engine_combat::generated_identities::specs::fury_warrior::PROOF);
400pub(crate) const AURA_ODYNS_FURY_DOT: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::fury_warrior::AURA_ODYNS_FURY_DOT
401 .bind(wowlab_engine_combat::generated_identities::specs::fury_warrior::PROOF);
402pub(crate) const AURA_RAVAGER: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::fury_warrior::AURA_RAVAGER
403 .bind(wowlab_engine_combat::generated_identities::specs::fury_warrior::PROOF);
404pub(crate) const AURA_EXECUTIONER: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::fury_warrior::AURA_EXECUTIONER
405 .bind(wowlab_engine_combat::generated_identities::specs::fury_warrior::PROOF);
406pub(crate) const AURA_OVERWHELMED: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::fury_warrior::AURA_OVERWHELMED
407 .bind(wowlab_engine_combat::generated_identities::specs::fury_warrior::PROOF);
408pub(crate) const AURA_IMMINENT_DEMISE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::fury_warrior::AURA_IMMINENT_DEMISE
409 .bind(wowlab_engine_combat::generated_identities::specs::fury_warrior::PROOF);
410pub(crate) const AURA_EXECUTIONERS_WRATH: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::fury_warrior::AURA_EXECUTIONERS_WRATH
411 .bind(wowlab_engine_combat::generated_identities::specs::fury_warrior::PROOF);
412pub(crate) const AURA_THUNDER_BLAST: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::fury_warrior::AURA_THUNDER_BLAST
413 .bind(wowlab_engine_combat::generated_identities::specs::fury_warrior::PROOF);
414pub(crate) const AURA_CRASHING_THUNDER: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::fury_warrior::AURA_CRASHING_THUNDER
415 .bind(wowlab_engine_combat::generated_identities::specs::fury_warrior::PROOF);
416pub(crate) const AURA_COUNT: usize = 26;
417const _: () = assert!(
418 AURA_COUNT == 26, "AURA index ABI: count changed -- update positional hook consumers"
419);
420pub(crate) const SPELL_BLOODTHIRST: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::fury_warrior::SPELL_BLOODTHIRST
421 .bind(wowlab_engine_combat::generated_identities::specs::fury_warrior::PROOF);
422pub(crate) const SPELL_RAGING_BLOW: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::fury_warrior::SPELL_RAGING_BLOW
423 .bind(wowlab_engine_combat::generated_identities::specs::fury_warrior::PROOF);
424pub(crate) const SPELL_RAMPAGE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::fury_warrior::SPELL_RAMPAGE
425 .bind(wowlab_engine_combat::generated_identities::specs::fury_warrior::PROOF);
426pub(crate) const SPELL_EXECUTE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::fury_warrior::SPELL_EXECUTE
427 .bind(wowlab_engine_combat::generated_identities::specs::fury_warrior::PROOF);
428pub(crate) const SPELL_WHIRLWIND: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::fury_warrior::SPELL_WHIRLWIND
429 .bind(wowlab_engine_combat::generated_identities::specs::fury_warrior::PROOF);
430pub(crate) const SPELL_RECKLESSNESS: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::fury_warrior::SPELL_RECKLESSNESS
431 .bind(wowlab_engine_combat::generated_identities::specs::fury_warrior::PROOF);
432pub(crate) const SPELL_AVATAR: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::fury_warrior::SPELL_AVATAR
433 .bind(wowlab_engine_combat::generated_identities::specs::fury_warrior::PROOF);
434pub(crate) const SPELL_BLOODBATH: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::fury_warrior::SPELL_BLOODBATH
435 .bind(wowlab_engine_combat::generated_identities::specs::fury_warrior::PROOF);
436pub(crate) const SPELL_CRUSHING_BLOW: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::fury_warrior::SPELL_CRUSHING_BLOW
437 .bind(wowlab_engine_combat::generated_identities::specs::fury_warrior::PROOF);
438pub(crate) const SPELL_THUNDER_CLAP: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::fury_warrior::SPELL_THUNDER_CLAP
439 .bind(wowlab_engine_combat::generated_identities::specs::fury_warrior::PROOF);
440pub(crate) const SPELL_REND: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::fury_warrior::SPELL_REND
441 .bind(wowlab_engine_combat::generated_identities::specs::fury_warrior::PROOF);
442pub(crate) const SPELL_BATTLE_SHOUT: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::fury_warrior::SPELL_BATTLE_SHOUT
443 .bind(wowlab_engine_combat::generated_identities::specs::fury_warrior::PROOF);
444pub(crate) const SPELL_SLAM: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::fury_warrior::SPELL_SLAM
445 .bind(wowlab_engine_combat::generated_identities::specs::fury_warrior::PROOF);
446pub(crate) const SPELL_HEROIC_THROW: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::fury_warrior::SPELL_HEROIC_THROW
447 .bind(wowlab_engine_combat::generated_identities::specs::fury_warrior::PROOF);
448pub(crate) const SPELL_BLADESTORM: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::fury_warrior::SPELL_BLADESTORM
449 .bind(wowlab_engine_combat::generated_identities::specs::fury_warrior::PROOF);
450pub(crate) const SPELL_ODYNS_FURY: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::fury_warrior::SPELL_ODYNS_FURY
451 .bind(wowlab_engine_combat::generated_identities::specs::fury_warrior::PROOF);
452pub(crate) const SPELL_RAVAGER: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::fury_warrior::SPELL_RAVAGER
453 .bind(wowlab_engine_combat::generated_identities::specs::fury_warrior::PROOF);
454pub(crate) const SPELL_SLAYERS_STRIKE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::fury_warrior::SPELL_SLAYERS_STRIKE
455 .bind(wowlab_engine_combat::generated_identities::specs::fury_warrior::PROOF);
456pub(crate) const SPELL_REAP_THE_STORM_EXECUTE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::fury_warrior::SPELL_REAP_THE_STORM_EXECUTE
457 .bind(wowlab_engine_combat::generated_identities::specs::fury_warrior::PROOF);
458pub(crate) const SPELL_COUNT: usize = 19;
459const _: () = assert!(
460 SPELL_COUNT == 19,
461 "SPELL index ABI: count changed -- update positional hook consumers"
462);
463pub(crate) mod EFFECT {
464 pub(crate) const BLOODTHIRST_ENRAGE_CHANCE: (u32, u8) = (23881, 3);
466 pub(crate) const BLOODTHIRST_DAMAGE: (u32, u8) = (23881, 1);
468 pub(crate) const BLOODTHIRST_RAGE: (u32, u8) = (23881, 2);
470 pub(crate) const BLOODBATH_DAMAGE: (u32, u8) = (335_096, 1);
472 pub(crate) const BLOODBATH_RAGE: (u32, u8) = (335_096, 2);
474 pub(crate) const BLADESTORM_PERIOD: (u32, u8) = (227_847, 1);
476 pub(crate) const RAMPAGING_BERSERKER_COST: (u32, u8) = (1_269_309, 1);
478 pub(crate) const RAMPAGING_BERSERKER_DMG: (u32, u8) = (1_269_309, 2);
480 pub(crate) const BLOODBATH_ENRAGE_CHANCE: (u32, u8) = (335_096, 3);
482 pub(crate) const COLD_STEEL_HOT_BLOOD_RAGE: (u32, u8) = (383_978, 1);
484 pub(crate) const RB_RESET_CHANCE: (u32, u8) = (85288, 1);
486 pub(crate) const WNF_RESET_CHANCE: (u32, u8) = (392_936, 1);
488 pub(crate) const IMPROVED_EXECUTE_RAGE: (u32, u8) = (316_402, 3);
490 pub(crate) const EXECUTIONERS_WRATH_RAGE: (u32, u8) = (1_265_570, 1);
492 pub(crate) const MASSACRE_EXECUTE_CDR_MS: (u32, u8) = (206_315, 3);
494 pub(crate) const MASSACRE_PCT: (u32, u8) = (206_315, 2);
496 pub(crate) const SLAYERS_STRIKE_DMG: (u32, u8) = (445_579, 1);
498 pub(crate) const IMMINENT_DEMISE_EVERY: (u32, u8) = (444_769, 1);
500 pub(crate) const IMMINENT_DEMISE_REAP_CHANCE: (u32, u8) = (444_769, 2);
502 pub(crate) const REAP_DMG: (u32, u8) = (446_005, 1);
504 pub(crate) const UNRELENTING_CDR_S: (u32, u8) = (444_780, 1);
506 pub(crate) const UNRELENTING_OVERWHELMED: (u32, u8) = (444_780, 2);
508 pub(crate) const ANGER_MANAGEMENT_DIV: (u32, u8) = (152_278, 3);
510 pub(crate) const FROTHING_REFUND: (u32, u8) = (392_792, 1);
512 pub(crate) const RECKLESS_ABANDON_RAGE: (u32, u8) = (396_749, 1);
514 pub(crate) const MID2_RAGING_BLOW_DAMAGE: (u32, u8) = (1_296_645, 1);
516 pub(crate) const MID2_RECKLESSNESS_EXTENSION_MS: (u32, u8) = (1_296_645, 2);
518 pub(crate) const MID2_RECKLESSNESS_EXTENSION_CAP: (u32, u8) = (1_296_645, 3);
520 pub(crate) const MID2_BLOODTHIRST_DAMAGE: (u32, u8) = (1_296_646, 1);
522}
523static REPORTED_SPELLS: &[(&str, u32)] = &[
524 ("crushing_blow_main_hand", 335_098),
525 ("crushing_blow_off_hand", 335_100),
526 ("raging_blow_main_hand", 96103),
527 ("raging_blow_off_hand", 85384),
528];
529static DECLARED_SPELL_IDS: &[u32] = &[
530 23881, 85288, 184_367, 280_735, 190_411, 1719, 107_574, 335_096, 335_097, 6343, 772,
531 6673, 1464, 57755, 227_847, 385_059, 228_920, 445_579, 446_005, 184_362, 1_296_646,
532 85739, 335_082, 52437, 388_539, 113_344, 385_042, 262_115, 392_778, 1_265_560,
533 1_265_406, 386_196, 385_060, 445_584, 445_836, 445_606, 1_265_575, 435_615, 436_707,
534 152_278, 385_703, 383_959, 1_261_060, 1_265_570, 392_792, 383_877, 444_769, 316_402,
535 383_854, 12950, 206_315, 444_772, 1_269_308, 1_269_309, 1_265_357, 444_775, 396_749,
536 444_767, 444_779, 29725, 1_265_359, 386_628, 444_780, 262_231, 382_946, 392_936,
537 6603, 76856, 85384, 96103, 335_098, 335_100, 383_978, 1_296_645, 446_918, 458_689,
538 456_120, 1_270_731, 460_670, 435_791, 435_222, 437_121,
539];
540static DECLARED_AURA_IDS: &[u32] = &[
541 184_362, 1719, 1_296_646, 85739, 107_574, 335_082, 52437, 388_539, 113_344, 385_042,
542 6673, 184_367, 262_115, 392_778, 1_265_560, 1_265_406, 386_196, 227_847, 385_060,
543 228_920, 445_584, 445_836, 445_606, 1_265_575, 435_615, 436_707, 446_918, 458_689,
544 456_120, 1_270_731, 437_121, 435_615,
545];
546static TALENTS: &[(&str, u32)] = &[
547 ("ANGER_MANAGEMENT", TALENT::ANGER_MANAGEMENT),
548 ("AVATAR", TALENT::AVATAR),
549 ("BERSERKER_STANCE", TALENT::BERSERKER_STANCE),
550 ("BLOODBORNE", TALENT::BLOODBORNE),
551 ("COLD_STEEL_HOT_BLOOD", TALENT::COLD_STEEL_HOT_BLOOD),
552 ("DEEP_WOUNDS", TALENT::DEEP_WOUNDS),
553 ("EXECUTIONERS_WRATH", TALENT::EXECUTIONERS_WRATH),
554 ("FROTHING_BERSERKER", TALENT::FROTHING_BERSERKER),
555 ("HACK_AND_SLASH", TALENT::HACK_AND_SLASH),
556 ("IMMINENT_DEMISE", TALENT::IMMINENT_DEMISE),
557 ("IMPROVED_EXECUTE", TALENT::IMPROVED_EXECUTE),
558 ("IMPROVED_RAGING_BLOW", TALENT::IMPROVED_RAGING_BLOW),
559 ("IMPROVED_WHIRLWIND", TALENT::IMPROVED_WHIRLWIND),
560 ("MASSACRE", TALENT::MASSACRE),
561 ("OVERWHELMING_BLADES", TALENT::OVERWHELMING_BLADES),
562 ("RAMPAGING_BERSERKER", TALENT::RAMPAGING_BERSERKER),
563 ("RAMPAGING_BERSERKER_2", TALENT::RAMPAGING_BERSERKER_2),
564 ("RAMPAGING_RUIN", TALENT::RAMPAGING_RUIN),
565 ("REAP_THE_STORM", TALENT::REAP_THE_STORM),
566 ("RECKLESS_ABANDON", TALENT::RECKLESS_ABANDON),
567 ("SLAYERS_DOMINANCE", TALENT::SLAYERS_DOMINANCE),
568 ("SLAYERS_MALICE", TALENT::SLAYERS_MALICE),
569 ("SUDDEN_DEATH", TALENT::SUDDEN_DEATH),
570 ("SURGE_OF_ADRENALINE", TALENT::SURGE_OF_ADRENALINE),
571 ("THUNDER_CLAP", TALENT::THUNDER_CLAP),
572 ("UNHINGED", TALENT::UNHINGED),
573 ("UNRELENTING_ONSLAUGHT", TALENT::UNRELENTING_ONSLAUGHT),
574 ("WAR_MACHINE", TALENT::WAR_MACHINE),
575 ("WILD_STRIKES", TALENT::WILD_STRIKES),
576 ("WRATH_AND_FURY", TALENT::WRATH_AND_FURY),
577];
578pub(crate) mod FURY_WARRIOR {
579 pub(crate) const BLOODTHIRST_CASTS: u32 = 0;
580 pub(crate) const RAGING_BLOW_CASTS: u32 = 1;
581 pub(crate) const RAMPAGE_CASTS: u32 = 2;
582 pub(crate) const EXECUTE_CASTS: u32 = 3;
583 pub(crate) const RECKLESSNESS_CASTS: u32 = 4;
584 pub(crate) const AVATAR_CASTS: u32 = 5;
585 pub(crate) const ENRAGE_UPTIME_MS: u32 = 6;
586 pub(crate) const RECKLESSNESS_UPTIME_MS: u32 = 7;
587}
588fn aura_enrage(
589 a: AuraDefinitionDraft,
590 data: &ResolvedGameData,
591) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
592 Ok(
593 a
594 .on_player()
595 .apply_base_from_data(data, 184_362)?
596 .max_stacks(
597 data
598 .require_aura_max_stacks(
599 wowlab_types::sim::SpellIdx::from_raw(184_362),
600 )?,
601 ),
602 )
603}
604fn aura_recklessness(
605 a: AuraDefinitionDraft,
606 data: &ResolvedGameData,
607) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
608 Ok(
609 a
610 .on_player()
611 .apply_base_from_data(data, 1719)?
612 .max_stacks(
613 data
614 .require_aura_max_stacks(
615 wowlab_types::sim::SpellIdx::from_raw(1719),
616 )?,
617 )
618 .resource_gain_mult_per_stack(
619 data.base_points(wowlab_types::sim::SpellIdx::from_raw(1719), 1),
620 )?
621 .on_expire(crate::hooks::fury_warrior::recklessness_expire_hook),
622 )
623}
624fn aura_mid2_recklessness_crit(
625 a: AuraDefinitionDraft,
626 data: &ResolvedGameData,
627) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
628 a.on_player()
629 .apply_base_from_data(data, 1_296_646)?
630 .max_stacks(
631 wowlab_engine_combat::validated_max_stacks(
632 2.0,
633 1_296_646,
634 "aura.max_stacks",
635 )?,
636 )
637 .crit_per_stack(5.0)
638}
639fn aura_whirlwind(
640 a: AuraDefinitionDraft,
641 data: &ResolvedGameData,
642) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
643 Ok(
644 a
645 .on_player()
646 .apply_base_from_data(data, 85739)?
647 .max_stacks(
648 data
649 .require_aura_max_stacks(
650 wowlab_types::sim::SpellIdx::from_raw(85739),
651 )?,
652 ),
653 )
654}
655fn aura_avatar(
656 a: AuraDefinitionDraft,
657 data: &ResolvedGameData,
658) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
659 Ok(
660 a
661 .on_player()
662 .apply_base_from_data(data, 107_574)?
663 .max_stacks(
664 data
665 .require_aura_max_stacks(
666 wowlab_types::sim::SpellIdx::from_raw(107_574),
667 )?,
668 ),
669 )
670}
671fn aura_frenzy(
672 a: AuraDefinitionDraft,
673 data: &ResolvedGameData,
674) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
675 Ok(
676 a
677 .on_player()
678 .apply_base_from_data(data, 335_082)?
679 .max_stacks(
680 data
681 .require_aura_max_stacks(
682 wowlab_types::sim::SpellIdx::from_raw(335_082),
683 )?,
684 ),
685 )
686}
687fn aura_sudden_death(
688 a: AuraDefinitionDraft,
689 data: &ResolvedGameData,
690) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
691 Ok(
692 a
693 .on_player()
694 .apply_base_from_data(data, 52437)?
695 .max_stacks(
696 data
697 .require_aura_max_stacks(
698 wowlab_types::sim::SpellIdx::from_raw(52437),
699 )?,
700 ),
701 )
702}
703fn aura_rend(
704 a: AuraDefinitionDraft,
705 data: &ResolvedGameData,
706) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
707 Ok(
708 a
709 .on_target()
710 .apply_base_from_data(data, 388_539)?
711 .max_stacks(
712 data
713 .require_aura_max_stacks(
714 wowlab_types::sim::SpellIdx::from_raw(388_539),
715 )?,
716 ),
717 )
718}
719fn aura_bloodbath_dot(
720 a: AuraDefinitionDraft,
721 data: &ResolvedGameData,
722) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
723 Ok(
724 a
725 .on_target()
726 .apply_base_from_data(data, 113_344)?
727 .max_stacks(
728 data
729 .require_aura_max_stacks(
730 wowlab_types::sim::SpellIdx::from_raw(113_344),
731 )?,
732 ),
733 )
734}
735fn aura_gushing_wound(
736 a: AuraDefinitionDraft,
737 data: &ResolvedGameData,
738) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
739 a.on_target()
740 .apply_base_from_data(data, 385_042)?
741 .max_stacks(
742 data.require_aura_max_stacks(wowlab_types::sim::SpellIdx::from_raw(385_042))?,
743 )
744 .periodic_damage(
745 wowlab_engine_combat::validated_milliseconds(
746 data.period(wowlab_types::sim::SpellIdx::from_raw(385_042), 1),
747 385_042,
748 "periodic_damage.tick_ms",
749 )?,
750 data.ap_coef(wowlab_types::sim::SpellIdx::from_raw(385_042), 1),
751 wowlab_engine_combat::DamageFlags::PHYSICAL,
752 )
753 .apply_periodic_behavior_from_data(data, 385_042)
754}
755fn aura_battle_shout(
756 a: AuraDefinitionDraft,
757 data: &ResolvedGameData,
758) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
759 Ok(
760 a
761 .on_player()
762 .apply_base_from_data(data, 6673)?
763 .max_stacks(
764 data
765 .require_aura_max_stacks(
766 wowlab_types::sim::SpellIdx::from_raw(6673),
767 )?,
768 ),
769 )
770}
771fn aura_rampage(
772 a: AuraDefinitionDraft,
773 data: &ResolvedGameData,
774) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
775 Ok(
776 a
777 .on_player()
778 .apply_base_from_data(data, 184_367)?
779 .max_stacks(
780 data
781 .require_aura_max_stacks(
782 wowlab_types::sim::SpellIdx::from_raw(184_367),
783 )?,
784 ),
785 )
786}
787fn aura_deep_wounds(
788 a: AuraDefinitionDraft,
789 data: &ResolvedGameData,
790) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
791 Ok(
792 a
793 .on_target()
794 .apply_base_from_data(data, 262_115)?
795 .max_stacks(
796 data
797 .require_aura_max_stacks(
798 wowlab_types::sim::SpellIdx::from_raw(262_115),
799 )?,
800 ),
801 )
802}
803fn aura_wild_strikes(
804 a: AuraDefinitionDraft,
805 data: &ResolvedGameData,
806) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
807 Ok(
808 a
809 .on_player()
810 .apply_base_from_data(data, 392_778)?
811 .max_stacks(
812 data
813 .require_aura_max_stacks(
814 wowlab_types::sim::SpellIdx::from_raw(392_778),
815 )?,
816 ),
817 )
818}
819fn aura_surge_of_adrenaline(
820 a: AuraDefinitionDraft,
821 data: &ResolvedGameData,
822) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
823 Ok(
824 a
825 .on_player()
826 .apply_base_from_data(data, 1_265_560)?
827 .max_stacks(
828 data
829 .require_aura_max_stacks(
830 wowlab_types::sim::SpellIdx::from_raw(1_265_560),
831 )?,
832 ),
833 )
834}
835fn aura_bloodborne(
836 a: AuraDefinitionDraft,
837 data: &ResolvedGameData,
838) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
839 Ok(
840 a
841 .on_player()
842 .apply_base_from_data(data, 1_265_406)?
843 .max_stacks(
844 data
845 .require_aura_max_stacks(
846 wowlab_types::sim::SpellIdx::from_raw(1_265_406),
847 )?,
848 ),
849 )
850}
851fn aura_berserker_stance(
852 a: AuraDefinitionDraft,
853 data: &ResolvedGameData,
854) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
855 Ok(
856 a
857 .on_player()
858 .apply_base_from_data(data, 386_196)?
859 .max_stacks(
860 data
861 .require_aura_max_stacks(
862 wowlab_types::sim::SpellIdx::from_raw(386_196),
863 )?,
864 ),
865 )
866}
867fn aura_bladestorm(
868 a: AuraDefinitionDraft,
869 data: &ResolvedGameData,
870) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
871 Ok(
872 a
873 .on_player()
874 .apply_base_from_data(data, 227_847)?
875 .max_stacks(
876 data
877 .require_aura_max_stacks(
878 wowlab_types::sim::SpellIdx::from_raw(227_847),
879 )?,
880 )
881 .periodic_hook(
882 wowlab_engine_combat::validated_milliseconds(
883 data.period(wowlab_types::sim::SpellIdx::from_raw(227_847), 1),
884 227_847,
885 "periodic_hook.tick_ms",
886 )?,
887 )
888 .apply_periodic_behavior_from_data(data, 227_847)?
889 .tick_hook(crate::hooks::fury_warrior::bladestorm_tick_hook),
890 )
891}
892fn aura_odyns_fury_dot(
893 a: AuraDefinitionDraft,
894 data: &ResolvedGameData,
895) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
896 Ok(
897 a
898 .on_target()
899 .apply_base_from_data(data, 385_060)?
900 .max_stacks(
901 data
902 .require_aura_max_stacks(
903 wowlab_types::sim::SpellIdx::from_raw(385_060),
904 )?,
905 ),
906 )
907}
908fn aura_ravager(
909 a: AuraDefinitionDraft,
910 data: &ResolvedGameData,
911) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
912 Ok(
913 a
914 .on_player()
915 .apply_base_from_data(data, 228_920)?
916 .max_stacks(
917 data
918 .require_aura_max_stacks(
919 wowlab_types::sim::SpellIdx::from_raw(228_920),
920 )?,
921 ),
922 )
923}
924fn aura_executioner(
925 a: AuraDefinitionDraft,
926 data: &ResolvedGameData,
927) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
928 Ok(
929 a
930 .on_player()
931 .apply_base_from_data(data, 445_584)?
932 .max_stacks(
933 data
934 .require_aura_max_stacks(
935 wowlab_types::sim::SpellIdx::from_raw(445_584),
936 )?,
937 ),
938 )
939}
940fn aura_overwhelmed(
941 a: AuraDefinitionDraft,
942 data: &ResolvedGameData,
943) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
944 Ok(
945 a
946 .on_target()
947 .apply_base_from_data(data, 445_836)?
948 .max_stacks(
949 data
950 .require_aura_max_stacks(
951 wowlab_types::sim::SpellIdx::from_raw(445_836),
952 )?,
953 ),
954 )
955}
956fn aura_imminent_demise(
957 a: AuraDefinitionDraft,
958 data: &ResolvedGameData,
959) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
960 Ok(
961 a
962 .on_player()
963 .apply_base_from_data(data, 445_606)?
964 .max_stacks(
965 data
966 .require_aura_max_stacks(
967 wowlab_types::sim::SpellIdx::from_raw(445_606),
968 )?,
969 ),
970 )
971}
972fn aura_executioners_wrath(
973 a: AuraDefinitionDraft,
974 data: &ResolvedGameData,
975) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
976 Ok(
977 a
978 .on_player()
979 .apply_base_from_data(data, 1_265_575)?
980 .max_stacks(
981 data
982 .require_aura_max_stacks(
983 wowlab_types::sim::SpellIdx::from_raw(1_265_575),
984 )?,
985 ),
986 )
987}
988fn aura_thunder_blast(
989 a: AuraDefinitionDraft,
990 data: &ResolvedGameData,
991) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
992 Ok(
993 a
994 .on_player()
995 .apply_base_from_data(data, 435_615)?
996 .max_stacks(
997 data
998 .require_aura_max_stacks(
999 wowlab_types::sim::SpellIdx::from_raw(435_615),
1000 )?,
1001 ),
1002 )
1003}
1004fn aura_crashing_thunder(
1005 a: AuraDefinitionDraft,
1006 data: &ResolvedGameData,
1007) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1008 Ok(
1009 a
1010 .on_player()
1011 .apply_base_from_data(data, 436_707)?
1012 .max_stacks(
1013 data
1014 .require_aura_max_stacks(
1015 wowlab_types::sim::SpellIdx::from_raw(436_707),
1016 )?,
1017 ),
1018 )
1019}
1020fn spell_bloodthirst(
1021 s: SpellDefinitionDraft,
1022 data: &ResolvedGameData,
1023) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1024 Ok(
1025 s
1026 .apply_base_from_data(data, 23881)?
1027 .apply_aoe_from_data(data)
1028 .on_cast(crate::hooks::fury_warrior::bloodthirst_hook),
1029 )
1030}
1031fn spell_raging_blow(
1032 s: SpellDefinitionDraft,
1033 data: &ResolvedGameData,
1034) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1035 Ok(
1036 s
1037 .apply_base_from_data(data, 85288)?
1038 .without_primary_data_damage()
1039 .apply_aoe_from_data(data)
1040 .on_cast(crate::hooks::fury_warrior::raging_blow_hook),
1041 )
1042}
1043fn spell_rampage(
1044 s: SpellDefinitionDraft,
1045 data: &ResolvedGameData,
1046) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1047 Ok(
1048 s
1049 .apply_base_from_data(data, 184_367)?
1050 .without_primary_data_damage()
1051 .trigger_program_predicate(
1052 2,
1053 crate::hooks::fury_warrior::rampage_single_target_trigger,
1054 )
1055 .trigger_program_predicate(
1056 3,
1057 crate::hooks::fury_warrior::rampage_single_target_trigger,
1058 )
1059 .trigger_program_predicate(
1060 4,
1061 crate::hooks::fury_warrior::rampage_single_target_trigger,
1062 )
1063 .trigger_program_predicate(
1064 5,
1065 crate::hooks::fury_warrior::rampage_single_target_trigger,
1066 )
1067 .trigger_program_predicate(
1068 6,
1069 crate::hooks::fury_warrior::rampaging_ruin_trigger,
1070 )
1071 .trigger_program_predicate(
1072 7,
1073 crate::hooks::fury_warrior::rampaging_ruin_trigger,
1074 )
1075 .trigger_program_predicate(
1076 8,
1077 crate::hooks::fury_warrior::rampaging_ruin_trigger,
1078 )
1079 .trigger_program_predicate(
1080 9,
1081 crate::hooks::fury_warrior::rampaging_ruin_trigger,
1082 )
1083 .applies_aura(AURA_ENRAGE)
1084 .apply_aoe_from_data(data)
1085 .on_cast(crate::hooks::fury_warrior::rampage_hook),
1086 )
1087}
1088fn spell_execute(
1089 s: SpellDefinitionDraft,
1090 data: &ResolvedGameData,
1091) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1092 Ok(
1093 s
1094 .apply_base_from_data(data, 280_735)?
1095 .apply_aoe_from_data(data)
1096 .on_cast(crate::hooks::fury_warrior::execute_hook),
1097 )
1098}
1099fn spell_whirlwind(
1100 s: SpellDefinitionDraft,
1101 data: &ResolvedGameData,
1102) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1103 Ok(
1104 s
1105 .apply_base_from_data(data, 190_411)?
1106 .applies_aura(AURA_WHIRLWIND)
1107 .apply_aoe_from_data(data)
1108 .on_cast(crate::hooks::fury_warrior::whirlwind_hook),
1109 )
1110}
1111fn spell_recklessness(
1112 s: SpellDefinitionDraft,
1113 data: &ResolvedGameData,
1114) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1115 Ok(
1116 s
1117 .apply_base_from_data(data, 1719)?
1118 .applies_inferred_aura(AURA_RECKLESSNESS, 1719)
1119 .apply_aoe_from_data(data)
1120 .on_cast(crate::hooks::fury_warrior::recklessness_hook),
1121 )
1122}
1123fn spell_avatar(
1124 s: SpellDefinitionDraft,
1125 data: &ResolvedGameData,
1126) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1127 Ok(
1128 s
1129 .apply_base_from_data(data, 107_574)?
1130 .applies_inferred_aura(AURA_AVATAR, 107_574)
1131 .apply_aoe_from_data(data),
1132 )
1133}
1134fn spell_bloodbath(
1135 s: SpellDefinitionDraft,
1136 data: &ResolvedGameData,
1137) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1138 Ok(
1139 s
1140 .apply_base_from_data(data, 335_096)?
1141 .apply_aoe_from_data(data)
1142 .on_cast(crate::hooks::fury_warrior::bloodbath_hook),
1143 )
1144}
1145fn spell_crushing_blow(
1146 s: SpellDefinitionDraft,
1147 data: &ResolvedGameData,
1148) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1149 Ok(
1150 s
1151 .apply_base_from_data(data, 335_097)?
1152 .without_primary_data_damage()
1153 .apply_aoe_from_data(data)
1154 .on_cast(crate::hooks::fury_warrior::crushing_blow_hook),
1155 )
1156}
1157fn spell_thunder_clap(
1158 s: SpellDefinitionDraft,
1159 data: &ResolvedGameData,
1160) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1161 Ok(
1162 s
1163 .apply_base_from_data(data, 6343)?
1164 .gain(5.0)
1165 .apply_aoe_from_data(data)
1166 .on_cast(crate::hooks::fury_warrior::thunder_clap_hook),
1167 )
1168}
1169fn spell_rend(
1170 s: SpellDefinitionDraft,
1171 data: &ResolvedGameData,
1172) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1173 Ok(
1174 s
1175 .apply_base_from_data(data, 772)?
1176 .applies_aura(AURA_REND)
1177 .apply_aoe_from_data(data)
1178 .on_cast(crate::hooks::fury_warrior::rend_hook),
1179 )
1180}
1181fn spell_battle_shout(
1182 s: SpellDefinitionDraft,
1183 data: &ResolvedGameData,
1184) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1185 Ok(
1186 s
1187 .apply_base_from_data(data, 6673)?
1188 .applies_inferred_aura(AURA_BATTLE_SHOUT, 6673)
1189 .apply_aoe_from_data(data),
1190 )
1191}
1192fn spell_slam(
1193 s: SpellDefinitionDraft,
1194 data: &ResolvedGameData,
1195) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1196 Ok(
1197 s
1198 .apply_base_from_data(data, 1464)?
1199 .apply_aoe_from_data(data)
1200 .on_cast(crate::hooks::fury_warrior::slam_hook),
1201 )
1202}
1203fn spell_heroic_throw(
1204 s: SpellDefinitionDraft,
1205 data: &ResolvedGameData,
1206) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1207 Ok(s.apply_base_from_data(data, 57755)?.apply_aoe_from_data(data))
1208}
1209fn spell_bladestorm(
1210 s: SpellDefinitionDraft,
1211 data: &ResolvedGameData,
1212) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1213 Ok(
1214 s
1215 .apply_base_from_data(data, 227_847)?
1216 .applies_inferred_aura(AURA_BLADESTORM, 227_847)
1217 .apply_aoe_from_data(data)
1218 .on_cast(crate::hooks::fury_warrior::bladestorm_hook),
1219 )
1220}
1221fn spell_odyns_fury(
1222 s: SpellDefinitionDraft,
1223 data: &ResolvedGameData,
1224) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1225 Ok(
1226 s
1227 .apply_base_from_data(data, 385_059)?
1228 .without_primary_data_damage()
1229 .applies_aura(AURA_ENRAGE)
1230 .apply_aoe_from_data(data)
1231 .on_cast(crate::hooks::fury_warrior::odyns_fury_hook),
1232 )
1233}
1234fn spell_ravager(
1235 s: SpellDefinitionDraft,
1236 data: &ResolvedGameData,
1237) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1238 Ok(
1239 s
1240 .apply_base_from_data(data, 228_920)?
1241 .applies_inferred_aura(AURA_RAVAGER, 228_920)
1242 .apply_aoe_from_data(data),
1243 )
1244}
1245fn spell_slayers_strike(
1246 s: SpellDefinitionDraft,
1247 data: &ResolvedGameData,
1248) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1249 Ok(s.apply_base_from_data(data, 445_579)?.apply_aoe_from_data(data))
1250}
1251fn spell_reap_the_storm_execute(
1252 s: SpellDefinitionDraft,
1253 data: &ResolvedGameData,
1254) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1255 Ok(s.apply_base_from_data(data, 446_005)?.apply_aoe_from_data(data))
1256}
1257pub(crate) fn build_combat_system_draft(
1258 params: &wowlab_engine_ports::HandlerParams<'_>,
1259) -> Result<CombatSystemDraft, wowlab_engine_ports::EngineError> {
1260 let builder = CombatSystemBuilder::new(params.stats.clone())
1261 .spec_id(SpecId::Fury)
1262 .spec_identity(
1263 wowlab_engine_combat::generated_identities::specs::fury_warrior::PROOF,
1264 )
1265 .hero_talent_trees(DECLARED_METADATA.hero_talent_trees)
1266 .effect_identities(
1267 wowlab_engine_combat::generated_identities::specs::fury_warrior::damage::ALL,
1268 )
1269 .effect_identities(wowlab_engine_combat::generated_identities::shared::ALL)
1270 .mastery_spell(76856)
1271 .mastery_hook(crate::hooks::fury_warrior::mastery)
1272 .resource(
1273 "rage",
1274 params
1275 .game_data
1276 .power_max(1)
1277 .ok_or_else(|| {
1278 wowlab_engine_ports::EngineError::spec_construction(
1279 "missing power-type power_max for type_id 1",
1280 )
1281 })?,
1282 params
1283 .game_data
1284 .power_regen_for_max(
1285 1,
1286 params
1287 .game_data
1288 .power_max(1)
1289 .ok_or_else(|| {
1290 wowlab_engine_ports::EngineError::spec_construction(
1291 "missing power-type power_max for type_id 1",
1292 )
1293 })?,
1294 )
1295 .ok_or_else(|| {
1296 wowlab_engine_ports::EngineError::spec_construction(
1297 "missing power-type power_regen_for_max for type_id 1",
1298 )
1299 })?,
1300 )
1301 .resource_type_id(1)
1302 .resource_start(
1303 params
1304 .game_data
1305 .power_default(1)
1306 .ok_or_else(|| {
1307 wowlab_engine_ports::EngineError::spec_construction(
1308 "missing power-type power_default for type_id 1",
1309 )
1310 })?,
1311 )
1312 .aura("enrage", AURA::ENRAGE, |a| aura_enrage(a, ¶ms.game_data))
1313 .aura(
1314 "recklessness",
1315 AURA::RECKLESSNESS,
1316 |a| aura_recklessness(a, ¶ms.game_data),
1317 )
1318 .aura(
1319 "mid2_recklessness_crit",
1320 AURA::MID2_RECKLESSNESS_CRIT,
1321 |a| aura_mid2_recklessness_crit(a, ¶ms.game_data),
1322 )
1323 .aura("whirlwind", AURA::WHIRLWIND, |a| aura_whirlwind(a, ¶ms.game_data))
1324 .aura("avatar", AURA::AVATAR, |a| aura_avatar(a, ¶ms.game_data))
1325 .aura("frenzy", AURA::FRENZY, |a| aura_frenzy(a, ¶ms.game_data))
1326 .aura(
1327 "sudden_death",
1328 AURA::SUDDEN_DEATH,
1329 |a| aura_sudden_death(a, ¶ms.game_data),
1330 )
1331 .aura("rend", AURA::REND, |a| aura_rend(a, ¶ms.game_data))
1332 .aura(
1333 "bloodbath_dot",
1334 AURA::BLOODBATH_DOT,
1335 |a| aura_bloodbath_dot(a, ¶ms.game_data),
1336 )
1337 .aura(
1338 "gushing_wound",
1339 AURA::GUSHING_WOUND,
1340 |a| aura_gushing_wound(a, ¶ms.game_data),
1341 )
1342 .aura(
1343 "battle_shout",
1344 AURA::BATTLE_SHOUT,
1345 |a| aura_battle_shout(a, ¶ms.game_data),
1346 )
1347 .aura("rampage", AURA::RAMPAGE, |a| aura_rampage(a, ¶ms.game_data))
1348 .aura(
1349 "deep_wounds",
1350 AURA::DEEP_WOUNDS,
1351 |a| aura_deep_wounds(a, ¶ms.game_data),
1352 )
1353 .aura(
1354 "wild_strikes",
1355 AURA::WILD_STRIKES,
1356 |a| aura_wild_strikes(a, ¶ms.game_data),
1357 )
1358 .aura(
1359 "surge_of_adrenaline",
1360 AURA::SURGE_OF_ADRENALINE,
1361 |a| aura_surge_of_adrenaline(a, ¶ms.game_data),
1362 )
1363 .aura("bloodborne", AURA::BLOODBORNE, |a| aura_bloodborne(a, ¶ms.game_data))
1364 .aura(
1365 "berserker_stance",
1366 AURA::BERSERKER_STANCE,
1367 |a| aura_berserker_stance(a, ¶ms.game_data),
1368 )
1369 .aura("bladestorm", AURA::BLADESTORM, |a| aura_bladestorm(a, ¶ms.game_data))
1370 .aura(
1371 "odyns_fury_dot",
1372 AURA::ODYNS_FURY_DOT,
1373 |a| aura_odyns_fury_dot(a, ¶ms.game_data),
1374 )
1375 .aura("ravager", AURA::RAVAGER, |a| aura_ravager(a, ¶ms.game_data))
1376 .aura(
1377 "executioner",
1378 AURA::EXECUTIONER,
1379 |a| aura_executioner(a, ¶ms.game_data),
1380 )
1381 .aura(
1382 "overwhelmed",
1383 AURA::OVERWHELMED,
1384 |a| aura_overwhelmed(a, ¶ms.game_data),
1385 )
1386 .aura(
1387 "imminent_demise",
1388 AURA::IMMINENT_DEMISE,
1389 |a| aura_imminent_demise(a, ¶ms.game_data),
1390 )
1391 .aura(
1392 "executioners_wrath",
1393 AURA::EXECUTIONERS_WRATH,
1394 |a| aura_executioners_wrath(a, ¶ms.game_data),
1395 )
1396 .aura(
1397 "thunder_blast",
1398 AURA::THUNDER_BLAST,
1399 |a| aura_thunder_blast(a, ¶ms.game_data),
1400 )
1401 .aura(
1402 "crashing_thunder",
1403 AURA::CRASHING_THUNDER,
1404 |a| aura_crashing_thunder(a, ¶ms.game_data),
1405 )
1406 .spell(
1407 "bloodthirst",
1408 SPELL::BLOODTHIRST,
1409 |s| spell_bloodthirst(s, ¶ms.game_data),
1410 )
1411 .spell(
1412 "raging_blow",
1413 SPELL::RAGING_BLOW,
1414 |s| spell_raging_blow(s, ¶ms.game_data),
1415 )
1416 .spell("rampage", SPELL::RAMPAGE, |s| spell_rampage(s, ¶ms.game_data))
1417 .spell("execute", SPELL::EXECUTE, |s| spell_execute(s, ¶ms.game_data))
1418 .spell("whirlwind", SPELL::WHIRLWIND, |s| spell_whirlwind(s, ¶ms.game_data))
1419 .spell(
1420 "recklessness",
1421 SPELL::RECKLESSNESS,
1422 |s| spell_recklessness(s, ¶ms.game_data),
1423 )
1424 .spell("avatar", SPELL::AVATAR, |s| spell_avatar(s, ¶ms.game_data))
1425 .spell("bloodbath", SPELL::BLOODBATH, |s| spell_bloodbath(s, ¶ms.game_data))
1426 .spell(
1427 "crushing_blow",
1428 SPELL::CRUSHING_BLOW,
1429 |s| spell_crushing_blow(s, ¶ms.game_data),
1430 )
1431 .spell(
1432 "thunder_clap",
1433 SPELL::THUNDER_CLAP,
1434 |s| spell_thunder_clap(s, ¶ms.game_data),
1435 )
1436 .spell("rend", SPELL::REND, |s| spell_rend(s, ¶ms.game_data))
1437 .spell(
1438 "battle_shout",
1439 SPELL::BATTLE_SHOUT,
1440 |s| spell_battle_shout(s, ¶ms.game_data),
1441 )
1442 .spell("slam", SPELL::SLAM, |s| spell_slam(s, ¶ms.game_data))
1443 .spell(
1444 "heroic_throw",
1445 SPELL::HEROIC_THROW,
1446 |s| spell_heroic_throw(s, ¶ms.game_data),
1447 )
1448 .spell(
1449 "bladestorm",
1450 SPELL::BLADESTORM,
1451 |s| spell_bladestorm(s, ¶ms.game_data),
1452 )
1453 .spell(
1454 "odyns_fury",
1455 SPELL::ODYNS_FURY,
1456 |s| spell_odyns_fury(s, ¶ms.game_data),
1457 )
1458 .spell("ravager", SPELL::RAVAGER, |s| spell_ravager(s, ¶ms.game_data))
1459 .spell(
1460 "slayers_strike",
1461 SPELL::SLAYERS_STRIKE,
1462 |s| spell_slayers_strike(s, ¶ms.game_data),
1463 )
1464 .spell(
1465 "reap_the_storm_execute",
1466 SPELL::REAP_THE_STORM_EXECUTE,
1467 |s| spell_reap_the_storm_execute(s, ¶ms.game_data),
1468 )
1469 .auto_attack(|a| {
1470 a
1471 .spell_id(6603)
1472 .swing_ms(3600)
1473 .apply_base_from_data(¶ms.game_data)
1474 .on_swing(crate::hooks::fury_warrior::swing_hook)
1475 })
1476 .auto_attack(|a| {
1477 a
1478 .spell_id(6603)
1479 .swing_ms(3600)
1480 .apply_base_from_data(¶ms.game_data)
1481 .on_swing(crate::hooks::fury_warrior::swing_hook)
1482 })
1483 .game_data(params.game_data.clone())
1484 .talent_spell_ids(TALENTS)
1485 .talent_selections(params.talent_selections)
1486 .set_bonus_auras(params.set_bonus_auras)
1487 .encounter(params.encounter.clone());
1488 let builder = crate::generated::items::register_equipped(
1489 builder,
1490 ¶ms.game_data,
1491 params.equipped_items,
1492 )?;
1493
1494 builder.into_draft()
1495}
1496fn new_handler(
1497 params: wowlab_engine_ports::HandlerParams<'_>,
1498) -> Result<Box<dyn SpecHandler>, wowlab_engine_ports::EngineError> {
1499 let handler = crate::composition::compose_handler(
1500 build_combat_system_draft,
1501 ¶ms,
1502 crate::hooks::fury_warrior::FuryHandler::try_new,
1503 )?;
1504
1505 Ok(Box::new(handler))
1506}
1507static DECLARED_METADATA: DeclaredSpecMetadata = DeclaredSpecMetadata {
1508 primary_resource: ResourceType::Rage,
1509 secondary_resource: None,
1510 spell_ids: DECLARED_SPELL_IDS,
1511 aura_ids: DECLARED_AURA_IDS,
1512 server_proc_entries: &[
1513 DeclaredServerProcEntry {
1514 spell_id: 85739,
1515 attributes: ProcAttributes::USE_STACKS_FOR_CHARGES.bits(),
1516 },
1517 DeclaredServerProcEntry {
1518 spell_id: 52437,
1519 attributes: ProcAttributes::REQUIRE_SPELL_MODIFIER.bits()
1520 | ProcAttributes::USE_STACKS_FOR_CHARGES.bits(),
1521 },
1522 DeclaredServerProcEntry {
1523 spell_id: 435_615,
1524 attributes: ProcAttributes::USE_STACKS_FOR_CHARGES.bits(),
1525 },
1526 ],
1527 talents: TALENTS,
1528 rotation_field_schema: &[],
1529 metrics_plugin_id: None,
1530 hero_talent_trees: &[
1531 HeroTalentTreeDesc {
1532 name: "Slayer",
1533 spells: HERO_TREE_SLAYER_SPELLS,
1534 auras: HERO_TREE_SLAYER_AURAS,
1535 },
1536 HeroTalentTreeDesc {
1537 name: "Mountain Thane",
1538 spells: HERO_TREE_MOUNTAIN_THANE_SPELLS,
1539 auras: HERO_TREE_MOUNTAIN_THANE_AURAS,
1540 },
1541 ],
1542 reported_spells: REPORTED_SPELLS,
1543 masked_passive_effects: &[],
1544 passive_effect_overrides: &[],
1545};
1546pub(super) const SPEC_DESCRIPTOR: SpecDescriptor = SpecDescriptor {
1547 spec_id: SpecId::Fury,
1548 display_name: "Fury Warrior",
1549 metadata: DECLARED_METADATA,
1550 handler_factory: new_handler,
1551};
1552wowlab_engine_combat::smoke_test!(build_combat_system_draft);