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 MORTAL_STRIKE: u32 = 12294;
18 pub(crate) const OVERPOWER: u32 = 7384;
20 pub(crate) const EXECUTE: u32 = 163_201;
22 pub(crate) const SLAM: u32 = 1464;
24 pub(crate) const COLOSSUS_SMASH: u32 = 167_105;
26 pub(crate) const AVATAR: u32 = 107_574;
28 pub(crate) const SWEEPING_STRIKES: u32 = 260_708;
30 pub(crate) const CLEAVE: u32 = 845;
32 pub(crate) const WHIRLWIND: u32 = 1680;
34 pub(crate) const REND: u32 = 772;
36 pub(crate) const THUNDER_CLAP: u32 = 6343;
38 pub(crate) const HEROIC_STRIKE: u32 = 1_269_383;
40 pub(crate) const CHAMPIONS_SPEAR: u32 = 376_079;
42 pub(crate) const BATTLE_SHOUT: u32 = 6673;
44 pub(crate) const HEROIC_THROW: u32 = 57755;
46 pub(crate) const EXECUTE_DAMAGE: u32 = 260_798;
48 pub(crate) const DREADNAUGHT: u32 = 315_961;
50 pub(crate) const FATALITY: u32 = 383_706;
52 pub(crate) const BLADESTORM: u32 = 227_847;
54 pub(crate) const RAVAGER: u32 = 228_920;
56 pub(crate) const DEMOLISH: u32 = 436_358;
58}
59pub(crate) mod AURA {
60 pub(crate) const COLOSSUS_SMASH: u32 = 208_086;
62 pub(crate) const DEEP_WOUNDS: u32 = 262_115;
64 pub(crate) const REND: u32 = 388_539;
66 pub(crate) const SWEEPING_STRIKES: u32 = 260_708;
68 pub(crate) const AVATAR: u32 = 107_574;
70 pub(crate) const SUDDEN_DEATH: u32 = 52437;
72 pub(crate) const MARTIAL_PROWESS: u32 = 316_440;
74 pub(crate) const BATTLELORD: u32 = 386_631;
76 pub(crate) const COLLATERAL_DAMAGE: u32 = 334_783;
78 pub(crate) const FATAL_MARK: u32 = 383_704;
80 pub(crate) const BATTLE_SHOUT: u32 = 6673;
82 pub(crate) const BATTLE_STANCE: u32 = 386_164;
84 pub(crate) const WINDING_UP: u32 = 1_300_670;
86 pub(crate) const RAVAGER: u32 = 228_920;
88 pub(crate) const BLADESTORM: u32 = 227_847;
90 pub(crate) const EXECUTIONERS_PRECISION: u32 = 386_633;
92 pub(crate) const IMMINENT_DEMISE: u32 = 445_606;
94 pub(crate) const FIERCE_FOLLOWTHROUGH: u32 = 458_689;
96 pub(crate) const EXECUTIONER: u32 = 445_584;
98 pub(crate) const OVERWHELMED: u32 = 445_836;
100 pub(crate) const MASTER_OF_WARFARE: u32 = 1_269_391;
102 pub(crate) const MASTER_OF_WARFARE_DAMAGE: u32 = 1_269_394;
104}
105pub(crate) mod TALENT {
106 pub(crate) const ANGER_MANAGEMENT: u32 = 152_278;
108 pub(crate) const BATTLELORD: u32 = 386_630;
110 pub(crate) const BATTLE_STANCE: u32 = 386_164;
112 pub(crate) const CRITICAL_THINKING: u32 = 389_306;
114 pub(crate) const CRUSHING_FORCE: u32 = 382_764;
116 pub(crate) const DEEP_WOUNDS: u32 = 1_261_060;
118 pub(crate) const DREADNAUGHT: u32 = 262_150;
120 pub(crate) const EXECUTIONERS_PRECISION: u32 = 386_634;
122 pub(crate) const FATALITY: u32 = 383_703;
124 pub(crate) const FIERCE_FOLLOWTHROUGH: u32 = 444_773;
126 pub(crate) const FROTHING_BERSERKER: u32 = 392_792;
128 pub(crate) const IMMINENT_DEMISE: u32 = 444_769;
130 pub(crate) const IMPALE: u32 = 383_430;
132 pub(crate) const IMPROVED_EXECUTE: u32 = 316_405;
134 pub(crate) const IMPROVED_OVERPOWER: u32 = 385_571;
136 pub(crate) const MARTIAL_PROWESS: u32 = 1_273_062;
138 pub(crate) const MASSACRE: u32 = 281_001;
140 pub(crate) const MASTER_OF_WARFARE: u32 = 1_269_314;
142 pub(crate) const MORTAL_WOUNDS: u32 = 1_261_062;
144 pub(crate) const OVERPOWERING_FINISH: u32 = 400_205;
146 pub(crate) const OVERWHELMING_BLADES: u32 = 444_772;
148 pub(crate) const OVERWHELMING_RAGE: u32 = 382_767;
150 pub(crate) const RAVAGER: u32 = 228_920;
152 pub(crate) const REAP_THE_STORM: u32 = 444_775;
154 pub(crate) const SHARPENED_BLADES: u32 = 383_341;
156 pub(crate) const SLAYERS_DOMINANCE: u32 = 444_767;
158 pub(crate) const STRENGTH_OF_ARMS: u32 = 400_803;
160 pub(crate) const SUDDEN_DEATH: u32 = 29725;
162 pub(crate) const TACTICIAN: u32 = 184_783;
164 pub(crate) const UNHINGED: u32 = 386_628;
166 pub(crate) const UNRELENTING_ONSLAUGHT: u32 = 444_780;
168 pub(crate) const WAR_MACHINE: u32 = 262_231;
170}
171pub(crate) mod SET_BONUS {
172 pub(crate) const MID2_ARMS_2PC: u32 = 1_296_643;
174 pub(crate) const MID2_ARMS_4PC: u32 = 1_296_644;
176}
177pub(crate) mod REPORTED_SPELL {
178 pub(crate) const CONCUSSIVE_SLAM: u32 = 1_300_660;
180}
181pub(crate) mod HERO {
182 pub(crate) mod SLAYER {
183 pub(crate) mod SPELL {
184 pub(crate) const REAP_THE_STORM_EXECUTE: u32 = 446_005;
186 pub(crate) const SLAYERS_STRIKE: u32 = 445_579;
188 }
189 pub(crate) mod AURA {
190 pub(crate) const BRUTAL_FINISH: u32 = 446_918;
192 pub(crate) const OPPORTUNIST: u32 = 456_120;
194 pub(crate) const VIOLENT_EUPHORIA: u32 = 1_270_731;
196 }
197 }
198 pub(crate) mod COLOSSUS {
199 pub(crate) mod SPELL {
200 pub(crate) const DEMOLISH: u32 = 436_358;
202 pub(crate) const DEMOLISH_HIT_1: u32 = 440_884;
204 pub(crate) const DEMOLISH_HIT_2: u32 = 440_886;
206 pub(crate) const DEMOLISH_HIT_3: u32 = 440_888;
208 }
209 pub(crate) mod AURA {
210 pub(crate) const CELERITOUS_CONCLUSION_CRIT: u32 = 1_270_846;
212 pub(crate) const CELERITOUS_CONCLUSION_HASTE: u32 = 1_270_843;
214 pub(crate) const COLOSSAL_MIGHT: u32 = 440_989;
216 pub(crate) const CUT_TO_THE_BONE: u32 = 1_270_840;
218 pub(crate) const WRECKED: u32 = 447_513;
220 }
221 }
222}
223static HERO_TREE_SLAYER_SPELLS: &[(&str, u32)] = &[
224 ("REAP_THE_STORM_EXECUTE", 446_005),
225 ("SLAYERS_STRIKE", 445_579),
226];
227static HERO_TREE_SLAYER_AURAS: &[(&str, u32)] = &[
228 ("BRUTAL_FINISH", 446_918),
229 ("OPPORTUNIST", 456_120),
230 ("VIOLENT_EUPHORIA", 1_270_731),
231];
232static HERO_TREE_COLOSSUS_SPELLS: &[(&str, u32)] = &[
233 ("DEMOLISH", 436_358),
234 ("DEMOLISH_HIT_1", 440_884),
235 ("DEMOLISH_HIT_2", 440_886),
236 ("DEMOLISH_HIT_3", 440_888),
237];
238static HERO_TREE_COLOSSUS_AURAS: &[(&str, u32)] = &[
239 ("CELERITOUS_CONCLUSION_CRIT", 1_270_846),
240 ("CELERITOUS_CONCLUSION_HASTE", 1_270_843),
241 ("COLOSSAL_MIGHT", 440_989),
242 ("CUT_TO_THE_BONE", 1_270_840),
243 ("WRECKED", 447_513),
244];
245pub(crate) mod DAMAGE_SPELL {
246 pub(crate) const MORTAL_STRIKE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::ACTION::SPELL_12294;
247 pub(crate) const OVERPOWER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::ACTION::SPELL_7384;
248 pub(crate) const EXECUTE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::ACTION::SPELL_163201;
249 pub(crate) const SLAM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::ACTION::SPELL_1464;
250 pub(crate) const COLOSSUS_SMASH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::ACTION::SPELL_167105;
251 pub(crate) const AVATAR: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::ACTION::SPELL_107574;
252 pub(crate) const SWEEPING_STRIKES: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::ACTION::SPELL_260708;
253 pub(crate) const CLEAVE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::ACTION::SPELL_845;
254 pub(crate) const WHIRLWIND: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::ACTION::SPELL_1680;
255 pub(crate) const REND: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::ACTION::SPELL_772;
256 pub(crate) const THUNDER_CLAP: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::ACTION::SPELL_6343;
257 pub(crate) const HEROIC_STRIKE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::ACTION::SPELL_1269383;
258 pub(crate) const CHAMPIONS_SPEAR: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::ACTION::SPELL_376079;
259 pub(crate) const BATTLE_SHOUT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::ACTION::SPELL_6673;
260 pub(crate) const HEROIC_THROW: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::ACTION::SPELL_57755;
261 pub(crate) const EXECUTE_DAMAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::ACTION::SPELL_260798;
262 pub(crate) const DREADNAUGHT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::ACTION::SPELL_315961;
263 pub(crate) const FATALITY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::ACTION::SPELL_383706;
264 pub(crate) const BLADESTORM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::ACTION::SPELL_227847;
265 pub(crate) const RAVAGER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::ACTION::SPELL_228920;
266 pub(crate) const DEMOLISH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::ACTION::SPELL_436358;
267 pub(crate) const REAP_THE_STORM_EXECUTE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::ACTION::SPELL_446005;
268 pub(crate) const SLAYERS_STRIKE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::ACTION::SPELL_445579;
269 pub(crate) const DEMOLISH_HIT_1: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::ACTION::SPELL_440884;
270 pub(crate) const DEMOLISH_HIT_2: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::ACTION::SPELL_440886;
271 pub(crate) const DEMOLISH_HIT_3: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::ACTION::SPELL_440888;
272}
273pub(crate) mod DAMAGE_AURA {
274 pub(crate) const COLOSSUS_SMASH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::ACTION::SPELL_208086;
275 pub(crate) const DEEP_WOUNDS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::ACTION::SPELL_262115;
276 pub(crate) const REND: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::ACTION::SPELL_388539;
277 pub(crate) const SWEEPING_STRIKES: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::ACTION::SPELL_260708;
278 pub(crate) const AVATAR: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::ACTION::SPELL_107574;
279 pub(crate) const SUDDEN_DEATH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::ACTION::SPELL_52437;
280 pub(crate) const MARTIAL_PROWESS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::ACTION::SPELL_316440;
281 pub(crate) const BATTLELORD: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::ACTION::SPELL_386631;
282 pub(crate) const COLLATERAL_DAMAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::ACTION::SPELL_334783;
283 pub(crate) const FATAL_MARK: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::ACTION::SPELL_383704;
284 pub(crate) const BATTLE_SHOUT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::ACTION::SPELL_6673;
285 pub(crate) const BATTLE_STANCE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::ACTION::SPELL_386164;
286 pub(crate) const WINDING_UP: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::ACTION::SPELL_1300670;
287 pub(crate) const RAVAGER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::ACTION::SPELL_228920;
288 pub(crate) const BLADESTORM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::ACTION::SPELL_227847;
289 pub(crate) const EXECUTIONERS_PRECISION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::ACTION::SPELL_386633;
290 pub(crate) const IMMINENT_DEMISE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::ACTION::SPELL_445606;
291 pub(crate) const FIERCE_FOLLOWTHROUGH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::ACTION::SPELL_458689;
292 pub(crate) const EXECUTIONER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::ACTION::SPELL_445584;
293 pub(crate) const OVERWHELMED: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::ACTION::SPELL_445836;
294 pub(crate) const MASTER_OF_WARFARE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::ACTION::SPELL_1269391;
295 pub(crate) const MASTER_OF_WARFARE_DAMAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::ACTION::SPELL_1269394;
296}
297pub(crate) mod DAMAGE_TALENT {
298 pub(crate) const ANGER_MANAGEMENT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::ACTION::SPELL_152278;
299 pub(crate) const BATTLELORD: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::ACTION::SPELL_386630;
300 pub(crate) const BATTLE_STANCE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::ACTION::SPELL_386164;
301 pub(crate) const CRITICAL_THINKING: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::ACTION::SPELL_389306;
302 pub(crate) const CRUSHING_FORCE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::ACTION::SPELL_382764;
303 pub(crate) const DEEP_WOUNDS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::ACTION::SPELL_1261060;
304 pub(crate) const DREADNAUGHT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::ACTION::SPELL_262150;
305 pub(crate) const EXECUTIONERS_PRECISION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::ACTION::SPELL_386634;
306 pub(crate) const FATALITY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::ACTION::SPELL_383703;
307 pub(crate) const FIERCE_FOLLOWTHROUGH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::ACTION::SPELL_444773;
308 pub(crate) const FROTHING_BERSERKER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::ACTION::SPELL_392792;
309 pub(crate) const IMMINENT_DEMISE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::ACTION::SPELL_444769;
310 pub(crate) const IMPALE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::ACTION::SPELL_383430;
311 pub(crate) const IMPROVED_EXECUTE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::ACTION::SPELL_316405;
312 pub(crate) const IMPROVED_OVERPOWER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::ACTION::SPELL_385571;
313 pub(crate) const MARTIAL_PROWESS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::ACTION::SPELL_1273062;
314 pub(crate) const MASSACRE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::ACTION::SPELL_281001;
315 pub(crate) const MASTER_OF_WARFARE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::ACTION::SPELL_1269314;
316 pub(crate) const MORTAL_WOUNDS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::ACTION::SPELL_1261062;
317 pub(crate) const OVERPOWERING_FINISH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::ACTION::SPELL_400205;
318 pub(crate) const OVERWHELMING_BLADES: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::ACTION::SPELL_444772;
319 pub(crate) const OVERWHELMING_RAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::ACTION::SPELL_382767;
320 pub(crate) const RAVAGER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::ACTION::SPELL_228920;
321 pub(crate) const REAP_THE_STORM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::ACTION::SPELL_444775;
322 pub(crate) const SHARPENED_BLADES: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::ACTION::SPELL_383341;
323 pub(crate) const SLAYERS_DOMINANCE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::ACTION::SPELL_444767;
324 pub(crate) const STRENGTH_OF_ARMS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::ACTION::SPELL_400803;
325 pub(crate) const SUDDEN_DEATH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::ACTION::SPELL_29725;
326 pub(crate) const TACTICIAN: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::ACTION::SPELL_184783;
327 pub(crate) const UNHINGED: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::ACTION::SPELL_386628;
328 pub(crate) const UNRELENTING_ONSLAUGHT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::ACTION::SPELL_444780;
329 pub(crate) const WAR_MACHINE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::ACTION::SPELL_262231;
330}
331pub(crate) mod DAMAGE_REPORTED {
332 pub(crate) const CONCUSSIVE_SLAM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::ACTION::SPELL_1300660;
333}
334pub(crate) mod DAMAGE_EFFECT {
335 pub(crate) const SEASONED_SOLDIER_CRIT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::EFFECT::SPELL_279423_EFFECT_1;
336 pub(crate) const EXECUTE_DMG: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::EFFECT::SPELL_260798_EFFECT_1;
337 pub(crate) const EXECUTE_REFUND: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::EFFECT::SPELL_163201_EFFECT_2;
338 pub(crate) const CRITICAL_THINKING_REFUND: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::EFFECT::SPELL_389306_EFFECT_2;
339 pub(crate) const MASSACRE_PCT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::EFFECT::SPELL_281001_EFFECT_2;
340 pub(crate) const MORTAL_STRIKE_DMG: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::EFFECT::SPELL_12294_EFFECT_1;
341 pub(crate) const BLADESTORM_PERIOD: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::EFFECT::SPELL_227847_EFFECT_1;
342 pub(crate) const OVERPOWER_DMG: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::EFFECT::SPELL_7384_EFFECT_1;
343 pub(crate) const TACTICIAN_CHANCE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::EFFECT::SPELL_184783_EFFECT_1;
344 pub(crate) const ANGER_MANAGEMENT_DIV: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::EFFECT::SPELL_152278_EFFECT_1;
345 pub(crate) const FATALITY_CHANCE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::EFFECT::SPELL_383703_EFFECT_1;
346 pub(crate) const FATALITY_DMG: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::EFFECT::SPELL_383706_EFFECT_1;
347 pub(crate) const DREADNAUGHT_DMG: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::EFFECT::SPELL_315961_EFFECT_1;
348 pub(crate) const SLAYERS_STRIKE_DMG: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::EFFECT::SPELL_445579_EFFECT_1;
349 pub(crate) const IMMINENT_DEMISE_EVERY: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::EFFECT::SPELL_444769_EFFECT_1;
350 pub(crate) const REAP_DMG: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::EFFECT::SPELL_446005_EFFECT_1;
351 pub(crate) const OVERPOWERING_FINISH_BELOW: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::EFFECT::SPELL_400205_EFFECT_2;
352 pub(crate) const OVERPOWERING_FINISH_PCT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::EFFECT::SPELL_400205_EFFECT_1;
353 pub(crate) const FROTHING_REFUND: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::EFFECT::SPELL_392792_EFFECT_1;
354 pub(crate) const UNRELENTING_CDR_S: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::EFFECT::SPELL_444780_EFFECT_1;
355 pub(crate) const UNRELENTING_OVERWHELMED: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::EFFECT::SPELL_444780_EFFECT_2;
356 pub(crate) const MID2_MORTAL_STRIKE_EXECUTE_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::EFFECT::SPELL_1296643_EFFECT_1;
357 pub(crate) const MID2_OVERPOWER_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::EFFECT::SPELL_1296644_EFFECT_1;
358 pub(crate) const MID2_CONCUSSIVE_SLAM_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::EFFECT::SPELL_1300660_EFFECT_1;
359 pub(crate) const MID2_CONCUSSIVE_SLAM_REDUCED_TARGETS: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::EFFECT::SPELL_1300660_EFFECT_2;
360}
361pub(crate) const AURA_COLOSSUS_SMASH: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::arms_warrior::AURA_COLOSSUS_SMASH
362 .bind(wowlab_engine_combat::generated_identities::specs::arms_warrior::PROOF);
363pub(crate) const AURA_DEEP_WOUNDS: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::arms_warrior::AURA_DEEP_WOUNDS
364 .bind(wowlab_engine_combat::generated_identities::specs::arms_warrior::PROOF);
365pub(crate) const AURA_REND: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::arms_warrior::AURA_REND
366 .bind(wowlab_engine_combat::generated_identities::specs::arms_warrior::PROOF);
367pub(crate) const AURA_SWEEPING_STRIKES: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::arms_warrior::AURA_SWEEPING_STRIKES
368 .bind(wowlab_engine_combat::generated_identities::specs::arms_warrior::PROOF);
369pub(crate) const AURA_AVATAR: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::arms_warrior::AURA_AVATAR
370 .bind(wowlab_engine_combat::generated_identities::specs::arms_warrior::PROOF);
371pub(crate) const AURA_SUDDEN_DEATH: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::arms_warrior::AURA_SUDDEN_DEATH
372 .bind(wowlab_engine_combat::generated_identities::specs::arms_warrior::PROOF);
373pub(crate) const AURA_MARTIAL_PROWESS: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::arms_warrior::AURA_MARTIAL_PROWESS
374 .bind(wowlab_engine_combat::generated_identities::specs::arms_warrior::PROOF);
375pub(crate) const AURA_BATTLELORD: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::arms_warrior::AURA_BATTLELORD
376 .bind(wowlab_engine_combat::generated_identities::specs::arms_warrior::PROOF);
377pub(crate) const AURA_COLLATERAL_DAMAGE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::arms_warrior::AURA_COLLATERAL_DAMAGE
378 .bind(wowlab_engine_combat::generated_identities::specs::arms_warrior::PROOF);
379pub(crate) const AURA_FATAL_MARK: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::arms_warrior::AURA_FATAL_MARK
380 .bind(wowlab_engine_combat::generated_identities::specs::arms_warrior::PROOF);
381pub(crate) const AURA_BATTLE_SHOUT: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::arms_warrior::AURA_BATTLE_SHOUT
382 .bind(wowlab_engine_combat::generated_identities::specs::arms_warrior::PROOF);
383pub(crate) const AURA_BATTLE_STANCE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::arms_warrior::AURA_BATTLE_STANCE
384 .bind(wowlab_engine_combat::generated_identities::specs::arms_warrior::PROOF);
385pub(crate) const AURA_WINDING_UP: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::arms_warrior::AURA_WINDING_UP
386 .bind(wowlab_engine_combat::generated_identities::specs::arms_warrior::PROOF);
387pub(crate) const AURA_RAVAGER: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::arms_warrior::AURA_RAVAGER
388 .bind(wowlab_engine_combat::generated_identities::specs::arms_warrior::PROOF);
389pub(crate) const AURA_BLADESTORM: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::arms_warrior::AURA_BLADESTORM
390 .bind(wowlab_engine_combat::generated_identities::specs::arms_warrior::PROOF);
391pub(crate) const AURA_EXECUTIONERS_PRECISION: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::arms_warrior::AURA_EXECUTIONERS_PRECISION
392 .bind(wowlab_engine_combat::generated_identities::specs::arms_warrior::PROOF);
393pub(crate) const AURA_IMMINENT_DEMISE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::arms_warrior::AURA_IMMINENT_DEMISE
394 .bind(wowlab_engine_combat::generated_identities::specs::arms_warrior::PROOF);
395pub(crate) const AURA_FIERCE_FOLLOWTHROUGH: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::arms_warrior::AURA_FIERCE_FOLLOWTHROUGH
396 .bind(wowlab_engine_combat::generated_identities::specs::arms_warrior::PROOF);
397pub(crate) const AURA_EXECUTIONER: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::arms_warrior::AURA_EXECUTIONER
398 .bind(wowlab_engine_combat::generated_identities::specs::arms_warrior::PROOF);
399pub(crate) const AURA_OVERWHELMED: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::arms_warrior::AURA_OVERWHELMED
400 .bind(wowlab_engine_combat::generated_identities::specs::arms_warrior::PROOF);
401pub(crate) const AURA_MASTER_OF_WARFARE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::arms_warrior::AURA_MASTER_OF_WARFARE
402 .bind(wowlab_engine_combat::generated_identities::specs::arms_warrior::PROOF);
403pub(crate) const AURA_MASTER_OF_WARFARE_DAMAGE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::arms_warrior::AURA_MASTER_OF_WARFARE_DAMAGE
404 .bind(wowlab_engine_combat::generated_identities::specs::arms_warrior::PROOF);
405pub(crate) const AURA_COUNT: usize = 22;
406const _: () = assert!(
407 AURA_COUNT == 22, "AURA index ABI: count changed -- update positional hook consumers"
408);
409pub(crate) const SPELL_MORTAL_STRIKE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::arms_warrior::SPELL_MORTAL_STRIKE
410 .bind(wowlab_engine_combat::generated_identities::specs::arms_warrior::PROOF);
411pub(crate) const SPELL_OVERPOWER: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::arms_warrior::SPELL_OVERPOWER
412 .bind(wowlab_engine_combat::generated_identities::specs::arms_warrior::PROOF);
413pub(crate) const SPELL_EXECUTE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::arms_warrior::SPELL_EXECUTE
414 .bind(wowlab_engine_combat::generated_identities::specs::arms_warrior::PROOF);
415pub(crate) const SPELL_SLAM: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::arms_warrior::SPELL_SLAM
416 .bind(wowlab_engine_combat::generated_identities::specs::arms_warrior::PROOF);
417pub(crate) const SPELL_COLOSSUS_SMASH: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::arms_warrior::SPELL_COLOSSUS_SMASH
418 .bind(wowlab_engine_combat::generated_identities::specs::arms_warrior::PROOF);
419pub(crate) const SPELL_AVATAR: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::arms_warrior::SPELL_AVATAR
420 .bind(wowlab_engine_combat::generated_identities::specs::arms_warrior::PROOF);
421pub(crate) const SPELL_SWEEPING_STRIKES: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::arms_warrior::SPELL_SWEEPING_STRIKES
422 .bind(wowlab_engine_combat::generated_identities::specs::arms_warrior::PROOF);
423pub(crate) const SPELL_CLEAVE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::arms_warrior::SPELL_CLEAVE
424 .bind(wowlab_engine_combat::generated_identities::specs::arms_warrior::PROOF);
425pub(crate) const SPELL_WHIRLWIND: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::arms_warrior::SPELL_WHIRLWIND
426 .bind(wowlab_engine_combat::generated_identities::specs::arms_warrior::PROOF);
427pub(crate) const SPELL_REND: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::arms_warrior::SPELL_REND
428 .bind(wowlab_engine_combat::generated_identities::specs::arms_warrior::PROOF);
429pub(crate) const SPELL_THUNDER_CLAP: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::arms_warrior::SPELL_THUNDER_CLAP
430 .bind(wowlab_engine_combat::generated_identities::specs::arms_warrior::PROOF);
431pub(crate) const SPELL_HEROIC_STRIKE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::arms_warrior::SPELL_HEROIC_STRIKE
432 .bind(wowlab_engine_combat::generated_identities::specs::arms_warrior::PROOF);
433pub(crate) const SPELL_CHAMPIONS_SPEAR: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::arms_warrior::SPELL_CHAMPIONS_SPEAR
434 .bind(wowlab_engine_combat::generated_identities::specs::arms_warrior::PROOF);
435pub(crate) const SPELL_BATTLE_SHOUT: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::arms_warrior::SPELL_BATTLE_SHOUT
436 .bind(wowlab_engine_combat::generated_identities::specs::arms_warrior::PROOF);
437pub(crate) const SPELL_HEROIC_THROW: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::arms_warrior::SPELL_HEROIC_THROW
438 .bind(wowlab_engine_combat::generated_identities::specs::arms_warrior::PROOF);
439pub(crate) const SPELL_EXECUTE_DAMAGE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::arms_warrior::SPELL_EXECUTE_DAMAGE
440 .bind(wowlab_engine_combat::generated_identities::specs::arms_warrior::PROOF);
441pub(crate) const SPELL_DREADNAUGHT: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::arms_warrior::SPELL_DREADNAUGHT
442 .bind(wowlab_engine_combat::generated_identities::specs::arms_warrior::PROOF);
443pub(crate) const SPELL_FATALITY: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::arms_warrior::SPELL_FATALITY
444 .bind(wowlab_engine_combat::generated_identities::specs::arms_warrior::PROOF);
445pub(crate) const SPELL_BLADESTORM: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::arms_warrior::SPELL_BLADESTORM
446 .bind(wowlab_engine_combat::generated_identities::specs::arms_warrior::PROOF);
447pub(crate) const SPELL_RAVAGER: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::arms_warrior::SPELL_RAVAGER
448 .bind(wowlab_engine_combat::generated_identities::specs::arms_warrior::PROOF);
449pub(crate) const SPELL_DEMOLISH: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::arms_warrior::SPELL_DEMOLISH
450 .bind(wowlab_engine_combat::generated_identities::specs::arms_warrior::PROOF);
451pub(crate) const SPELL_COUNT: usize = 21;
452const _: () = assert!(
453 SPELL_COUNT == 21,
454 "SPELL index ABI: count changed -- update positional hook consumers"
455);
456pub(crate) mod EFFECT {
457 pub(crate) const SEASONED_SOLDIER_CRIT: (u32, u8) = (279_423, 1);
459 pub(crate) const EXECUTE_DMG: (u32, u8) = (260_798, 1);
461 pub(crate) const EXECUTE_REFUND: (u32, u8) = (163_201, 2);
463 pub(crate) const CRITICAL_THINKING_REFUND: (u32, u8) = (389_306, 2);
465 pub(crate) const MASSACRE_PCT: (u32, u8) = (281_001, 2);
467 pub(crate) const MORTAL_STRIKE_DMG: (u32, u8) = (12294, 1);
469 pub(crate) const BLADESTORM_PERIOD: (u32, u8) = (227_847, 1);
471 pub(crate) const OVERPOWER_DMG: (u32, u8) = (7384, 1);
473 pub(crate) const TACTICIAN_CHANCE: (u32, u8) = (184_783, 1);
475 pub(crate) const ANGER_MANAGEMENT_DIV: (u32, u8) = (152_278, 1);
477 pub(crate) const FATALITY_CHANCE: (u32, u8) = (383_703, 1);
479 pub(crate) const FATALITY_DMG: (u32, u8) = (383_706, 1);
481 pub(crate) const DREADNAUGHT_DMG: (u32, u8) = (315_961, 1);
483 pub(crate) const SLAYERS_STRIKE_DMG: (u32, u8) = (445_579, 1);
485 pub(crate) const IMMINENT_DEMISE_EVERY: (u32, u8) = (444_769, 1);
487 pub(crate) const REAP_DMG: (u32, u8) = (446_005, 1);
489 pub(crate) const OVERPOWERING_FINISH_BELOW: (u32, u8) = (400_205, 2);
491 pub(crate) const OVERPOWERING_FINISH_PCT: (u32, u8) = (400_205, 1);
493 pub(crate) const FROTHING_REFUND: (u32, u8) = (392_792, 1);
495 pub(crate) const UNRELENTING_CDR_S: (u32, u8) = (444_780, 1);
497 pub(crate) const UNRELENTING_OVERWHELMED: (u32, u8) = (444_780, 2);
499 pub(crate) const MID2_MORTAL_STRIKE_EXECUTE_DAMAGE: (u32, u8) = (1_296_643, 1);
501 pub(crate) const MID2_OVERPOWER_DAMAGE: (u32, u8) = (1_296_644, 1);
503 pub(crate) const MID2_CONCUSSIVE_SLAM_DAMAGE: (u32, u8) = (1_300_660, 1);
505 pub(crate) const MID2_CONCUSSIVE_SLAM_REDUCED_TARGETS: (u32, u8) = (1_300_660, 2);
507}
508static REPORTED_SPELLS: &[(&str, u32)] = &[("concussive_slam", 1_300_660)];
509static DECLARED_SPELL_IDS: &[u32] = &[
510 12294, 7384, 163_201, 1464, 167_105, 107_574, 260_708, 845, 1680, 772, 6343,
511 1_269_383, 376_079, 6673, 57755, 260_798, 315_961, 383_706, 227_847, 228_920,
512 436_358, 208_086, 262_115, 388_539, 52437, 316_440, 386_631, 334_783, 383_704,
513 386_164, 1_300_670, 386_633, 445_606, 458_689, 445_584, 445_836, 1_269_391,
514 1_269_394, 152_278, 386_630, 389_306, 382_764, 1_261_060, 262_150, 386_634, 383_703,
515 444_773, 392_792, 444_769, 383_430, 316_405, 385_571, 1_273_062, 281_001, 1_269_314,
516 1_261_062, 400_205, 444_772, 382_767, 444_775, 383_341, 444_767, 400_803, 29725,
517 184_783, 386_628, 444_780, 262_231, 6603, 279_423, 445_579, 446_005, 1_258_398,
518 1_296_643, 1_296_644, 1_300_660, 446_918, 456_120, 1_270_731, 440_884, 440_886,
519 440_888, 1_270_846, 1_270_843, 440_989, 1_270_840, 447_513,
520];
521static DECLARED_AURA_IDS: &[u32] = &[
522 208_086, 262_115, 388_539, 260_708, 107_574, 52437, 316_440, 386_631, 334_783,
523 383_704, 6673, 386_164, 1_300_670, 228_920, 227_847, 386_633, 445_606, 458_689,
524 445_584, 445_836, 1_269_391, 1_269_394, 446_918, 456_120, 1_270_731, 1_270_846,
525 1_270_843, 440_989, 1_270_840, 447_513,
526];
527static TALENTS: &[(&str, u32)] = &[
528 ("ANGER_MANAGEMENT", TALENT::ANGER_MANAGEMENT),
529 ("BATTLELORD", TALENT::BATTLELORD),
530 ("BATTLE_STANCE", TALENT::BATTLE_STANCE),
531 ("CRITICAL_THINKING", TALENT::CRITICAL_THINKING),
532 ("CRUSHING_FORCE", TALENT::CRUSHING_FORCE),
533 ("DEEP_WOUNDS", TALENT::DEEP_WOUNDS),
534 ("DREADNAUGHT", TALENT::DREADNAUGHT),
535 ("EXECUTIONERS_PRECISION", TALENT::EXECUTIONERS_PRECISION),
536 ("FATALITY", TALENT::FATALITY),
537 ("FIERCE_FOLLOWTHROUGH", TALENT::FIERCE_FOLLOWTHROUGH),
538 ("FROTHING_BERSERKER", TALENT::FROTHING_BERSERKER),
539 ("IMMINENT_DEMISE", TALENT::IMMINENT_DEMISE),
540 ("IMPALE", TALENT::IMPALE),
541 ("IMPROVED_EXECUTE", TALENT::IMPROVED_EXECUTE),
542 ("IMPROVED_OVERPOWER", TALENT::IMPROVED_OVERPOWER),
543 ("MARTIAL_PROWESS", TALENT::MARTIAL_PROWESS),
544 ("MASSACRE", TALENT::MASSACRE),
545 ("MASTER_OF_WARFARE", TALENT::MASTER_OF_WARFARE),
546 ("MORTAL_WOUNDS", TALENT::MORTAL_WOUNDS),
547 ("OVERPOWERING_FINISH", TALENT::OVERPOWERING_FINISH),
548 ("OVERWHELMING_BLADES", TALENT::OVERWHELMING_BLADES),
549 ("OVERWHELMING_RAGE", TALENT::OVERWHELMING_RAGE),
550 ("RAVAGER", TALENT::RAVAGER),
551 ("REAP_THE_STORM", TALENT::REAP_THE_STORM),
552 ("SHARPENED_BLADES", TALENT::SHARPENED_BLADES),
553 ("SLAYERS_DOMINANCE", TALENT::SLAYERS_DOMINANCE),
554 ("STRENGTH_OF_ARMS", TALENT::STRENGTH_OF_ARMS),
555 ("SUDDEN_DEATH", TALENT::SUDDEN_DEATH),
556 ("TACTICIAN", TALENT::TACTICIAN),
557 ("UNHINGED", TALENT::UNHINGED),
558 ("UNRELENTING_ONSLAUGHT", TALENT::UNRELENTING_ONSLAUGHT),
559 ("WAR_MACHINE", TALENT::WAR_MACHINE),
560];
561pub(crate) mod ARMS_WARRIOR {
562 pub(crate) const MORTAL_STRIKE_CASTS: u32 = 0;
563 pub(crate) const OVERPOWER_CASTS: u32 = 1;
564 pub(crate) const EXECUTE_CASTS: u32 = 2;
565 pub(crate) const SLAM_CASTS: u32 = 3;
566 pub(crate) const COLOSSUS_SMASH_CASTS: u32 = 4;
567 pub(crate) const BLADESTORM_CASTS: u32 = 5;
568 pub(crate) const AVATAR_CASTS: u32 = 6;
569 pub(crate) const COLOSSUS_SMASH_UPTIME_MS: u32 = 7;
570 pub(crate) const AVATAR_UPTIME_MS: u32 = 8;
571}
572fn aura_colossus_smash(
573 a: AuraDefinitionDraft,
574 data: &ResolvedGameData,
575) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
576 Ok(
577 a
578 .on_target()
579 .apply_base_from_data(data, 208_086)?
580 .max_stacks(
581 data
582 .require_aura_max_stacks(
583 wowlab_types::sim::SpellIdx::from_raw(208_086),
584 )?,
585 ),
586 )
587}
588fn aura_deep_wounds(
589 a: AuraDefinitionDraft,
590 data: &ResolvedGameData,
591) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
592 Ok(
593 a
594 .on_target()
595 .apply_base_from_data(data, 262_115)?
596 .max_stacks(
597 data
598 .require_aura_max_stacks(
599 wowlab_types::sim::SpellIdx::from_raw(262_115),
600 )?,
601 ),
602 )
603}
604fn aura_rend(
605 a: AuraDefinitionDraft,
606 data: &ResolvedGameData,
607) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
608 Ok(
609 a
610 .on_target()
611 .apply_base_from_data(data, 388_539)?
612 .max_stacks(
613 data
614 .require_aura_max_stacks(
615 wowlab_types::sim::SpellIdx::from_raw(388_539),
616 )?,
617 ),
618 )
619}
620fn aura_sweeping_strikes(
621 a: AuraDefinitionDraft,
622 data: &ResolvedGameData,
623) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
624 Ok(
625 a
626 .on_player()
627 .apply_base_from_data(data, 260_708)?
628 .max_stacks(
629 data
630 .require_aura_max_stacks(
631 wowlab_types::sim::SpellIdx::from_raw(260_708),
632 )?,
633 ),
634 )
635}
636fn aura_avatar(
637 a: AuraDefinitionDraft,
638 data: &ResolvedGameData,
639) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
640 Ok(
641 a
642 .on_player()
643 .apply_base_from_data(data, 107_574)?
644 .max_stacks(
645 data
646 .require_aura_max_stacks(
647 wowlab_types::sim::SpellIdx::from_raw(107_574),
648 )?,
649 ),
650 )
651}
652fn aura_sudden_death(
653 a: AuraDefinitionDraft,
654 data: &ResolvedGameData,
655) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
656 Ok(
657 a
658 .on_player()
659 .apply_base_from_data(data, 52437)?
660 .max_stacks(
661 data
662 .require_aura_max_stacks(
663 wowlab_types::sim::SpellIdx::from_raw(52437),
664 )?,
665 ),
666 )
667}
668fn aura_martial_prowess(
669 a: AuraDefinitionDraft,
670 data: &ResolvedGameData,
671) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
672 Ok(
673 a
674 .on_player()
675 .apply_base_from_data(data, 316_440)?
676 .max_stacks(
677 data
678 .require_aura_max_stacks(
679 wowlab_types::sim::SpellIdx::from_raw(316_440),
680 )?,
681 ),
682 )
683}
684fn aura_battlelord(
685 a: AuraDefinitionDraft,
686 data: &ResolvedGameData,
687) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
688 Ok(
689 a
690 .on_player()
691 .apply_base_from_data(data, 386_631)?
692 .max_stacks(
693 data
694 .require_aura_max_stacks(
695 wowlab_types::sim::SpellIdx::from_raw(386_631),
696 )?,
697 ),
698 )
699}
700fn aura_collateral_damage(
701 a: AuraDefinitionDraft,
702 data: &ResolvedGameData,
703) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
704 Ok(
705 a
706 .on_player()
707 .apply_base_from_data(data, 334_783)?
708 .max_stacks(
709 data
710 .require_aura_max_stacks(
711 wowlab_types::sim::SpellIdx::from_raw(334_783),
712 )?,
713 ),
714 )
715}
716fn aura_fatal_mark(
717 a: AuraDefinitionDraft,
718 data: &ResolvedGameData,
719) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
720 Ok(
721 a
722 .on_target()
723 .apply_base_from_data(data, 383_704)?
724 .max_stacks(
725 data
726 .require_aura_max_stacks(
727 wowlab_types::sim::SpellIdx::from_raw(383_704),
728 )?,
729 ),
730 )
731}
732fn aura_battle_shout(
733 a: AuraDefinitionDraft,
734 data: &ResolvedGameData,
735) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
736 a.on_player()
737 .apply_base_from_data(data, 6673)?
738 .max_stacks(
739 data.require_aura_max_stacks(wowlab_types::sim::SpellIdx::from_raw(6673))?,
740 )
741 .attack_power_pct_per_stack(
742 data.base_points(wowlab_types::sim::SpellIdx::from_raw(6673), 1),
743 )
744}
745fn aura_battle_stance(
746 a: AuraDefinitionDraft,
747 data: &ResolvedGameData,
748) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
749 Ok(
750 a
751 .on_player()
752 .apply_base_from_data(data, 386_164)?
753 .max_stacks(
754 data
755 .require_aura_max_stacks(
756 wowlab_types::sim::SpellIdx::from_raw(386_164),
757 )?,
758 ),
759 )
760}
761fn aura_winding_up(
762 a: AuraDefinitionDraft,
763 data: &ResolvedGameData,
764) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
765 a.on_player()
766 .apply_base_from_data(data, 1_300_670)?
767 .max_stacks(
768 wowlab_engine_combat::validated_max_stacks(
769 5.0,
770 1_300_670,
771 "aura.max_stacks",
772 )?,
773 )
774 .damage_percent_spells_linear(
775 data.base_points(wowlab_types::sim::SpellIdx::from_raw(1_300_670), 1),
776 &[1464, 1_269_383],
777 )
778}
779fn aura_ravager(
780 a: AuraDefinitionDraft,
781 data: &ResolvedGameData,
782) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
783 Ok(
784 a
785 .on_player()
786 .apply_base_from_data(data, 228_920)?
787 .max_stacks(
788 data
789 .require_aura_max_stacks(
790 wowlab_types::sim::SpellIdx::from_raw(228_920),
791 )?,
792 ),
793 )
794}
795fn aura_bladestorm(
796 a: AuraDefinitionDraft,
797 data: &ResolvedGameData,
798) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
799 Ok(
800 a
801 .on_player()
802 .apply_base_from_data(data, 227_847)?
803 .max_stacks(
804 data
805 .require_aura_max_stacks(
806 wowlab_types::sim::SpellIdx::from_raw(227_847),
807 )?,
808 ),
809 )
810}
811fn aura_executioners_precision(
812 a: AuraDefinitionDraft,
813 data: &ResolvedGameData,
814) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
815 Ok(
816 a
817 .on_player()
818 .apply_base_from_data(data, 386_633)?
819 .max_stacks(
820 data
821 .require_aura_max_stacks(
822 wowlab_types::sim::SpellIdx::from_raw(386_633),
823 )?,
824 ),
825 )
826}
827fn aura_imminent_demise(
828 a: AuraDefinitionDraft,
829 data: &ResolvedGameData,
830) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
831 Ok(
832 a
833 .on_player()
834 .apply_base_from_data(data, 445_606)?
835 .max_stacks(
836 data
837 .require_aura_max_stacks(
838 wowlab_types::sim::SpellIdx::from_raw(445_606),
839 )?,
840 ),
841 )
842}
843fn aura_fierce_followthrough(
844 a: AuraDefinitionDraft,
845 data: &ResolvedGameData,
846) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
847 Ok(
848 a
849 .on_player()
850 .apply_base_from_data(data, 458_689)?
851 .max_stacks(
852 data
853 .require_aura_max_stacks(
854 wowlab_types::sim::SpellIdx::from_raw(458_689),
855 )?,
856 ),
857 )
858}
859fn aura_executioner(
860 a: AuraDefinitionDraft,
861 data: &ResolvedGameData,
862) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
863 Ok(
864 a
865 .on_player()
866 .apply_base_from_data(data, 445_584)?
867 .max_stacks(
868 data
869 .require_aura_max_stacks(
870 wowlab_types::sim::SpellIdx::from_raw(445_584),
871 )?,
872 ),
873 )
874}
875fn aura_overwhelmed(
876 a: AuraDefinitionDraft,
877 data: &ResolvedGameData,
878) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
879 Ok(
880 a
881 .on_target()
882 .apply_base_from_data(data, 445_836)?
883 .max_stacks(
884 data
885 .require_aura_max_stacks(
886 wowlab_types::sim::SpellIdx::from_raw(445_836),
887 )?,
888 ),
889 )
890}
891fn aura_master_of_warfare(
892 a: AuraDefinitionDraft,
893 data: &ResolvedGameData,
894) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
895 Ok(
896 a
897 .on_player()
898 .apply_base_from_data(data, 1_269_391)?
899 .max_stacks(
900 data
901 .require_aura_max_stacks(
902 wowlab_types::sim::SpellIdx::from_raw(1_269_391),
903 )?,
904 ),
905 )
906}
907fn aura_master_of_warfare_damage(
908 a: AuraDefinitionDraft,
909 data: &ResolvedGameData,
910) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
911 Ok(
912 a
913 .on_player()
914 .apply_base_from_data(data, 1_269_394)?
915 .max_stacks(
916 data
917 .require_aura_max_stacks(
918 wowlab_types::sim::SpellIdx::from_raw(1_269_394),
919 )?,
920 ),
921 )
922}
923fn spell_mortal_strike(
924 s: SpellDefinitionDraft,
925 data: &ResolvedGameData,
926) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
927 Ok(
928 s
929 .apply_base_from_data(data, 12294)?
930 .apply_aoe_from_data(data)
931 .on_cast(crate::hooks::arms_warrior::mortal_strike_hook),
932 )
933}
934fn spell_overpower(
935 s: SpellDefinitionDraft,
936 data: &ResolvedGameData,
937) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
938 Ok(
939 s
940 .apply_base_from_data(data, 7384)?
941 .apply_aoe_from_data(data)
942 .on_cast(crate::hooks::arms_warrior::overpower_hook),
943 )
944}
945fn spell_execute(
946 s: SpellDefinitionDraft,
947 data: &ResolvedGameData,
948) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
949 Ok(
950 s
951 .apply_base_from_data(data, 163_201)?
952 .apply_aoe_from_data(data)
953 .on_cast(crate::hooks::arms_warrior::execute_hook)
954 .cost_free_when_aura(52437),
955 )
956}
957fn spell_slam(
958 s: SpellDefinitionDraft,
959 data: &ResolvedGameData,
960) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
961 Ok(
962 s
963 .apply_base_from_data(data, 1464)?
964 .apply_aoe_from_data(data)
965 .on_cast(crate::hooks::arms_warrior::slam_hook),
966 )
967}
968fn spell_colossus_smash(
969 s: SpellDefinitionDraft,
970 data: &ResolvedGameData,
971) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
972 Ok(
973 s
974 .apply_base_from_data(data, 167_105)?
975 .applies_aura(AURA_COLOSSUS_SMASH)
976 .apply_aoe_from_data(data)
977 .on_cast(crate::hooks::arms_warrior::colossus_smash_hook),
978 )
979}
980fn spell_avatar(
981 s: SpellDefinitionDraft,
982 data: &ResolvedGameData,
983) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
984 Ok(
985 s
986 .apply_base_from_data(data, 107_574)?
987 .applies_inferred_aura(AURA_AVATAR, 107_574)
988 .apply_aoe_from_data(data),
989 )
990}
991fn spell_sweeping_strikes(
992 s: SpellDefinitionDraft,
993 data: &ResolvedGameData,
994) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
995 Ok(
996 s
997 .apply_base_from_data(data, 260_708)?
998 .applies_inferred_aura(AURA_SWEEPING_STRIKES, 260_708)
999 .apply_aoe_from_data(data),
1000 )
1001}
1002fn spell_cleave(
1003 s: SpellDefinitionDraft,
1004 data: &ResolvedGameData,
1005) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1006 Ok(s.apply_base_from_data(data, 845)?.apply_aoe_from_data(data))
1007}
1008fn spell_whirlwind(
1009 s: SpellDefinitionDraft,
1010 data: &ResolvedGameData,
1011) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1012 Ok(s.apply_base_from_data(data, 1680)?.apply_aoe_from_data(data))
1013}
1014fn spell_rend(
1015 s: SpellDefinitionDraft,
1016 data: &ResolvedGameData,
1017) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1018 Ok(
1019 s
1020 .apply_base_from_data(data, 772)?
1021 .applies_aura(AURA_REND)
1022 .apply_aoe_from_data(data)
1023 .on_cast(crate::hooks::arms_warrior::rend_hook),
1024 )
1025}
1026fn spell_thunder_clap(
1027 s: SpellDefinitionDraft,
1028 data: &ResolvedGameData,
1029) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1030 Ok(
1031 s
1032 .apply_base_from_data(data, 6343)?
1033 .gain(5.0)
1034 .apply_aoe_from_data(data)
1035 .on_cast(crate::hooks::arms_warrior::thunder_clap_hook),
1036 )
1037}
1038fn spell_heroic_strike(
1039 s: SpellDefinitionDraft,
1040 data: &ResolvedGameData,
1041) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1042 Ok(s.apply_base_from_data(data, 1_269_383)?.apply_aoe_from_data(data))
1043}
1044fn spell_champions_spear(
1045 s: SpellDefinitionDraft,
1046 data: &ResolvedGameData,
1047) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1048 Ok(s.apply_base_from_data(data, 376_079)?.apply_aoe_from_data(data))
1049}
1050fn spell_battle_shout(
1051 s: SpellDefinitionDraft,
1052 data: &ResolvedGameData,
1053) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1054 Ok(
1055 s
1056 .apply_base_from_data(data, 6673)?
1057 .applies_inferred_aura(AURA_BATTLE_SHOUT, 6673)
1058 .apply_aoe_from_data(data),
1059 )
1060}
1061fn spell_heroic_throw(
1062 s: SpellDefinitionDraft,
1063 data: &ResolvedGameData,
1064) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1065 Ok(s.apply_base_from_data(data, 57755)?.apply_aoe_from_data(data))
1066}
1067fn spell_execute_damage(
1068 s: SpellDefinitionDraft,
1069 data: &ResolvedGameData,
1070) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1071 Ok(s.apply_base_from_data(data, 260_798)?.apply_aoe_from_data(data))
1072}
1073fn spell_dreadnaught(
1074 s: SpellDefinitionDraft,
1075 data: &ResolvedGameData,
1076) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1077 Ok(s.apply_base_from_data(data, 315_961)?.apply_aoe_from_data(data))
1078}
1079fn spell_fatality(
1080 s: SpellDefinitionDraft,
1081 data: &ResolvedGameData,
1082) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1083 Ok(s.apply_base_from_data(data, 383_706)?.apply_aoe_from_data(data))
1084}
1085fn spell_bladestorm(
1086 s: SpellDefinitionDraft,
1087 data: &ResolvedGameData,
1088) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1089 Ok(
1090 s
1091 .apply_base_from_data(data, 227_847)?
1092 .applies_inferred_aura(AURA_BLADESTORM, 227_847)
1093 .apply_aoe_from_data(data)
1094 .on_cast(crate::hooks::arms_warrior::bladestorm_hook),
1095 )
1096}
1097fn spell_ravager(
1098 s: SpellDefinitionDraft,
1099 data: &ResolvedGameData,
1100) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1101 Ok(
1102 s
1103 .apply_base_from_data(data, 228_920)?
1104 .applies_inferred_aura(AURA_RAVAGER, 228_920)
1105 .apply_aoe_from_data(data),
1106 )
1107}
1108fn spell_demolish(
1109 s: SpellDefinitionDraft,
1110 data: &ResolvedGameData,
1111) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1112 Ok(s.apply_base_from_data(data, 436_358)?.apply_aoe_from_data(data))
1113}
1114pub(crate) fn build_combat_system_draft(
1115 params: &wowlab_engine_ports::HandlerParams<'_>,
1116) -> Result<CombatSystemDraft, wowlab_engine_ports::EngineError> {
1117 let builder = CombatSystemBuilder::new(params.stats.clone())
1118 .spec_id(SpecId::Arms)
1119 .spec_identity(
1120 wowlab_engine_combat::generated_identities::specs::arms_warrior::PROOF,
1121 )
1122 .hero_talent_trees(DECLARED_METADATA.hero_talent_trees)
1123 .effect_identities(
1124 wowlab_engine_combat::generated_identities::specs::arms_warrior::damage::ALL,
1125 )
1126 .effect_identities(wowlab_engine_combat::generated_identities::shared::ALL)
1127 .mastery_spell(1_258_398)
1128 .mastery_hook(crate::hooks::arms_warrior::mastery)
1129 .resource(
1130 "rage",
1131 params
1132 .game_data
1133 .power_max(1)
1134 .ok_or_else(|| {
1135 wowlab_engine_ports::EngineError::spec_construction(
1136 "missing power-type power_max for type_id 1",
1137 )
1138 })?,
1139 params
1140 .game_data
1141 .power_regen_for_max(
1142 1,
1143 params
1144 .game_data
1145 .power_max(1)
1146 .ok_or_else(|| {
1147 wowlab_engine_ports::EngineError::spec_construction(
1148 "missing power-type power_max for type_id 1",
1149 )
1150 })?,
1151 )
1152 .ok_or_else(|| {
1153 wowlab_engine_ports::EngineError::spec_construction(
1154 "missing power-type power_regen_for_max for type_id 1",
1155 )
1156 })?,
1157 )
1158 .resource_type_id(1)
1159 .resource_start(
1160 params
1161 .game_data
1162 .power_default(1)
1163 .ok_or_else(|| {
1164 wowlab_engine_ports::EngineError::spec_construction(
1165 "missing power-type power_default for type_id 1",
1166 )
1167 })?,
1168 )
1169 .aura(
1170 "colossus_smash",
1171 AURA::COLOSSUS_SMASH,
1172 |a| aura_colossus_smash(a, ¶ms.game_data),
1173 )
1174 .aura(
1175 "deep_wounds",
1176 AURA::DEEP_WOUNDS,
1177 |a| aura_deep_wounds(a, ¶ms.game_data),
1178 )
1179 .aura("rend", AURA::REND, |a| aura_rend(a, ¶ms.game_data))
1180 .aura(
1181 "sweeping_strikes",
1182 AURA::SWEEPING_STRIKES,
1183 |a| aura_sweeping_strikes(a, ¶ms.game_data),
1184 )
1185 .aura("avatar", AURA::AVATAR, |a| aura_avatar(a, ¶ms.game_data))
1186 .aura(
1187 "sudden_death",
1188 AURA::SUDDEN_DEATH,
1189 |a| aura_sudden_death(a, ¶ms.game_data),
1190 )
1191 .aura(
1192 "martial_prowess",
1193 AURA::MARTIAL_PROWESS,
1194 |a| aura_martial_prowess(a, ¶ms.game_data),
1195 )
1196 .aura("battlelord", AURA::BATTLELORD, |a| aura_battlelord(a, ¶ms.game_data))
1197 .aura(
1198 "collateral_damage",
1199 AURA::COLLATERAL_DAMAGE,
1200 |a| aura_collateral_damage(a, ¶ms.game_data),
1201 )
1202 .aura("fatal_mark", AURA::FATAL_MARK, |a| aura_fatal_mark(a, ¶ms.game_data))
1203 .aura(
1204 "battle_shout",
1205 AURA::BATTLE_SHOUT,
1206 |a| aura_battle_shout(a, ¶ms.game_data),
1207 )
1208 .aura(
1209 "battle_stance",
1210 AURA::BATTLE_STANCE,
1211 |a| aura_battle_stance(a, ¶ms.game_data),
1212 )
1213 .aura("winding_up", AURA::WINDING_UP, |a| aura_winding_up(a, ¶ms.game_data))
1214 .aura("ravager", AURA::RAVAGER, |a| aura_ravager(a, ¶ms.game_data))
1215 .aura("bladestorm", AURA::BLADESTORM, |a| aura_bladestorm(a, ¶ms.game_data))
1216 .aura(
1217 "executioners_precision",
1218 AURA::EXECUTIONERS_PRECISION,
1219 |a| aura_executioners_precision(a, ¶ms.game_data),
1220 )
1221 .aura(
1222 "imminent_demise",
1223 AURA::IMMINENT_DEMISE,
1224 |a| aura_imminent_demise(a, ¶ms.game_data),
1225 )
1226 .aura(
1227 "fierce_followthrough",
1228 AURA::FIERCE_FOLLOWTHROUGH,
1229 |a| aura_fierce_followthrough(a, ¶ms.game_data),
1230 )
1231 .aura(
1232 "executioner",
1233 AURA::EXECUTIONER,
1234 |a| aura_executioner(a, ¶ms.game_data),
1235 )
1236 .aura(
1237 "overwhelmed",
1238 AURA::OVERWHELMED,
1239 |a| aura_overwhelmed(a, ¶ms.game_data),
1240 )
1241 .aura(
1242 "master_of_warfare",
1243 AURA::MASTER_OF_WARFARE,
1244 |a| aura_master_of_warfare(a, ¶ms.game_data),
1245 )
1246 .aura(
1247 "master_of_warfare_damage",
1248 AURA::MASTER_OF_WARFARE_DAMAGE,
1249 |a| aura_master_of_warfare_damage(a, ¶ms.game_data),
1250 )
1251 .spell(
1252 "mortal_strike",
1253 SPELL::MORTAL_STRIKE,
1254 |s| spell_mortal_strike(s, ¶ms.game_data),
1255 )
1256 .spell("overpower", SPELL::OVERPOWER, |s| spell_overpower(s, ¶ms.game_data))
1257 .spell("execute", SPELL::EXECUTE, |s| spell_execute(s, ¶ms.game_data))
1258 .spell("slam", SPELL::SLAM, |s| spell_slam(s, ¶ms.game_data))
1259 .spell(
1260 "colossus_smash",
1261 SPELL::COLOSSUS_SMASH,
1262 |s| spell_colossus_smash(s, ¶ms.game_data),
1263 )
1264 .spell("avatar", SPELL::AVATAR, |s| spell_avatar(s, ¶ms.game_data))
1265 .spell(
1266 "sweeping_strikes",
1267 SPELL::SWEEPING_STRIKES,
1268 |s| spell_sweeping_strikes(s, ¶ms.game_data),
1269 )
1270 .spell("cleave", SPELL::CLEAVE, |s| spell_cleave(s, ¶ms.game_data))
1271 .spell("whirlwind", SPELL::WHIRLWIND, |s| spell_whirlwind(s, ¶ms.game_data))
1272 .spell("rend", SPELL::REND, |s| spell_rend(s, ¶ms.game_data))
1273 .spell(
1274 "thunder_clap",
1275 SPELL::THUNDER_CLAP,
1276 |s| spell_thunder_clap(s, ¶ms.game_data),
1277 )
1278 .spell(
1279 "heroic_strike",
1280 SPELL::HEROIC_STRIKE,
1281 |s| spell_heroic_strike(s, ¶ms.game_data),
1282 )
1283 .spell(
1284 "champions_spear",
1285 SPELL::CHAMPIONS_SPEAR,
1286 |s| spell_champions_spear(s, ¶ms.game_data),
1287 )
1288 .spell(
1289 "battle_shout",
1290 SPELL::BATTLE_SHOUT,
1291 |s| spell_battle_shout(s, ¶ms.game_data),
1292 )
1293 .spell(
1294 "heroic_throw",
1295 SPELL::HEROIC_THROW,
1296 |s| spell_heroic_throw(s, ¶ms.game_data),
1297 )
1298 .spell(
1299 "execute_damage",
1300 SPELL::EXECUTE_DAMAGE,
1301 |s| spell_execute_damage(s, ¶ms.game_data),
1302 )
1303 .spell(
1304 "dreadnaught",
1305 SPELL::DREADNAUGHT,
1306 |s| spell_dreadnaught(s, ¶ms.game_data),
1307 )
1308 .spell("fatality", SPELL::FATALITY, |s| spell_fatality(s, ¶ms.game_data))
1309 .spell(
1310 "bladestorm",
1311 SPELL::BLADESTORM,
1312 |s| spell_bladestorm(s, ¶ms.game_data),
1313 )
1314 .spell("ravager", SPELL::RAVAGER, |s| spell_ravager(s, ¶ms.game_data))
1315 .spell("demolish", SPELL::DEMOLISH, |s| spell_demolish(s, ¶ms.game_data))
1316 .auto_attack(|a| {
1317 a
1318 .spell_id(6603)
1319 .swing_ms(3600)
1320 .apply_base_from_data(¶ms.game_data)
1321 .on_swing(crate::hooks::arms_warrior::swing_hook)
1322 })
1323 .game_data(params.game_data.clone())
1324 .talent_spell_ids(TALENTS)
1325 .talent_selections(params.talent_selections)
1326 .set_bonus_auras(params.set_bonus_auras)
1327 .encounter(params.encounter.clone());
1328 let builder = crate::generated::items::register_equipped(
1329 builder,
1330 ¶ms.game_data,
1331 params.equipped_items,
1332 )?;
1333
1334 builder.into_draft()
1335}
1336fn new_handler(
1337 params: wowlab_engine_ports::HandlerParams<'_>,
1338) -> Result<Box<dyn SpecHandler>, wowlab_engine_ports::EngineError> {
1339 let handler = crate::composition::compose_handler(
1340 build_combat_system_draft,
1341 ¶ms,
1342 crate::hooks::arms_warrior::ArmsHandler::try_new,
1343 )?;
1344
1345 Ok(Box::new(handler))
1346}
1347static DECLARED_METADATA: DeclaredSpecMetadata = DeclaredSpecMetadata {
1348 primary_resource: ResourceType::Rage,
1349 secondary_resource: None,
1350 spell_ids: DECLARED_SPELL_IDS,
1351 aura_ids: DECLARED_AURA_IDS,
1352 server_proc_entries: &[
1353 DeclaredServerProcEntry {
1354 spell_id: 52437,
1355 attributes: ProcAttributes::REQUIRE_SPELL_MODIFIER.bits()
1356 | ProcAttributes::USE_STACKS_FOR_CHARGES.bits(),
1357 },
1358 ],
1359 talents: TALENTS,
1360 rotation_field_schema: &[],
1361 metrics_plugin_id: None,
1362 hero_talent_trees: &[
1363 HeroTalentTreeDesc {
1364 name: "Slayer",
1365 spells: HERO_TREE_SLAYER_SPELLS,
1366 auras: HERO_TREE_SLAYER_AURAS,
1367 },
1368 HeroTalentTreeDesc {
1369 name: "Colossus",
1370 spells: HERO_TREE_COLOSSUS_SPELLS,
1371 auras: HERO_TREE_COLOSSUS_AURAS,
1372 },
1373 ],
1374 reported_spells: REPORTED_SPELLS,
1375 masked_passive_effects: &[],
1376 passive_effect_overrides: &[],
1377};
1378pub(super) const SPEC_DESCRIPTOR: SpecDescriptor = SpecDescriptor {
1379 spec_id: SpecId::Arms,
1380 display_name: "Arms Warrior",
1381 metadata: DECLARED_METADATA,
1382 handler_factory: new_handler,
1383};
1384wowlab_engine_combat::smoke_test!(build_combat_system_draft);