Skip to main content

wowlab_engine_content/generated/specs/
beast_mastery_hunter.rs

1//! @generated by codegen-cli from manifests/specs/hunter/beast_mastery/manifest.toml -- do not edit by hand.
2// Generated code: naming follows game data conventions
3#![allow(non_snake_case, dead_code)]
4use wowlab_types::{combat::ResourceType, game::SpecId};
5use wowlab_engine_combat::{
6    CombatSystemBuilder, CombatSystemDraft, AuraDefinitionDraft, LocalAuraIdx,
7    LocalSpellIdx, SpellDefinitionDraft,
8};
9use wowlab_engine_ports::{
10    DeclaredSpecMetadata, SpecDescriptor, SpecHandler, HeroTalentTreeDesc,
11};
12use wowlab_engine_gamedata::ResolvedGameData;
13pub(crate) mod SPELL {
14    ///<https://wowlab.gg/inspect/spell/34026>
15    pub(crate) const KILL_COMMAND: u32 = 34026;
16    ///<https://wowlab.gg/inspect/spell/217200>
17    pub(crate) const BARBED_SHOT: u32 = 217_200;
18    ///<https://wowlab.gg/inspect/spell/19574>
19    pub(crate) const BESTIAL_WRATH: u32 = 19574;
20    ///<https://wowlab.gg/inspect/spell/193455>
21    pub(crate) const COBRA_SHOT: u32 = 193_455;
22    ///<https://wowlab.gg/inspect/spell/56641>
23    pub(crate) const STEADY_SHOT: u32 = 56641;
24    ///<https://wowlab.gg/inspect/spell/466930>
25    pub(crate) const BLACK_ARROW: u32 = 466_930;
26    ///<https://wowlab.gg/inspect/spell/1264359>
27    pub(crate) const WILD_THRASH: u32 = 1_264_359;
28    ///<https://wowlab.gg/inspect/spell/982>
29    pub(crate) const REVIVE_PET: u32 = 982;
30    ///<https://wowlab.gg/inspect/spell/883>
31    pub(crate) const CALL_PET_1: u32 = 883;
32}
33pub(crate) mod AURA {
34    ///<https://wowlab.gg/inspect/spell/19574>
35    pub(crate) const BESTIAL_WRATH: u32 = 19574;
36    ///<https://wowlab.gg/inspect/spell/459529>
37    pub(crate) const UNNATURAL_CAUSES: u32 = 459_529;
38    ///<https://wowlab.gg/inspect/spell/217200>
39    pub(crate) const BARBED_SHOT_DOT: u32 = 217_200;
40    ///<https://wowlab.gg/inspect/spell/246152>
41    pub(crate) const BARBED_SHOT_REGEN: u32 = 246_152;
42    ///<https://wowlab.gg/inspect/spell/268877>
43    pub(crate) const BEAST_CLEAVE: u32 = 268_877;
44    ///<https://wowlab.gg/inspect/spell/1299389>
45    pub(crate) const COBRA_FANG: u32 = 1_299_389;
46    ///<https://wowlab.gg/inspect/spell/321538>
47    pub(crate) const BLOODSHED_DOT: u32 = 321_538;
48    ///<https://wowlab.gg/inspect/spell/219199>
49    pub(crate) const DIRE_BEAST_ACTIVE: u32 = 219_199;
50    ///<https://wowlab.gg/inspect/spell/1282474>
51    pub(crate) const NATURES_ALLY: u32 = 1_282_474;
52    ///<https://wowlab.gg/inspect/spell/1276720>
53    pub(crate) const NATURES_ALLY_KILL_COMMAND: u32 = 1_276_720;
54    ///<https://wowlab.gg/inspect/spell/1265063>
55    pub(crate) const BLOODY_FRENZY: u32 = 1_265_063;
56    ///<https://wowlab.gg/inspect/spell/462599>
57    pub(crate) const TRACK_PETS: u32 = 462_599;
58    ///<https://wowlab.gg/inspect/spell/471877>
59    pub(crate) const HOWL_COOLDOWN: u32 = 471_877;
60    ///<https://wowlab.gg/inspect/spell/471878>
61    pub(crate) const WYVERN_READY: u32 = 471_878;
62    ///<https://wowlab.gg/inspect/spell/472324>
63    pub(crate) const BOAR_READY: u32 = 472_324;
64    ///<https://wowlab.gg/inspect/spell/472325>
65    pub(crate) const BEAR_READY: u32 = 472_325;
66    ///<https://wowlab.gg/inspect/spell/471881>
67    pub(crate) const WYVERNS_CRY: u32 = 471_881;
68    ///<https://wowlab.gg/inspect/spell/459731>
69    pub(crate) const HUNTMASTERS_CALL: u32 = 459_731;
70    ///<https://wowlab.gg/inspect/spell/471993>
71    pub(crate) const BEAR_ACTIVE: u32 = 471_993;
72    ///<https://wowlab.gg/inspect/spell/471999>
73    pub(crate) const REND_FLESH: u32 = 471_999;
74}
75pub(crate) mod TALENT {
76    ///<https://wowlab.gg/inspect/spell/217200>
77    pub(crate) const BARBED_SHOT: u32 = 217_200;
78    ///<https://wowlab.gg/inspect/spell/19574>
79    pub(crate) const BESTIAL_WRATH: u32 = 19574;
80    ///<https://wowlab.gg/inspect/spell/466930>
81    pub(crate) const BLACK_ARROW: u32 = 466_930;
82    ///<https://wowlab.gg/inspect/spell/407412>
83    pub(crate) const BLOODY_FRENZY: u32 = 407_412;
84    ///<https://wowlab.gg/inspect/spell/120679>
85    pub(crate) const DIRE_BEAST: u32 = 120_679;
86    ///<https://wowlab.gg/inspect/spell/34026>
87    pub(crate) const KILL_COMMAND: u32 = 34026;
88    ///<https://wowlab.gg/inspect/spell/321014>
89    pub(crate) const PACK_TACTICS: u32 = 321_014;
90    ///<https://wowlab.gg/inspect/spell/459527>
91    pub(crate) const UNNATURAL_CAUSES: u32 = 459_527;
92    ///<https://wowlab.gg/inspect/spell/1264359>
93    pub(crate) const WILD_THRASH: u32 = 1_264_359;
94}
95pub(crate) mod SET_BONUS {
96    ///<https://wowlab.gg/inspect/spell/1296631>
97    pub(crate) const MID2_BM_2PC: u32 = 1_296_631;
98    ///<https://wowlab.gg/inspect/spell/1296632>
99    pub(crate) const MID2_BM_4PC: u32 = 1_296_632;
100}
101pub(crate) mod REPORTED_SPELL {
102    ///<https://wowlab.gg/inspect/spell/1299409>
103    pub(crate) const COBRA_CLEAVE: u32 = 1_299_409;
104}
105pub(crate) mod HERO {
106    pub(crate) mod PACK_LEADER {
107        pub(crate) mod SPELL {
108            ///<https://wowlab.gg/inspect/spell/471936>
109            pub(crate) const BOAR_CHARGE: u32 = 471_936;
110            ///<https://wowlab.gg/inspect/spell/471938>
111            pub(crate) const BOAR_CHARGE_CLEAVE: u32 = 471_938;
112            ///<https://wowlab.gg/inspect/spell/201594>
113            pub(crate) const STAMPEDE_TICK: u32 = 201_594;
114        }
115    }
116    pub(crate) mod BM_PETS {
117        pub(crate) mod SPELL {
118            ///<https://wowlab.gg/inspect/spell/118459>
119            pub(crate) const BEAST_CLEAVE: u32 = 118_459;
120            ///<https://wowlab.gg/inspect/spell/321538>
121            pub(crate) const BLOODSHED: u32 = 321_538;
122            ///<https://wowlab.gg/inspect/spell/16827>
123            pub(crate) const CLAW: u32 = 16827;
124            ///<https://wowlab.gg/inspect/spell/83381>
125            pub(crate) const KILL_COMMAND_PET: u32 = 83381;
126            ///<https://wowlab.gg/inspect/spell/6603>
127            pub(crate) const MELEE: u32 = 6603;
128            ///<https://wowlab.gg/inspect/spell/344572>
129            pub(crate) const PET_BESTIAL_WRATH: u32 = 344_572;
130            ///<https://wowlab.gg/inspect/spell/459753>
131            pub(crate) const RAVENOUS_LEAP: u32 = 459_753;
132            ///<https://wowlab.gg/inspect/spell/201754>
133            pub(crate) const STOMP: u32 = 201_754;
134            ///<https://wowlab.gg/inspect/spell/1232922>
135            pub(crate) const WILDSPEAKER_KILL_COMMAND: u32 = 1_232_922;
136            ///<https://wowlab.gg/inspect/spell/1264355>
137            pub(crate) const WILD_THRASH: u32 = 1_264_355;
138        }
139    }
140}
141static HERO_TREE_PACK_LEADER_SPELLS: &[(&str, u32)] = &[
142    ("BOAR_CHARGE", 471_936),
143    ("BOAR_CHARGE_CLEAVE", 471_938),
144    ("STAMPEDE_TICK", 201_594),
145];
146static HERO_TREE_PACK_LEADER_AURAS: &[(&str, u32)] = &[];
147static HERO_TREE_BM_PETS_SPELLS: &[(&str, u32)] = &[
148    ("BEAST_CLEAVE", 118_459),
149    ("BLOODSHED", 321_538),
150    ("CLAW", 16827),
151    ("KILL_COMMAND_PET", 83381),
152    ("MELEE", 6603),
153    ("PET_BESTIAL_WRATH", 344_572),
154    ("RAVENOUS_LEAP", 459_753),
155    ("STOMP", 201_754),
156    ("WILDSPEAKER_KILL_COMMAND", 1_232_922),
157    ("WILD_THRASH", 1_264_355),
158];
159static HERO_TREE_BM_PETS_AURAS: &[(&str, u32)] = &[];
160pub(crate) mod DAMAGE_SPELL {
161    pub(crate) const KILL_COMMAND: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::damage::ACTION::SPELL_34026;
162    pub(crate) const BARBED_SHOT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::damage::ACTION::SPELL_217200;
163    pub(crate) const BESTIAL_WRATH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::damage::ACTION::SPELL_19574;
164    pub(crate) const COBRA_SHOT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::damage::ACTION::SPELL_193455;
165    pub(crate) const STEADY_SHOT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::damage::ACTION::SPELL_56641;
166    pub(crate) const BLACK_ARROW: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::damage::ACTION::SPELL_466930;
167    pub(crate) const WILD_THRASH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::damage::ACTION::SPELL_1264359;
168    pub(crate) const REVIVE_PET: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::damage::ACTION::SPELL_982;
169    pub(crate) const CALL_PET_1: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::damage::ACTION::SPELL_883;
170    pub(crate) const BOAR_CHARGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::damage::ACTION::SPELL_471936;
171    pub(crate) const BOAR_CHARGE_CLEAVE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::damage::ACTION::SPELL_471938;
172    pub(crate) const STAMPEDE_TICK: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::damage::ACTION::SPELL_201594;
173    pub(crate) const BEAST_CLEAVE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::damage::ACTION::SPELL_118459;
174    pub(crate) const BLOODSHED: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::damage::ACTION::SPELL_321538;
175    pub(crate) const CLAW: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::damage::ACTION::SPELL_16827;
176    pub(crate) const KILL_COMMAND_PET: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::damage::ACTION::SPELL_83381;
177    pub(crate) const MELEE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::damage::ACTION::SPELL_6603;
178    pub(crate) const PET_BESTIAL_WRATH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::damage::ACTION::SPELL_344572;
179    pub(crate) const RAVENOUS_LEAP: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::damage::ACTION::SPELL_459753;
180    pub(crate) const STOMP: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::damage::ACTION::SPELL_201754;
181    pub(crate) const WILDSPEAKER_KILL_COMMAND: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::damage::ACTION::SPELL_1232922;
182}
183pub(crate) mod DAMAGE_AURA {
184    pub(crate) const BESTIAL_WRATH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::damage::ACTION::SPELL_19574;
185    pub(crate) const UNNATURAL_CAUSES: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::damage::ACTION::SPELL_459529;
186    pub(crate) const BARBED_SHOT_DOT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::damage::ACTION::SPELL_217200;
187    pub(crate) const BARBED_SHOT_REGEN: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::damage::ACTION::SPELL_246152;
188    pub(crate) const BEAST_CLEAVE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::damage::ACTION::SPELL_268877;
189    pub(crate) const COBRA_FANG: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::damage::ACTION::SPELL_1299389;
190    pub(crate) const BLOODSHED_DOT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::damage::ACTION::SPELL_321538;
191    pub(crate) const DIRE_BEAST_ACTIVE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::damage::ACTION::SPELL_219199;
192    pub(crate) const NATURES_ALLY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::damage::ACTION::SPELL_1282474;
193    pub(crate) const NATURES_ALLY_KILL_COMMAND: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::damage::ACTION::SPELL_1276720;
194    pub(crate) const BLOODY_FRENZY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::damage::ACTION::SPELL_1265063;
195    pub(crate) const TRACK_PETS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::damage::ACTION::SPELL_462599;
196    pub(crate) const HOWL_COOLDOWN: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::damage::ACTION::SPELL_471877;
197    pub(crate) const WYVERN_READY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::damage::ACTION::SPELL_471878;
198    pub(crate) const BOAR_READY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::damage::ACTION::SPELL_472324;
199    pub(crate) const BEAR_READY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::damage::ACTION::SPELL_472325;
200    pub(crate) const WYVERNS_CRY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::damage::ACTION::SPELL_471881;
201    pub(crate) const HUNTMASTERS_CALL: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::damage::ACTION::SPELL_459731;
202    pub(crate) const BEAR_ACTIVE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::damage::ACTION::SPELL_471993;
203    pub(crate) const REND_FLESH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::damage::ACTION::SPELL_471999;
204}
205pub(crate) mod DAMAGE_TALENT {
206    pub(crate) const BARBED_SHOT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::damage::ACTION::SPELL_217200;
207    pub(crate) const BESTIAL_WRATH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::damage::ACTION::SPELL_19574;
208    pub(crate) const BLACK_ARROW: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::damage::ACTION::SPELL_466930;
209    pub(crate) const BLOODY_FRENZY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::damage::ACTION::SPELL_407412;
210    pub(crate) const DIRE_BEAST: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::damage::ACTION::SPELL_120679;
211    pub(crate) const KILL_COMMAND: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::damage::ACTION::SPELL_34026;
212    pub(crate) const PACK_TACTICS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::damage::ACTION::SPELL_321014;
213    pub(crate) const UNNATURAL_CAUSES: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::damage::ACTION::SPELL_459527;
214    pub(crate) const WILD_THRASH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::damage::ACTION::SPELL_1264359;
215}
216pub(crate) mod DAMAGE_REPORTED {
217    pub(crate) const COBRA_CLEAVE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::damage::ACTION::SPELL_1299409;
218}
219pub(crate) mod DAMAGE_EFFECT {
220    pub(crate) const ALPHA_PREDATOR_KC_PCT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::damage::EFFECT::SPELL_269737_EFFECT_2;
221    pub(crate) const BOAR_CHARGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::damage::EFFECT::SPELL_471936_EFFECT_1;
222    pub(crate) const BOAR_CHARGE_CLEAVE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::damage::EFFECT::SPELL_471938_EFFECT_1;
223    pub(crate) const DIRE_COMMAND_PCT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::damage::EFFECT::SPELL_378743_EFFECT_1;
224    pub(crate) const HOWL_WYVERN_STACKS: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::damage::EFFECT::SPELL_471876_EFFECT_3;
225    pub(crate) const KC_PET_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::damage::EFFECT::SPELL_83381_EFFECT_1;
226    pub(crate) const PACK_MENTALITY_BARBED_CDR: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::damage::EFFECT::SPELL_472358_EFFECT_2;
227    pub(crate) const PACK_MENTALITY_KC_PCT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::damage::EFFECT::SPELL_472358_EFFECT_1;
228    pub(crate) const PACK_TACTICS_FOCUS: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::damage::EFFECT::SPELL_1282660_EFFECT_1;
229    pub(crate) const PET_BW_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::damage::EFFECT::SPELL_344572_EFFECT_1;
230    pub(crate) const RAVENOUS_LEAP: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::damage::EFFECT::SPELL_459753_EFFECT_1;
231    pub(crate) const STAMPEDE_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::damage::EFFECT::SPELL_201594_EFFECT_1;
232    pub(crate) const STAMPEDE_GEOMETRY: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::damage::EFFECT::SPELL_1258344_EFFECT_1;
233    pub(crate) const STOMP_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::damage::EFFECT::SPELL_201754_EFFECT_1;
234    pub(crate) const BEAST_CLEAVE_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::damage::EFFECT::SPELL_118459_EFFECT_1;
235    pub(crate) const BEAST_CLEAVE_FRACTION: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::damage::EFFECT::SPELL_115939_EFFECT_1;
236    pub(crate) const BEAST_CLEAVE_REDUCED_TARGETS: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::damage::EFFECT::SPELL_118459_EFFECT_2;
237    pub(crate) const BEAST_CLEAVE_DURATION: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::damage::EFFECT::SPELL_115939_EFFECT_2;
238    pub(crate) const COBRA_FANG_CLEAVE_PCT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::damage::EFFECT::SPELL_1299389_EFFECT_1;
239    pub(crate) const COBRA_FANG_PRIMARY_PCT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::damage::EFFECT::SPELL_1299389_EFFECT_2;
240    pub(crate) const COBRA_CLEAVE_GEOMETRY: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::damage::EFFECT::SPELL_1299409_EFFECT_1;
241    pub(crate) const COBRA_SHOT_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::damage::EFFECT::SPELL_193455_EFFECT_2;
242    pub(crate) const MID2_BM_2PC_EFFECTIVENESS: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::damage::EFFECT::SPELL_1296631_EFFECT_1;
243    pub(crate) const THUNDERING_HOOVES_PCT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::damage::EFFECT::SPELL_459693_EFFECT_1;
244    pub(crate) const WILD_THRASH_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::damage::EFFECT::SPELL_1264355_EFFECT_1;
245    pub(crate) const WILD_THRASH_BONUS: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::damage::EFFECT::SPELL_1264359_EFFECT_1;
246    pub(crate) const WILD_THRASH_THRESHOLD: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::damage::EFFECT::SPELL_1264359_EFFECT_2;
247    pub(crate) const WILDSPEAKER_KC: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::damage::EFFECT::SPELL_1232922_EFFECT_1;
248    pub(crate) const WYVERNS_CRY_PCT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::damage::EFFECT::SPELL_471881_EFFECT_1;
249}
250pub(crate) const AURA_BESTIAL_WRATH: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::AURA_BESTIAL_WRATH
251    .bind(
252        wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::PROOF,
253    );
254pub(crate) const AURA_UNNATURAL_CAUSES: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::AURA_UNNATURAL_CAUSES
255    .bind(
256        wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::PROOF,
257    );
258pub(crate) const AURA_BARBED_SHOT_DOT: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::AURA_BARBED_SHOT_DOT
259    .bind(
260        wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::PROOF,
261    );
262pub(crate) const AURA_BARBED_SHOT_REGEN: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::AURA_BARBED_SHOT_REGEN
263    .bind(
264        wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::PROOF,
265    );
266pub(crate) const AURA_BEAST_CLEAVE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::AURA_BEAST_CLEAVE
267    .bind(
268        wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::PROOF,
269    );
270pub(crate) const AURA_COBRA_FANG: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::AURA_COBRA_FANG
271    .bind(
272        wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::PROOF,
273    );
274pub(crate) const AURA_BLOODSHED_DOT: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::AURA_BLOODSHED_DOT
275    .bind(
276        wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::PROOF,
277    );
278pub(crate) const AURA_DIRE_BEAST_ACTIVE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::AURA_DIRE_BEAST_ACTIVE
279    .bind(
280        wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::PROOF,
281    );
282pub(crate) const AURA_NATURES_ALLY: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::AURA_NATURES_ALLY
283    .bind(
284        wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::PROOF,
285    );
286pub(crate) const AURA_NATURES_ALLY_KILL_COMMAND: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::AURA_NATURES_ALLY_KILL_COMMAND
287    .bind(
288        wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::PROOF,
289    );
290pub(crate) const AURA_BLOODY_FRENZY: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::AURA_BLOODY_FRENZY
291    .bind(
292        wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::PROOF,
293    );
294pub(crate) const AURA_TRACK_PETS: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::AURA_TRACK_PETS
295    .bind(
296        wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::PROOF,
297    );
298pub(crate) const AURA_HOWL_COOLDOWN: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::AURA_HOWL_COOLDOWN
299    .bind(
300        wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::PROOF,
301    );
302pub(crate) const AURA_WYVERN_READY: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::AURA_WYVERN_READY
303    .bind(
304        wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::PROOF,
305    );
306pub(crate) const AURA_BOAR_READY: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::AURA_BOAR_READY
307    .bind(
308        wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::PROOF,
309    );
310pub(crate) const AURA_BEAR_READY: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::AURA_BEAR_READY
311    .bind(
312        wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::PROOF,
313    );
314pub(crate) const AURA_WYVERNS_CRY: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::AURA_WYVERNS_CRY
315    .bind(
316        wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::PROOF,
317    );
318pub(crate) const AURA_HUNTMASTERS_CALL: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::AURA_HUNTMASTERS_CALL
319    .bind(
320        wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::PROOF,
321    );
322pub(crate) const AURA_BEAR_ACTIVE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::AURA_BEAR_ACTIVE
323    .bind(
324        wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::PROOF,
325    );
326pub(crate) const AURA_REND_FLESH: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::AURA_REND_FLESH
327    .bind(
328        wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::PROOF,
329    );
330pub(crate) const AURA_COUNT: usize = 20;
331const _: () = assert!(
332    AURA_COUNT == 20, "AURA index ABI: count changed -- update positional hook consumers"
333);
334pub(crate) const SPELL_KILL_COMMAND: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::SPELL_KILL_COMMAND
335    .bind(
336        wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::PROOF,
337    );
338pub(crate) const SPELL_BARBED_SHOT: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::SPELL_BARBED_SHOT
339    .bind(
340        wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::PROOF,
341    );
342pub(crate) const SPELL_BESTIAL_WRATH: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::SPELL_BESTIAL_WRATH
343    .bind(
344        wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::PROOF,
345    );
346pub(crate) const SPELL_COBRA_SHOT: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::SPELL_COBRA_SHOT
347    .bind(
348        wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::PROOF,
349    );
350pub(crate) const SPELL_STEADY_SHOT: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::SPELL_STEADY_SHOT
351    .bind(
352        wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::PROOF,
353    );
354pub(crate) const SPELL_BLACK_ARROW: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::SPELL_BLACK_ARROW
355    .bind(
356        wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::PROOF,
357    );
358pub(crate) const SPELL_WILD_THRASH: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::SPELL_WILD_THRASH
359    .bind(
360        wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::PROOF,
361    );
362pub(crate) const SPELL_REVIVE_PET: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::SPELL_REVIVE_PET
363    .bind(
364        wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::PROOF,
365    );
366pub(crate) const SPELL_CALL_PET_1: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::SPELL_CALL_PET_1
367    .bind(
368        wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::PROOF,
369    );
370pub(crate) const SPELL_COUNT: usize = 9;
371const _: () = assert!(
372    SPELL_COUNT == 9,
373    "SPELL index ABI: count changed -- update positional hook consumers"
374);
375pub(crate) mod EFFECT {
376    ///<https://wowlab.gg/inspect/spell/269737>
377    pub(crate) const ALPHA_PREDATOR_KC_PCT: (u32, u8) = (269_737, 2);
378    ///<https://wowlab.gg/inspect/spell/471936>
379    pub(crate) const BOAR_CHARGE: (u32, u8) = (471_936, 1);
380    ///<https://wowlab.gg/inspect/spell/471938>
381    pub(crate) const BOAR_CHARGE_CLEAVE: (u32, u8) = (471_938, 1);
382    ///<https://wowlab.gg/inspect/spell/378743>
383    pub(crate) const DIRE_COMMAND_PCT: (u32, u8) = (378_743, 1);
384    ///<https://wowlab.gg/inspect/spell/471876>
385    pub(crate) const HOWL_WYVERN_STACKS: (u32, u8) = (471_876, 3);
386    ///<https://wowlab.gg/inspect/spell/83381>
387    pub(crate) const KC_PET_DAMAGE: (u32, u8) = (83381, 1);
388    ///<https://wowlab.gg/inspect/spell/472358>
389    pub(crate) const PACK_MENTALITY_BARBED_CDR: (u32, u8) = (472_358, 2);
390    ///<https://wowlab.gg/inspect/spell/472358>
391    pub(crate) const PACK_MENTALITY_KC_PCT: (u32, u8) = (472_358, 1);
392    ///<https://wowlab.gg/inspect/spell/1282660>
393    pub(crate) const PACK_TACTICS_FOCUS: (u32, u8) = (1_282_660, 1);
394    ///<https://wowlab.gg/inspect/spell/344572>
395    pub(crate) const PET_BW_DAMAGE: (u32, u8) = (344_572, 1);
396    ///<https://wowlab.gg/inspect/spell/459753>
397    pub(crate) const RAVENOUS_LEAP: (u32, u8) = (459_753, 1);
398    ///<https://wowlab.gg/inspect/spell/201594>
399    pub(crate) const STAMPEDE_DAMAGE: (u32, u8) = (201_594, 1);
400    ///<https://wowlab.gg/inspect/spell/1258344>
401    pub(crate) const STAMPEDE_GEOMETRY: (u32, u8) = (1_258_344, 1);
402    ///<https://wowlab.gg/inspect/spell/201754>
403    pub(crate) const STOMP_DAMAGE: (u32, u8) = (201_754, 1);
404    ///<https://wowlab.gg/inspect/spell/118459>
405    pub(crate) const BEAST_CLEAVE_DAMAGE: (u32, u8) = (118_459, 1);
406    ///<https://wowlab.gg/inspect/spell/115939>
407    pub(crate) const BEAST_CLEAVE_FRACTION: (u32, u8) = (115_939, 1);
408    ///<https://wowlab.gg/inspect/spell/118459>
409    pub(crate) const BEAST_CLEAVE_REDUCED_TARGETS: (u32, u8) = (118_459, 2);
410    ///<https://wowlab.gg/inspect/spell/115939>
411    pub(crate) const BEAST_CLEAVE_DURATION: (u32, u8) = (115_939, 2);
412    ///<https://wowlab.gg/inspect/spell/1299389>
413    pub(crate) const COBRA_FANG_CLEAVE_PCT: (u32, u8) = (1_299_389, 1);
414    ///<https://wowlab.gg/inspect/spell/1299389>
415    pub(crate) const COBRA_FANG_PRIMARY_PCT: (u32, u8) = (1_299_389, 2);
416    ///<https://wowlab.gg/inspect/spell/1299409>
417    pub(crate) const COBRA_CLEAVE_GEOMETRY: (u32, u8) = (1_299_409, 1);
418    ///<https://wowlab.gg/inspect/spell/193455>
419    pub(crate) const COBRA_SHOT_DAMAGE: (u32, u8) = (193_455, 2);
420    ///<https://wowlab.gg/inspect/spell/1296631>
421    pub(crate) const MID2_BM_2PC_EFFECTIVENESS: (u32, u8) = (1_296_631, 1);
422    ///<https://wowlab.gg/inspect/spell/459693>
423    pub(crate) const THUNDERING_HOOVES_PCT: (u32, u8) = (459_693, 1);
424    ///<https://wowlab.gg/inspect/spell/1264355>
425    pub(crate) const WILD_THRASH_DAMAGE: (u32, u8) = (1_264_355, 1);
426    ///<https://wowlab.gg/inspect/spell/1264359>
427    pub(crate) const WILD_THRASH_BONUS: (u32, u8) = (1_264_359, 1);
428    ///<https://wowlab.gg/inspect/spell/1264359>
429    pub(crate) const WILD_THRASH_THRESHOLD: (u32, u8) = (1_264_359, 2);
430    ///<https://wowlab.gg/inspect/spell/1232922>
431    pub(crate) const WILDSPEAKER_KC: (u32, u8) = (1_232_922, 1);
432    ///<https://wowlab.gg/inspect/spell/471881>
433    pub(crate) const WYVERNS_CRY_PCT: (u32, u8) = (471_881, 1);
434}
435static REPORTED_SPELLS: &[(&str, u32)] = &[("cobra_cleave", 1_299_409)];
436static DECLARED_SPELL_IDS: &[u32] = &[
437    34026, 217_200, 19574, 193_455, 56641, 466_930, 1_264_359, 982, 883, 459_529,
438    246_152, 268_877, 1_299_389, 321_538, 219_199, 1_282_474, 1_276_720, 1_265_063,
439    462_599, 471_877, 471_878, 472_324, 472_325, 471_881, 459_731, 471_993, 471_999,
440    407_412, 120_679, 321_014, 459_527, 75, 6603, 76657, 83381, 115_939, 118_459,
441    186_254, 201_594, 201_754, 269_737, 344_572, 378_743, 459_693, 459_753, 471_876,
442    471_936, 471_938, 472_358, 1_232_922, 1_258_344, 1_264_355, 1_282_660, 1_296_631,
443    1_299_409, 16827,
444];
445static DECLARED_AURA_IDS: &[u32] = &[
446    19574, 459_529, 217_200, 246_152, 268_877, 1_299_389, 321_538, 219_199, 1_282_474,
447    1_276_720, 1_265_063, 462_599, 471_877, 471_878, 472_324, 472_325, 471_881, 459_731,
448    471_993, 471_999,
449];
450static TALENTS: &[(&str, u32)] = &[
451    ("BARBED_SHOT", TALENT::BARBED_SHOT),
452    ("BESTIAL_WRATH", TALENT::BESTIAL_WRATH),
453    ("BLACK_ARROW", TALENT::BLACK_ARROW),
454    ("BLOODY_FRENZY", TALENT::BLOODY_FRENZY),
455    ("DIRE_BEAST", TALENT::DIRE_BEAST),
456    ("KILL_COMMAND", TALENT::KILL_COMMAND),
457    ("PACK_TACTICS", TALENT::PACK_TACTICS),
458    ("UNNATURAL_CAUSES", TALENT::UNNATURAL_CAUSES),
459    ("WILD_THRASH", TALENT::WILD_THRASH),
460];
461pub(crate) mod BM_HUNTER {
462    pub(crate) const KILL_COMMAND_CASTS: u32 = 0;
463    pub(crate) const BARBED_SHOT_CASTS: u32 = 1;
464    pub(crate) const BESTIAL_WRATH_CASTS: u32 = 2;
465    pub(crate) const COBRA_SHOT_CASTS: u32 = 3;
466    pub(crate) const BESTIAL_WRATH_UPTIME_MS: u32 = 4;
467}
468fn aura_bestial_wrath(
469    a: AuraDefinitionDraft,
470    data: &ResolvedGameData,
471) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
472    a.on_player()
473        .apply_base_from_data(data, 19574)?
474        .max_stacks(
475            data.require_aura_max_stacks(wowlab_types::sim::SpellIdx::from_raw(19574))?,
476        )
477        .pet_damage_multiplier(
478            ((data.base_points(wowlab_types::sim::SpellIdx::from_raw(186_254), 1))
479                * 0.01) + 1.0,
480        )
481}
482fn aura_unnatural_causes(
483    a: AuraDefinitionDraft,
484    data: &ResolvedGameData,
485) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
486    Ok(
487        a
488            .on_target()
489            .apply_base_from_data(data, 459_529)?
490            .max_stacks(
491                data
492                    .require_aura_max_stacks(
493                        wowlab_types::sim::SpellIdx::from_raw(459_529),
494                    )?,
495            ),
496    )
497}
498fn aura_barbed_shot_dot(
499    a: AuraDefinitionDraft,
500    data: &ResolvedGameData,
501) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
502    Ok(
503        a
504            .on_target()
505            .apply_base_from_data(data, 217_200)?
506            .max_stacks(
507                data
508                    .require_aura_max_stacks(
509                        wowlab_types::sim::SpellIdx::from_raw(217_200),
510                    )?,
511            ),
512    )
513}
514fn aura_barbed_shot_regen(
515    a: AuraDefinitionDraft,
516    data: &ResolvedGameData,
517) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
518    Ok(
519        a
520            .on_player()
521            .apply_base_from_data(data, 246_152)?
522            .max_stacks(
523                data
524                    .require_aura_max_stacks(
525                        wowlab_types::sim::SpellIdx::from_raw(246_152),
526                    )?,
527            ),
528    )
529}
530fn aura_beast_cleave(
531    a: AuraDefinitionDraft,
532    data: &ResolvedGameData,
533) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
534    Ok(
535        a
536            .on_player()
537            .apply_base_from_data(data, 268_877)?
538            .max_stacks(
539                data
540                    .require_aura_max_stacks(
541                        wowlab_types::sim::SpellIdx::from_raw(268_877),
542                    )?,
543            ),
544    )
545}
546fn aura_cobra_fang(
547    a: AuraDefinitionDraft,
548    data: &ResolvedGameData,
549) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
550    Ok(
551        a
552            .on_player()
553            .apply_base_from_data(data, 1_299_389)?
554            .max_stacks(
555                data
556                    .require_aura_max_stacks(
557                        wowlab_types::sim::SpellIdx::from_raw(1_299_389),
558                    )?,
559            ),
560    )
561}
562fn aura_bloodshed_dot(
563    a: AuraDefinitionDraft,
564    data: &ResolvedGameData,
565) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
566    a.on_target()
567        .apply_base_from_data(data, 321_538)?
568        .max_stacks(
569            data.require_aura_max_stacks(wowlab_types::sim::SpellIdx::from_raw(321_538))?,
570        )
571        .periodic_damage(
572            wowlab_engine_combat::validated_milliseconds(
573                data.period(wowlab_types::sim::SpellIdx::from_raw(321_538), 1),
574                321_538,
575                "periodic_damage.tick_ms",
576            )?,
577            (((data.ap_coef(wowlab_types::sim::SpellIdx::from_raw(321_538), 1)) * 1.8)
578                * 100.0)
579                .round() / 100.0,
580            wowlab_engine_combat::DamageFlags::PHYSICAL,
581        )
582        .apply_periodic_behavior_from_data(data, 321_538)
583}
584fn aura_dire_beast_active(
585    a: AuraDefinitionDraft,
586    data: &ResolvedGameData,
587) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
588    Ok(
589        a
590            .on_player()
591            .apply_base_from_data(data, 219_199)?
592            .max_stacks(
593                wowlab_engine_combat::validated_max_stacks(
594                    6.0,
595                    219_199,
596                    "aura.max_stacks",
597                )?,
598            ),
599    )
600}
601fn aura_natures_ally(
602    a: AuraDefinitionDraft,
603    data: &ResolvedGameData,
604) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
605    Ok(
606        a
607            .on_player()
608            .apply_base_from_data(data, 1_282_474)?
609            .max_stacks(
610                data
611                    .require_aura_max_stacks(
612                        wowlab_types::sim::SpellIdx::from_raw(1_282_474),
613                    )?,
614            ),
615    )
616}
617fn aura_natures_ally_kill_command(
618    a: AuraDefinitionDraft,
619    data: &ResolvedGameData,
620) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
621    Ok(
622        a
623            .on_player()
624            .apply_base_from_data(data, 1_276_720)?
625            .max_stacks(
626                data
627                    .require_aura_max_stacks(
628                        wowlab_types::sim::SpellIdx::from_raw(1_276_720),
629                    )?,
630            ),
631    )
632}
633fn aura_bloody_frenzy(
634    a: AuraDefinitionDraft,
635    data: &ResolvedGameData,
636) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
637    Ok(
638        a
639            .on_player()
640            .apply_base_from_data(data, 1_265_063)?
641            .max_stacks(
642                data
643                    .require_aura_max_stacks(
644                        wowlab_types::sim::SpellIdx::from_raw(1_265_063),
645                    )?,
646            ),
647    )
648}
649fn aura_track_pets(
650    a: AuraDefinitionDraft,
651    data: &ResolvedGameData,
652) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
653    Ok(
654        a
655            .on_player()
656            .apply_base_from_data(data, 462_599)?
657            .max_stacks(
658                data
659                    .require_aura_max_stacks(
660                        wowlab_types::sim::SpellIdx::from_raw(462_599),
661                    )?,
662            ),
663    )
664}
665fn aura_howl_cooldown(
666    a: AuraDefinitionDraft,
667    data: &ResolvedGameData,
668) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
669    Ok(
670        a
671            .on_player()
672            .apply_base_from_data(data, 471_877)?
673            .max_stacks(
674                data
675                    .require_aura_max_stacks(
676                        wowlab_types::sim::SpellIdx::from_raw(471_877),
677                    )?,
678            ),
679    )
680}
681fn aura_wyvern_ready(
682    a: AuraDefinitionDraft,
683    data: &ResolvedGameData,
684) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
685    Ok(
686        a
687            .on_player()
688            .apply_base_from_data(data, 471_878)?
689            .max_stacks(
690                data
691                    .require_aura_max_stacks(
692                        wowlab_types::sim::SpellIdx::from_raw(471_878),
693                    )?,
694            ),
695    )
696}
697fn aura_boar_ready(
698    a: AuraDefinitionDraft,
699    data: &ResolvedGameData,
700) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
701    Ok(
702        a
703            .on_player()
704            .apply_base_from_data(data, 472_324)?
705            .max_stacks(
706                data
707                    .require_aura_max_stacks(
708                        wowlab_types::sim::SpellIdx::from_raw(472_324),
709                    )?,
710            ),
711    )
712}
713fn aura_bear_ready(
714    a: AuraDefinitionDraft,
715    data: &ResolvedGameData,
716) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
717    Ok(
718        a
719            .on_player()
720            .apply_base_from_data(data, 472_325)?
721            .max_stacks(
722                data
723                    .require_aura_max_stacks(
724                        wowlab_types::sim::SpellIdx::from_raw(472_325),
725                    )?,
726            ),
727    )
728}
729fn aura_wyverns_cry(
730    a: AuraDefinitionDraft,
731    data: &ResolvedGameData,
732) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
733    Ok(
734        a
735            .on_player()
736            .apply_base_from_data(data, 471_881)?
737            .max_stacks(
738                data
739                    .require_aura_max_stacks(
740                        wowlab_types::sim::SpellIdx::from_raw(471_881),
741                    )?,
742            ),
743    )
744}
745fn aura_huntmasters_call(
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, 459_731)?
753            .max_stacks(
754                data
755                    .require_aura_max_stacks(
756                        wowlab_types::sim::SpellIdx::from_raw(459_731),
757                    )?,
758            ),
759    )
760}
761fn aura_bear_active(
762    a: AuraDefinitionDraft,
763    data: &ResolvedGameData,
764) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
765    Ok(
766        a
767            .on_player()
768            .apply_base_from_data(data, 471_993)?
769            .max_stacks(
770                data
771                    .require_aura_max_stacks(
772                        wowlab_types::sim::SpellIdx::from_raw(471_993),
773                    )?,
774            ),
775    )
776}
777fn aura_rend_flesh(
778    a: AuraDefinitionDraft,
779    data: &ResolvedGameData,
780) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
781    a.on_target()
782        .apply_base_from_data(data, 471_999)?
783        .max_stacks(
784            data.require_aura_max_stacks(wowlab_types::sim::SpellIdx::from_raw(471_999))?,
785        )
786        .periodic_damage(
787            wowlab_engine_combat::validated_milliseconds(
788                data.period(wowlab_types::sim::SpellIdx::from_raw(471_999), 1),
789                471_999,
790                "periodic_damage.tick_ms",
791            )?,
792            (((data.ap_coef(wowlab_types::sim::SpellIdx::from_raw(471_999), 1)) * 0.6)
793                * 100.0)
794                .round() / 100.0,
795            wowlab_engine_combat::DamageFlags::PHYSICAL,
796        )
797        .apply_periodic_behavior_from_data(data, 471_999)
798}
799fn spell_kill_command(
800    s: SpellDefinitionDraft,
801    data: &ResolvedGameData,
802) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
803    Ok(
804        s
805            .apply_base_from_data(data, 34026)?
806            .apply_aoe_from_data(data)
807            .on_cast(crate::hooks::beast_mastery_hunter::kill_command_hook),
808    )
809}
810fn spell_barbed_shot(
811    s: SpellDefinitionDraft,
812    data: &ResolvedGameData,
813) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
814    Ok(
815        s
816            .apply_base_from_data(data, 217_200)?
817            .applies_inferred_aura(AURA_BARBED_SHOT_DOT, 217_200)
818            .apply_aoe_from_data(data)
819            .on_cast(crate::hooks::beast_mastery_hunter::barbed_shot_hook),
820    )
821}
822fn spell_bestial_wrath(
823    s: SpellDefinitionDraft,
824    data: &ResolvedGameData,
825) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
826    Ok(
827        s
828            .apply_base_from_data(data, 19574)?
829            .applies_inferred_aura(AURA_BESTIAL_WRATH, 19574)
830            .apply_aoe_from_data(data)
831            .on_cast(crate::hooks::beast_mastery_hunter::bestial_wrath_hook),
832    )
833}
834fn spell_cobra_shot(
835    s: SpellDefinitionDraft,
836    data: &ResolvedGameData,
837) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
838    Ok(
839        s
840            .apply_base_from_data(data, 193_455)?
841            .reduces_cd(
842                SPELL_KILL_COMMAND,
843                wowlab_engine_combat::validated_milliseconds(
844                    (data.base_points(wowlab_types::sim::SpellIdx::from_raw(193_455), 3))
845                        * 1000.0,
846                    193_455,
847                    "spell.reduces_cd.amount_ms",
848                )?,
849            )
850            .apply_aoe_from_data(data)
851            .on_cast(crate::hooks::beast_mastery_hunter::cobra_shot_hook),
852    )
853}
854fn spell_steady_shot(
855    s: SpellDefinitionDraft,
856    data: &ResolvedGameData,
857) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
858    Ok(s.apply_base_from_data(data, 56641)?.apply_aoe_from_data(data))
859}
860fn spell_black_arrow(
861    s: SpellDefinitionDraft,
862    data: &ResolvedGameData,
863) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
864    Ok(s.apply_base_from_data(data, 466_930)?.apply_aoe_from_data(data))
865}
866fn spell_wild_thrash(
867    s: SpellDefinitionDraft,
868    data: &ResolvedGameData,
869) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
870    Ok(
871        s
872            .apply_base_from_data(data, 1_264_359)?
873            .apply_aoe_from_data(data)
874            .on_cast(crate::hooks::beast_mastery_hunter::wild_thrash_hook),
875    )
876}
877fn spell_revive_pet(
878    s: SpellDefinitionDraft,
879    data: &ResolvedGameData,
880) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
881    Ok(s.apply_base_from_data(data, 982)?.apply_aoe_from_data(data))
882}
883fn spell_call_pet_1(
884    s: SpellDefinitionDraft,
885    data: &ResolvedGameData,
886) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
887    Ok(s.apply_base_from_data(data, 883)?.apply_aoe_from_data(data))
888}
889pub(crate) fn build_combat_system_draft(
890    params: &wowlab_engine_ports::HandlerParams<'_>,
891) -> Result<CombatSystemDraft, wowlab_engine_ports::EngineError> {
892    let builder = CombatSystemBuilder::new(params.stats.clone())
893        .spec_id(SpecId::BeastMastery)
894        .spec_identity(
895            wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::PROOF,
896        )
897        .hero_talent_trees(DECLARED_METADATA.hero_talent_trees)
898        .effect_identities(
899            wowlab_engine_combat::generated_identities::specs::beast_mastery_hunter::damage::ALL,
900        )
901        .effect_identities(wowlab_engine_combat::generated_identities::shared::ALL)
902        .mastery_spell(76657)
903        .mastery_hook(crate::hooks::beast_mastery_hunter::mastery)
904        .resource(
905            "focus",
906            params
907                .game_data
908                .power_max(2)
909                .ok_or_else(|| {
910                    wowlab_engine_ports::EngineError::spec_construction(
911                        "missing power-type power_max for type_id 2",
912                    )
913                })?,
914            params
915                .game_data
916                .power_regen_for_max(
917                    2,
918                    params
919                        .game_data
920                        .power_max(2)
921                        .ok_or_else(|| {
922                            wowlab_engine_ports::EngineError::spec_construction(
923                                "missing power-type power_max for type_id 2",
924                            )
925                        })?,
926                )
927                .ok_or_else(|| {
928                    wowlab_engine_ports::EngineError::spec_construction(
929                        "missing power-type power_regen_for_max for type_id 2",
930                    )
931                })?,
932        )
933        .resource_type_id(2)
934        .resource_start(
935            params
936                .game_data
937                .power_default(2)
938                .ok_or_else(|| {
939                    wowlab_engine_ports::EngineError::spec_construction(
940                        "missing power-type power_default for type_id 2",
941                    )
942                })?,
943        )
944        .has_pet(true)
945        .aura(
946            "bestial_wrath",
947            AURA::BESTIAL_WRATH,
948            |a| aura_bestial_wrath(a, &params.game_data),
949        )
950        .aura(
951            "unnatural_causes",
952            AURA::UNNATURAL_CAUSES,
953            |a| aura_unnatural_causes(a, &params.game_data),
954        )
955        .aura(
956            "barbed_shot_dot",
957            AURA::BARBED_SHOT_DOT,
958            |a| aura_barbed_shot_dot(a, &params.game_data),
959        )
960        .aura(
961            "barbed_shot_regen",
962            AURA::BARBED_SHOT_REGEN,
963            |a| aura_barbed_shot_regen(a, &params.game_data),
964        )
965        .aura(
966            "beast_cleave",
967            AURA::BEAST_CLEAVE,
968            |a| aura_beast_cleave(a, &params.game_data),
969        )
970        .aura("cobra_fang", AURA::COBRA_FANG, |a| aura_cobra_fang(a, &params.game_data))
971        .aura(
972            "bloodshed_dot",
973            AURA::BLOODSHED_DOT,
974            |a| aura_bloodshed_dot(a, &params.game_data),
975        )
976        .aura(
977            "dire_beast_active",
978            AURA::DIRE_BEAST_ACTIVE,
979            |a| aura_dire_beast_active(a, &params.game_data),
980        )
981        .aura(
982            "natures_ally",
983            AURA::NATURES_ALLY,
984            |a| aura_natures_ally(a, &params.game_data),
985        )
986        .aura(
987            "natures_ally_kill_command",
988            AURA::NATURES_ALLY_KILL_COMMAND,
989            |a| aura_natures_ally_kill_command(a, &params.game_data),
990        )
991        .aura(
992            "bloody_frenzy",
993            AURA::BLOODY_FRENZY,
994            |a| aura_bloody_frenzy(a, &params.game_data),
995        )
996        .aura("track_pets", AURA::TRACK_PETS, |a| aura_track_pets(a, &params.game_data))
997        .aura(
998            "howl_cooldown",
999            AURA::HOWL_COOLDOWN,
1000            |a| aura_howl_cooldown(a, &params.game_data),
1001        )
1002        .aura(
1003            "wyvern_ready",
1004            AURA::WYVERN_READY,
1005            |a| aura_wyvern_ready(a, &params.game_data),
1006        )
1007        .aura("boar_ready", AURA::BOAR_READY, |a| aura_boar_ready(a, &params.game_data))
1008        .aura("bear_ready", AURA::BEAR_READY, |a| aura_bear_ready(a, &params.game_data))
1009        .aura(
1010            "wyverns_cry",
1011            AURA::WYVERNS_CRY,
1012            |a| aura_wyverns_cry(a, &params.game_data),
1013        )
1014        .aura(
1015            "huntmasters_call",
1016            AURA::HUNTMASTERS_CALL,
1017            |a| aura_huntmasters_call(a, &params.game_data),
1018        )
1019        .aura(
1020            "bear_active",
1021            AURA::BEAR_ACTIVE,
1022            |a| aura_bear_active(a, &params.game_data),
1023        )
1024        .aura("rend_flesh", AURA::REND_FLESH, |a| aura_rend_flesh(a, &params.game_data))
1025        .spell(
1026            "kill_command",
1027            SPELL::KILL_COMMAND,
1028            |s| spell_kill_command(s, &params.game_data),
1029        )
1030        .spell(
1031            "barbed_shot",
1032            SPELL::BARBED_SHOT,
1033            |s| spell_barbed_shot(s, &params.game_data),
1034        )
1035        .spell(
1036            "bestial_wrath",
1037            SPELL::BESTIAL_WRATH,
1038            |s| spell_bestial_wrath(s, &params.game_data),
1039        )
1040        .spell(
1041            "cobra_shot",
1042            SPELL::COBRA_SHOT,
1043            |s| spell_cobra_shot(s, &params.game_data),
1044        )
1045        .spell(
1046            "steady_shot",
1047            SPELL::STEADY_SHOT,
1048            |s| spell_steady_shot(s, &params.game_data),
1049        )
1050        .spell(
1051            "black_arrow",
1052            SPELL::BLACK_ARROW,
1053            |s| spell_black_arrow(s, &params.game_data),
1054        )
1055        .spell(
1056            "wild_thrash",
1057            SPELL::WILD_THRASH,
1058            |s| spell_wild_thrash(s, &params.game_data),
1059        )
1060        .spell(
1061            "revive_pet",
1062            SPELL::REVIVE_PET,
1063            |s| spell_revive_pet(s, &params.game_data),
1064        )
1065        .spell(
1066            "call_pet_1",
1067            SPELL::CALL_PET_1,
1068            |s| spell_call_pet_1(s, &params.game_data),
1069        )
1070        .auto_attack(|a| {
1071            a.spell_id(75).swing_ms(3000).apply_base_from_data(&params.game_data)
1072        })
1073        .auto_attack(|a| {
1074            a
1075                .spell_id(6603)
1076                .swing_ms(1667)
1077                .apply_base_from_data(&params.game_data)
1078                .ap_coef(
1079                    wowlab_engine_domain::damage::pet_swing_power_coefficient(
1080                        0.6,
1081                        2000,
1082                        1.0,
1083                    ),
1084                )
1085                .is_pet()
1086                .on_swing(crate::hooks::beast_mastery_hunter::pet_swing)
1087        })
1088        .game_data(params.game_data.clone())
1089        .talent_spell_ids(TALENTS)
1090        .talent_selections(params.talent_selections)
1091        .talent_companion_aura(TALENT::UNNATURAL_CAUSES, AURA_UNNATURAL_CAUSES)
1092        .register_impact_effect_proc_if_talent(
1093            TALENT::DIRE_BEAST,
1094            wowlab_engine_combat::ImpactEffectProcDefinition::new(
1095                    wowlab_engine_combat::ImpactSource::ProcTypeMask(
1096                        params
1097                            .game_data
1098                            .require_proc_type_mask(
1099                                wowlab_types::sim::SpellIdx::from_raw(120_679),
1100                            )?,
1101                    ),
1102                )
1103                .dbc_driver_from_data(
1104                    wowlab_engine_domain::dbc::EffectLookup::new(
1105                        &params.game_data,
1106                        wowlab_types::sim::EffectRef::new(
1107                            wowlab_types::sim::SpellIdx::from_raw(120_679),
1108                            1,
1109                        ),
1110                    ),
1111                )
1112                .chance(
1113                    (params
1114                        .game_data
1115                        .base_points(wowlab_types::sim::SpellIdx::from_raw(120_679), 1))
1116                        / 100.0,
1117                )
1118                .icd_ms(
1119                    wowlab_engine_combat::validated_milliseconds(
1120                            f64::from(
1121                                params
1122                                    .game_data
1123                                    .require_proc_category_recovery_ms(
1124                                        wowlab_types::sim::SpellIdx::from_raw(120_679),
1125                                    )?,
1126                            ),
1127                            120_679,
1128                            "impact_proc.icd_ms",
1129                        )
1130                        .map_err(|error| {
1131                            wowlab_engine_ports::EngineError::spec_construction(
1132                                error.to_string(),
1133                            )
1134                        })?,
1135                )
1136                .physical_only()
1137                .fire(crate::hooks::beast_mastery_hunter::dire_beast_proc),
1138        )
1139        .set_bonus_auras(params.set_bonus_auras)
1140        .encounter(params.encounter.clone());
1141    let builder = crate::generated::items::register_equipped(
1142        builder,
1143        &params.game_data,
1144        params.equipped_items,
1145    )?;
1146
1147    builder.into_draft()
1148}
1149fn new_handler(
1150    params: wowlab_engine_ports::HandlerParams<'_>,
1151) -> Result<Box<dyn SpecHandler>, wowlab_engine_ports::EngineError> {
1152    let handler = crate::composition::compose_handler(
1153        build_combat_system_draft,
1154        &params,
1155        crate::hooks::beast_mastery_hunter::BeastMasteryHandler::try_new,
1156    )?;
1157
1158    Ok(Box::new(handler))
1159}
1160static DECLARED_METADATA: DeclaredSpecMetadata = DeclaredSpecMetadata {
1161    primary_resource: ResourceType::Focus,
1162    secondary_resource: None,
1163    spell_ids: DECLARED_SPELL_IDS,
1164    aura_ids: DECLARED_AURA_IDS,
1165    server_proc_entries: &[],
1166    talents: TALENTS,
1167    rotation_field_schema: &[],
1168    metrics_plugin_id: None,
1169    hero_talent_trees: &[
1170        HeroTalentTreeDesc {
1171            name: "Pack Leader",
1172            spells: HERO_TREE_PACK_LEADER_SPELLS,
1173            auras: HERO_TREE_PACK_LEADER_AURAS,
1174        },
1175        HeroTalentTreeDesc {
1176            name: "Bm Pets",
1177            spells: HERO_TREE_BM_PETS_SPELLS,
1178            auras: HERO_TREE_BM_PETS_AURAS,
1179        },
1180    ],
1181    reported_spells: REPORTED_SPELLS,
1182    masked_passive_effects: &[],
1183    passive_effect_overrides: &[],
1184};
1185pub(super) const SPEC_DESCRIPTOR: SpecDescriptor = SpecDescriptor {
1186    spec_id: SpecId::BeastMastery,
1187    display_name: "Beast Mastery Hunter",
1188    metadata: DECLARED_METADATA,
1189    handler_factory: new_handler,
1190};
1191wowlab_engine_combat::smoke_test!(build_combat_system_draft);