1#![allow(non_snake_case, dead_code)]
4use wowlab_types::{combat::ResourceType, game::SpecId};
5use wowlab_engine_domain::dbc::ProcAttributes;
6use wowlab_engine_combat::{
7 CombatSystemBuilder, CombatSystemDraft, AuraDefinitionDraft, LocalAuraIdx,
8 LocalSpellIdx, SpellDefinitionDraft,
9};
10use wowlab_engine_ports::{
11 DeclaredSpecMetadata, SpecDescriptor, SpecHandler, HeroTalentTreeDesc,
12 DeclaredServerProcEntry,
13};
14use wowlab_engine_gamedata::ResolvedGameData;
15pub(crate) mod SPELL {
16 pub(crate) const TIGER_PALM: u32 = 100_780;
18 pub(crate) const BLACKOUT_KICK: u32 = 100_784;
20 pub(crate) const RISING_SUN_KICK: u32 = 107_428;
22 pub(crate) const WHIRLING_DRAGON_PUNCH: u32 = 152_175;
24 pub(crate) const STRIKE_OF_THE_WINDLORD: u32 = 392_983;
26 pub(crate) const TOUCH_OF_DEATH: u32 = 322_109;
28 pub(crate) const FLYING_SERPENT_KICK: u32 = 101_545;
30 pub(crate) const CRACKLING_JADE_LIGHTNING: u32 = 117_952;
32 pub(crate) const CHI_BURST: u32 = 123_986;
34 pub(crate) const JADEFIRE_STOMP: u32 = 1_248_815;
36 pub(crate) const ZENITH: u32 = 1_249_625;
38 pub(crate) const CELESTIAL_CONDUIT: u32 = 443_028;
40 pub(crate) const FISTS_OF_FURY: u32 = 113_656;
42 pub(crate) const SPINNING_CRANE_KICK: u32 = 101_546;
44}
45pub(crate) mod AURA {
46 pub(crate) const WHIRLING_DRAGON_PUNCH: u32 = 196_742;
48 pub(crate) const BLACKOUT_KICK: u32 = 116_768;
50 pub(crate) const ZENITH: u32 = 1_249_625;
52 pub(crate) const HEART_OF_THE_JADE_SERPENT: u32 = 443_421;
54 pub(crate) const THE_EMPEROR_S_CAPACITOR: u32 = 337_291;
56 pub(crate) const RUSHING_WIND_KICK: u32 = 1_250_554;
58 pub(crate) const UNBROKEN_RHYTHM: u32 = 1_297_033;
60 pub(crate) const COMBO_STRIKES: u32 = 115_636;
62 pub(crate) const HIT_COMBO: u32 = 196_741;
64 pub(crate) const HARMONIC_COMBO: u32 = 1_250_041;
66 pub(crate) const COMBO_STRIKES_TIGER_PALM: u32 = 1_249_756;
68 pub(crate) const COMBO_STRIKES_BLACKOUT_KICK: u32 = 1_249_757;
70 pub(crate) const COMBO_STRIKES_RISING_SUN_KICK: u32 = 1_249_753;
72 pub(crate) const COMBO_STRIKES_FISTS_OF_FURY: u32 = 1_249_758;
74 pub(crate) const COMBO_STRIKES_SPINNING_CRANE_KICK: u32 = 1_249_754;
76 pub(crate) const COMBO_STRIKES_WHIRLING_DRAGON_PUNCH: u32 = 1_249_765;
78 pub(crate) const COMBO_STRIKES_STRIKE_OF_THE_WINDLORD: u32 = 1_249_766;
80 pub(crate) const COMBO_STRIKES_CRACKLING_JADE_LIGHTNING: u32 = 1_249_764;
82 pub(crate) const DANCE_OF_CHI_JI: u32 = 325_202;
84 pub(crate) const TEACHINGS_OF_THE_MONASTERY: u32 = 202_090;
86 pub(crate) const SPINNING_CRANE_KICK: u32 = 101_546;
88 pub(crate) const MOMENTUM_BOOST: u32 = 451_297;
90 pub(crate) const FLURRY_CHARGE: u32 = 451_021;
92 pub(crate) const STAND_READY: u32 = 1_237_196;
94 pub(crate) const COMBAT_WISDOM: u32 = 129_914;
96 pub(crate) const COMBAT_WISDOM_CYCLE: u32 = 121_817;
98}
99pub(crate) mod TALENT {
100 pub(crate) const ASCENSION: u32 = 115_396;
102 pub(crate) const BRAWLERS_INTENSITY: u32 = 451_485;
104 pub(crate) const CELESTIAL_CONDUIT: u32 = 443_028;
106 pub(crate) const CHI_BURST: u32 = 123_986;
108 pub(crate) const COMBAT_WISDOM: u32 = 121_817;
110 pub(crate) const COMBO_BREAKER: u32 = 137_384;
112 pub(crate) const DANCE_OF_CHI_JI: u32 = 325_201;
114 pub(crate) const DUAL_THREAT: u32 = 451_823;
116 pub(crate) const FISTS_OF_FURY: u32 = 113_656;
118 pub(crate) const FLURRY_STRIKES: u32 = 450_615;
120 pub(crate) const GLORY_OF_THE_DAWN: u32 = 392_958;
122 pub(crate) const HARMONIC_COMBO: u32 = 1_250_041;
124 pub(crate) const HIT_COMBO: u32 = 196_740;
126 pub(crate) const JADEFIRE_STOMP: u32 = 457_974;
128 pub(crate) const JADEFIRE_STOMP_DAMAGE: u32 = 1_248_815;
130 pub(crate) const MOMENTUM_BOOST: u32 = 451_294;
132 pub(crate) const ONE_VERSUS_MANY: u32 = 450_988;
134 pub(crate) const RUSHING_WIND_KICK: u32 = 1_250_566;
136 pub(crate) const SEQUENCED_STRIKES: u32 = 451_515;
138 pub(crate) const SHADOWBOXING_TREADS: u32 = 392_982;
140 pub(crate) const SLICING_WINDS: u32 = 1_217_413;
142 pub(crate) const STAND_READY: u32 = 1_262_603;
144 pub(crate) const STRIKE_OF_THE_WINDLORD: u32 = 392_983;
146 pub(crate) const SUNFIRE_SPIRAL: u32 = 1_272_415;
148 pub(crate) const TEACHINGS_OF_THE_MONASTERY: u32 = 116_645;
150 pub(crate) const THUNDERFIST: u32 = 392_985;
152 pub(crate) const WHIRLING_DRAGON_PUNCH: u32 = 152_175;
154 pub(crate) const WISDOM_OF_THE_WALL: u32 = 1_272_821;
156 pub(crate) const ZENITH: u32 = 1_249_625;
158 pub(crate) const ZENITH_STOMP: u32 = 1_272_694;
160}
161pub(crate) mod SET_BONUS {
162 pub(crate) const MID2_WW_2PC: u32 = 1_296_621;
164 pub(crate) const MID2_WW_4PC: u32 = 1_296_624;
166}
167pub(crate) mod REPORTED_SPELL {
168 pub(crate) const DUAL_THREAT: u32 = 451_839;
170 pub(crate) const GLORY_OF_THE_DAWN: u32 = 392_959;
172 pub(crate) const MELEE: u32 = 6603;
174 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 pub(crate) const FLURRY_STRIKE: u32 = 450_617;
182 pub(crate) const SHADO_OVER_THE_BATTLEFIELD: u32 = 451_250;
184 }
185 pub(crate) mod AURA {
186 pub(crate) const FLURRY_CHARGE: u32 = 451_021;
188 pub(crate) const HIGH_IMPACT: u32 = 451_037;
190 pub(crate) const STAND_READY: u32 = 1_237_196;
192 pub(crate) const WHIRLING_STEEL: u32 = 451_214;
194 }
195 }
196 pub(crate) mod CONDUIT_OF_THE_CELESTIALS {
197 pub(crate) mod SPELL {
198 pub(crate) const CELESTIAL_CONDUIT: u32 = 443_028;
200 pub(crate) const CELESTIAL_CONDUIT_DAMAGE: u32 = 443_038;
202 pub(crate) const COURAGE_OF_THE_WHITE_TIGER_DAMAGE: u32 = 457_917;
204 pub(crate) const INVOKE_XUEN: u32 = 123_904;
206 pub(crate) const STRENGTH_OF_THE_BLACK_OX_DAMAGE: u32 = 443_127;
208 }
209 pub(crate) mod AURA {
210 pub(crate) const CELESTIAL_CONDUIT: u32 = 443_028;
212 pub(crate) const COURAGE_OF_THE_WHITE_TIGER: u32 = 460_127;
214 pub(crate) const HEART_OF_THE_JADE_SERPENT: u32 = 443_421;
216 pub(crate) const INVOKE_XUEN: u32 = 123_904;
218 pub(crate) const JADE_SANCTUARY: u32 = 448_508;
220 pub(crate) const UNITY_WITHIN: u32 = 443_592;
222 pub(crate) const YULONS_AVATAR: u32 = 1_238_904;
224 }
225 }
226 pub(crate) mod MASTER_OF_HARMONY {
227 pub(crate) mod SPELL {
228 pub(crate) const ASPECT_OF_HARMONY_DAMAGE: u32 = 450_763;
230 pub(crate) const ASPECT_OF_HARMONY_HEAL: u32 = 450_769;
232 pub(crate) const HARMONIC_SURGE_DAMAGE: u32 = 1_271_011;
234 pub(crate) const OVERWHELMING_FORCE_DAMAGE: u32 = 452_333;
236 pub(crate) const PURIFIED_SPIRIT_DAMAGE: u32 = 450_820;
238 }
239 pub(crate) mod AURA {
240 pub(crate) const ASPECT_OF_HARMONY: u32 = 450_521;
242 pub(crate) const BALANCED_STRATAGEM_MAGIC: u32 = 451_508;
244 pub(crate) const BALANCED_STRATAGEM_PHYSICAL: u32 = 451_514;
246 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 pub(crate) const DUAL_THREAT_CHANCE: (u32, u8) = (451_823, 1);
508 pub(crate) const JADEFIRE_STOMP_DMG: (u32, u8) = (1_248_815, 1);
510 pub(crate) const WDP_AOE_TICK: (u32, u8) = (158_221, 1);
512 pub(crate) const FOF_TICK: (u32, u8) = (117_418, 1);
514 pub(crate) const MID2_WW_2PC_EFFECTIVENESS: (u32, u8) = (1_296_621, 1);
516 pub(crate) const SCK_TICK: (u32, u8) = (107_270, 1);
518 pub(crate) const UNBROKEN_RHYTHM_RSK: (u32, u8) = (1_297_033, 1);
520 pub(crate) const UNBROKEN_RHYTHM_SCK: (u32, u8) = (1_297_033, 2);
522 pub(crate) const TOTM_BOK_DMG: (u32, u8) = (228_649, 1);
524 pub(crate) const TOTM_RESET: (u32, u8) = (116_645, 1);
526 pub(crate) const COMBO_BREAKER_CHANCE: (u32, u8) = (137_384, 1);
528 pub(crate) const GOTD_CHANCE: (u32, u8) = (392_958, 2);
530 pub(crate) const GOTD_CHI: (u32, u8) = (392_959, 3);
532 pub(crate) const GOTD_DMG: (u32, u8) = (392_959, 1);
534 pub(crate) const MOMENTUM_HASTE: (u32, u8) = (451_294, 1);
536 pub(crate) const SEQUENCED_CHANCE: (u32, u8) = (451_515, 1);
538 pub(crate) const SUNFIRE_SPIRAL_PCT: (u32, u8) = (1_272_415, 1);
540 pub(crate) const FLURRY_CHARGES_2H: (u32, u8) = (450_615, 2);
542 pub(crate) const FLURRY_DMG: (u32, u8) = (450_617, 1);
544 pub(crate) const OVM_CHARGE_BONUS: (u32, u8) = (450_988, 1);
546 pub(crate) const SHADO_DMG: (u32, u8) = (451_250, 1);
548 pub(crate) const STAND_READY_COUNT: (u32, u8) = (1_262_603, 1);
550 pub(crate) const STAND_READY_MULT: (u32, u8) = (1_262_603, 2);
552 pub(crate) const WOTW_COUNT: (u32, u8) = (1_272_821, 1);
554 pub(crate) const ZENITH_STOMP_CHI: (u32, u8) = (1_272_696, 2);
556 pub(crate) const ZENITH_STOMP_DMG: (u32, u8) = (1_272_696, 1);
558 pub(crate) const BRAWLERS_RSK_CDR: (u32, u8) = (451_485, 1);
560 pub(crate) const COMBAT_WISDOM_CHI: (u32, u8) = (121_817, 1);
562 pub(crate) const EH_DMG: (u32, u8) = (115_129, 1);
564 pub(crate) const EH_DMG_PCT: (u32, u8) = (451_968, 2);
566 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, ¶ms.game_data),
1313 )
1314 .aura(
1315 "blackout_kick",
1316 AURA::BLACKOUT_KICK,
1317 |a| aura_blackout_kick(a, ¶ms.game_data),
1318 )
1319 .aura("zenith", AURA::ZENITH, |a| aura_zenith(a, ¶ms.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, ¶ms.game_data),
1324 )
1325 .aura(
1326 "the_emperors_capacitor",
1327 AURA::THE_EMPEROR_S_CAPACITOR,
1328 |a| aura_the_emperor_s_capacitor(a, ¶ms.game_data),
1329 )
1330 .aura(
1331 "rushing_wind_kick",
1332 AURA::RUSHING_WIND_KICK,
1333 |a| aura_rushing_wind_kick(a, ¶ms.game_data),
1334 )
1335 .aura(
1336 "unbroken_rhythm",
1337 AURA::UNBROKEN_RHYTHM,
1338 |a| aura_unbroken_rhythm(a, ¶ms.game_data),
1339 )
1340 .aura(
1341 "combo_strikes",
1342 AURA::COMBO_STRIKES,
1343 |a| aura_combo_strikes(a, ¶ms.game_data),
1344 )
1345 .aura("hit_combo", AURA::HIT_COMBO, |a| aura_hit_combo(a, ¶ms.game_data))
1346 .aura(
1347 "harmonic_combo",
1348 AURA::HARMONIC_COMBO,
1349 |a| aura_harmonic_combo(a, ¶ms.game_data),
1350 )
1351 .aura(
1352 "combo_strikes_tiger_palm",
1353 AURA::COMBO_STRIKES_TIGER_PALM,
1354 |a| aura_combo_strikes_tiger_palm(a, ¶ms.game_data),
1355 )
1356 .aura(
1357 "combo_strikes_blackout_kick",
1358 AURA::COMBO_STRIKES_BLACKOUT_KICK,
1359 |a| aura_combo_strikes_blackout_kick(a, ¶ms.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, ¶ms.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, ¶ms.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, ¶ms.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, ¶ms.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, ¶ms.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, ¶ms.game_data),
1390 )
1391 .aura(
1392 "dance_of_chi_ji",
1393 AURA::DANCE_OF_CHI_JI,
1394 |a| aura_dance_of_chi_ji(a, ¶ms.game_data),
1395 )
1396 .aura(
1397 "teachings_of_the_monastery",
1398 AURA::TEACHINGS_OF_THE_MONASTERY,
1399 |a| aura_teachings_of_the_monastery(a, ¶ms.game_data),
1400 )
1401 .aura(
1402 "spinning_crane_kick",
1403 AURA::SPINNING_CRANE_KICK,
1404 |a| aura_spinning_crane_kick(a, ¶ms.game_data),
1405 )
1406 .aura(
1407 "momentum_boost",
1408 AURA::MOMENTUM_BOOST,
1409 |a| aura_momentum_boost(a, ¶ms.game_data),
1410 )
1411 .aura(
1412 "flurry_charge",
1413 AURA::FLURRY_CHARGE,
1414 |a| aura_flurry_charge(a, ¶ms.game_data),
1415 )
1416 .aura(
1417 "stand_ready",
1418 AURA::STAND_READY,
1419 |a| aura_stand_ready(a, ¶ms.game_data),
1420 )
1421 .aura(
1422 "combat_wisdom",
1423 AURA::COMBAT_WISDOM,
1424 |a| aura_combat_wisdom(a, ¶ms.game_data),
1425 )
1426 .aura(
1427 "combat_wisdom_cycle",
1428 AURA::COMBAT_WISDOM_CYCLE,
1429 |a| aura_combat_wisdom_cycle(a, ¶ms.game_data),
1430 )
1431 .spell(
1432 "tiger_palm",
1433 SPELL::TIGER_PALM,
1434 |s| spell_tiger_palm(s, ¶ms.game_data),
1435 )
1436 .spell(
1437 "blackout_kick",
1438 SPELL::BLACKOUT_KICK,
1439 |s| spell_blackout_kick(s, ¶ms.game_data),
1440 )
1441 .spell(
1442 "rising_sun_kick",
1443 SPELL::RISING_SUN_KICK,
1444 |s| spell_rising_sun_kick(s, ¶ms.game_data),
1445 )
1446 .spell(
1447 "whirling_dragon_punch",
1448 SPELL::WHIRLING_DRAGON_PUNCH,
1449 |s| spell_whirling_dragon_punch(s, ¶ms.game_data),
1450 )
1451 .spell(
1452 "strike_of_the_windlord",
1453 SPELL::STRIKE_OF_THE_WINDLORD,
1454 |s| spell_strike_of_the_windlord(s, ¶ms.game_data),
1455 )
1456 .spell(
1457 "touch_of_death",
1458 SPELL::TOUCH_OF_DEATH,
1459 |s| spell_touch_of_death(s, ¶ms.game_data),
1460 )
1461 .spell(
1462 "flying_serpent_kick",
1463 SPELL::FLYING_SERPENT_KICK,
1464 |s| spell_flying_serpent_kick(s, ¶ms.game_data),
1465 )
1466 .spell(
1467 "crackling_jade_lightning",
1468 SPELL::CRACKLING_JADE_LIGHTNING,
1469 |s| spell_crackling_jade_lightning(s, ¶ms.game_data),
1470 )
1471 .spell("chi_burst", SPELL::CHI_BURST, |s| spell_chi_burst(s, ¶ms.game_data))
1472 .spell(
1473 "jadefire_stomp",
1474 SPELL::JADEFIRE_STOMP,
1475 |s| spell_jadefire_stomp(s, ¶ms.game_data),
1476 )
1477 .spell("zenith", SPELL::ZENITH, |s| spell_zenith(s, ¶ms.game_data))
1478 .spell(
1479 "celestial_conduit",
1480 SPELL::CELESTIAL_CONDUIT,
1481 |s| spell_celestial_conduit(s, ¶ms.game_data),
1482 )
1483 .spell(
1484 "fists_of_fury",
1485 SPELL::FISTS_OF_FURY,
1486 |s| spell_fists_of_fury(s, ¶ms.game_data),
1487 )
1488 .spell(
1489 "spinning_crane_kick",
1490 SPELL::SPINNING_CRANE_KICK,
1491 |s| spell_spinning_crane_kick(s, ¶ms.game_data),
1492 )
1493 .auto_attack(|a| {
1494 a
1495 .spell_id(6603)
1496 .swing_ms(2600)
1497 .apply_base_from_data(¶ms.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 ¶ms.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 ¶ms,
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);