1#![allow(non_snake_case, dead_code)]
4use wowlab_types::{combat::ResourceType, game::SpecId};
5use wowlab_engine_combat::{
6 CombatSystemBuilder, CombatSystemDraft, AuraDefinitionDraft, LocalAuraIdx,
7 LocalSpellIdx, SpellDefinitionDraft,
8};
9use wowlab_engine_ports::{
10 DeclaredSpecMetadata, SpecDescriptor, SpecHandler, HeroTalentTreeDesc,
11};
12use wowlab_engine_gamedata::ResolvedGameData;
13pub(crate) mod SPELL {
14 pub(crate) const KILL_COMMAND: u32 = 34026;
16 pub(crate) const BARBED_SHOT: u32 = 217_200;
18 pub(crate) const BESTIAL_WRATH: u32 = 19574;
20 pub(crate) const COBRA_SHOT: u32 = 193_455;
22 pub(crate) const STEADY_SHOT: u32 = 56641;
24 pub(crate) const BLACK_ARROW: u32 = 466_930;
26 pub(crate) const WILD_THRASH: u32 = 1_264_359;
28 pub(crate) const REVIVE_PET: u32 = 982;
30 pub(crate) const CALL_PET_1: u32 = 883;
32}
33pub(crate) mod AURA {
34 pub(crate) const BESTIAL_WRATH: u32 = 19574;
36 pub(crate) const UNNATURAL_CAUSES: u32 = 459_529;
38 pub(crate) const BARBED_SHOT_DOT: u32 = 217_200;
40 pub(crate) const BARBED_SHOT_REGEN: u32 = 246_152;
42 pub(crate) const BEAST_CLEAVE: u32 = 268_877;
44 pub(crate) const COBRA_FANG: u32 = 1_299_389;
46 pub(crate) const BLOODSHED_DOT: u32 = 321_538;
48 pub(crate) const DIRE_BEAST_ACTIVE: u32 = 219_199;
50 pub(crate) const NATURES_ALLY: u32 = 1_282_474;
52 pub(crate) const NATURES_ALLY_KILL_COMMAND: u32 = 1_276_720;
54 pub(crate) const BLOODY_FRENZY: u32 = 1_265_063;
56 pub(crate) const TRACK_PETS: u32 = 462_599;
58 pub(crate) const HOWL_COOLDOWN: u32 = 471_877;
60 pub(crate) const WYVERN_READY: u32 = 471_878;
62 pub(crate) const BOAR_READY: u32 = 472_324;
64 pub(crate) const BEAR_READY: u32 = 472_325;
66 pub(crate) const WYVERNS_CRY: u32 = 471_881;
68 pub(crate) const HUNTMASTERS_CALL: u32 = 459_731;
70 pub(crate) const BEAR_ACTIVE: u32 = 471_993;
72 pub(crate) const REND_FLESH: u32 = 471_999;
74}
75pub(crate) mod TALENT {
76 pub(crate) const BARBED_SHOT: u32 = 217_200;
78 pub(crate) const BESTIAL_WRATH: u32 = 19574;
80 pub(crate) const BLACK_ARROW: u32 = 466_930;
82 pub(crate) const BLOODY_FRENZY: u32 = 407_412;
84 pub(crate) const DIRE_BEAST: u32 = 120_679;
86 pub(crate) const KILL_COMMAND: u32 = 34026;
88 pub(crate) const PACK_TACTICS: u32 = 321_014;
90 pub(crate) const UNNATURAL_CAUSES: u32 = 459_527;
92 pub(crate) const WILD_THRASH: u32 = 1_264_359;
94}
95pub(crate) mod SET_BONUS {
96 pub(crate) const MID2_BM_2PC: u32 = 1_296_631;
98 pub(crate) const MID2_BM_4PC: u32 = 1_296_632;
100}
101pub(crate) mod REPORTED_SPELL {
102 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 pub(crate) const BOAR_CHARGE: u32 = 471_936;
110 pub(crate) const BOAR_CHARGE_CLEAVE: u32 = 471_938;
112 pub(crate) const STAMPEDE_TICK: u32 = 201_594;
114 }
115 }
116 pub(crate) mod BM_PETS {
117 pub(crate) mod SPELL {
118 pub(crate) const BEAST_CLEAVE: u32 = 118_459;
120 pub(crate) const BLOODSHED: u32 = 321_538;
122 pub(crate) const CLAW: u32 = 16827;
124 pub(crate) const KILL_COMMAND_PET: u32 = 83381;
126 pub(crate) const MELEE: u32 = 6603;
128 pub(crate) const PET_BESTIAL_WRATH: u32 = 344_572;
130 pub(crate) const RAVENOUS_LEAP: u32 = 459_753;
132 pub(crate) const STOMP: u32 = 201_754;
134 pub(crate) const WILDSPEAKER_KILL_COMMAND: u32 = 1_232_922;
136 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 pub(crate) const ALPHA_PREDATOR_KC_PCT: (u32, u8) = (269_737, 2);
378 pub(crate) const BOAR_CHARGE: (u32, u8) = (471_936, 1);
380 pub(crate) const BOAR_CHARGE_CLEAVE: (u32, u8) = (471_938, 1);
382 pub(crate) const DIRE_COMMAND_PCT: (u32, u8) = (378_743, 1);
384 pub(crate) const HOWL_WYVERN_STACKS: (u32, u8) = (471_876, 3);
386 pub(crate) const KC_PET_DAMAGE: (u32, u8) = (83381, 1);
388 pub(crate) const PACK_MENTALITY_BARBED_CDR: (u32, u8) = (472_358, 2);
390 pub(crate) const PACK_MENTALITY_KC_PCT: (u32, u8) = (472_358, 1);
392 pub(crate) const PACK_TACTICS_FOCUS: (u32, u8) = (1_282_660, 1);
394 pub(crate) const PET_BW_DAMAGE: (u32, u8) = (344_572, 1);
396 pub(crate) const RAVENOUS_LEAP: (u32, u8) = (459_753, 1);
398 pub(crate) const STAMPEDE_DAMAGE: (u32, u8) = (201_594, 1);
400 pub(crate) const STAMPEDE_GEOMETRY: (u32, u8) = (1_258_344, 1);
402 pub(crate) const STOMP_DAMAGE: (u32, u8) = (201_754, 1);
404 pub(crate) const BEAST_CLEAVE_DAMAGE: (u32, u8) = (118_459, 1);
406 pub(crate) const BEAST_CLEAVE_FRACTION: (u32, u8) = (115_939, 1);
408 pub(crate) const BEAST_CLEAVE_REDUCED_TARGETS: (u32, u8) = (118_459, 2);
410 pub(crate) const BEAST_CLEAVE_DURATION: (u32, u8) = (115_939, 2);
412 pub(crate) const COBRA_FANG_CLEAVE_PCT: (u32, u8) = (1_299_389, 1);
414 pub(crate) const COBRA_FANG_PRIMARY_PCT: (u32, u8) = (1_299_389, 2);
416 pub(crate) const COBRA_CLEAVE_GEOMETRY: (u32, u8) = (1_299_409, 1);
418 pub(crate) const COBRA_SHOT_DAMAGE: (u32, u8) = (193_455, 2);
420 pub(crate) const MID2_BM_2PC_EFFECTIVENESS: (u32, u8) = (1_296_631, 1);
422 pub(crate) const THUNDERING_HOOVES_PCT: (u32, u8) = (459_693, 1);
424 pub(crate) const WILD_THRASH_DAMAGE: (u32, u8) = (1_264_355, 1);
426 pub(crate) const WILD_THRASH_BONUS: (u32, u8) = (1_264_359, 1);
428 pub(crate) const WILD_THRASH_THRESHOLD: (u32, u8) = (1_264_359, 2);
430 pub(crate) const WILDSPEAKER_KC: (u32, u8) = (1_232_922, 1);
432 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, ¶ms.game_data),
949 )
950 .aura(
951 "unnatural_causes",
952 AURA::UNNATURAL_CAUSES,
953 |a| aura_unnatural_causes(a, ¶ms.game_data),
954 )
955 .aura(
956 "barbed_shot_dot",
957 AURA::BARBED_SHOT_DOT,
958 |a| aura_barbed_shot_dot(a, ¶ms.game_data),
959 )
960 .aura(
961 "barbed_shot_regen",
962 AURA::BARBED_SHOT_REGEN,
963 |a| aura_barbed_shot_regen(a, ¶ms.game_data),
964 )
965 .aura(
966 "beast_cleave",
967 AURA::BEAST_CLEAVE,
968 |a| aura_beast_cleave(a, ¶ms.game_data),
969 )
970 .aura("cobra_fang", AURA::COBRA_FANG, |a| aura_cobra_fang(a, ¶ms.game_data))
971 .aura(
972 "bloodshed_dot",
973 AURA::BLOODSHED_DOT,
974 |a| aura_bloodshed_dot(a, ¶ms.game_data),
975 )
976 .aura(
977 "dire_beast_active",
978 AURA::DIRE_BEAST_ACTIVE,
979 |a| aura_dire_beast_active(a, ¶ms.game_data),
980 )
981 .aura(
982 "natures_ally",
983 AURA::NATURES_ALLY,
984 |a| aura_natures_ally(a, ¶ms.game_data),
985 )
986 .aura(
987 "natures_ally_kill_command",
988 AURA::NATURES_ALLY_KILL_COMMAND,
989 |a| aura_natures_ally_kill_command(a, ¶ms.game_data),
990 )
991 .aura(
992 "bloody_frenzy",
993 AURA::BLOODY_FRENZY,
994 |a| aura_bloody_frenzy(a, ¶ms.game_data),
995 )
996 .aura("track_pets", AURA::TRACK_PETS, |a| aura_track_pets(a, ¶ms.game_data))
997 .aura(
998 "howl_cooldown",
999 AURA::HOWL_COOLDOWN,
1000 |a| aura_howl_cooldown(a, ¶ms.game_data),
1001 )
1002 .aura(
1003 "wyvern_ready",
1004 AURA::WYVERN_READY,
1005 |a| aura_wyvern_ready(a, ¶ms.game_data),
1006 )
1007 .aura("boar_ready", AURA::BOAR_READY, |a| aura_boar_ready(a, ¶ms.game_data))
1008 .aura("bear_ready", AURA::BEAR_READY, |a| aura_bear_ready(a, ¶ms.game_data))
1009 .aura(
1010 "wyverns_cry",
1011 AURA::WYVERNS_CRY,
1012 |a| aura_wyverns_cry(a, ¶ms.game_data),
1013 )
1014 .aura(
1015 "huntmasters_call",
1016 AURA::HUNTMASTERS_CALL,
1017 |a| aura_huntmasters_call(a, ¶ms.game_data),
1018 )
1019 .aura(
1020 "bear_active",
1021 AURA::BEAR_ACTIVE,
1022 |a| aura_bear_active(a, ¶ms.game_data),
1023 )
1024 .aura("rend_flesh", AURA::REND_FLESH, |a| aura_rend_flesh(a, ¶ms.game_data))
1025 .spell(
1026 "kill_command",
1027 SPELL::KILL_COMMAND,
1028 |s| spell_kill_command(s, ¶ms.game_data),
1029 )
1030 .spell(
1031 "barbed_shot",
1032 SPELL::BARBED_SHOT,
1033 |s| spell_barbed_shot(s, ¶ms.game_data),
1034 )
1035 .spell(
1036 "bestial_wrath",
1037 SPELL::BESTIAL_WRATH,
1038 |s| spell_bestial_wrath(s, ¶ms.game_data),
1039 )
1040 .spell(
1041 "cobra_shot",
1042 SPELL::COBRA_SHOT,
1043 |s| spell_cobra_shot(s, ¶ms.game_data),
1044 )
1045 .spell(
1046 "steady_shot",
1047 SPELL::STEADY_SHOT,
1048 |s| spell_steady_shot(s, ¶ms.game_data),
1049 )
1050 .spell(
1051 "black_arrow",
1052 SPELL::BLACK_ARROW,
1053 |s| spell_black_arrow(s, ¶ms.game_data),
1054 )
1055 .spell(
1056 "wild_thrash",
1057 SPELL::WILD_THRASH,
1058 |s| spell_wild_thrash(s, ¶ms.game_data),
1059 )
1060 .spell(
1061 "revive_pet",
1062 SPELL::REVIVE_PET,
1063 |s| spell_revive_pet(s, ¶ms.game_data),
1064 )
1065 .spell(
1066 "call_pet_1",
1067 SPELL::CALL_PET_1,
1068 |s| spell_call_pet_1(s, ¶ms.game_data),
1069 )
1070 .auto_attack(|a| {
1071 a.spell_id(75).swing_ms(3000).apply_base_from_data(¶ms.game_data)
1072 })
1073 .auto_attack(|a| {
1074 a
1075 .spell_id(6603)
1076 .swing_ms(1667)
1077 .apply_base_from_data(¶ms.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 ¶ms.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 ¶ms.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 ¶ms,
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);