Skip to main content

wowlab_engine_content/generated/specs/
survival_hunter.rs

1//! @generated by codegen-cli from manifests/specs/hunter/survival/manifest.toml -- do not edit by hand.
2// Generated code: naming follows game data conventions
3#![allow(non_snake_case, dead_code)]
4use wowlab_types::{combat::ResourceType, game::SpecId};
5use wowlab_engine_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    ///<https://wowlab.gg/inspect/spell/259489>
17    pub(crate) const KILL_COMMAND: u32 = 259_489;
18    ///<https://wowlab.gg/inspect/spell/259495>
19    pub(crate) const WILDFIRE_BOMB: u32 = 259_495;
20    ///<https://wowlab.gg/inspect/spell/259387>
21    pub(crate) const MONGOOSE_BITE: u32 = 259_387;
22    ///<https://wowlab.gg/inspect/spell/186270>
23    pub(crate) const RAPTOR_STRIKE: u32 = 186_270;
24    ///<https://wowlab.gg/inspect/spell/185358>
25    pub(crate) const ARCANE_SHOT: u32 = 185_358;
26    ///<https://wowlab.gg/inspect/spell/56641>
27    pub(crate) const STEADY_SHOT: u32 = 56641;
28    ///<https://wowlab.gg/inspect/spell/982>
29    pub(crate) const REVIVE_PET: u32 = 982;
30    ///<https://wowlab.gg/inspect/spell/883>
31    pub(crate) const CALL_PET_1: u32 = 883;
32    ///<https://wowlab.gg/inspect/spell/259277>
33    pub(crate) const KILL_COMMAND_PET: u32 = 259_277;
34    ///<https://wowlab.gg/inspect/spell/265157>
35    pub(crate) const WILDFIRE_BOMB_DAMAGE: u32 = 265_157;
36    ///<https://wowlab.gg/inspect/spell/1253171>
37    pub(crate) const WILDFIRE_BOMB_BLEED: u32 = 1_253_171;
38    ///<https://wowlab.gg/inspect/spell/1250646>
39    pub(crate) const TAKEDOWN: u32 = 1_250_646;
40    ///<https://wowlab.gg/inspect/spell/1261193>
41    pub(crate) const BOOMSTICK: u32 = 1_261_193;
42    ///<https://wowlab.gg/inspect/spell/1251592>
43    pub(crate) const FLAMEFANG_PITCH: u32 = 1_251_592;
44    ///<https://wowlab.gg/inspect/spell/193265>
45    pub(crate) const HATCHET_TOSS: u32 = 193_265;
46    ///<https://wowlab.gg/inspect/spell/1262293>
47    pub(crate) const RAPTOR_SWIPE: u32 = 1_262_293;
48    ///<https://wowlab.gg/inspect/spell/1261215>
49    pub(crate) const BOOMSTICK_DAMAGE: u32 = 1_261_215;
50    ///<https://wowlab.gg/inspect/spell/1253859>
51    pub(crate) const TAKEDOWN_DAMAGE: u32 = 1_253_859;
52    ///<https://wowlab.gg/inspect/spell/1253862>
53    pub(crate) const TAKEDOWN_PET: u32 = 1_253_862;
54    ///<https://wowlab.gg/inspect/spell/1251595>
55    pub(crate) const FLAMEFANG_PITCH_DAMAGE: u32 = 1_251_595;
56    ///<https://wowlab.gg/inspect/spell/1251614>
57    pub(crate) const FLAMEFANG_PITCH_AOE: u32 = 1_251_614;
58    ///<https://wowlab.gg/inspect/spell/16827>
59    pub(crate) const CLAW: u32 = 16827;
60    ///<https://wowlab.gg/inspect/spell/1251779>
61    pub(crate) const STRIKE_AS_ONE: u32 = 1_251_779;
62    ///<https://wowlab.gg/inspect/spell/471936>
63    pub(crate) const BOAR_CHARGE: u32 = 471_936;
64    ///<https://wowlab.gg/inspect/spell/471938>
65    pub(crate) const BOAR_CHARGE_CLEAVE: u32 = 471_938;
66    ///<https://wowlab.gg/inspect/spell/201594>
67    pub(crate) const STAMPEDE_TICK: u32 = 201_594;
68}
69pub(crate) mod AURA {
70    ///<https://wowlab.gg/inspect/spell/459529>
71    pub(crate) const UNNATURAL_CAUSES: u32 = 459_529;
72    ///<https://wowlab.gg/inspect/spell/260286>
73    pub(crate) const TIP_OF_THE_SPEAR: u32 = 260_286;
74    ///<https://wowlab.gg/inspect/spell/462599>
75    pub(crate) const TRACK_PETS: u32 = 462_599;
76    ///<https://wowlab.gg/inspect/spell/259388>
77    pub(crate) const MONGOOSE_FURY: u32 = 259_388;
78    ///<https://wowlab.gg/inspect/spell/1273155>
79    pub(crate) const RAPTOR_SWIPE: u32 = 1_273_155;
80    ///<https://wowlab.gg/inspect/spell/1250646>
81    pub(crate) const TAKEDOWN: u32 = 1_250_646;
82    ///<https://wowlab.gg/inspect/spell/471877>
83    pub(crate) const HOWL_COOLDOWN: u32 = 471_877;
84    ///<https://wowlab.gg/inspect/spell/471878>
85    pub(crate) const WYVERN_READY: u32 = 471_878;
86    ///<https://wowlab.gg/inspect/spell/472324>
87    pub(crate) const BOAR_READY: u32 = 472_324;
88    ///<https://wowlab.gg/inspect/spell/472325>
89    pub(crate) const BEAR_READY: u32 = 472_325;
90    ///<https://wowlab.gg/inspect/spell/471999>
91    pub(crate) const REND_FLESH: u32 = 471_999;
92    ///<https://wowlab.gg/inspect/spell/471881>
93    pub(crate) const WYVERNS_CRY: u32 = 471_881;
94    ///<https://wowlab.gg/inspect/spell/1253138>
95    pub(crate) const SIC_EM: u32 = 1_253_138;
96}
97pub(crate) mod TALENT {
98    ///<https://wowlab.gg/inspect/spell/1251592>
99    pub(crate) const FLAMEFANG_PITCH: u32 = 1_251_592;
100    ///<https://wowlab.gg/inspect/spell/1259017>
101    pub(crate) const RAPTOR_SWIPE_2: u32 = 1_259_017;
102    ///<https://wowlab.gg/inspect/spell/1251717>
103    pub(crate) const STRIKE_AS_ONE: u32 = 1_251_717;
104    ///<https://wowlab.gg/inspect/spell/260285>
105    pub(crate) const TIP_OF_THE_SPEAR: u32 = 260_285;
106    ///<https://wowlab.gg/inspect/spell/459527>
107    pub(crate) const UNNATURAL_CAUSES: u32 = 459_527;
108}
109pub(crate) mod SET_BONUS {
110    ///<https://wowlab.gg/inspect/spell/1296636>
111    pub(crate) const MID2_SURVIVAL_2PC: u32 = 1_296_636;
112    ///<https://wowlab.gg/inspect/spell/1296635>
113    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            ///<https://wowlab.gg/inspect/spell/471936>
119            pub(crate) const BOAR_CHARGE: u32 = 471_936;
120            ///<https://wowlab.gg/inspect/spell/471938>
121            pub(crate) const BOAR_CHARGE_CLEAVE: u32 = 471_938;
122            ///<https://wowlab.gg/inspect/spell/471878>
123            pub(crate) const HOWL_OF_THE_PACK_LEADER: u32 = 471_878;
124        }
125        pub(crate) mod AURA {
126            ///<https://wowlab.gg/inspect/spell/472325>
127            pub(crate) const BEAR_READY: u32 = 472_325;
128            ///<https://wowlab.gg/inspect/spell/472324>
129            pub(crate) const BOAR_READY: u32 = 472_324;
130            ///<https://wowlab.gg/inspect/spell/471944>
131            pub(crate) const ENVENOMED_FANGS: u32 = 471_944;
132            ///<https://wowlab.gg/inspect/spell/471939>
133            pub(crate) const MONGOOSE_FURY: u32 = 471_939;
134            ///<https://wowlab.gg/inspect/spell/321014>
135            pub(crate) const PACK_MENTALITY: u32 = 321_014;
136            ///<https://wowlab.gg/inspect/spell/471878>
137            pub(crate) const WYVERN_READY: u32 = 471_878;
138        }
139    }
140    pub(crate) mod SENTINEL {
141        pub(crate) mod SPELL {
142            ///<https://wowlab.gg/inspect/spell/1253733>
143            pub(crate) const LUNAR_STORM_DAMAGE: u32 = 1_253_733;
144            ///<https://wowlab.gg/inspect/spell/1264949>
145            pub(crate) const MOONLIGHT_CHAKRAM: u32 = 1_264_949;
146            ///<https://wowlab.gg/inspect/spell/1266081>
147            pub(crate) const MOONLIGHT_CHAKRAM_DAMAGE: u32 = 1_266_081;
148            ///<https://wowlab.gg/inspect/spell/1266096>
149            pub(crate) const TWILIGHT_REQUIEM_DAMAGE: u32 = 1_266_096;
150        }
151        pub(crate) mod AURA {
152            ///<https://wowlab.gg/inspect/spell/1264946>
153            pub(crate) const MOONLIGHT_CHAKRAM_BUFF: u32 = 1_264_946;
154            ///<https://wowlab.gg/inspect/spell/1253836>
155            pub(crate) const SANCTIFIED_ARMAMENTS_DOT: u32 = 1_253_836;
156            ///<https://wowlab.gg/inspect/spell/1253601>
157            pub(crate) const SENTINELS_MARK: u32 = 1_253_601;
158            ///<https://wowlab.gg/inspect/spell/1253750>
159            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    ///<https://wowlab.gg/inspect/spell/471936>
357    pub(crate) const BOAR_CHARGE: (u32, u8) = (471_936, 1);
358    ///<https://wowlab.gg/inspect/spell/471938>
359    pub(crate) const BOAR_CHARGE_CLEAVE: (u32, u8) = (471_938, 1);
360    ///<https://wowlab.gg/inspect/spell/1261215>
361    pub(crate) const BOOMSTICK_DAMAGE: (u32, u8) = (1_261_215, 1);
362    ///<https://wowlab.gg/inspect/spell/1251614>
363    pub(crate) const FLAMEFANG_PITCH_AOE: (u32, u8) = (1_251_614, 1);
364    ///<https://wowlab.gg/inspect/spell/1251595>
365    pub(crate) const FLAMEFANG_PITCH_DAMAGE: (u32, u8) = (1_251_595, 1);
366    ///<https://wowlab.gg/inspect/spell/471876>
367    pub(crate) const HOWL_WYVERN_STACKS: (u32, u8) = (471_876, 3);
368    ///<https://wowlab.gg/inspect/spell/259277>
369    pub(crate) const KILL_COMMAND_PET_DAMAGE: (u32, u8) = (259_277, 1);
370    ///<https://wowlab.gg/inspect/spell/186270>
371    pub(crate) const RAPTOR_STRIKE_DAMAGE: (u32, u8) = (186_270, 1);
372    ///<https://wowlab.gg/inspect/spell/1259019>
373    pub(crate) const RAPTOR_SWIPE_CHANCE: (u32, u8) = (1_259_019, 1);
374    ///<https://wowlab.gg/inspect/spell/1262293>
375    pub(crate) const RAPTOR_SWIPE_DAMAGE: (u32, u8) = (1_262_293, 1);
376    ///<https://wowlab.gg/inspect/spell/1259019>
377    pub(crate) const RAPTOR_SWIPE_STRIKE_AS_ONE: (u32, u8) = (1_259_019, 2);
378    ///<https://wowlab.gg/inspect/spell/1259017>
379    pub(crate) const RAPTOR_SWIPE_TWO_PRIMARY: (u32, u8) = (1_259_017, 2);
380    ///<https://wowlab.gg/inspect/spell/263135>
381    pub(crate) const SPIRIT_BOND_DIRECT: (u32, u8) = (263_135, 1);
382    ///<https://wowlab.gg/inspect/spell/201594>
383    pub(crate) const STAMPEDE_DAMAGE: (u32, u8) = (201_594, 1);
384    ///<https://wowlab.gg/inspect/spell/1251779>
385    pub(crate) const STRIKE_AS_ONE_DAMAGE: (u32, u8) = (1_251_779, 1);
386    ///<https://wowlab.gg/inspect/spell/1253859>
387    pub(crate) const TAKEDOWN_DAMAGE: (u32, u8) = (1_253_859, 1);
388    ///<https://wowlab.gg/inspect/spell/1258571>
389    pub(crate) const TAKEDOWN_FOCUS: (u32, u8) = (1_258_571, 1);
390    ///<https://wowlab.gg/inspect/spell/1253862>
391    pub(crate) const TAKEDOWN_PET_DAMAGE: (u32, u8) = (1_253_862, 1);
392    ///<https://wowlab.gg/inspect/spell/260285>
393    pub(crate) const TIP_OF_THE_SPEAR_BONUS: (u32, u8) = (260_285, 1);
394    ///<https://wowlab.gg/inspect/spell/265157>
395    pub(crate) const WILDFIRE_BOMB_DAMAGE: (u32, u8) = (265_157, 1);
396    ///<https://wowlab.gg/inspect/spell/1253171>
397    pub(crate) const WILDFIRE_BOMB_DOT: (u32, u8) = (1_253_171, 1);
398    ///<https://wowlab.gg/inspect/spell/1296635>
399    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, &params.game_data),
919        )
920        .aura(
921            "tip_of_the_spear",
922            AURA::TIP_OF_THE_SPEAR,
923            |a| aura_tip_of_the_spear(a, &params.game_data),
924        )
925        .aura("track_pets", AURA::TRACK_PETS, |a| aura_track_pets(a, &params.game_data))
926        .aura(
927            "mongoose_fury",
928            AURA::MONGOOSE_FURY,
929            |a| aura_mongoose_fury(a, &params.game_data),
930        )
931        .aura(
932            "raptor_swipe",
933            AURA::RAPTOR_SWIPE,
934            |a| aura_raptor_swipe(a, &params.game_data),
935        )
936        .aura("takedown", AURA::TAKEDOWN, |a| aura_takedown(a, &params.game_data))
937        .aura(
938            "howl_cooldown",
939            AURA::HOWL_COOLDOWN,
940            |a| aura_howl_cooldown(a, &params.game_data),
941        )
942        .aura(
943            "wyvern_ready",
944            AURA::WYVERN_READY,
945            |a| aura_wyvern_ready(a, &params.game_data),
946        )
947        .aura("boar_ready", AURA::BOAR_READY, |a| aura_boar_ready(a, &params.game_data))
948        .aura("bear_ready", AURA::BEAR_READY, |a| aura_bear_ready(a, &params.game_data))
949        .aura("rend_flesh", AURA::REND_FLESH, |a| aura_rend_flesh(a, &params.game_data))
950        .aura(
951            "wyverns_cry",
952            AURA::WYVERNS_CRY,
953            |a| aura_wyverns_cry(a, &params.game_data),
954        )
955        .aura("sic_em", AURA::SIC_EM, |a| aura_sic_em(a, &params.game_data))
956        .spell(
957            "kill_command",
958            SPELL::KILL_COMMAND,
959            |s| spell_kill_command(s, &params.game_data),
960        )
961        .spell(
962            "wildfire_bomb",
963            SPELL::WILDFIRE_BOMB,
964            |s| spell_wildfire_bomb(s, &params.game_data),
965        )
966        .spell(
967            "mongoose_bite",
968            SPELL::MONGOOSE_BITE,
969            |s| spell_mongoose_bite(s, &params.game_data),
970        )
971        .spell(
972            "raptor_strike",
973            SPELL::RAPTOR_STRIKE,
974            |s| spell_raptor_strike(s, &params.game_data),
975        )
976        .spell(
977            "arcane_shot",
978            SPELL::ARCANE_SHOT,
979            |s| spell_arcane_shot(s, &params.game_data),
980        )
981        .spell(
982            "steady_shot",
983            SPELL::STEADY_SHOT,
984            |s| spell_steady_shot(s, &params.game_data),
985        )
986        .spell(
987            "revive_pet",
988            SPELL::REVIVE_PET,
989            |s| spell_revive_pet(s, &params.game_data),
990        )
991        .spell(
992            "call_pet_1",
993            SPELL::CALL_PET_1,
994            |s| spell_call_pet_1(s, &params.game_data),
995        )
996        .spell(
997            "kill_command_pet",
998            SPELL::KILL_COMMAND_PET,
999            |s| spell_kill_command_pet(s, &params.game_data),
1000        )
1001        .spell(
1002            "wildfire_bomb_damage",
1003            SPELL::WILDFIRE_BOMB_DAMAGE,
1004            |s| spell_wildfire_bomb_damage(s, &params.game_data),
1005        )
1006        .spell(
1007            "wildfire_bomb_bleed",
1008            SPELL::WILDFIRE_BOMB_BLEED,
1009            |s| spell_wildfire_bomb_bleed(s, &params.game_data),
1010        )
1011        .spell("takedown", SPELL::TAKEDOWN, |s| spell_takedown(s, &params.game_data))
1012        .spell("boomstick", SPELL::BOOMSTICK, |s| spell_boomstick(s, &params.game_data))
1013        .spell(
1014            "flamefang_pitch",
1015            SPELL::FLAMEFANG_PITCH,
1016            |s| spell_flamefang_pitch(s, &params.game_data),
1017        )
1018        .spell(
1019            "hatchet_toss",
1020            SPELL::HATCHET_TOSS,
1021            |s| spell_hatchet_toss(s, &params.game_data),
1022        )
1023        .spell(
1024            "raptor_swipe",
1025            SPELL::RAPTOR_SWIPE,
1026            |s| spell_raptor_swipe(s, &params.game_data),
1027        )
1028        .spell(
1029            "boomstick_damage",
1030            SPELL::BOOMSTICK_DAMAGE,
1031            |s| spell_boomstick_damage(s, &params.game_data),
1032        )
1033        .spell(
1034            "takedown_damage",
1035            SPELL::TAKEDOWN_DAMAGE,
1036            |s| spell_takedown_damage(s, &params.game_data),
1037        )
1038        .spell(
1039            "takedown_pet",
1040            SPELL::TAKEDOWN_PET,
1041            |s| spell_takedown_pet(s, &params.game_data),
1042        )
1043        .spell(
1044            "flamefang_pitch_damage",
1045            SPELL::FLAMEFANG_PITCH_DAMAGE,
1046            |s| spell_flamefang_pitch_damage(s, &params.game_data),
1047        )
1048        .spell(
1049            "flamefang_pitch_aoe",
1050            SPELL::FLAMEFANG_PITCH_AOE,
1051            |s| spell_flamefang_pitch_aoe(s, &params.game_data),
1052        )
1053        .spell("claw", SPELL::CLAW, |s| spell_claw(s, &params.game_data))
1054        .spell(
1055            "strike_as_one",
1056            SPELL::STRIKE_AS_ONE,
1057            |s| spell_strike_as_one(s, &params.game_data),
1058        )
1059        .spell(
1060            "boar_charge",
1061            SPELL::BOAR_CHARGE,
1062            |s| spell_boar_charge(s, &params.game_data),
1063        )
1064        .spell(
1065            "boar_charge_cleave",
1066            SPELL::BOAR_CHARGE_CLEAVE,
1067            |s| spell_boar_charge_cleave(s, &params.game_data),
1068        )
1069        .spell(
1070            "stampede_tick",
1071            SPELL::STAMPEDE_TICK,
1072            |s| spell_stampede_tick(s, &params.game_data),
1073        )
1074        .auto_attack(|a| {
1075            a.spell_id(6603).swing_ms(3000).apply_base_from_data(&params.game_data)
1076        })
1077        .auto_attack(|a| {
1078            a
1079                .spell_id(6603)
1080                .swing_ms(2000)
1081                .apply_base_from_data(&params.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        &params.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        &params,
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);