Skip to main content

wowlab_engine_content/generated/specs/
windwalker_monk.rs

1//! @generated by codegen-cli from manifests/specs/monk/windwalker/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/100780>
17    pub(crate) const TIGER_PALM: u32 = 100_780;
18    ///<https://wowlab.gg/inspect/spell/100784>
19    pub(crate) const BLACKOUT_KICK: u32 = 100_784;
20    ///<https://wowlab.gg/inspect/spell/107428>
21    pub(crate) const RISING_SUN_KICK: u32 = 107_428;
22    ///<https://wowlab.gg/inspect/spell/152175>
23    pub(crate) const WHIRLING_DRAGON_PUNCH: u32 = 152_175;
24    ///<https://wowlab.gg/inspect/spell/392983>
25    pub(crate) const STRIKE_OF_THE_WINDLORD: u32 = 392_983;
26    ///<https://wowlab.gg/inspect/spell/322109>
27    pub(crate) const TOUCH_OF_DEATH: u32 = 322_109;
28    ///<https://wowlab.gg/inspect/spell/101545>
29    pub(crate) const FLYING_SERPENT_KICK: u32 = 101_545;
30    ///<https://wowlab.gg/inspect/spell/117952>
31    pub(crate) const CRACKLING_JADE_LIGHTNING: u32 = 117_952;
32    ///<https://wowlab.gg/inspect/spell/123986>
33    pub(crate) const CHI_BURST: u32 = 123_986;
34    ///<https://wowlab.gg/inspect/spell/1248815>
35    pub(crate) const JADEFIRE_STOMP: u32 = 1_248_815;
36    ///<https://wowlab.gg/inspect/spell/1249625>
37    pub(crate) const ZENITH: u32 = 1_249_625;
38    ///<https://wowlab.gg/inspect/spell/443028>
39    pub(crate) const CELESTIAL_CONDUIT: u32 = 443_028;
40    ///<https://wowlab.gg/inspect/spell/113656>
41    pub(crate) const FISTS_OF_FURY: u32 = 113_656;
42    ///<https://wowlab.gg/inspect/spell/101546>
43    pub(crate) const SPINNING_CRANE_KICK: u32 = 101_546;
44}
45pub(crate) mod AURA {
46    ///<https://wowlab.gg/inspect/spell/196742>
47    pub(crate) const WHIRLING_DRAGON_PUNCH: u32 = 196_742;
48    ///<https://wowlab.gg/inspect/spell/116768>
49    pub(crate) const BLACKOUT_KICK: u32 = 116_768;
50    ///<https://wowlab.gg/inspect/spell/1249625>
51    pub(crate) const ZENITH: u32 = 1_249_625;
52    ///<https://wowlab.gg/inspect/spell/443421>
53    pub(crate) const HEART_OF_THE_JADE_SERPENT: u32 = 443_421;
54    ///<https://wowlab.gg/inspect/spell/337291>
55    pub(crate) const THE_EMPEROR_S_CAPACITOR: u32 = 337_291;
56    ///<https://wowlab.gg/inspect/spell/1250554>
57    pub(crate) const RUSHING_WIND_KICK: u32 = 1_250_554;
58    ///<https://wowlab.gg/inspect/spell/1297033>
59    pub(crate) const UNBROKEN_RHYTHM: u32 = 1_297_033;
60    ///<https://wowlab.gg/inspect/spell/115636>
61    pub(crate) const COMBO_STRIKES: u32 = 115_636;
62    ///<https://wowlab.gg/inspect/spell/196741>
63    pub(crate) const HIT_COMBO: u32 = 196_741;
64    ///<https://wowlab.gg/inspect/spell/1250041>
65    pub(crate) const HARMONIC_COMBO: u32 = 1_250_041;
66    ///<https://wowlab.gg/inspect/spell/1249756>
67    pub(crate) const COMBO_STRIKES_TIGER_PALM: u32 = 1_249_756;
68    ///<https://wowlab.gg/inspect/spell/1249757>
69    pub(crate) const COMBO_STRIKES_BLACKOUT_KICK: u32 = 1_249_757;
70    ///<https://wowlab.gg/inspect/spell/1249753>
71    pub(crate) const COMBO_STRIKES_RISING_SUN_KICK: u32 = 1_249_753;
72    ///<https://wowlab.gg/inspect/spell/1249758>
73    pub(crate) const COMBO_STRIKES_FISTS_OF_FURY: u32 = 1_249_758;
74    ///<https://wowlab.gg/inspect/spell/1249754>
75    pub(crate) const COMBO_STRIKES_SPINNING_CRANE_KICK: u32 = 1_249_754;
76    ///<https://wowlab.gg/inspect/spell/1249765>
77    pub(crate) const COMBO_STRIKES_WHIRLING_DRAGON_PUNCH: u32 = 1_249_765;
78    ///<https://wowlab.gg/inspect/spell/1249766>
79    pub(crate) const COMBO_STRIKES_STRIKE_OF_THE_WINDLORD: u32 = 1_249_766;
80    ///<https://wowlab.gg/inspect/spell/1249764>
81    pub(crate) const COMBO_STRIKES_CRACKLING_JADE_LIGHTNING: u32 = 1_249_764;
82    ///<https://wowlab.gg/inspect/spell/325202>
83    pub(crate) const DANCE_OF_CHI_JI: u32 = 325_202;
84    ///<https://wowlab.gg/inspect/spell/202090>
85    pub(crate) const TEACHINGS_OF_THE_MONASTERY: u32 = 202_090;
86    ///<https://wowlab.gg/inspect/spell/101546>
87    pub(crate) const SPINNING_CRANE_KICK: u32 = 101_546;
88    ///<https://wowlab.gg/inspect/spell/451297>
89    pub(crate) const MOMENTUM_BOOST: u32 = 451_297;
90    ///<https://wowlab.gg/inspect/spell/451021>
91    pub(crate) const FLURRY_CHARGE: u32 = 451_021;
92    ///<https://wowlab.gg/inspect/spell/1237196>
93    pub(crate) const STAND_READY: u32 = 1_237_196;
94    ///<https://wowlab.gg/inspect/spell/129914>
95    pub(crate) const COMBAT_WISDOM: u32 = 129_914;
96    ///<https://wowlab.gg/inspect/spell/121817>
97    pub(crate) const COMBAT_WISDOM_CYCLE: u32 = 121_817;
98}
99pub(crate) mod TALENT {
100    ///<https://wowlab.gg/inspect/spell/115396>
101    pub(crate) const ASCENSION: u32 = 115_396;
102    ///<https://wowlab.gg/inspect/spell/451485>
103    pub(crate) const BRAWLERS_INTENSITY: u32 = 451_485;
104    ///<https://wowlab.gg/inspect/spell/443028>
105    pub(crate) const CELESTIAL_CONDUIT: u32 = 443_028;
106    ///<https://wowlab.gg/inspect/spell/123986>
107    pub(crate) const CHI_BURST: u32 = 123_986;
108    ///<https://wowlab.gg/inspect/spell/121817>
109    pub(crate) const COMBAT_WISDOM: u32 = 121_817;
110    ///<https://wowlab.gg/inspect/spell/137384>
111    pub(crate) const COMBO_BREAKER: u32 = 137_384;
112    ///<https://wowlab.gg/inspect/spell/325201>
113    pub(crate) const DANCE_OF_CHI_JI: u32 = 325_201;
114    ///<https://wowlab.gg/inspect/spell/451823>
115    pub(crate) const DUAL_THREAT: u32 = 451_823;
116    ///<https://wowlab.gg/inspect/spell/113656>
117    pub(crate) const FISTS_OF_FURY: u32 = 113_656;
118    ///<https://wowlab.gg/inspect/spell/450615>
119    pub(crate) const FLURRY_STRIKES: u32 = 450_615;
120    ///<https://wowlab.gg/inspect/spell/392958>
121    pub(crate) const GLORY_OF_THE_DAWN: u32 = 392_958;
122    ///<https://wowlab.gg/inspect/spell/1250041>
123    pub(crate) const HARMONIC_COMBO: u32 = 1_250_041;
124    ///<https://wowlab.gg/inspect/spell/196740>
125    pub(crate) const HIT_COMBO: u32 = 196_740;
126    ///<https://wowlab.gg/inspect/spell/457974>
127    pub(crate) const JADEFIRE_STOMP: u32 = 457_974;
128    ///<https://wowlab.gg/inspect/spell/1248815>
129    pub(crate) const JADEFIRE_STOMP_DAMAGE: u32 = 1_248_815;
130    ///<https://wowlab.gg/inspect/spell/451294>
131    pub(crate) const MOMENTUM_BOOST: u32 = 451_294;
132    ///<https://wowlab.gg/inspect/spell/450988>
133    pub(crate) const ONE_VERSUS_MANY: u32 = 450_988;
134    ///<https://wowlab.gg/inspect/spell/1250566>
135    pub(crate) const RUSHING_WIND_KICK: u32 = 1_250_566;
136    ///<https://wowlab.gg/inspect/spell/451515>
137    pub(crate) const SEQUENCED_STRIKES: u32 = 451_515;
138    ///<https://wowlab.gg/inspect/spell/392982>
139    pub(crate) const SHADOWBOXING_TREADS: u32 = 392_982;
140    ///<https://wowlab.gg/inspect/spell/1217413>
141    pub(crate) const SLICING_WINDS: u32 = 1_217_413;
142    ///<https://wowlab.gg/inspect/spell/1262603>
143    pub(crate) const STAND_READY: u32 = 1_262_603;
144    ///<https://wowlab.gg/inspect/spell/392983>
145    pub(crate) const STRIKE_OF_THE_WINDLORD: u32 = 392_983;
146    ///<https://wowlab.gg/inspect/spell/1272415>
147    pub(crate) const SUNFIRE_SPIRAL: u32 = 1_272_415;
148    ///<https://wowlab.gg/inspect/spell/116645>
149    pub(crate) const TEACHINGS_OF_THE_MONASTERY: u32 = 116_645;
150    ///<https://wowlab.gg/inspect/spell/392985>
151    pub(crate) const THUNDERFIST: u32 = 392_985;
152    ///<https://wowlab.gg/inspect/spell/152175>
153    pub(crate) const WHIRLING_DRAGON_PUNCH: u32 = 152_175;
154    ///<https://wowlab.gg/inspect/spell/1272821>
155    pub(crate) const WISDOM_OF_THE_WALL: u32 = 1_272_821;
156    ///<https://wowlab.gg/inspect/spell/1249625>
157    pub(crate) const ZENITH: u32 = 1_249_625;
158    ///<https://wowlab.gg/inspect/spell/1272694>
159    pub(crate) const ZENITH_STOMP: u32 = 1_272_694;
160}
161pub(crate) mod SET_BONUS {
162    ///<https://wowlab.gg/inspect/spell/1296621>
163    pub(crate) const MID2_WW_2PC: u32 = 1_296_621;
164    ///<https://wowlab.gg/inspect/spell/1296624>
165    pub(crate) const MID2_WW_4PC: u32 = 1_296_624;
166}
167pub(crate) mod REPORTED_SPELL {
168    ///<https://wowlab.gg/inspect/spell/451839>
169    pub(crate) const DUAL_THREAT: u32 = 451_839;
170    ///<https://wowlab.gg/inspect/spell/392959>
171    pub(crate) const GLORY_OF_THE_DAWN: u32 = 392_959;
172    ///<https://wowlab.gg/inspect/spell/6603>
173    pub(crate) const MELEE: u32 = 6603;
174    ///<https://wowlab.gg/inspect/spell/228649>
175    pub(crate) const TEACHINGS_BLACKOUT_KICK: u32 = 228_649;
176}
177pub(crate) mod HERO {
178    pub(crate) mod SHADO_PAN {
179        pub(crate) mod SPELL {
180            ///<https://wowlab.gg/inspect/spell/450617>
181            pub(crate) const FLURRY_STRIKE: u32 = 450_617;
182            ///<https://wowlab.gg/inspect/spell/451250>
183            pub(crate) const SHADO_OVER_THE_BATTLEFIELD: u32 = 451_250;
184        }
185        pub(crate) mod AURA {
186            ///<https://wowlab.gg/inspect/spell/451021>
187            pub(crate) const FLURRY_CHARGE: u32 = 451_021;
188            ///<https://wowlab.gg/inspect/spell/451037>
189            pub(crate) const HIGH_IMPACT: u32 = 451_037;
190            ///<https://wowlab.gg/inspect/spell/1237196>
191            pub(crate) const STAND_READY: u32 = 1_237_196;
192            ///<https://wowlab.gg/inspect/spell/451214>
193            pub(crate) const WHIRLING_STEEL: u32 = 451_214;
194        }
195    }
196    pub(crate) mod CONDUIT_OF_THE_CELESTIALS {
197        pub(crate) mod SPELL {
198            ///<https://wowlab.gg/inspect/spell/443028>
199            pub(crate) const CELESTIAL_CONDUIT: u32 = 443_028;
200            ///<https://wowlab.gg/inspect/spell/443038>
201            pub(crate) const CELESTIAL_CONDUIT_DAMAGE: u32 = 443_038;
202            ///<https://wowlab.gg/inspect/spell/457917>
203            pub(crate) const COURAGE_OF_THE_WHITE_TIGER_DAMAGE: u32 = 457_917;
204            ///<https://wowlab.gg/inspect/spell/123904>
205            pub(crate) const INVOKE_XUEN: u32 = 123_904;
206            ///<https://wowlab.gg/inspect/spell/443127>
207            pub(crate) const STRENGTH_OF_THE_BLACK_OX_DAMAGE: u32 = 443_127;
208        }
209        pub(crate) mod AURA {
210            ///<https://wowlab.gg/inspect/spell/443028>
211            pub(crate) const CELESTIAL_CONDUIT: u32 = 443_028;
212            ///<https://wowlab.gg/inspect/spell/460127>
213            pub(crate) const COURAGE_OF_THE_WHITE_TIGER: u32 = 460_127;
214            ///<https://wowlab.gg/inspect/spell/443421>
215            pub(crate) const HEART_OF_THE_JADE_SERPENT: u32 = 443_421;
216            ///<https://wowlab.gg/inspect/spell/123904>
217            pub(crate) const INVOKE_XUEN: u32 = 123_904;
218            ///<https://wowlab.gg/inspect/spell/448508>
219            pub(crate) const JADE_SANCTUARY: u32 = 448_508;
220            ///<https://wowlab.gg/inspect/spell/443592>
221            pub(crate) const UNITY_WITHIN: u32 = 443_592;
222            ///<https://wowlab.gg/inspect/spell/1238904>
223            pub(crate) const YULONS_AVATAR: u32 = 1_238_904;
224        }
225    }
226    pub(crate) mod MASTER_OF_HARMONY {
227        pub(crate) mod SPELL {
228            ///<https://wowlab.gg/inspect/spell/450763>
229            pub(crate) const ASPECT_OF_HARMONY_DAMAGE: u32 = 450_763;
230            ///<https://wowlab.gg/inspect/spell/450769>
231            pub(crate) const ASPECT_OF_HARMONY_HEAL: u32 = 450_769;
232            ///<https://wowlab.gg/inspect/spell/1271011>
233            pub(crate) const HARMONIC_SURGE_DAMAGE: u32 = 1_271_011;
234            ///<https://wowlab.gg/inspect/spell/452333>
235            pub(crate) const OVERWHELMING_FORCE_DAMAGE: u32 = 452_333;
236            ///<https://wowlab.gg/inspect/spell/450820>
237            pub(crate) const PURIFIED_SPIRIT_DAMAGE: u32 = 450_820;
238        }
239        pub(crate) mod AURA {
240            ///<https://wowlab.gg/inspect/spell/450521>
241            pub(crate) const ASPECT_OF_HARMONY: u32 = 450_521;
242            ///<https://wowlab.gg/inspect/spell/451508>
243            pub(crate) const BALANCED_STRATAGEM_MAGIC: u32 = 451_508;
244            ///<https://wowlab.gg/inspect/spell/451514>
245            pub(crate) const BALANCED_STRATAGEM_PHYSICAL: u32 = 451_514;
246            ///<https://wowlab.gg/inspect/spell/1270990>
247            pub(crate) const HARMONIC_SURGE: u32 = 1_270_990;
248        }
249    }
250}
251static HERO_TREE_SHADO_PAN_SPELLS: &[(&str, u32)] = &[
252    ("FLURRY_STRIKE", 450_617),
253    ("SHADO_OVER_THE_BATTLEFIELD", 451_250),
254];
255static HERO_TREE_SHADO_PAN_AURAS: &[(&str, u32)] = &[
256    ("FLURRY_CHARGE", 451_021),
257    ("HIGH_IMPACT", 451_037),
258    ("STAND_READY", 1_237_196),
259    ("WHIRLING_STEEL", 451_214),
260];
261static HERO_TREE_CONDUIT_OF_THE_CELESTIALS_SPELLS: &[(&str, u32)] = &[
262    ("CELESTIAL_CONDUIT", 443_028),
263    ("CELESTIAL_CONDUIT_DAMAGE", 443_038),
264    ("COURAGE_OF_THE_WHITE_TIGER_DAMAGE", 457_917),
265    ("INVOKE_XUEN", 123_904),
266    ("STRENGTH_OF_THE_BLACK_OX_DAMAGE", 443_127),
267];
268static HERO_TREE_CONDUIT_OF_THE_CELESTIALS_AURAS: &[(&str, u32)] = &[
269    ("CELESTIAL_CONDUIT", 443_028),
270    ("COURAGE_OF_THE_WHITE_TIGER", 460_127),
271    ("HEART_OF_THE_JADE_SERPENT", 443_421),
272    ("INVOKE_XUEN", 123_904),
273    ("JADE_SANCTUARY", 448_508),
274    ("UNITY_WITHIN", 443_592),
275    ("YULONS_AVATAR", 1_238_904),
276];
277static HERO_TREE_MASTER_OF_HARMONY_SPELLS: &[(&str, u32)] = &[
278    ("ASPECT_OF_HARMONY_DAMAGE", 450_763),
279    ("ASPECT_OF_HARMONY_HEAL", 450_769),
280    ("HARMONIC_SURGE_DAMAGE", 1_271_011),
281    ("OVERWHELMING_FORCE_DAMAGE", 452_333),
282    ("PURIFIED_SPIRIT_DAMAGE", 450_820),
283];
284static HERO_TREE_MASTER_OF_HARMONY_AURAS: &[(&str, u32)] = &[
285    ("ASPECT_OF_HARMONY", 450_521),
286    ("BALANCED_STRATAGEM_MAGIC", 451_508),
287    ("BALANCED_STRATAGEM_PHYSICAL", 451_514),
288    ("HARMONIC_SURGE", 1_270_990),
289];
290pub(crate) mod DAMAGE_SPELL {
291    pub(crate) const TIGER_PALM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_100780;
292    pub(crate) const BLACKOUT_KICK: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_100784;
293    pub(crate) const RISING_SUN_KICK: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_107428;
294    pub(crate) const WHIRLING_DRAGON_PUNCH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_152175;
295    pub(crate) const STRIKE_OF_THE_WINDLORD: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_392983;
296    pub(crate) const TOUCH_OF_DEATH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_322109;
297    pub(crate) const FLYING_SERPENT_KICK: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_101545;
298    pub(crate) const CRACKLING_JADE_LIGHTNING: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_117952;
299    pub(crate) const CHI_BURST: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_123986;
300    pub(crate) const JADEFIRE_STOMP: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_1248815;
301    pub(crate) const ZENITH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_1249625;
302    pub(crate) const CELESTIAL_CONDUIT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_443028;
303    pub(crate) const FISTS_OF_FURY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_113656;
304    pub(crate) const SPINNING_CRANE_KICK: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_101546;
305    pub(crate) const FLURRY_STRIKE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_450617;
306    pub(crate) const SHADO_OVER_THE_BATTLEFIELD: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_451250;
307    pub(crate) const CELESTIAL_CONDUIT_DAMAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_443038;
308    pub(crate) const COURAGE_OF_THE_WHITE_TIGER_DAMAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_457917;
309    pub(crate) const INVOKE_XUEN: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_123904;
310    pub(crate) const STRENGTH_OF_THE_BLACK_OX_DAMAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_443127;
311    pub(crate) const ASPECT_OF_HARMONY_DAMAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_450763;
312    pub(crate) const ASPECT_OF_HARMONY_HEAL: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_450769;
313    pub(crate) const HARMONIC_SURGE_DAMAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_1271011;
314    pub(crate) const OVERWHELMING_FORCE_DAMAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_452333;
315    pub(crate) const PURIFIED_SPIRIT_DAMAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_450820;
316}
317pub(crate) mod DAMAGE_AURA {
318    pub(crate) const WHIRLING_DRAGON_PUNCH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_196742;
319    pub(crate) const BLACKOUT_KICK: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_116768;
320    pub(crate) const ZENITH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_1249625;
321    pub(crate) const HEART_OF_THE_JADE_SERPENT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_443421;
322    pub(crate) const THE_EMPEROR_S_CAPACITOR: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_337291;
323    pub(crate) const RUSHING_WIND_KICK: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_1250554;
324    pub(crate) const UNBROKEN_RHYTHM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_1297033;
325    pub(crate) const COMBO_STRIKES: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_115636;
326    pub(crate) const HIT_COMBO: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_196741;
327    pub(crate) const HARMONIC_COMBO: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_1250041;
328    pub(crate) const COMBO_STRIKES_TIGER_PALM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_1249756;
329    pub(crate) const COMBO_STRIKES_BLACKOUT_KICK: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_1249757;
330    pub(crate) const COMBO_STRIKES_RISING_SUN_KICK: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_1249753;
331    pub(crate) const COMBO_STRIKES_FISTS_OF_FURY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_1249758;
332    pub(crate) const COMBO_STRIKES_SPINNING_CRANE_KICK: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_1249754;
333    pub(crate) const COMBO_STRIKES_WHIRLING_DRAGON_PUNCH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_1249765;
334    pub(crate) const COMBO_STRIKES_STRIKE_OF_THE_WINDLORD: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_1249766;
335    pub(crate) const COMBO_STRIKES_CRACKLING_JADE_LIGHTNING: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_1249764;
336    pub(crate) const DANCE_OF_CHI_JI: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_325202;
337    pub(crate) const TEACHINGS_OF_THE_MONASTERY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_202090;
338    pub(crate) const SPINNING_CRANE_KICK: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_101546;
339    pub(crate) const MOMENTUM_BOOST: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_451297;
340    pub(crate) const FLURRY_CHARGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_451021;
341    pub(crate) const STAND_READY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_1237196;
342    pub(crate) const COMBAT_WISDOM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_129914;
343    pub(crate) const COMBAT_WISDOM_CYCLE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_121817;
344}
345pub(crate) mod DAMAGE_TALENT {
346    pub(crate) const ASCENSION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_115396;
347    pub(crate) const BRAWLERS_INTENSITY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_451485;
348    pub(crate) const CELESTIAL_CONDUIT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_443028;
349    pub(crate) const CHI_BURST: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_123986;
350    pub(crate) const COMBAT_WISDOM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_121817;
351    pub(crate) const COMBO_BREAKER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_137384;
352    pub(crate) const DANCE_OF_CHI_JI: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_325201;
353    pub(crate) const DUAL_THREAT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_451823;
354    pub(crate) const FISTS_OF_FURY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_113656;
355    pub(crate) const FLURRY_STRIKES: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_450615;
356    pub(crate) const GLORY_OF_THE_DAWN: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_392958;
357    pub(crate) const HARMONIC_COMBO: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_1250041;
358    pub(crate) const HIT_COMBO: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_196740;
359    pub(crate) const JADEFIRE_STOMP: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_457974;
360    pub(crate) const JADEFIRE_STOMP_DAMAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_1248815;
361    pub(crate) const MOMENTUM_BOOST: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_451294;
362    pub(crate) const ONE_VERSUS_MANY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_450988;
363    pub(crate) const RUSHING_WIND_KICK: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_1250566;
364    pub(crate) const SEQUENCED_STRIKES: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_451515;
365    pub(crate) const SHADOWBOXING_TREADS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_392982;
366    pub(crate) const SLICING_WINDS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_1217413;
367    pub(crate) const STAND_READY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_1262603;
368    pub(crate) const STRIKE_OF_THE_WINDLORD: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_392983;
369    pub(crate) const SUNFIRE_SPIRAL: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_1272415;
370    pub(crate) const TEACHINGS_OF_THE_MONASTERY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_116645;
371    pub(crate) const THUNDERFIST: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_392985;
372    pub(crate) const WHIRLING_DRAGON_PUNCH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_152175;
373    pub(crate) const WISDOM_OF_THE_WALL: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_1272821;
374    pub(crate) const ZENITH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_1249625;
375    pub(crate) const ZENITH_STOMP: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_1272694;
376}
377pub(crate) mod DAMAGE_REPORTED {
378    pub(crate) const DUAL_THREAT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_451839;
379    pub(crate) const GLORY_OF_THE_DAWN: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_392959;
380    pub(crate) const MELEE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_6603;
381    pub(crate) const TEACHINGS_BLACKOUT_KICK: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ACTION::SPELL_228649;
382}
383pub(crate) mod DAMAGE_EFFECT {
384    pub(crate) const DUAL_THREAT_CHANCE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::EFFECT::SPELL_451823_EFFECT_1;
385    pub(crate) const JADEFIRE_STOMP_DMG: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::EFFECT::SPELL_1248815_EFFECT_1;
386    pub(crate) const WDP_AOE_TICK: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::EFFECT::SPELL_158221_EFFECT_1;
387    pub(crate) const FOF_TICK: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::EFFECT::SPELL_117418_EFFECT_1;
388    pub(crate) const MID2_WW_2PC_EFFECTIVENESS: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::EFFECT::SPELL_1296621_EFFECT_1;
389    pub(crate) const SCK_TICK: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::EFFECT::SPELL_107270_EFFECT_1;
390    pub(crate) const UNBROKEN_RHYTHM_RSK: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::EFFECT::SPELL_1297033_EFFECT_1;
391    pub(crate) const UNBROKEN_RHYTHM_SCK: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::EFFECT::SPELL_1297033_EFFECT_2;
392    pub(crate) const TOTM_BOK_DMG: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::EFFECT::SPELL_228649_EFFECT_1;
393    pub(crate) const TOTM_RESET: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::EFFECT::SPELL_116645_EFFECT_1;
394    pub(crate) const COMBO_BREAKER_CHANCE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::EFFECT::SPELL_137384_EFFECT_1;
395    pub(crate) const GOTD_CHANCE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::EFFECT::SPELL_392958_EFFECT_2;
396    pub(crate) const GOTD_CHI: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::EFFECT::SPELL_392959_EFFECT_3;
397    pub(crate) const GOTD_DMG: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::EFFECT::SPELL_392959_EFFECT_1;
398    pub(crate) const MOMENTUM_HASTE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::EFFECT::SPELL_451294_EFFECT_1;
399    pub(crate) const SEQUENCED_CHANCE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::EFFECT::SPELL_451515_EFFECT_1;
400    pub(crate) const SUNFIRE_SPIRAL_PCT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::EFFECT::SPELL_1272415_EFFECT_1;
401    pub(crate) const FLURRY_CHARGES_2H: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::EFFECT::SPELL_450615_EFFECT_2;
402    pub(crate) const FLURRY_DMG: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::EFFECT::SPELL_450617_EFFECT_1;
403    pub(crate) const OVM_CHARGE_BONUS: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::EFFECT::SPELL_450988_EFFECT_1;
404    pub(crate) const SHADO_DMG: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::EFFECT::SPELL_451250_EFFECT_1;
405    pub(crate) const STAND_READY_COUNT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::EFFECT::SPELL_1262603_EFFECT_1;
406    pub(crate) const STAND_READY_MULT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::EFFECT::SPELL_1262603_EFFECT_2;
407    pub(crate) const WOTW_COUNT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::EFFECT::SPELL_1272821_EFFECT_1;
408    pub(crate) const ZENITH_STOMP_CHI: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::EFFECT::SPELL_1272696_EFFECT_2;
409    pub(crate) const ZENITH_STOMP_DMG: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::EFFECT::SPELL_1272696_EFFECT_1;
410    pub(crate) const BRAWLERS_RSK_CDR: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::EFFECT::SPELL_451485_EFFECT_1;
411    pub(crate) const COMBAT_WISDOM_CHI: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::EFFECT::SPELL_121817_EFFECT_1;
412    pub(crate) const EH_DMG: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::EFFECT::SPELL_115129_EFFECT_1;
413    pub(crate) const EH_DMG_PCT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::EFFECT::SPELL_451968_EFFECT_2;
414    pub(crate) const EH_HEAL_SP: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::EFFECT::SPELL_451968_EFFECT_1;
415}
416pub(crate) const AURA_WHIRLING_DRAGON_PUNCH: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::windwalker_monk::AURA_WHIRLING_DRAGON_PUNCH
417    .bind(wowlab_engine_combat::generated_identities::specs::windwalker_monk::PROOF);
418pub(crate) const AURA_BLACKOUT_KICK: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::windwalker_monk::AURA_BLACKOUT_KICK
419    .bind(wowlab_engine_combat::generated_identities::specs::windwalker_monk::PROOF);
420pub(crate) const AURA_ZENITH: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::windwalker_monk::AURA_ZENITH
421    .bind(wowlab_engine_combat::generated_identities::specs::windwalker_monk::PROOF);
422pub(crate) const AURA_HEART_OF_THE_JADE_SERPENT: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::windwalker_monk::AURA_HEART_OF_THE_JADE_SERPENT
423    .bind(wowlab_engine_combat::generated_identities::specs::windwalker_monk::PROOF);
424pub(crate) const AURA_THE_EMPEROR_S_CAPACITOR: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::windwalker_monk::AURA_THE_EMPEROR_S_CAPACITOR
425    .bind(wowlab_engine_combat::generated_identities::specs::windwalker_monk::PROOF);
426pub(crate) const AURA_RUSHING_WIND_KICK: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::windwalker_monk::AURA_RUSHING_WIND_KICK
427    .bind(wowlab_engine_combat::generated_identities::specs::windwalker_monk::PROOF);
428pub(crate) const AURA_UNBROKEN_RHYTHM: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::windwalker_monk::AURA_UNBROKEN_RHYTHM
429    .bind(wowlab_engine_combat::generated_identities::specs::windwalker_monk::PROOF);
430pub(crate) const AURA_COMBO_STRIKES: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::windwalker_monk::AURA_COMBO_STRIKES
431    .bind(wowlab_engine_combat::generated_identities::specs::windwalker_monk::PROOF);
432pub(crate) const AURA_HIT_COMBO: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::windwalker_monk::AURA_HIT_COMBO
433    .bind(wowlab_engine_combat::generated_identities::specs::windwalker_monk::PROOF);
434pub(crate) const AURA_HARMONIC_COMBO: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::windwalker_monk::AURA_HARMONIC_COMBO
435    .bind(wowlab_engine_combat::generated_identities::specs::windwalker_monk::PROOF);
436pub(crate) const AURA_COMBO_STRIKES_TIGER_PALM: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::windwalker_monk::AURA_COMBO_STRIKES_TIGER_PALM
437    .bind(wowlab_engine_combat::generated_identities::specs::windwalker_monk::PROOF);
438pub(crate) const AURA_COMBO_STRIKES_BLACKOUT_KICK: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::windwalker_monk::AURA_COMBO_STRIKES_BLACKOUT_KICK
439    .bind(wowlab_engine_combat::generated_identities::specs::windwalker_monk::PROOF);
440pub(crate) const AURA_COMBO_STRIKES_RISING_SUN_KICK: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::windwalker_monk::AURA_COMBO_STRIKES_RISING_SUN_KICK
441    .bind(wowlab_engine_combat::generated_identities::specs::windwalker_monk::PROOF);
442pub(crate) const AURA_COMBO_STRIKES_FISTS_OF_FURY: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::windwalker_monk::AURA_COMBO_STRIKES_FISTS_OF_FURY
443    .bind(wowlab_engine_combat::generated_identities::specs::windwalker_monk::PROOF);
444pub(crate) const AURA_COMBO_STRIKES_SPINNING_CRANE_KICK: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::windwalker_monk::AURA_COMBO_STRIKES_SPINNING_CRANE_KICK
445    .bind(wowlab_engine_combat::generated_identities::specs::windwalker_monk::PROOF);
446pub(crate) const AURA_COMBO_STRIKES_WHIRLING_DRAGON_PUNCH: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::windwalker_monk::AURA_COMBO_STRIKES_WHIRLING_DRAGON_PUNCH
447    .bind(wowlab_engine_combat::generated_identities::specs::windwalker_monk::PROOF);
448pub(crate) const AURA_COMBO_STRIKES_STRIKE_OF_THE_WINDLORD: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::windwalker_monk::AURA_COMBO_STRIKES_STRIKE_OF_THE_WINDLORD
449    .bind(wowlab_engine_combat::generated_identities::specs::windwalker_monk::PROOF);
450pub(crate) const AURA_COMBO_STRIKES_CRACKLING_JADE_LIGHTNING: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::windwalker_monk::AURA_COMBO_STRIKES_CRACKLING_JADE_LIGHTNING
451    .bind(wowlab_engine_combat::generated_identities::specs::windwalker_monk::PROOF);
452pub(crate) const AURA_DANCE_OF_CHI_JI: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::windwalker_monk::AURA_DANCE_OF_CHI_JI
453    .bind(wowlab_engine_combat::generated_identities::specs::windwalker_monk::PROOF);
454pub(crate) const AURA_TEACHINGS_OF_THE_MONASTERY: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::windwalker_monk::AURA_TEACHINGS_OF_THE_MONASTERY
455    .bind(wowlab_engine_combat::generated_identities::specs::windwalker_monk::PROOF);
456pub(crate) const AURA_SPINNING_CRANE_KICK: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::windwalker_monk::AURA_SPINNING_CRANE_KICK
457    .bind(wowlab_engine_combat::generated_identities::specs::windwalker_monk::PROOF);
458pub(crate) const AURA_MOMENTUM_BOOST: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::windwalker_monk::AURA_MOMENTUM_BOOST
459    .bind(wowlab_engine_combat::generated_identities::specs::windwalker_monk::PROOF);
460pub(crate) const AURA_FLURRY_CHARGE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::windwalker_monk::AURA_FLURRY_CHARGE
461    .bind(wowlab_engine_combat::generated_identities::specs::windwalker_monk::PROOF);
462pub(crate) const AURA_STAND_READY: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::windwalker_monk::AURA_STAND_READY
463    .bind(wowlab_engine_combat::generated_identities::specs::windwalker_monk::PROOF);
464pub(crate) const AURA_COMBAT_WISDOM: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::windwalker_monk::AURA_COMBAT_WISDOM
465    .bind(wowlab_engine_combat::generated_identities::specs::windwalker_monk::PROOF);
466pub(crate) const AURA_COMBAT_WISDOM_CYCLE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::windwalker_monk::AURA_COMBAT_WISDOM_CYCLE
467    .bind(wowlab_engine_combat::generated_identities::specs::windwalker_monk::PROOF);
468pub(crate) const AURA_COUNT: usize = 26;
469const _: () = assert!(
470    AURA_COUNT == 26, "AURA index ABI: count changed -- update positional hook consumers"
471);
472pub(crate) const SPELL_TIGER_PALM: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::windwalker_monk::SPELL_TIGER_PALM
473    .bind(wowlab_engine_combat::generated_identities::specs::windwalker_monk::PROOF);
474pub(crate) const SPELL_BLACKOUT_KICK: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::windwalker_monk::SPELL_BLACKOUT_KICK
475    .bind(wowlab_engine_combat::generated_identities::specs::windwalker_monk::PROOF);
476pub(crate) const SPELL_RISING_SUN_KICK: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::windwalker_monk::SPELL_RISING_SUN_KICK
477    .bind(wowlab_engine_combat::generated_identities::specs::windwalker_monk::PROOF);
478pub(crate) const SPELL_WHIRLING_DRAGON_PUNCH: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::windwalker_monk::SPELL_WHIRLING_DRAGON_PUNCH
479    .bind(wowlab_engine_combat::generated_identities::specs::windwalker_monk::PROOF);
480pub(crate) const SPELL_STRIKE_OF_THE_WINDLORD: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::windwalker_monk::SPELL_STRIKE_OF_THE_WINDLORD
481    .bind(wowlab_engine_combat::generated_identities::specs::windwalker_monk::PROOF);
482pub(crate) const SPELL_TOUCH_OF_DEATH: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::windwalker_monk::SPELL_TOUCH_OF_DEATH
483    .bind(wowlab_engine_combat::generated_identities::specs::windwalker_monk::PROOF);
484pub(crate) const SPELL_FLYING_SERPENT_KICK: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::windwalker_monk::SPELL_FLYING_SERPENT_KICK
485    .bind(wowlab_engine_combat::generated_identities::specs::windwalker_monk::PROOF);
486pub(crate) const SPELL_CRACKLING_JADE_LIGHTNING: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::windwalker_monk::SPELL_CRACKLING_JADE_LIGHTNING
487    .bind(wowlab_engine_combat::generated_identities::specs::windwalker_monk::PROOF);
488pub(crate) const SPELL_CHI_BURST: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::windwalker_monk::SPELL_CHI_BURST
489    .bind(wowlab_engine_combat::generated_identities::specs::windwalker_monk::PROOF);
490pub(crate) const SPELL_JADEFIRE_STOMP: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::windwalker_monk::SPELL_JADEFIRE_STOMP
491    .bind(wowlab_engine_combat::generated_identities::specs::windwalker_monk::PROOF);
492pub(crate) const SPELL_ZENITH: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::windwalker_monk::SPELL_ZENITH
493    .bind(wowlab_engine_combat::generated_identities::specs::windwalker_monk::PROOF);
494pub(crate) const SPELL_CELESTIAL_CONDUIT: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::windwalker_monk::SPELL_CELESTIAL_CONDUIT
495    .bind(wowlab_engine_combat::generated_identities::specs::windwalker_monk::PROOF);
496pub(crate) const SPELL_FISTS_OF_FURY: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::windwalker_monk::SPELL_FISTS_OF_FURY
497    .bind(wowlab_engine_combat::generated_identities::specs::windwalker_monk::PROOF);
498pub(crate) const SPELL_SPINNING_CRANE_KICK: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::windwalker_monk::SPELL_SPINNING_CRANE_KICK
499    .bind(wowlab_engine_combat::generated_identities::specs::windwalker_monk::PROOF);
500pub(crate) const SPELL_COUNT: usize = 14;
501const _: () = assert!(
502    SPELL_COUNT == 14,
503    "SPELL index ABI: count changed -- update positional hook consumers"
504);
505pub(crate) mod EFFECT {
506    ///<https://wowlab.gg/inspect/spell/451823>
507    pub(crate) const DUAL_THREAT_CHANCE: (u32, u8) = (451_823, 1);
508    ///<https://wowlab.gg/inspect/spell/1248815>
509    pub(crate) const JADEFIRE_STOMP_DMG: (u32, u8) = (1_248_815, 1);
510    ///<https://wowlab.gg/inspect/spell/158221>
511    pub(crate) const WDP_AOE_TICK: (u32, u8) = (158_221, 1);
512    ///<https://wowlab.gg/inspect/spell/117418>
513    pub(crate) const FOF_TICK: (u32, u8) = (117_418, 1);
514    ///<https://wowlab.gg/inspect/spell/1296621>
515    pub(crate) const MID2_WW_2PC_EFFECTIVENESS: (u32, u8) = (1_296_621, 1);
516    ///<https://wowlab.gg/inspect/spell/107270>
517    pub(crate) const SCK_TICK: (u32, u8) = (107_270, 1);
518    ///<https://wowlab.gg/inspect/spell/1297033>
519    pub(crate) const UNBROKEN_RHYTHM_RSK: (u32, u8) = (1_297_033, 1);
520    ///<https://wowlab.gg/inspect/spell/1297033>
521    pub(crate) const UNBROKEN_RHYTHM_SCK: (u32, u8) = (1_297_033, 2);
522    ///<https://wowlab.gg/inspect/spell/228649>
523    pub(crate) const TOTM_BOK_DMG: (u32, u8) = (228_649, 1);
524    ///<https://wowlab.gg/inspect/spell/116645>
525    pub(crate) const TOTM_RESET: (u32, u8) = (116_645, 1);
526    ///<https://wowlab.gg/inspect/spell/137384>
527    pub(crate) const COMBO_BREAKER_CHANCE: (u32, u8) = (137_384, 1);
528    ///<https://wowlab.gg/inspect/spell/392958>
529    pub(crate) const GOTD_CHANCE: (u32, u8) = (392_958, 2);
530    ///<https://wowlab.gg/inspect/spell/392959>
531    pub(crate) const GOTD_CHI: (u32, u8) = (392_959, 3);
532    ///<https://wowlab.gg/inspect/spell/392959>
533    pub(crate) const GOTD_DMG: (u32, u8) = (392_959, 1);
534    ///<https://wowlab.gg/inspect/spell/451294>
535    pub(crate) const MOMENTUM_HASTE: (u32, u8) = (451_294, 1);
536    ///<https://wowlab.gg/inspect/spell/451515>
537    pub(crate) const SEQUENCED_CHANCE: (u32, u8) = (451_515, 1);
538    ///<https://wowlab.gg/inspect/spell/1272415>
539    pub(crate) const SUNFIRE_SPIRAL_PCT: (u32, u8) = (1_272_415, 1);
540    ///<https://wowlab.gg/inspect/spell/450615>
541    pub(crate) const FLURRY_CHARGES_2H: (u32, u8) = (450_615, 2);
542    ///<https://wowlab.gg/inspect/spell/450617>
543    pub(crate) const FLURRY_DMG: (u32, u8) = (450_617, 1);
544    ///<https://wowlab.gg/inspect/spell/450988>
545    pub(crate) const OVM_CHARGE_BONUS: (u32, u8) = (450_988, 1);
546    ///<https://wowlab.gg/inspect/spell/451250>
547    pub(crate) const SHADO_DMG: (u32, u8) = (451_250, 1);
548    ///<https://wowlab.gg/inspect/spell/1262603>
549    pub(crate) const STAND_READY_COUNT: (u32, u8) = (1_262_603, 1);
550    ///<https://wowlab.gg/inspect/spell/1262603>
551    pub(crate) const STAND_READY_MULT: (u32, u8) = (1_262_603, 2);
552    ///<https://wowlab.gg/inspect/spell/1272821>
553    pub(crate) const WOTW_COUNT: (u32, u8) = (1_272_821, 1);
554    ///<https://wowlab.gg/inspect/spell/1272696>
555    pub(crate) const ZENITH_STOMP_CHI: (u32, u8) = (1_272_696, 2);
556    ///<https://wowlab.gg/inspect/spell/1272696>
557    pub(crate) const ZENITH_STOMP_DMG: (u32, u8) = (1_272_696, 1);
558    ///<https://wowlab.gg/inspect/spell/451485>
559    pub(crate) const BRAWLERS_RSK_CDR: (u32, u8) = (451_485, 1);
560    ///<https://wowlab.gg/inspect/spell/121817>
561    pub(crate) const COMBAT_WISDOM_CHI: (u32, u8) = (121_817, 1);
562    ///<https://wowlab.gg/inspect/spell/115129>
563    pub(crate) const EH_DMG: (u32, u8) = (115_129, 1);
564    ///<https://wowlab.gg/inspect/spell/451968>
565    pub(crate) const EH_DMG_PCT: (u32, u8) = (451_968, 2);
566    ///<https://wowlab.gg/inspect/spell/451968>
567    pub(crate) const EH_HEAL_SP: (u32, u8) = (451_968, 1);
568}
569static REPORTED_SPELLS: &[(&str, u32)] = &[
570    ("dual_threat", 451_839),
571    ("glory_of_the_dawn", 392_959),
572    ("melee", 6603),
573    ("teachings_blackout_kick", 228_649),
574];
575static DECLARED_SPELL_IDS: &[u32] = &[
576    100_780, 100_784, 107_428, 152_175, 392_983, 322_109, 101_545, 117_952, 123_986,
577    1_248_815, 1_249_625, 443_028, 113_656, 101_546, 196_742, 116_768, 443_421, 337_291,
578    1_250_554, 1_297_033, 115_636, 196_741, 1_250_041, 1_249_756, 1_249_757, 1_249_753,
579    1_249_758, 1_249_754, 1_249_765, 1_249_766, 1_249_764, 325_202, 202_090, 451_297,
580    451_021, 1_237_196, 129_914, 121_817, 115_396, 451_485, 137_384, 325_201, 451_823,
581    450_615, 392_958, 196_740, 457_974, 451_294, 450_988, 1_250_566, 451_515, 392_982,
582    1_217_413, 1_262_603, 1_272_415, 116_645, 392_985, 1_272_821, 1_272_694, 6603,
583    107_270, 115_129, 117_418, 148_135, 158_221, 228_649, 392_959, 450_617, 451_250,
584    451_767, 451_839, 451_968, 1_272_696, 1_296_621, 451_037, 451_214, 443_038, 457_917,
585    123_904, 443_127, 460_127, 448_508, 443_592, 1_238_904, 450_763, 450_769, 1_271_011,
586    452_333, 450_820, 450_521, 451_508, 451_514, 1_270_990,
587];
588static DECLARED_AURA_IDS: &[u32] = &[
589    196_742, 116_768, 1_249_625, 443_421, 337_291, 1_250_554, 1_297_033, 115_636,
590    196_741, 1_250_041, 1_249_756, 1_249_757, 1_249_753, 1_249_758, 1_249_754, 1_249_765,
591    1_249_766, 1_249_764, 325_202, 202_090, 101_546, 451_297, 451_021, 1_237_196,
592    129_914, 121_817, 451_021, 451_037, 1_237_196, 451_214, 443_028, 460_127, 443_421,
593    123_904, 448_508, 443_592, 1_238_904, 450_521, 451_508, 451_514, 1_270_990,
594];
595static TALENTS: &[(&str, u32)] = &[
596    ("ASCENSION", TALENT::ASCENSION),
597    ("BRAWLERS_INTENSITY", TALENT::BRAWLERS_INTENSITY),
598    ("CELESTIAL_CONDUIT", TALENT::CELESTIAL_CONDUIT),
599    ("CHI_BURST", TALENT::CHI_BURST),
600    ("COMBAT_WISDOM", TALENT::COMBAT_WISDOM),
601    ("COMBO_BREAKER", TALENT::COMBO_BREAKER),
602    ("DANCE_OF_CHI_JI", TALENT::DANCE_OF_CHI_JI),
603    ("DUAL_THREAT", TALENT::DUAL_THREAT),
604    ("FISTS_OF_FURY", TALENT::FISTS_OF_FURY),
605    ("FLURRY_STRIKES", TALENT::FLURRY_STRIKES),
606    ("GLORY_OF_THE_DAWN", TALENT::GLORY_OF_THE_DAWN),
607    ("HARMONIC_COMBO", TALENT::HARMONIC_COMBO),
608    ("HIT_COMBO", TALENT::HIT_COMBO),
609    ("JADEFIRE_STOMP", TALENT::JADEFIRE_STOMP),
610    ("JADEFIRE_STOMP_DAMAGE", TALENT::JADEFIRE_STOMP_DAMAGE),
611    ("MOMENTUM_BOOST", TALENT::MOMENTUM_BOOST),
612    ("ONE_VERSUS_MANY", TALENT::ONE_VERSUS_MANY),
613    ("RUSHING_WIND_KICK", TALENT::RUSHING_WIND_KICK),
614    ("SEQUENCED_STRIKES", TALENT::SEQUENCED_STRIKES),
615    ("SHADOWBOXING_TREADS", TALENT::SHADOWBOXING_TREADS),
616    ("SLICING_WINDS", TALENT::SLICING_WINDS),
617    ("STAND_READY", TALENT::STAND_READY),
618    ("STRIKE_OF_THE_WINDLORD", TALENT::STRIKE_OF_THE_WINDLORD),
619    ("SUNFIRE_SPIRAL", TALENT::SUNFIRE_SPIRAL),
620    ("TEACHINGS_OF_THE_MONASTERY", TALENT::TEACHINGS_OF_THE_MONASTERY),
621    ("THUNDERFIST", TALENT::THUNDERFIST),
622    ("WHIRLING_DRAGON_PUNCH", TALENT::WHIRLING_DRAGON_PUNCH),
623    ("WISDOM_OF_THE_WALL", TALENT::WISDOM_OF_THE_WALL),
624    ("ZENITH", TALENT::ZENITH),
625    ("ZENITH_STOMP", TALENT::ZENITH_STOMP),
626];
627pub(crate) mod WINDWALKER_MONK {
628    pub(crate) const TIGER_PALM_CASTS: u32 = 0;
629    pub(crate) const BLACKOUT_KICK_CASTS: u32 = 1;
630    pub(crate) const RISING_SUN_KICK_CASTS: u32 = 2;
631    pub(crate) const FISTS_OF_FURY_CASTS: u32 = 3;
632    pub(crate) const SPINNING_CRANE_KICK_CASTS: u32 = 4;
633    pub(crate) const WHIRLING_DRAGON_PUNCH_CASTS: u32 = 5;
634    pub(crate) const STRIKE_OF_THE_WINDLORD_CASTS: u32 = 6;
635    pub(crate) const TOUCH_OF_DEATH_CASTS: u32 = 7;
636    pub(crate) const ZENITH_UPTIME_MS: u32 = 8;
637}
638fn aura_whirling_dragon_punch(
639    a: AuraDefinitionDraft,
640    data: &ResolvedGameData,
641) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
642    Ok(
643        a
644            .on_player()
645            .apply_base_from_data(data, 196_742)?
646            .max_stacks(
647                data
648                    .require_aura_max_stacks(
649                        wowlab_types::sim::SpellIdx::from_raw(196_742),
650                    )?,
651            ),
652    )
653}
654fn aura_blackout_kick(
655    a: AuraDefinitionDraft,
656    data: &ResolvedGameData,
657) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
658    a.on_player()
659        .apply_base_from_data(data, 116_768)?
660        .max_stacks(
661            data.require_aura_max_stacks(wowlab_types::sim::SpellIdx::from_raw(116_768))?,
662        )
663        .secondary_spell_cost_percent(
664            data.base_points(wowlab_types::sim::SpellIdx::from_raw(116_768), 1),
665            &[100_784],
666        )
667}
668fn aura_zenith(
669    a: AuraDefinitionDraft,
670    data: &ResolvedGameData,
671) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
672    Ok(
673        a
674            .on_player()
675            .apply_base_from_data(data, 1_249_625)?
676            .max_stacks(
677                data
678                    .require_aura_max_stacks(
679                        wowlab_types::sim::SpellIdx::from_raw(1_249_625),
680                    )?,
681            ),
682    )
683}
684fn aura_heart_of_the_jade_serpent(
685    a: AuraDefinitionDraft,
686    data: &ResolvedGameData,
687) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
688    Ok(
689        a
690            .on_player()
691            .apply_base_from_data(data, 443_421)?
692            .max_stacks(
693                data
694                    .require_aura_max_stacks(
695                        wowlab_types::sim::SpellIdx::from_raw(443_421),
696                    )?,
697            ),
698    )
699}
700fn aura_the_emperor_s_capacitor(
701    a: AuraDefinitionDraft,
702    data: &ResolvedGameData,
703) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
704    Ok(
705        a
706            .on_player()
707            .apply_base_from_data(data, 337_291)?
708            .max_stacks(
709                data
710                    .require_aura_max_stacks(
711                        wowlab_types::sim::SpellIdx::from_raw(337_291),
712                    )?,
713            ),
714    )
715}
716fn aura_rushing_wind_kick(
717    a: AuraDefinitionDraft,
718    data: &ResolvedGameData,
719) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
720    Ok(
721        a
722            .on_player()
723            .apply_base_from_data(data, 1_250_554)?
724            .max_stacks(
725                data
726                    .require_aura_max_stacks(
727                        wowlab_types::sim::SpellIdx::from_raw(1_250_554),
728                    )?,
729            ),
730    )
731}
732fn aura_unbroken_rhythm(
733    a: AuraDefinitionDraft,
734    data: &ResolvedGameData,
735) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
736    Ok(
737        a
738            .on_player()
739            .apply_base_from_data(data, 1_297_033)?
740            .max_stacks(
741                data
742                    .require_aura_max_stacks(
743                        wowlab_types::sim::SpellIdx::from_raw(1_297_033),
744                    )?,
745            ),
746    )
747}
748fn aura_combo_strikes(
749    a: AuraDefinitionDraft,
750    data: &ResolvedGameData,
751) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
752    Ok(
753        a
754            .on_player()
755            .apply_base_from_data(data, 115_636)?
756            .max_stacks(
757                data
758                    .require_aura_max_stacks(
759                        wowlab_types::sim::SpellIdx::from_raw(115_636),
760                    )?,
761            ),
762    )
763}
764fn aura_hit_combo(
765    a: AuraDefinitionDraft,
766    data: &ResolvedGameData,
767) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
768    Ok(
769        a
770            .on_player()
771            .apply_base_from_data(data, 196_741)?
772            .max_stacks(
773                data
774                    .require_aura_max_stacks(
775                        wowlab_types::sim::SpellIdx::from_raw(196_741),
776                    )?,
777            ),
778    )
779}
780fn aura_harmonic_combo(
781    a: AuraDefinitionDraft,
782    data: &ResolvedGameData,
783) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
784    a.on_player()
785        .apply_base_from_data(data, 1_250_041)?
786        .max_stacks(
787            data
788                .require_aura_max_stacks(
789                    wowlab_types::sim::SpellIdx::from_raw(1_250_041),
790                )?,
791        )
792        .secondary_spell_cost_flat(
793            data.base_points(wowlab_types::sim::SpellIdx::from_raw(1_250_041), 1),
794            &[100_784],
795        )
796}
797fn aura_combo_strikes_tiger_palm(
798    a: AuraDefinitionDraft,
799    data: &ResolvedGameData,
800) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
801    Ok(
802        a
803            .on_player()
804            .apply_base_from_data(data, 1_249_756)?
805            .max_stacks(
806                data
807                    .require_aura_max_stacks(
808                        wowlab_types::sim::SpellIdx::from_raw(1_249_756),
809                    )?,
810            ),
811    )
812}
813fn aura_combo_strikes_blackout_kick(
814    a: AuraDefinitionDraft,
815    data: &ResolvedGameData,
816) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
817    Ok(
818        a
819            .on_player()
820            .apply_base_from_data(data, 1_249_757)?
821            .max_stacks(
822                data
823                    .require_aura_max_stacks(
824                        wowlab_types::sim::SpellIdx::from_raw(1_249_757),
825                    )?,
826            ),
827    )
828}
829fn aura_combo_strikes_rising_sun_kick(
830    a: AuraDefinitionDraft,
831    data: &ResolvedGameData,
832) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
833    Ok(
834        a
835            .on_player()
836            .apply_base_from_data(data, 1_249_753)?
837            .max_stacks(
838                data
839                    .require_aura_max_stacks(
840                        wowlab_types::sim::SpellIdx::from_raw(1_249_753),
841                    )?,
842            ),
843    )
844}
845fn aura_combo_strikes_fists_of_fury(
846    a: AuraDefinitionDraft,
847    data: &ResolvedGameData,
848) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
849    Ok(
850        a
851            .on_player()
852            .apply_base_from_data(data, 1_249_758)?
853            .max_stacks(
854                data
855                    .require_aura_max_stacks(
856                        wowlab_types::sim::SpellIdx::from_raw(1_249_758),
857                    )?,
858            ),
859    )
860}
861fn aura_combo_strikes_spinning_crane_kick(
862    a: AuraDefinitionDraft,
863    data: &ResolvedGameData,
864) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
865    Ok(
866        a
867            .on_player()
868            .apply_base_from_data(data, 1_249_754)?
869            .max_stacks(
870                data
871                    .require_aura_max_stacks(
872                        wowlab_types::sim::SpellIdx::from_raw(1_249_754),
873                    )?,
874            ),
875    )
876}
877fn aura_combo_strikes_whirling_dragon_punch(
878    a: AuraDefinitionDraft,
879    data: &ResolvedGameData,
880) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
881    Ok(
882        a
883            .on_player()
884            .apply_base_from_data(data, 1_249_765)?
885            .max_stacks(
886                data
887                    .require_aura_max_stacks(
888                        wowlab_types::sim::SpellIdx::from_raw(1_249_765),
889                    )?,
890            ),
891    )
892}
893fn aura_combo_strikes_strike_of_the_windlord(
894    a: AuraDefinitionDraft,
895    data: &ResolvedGameData,
896) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
897    Ok(
898        a
899            .on_player()
900            .apply_base_from_data(data, 1_249_766)?
901            .max_stacks(
902                data
903                    .require_aura_max_stacks(
904                        wowlab_types::sim::SpellIdx::from_raw(1_249_766),
905                    )?,
906            ),
907    )
908}
909fn aura_combo_strikes_crackling_jade_lightning(
910    a: AuraDefinitionDraft,
911    data: &ResolvedGameData,
912) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
913    Ok(
914        a
915            .on_player()
916            .apply_base_from_data(data, 1_249_764)?
917            .max_stacks(
918                data
919                    .require_aura_max_stacks(
920                        wowlab_types::sim::SpellIdx::from_raw(1_249_764),
921                    )?,
922            ),
923    )
924}
925fn aura_dance_of_chi_ji(
926    a: AuraDefinitionDraft,
927    data: &ResolvedGameData,
928) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
929    a.on_player()
930        .apply_base_from_data(data, 325_202)?
931        .max_stacks(
932            data.require_aura_max_stacks(wowlab_types::sim::SpellIdx::from_raw(325_202))?,
933        )
934        .secondary_spell_cost_flat(
935            data.base_points(wowlab_types::sim::SpellIdx::from_raw(325_202), 1),
936            &[101_546],
937        )
938}
939fn aura_teachings_of_the_monastery(
940    a: AuraDefinitionDraft,
941    data: &ResolvedGameData,
942) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
943    Ok(
944        a
945            .on_player()
946            .apply_base_from_data(data, 202_090)?
947            .max_stacks(
948                data
949                    .require_aura_max_stacks(
950                        wowlab_types::sim::SpellIdx::from_raw(202_090),
951                    )?,
952            ),
953    )
954}
955fn aura_spinning_crane_kick(
956    a: AuraDefinitionDraft,
957    data: &ResolvedGameData,
958) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
959    Ok(
960        a
961            .on_player()
962            .apply_base_from_data(data, 101_546)?
963            .max_stacks(
964                data
965                    .require_aura_max_stacks(
966                        wowlab_types::sim::SpellIdx::from_raw(101_546),
967                    )?,
968            ),
969    )
970}
971fn aura_momentum_boost(
972    a: AuraDefinitionDraft,
973    data: &ResolvedGameData,
974) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
975    Ok(
976        a
977            .on_player()
978            .apply_base_from_data(data, 451_297)?
979            .max_stacks(
980                data
981                    .require_aura_max_stacks(
982                        wowlab_types::sim::SpellIdx::from_raw(451_297),
983                    )?,
984            ),
985    )
986}
987fn aura_flurry_charge(
988    a: AuraDefinitionDraft,
989    data: &ResolvedGameData,
990) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
991    Ok(
992        a
993            .on_player()
994            .apply_base_from_data(data, 451_021)?
995            .max_stacks(
996                data
997                    .require_aura_max_stacks(
998                        wowlab_types::sim::SpellIdx::from_raw(451_021),
999                    )?,
1000            ),
1001    )
1002}
1003fn aura_stand_ready(
1004    a: AuraDefinitionDraft,
1005    data: &ResolvedGameData,
1006) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1007    Ok(
1008        a
1009            .on_player()
1010            .apply_base_from_data(data, 1_237_196)?
1011            .max_stacks(
1012                data
1013                    .require_aura_max_stacks(
1014                        wowlab_types::sim::SpellIdx::from_raw(1_237_196),
1015                    )?,
1016            ),
1017    )
1018}
1019fn aura_combat_wisdom(
1020    a: AuraDefinitionDraft,
1021    data: &ResolvedGameData,
1022) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1023    Ok(
1024        a
1025            .on_player()
1026            .apply_base_from_data(data, 129_914)?
1027            .max_stacks(
1028                data
1029                    .require_aura_max_stacks(
1030                        wowlab_types::sim::SpellIdx::from_raw(129_914),
1031                    )?,
1032            ),
1033    )
1034}
1035fn aura_combat_wisdom_cycle(
1036    a: AuraDefinitionDraft,
1037    data: &ResolvedGameData,
1038) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1039    a.on_player()
1040        .apply_base_from_data(data, 121_817)?
1041        .max_stacks(
1042            data.require_aura_max_stacks(wowlab_types::sim::SpellIdx::from_raw(121_817))?,
1043        )
1044        .periodic_apply_aura(
1045            wowlab_engine_combat::validated_milliseconds(
1046                data.period(wowlab_types::sim::SpellIdx::from_raw(121_817), 2),
1047                121_817,
1048                "periodic_apply_aura.tick_ms",
1049            )?,
1050            24,
1051        )
1052        .apply_periodic_behavior_from_data(data, 121_817)
1053}
1054fn spell_tiger_palm(
1055    s: SpellDefinitionDraft,
1056    data: &ResolvedGameData,
1057) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1058    Ok(
1059        s
1060            .apply_base_from_data(data, 100_780)?
1061            .apply_aoe_from_data(data)
1062            .on_cast(crate::hooks::windwalker_monk::tiger_palm_hook),
1063    )
1064}
1065fn spell_blackout_kick(
1066    s: SpellDefinitionDraft,
1067    data: &ResolvedGameData,
1068) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1069    Ok(
1070        s
1071            .apply_base_from_data(data, 100_784)?
1072            .applies_inferred_aura(AURA_BLACKOUT_KICK, 116_768)
1073            .reduces_cd(
1074                SPELL_RISING_SUN_KICK,
1075                wowlab_engine_combat::validated_milliseconds(
1076                    data.base_points(wowlab_types::sim::SpellIdx::from_raw(100_784), 3),
1077                    100_784,
1078                    "spell.reduces_cd.amount_ms",
1079                )?,
1080            )
1081            .reduces_cd(
1082                SPELL_FISTS_OF_FURY,
1083                wowlab_engine_combat::validated_milliseconds(
1084                    data.base_points(wowlab_types::sim::SpellIdx::from_raw(100_784), 3),
1085                    100_784,
1086                    "spell.reduces_cd.amount_ms",
1087                )?,
1088            )
1089            .apply_aoe_from_data(data)
1090            .on_cast(crate::hooks::windwalker_monk::blackout_kick_hook),
1091    )
1092}
1093fn spell_rising_sun_kick(
1094    s: SpellDefinitionDraft,
1095    data: &ResolvedGameData,
1096) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1097    Ok(
1098        s
1099            .apply_base_from_data(data, 107_428)?
1100            .apply_aoe_from_data(data)
1101            .on_cast(crate::hooks::windwalker_monk::rising_sun_kick_hook),
1102    )
1103}
1104fn spell_whirling_dragon_punch(
1105    s: SpellDefinitionDraft,
1106    data: &ResolvedGameData,
1107) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1108    Ok(
1109        s
1110            .apply_base_from_data(data, 152_175)?
1111            .damage_ap_from_data(
1112                wowlab_engine_domain::dbc::EffectLookup::new(
1113                    data,
1114                    wowlab_types::sim::EffectRef::new(
1115                        wowlab_types::sim::SpellIdx::from_raw(451_767),
1116                        1,
1117                    ),
1118                ),
1119            )?
1120            .applies_inferred_aura(AURA_WHIRLING_DRAGON_PUNCH, 196_742)
1121            .apply_aoe_from_data(data)
1122            .on_cast(crate::hooks::windwalker_monk::whirling_dragon_punch_hook),
1123    )
1124}
1125fn spell_strike_of_the_windlord(
1126    s: SpellDefinitionDraft,
1127    data: &ResolvedGameData,
1128) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1129    Ok(s.apply_base_from_data(data, 392_983)?.apply_aoe_from_data(data))
1130}
1131fn spell_touch_of_death(
1132    s: SpellDefinitionDraft,
1133    data: &ResolvedGameData,
1134) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1135    Ok(s.apply_base_from_data(data, 322_109)?.apply_aoe_from_data(data))
1136}
1137fn spell_flying_serpent_kick(
1138    s: SpellDefinitionDraft,
1139    data: &ResolvedGameData,
1140) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1141    Ok(s.apply_base_from_data(data, 101_545)?.apply_aoe_from_data(data))
1142}
1143fn spell_crackling_jade_lightning(
1144    s: SpellDefinitionDraft,
1145    data: &ResolvedGameData,
1146) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1147    Ok(s.apply_base_from_data(data, 117_952)?.apply_aoe_from_data(data))
1148}
1149fn spell_chi_burst(
1150    s: SpellDefinitionDraft,
1151    data: &ResolvedGameData,
1152) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1153    Ok(
1154        s
1155            .apply_base_from_data(data, 123_986)?
1156            .damage_ap_from_data(
1157                wowlab_engine_domain::dbc::EffectLookup::new(
1158                    data,
1159                    wowlab_types::sim::EffectRef::new(
1160                        wowlab_types::sim::SpellIdx::from_raw(148_135),
1161                        1,
1162                    ),
1163                ),
1164            )?
1165            .apply_aoe_from_data(data),
1166    )
1167}
1168fn spell_jadefire_stomp(
1169    s: SpellDefinitionDraft,
1170    data: &ResolvedGameData,
1171) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1172    Ok(s.apply_base_from_data(data, 1_248_815)?.apply_aoe_from_data(data))
1173}
1174fn spell_zenith(
1175    s: SpellDefinitionDraft,
1176    data: &ResolvedGameData,
1177) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1178    Ok(
1179        s
1180            .apply_base_from_data(data, 1_249_625)?
1181            .applies_inferred_aura(AURA_ZENITH, 1_249_625)
1182            .apply_aoe_from_data(data)
1183            .on_cast(crate::hooks::windwalker_monk::zenith_hook),
1184    )
1185}
1186fn spell_celestial_conduit(
1187    s: SpellDefinitionDraft,
1188    data: &ResolvedGameData,
1189) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1190    Ok(s.apply_base_from_data(data, 443_028)?.apply_aoe_from_data(data))
1191}
1192fn spell_fists_of_fury(
1193    s: SpellDefinitionDraft,
1194    data: &ResolvedGameData,
1195) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1196    Ok(
1197        s
1198            .apply_base_from_data(data, 113_656)?
1199            .apply_aoe_from_data(data)
1200            .channel(
1201                wowlab_engine_combat::validated_channel_tick_count(
1202                    5.0,
1203                    113_656,
1204                    "channel.tick_count",
1205                )?,
1206            )
1207            .on_channel_tick(crate::hooks::windwalker_monk::fists_of_fury_tick_hook)
1208            .on_cast(crate::hooks::windwalker_monk::fists_of_fury_hook),
1209    )
1210}
1211fn spell_spinning_crane_kick(
1212    s: SpellDefinitionDraft,
1213    data: &ResolvedGameData,
1214) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1215    Ok(
1216        s
1217            .apply_base_from_data(data, 101_546)?
1218            .applies_inferred_aura(AURA_SPINNING_CRANE_KICK, 101_546)
1219            .apply_aoe_from_data(data)
1220            .channel(
1221                wowlab_engine_combat::validated_channel_tick_count(
1222                    4.0,
1223                    101_546,
1224                    "channel.tick_count",
1225                )?,
1226            )
1227            .channel_tick_damage_ap_from_data(
1228                wowlab_engine_domain::dbc::EffectLookup::new(
1229                    data,
1230                    wowlab_types::sim::EffectRef::new(
1231                        wowlab_types::sim::SpellIdx::from_raw(107_270),
1232                        1,
1233                    ),
1234                ),
1235            )?
1236            .on_channel_tick(
1237                crate::hooks::windwalker_monk::spinning_crane_kick_tick_hook,
1238            )
1239            .on_cast(crate::hooks::windwalker_monk::spinning_crane_kick_hook),
1240    )
1241}
1242pub(crate) fn build_combat_system_draft(
1243    params: &wowlab_engine_ports::HandlerParams<'_>,
1244) -> Result<CombatSystemDraft, wowlab_engine_ports::EngineError> {
1245    let builder = CombatSystemBuilder::new(params.stats.clone())
1246        .spec_id(SpecId::Windwalker)
1247        .spec_identity(
1248            wowlab_engine_combat::generated_identities::specs::windwalker_monk::PROOF,
1249        )
1250        .hero_talent_trees(DECLARED_METADATA.hero_talent_trees)
1251        .effect_identities(
1252            wowlab_engine_combat::generated_identities::specs::windwalker_monk::damage::ALL,
1253        )
1254        .effect_identities(wowlab_engine_combat::generated_identities::shared::ALL)
1255        .mastery_spell(115_636)
1256        .mastery_hook(crate::hooks::windwalker_monk::mastery)
1257        .resource(
1258            "energy",
1259            params
1260                .game_data
1261                .power_max(3)
1262                .ok_or_else(|| {
1263                    wowlab_engine_ports::EngineError::spec_construction(
1264                        "missing power-type power_max for type_id 3",
1265                    )
1266                })?,
1267            params
1268                .game_data
1269                .power_regen_for_max(
1270                    3,
1271                    params
1272                        .game_data
1273                        .power_max(3)
1274                        .ok_or_else(|| {
1275                            wowlab_engine_ports::EngineError::spec_construction(
1276                                "missing power-type power_max for type_id 3",
1277                            )
1278                        })?,
1279                )
1280                .ok_or_else(|| {
1281                    wowlab_engine_ports::EngineError::spec_construction(
1282                        "missing power-type power_regen_for_max for type_id 3",
1283                    )
1284                })?,
1285        )
1286        .resource_type_id(3)
1287        .resource_start(
1288            params
1289                .game_data
1290                .power_default(3)
1291                .ok_or_else(|| {
1292                    wowlab_engine_ports::EngineError::spec_construction(
1293                        "missing power-type power_default for type_id 3",
1294                    )
1295                })?,
1296        )
1297        .secondary_resource(
1298            "chi",
1299            params
1300                .game_data
1301                .power_max(12)
1302                .ok_or_else(|| {
1303                    wowlab_engine_ports::EngineError::spec_construction(
1304                        "missing power-type power_max for type_id 12",
1305                    )
1306                })?,
1307        )
1308        .secondary_resource_type_id(12)
1309        .aura(
1310            "whirling_dragon_punch",
1311            AURA::WHIRLING_DRAGON_PUNCH,
1312            |a| aura_whirling_dragon_punch(a, &params.game_data),
1313        )
1314        .aura(
1315            "blackout_kick",
1316            AURA::BLACKOUT_KICK,
1317            |a| aura_blackout_kick(a, &params.game_data),
1318        )
1319        .aura("zenith", AURA::ZENITH, |a| aura_zenith(a, &params.game_data))
1320        .aura(
1321            "heart_of_the_jade_serpent",
1322            AURA::HEART_OF_THE_JADE_SERPENT,
1323            |a| aura_heart_of_the_jade_serpent(a, &params.game_data),
1324        )
1325        .aura(
1326            "the_emperors_capacitor",
1327            AURA::THE_EMPEROR_S_CAPACITOR,
1328            |a| aura_the_emperor_s_capacitor(a, &params.game_data),
1329        )
1330        .aura(
1331            "rushing_wind_kick",
1332            AURA::RUSHING_WIND_KICK,
1333            |a| aura_rushing_wind_kick(a, &params.game_data),
1334        )
1335        .aura(
1336            "unbroken_rhythm",
1337            AURA::UNBROKEN_RHYTHM,
1338            |a| aura_unbroken_rhythm(a, &params.game_data),
1339        )
1340        .aura(
1341            "combo_strikes",
1342            AURA::COMBO_STRIKES,
1343            |a| aura_combo_strikes(a, &params.game_data),
1344        )
1345        .aura("hit_combo", AURA::HIT_COMBO, |a| aura_hit_combo(a, &params.game_data))
1346        .aura(
1347            "harmonic_combo",
1348            AURA::HARMONIC_COMBO,
1349            |a| aura_harmonic_combo(a, &params.game_data),
1350        )
1351        .aura(
1352            "combo_strikes_tiger_palm",
1353            AURA::COMBO_STRIKES_TIGER_PALM,
1354            |a| aura_combo_strikes_tiger_palm(a, &params.game_data),
1355        )
1356        .aura(
1357            "combo_strikes_blackout_kick",
1358            AURA::COMBO_STRIKES_BLACKOUT_KICK,
1359            |a| aura_combo_strikes_blackout_kick(a, &params.game_data),
1360        )
1361        .aura(
1362            "combo_strikes_rising_sun_kick",
1363            AURA::COMBO_STRIKES_RISING_SUN_KICK,
1364            |a| aura_combo_strikes_rising_sun_kick(a, &params.game_data),
1365        )
1366        .aura(
1367            "combo_strikes_fists_of_fury",
1368            AURA::COMBO_STRIKES_FISTS_OF_FURY,
1369            |a| aura_combo_strikes_fists_of_fury(a, &params.game_data),
1370        )
1371        .aura(
1372            "combo_strikes_spinning_crane_kick",
1373            AURA::COMBO_STRIKES_SPINNING_CRANE_KICK,
1374            |a| aura_combo_strikes_spinning_crane_kick(a, &params.game_data),
1375        )
1376        .aura(
1377            "combo_strikes_whirling_dragon_punch",
1378            AURA::COMBO_STRIKES_WHIRLING_DRAGON_PUNCH,
1379            |a| aura_combo_strikes_whirling_dragon_punch(a, &params.game_data),
1380        )
1381        .aura(
1382            "combo_strikes_strike_of_the_windlord",
1383            AURA::COMBO_STRIKES_STRIKE_OF_THE_WINDLORD,
1384            |a| aura_combo_strikes_strike_of_the_windlord(a, &params.game_data),
1385        )
1386        .aura(
1387            "combo_strikes_crackling_jade_lightning",
1388            AURA::COMBO_STRIKES_CRACKLING_JADE_LIGHTNING,
1389            |a| aura_combo_strikes_crackling_jade_lightning(a, &params.game_data),
1390        )
1391        .aura(
1392            "dance_of_chi_ji",
1393            AURA::DANCE_OF_CHI_JI,
1394            |a| aura_dance_of_chi_ji(a, &params.game_data),
1395        )
1396        .aura(
1397            "teachings_of_the_monastery",
1398            AURA::TEACHINGS_OF_THE_MONASTERY,
1399            |a| aura_teachings_of_the_monastery(a, &params.game_data),
1400        )
1401        .aura(
1402            "spinning_crane_kick",
1403            AURA::SPINNING_CRANE_KICK,
1404            |a| aura_spinning_crane_kick(a, &params.game_data),
1405        )
1406        .aura(
1407            "momentum_boost",
1408            AURA::MOMENTUM_BOOST,
1409            |a| aura_momentum_boost(a, &params.game_data),
1410        )
1411        .aura(
1412            "flurry_charge",
1413            AURA::FLURRY_CHARGE,
1414            |a| aura_flurry_charge(a, &params.game_data),
1415        )
1416        .aura(
1417            "stand_ready",
1418            AURA::STAND_READY,
1419            |a| aura_stand_ready(a, &params.game_data),
1420        )
1421        .aura(
1422            "combat_wisdom",
1423            AURA::COMBAT_WISDOM,
1424            |a| aura_combat_wisdom(a, &params.game_data),
1425        )
1426        .aura(
1427            "combat_wisdom_cycle",
1428            AURA::COMBAT_WISDOM_CYCLE,
1429            |a| aura_combat_wisdom_cycle(a, &params.game_data),
1430        )
1431        .spell(
1432            "tiger_palm",
1433            SPELL::TIGER_PALM,
1434            |s| spell_tiger_palm(s, &params.game_data),
1435        )
1436        .spell(
1437            "blackout_kick",
1438            SPELL::BLACKOUT_KICK,
1439            |s| spell_blackout_kick(s, &params.game_data),
1440        )
1441        .spell(
1442            "rising_sun_kick",
1443            SPELL::RISING_SUN_KICK,
1444            |s| spell_rising_sun_kick(s, &params.game_data),
1445        )
1446        .spell(
1447            "whirling_dragon_punch",
1448            SPELL::WHIRLING_DRAGON_PUNCH,
1449            |s| spell_whirling_dragon_punch(s, &params.game_data),
1450        )
1451        .spell(
1452            "strike_of_the_windlord",
1453            SPELL::STRIKE_OF_THE_WINDLORD,
1454            |s| spell_strike_of_the_windlord(s, &params.game_data),
1455        )
1456        .spell(
1457            "touch_of_death",
1458            SPELL::TOUCH_OF_DEATH,
1459            |s| spell_touch_of_death(s, &params.game_data),
1460        )
1461        .spell(
1462            "flying_serpent_kick",
1463            SPELL::FLYING_SERPENT_KICK,
1464            |s| spell_flying_serpent_kick(s, &params.game_data),
1465        )
1466        .spell(
1467            "crackling_jade_lightning",
1468            SPELL::CRACKLING_JADE_LIGHTNING,
1469            |s| spell_crackling_jade_lightning(s, &params.game_data),
1470        )
1471        .spell("chi_burst", SPELL::CHI_BURST, |s| spell_chi_burst(s, &params.game_data))
1472        .spell(
1473            "jadefire_stomp",
1474            SPELL::JADEFIRE_STOMP,
1475            |s| spell_jadefire_stomp(s, &params.game_data),
1476        )
1477        .spell("zenith", SPELL::ZENITH, |s| spell_zenith(s, &params.game_data))
1478        .spell(
1479            "celestial_conduit",
1480            SPELL::CELESTIAL_CONDUIT,
1481            |s| spell_celestial_conduit(s, &params.game_data),
1482        )
1483        .spell(
1484            "fists_of_fury",
1485            SPELL::FISTS_OF_FURY,
1486            |s| spell_fists_of_fury(s, &params.game_data),
1487        )
1488        .spell(
1489            "spinning_crane_kick",
1490            SPELL::SPINNING_CRANE_KICK,
1491            |s| spell_spinning_crane_kick(s, &params.game_data),
1492        )
1493        .auto_attack(|a| {
1494            a
1495                .spell_id(6603)
1496                .swing_ms(2600)
1497                .apply_base_from_data(&params.game_data)
1498                .on_swing(crate::hooks::windwalker_monk::swing_hook)
1499        })
1500        .game_data(params.game_data.clone())
1501        .talent_spell_ids(TALENTS)
1502        .talent_selections(params.talent_selections)
1503        .set_bonus_auras(params.set_bonus_auras)
1504        .encounter(params.encounter.clone());
1505    let builder = crate::generated::items::register_equipped(
1506        builder,
1507        &params.game_data,
1508        params.equipped_items,
1509    )?;
1510
1511    builder.into_draft()
1512}
1513fn new_handler(
1514    params: wowlab_engine_ports::HandlerParams<'_>,
1515) -> Result<Box<dyn SpecHandler>, wowlab_engine_ports::EngineError> {
1516    let handler = crate::composition::compose_handler(
1517        build_combat_system_draft,
1518        &params,
1519        crate::hooks::windwalker_monk::WindwalkerHandler::try_new,
1520    )?;
1521
1522    Ok(Box::new(handler))
1523}
1524static DECLARED_METADATA: DeclaredSpecMetadata = DeclaredSpecMetadata {
1525    primary_resource: ResourceType::Energy,
1526    secondary_resource: Some(ResourceType::Chi),
1527    spell_ids: DECLARED_SPELL_IDS,
1528    aura_ids: DECLARED_AURA_IDS,
1529    server_proc_entries: &[
1530        DeclaredServerProcEntry {
1531            spell_id: 129_914,
1532            attributes: ProcAttributes::USE_STACKS_FOR_CHARGES.bits(),
1533        },
1534    ],
1535    talents: TALENTS,
1536    rotation_field_schema: &[],
1537    metrics_plugin_id: None,
1538    hero_talent_trees: &[
1539        HeroTalentTreeDesc {
1540            name: "Shado Pan",
1541            spells: HERO_TREE_SHADO_PAN_SPELLS,
1542            auras: HERO_TREE_SHADO_PAN_AURAS,
1543        },
1544        HeroTalentTreeDesc {
1545            name: "Conduit Of The Celestials",
1546            spells: HERO_TREE_CONDUIT_OF_THE_CELESTIALS_SPELLS,
1547            auras: HERO_TREE_CONDUIT_OF_THE_CELESTIALS_AURAS,
1548        },
1549        HeroTalentTreeDesc {
1550            name: "Master Of Harmony",
1551            spells: HERO_TREE_MASTER_OF_HARMONY_SPELLS,
1552            auras: HERO_TREE_MASTER_OF_HARMONY_AURAS,
1553        },
1554    ],
1555    reported_spells: REPORTED_SPELLS,
1556    masked_passive_effects: &[],
1557    passive_effect_overrides: &[],
1558};
1559pub(super) const SPEC_DESCRIPTOR: SpecDescriptor = SpecDescriptor {
1560    spec_id: SpecId::Windwalker,
1561    display_name: "Windwalker Monk",
1562    metadata: DECLARED_METADATA,
1563    handler_factory: new_handler,
1564};
1565wowlab_engine_combat::smoke_test!(build_combat_system_draft);