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 MUTILATE: u32 = 1329;
16 pub(crate) const AMBUSH: u32 = 8676;
18 pub(crate) const ENVENOM: u32 = 32645;
20 pub(crate) const SLICE_AND_DICE: u32 = 315_496;
22 pub(crate) const FAN_OF_KNIVES: u32 = 51723;
24 pub(crate) const CRIMSON_TEMPEST: u32 = 1_247_227;
26 pub(crate) const POISONED_KNIFE: u32 = 185_565;
28 pub(crate) const DEADLY_POISON: u32 = 2823;
30 pub(crate) const AMPLIFYING_POISON: u32 = 381_664;
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 MUTILATE_MH: u32 = 5374;
44 pub(crate) const MUTILATE_OH: u32 = 27576;
46 pub(crate) const DEADLY_POISON_INSTANT: u32 = 113_780;
48 pub(crate) const MUTILATED_FLESH: u32 = 394_021;
50 pub(crate) const GARROTE: u32 = 703;
52 pub(crate) const RUPTURE: u32 = 1943;
54 pub(crate) const INTERNAL_BLEEDING_DRIVER: u32 = 381_628;
56 pub(crate) const DEATHMARK: u32 = 360_194;
58 pub(crate) const KINGSBANE: u32 = 385_627;
60 pub(crate) const IMPLACABLE_STRIKES_NATURE: u32 = 1_265_794;
62 pub(crate) const IMPLACABLE_STRIKES_PHYSICAL: u32 = 1_265_795;
64 pub(crate) const THISTLE_TEA: u32 = 381_623;
66 pub(crate) const VANISH: u32 = 1856;
68}
69pub(crate) mod AURA {
70 pub(crate) const STEALTH: u32 = 1784;
72 pub(crate) const VANISH: u32 = 1856;
74 pub(crate) const DEADLY_POISON: u32 = 2823;
76 pub(crate) const AMPLIFYING_POISON: u32 = 381_664;
78 pub(crate) const INSTANT_POISON: u32 = 315_584;
80 pub(crate) const WOUND_POISON: u32 = 8679;
82 pub(crate) const ATROPHIC_POISON: u32 = 381_637;
84 pub(crate) const NUMBING_POISON: u32 = 5761;
86 pub(crate) const CRIPPLING_POISON: u32 = 3408;
88 pub(crate) const DEADLY_POISON_DOT: u32 = 2818;
90 pub(crate) const AMPLIFYING_POISON_DEBUFF: u32 = 383_414;
92 pub(crate) const ENVENOM: u32 = 32645;
94 pub(crate) const SLICE_AND_DICE: u32 = 315_496;
96 pub(crate) const BLINDSIDE: u32 = 121_153;
98 pub(crate) const ALACRITY: u32 = 193_538;
100 pub(crate) const DARKEST_NIGHT: u32 = 457_280;
102 pub(crate) const DEEPER_STRATAGEM: u32 = 193_531;
104 pub(crate) const SANGUINE_STRATAGEM: u32 = 457_512;
106 pub(crate) const DRAGON_TEMPERED_BLADES: u32 = 381_801;
108 pub(crate) const INSPIRING_STRIKE: u32 = 1_250_036;
110 pub(crate) const REGICIDES_REWARD: u32 = 1_250_331;
112 pub(crate) const GARROTE: u32 = 703;
114 pub(crate) const RUPTURE: u32 = 1943;
116 pub(crate) const INTERNAL_BLEEDING: u32 = 381_628;
118 pub(crate) const IMPROVED_GARROTE: u32 = 381_632;
120 pub(crate) const IMPROVED_GARROTE_WINDOW: u32 = 392_401;
122 pub(crate) const DEATHMARK: u32 = 360_194;
124 pub(crate) const KINGSBANE: u32 = 385_627;
126 pub(crate) const KINGSBANE_RAMP: u32 = 394_095;
128 pub(crate) const FINISH_THE_JOB: u32 = 1_249_810;
130 pub(crate) const IMPLACABLE_TRACKER: u32 = 1_265_386;
132 pub(crate) const IMPLACABLE_REGEN: u32 = 1_265_387;
134 pub(crate) const IMPLACABLE_BONUS: u32 = 1_265_385;
136 pub(crate) const PVP_RULES_ENABLED_HARDCODED: u32 = 134_735;
138 pub(crate) const FATEBOUND_COIN_HEADS: u32 = 452_923;
140 pub(crate) const FATEBOUND_COIN_TAILS: u32 = 452_917;
142 pub(crate) const FATEBOUND_LUCKY_COIN: u32 = 1_248_971;
144 pub(crate) const LUCKY_COIN_COUNTER: u32 = 1_249_093;
146}
147pub(crate) mod TALENT {
148 pub(crate) const ALACRITY: u32 = 193_539;
150 pub(crate) const AMPLIFYING_POISON: u32 = 381_664;
152 pub(crate) const BLINDSIDE: u32 = 328_085;
154 pub(crate) const CRIMSON_TEMPEST: u32 = 1_247_227;
156 pub(crate) const DASHING_SCOUNDREL: u32 = 381_797;
158 pub(crate) const DEADLY_POISON: u32 = 2823;
160 pub(crate) const DEATHMARK: u32 = 360_194;
162 pub(crate) const DEEPER_STRATAGEM: u32 = 193_531;
164 pub(crate) const DOOMBLADE: u32 = 381_673;
166 pub(crate) const DRAGON_TEMPERED_BLADES: u32 = 381_801;
168 pub(crate) const FINISH_THE_JOB: u32 = 1_249_809;
170 pub(crate) const IMPLACABLE_1: u32 = 1_265_385;
172 pub(crate) const IMPLACABLE_2: u32 = 1_265_386;
174 pub(crate) const IMPLACABLE_3: u32 = 1_265_387;
176 pub(crate) const IMPROVED_GARROTE: u32 = 381_632;
178 pub(crate) const IMPROVED_POISONS: u32 = 381_624;
180 pub(crate) const INSPIRING_STRIKE: u32 = 1_250_036;
182 pub(crate) const INTERNAL_BLEEDING: u32 = 381_627;
184 pub(crate) const KINGSBANE: u32 = 385_627;
186 pub(crate) const LETHALITY: u32 = 382_238;
188 pub(crate) const LETHAL_DOSE: u32 = 381_640;
190 pub(crate) const RAPID_INJECTION: u32 = 455_072;
192 pub(crate) const REGICIDES_REWARD: u32 = 1_250_325;
194 pub(crate) const SANGUINE_STRATAGEM: u32 = 457_512;
196 pub(crate) const SEAL_FATE: u32 = 14190;
198 pub(crate) const SYSTEMIC_FAILURE: u32 = 381_652;
200 pub(crate) const THISTLE_TEA: u32 = 469_779;
202 pub(crate) const VENOMOUS_WOUNDS: u32 = 79134;
204 pub(crate) const ZOLDYCK_RECIPE: u32 = 381_798;
206}
207pub(crate) mod SET_BONUS {
208 pub(crate) const MID2_ASSASSINATION_2PC: u32 = 1_296_590;
210 pub(crate) const MID2_ASSASSINATION_4PC: u32 = 1_296_591;
212}
213pub(crate) mod REPORTED_SPELL {
214 pub(crate) const AMPLIFYING_POISON: u32 = 383_414;
216 pub(crate) const DEADLY_POISON_DOT: u32 = 2818;
218 pub(crate) const WOUND_POISON_DAMAGE: u32 = 8680;
220}
221pub(crate) mod HERO {
222 pub(crate) mod FATEBOUND {
223 pub(crate) mod SPELL {
224 pub(crate) const CONTROLLED_CHAOS: u32 = 1_276_816;
226 pub(crate) const DEAL_FATE: u32 = 454_419;
228 pub(crate) const DELIVERED_DOOM_TALENT: u32 = 1_249_194;
230 pub(crate) const EDGE_CASE: u32 = 453_457;
232 pub(crate) const FATEBOUND_COIN_TAILS: u32 = 452_538;
234 pub(crate) const HAND_OF_FATE: u32 = 452_536;
236 pub(crate) const LUCKY_COIN: u32 = 1_248_970;
238 pub(crate) const MEAN_STREAK: u32 = 453_428;
240 pub(crate) const OVERFLOWING_PURSE: u32 = 1_249_190;
242 pub(crate) const RAVENHOLDT_MINT: u32 = 1_276_809;
244 pub(crate) const RUSH_TO_THE_INEVITABLE: u32 = 1_249_204;
246 }
247 pub(crate) mod AURA {
248 pub(crate) const FATEBOUND_COIN_HEADS: u32 = 452_923;
250 pub(crate) const FATEBOUND_COIN_TAILS: u32 = 452_917;
252 pub(crate) const FATEBOUND_LUCKY_COIN: u32 = 1_248_971;
254 }
255 }
256}
257static HERO_TREE_FATEBOUND_SPELLS: &[(&str, u32)] = &[
258 ("CONTROLLED_CHAOS", 1_276_816),
259 ("DEAL_FATE", 454_419),
260 ("DELIVERED_DOOM_TALENT", 1_249_194),
261 ("EDGE_CASE", 453_457),
262 ("FATEBOUND_COIN_TAILS", 452_538),
263 ("HAND_OF_FATE", 452_536),
264 ("LUCKY_COIN", 1_248_970),
265 ("MEAN_STREAK", 453_428),
266 ("OVERFLOWING_PURSE", 1_249_190),
267 ("RAVENHOLDT_MINT", 1_276_809),
268 ("RUSH_TO_THE_INEVITABLE", 1_249_204),
269];
270static HERO_TREE_FATEBOUND_AURAS: &[(&str, u32)] = &[
271 ("FATEBOUND_COIN_HEADS", 452_923),
272 ("FATEBOUND_COIN_TAILS", 452_917),
273 ("FATEBOUND_LUCKY_COIN", 1_248_971),
274];
275pub(crate) mod DAMAGE_SPELL {
276 pub(crate) const MUTILATE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_1329;
277 pub(crate) const AMBUSH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_8676;
278 pub(crate) const ENVENOM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_32645;
279 pub(crate) const SLICE_AND_DICE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_315496;
280 pub(crate) const FAN_OF_KNIVES: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_51723;
281 pub(crate) const CRIMSON_TEMPEST: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_1247227;
282 pub(crate) const POISONED_KNIFE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_185565;
283 pub(crate) const DEADLY_POISON: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_2823;
284 pub(crate) const AMPLIFYING_POISON: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_381664;
285 pub(crate) const INSTANT_POISON: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_315584;
286 pub(crate) const WOUND_POISON: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_8679;
287 pub(crate) const ATROPHIC_POISON: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_381637;
288 pub(crate) const NUMBING_POISON: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_5761;
289 pub(crate) const CRIPPLING_POISON: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_3408;
290 pub(crate) const MUTILATE_MH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_5374;
291 pub(crate) const MUTILATE_OH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_27576;
292 pub(crate) const DEADLY_POISON_INSTANT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_113780;
293 pub(crate) const MUTILATED_FLESH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_394021;
294 pub(crate) const GARROTE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_703;
295 pub(crate) const RUPTURE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_1943;
296 pub(crate) const INTERNAL_BLEEDING_DRIVER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_381628;
297 pub(crate) const DEATHMARK: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_360194;
298 pub(crate) const KINGSBANE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_385627;
299 pub(crate) const IMPLACABLE_STRIKES_NATURE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_1265794;
300 pub(crate) const IMPLACABLE_STRIKES_PHYSICAL: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_1265795;
301 pub(crate) const THISTLE_TEA: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_381623;
302 pub(crate) const VANISH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_1856;
303 pub(crate) const CONTROLLED_CHAOS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_1276816;
304 pub(crate) const DEAL_FATE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_454419;
305 pub(crate) const DELIVERED_DOOM_TALENT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_1249194;
306 pub(crate) const EDGE_CASE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_453457;
307 pub(crate) const FATEBOUND_COIN_TAILS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_452538;
308 pub(crate) const HAND_OF_FATE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_452536;
309 pub(crate) const LUCKY_COIN: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_1248970;
310 pub(crate) const MEAN_STREAK: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_453428;
311 pub(crate) const OVERFLOWING_PURSE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_1249190;
312 pub(crate) const RAVENHOLDT_MINT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_1276809;
313 pub(crate) const RUSH_TO_THE_INEVITABLE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_1249204;
314}
315pub(crate) mod DAMAGE_AURA {
316 pub(crate) const STEALTH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_1784;
317 pub(crate) const VANISH: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_1856;
318 pub(crate) const DEADLY_POISON: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_2823;
319 pub(crate) const AMPLIFYING_POISON: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_381664;
320 pub(crate) const INSTANT_POISON: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_315584;
321 pub(crate) const WOUND_POISON: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_8679;
322 pub(crate) const ATROPHIC_POISON: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_381637;
323 pub(crate) const NUMBING_POISON: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_5761;
324 pub(crate) const CRIPPLING_POISON: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_3408;
325 pub(crate) const DEADLY_POISON_DOT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_2818;
326 pub(crate) const AMPLIFYING_POISON_DEBUFF: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_383414;
327 pub(crate) const ENVENOM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_32645;
328 pub(crate) const SLICE_AND_DICE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_315496;
329 pub(crate) const BLINDSIDE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_121153;
330 pub(crate) const ALACRITY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_193538;
331 pub(crate) const DARKEST_NIGHT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_457280;
332 pub(crate) const DEEPER_STRATAGEM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_193531;
333 pub(crate) const SANGUINE_STRATAGEM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_457512;
334 pub(crate) const DRAGON_TEMPERED_BLADES: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_381801;
335 pub(crate) const INSPIRING_STRIKE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_1250036;
336 pub(crate) const REGICIDES_REWARD: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_1250331;
337 pub(crate) const GARROTE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_703;
338 pub(crate) const RUPTURE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_1943;
339 pub(crate) const INTERNAL_BLEEDING: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_381628;
340 pub(crate) const IMPROVED_GARROTE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_381632;
341 pub(crate) const IMPROVED_GARROTE_WINDOW: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_392401;
342 pub(crate) const DEATHMARK: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_360194;
343 pub(crate) const KINGSBANE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_385627;
344 pub(crate) const KINGSBANE_RAMP: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_394095;
345 pub(crate) const FINISH_THE_JOB: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_1249810;
346 pub(crate) const IMPLACABLE_TRACKER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_1265386;
347 pub(crate) const IMPLACABLE_REGEN: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_1265387;
348 pub(crate) const IMPLACABLE_BONUS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_1265385;
349 pub(crate) const PVP_RULES_ENABLED_HARDCODED: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_134735;
350 pub(crate) const FATEBOUND_COIN_HEADS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_452923;
351 pub(crate) const FATEBOUND_COIN_TAILS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_452917;
352 pub(crate) const FATEBOUND_LUCKY_COIN: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_1248971;
353 pub(crate) const LUCKY_COIN_COUNTER: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_1249093;
354}
355pub(crate) mod DAMAGE_TALENT {
356 pub(crate) const ALACRITY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_193539;
357 pub(crate) const AMPLIFYING_POISON: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_381664;
358 pub(crate) const BLINDSIDE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_328085;
359 pub(crate) const CRIMSON_TEMPEST: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_1247227;
360 pub(crate) const DASHING_SCOUNDREL: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_381797;
361 pub(crate) const DEADLY_POISON: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_2823;
362 pub(crate) const DEATHMARK: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_360194;
363 pub(crate) const DEEPER_STRATAGEM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_193531;
364 pub(crate) const DOOMBLADE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_381673;
365 pub(crate) const DRAGON_TEMPERED_BLADES: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_381801;
366 pub(crate) const FINISH_THE_JOB: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_1249809;
367 pub(crate) const IMPLACABLE_1: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_1265385;
368 pub(crate) const IMPLACABLE_2: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_1265386;
369 pub(crate) const IMPLACABLE_3: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_1265387;
370 pub(crate) const IMPROVED_GARROTE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_381632;
371 pub(crate) const IMPROVED_POISONS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_381624;
372 pub(crate) const INSPIRING_STRIKE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_1250036;
373 pub(crate) const INTERNAL_BLEEDING: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_381627;
374 pub(crate) const KINGSBANE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_385627;
375 pub(crate) const LETHALITY: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_382238;
376 pub(crate) const LETHAL_DOSE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_381640;
377 pub(crate) const RAPID_INJECTION: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_455072;
378 pub(crate) const REGICIDES_REWARD: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_1250325;
379 pub(crate) const SANGUINE_STRATAGEM: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_457512;
380 pub(crate) const SEAL_FATE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_14190;
381 pub(crate) const SYSTEMIC_FAILURE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_381652;
382 pub(crate) const THISTLE_TEA: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_469779;
383 pub(crate) const VENOMOUS_WOUNDS: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_79134;
384 pub(crate) const ZOLDYCK_RECIPE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_381798;
385}
386pub(crate) mod DAMAGE_REPORTED {
387 pub(crate) const AMPLIFYING_POISON: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_383414;
388 pub(crate) const DEADLY_POISON_DOT: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_2818;
389 pub(crate) const WOUND_POISON_DAMAGE: wowlab_engine_combat::DamageActionId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ACTION::SPELL_8680;
390}
391pub(crate) mod DAMAGE_EFFECT {
392 pub(crate) const ALACRITY_CHANCE_PER_CP: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::EFFECT::SPELL_193539_EFFECT_2;
393 pub(crate) const AMBUSH_DMG: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::EFFECT::SPELL_8676_EFFECT_1;
394 pub(crate) const AMPLIFYING_CONSUME_STACKS: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::EFFECT::SPELL_381664_EFFECT_2;
395 pub(crate) const AMPLIFYING_ENVENOM_BONUS: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::EFFECT::SPELL_381664_EFFECT_1;
396 pub(crate) const DEATHMARK_ENERGY: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::EFFECT::SPELL_360194_EFFECT_3;
397 pub(crate) const DEATHMARK_PERIOD: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::EFFECT::SPELL_360194_EFFECT_1;
398 pub(crate) const AMPLIFYING_POISON_DMG: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::EFFECT::SPELL_383414_EFFECT_1;
399 pub(crate) const BLINDSIDE_CHANCE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::EFFECT::SPELL_328085_EFFECT_1;
400 pub(crate) const BLINDSIDE_EXECUTE_CHANCE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::EFFECT::SPELL_328085_EFFECT_2;
401 pub(crate) const BLINDSIDE_EXECUTE_THRESHOLD: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::EFFECT::SPELL_328085_EFFECT_3;
402 pub(crate) const COIN_HEADS_INITIAL: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::EFFECT::SPELL_452923_EFFECT_4;
403 pub(crate) const COIN_HEADS_PER_STACK: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::EFFECT::SPELL_452923_EFFECT_1;
404 pub(crate) const COIN_HEADS_PER_STACK_PERIODIC: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::EFFECT::SPELL_452923_EFFECT_2;
405 pub(crate) const CONTROLLED_CHAOS_STREAK: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::EFFECT::SPELL_1276816_EFFECT_1;
406 pub(crate) const DASHING_SCOUNDREL_ENERGY: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::EFFECT::SPELL_381797_EFFECT_2;
407 pub(crate) const DEADLY_POISON_INSTANT_DMG: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::EFFECT::SPELL_113780_EFFECT_1;
408 pub(crate) const DEAL_FATE_CP: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::EFFECT::SPELL_454419_EFFECT_1;
409 pub(crate) const DELIVERED_DOOM_CP: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::EFFECT::SPELL_1249194_EFFECT_2;
410 pub(crate) const DELIVERED_DOOM_DMG: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::EFFECT::SPELL_1249194_EFFECT_1;
411 pub(crate) const DOOMBLADE_PCT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::EFFECT::SPELL_381673_EFFECT_1;
412 pub(crate) const ENVENOM_DMG: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::EFFECT::SPELL_32645_EFFECT_1;
413 pub(crate) const ENVENOM_POISON_BONUS: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::EFFECT::SPELL_32645_EFFECT_2;
414 pub(crate) const FATEBOUND_COIN_TAILS_DMG: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::EFFECT::SPELL_452538_EFFECT_1;
415 pub(crate) const HAND_OF_FATE_CP: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::EFFECT::SPELL_452536_EFFECT_1;
416 pub(crate) const IMPLACABLE_STRIKE_CP: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::EFFECT::SPELL_1265795_EFFECT_2;
417 pub(crate) const IMPLACABLE_STRIKE_NATURE_DMG: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::EFFECT::SPELL_1265794_EFFECT_1;
418 pub(crate) const IMPLACABLE_STRIKE_PHYSICAL_DMG: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::EFFECT::SPELL_1265795_EFFECT_1;
419 pub(crate) const IMPROVED_GARROTE_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::EFFECT::SPELL_392401_EFFECT_2;
420 pub(crate) const INSPIRING_STRIKE_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::EFFECT::SPELL_1250036_EFFECT_1;
421 pub(crate) const LETHAL_DOSE_PER_EFFECT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::EFFECT::SPELL_381640_EFFECT_1;
422 pub(crate) const LUCKY_COIN_FLIPS: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::EFFECT::SPELL_1248970_EFFECT_1;
423 pub(crate) const LUCKY_COIN_ODDS: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::EFFECT::SPELL_1248971_EFFECT_5;
424 pub(crate) const MEAN_STREAK_ODDS: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::EFFECT::SPELL_453428_EFFECT_1;
425 pub(crate) const MID2_ASSASSINATION_2PC_ENVENOM: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::EFFECT::SPELL_1296590_EFFECT_1;
426 pub(crate) const MID2_ASSASSINATION_2PC_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::EFFECT::SPELL_1296590_EFFECT_2;
427 pub(crate) const MID2_ASSASSINATION_4PC_BLEED: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::EFFECT::SPELL_1296591_EFFECT_1;
428 pub(crate) const MID2_ASSASSINATION_4PC_AUTO_ATTACK: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::EFFECT::SPELL_1296591_EFFECT_2;
429 pub(crate) const WOUND_POISON_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::EFFECT::SPELL_8680_EFFECT_1;
430 pub(crate) const MUTILATE_MH_DMG: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::EFFECT::SPELL_5374_EFFECT_2;
431 pub(crate) const MUTILATE_OH_DMG: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::EFFECT::SPELL_27576_EFFECT_2;
432 pub(crate) const OVERFLOWING_PURSE_CHANCE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::EFFECT::SPELL_1249190_EFFECT_3;
433 pub(crate) const OVERFLOWING_PURSE_COINS: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::EFFECT::SPELL_1249190_EFFECT_1;
434 pub(crate) const POTENT_ASSASSIN_DIRECT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::EFFECT::SPELL_76803_EFFECT_1;
435 pub(crate) const POTENT_ASSASSIN_DIRECT_LABEL: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::EFFECT::SPELL_76803_EFFECT_3;
436 pub(crate) const POTENT_ASSASSIN_PERIODIC: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::EFFECT::SPELL_76803_EFFECT_2;
437 pub(crate) const POTENT_ASSASSIN_SECONDARY_DIRECT_LABEL: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::EFFECT::SPELL_76803_EFFECT_4;
438 pub(crate) const RAPID_INJECTION_PCT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::EFFECT::SPELL_455072_EFFECT_1;
439 pub(crate) const RAVENHOLDT_MINT_HEADS: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::EFFECT::SPELL_1276809_EFFECT_1;
440 pub(crate) const REGICIDES_REWARD_DIVISOR: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::EFFECT::SPELL_1250325_EFFECT_1;
441 pub(crate) const RUSH_ENERGY: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::EFFECT::SPELL_1249204_EFFECT_1;
442 pub(crate) const RUSH_ENERGY_EDGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::EFFECT::SPELL_1249204_EFFECT_3;
443 pub(crate) const SEAL_FATE_CHANCE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::EFFECT::SPELL_14190_EFFECT_1;
444 pub(crate) const SEAL_FATE_CP: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::EFFECT::SPELL_14189_EFFECT_1;
445 pub(crate) const SYSTEMIC_FAILURE_PCT: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::EFFECT::SPELL_381652_EFFECT_1;
446 pub(crate) const ZOLDYCK_DAMAGE: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::EFFECT::SPELL_381798_EFFECT_1;
447 pub(crate) const ZOLDYCK_THRESHOLD: wowlab_engine_combat::DamageEffectId = wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::EFFECT::SPELL_381798_EFFECT_2;
448}
449pub(crate) const AURA_STEALTH: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::assassination_rogue::AURA_STEALTH
450 .bind(wowlab_engine_combat::generated_identities::specs::assassination_rogue::PROOF);
451pub(crate) const AURA_VANISH: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::assassination_rogue::AURA_VANISH
452 .bind(wowlab_engine_combat::generated_identities::specs::assassination_rogue::PROOF);
453pub(crate) const AURA_DEADLY_POISON: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::assassination_rogue::AURA_DEADLY_POISON
454 .bind(wowlab_engine_combat::generated_identities::specs::assassination_rogue::PROOF);
455pub(crate) const AURA_AMPLIFYING_POISON: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::assassination_rogue::AURA_AMPLIFYING_POISON
456 .bind(wowlab_engine_combat::generated_identities::specs::assassination_rogue::PROOF);
457pub(crate) const AURA_INSTANT_POISON: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::assassination_rogue::AURA_INSTANT_POISON
458 .bind(wowlab_engine_combat::generated_identities::specs::assassination_rogue::PROOF);
459pub(crate) const AURA_WOUND_POISON: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::assassination_rogue::AURA_WOUND_POISON
460 .bind(wowlab_engine_combat::generated_identities::specs::assassination_rogue::PROOF);
461pub(crate) const AURA_ATROPHIC_POISON: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::assassination_rogue::AURA_ATROPHIC_POISON
462 .bind(wowlab_engine_combat::generated_identities::specs::assassination_rogue::PROOF);
463pub(crate) const AURA_NUMBING_POISON: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::assassination_rogue::AURA_NUMBING_POISON
464 .bind(wowlab_engine_combat::generated_identities::specs::assassination_rogue::PROOF);
465pub(crate) const AURA_CRIPPLING_POISON: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::assassination_rogue::AURA_CRIPPLING_POISON
466 .bind(wowlab_engine_combat::generated_identities::specs::assassination_rogue::PROOF);
467pub(crate) const AURA_DEADLY_POISON_DOT: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::assassination_rogue::AURA_DEADLY_POISON_DOT
468 .bind(wowlab_engine_combat::generated_identities::specs::assassination_rogue::PROOF);
469pub(crate) const AURA_AMPLIFYING_POISON_DEBUFF: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::assassination_rogue::AURA_AMPLIFYING_POISON_DEBUFF
470 .bind(wowlab_engine_combat::generated_identities::specs::assassination_rogue::PROOF);
471pub(crate) const AURA_ENVENOM: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::assassination_rogue::AURA_ENVENOM
472 .bind(wowlab_engine_combat::generated_identities::specs::assassination_rogue::PROOF);
473pub(crate) const AURA_SLICE_AND_DICE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::assassination_rogue::AURA_SLICE_AND_DICE
474 .bind(wowlab_engine_combat::generated_identities::specs::assassination_rogue::PROOF);
475pub(crate) const AURA_BLINDSIDE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::assassination_rogue::AURA_BLINDSIDE
476 .bind(wowlab_engine_combat::generated_identities::specs::assassination_rogue::PROOF);
477pub(crate) const AURA_ALACRITY: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::assassination_rogue::AURA_ALACRITY
478 .bind(wowlab_engine_combat::generated_identities::specs::assassination_rogue::PROOF);
479pub(crate) const AURA_DARKEST_NIGHT: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::assassination_rogue::AURA_DARKEST_NIGHT
480 .bind(wowlab_engine_combat::generated_identities::specs::assassination_rogue::PROOF);
481pub(crate) const AURA_DEEPER_STRATAGEM: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::assassination_rogue::AURA_DEEPER_STRATAGEM
482 .bind(wowlab_engine_combat::generated_identities::specs::assassination_rogue::PROOF);
483pub(crate) const AURA_SANGUINE_STRATAGEM: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::assassination_rogue::AURA_SANGUINE_STRATAGEM
484 .bind(wowlab_engine_combat::generated_identities::specs::assassination_rogue::PROOF);
485pub(crate) const AURA_DRAGON_TEMPERED_BLADES: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::assassination_rogue::AURA_DRAGON_TEMPERED_BLADES
486 .bind(wowlab_engine_combat::generated_identities::specs::assassination_rogue::PROOF);
487pub(crate) const AURA_INSPIRING_STRIKE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::assassination_rogue::AURA_INSPIRING_STRIKE
488 .bind(wowlab_engine_combat::generated_identities::specs::assassination_rogue::PROOF);
489pub(crate) const AURA_REGICIDES_REWARD: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::assassination_rogue::AURA_REGICIDES_REWARD
490 .bind(wowlab_engine_combat::generated_identities::specs::assassination_rogue::PROOF);
491pub(crate) const AURA_GARROTE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::assassination_rogue::AURA_GARROTE
492 .bind(wowlab_engine_combat::generated_identities::specs::assassination_rogue::PROOF);
493pub(crate) const AURA_RUPTURE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::assassination_rogue::AURA_RUPTURE
494 .bind(wowlab_engine_combat::generated_identities::specs::assassination_rogue::PROOF);
495pub(crate) const AURA_INTERNAL_BLEEDING: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::assassination_rogue::AURA_INTERNAL_BLEEDING
496 .bind(wowlab_engine_combat::generated_identities::specs::assassination_rogue::PROOF);
497pub(crate) const AURA_IMPROVED_GARROTE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::assassination_rogue::AURA_IMPROVED_GARROTE
498 .bind(wowlab_engine_combat::generated_identities::specs::assassination_rogue::PROOF);
499pub(crate) const AURA_IMPROVED_GARROTE_WINDOW: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::assassination_rogue::AURA_IMPROVED_GARROTE_WINDOW
500 .bind(wowlab_engine_combat::generated_identities::specs::assassination_rogue::PROOF);
501pub(crate) const AURA_DEATHMARK: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::assassination_rogue::AURA_DEATHMARK
502 .bind(wowlab_engine_combat::generated_identities::specs::assassination_rogue::PROOF);
503pub(crate) const AURA_KINGSBANE: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::assassination_rogue::AURA_KINGSBANE
504 .bind(wowlab_engine_combat::generated_identities::specs::assassination_rogue::PROOF);
505pub(crate) const AURA_KINGSBANE_RAMP: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::assassination_rogue::AURA_KINGSBANE_RAMP
506 .bind(wowlab_engine_combat::generated_identities::specs::assassination_rogue::PROOF);
507pub(crate) const AURA_FINISH_THE_JOB: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::assassination_rogue::AURA_FINISH_THE_JOB
508 .bind(wowlab_engine_combat::generated_identities::specs::assassination_rogue::PROOF);
509pub(crate) const AURA_IMPLACABLE_TRACKER: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::assassination_rogue::AURA_IMPLACABLE_TRACKER
510 .bind(wowlab_engine_combat::generated_identities::specs::assassination_rogue::PROOF);
511pub(crate) const AURA_IMPLACABLE_REGEN: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::assassination_rogue::AURA_IMPLACABLE_REGEN
512 .bind(wowlab_engine_combat::generated_identities::specs::assassination_rogue::PROOF);
513pub(crate) const AURA_IMPLACABLE_BONUS: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::assassination_rogue::AURA_IMPLACABLE_BONUS
514 .bind(wowlab_engine_combat::generated_identities::specs::assassination_rogue::PROOF);
515pub(crate) const AURA_PVP_RULES_ENABLED_HARDCODED: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::assassination_rogue::AURA_PVP_RULES_ENABLED_HARDCODED
516 .bind(wowlab_engine_combat::generated_identities::specs::assassination_rogue::PROOF);
517pub(crate) const AURA_FATEBOUND_COIN_HEADS: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::assassination_rogue::AURA_FATEBOUND_COIN_HEADS
518 .bind(wowlab_engine_combat::generated_identities::specs::assassination_rogue::PROOF);
519pub(crate) const AURA_FATEBOUND_COIN_TAILS: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::assassination_rogue::AURA_FATEBOUND_COIN_TAILS
520 .bind(wowlab_engine_combat::generated_identities::specs::assassination_rogue::PROOF);
521pub(crate) const AURA_FATEBOUND_LUCKY_COIN: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::assassination_rogue::AURA_FATEBOUND_LUCKY_COIN
522 .bind(wowlab_engine_combat::generated_identities::specs::assassination_rogue::PROOF);
523pub(crate) const AURA_LUCKY_COIN_COUNTER: LocalAuraIdx = wowlab_engine_combat::generated_identities::specs::assassination_rogue::AURA_LUCKY_COIN_COUNTER
524 .bind(wowlab_engine_combat::generated_identities::specs::assassination_rogue::PROOF);
525pub(crate) const AURA_COUNT: usize = 38;
526const _: () = assert!(
527 AURA_COUNT == 38, "AURA index ABI: count changed -- update positional hook consumers"
528);
529pub(crate) const SPELL_MUTILATE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::assassination_rogue::SPELL_MUTILATE
530 .bind(wowlab_engine_combat::generated_identities::specs::assassination_rogue::PROOF);
531pub(crate) const SPELL_AMBUSH: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::assassination_rogue::SPELL_AMBUSH
532 .bind(wowlab_engine_combat::generated_identities::specs::assassination_rogue::PROOF);
533pub(crate) const SPELL_ENVENOM: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::assassination_rogue::SPELL_ENVENOM
534 .bind(wowlab_engine_combat::generated_identities::specs::assassination_rogue::PROOF);
535pub(crate) const SPELL_SLICE_AND_DICE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::assassination_rogue::SPELL_SLICE_AND_DICE
536 .bind(wowlab_engine_combat::generated_identities::specs::assassination_rogue::PROOF);
537pub(crate) const SPELL_FAN_OF_KNIVES: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::assassination_rogue::SPELL_FAN_OF_KNIVES
538 .bind(wowlab_engine_combat::generated_identities::specs::assassination_rogue::PROOF);
539pub(crate) const SPELL_CRIMSON_TEMPEST: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::assassination_rogue::SPELL_CRIMSON_TEMPEST
540 .bind(wowlab_engine_combat::generated_identities::specs::assassination_rogue::PROOF);
541pub(crate) const SPELL_POISONED_KNIFE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::assassination_rogue::SPELL_POISONED_KNIFE
542 .bind(wowlab_engine_combat::generated_identities::specs::assassination_rogue::PROOF);
543pub(crate) const SPELL_DEADLY_POISON: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::assassination_rogue::SPELL_DEADLY_POISON
544 .bind(wowlab_engine_combat::generated_identities::specs::assassination_rogue::PROOF);
545pub(crate) const SPELL_AMPLIFYING_POISON: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::assassination_rogue::SPELL_AMPLIFYING_POISON
546 .bind(wowlab_engine_combat::generated_identities::specs::assassination_rogue::PROOF);
547pub(crate) const SPELL_INSTANT_POISON: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::assassination_rogue::SPELL_INSTANT_POISON
548 .bind(wowlab_engine_combat::generated_identities::specs::assassination_rogue::PROOF);
549pub(crate) const SPELL_WOUND_POISON: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::assassination_rogue::SPELL_WOUND_POISON
550 .bind(wowlab_engine_combat::generated_identities::specs::assassination_rogue::PROOF);
551pub(crate) const SPELL_ATROPHIC_POISON: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::assassination_rogue::SPELL_ATROPHIC_POISON
552 .bind(wowlab_engine_combat::generated_identities::specs::assassination_rogue::PROOF);
553pub(crate) const SPELL_NUMBING_POISON: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::assassination_rogue::SPELL_NUMBING_POISON
554 .bind(wowlab_engine_combat::generated_identities::specs::assassination_rogue::PROOF);
555pub(crate) const SPELL_CRIPPLING_POISON: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::assassination_rogue::SPELL_CRIPPLING_POISON
556 .bind(wowlab_engine_combat::generated_identities::specs::assassination_rogue::PROOF);
557pub(crate) const SPELL_MUTILATE_MH: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::assassination_rogue::SPELL_MUTILATE_MH
558 .bind(wowlab_engine_combat::generated_identities::specs::assassination_rogue::PROOF);
559pub(crate) const SPELL_MUTILATE_OH: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::assassination_rogue::SPELL_MUTILATE_OH
560 .bind(wowlab_engine_combat::generated_identities::specs::assassination_rogue::PROOF);
561pub(crate) const SPELL_DEADLY_POISON_INSTANT: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::assassination_rogue::SPELL_DEADLY_POISON_INSTANT
562 .bind(wowlab_engine_combat::generated_identities::specs::assassination_rogue::PROOF);
563pub(crate) const SPELL_MUTILATED_FLESH: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::assassination_rogue::SPELL_MUTILATED_FLESH
564 .bind(wowlab_engine_combat::generated_identities::specs::assassination_rogue::PROOF);
565pub(crate) const SPELL_GARROTE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::assassination_rogue::SPELL_GARROTE
566 .bind(wowlab_engine_combat::generated_identities::specs::assassination_rogue::PROOF);
567pub(crate) const SPELL_RUPTURE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::assassination_rogue::SPELL_RUPTURE
568 .bind(wowlab_engine_combat::generated_identities::specs::assassination_rogue::PROOF);
569pub(crate) const SPELL_INTERNAL_BLEEDING_DRIVER: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::assassination_rogue::SPELL_INTERNAL_BLEEDING_DRIVER
570 .bind(wowlab_engine_combat::generated_identities::specs::assassination_rogue::PROOF);
571pub(crate) const SPELL_DEATHMARK: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::assassination_rogue::SPELL_DEATHMARK
572 .bind(wowlab_engine_combat::generated_identities::specs::assassination_rogue::PROOF);
573pub(crate) const SPELL_KINGSBANE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::assassination_rogue::SPELL_KINGSBANE
574 .bind(wowlab_engine_combat::generated_identities::specs::assassination_rogue::PROOF);
575pub(crate) const SPELL_IMPLACABLE_STRIKES_NATURE: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::assassination_rogue::SPELL_IMPLACABLE_STRIKES_NATURE
576 .bind(wowlab_engine_combat::generated_identities::specs::assassination_rogue::PROOF);
577pub(crate) const SPELL_IMPLACABLE_STRIKES_PHYSICAL: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::assassination_rogue::SPELL_IMPLACABLE_STRIKES_PHYSICAL
578 .bind(wowlab_engine_combat::generated_identities::specs::assassination_rogue::PROOF);
579pub(crate) const SPELL_THISTLE_TEA: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::assassination_rogue::SPELL_THISTLE_TEA
580 .bind(wowlab_engine_combat::generated_identities::specs::assassination_rogue::PROOF);
581pub(crate) const SPELL_VANISH: LocalSpellIdx = wowlab_engine_combat::generated_identities::specs::assassination_rogue::SPELL_VANISH
582 .bind(wowlab_engine_combat::generated_identities::specs::assassination_rogue::PROOF);
583pub(crate) const SPELL_COUNT: usize = 27;
584const _: () = assert!(
585 SPELL_COUNT == 27,
586 "SPELL index ABI: count changed -- update positional hook consumers"
587);
588pub(crate) mod EFFECT {
589 pub(crate) const ALACRITY_CHANCE_PER_CP: (u32, u8) = (193_539, 2);
591 pub(crate) const AMBUSH_DMG: (u32, u8) = (8676, 1);
593 pub(crate) const AMPLIFYING_CONSUME_STACKS: (u32, u8) = (381_664, 2);
595 pub(crate) const AMPLIFYING_ENVENOM_BONUS: (u32, u8) = (381_664, 1);
597 pub(crate) const DEATHMARK_ENERGY: (u32, u8) = (360_194, 3);
599 pub(crate) const DEATHMARK_PERIOD: (u32, u8) = (360_194, 1);
601 pub(crate) const AMPLIFYING_POISON_DMG: (u32, u8) = (383_414, 1);
603 pub(crate) const BLINDSIDE_CHANCE: (u32, u8) = (328_085, 1);
605 pub(crate) const BLINDSIDE_EXECUTE_CHANCE: (u32, u8) = (328_085, 2);
607 pub(crate) const BLINDSIDE_EXECUTE_THRESHOLD: (u32, u8) = (328_085, 3);
609 pub(crate) const COIN_HEADS_INITIAL: (u32, u8) = (452_923, 4);
611 pub(crate) const COIN_HEADS_PER_STACK: (u32, u8) = (452_923, 1);
613 pub(crate) const COIN_HEADS_PER_STACK_PERIODIC: (u32, u8) = (452_923, 2);
615 pub(crate) const CONTROLLED_CHAOS_STREAK: (u32, u8) = (1_276_816, 1);
617 pub(crate) const DASHING_SCOUNDREL_ENERGY: (u32, u8) = (381_797, 2);
619 pub(crate) const DEADLY_POISON_INSTANT_DMG: (u32, u8) = (113_780, 1);
621 pub(crate) const DEAL_FATE_CP: (u32, u8) = (454_419, 1);
623 pub(crate) const DELIVERED_DOOM_CP: (u32, u8) = (1_249_194, 2);
625 pub(crate) const DELIVERED_DOOM_DMG: (u32, u8) = (1_249_194, 1);
627 pub(crate) const DOOMBLADE_PCT: (u32, u8) = (381_673, 1);
629 pub(crate) const ENVENOM_DMG: (u32, u8) = (32645, 1);
631 pub(crate) const ENVENOM_POISON_BONUS: (u32, u8) = (32645, 2);
633 pub(crate) const FATEBOUND_COIN_TAILS_DMG: (u32, u8) = (452_538, 1);
635 pub(crate) const HAND_OF_FATE_CP: (u32, u8) = (452_536, 1);
637 pub(crate) const IMPLACABLE_STRIKE_CP: (u32, u8) = (1_265_795, 2);
639 pub(crate) const IMPLACABLE_STRIKE_NATURE_DMG: (u32, u8) = (1_265_794, 1);
641 pub(crate) const IMPLACABLE_STRIKE_PHYSICAL_DMG: (u32, u8) = (1_265_795, 1);
643 pub(crate) const IMPROVED_GARROTE_DAMAGE: (u32, u8) = (392_401, 2);
645 pub(crate) const INSPIRING_STRIKE_DAMAGE: (u32, u8) = (1_250_036, 1);
647 pub(crate) const LETHAL_DOSE_PER_EFFECT: (u32, u8) = (381_640, 1);
649 pub(crate) const LUCKY_COIN_FLIPS: (u32, u8) = (1_248_970, 1);
651 pub(crate) const LUCKY_COIN_ODDS: (u32, u8) = (1_248_971, 5);
653 pub(crate) const MEAN_STREAK_ODDS: (u32, u8) = (453_428, 1);
655 pub(crate) const MID2_ASSASSINATION_2PC_ENVENOM: (u32, u8) = (1_296_590, 1);
657 pub(crate) const MID2_ASSASSINATION_2PC_DAMAGE: (u32, u8) = (1_296_590, 2);
659 pub(crate) const MID2_ASSASSINATION_4PC_BLEED: (u32, u8) = (1_296_591, 1);
661 pub(crate) const MID2_ASSASSINATION_4PC_AUTO_ATTACK: (u32, u8) = (1_296_591, 2);
663 pub(crate) const WOUND_POISON_DAMAGE: (u32, u8) = (8680, 1);
665 pub(crate) const MUTILATE_MH_DMG: (u32, u8) = (5374, 2);
667 pub(crate) const MUTILATE_OH_DMG: (u32, u8) = (27576, 2);
669 pub(crate) const OVERFLOWING_PURSE_CHANCE: (u32, u8) = (1_249_190, 3);
671 pub(crate) const OVERFLOWING_PURSE_COINS: (u32, u8) = (1_249_190, 1);
673 pub(crate) const POTENT_ASSASSIN_DIRECT: (u32, u8) = (76803, 1);
675 pub(crate) const POTENT_ASSASSIN_DIRECT_LABEL: (u32, u8) = (76803, 3);
677 pub(crate) const POTENT_ASSASSIN_PERIODIC: (u32, u8) = (76803, 2);
679 pub(crate) const POTENT_ASSASSIN_SECONDARY_DIRECT_LABEL: (u32, u8) = (76803, 4);
681 pub(crate) const RAPID_INJECTION_PCT: (u32, u8) = (455_072, 1);
683 pub(crate) const RAVENHOLDT_MINT_HEADS: (u32, u8) = (1_276_809, 1);
685 pub(crate) const REGICIDES_REWARD_DIVISOR: (u32, u8) = (1_250_325, 1);
687 pub(crate) const RUSH_ENERGY: (u32, u8) = (1_249_204, 1);
689 pub(crate) const RUSH_ENERGY_EDGE: (u32, u8) = (1_249_204, 3);
691 pub(crate) const SEAL_FATE_CHANCE: (u32, u8) = (14190, 1);
693 pub(crate) const SEAL_FATE_CP: (u32, u8) = (14189, 1);
695 pub(crate) const SYSTEMIC_FAILURE_PCT: (u32, u8) = (381_652, 1);
697 pub(crate) const ZOLDYCK_DAMAGE: (u32, u8) = (381_798, 1);
699 pub(crate) const ZOLDYCK_THRESHOLD: (u32, u8) = (381_798, 2);
701}
702static REPORTED_SPELLS: &[(&str, u32)] = &[
703 ("amplifying_poison", 383_414),
704 ("deadly_poison_dot", 2818),
705 ("wound_poison_damage", 8680),
706];
707static DECLARED_SPELL_IDS: &[u32] = &[
708 1329, 8676, 32645, 315_496, 51723, 1_247_227, 185_565, 2823, 381_664, 315_584, 8679,
709 381_637, 5761, 3408, 5374, 27576, 113_780, 394_021, 703, 1943, 381_628, 360_194,
710 385_627, 1_265_794, 1_265_795, 381_623, 1856, 1784, 2818, 383_414, 121_153, 193_538,
711 457_280, 193_531, 457_512, 381_801, 1_250_036, 1_250_331, 381_632, 392_401, 394_095,
712 1_249_810, 1_265_386, 1_265_387, 1_265_385, 134_735, 452_923, 452_917, 1_248_971,
713 1_249_093, 193_539, 328_085, 381_797, 381_673, 1_249_809, 381_624, 381_627, 382_238,
714 381_640, 455_072, 1_250_325, 14190, 381_652, 469_779, 79134, 381_798, 6603, 8680,
715 14189, 76803, 452_536, 452_538, 453_428, 454_419, 1_248_970, 1_249_190, 1_249_194,
716 1_249_204, 1_276_809, 1_276_816, 1_296_590, 1_296_591, 453_457,
717];
718static DECLARED_AURA_IDS: &[u32] = &[
719 1784, 1856, 2823, 381_664, 315_584, 8679, 381_637, 5761, 3408, 2818, 383_414, 32645,
720 315_496, 121_153, 193_538, 457_280, 193_531, 457_512, 381_801, 1_250_036, 1_250_331,
721 703, 1943, 381_628, 381_632, 392_401, 360_194, 385_627, 394_095, 1_249_810,
722 1_265_386, 1_265_387, 1_265_385, 134_735, 452_923, 452_917, 1_248_971, 1_249_093,
723 452_923, 452_917, 1_248_971,
724];
725static TALENTS: &[(&str, u32)] = &[
726 ("ALACRITY", TALENT::ALACRITY),
727 ("AMPLIFYING_POISON", TALENT::AMPLIFYING_POISON),
728 ("BLINDSIDE", TALENT::BLINDSIDE),
729 ("CRIMSON_TEMPEST", TALENT::CRIMSON_TEMPEST),
730 ("DASHING_SCOUNDREL", TALENT::DASHING_SCOUNDREL),
731 ("DEADLY_POISON", TALENT::DEADLY_POISON),
732 ("DEATHMARK", TALENT::DEATHMARK),
733 ("DEEPER_STRATAGEM", TALENT::DEEPER_STRATAGEM),
734 ("DOOMBLADE", TALENT::DOOMBLADE),
735 ("DRAGON_TEMPERED_BLADES", TALENT::DRAGON_TEMPERED_BLADES),
736 ("FINISH_THE_JOB", TALENT::FINISH_THE_JOB),
737 ("IMPLACABLE_1", TALENT::IMPLACABLE_1),
738 ("IMPLACABLE_2", TALENT::IMPLACABLE_2),
739 ("IMPLACABLE_3", TALENT::IMPLACABLE_3),
740 ("IMPROVED_GARROTE", TALENT::IMPROVED_GARROTE),
741 ("IMPROVED_POISONS", TALENT::IMPROVED_POISONS),
742 ("INSPIRING_STRIKE", TALENT::INSPIRING_STRIKE),
743 ("INTERNAL_BLEEDING", TALENT::INTERNAL_BLEEDING),
744 ("KINGSBANE", TALENT::KINGSBANE),
745 ("LETHALITY", TALENT::LETHALITY),
746 ("LETHAL_DOSE", TALENT::LETHAL_DOSE),
747 ("RAPID_INJECTION", TALENT::RAPID_INJECTION),
748 ("REGICIDES_REWARD", TALENT::REGICIDES_REWARD),
749 ("SANGUINE_STRATAGEM", TALENT::SANGUINE_STRATAGEM),
750 ("SEAL_FATE", TALENT::SEAL_FATE),
751 ("SYSTEMIC_FAILURE", TALENT::SYSTEMIC_FAILURE),
752 ("THISTLE_TEA", TALENT::THISTLE_TEA),
753 ("VENOMOUS_WOUNDS", TALENT::VENOMOUS_WOUNDS),
754 ("ZOLDYCK_RECIPE", TALENT::ZOLDYCK_RECIPE),
755];
756pub(crate) mod ASSASSINATION_ROGUE {
757 pub(crate) const MUTILATE_CASTS: u32 = 0;
758 pub(crate) const AMBUSH_CASTS: u32 = 1;
759 pub(crate) const GARROTE_CASTS: u32 = 2;
760 pub(crate) const RUPTURE_CASTS: u32 = 3;
761 pub(crate) const ENVENOM_CASTS: u32 = 4;
762 pub(crate) const DEATHMARK_CASTS: u32 = 5;
763 pub(crate) const KINGSBANE_CASTS: u32 = 6;
764 pub(crate) const FAN_OF_KNIVES_CASTS: u32 = 7;
765 pub(crate) const GARROTE_UPTIME_MS: u32 = 8;
766 pub(crate) const RUPTURE_UPTIME_MS: u32 = 9;
767 pub(crate) const ENVENOM_UPTIME_MS: u32 = 10;
768 pub(crate) const DEATHMARK_UPTIME_MS: u32 = 11;
769}
770fn aura_stealth(
771 a: AuraDefinitionDraft,
772 data: &ResolvedGameData,
773) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
774 Ok(
775 a
776 .on_player()
777 .apply_base_from_data(data, 1784)?
778 .max_stacks(
779 data
780 .require_aura_max_stacks(
781 wowlab_types::sim::SpellIdx::from_raw(1784),
782 )?,
783 ),
784 )
785}
786fn aura_vanish(
787 a: AuraDefinitionDraft,
788 data: &ResolvedGameData,
789) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
790 Ok(
791 a
792 .on_player()
793 .apply_base_from_data(data, 1856)?
794 .max_stacks(
795 data
796 .require_aura_max_stacks(
797 wowlab_types::sim::SpellIdx::from_raw(1856),
798 )?,
799 ),
800 )
801}
802fn aura_deadly_poison(
803 a: AuraDefinitionDraft,
804 data: &ResolvedGameData,
805) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
806 Ok(
807 a
808 .on_player()
809 .apply_base_from_data(data, 2823)?
810 .max_stacks(
811 data
812 .require_aura_max_stacks(
813 wowlab_types::sim::SpellIdx::from_raw(2823),
814 )?,
815 ),
816 )
817}
818fn aura_amplifying_poison(
819 a: AuraDefinitionDraft,
820 data: &ResolvedGameData,
821) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
822 Ok(
823 a
824 .on_player()
825 .apply_base_from_data(data, 381_664)?
826 .max_stacks(
827 data
828 .require_aura_max_stacks(
829 wowlab_types::sim::SpellIdx::from_raw(381_664),
830 )?,
831 ),
832 )
833}
834fn aura_instant_poison(
835 a: AuraDefinitionDraft,
836 data: &ResolvedGameData,
837) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
838 Ok(
839 a
840 .on_player()
841 .apply_base_from_data(data, 315_584)?
842 .max_stacks(
843 data
844 .require_aura_max_stacks(
845 wowlab_types::sim::SpellIdx::from_raw(315_584),
846 )?,
847 ),
848 )
849}
850fn aura_wound_poison(
851 a: AuraDefinitionDraft,
852 data: &ResolvedGameData,
853) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
854 Ok(
855 a
856 .on_player()
857 .apply_base_from_data(data, 8679)?
858 .max_stacks(
859 data
860 .require_aura_max_stacks(
861 wowlab_types::sim::SpellIdx::from_raw(8679),
862 )?,
863 ),
864 )
865}
866fn aura_atrophic_poison(
867 a: AuraDefinitionDraft,
868 data: &ResolvedGameData,
869) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
870 Ok(
871 a
872 .on_player()
873 .apply_base_from_data(data, 381_637)?
874 .max_stacks(
875 data
876 .require_aura_max_stacks(
877 wowlab_types::sim::SpellIdx::from_raw(381_637),
878 )?,
879 )
880 .spell_group(0, wowlab_types::combat::SpellGroupRule::Exclusive),
881 )
882}
883fn aura_numbing_poison(
884 a: AuraDefinitionDraft,
885 data: &ResolvedGameData,
886) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
887 Ok(
888 a
889 .on_player()
890 .apply_base_from_data(data, 5761)?
891 .max_stacks(
892 data
893 .require_aura_max_stacks(
894 wowlab_types::sim::SpellIdx::from_raw(5761),
895 )?,
896 )
897 .spell_group(0, wowlab_types::combat::SpellGroupRule::Exclusive),
898 )
899}
900fn aura_crippling_poison(
901 a: AuraDefinitionDraft,
902 data: &ResolvedGameData,
903) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
904 Ok(
905 a
906 .on_player()
907 .apply_base_from_data(data, 3408)?
908 .max_stacks(
909 data
910 .require_aura_max_stacks(
911 wowlab_types::sim::SpellIdx::from_raw(3408),
912 )?,
913 ),
914 )
915}
916fn aura_deadly_poison_dot(
917 a: AuraDefinitionDraft,
918 data: &ResolvedGameData,
919) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
920 Ok(
921 a
922 .on_target()
923 .apply_base_from_data(data, 2818)?
924 .max_stacks(
925 data
926 .require_aura_max_stacks(
927 wowlab_types::sim::SpellIdx::from_raw(2818),
928 )?,
929 ),
930 )
931}
932fn aura_amplifying_poison_debuff(
933 a: AuraDefinitionDraft,
934 data: &ResolvedGameData,
935) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
936 Ok(
937 a
938 .on_target()
939 .apply_base_from_data(data, 383_414)?
940 .max_stacks(
941 data
942 .require_aura_max_stacks(
943 wowlab_types::sim::SpellIdx::from_raw(383_414),
944 )?,
945 ),
946 )
947}
948fn aura_envenom(
949 a: AuraDefinitionDraft,
950 data: &ResolvedGameData,
951) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
952 Ok(
953 a
954 .on_player()
955 .duration_ms(
956 wowlab_engine_combat::validated_milliseconds(
957 1000.0,
958 32645,
959 "aura.duration_ms",
960 )?,
961 )
962 .apply_periodic_effect_from_data(data, 32645)?
963 .max_stacks(
964 data
965 .require_aura_max_stacks(
966 wowlab_types::sim::SpellIdx::from_raw(32645),
967 )?,
968 )
969 .no_pandemic()
970 .on_expire(crate::hooks::assassination_rogue::envenom_expire_hook),
971 )
972}
973fn aura_slice_and_dice(
974 a: AuraDefinitionDraft,
975 data: &ResolvedGameData,
976) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
977 Ok(
978 a
979 .on_player()
980 .apply_base_from_data(data, 315_496)?
981 .max_stacks(
982 data
983 .require_aura_max_stacks(
984 wowlab_types::sim::SpellIdx::from_raw(315_496),
985 )?,
986 ),
987 )
988}
989fn aura_blindside(
990 a: AuraDefinitionDraft,
991 data: &ResolvedGameData,
992) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
993 Ok(
994 a
995 .on_player()
996 .apply_base_from_data(data, 121_153)?
997 .max_stacks(
998 data
999 .require_aura_max_stacks(
1000 wowlab_types::sim::SpellIdx::from_raw(121_153),
1001 )?,
1002 ),
1003 )
1004}
1005fn aura_alacrity(
1006 a: AuraDefinitionDraft,
1007 data: &ResolvedGameData,
1008) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1009 a.on_player()
1010 .apply_base_from_data(data, 193_538)?
1011 .max_stacks(
1012 data.require_aura_max_stacks(wowlab_types::sim::SpellIdx::from_raw(193_538))?,
1013 )
1014 .haste_per_stack(
1015 data.base_points(wowlab_types::sim::SpellIdx::from_raw(193_538), 1),
1016 )
1017}
1018fn aura_darkest_night(
1019 a: AuraDefinitionDraft,
1020 data: &ResolvedGameData,
1021) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1022 Ok(
1023 a
1024 .on_player()
1025 .apply_base_from_data(data, 457_280)?
1026 .max_stacks(
1027 data
1028 .require_aura_max_stacks(
1029 wowlab_types::sim::SpellIdx::from_raw(457_280),
1030 )?,
1031 ),
1032 )
1033}
1034fn aura_deeper_stratagem(
1035 a: AuraDefinitionDraft,
1036 data: &ResolvedGameData,
1037) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1038 Ok(
1039 a
1040 .on_player()
1041 .apply_base_from_data(data, 193_531)?
1042 .max_stacks(
1043 data
1044 .require_aura_max_stacks(
1045 wowlab_types::sim::SpellIdx::from_raw(193_531),
1046 )?,
1047 ),
1048 )
1049}
1050fn aura_sanguine_stratagem(
1051 a: AuraDefinitionDraft,
1052 data: &ResolvedGameData,
1053) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1054 Ok(
1055 a
1056 .on_player()
1057 .apply_base_from_data(data, 457_512)?
1058 .max_stacks(
1059 data
1060 .require_aura_max_stacks(
1061 wowlab_types::sim::SpellIdx::from_raw(457_512),
1062 )?,
1063 ),
1064 )
1065}
1066fn aura_dragon_tempered_blades(
1067 a: AuraDefinitionDraft,
1068 data: &ResolvedGameData,
1069) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1070 Ok(
1071 a
1072 .on_player()
1073 .apply_base_from_data(data, 381_801)?
1074 .max_stacks(
1075 data
1076 .require_aura_max_stacks(
1077 wowlab_types::sim::SpellIdx::from_raw(381_801),
1078 )?,
1079 ),
1080 )
1081}
1082fn aura_inspiring_strike(
1083 a: AuraDefinitionDraft,
1084 data: &ResolvedGameData,
1085) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1086 a.on_player()
1087 .duration_ms(
1088 wowlab_engine_combat::validated_milliseconds(
1089 1000.0,
1090 1_250_036,
1091 "aura.duration_ms",
1092 )?,
1093 )
1094 .apply_periodic_effect_from_data(data, 1_250_036)?
1095 .max_stacks(
1096 data
1097 .require_aura_max_stacks(
1098 wowlab_types::sim::SpellIdx::from_raw(1_250_036),
1099 )?,
1100 )
1101 .damage_multiplier(
1102 ((data.base_points(wowlab_types::sim::SpellIdx::from_raw(1_250_036), 1))
1103 * 0.01) + 1.0,
1104 )
1105}
1106fn aura_regicides_reward(
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, 1_250_331)?
1114 .max_stacks(
1115 wowlab_engine_combat::validated_max_stacks(
1116 10.0,
1117 1_250_331,
1118 "aura.max_stacks",
1119 )?,
1120 )
1121 .periodic_remove_stack(
1122 wowlab_engine_combat::validated_milliseconds(
1123 data.period(wowlab_types::sim::SpellIdx::from_raw(1_250_331), 2),
1124 1_250_331,
1125 "periodic_remove_stack.tick_ms",
1126 )?,
1127 ),
1128 )
1129}
1130fn aura_garrote(
1131 a: AuraDefinitionDraft,
1132 data: &ResolvedGameData,
1133) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1134 Ok(
1135 a
1136 .on_target()
1137 .apply_base_from_data(data, 703)?
1138 .max_stacks(
1139 data.require_aura_max_stacks(wowlab_types::sim::SpellIdx::from_raw(703))?,
1140 ),
1141 )
1142}
1143fn aura_rupture(
1144 a: AuraDefinitionDraft,
1145 data: &ResolvedGameData,
1146) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1147 Ok(
1148 a
1149 .on_target()
1150 .apply_base_from_data(data, 1943)?
1151 .max_stacks(
1152 data
1153 .require_aura_max_stacks(
1154 wowlab_types::sim::SpellIdx::from_raw(1943),
1155 )?,
1156 ),
1157 )
1158}
1159fn aura_internal_bleeding(
1160 a: AuraDefinitionDraft,
1161 data: &ResolvedGameData,
1162) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1163 Ok(
1164 a
1165 .on_target()
1166 .apply_base_from_data(data, 381_628)?
1167 .max_stacks(
1168 data
1169 .require_aura_max_stacks(
1170 wowlab_types::sim::SpellIdx::from_raw(381_628),
1171 )?,
1172 ),
1173 )
1174}
1175fn aura_improved_garrote(
1176 a: AuraDefinitionDraft,
1177 data: &ResolvedGameData,
1178) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1179 Ok(
1180 a
1181 .on_player()
1182 .apply_base_from_data(data, 381_632)?
1183 .max_stacks(
1184 data
1185 .require_aura_max_stacks(
1186 wowlab_types::sim::SpellIdx::from_raw(381_632),
1187 )?,
1188 ),
1189 )
1190}
1191fn aura_improved_garrote_window(
1192 a: AuraDefinitionDraft,
1193 data: &ResolvedGameData,
1194) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1195 Ok(
1196 a
1197 .on_player()
1198 .apply_base_from_data(data, 392_401)?
1199 .max_stacks(
1200 data
1201 .require_aura_max_stacks(
1202 wowlab_types::sim::SpellIdx::from_raw(392_401),
1203 )?,
1204 ),
1205 )
1206}
1207fn aura_deathmark(
1208 a: AuraDefinitionDraft,
1209 data: &ResolvedGameData,
1210) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1211 Ok(
1212 a
1213 .on_target()
1214 .apply_base_from_data(data, 360_194)?
1215 .max_stacks(
1216 data
1217 .require_aura_max_stacks(
1218 wowlab_types::sim::SpellIdx::from_raw(360_194),
1219 )?,
1220 ),
1221 )
1222}
1223fn aura_kingsbane(
1224 a: AuraDefinitionDraft,
1225 data: &ResolvedGameData,
1226) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1227 Ok(
1228 a
1229 .on_target()
1230 .apply_base_from_data(data, 385_627)?
1231 .max_stacks(
1232 data
1233 .require_aura_max_stacks(
1234 wowlab_types::sim::SpellIdx::from_raw(385_627),
1235 )?,
1236 )
1237 .on_expire(crate::hooks::assassination_rogue::kingsbane_expire_hook),
1238 )
1239}
1240fn aura_kingsbane_ramp(
1241 a: AuraDefinitionDraft,
1242 data: &ResolvedGameData,
1243) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1244 a.on_player()
1245 .duration_ms(
1246 wowlab_engine_combat::validated_milliseconds(
1247 0.0,
1248 394_095,
1249 "aura.duration_ms",
1250 )?,
1251 )
1252 .apply_periodic_effect_from_data(data, 394_095)?
1253 .max_stacks(
1254 data.require_aura_max_stacks(wowlab_types::sim::SpellIdx::from_raw(394_095))?,
1255 )
1256 .damage_percent_spells_linear(
1257 data.base_points(wowlab_types::sim::SpellIdx::from_raw(394_095), 1),
1258 &[385_627],
1259 )
1260}
1261fn aura_finish_the_job(
1262 a: AuraDefinitionDraft,
1263 data: &ResolvedGameData,
1264) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1265 Ok(
1266 a
1267 .on_player()
1268 .apply_base_from_data(data, 1_249_810)?
1269 .max_stacks(
1270 data
1271 .require_aura_max_stacks(
1272 wowlab_types::sim::SpellIdx::from_raw(1_249_810),
1273 )?,
1274 ),
1275 )
1276}
1277fn aura_implacable_tracker(
1278 a: AuraDefinitionDraft,
1279 data: &ResolvedGameData,
1280) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1281 Ok(
1282 a
1283 .on_player()
1284 .duration_ms(
1285 wowlab_engine_combat::validated_milliseconds(
1286 15000.0,
1287 1_265_386,
1288 "aura.duration_ms",
1289 )?,
1290 )
1291 .apply_periodic_effect_from_data(data, 1_265_386)?
1292 .max_stacks(
1293 wowlab_engine_combat::validated_max_stacks(
1294 100.0,
1295 1_265_386,
1296 "aura.max_stacks",
1297 )?,
1298 ),
1299 )
1300}
1301fn aura_implacable_regen(
1302 a: AuraDefinitionDraft,
1303 data: &ResolvedGameData,
1304) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1305 a.on_player()
1306 .duration_ms(
1307 wowlab_engine_combat::validated_milliseconds(
1308 5000.0,
1309 1_265_387,
1310 "aura.duration_ms",
1311 )?,
1312 )
1313 .apply_periodic_effect_from_data(data, 1_265_387)?
1314 .max_stacks(
1315 data
1316 .require_aura_max_stacks(
1317 wowlab_types::sim::SpellIdx::from_raw(1_265_387),
1318 )?,
1319 )
1320 .regen_percent_per_stack(
1321 data.base_points(wowlab_types::sim::SpellIdx::from_raw(1_265_385), 1),
1322 )
1323}
1324fn aura_implacable_bonus(
1325 a: AuraDefinitionDraft,
1326 data: &ResolvedGameData,
1327) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1328 a.on_player()
1329 .duration_ms(
1330 wowlab_engine_combat::validated_milliseconds(
1331 5000.0,
1332 1_265_385,
1333 "aura.duration_ms",
1334 )?,
1335 )
1336 .apply_periodic_effect_from_data(data, 1_265_385)?
1337 .max_stacks(
1338 wowlab_engine_combat::validated_max_stacks(
1339 4.0,
1340 1_265_385,
1341 "aura.max_stacks",
1342 )?,
1343 )
1344 .regen_percent_per_stack(
1345 data.base_points(wowlab_types::sim::SpellIdx::from_raw(1_265_385), 2),
1346 )
1347}
1348fn aura_pvp_rules_enabled_hardcoded(
1349 a: AuraDefinitionDraft,
1350 data: &ResolvedGameData,
1351) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1352 Ok(
1353 a
1354 .on_player()
1355 .apply_base_from_data(data, 134_735)?
1356 .max_stacks(
1357 data
1358 .require_aura_max_stacks(
1359 wowlab_types::sim::SpellIdx::from_raw(134_735),
1360 )?,
1361 ),
1362 )
1363}
1364fn aura_fatebound_coin_heads(
1365 a: AuraDefinitionDraft,
1366 data: &ResolvedGameData,
1367) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1368 Ok(
1369 a
1370 .on_player()
1371 .apply_base_from_data(data, 452_923)?
1372 .max_stacks(
1373 data
1374 .require_aura_max_stacks(
1375 wowlab_types::sim::SpellIdx::from_raw(452_923),
1376 )?,
1377 ),
1378 )
1379}
1380fn aura_fatebound_coin_tails(
1381 a: AuraDefinitionDraft,
1382 data: &ResolvedGameData,
1383) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1384 Ok(
1385 a
1386 .on_player()
1387 .apply_base_from_data(data, 452_917)?
1388 .max_stacks(
1389 data
1390 .require_aura_max_stacks(
1391 wowlab_types::sim::SpellIdx::from_raw(452_917),
1392 )?,
1393 ),
1394 )
1395}
1396fn aura_fatebound_lucky_coin(
1397 a: AuraDefinitionDraft,
1398 data: &ResolvedGameData,
1399) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1400 a.on_player()
1401 .apply_base_from_data(data, 1_248_971)?
1402 .max_stacks(
1403 data
1404 .require_aura_max_stacks(
1405 wowlab_types::sim::SpellIdx::from_raw(1_248_971),
1406 )?,
1407 )
1408 .primary_pct_per_stack(
1409 data.base_points(wowlab_types::sim::SpellIdx::from_raw(1_248_971), 1),
1410 )
1411}
1412fn aura_lucky_coin_counter(
1413 a: AuraDefinitionDraft,
1414 data: &ResolvedGameData,
1415) -> Result<AuraDefinitionDraft, wowlab_engine_combat::BuilderError> {
1416 Ok(
1417 a
1418 .on_player()
1419 .apply_base_from_data(data, 1_249_093)?
1420 .max_stacks(
1421 data
1422 .require_aura_max_stacks(
1423 wowlab_types::sim::SpellIdx::from_raw(1_249_093),
1424 )?,
1425 ),
1426 )
1427}
1428fn spell_mutilate(
1429 s: SpellDefinitionDraft,
1430 data: &ResolvedGameData,
1431) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1432 Ok(
1433 s
1434 .apply_base_from_data(data, 1329)?
1435 .without_primary_data_damage()
1436 .trigger_program_predicate(
1437 3,
1438 crate::hooks::assassination_rogue::hook_owned_damage_trigger_disabled,
1439 )
1440 .trigger_program_predicate(
1441 4,
1442 crate::hooks::assassination_rogue::hook_owned_damage_trigger_disabled,
1443 )
1444 .apply_aoe_from_data(data)
1445 .on_cast(crate::hooks::assassination_rogue::mutilate_hook),
1446 )
1447}
1448fn spell_ambush(
1449 s: SpellDefinitionDraft,
1450 data: &ResolvedGameData,
1451) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1452 Ok(
1453 s
1454 .apply_base_from_data(data, 8676)?
1455 .apply_aoe_from_data(data)
1456 .on_cast(crate::hooks::assassination_rogue::ambush_hook)
1457 .cost_free_when_aura(121_153),
1458 )
1459}
1460fn spell_envenom(
1461 s: SpellDefinitionDraft,
1462 data: &ResolvedGameData,
1463) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1464 Ok(
1465 s
1466 .apply_base_from_data(data, 32645)?
1467 .applies_inferred_aura(AURA_ENVENOM, 32645)
1468 .apply_aoe_from_data(data)
1469 .on_cast(crate::hooks::assassination_rogue::envenom_hook),
1470 )
1471}
1472fn spell_slice_and_dice(
1473 s: SpellDefinitionDraft,
1474 data: &ResolvedGameData,
1475) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1476 Ok(
1477 s
1478 .apply_base_from_data(data, 315_496)?
1479 .applies_inferred_aura(AURA_SLICE_AND_DICE, 315_496)
1480 .apply_aoe_from_data(data),
1481 )
1482}
1483fn spell_fan_of_knives(
1484 s: SpellDefinitionDraft,
1485 data: &ResolvedGameData,
1486) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1487 Ok(s.apply_base_from_data(data, 51723)?.apply_aoe_from_data(data))
1488}
1489fn spell_crimson_tempest(
1490 s: SpellDefinitionDraft,
1491 data: &ResolvedGameData,
1492) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1493 Ok(s.apply_base_from_data(data, 1_247_227)?.apply_aoe_from_data(data))
1494}
1495fn spell_poisoned_knife(
1496 s: SpellDefinitionDraft,
1497 data: &ResolvedGameData,
1498) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1499 Ok(s.apply_base_from_data(data, 185_565)?.apply_aoe_from_data(data))
1500}
1501fn spell_deadly_poison(
1502 s: SpellDefinitionDraft,
1503 data: &ResolvedGameData,
1504) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1505 Ok(
1506 s
1507 .apply_base_from_data(data, 2823)?
1508 .applies_inferred_aura(AURA_DEADLY_POISON, 2823)
1509 .no_stealth_break()
1510 .apply_aoe_from_data(data),
1511 )
1512}
1513fn spell_amplifying_poison(
1514 s: SpellDefinitionDraft,
1515 data: &ResolvedGameData,
1516) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1517 Ok(
1518 s
1519 .apply_base_from_data(data, 381_664)?
1520 .applies_inferred_aura(AURA_AMPLIFYING_POISON, 381_664)
1521 .no_stealth_break()
1522 .apply_aoe_from_data(data),
1523 )
1524}
1525fn spell_instant_poison(
1526 s: SpellDefinitionDraft,
1527 data: &ResolvedGameData,
1528) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1529 Ok(
1530 s
1531 .apply_base_from_data(data, 315_584)?
1532 .applies_inferred_aura(AURA_INSTANT_POISON, 315_584)
1533 .no_stealth_break()
1534 .apply_aoe_from_data(data),
1535 )
1536}
1537fn spell_wound_poison(
1538 s: SpellDefinitionDraft,
1539 data: &ResolvedGameData,
1540) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1541 Ok(
1542 s
1543 .apply_base_from_data(data, 8679)?
1544 .applies_inferred_aura(AURA_WOUND_POISON, 8679)
1545 .no_stealth_break()
1546 .apply_aoe_from_data(data),
1547 )
1548}
1549fn spell_atrophic_poison(
1550 s: SpellDefinitionDraft,
1551 data: &ResolvedGameData,
1552) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1553 Ok(
1554 s
1555 .apply_base_from_data(data, 381_637)?
1556 .applies_inferred_aura(AURA_ATROPHIC_POISON, 381_637)
1557 .no_stealth_break()
1558 .apply_aoe_from_data(data),
1559 )
1560}
1561fn spell_numbing_poison(
1562 s: SpellDefinitionDraft,
1563 data: &ResolvedGameData,
1564) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1565 Ok(
1566 s
1567 .apply_base_from_data(data, 5761)?
1568 .applies_inferred_aura(AURA_NUMBING_POISON, 5761)
1569 .no_stealth_break()
1570 .apply_aoe_from_data(data),
1571 )
1572}
1573fn spell_crippling_poison(
1574 s: SpellDefinitionDraft,
1575 data: &ResolvedGameData,
1576) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1577 Ok(
1578 s
1579 .apply_base_from_data(data, 3408)?
1580 .applies_inferred_aura(AURA_CRIPPLING_POISON, 3408)
1581 .no_stealth_break()
1582 .apply_aoe_from_data(data),
1583 )
1584}
1585fn spell_mutilate_mh(
1586 s: SpellDefinitionDraft,
1587 data: &ResolvedGameData,
1588) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1589 Ok(s.apply_base_from_data(data, 5374)?.apply_aoe_from_data(data))
1590}
1591fn spell_mutilate_oh(
1592 s: SpellDefinitionDraft,
1593 data: &ResolvedGameData,
1594) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1595 Ok(s.apply_base_from_data(data, 27576)?.apply_aoe_from_data(data))
1596}
1597fn spell_deadly_poison_instant(
1598 s: SpellDefinitionDraft,
1599 data: &ResolvedGameData,
1600) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1601 Ok(s.apply_base_from_data(data, 113_780)?.apply_aoe_from_data(data))
1602}
1603fn spell_mutilated_flesh(
1604 s: SpellDefinitionDraft,
1605 data: &ResolvedGameData,
1606) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1607 Ok(s.apply_base_from_data(data, 394_021)?.apply_aoe_from_data(data))
1608}
1609fn spell_garrote(
1610 s: SpellDefinitionDraft,
1611 data: &ResolvedGameData,
1612) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1613 Ok(
1614 s
1615 .apply_base_from_data(data, 703)?
1616 .applies_inferred_aura(AURA_GARROTE, 703)
1617 .apply_aoe_from_data(data)
1618 .on_cast(crate::hooks::assassination_rogue::garrote_hook),
1619 )
1620}
1621fn spell_rupture(
1622 s: SpellDefinitionDraft,
1623 data: &ResolvedGameData,
1624) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1625 Ok(
1626 s
1627 .apply_base_from_data(data, 1943)?
1628 .applies_inferred_aura(AURA_RUPTURE, 1943)
1629 .apply_aoe_from_data(data)
1630 .on_cast(crate::hooks::assassination_rogue::rupture_hook),
1631 )
1632}
1633fn spell_internal_bleeding_driver(
1634 s: SpellDefinitionDraft,
1635 data: &ResolvedGameData,
1636) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1637 Ok(
1638 s
1639 .apply_base_from_data(data, 381_628)?
1640 .applies_inferred_aura(AURA_INTERNAL_BLEEDING, 381_628)
1641 .apply_aoe_from_data(data),
1642 )
1643}
1644fn spell_deathmark(
1645 s: SpellDefinitionDraft,
1646 data: &ResolvedGameData,
1647) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1648 Ok(
1649 s
1650 .apply_base_from_data(data, 360_194)?
1651 .applies_inferred_aura(AURA_DEATHMARK, 360_194)
1652 .apply_aoe_from_data(data)
1653 .on_cast(crate::hooks::assassination_rogue::deathmark_hook),
1654 )
1655}
1656fn spell_kingsbane(
1657 s: SpellDefinitionDraft,
1658 data: &ResolvedGameData,
1659) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1660 Ok(
1661 s
1662 .apply_base_from_data(data, 385_627)?
1663 .applies_inferred_aura(AURA_KINGSBANE, 385_627)
1664 .apply_aoe_from_data(data)
1665 .on_cast(crate::hooks::assassination_rogue::kingsbane_hook),
1666 )
1667}
1668fn spell_implacable_strikes_nature(
1669 s: SpellDefinitionDraft,
1670 data: &ResolvedGameData,
1671) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1672 Ok(s.apply_base_from_data(data, 1_265_794)?.apply_aoe_from_data(data))
1673}
1674fn spell_implacable_strikes_physical(
1675 s: SpellDefinitionDraft,
1676 data: &ResolvedGameData,
1677) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1678 Ok(s.apply_base_from_data(data, 1_265_795)?.apply_aoe_from_data(data))
1679}
1680fn spell_thistle_tea(
1681 s: SpellDefinitionDraft,
1682 data: &ResolvedGameData,
1683) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1684 Ok(
1685 s
1686 .apply_base_from_data(data, 381_623)?
1687 .no_stealth_break()
1688 .apply_aoe_from_data(data),
1689 )
1690}
1691fn spell_vanish(
1692 s: SpellDefinitionDraft,
1693 data: &ResolvedGameData,
1694) -> Result<SpellDefinitionDraft, wowlab_engine_combat::BuilderError> {
1695 Ok(
1696 s
1697 .apply_base_from_data(data, 1856)?
1698 .applies_aura(AURA_STEALTH)
1699 .no_stealth_break()
1700 .apply_aoe_from_data(data)
1701 .on_cast(crate::hooks::assassination_rogue::vanish_hook),
1702 )
1703}
1704pub(crate) fn build_combat_system_draft(
1705 params: &wowlab_engine_ports::HandlerParams<'_>,
1706) -> Result<CombatSystemDraft, wowlab_engine_ports::EngineError> {
1707 let builder = CombatSystemBuilder::new(params.stats.clone())
1708 .spec_id(SpecId::Assassination)
1709 .spec_identity(
1710 wowlab_engine_combat::generated_identities::specs::assassination_rogue::PROOF,
1711 )
1712 .hero_talent_trees(DECLARED_METADATA.hero_talent_trees)
1713 .effect_identities(
1714 wowlab_engine_combat::generated_identities::specs::assassination_rogue::damage::ALL,
1715 )
1716 .effect_identities(wowlab_engine_combat::generated_identities::shared::ALL)
1717 .mastery_spell(76803)
1718 .mastery_hook(crate::hooks::assassination_rogue::mastery)
1719 .resource(
1720 "energy",
1721 params
1722 .game_data
1723 .power_max(3)
1724 .ok_or_else(|| {
1725 wowlab_engine_ports::EngineError::spec_construction(
1726 "missing power-type power_max for type_id 3",
1727 )
1728 })?,
1729 params
1730 .game_data
1731 .power_regen_for_max(
1732 3,
1733 params
1734 .game_data
1735 .power_max(3)
1736 .ok_or_else(|| {
1737 wowlab_engine_ports::EngineError::spec_construction(
1738 "missing power-type power_max for type_id 3",
1739 )
1740 })?,
1741 )
1742 .ok_or_else(|| {
1743 wowlab_engine_ports::EngineError::spec_construction(
1744 "missing power-type power_regen_for_max for type_id 3",
1745 )
1746 })?,
1747 )
1748 .resource_type_id(3)
1749 .resource_start(
1750 params
1751 .game_data
1752 .power_default(3)
1753 .ok_or_else(|| {
1754 wowlab_engine_ports::EngineError::spec_construction(
1755 "missing power-type power_default for type_id 3",
1756 )
1757 })?,
1758 )
1759 .secondary_resource(
1760 "combo_points",
1761 params
1762 .game_data
1763 .power_max(4)
1764 .ok_or_else(|| {
1765 wowlab_engine_ports::EngineError::spec_construction(
1766 "missing power-type power_max for type_id 4",
1767 )
1768 })?,
1769 )
1770 .secondary_resource_type_id(4)
1771 .precombat_aura(AURA_STEALTH)
1772 .precombat_aura(AURA_DEADLY_POISON)
1773 .precombat_aura(AURA_AMPLIFYING_POISON)
1774 .precombat_aura(AURA_ATROPHIC_POISON)
1775 .precombat_aura(AURA_CRIPPLING_POISON)
1776 .stealth_aura(AURA::STEALTH)
1777 .aura("stealth", AURA::STEALTH, |a| aura_stealth(a, ¶ms.game_data))
1778 .aura("vanish", AURA::VANISH, |a| aura_vanish(a, ¶ms.game_data))
1779 .aura(
1780 "deadly_poison",
1781 AURA::DEADLY_POISON,
1782 |a| aura_deadly_poison(a, ¶ms.game_data),
1783 )
1784 .aura(
1785 "amplifying_poison",
1786 AURA::AMPLIFYING_POISON,
1787 |a| aura_amplifying_poison(a, ¶ms.game_data),
1788 )
1789 .aura(
1790 "instant_poison",
1791 AURA::INSTANT_POISON,
1792 |a| aura_instant_poison(a, ¶ms.game_data),
1793 )
1794 .aura(
1795 "wound_poison",
1796 AURA::WOUND_POISON,
1797 |a| aura_wound_poison(a, ¶ms.game_data),
1798 )
1799 .aura(
1800 "atrophic_poison",
1801 AURA::ATROPHIC_POISON,
1802 |a| aura_atrophic_poison(a, ¶ms.game_data),
1803 )
1804 .aura(
1805 "numbing_poison",
1806 AURA::NUMBING_POISON,
1807 |a| aura_numbing_poison(a, ¶ms.game_data),
1808 )
1809 .aura(
1810 "crippling_poison",
1811 AURA::CRIPPLING_POISON,
1812 |a| aura_crippling_poison(a, ¶ms.game_data),
1813 )
1814 .aura(
1815 "deadly_poison_dot",
1816 AURA::DEADLY_POISON_DOT,
1817 |a| aura_deadly_poison_dot(a, ¶ms.game_data),
1818 )
1819 .aura(
1820 "amplifying_poison_debuff",
1821 AURA::AMPLIFYING_POISON_DEBUFF,
1822 |a| aura_amplifying_poison_debuff(a, ¶ms.game_data),
1823 )
1824 .aura("envenom", AURA::ENVENOM, |a| aura_envenom(a, ¶ms.game_data))
1825 .aura(
1826 "slice_and_dice",
1827 AURA::SLICE_AND_DICE,
1828 |a| aura_slice_and_dice(a, ¶ms.game_data),
1829 )
1830 .aura("blindside", AURA::BLINDSIDE, |a| aura_blindside(a, ¶ms.game_data))
1831 .aura("alacrity", AURA::ALACRITY, |a| aura_alacrity(a, ¶ms.game_data))
1832 .aura(
1833 "darkest_night",
1834 AURA::DARKEST_NIGHT,
1835 |a| aura_darkest_night(a, ¶ms.game_data),
1836 )
1837 .aura(
1838 "deeper_stratagem",
1839 AURA::DEEPER_STRATAGEM,
1840 |a| aura_deeper_stratagem(a, ¶ms.game_data),
1841 )
1842 .aura(
1843 "sanguine_stratagem",
1844 AURA::SANGUINE_STRATAGEM,
1845 |a| aura_sanguine_stratagem(a, ¶ms.game_data),
1846 )
1847 .aura(
1848 "dragon_tempered_blades",
1849 AURA::DRAGON_TEMPERED_BLADES,
1850 |a| aura_dragon_tempered_blades(a, ¶ms.game_data),
1851 )
1852 .aura(
1853 "inspiring_strike",
1854 AURA::INSPIRING_STRIKE,
1855 |a| aura_inspiring_strike(a, ¶ms.game_data),
1856 )
1857 .aura(
1858 "regicides_reward",
1859 AURA::REGICIDES_REWARD,
1860 |a| aura_regicides_reward(a, ¶ms.game_data),
1861 )
1862 .aura("garrote", AURA::GARROTE, |a| aura_garrote(a, ¶ms.game_data))
1863 .aura("rupture", AURA::RUPTURE, |a| aura_rupture(a, ¶ms.game_data))
1864 .aura(
1865 "internal_bleeding",
1866 AURA::INTERNAL_BLEEDING,
1867 |a| aura_internal_bleeding(a, ¶ms.game_data),
1868 )
1869 .aura(
1870 "improved_garrote",
1871 AURA::IMPROVED_GARROTE,
1872 |a| aura_improved_garrote(a, ¶ms.game_data),
1873 )
1874 .aura(
1875 "improved_garrote_window",
1876 AURA::IMPROVED_GARROTE_WINDOW,
1877 |a| aura_improved_garrote_window(a, ¶ms.game_data),
1878 )
1879 .aura("deathmark", AURA::DEATHMARK, |a| aura_deathmark(a, ¶ms.game_data))
1880 .aura("kingsbane", AURA::KINGSBANE, |a| aura_kingsbane(a, ¶ms.game_data))
1881 .aura(
1882 "kingsbane_ramp",
1883 AURA::KINGSBANE_RAMP,
1884 |a| aura_kingsbane_ramp(a, ¶ms.game_data),
1885 )
1886 .aura(
1887 "finish_the_job",
1888 AURA::FINISH_THE_JOB,
1889 |a| aura_finish_the_job(a, ¶ms.game_data),
1890 )
1891 .aura(
1892 "implacable_tracker",
1893 AURA::IMPLACABLE_TRACKER,
1894 |a| aura_implacable_tracker(a, ¶ms.game_data),
1895 )
1896 .aura(
1897 "implacable_regen",
1898 AURA::IMPLACABLE_REGEN,
1899 |a| aura_implacable_regen(a, ¶ms.game_data),
1900 )
1901 .aura(
1902 "implacable_bonus",
1903 AURA::IMPLACABLE_BONUS,
1904 |a| aura_implacable_bonus(a, ¶ms.game_data),
1905 )
1906 .aura(
1907 "pvp_rules_enabled_hardcoded",
1908 AURA::PVP_RULES_ENABLED_HARDCODED,
1909 |a| aura_pvp_rules_enabled_hardcoded(a, ¶ms.game_data),
1910 )
1911 .aura(
1912 "fatebound_coin_heads",
1913 AURA::FATEBOUND_COIN_HEADS,
1914 |a| aura_fatebound_coin_heads(a, ¶ms.game_data),
1915 )
1916 .aura(
1917 "fatebound_coin_tails",
1918 AURA::FATEBOUND_COIN_TAILS,
1919 |a| aura_fatebound_coin_tails(a, ¶ms.game_data),
1920 )
1921 .aura(
1922 "fatebound_lucky_coin",
1923 AURA::FATEBOUND_LUCKY_COIN,
1924 |a| aura_fatebound_lucky_coin(a, ¶ms.game_data),
1925 )
1926 .aura(
1927 "lucky_coin_counter",
1928 AURA::LUCKY_COIN_COUNTER,
1929 |a| aura_lucky_coin_counter(a, ¶ms.game_data),
1930 )
1931 .spell("mutilate", SPELL::MUTILATE, |s| spell_mutilate(s, ¶ms.game_data))
1932 .spell("ambush", SPELL::AMBUSH, |s| spell_ambush(s, ¶ms.game_data))
1933 .spell("envenom", SPELL::ENVENOM, |s| spell_envenom(s, ¶ms.game_data))
1934 .spell(
1935 "slice_and_dice",
1936 SPELL::SLICE_AND_DICE,
1937 |s| spell_slice_and_dice(s, ¶ms.game_data),
1938 )
1939 .spell(
1940 "fan_of_knives",
1941 SPELL::FAN_OF_KNIVES,
1942 |s| spell_fan_of_knives(s, ¶ms.game_data),
1943 )
1944 .spell(
1945 "crimson_tempest",
1946 SPELL::CRIMSON_TEMPEST,
1947 |s| spell_crimson_tempest(s, ¶ms.game_data),
1948 )
1949 .spell(
1950 "poisoned_knife",
1951 SPELL::POISONED_KNIFE,
1952 |s| spell_poisoned_knife(s, ¶ms.game_data),
1953 )
1954 .spell(
1955 "deadly_poison",
1956 SPELL::DEADLY_POISON,
1957 |s| spell_deadly_poison(s, ¶ms.game_data),
1958 )
1959 .spell(
1960 "amplifying_poison",
1961 SPELL::AMPLIFYING_POISON,
1962 |s| spell_amplifying_poison(s, ¶ms.game_data),
1963 )
1964 .spell(
1965 "instant_poison",
1966 SPELL::INSTANT_POISON,
1967 |s| spell_instant_poison(s, ¶ms.game_data),
1968 )
1969 .spell(
1970 "wound_poison",
1971 SPELL::WOUND_POISON,
1972 |s| spell_wound_poison(s, ¶ms.game_data),
1973 )
1974 .spell(
1975 "atrophic_poison",
1976 SPELL::ATROPHIC_POISON,
1977 |s| spell_atrophic_poison(s, ¶ms.game_data),
1978 )
1979 .spell(
1980 "numbing_poison",
1981 SPELL::NUMBING_POISON,
1982 |s| spell_numbing_poison(s, ¶ms.game_data),
1983 )
1984 .spell(
1985 "crippling_poison",
1986 SPELL::CRIPPLING_POISON,
1987 |s| spell_crippling_poison(s, ¶ms.game_data),
1988 )
1989 .spell(
1990 "mutilate_mh",
1991 SPELL::MUTILATE_MH,
1992 |s| spell_mutilate_mh(s, ¶ms.game_data),
1993 )
1994 .spell(
1995 "mutilate_oh",
1996 SPELL::MUTILATE_OH,
1997 |s| spell_mutilate_oh(s, ¶ms.game_data),
1998 )
1999 .spell(
2000 "deadly_poison_instant",
2001 SPELL::DEADLY_POISON_INSTANT,
2002 |s| spell_deadly_poison_instant(s, ¶ms.game_data),
2003 )
2004 .spell(
2005 "mutilated_flesh",
2006 SPELL::MUTILATED_FLESH,
2007 |s| spell_mutilated_flesh(s, ¶ms.game_data),
2008 )
2009 .spell("garrote", SPELL::GARROTE, |s| spell_garrote(s, ¶ms.game_data))
2010 .spell("rupture", SPELL::RUPTURE, |s| spell_rupture(s, ¶ms.game_data))
2011 .spell(
2012 "internal_bleeding_driver",
2013 SPELL::INTERNAL_BLEEDING_DRIVER,
2014 |s| spell_internal_bleeding_driver(s, ¶ms.game_data),
2015 )
2016 .spell("deathmark", SPELL::DEATHMARK, |s| spell_deathmark(s, ¶ms.game_data))
2017 .spell("kingsbane", SPELL::KINGSBANE, |s| spell_kingsbane(s, ¶ms.game_data))
2018 .spell(
2019 "implacable_strikes_nature",
2020 SPELL::IMPLACABLE_STRIKES_NATURE,
2021 |s| spell_implacable_strikes_nature(s, ¶ms.game_data),
2022 )
2023 .spell(
2024 "implacable_strikes_physical",
2025 SPELL::IMPLACABLE_STRIKES_PHYSICAL,
2026 |s| spell_implacable_strikes_physical(s, ¶ms.game_data),
2027 )
2028 .spell(
2029 "thistle_tea",
2030 SPELL::THISTLE_TEA,
2031 |s| spell_thistle_tea(s, ¶ms.game_data),
2032 )
2033 .spell("vanish", SPELL::VANISH, |s| spell_vanish(s, ¶ms.game_data))
2034 .auto_attack(|a| {
2035 a
2036 .spell_id(6603)
2037 .swing_ms(1800)
2038 .apply_base_from_data(¶ms.game_data)
2039 .on_swing(crate::hooks::assassination_rogue::swing_hook)
2040 })
2041 .game_data(params.game_data.clone())
2042 .talent_spell_ids(TALENTS)
2043 .talent_selections(params.talent_selections)
2044 .talent_companion_aura(TALENT::IMPROVED_GARROTE, AURA_IMPROVED_GARROTE_WINDOW)
2045 .register_impact_effect_proc_if_talent(
2046 TALENT::VENOMOUS_WOUNDS,
2047 wowlab_engine_combat::ImpactEffectProcDefinition::new(
2048 wowlab_engine_combat::ImpactSource::Spell(SPELL::GARROTE),
2049 )
2050 .chance(1.0)
2051 .periodic_only()
2052 .gain(
2053 params
2054 .game_data
2055 .base_points(wowlab_types::sim::SpellIdx::from_raw(79134), 1),
2056 ),
2057 )
2058 .register_impact_effect_proc_if_talent(
2059 TALENT::VENOMOUS_WOUNDS,
2060 wowlab_engine_combat::ImpactEffectProcDefinition::new(
2061 wowlab_engine_combat::ImpactSource::Spell(SPELL::RUPTURE),
2062 )
2063 .chance(1.0)
2064 .periodic_only()
2065 .gain(
2066 params
2067 .game_data
2068 .base_points(wowlab_types::sim::SpellIdx::from_raw(79134), 1),
2069 ),
2070 )
2071 .set_bonus_auras(params.set_bonus_auras)
2072 .encounter(params.encounter.clone());
2073 let builder = crate::generated::items::register_equipped(
2074 builder,
2075 ¶ms.game_data,
2076 params.equipped_items,
2077 )?;
2078
2079 builder.into_draft()
2080}
2081fn new_handler(
2082 params: wowlab_engine_ports::HandlerParams<'_>,
2083) -> Result<Box<dyn SpecHandler>, wowlab_engine_ports::EngineError> {
2084 let handler = crate::composition::compose_handler(
2085 build_combat_system_draft,
2086 ¶ms,
2087 crate::hooks::assassination_rogue::AssassinationHandler::try_new,
2088 )?;
2089
2090 Ok(Box::new(handler))
2091}
2092static DECLARED_METADATA: DeclaredSpecMetadata = DeclaredSpecMetadata {
2093 primary_resource: ResourceType::Energy,
2094 secondary_resource: Some(ResourceType::ComboPoints),
2095 spell_ids: DECLARED_SPELL_IDS,
2096 aura_ids: DECLARED_AURA_IDS,
2097 server_proc_entries: &[],
2098 talents: TALENTS,
2099 rotation_field_schema: &[],
2100 metrics_plugin_id: None,
2101 hero_talent_trees: &[
2102 HeroTalentTreeDesc {
2103 name: "Fatebound",
2104 spells: HERO_TREE_FATEBOUND_SPELLS,
2105 auras: HERO_TREE_FATEBOUND_AURAS,
2106 },
2107 ],
2108 reported_spells: REPORTED_SPELLS,
2109 masked_passive_effects: &[],
2110 passive_effect_overrides: &[],
2111};
2112pub(super) const SPEC_DESCRIPTOR: SpecDescriptor = SpecDescriptor {
2113 spec_id: SpecId::Assassination,
2114 display_name: "Assassination Rogue",
2115 metadata: DECLARED_METADATA,
2116 handler_factory: new_handler,
2117};
2118wowlab_engine_combat::smoke_test!(build_combat_system_draft);