1#![allow(non_snake_case, dead_code)]
4use wowlab_types::{combat::ResourceType, game::SpecId};
5use wowlab_engine_domain::dbc::ProcAttributes;
6use wowlab_engine_combat::{
7 CombatSystemBuilder, CombatSystemDraft, AuraDefinitionDraft, LocalAuraIdx,
8 LocalSpellIdx, SpellDefinitionDraft,
9};
10use wowlab_engine_ports::{
11 DeclaredSpecMetadata, SpecDescriptor, SpecHandler, HeroTalentTreeDesc,
12 DeclaredServerProcEntry,
13};
14use wowlab_engine_gamedata::ResolvedGameData;
15pub(crate) mod SPELL {
16 pub(crate) const KILL_COMMAND: u32 = 259_489;
18 pub(crate) const WILDFIRE_BOMB: u32 = 259_495;
20 pub(crate) const MONGOOSE_BITE: u32 = 259_387;
22 pub(crate) const RAPTOR_STRIKE: u32 = 186_270;
24 pub(crate) const ARCANE_SHOT: u32 = 185_358;
26 pub(crate) const STEADY_SHOT: u32 = 56641;
28 pub(crate) const REVIVE_PET: u32 = 982;
30 pub(crate) const CALL_PET_1: u32 = 883;
32 pub(crate) const KILL_COMMAND_PET: u32 = 259_277;
34 pub(crate) const WILDFIRE_BOMB_DAMAGE: u32 = 265_157;
36 pub(crate) const WILDFIRE_BOMB_BLEED: u32 = 1_253_171;
38 pub(crate) const TAKEDOWN: u32 = 1_250_646;
40 pub(crate) const BOOMSTICK: u32 = 1_261_193;
42 pub(crate) const FLAMEFANG_PITCH: u32 = 1_251_592;
44 pub(crate) const HATCHET_TOSS: u32 = 193_265;
46 pub(crate) const RAPTOR_SWIPE: u32 = 1_262_293;
48 pub(crate) const BOOMSTICK_DAMAGE: u32 = 1_261_215;
50 pub(crate) const TAKEDOWN_DAMAGE: u32 = 1_253_859;
52 pub(crate) const TAKEDOWN_PET: u32 = 1_253_862;
54 pub(crate) const FLAMEFANG_PITCH_DAMAGE: u32 = 1_251_595;
56 pub(crate) const FLAMEFANG_PITCH_AOE: u32 = 1_251_614;
58 pub(crate) const CLAW: u32 = 16827;
60 pub(crate) const STRIKE_AS_ONE: u32 = 1_251_779;
62 pub(crate) const BOAR_CHARGE: u32 = 471_936;
64 pub(crate) const BOAR_CHARGE_CLEAVE: u32 = 471_938;
66 pub(crate) const STAMPEDE_TICK: u32 = 201_594;
68}
69pub(crate) mod AURA {
70 pub(crate) const UNNATURAL_CAUSES: u32 = 459_529;
72 pub(crate) const TIP_OF_THE_SPEAR: u32 = 260_286;
74 pub(crate) const TRACK_PETS: u32 = 462_599;
76 pub(crate) const MONGOOSE_FURY: u32 = 259_388;
78 pub(crate) const RAPTOR_SWIPE: u32 = 1_273_155;
80 pub(crate) const TAKEDOWN: u32 = 1_250_646;
82 pub(crate) const HOWL_COOLDOWN: u32 = 471_877;
84 pub(crate) const WYVERN_READY: u32 = 471_878;
86 pub(crate) const BOAR_READY: u32 = 472_324;
88 pub(crate) const BEAR_READY: u32 = 472_325;
90 pub(crate) const REND_FLESH: u32 = 471_999;
92 pub(crate) const WYVERNS_CRY: u32 = 471_881;
94 pub(crate) const SIC_EM: u32 = 1_253_138;
96}
97pub(crate) mod TALENT {
98 pub(crate) const FLAMEFANG_PITCH: u32 = 1_251_592;
100 pub(crate) const RAPTOR_SWIPE_2: u32 = 1_259_017;
102 pub(crate) const STRIKE_AS_ONE: u32 = 1_251_717;
104 pub(crate) const TIP_OF_THE_SPEAR: u32 = 260_285;
106 pub(crate) const UNNATURAL_CAUSES: u32 = 459_527;
108}
109pub(crate) mod SET_BONUS {
110 pub(crate) const MID2_SURVIVAL_2PC: u32 = 1_296_636;
112 pub(crate) const MID2_SURVIVAL_4PC: u32 = 1_296_635;
114}
115pub(crate) mod HERO {
116 pub(crate) mod PACK_LEADER {
117 pub(crate) mod SPELL {
118 pub(crate) const BOAR_CHARGE: u32 = 471_936;
120 pub(crate) const BOAR_CHARGE_CLEAVE: u32 = 471_938;
122 pub(crate) const HOWL_OF_THE_PACK_LEADER: u32 = 471_878;
124 }
125 pub(crate) mod AURA {
126 pub(crate) const BEAR_READY: u32 = 472_325;
128 pub(crate) const BOAR_READY: u32 = 472_324;
130 pub(crate) const ENVENOMED_FANGS: u32 = 471_944;
132 pub(crate) const MONGOOSE_FURY: u32 = 471_939;
134 pub(crate) const PACK_MENTALITY: u32 = 321_014;
136 pub(crate) const WYVERN_READY: u32 = 471_878;
138 }
139 }
140 pub(crate) mod SENTINEL {
141 pub(crate) mod SPELL {
142 pub(crate) const LUNAR_STORM_DAMAGE: u32 = 1_253_733;
144 pub(crate) const MOONLIGHT_CHAKRAM: u32 = 1_264_949;
146 pub(crate) const MOONLIGHT_CHAKRAM_DAMAGE: u32 = 1_266_081;
148 pub(crate) const TWILIGHT_REQUIEM_DAMAGE: u32 = 1_266_096;
150 }
151 pub(crate) mod AURA {
152 pub(crate) const MOONLIGHT_CHAKRAM_BUFF: u32 = 1_264_946;
154 pub(crate) const SANCTIFIED_ARMAMENTS_DOT: u32 = 1_253_836;
156 pub(crate) const SENTINELS_MARK: u32 = 1_253_601;
158 pub(crate) const STARGAZER: u32 = 1_253_750;
160 }
161 }
162}
163static HERO_TREE_PACK_LEADER_SPELLS: &[(&str, u32)] = &[
164 ("BOAR_CHARGE", 471_936),
165 ("BOAR_CHARGE_CLEAVE", 471_938),
166 ("HOWL_OF_THE_PACK_LEADER", 471_878),
167];
168static HERO_TREE_PACK_LEADER_AURAS: &[(&str, u32)] = &[
169 ("BEAR_READY", 472_325),
170 ("BOAR_READY", 472_324),
171 ("ENVENOMED_FANGS", 471_944),
172 ("MONGOOSE_FURY", 471_939),
173 ("PACK_MENTALITY", 321_014),
174 ("WYVERN_READY", 471_878),
175];
176static HERO_TREE_SENTINEL_SPELLS: &[(&str, u32)] = &[
177 ("LUNAR_STORM_DAMAGE", 1_253_733),
178 ("MOONLIGHT_CHAKRAM", 1_264_949),
179 ("MOONLIGHT_CHAKRAM_DAMAGE", 1_266_081),
180 ("TWILIGHT_REQUIEM_DAMAGE", 1_266_096),
181];
182static HERO_TREE_SENTINEL_AURAS: &[(&str, u32)] = &[
183 ("MOONLIGHT_CHAKRAM_BUFF", 1_264_946),
184 ("SANCTIFIED_ARMAMENTS_DOT", 1_253_836),
185 ("SENTINELS_MARK", 1_253_601),
186 ("STARGAZER", 1_253_750),
187];
188pub(crate) mod DAMAGE_SPELL {
189 pub(crate) const KILL_COMMAND: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::survival_hunter::damage::ACTION::SPELL_259489;
190 pub(crate) const WILDFIRE_BOMB: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::survival_hunter::damage::ACTION::SPELL_259495;
191 pub(crate) const MONGOOSE_BITE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::survival_hunter::damage::ACTION::SPELL_259387;
192 pub(crate) const RAPTOR_STRIKE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::survival_hunter::damage::ACTION::SPELL_186270;
193 pub(crate) const ARCANE_SHOT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::survival_hunter::damage::ACTION::SPELL_185358;
194 pub(crate) const STEADY_SHOT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::survival_hunter::damage::ACTION::SPELL_56641;
195 pub(crate) const REVIVE_PET: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::survival_hunter::damage::ACTION::SPELL_982;
196 pub(crate) const CALL_PET_1: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::survival_hunter::damage::ACTION::SPELL_883;
197 pub(crate) const KILL_COMMAND_PET: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::survival_hunter::damage::ACTION::SPELL_259277;
198 pub(crate) const WILDFIRE_BOMB_DAMAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::survival_hunter::damage::ACTION::SPELL_265157;
199 pub(crate) const WILDFIRE_BOMB_BLEED: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::survival_hunter::damage::ACTION::SPELL_1253171;
200 pub(crate) const TAKEDOWN: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::survival_hunter::damage::ACTION::SPELL_1250646;
201 pub(crate) const BOOMSTICK: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::survival_hunter::damage::ACTION::SPELL_1261193;
202 pub(crate) const FLAMEFANG_PITCH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::survival_hunter::damage::ACTION::SPELL_1251592;
203 pub(crate) const HATCHET_TOSS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::survival_hunter::damage::ACTION::SPELL_193265;
204 pub(crate) const RAPTOR_SWIPE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::survival_hunter::damage::ACTION::SPELL_1262293;
205 pub(crate) const BOOMSTICK_DAMAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::survival_hunter::damage::ACTION::SPELL_1261215;
206 pub(crate) const TAKEDOWN_DAMAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::survival_hunter::damage::ACTION::SPELL_1253859;
207 pub(crate) const TAKEDOWN_PET: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::survival_hunter::damage::ACTION::SPELL_1253862;
208 pub(crate) const FLAMEFANG_PITCH_DAMAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::survival_hunter::damage::ACTION::SPELL_1251595;
209 pub(crate) const FLAMEFANG_PITCH_AOE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::survival_hunter::damage::ACTION::SPELL_1251614;
210 pub(crate) const CLAW: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::survival_hunter::damage::ACTION::SPELL_16827;
211 pub(crate) const STRIKE_AS_ONE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::survival_hunter::damage::ACTION::SPELL_1251779;
212 pub(crate) const BOAR_CHARGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::survival_hunter::damage::ACTION::SPELL_471936;
213 pub(crate) const BOAR_CHARGE_CLEAVE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::survival_hunter::damage::ACTION::SPELL_471938;
214 pub(crate) const STAMPEDE_TICK: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::survival_hunter::damage::ACTION::SPELL_201594;
215 pub(crate) const HOWL_OF_THE_PACK_LEADER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::survival_hunter::damage::ACTION::SPELL_471878;
216 pub(crate) const LUNAR_STORM_DAMAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::survival_hunter::damage::ACTION::SPELL_1253733;
217 pub(crate) const MOONLIGHT_CHAKRAM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::survival_hunter::damage::ACTION::SPELL_1264949;
218 pub(crate) const MOONLIGHT_CHAKRAM_DAMAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::survival_hunter::damage::ACTION::SPELL_1266081;
219 pub(crate) const TWILIGHT_REQUIEM_DAMAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::survival_hunter::damage::ACTION::SPELL_1266096;
220}
221pub(crate) mod DAMAGE_AURA {
222 pub(crate) const UNNATURAL_CAUSES: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::survival_hunter::damage::ACTION::SPELL_459529;
223 pub(crate) const TIP_OF_THE_SPEAR: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::survival_hunter::damage::ACTION::SPELL_260286;
224 pub(crate) const TRACK_PETS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::survival_hunter::damage::ACTION::SPELL_462599;
225 pub(crate) const MONGOOSE_FURY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::survival_hunter::damage::ACTION::SPELL_259388;
226 pub(crate) const RAPTOR_SWIPE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::survival_hunter::damage::ACTION::SPELL_1273155;
227 pub(crate) const TAKEDOWN: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::survival_hunter::damage::ACTION::SPELL_1250646;
228 pub(crate) const HOWL_COOLDOWN: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::survival_hunter::damage::ACTION::SPELL_471877;
229 pub(crate) const WYVERN_READY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::survival_hunter::damage::ACTION::SPELL_471878;
230 pub(crate) const BOAR_READY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::survival_hunter::damage::ACTION::SPELL_472324;
231 pub(crate) const BEAR_READY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::survival_hunter::damage::ACTION::SPELL_472325;
232 pub(crate) const REND_FLESH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::survival_hunter::damage::ACTION::SPELL_471999;
233 pub(crate) const WYVERNS_CRY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::survival_hunter::damage::ACTION::SPELL_471881;
234 pub(crate) const SIC_EM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::survival_hunter::damage::ACTION::SPELL_1253138;
235}
236pub(crate) mod DAMAGE_TALENT {
237 pub(crate) const FLAMEFANG_PITCH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::survival_hunter::damage::ACTION::SPELL_1251592;
238 pub(crate) const RAPTOR_SWIPE_2: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::survival_hunter::damage::ACTION::SPELL_1259017;
239 pub(crate) const STRIKE_AS_ONE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::survival_hunter::damage::ACTION::SPELL_1251717;
240 pub(crate) const TIP_OF_THE_SPEAR: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::survival_hunter::damage::ACTION::SPELL_260285;
241 pub(crate) const UNNATURAL_CAUSES: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::survival_hunter::damage::ACTION::SPELL_459527;
242}
243pub(crate) mod DAMAGE_REPORTED {}
244pub(crate) mod DAMAGE_EFFECT {
245 pub(crate) const BOAR_CHARGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::survival_hunter::damage::EFFECT::SPELL_471936_EFFECT_1;
246 pub(crate) const BOAR_CHARGE_CLEAVE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::survival_hunter::damage::EFFECT::SPELL_471938_EFFECT_1;
247 pub(crate) const BOOMSTICK_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::survival_hunter::damage::EFFECT::SPELL_1261215_EFFECT_1;
248 pub(crate) const FLAMEFANG_PITCH_AOE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::survival_hunter::damage::EFFECT::SPELL_1251614_EFFECT_1;
249 pub(crate) const FLAMEFANG_PITCH_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::survival_hunter::damage::EFFECT::SPELL_1251595_EFFECT_1;
250 pub(crate) const HOWL_WYVERN_STACKS: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::survival_hunter::damage::EFFECT::SPELL_471876_EFFECT_3;
251 pub(crate) const KILL_COMMAND_PET_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::survival_hunter::damage::EFFECT::SPELL_259277_EFFECT_1;
252 pub(crate) const RAPTOR_STRIKE_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::survival_hunter::damage::EFFECT::SPELL_186270_EFFECT_1;
253 pub(crate) const RAPTOR_SWIPE_CHANCE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::survival_hunter::damage::EFFECT::SPELL_1259019_EFFECT_1;
254 pub(crate) const RAPTOR_SWIPE_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::survival_hunter::damage::EFFECT::SPELL_1262293_EFFECT_1;
255 pub(crate) const RAPTOR_SWIPE_STRIKE_AS_ONE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::survival_hunter::damage::EFFECT::SPELL_1259019_EFFECT_2;
256 pub(crate) const RAPTOR_SWIPE_TWO_PRIMARY: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::survival_hunter::damage::EFFECT::SPELL_1259017_EFFECT_2;
257 pub(crate) const SPIRIT_BOND_DIRECT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::survival_hunter::damage::EFFECT::SPELL_263135_EFFECT_1;
258 pub(crate) const STAMPEDE_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::survival_hunter::damage::EFFECT::SPELL_201594_EFFECT_1;
259 pub(crate) const STRIKE_AS_ONE_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::survival_hunter::damage::EFFECT::SPELL_1251779_EFFECT_1;
260 pub(crate) const TAKEDOWN_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::survival_hunter::damage::EFFECT::SPELL_1253859_EFFECT_1;
261 pub(crate) const TAKEDOWN_FOCUS: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::survival_hunter::damage::EFFECT::SPELL_1258571_EFFECT_1;
262 pub(crate) const TAKEDOWN_PET_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::survival_hunter::damage::EFFECT::SPELL_1253862_EFFECT_1;
263 pub(crate) const TIP_OF_THE_SPEAR_BONUS: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::survival_hunter::damage::EFFECT::SPELL_260285_EFFECT_1;
264 pub(crate) const WILDFIRE_BOMB_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::survival_hunter::damage::EFFECT::SPELL_265157_EFFECT_1;
265 pub(crate) const WILDFIRE_BOMB_DOT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::survival_hunter::damage::EFFECT::SPELL_1253171_EFFECT_1;
266 pub(crate) const MID2_SURVIVAL_4PC_EXTEND_MS: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::survival_hunter::damage::EFFECT::SPELL_1296635_EFFECT_1;
267}
268pub(crate) const AURA_UNNATURAL_CAUSES: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::survival_hunter::AURA_UNNATURAL_CAUSES
269 .bind(wowlab_engine_combat::generated_identities::specs::survival_hunter::PROOF);
270pub(crate) const AURA_TIP_OF_THE_SPEAR: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::survival_hunter::AURA_TIP_OF_THE_SPEAR
271 .bind(wowlab_engine_combat::generated_identities::specs::survival_hunter::PROOF);
272pub(crate) const AURA_TRACK_PETS: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::survival_hunter::AURA_TRACK_PETS
273 .bind(wowlab_engine_combat::generated_identities::specs::survival_hunter::PROOF);
274pub(crate) const AURA_MONGOOSE_FURY: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::survival_hunter::AURA_MONGOOSE_FURY
275 .bind(wowlab_engine_combat::generated_identities::specs::survival_hunter::PROOF);
276pub(crate) const AURA_RAPTOR_SWIPE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::survival_hunter::AURA_RAPTOR_SWIPE
277 .bind(wowlab_engine_combat::generated_identities::specs::survival_hunter::PROOF);
278pub(crate) const AURA_TAKEDOWN: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::survival_hunter::AURA_TAKEDOWN
279 .bind(wowlab_engine_combat::generated_identities::specs::survival_hunter::PROOF);
280pub(crate) const AURA_HOWL_COOLDOWN: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::survival_hunter::AURA_HOWL_COOLDOWN
281 .bind(wowlab_engine_combat::generated_identities::specs::survival_hunter::PROOF);
282pub(crate) const AURA_WYVERN_READY: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::survival_hunter::AURA_WYVERN_READY
283 .bind(wowlab_engine_combat::generated_identities::specs::survival_hunter::PROOF);
284pub(crate) const AURA_BOAR_READY: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::survival_hunter::AURA_BOAR_READY
285 .bind(wowlab_engine_combat::generated_identities::specs::survival_hunter::PROOF);
286pub(crate) const AURA_BEAR_READY: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::survival_hunter::AURA_BEAR_READY
287 .bind(wowlab_engine_combat::generated_identities::specs::survival_hunter::PROOF);
288pub(crate) const AURA_REND_FLESH: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::survival_hunter::AURA_REND_FLESH
289 .bind(wowlab_engine_combat::generated_identities::specs::survival_hunter::PROOF);
290pub(crate) const AURA_WYVERNS_CRY: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::survival_hunter::AURA_WYVERNS_CRY
291 .bind(wowlab_engine_combat::generated_identities::specs::survival_hunter::PROOF);
292pub(crate) const AURA_SIC_EM: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::survival_hunter::AURA_SIC_EM
293 .bind(wowlab_engine_combat::generated_identities::specs::survival_hunter::PROOF);
294pub(crate) const AURA_COUNT: usize = 13;
295const _: () = assert!(
296 AURA_COUNT == 13, "AURA index ABI: count changed -- update positional hook consumers"
297);
298pub(crate) const SPELL_KILL_COMMAND: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::survival_hunter::SPELL_KILL_COMMAND
299 .bind(wowlab_engine_combat::generated_identities::specs::survival_hunter::PROOF);
300pub(crate) const SPELL_WILDFIRE_BOMB: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::survival_hunter::SPELL_WILDFIRE_BOMB
301 .bind(wowlab_engine_combat::generated_identities::specs::survival_hunter::PROOF);
302pub(crate) const SPELL_MONGOOSE_BITE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::survival_hunter::SPELL_MONGOOSE_BITE
303 .bind(wowlab_engine_combat::generated_identities::specs::survival_hunter::PROOF);
304pub(crate) const SPELL_RAPTOR_STRIKE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::survival_hunter::SPELL_RAPTOR_STRIKE
305 .bind(wowlab_engine_combat::generated_identities::specs::survival_hunter::PROOF);
306pub(crate) const SPELL_ARCANE_SHOT: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::survival_hunter::SPELL_ARCANE_SHOT
307 .bind(wowlab_engine_combat::generated_identities::specs::survival_hunter::PROOF);
308pub(crate) const SPELL_STEADY_SHOT: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::survival_hunter::SPELL_STEADY_SHOT
309 .bind(wowlab_engine_combat::generated_identities::specs::survival_hunter::PROOF);
310pub(crate) const SPELL_REVIVE_PET: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::survival_hunter::SPELL_REVIVE_PET
311 .bind(wowlab_engine_combat::generated_identities::specs::survival_hunter::PROOF);
312pub(crate) const SPELL_CALL_PET_1: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::survival_hunter::SPELL_CALL_PET_1
313 .bind(wowlab_engine_combat::generated_identities::specs::survival_hunter::PROOF);
314pub(crate) const SPELL_KILL_COMMAND_PET: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::survival_hunter::SPELL_KILL_COMMAND_PET
315 .bind(wowlab_engine_combat::generated_identities::specs::survival_hunter::PROOF);
316pub(crate) const SPELL_WILDFIRE_BOMB_DAMAGE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::survival_hunter::SPELL_WILDFIRE_BOMB_DAMAGE
317 .bind(wowlab_engine_combat::generated_identities::specs::survival_hunter::PROOF);
318pub(crate) const SPELL_WILDFIRE_BOMB_BLEED: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::survival_hunter::SPELL_WILDFIRE_BOMB_BLEED
319 .bind(wowlab_engine_combat::generated_identities::specs::survival_hunter::PROOF);
320pub(crate) const SPELL_TAKEDOWN: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::survival_hunter::SPELL_TAKEDOWN
321 .bind(wowlab_engine_combat::generated_identities::specs::survival_hunter::PROOF);
322pub(crate) const SPELL_BOOMSTICK: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::survival_hunter::SPELL_BOOMSTICK
323 .bind(wowlab_engine_combat::generated_identities::specs::survival_hunter::PROOF);
324pub(crate) const SPELL_FLAMEFANG_PITCH: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::survival_hunter::SPELL_FLAMEFANG_PITCH
325 .bind(wowlab_engine_combat::generated_identities::specs::survival_hunter::PROOF);
326pub(crate) const SPELL_HATCHET_TOSS: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::survival_hunter::SPELL_HATCHET_TOSS
327 .bind(wowlab_engine_combat::generated_identities::specs::survival_hunter::PROOF);
328pub(crate) const SPELL_RAPTOR_SWIPE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::survival_hunter::SPELL_RAPTOR_SWIPE
329 .bind(wowlab_engine_combat::generated_identities::specs::survival_hunter::PROOF);
330pub(crate) const SPELL_BOOMSTICK_DAMAGE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::survival_hunter::SPELL_BOOMSTICK_DAMAGE
331 .bind(wowlab_engine_combat::generated_identities::specs::survival_hunter::PROOF);
332pub(crate) const SPELL_TAKEDOWN_DAMAGE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::survival_hunter::SPELL_TAKEDOWN_DAMAGE
333 .bind(wowlab_engine_combat::generated_identities::specs::survival_hunter::PROOF);
334pub(crate) const SPELL_TAKEDOWN_PET: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::survival_hunter::SPELL_TAKEDOWN_PET
335 .bind(wowlab_engine_combat::generated_identities::specs::survival_hunter::PROOF);
336pub(crate) const SPELL_FLAMEFANG_PITCH_DAMAGE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::survival_hunter::SPELL_FLAMEFANG_PITCH_DAMAGE
337 .bind(wowlab_engine_combat::generated_identities::specs::survival_hunter::PROOF);
338pub(crate) const SPELL_FLAMEFANG_PITCH_AOE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::survival_hunter::SPELL_FLAMEFANG_PITCH_AOE
339 .bind(wowlab_engine_combat::generated_identities::specs::survival_hunter::PROOF);
340pub(crate) const SPELL_CLAW: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::survival_hunter::SPELL_CLAW
341 .bind(wowlab_engine_combat::generated_identities::specs::survival_hunter::PROOF);
342pub(crate) const SPELL_STRIKE_AS_ONE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::survival_hunter::SPELL_STRIKE_AS_ONE
343 .bind(wowlab_engine_combat::generated_identities::specs::survival_hunter::PROOF);
344pub(crate) const SPELL_BOAR_CHARGE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::survival_hunter::SPELL_BOAR_CHARGE
345 .bind(wowlab_engine_combat::generated_identities::specs::survival_hunter::PROOF);
346pub(crate) const SPELL_BOAR_CHARGE_CLEAVE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::survival_hunter::SPELL_BOAR_CHARGE_CLEAVE
347 .bind(wowlab_engine_combat::generated_identities::specs::survival_hunter::PROOF);
348pub(crate) const SPELL_STAMPEDE_TICK: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::survival_hunter::SPELL_STAMPEDE_TICK
349 .bind(wowlab_engine_combat::generated_identities::specs::survival_hunter::PROOF);
350pub(crate) const SPELL_COUNT: usize = 26;
351const _: () = assert!(
352 SPELL_COUNT == 26,
353 "SPELL index ABI: count changed -- update positional hook consumers"
354);
355pub(crate) mod EFFECT {
356 pub(crate) const BOAR_CHARGE: (u32, u8) = (471_936, 1);
358 pub(crate) const BOAR_CHARGE_CLEAVE: (u32, u8) = (471_938, 1);
360 pub(crate) const BOOMSTICK_DAMAGE: (u32, u8) = (1_261_215, 1);
362 pub(crate) const FLAMEFANG_PITCH_AOE: (u32, u8) = (1_251_614, 1);
364 pub(crate) const FLAMEFANG_PITCH_DAMAGE: (u32, u8) = (1_251_595, 1);
366 pub(crate) const HOWL_WYVERN_STACKS: (u32, u8) = (471_876, 3);
368 pub(crate) const KILL_COMMAND_PET_DAMAGE: (u32, u8) = (259_277, 1);
370 pub(crate) const RAPTOR_STRIKE_DAMAGE: (u32, u8) = (186_270, 1);
372 pub(crate) const RAPTOR_SWIPE_CHANCE: (u32, u8) = (1_259_019, 1);
374 pub(crate) const RAPTOR_SWIPE_DAMAGE: (u32, u8) = (1_262_293, 1);
376 pub(crate) const RAPTOR_SWIPE_STRIKE_AS_ONE: (u32, u8) = (1_259_019, 2);
378 pub(crate) const RAPTOR_SWIPE_TWO_PRIMARY: (u32, u8) = (1_259_017, 2);
380 pub(crate) const SPIRIT_BOND_DIRECT: (u32, u8) = (263_135, 1);
382 pub(crate) const STAMPEDE_DAMAGE: (u32, u8) = (201_594, 1);
384 pub(crate) const STRIKE_AS_ONE_DAMAGE: (u32, u8) = (1_251_779, 1);
386 pub(crate) const TAKEDOWN_DAMAGE: (u32, u8) = (1_253_859, 1);
388 pub(crate) const TAKEDOWN_FOCUS: (u32, u8) = (1_258_571, 1);
390 pub(crate) const TAKEDOWN_PET_DAMAGE: (u32, u8) = (1_253_862, 1);
392 pub(crate) const TIP_OF_THE_SPEAR_BONUS: (u32, u8) = (260_285, 1);
394 pub(crate) const WILDFIRE_BOMB_DAMAGE: (u32, u8) = (265_157, 1);
396 pub(crate) const WILDFIRE_BOMB_DOT: (u32, u8) = (1_253_171, 1);
398 pub(crate) const MID2_SURVIVAL_4PC_EXTEND_MS: (u32, u8) = (1_296_635, 1);
400}
401static REPORTED_SPELLS: &[(&str, u32)] = &[];
402static DECLARED_SPELL_IDS: &[u32] = &[
403 259_489, 259_495, 259_387, 186_270, 185_358, 56641, 982, 883, 259_277, 265_157,
404 1_253_171, 1_250_646, 1_261_193, 1_251_592, 193_265, 1_262_293, 1_261_215, 1_253_859,
405 1_253_862, 1_251_595, 1_251_614, 16827, 1_251_779, 471_936, 471_938, 201_594,
406 459_529, 260_286, 462_599, 259_388, 1_273_155, 471_877, 471_878, 472_324, 472_325,
407 471_999, 471_881, 1_253_138, 1_259_017, 1_251_717, 260_285, 459_527, 6603, 263_135,
408 471_876, 471_993, 1_258_571, 1_259_019, 1_296_635, 471_944, 471_939, 321_014,
409 1_253_733, 1_264_949, 1_266_081, 1_266_096, 1_264_946, 1_253_836, 1_253_601,
410 1_253_750,
411];
412static DECLARED_AURA_IDS: &[u32] = &[
413 459_529, 260_286, 462_599, 259_388, 1_273_155, 1_250_646, 471_877, 471_878, 472_324,
414 472_325, 471_999, 471_881, 1_253_138, 472_325, 472_324, 471_944, 471_939, 321_014,
415 471_878, 1_264_946, 1_253_836, 1_253_601, 1_253_750,
416];
417static TALENTS: &[(&str, u32)] = &[
418 ("FLAMEFANG_PITCH", TALENT::FLAMEFANG_PITCH),
419 ("RAPTOR_SWIPE_2", TALENT::RAPTOR_SWIPE_2),
420 ("STRIKE_AS_ONE", TALENT::STRIKE_AS_ONE),
421 ("TIP_OF_THE_SPEAR", TALENT::TIP_OF_THE_SPEAR),
422 ("UNNATURAL_CAUSES", TALENT::UNNATURAL_CAUSES),
423];
424fn aura_unnatural_causes(
425 a: AuraDefinitionDraft,
426 data: &ResolvedGameData,
427) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
428 Ok(
429 a
430 .on_target()
431 .apply_base_from_data(data, 459_529)?
432 .max_stacks(
433 data
434 .require_aura_max_stacks(
435 wowlab_types::sim::SpellIdx::from_raw(459_529),
436 )?,
437 ),
438 )
439}
440fn aura_tip_of_the_spear(
441 a: AuraDefinitionDraft,
442 data: &ResolvedGameData,
443) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
444 Ok(
445 a
446 .on_player()
447 .apply_base_from_data(data, 260_286)?
448 .max_stacks(
449 data
450 .require_aura_max_stacks(
451 wowlab_types::sim::SpellIdx::from_raw(260_286),
452 )?,
453 ),
454 )
455}
456fn aura_track_pets(
457 a: AuraDefinitionDraft,
458 data: &ResolvedGameData,
459) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
460 Ok(
461 a
462 .on_player()
463 .apply_base_from_data(data, 462_599)?
464 .max_stacks(
465 data
466 .require_aura_max_stacks(
467 wowlab_types::sim::SpellIdx::from_raw(462_599),
468 )?,
469 ),
470 )
471}
472fn aura_mongoose_fury(
473 a: AuraDefinitionDraft,
474 data: &ResolvedGameData,
475) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
476 Ok(
477 a
478 .on_player()
479 .apply_base_from_data(data, 259_388)?
480 .max_stacks(
481 data
482 .require_aura_max_stacks(
483 wowlab_types::sim::SpellIdx::from_raw(259_388),
484 )?,
485 )
486 .async_stacks(),
487 )
488}
489fn aura_raptor_swipe(
490 a: AuraDefinitionDraft,
491 data: &ResolvedGameData,
492) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
493 Ok(
494 a
495 .on_player()
496 .apply_base_from_data(data, 1_273_155)?
497 .max_stacks(
498 data
499 .require_aura_max_stacks(
500 wowlab_types::sim::SpellIdx::from_raw(1_273_155),
501 )?,
502 ),
503 )
504}
505fn aura_takedown(
506 a: AuraDefinitionDraft,
507 data: &ResolvedGameData,
508) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
509 Ok(
510 a
511 .on_player()
512 .apply_base_from_data(data, 1_250_646)?
513 .max_stacks(
514 data
515 .require_aura_max_stacks(
516 wowlab_types::sim::SpellIdx::from_raw(1_250_646),
517 )?,
518 ),
519 )
520}
521fn aura_howl_cooldown(
522 a: AuraDefinitionDraft,
523 data: &ResolvedGameData,
524) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
525 Ok(
526 a
527 .on_player()
528 .apply_base_from_data(data, 471_877)?
529 .max_stacks(
530 data
531 .require_aura_max_stacks(
532 wowlab_types::sim::SpellIdx::from_raw(471_877),
533 )?,
534 )
535 .on_expire(crate::hooks::survival_hunter::howl_cooldown_expire_hook),
536 )
537}
538fn aura_wyvern_ready(
539 a: AuraDefinitionDraft,
540 data: &ResolvedGameData,
541) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
542 Ok(
543 a
544 .on_player()
545 .apply_base_from_data(data, 471_878)?
546 .max_stacks(
547 data
548 .require_aura_max_stacks(
549 wowlab_types::sim::SpellIdx::from_raw(471_878),
550 )?,
551 ),
552 )
553}
554fn aura_boar_ready(
555 a: AuraDefinitionDraft,
556 data: &ResolvedGameData,
557) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
558 Ok(
559 a
560 .on_player()
561 .apply_base_from_data(data, 472_324)?
562 .max_stacks(
563 data
564 .require_aura_max_stacks(
565 wowlab_types::sim::SpellIdx::from_raw(472_324),
566 )?,
567 ),
568 )
569}
570fn aura_bear_ready(
571 a: AuraDefinitionDraft,
572 data: &ResolvedGameData,
573) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
574 Ok(
575 a
576 .on_player()
577 .apply_base_from_data(data, 472_325)?
578 .max_stacks(
579 data
580 .require_aura_max_stacks(
581 wowlab_types::sim::SpellIdx::from_raw(472_325),
582 )?,
583 ),
584 )
585}
586fn aura_rend_flesh(
587 a: AuraDefinitionDraft,
588 data: &ResolvedGameData,
589) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
590 a.on_target()
591 .apply_base_from_data(data, 471_999)?
592 .max_stacks(
593 data.require_aura_max_stacks(wowlab_types::sim::SpellIdx::from_raw(471_999))?,
594 )
595 .periodic_damage(
596 wowlab_engine_combat::validated_milliseconds(
597 data.period(wowlab_types::sim::SpellIdx::from_raw(471_999), 1),
598 471_999,
599 "periodic_damage.tick_ms",
600 )?,
601 (((data.ap_coef(wowlab_types::sim::SpellIdx::from_raw(471_999), 1)) * 0.6)
602 * 100.0)
603 .round() / 100.0,
604 wowlab_engine_combat::DamageFlags::PHYSICAL,
605 )
606 .apply_periodic_behavior_from_data(data, 471_999)
607}
608fn aura_wyverns_cry(
609 a: AuraDefinitionDraft,
610 data: &ResolvedGameData,
611) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
612 a.on_player()
613 .duration_ms(
614 wowlab_engine_combat::validated_milliseconds(
615 f64::from(
616 data
617 .require_aura_duration_ms(
618 wowlab_types::sim::SpellIdx::from_raw(471_993),
619 )?,
620 ),
621 471_881,
622 "aura.duration_ms",
623 )?,
624 )
625 .apply_periodic_effect_from_data(data, 471_881)?
626 .apply_duration_behavior_from_data(data, 471_993)?
627 .apply_timing_modifiers_from_data(data, 471_881)?
628 .max_stacks(
629 data.require_aura_max_stacks(wowlab_types::sim::SpellIdx::from_raw(471_881))?,
630 )
631 .apply_periodic_behavior_from_data(data, 471_993)
632}
633fn aura_sic_em(
634 a: AuraDefinitionDraft,
635 data: &ResolvedGameData,
636) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
637 a.on_target()
638 .apply_base_from_data(data, 1_253_138)?
639 .max_stacks(
640 data
641 .require_aura_max_stacks(
642 wowlab_types::sim::SpellIdx::from_raw(1_253_138),
643 )?,
644 )
645 .periodic_damage(
646 wowlab_engine_combat::validated_milliseconds(
647 data.period(wowlab_types::sim::SpellIdx::from_raw(1_253_138), 1),
648 1_253_138,
649 "periodic_damage.tick_ms",
650 )?,
651 (((data.ap_coef(wowlab_types::sim::SpellIdx::from_raw(1_253_138), 1)) * 0.6)
652 * 1000.0)
653 .round() / 1000.0,
654 wowlab_engine_combat::DamageFlags::PHYSICAL,
655 )
656 .apply_periodic_behavior_from_data(data, 1_253_138)
657}
658fn spell_kill_command(
659 s: SpellDefinitionDraft,
660 data: &ResolvedGameData,
661) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
662 Ok(
663 s
664 .apply_base_from_data(data, 259_489)?
665 .gain(15.0)
666 .applies_aura(AURA_TIP_OF_THE_SPEAR)
667 .apply_aoe_from_data(data)
668 .on_cast(crate::hooks::survival_hunter::kill_command_hook),
669 )
670}
671fn spell_wildfire_bomb(
672 s: SpellDefinitionDraft,
673 data: &ResolvedGameData,
674) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
675 Ok(
676 s
677 .apply_base_from_data(data, 259_495)?
678 .apply_aoe_from_data(data)
679 .on_cast(crate::hooks::survival_hunter::wildfire_bomb_hook),
680 )
681}
682fn spell_mongoose_bite(
683 s: SpellDefinitionDraft,
684 data: &ResolvedGameData,
685) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
686 Ok(
687 s
688 .apply_base_from_data(data, 259_387)?
689 .applies_aura(AURA_MONGOOSE_FURY)
690 .apply_aoe_from_data(data),
691 )
692}
693fn spell_raptor_strike(
694 s: SpellDefinitionDraft,
695 data: &ResolvedGameData,
696) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
697 Ok(
698 s
699 .apply_base_from_data(data, 186_270)?
700 .damage_flat(0.0)
701 .apply_aoe_from_data(data)
702 .on_cast(crate::hooks::survival_hunter::raptor_strike_hook),
703 )
704}
705fn spell_arcane_shot(
706 s: SpellDefinitionDraft,
707 data: &ResolvedGameData,
708) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
709 Ok(s.apply_base_from_data(data, 185_358)?.apply_aoe_from_data(data))
710}
711fn spell_steady_shot(
712 s: SpellDefinitionDraft,
713 data: &ResolvedGameData,
714) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
715 Ok(s.apply_base_from_data(data, 56641)?.apply_aoe_from_data(data))
716}
717fn spell_revive_pet(
718 s: SpellDefinitionDraft,
719 data: &ResolvedGameData,
720) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
721 Ok(s.apply_base_from_data(data, 982)?.apply_aoe_from_data(data))
722}
723fn spell_call_pet_1(
724 s: SpellDefinitionDraft,
725 data: &ResolvedGameData,
726) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
727 Ok(s.apply_base_from_data(data, 883)?.apply_aoe_from_data(data))
728}
729fn spell_kill_command_pet(
730 s: SpellDefinitionDraft,
731 data: &ResolvedGameData,
732) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
733 Ok(s.apply_base_from_data(data, 259_277)?.apply_aoe_from_data(data))
734}
735fn spell_wildfire_bomb_damage(
736 s: SpellDefinitionDraft,
737 data: &ResolvedGameData,
738) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
739 Ok(s.apply_base_from_data(data, 265_157)?.apply_aoe_from_data(data))
740}
741fn spell_wildfire_bomb_bleed(
742 s: SpellDefinitionDraft,
743 data: &ResolvedGameData,
744) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
745 Ok(s.apply_base_from_data(data, 1_253_171)?.apply_aoe_from_data(data))
746}
747fn spell_takedown(
748 s: SpellDefinitionDraft,
749 data: &ResolvedGameData,
750) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
751 Ok(
752 s
753 .apply_base_from_data(data, 1_250_646)?
754 .applies_inferred_aura(AURA_TAKEDOWN, 1_250_646)
755 .apply_aoe_from_data(data)
756 .on_cast(crate::hooks::survival_hunter::takedown_hook),
757 )
758}
759fn spell_boomstick(
760 s: SpellDefinitionDraft,
761 data: &ResolvedGameData,
762) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
763 Ok(
764 s
765 .apply_base_from_data(data, 1_261_193)?
766 .damage_flat(0.0)
767 .apply_aoe_from_data(data)
768 .on_cast(crate::hooks::survival_hunter::boomstick_hook),
769 )
770}
771fn spell_flamefang_pitch(
772 s: SpellDefinitionDraft,
773 data: &ResolvedGameData,
774) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
775 Ok(
776 s
777 .apply_base_from_data(data, 1_251_592)?
778 .apply_aoe_from_data(data)
779 .on_cast(crate::hooks::survival_hunter::flamefang_pitch_hook),
780 )
781}
782fn spell_hatchet_toss(
783 s: SpellDefinitionDraft,
784 data: &ResolvedGameData,
785) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
786 Ok(s.apply_base_from_data(data, 193_265)?.apply_aoe_from_data(data))
787}
788fn spell_raptor_swipe(
789 s: SpellDefinitionDraft,
790 data: &ResolvedGameData,
791) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
792 Ok(
793 s
794 .apply_base_from_data(data, 1_262_293)?
795 .applies_inferred_aura(AURA_RAPTOR_SWIPE, 1_273_155)
796 .apply_aoe_from_data(data),
797 )
798}
799fn spell_boomstick_damage(
800 s: SpellDefinitionDraft,
801 data: &ResolvedGameData,
802) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
803 Ok(s.apply_base_from_data(data, 1_261_215)?.apply_aoe_from_data(data))
804}
805fn spell_takedown_damage(
806 s: SpellDefinitionDraft,
807 data: &ResolvedGameData,
808) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
809 Ok(s.apply_base_from_data(data, 1_253_859)?.apply_aoe_from_data(data))
810}
811fn spell_takedown_pet(
812 s: SpellDefinitionDraft,
813 data: &ResolvedGameData,
814) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
815 Ok(s.apply_base_from_data(data, 1_253_862)?.apply_aoe_from_data(data))
816}
817fn spell_flamefang_pitch_damage(
818 s: SpellDefinitionDraft,
819 data: &ResolvedGameData,
820) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
821 Ok(s.apply_base_from_data(data, 1_251_595)?.apply_aoe_from_data(data))
822}
823fn spell_flamefang_pitch_aoe(
824 s: SpellDefinitionDraft,
825 data: &ResolvedGameData,
826) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
827 Ok(s.apply_base_from_data(data, 1_251_614)?.apply_aoe_from_data(data))
828}
829fn spell_claw(
830 s: SpellDefinitionDraft,
831 data: &ResolvedGameData,
832) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
833 Ok(s.apply_base_from_data(data, 16827)?.apply_aoe_from_data(data))
834}
835fn spell_strike_as_one(
836 s: SpellDefinitionDraft,
837 data: &ResolvedGameData,
838) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
839 Ok(s.apply_base_from_data(data, 1_251_779)?.apply_aoe_from_data(data))
840}
841fn spell_boar_charge(
842 s: SpellDefinitionDraft,
843 data: &ResolvedGameData,
844) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
845 Ok(s.apply_base_from_data(data, 471_936)?.apply_aoe_from_data(data))
846}
847fn spell_boar_charge_cleave(
848 s: SpellDefinitionDraft,
849 data: &ResolvedGameData,
850) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
851 Ok(s.apply_base_from_data(data, 471_938)?.apply_aoe_from_data(data))
852}
853fn spell_stampede_tick(
854 s: SpellDefinitionDraft,
855 data: &ResolvedGameData,
856) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
857 Ok(s.apply_base_from_data(data, 201_594)?.apply_aoe_from_data(data))
858}
859pub(crate) fn build_combat_system_draft(
860 params: &wowlab_engine_ports::HandlerParams<'_>,
861) -> Result<CombatSystemDraft, wowlab_engine_ports::EngineError> {
862 let builder = CombatSystemBuilder::new(params.stats.clone())
863 .spec_id(SpecId::Survival)
864 .spec_identity(
865 wowlab_engine_combat::generated_identities::specs::survival_hunter::PROOF,
866 )
867 .hero_talent_trees(DECLARED_METADATA.hero_talent_trees)
868 .effect_identities(
869 wowlab_engine_combat::generated_identities::specs::survival_hunter::damage::ALL,
870 )
871 .effect_identities(wowlab_engine_combat::generated_identities::shared::ALL)
872 .mastery_spell(263_135)
873 .mastery_hook(crate::hooks::survival_hunter::mastery)
874 .resource(
875 "focus",
876 params
877 .game_data
878 .power_max(2)
879 .ok_or_else(|| {
880 wowlab_engine_ports::EngineError::spec_construction(
881 "missing power-type power_max for type_id 2",
882 )
883 })?,
884 params
885 .game_data
886 .power_regen_for_max(
887 2,
888 params
889 .game_data
890 .power_max(2)
891 .ok_or_else(|| {
892 wowlab_engine_ports::EngineError::spec_construction(
893 "missing power-type power_max for type_id 2",
894 )
895 })?,
896 )
897 .ok_or_else(|| {
898 wowlab_engine_ports::EngineError::spec_construction(
899 "missing power-type power_regen_for_max for type_id 2",
900 )
901 })?,
902 )
903 .resource_type_id(2)
904 .resource_start(
905 params
906 .game_data
907 .power_default(2)
908 .ok_or_else(|| {
909 wowlab_engine_ports::EngineError::spec_construction(
910 "missing power-type power_default for type_id 2",
911 )
912 })?,
913 )
914 .has_pet(true)
915 .aura(
916 "unnatural_causes",
917 AURA::UNNATURAL_CAUSES,
918 |a| aura_unnatural_causes(a, ¶ms.game_data),
919 )
920 .aura(
921 "tip_of_the_spear",
922 AURA::TIP_OF_THE_SPEAR,
923 |a| aura_tip_of_the_spear(a, ¶ms.game_data),
924 )
925 .aura("track_pets", AURA::TRACK_PETS, |a| aura_track_pets(a, ¶ms.game_data))
926 .aura(
927 "mongoose_fury",
928 AURA::MONGOOSE_FURY,
929 |a| aura_mongoose_fury(a, ¶ms.game_data),
930 )
931 .aura(
932 "raptor_swipe",
933 AURA::RAPTOR_SWIPE,
934 |a| aura_raptor_swipe(a, ¶ms.game_data),
935 )
936 .aura("takedown", AURA::TAKEDOWN, |a| aura_takedown(a, ¶ms.game_data))
937 .aura(
938 "howl_cooldown",
939 AURA::HOWL_COOLDOWN,
940 |a| aura_howl_cooldown(a, ¶ms.game_data),
941 )
942 .aura(
943 "wyvern_ready",
944 AURA::WYVERN_READY,
945 |a| aura_wyvern_ready(a, ¶ms.game_data),
946 )
947 .aura("boar_ready", AURA::BOAR_READY, |a| aura_boar_ready(a, ¶ms.game_data))
948 .aura("bear_ready", AURA::BEAR_READY, |a| aura_bear_ready(a, ¶ms.game_data))
949 .aura("rend_flesh", AURA::REND_FLESH, |a| aura_rend_flesh(a, ¶ms.game_data))
950 .aura(
951 "wyverns_cry",
952 AURA::WYVERNS_CRY,
953 |a| aura_wyverns_cry(a, ¶ms.game_data),
954 )
955 .aura("sic_em", AURA::SIC_EM, |a| aura_sic_em(a, ¶ms.game_data))
956 .spell(
957 "kill_command",
958 SPELL::KILL_COMMAND,
959 |s| spell_kill_command(s, ¶ms.game_data),
960 )
961 .spell(
962 "wildfire_bomb",
963 SPELL::WILDFIRE_BOMB,
964 |s| spell_wildfire_bomb(s, ¶ms.game_data),
965 )
966 .spell(
967 "mongoose_bite",
968 SPELL::MONGOOSE_BITE,
969 |s| spell_mongoose_bite(s, ¶ms.game_data),
970 )
971 .spell(
972 "raptor_strike",
973 SPELL::RAPTOR_STRIKE,
974 |s| spell_raptor_strike(s, ¶ms.game_data),
975 )
976 .spell(
977 "arcane_shot",
978 SPELL::ARCANE_SHOT,
979 |s| spell_arcane_shot(s, ¶ms.game_data),
980 )
981 .spell(
982 "steady_shot",
983 SPELL::STEADY_SHOT,
984 |s| spell_steady_shot(s, ¶ms.game_data),
985 )
986 .spell(
987 "revive_pet",
988 SPELL::REVIVE_PET,
989 |s| spell_revive_pet(s, ¶ms.game_data),
990 )
991 .spell(
992 "call_pet_1",
993 SPELL::CALL_PET_1,
994 |s| spell_call_pet_1(s, ¶ms.game_data),
995 )
996 .spell(
997 "kill_command_pet",
998 SPELL::KILL_COMMAND_PET,
999 |s| spell_kill_command_pet(s, ¶ms.game_data),
1000 )
1001 .spell(
1002 "wildfire_bomb_damage",
1003 SPELL::WILDFIRE_BOMB_DAMAGE,
1004 |s| spell_wildfire_bomb_damage(s, ¶ms.game_data),
1005 )
1006 .spell(
1007 "wildfire_bomb_bleed",
1008 SPELL::WILDFIRE_BOMB_BLEED,
1009 |s| spell_wildfire_bomb_bleed(s, ¶ms.game_data),
1010 )
1011 .spell("takedown", SPELL::TAKEDOWN, |s| spell_takedown(s, ¶ms.game_data))
1012 .spell("boomstick", SPELL::BOOMSTICK, |s| spell_boomstick(s, ¶ms.game_data))
1013 .spell(
1014 "flamefang_pitch",
1015 SPELL::FLAMEFANG_PITCH,
1016 |s| spell_flamefang_pitch(s, ¶ms.game_data),
1017 )
1018 .spell(
1019 "hatchet_toss",
1020 SPELL::HATCHET_TOSS,
1021 |s| spell_hatchet_toss(s, ¶ms.game_data),
1022 )
1023 .spell(
1024 "raptor_swipe",
1025 SPELL::RAPTOR_SWIPE,
1026 |s| spell_raptor_swipe(s, ¶ms.game_data),
1027 )
1028 .spell(
1029 "boomstick_damage",
1030 SPELL::BOOMSTICK_DAMAGE,
1031 |s| spell_boomstick_damage(s, ¶ms.game_data),
1032 )
1033 .spell(
1034 "takedown_damage",
1035 SPELL::TAKEDOWN_DAMAGE,
1036 |s| spell_takedown_damage(s, ¶ms.game_data),
1037 )
1038 .spell(
1039 "takedown_pet",
1040 SPELL::TAKEDOWN_PET,
1041 |s| spell_takedown_pet(s, ¶ms.game_data),
1042 )
1043 .spell(
1044 "flamefang_pitch_damage",
1045 SPELL::FLAMEFANG_PITCH_DAMAGE,
1046 |s| spell_flamefang_pitch_damage(s, ¶ms.game_data),
1047 )
1048 .spell(
1049 "flamefang_pitch_aoe",
1050 SPELL::FLAMEFANG_PITCH_AOE,
1051 |s| spell_flamefang_pitch_aoe(s, ¶ms.game_data),
1052 )
1053 .spell("claw", SPELL::CLAW, |s| spell_claw(s, ¶ms.game_data))
1054 .spell(
1055 "strike_as_one",
1056 SPELL::STRIKE_AS_ONE,
1057 |s| spell_strike_as_one(s, ¶ms.game_data),
1058 )
1059 .spell(
1060 "boar_charge",
1061 SPELL::BOAR_CHARGE,
1062 |s| spell_boar_charge(s, ¶ms.game_data),
1063 )
1064 .spell(
1065 "boar_charge_cleave",
1066 SPELL::BOAR_CHARGE_CLEAVE,
1067 |s| spell_boar_charge_cleave(s, ¶ms.game_data),
1068 )
1069 .spell(
1070 "stampede_tick",
1071 SPELL::STAMPEDE_TICK,
1072 |s| spell_stampede_tick(s, ¶ms.game_data),
1073 )
1074 .auto_attack(|a| {
1075 a.spell_id(6603).swing_ms(3000).apply_base_from_data(¶ms.game_data)
1076 })
1077 .auto_attack(|a| {
1078 a
1079 .spell_id(6603)
1080 .swing_ms(2000)
1081 .apply_base_from_data(¶ms.game_data)
1082 .ap_coef(0.2)
1083 .is_pet()
1084 .on_swing(crate::hooks::survival_hunter::pet_swing)
1085 })
1086 .game_data(params.game_data.clone())
1087 .talent_spell_ids(TALENTS)
1088 .talent_selections(params.talent_selections)
1089 .talent_companion_aura(TALENT::UNNATURAL_CAUSES, AURA_UNNATURAL_CAUSES)
1090 .set_bonus_auras(params.set_bonus_auras)
1091 .encounter(params.encounter.clone());
1092 let builder = crate::generated::items::register_equipped(
1093 builder,
1094 ¶ms.game_data,
1095 params.equipped_items,
1096 )?;
1097
1098 builder.into_draft()
1099}
1100fn new_handler(
1101 params: wowlab_engine_ports::HandlerParams<'_>,
1102) -> Result<Box<dyn SpecHandler>, wowlab_engine_ports::EngineError> {
1103 let handler = crate::composition::compose_handler(
1104 build_combat_system_draft,
1105 ¶ms,
1106 crate::hooks::survival_hunter::SurvivalHandler::try_new,
1107 )?;
1108
1109 Ok(Box::new(handler))
1110}
1111static DECLARED_METADATA: DeclaredSpecMetadata = DeclaredSpecMetadata {
1112 primary_resource: ResourceType::Focus,
1113 secondary_resource: None,
1114 spell_ids: DECLARED_SPELL_IDS,
1115 aura_ids: DECLARED_AURA_IDS,
1116 server_proc_entries: &[
1117 DeclaredServerProcEntry {
1118 spell_id: 260_286,
1119 attributes: ProcAttributes::REQUIRE_SPELL_MODIFIER.bits()
1120 | ProcAttributes::USE_STACKS_FOR_CHARGES.bits(),
1121 },
1122 ],
1123 talents: TALENTS,
1124 rotation_field_schema: &[],
1125 metrics_plugin_id: None,
1126 hero_talent_trees: &[
1127 HeroTalentTreeDesc {
1128 name: "Pack Leader",
1129 spells: HERO_TREE_PACK_LEADER_SPELLS,
1130 auras: HERO_TREE_PACK_LEADER_AURAS,
1131 },
1132 HeroTalentTreeDesc {
1133 name: "Sentinel",
1134 spells: HERO_TREE_SENTINEL_SPELLS,
1135 auras: HERO_TREE_SENTINEL_AURAS,
1136 },
1137 ],
1138 reported_spells: REPORTED_SPELLS,
1139 masked_passive_effects: &[],
1140 passive_effect_overrides: &[],
1141};
1142pub(super) const SPEC_DESCRIPTOR: SpecDescriptor = SpecDescriptor {
1143 spec_id: SpecId::Survival,
1144 display_name: "Survival Hunter",
1145 metadata: DECLARED_METADATA,
1146 handler_factory: new_handler,
1147};
1148wowlab_engine_combat::smoke_test!(build_combat_system_draft);