From 121bd894ae0c106604092660befb811e0570f105 Mon Sep 17 00:00:00 2001 From: sanguinerarogue Date: Thu, 21 Nov 2024 21:50:53 -0700 Subject: [PATCH 1/2] First Batch --- proto/rogue.proto | 47 ---- ...tween_the_eyes.go => _between_the_eyes.go} | 0 sim/rogue/{blunderbuss.go => _blunderbuss.go} | 0 sim/rogue/{carnage.go => _carnage.go} | 0 ...crimson_tempest.go => _crimson_tempest.go} | 0 sim/rogue/{envenom.go => _envenom.go} | 0 .../{fan_of_knives.go => _fan_of_knives.go} | 0 sim/rogue/{main_gauche.go => _main_gauche.go} | 0 ..._of_subtlety.go => _master_of_subtlety.go} | 0 sim/rogue/{mutilate.go => _mutilate.go} | 0 .../{poisoned_knife.go => _poisoned_knife.go} | 0 sim/rogue/{quick_draw.go => _quick_draw.go} | 0 sim/rogue/{runes.go => _runes.go} | 0 sim/rogue/{saber_slash.go => _saber_slash.go} | 0 sim/rogue/{shadowstep.go => _shadowstep.go} | 0 .../{shadowstrike.go => _shadowstrike.go} | 0 sim/rogue/_shiv.go | 75 ------ .../{shuriken_toss.go => _shuriken_toss.go} | 0 ...fair_advantage.go => _unfair_advantage.go} | 0 sim/rogue/{waylay.go => _waylay.go} | 0 sim/rogue/ambush.go | 15 +- sim/rogue/backstab.go | 15 +- sim/rogue/eviscerate.go | 6 - sim/rogue/garrote.go | 7 +- sim/rogue/poisons.go | 234 ++---------------- sim/rogue/riposte.go | 2 +- sim/rogue/rogue.go | 70 +----- sim/rogue/sinister_strike.go | 11 - sim/rogue/stealth.go | 10 - sim/rogue/talents.go | 12 +- sim/rogue/vanish.go | 12 +- ui/rogue/inputs.ts | 4 +- 32 files changed, 40 insertions(+), 480 deletions(-) rename sim/rogue/{between_the_eyes.go => _between_the_eyes.go} (100%) rename sim/rogue/{blunderbuss.go => _blunderbuss.go} (100%) rename sim/rogue/{carnage.go => _carnage.go} (100%) rename sim/rogue/{crimson_tempest.go => _crimson_tempest.go} (100%) rename sim/rogue/{envenom.go => _envenom.go} (100%) rename sim/rogue/{fan_of_knives.go => _fan_of_knives.go} (100%) rename sim/rogue/{main_gauche.go => _main_gauche.go} (100%) rename sim/rogue/{master_of_subtlety.go => _master_of_subtlety.go} (100%) rename sim/rogue/{mutilate.go => _mutilate.go} (100%) rename sim/rogue/{poisoned_knife.go => _poisoned_knife.go} (100%) rename sim/rogue/{quick_draw.go => _quick_draw.go} (100%) rename sim/rogue/{runes.go => _runes.go} (100%) rename sim/rogue/{saber_slash.go => _saber_slash.go} (100%) rename sim/rogue/{shadowstep.go => _shadowstep.go} (100%) rename sim/rogue/{shadowstrike.go => _shadowstrike.go} (100%) delete mode 100644 sim/rogue/_shiv.go rename sim/rogue/{shuriken_toss.go => _shuriken_toss.go} (100%) rename sim/rogue/{unfair_advantage.go => _unfair_advantage.go} (100%) rename sim/rogue/{waylay.go => _waylay.go} (100%) diff --git a/proto/rogue.proto b/proto/rogue.proto index 62f7eeca1..3b10d5fbe 100644 --- a/proto/rogue.proto +++ b/proto/rogue.proto @@ -62,53 +62,6 @@ message RogueTalents { bool premeditation = 51; } -enum RogueRune { - RogueRuneNone = 0; - - // Helm - RuneFocusedAttacks = 432256; - RuneCombatPotency = 432259; - RuneHonorAmongThieves = 432264; - - // Cloak - RuneFanOfKnives = 409240; - RuneCrimsonTempest = 412096; - RuneBlunderbuss = 436564; - - // Chest - RuneQuickDraw = 398196; - RuneDeadlyBrew = 399965; - RuneJustAFleshWound = 400014; - RuneSlaughterFromTheShadows = 424925; - - // Bracers - RuneCutToTheChase = 432271; - RuneUnfairAdvantage = 432273; - RuneCarnage = 432276; - - // Gloves - RuneMutilate = 399956; - RuneShadowstrike = 399985; - RuneSaberSlash = 424785; - RuneMainGauche = 424919; - RuneCutthroat = 462708; - - // Waist - RuneShurikenToss = 399986; - RuneShadowstep = 400101; - RunePoisonedKnife = 425012; - - // Legs - RuneEnvenom = 399963; - RuneBetweenTheEyes = 400009; - RuneBladeDance = 400012; - - // Boots - RuneRollingWithThePunches = 400016; - RuneWaylay = 408700; - RuneMasterOfSubtlety = 425096; -} - message RogueOptions { int32 HonorAmongThievesCritRate = 1; } diff --git a/sim/rogue/between_the_eyes.go b/sim/rogue/_between_the_eyes.go similarity index 100% rename from sim/rogue/between_the_eyes.go rename to sim/rogue/_between_the_eyes.go diff --git a/sim/rogue/blunderbuss.go b/sim/rogue/_blunderbuss.go similarity index 100% rename from sim/rogue/blunderbuss.go rename to sim/rogue/_blunderbuss.go diff --git a/sim/rogue/carnage.go b/sim/rogue/_carnage.go similarity index 100% rename from sim/rogue/carnage.go rename to sim/rogue/_carnage.go diff --git a/sim/rogue/crimson_tempest.go b/sim/rogue/_crimson_tempest.go similarity index 100% rename from sim/rogue/crimson_tempest.go rename to sim/rogue/_crimson_tempest.go diff --git a/sim/rogue/envenom.go b/sim/rogue/_envenom.go similarity index 100% rename from sim/rogue/envenom.go rename to sim/rogue/_envenom.go diff --git a/sim/rogue/fan_of_knives.go b/sim/rogue/_fan_of_knives.go similarity index 100% rename from sim/rogue/fan_of_knives.go rename to sim/rogue/_fan_of_knives.go diff --git a/sim/rogue/main_gauche.go b/sim/rogue/_main_gauche.go similarity index 100% rename from sim/rogue/main_gauche.go rename to sim/rogue/_main_gauche.go diff --git a/sim/rogue/master_of_subtlety.go b/sim/rogue/_master_of_subtlety.go similarity index 100% rename from sim/rogue/master_of_subtlety.go rename to sim/rogue/_master_of_subtlety.go diff --git a/sim/rogue/mutilate.go b/sim/rogue/_mutilate.go similarity index 100% rename from sim/rogue/mutilate.go rename to sim/rogue/_mutilate.go diff --git a/sim/rogue/poisoned_knife.go b/sim/rogue/_poisoned_knife.go similarity index 100% rename from sim/rogue/poisoned_knife.go rename to sim/rogue/_poisoned_knife.go diff --git a/sim/rogue/quick_draw.go b/sim/rogue/_quick_draw.go similarity index 100% rename from sim/rogue/quick_draw.go rename to sim/rogue/_quick_draw.go diff --git a/sim/rogue/runes.go b/sim/rogue/_runes.go similarity index 100% rename from sim/rogue/runes.go rename to sim/rogue/_runes.go diff --git a/sim/rogue/saber_slash.go b/sim/rogue/_saber_slash.go similarity index 100% rename from sim/rogue/saber_slash.go rename to sim/rogue/_saber_slash.go diff --git a/sim/rogue/shadowstep.go b/sim/rogue/_shadowstep.go similarity index 100% rename from sim/rogue/shadowstep.go rename to sim/rogue/_shadowstep.go diff --git a/sim/rogue/shadowstrike.go b/sim/rogue/_shadowstrike.go similarity index 100% rename from sim/rogue/shadowstrike.go rename to sim/rogue/_shadowstrike.go diff --git a/sim/rogue/_shiv.go b/sim/rogue/_shiv.go deleted file mode 100644 index 1b8ba5853..000000000 --- a/sim/rogue/_shiv.go +++ /dev/null @@ -1,75 +0,0 @@ -package rogue - -import ( - "time" - - "github.com/wowsims/classic/sim/core" - "github.com/wowsims/classic/sim/core/proto" -) - -func (rogue *Rogue) registerShivSpell() { - if !rogue.HasRune(proto.RogueRune_RuneShiv) { - return - } - - hasDeadlyBrew := rogue.HasRune(proto.RogueRune_RuneDeadlyBrew) - - baseCost := 20.0 - if ohWeapon := rogue.GetOHWeapon(); ohWeapon != nil { - baseCost = baseCost + 10*ohWeapon.SwingSpeed - } - - // Shiv /might/ scale with BonusWeaponDamage, if it's using https://www.wowhead.com/classic/spell=424800/shiv - rogue.Shiv = rogue.RegisterSpell(core.SpellConfig{ - ActionID: core.ActionID{SpellID: int32(proto.RogueRune_RuneShiv)}, - SpellSchool: core.SpellSchoolPhysical, - DefenseType: core.DefenseTypeMelee, - ProcMask: core.ProcMaskMeleeOHSpecial, - Flags: rogue.builderFlags(), - - EnergyCost: core.EnergyCostOptions{ - Cost: baseCost - []float64{0, 3, 5}[rogue.Talents.ImprovedSinisterStrike], - Refund: 0.8, - }, - Cast: core.CastConfig{ - DefaultCast: core.Cast{ - GCD: time.Second, - }, - IgnoreHaste: true, - }, - - CritDamageBonus: rogue.lethality(), - - DamageMultiplier: []float64{1, 1.02, 1.04, 1.06}[rogue.Talents.Aggression] * rogue.dwsMultiplier(), - ThreatMultiplier: 1, - - ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) { - rogue.BreakStealth(sim) - // TODO check whether Shiv is affected by - baseDamage := spell.Unit.OHNormalizedWeaponDamage(sim, spell.MeleeAttackPower()) - - result := spell.CalcAndDealDamage(sim, target, baseDamage, spell.OutcomeMeleeSpecialNoBlockDodgeParry) - - if result.Landed() { - rogue.AddComboPoints(sim, 1, target, spell.ComboPointMetrics()) - - switch rogue.Consumes.OffHandImbue { - case proto.WeaponImbue_InstantPoison: - rogue.InstantPoison[ShivProc].Cast(sim, target) - case proto.WeaponImbue_DeadlyPoison: - rogue.DeadlyPoison[ShivProc].Cast(sim, target) - case proto.WeaponImbue_WoundPoison: - rogue.WoundPoison[ShivProc].Cast(sim, target) - default: - if hasDeadlyBrew { - rogue.InstantPoison[DeadlyBrewProc].Cast(sim, target) - } - } - } - - if !result.Landed() { - spell.IssueRefund(sim) - } - }, - }) -} diff --git a/sim/rogue/shuriken_toss.go b/sim/rogue/_shuriken_toss.go similarity index 100% rename from sim/rogue/shuriken_toss.go rename to sim/rogue/_shuriken_toss.go diff --git a/sim/rogue/unfair_advantage.go b/sim/rogue/_unfair_advantage.go similarity index 100% rename from sim/rogue/unfair_advantage.go rename to sim/rogue/_unfair_advantage.go diff --git a/sim/rogue/waylay.go b/sim/rogue/_waylay.go similarity index 100% rename from sim/rogue/waylay.go rename to sim/rogue/_waylay.go diff --git a/sim/rogue/ambush.go b/sim/rogue/ambush.go index c05588b5c..7be0858a9 100644 --- a/sim/rogue/ambush.go +++ b/sim/rogue/ambush.go @@ -4,7 +4,6 @@ import ( "time" "github.com/wowsims/classic/sim/core" - "github.com/wowsims/classic/sim/core/proto" ) func (rogue *Rogue) registerAmbushSpell() { @@ -22,9 +21,6 @@ func (rogue *Rogue) registerAmbushSpell() { 60: 11269, }[rogue.Level] - // waylay := rogue.HasRune(proto.RogueRune_RuneWaylay) - hasCutthroatRune := rogue.HasRune(proto.RogueRune_RuneCutthroat) - damageMultiplier := 2.5 * []float64{1, 1.04, 1.08, 1.12, 1.16, 1.2}[rogue.Talents.Opportunity] rogue.Ambush = rogue.RegisterSpell(core.SpellConfig{ @@ -49,7 +45,7 @@ func (rogue *Rogue) registerAmbushSpell() { if !rogue.HasDagger(core.MainHand) { return false } - if hasCutthroatRune && (rogue.CutthroatProcAura.IsActive() || rogue.IsStealthed()) { + if rogue.IsStealthed() { return true } return !rogue.PseudoStats.InFrontOfTarget && rogue.IsStealthed() @@ -65,20 +61,13 @@ func (rogue *Rogue) registerAmbushSpell() { baseDamage := (flatDamageBonus + spell.Unit.MHNormalizedWeaponDamage(sim, spell.MeleeAttackPower())) result := spell.CalcAndDealDamage(sim, target, baseDamage, spell.OutcomeMeleeSpecialNoBlockDodgeParry) - if hasCutthroatRune && rogue.CutthroatProcAura.IsActive() { - rogue.CutthroatProcAura.Deactivate(sim) - } + if result.Landed() { rogue.AddComboPoints(sim, 1, target, spell.ComboPointMetrics()) - /** Currently does not apply to bosses due to being a slow - if waylay { - rogue.WaylayAuras.Get(target).Activate(sim) - } */ } else { spell.IssueRefund(sim) } }, - RelatedAuras: []core.AuraArray{rogue.WaylayAuras}, }) } diff --git a/sim/rogue/backstab.go b/sim/rogue/backstab.go index d89019c91..f2258c6df 100644 --- a/sim/rogue/backstab.go +++ b/sim/rogue/backstab.go @@ -4,7 +4,6 @@ import ( "time" "github.com/wowsims/classic/sim/core" - "github.com/wowsims/classic/sim/core/proto" ) func (rogue *Rogue) registerBackstabSpell() { @@ -22,9 +21,6 @@ func (rogue *Rogue) registerBackstabSpell() { 60: core.TernaryInt32(core.IncludeAQ, 25300, 11281), }[rogue.Level] - // waylay := rogue.HasRune(proto.RogueRune_RuneWaylay) - hasCutthroatRune := rogue.HasRune(proto.RogueRune_RuneCutthroat) - damageMultiplier := 1.5 * []float64{1, 1.04, 1.08, 1.12, 1.16, 1.2}[rogue.Talents.Opportunity] rogue.Backstab = rogue.RegisterSpell(core.SpellConfig{ @@ -49,7 +45,7 @@ func (rogue *Rogue) registerBackstabSpell() { if !rogue.HasDagger(core.MainHand) { return false } - return hasCutthroatRune || !rogue.PseudoStats.InFrontOfTarget + return !rogue.PseudoStats.InFrontOfTarget }, BonusCritRating: 10 * core.CritRatingPerCritChance * float64(rogue.Talents.ImprovedBackstab), @@ -67,18 +63,9 @@ func (rogue *Rogue) registerBackstabSpell() { if result.Landed() { rogue.AddComboPoints(sim, 1, target, spell.ComboPointMetrics()) - if hasCutthroatRune { - rogue.rollCutthroat(sim) - } - /** Currently does not apply to bosses due to being a slow - if waylay { - rogue.WaylayAuras.Get(target).Activate(sim) - } */ } else { spell.IssueRefund(sim) } }, - - RelatedAuras: []core.AuraArray{rogue.WaylayAuras}, }) } diff --git a/sim/rogue/eviscerate.go b/sim/rogue/eviscerate.go index abc16c3d7..0ae276589 100644 --- a/sim/rogue/eviscerate.go +++ b/sim/rogue/eviscerate.go @@ -4,7 +4,6 @@ import ( "time" "github.com/wowsims/classic/sim/core" - "github.com/wowsims/classic/sim/core/proto" ) func (rogue *Rogue) registerEviscerate() { @@ -36,8 +35,6 @@ func (rogue *Rogue) registerEviscerate() { 60: 31016, }[rogue.Level] - cutToTheChase := rogue.HasRune(proto.RogueRune_RuneCutToTheChase) - rogue.Eviscerate = rogue.RegisterSpell(core.SpellConfig{ SpellCode: SpellCode_RogueEviscerate, ActionID: core.ActionID{SpellID: spellID}, @@ -83,9 +80,6 @@ func (rogue *Rogue) registerEviscerate() { if result.Landed() { rogue.SpendComboPoints(sim, spell) - if cutToTheChase { - rogue.ApplyCutToTheChase(sim) - } } else { spell.IssueRefund(sim) } diff --git a/sim/rogue/garrote.go b/sim/rogue/garrote.go index 0bbaa0537..f4f1d5d7e 100644 --- a/sim/rogue/garrote.go +++ b/sim/rogue/garrote.go @@ -4,7 +4,6 @@ import ( "time" "github.com/wowsims/classic/sim/core" - "github.com/wowsims/classic/sim/core/proto" ) func (rogue *Rogue) registerGarrote() { @@ -22,15 +21,13 @@ func (rogue *Rogue) registerGarrote() { 60: 11290, }[rogue.Level] - hasCutthroatRune := rogue.HasRune(proto.RogueRune_RuneCutthroat) - rogue.Garrote = rogue.GetOrRegisterSpell(core.SpellConfig{ SpellCode: SpellCode_RogueGarrote, ActionID: core.ActionID{SpellID: spellID}, SpellSchool: core.SpellSchoolPhysical, DefenseType: core.DefenseTypeMelee, ProcMask: core.ProcMaskMeleeMHSpecial, - Flags: SpellFlagBuilder | SpellFlagCarnage | core.SpellFlagMeleeMetrics | core.SpellFlagAPL, + Flags: SpellFlagBuilder | core.SpellFlagMeleeMetrics | core.SpellFlagAPL, EnergyCost: core.EnergyCostOptions{ Cost: 50.0 - 10*float64(rogue.Talents.DirtyDeeds), @@ -46,7 +43,7 @@ func (rogue *Rogue) registerGarrote() { if !rogue.IsStealthed() { return false } - return hasCutthroatRune || !rogue.PseudoStats.InFrontOfTarget + return !rogue.PseudoStats.InFrontOfTarget }, DamageMultiplier: 1 + diff --git a/sim/rogue/poisons.go b/sim/rogue/poisons.go index ea34ebc2d..2ca2251be 100644 --- a/sim/rogue/poisons.go +++ b/sim/rogue/poisons.go @@ -16,7 +16,6 @@ Instant Poison: 20% proc chance 60: 130 =/- 18 damage, 11340 ID, 115 charges Deadly Poison: 30% proc chance, 5 stacks -25: 36 damage, 2823 ID, 60 charges (Deadly Brew only) 40: 52 damage, 2824 ID, 75 charges 50: 80 damage, 11355 ID, 90 charges 60: 108 damage, 11356 ID, 105 charges (Rank 4, Rank 5 is by book) @@ -26,23 +25,14 @@ Wound Poison: 30% proc chance, 5 stacks 40: -75 healing, 11325 ID, 75 charges (Rank 2) 50: -105 healing, 13226 ID, 90 charges (Rank 3) 60: -135 healing, 13227 ID, 105 charges (Rank 4) - -Occult Poison: 30% proc chance, 5 stacks -Benefits from all Deadly Poison effects -56: 108 damage, 458821 ID, 30 minute duration (rank 1) - -Sebacious Poison: 30% proc chance, 5 stacks -60: 1700 armor for 15 sec, 105 charges */ -// TODO: Add charges to poisons (not deadly brew) +// TODO: Add charges to poisons type PoisonProcSource int const ( NormalProc PoisonProcSource = iota - ShivProc - DeadlyBrewProc ) func (rogue *Rogue) GetInstantPoisonProcChance() float64 { @@ -73,54 +63,6 @@ func (rogue *Rogue) applyPoisons() { rogue.applyDeadlyPoison() rogue.applyInstantPoison() rogue.applyWoundPoison() - rogue.applyOccultPoison() - rogue.applySebaciousPoison() -} - -// Apply Deadly Brew Instant Poison procs -func (rogue *Rogue) applyDeadlyBrewInstant() { - // apply IP from all weapons w/o IP, DP, or WP applied - procMask := core.ProcMaskMelee - procMask ^= rogue.getImbueProcMask(proto.WeaponImbue_InstantPoison) - procMask ^= rogue.getImbueProcMask(proto.WeaponImbue_DeadlyPoison) - procMask ^= rogue.getImbueProcMask(proto.WeaponImbue_WoundPoison) - - if procMask == core.ProcMaskUnknown { - return - } - - rogue.RegisterAura(core.Aura{ - Label: "Deadly Brew (Instant)", - Duration: core.NeverExpires, - OnReset: func(aura *core.Aura, sim *core.Simulation) { - aura.Activate(sim) - }, - OnSpellHitDealt: func(aura *core.Aura, sim *core.Simulation, spell *core.Spell, result *core.SpellResult) { - if !result.Landed() || !spell.ProcMask.Matches(procMask) { - return - } - if sim.RandomFloat("Instant Poison") < rogue.GetInstantPoisonProcChance() { - rogue.InstantPoison[DeadlyBrewProc].Cast(sim, result.Target) - } - }, - }) -} - -// Apply Deadly Brew Deadly Poison procs -func (rogue *Rogue) applyDeadlyBrewDeadly() { - rogue.RegisterAura(core.Aura{ - Label: "Deadly Brew (Deadly)", - Duration: core.NeverExpires, - OnReset: func(aura *core.Aura, sim *core.Simulation) { - aura.Activate(sim) - }, - OnSpellHitDealt: func(aura *core.Aura, sim *core.Simulation, spell *core.Spell, result *core.SpellResult) { - if !result.Landed() || !spell.Flags.Matches(SpellFlagDeadlyBrewed) { - return - } - rogue.DeadlyPoison[DeadlyBrewProc].Cast(sim, result.Target) - }, - }) } // Apply Instant Poison to weapon and enable procs @@ -142,7 +84,7 @@ func (rogue *Rogue) applyInstantPoison() { } if sim.RandomFloat("Instant Poison") < rogue.GetInstantPoisonProcChance() { - rogue.InstantPoison[NormalProc].Cast(sim, result.Target) + rogue.InstantPoison.Cast(sim, result.Target) } }, }) @@ -166,7 +108,7 @@ func (rogue *Rogue) applyDeadlyPoison() { return } if sim.RandomFloat("Deadly Poison") < rogue.GetDeadlyPoisonProcChance() { - rogue.DeadlyPoison[NormalProc].Cast(sim, result.Target) + rogue.DeadlyPoison.Cast(sim, result.Target) } }, }) @@ -191,70 +133,18 @@ func (rogue *Rogue) applyWoundPoison() { } if sim.RandomFloat("Wound Poison") < rogue.GetWoundPoisonProcChance() { - rogue.WoundPoison[NormalProc].Cast(sim, result.Target) + rogue.WoundPoison.Cast(sim, result.Target) } }, }) } -// Apply Occult Poison to weapon and enable procs -func (rogue *Rogue) applyOccultPoison() { - // procMask := rogue.getImbueProcMask(proto.WeaponImbue_OccultPoison) - // if procMask == core.ProcMaskUnknown { - // return - // } - - // rogue.RegisterAura(core.Aura{ - // Label: "Occult Poison Trigger", - // Duration: core.NeverExpires, - // OnReset: func(aura *core.Aura, sim *core.Simulation) { - // aura.Activate(sim) - // }, - // OnSpellHitDealt: func(aura *core.Aura, sim *core.Simulation, spell *core.Spell, result *core.SpellResult) { - // if !result.Landed() || !spell.ProcMask.Matches(procMask) { - // return - // } - // if sim.RandomFloat("Occult Poison") < rogue.GetDeadlyPoisonProcChance() { - // rogue.OccultPoison.Cast(sim, result.Target) - // } - // }, - // }) -} - -// Apply Occult Poison to weapon and enable procs -func (rogue *Rogue) applySebaciousPoison() { - // procMask := rogue.getImbueProcMask(proto.WeaponImbue_SebaciousPoison) - // if procMask == core.ProcMaskUnknown { - // return - // } - - // rogue.RegisterAura(core.Aura{ - // Label: "Sebacious Poison Trigger", - // Duration: core.NeverExpires, - // OnReset: func(aura *core.Aura, sim *core.Simulation) { - // aura.Activate(sim) - // }, - // OnSpellHitDealt: func(aura *core.Aura, sim *core.Simulation, spell *core.Spell, result *core.SpellResult) { - // if !result.Landed() || !spell.ProcMask.Matches(procMask) { - // return - // } - // if sim.RandomFloat("Sebacious Poison") < rogue.GetDeadlyPoisonProcChance() { - // rogue.OccultPoison.Cast(sim, result.Target) - // } - // }, - // }) -} - /////////////////////////////////////////////////////////////////////////// // Register Poisons /////////////////////////////////////////////////////////////////////////// func (rogue *Rogue) registerInstantPoisonSpell() { - rogue.InstantPoison = [3]*core.Spell{ - rogue.makeInstantPoison(NormalProc), - rogue.makeInstantPoison(ShivProc), - rogue.makeInstantPoison(DeadlyBrewProc), - } + rogue.InstantPoison = rogue.makeInstantPoison() } func (rogue *Rogue) registerDeadlyPoisonSpell() { @@ -271,14 +161,12 @@ func (rogue *Rogue) registerDeadlyPoisonSpell() { 60: 11356, }[rogue.Level] - hasDeadlyBrew := rogue.HasRune(proto.RogueRune_RuneDeadlyBrew) - rogue.deadlyPoisonTick = rogue.RegisterSpell(core.SpellConfig{ ActionID: core.ActionID{SpellID: spellID, Tag: 100}, SpellSchool: core.SpellSchoolNature, DefenseType: core.DefenseTypeMagic, ProcMask: core.ProcMaskSpellDamageProc, - Flags: core.SpellFlagPoison | core.SpellFlagPassiveSpell | SpellFlagRoguePoison | SpellFlagCarnage, + Flags: core.SpellFlagPoison | core.SpellFlagPassiveSpell | SpellFlagRoguePoison, DamageMultiplier: rogue.getPoisonDamageMultiplier(), ThreatMultiplier: 1, @@ -303,10 +191,8 @@ func (rogue *Rogue) registerDeadlyPoisonSpell() { dot.SnapshotAttackerMultiplier = dot.Spell.AttackerDamageMultiplier(attackTable) dot.SnapshotBaseDamage = 0 } - - // each stack snapshots the AP it was applied with - // 3.6% per stack for all ticks, or 0.9% per stack and tick - dot.SnapshotBaseDamage += baseDamageTick + core.TernaryFloat64(hasDeadlyBrew, 0.009*dot.Spell.MeleeAttackPower(), 0) + + dot.SnapshotBaseDamage += baseDamageTick }, OnTick: func(sim *core.Simulation, target *core.Unit, dot *core.Dot) { @@ -315,11 +201,7 @@ func (rogue *Rogue) registerDeadlyPoisonSpell() { }, }) - rogue.DeadlyPoison = [3]*core.Spell{ - rogue.makeDeadlyPoison(NormalProc), - rogue.makeDeadlyPoison(ShivProc), - rogue.makeDeadlyPoison(DeadlyBrewProc), - } + rogue.DeadlyPoison = rogue.makeDeadlyPoison() } func (rogue *Rogue) registerWoundPoisonSpell() { @@ -339,75 +221,7 @@ func (rogue *Rogue) registerWoundPoisonSpell() { rogue.woundPoisonDebuffAuras = rogue.NewEnemyAuraArray(func(target *core.Unit, level int32) *core.Aura { return target.RegisterAura(woundPoisonDebuffAura) }) - rogue.WoundPoison = [2]*core.Spell{ - rogue.makeWoundPoison(NormalProc), - rogue.makeWoundPoison(ShivProc), - } -} - -func (rogue *Rogue) registerOccultPoisonSpell() { - if rogue.Level < 56 { - return - } - - // baseDamageTick := map[int32]float64{ - // 60: 27, - // }[rogue.Level] - // spellID := map[int32]int32{ - // 60: 458822, - // }[rogue.Level] - - // hasDeadlyBrew := rogue.HasRune(proto.RogueRune_RuneDeadlyBrew) - - // rogue.occultPoisonTick = rogue.RegisterSpell(core.SpellConfig{ - // ActionID: core.ActionID{SpellID: spellID, Tag: 100}, - // SpellSchool: core.SpellSchoolNature, - // DefenseType: core.DefenseTypeMagic, - // ProcMask: core.ProcMaskSpellDamageProc, - // Flags: SpellFlagCarnage | core.SpellFlagPoison | SpellFlagRoguePoison, - - // DamageMultiplier: rogue.getPoisonDamageMultiplier(), - // ThreatMultiplier: 1, - - // Dot: core.DotConfig{ - // Aura: core.Aura{ - // Label: "OccultPoison", - // MaxStacks: 5, - // Duration: time.Second * 12, - // }, - // NumberOfTicks: 4, - // TickLength: time.Second * 3, - - // OnSnapshot: func(sim *core.Simulation, target *core.Unit, dot *core.Dot, applyStack bool) { - // if !applyStack { - // return - // } - - // // only the first stack snapshots the multiplier - // if dot.GetStacks() == 1 { - // attackTable := dot.Spell.Unit.AttackTables[target.UnitIndex][dot.Spell.CastType] - // dot.SnapshotAttackerMultiplier = dot.Spell.AttackerDamageMultiplier(attackTable) - // dot.SnapshotBaseDamage = 0 - // } - - // // each stack snapshots the AP it was applied with - // // 3.6% per stack for all ticks, or 0.9% per stack and tick - // dot.SnapshotBaseDamage += baseDamageTick + core.TernaryFloat64(hasDeadlyBrew, 0.009*dot.Spell.MeleeAttackPower(), 0) - // }, - - // OnTick: func(sim *core.Simulation, target *core.Unit, dot *core.Dot) { - // dot.CalcAndDealPeriodicSnapshotDamage(sim, target, dot.OutcomeTick) - // }, - // }, - // }) - - // rogue.OccultPoison = -} - -func (rogue *Rogue) registerSebaciousPoisonSpell() { - if rogue.Level < 60 { - return - } + rogue.WoundPoison = rogue.makeWoundPoison() } /////////////////////////////////////////////////////////////////////////// @@ -415,7 +229,7 @@ func (rogue *Rogue) registerSebaciousPoisonSpell() { /////////////////////////////////////////////////////////////////////////// // Make a source based variant of Instant Poison -func (rogue *Rogue) makeInstantPoison(procSource PoisonProcSource) *core.Spell { +func (rogue *Rogue) makeInstantPoison() *core.Spell { baseDamageByLevel := map[int32]float64{ 25: 19, 40: 44, @@ -437,33 +251,27 @@ func (rogue *Rogue) makeInstantPoison(procSource PoisonProcSource) *core.Spell { 60: 11340, }[rogue.Level] - hasDeadlyBrew := rogue.HasRune(proto.RogueRune_RuneDeadlyBrew) - return rogue.RegisterSpell(core.SpellConfig{ - ActionID: core.ActionID{SpellID: spellID, Tag: int32(procSource)}, + ActionID: core.ActionID{SpellID: spellID}, SpellSchool: core.SpellSchoolNature, DefenseType: core.DefenseTypeMagic, ProcMask: core.ProcMaskSpellDamageProc, - Flags: core.SpellFlagPoison | core.SpellFlagPassiveSpell | SpellFlagDeadlyBrewed | SpellFlagCarnage | SpellFlagRoguePoison, + Flags: core.SpellFlagPoison | core.SpellFlagPassiveSpell | SpellFlagRoguePoison, DamageMultiplier: rogue.getPoisonDamageMultiplier(), ThreatMultiplier: 1, - BonusHitRating: core.TernaryFloat64(procSource == ShivProc, 100*core.SpellHitRatingPerHitChance, 0), - ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) { - baseDamage := sim.Roll(baseDamageByLevel, baseDamageByLevel+damageVariance) + core.TernaryFloat64(hasDeadlyBrew, 0.03*spell.MeleeAttackPower(), 0) + baseDamage := sim.Roll(baseDamageByLevel, baseDamageByLevel+damageVariance) spell.CalcAndDealDamage(sim, target, baseDamage, spell.OutcomeMagicHitAndCrit) }, }) } -func (rogue *Rogue) makeDeadlyPoison(procSource PoisonProcSource) *core.Spell { +func (rogue *Rogue) makeDeadlyPoison() *core.Spell { return rogue.RegisterSpell(core.SpellConfig{ - ActionID: core.ActionID{SpellID: rogue.deadlyPoisonTick.SpellID, Tag: int32(procSource)}, - Flags: core.Ternary(procSource == DeadlyBrewProc, core.SpellFlagNone, SpellFlagDeadlyBrewed), - - BonusHitRating: core.TernaryFloat64(procSource == ShivProc, 100*core.SpellHitRatingPerHitChance, 0), + ActionID: core.ActionID{SpellID: rogue.deadlyPoisonTick.SpellID}, + Flags: core.SpellFlagPoison | core.SpellFlagPassiveSpell | SpellFlagRoguePoison, ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) { result := spell.CalcAndDealOutcome(sim, target, spell.OutcomeMagicHit) @@ -485,19 +293,17 @@ func (rogue *Rogue) makeDeadlyPoison(procSource PoisonProcSource) *core.Spell { } // Make a source based variant of Wound Poison -func (rogue *Rogue) makeWoundPoison(procSource PoisonProcSource) *core.Spell { +func (rogue *Rogue) makeWoundPoison() *core.Spell { return rogue.RegisterSpell(core.SpellConfig{ - ActionID: core.ActionID{SpellID: 13219, Tag: int32(procSource)}, + ActionID: core.ActionID{SpellID: 13219}, SpellSchool: core.SpellSchoolNature, DefenseType: core.DefenseTypeMagic, ProcMask: core.ProcMaskSpellDamageProc, - Flags: core.SpellFlagPoison | core.SpellFlagPassiveSpell | SpellFlagDeadlyBrewed | SpellFlagRoguePoison, + Flags: core.SpellFlagPoison | core.SpellFlagPassiveSpell | SpellFlagRoguePoison, DamageMultiplier: rogue.getPoisonDamageMultiplier(), ThreatMultiplier: 1, - BonusHitRating: core.TernaryFloat64(procSource == ShivProc, 100*core.SpellHitRatingPerHitChance, 0), - ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) { result := spell.CalcAndDealOutcome(sim, target, spell.OutcomeMagicHit) diff --git a/sim/rogue/riposte.go b/sim/rogue/riposte.go index 5718561f5..8faab2e55 100644 --- a/sim/rogue/riposte.go +++ b/sim/rogue/riposte.go @@ -18,7 +18,7 @@ func (rogue *Rogue) applyRiposte() { SpellSchool: core.SpellSchoolPhysical, DefenseType: core.DefenseTypeMelee, ProcMask: core.ProcMaskMeleeMHSpecial, - Flags: SpellFlagCarnage | core.SpellFlagMeleeMetrics | core.SpellFlagAPL, + Flags: core.SpellFlagMeleeMetrics | core.SpellFlagAPL, EnergyCost: core.EnergyCostOptions{ Cost: 10, diff --git a/sim/rogue/rogue.go b/sim/rogue/rogue.go index dbf936712..5c31f4fae 100644 --- a/sim/rogue/rogue.go +++ b/sim/rogue/rogue.go @@ -23,23 +23,13 @@ const ( SpellCode_RogueAmbush SpellCode_RogueAdrenalineRush SpellCode_RogueBackstab - SpellCode_RogueBetweentheEyes - SpellCode_RogueBladeDance SpellCode_RogueBladeFlurry - SpellCode_RogueCrimsonTempest - SpellCode_RogueEnvenom SpellCode_RogueEviscerate SpellCode_RogueExposeArmor SpellCode_RogueGarrote SpellCode_RogueGhostlyStrike SpellCode_RogueHemorrhage - SpellCode_RogueMainGauche - SpellCode_RogueMutilate - SpellCode_RoguePoisonedKnife SpellCode_RogueRupture - SpellCode_RogueSaberSlash - SpellCode_RogueSaberSlashDoT - SpellCode_RogueShadowStrike SpellCode_RogueSinisterStrike SpellCode_RogueSliceandDice ) @@ -55,7 +45,6 @@ type Rogue struct { Options *proto.RogueOptions sliceAndDiceDurations [6]time.Duration - bladeDanceDurations [6]time.Duration AdrenalineRush *core.Spell Backstab *core.Spell @@ -65,31 +54,13 @@ type Rogue struct { Ambush *core.Spell Hemorrhage *core.Spell GhostlyStrike *core.Spell - HungerForBlood *core.Spell - Mutilate *core.Spell - MutilateMH *core.Spell - MutilateOH *core.Spell - Shiv *core.Spell SinisterStrike *core.Spell - SaberSlash *core.Spell - saberSlashTick *core.Spell - MainGauche *core.Spell Shadowstep *core.Spell Preparation *core.Spell Premeditation *core.Spell ColdBlood *core.Spell Vanish *core.Spell - Shadowstrike *core.Spell - QuickDraw *core.Spell - ShurikenToss *core.Spell - BetweenTheEyes *core.Spell - PoisonedKnife *core.Spell - Blunderbuss *core.Spell - FanOfKnives *core.Spell - CrimsonTempest *core.Spell - CrimsonTempestBleed *core.Spell - - Envenom *core.Spell + Eviscerate *core.Spell ExposeArmor *core.Spell Rupture *core.Spell @@ -97,38 +68,23 @@ type Rogue struct { Finishers []*core.Spell Evasion *core.Spell - BladeDance *core.Spell - DeadlyPoison [3]*core.Spell + DeadlyPoison *core.Spell deadlyPoisonTick *core.Spell - InstantPoison [3]*core.Spell - WoundPoison [2]*core.Spell - OccultPoison *core.Spell - occultPoisonTick *core.Spell + InstantPoison *core.Spell + WoundPoison *core.Spell instantPoisonProcChanceBonus float64 additivePoisonBonusChance float64 - cutthroatBonusChance float64 AdrenalineRushAura *core.Aura BladeFlurryAura *core.Aura - EnvenomAura *core.Aura ExposeArmorAuras core.AuraArray EvasionAura *core.Aura - BladeDanceAura *core.Aura SliceAndDiceAura *core.Aura - MasterOfSubtletyAura *core.Aura - ShadowstepAura *core.Aura - ShadowDanceAura *core.Aura StealthAura *core.Aura - WaylayAuras core.AuraArray - RollingWithThePunchesAura *core.Aura - RollingWithThePunchesProcAura *core.Aura - CutthroatProcAura *core.Aura VanishAura *core.Aura - HonorAmongThieves *core.Aura - woundPoisonDebuffAuras core.AuraArray } @@ -144,11 +100,11 @@ func (rogue *Rogue) AddRaidBuffs(_ *proto.RaidBuffs) {} func (rogue *Rogue) AddPartyBuffs(_ *proto.PartyBuffs) {} func (rogue *Rogue) finisherFlags() core.SpellFlag { - return SpellFlagCarnage | core.SpellFlagMeleeMetrics | core.SpellFlagAPL + return core.SpellFlagMeleeMetrics | core.SpellFlagAPL } func (rogue *Rogue) builderFlags() core.SpellFlag { - return SpellFlagBuilder | SpellFlagColdBlooded | SpellFlagCarnage | core.SpellFlagMeleeMetrics | core.SpellFlagAPL + return SpellFlagBuilder | SpellFlagColdBlooded | core.SpellFlagMeleeMetrics | core.SpellFlagAPL } func (rogue *Rogue) Initialize() { @@ -167,9 +123,7 @@ func (rogue *Rogue) Initialize() { // Poisons rogue.registerInstantPoisonSpell() rogue.registerDeadlyPoisonSpell() - rogue.registerOccultPoisonSpell() rogue.registerWoundPoisonSpell() - rogue.registerSebaciousPoisonSpell() // Stealth rogue.registerStealthAura() @@ -250,18 +204,6 @@ type RogueAgent interface { GetRogue() *Rogue } -func (rogue *Rogue) HasRune(rune proto.RogueRune) bool { - return false // rogue.HasRuneById(int32(rune)) -} - -func (rogue *Rogue) baseRuneAbilityDamage() float64 { - return 5.741530 - 0.255683*float64(rogue.Level) + 0.032656*float64(rogue.Level*rogue.Level) -} - -func (rogue *Rogue) baseRuneAbilityDamageCombo() float64 { - return 8.740728 - 0.415787*float64(rogue.Level) + 0.051973*float64(rogue.Level*rogue.Level) -} - func (rogue *Rogue) getImbueProcMask(imbue proto.WeaponImbue) core.ProcMask { var mask core.ProcMask if rogue.HasMHWeapon() && rogue.Consumes.MainHandImbue == imbue { diff --git a/sim/rogue/sinister_strike.go b/sim/rogue/sinister_strike.go index e89b1177e..a87dbf827 100644 --- a/sim/rogue/sinister_strike.go +++ b/sim/rogue/sinister_strike.go @@ -4,11 +4,9 @@ import ( "time" "github.com/wowsims/classic/sim/core" - "github.com/wowsims/classic/sim/core/proto" ) func (rogue *Rogue) registerSinisterStrikeSpell() { - hasSaberSlash := rogue.HasRune(proto.RogueRune_RuneSaberSlash) flatDamageBonus := map[int32]float64{ 25: 15, @@ -52,18 +50,9 @@ func (rogue *Rogue) registerSinisterStrikeSpell() { ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) { rogue.BreakStealth(sim) - oldMultiplier := spell.DamageMultiplier - if hasSaberSlash { - if dot := rogue.saberSlashTick.Dot(target); dot.IsActive() { - spell.DamageMultiplier *= rogue.saberSlashMultiplier(dot.GetStacks()) - } - } - baseDamage := flatDamageBonus + spell.Unit.MHNormalizedWeaponDamage(sim, spell.MeleeAttackPower()) result := spell.CalcAndDealDamage(sim, target, baseDamage, spell.OutcomeMeleeWeaponSpecialHitAndCrit) - spell.DamageMultiplier = oldMultiplier - if result.Landed() { rogue.AddComboPoints(sim, 1, target, spell.ComboPointMetrics()) } else { diff --git a/sim/rogue/stealth.go b/sim/rogue/stealth.go index 0d2152391..579fdfa64 100644 --- a/sim/rogue/stealth.go +++ b/sim/rogue/stealth.go @@ -2,27 +2,17 @@ package rogue import ( "github.com/wowsims/classic/sim/core" - "github.com/wowsims/classic/sim/core/proto" ) func (rogue *Rogue) registerStealthAura() { - // TODO: Add Stealth spell for use with prepull in APL rogue.StealthAura = rogue.RegisterAura(core.Aura{ Label: "Stealth", ActionID: core.ActionID{SpellID: 1787}, Duration: core.NeverExpires, OnGain: func(aura *core.Aura, sim *core.Simulation) { // Stealth triggered auras - if rogue.HasRune(proto.RogueRune_RuneMasterOfSubtlety) { - rogue.MasterOfSubtletyAura.Activate(sim) - } }, OnExpire: func(aura *core.Aura, sim *core.Simulation) { - if rogue.HasRune(proto.RogueRune_RuneMasterOfSubtlety) { - // Refresh aura to have a duration as it should out of stealth - rogue.MasterOfSubtletyAura.Deactivate(sim) - rogue.MasterOfSubtletyAura.Activate(sim) - } }, // Stealth breaks on damage taken (if not absorbed) // This may be desirable later, but not applicable currently diff --git a/sim/rogue/talents.go b/sim/rogue/talents.go index ee273a1b7..1206536d0 100644 --- a/sim/rogue/talents.go +++ b/sim/rogue/talents.go @@ -118,8 +118,7 @@ func (rogue *Rogue) registerColdBloodCD() { } }, OnSpellHitDealt: func(aura *core.Aura, sim *core.Simulation, spell *core.Spell, result *core.SpellResult) { - // deactivate after use, but for MutilateMH, so MutilateOH is cold-blooded as well - if spell.Flags.Matches(SpellFlagColdBlooded) && spell != rogue.MutilateMH { + if spell.Flags.Matches(SpellFlagColdBlooded) { aura.Deactivate(sim) } }, @@ -313,18 +312,11 @@ func (rogue *Rogue) registerBladeFlurryCD() { rogue.MultiplyMeleeSpeed(sim, 1/1.2) }, OnSpellHitDealt: func(aura *core.Aura, sim *core.Simulation, spell *core.Spell, result *core.SpellResult) { - bfEligible := true - - //Checks for FoK Offhand and 2P TAQ Set Piece Extra Hits. - if (spell.ActionID.SpellID == 409240 && spell.ActionID.Tag == 2) || spell.ActionID.SpellID == 1213754 { - bfEligible = false - } - if sim.GetNumTargets() < 2 { return } - if result.Damage == 0 || !spell.ProcMask.Matches(core.ProcMaskMelee) || !bfEligible { + if result.Damage == 0 || !spell.ProcMask.Matches(core.ProcMaskMelee) { return } diff --git a/sim/rogue/vanish.go b/sim/rogue/vanish.go index f4acac8e6..255bdc9eb 100644 --- a/sim/rogue/vanish.go +++ b/sim/rogue/vanish.go @@ -12,10 +12,8 @@ func (rogue *Rogue) registerVanishSpell() { ActionID: core.ActionID{SpellID: 457437}, Duration: time.Second * 10, OnGain: func(aura *core.Aura, sim *core.Simulation) { - rogue.PseudoStats.SchoolDamageTakenMultiplier.MultiplyMagicSchools(0.5) }, OnExpire: func(aura *core.Aura, sim *core.Simulation) { - rogue.PseudoStats.SchoolDamageTakenMultiplier.MultiplyMagicSchools(1 / 0.5) }, }) @@ -42,9 +40,9 @@ func (rogue *Rogue) registerVanishSpell() { }, }) - rogue.AddMajorCooldown(core.MajorCooldown{ - Spell: rogue.Vanish, - Type: core.CooldownTypeDPS, - Priority: core.CooldownPriorityDrums, - }) +// rogue.AddMajorCooldown(core.MajorCooldown{ +// Spell: rogue.Vanish, +// Type: core.CooldownTypeDPS, +// Priority: core.CooldownPriorityDrums, +// }) } diff --git a/ui/rogue/inputs.ts b/ui/rogue/inputs.ts index b18da189f..91c67c4bd 100644 --- a/ui/rogue/inputs.ts +++ b/ui/rogue/inputs.ts @@ -1,8 +1,6 @@ import * as InputHelpers from '../core/components/input_helpers.js'; import { Player } from '../core/player.js'; import { ItemSlot, Spec } from '../core/proto/common.js'; -import { RogueRune } from '../core/proto/rogue.js'; - // Configuration for spec-specific UI elements on the settings tab. // These don't need to be in a separate file but it keeps things cleaner. @@ -11,4 +9,4 @@ export const HonorOfThievesCritRate = InputHelpers.makeSpecOptionsNumberInput Date: Thu, 21 Nov 2024 22:39:09 -0700 Subject: [PATCH 2/2] Round 2 --- proto/rogue.proto | 2 +- sim/rogue/_between_the_eyes.go | 75 ------- sim/rogue/_blunderbuss.go | 62 ------ sim/rogue/_carnage.go | 60 ----- sim/rogue/_crimson_tempest.go | 100 --------- sim/rogue/_envenom.go | 95 -------- sim/rogue/_fan_of_knives.go | 84 ------- sim/rogue/_main_gauche.go | 114 ---------- sim/rogue/_master_of_subtlety.go | 31 --- sim/rogue/_mutilate.go | 108 --------- sim/rogue/_poisoned_knife.go | 84 ------- sim/rogue/_quick_draw.go | 79 ------- sim/rogue/_runes.go | 367 ------------------------------- sim/rogue/_saber_slash.go | 116 ---------- sim/rogue/_shadowstep.go | 39 ---- sim/rogue/_shadowstrike.go | 56 ----- sim/rogue/_shuriken_toss.go | 64 ------ sim/rogue/_unfair_advantage.go | 55 ----- sim/rogue/_waylay.go | 15 -- sim/rogue/garrote.go | 1 - sim/rogue/rogue.go | 2 - sim/rogue/rupture.go | 1 - sim/rogue/vanish.go | 8 +- ui/rogue/inputs.ts | 6 - ui/rogue/presets.ts | 14 +- ui/rogue/sim.ts | 31 +-- ui/tank_rogue/inputs.ts | 8 - ui/tank_rogue/sim.ts | 8 +- 28 files changed, 23 insertions(+), 1662 deletions(-) delete mode 100644 sim/rogue/_between_the_eyes.go delete mode 100644 sim/rogue/_blunderbuss.go delete mode 100644 sim/rogue/_carnage.go delete mode 100644 sim/rogue/_crimson_tempest.go delete mode 100644 sim/rogue/_envenom.go delete mode 100644 sim/rogue/_fan_of_knives.go delete mode 100644 sim/rogue/_main_gauche.go delete mode 100644 sim/rogue/_master_of_subtlety.go delete mode 100644 sim/rogue/_mutilate.go delete mode 100644 sim/rogue/_poisoned_knife.go delete mode 100644 sim/rogue/_quick_draw.go delete mode 100644 sim/rogue/_runes.go delete mode 100644 sim/rogue/_saber_slash.go delete mode 100644 sim/rogue/_shadowstep.go delete mode 100644 sim/rogue/_shadowstrike.go delete mode 100644 sim/rogue/_shuriken_toss.go delete mode 100644 sim/rogue/_unfair_advantage.go delete mode 100644 sim/rogue/_waylay.go diff --git a/proto/rogue.proto b/proto/rogue.proto index 3b10d5fbe..70632219f 100644 --- a/proto/rogue.proto +++ b/proto/rogue.proto @@ -63,7 +63,7 @@ message RogueTalents { } message RogueOptions { - int32 HonorAmongThievesCritRate = 1; + } message Rogue { diff --git a/sim/rogue/_between_the_eyes.go b/sim/rogue/_between_the_eyes.go deleted file mode 100644 index 4dbf65a02..000000000 --- a/sim/rogue/_between_the_eyes.go +++ /dev/null @@ -1,75 +0,0 @@ -package rogue - -import ( - "time" - - "github.com/wowsims/classic/sim/core" - "github.com/wowsims/classic/sim/core/proto" -) - -func (rogue *Rogue) registerBetweenTheEyes() { - if !rogue.HasRune(proto.RogueRune_RuneBetweenTheEyes) { - return - } - - flatDamage := rogue.baseRuneAbilityDamage() - comboDamageBonus := rogue.baseRuneAbilityDamageCombo() - - rogue.BetweenTheEyes = rogue.RegisterSpell(core.SpellConfig{ - SpellCode: SpellCode_RogueBetweentheEyes, - ActionID: core.ActionID{SpellID: int32(proto.RogueRune_RuneBetweenTheEyes)}, - SpellSchool: core.SpellSchoolPhysical, - DefenseType: core.DefenseTypeRanged, - ProcMask: core.ProcMaskRangedSpecial, - Flags: rogue.finisherFlags(), - MetricSplits: 6, - - EnergyCost: core.EnergyCostOptions{ - Cost: 35, - Refund: 0, - }, - Cast: core.CastConfig{ - DefaultCast: core.Cast{ - GCD: time.Second, - }, - CD: core.Cooldown{ - Timer: rogue.NewTimer(), - Duration: time.Second * 20, - }, - IgnoreHaste: true, - ModifyCast: func(sim *core.Simulation, spell *core.Spell, cast *core.Cast) { - spell.SetMetricsSplit(spell.Unit.ComboPoints()) - }, - }, - ExtraCastCondition: func(sim *core.Simulation, target *core.Unit) bool { - return rogue.ComboPoints() > 0 - }, - - DamageMultiplier: 1, - ThreatMultiplier: 1, - BonusCoefficient: 1, - - ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) { - rogue.BreakStealth(sim) - - comboPoints := rogue.ComboPoints() - flatBaseDamage := flatDamage + comboDamageBonus*float64(comboPoints) - variableDamage := sim.Roll(flatBaseDamage*0.53, flatBaseDamage*0.81) - - // TODO: test combo point AP scaling. Also, does BTE use Melee or Ranged Attack Power? - baseDamage := variableDamage + - 0.03*float64(comboPoints)*spell.MeleeAttackPower() - - result := spell.CalcDamage(sim, target, baseDamage, spell.OutcomeRangedHitAndCrit) - - if result.Landed() { - rogue.SpendComboPoints(sim, spell) - } else { - spell.IssueRefund(sim) - } - - spell.DealDamage(sim, result) - }, - }) - rogue.Finishers = append(rogue.Finishers, rogue.BetweenTheEyes) -} diff --git a/sim/rogue/_blunderbuss.go b/sim/rogue/_blunderbuss.go deleted file mode 100644 index 8f4b34046..000000000 --- a/sim/rogue/_blunderbuss.go +++ /dev/null @@ -1,62 +0,0 @@ -package rogue - -import ( - "time" - - "github.com/wowsims/classic/sim/core" - "github.com/wowsims/classic/sim/core/proto" -) - -// TODO: 10 yd range -func (rogue *Rogue) registerBlunderbussSpell() { - if !rogue.HasRune(proto.RogueRune_RuneBlunderbuss) { - return - } - - results := make([]*core.SpellResult, min(4, rogue.Env.GetNumTargets())) - - rogue.Blunderbuss = rogue.RegisterSpell(core.SpellConfig{ - ActionID: core.ActionID{SpellID: 436564}, - SpellSchool: core.SpellSchoolPhysical, - DefenseType: core.DefenseTypeRanged, - ProcMask: core.ProcMaskRangedSpecial, - Flags: core.SpellFlagMeleeMetrics | core.SpellFlagAPL | SpellFlagCarnage, - - EnergyCost: core.EnergyCostOptions{ - Cost: 20, - Refund: 0, - }, - Cast: core.CastConfig{ - DefaultCast: core.Cast{ - GCD: time.Second, - }, - CD: core.Cooldown{ - Timer: rogue.NewTimer(), - Duration: time.Second * 15, - }, - IgnoreHaste: true, - }, - - DamageMultiplier: 1, - ThreatMultiplier: 2, - - ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) { - rogue.BreakStealth(sim) - baseApDamage := spell.MeleeAttackPower() * 0.48 - - for idx := range results { - results[idx] = spell.CalcDamage(sim, target, rogue.rollBlunderbussDamage(sim)+baseApDamage, spell.OutcomeRangedHitAndCrit) - target = sim.Environment.NextTargetUnit(target) - } - - for _, result := range results { - spell.DealDamage(sim, result) - } - }, - }) -} - -func (rogue *Rogue) rollBlunderbussDamage(sim *core.Simulation) float64 { - baseDamage := rogue.baseRuneAbilityDamage() - return sim.Roll(baseDamage*1.92, baseDamage*2.88) -} diff --git a/sim/rogue/_carnage.go b/sim/rogue/_carnage.go deleted file mode 100644 index 704a9fb7e..000000000 --- a/sim/rogue/_carnage.go +++ /dev/null @@ -1,60 +0,0 @@ -package rogue - -import ( - "math" - - "github.com/wowsims/classic/sim/core" - "github.com/wowsims/classic/sim/core/proto" -) - -func carnageMultiplier(spell *core.Spell, _ *core.AttackTable) float64 { - return core.TernaryFloat64(spell.Flags.Matches(SpellFlagCarnage), 1.08, 1) -} - -func (rogue *Rogue) applyCarnage() { - if !rogue.HasRune(proto.RogueRune_RuneCarnage) { - return - } - - var carnageAuras core.AuraArray - - carnageAura := core.Aura{ - Label: "Carnage", - ActionID: core.ActionID{SpellID: int32(proto.RogueRune_RuneCarnage)}, - Duration: core.NeverExpires, - MaxStacks: math.MaxInt32, - - OnInit: func(aura *core.Aura, sim *core.Simulation) { - for _, bleedAura := range aura.Unit.GetAurasWithTag(RogueBleedTag) { - bleedAura.ApplyOnGain(func(aura *core.Aura, sim *core.Simulation) { - ca := carnageAuras[bleedAura.Unit.UnitIndex] - ca.Activate(sim) - ca.AddStack(sim) - }) - - bleedAura.ApplyOnExpire(func(aura *core.Aura, sim *core.Simulation) { - ca := carnageAuras[bleedAura.Unit.UnitIndex] - if ca.IsActive() { // carnage aura might already be expired by doneIteration - ca.RemoveStack(sim) - } - }) - } - }, - - OnGain: func(aura *core.Aura, sim *core.Simulation) { - for _, at := range rogue.AttackTables[aura.Unit.UnitIndex] { - at.DamageDoneByCasterMultiplier = carnageMultiplier - } - }, - - OnExpire: func(aura *core.Aura, sim *core.Simulation) { - for _, at := range rogue.AttackTables[aura.Unit.UnitIndex] { - at.DamageDoneByCasterMultiplier = nil - } - }, - } - - carnageAuras = rogue.NewEnemyAuraArray(func(target *core.Unit, level int32) *core.Aura { - return target.RegisterAura(carnageAura) - }) -} diff --git a/sim/rogue/_crimson_tempest.go b/sim/rogue/_crimson_tempest.go deleted file mode 100644 index a624dd27c..000000000 --- a/sim/rogue/_crimson_tempest.go +++ /dev/null @@ -1,100 +0,0 @@ -package rogue - -import ( - "time" - - "github.com/wowsims/classic/sim/core" - "github.com/wowsims/classic/sim/core/proto" - "github.com/wowsims/classic/sim/core/stats" -) - -func (rogue *Rogue) makeCrimsonTempestHitSpell() *core.Spell { - actionID := core.ActionID{SpellID: 436611} - procMask := core.ProcMaskMeleeMHSpecial - - return rogue.RegisterSpell(core.SpellConfig{ - ActionID: actionID, - SpellSchool: core.SpellSchoolPhysical, - DefenseType: core.DefenseTypeMelee, - ProcMask: procMask, - Flags: core.SpellFlagMeleeMetrics | SpellFlagCarnage, - - DamageMultiplier: []float64{1, 1.1, 1.2, 1.3}[rogue.Talents.SerratedBlades], - ThreatMultiplier: 1, - - Dot: core.DotConfig{ - Aura: core.Aura{ - Label: "Crimson Tempest", - Tag: RogueBleedTag, - }, - NumberOfTicks: 0, - TickLength: time.Second * 2, - - OnSnapshot: func(sim *core.Simulation, target *core.Unit, dot *core.Dot, isRollover bool) { - dot.Snapshot(target, rogue.CrimsonTempestDamage(rogue.ComboPoints()), isRollover) - }, - OnTick: func(sim *core.Simulation, target *core.Unit, dot *core.Dot) { - dot.CalcAndDealPeriodicSnapshotDamage(sim, target, dot.OutcomeTick) - }, - }, - - ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) { - result := spell.CalcOutcome(sim, target, spell.OutcomeMeleeSpecialHitNoHitCounter) - if result.Landed() { - dot := spell.Dot(target) - dot.Spell = spell - dot.NumberOfTicks = rogue.ComboPoints() + 1 - dot.Apply(sim) - } - spell.DealOutcome(sim, result) - }, - }) -} - -// TODO: Currently bugged and creates "infite loop detected" warning -func (rogue *Rogue) registerCrimsonTempestSpell() { - if !rogue.HasRune(proto.RogueRune_RuneCrimsonTempest) { - return - } - - // Must be updated to match combo points spent - rogue.CrimsonTempestBleed = rogue.makeCrimsonTempestHitSpell() - - rogue.CrimsonTempest = rogue.RegisterSpell(core.SpellConfig{ - SpellCode: SpellCode_RogueCrimsonTempest, - ActionID: core.ActionID{SpellID: 412096}, - SpellSchool: core.SpellSchoolPhysical, - DefenseType: core.DefenseTypeMelee, - ProcMask: core.ProcMaskMeleeMHSpecial, - Flags: rogue.finisherFlags(), - MetricSplits: 6, - - EnergyCost: core.EnergyCostOptions{ - Cost: 35, - Refund: 0, - }, - Cast: core.CastConfig{ - DefaultCast: core.Cast{ - GCD: time.Second, - }, - IgnoreHaste: true, - }, - - ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) { - rogue.BreakStealth(sim) - - for _, aoeTarget := range sim.Encounter.TargetUnits { - rogue.CrimsonTempestBleed.Cast(sim, aoeTarget) - } - - rogue.SpendComboPoints(sim, spell) - }, - }) - rogue.Finishers = append(rogue.Finishers, rogue.CrimsonTempest) -} - -func (rogue *Rogue) CrimsonTempestDamage(comboPoints int32) float64 { - tickDamageValues := []float64{0, 0.3, 0.45, 0.6, 0.75, 0.9} - tickDamage := tickDamageValues[comboPoints] * rogue.GetStat(stats.AttackPower) / float64(comboPoints+1) - return tickDamage -} diff --git a/sim/rogue/_envenom.go b/sim/rogue/_envenom.go deleted file mode 100644 index 5c4db56c6..000000000 --- a/sim/rogue/_envenom.go +++ /dev/null @@ -1,95 +0,0 @@ -package rogue - -import ( - "time" - - "github.com/wowsims/classic/sim/core" - "github.com/wowsims/classic/sim/core/proto" -) - -func (rogue *Rogue) registerEnvenom() { - if !rogue.HasRune(proto.RogueRune_RuneEnvenom) { - return - } - - baseAbilityDamage := rogue.baseRuneAbilityDamage() - - cutToTheChase := rogue.HasRune(proto.RogueRune_RuneCutToTheChase) - - rogue.EnvenomAura = rogue.RegisterAura(core.Aura{ - Label: "Envenom", - ActionID: core.ActionID{SpellID: int32(proto.RogueRune_RuneEnvenom)}, - OnGain: func(aura *core.Aura, sim *core.Simulation) { - rogue.instantPoisonProcChanceBonus += 0.75 - }, - OnExpire: func(aura *core.Aura, sim *core.Simulation) { - rogue.instantPoisonProcChanceBonus -= 0.75 - }, - }) - - rogue.Envenom = rogue.RegisterSpell(core.SpellConfig{ - SpellCode: SpellCode_RogueEnvenom, - ActionID: core.ActionID{SpellID: int32(proto.RogueRune_RuneEnvenom)}, - SpellSchool: core.SpellSchoolNature, - DefenseType: core.DefenseTypeMelee, - ProcMask: core.ProcMaskMeleeMHSpecial, - Flags: rogue.finisherFlags() | SpellFlagColdBlooded | core.SpellFlagIgnoreResists | core.SpellFlagPoison, - MetricSplits: 6, - - EnergyCost: core.EnergyCostOptions{ - Cost: 35, - Refund: 0, - }, - Cast: core.CastConfig{ - DefaultCast: core.Cast{ - GCD: time.Second, - }, - IgnoreHaste: true, - ModifyCast: func(sim *core.Simulation, spell *core.Spell, cast *core.Cast) { - spell.SetMetricsSplit(spell.Unit.ComboPoints()) - }, - }, - ExtraCastCondition: func(sim *core.Simulation, target *core.Unit) bool { - return rogue.ComboPoints() > 0 && rogue.deadlyPoisonTick.Dot(target).IsActive() - }, - - DamageMultiplier: rogue.getPoisonDamageMultiplier(), - ThreatMultiplier: 1, - BonusCoefficient: 0, - - ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) { - rogue.BreakStealth(sim) - comboPoints := rogue.ComboPoints() - // - the aura is active even if the attack fails to land - // - the aura is applied before the hit effect - // See: https://github.com/where-fore/rogue-wotlk/issues/32 - // Still true in SoD - rogue.EnvenomAura.Duration = rogue.EnvenomDuration(rogue.ComboPoints()) - rogue.EnvenomAura.Activate(sim) - - dp := rogue.deadlyPoisonTick.Dot(target) - // - base damage is scaled by consumed doses (<= comboPoints) - // - apRatio is scaled of lowest of cp or dp (== comboPoints) - consumed := min(dp.GetStacks(), comboPoints) - baseDamage := baseAbilityDamage*float64(consumed)*0.8 + 0.072*float64(consumed)*spell.MeleeAttackPower() - - result := spell.CalcDamage(sim, target, baseDamage, spell.OutcomeMeleeSpecialHitAndCrit) - - if result.Landed() { - rogue.SpendComboPoints(sim, spell) - if cutToTheChase { - rogue.ApplyCutToTheChase(sim) - } - } else { - spell.IssueRefund(sim) - } - - spell.DealDamage(sim, result) - }, - }) - rogue.Finishers = append(rogue.Finishers, rogue.Envenom) -} - -func (rogue *Rogue) EnvenomDuration(comboPoints int32) time.Duration { - return time.Second * (1 + time.Duration(comboPoints)) -} diff --git a/sim/rogue/_fan_of_knives.go b/sim/rogue/_fan_of_knives.go deleted file mode 100644 index 510c0775d..000000000 --- a/sim/rogue/_fan_of_knives.go +++ /dev/null @@ -1,84 +0,0 @@ -package rogue - -import ( - "time" - - "github.com/wowsims/classic/sim/core" - "github.com/wowsims/classic/sim/core/proto" -) - -const FanOfKnivesSpellID int32 = 409240 - -func (rogue *Rogue) makeFanOfKnivesWeaponHitSpell(isMH bool) *core.Spell { - actionID := core.ActionID{SpellID: FanOfKnivesSpellID}.WithTag(1) - procMask := core.ProcMaskMeleeMHSpecial - flags := core.SpellFlagMeleeMetrics | SpellFlagColdBlooded - weaponMultiplier := core.TernaryFloat64(rogue.HasDagger(core.MainHand), 0.75, 0.5) - - if !isMH { - actionID.Tag = 2 - procMask = core.ProcMaskMeleeOHSpecial - flags |= core.SpellFlagNoOnCastComplete | core.SpellFlagPassiveSpell - weaponMultiplier = core.TernaryFloat64(rogue.HasDagger(core.OffHand), 0.75, 0.5) * rogue.dwsMultiplier() - } - - return rogue.RegisterSpell(core.SpellConfig{ - ActionID: actionID, - SpellSchool: core.SpellSchoolPhysical, - DefenseType: core.DefenseTypeMelee, - ProcMask: procMask, - Flags: flags, - - DamageMultiplier: weaponMultiplier, - ThreatMultiplier: 1, - }) -} - -// TODO: 8 yd range -func (rogue *Rogue) registerFanOfKnives() { - if !rogue.HasRune(proto.RogueRune_RuneFanOfKnives) { - return - } - - mhSpell := rogue.makeFanOfKnivesWeaponHitSpell(true) - ohSpell := rogue.makeFanOfKnivesWeaponHitSpell(false) - results := make([]*core.SpellResult, len(rogue.Env.Encounter.TargetUnits)) - - rogue.FanOfKnives = rogue.RegisterSpell(core.SpellConfig{ - ActionID: core.ActionID{SpellID: FanOfKnivesSpellID}, - SpellSchool: core.SpellSchoolPhysical, - Flags: core.SpellFlagMeleeMetrics | core.SpellFlagAPL | SpellFlagCarnage, - - EnergyCost: core.EnergyCostOptions{ - Cost: 50, - }, - Cast: core.CastConfig{ - DefaultCast: core.Cast{ - GCD: time.Second, - }, - IgnoreHaste: true, - }, - - ApplyEffects: func(sim *core.Simulation, unit *core.Unit, spell *core.Spell) { - rogue.BreakStealth(sim) - // Calc and apply all OH hits first, because MH hits can benefit from an OH felstriker proc. - for i, aoeTarget := range sim.Encounter.TargetUnits { - baseDamage := ohSpell.Unit.OHWeaponDamage(sim, ohSpell.MeleeAttackPower()) - baseDamage *= sim.Encounter.AOECapMultiplier() - results[i] = ohSpell.CalcDamage(sim, aoeTarget, baseDamage, ohSpell.OutcomeMeleeSpecialHitAndCrit) - } - for i := range sim.Encounter.TargetUnits { - ohSpell.DealDamage(sim, results[i]) - } - - for i, aoeTarget := range sim.Encounter.TargetUnits { - baseDamage := mhSpell.Unit.MHWeaponDamage(sim, mhSpell.MeleeAttackPower()) - baseDamage *= sim.Encounter.AOECapMultiplier() - results[i] = mhSpell.CalcDamage(sim, aoeTarget, baseDamage, mhSpell.OutcomeMeleeSpecialHitAndCrit) - } - for i := range sim.Encounter.TargetUnits { - mhSpell.DealDamage(sim, results[i]) - } - }, - }) -} diff --git a/sim/rogue/_main_gauche.go b/sim/rogue/_main_gauche.go deleted file mode 100644 index ec50106db..000000000 --- a/sim/rogue/_main_gauche.go +++ /dev/null @@ -1,114 +0,0 @@ -package rogue - -import ( - "time" - - "github.com/wowsims/classic/sim/core" - "github.com/wowsims/classic/sim/core/proto" - "github.com/wowsims/classic/sim/core/stats" -) - -func (rogue *Rogue) registerMainGaucheSpell() { - if !rogue.HasRune(proto.RogueRune_RuneMainGauche) { - return - } - hasPKRune := rogue.HasRune(proto.RogueRune_RunePoisonedKnife) - hasQDRune := rogue.HasRune(proto.RogueRune_RuneQuickDraw) - - // Aura gained regardless of landed hit. Need to confirm later with tank sim if parry is being modified correctly - mainGaucheAura := rogue.RegisterAura(core.Aura{ - Label: "Main Gauche Buff", - ActionID: core.ActionID{SpellID: int32(proto.RogueRune_RuneMainGauche)}, - Duration: time.Second * 10, - OnGain: func(aura *core.Aura, sim *core.Simulation) { - rogue.AddStatDynamic(sim, stats.Parry, 100*core.ParryRatingPerParryChance) - }, - OnExpire: func(aura *core.Aura, sim *core.Simulation) { - rogue.AddStatDynamic(sim, stats.Parry, -100*core.ParryRatingPerParryChance) - }, - OnSpellHitTaken: func(aura *core.Aura, sim *core.Simulation, spell *core.Spell, result *core.SpellResult) { - if spell.ProcMask.Matches(core.ProcMaskMelee|core.ProcMaskRanged) && result.DidParry() { - aura.Deactivate(sim) - } - }, - }) - - mainGaucheSSAura := rogue.RegisterAura(core.Aura{ - Label: "Main Gauche Sinister Strike Discount", - ActionID: core.ActionID{SpellID: 462752}, - Duration: time.Second * 10, - OnGain: func(aura *core.Aura, sim *core.Simulation) { - rogue.SinisterStrike.Cost.FlatModifier -= 20 - rogue.SinisterStrike.ThreatMultiplier *= 1.5 - - if hasPKRune { - rogue.PoisonedKnife.Cost.FlatModifier -= 20 - rogue.PoisonedKnife.ThreatMultiplier *= 1.5 - } - - if hasQDRune { - rogue.QuickDraw.Cost.FlatModifier -= 20 - rogue.QuickDraw.ThreatMultiplier *= 1.5 - } - }, - OnExpire: func(aura *core.Aura, sim *core.Simulation) { - rogue.SinisterStrike.Cost.FlatModifier += 20 - rogue.SinisterStrike.ThreatMultiplier /= 1.5 - - if hasPKRune { - rogue.PoisonedKnife.Cost.FlatModifier += 20 - rogue.PoisonedKnife.ThreatMultiplier /= 1.5 - } - - if hasQDRune { - rogue.QuickDraw.Cost.FlatModifier += 20 - rogue.QuickDraw.ThreatMultiplier /= 1.5 - } - }, - }) - - rogue.MainGauche = rogue.RegisterSpell(core.SpellConfig{ - SpellCode: SpellCode_RogueMainGauche, - ActionID: mainGaucheAura.ActionID, - SpellSchool: core.SpellSchoolPhysical, - DefenseType: core.DefenseTypeMelee, - ProcMask: core.ProcMaskMeleeOHSpecial, - Flags: rogue.builderFlags(), - - EnergyCost: core.EnergyCostOptions{ - Cost: []float64{15, 12, 10}[rogue.Talents.ImprovedSinisterStrike], - Refund: 0.8, - }, - - Cast: core.CastConfig{ - DefaultCast: core.Cast{ - GCD: time.Second, - }, - CD: core.Cooldown{ - Timer: rogue.NewTimer(), - Duration: time.Second * 20, - }, - IgnoreHaste: true, - }, - - CritDamageBonus: rogue.lethality(), - - DamageMultiplier: []float64{1, 1.02, 1.04, 1.06}[rogue.Talents.Aggression], - ThreatMultiplier: 1, - - ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) { - rogue.BreakStealth(sim) - baseDamage := spell.Unit.OHNormalizedWeaponDamage(sim, spell.MeleeAttackPower()) - - result := spell.CalcAndDealDamage(sim, target, baseDamage, spell.OutcomeMeleeSpecialHitAndCrit) - - if result.Landed() { - mainGaucheAura.Activate(sim) - mainGaucheSSAura.Activate(sim) - rogue.AddComboPoints(sim, 1, target, spell.ComboPointMetrics()) - } else { - spell.IssueRefund(sim) - } - }, - }) -} diff --git a/sim/rogue/_master_of_subtlety.go b/sim/rogue/_master_of_subtlety.go deleted file mode 100644 index 6a3608ad9..000000000 --- a/sim/rogue/_master_of_subtlety.go +++ /dev/null @@ -1,31 +0,0 @@ -package rogue - -import ( - "time" - - "github.com/wowsims/classic/sim/core" - "github.com/wowsims/classic/sim/core/proto" -) - -func (rogue *Rogue) registerMasterOfSubtlety() { - if !rogue.HasRune(proto.RogueRune_RuneMasterOfSubtlety) { - return - } - - effectDuration := time.Second * 6 - if rogue.StealthAura.IsActive() { - effectDuration = core.NeverExpires - } - - rogue.MasterOfSubtletyAura = rogue.RegisterAura(core.Aura{ - Label: "Master of Subtlety", - ActionID: core.ActionID{SpellID: int32(proto.RogueRune_RuneMasterOfSubtlety)}, - Duration: effectDuration, - OnGain: func(aura *core.Aura, sim *core.Simulation) { - rogue.PseudoStats.DamageDealtMultiplier *= 1.1 - }, - OnExpire: func(aura *core.Aura, sim *core.Simulation) { - rogue.PseudoStats.DamageDealtMultiplier /= 1.1 - }, - }) -} diff --git a/sim/rogue/_mutilate.go b/sim/rogue/_mutilate.go deleted file mode 100644 index 381f6474d..000000000 --- a/sim/rogue/_mutilate.go +++ /dev/null @@ -1,108 +0,0 @@ -package rogue - -import ( - "time" - - "github.com/wowsims/classic/sim/core" - "github.com/wowsims/classic/sim/core/proto" -) - -func (rogue *Rogue) newMutilateHitSpell(isMH bool) *core.Spell { - actionID := core.ActionID{SpellID: int32(proto.RogueRune_RuneMutilate)} - procMask := core.ProcMaskMeleeMHSpecial - if !isMH { - procMask = core.ProcMaskMeleeOHSpecial - } - - // waylay := rogue.HasRune(proto.RogueRune_RuneWaylay) - - flatDamageBonus := rogue.baseRuneAbilityDamage() - - return rogue.RegisterSpell(core.SpellConfig{ - SpellCode: SpellCode_RogueMutilate, - ActionID: actionID.WithTag(int32(core.Ternary(isMH, 1, 2))), - SpellSchool: core.SpellSchoolPhysical, - DefenseType: core.DefenseTypeMelee, - ProcMask: procMask, - Flags: core.SpellFlagMeleeMetrics | core.SpellFlagNoOnCastComplete | core.SpellFlagPassiveSpell | SpellFlagBuilder | SpellFlagColdBlooded | SpellFlagCarnage, - - BonusCritRating: 10 * core.CritRatingPerCritChance * float64(rogue.Talents.ImprovedBackstab), - - CritDamageBonus: rogue.lethality(), - - DamageMultiplier: 1 * - core.TernaryFloat64(isMH, 1, rogue.dwsMultiplier()) * - []float64{1, 1.04, 1.08, 1.12, 1.16, 1.2}[rogue.Talents.Opportunity], - ThreatMultiplier: 1, - BonusCoefficient: 1, - - ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) { - var baseDamage float64 - if isMH { - baseDamage = flatDamageBonus*0.8 + spell.Unit.MHNormalizedWeaponDamage(sim, spell.MeleeAttackPower())*0.8 - } else { - baseDamage = flatDamageBonus*0.8 + spell.Unit.OHNormalizedWeaponDamage(sim, spell.MeleeAttackPower())*0.8 - } - - // TODO: Add support for all poison effects (such as chipped bite proc), if they apply ;) - oldMultiplier := spell.DamageMultiplier - if rogue.deadlyPoisonTick.Dot(target).IsActive() || rogue.woundPoisonDebuffAuras.Get(target).IsActive() { - spell.DamageMultiplier *= 1.2 - } - spell.CalcAndDealDamage(sim, target, baseDamage, spell.OutcomeMeleeSpecialCritOnly) - spell.DamageMultiplier = oldMultiplier - }, - }) -} - -func (rogue *Rogue) registerMutilateSpell() { - if !rogue.HasRune(proto.RogueRune_RuneMutilate) { - return - } - - // Requires Daggers (2 of them) - if !rogue.HasDagger(core.MainHand) || !rogue.HasDagger(core.OffHand) { - return - } - - rogue.MutilateMH = rogue.newMutilateHitSpell(true) - rogue.MutilateOH = rogue.newMutilateHitSpell(false) - - rogue.Mutilate = rogue.RegisterSpell(core.SpellConfig{ - ActionID: core.ActionID{SpellID: int32(proto.RogueRune_RuneMutilate)}, - SpellSchool: core.SpellSchoolPhysical, - ProcMask: core.ProcMaskMeleeMHSpecial, - Flags: core.SpellFlagMeleeMetrics | core.SpellFlagAPL, - - EnergyCost: core.EnergyCostOptions{ - Cost: 40, - Refund: 0.8, - }, - Cast: core.CastConfig{ - DefaultCast: core.Cast{ - GCD: time.Second, - }, - IgnoreHaste: true, - }, - - ThreatMultiplier: 1, - - ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) { - rogue.BreakStealth(sim) - result := spell.CalcOutcome(sim, target, spell.OutcomeMeleeSpecialHit) - if result.Landed() { - rogue.AddComboPoints(sim, 2, target, spell.ComboPointMetrics()) - - /** Disable until it works on bosses - if waylay { - rogue.WaylayAuras.Get(target).Activate(sim) - } */ - rogue.MutilateMH.Cast(sim, target) - rogue.MutilateOH.Cast(sim, target) - } else { - spell.IssueRefund(sim) - } - spell.DealOutcome(sim, result) - }, - }) -} diff --git a/sim/rogue/_poisoned_knife.go b/sim/rogue/_poisoned_knife.go deleted file mode 100644 index 350d4866f..000000000 --- a/sim/rogue/_poisoned_knife.go +++ /dev/null @@ -1,84 +0,0 @@ -package rogue - -import ( - "time" - - "github.com/wowsims/classic/sim/core" - "github.com/wowsims/classic/sim/core/proto" -) - -func (rogue *Rogue) registerPoisonedKnife() { - if !rogue.HasRune(proto.RogueRune_RunePoisonedKnife) { - return - } - - poisonedKnifeMetrics := rogue.NewEnergyMetrics(core.ActionID{SpellID: 425012}) - hasDeadlyBrew := rogue.HasRune(proto.RogueRune_RuneDeadlyBrew) - hasJustAFleshWound := rogue.HasRune(proto.RogueRune_RuneJustAFleshWound) - - // Poisoned Knife /might/ scale with BonusWeaponDamage, if it's using https://www.wowhead.com/classic/spell=425013/poisoned-knife - rogue.PoisonedKnife = rogue.RegisterSpell(core.SpellConfig{ - SpellCode: SpellCode_RoguePoisonedKnife, - ActionID: core.ActionID{SpellID: int32(proto.RogueRune_RunePoisonedKnife)}, - SpellSchool: core.SpellSchoolPhysical, - DefenseType: core.DefenseTypeMelee, - ProcMask: core.ProcMaskMeleeOHSpecial, - Flags: rogue.builderFlags(), - - EnergyCost: core.EnergyCostOptions{ - Cost: []float64{25, 22, 20}[rogue.Talents.ImprovedSinisterStrike], - Refund: 0.8, - }, - Cast: core.CastConfig{ - DefaultCast: core.Cast{ - GCD: time.Second, - }, - CD: core.Cooldown{ - Timer: rogue.NewTimer(), - Duration: time.Second * 6, - }, - IgnoreHaste: true, - }, - ExtraCastCondition: func(sim *core.Simulation, target *core.Unit) bool { - return rogue.HasOHWeapon() - }, - CastType: proto.CastType_CastTypeRanged, - - CritDamageBonus: rogue.lethality(), - - DamageMultiplier: []float64{1, 1.02, 1.04, 1.06}[rogue.Talents.Aggression] * rogue.dwsMultiplier(), - ThreatMultiplier: core.TernaryFloat64(hasJustAFleshWound, 1.5, 1), - - ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) { - rogue.BreakStealth(sim) - baseDamage := spell.Unit.OHNormalizedWeaponDamage(sim, spell.MeleeAttackPower()) - - // Cannot Miss, Dodge, or Parry as per spell flags - result := spell.CalcAndDealDamage(sim, target, baseDamage, spell.OutcomeMeleeSpecialCritOnly) - - if result.Landed() { - rogue.AddComboPoints(sim, 1, target, spell.ComboPointMetrics()) - dp := rogue.deadlyPoisonTick.Dot(target) - numDPStacks := float64(dp.GetStacks() * 5) - rogue.AddEnergy(sim, numDPStacks, poisonedKnifeMetrics) - - // 100% application of OH poison (except for 1%? It can resist extremely rarely) - switch rogue.Consumes.OffHandImbue { - case proto.WeaponImbue_InstantPoison: - rogue.InstantPoison[ShivProc].Cast(sim, target) - case proto.WeaponImbue_DeadlyPoison: - rogue.DeadlyPoison[ShivProc].Cast(sim, target) - case proto.WeaponImbue_WoundPoison: - rogue.WoundPoison[ShivProc].Cast(sim, target) - // Add new alternative poisons as they are implemented - default: - if hasDeadlyBrew { - rogue.InstantPoison[DeadlyBrewProc].Cast(sim, target) - } - } - } else { - spell.IssueRefund(sim) - } - }, - }) -} diff --git a/sim/rogue/_quick_draw.go b/sim/rogue/_quick_draw.go deleted file mode 100644 index d4d57e6d4..000000000 --- a/sim/rogue/_quick_draw.go +++ /dev/null @@ -1,79 +0,0 @@ -package rogue - -import ( - "time" - - "github.com/wowsims/classic/sim/core" - "github.com/wowsims/classic/sim/core/proto" -) - -// TODO: 0.5s windup animation before activation -func (rogue *Rogue) registerQuickDrawSpell() { - if !rogue.HasRune(proto.RogueRune_RuneQuickDraw) { - return - } - - ammoBonusDamage := map[int32]float64{ - 25: 7.5, - 40: 13, - 50: 15, - 60: 20, - }[rogue.Level] - normalizedAmmoBonusDamage := ammoBonusDamage / 2.8 - - // Quick Draw applies a 50% slow, but bosses are immune - - rogue.QuickDraw = rogue.RegisterSpell(core.SpellConfig{ - ActionID: core.ActionID{SpellID: int32(proto.RogueRune_RuneQuickDraw)}, - SpellSchool: core.SpellSchoolPhysical, - DefenseType: core.DefenseTypeRanged, - ProcMask: core.ProcMaskRangedSpecial, - Flags: rogue.builderFlags(), - - MissileSpeed: 40, - - EnergyCost: core.EnergyCostOptions{ - Cost: []float64{25, 22, 20}[rogue.Talents.ImprovedSinisterStrike], - Refund: 0, - }, - Cast: core.CastConfig{ - DefaultCast: core.Cast{ - GCD: time.Second, - CastTime: time.Millisecond * 500, - }, - CD: core.Cooldown{ - Timer: rogue.NewTimer(), - Duration: time.Second * 10, - }, - IgnoreHaste: true, - }, - ExtraCastCondition: func(sim *core.Simulation, target *core.Unit) bool { - return rogue.Ranged().RangedWeaponType != proto.RangedWeaponType_RangedWeaponTypeThrown || - rogue.Ranged().RangedWeaponType != proto.RangedWeaponType_RangedWeaponTypeUnknown - }, - - CritDamageBonus: rogue.lethality(), - - DamageMultiplier: []float64{1, 1.02, 1.04, 1.06}[rogue.Talents.Aggression], - ThreatMultiplier: 1, - BonusCoefficient: 1, - - ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) { - rogue.BreakStealth(sim) - baseDamage := rogue.AutoAttacks.Ranged().CalculateNormalizedWeaponDamage(sim, spell.RangedAttackPower(target, false)) + - normalizedAmmoBonusDamage - - result := spell.CalcDamage(sim, target, baseDamage, spell.OutcomeRangedHitAndCrit) - - spell.WaitTravelTime(sim, func(s *core.Simulation) { - spell.DealDamage(sim, result) - - if result.Landed() { - rogue.AddComboPoints(sim, 1, target, spell.ComboPointMetrics()) - } else { - spell.IssueRefund(sim) - } - }) - }, - }) -} diff --git a/sim/rogue/_runes.go b/sim/rogue/_runes.go deleted file mode 100644 index a49ad8ed2..000000000 --- a/sim/rogue/_runes.go +++ /dev/null @@ -1,367 +0,0 @@ -package rogue - -import ( - "time" - - "github.com/wowsims/classic/sim/core" - "github.com/wowsims/classic/sim/core/proto" - "github.com/wowsims/classic/sim/core/stats" -) - -func (rogue *Rogue) ApplyRunes() { - // Apply runes here :) - if rogue.HasRune(proto.RogueRune_RuneDeadlyBrew) { - rogue.applyDeadlyBrewInstant() - rogue.applyDeadlyBrewDeadly() - } - - rogue.registerWaylayAura() - rogue.registerMasterOfSubtlety() - rogue.registerMainGaucheSpell() - rogue.registerSaberSlashSpell() - // rogue.registerShivSpell() - rogue.registerShadowstrikeSpell() - rogue.registerMutilateSpell() - rogue.registerEnvenom() - rogue.registerShadowstep() - rogue.registerShurikenTossSpell() - rogue.registerQuickDrawSpell() - rogue.registerBetweenTheEyes() - rogue.registerPoisonedKnife() - rogue.registerHonorAmongThieves() - rogue.applyCombatPotency() - rogue.applyFocusedAttacks() - rogue.applyCarnage() - rogue.applyUnfairAdvantage() - rogue.registerBladeDance() - rogue.applyJustAFleshWound() - rogue.applyRollingWithThePunches() - rogue.registerCutthroat() - rogue.registerBlunderbussSpell() - rogue.registerFanOfKnives() - rogue.registerCrimsonTempestSpell() - rogue.applySlaughterfromtheShadows() -} - -func (rogue *Rogue) applyCombatPotency() { - if !rogue.HasRune(proto.RogueRune_RuneCombatPotency) { - return - } - - energyMetrics := rogue.NewEnergyMetrics(core.ActionID{SpellID: 432292}) - - rogue.RegisterAura(core.Aura{ - Label: "Combat Potency", - ActionID: energyMetrics.ActionID, - Duration: core.NeverExpires, - OnReset: func(aura *core.Aura, sim *core.Simulation) { - aura.Activate(sim) - }, - OnSpellHitDealt: func(aura *core.Aura, sim *core.Simulation, spell *core.Spell, result *core.SpellResult) { - isFoKOH := false - - if spell.ActionID.SpellID == 409240 && spell.ActionID.Tag == 2 { - isFoKOH = true - } - - if !result.Landed() || !spell.ProcMask.Matches(core.ProcMaskMeleeOH) || isFoKOH { - return - } - - if sim.RandomFloat("Combat Potency") < 0.2 { - rogue.AddEnergy(sim, 15, energyMetrics) - } - }, - }) -} - -func (rogue *Rogue) applyFocusedAttacks() { - if !rogue.HasRune(proto.RogueRune_RuneFocusedAttacks) { - return - } - - energyMetrics := rogue.NewEnergyMetrics(core.ActionID{SpellID: int32(proto.RogueRune_RuneFocusedAttacks)}) - - rogue.RegisterAura(core.Aura{ - Label: "Focused Attacks", - ActionID: energyMetrics.ActionID, - Duration: core.NeverExpires, - OnReset: func(aura *core.Aura, sim *core.Simulation) { - aura.Activate(sim) - }, - OnSpellHitDealt: func(aura *core.Aura, sim *core.Simulation, spell *core.Spell, result *core.SpellResult) { - isFoKOH := false - - if spell.ActionID.SpellID == 409240 && spell.ActionID.Tag == 2 { - isFoKOH = true - } - - if !spell.ProcMask.Matches(core.ProcMaskMeleeOrRanged|core.ProcMaskMeleeDamageProc) || !result.DidCrit() || isFoKOH { - return - } - rogue.AddEnergy(sim, 2, energyMetrics) - }, - }) -} - -func (rogue *Rogue) registerHonorAmongThieves() { - if !rogue.HasRune(proto.RogueRune_RuneHonorAmongThieves) { - return - } - - comboMetrics := rogue.NewComboPointMetrics(core.ActionID{SpellID: int32(proto.RogueRune_RuneHonorAmongThieves)}) - - icd := core.Cooldown{ - Timer: rogue.NewTimer(), - Duration: time.Second, - } - - rogue.HonorAmongThieves = rogue.RegisterAura(core.Aura{ - Label: "Honor Among Thieves", - ActionID: comboMetrics.ActionID, - Duration: core.NeverExpires, - OnReset: func(aura *core.Aura, sim *core.Simulation) { - aura.Activate(sim) - }, - OnGain: func(_ *core.Aura, sim *core.Simulation) { - // In an ideal party, you'd probably get up to 6 ability crits/s (Rate = 600). - // Survival Hunters, Enhancement Shamans, and Assassination Rogues are particularly good. - if rogue.Options.HonorAmongThievesCritRate <= 0 { - return - } - - if rogue.Options.HonorAmongThievesCritRate > 2000 { - rogue.Options.HonorAmongThievesCritRate = 2000 // limited, so performance doesn't suffer - } - - rateToDuration := float64(time.Second) * 100 / float64(rogue.Options.HonorAmongThievesCritRate) - - pa := &core.PendingAction{} - pa.OnAction = func(sim *core.Simulation) { - rogue.tryHonorAmongThievesProc(sim, icd, comboMetrics) - pa.NextActionAt = sim.CurrentTime + time.Duration(sim.RandomExpFloat("next party crit")*rateToDuration) - sim.AddPendingAction(pa) - } - pa.NextActionAt = sim.CurrentTime + time.Duration(sim.RandomExpFloat("next party crit")*rateToDuration) - sim.AddPendingAction(pa) - }, - OnSpellHitDealt: func(_ *core.Aura, sim *core.Simulation, spell *core.Spell, result *core.SpellResult) { - if result.DidCrit() && !spell.ProcMask.Matches(core.ProcMaskWhiteHit) { - rogue.tryHonorAmongThievesProc(sim, icd, comboMetrics) - } - }, - OnPeriodicDamageDealt: func(_ *core.Aura, sim *core.Simulation, spell *core.Spell, result *core.SpellResult) { - if result.DidCrit() { - rogue.tryHonorAmongThievesProc(sim, icd, comboMetrics) - } - }, - }) -} - -func (rogue *Rogue) tryHonorAmongThievesProc(sim *core.Simulation, icd core.Cooldown, metrics *core.ResourceMetrics) { - if icd.IsReady(sim) { - rogue.AddComboPointsIgnoreTarget(sim, 1, metrics) - icd.Use(sim) - } -} - -// Apply the effects of the Cut to the Chase talent -func (rogue *Rogue) ApplyCutToTheChase(sim *core.Simulation) { - // Rune check is done in envenom.go and eviscerate.go - refreshSlice := rogue.SliceAndDiceAura.IsActive() - refreshBladeDance := rogue.BladeDanceAura.IsActive() - // Refresh the lowest duration of SnD or Blade Dance - if refreshBladeDance && refreshSlice { - if rogue.SliceAndDiceAura.RemainingDuration(sim) > rogue.BladeDanceAura.RemainingDuration(sim) { - refreshSlice = false - } else { - refreshBladeDance = false - } - } - if refreshSlice { - rogue.SliceAndDiceAura.Duration = rogue.sliceAndDiceDurations[5] - rogue.SliceAndDiceAura.Activate(sim) - } else if refreshBladeDance { - rogue.BladeDanceAura.Duration = rogue.bladeDanceDurations[5] - rogue.BladeDanceAura.Activate(sim) - } -} - -func (rogue *Rogue) registerBladeDance() { - if !rogue.HasRune(proto.RogueRune_RuneBladeDance) { - return - } - - justAFleshWound := rogue.HasRune(proto.RogueRune_RuneJustAFleshWound) - - rogue.bladeDanceDurations = [6]time.Duration{ - 0, - time.Duration(time.Second * 14), - time.Duration(time.Second * 18), - time.Duration(time.Second * 22), - time.Duration(time.Second * 26), - time.Duration(time.Second * 30), - } - - cachedBonusAP := 0.0 - apProcAura := rogue.RegisterAura(core.Aura{ - Label: "Defender's Resolve", - ActionID: core.ActionID{SpellID: 462230}, - Duration: core.NeverExpires, - OnGain: func(aura *core.Aura, sim *core.Simulation) { - cachedBonusAP = 4 * max(rogue.GetStat(stats.Defense), 0) - rogue.AddStatDynamic(sim, stats.AttackPower, cachedBonusAP) - }, - OnExpire: func(aura *core.Aura, sim *core.Simulation) { - rogue.AddStatDynamic(sim, stats.AttackPower, -cachedBonusAP) - }, - }) - - rogue.BladeDanceAura = rogue.RegisterAura(core.Aura{ - Label: "Blade Dance", - ActionID: core.ActionID{SpellID: int32(proto.RogueRune_RuneBladeDance)}, - Duration: rogue.bladeDanceDurations[5], - OnGain: func(aura *core.Aura, sim *core.Simulation) { - rogue.AddStatDynamic(sim, stats.Parry, 10*core.ParryRatingPerParryChance) - if justAFleshWound { - rogue.PseudoStats.SchoolDamageTakenMultiplier[stats.SchoolIndexPhysical] *= 0.8 - } - apProcAura.Activate(sim) - }, - OnExpire: func(aura *core.Aura, sim *core.Simulation) { - rogue.AddStatDynamic(sim, stats.Parry, -10*core.ParryRatingPerParryChance) - if justAFleshWound { - rogue.PseudoStats.SchoolDamageTakenMultiplier[stats.SchoolIndexPhysical] /= 0.8 - } - apProcAura.Deactivate(sim) - }, - }) - - rogue.BladeDance = rogue.RegisterSpell(core.SpellConfig{ - SpellCode: SpellCode_RogueBladeDance, - ActionID: core.ActionID{SpellID: int32(proto.RogueRune_RuneBladeDance)}, - SpellSchool: core.SpellSchoolPhysical, - Flags: core.SpellFlagMeleeMetrics | core.SpellFlagAPL, - MetricSplits: 6, - - EnergyCost: core.EnergyCostOptions{ - Cost: 25, - Refund: 0, - }, - Cast: core.CastConfig{ - DefaultCast: core.Cast{ - GCD: time.Second, - }, - IgnoreHaste: true, - ModifyCast: func(sim *core.Simulation, spell *core.Spell, cast *core.Cast) { - spell.SetMetricsSplit(spell.Unit.ComboPoints()) - }, - }, - ExtraCastCondition: func(sim *core.Simulation, target *core.Unit) bool { - return rogue.ComboPoints() > 0 - }, - - ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) { - rogue.BladeDanceAura.Duration = rogue.bladeDanceDurations[rogue.ComboPoints()] - rogue.BladeDanceAura.Activate(sim) - rogue.SpendComboPoints(sim, spell) - }, - }) - rogue.Finishers = append(rogue.Finishers, rogue.BladeDance) -} - -func (rogue *Rogue) applyJustAFleshWound() { - if !rogue.HasRune(proto.RogueRune_RuneJustAFleshWound) { - return - } - // Mod threat - rogue.PseudoStats.ThreatMultiplier *= 2.68 - - // Blade Dance 20% Physical DR - Added in registerBladeDance() - - // -20% damage done mod - rogue.PseudoStats.DamageDealtMultiplier *= 0.80 - - // -6% to be critically hit - rogue.PseudoStats.ReducedCritTakenChance += 6 - - // Replace Feint with Tease - // TODO: Warrior sim from wrath did not implement it. May implement later - - // Shuriken Toss and Poisoned Knife gain 50% threat mod - // Implemented in the relevant files -} - -func (rogue *Rogue) applyRollingWithThePunches() { - if !rogue.HasRune(proto.RogueRune_RuneRollingWithThePunches) { - return - } - - statDeps := make([]*stats.StatDependency, 6) // 5 stacks + zero condition - for i := 1; i < 6; i++ { - statDeps[i] = rogue.NewDynamicMultiplyStat(stats.Health, 1.0+.06*float64(i)) - - } - - rogue.RollingWithThePunchesProcAura = rogue.RegisterAura(core.Aura{ - Label: "Rolling with the Punches Proc", - ActionID: core.ActionID{SpellID: 400015}, - Duration: time.Second * 30, - MaxStacks: 5, - OnStacksChange: func(aura *core.Aura, sim *core.Simulation, oldStacks, newStacks int32) { - if oldStacks != 0 { - aura.Unit.DisableDynamicStatDep(sim, statDeps[oldStacks]) - } - if newStacks != 0 { - aura.Unit.EnableDynamicStatDep(sim, statDeps[newStacks]) - } - }, - }) - - rogue.RollingWithThePunchesAura = rogue.RegisterAura(core.Aura{ - Label: "Rolling with the Punches", - ActionID: core.ActionID{SpellID: int32(proto.RogueRune_RuneRollingWithThePunches)}, - ActionIDForProc: core.ActionID{SpellID: int32(proto.RogueRune_RuneRollingWithThePunches) - 1}, - Duration: core.NeverExpires, - OnReset: func(aura *core.Aura, sim *core.Simulation) { - aura.Activate(sim) - }, - OnSpellHitTaken: func(aura *core.Aura, sim *core.Simulation, spell *core.Spell, result *core.SpellResult) { - if spell.ProcMask.Matches(core.ProcMaskMelee|core.ProcMaskRanged) && result.Outcome.Matches(core.OutcomeDodge|core.OutcomeParry) { - rogue.RollingWithThePunchesProcAura.Activate(sim) - rogue.RollingWithThePunchesProcAura.AddStack(sim) - } - }, - }) -} - -func (rogue *Rogue) rollCutthroat(sim *core.Simulation) { - if sim.RandomFloat("Cutthroat") < (0.15 + rogue.cutthroatBonusChance) { - rogue.CutthroatProcAura.Activate(sim) - } -} - -func (rogue *Rogue) registerCutthroat() { - if !rogue.HasRune(proto.RogueRune_RuneCutthroat) { - return - } - - rogue.CutthroatProcAura = rogue.RegisterAura(core.Aura{ - Label: "Cutthroat", - ActionID: core.ActionID{SpellID: 462707}, - Duration: time.Second * 10, - }) -} - -func (rogue *Rogue) applySlaughterfromtheShadows() { - if !rogue.HasRune(proto.RogueRune_RuneSlaughterFromTheShadows) { - return - } - - rogue.OnSpellRegistered(func(spell *core.Spell) { - if spell.SpellCode == SpellCode_RogueAmbush || spell.SpellCode == SpellCode_RogueBackstab { - spell.DamageMultiplier *= 1.5 - spell.Cost.FlatModifier -= 30 - } - }) -} diff --git a/sim/rogue/_saber_slash.go b/sim/rogue/_saber_slash.go deleted file mode 100644 index 1a768c8b1..000000000 --- a/sim/rogue/_saber_slash.go +++ /dev/null @@ -1,116 +0,0 @@ -package rogue - -import ( - "time" - - "github.com/wowsims/classic/sim/core" - "github.com/wowsims/classic/sim/core/proto" -) - -func (rogue *Rogue) registerSaberSlashSpell() { - if !rogue.HasRune(proto.RogueRune_RuneSaberSlash) { - return - } - - rogue.saberSlashTick = rogue.RegisterSpell(core.SpellConfig{ - SpellCode: SpellCode_RogueSaberSlashDoT, - ActionID: core.ActionID{SpellID: int32(proto.RogueRune_RuneSaberSlash), Tag: 100}, - SpellSchool: core.SpellSchoolPhysical, - Flags: core.SpellFlagMeleeMetrics, - ProcMask: core.ProcMaskEmpty, - - DamageMultiplier: 1, - ThreatMultiplier: 1, - - Dot: core.DotConfig{ - Aura: core.Aura{ - Label: "Saber Slash - Bleed", - Tag: RogueBleedTag, - Duration: time.Second * 12, - MaxStacks: 3, - }, - NumberOfTicks: 6, - TickLength: time.Second * 2, - - OnSnapshot: func(sim *core.Simulation, target *core.Unit, dot *core.Dot, applyStack bool) { - if !applyStack { - return - } - - // only the first stack snapshots the multiplier - if dot.GetStacks() == 1 { - attackTable := dot.Spell.Unit.AttackTables[target.UnitIndex][dot.Spell.CastType] - dot.SnapshotAttackerMultiplier = dot.Spell.AttackerDamageMultiplier(attackTable) - dot.SnapshotBaseDamage = 0 - } - - dot.SnapshotAttackerMultiplier /= rogue.saberSlashMultiplier(dot.GetStacks() - 1) - dot.SnapshotAttackerMultiplier *= rogue.saberSlashMultiplier(dot.GetStacks()) - - // each stack snapshots the AP it was applied with - dot.SnapshotBaseDamage += 0.05 * dot.Spell.MeleeAttackPower() - }, - OnTick: func(sim *core.Simulation, target *core.Unit, dot *core.Dot) { - dot.CalcAndDealPeriodicSnapshotDamage(sim, target, dot.OutcomeTick) - }, - }, - }) - - rogue.SaberSlash = rogue.RegisterSpell(core.SpellConfig{ - SpellCode: SpellCode_RogueSaberSlash, - ActionID: core.ActionID{SpellID: int32(proto.RogueRune_RuneSaberSlash)}, - SpellSchool: core.SpellSchoolPhysical, - DefenseType: core.DefenseTypeMelee, - ProcMask: core.ProcMaskMeleeMHSpecial, - Flags: rogue.builderFlags(), - EnergyCost: core.EnergyCostOptions{ - Cost: []float64{45, 42, 40}[rogue.Talents.ImprovedSinisterStrike], - Refund: 0.8, - }, - - Cast: core.CastConfig{ - DefaultCast: core.Cast{ - GCD: time.Second, - }, - IgnoreHaste: true, - }, - - CritDamageBonus: rogue.lethality(), - - DamageMultiplier: []float64{1, 1.02, 1.04, 1.06}[rogue.Talents.Aggression], - ThreatMultiplier: 1, - BonusCoefficient: 1, - - ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) { - rogue.BreakStealth(sim) - - dot := rogue.saberSlashTick.Dot(target) - oldMultiplier := spell.DamageMultiplier - if dot.IsActive() { - spell.DamageMultiplier *= rogue.saberSlashMultiplier(dot.GetStacks()) - } - - baseDamage := spell.Unit.MHNormalizedWeaponDamage(sim, spell.MeleeAttackPower()) - result := spell.CalcAndDealDamage(sim, target, baseDamage, spell.OutcomeMeleeWeaponSpecialHitAndCrit) - - spell.DamageMultiplier = oldMultiplier - - if result.Landed() { - rogue.AddComboPoints(sim, 1, target, spell.ComboPointMetrics()) - - dot.ApplyOrRefresh(sim) - if dot.GetStacks() < dot.MaxStacks { - dot.AddStack(sim) - // snapshotting only takes place when adding a stack - dot.TakeSnapshot(sim, true) - } - } else { - spell.IssueRefund(sim) - } - }, - }) -} - -func (rogue *Rogue) saberSlashMultiplier(stacks int32) float64 { - return []float64{1, 1.33, 1.67, 2.0}[stacks] -} diff --git a/sim/rogue/_shadowstep.go b/sim/rogue/_shadowstep.go deleted file mode 100644 index d4e5e5df9..000000000 --- a/sim/rogue/_shadowstep.go +++ /dev/null @@ -1,39 +0,0 @@ -package rogue - -import ( - "time" - - "github.com/wowsims/classic/sim/core" - "github.com/wowsims/classic/sim/core/proto" -) - -func (rogue *Rogue) registerShadowstep() { - if !rogue.HasRune(proto.RogueRune_RuneShadowstep) { - return - } - - actionID := core.ActionID{SpellID: 400029} - baseCost := 0.0 - - rogue.Shadowstep = rogue.RegisterSpell(core.SpellConfig{ - ActionID: actionID, - Flags: core.SpellFlagAPL, - EnergyCost: core.EnergyCostOptions{ - Cost: baseCost, - Refund: 0, - }, - - Cast: core.CastConfig{ - DefaultCast: core.Cast{ - Cost: baseCost, - GCD: time.Second * 1, - }, - IgnoreHaste: true, - CD: core.Cooldown{ - Timer: rogue.NewTimer(), - Duration: time.Second * 30, - }, - }, - ApplyEffects: func(sim *core.Simulation, _ *core.Unit, spell *core.Spell) {}, - }) -} diff --git a/sim/rogue/_shadowstrike.go b/sim/rogue/_shadowstrike.go deleted file mode 100644 index 944f6da53..000000000 --- a/sim/rogue/_shadowstrike.go +++ /dev/null @@ -1,56 +0,0 @@ -package rogue - -import ( - "time" - - "github.com/wowsims/classic/sim/core" - "github.com/wowsims/classic/sim/core/proto" -) - -func (rogue *Rogue) registerShadowstrikeSpell() { - if !rogue.HasRune(proto.RogueRune_RuneShadowstrike) { - return - } - - rogue.Shadowstrike = rogue.RegisterSpell(core.SpellConfig{ - SpellCode: SpellCode_RogueShadowStrike, - ActionID: core.ActionID{SpellID: int32(proto.RogueRune_RuneShadowstrike)}, - SpellSchool: core.SpellSchoolPhysical, - DefenseType: core.DefenseTypeMelee, - ProcMask: core.ProcMaskMeleeMHSpecial, - Flags: rogue.builderFlags(), - EnergyCost: core.EnergyCostOptions{ - Cost: 20, - Refund: 0.8, - }, - - Cast: core.CastConfig{ - DefaultCast: core.Cast{ - GCD: time.Second, - }, - IgnoreHaste: true, - }, - ExtraCastCondition: func(sim *core.Simulation, target *core.Unit) bool { - return !rogue.IsStealthed() - }, - - DamageMultiplier: 1.5, - ThreatMultiplier: 1, - BonusCoefficient: 1, - - ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) { - rogue.BreakStealth(sim) - baseDamage := rogue.MHNormalizedWeaponDamage(sim, spell.MeleeAttackPower()) - - result := spell.CalcAndDealDamage(sim, target, baseDamage, spell.OutcomeMeleeSpecialHitAndCrit) - - // Move to target here? - - if result.Landed() { - rogue.AddComboPoints(sim, 1, target, spell.ComboPointMetrics()) - } else { - spell.IssueRefund(sim) - } - }, - }) -} diff --git a/sim/rogue/_shuriken_toss.go b/sim/rogue/_shuriken_toss.go deleted file mode 100644 index 788fda45c..000000000 --- a/sim/rogue/_shuriken_toss.go +++ /dev/null @@ -1,64 +0,0 @@ -package rogue - -import ( - "time" - - "github.com/wowsims/classic/sim/core" - "github.com/wowsims/classic/sim/core/proto" -) - -func (rogue *Rogue) registerShurikenTossSpell() { - if !rogue.HasRune(proto.RogueRune_RuneShurikenToss) { - return - } - - hasJustAFleshWound := rogue.HasRune(proto.RogueRune_RuneJustAFleshWound) - - results := make([]*core.SpellResult, min(5, rogue.Env.GetNumTargets())) - - rogue.ShurikenToss = rogue.RegisterSpell(core.SpellConfig{ - ActionID: core.ActionID{SpellID: int32(proto.RogueRune_RuneShurikenToss)}, - SpellSchool: core.SpellSchoolPhysical, - DefenseType: core.DefenseTypeRanged, - ProcMask: core.ProcMaskRangedSpecial, - Flags: SpellFlagBuilder | SpellFlagCarnage | core.SpellFlagMeleeMetrics | core.SpellFlagAPL, // not affected by Cold Blood - - EnergyCost: core.EnergyCostOptions{ - Cost: 30, - Refund: 0, - }, - Cast: core.CastConfig{ - DefaultCast: core.Cast{ - GCD: time.Second, - }, - IgnoreHaste: true, - CD: core.Cooldown{ - Timer: rogue.NewTimer(), - Duration: time.Second * 20, - }, - }, - - DamageMultiplier: 1, - ThreatMultiplier: core.TernaryFloat64(hasJustAFleshWound, 1.5, 1), - - ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) { - rogue.BreakStealth(sim) - baseDamage := spell.MeleeAttackPower() * 0.50 - var combopoints int32 = 0 - - for idx := range results { - results[idx] = spell.CalcDamage(sim, target, baseDamage, spell.OutcomeRangedHitAndCrit) - target = sim.Environment.NextTargetUnit(target) - } - - for _, result := range results { - spell.DealDamage(sim, result) - combopoints++ - } - - if results[0].Landed() { - rogue.AddComboPoints(sim, combopoints, target, spell.ComboPointMetrics()) - } - }, - }) -} diff --git a/sim/rogue/_unfair_advantage.go b/sim/rogue/_unfair_advantage.go deleted file mode 100644 index 57be989f1..000000000 --- a/sim/rogue/_unfair_advantage.go +++ /dev/null @@ -1,55 +0,0 @@ -package rogue - -import ( - "time" - - "github.com/wowsims/classic/sim/core" - "github.com/wowsims/classic/sim/core/proto" -) - -func (rogue *Rogue) applyUnfairAdvantage() { - if !rogue.HasRune(proto.RogueRune_RuneUnfairAdvantage) { - return - } - comboMetrics := rogue.NewComboPointMetrics(core.ActionID{SpellID: 432274}) - - unfairAdvantage := rogue.GetOrRegisterSpell(core.SpellConfig{ - ActionID: core.ActionID{SpellID: 432274}, - SpellSchool: core.SpellSchoolPhysical, - DefenseType: core.DefenseTypeMelee, - ProcMask: core.ProcMaskMeleeMHSpecial, - Flags: core.SpellFlagMeleeMetrics | core.SpellFlagPassiveSpell, - - DamageMultiplier: 1, - ThreatMultiplier: 1, - BonusCoefficient: 1, - - ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) { - // TODO: Verify this should be normalized as the spell has 2 effects - // one being normalized with 0 BasePoints and one being not normalized with 100 base points - damage := rogue.MHNormalizedWeaponDamage(sim, spell.MeleeAttackPower()) - spell.CalcAndDealDamage(sim, target, damage, spell.OutcomeMeleeWeaponSpecialHitAndCrit) - }, - }) - - icd := core.Cooldown{ - Timer: rogue.NewTimer(), - Duration: time.Second, - } - - rogue.RegisterAura(core.Aura{ - Label: "Unfair Advantage Trigger", - ActionID: core.ActionID{SpellID: int32(proto.RogueRune_RuneUnfairAdvantage)}, - Duration: core.NeverExpires, - OnReset: func(aura *core.Aura, sim *core.Simulation) { - aura.Activate(sim) - }, - OnSpellHitTaken: func(aura *core.Aura, sim *core.Simulation, spell *core.Spell, result *core.SpellResult) { - if result.Outcome.Matches(core.OutcomeDodge|core.OutcomeParry) && icd.IsReady(sim) { - unfairAdvantage.Cast(sim, rogue.CurrentTarget) - rogue.AddComboPoints(sim, 1, rogue.CurrentTarget, comboMetrics) - icd.Use(sim) - } - }, - }) -} diff --git a/sim/rogue/_waylay.go b/sim/rogue/_waylay.go deleted file mode 100644 index f7d719296..000000000 --- a/sim/rogue/_waylay.go +++ /dev/null @@ -1,15 +0,0 @@ -package rogue - -import ( - "github.com/wowsims/classic/sim/core/proto" -) - -func (rogue *Rogue) registerWaylayAura() { - if !rogue.HasRune(proto.RogueRune_RuneWaylay) { - return - } - - // rogue.WaylayAuras = rogue.NewEnemyAuraArray(func(target *core.Unit, level int32) *core.Aura { - // return core.WaylayAura(target) - // }) -} diff --git a/sim/rogue/garrote.go b/sim/rogue/garrote.go index f4f1d5d7e..22e6330a1 100644 --- a/sim/rogue/garrote.go +++ b/sim/rogue/garrote.go @@ -53,7 +53,6 @@ func (rogue *Rogue) registerGarrote() { Dot: core.DotConfig{ Aura: core.Aura{ Label: "Garrote", - Tag: RogueBleedTag, }, NumberOfTicks: 6, TickLength: time.Second * 3, diff --git a/sim/rogue/rogue.go b/sim/rogue/rogue.go index 5c31f4fae..6b948ae5b 100644 --- a/sim/rogue/rogue.go +++ b/sim/rogue/rogue.go @@ -36,8 +36,6 @@ const ( var TalentTreeSizes = [3]int{15, 19, 17} -const RogueBleedTag = "RogueBleed" - type Rogue struct { core.Character diff --git a/sim/rogue/rupture.go b/sim/rogue/rupture.go index 07eaef1ae..60890697a 100644 --- a/sim/rogue/rupture.go +++ b/sim/rogue/rupture.go @@ -46,7 +46,6 @@ func (rogue *Rogue) registerRupture() { Dot: core.DotConfig{ Aura: core.Aura{ Label: "Rupture", - Tag: RogueBleedTag, }, NumberOfTicks: 0, // Set dynamically TickLength: time.Second * 2, diff --git a/sim/rogue/vanish.go b/sim/rogue/vanish.go index 255bdc9eb..d70108cc5 100644 --- a/sim/rogue/vanish.go +++ b/sim/rogue/vanish.go @@ -39,10 +39,4 @@ func (rogue *Rogue) registerVanishSpell() { rogue.StealthAura.Activate(sim) }, }) - -// rogue.AddMajorCooldown(core.MajorCooldown{ -// Spell: rogue.Vanish, -// Type: core.CooldownTypeDPS, -// Priority: core.CooldownPriorityDrums, -// }) -} +} \ No newline at end of file diff --git a/ui/rogue/inputs.ts b/ui/rogue/inputs.ts index 91c67c4bd..b0fa8a9c0 100644 --- a/ui/rogue/inputs.ts +++ b/ui/rogue/inputs.ts @@ -4,9 +4,3 @@ import { ItemSlot, Spec } from '../core/proto/common.js'; // Configuration for spec-specific UI elements on the settings tab. // These don't need to be in a separate file but it keeps things cleaner. - -export const HonorOfThievesCritRate = InputHelpers.makeSpecOptionsNumberInput({ - fieldName: 'honorAmongThievesCritRate', - label: 'Honor Among Thieves Crit Rate', - labelTooltip: 'Number of crits other group members generate within 100 seconds', -}); diff --git a/ui/rogue/presets.ts b/ui/rogue/presets.ts index 32c64a1b9..2928065a0 100644 --- a/ui/rogue/presets.ts +++ b/ui/rogue/presets.ts @@ -18,7 +18,7 @@ import { WeaponImbue, ZanzaBuff, } from '../core/proto/common.js'; -import { RogueOptions, RogueRune } from '../core/proto/rogue.js'; +import { RogueOptions } from '../core/proto/rogue.js'; import { SavedTalents } from '../core/proto/ui.js'; import BackstabAPL from './apls/combat_backstab.apl.json'; import SinisterStrikeAPL from './apls/combat_sinister_strike.apl.json'; @@ -53,7 +53,7 @@ export const DefaultGear = GearSwordsPreBiS; /////////////////////////////////////////////////////////////////////////// export const ROTATION_PRESET_BACKSTAB = PresetUtils.makePresetAPLRotation('Backstab', BackstabAPL, {}); -export const ROTATION_PRESET_SINISTER_STRIKE = PresetUtils.makePresetAPLRotation('SinisterStrike', SinisterStrikeAPL, {}); +export const ROTATION_PRESET_SINISTER_STRIKE = PresetUtils.makePresetAPLRotation('Sinister Strike', SinisterStrikeAPL, {}); export const APLPresets = { [Phase.Phase1]: [ROTATION_PRESET_BACKSTAB, ROTATION_PRESET_SINISTER_STRIKE], @@ -63,8 +63,12 @@ export const APLPresets = { [Phase.Phase5]: [ROTATION_PRESET_BACKSTAB, ROTATION_PRESET_SINISTER_STRIKE], }; +//Need to add main hand equip logic or talent/rotation logic to map to Auto APL export const DefaultAPLs: Record> = { - 60: {}, + 60: { + [0]: ROTATION_PRESET_SINISTER_STRIKE, + [1]: ROTATION_PRESET_BACKSTAB, + }, }; export const DefaultAPLBackstab = APLPresets[Phase.Phase5][0]; @@ -121,9 +125,7 @@ export const PresetBuildBackstab = PresetUtils.makePresetBuild('Backstab', { // Options /////////////////////////////////////////////////////////////////////////// -export const DefaultOptions = RogueOptions.create({ - honorAmongThievesCritRate: 100, -}); +export const DefaultOptions = RogueOptions.create({}); /////////////////////////////////////////////////////////////////////////// // Consumes/Buffs/Debuffs diff --git a/ui/rogue/sim.ts b/ui/rogue/sim.ts index 17e4e525e..a6577f638 100644 --- a/ui/rogue/sim.ts +++ b/ui/rogue/sim.ts @@ -6,7 +6,6 @@ import { Player } from '../core/player.js'; import { Class, Faction, ItemSlot, PartyBuffs, PseudoStat, Race, Spec, Stat, Target, WeaponType } from '../core/proto/common.js'; import { Stats } from '../core/proto_utils/stats.js'; import { getSpecIcon } from '../core/proto_utils/utils.js'; -import { HonorOfThievesCritRate } from './inputs'; import * as Presets from './presets.js'; const SPEC_CONFIG = registerSpecConfig(Spec.SpecRogue, { @@ -59,11 +58,8 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecRogue, { Stat.StatMeleeHit, Stat.StatMeleeCrit, Stat.StatMeleeHaste, - Stat.StatExpertise, // Spell Stat.StatSpellPower, - Stat.StatSpellHit, - Stat.StatSpellCrit, ], epPseudoStats: [PseudoStat.PseudoStatMainHandDps, PseudoStat.PseudoStatOffHandDps, PseudoStat.PseudoStatMeleeSpeedMultiplier], // Reference stat against which to calculate EP. @@ -78,11 +74,7 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecRogue, { Stat.StatAttackPower, Stat.StatMeleeHit, Stat.StatMeleeCrit, - Stat.StatExpertise, Stat.StatMeleeHaste, - // Spell - Stat.StatSpellHit, - Stat.StatSpellCrit, ], displayPseudoStats: [], @@ -92,19 +84,19 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecRogue, { // Default EP weights for sorting gear in the gear picker. epWeights: Stats.fromMap( { - [Stat.StatAgility]: 2.51, - [Stat.StatStrength]: 1.31, + [Stat.StatAgility]: 2.38, + [Stat.StatStrength]: 1.26, [Stat.StatAttackPower]: 1.0, - [Stat.StatSpellCrit]: 0.12, - [Stat.StatSpellHit]: 11.94, - [Stat.StatMeleeHit]: 19.43, - [Stat.StatMeleeCrit]: 26.72, + [Stat.StatSpellCrit]: 0.41, + [Stat.StatSpellHit]: 0.94, + [Stat.StatMeleeHit]: 29.44, + [Stat.StatMeleeCrit]: 17.92, [Stat.StatFireResistance]: 0.5, }, { - [PseudoStat.PseudoStatMainHandDps]: 9.86, - [PseudoStat.PseudoStatOffHandDps]: 1.02, - [PseudoStat.PseudoStatMeleeSpeedMultiplier]: 5.0, + [PseudoStat.PseudoStatMainHandDps]: 10.49, + [PseudoStat.PseudoStatOffHandDps]: 3.74, + [PseudoStat.PseudoStatMeleeSpeedMultiplier]: 18.56, }, ), @@ -138,7 +130,7 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecRogue, { excludeBuffDebuffInputs: [], // Inputs to include in the 'Other' section on the settings tab. otherInputs: { - inputs: [OtherInputs.TankAssignment, OtherInputs.InFrontOfTarget, HonorOfThievesCritRate], + inputs: [OtherInputs.TankAssignment, OtherInputs.InFrontOfTarget], }, encounterPicker: { // Whether to include 'Execute Duration (%)' in the 'Encounter' section of the settings tab. @@ -177,8 +169,7 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecRogue, { autoRotation: player => { // Try to find a rotation by hand rune - const handRuneID = 0; - const preset = Presets.DefaultAPLs[player.getLevel()][handRuneID]; + const preset = Presets.DefaultAPLs[player.getLevel()][0]; if (preset) return preset.rotation.rotation!; diff --git a/ui/tank_rogue/inputs.ts b/ui/tank_rogue/inputs.ts index b18da189f..b0fa8a9c0 100644 --- a/ui/tank_rogue/inputs.ts +++ b/ui/tank_rogue/inputs.ts @@ -1,14 +1,6 @@ import * as InputHelpers from '../core/components/input_helpers.js'; import { Player } from '../core/player.js'; import { ItemSlot, Spec } from '../core/proto/common.js'; -import { RogueRune } from '../core/proto/rogue.js'; - // Configuration for spec-specific UI elements on the settings tab. // These don't need to be in a separate file but it keeps things cleaner. - -export const HonorOfThievesCritRate = InputHelpers.makeSpecOptionsNumberInput({ - fieldName: 'honorAmongThievesCritRate', - label: 'Honor Among Thieves Crit Rate', - labelTooltip: 'Number of crits other group members generate within 100 seconds', -}); \ No newline at end of file diff --git a/ui/tank_rogue/sim.ts b/ui/tank_rogue/sim.ts index 725809169..2e0bd22f4 100644 --- a/ui/tank_rogue/sim.ts +++ b/ui/tank_rogue/sim.ts @@ -6,7 +6,6 @@ import { Player } from '../core/player'; import { Class, Faction, PartyBuffs, PseudoStat, Race, Spec, Stat } from '../core/proto/common'; import { Stats } from '../core/proto_utils/stats'; import { getSpecIcon } from '../core/proto_utils/utils'; -import { HonorOfThievesCritRate } from './inputs'; import * as Presets from './presets.js'; const SPEC_CONFIG = registerSpecConfig(Spec.SpecTankRogue, { @@ -64,7 +63,7 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecTankRogue, { Stat.StatShadowResistance, ], displayPseudoStats: [], - + defaults: { // Default equipped gear. gear: Presets.DefaultGear.gear, @@ -128,7 +127,6 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecTankRogue, { OtherInputs.BurstWindow, OtherInputs.HpPercentForDefensives, OtherInputs.InspirationUptime, - HonorOfThievesCritRate, ], }, encounterPicker: { @@ -154,9 +152,7 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecTankRogue, { ...Presets.APLPresets[Phase.Phase1], ], // Preset gear configurations that the user can quickly select. - gear: [ - Presets.DefaultGear, - ], + gear: [Presets.DefaultGear], builds: [Presets.PresetBuildEncounterDefault, Presets.PresetBuildEncounterVael], },