1#![allow(non_snake_case, dead_code)]
4use wowlab_types::{combat::ResourceType, game::SpecId};
5use wowlab_engine_combat::{
6 CombatSystemBuilder, CombatSystemDraft, AuraDefinitionDraft, LocalAuraIdx,
7 LocalSpellIdx, SpellDefinitionDraft,
8};
9use wowlab_engine_ports::{
10 DeclaredSpecMetadata, SpecDescriptor, SpecHandler, HeroTalentTreeDesc,
11};
12use wowlab_engine_gamedata::ResolvedGameData;
13pub(crate) mod SPELL {
14 pub(crate) const BACKSTAB: u32 = 53;
16 pub(crate) const SHADOWSTRIKE: u32 = 185_438;
18 pub(crate) const SHURIKEN_STORM: u32 = 197_835;
20 pub(crate) const SHURIKEN_TOSS: u32 = 114_014;
22 pub(crate) const EVISCERATE: u32 = 196_819;
24 pub(crate) const BLACK_POWDER: u32 = 319_175;
26 pub(crate) const SECRET_TECHNIQUE: u32 = 280_719;
28 pub(crate) const GOREMAW_S_BITE: u32 = 426_591;
30 pub(crate) const SLICE_AND_DICE: u32 = 315_496;
32 pub(crate) const INSTANT_POISON: u32 = 315_584;
34 pub(crate) const WOUND_POISON: u32 = 8679;
36 pub(crate) const ATROPHIC_POISON: u32 = 381_637;
38 pub(crate) const NUMBING_POISON: u32 = 5761;
40 pub(crate) const CRIPPLING_POISON: u32 = 3408;
42 pub(crate) const INSTANT_POISON_DAMAGE: u32 = 315_585;
44 pub(crate) const EVISCERATE_BONUS: u32 = 328_082;
46 pub(crate) const BLACK_POWDER_BONUS: u32 = 319_190;
48 pub(crate) const SECRET_TECHNIQUE_PLAYER: u32 = 280_720;
50 pub(crate) const SECRET_TECHNIQUE_CLONES: u32 = 282_449;
52 pub(crate) const LASHE_MACABRE: u32 = 1_264_397;
54 pub(crate) const KICK: u32 = 1766;
56 pub(crate) const SHADOW_DANCE: u32 = 185_313;
58 pub(crate) const SHADOW_BLADES: u32 = 121_471;
60 pub(crate) const SHADOW_BLADES_ATTACK: u32 = 279_043;
62 pub(crate) const BACKSTAB_SHADOW_CLONE: u32 = 1_269_209;
64 pub(crate) const SHADOWSTRIKE_SHADOW_CLONE: u32 = 1_269_336;
66 pub(crate) const EVISCERATE_SHADOW_CLONE: u32 = 1_269_205;
68 pub(crate) const SHURIKEN_STORM_SHADOW_CLONE: u32 = 1_269_340;
70 pub(crate) const SECRET_TECHNIQUE_SHADOW_CLONE: u32 = 1_269_560;
72 pub(crate) const BLACK_POWDER_SHADOW_CLONE: u32 = 1_269_565;
74 pub(crate) const THISTLE_TEA: u32 = 381_623;
76 pub(crate) const VANISH: u32 = 1856;
78}
79pub(crate) mod AURA {
80 pub(crate) const FIND_WEAKNESS: u32 = 1_264_521;
82 pub(crate) const SLICE_AND_DICE: u32 = 315_496;
84 pub(crate) const STEALTH: u32 = 1784;
86 pub(crate) const VANISH: u32 = 1856;
88 pub(crate) const SUBTERFUGE: u32 = 115_192;
90 pub(crate) const SHADOW_TECHNIQUES: u32 = 196_911;
92 pub(crate) const MASTER_OF_SHADOWS: u32 = 196_980;
94 pub(crate) const ALACRITY: u32 = 193_538;
96 pub(crate) const INSTANT_POISON: u32 = 315_584;
98 pub(crate) const WOUND_POISON: u32 = 8679;
100 pub(crate) const ATROPHIC_POISON: u32 = 381_637;
102 pub(crate) const NUMBING_POISON: u32 = 5761;
104 pub(crate) const CRIPPLING_POISON: u32 = 3408;
106 pub(crate) const DEEPER_STRATAGEM: u32 = 193_531;
108 pub(crate) const SECRET_STRATAGEM: u32 = 394_320;
110 pub(crate) const DARKEST_NIGHT: u32 = 457_280;
112 pub(crate) const LINGERING_SHADOW: u32 = 385_960;
114 pub(crate) const SHADOW_DANCE: u32 = 185_313;
116 pub(crate) const PREMEDITATION: u32 = 343_173;
118 pub(crate) const SHADOW_BLADES: u32 = 121_471;
120 pub(crate) const ANCIENT_ARTS: u32 = 1_269_163;
122 pub(crate) const ESCALATING_BLADE: u32 = 441_786;
124 pub(crate) const COUP_DE_GRACE: u32 = 441_519;
126 pub(crate) const UNSEEN_BLADE_CD: u32 = 459_485;
128 pub(crate) const FLAWLESS_FORM: u32 = 441_326;
130 pub(crate) const DISORIENTING_STRIKES: u32 = 441_274;
132 pub(crate) const FAZED: u32 = 441_224;
134 pub(crate) const PVP_RULES_ENABLED_HARDCODED: u32 = 134_735;
136}
137pub(crate) mod TALENT {
138 pub(crate) const ALACRITY: u32 = 193_539;
140 pub(crate) const ANCIENT_ARTS_1: u32 = 1_268_932;
142 pub(crate) const ANCIENT_ARTS_2: u32 = 1_268_936;
144 pub(crate) const ANCIENT_ARTS_3: u32 = 1_268_939;
146 pub(crate) const DANSE_MACABRE: u32 = 382_528;
148 pub(crate) const DARK_SHADOW: u32 = 245_687;
150 pub(crate) const DEATH_PERCEPTION: u32 = 469_642;
152 pub(crate) const DEEPENING_SHADOWS: u32 = 185_314;
154 pub(crate) const DEEPER_DAGGERS: u32 = 382_517;
156 pub(crate) const DEEPER_STRATAGEM: u32 = 193_531;
158 pub(crate) const DOUBLE_DANCE: u32 = 394_930;
160 pub(crate) const FINALITY: u32 = 382_525;
162 pub(crate) const FIND_WEAKNESS: u32 = 91023;
164 pub(crate) const FORCED_INDUCTION: u32 = 470_668;
166 pub(crate) const GLOOMBLADE: u32 = 200_758;
168 pub(crate) const GOREMAWS_BITE: u32 = 426_591;
170 pub(crate) const IMPROVED_BACKSTAB: u32 = 319_949;
172 pub(crate) const IMPROVED_SECRET_TECHNIQUE: u32 = 1_279_444;
174 pub(crate) const LETHALITY: u32 = 382_238;
176 pub(crate) const LINGERING_SHADOW: u32 = 382_524;
178 pub(crate) const MASTER_OF_SHADOWS: u32 = 196_976;
180 pub(crate) const PERFORATED_VEINS: u32 = 382_518;
182 pub(crate) const POTENT_POWDER: u32 = 381_634;
184 pub(crate) const PREMEDITATION: u32 = 343_160;
186 pub(crate) const RELENTLESS_STRIKES: u32 = 58423;
188 pub(crate) const REPLICATING_SHADOWS: u32 = 382_506;
190 pub(crate) const SECRET_STRATAGEM: u32 = 394_320;
192 pub(crate) const SHADOWCRAFT: u32 = 426_594;
194 pub(crate) const SHADOWED_FINISHERS: u32 = 382_511;
196 pub(crate) const SHADOW_BLADES: u32 = 121_471;
198 pub(crate) const SILENT_STORM: u32 = 385_722;
200 pub(crate) const SUPERCHARGER: u32 = 470_347;
202 pub(crate) const THE_ROTTEN: u32 = 382_015;
204 pub(crate) const THISTLE_TEA: u32 = 469_779;
206 pub(crate) const UMBRAL_EDGE: u32 = 1_281_468;
208 pub(crate) const VEILTOUCHED: u32 = 382_017;
210 pub(crate) const WEAPONMASTER: u32 = 193_537;
212}
213pub(crate) mod SET_BONUS {
214 pub(crate) const MID2_SUBTLETY_2PC: u32 = 1_296_592;
216 pub(crate) const MID2_SUBTLETY_4PC: u32 = 1_296_593;
218}
219pub(crate) mod REPORTED_SPELL {
220 pub(crate) const CDG_BONUS_1: u32 = 462_244;
222 pub(crate) const CDG_BONUS_2: u32 = 462_247;
224 pub(crate) const CDG_BONUS_3: u32 = 462_248;
226 pub(crate) const MELEE: u32 = 6603;
228}
229pub(crate) mod HERO {
230 pub(crate) mod TRICKSTER {
231 pub(crate) mod SPELL {
232 pub(crate) const CLEVER_COMBATANT: u32 = 1_276_679;
234 pub(crate) const COUP_DE_GRACE: u32 = 441_423;
236 pub(crate) const COUP_DE_GRACE_DAMAGE_1: u32 = 462_241;
238 pub(crate) const COUP_DE_GRACE_DAMAGE_2: u32 = 462_242;
240 pub(crate) const COUP_DE_GRACE_DAMAGE_3: u32 = 462_243;
242 pub(crate) const DEVIOUS_DISTRACTIONS: u32 = 441_263;
244 pub(crate) const DISORIENTING_STRIKES: u32 = 441_274;
246 pub(crate) const FLASHING_STEEL: u32 = 1_276_630;
248 pub(crate) const FLAWLESS_FORM: u32 = 441_321;
250 pub(crate) const NIMBLE_FLURRY: u32 = 441_367;
252 pub(crate) const SURPRISING_STRIKES: u32 = 441_273;
254 pub(crate) const UNSEEN_BLADE: u32 = 441_144;
256 pub(crate) const UNSEEN_BLADE_TALENT: u32 = 441_146;
258 }
259 }
260 pub(crate) mod DEATHSTALKER {
261 pub(crate) mod SPELL {
262 pub(crate) const DEATHSTALKERS_MARK_DAMAGE: u32 = 457_157;
264 pub(crate) const HUNT_THEM_DOWN: u32 = 457_193;
266 }
267 pub(crate) mod AURA {
268 pub(crate) const DEATHSTALKERS_MARK: u32 = 457_052;
270 pub(crate) const FOLLOW_THE_BLOOD: u32 = 457_068;
272 pub(crate) const LINGERING_DARKNESS: u32 = 457_273;
274 pub(crate) const MOMENTUM_OF_DESPAIR: u32 = 457_284;
276 pub(crate) const SYMBOLIC_VICTORY: u32 = 457_167;
278 pub(crate) const UNSHAKEABLE_DRIVE: u32 = 1_248_774;
280 }
281 }
282}
283static HERO_TREE_TRICKSTER_SPELLS: &[(&str, u32)] = &[
284 ("CLEVER_COMBATANT", 1_276_679),
285 ("COUP_DE_GRACE", 441_423),
286 ("COUP_DE_GRACE_DAMAGE_1", 462_241),
287 ("COUP_DE_GRACE_DAMAGE_2", 462_242),
288 ("COUP_DE_GRACE_DAMAGE_3", 462_243),
289 ("DEVIOUS_DISTRACTIONS", 441_263),
290 ("DISORIENTING_STRIKES", 441_274),
291 ("FLASHING_STEEL", 1_276_630),
292 ("FLAWLESS_FORM", 441_321),
293 ("NIMBLE_FLURRY", 441_367),
294 ("SURPRISING_STRIKES", 441_273),
295 ("UNSEEN_BLADE", 441_144),
296 ("UNSEEN_BLADE_TALENT", 441_146),
297];
298static HERO_TREE_TRICKSTER_AURAS: &[(&str, u32)] = &[];
299static HERO_TREE_DEATHSTALKER_SPELLS: &[(&str, u32)] = &[
300 ("DEATHSTALKERS_MARK_DAMAGE", 457_157),
301 ("HUNT_THEM_DOWN", 457_193),
302];
303static HERO_TREE_DEATHSTALKER_AURAS: &[(&str, u32)] = &[
304 ("DEATHSTALKERS_MARK", 457_052),
305 ("FOLLOW_THE_BLOOD", 457_068),
306 ("LINGERING_DARKNESS", 457_273),
307 ("MOMENTUM_OF_DESPAIR", 457_284),
308 ("SYMBOLIC_VICTORY", 457_167),
309 ("UNSHAKEABLE_DRIVE", 1_248_774),
310];
311pub(crate) mod DAMAGE_SPELL {
312 pub(crate) const BACKSTAB: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_53;
313 pub(crate) const SHADOWSTRIKE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_185438;
314 pub(crate) const SHURIKEN_STORM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_197835;
315 pub(crate) const SHURIKEN_TOSS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_114014;
316 pub(crate) const EVISCERATE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_196819;
317 pub(crate) const BLACK_POWDER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_319175;
318 pub(crate) const SECRET_TECHNIQUE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_280719;
319 pub(crate) const GOREMAW_S_BITE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_426591;
320 pub(crate) const SLICE_AND_DICE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_315496;
321 pub(crate) const INSTANT_POISON: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_315584;
322 pub(crate) const WOUND_POISON: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_8679;
323 pub(crate) const ATROPHIC_POISON: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_381637;
324 pub(crate) const NUMBING_POISON: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_5761;
325 pub(crate) const CRIPPLING_POISON: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_3408;
326 pub(crate) const INSTANT_POISON_DAMAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_315585;
327 pub(crate) const EVISCERATE_BONUS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_328082;
328 pub(crate) const BLACK_POWDER_BONUS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_319190;
329 pub(crate) const SECRET_TECHNIQUE_PLAYER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_280720;
330 pub(crate) const SECRET_TECHNIQUE_CLONES: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_282449;
331 pub(crate) const LASHE_MACABRE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_1264397;
332 pub(crate) const KICK: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_1766;
333 pub(crate) const SHADOW_DANCE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_185313;
334 pub(crate) const SHADOW_BLADES: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_121471;
335 pub(crate) const SHADOW_BLADES_ATTACK: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_279043;
336 pub(crate) const BACKSTAB_SHADOW_CLONE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_1269209;
337 pub(crate) const SHADOWSTRIKE_SHADOW_CLONE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_1269336;
338 pub(crate) const EVISCERATE_SHADOW_CLONE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_1269205;
339 pub(crate) const SHURIKEN_STORM_SHADOW_CLONE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_1269340;
340 pub(crate) const SECRET_TECHNIQUE_SHADOW_CLONE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_1269560;
341 pub(crate) const BLACK_POWDER_SHADOW_CLONE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_1269565;
342 pub(crate) const THISTLE_TEA: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_381623;
343 pub(crate) const VANISH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_1856;
344 pub(crate) const CLEVER_COMBATANT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_1276679;
345 pub(crate) const COUP_DE_GRACE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_441423;
346 pub(crate) const COUP_DE_GRACE_DAMAGE_1: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_462241;
347 pub(crate) const COUP_DE_GRACE_DAMAGE_2: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_462242;
348 pub(crate) const COUP_DE_GRACE_DAMAGE_3: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_462243;
349 pub(crate) const DEVIOUS_DISTRACTIONS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_441263;
350 pub(crate) const DISORIENTING_STRIKES: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_441274;
351 pub(crate) const FLASHING_STEEL: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_1276630;
352 pub(crate) const FLAWLESS_FORM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_441321;
353 pub(crate) const NIMBLE_FLURRY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_441367;
354 pub(crate) const SURPRISING_STRIKES: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_441273;
355 pub(crate) const UNSEEN_BLADE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_441144;
356 pub(crate) const UNSEEN_BLADE_TALENT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_441146;
357 pub(crate) const DEATHSTALKERS_MARK_DAMAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_457157;
358 pub(crate) const HUNT_THEM_DOWN: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_457193;
359}
360pub(crate) mod DAMAGE_AURA {
361 pub(crate) const FIND_WEAKNESS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_1264521;
362 pub(crate) const SLICE_AND_DICE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_315496;
363 pub(crate) const STEALTH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_1784;
364 pub(crate) const VANISH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_1856;
365 pub(crate) const SUBTERFUGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_115192;
366 pub(crate) const SHADOW_TECHNIQUES: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_196911;
367 pub(crate) const MASTER_OF_SHADOWS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_196980;
368 pub(crate) const ALACRITY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_193538;
369 pub(crate) const INSTANT_POISON: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_315584;
370 pub(crate) const WOUND_POISON: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_8679;
371 pub(crate) const ATROPHIC_POISON: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_381637;
372 pub(crate) const NUMBING_POISON: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_5761;
373 pub(crate) const CRIPPLING_POISON: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_3408;
374 pub(crate) const DEEPER_STRATAGEM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_193531;
375 pub(crate) const SECRET_STRATAGEM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_394320;
376 pub(crate) const DARKEST_NIGHT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_457280;
377 pub(crate) const LINGERING_SHADOW: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_385960;
378 pub(crate) const SHADOW_DANCE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_185313;
379 pub(crate) const PREMEDITATION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_343173;
380 pub(crate) const SHADOW_BLADES: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_121471;
381 pub(crate) const ANCIENT_ARTS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_1269163;
382 pub(crate) const ESCALATING_BLADE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_441786;
383 pub(crate) const COUP_DE_GRACE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_441519;
384 pub(crate) const UNSEEN_BLADE_CD: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_459485;
385 pub(crate) const FLAWLESS_FORM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_441326;
386 pub(crate) const DISORIENTING_STRIKES: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_441274;
387 pub(crate) const FAZED: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_441224;
388 pub(crate) const PVP_RULES_ENABLED_HARDCODED: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_134735;
389}
390pub(crate) mod DAMAGE_TALENT {
391 pub(crate) const ALACRITY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_193539;
392 pub(crate) const ANCIENT_ARTS_1: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_1268932;
393 pub(crate) const ANCIENT_ARTS_2: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_1268936;
394 pub(crate) const ANCIENT_ARTS_3: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_1268939;
395 pub(crate) const DANSE_MACABRE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_382528;
396 pub(crate) const DARK_SHADOW: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_245687;
397 pub(crate) const DEATH_PERCEPTION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_469642;
398 pub(crate) const DEEPENING_SHADOWS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_185314;
399 pub(crate) const DEEPER_DAGGERS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_382517;
400 pub(crate) const DEEPER_STRATAGEM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_193531;
401 pub(crate) const DOUBLE_DANCE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_394930;
402 pub(crate) const FINALITY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_382525;
403 pub(crate) const FIND_WEAKNESS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_91023;
404 pub(crate) const FORCED_INDUCTION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_470668;
405 pub(crate) const GLOOMBLADE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_200758;
406 pub(crate) const GOREMAWS_BITE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_426591;
407 pub(crate) const IMPROVED_BACKSTAB: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_319949;
408 pub(crate) const IMPROVED_SECRET_TECHNIQUE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_1279444;
409 pub(crate) const LETHALITY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_382238;
410 pub(crate) const LINGERING_SHADOW: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_382524;
411 pub(crate) const MASTER_OF_SHADOWS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_196976;
412 pub(crate) const PERFORATED_VEINS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_382518;
413 pub(crate) const POTENT_POWDER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_381634;
414 pub(crate) const PREMEDITATION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_343160;
415 pub(crate) const RELENTLESS_STRIKES: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_58423;
416 pub(crate) const REPLICATING_SHADOWS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_382506;
417 pub(crate) const SECRET_STRATAGEM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_394320;
418 pub(crate) const SHADOWCRAFT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_426594;
419 pub(crate) const SHADOWED_FINISHERS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_382511;
420 pub(crate) const SHADOW_BLADES: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_121471;
421 pub(crate) const SILENT_STORM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_385722;
422 pub(crate) const SUPERCHARGER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_470347;
423 pub(crate) const THE_ROTTEN: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_382015;
424 pub(crate) const THISTLE_TEA: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_469779;
425 pub(crate) const UMBRAL_EDGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_1281468;
426 pub(crate) const VEILTOUCHED: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_382017;
427 pub(crate) const WEAPONMASTER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_193537;
428}
429pub(crate) mod DAMAGE_REPORTED {
430 pub(crate) const CDG_BONUS_1: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_462244;
431 pub(crate) const CDG_BONUS_2: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_462247;
432 pub(crate) const CDG_BONUS_3: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_462248;
433 pub(crate) const MELEE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ACTION::SPELL_6603;
434}
435pub(crate) mod DAMAGE_EFFECT {
436 pub(crate) const ALACRITY_CHANCE_PER_CP: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::EFFECT::SPELL_193539_EFFECT_2;
437 pub(crate) const MID2_SUBTLETY_2PC_BACKSTAB_COST: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::EFFECT::SPELL_1296592_EFFECT_1;
438 pub(crate) const MID2_SUBTLETY_2PC_BACKSTAB_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::EFFECT::SPELL_1296592_EFFECT_2;
439 pub(crate) const MID2_SUBTLETY_2PC_SHURIKEN_COST: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::EFFECT::SPELL_1296592_EFFECT_3;
440 pub(crate) const MID2_SUBTLETY_2PC_SHURIKEN_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::EFFECT::SPELL_1296592_EFFECT_4;
441 pub(crate) const MID2_SUBTLETY_4PC_LINGERING: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::EFFECT::SPELL_1296593_EFFECT_1;
442 pub(crate) const ANCIENT_ARTS_1_CLONE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::EFFECT::SPELL_1268932_EFFECT_1;
443 pub(crate) const ANCIENT_ARTS_2_SHT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::EFFECT::SPELL_1268936_EFFECT_1;
444 pub(crate) const BLACK_POWDER_BONUS_COEF: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::EFFECT::SPELL_319190_EFFECT_1;
445 pub(crate) const CDG_BONUS_1: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::EFFECT::SPELL_462244_EFFECT_1;
446 pub(crate) const CDG_BONUS_2: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::EFFECT::SPELL_462247_EFFECT_1;
447 pub(crate) const CDG_BONUS_3: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::EFFECT::SPELL_462248_EFFECT_1;
448 pub(crate) const CDG_DAMAGE_1: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::EFFECT::SPELL_462241_EFFECT_1;
449 pub(crate) const CDG_DAMAGE_2: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::EFFECT::SPELL_462242_EFFECT_1;
450 pub(crate) const CDG_DAMAGE_3: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::EFFECT::SPELL_462243_EFFECT_1;
451 pub(crate) const CLONE_BACKSTAB: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::EFFECT::SPELL_1269209_EFFECT_1;
452 pub(crate) const CLONE_BLACK_POWDER: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::EFFECT::SPELL_1269565_EFFECT_1;
453 pub(crate) const CLONE_EVISCERATE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::EFFECT::SPELL_1269205_EFFECT_1;
454 pub(crate) const CLONE_SECRET_TECHNIQUE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::EFFECT::SPELL_1269560_EFFECT_1;
455 pub(crate) const CLONE_SHADOWSTRIKE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::EFFECT::SPELL_1269336_EFFECT_1;
456 pub(crate) const CLONE_SHURIKEN_STORM: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::EFFECT::SPELL_1269340_EFFECT_1;
457 pub(crate) const COUP_DE_GRACE_BONUS_CP: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::EFFECT::SPELL_441423_EFFECT_3;
458 pub(crate) const COUP_DE_GRACE_FLAWLESS: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::EFFECT::SPELL_441423_EFFECT_2;
459 pub(crate) const DEEPENING_SHADOWS_DURATION: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::EFFECT::SPELL_1271702_EFFECT_3;
460 pub(crate) const DISORIENTING_FREE_BLADES: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::EFFECT::SPELL_441274_EFFECT_2;
461 pub(crate) const DISORIENTING_ST_CDR: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::EFFECT::SPELL_441274_EFFECT_1;
462 pub(crate) const EVISCERATE_BONUS_COEF: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::EFFECT::SPELL_328082_EFFECT_1;
463 pub(crate) const EVISCERATE_COEF: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::EFFECT::SPELL_196819_EFFECT_1;
464 pub(crate) const EXECUTIONER_DIRECT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::EFFECT::SPELL_76808_EFFECT_1;
465 pub(crate) const EXECUTIONER_PERIODIC: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::EFFECT::SPELL_76808_EFFECT_2;
466 pub(crate) const FIND_WEAKNESS_ARMOR_PEN: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::EFFECT::SPELL_1264521_EFFECT_1;
467 pub(crate) const FLASHING_STEEL_CHANCE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::EFFECT::SPELL_1276630_EFFECT_2;
468 pub(crate) const FLASHING_STEEL_WINDOW: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::EFFECT::SPELL_1276630_EFFECT_1;
469 pub(crate) const FORCED_INDUCTION_BONUS: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::EFFECT::SPELL_470668_EFFECT_1;
470 pub(crate) const IMPROVED_SECRET_TECHNIQUE_DMG: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::EFFECT::SPELL_1279444_EFFECT_1;
471 pub(crate) const INSTANT_POISON_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::EFFECT::SPELL_315585_EFFECT_1;
472 pub(crate) const LASHE_MACABRE_COEF: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::EFFECT::SPELL_1264397_EFFECT_1;
473 pub(crate) const PREMEDITATION_CP: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::EFFECT::SPELL_343160_EFFECT_1;
474 pub(crate) const RELENTLESS_STRIKES_ENERGY: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::EFFECT::SPELL_98440_EFFECT_1;
475 pub(crate) const REPLICATING_SHADOWS_CLONE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::EFFECT::SPELL_382506_EFFECT_2;
476 pub(crate) const SECRET_TECHNIQUE_CLONE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::EFFECT::SPELL_282449_EFFECT_1;
477 pub(crate) const SECRET_TECHNIQUE_PLAYER: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::EFFECT::SPELL_280720_EFFECT_1;
478 pub(crate) const SHADOWED_FINISHERS_PCT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::EFFECT::SPELL_382511_EFFECT_1;
479 pub(crate) const SHADOW_BLADES_ATTACK: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::EFFECT::SPELL_279043_EFFECT_1;
480 pub(crate) const SHADOW_BLADES_CP: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::EFFECT::SPELL_121471_EFFECT_2;
481 pub(crate) const SHADOW_BLADES_ECHO: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::EFFECT::SPELL_121471_EFFECT_1;
482 pub(crate) const SHT_ENERGIZE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::EFFECT::SPELL_196911_EFFECT_2;
483 pub(crate) const SPEC_AURA_PET_DMG: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::EFFECT::SPELL_137035_EFFECT_3;
484 pub(crate) const SUPERCHARGER_BONUS_CP: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::EFFECT::SPELL_470347_EFFECT_2;
485 pub(crate) const SUPERCHARGER_CHARGES: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::EFFECT::SPELL_470347_EFFECT_1;
486 pub(crate) const SURPRISING_STRIKES_CRIT_DMG: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::EFFECT::SPELL_441273_EFFECT_1;
487 pub(crate) const UMBRAL_EDGE_DMG: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::EFFECT::SPELL_1281468_EFFECT_1;
488 pub(crate) const UNSEEN_BLADE_COEF: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::EFFECT::SPELL_441144_EFFECT_1;
489}
490pub(crate) const AURA_FIND_WEAKNESS: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::AURA_FIND_WEAKNESS
491 .bind(wowlab_engine_combat::generated_identities::specs::subtlety_rogue::PROOF);
492pub(crate) const AURA_SLICE_AND_DICE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::AURA_SLICE_AND_DICE
493 .bind(wowlab_engine_combat::generated_identities::specs::subtlety_rogue::PROOF);
494pub(crate) const AURA_STEALTH: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::AURA_STEALTH
495 .bind(wowlab_engine_combat::generated_identities::specs::subtlety_rogue::PROOF);
496pub(crate) const AURA_VANISH: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::AURA_VANISH
497 .bind(wowlab_engine_combat::generated_identities::specs::subtlety_rogue::PROOF);
498pub(crate) const AURA_SUBTERFUGE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::AURA_SUBTERFUGE
499 .bind(wowlab_engine_combat::generated_identities::specs::subtlety_rogue::PROOF);
500pub(crate) const AURA_SHADOW_TECHNIQUES: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::AURA_SHADOW_TECHNIQUES
501 .bind(wowlab_engine_combat::generated_identities::specs::subtlety_rogue::PROOF);
502pub(crate) const AURA_MASTER_OF_SHADOWS: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::AURA_MASTER_OF_SHADOWS
503 .bind(wowlab_engine_combat::generated_identities::specs::subtlety_rogue::PROOF);
504pub(crate) const AURA_ALACRITY: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::AURA_ALACRITY
505 .bind(wowlab_engine_combat::generated_identities::specs::subtlety_rogue::PROOF);
506pub(crate) const AURA_INSTANT_POISON: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::AURA_INSTANT_POISON
507 .bind(wowlab_engine_combat::generated_identities::specs::subtlety_rogue::PROOF);
508pub(crate) const AURA_WOUND_POISON: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::AURA_WOUND_POISON
509 .bind(wowlab_engine_combat::generated_identities::specs::subtlety_rogue::PROOF);
510pub(crate) const AURA_ATROPHIC_POISON: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::AURA_ATROPHIC_POISON
511 .bind(wowlab_engine_combat::generated_identities::specs::subtlety_rogue::PROOF);
512pub(crate) const AURA_NUMBING_POISON: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::AURA_NUMBING_POISON
513 .bind(wowlab_engine_combat::generated_identities::specs::subtlety_rogue::PROOF);
514pub(crate) const AURA_CRIPPLING_POISON: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::AURA_CRIPPLING_POISON
515 .bind(wowlab_engine_combat::generated_identities::specs::subtlety_rogue::PROOF);
516pub(crate) const AURA_DEEPER_STRATAGEM: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::AURA_DEEPER_STRATAGEM
517 .bind(wowlab_engine_combat::generated_identities::specs::subtlety_rogue::PROOF);
518pub(crate) const AURA_SECRET_STRATAGEM: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::AURA_SECRET_STRATAGEM
519 .bind(wowlab_engine_combat::generated_identities::specs::subtlety_rogue::PROOF);
520pub(crate) const AURA_DARKEST_NIGHT: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::AURA_DARKEST_NIGHT
521 .bind(wowlab_engine_combat::generated_identities::specs::subtlety_rogue::PROOF);
522pub(crate) const AURA_LINGERING_SHADOW: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::AURA_LINGERING_SHADOW
523 .bind(wowlab_engine_combat::generated_identities::specs::subtlety_rogue::PROOF);
524pub(crate) const AURA_SHADOW_DANCE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::AURA_SHADOW_DANCE
525 .bind(wowlab_engine_combat::generated_identities::specs::subtlety_rogue::PROOF);
526pub(crate) const AURA_PREMEDITATION: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::AURA_PREMEDITATION
527 .bind(wowlab_engine_combat::generated_identities::specs::subtlety_rogue::PROOF);
528pub(crate) const AURA_SHADOW_BLADES: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::AURA_SHADOW_BLADES
529 .bind(wowlab_engine_combat::generated_identities::specs::subtlety_rogue::PROOF);
530pub(crate) const AURA_ANCIENT_ARTS: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::AURA_ANCIENT_ARTS
531 .bind(wowlab_engine_combat::generated_identities::specs::subtlety_rogue::PROOF);
532pub(crate) const AURA_ESCALATING_BLADE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::AURA_ESCALATING_BLADE
533 .bind(wowlab_engine_combat::generated_identities::specs::subtlety_rogue::PROOF);
534pub(crate) const AURA_COUP_DE_GRACE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::AURA_COUP_DE_GRACE
535 .bind(wowlab_engine_combat::generated_identities::specs::subtlety_rogue::PROOF);
536pub(crate) const AURA_UNSEEN_BLADE_CD: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::AURA_UNSEEN_BLADE_CD
537 .bind(wowlab_engine_combat::generated_identities::specs::subtlety_rogue::PROOF);
538pub(crate) const AURA_FLAWLESS_FORM: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::AURA_FLAWLESS_FORM
539 .bind(wowlab_engine_combat::generated_identities::specs::subtlety_rogue::PROOF);
540pub(crate) const AURA_DISORIENTING_STRIKES: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::AURA_DISORIENTING_STRIKES
541 .bind(wowlab_engine_combat::generated_identities::specs::subtlety_rogue::PROOF);
542pub(crate) const AURA_FAZED: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::AURA_FAZED
543 .bind(wowlab_engine_combat::generated_identities::specs::subtlety_rogue::PROOF);
544pub(crate) const AURA_PVP_RULES_ENABLED_HARDCODED: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::AURA_PVP_RULES_ENABLED_HARDCODED
545 .bind(wowlab_engine_combat::generated_identities::specs::subtlety_rogue::PROOF);
546pub(crate) const AURA_COUNT: usize = 28;
547const _: () = assert!(
548 AURA_COUNT == 28, "AURA index ABI: count changed -- update positional hook consumers"
549);
550pub(crate) const SPELL_BACKSTAB: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::SPELL_BACKSTAB
551 .bind(wowlab_engine_combat::generated_identities::specs::subtlety_rogue::PROOF);
552pub(crate) const SPELL_SHADOWSTRIKE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::SPELL_SHADOWSTRIKE
553 .bind(wowlab_engine_combat::generated_identities::specs::subtlety_rogue::PROOF);
554pub(crate) const SPELL_SHURIKEN_STORM: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::SPELL_SHURIKEN_STORM
555 .bind(wowlab_engine_combat::generated_identities::specs::subtlety_rogue::PROOF);
556pub(crate) const SPELL_SHURIKEN_TOSS: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::SPELL_SHURIKEN_TOSS
557 .bind(wowlab_engine_combat::generated_identities::specs::subtlety_rogue::PROOF);
558pub(crate) const SPELL_EVISCERATE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::SPELL_EVISCERATE
559 .bind(wowlab_engine_combat::generated_identities::specs::subtlety_rogue::PROOF);
560pub(crate) const SPELL_BLACK_POWDER: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::SPELL_BLACK_POWDER
561 .bind(wowlab_engine_combat::generated_identities::specs::subtlety_rogue::PROOF);
562pub(crate) const SPELL_SECRET_TECHNIQUE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::SPELL_SECRET_TECHNIQUE
563 .bind(wowlab_engine_combat::generated_identities::specs::subtlety_rogue::PROOF);
564pub(crate) const SPELL_GOREMAW_S_BITE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::SPELL_GOREMAW_S_BITE
565 .bind(wowlab_engine_combat::generated_identities::specs::subtlety_rogue::PROOF);
566pub(crate) const SPELL_SLICE_AND_DICE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::SPELL_SLICE_AND_DICE
567 .bind(wowlab_engine_combat::generated_identities::specs::subtlety_rogue::PROOF);
568pub(crate) const SPELL_INSTANT_POISON: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::SPELL_INSTANT_POISON
569 .bind(wowlab_engine_combat::generated_identities::specs::subtlety_rogue::PROOF);
570pub(crate) const SPELL_WOUND_POISON: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::SPELL_WOUND_POISON
571 .bind(wowlab_engine_combat::generated_identities::specs::subtlety_rogue::PROOF);
572pub(crate) const SPELL_ATROPHIC_POISON: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::SPELL_ATROPHIC_POISON
573 .bind(wowlab_engine_combat::generated_identities::specs::subtlety_rogue::PROOF);
574pub(crate) const SPELL_NUMBING_POISON: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::SPELL_NUMBING_POISON
575 .bind(wowlab_engine_combat::generated_identities::specs::subtlety_rogue::PROOF);
576pub(crate) const SPELL_CRIPPLING_POISON: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::SPELL_CRIPPLING_POISON
577 .bind(wowlab_engine_combat::generated_identities::specs::subtlety_rogue::PROOF);
578pub(crate) const SPELL_INSTANT_POISON_DAMAGE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::SPELL_INSTANT_POISON_DAMAGE
579 .bind(wowlab_engine_combat::generated_identities::specs::subtlety_rogue::PROOF);
580pub(crate) const SPELL_EVISCERATE_BONUS: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::SPELL_EVISCERATE_BONUS
581 .bind(wowlab_engine_combat::generated_identities::specs::subtlety_rogue::PROOF);
582pub(crate) const SPELL_BLACK_POWDER_BONUS: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::SPELL_BLACK_POWDER_BONUS
583 .bind(wowlab_engine_combat::generated_identities::specs::subtlety_rogue::PROOF);
584pub(crate) const SPELL_SECRET_TECHNIQUE_PLAYER: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::SPELL_SECRET_TECHNIQUE_PLAYER
585 .bind(wowlab_engine_combat::generated_identities::specs::subtlety_rogue::PROOF);
586pub(crate) const SPELL_SECRET_TECHNIQUE_CLONES: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::SPELL_SECRET_TECHNIQUE_CLONES
587 .bind(wowlab_engine_combat::generated_identities::specs::subtlety_rogue::PROOF);
588pub(crate) const SPELL_LASHE_MACABRE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::SPELL_LASHE_MACABRE
589 .bind(wowlab_engine_combat::generated_identities::specs::subtlety_rogue::PROOF);
590pub(crate) const SPELL_KICK: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::SPELL_KICK
591 .bind(wowlab_engine_combat::generated_identities::specs::subtlety_rogue::PROOF);
592pub(crate) const SPELL_SHADOW_DANCE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::SPELL_SHADOW_DANCE
593 .bind(wowlab_engine_combat::generated_identities::specs::subtlety_rogue::PROOF);
594pub(crate) const SPELL_SHADOW_BLADES: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::SPELL_SHADOW_BLADES
595 .bind(wowlab_engine_combat::generated_identities::specs::subtlety_rogue::PROOF);
596pub(crate) const SPELL_SHADOW_BLADES_ATTACK: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::SPELL_SHADOW_BLADES_ATTACK
597 .bind(wowlab_engine_combat::generated_identities::specs::subtlety_rogue::PROOF);
598pub(crate) const SPELL_BACKSTAB_SHADOW_CLONE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::SPELL_BACKSTAB_SHADOW_CLONE
599 .bind(wowlab_engine_combat::generated_identities::specs::subtlety_rogue::PROOF);
600pub(crate) const SPELL_SHADOWSTRIKE_SHADOW_CLONE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::SPELL_SHADOWSTRIKE_SHADOW_CLONE
601 .bind(wowlab_engine_combat::generated_identities::specs::subtlety_rogue::PROOF);
602pub(crate) const SPELL_EVISCERATE_SHADOW_CLONE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::SPELL_EVISCERATE_SHADOW_CLONE
603 .bind(wowlab_engine_combat::generated_identities::specs::subtlety_rogue::PROOF);
604pub(crate) const SPELL_SHURIKEN_STORM_SHADOW_CLONE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::SPELL_SHURIKEN_STORM_SHADOW_CLONE
605 .bind(wowlab_engine_combat::generated_identities::specs::subtlety_rogue::PROOF);
606pub(crate) const SPELL_SECRET_TECHNIQUE_SHADOW_CLONE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::SPELL_SECRET_TECHNIQUE_SHADOW_CLONE
607 .bind(wowlab_engine_combat::generated_identities::specs::subtlety_rogue::PROOF);
608pub(crate) const SPELL_BLACK_POWDER_SHADOW_CLONE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::SPELL_BLACK_POWDER_SHADOW_CLONE
609 .bind(wowlab_engine_combat::generated_identities::specs::subtlety_rogue::PROOF);
610pub(crate) const SPELL_THISTLE_TEA: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::SPELL_THISTLE_TEA
611 .bind(wowlab_engine_combat::generated_identities::specs::subtlety_rogue::PROOF);
612pub(crate) const SPELL_VANISH: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::subtlety_rogue::SPELL_VANISH
613 .bind(wowlab_engine_combat::generated_identities::specs::subtlety_rogue::PROOF);
614pub(crate) const SPELL_COUNT: usize = 32;
615const _: () = assert!(
616 SPELL_COUNT == 32,
617 "SPELL index ABI: count changed -- update positional hook consumers"
618);
619pub(crate) mod EFFECT {
620 pub(crate) const ALACRITY_CHANCE_PER_CP: (u32, u8) = (193_539, 2);
622 pub(crate) const MID2_SUBTLETY_2PC_BACKSTAB_COST: (u32, u8) = (1_296_592, 1);
624 pub(crate) const MID2_SUBTLETY_2PC_BACKSTAB_DAMAGE: (u32, u8) = (1_296_592, 2);
626 pub(crate) const MID2_SUBTLETY_2PC_SHURIKEN_COST: (u32, u8) = (1_296_592, 3);
628 pub(crate) const MID2_SUBTLETY_2PC_SHURIKEN_DAMAGE: (u32, u8) = (1_296_592, 4);
630 pub(crate) const MID2_SUBTLETY_4PC_LINGERING: (u32, u8) = (1_296_593, 1);
632 pub(crate) const ANCIENT_ARTS_1_CLONE: (u32, u8) = (1_268_932, 1);
634 pub(crate) const ANCIENT_ARTS_2_SHT: (u32, u8) = (1_268_936, 1);
636 pub(crate) const BLACK_POWDER_BONUS_COEF: (u32, u8) = (319_190, 1);
638 pub(crate) const CDG_BONUS_1: (u32, u8) = (462_244, 1);
640 pub(crate) const CDG_BONUS_2: (u32, u8) = (462_247, 1);
642 pub(crate) const CDG_BONUS_3: (u32, u8) = (462_248, 1);
644 pub(crate) const CDG_DAMAGE_1: (u32, u8) = (462_241, 1);
646 pub(crate) const CDG_DAMAGE_2: (u32, u8) = (462_242, 1);
648 pub(crate) const CDG_DAMAGE_3: (u32, u8) = (462_243, 1);
650 pub(crate) const CLONE_BACKSTAB: (u32, u8) = (1_269_209, 1);
652 pub(crate) const CLONE_BLACK_POWDER: (u32, u8) = (1_269_565, 1);
654 pub(crate) const CLONE_EVISCERATE: (u32, u8) = (1_269_205, 1);
656 pub(crate) const CLONE_SECRET_TECHNIQUE: (u32, u8) = (1_269_560, 1);
658 pub(crate) const CLONE_SHADOWSTRIKE: (u32, u8) = (1_269_336, 1);
660 pub(crate) const CLONE_SHURIKEN_STORM: (u32, u8) = (1_269_340, 1);
662 pub(crate) const COUP_DE_GRACE_BONUS_CP: (u32, u8) = (441_423, 3);
664 pub(crate) const COUP_DE_GRACE_FLAWLESS: (u32, u8) = (441_423, 2);
666 pub(crate) const DEEPENING_SHADOWS_DURATION: (u32, u8) = (1_271_702, 3);
668 pub(crate) const DISORIENTING_FREE_BLADES: (u32, u8) = (441_274, 2);
670 pub(crate) const DISORIENTING_ST_CDR: (u32, u8) = (441_274, 1);
672 pub(crate) const EVISCERATE_BONUS_COEF: (u32, u8) = (328_082, 1);
674 pub(crate) const EVISCERATE_COEF: (u32, u8) = (196_819, 1);
676 pub(crate) const EXECUTIONER_DIRECT: (u32, u8) = (76808, 1);
678 pub(crate) const EXECUTIONER_PERIODIC: (u32, u8) = (76808, 2);
680 pub(crate) const FIND_WEAKNESS_ARMOR_PEN: (u32, u8) = (1_264_521, 1);
682 pub(crate) const FLASHING_STEEL_CHANCE: (u32, u8) = (1_276_630, 2);
684 pub(crate) const FLASHING_STEEL_WINDOW: (u32, u8) = (1_276_630, 1);
686 pub(crate) const FORCED_INDUCTION_BONUS: (u32, u8) = (470_668, 1);
688 pub(crate) const IMPROVED_SECRET_TECHNIQUE_DMG: (u32, u8) = (1_279_444, 1);
690 pub(crate) const INSTANT_POISON_DAMAGE: (u32, u8) = (315_585, 1);
692 pub(crate) const LASHE_MACABRE_COEF: (u32, u8) = (1_264_397, 1);
694 pub(crate) const PREMEDITATION_CP: (u32, u8) = (343_160, 1);
696 pub(crate) const RELENTLESS_STRIKES_ENERGY: (u32, u8) = (98440, 1);
698 pub(crate) const REPLICATING_SHADOWS_CLONE: (u32, u8) = (382_506, 2);
700 pub(crate) const SECRET_TECHNIQUE_CLONE: (u32, u8) = (282_449, 1);
702 pub(crate) const SECRET_TECHNIQUE_PLAYER: (u32, u8) = (280_720, 1);
704 pub(crate) const SHADOWED_FINISHERS_PCT: (u32, u8) = (382_511, 1);
706 pub(crate) const SHADOW_BLADES_ATTACK: (u32, u8) = (279_043, 1);
708 pub(crate) const SHADOW_BLADES_CP: (u32, u8) = (121_471, 2);
710 pub(crate) const SHADOW_BLADES_ECHO: (u32, u8) = (121_471, 1);
712 pub(crate) const SHT_ENERGIZE: (u32, u8) = (196_911, 2);
714 pub(crate) const SPEC_AURA_PET_DMG: (u32, u8) = (137_035, 3);
716 pub(crate) const SUPERCHARGER_BONUS_CP: (u32, u8) = (470_347, 2);
718 pub(crate) const SUPERCHARGER_CHARGES: (u32, u8) = (470_347, 1);
720 pub(crate) const SURPRISING_STRIKES_CRIT_DMG: (u32, u8) = (441_273, 1);
722 pub(crate) const UMBRAL_EDGE_DMG: (u32, u8) = (1_281_468, 1);
724 pub(crate) const UNSEEN_BLADE_COEF: (u32, u8) = (441_144, 1);
726}
727static REPORTED_SPELLS: &[(&str, u32)] = &[
728 ("cdg_bonus_1", 462_244),
729 ("cdg_bonus_2", 462_247),
730 ("cdg_bonus_3", 462_248),
731 ("melee", 6603),
732];
733static DECLARED_SPELL_IDS: &[u32] = &[
734 53, 185_438, 197_835, 114_014, 196_819, 319_175, 280_719, 426_591, 315_496, 315_584,
735 8679, 381_637, 5761, 3408, 315_585, 328_082, 319_190, 280_720, 282_449, 1_264_397,
736 1766, 185_313, 121_471, 279_043, 1_269_209, 1_269_336, 1_269_205, 1_269_340,
737 1_269_560, 1_269_565, 381_623, 1856, 1_264_521, 1784, 115_192, 196_911, 196_980,
738 193_538, 193_531, 394_320, 457_280, 385_960, 343_173, 1_269_163, 441_786, 441_519,
739 459_485, 441_326, 441_274, 441_224, 134_735, 193_539, 1_268_932, 1_268_936,
740 1_268_939, 382_528, 245_687, 469_642, 185_314, 382_517, 394_930, 382_525, 91023,
741 470_668, 200_758, 319_949, 1_279_444, 382_238, 382_524, 196_976, 382_518, 381_634,
742 343_160, 58423, 382_506, 426_594, 382_511, 385_722, 470_347, 382_015, 469_779,
743 1_281_468, 382_017, 193_537, 6603, 76808, 98440, 137_035, 441_144, 441_273, 441_423,
744 462_241, 462_242, 462_243, 462_244, 462_247, 462_248, 1_271_702, 1_276_630,
745 1_296_592, 1_296_593, 1_276_679, 441_263, 441_321, 441_367, 441_146, 457_157,
746 457_193, 457_052, 457_068, 457_273, 457_284, 457_167, 1_248_774,
747];
748static DECLARED_AURA_IDS: &[u32] = &[
749 1_264_521, 315_496, 1784, 1856, 115_192, 196_911, 196_980, 193_538, 315_584, 8679,
750 381_637, 5761, 3408, 193_531, 394_320, 457_280, 385_960, 185_313, 343_173, 121_471,
751 1_269_163, 441_786, 441_519, 459_485, 441_326, 441_274, 441_224, 134_735, 457_052,
752 457_068, 457_273, 457_284, 457_167, 1_248_774,
753];
754static TALENTS: &[(&str, u32)] = &[
755 ("ALACRITY", TALENT::ALACRITY),
756 ("ANCIENT_ARTS_1", TALENT::ANCIENT_ARTS_1),
757 ("ANCIENT_ARTS_2", TALENT::ANCIENT_ARTS_2),
758 ("ANCIENT_ARTS_3", TALENT::ANCIENT_ARTS_3),
759 ("DANSE_MACABRE", TALENT::DANSE_MACABRE),
760 ("DARK_SHADOW", TALENT::DARK_SHADOW),
761 ("DEATH_PERCEPTION", TALENT::DEATH_PERCEPTION),
762 ("DEEPENING_SHADOWS", TALENT::DEEPENING_SHADOWS),
763 ("DEEPER_DAGGERS", TALENT::DEEPER_DAGGERS),
764 ("DEEPER_STRATAGEM", TALENT::DEEPER_STRATAGEM),
765 ("DOUBLE_DANCE", TALENT::DOUBLE_DANCE),
766 ("FINALITY", TALENT::FINALITY),
767 ("FIND_WEAKNESS", TALENT::FIND_WEAKNESS),
768 ("FORCED_INDUCTION", TALENT::FORCED_INDUCTION),
769 ("GLOOMBLADE", TALENT::GLOOMBLADE),
770 ("GOREMAWS_BITE", TALENT::GOREMAWS_BITE),
771 ("IMPROVED_BACKSTAB", TALENT::IMPROVED_BACKSTAB),
772 ("IMPROVED_SECRET_TECHNIQUE", TALENT::IMPROVED_SECRET_TECHNIQUE),
773 ("LETHALITY", TALENT::LETHALITY),
774 ("LINGERING_SHADOW", TALENT::LINGERING_SHADOW),
775 ("MASTER_OF_SHADOWS", TALENT::MASTER_OF_SHADOWS),
776 ("PERFORATED_VEINS", TALENT::PERFORATED_VEINS),
777 ("POTENT_POWDER", TALENT::POTENT_POWDER),
778 ("PREMEDITATION", TALENT::PREMEDITATION),
779 ("RELENTLESS_STRIKES", TALENT::RELENTLESS_STRIKES),
780 ("REPLICATING_SHADOWS", TALENT::REPLICATING_SHADOWS),
781 ("SECRET_STRATAGEM", TALENT::SECRET_STRATAGEM),
782 ("SHADOWCRAFT", TALENT::SHADOWCRAFT),
783 ("SHADOWED_FINISHERS", TALENT::SHADOWED_FINISHERS),
784 ("SHADOW_BLADES", TALENT::SHADOW_BLADES),
785 ("SILENT_STORM", TALENT::SILENT_STORM),
786 ("SUPERCHARGER", TALENT::SUPERCHARGER),
787 ("THE_ROTTEN", TALENT::THE_ROTTEN),
788 ("THISTLE_TEA", TALENT::THISTLE_TEA),
789 ("UMBRAL_EDGE", TALENT::UMBRAL_EDGE),
790 ("VEILTOUCHED", TALENT::VEILTOUCHED),
791 ("WEAPONMASTER", TALENT::WEAPONMASTER),
792];
793pub(crate) mod SUBTLETY_ROGUE {
794 pub(crate) const BACKSTAB_CASTS: u32 = 0;
795 pub(crate) const SHADOWSTRIKE_CASTS: u32 = 1;
796 pub(crate) const EVISCERATE_CASTS: u32 = 2;
797 pub(crate) const BLACK_POWDER_CASTS: u32 = 3;
798 pub(crate) const SECRET_TECHNIQUE_CASTS: u32 = 4;
799 pub(crate) const SHADOW_BLADES_CASTS: u32 = 5;
800 pub(crate) const SHADOW_DANCE_CASTS: u32 = 6;
801 pub(crate) const GOREMAWS_BITE_CASTS: u32 = 7;
802 pub(crate) const SHADOW_DANCE_UPTIME_MS: u32 = 8;
803 pub(crate) const SHADOW_BLADES_UPTIME_MS: u32 = 9;
804 pub(crate) const FIND_WEAKNESS_UPTIME_MS: u32 = 10;
805}
806fn aura_find_weakness(
807 a: AuraDefinitionDraft,
808 data: &ResolvedGameData,
809) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
810 Ok(
811 a
812 .on_player()
813 .apply_base_from_data(data, 1_264_521)?
814 .max_stacks(
815 data
816 .require_aura_max_stacks(
817 wowlab_types::sim::SpellIdx::from_raw(1_264_521),
818 )?,
819 ),
820 )
821}
822fn aura_slice_and_dice(
823 a: AuraDefinitionDraft,
824 data: &ResolvedGameData,
825) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
826 Ok(
827 a
828 .on_player()
829 .apply_base_from_data(data, 315_496)?
830 .max_stacks(
831 data
832 .require_aura_max_stacks(
833 wowlab_types::sim::SpellIdx::from_raw(315_496),
834 )?,
835 ),
836 )
837}
838fn aura_stealth(
839 a: AuraDefinitionDraft,
840 data: &ResolvedGameData,
841) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
842 Ok(
843 a
844 .on_player()
845 .apply_base_from_data(data, 1784)?
846 .max_stacks(
847 data
848 .require_aura_max_stacks(
849 wowlab_types::sim::SpellIdx::from_raw(1784),
850 )?,
851 ),
852 )
853}
854fn aura_vanish(
855 a: AuraDefinitionDraft,
856 data: &ResolvedGameData,
857) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
858 Ok(
859 a
860 .on_player()
861 .apply_base_from_data(data, 1856)?
862 .max_stacks(
863 data
864 .require_aura_max_stacks(
865 wowlab_types::sim::SpellIdx::from_raw(1856),
866 )?,
867 ),
868 )
869}
870fn aura_subterfuge(
871 a: AuraDefinitionDraft,
872 data: &ResolvedGameData,
873) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
874 Ok(
875 a
876 .on_player()
877 .apply_base_from_data(data, 115_192)?
878 .max_stacks(
879 data
880 .require_aura_max_stacks(
881 wowlab_types::sim::SpellIdx::from_raw(115_192),
882 )?,
883 ),
884 )
885}
886fn aura_shadow_techniques(
887 a: AuraDefinitionDraft,
888 data: &ResolvedGameData,
889) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
890 Ok(
891 a
892 .on_player()
893 .apply_base_from_data(data, 196_911)?
894 .max_stacks(
895 data
896 .require_aura_max_stacks(
897 wowlab_types::sim::SpellIdx::from_raw(196_911),
898 )?,
899 ),
900 )
901}
902fn aura_master_of_shadows(
903 a: AuraDefinitionDraft,
904 data: &ResolvedGameData,
905) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
906 Ok(
907 a
908 .on_player()
909 .apply_base_from_data(data, 196_980)?
910 .max_stacks(
911 data
912 .require_aura_max_stacks(
913 wowlab_types::sim::SpellIdx::from_raw(196_980),
914 )?,
915 ),
916 )
917}
918fn aura_alacrity(
919 a: AuraDefinitionDraft,
920 data: &ResolvedGameData,
921) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
922 a.on_player()
923 .apply_base_from_data(data, 193_538)?
924 .max_stacks(
925 data.require_aura_max_stacks(wowlab_types::sim::SpellIdx::from_raw(193_538))?,
926 )
927 .haste_per_stack(
928 data.base_points(wowlab_types::sim::SpellIdx::from_raw(193_538), 1),
929 )
930}
931fn aura_instant_poison(
932 a: AuraDefinitionDraft,
933 data: &ResolvedGameData,
934) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
935 Ok(
936 a
937 .on_player()
938 .apply_base_from_data(data, 315_584)?
939 .max_stacks(
940 data
941 .require_aura_max_stacks(
942 wowlab_types::sim::SpellIdx::from_raw(315_584),
943 )?,
944 )
945 .spell_group(0, wowlab_types::combat::SpellGroupRule::Exclusive),
946 )
947}
948fn aura_wound_poison(
949 a: AuraDefinitionDraft,
950 data: &ResolvedGameData,
951) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
952 Ok(
953 a
954 .on_player()
955 .apply_base_from_data(data, 8679)?
956 .max_stacks(
957 data
958 .require_aura_max_stacks(
959 wowlab_types::sim::SpellIdx::from_raw(8679),
960 )?,
961 )
962 .spell_group(0, wowlab_types::combat::SpellGroupRule::Exclusive),
963 )
964}
965fn aura_atrophic_poison(
966 a: AuraDefinitionDraft,
967 data: &ResolvedGameData,
968) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
969 Ok(
970 a
971 .on_player()
972 .apply_base_from_data(data, 381_637)?
973 .max_stacks(
974 data
975 .require_aura_max_stacks(
976 wowlab_types::sim::SpellIdx::from_raw(381_637),
977 )?,
978 )
979 .spell_group(1, wowlab_types::combat::SpellGroupRule::Exclusive),
980 )
981}
982fn aura_numbing_poison(
983 a: AuraDefinitionDraft,
984 data: &ResolvedGameData,
985) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
986 Ok(
987 a
988 .on_player()
989 .apply_base_from_data(data, 5761)?
990 .max_stacks(
991 data
992 .require_aura_max_stacks(
993 wowlab_types::sim::SpellIdx::from_raw(5761),
994 )?,
995 )
996 .spell_group(1, wowlab_types::combat::SpellGroupRule::Exclusive),
997 )
998}
999fn aura_crippling_poison(
1000 a: AuraDefinitionDraft,
1001 data: &ResolvedGameData,
1002) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1003 Ok(
1004 a
1005 .on_player()
1006 .apply_base_from_data(data, 3408)?
1007 .max_stacks(
1008 data
1009 .require_aura_max_stacks(
1010 wowlab_types::sim::SpellIdx::from_raw(3408),
1011 )?,
1012 )
1013 .spell_group(1, wowlab_types::combat::SpellGroupRule::Exclusive),
1014 )
1015}
1016fn aura_deeper_stratagem(
1017 a: AuraDefinitionDraft,
1018 data: &ResolvedGameData,
1019) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1020 Ok(
1021 a
1022 .on_player()
1023 .apply_base_from_data(data, 193_531)?
1024 .max_stacks(
1025 data
1026 .require_aura_max_stacks(
1027 wowlab_types::sim::SpellIdx::from_raw(193_531),
1028 )?,
1029 ),
1030 )
1031}
1032fn aura_secret_stratagem(
1033 a: AuraDefinitionDraft,
1034 data: &ResolvedGameData,
1035) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1036 Ok(
1037 a
1038 .on_player()
1039 .apply_base_from_data(data, 394_320)?
1040 .max_stacks(
1041 data
1042 .require_aura_max_stacks(
1043 wowlab_types::sim::SpellIdx::from_raw(394_320),
1044 )?,
1045 ),
1046 )
1047}
1048fn aura_darkest_night(
1049 a: AuraDefinitionDraft,
1050 data: &ResolvedGameData,
1051) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1052 Ok(
1053 a
1054 .on_player()
1055 .apply_base_from_data(data, 457_280)?
1056 .max_stacks(
1057 data
1058 .require_aura_max_stacks(
1059 wowlab_types::sim::SpellIdx::from_raw(457_280),
1060 )?,
1061 ),
1062 )
1063}
1064fn aura_lingering_shadow(
1065 a: AuraDefinitionDraft,
1066 data: &ResolvedGameData,
1067) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1068 Ok(
1069 a
1070 .on_player()
1071 .apply_base_from_data(data, 385_960)?
1072 .max_stacks(
1073 data
1074 .require_aura_max_stacks(
1075 wowlab_types::sim::SpellIdx::from_raw(385_960),
1076 )?,
1077 )
1078 .periodic_hook(
1079 wowlab_engine_combat::validated_milliseconds(
1080 1000.0,
1081 385_960,
1082 "periodic_hook.tick_ms",
1083 )?,
1084 )
1085 .apply_periodic_behavior_from_data(data, 385_960)?
1086 .tick_hook(crate::hooks::subtlety_rogue::lingering_shadow_tick_hook),
1087 )
1088}
1089fn aura_shadow_dance(
1090 a: AuraDefinitionDraft,
1091 data: &ResolvedGameData,
1092) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1093 Ok(
1094 a
1095 .on_player()
1096 .apply_base_from_data(data, 185_313)?
1097 .max_stacks(
1098 data
1099 .require_aura_max_stacks(
1100 wowlab_types::sim::SpellIdx::from_raw(185_313),
1101 )?,
1102 )
1103 .on_expire(crate::hooks::subtlety_rogue::shadow_dance_expire_hook),
1104 )
1105}
1106fn aura_premeditation(
1107 a: AuraDefinitionDraft,
1108 data: &ResolvedGameData,
1109) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1110 Ok(
1111 a
1112 .on_player()
1113 .apply_base_from_data(data, 343_173)?
1114 .max_stacks(
1115 data
1116 .require_aura_max_stacks(
1117 wowlab_types::sim::SpellIdx::from_raw(343_173),
1118 )?,
1119 ),
1120 )
1121}
1122fn aura_shadow_blades(
1123 a: AuraDefinitionDraft,
1124 data: &ResolvedGameData,
1125) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1126 Ok(
1127 a
1128 .on_player()
1129 .apply_base_from_data(data, 121_471)?
1130 .max_stacks(
1131 data
1132 .require_aura_max_stacks(
1133 wowlab_types::sim::SpellIdx::from_raw(121_471),
1134 )?,
1135 ),
1136 )
1137}
1138fn aura_ancient_arts(
1139 a: AuraDefinitionDraft,
1140 data: &ResolvedGameData,
1141) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1142 Ok(
1143 a
1144 .on_player()
1145 .apply_base_from_data(data, 1_269_163)?
1146 .max_stacks(
1147 data
1148 .require_aura_max_stacks(
1149 wowlab_types::sim::SpellIdx::from_raw(1_269_163),
1150 )?,
1151 ),
1152 )
1153}
1154fn aura_escalating_blade(
1155 a: AuraDefinitionDraft,
1156 data: &ResolvedGameData,
1157) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1158 Ok(
1159 a
1160 .on_player()
1161 .apply_base_from_data(data, 441_786)?
1162 .max_stacks(
1163 data
1164 .require_aura_max_stacks(
1165 wowlab_types::sim::SpellIdx::from_raw(441_786),
1166 )?,
1167 ),
1168 )
1169}
1170fn aura_coup_de_grace(
1171 a: AuraDefinitionDraft,
1172 data: &ResolvedGameData,
1173) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1174 Ok(
1175 a
1176 .on_player()
1177 .apply_base_from_data(data, 441_519)?
1178 .max_stacks(
1179 data
1180 .require_aura_max_stacks(
1181 wowlab_types::sim::SpellIdx::from_raw(441_519),
1182 )?,
1183 ),
1184 )
1185}
1186fn aura_unseen_blade_cd(
1187 a: AuraDefinitionDraft,
1188 data: &ResolvedGameData,
1189) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1190 Ok(
1191 a
1192 .on_player()
1193 .apply_base_from_data(data, 459_485)?
1194 .max_stacks(
1195 data
1196 .require_aura_max_stacks(
1197 wowlab_types::sim::SpellIdx::from_raw(459_485),
1198 )?,
1199 ),
1200 )
1201}
1202fn aura_flawless_form(
1203 a: AuraDefinitionDraft,
1204 data: &ResolvedGameData,
1205) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1206 Ok(
1207 a
1208 .on_player()
1209 .apply_base_from_data(data, 441_326)?
1210 .max_stacks(
1211 data
1212 .require_aura_max_stacks(
1213 wowlab_types::sim::SpellIdx::from_raw(441_326),
1214 )?,
1215 ),
1216 )
1217}
1218fn aura_disorienting_strikes(
1219 a: AuraDefinitionDraft,
1220 data: &ResolvedGameData,
1221) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1222 a.on_player()
1223 .duration_ms(
1224 wowlab_engine_combat::validated_milliseconds(
1225 (((f64::from(
1226 data
1227 .require_aura_duration_ms(
1228 wowlab_types::sim::SpellIdx::from_raw(459_485),
1229 )?,
1230 )) * 1.333_333_333_333_333_3) * 1.0)
1231 .round() / 1.0,
1232 441_274,
1233 "aura.duration_ms",
1234 )?,
1235 )
1236 .apply_periodic_effect_from_data(data, 441_274)?
1237 .apply_duration_behavior_from_data(data, 459_485)?
1238 .apply_timing_modifiers_from_data(data, 441_274)?
1239 .max_stacks(
1240 wowlab_engine_combat::validated_max_stacks(2.0, 441_274, "aura.max_stacks")?,
1241 )
1242 .apply_periodic_behavior_from_data(data, 459_485)
1243}
1244fn aura_fazed(
1245 a: AuraDefinitionDraft,
1246 data: &ResolvedGameData,
1247) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1248 Ok(
1249 a
1250 .on_target()
1251 .apply_base_from_data(data, 441_224)?
1252 .max_stacks(
1253 data
1254 .require_aura_max_stacks(
1255 wowlab_types::sim::SpellIdx::from_raw(441_224),
1256 )?,
1257 ),
1258 )
1259}
1260fn aura_pvp_rules_enabled_hardcoded(
1261 a: AuraDefinitionDraft,
1262 data: &ResolvedGameData,
1263) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1264 Ok(
1265 a
1266 .on_player()
1267 .apply_base_from_data(data, 134_735)?
1268 .max_stacks(
1269 data
1270 .require_aura_max_stacks(
1271 wowlab_types::sim::SpellIdx::from_raw(134_735),
1272 )?,
1273 ),
1274 )
1275}
1276fn spell_backstab(
1277 s: SpellDefinitionDraft,
1278 data: &ResolvedGameData,
1279) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1280 Ok(
1281 s
1282 .apply_base_from_data(data, 53)?
1283 .apply_aoe_from_data(data)
1284 .on_cast(crate::hooks::subtlety_rogue::backstab_hook),
1285 )
1286}
1287fn spell_shadowstrike(
1288 s: SpellDefinitionDraft,
1289 data: &ResolvedGameData,
1290) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1291 Ok(
1292 s
1293 .apply_base_from_data(data, 185_438)?
1294 .no_stealth_break()
1295 .apply_aoe_from_data(data)
1296 .on_cast(crate::hooks::subtlety_rogue::shadowstrike_hook),
1297 )
1298}
1299fn spell_shuriken_storm(
1300 s: SpellDefinitionDraft,
1301 data: &ResolvedGameData,
1302) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1303 Ok(
1304 s
1305 .apply_base_from_data(data, 197_835)?
1306 .apply_aoe_from_data(data)
1307 .on_cast(crate::hooks::subtlety_rogue::shuriken_storm_hook),
1308 )
1309}
1310fn spell_shuriken_toss(
1311 s: SpellDefinitionDraft,
1312 data: &ResolvedGameData,
1313) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1314 Ok(s.apply_base_from_data(data, 114_014)?.apply_aoe_from_data(data))
1315}
1316fn spell_eviscerate(
1317 s: SpellDefinitionDraft,
1318 data: &ResolvedGameData,
1319) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1320 Ok(
1321 s
1322 .apply_base_from_data(data, 196_819)?
1323 .apply_aoe_from_data(data)
1324 .on_cast(crate::hooks::subtlety_rogue::eviscerate_hook),
1325 )
1326}
1327fn spell_black_powder(
1328 s: SpellDefinitionDraft,
1329 data: &ResolvedGameData,
1330) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1331 Ok(
1332 s
1333 .apply_base_from_data(data, 319_175)?
1334 .apply_aoe_from_data(data)
1335 .on_cast(crate::hooks::subtlety_rogue::black_powder_hook),
1336 )
1337}
1338fn spell_secret_technique(
1339 s: SpellDefinitionDraft,
1340 data: &ResolvedGameData,
1341) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1342 Ok(
1343 s
1344 .apply_base_from_data(data, 280_719)?
1345 .apply_aoe_from_data(data)
1346 .on_cast(crate::hooks::subtlety_rogue::secret_technique_hook),
1347 )
1348}
1349fn spell_goremaw_s_bite(
1350 s: SpellDefinitionDraft,
1351 data: &ResolvedGameData,
1352) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1353 Ok(s.apply_base_from_data(data, 426_591)?.apply_aoe_from_data(data))
1354}
1355fn spell_slice_and_dice(
1356 s: SpellDefinitionDraft,
1357 data: &ResolvedGameData,
1358) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1359 Ok(
1360 s
1361 .apply_base_from_data(data, 315_496)?
1362 .applies_inferred_aura(AURA_SLICE_AND_DICE, 315_496)
1363 .apply_aoe_from_data(data),
1364 )
1365}
1366fn spell_instant_poison(
1367 s: SpellDefinitionDraft,
1368 data: &ResolvedGameData,
1369) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1370 Ok(
1371 s
1372 .apply_base_from_data(data, 315_584)?
1373 .applies_inferred_aura(AURA_INSTANT_POISON, 315_584)
1374 .apply_aoe_from_data(data),
1375 )
1376}
1377fn spell_wound_poison(
1378 s: SpellDefinitionDraft,
1379 data: &ResolvedGameData,
1380) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1381 Ok(
1382 s
1383 .apply_base_from_data(data, 8679)?
1384 .applies_inferred_aura(AURA_WOUND_POISON, 8679)
1385 .apply_aoe_from_data(data),
1386 )
1387}
1388fn spell_atrophic_poison(
1389 s: SpellDefinitionDraft,
1390 data: &ResolvedGameData,
1391) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1392 Ok(
1393 s
1394 .apply_base_from_data(data, 381_637)?
1395 .applies_inferred_aura(AURA_ATROPHIC_POISON, 381_637)
1396 .apply_aoe_from_data(data),
1397 )
1398}
1399fn spell_numbing_poison(
1400 s: SpellDefinitionDraft,
1401 data: &ResolvedGameData,
1402) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1403 Ok(
1404 s
1405 .apply_base_from_data(data, 5761)?
1406 .applies_inferred_aura(AURA_NUMBING_POISON, 5761)
1407 .apply_aoe_from_data(data),
1408 )
1409}
1410fn spell_crippling_poison(
1411 s: SpellDefinitionDraft,
1412 data: &ResolvedGameData,
1413) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1414 Ok(
1415 s
1416 .apply_base_from_data(data, 3408)?
1417 .applies_inferred_aura(AURA_CRIPPLING_POISON, 3408)
1418 .apply_aoe_from_data(data),
1419 )
1420}
1421fn spell_instant_poison_damage(
1422 s: SpellDefinitionDraft,
1423 data: &ResolvedGameData,
1424) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1425 Ok(s.apply_base_from_data(data, 315_585)?.apply_aoe_from_data(data))
1426}
1427fn spell_eviscerate_bonus(
1428 s: SpellDefinitionDraft,
1429 data: &ResolvedGameData,
1430) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1431 Ok(s.apply_base_from_data(data, 328_082)?.apply_aoe_from_data(data))
1432}
1433fn spell_black_powder_bonus(
1434 s: SpellDefinitionDraft,
1435 data: &ResolvedGameData,
1436) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1437 Ok(s.apply_base_from_data(data, 319_190)?.apply_aoe_from_data(data))
1438}
1439fn spell_secret_technique_player(
1440 s: SpellDefinitionDraft,
1441 data: &ResolvedGameData,
1442) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1443 Ok(s.apply_base_from_data(data, 280_720)?.apply_aoe_from_data(data))
1444}
1445fn spell_secret_technique_clones(
1446 s: SpellDefinitionDraft,
1447 data: &ResolvedGameData,
1448) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1449 Ok(s.apply_base_from_data(data, 282_449)?.apply_aoe_from_data(data))
1450}
1451fn spell_lashe_macabre(
1452 s: SpellDefinitionDraft,
1453 data: &ResolvedGameData,
1454) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1455 Ok(s.apply_base_from_data(data, 1_264_397)?.apply_aoe_from_data(data))
1456}
1457fn spell_kick(
1458 s: SpellDefinitionDraft,
1459 data: &ResolvedGameData,
1460) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1461 Ok(s.apply_base_from_data(data, 1766)?.apply_aoe_from_data(data))
1462}
1463fn spell_shadow_dance(
1464 s: SpellDefinitionDraft,
1465 data: &ResolvedGameData,
1466) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1467 Ok(
1468 s
1469 .apply_base_from_data(data, 185_313)?
1470 .applies_aura(AURA_SHADOW_DANCE)
1471 .no_stealth_break()
1472 .apply_aoe_from_data(data)
1473 .on_cast(crate::hooks::subtlety_rogue::shadow_dance_hook),
1474 )
1475}
1476fn spell_shadow_blades(
1477 s: SpellDefinitionDraft,
1478 data: &ResolvedGameData,
1479) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1480 Ok(
1481 s
1482 .apply_base_from_data(data, 121_471)?
1483 .applies_inferred_aura(AURA_SHADOW_BLADES, 121_471)
1484 .no_stealth_break()
1485 .apply_aoe_from_data(data)
1486 .on_cast(crate::hooks::subtlety_rogue::shadow_blades_hook),
1487 )
1488}
1489fn spell_shadow_blades_attack(
1490 s: SpellDefinitionDraft,
1491 data: &ResolvedGameData,
1492) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1493 Ok(s.apply_base_from_data(data, 279_043)?.apply_aoe_from_data(data))
1494}
1495fn spell_backstab_shadow_clone(
1496 s: SpellDefinitionDraft,
1497 data: &ResolvedGameData,
1498) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1499 Ok(s.apply_base_from_data(data, 1_269_209)?.apply_aoe_from_data(data))
1500}
1501fn spell_shadowstrike_shadow_clone(
1502 s: SpellDefinitionDraft,
1503 data: &ResolvedGameData,
1504) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1505 Ok(s.apply_base_from_data(data, 1_269_336)?.apply_aoe_from_data(data))
1506}
1507fn spell_eviscerate_shadow_clone(
1508 s: SpellDefinitionDraft,
1509 data: &ResolvedGameData,
1510) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1511 Ok(s.apply_base_from_data(data, 1_269_205)?.apply_aoe_from_data(data))
1512}
1513fn spell_shuriken_storm_shadow_clone(
1514 s: SpellDefinitionDraft,
1515 data: &ResolvedGameData,
1516) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1517 Ok(s.apply_base_from_data(data, 1_269_340)?.apply_aoe_from_data(data))
1518}
1519fn spell_secret_technique_shadow_clone(
1520 s: SpellDefinitionDraft,
1521 data: &ResolvedGameData,
1522) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1523 Ok(s.apply_base_from_data(data, 1_269_560)?.apply_aoe_from_data(data))
1524}
1525fn spell_black_powder_shadow_clone(
1526 s: SpellDefinitionDraft,
1527 data: &ResolvedGameData,
1528) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1529 Ok(s.apply_base_from_data(data, 1_269_565)?.apply_aoe_from_data(data))
1530}
1531fn spell_thistle_tea(
1532 s: SpellDefinitionDraft,
1533 data: &ResolvedGameData,
1534) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1535 Ok(
1536 s
1537 .apply_base_from_data(data, 381_623)?
1538 .no_stealth_break()
1539 .apply_aoe_from_data(data),
1540 )
1541}
1542fn spell_vanish(
1543 s: SpellDefinitionDraft,
1544 data: &ResolvedGameData,
1545) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1546 Ok(
1547 s
1548 .apply_base_from_data(data, 1856)?
1549 .applies_aura(AURA_STEALTH)
1550 .no_stealth_break()
1551 .apply_aoe_from_data(data),
1552 )
1553}
1554pub(crate) fn build_combat_system_draft(
1555 params: &wowlab_engine_ports::HandlerParams<'_>,
1556) -> Result<CombatSystemDraft, wowlab_engine_ports::EngineError> {
1557 let builder = CombatSystemBuilder::new(params.stats.clone())
1558 .spec_id(SpecId::Subtlety)
1559 .spec_identity(
1560 wowlab_engine_combat::generated_identities::specs::subtlety_rogue::PROOF,
1561 )
1562 .hero_talent_trees(DECLARED_METADATA.hero_talent_trees)
1563 .effect_identities(
1564 wowlab_engine_combat::generated_identities::specs::subtlety_rogue::damage::ALL,
1565 )
1566 .effect_identities(wowlab_engine_combat::generated_identities::shared::ALL)
1567 .mastery_spell(76808)
1568 .mastery_hook(crate::hooks::subtlety_rogue::mastery)
1569 .resource(
1570 "energy",
1571 params
1572 .game_data
1573 .power_max(3)
1574 .ok_or_else(|| {
1575 wowlab_engine_ports::EngineError::spec_construction(
1576 "missing power-type power_max for type_id 3",
1577 )
1578 })?,
1579 params
1580 .game_data
1581 .power_regen_for_max(
1582 3,
1583 params
1584 .game_data
1585 .power_max(3)
1586 .ok_or_else(|| {
1587 wowlab_engine_ports::EngineError::spec_construction(
1588 "missing power-type power_max for type_id 3",
1589 )
1590 })?,
1591 )
1592 .ok_or_else(|| {
1593 wowlab_engine_ports::EngineError::spec_construction(
1594 "missing power-type power_regen_for_max for type_id 3",
1595 )
1596 })?,
1597 )
1598 .resource_type_id(3)
1599 .resource_start(
1600 params
1601 .game_data
1602 .power_default(3)
1603 .ok_or_else(|| {
1604 wowlab_engine_ports::EngineError::spec_construction(
1605 "missing power-type power_default for type_id 3",
1606 )
1607 })?,
1608 )
1609 .mastery_crit_damage_hook(crate::hooks::subtlety_rogue::crit_damage)
1610 .secondary_resource(
1611 "combo_points",
1612 params
1613 .game_data
1614 .power_max(4)
1615 .ok_or_else(|| {
1616 wowlab_engine_ports::EngineError::spec_construction(
1617 "missing power-type power_max for type_id 4",
1618 )
1619 })?,
1620 )
1621 .secondary_resource_type_id(4)
1622 .precombat_aura(AURA_STEALTH)
1623 .precombat_aura(AURA_INSTANT_POISON)
1624 .precombat_aura(AURA_ATROPHIC_POISON)
1625 .stealth_aura(AURA::STEALTH)
1626 .aura(
1627 "find_weakness",
1628 AURA::FIND_WEAKNESS,
1629 |a| aura_find_weakness(a, ¶ms.game_data),
1630 )
1631 .aura(
1632 "slice_and_dice",
1633 AURA::SLICE_AND_DICE,
1634 |a| aura_slice_and_dice(a, ¶ms.game_data),
1635 )
1636 .aura("stealth", AURA::STEALTH, |a| aura_stealth(a, ¶ms.game_data))
1637 .aura("vanish", AURA::VANISH, |a| aura_vanish(a, ¶ms.game_data))
1638 .aura("subterfuge", AURA::SUBTERFUGE, |a| aura_subterfuge(a, ¶ms.game_data))
1639 .aura(
1640 "shadow_techniques",
1641 AURA::SHADOW_TECHNIQUES,
1642 |a| aura_shadow_techniques(a, ¶ms.game_data),
1643 )
1644 .aura(
1645 "master_of_shadows",
1646 AURA::MASTER_OF_SHADOWS,
1647 |a| aura_master_of_shadows(a, ¶ms.game_data),
1648 )
1649 .aura("alacrity", AURA::ALACRITY, |a| aura_alacrity(a, ¶ms.game_data))
1650 .aura(
1651 "instant_poison",
1652 AURA::INSTANT_POISON,
1653 |a| aura_instant_poison(a, ¶ms.game_data),
1654 )
1655 .aura(
1656 "wound_poison",
1657 AURA::WOUND_POISON,
1658 |a| aura_wound_poison(a, ¶ms.game_data),
1659 )
1660 .aura(
1661 "atrophic_poison",
1662 AURA::ATROPHIC_POISON,
1663 |a| aura_atrophic_poison(a, ¶ms.game_data),
1664 )
1665 .aura(
1666 "numbing_poison",
1667 AURA::NUMBING_POISON,
1668 |a| aura_numbing_poison(a, ¶ms.game_data),
1669 )
1670 .aura(
1671 "crippling_poison",
1672 AURA::CRIPPLING_POISON,
1673 |a| aura_crippling_poison(a, ¶ms.game_data),
1674 )
1675 .aura(
1676 "deeper_stratagem",
1677 AURA::DEEPER_STRATAGEM,
1678 |a| aura_deeper_stratagem(a, ¶ms.game_data),
1679 )
1680 .aura(
1681 "secret_stratagem",
1682 AURA::SECRET_STRATAGEM,
1683 |a| aura_secret_stratagem(a, ¶ms.game_data),
1684 )
1685 .aura(
1686 "darkest_night",
1687 AURA::DARKEST_NIGHT,
1688 |a| aura_darkest_night(a, ¶ms.game_data),
1689 )
1690 .aura(
1691 "lingering_shadow",
1692 AURA::LINGERING_SHADOW,
1693 |a| aura_lingering_shadow(a, ¶ms.game_data),
1694 )
1695 .aura(
1696 "shadow_dance",
1697 AURA::SHADOW_DANCE,
1698 |a| aura_shadow_dance(a, ¶ms.game_data),
1699 )
1700 .aura(
1701 "premeditation",
1702 AURA::PREMEDITATION,
1703 |a| aura_premeditation(a, ¶ms.game_data),
1704 )
1705 .aura(
1706 "shadow_blades",
1707 AURA::SHADOW_BLADES,
1708 |a| aura_shadow_blades(a, ¶ms.game_data),
1709 )
1710 .aura(
1711 "ancient_arts",
1712 AURA::ANCIENT_ARTS,
1713 |a| aura_ancient_arts(a, ¶ms.game_data),
1714 )
1715 .aura(
1716 "escalating_blade",
1717 AURA::ESCALATING_BLADE,
1718 |a| aura_escalating_blade(a, ¶ms.game_data),
1719 )
1720 .aura(
1721 "coup_de_grace",
1722 AURA::COUP_DE_GRACE,
1723 |a| aura_coup_de_grace(a, ¶ms.game_data),
1724 )
1725 .aura(
1726 "unseen_blade_cd",
1727 AURA::UNSEEN_BLADE_CD,
1728 |a| aura_unseen_blade_cd(a, ¶ms.game_data),
1729 )
1730 .aura(
1731 "flawless_form",
1732 AURA::FLAWLESS_FORM,
1733 |a| aura_flawless_form(a, ¶ms.game_data),
1734 )
1735 .aura(
1736 "disorienting_strikes",
1737 AURA::DISORIENTING_STRIKES,
1738 |a| aura_disorienting_strikes(a, ¶ms.game_data),
1739 )
1740 .aura("fazed", AURA::FAZED, |a| aura_fazed(a, ¶ms.game_data))
1741 .aura(
1742 "pvp_rules_enabled_hardcoded",
1743 AURA::PVP_RULES_ENABLED_HARDCODED,
1744 |a| aura_pvp_rules_enabled_hardcoded(a, ¶ms.game_data),
1745 )
1746 .spell("backstab", SPELL::BACKSTAB, |s| spell_backstab(s, ¶ms.game_data))
1747 .spell(
1748 "shadowstrike",
1749 SPELL::SHADOWSTRIKE,
1750 |s| spell_shadowstrike(s, ¶ms.game_data),
1751 )
1752 .spell(
1753 "shuriken_storm",
1754 SPELL::SHURIKEN_STORM,
1755 |s| spell_shuriken_storm(s, ¶ms.game_data),
1756 )
1757 .spell(
1758 "shuriken_toss",
1759 SPELL::SHURIKEN_TOSS,
1760 |s| spell_shuriken_toss(s, ¶ms.game_data),
1761 )
1762 .spell(
1763 "eviscerate",
1764 SPELL::EVISCERATE,
1765 |s| spell_eviscerate(s, ¶ms.game_data),
1766 )
1767 .spell(
1768 "black_powder",
1769 SPELL::BLACK_POWDER,
1770 |s| spell_black_powder(s, ¶ms.game_data),
1771 )
1772 .spell(
1773 "secret_technique",
1774 SPELL::SECRET_TECHNIQUE,
1775 |s| spell_secret_technique(s, ¶ms.game_data),
1776 )
1777 .spell(
1778 "goremaws_bite",
1779 SPELL::GOREMAW_S_BITE,
1780 |s| spell_goremaw_s_bite(s, ¶ms.game_data),
1781 )
1782 .spell(
1783 "slice_and_dice",
1784 SPELL::SLICE_AND_DICE,
1785 |s| spell_slice_and_dice(s, ¶ms.game_data),
1786 )
1787 .spell(
1788 "instant_poison",
1789 SPELL::INSTANT_POISON,
1790 |s| spell_instant_poison(s, ¶ms.game_data),
1791 )
1792 .spell(
1793 "wound_poison",
1794 SPELL::WOUND_POISON,
1795 |s| spell_wound_poison(s, ¶ms.game_data),
1796 )
1797 .spell(
1798 "atrophic_poison",
1799 SPELL::ATROPHIC_POISON,
1800 |s| spell_atrophic_poison(s, ¶ms.game_data),
1801 )
1802 .spell(
1803 "numbing_poison",
1804 SPELL::NUMBING_POISON,
1805 |s| spell_numbing_poison(s, ¶ms.game_data),
1806 )
1807 .spell(
1808 "crippling_poison",
1809 SPELL::CRIPPLING_POISON,
1810 |s| spell_crippling_poison(s, ¶ms.game_data),
1811 )
1812 .spell(
1813 "instant_poison_damage",
1814 SPELL::INSTANT_POISON_DAMAGE,
1815 |s| spell_instant_poison_damage(s, ¶ms.game_data),
1816 )
1817 .spell(
1818 "eviscerate_bonus",
1819 SPELL::EVISCERATE_BONUS,
1820 |s| spell_eviscerate_bonus(s, ¶ms.game_data),
1821 )
1822 .spell(
1823 "black_powder_bonus",
1824 SPELL::BLACK_POWDER_BONUS,
1825 |s| spell_black_powder_bonus(s, ¶ms.game_data),
1826 )
1827 .spell(
1828 "secret_technique_player",
1829 SPELL::SECRET_TECHNIQUE_PLAYER,
1830 |s| spell_secret_technique_player(s, ¶ms.game_data),
1831 )
1832 .spell(
1833 "secret_technique_clones",
1834 SPELL::SECRET_TECHNIQUE_CLONES,
1835 |s| spell_secret_technique_clones(s, ¶ms.game_data),
1836 )
1837 .spell(
1838 "lashe_macabre",
1839 SPELL::LASHE_MACABRE,
1840 |s| spell_lashe_macabre(s, ¶ms.game_data),
1841 )
1842 .spell("kick", SPELL::KICK, |s| spell_kick(s, ¶ms.game_data))
1843 .spell(
1844 "shadow_dance",
1845 SPELL::SHADOW_DANCE,
1846 |s| spell_shadow_dance(s, ¶ms.game_data),
1847 )
1848 .spell(
1849 "shadow_blades",
1850 SPELL::SHADOW_BLADES,
1851 |s| spell_shadow_blades(s, ¶ms.game_data),
1852 )
1853 .spell(
1854 "shadow_blades_attack",
1855 SPELL::SHADOW_BLADES_ATTACK,
1856 |s| spell_shadow_blades_attack(s, ¶ms.game_data),
1857 )
1858 .spell(
1859 "backstab_shadow_clone",
1860 SPELL::BACKSTAB_SHADOW_CLONE,
1861 |s| spell_backstab_shadow_clone(s, ¶ms.game_data),
1862 )
1863 .spell(
1864 "shadowstrike_shadow_clone",
1865 SPELL::SHADOWSTRIKE_SHADOW_CLONE,
1866 |s| spell_shadowstrike_shadow_clone(s, ¶ms.game_data),
1867 )
1868 .spell(
1869 "eviscerate_shadow_clone",
1870 SPELL::EVISCERATE_SHADOW_CLONE,
1871 |s| spell_eviscerate_shadow_clone(s, ¶ms.game_data),
1872 )
1873 .spell(
1874 "shuriken_storm_shadow_clone",
1875 SPELL::SHURIKEN_STORM_SHADOW_CLONE,
1876 |s| spell_shuriken_storm_shadow_clone(s, ¶ms.game_data),
1877 )
1878 .spell(
1879 "secret_technique_shadow_clone",
1880 SPELL::SECRET_TECHNIQUE_SHADOW_CLONE,
1881 |s| spell_secret_technique_shadow_clone(s, ¶ms.game_data),
1882 )
1883 .spell(
1884 "black_powder_shadow_clone",
1885 SPELL::BLACK_POWDER_SHADOW_CLONE,
1886 |s| spell_black_powder_shadow_clone(s, ¶ms.game_data),
1887 )
1888 .spell(
1889 "thistle_tea",
1890 SPELL::THISTLE_TEA,
1891 |s| spell_thistle_tea(s, ¶ms.game_data),
1892 )
1893 .spell("vanish", SPELL::VANISH, |s| spell_vanish(s, ¶ms.game_data))
1894 .auto_attack(|a| {
1895 a
1896 .spell_id(6603)
1897 .swing_ms(1800)
1898 .apply_base_from_data(¶ms.game_data)
1899 .on_swing(crate::hooks::subtlety_rogue::swing_hook)
1900 })
1901 .game_data(params.game_data.clone())
1902 .talent_spell_ids(TALENTS)
1903 .talent_selections(params.talent_selections)
1904 .set_bonus_auras(params.set_bonus_auras)
1905 .encounter(params.encounter.clone());
1906 let builder = crate::generated::items::register_equipped(
1907 builder,
1908 ¶ms.game_data,
1909 params.equipped_items,
1910 )?;
1911
1912 builder.into_draft()
1913}
1914fn new_handler(
1915 params: wowlab_engine_ports::HandlerParams<'_>,
1916) -> Result<Box<dyn SpecHandler>, wowlab_engine_ports::EngineError> {
1917 let handler = crate::composition::compose_handler(
1918 build_combat_system_draft,
1919 ¶ms,
1920 crate::hooks::subtlety_rogue::SubtletyHandler::try_new,
1921 )?;
1922
1923 Ok(Box::new(handler))
1924}
1925static DECLARED_METADATA: DeclaredSpecMetadata = DeclaredSpecMetadata {
1926 primary_resource: ResourceType::Energy,
1927 secondary_resource: Some(ResourceType::ComboPoints),
1928 spell_ids: DECLARED_SPELL_IDS,
1929 aura_ids: DECLARED_AURA_IDS,
1930 server_proc_entries: &[],
1931 talents: TALENTS,
1932 rotation_field_schema: &[],
1933 metrics_plugin_id: None,
1934 hero_talent_trees: &[
1935 HeroTalentTreeDesc {
1936 name: "Trickster",
1937 spells: HERO_TREE_TRICKSTER_SPELLS,
1938 auras: HERO_TREE_TRICKSTER_AURAS,
1939 },
1940 HeroTalentTreeDesc {
1941 name: "Deathstalker",
1942 spells: HERO_TREE_DEATHSTALKER_SPELLS,
1943 auras: HERO_TREE_DEATHSTALKER_AURAS,
1944 },
1945 ],
1946 reported_spells: REPORTED_SPELLS,
1947 masked_passive_effects: &[],
1948 passive_effect_overrides: &[],
1949};
1950pub(super) const SPEC_DESCRIPTOR: SpecDescriptor = SpecDescriptor {
1951 spec_id: SpecId::Subtlety,
1952 display_name: "Subtlety Rogue",
1953 metadata: DECLARED_METADATA,
1954 handler_factory: new_handler,
1955};
1956wowlab_engine_combat::smoke_test!(build_combat_system_draft);