From 578d70f6fad0030ba27c75b08c156ef65a6e6bb3 Mon Sep 17 00:00:00 2001 From: jarves Date: Fri, 19 Aug 2022 04:01:41 -0500 Subject: [PATCH 1/6] feral: update druid skills/talent interactions for wotlk - added in missing spells - added in new talents Signed-off-by: jarves --- sim/core/debuffs.go | 2 +- sim/druid/berserk.go | 50 +++++++++++++++++++++++++++ sim/druid/druid.go | 36 ++++++++++++++++--- sim/druid/enrage.go | 58 +++++++++++++++++++++++++++++++ sim/druid/faerie_fire.go | 6 ++++ sim/druid/ferocious_bite.go | 13 +++++-- sim/druid/forms.go | 45 ++++++++++++++---------- sim/druid/lacerate.go | 2 +- sim/druid/mangle.go | 11 ++++-- sim/druid/maul.go | 2 +- sim/druid/rake.go | 2 +- sim/druid/rip.go | 5 ++- sim/druid/savage_roar.go | 54 +++++++++++++++++++++++++++++ sim/druid/shred.go | 12 ++++--- sim/druid/talents.go | 69 ++++++++++++++++++++++++++++--------- sim/druid/tigers_fury.go | 46 +++++++++++++++++++++++++ ui/feral_druid/presets.ts | 2 +- 17 files changed, 360 insertions(+), 55 deletions(-) create mode 100644 sim/druid/berserk.go create mode 100644 sim/druid/enrage.go create mode 100644 sim/druid/savage_roar.go create mode 100644 sim/druid/tigers_fury.go diff --git a/sim/core/debuffs.go b/sim/core/debuffs.go index 1d872ef263..64ee308280 100644 --- a/sim/core/debuffs.go +++ b/sim/core/debuffs.go @@ -438,7 +438,7 @@ func MangleAura(target *Unit) *Aura { Label: "Mangle", Tag: BleedDamageAuraTag, ActionID: ActionID{SpellID: 33876}, - Duration: time.Second * 12, + Duration: time.Minute, Priority: 1.3, OnGain: func(aura *Aura, sim *Simulation) { aura.Unit.PseudoStats.PeriodicPhysicalDamageTakenMultiplier *= 1.3 diff --git a/sim/druid/berserk.go b/sim/druid/berserk.go new file mode 100644 index 0000000000..49d23d9475 --- /dev/null +++ b/sim/druid/berserk.go @@ -0,0 +1,50 @@ +package druid + +import ( + "time" + + "github.com/wowsims/wotlk/sim/core" +) + +func (druid *Druid) registerBerserkCD() { + if !druid.Talents.Berserk { + return + } + + actionId := core.ActionID{SpellID: 50334} + + druid.BerserkAura = druid.RegisterAura(core.Aura{ + Label: "Berserk", + ActionID: actionId, + Duration: time.Second * 15, + OnGain: func(aura *core.Aura, sim *core.Simulation) { + if druid.InForm(Cat) { + druid.PseudoStats.CostMultiplier /= 2.0 + } + }, + OnExpire: func(aura *core.Aura, sim *core.Simulation) { + if druid.InForm(Cat) { + druid.PseudoStats.CostMultiplier *= 2.0 + } + }, + }) + + spell := druid.RegisterSpell(core.SpellConfig{ + ActionID: actionId, + Cast: core.CastConfig{ + CD: core.Cooldown{ + Timer: druid.NewTimer(), + Duration: time.Second * 180.0, + }, + }, + ApplyEffects: func(sim *core.Simulation, _ *core.Unit, _ *core.Spell) { + druid.BerserkAura.Activate(sim) + }, + }) + + druid.AddMajorCooldown(core.MajorCooldown{ + Spell: spell, + Type: core.CooldownTypeDPS, + }) + +} diff --git a/sim/druid/druid.go b/sim/druid/druid.go index c7465a4f71..70f03aa27b 100644 --- a/sim/druid/druid.go +++ b/sim/druid/druid.go @@ -20,6 +20,7 @@ type Druid struct { OriginalStarfireBonusCritRating float64 DemoralizingRoar *core.Spell + Enrage *core.Spell FaerieFire *core.Spell FerociousBite *core.Spell Hurricane *core.Spell @@ -31,11 +32,13 @@ type Druid struct { Rebirth *core.Spell Rake *core.Spell Rip *core.Spell + SavageRoar *core.Spell Shred *core.Spell Starfire *core.Spell Starfall *core.Spell StarfallSplash *core.Spell Swipe *core.Spell + TigersFury *core.Spell Wrath *core.Spell CatForm *core.Spell @@ -49,15 +52,21 @@ type Druid struct { StarfallDot *core.Dot StarfallDotSplash *core.Dot + BearFormAura *core.Aura + BerserkAura *core.Aura + CatFormAura *core.Aura ClearcastingAura *core.Aura DemoralizingRoarAura *core.Aura + EnrageAura *core.Aura FaerieFireAura *core.Aura MangleAura *core.Aura MaulQueueAura *core.Aura NaturesGraceProcAura *core.Aura NaturesSwiftnessAura *core.Aura - CatFormAura *core.Aura - BearFormAura *core.Aura + TigersFuryAura *core.Aura + SavageRoarAura *core.Aura + + PrimalPrecisionRecoveryMetrics *core.ResourceMetrics LunarICD core.Cooldown SolarICD core.Cooldown @@ -78,7 +87,7 @@ func (druid *Druid) GetCharacter() *core.Character { func (druid *Druid) AddRaidBuffs(raidBuffs *proto.RaidBuffs) { raidBuffs.GiftOfTheWild = core.MaxTristate(raidBuffs.GiftOfTheWild, proto.TristateEffect_TristateEffectRegular) - if druid.Talents.ImprovedMarkOfTheWild == 5 { // probably could work on actually calculating the fraction effect later if we care. + if druid.Talents.ImprovedMarkOfTheWild == 2 { // probably could work on actually calculating the fraction effect later if we care. raidBuffs.GiftOfTheWild = proto.TristateEffect_TristateEffectImproved } @@ -107,16 +116,28 @@ const ravenGoddessItemID = 32387 func (druid *Druid) AddPartyBuffs(partyBuffs *proto.PartyBuffs) { } +func (druid *Druid) PrimalGoreOutcomeFuncTick() core.OutcomeApplier { + if druid.Talents.PrimalGore { + return druid.OutcomeFuncTickHitAndCrit(druid.MeleeCritMultiplier()) + } else { + return druid.OutcomeFuncTick() + } +} + func (druid *Druid) MeleeCritMultiplier() float64 { // Assumes that Predatory Instincts is a primary rather than secondary modifier for now, but this needs to confirmed! primaryModifier := 1.0 if druid.InForm(Cat | Bear) { - primaryModifier = 1 + 0.02*float64(druid.Talents.PredatoryInstincts) + primaryModifier = 1 + ((0.1 / 3) * float64(druid.Talents.PredatoryInstincts)) } return druid.Character.MeleeCritMultiplier(primaryModifier, 0) } func (druid *Druid) Initialize() { + if druid.Talents.PrimalPrecision > 0 { + druid.PrimalPrecisionRecoveryMetrics = druid.NewEnergyMetrics(core.ActionID{SpellID: 48410}) + } + druid.registerFaerieFireSpell() druid.registerRebirthSpell() druid.registerInnervateCD() @@ -132,7 +153,9 @@ func (druid *Druid) RegisterBalanceSpells() { } func (druid *Druid) RegisterBearSpells(maulRageThreshold float64) { + druid.registerBerserkCD() druid.registerBearFormSpell() + druid.registerEnrageSpell() druid.registerMangleBearSpell() druid.registerMaulSpell(maulRageThreshold) druid.registerLacerateSpell() @@ -141,12 +164,15 @@ func (druid *Druid) RegisterBearSpells(maulRageThreshold float64) { } func (druid *Druid) RegisterCatSpells() { + druid.registerBerserkCD() druid.registerCatFormSpell() druid.registerFerociousBiteSpell() druid.registerMangleCatSpell() + druid.registerRakeSpell() druid.registerRipSpell() + druid.registerSavageRoarSpell() druid.registerShredSpell() - druid.registerRakeSpell() + druid.registerTigersFurySpell() } func (druid *Druid) Reset(sim *core.Simulation) { diff --git a/sim/druid/enrage.go b/sim/druid/enrage.go new file mode 100644 index 0000000000..8ddf79929c --- /dev/null +++ b/sim/druid/enrage.go @@ -0,0 +1,58 @@ +package druid + +import ( + "time" + + "github.com/wowsims/wotlk/sim/core" +) + +func (druid *Druid) registerEnrageSpell() { + actionID := core.ActionID{SpellID: 5229} + rageMetrics := druid.NewRageMetrics(actionID) + + instantRage := []float64{20, 24, 27, 30}[druid.Talents.Intensity] + + dmgBonus := 5.0 * float64(druid.Talents.KingOfTheJungle) + + druid.EnrageAura = druid.RegisterAura(core.Aura{ + Label: "Enrage Aura", + ActionID: actionID, + Duration: 10, + OnGain: func(aura *core.Aura, sim *core.Simulation) { + druid.PseudoStats.DamageDealtMultiplier += dmgBonus + }, + OnExpire: func(aura *core.Aura, sim *core.Simulation) { + druid.PseudoStats.DamageDealtMultiplier -= dmgBonus + }, + }) + + spell := druid.RegisterSpell(core.SpellConfig{ + ActionID: actionID, + + Cast: core.CastConfig{ + CD: core.Cooldown{ + Timer: druid.NewTimer(), + Duration: time.Minute, + }, + IgnoreHaste: true, + }, + + ApplyEffects: func(sim *core.Simulation, _ *core.Unit, _ *core.Spell) { + druid.AddRage(sim, instantRage, rageMetrics) + + core.StartPeriodicAction(sim, core.PeriodicActionOptions{ + NumTicks: 10, + Period: time.Second * 1, + OnAction: func(sim *core.Simulation) { + if druid.EnrageAura.IsActive() { + druid.AddRage(sim, 1, rageMetrics) + } + }, + }) + + druid.EnrageAura.Activate(sim) + }, + }) + + druid.Enrage = spell +} diff --git a/sim/druid/faerie_fire.go b/sim/druid/faerie_fire.go index d092def15d..a2fc456cbc 100644 --- a/sim/druid/faerie_fire.go +++ b/sim/druid/faerie_fire.go @@ -14,6 +14,7 @@ func (druid *Druid) registerFaerieFireSpell() { gcd := core.GCDDefault ignoreHaste := false cd := core.Cooldown{} + baseDamage := core.BaseDamageConfigMelee(0, 0, 0) if druid.InForm(Cat | Bear) { actionID = core.ActionID{SpellID: 16857} @@ -27,6 +28,10 @@ func (druid *Druid) registerFaerieFireSpell() { } } + if druid.InForm(Bear) { + baseDamage = core.BaseDamageConfigMelee(1, 1, 0.15) + } + druid.FaerieFireAura = core.FaerieFireAura(druid.CurrentTarget, druid.Talents.ImprovedFaerieFire > 0) druid.FaerieFire = druid.RegisterSpell(core.SpellConfig{ @@ -47,6 +52,7 @@ func (druid *Druid) registerFaerieFireSpell() { ApplyEffects: core.ApplyEffectFuncDirectDamage(core.SpellEffect{ ProcMask: core.ProcMaskSpellDamage, + BaseDamage: baseDamage, ThreatMultiplier: 1, FlatThreatBonus: 66 * 2, OutcomeApplier: druid.OutcomeFuncMagicHit(), diff --git a/sim/druid/ferocious_bite.go b/sim/druid/ferocious_bite.go index 2e93b29632..0b047e9d0c 100644 --- a/sim/druid/ferocious_bite.go +++ b/sim/druid/ferocious_bite.go @@ -11,6 +11,7 @@ import ( func (druid *Druid) registerFerociousBiteSpell() { actionID := core.ActionID{SpellID: 24248} baseCost := 35.0 + refundAmount := baseCost * (0.4 * float64(druid.Talents.PrimalPrecision)) dmgPerComboPoint := 169.0 if druid.Equip[items.ItemSlotRanged].ID == 25667 { // Idol of the Beast @@ -34,9 +35,15 @@ func (druid *Druid) registerFerociousBiteSpell() { }, IgnoreHaste: true, ModifyCast: func(sim *core.Simulation, spell *core.Spell, cast *core.Cast) { + if druid.RipDot.IsActive() || druid.RakeDot.IsActive() || druid.LacerateDot.IsActive() { + spell.BonusCritRating = 5.0 * float64(druid.Talents.RendAndTear) * core.CritRatingPerCritChance + } else { + spell.BonusCritRating = 0 + } + druid.ApplyClearcasting(sim, spell, cast) - excessEnergy = spell.Unit.CurrentEnergy() - cast.Cost - cast.Cost = spell.Unit.CurrentEnergy() + excessEnergy = core.MinFloat(spell.Unit.CurrentEnergy()-cast.Cost, 30) + cast.Cost = baseCost + excessEnergy }, }, @@ -62,6 +69,8 @@ func (druid *Druid) registerFerociousBiteSpell() { OnSpellHitDealt: func(sim *core.Simulation, spell *core.Spell, spellEffect *core.SpellEffect) { if spellEffect.Landed() { druid.SpendComboPoints(sim, spell.ComboPointMetrics()) + } else if refundAmount > 0 { + druid.AddEnergy(sim, refundAmount, druid.PrimalPrecisionRecoveryMetrics) } }, }), diff --git a/sim/druid/forms.go b/sim/druid/forms.go index e431b86b6a..007cb153cb 100644 --- a/sim/druid/forms.go +++ b/sim/druid/forms.go @@ -4,7 +4,6 @@ import ( "time" "github.com/wowsims/wotlk/sim/core" - "github.com/wowsims/wotlk/sim/core/items" "github.com/wowsims/wotlk/sim/core/stats" ) @@ -52,12 +51,7 @@ func (druid *Druid) registerCatFormSpell() { actionID := core.ActionID{SpellID: 768} baseCost := druid.BaseMana * 0.35 - furorProcChance := 0.2 * float64(druid.Talents.Furor) - - finalEnergy := 0.0 - if druid.Equip[items.ItemSlotHead].ID == 8345 { // Wolfshead Helm - finalEnergy += 20.0 - } + srm := druid.getSavageRoarMultiplier() druid.CatFormAura = druid.GetOrRegisterAura(core.Aura{ Label: "Cat Form", @@ -69,6 +63,14 @@ func (druid *Druid) registerCatFormSpell() { druid.manageCooldownsEnabled(sim) druid.PseudoStats.SpiritRegenMultiplier *= AnimalSpiritRegenSuppression druid.UpdateManaRegenRates() + + // These buffs stay up, but corresponding changes don't + if druid.SavageRoarAura.IsActive() { + druid.PseudoStats.PhysicalDamageDealtMultiplier *= srm + } + if druid.BerserkAura.IsActive() { + druid.PseudoStats.CostMultiplier /= 2.0 + } }, OnExpire: func(aura *core.Aura, sim *core.Simulation) { druid.form = Humanoid @@ -76,6 +78,16 @@ func (druid *Druid) registerCatFormSpell() { druid.manageCooldownsEnabled(sim) druid.PseudoStats.SpiritRegenMultiplier /= AnimalSpiritRegenSuppression druid.UpdateManaRegenRates() + + druid.TigersFuryAura.Deactivate(sim) + + // These buffs stay up, but corresponding changes don't + if druid.SavageRoarAura.IsActive() { + druid.PseudoStats.PhysicalDamageDealtMultiplier /= srm + } + if druid.BerserkAura.IsActive() { + druid.PseudoStats.CostMultiplier *= 2.0 + } }, }) @@ -90,21 +102,18 @@ func (druid *Druid) registerCatFormSpell() { Cast: core.CastConfig{ DefaultCast: core.Cast{ - Cost: baseCost * (1 - 0.1*float64(druid.Talents.NaturalShapeshifter)), + Cost: baseCost * (1 - 0.2*float64(druid.Talents.KingOfTheJungle)) * (1 - 0.1*float64(druid.Talents.NaturalShapeshifter)), GCD: core.GCDDefault, }, IgnoreHaste: true, }, ApplyEffects: func(sim *core.Simulation, _ *core.Unit, spell *core.Spell) { - energyDelta := finalEnergy - druid.CurrentEnergy() - if furorProcChance == 1 || (furorProcChance > 0 && sim.RandomFloat("Furor") < furorProcChance) { - energyDelta += 40.0 - } + maxShiftEnergy := float64(20 * druid.Talents.Furor) + + energyDelta := maxShiftEnergy - druid.CurrentEnergy() - if energyDelta > 0 { - druid.AddEnergy(sim, energyDelta, energyMetrics) - } else if energyDelta < 0 { + if energyDelta < 0 { druid.SpendEnergy(sim, -energyDelta, energyMetrics) } druid.CatFormAura.Activate(sim) @@ -133,9 +142,6 @@ func (druid *Druid) registerBearFormSpell() { previousRage := 0.0 finalRage := 0.0 - if druid.Equip[items.ItemSlotHead].ID == 8345 { // Wolfshead Helm - finalRage += 5.0 - } druid.BearFormAura = druid.GetOrRegisterAura(core.Aura{ Label: "Bear Form", @@ -155,6 +161,7 @@ func (druid *Druid) registerBearFormSpell() { druid.manageCooldownsEnabled(sim) druid.PseudoStats.SpiritRegenMultiplier /= AnimalSpiritRegenSuppression druid.UpdateManaRegenRates() + druid.EnrageAura.Deactivate(sim) }, }) @@ -169,7 +176,7 @@ func (druid *Druid) registerBearFormSpell() { Cast: core.CastConfig{ DefaultCast: core.Cast{ - Cost: baseCost * (1 - 0.1*float64(druid.Talents.NaturalShapeshifter)), + Cost: baseCost * (1 - 0.2*float64(druid.Talents.KingOfTheJungle)) * (1 - 0.1*float64(druid.Talents.NaturalShapeshifter)), GCD: core.GCDDefault, }, IgnoreHaste: true, diff --git a/sim/druid/lacerate.go b/sim/druid/lacerate.go index c4298af0bb..8be9820535 100644 --- a/sim/druid/lacerate.go +++ b/sim/druid/lacerate.go @@ -99,7 +99,7 @@ func (druid *Druid) registerLacerateSpell() { }, TargetSpellCoefficient: 0, }, dotAura), - OutcomeApplier: druid.OutcomeFuncTick(), + OutcomeApplier: druid.PrimalGoreOutcomeFuncTick(), })), }) } diff --git a/sim/druid/mangle.go b/sim/druid/mangle.go index 04ccbf3eb1..c22c6e67d5 100644 --- a/sim/druid/mangle.go +++ b/sim/druid/mangle.go @@ -16,6 +16,7 @@ func (druid *Druid) registerMangleBearSpell() { cost := 20.0 - float64(druid.Talents.Ferocity) refundAmount := cost * 0.8 + durReduction := (0.5) * float64(druid.Talents.ImprovedMangle) druid.Mangle = druid.RegisterSpell(core.SpellConfig{ ActionID: core.ActionID{SpellID: 33987}, @@ -34,14 +35,14 @@ func (druid *Druid) registerMangleBearSpell() { IgnoreHaste: true, CD: core.Cooldown{ Timer: druid.NewTimer(), - Duration: time.Second * 6, + Duration: time.Duration(float64(time.Second) * (6 - durReduction)), }, }, ApplyEffects: core.ApplyEffectFuncDirectDamage(core.SpellEffect{ ProcMask: core.ProcMaskMeleeMHSpecial, - DamageMultiplier: 1, + DamageMultiplier: 1 + 0.1*float64(druid.Talents.SavageFury), ThreatMultiplier: (1.5 / 1.15) * core.TernaryFloat64(druid.InForm(Bear) && druid.HasSetBonus(ItemSetThunderheartHarness, 2), 1.15, 1), @@ -54,6 +55,10 @@ func (druid *Druid) registerMangleBearSpell() { } else { druid.AddRage(sim, refundAmount, druid.RageRefundMetrics) } + + if druid.BerserkAura.IsActive() { + spell.CD.Reset() + } }, }), }) @@ -66,7 +71,7 @@ func (druid *Druid) registerMangleCatSpell() { druid.MangleAura = core.MangleAura(druid.CurrentTarget) - cost := 45.0 - float64(druid.Talents.Ferocity) - core.TernaryFloat64(druid.HasSetBonus(ItemSetThunderheartHarness, 2), 5.0, 0) + cost := 45.0 - (2.0 * float64(druid.Talents.ImprovedMangle)) - float64(druid.Talents.Ferocity) - core.TernaryFloat64(druid.HasSetBonus(ItemSetThunderheartHarness, 2), 5.0, 0) refundAmount := cost * 0.8 druid.Mangle = druid.RegisterSpell(core.SpellConfig{ diff --git a/sim/druid/maul.go b/sim/druid/maul.go index d7ba0e1b3f..8fec386c8e 100644 --- a/sim/druid/maul.go +++ b/sim/druid/maul.go @@ -33,7 +33,7 @@ func (druid *Druid) registerMaulSpell(rageThreshold float64) { ApplyEffects: core.ApplyEffectFuncDirectDamage(core.SpellEffect{ ProcMask: core.ProcMaskMeleeMHAuto | core.ProcMaskMeleeMHSpecial, - DamageMultiplier: 1, + DamageMultiplier: 1 + 0.1*float64(druid.Talents.SavageFury), ThreatMultiplier: 1, FlatThreatBonus: 344, diff --git a/sim/druid/rake.go b/sim/druid/rake.go index 902c92fe29..a8f9369287 100644 --- a/sim/druid/rake.go +++ b/sim/druid/rake.go @@ -35,7 +35,7 @@ func (druid *Druid) registerRakeSpell() { ApplyEffects: core.ApplyEffectFuncDirectDamage(core.SpellEffect{ ProcMask: core.ProcMaskMeleeMHSpecial, - DamageMultiplier: 1, + DamageMultiplier: 1 + 0.1*float64(druid.Talents.SavageFury), ThreatMultiplier: 1, BaseDamage: core.BaseDamageConfig{ diff --git a/sim/druid/rip.go b/sim/druid/rip.go index 6239c51e20..0f9a25326c 100644 --- a/sim/druid/rip.go +++ b/sim/druid/rip.go @@ -12,6 +12,7 @@ import ( func (druid *Druid) registerRipSpell() { actionID := core.ActionID{SpellID: 27008} baseCost := 30.0 + refundAmount := baseCost * (0.4 * float64(druid.Talents.PrimalPrecision)) druid.Rip = druid.RegisterSpell(core.SpellConfig{ ActionID: actionID, @@ -39,6 +40,8 @@ func (druid *Druid) registerRipSpell() { if spellEffect.Landed() { druid.RipDot.Apply(sim) druid.SpendComboPoints(sim, spell.ComboPointMetrics()) + } else if refundAmount > 0 { + druid.AddEnergy(sim, refundAmount, druid.PrimalPrecisionRecoveryMetrics) } }, }), @@ -78,7 +81,7 @@ func (druid *Druid) registerRipSpell() { return (1554+0.24*attackPower)/6 + bonusTickDamage } }, 0), - OutcomeApplier: druid.OutcomeFuncTick(), + OutcomeApplier: druid.PrimalGoreOutcomeFuncTick(), }), }) } diff --git a/sim/druid/savage_roar.go b/sim/druid/savage_roar.go new file mode 100644 index 0000000000..7f5e60f0e6 --- /dev/null +++ b/sim/druid/savage_roar.go @@ -0,0 +1,54 @@ +package druid + +import ( + "time" + + "github.com/wowsims/wotlk/sim/core" + "github.com/wowsims/wotlk/sim/core/stats" +) + +func (druid *Druid) getSavageRoarMultiplier() float64 { + return 1.3 +} + +func (druid *Druid) registerSavageRoarSpell() { + actionID := core.ActionID{SpellID: 52610} + baseCost := 25.0 + + srm := druid.getSavageRoarMultiplier() + + druid.SavageRoarAura = druid.RegisterAura(core.Aura{ + Label: "Savage Roar Aura", + ActionID: actionID, + Duration: 9, + OnGain: func(aura *core.Aura, sim *core.Simulation) { + druid.PseudoStats.PhysicalDamageDealtMultiplier *= srm + }, + OnExpire: func(aura *core.Aura, sim *core.Simulation) { + druid.PseudoStats.PhysicalDamageDealtMultiplier /= srm + }, + }) + + srSpell := druid.RegisterSpell(core.SpellConfig{ + ActionID: actionID, + + ResourceType: stats.Energy, + BaseCost: baseCost, + + Cast: core.CastConfig{ + DefaultCast: core.Cast{ + Cost: baseCost, + GCD: time.Second, + }, + IgnoreHaste: true, + }, + + ApplyEffects: func(sim *core.Simulation, _ *core.Unit, spell *core.Spell) { + druid.SpendComboPoints(sim, spell.ComboPointMetrics()) + druid.TigersFuryAura.Duration = time.Duration(float64(time.Second) * (9.0 + (5.0)*float64(druid.ComboPoints()))) + druid.TigersFuryAura.Activate(sim) + }, + }) + + druid.SavageRoar = srSpell +} diff --git a/sim/druid/shred.go b/sim/druid/shred.go index 68c8281fe9..1795609d64 100644 --- a/sim/druid/shred.go +++ b/sim/druid/shred.go @@ -43,11 +43,15 @@ func (druid *Druid) registerShredSpell() { func(oldCalculator core.BaseDamageCalculator) core.BaseDamageCalculator { return func(sim *core.Simulation, spellEffect *core.SpellEffect, spell *core.Spell) float64 { normalDamage := oldCalculator(sim, spellEffect, spell) - if druid.MangleAura.IsActive() { - return normalDamage * 1.3 - } else { - return normalDamage + modifier := 1.0 + if druid.CurrentTarget.HasActiveAuraWithTag(core.BleedDamageAuraTag) { + modifier += .3 } + if druid.RipDot.IsActive() || druid.RakeDot.IsActive() || druid.LacerateDot.IsActive() { + modifier += (0.04 * float64(druid.Talents.RendAndTear)) + } + + return normalDamage * modifier } }), OutcomeApplier: druid.OutcomeFuncMeleeSpecialHitAndCrit(druid.MeleeCritMultiplier()), diff --git a/sim/druid/talents.go b/sim/druid/talents.go index 906cbd77aa..d6e2c6acb6 100644 --- a/sim/druid/talents.go +++ b/sim/druid/talents.go @@ -4,6 +4,7 @@ import ( "time" "github.com/wowsims/wotlk/sim/core" + "github.com/wowsims/wotlk/sim/core/items" "github.com/wowsims/wotlk/sim/core/stats" ) @@ -13,12 +14,23 @@ func (druid *Druid) ApplyTalents() { druid.AddStat(stats.SpellHaste, float64(druid.Talents.CelestialFocus)*1*core.HasteRatingPerHastePercent) druid.AddStat(stats.SpellPower, (float64(druid.Talents.ImprovedMoonkinForm)*0.1)*druid.GetStat(stats.Spirit)) druid.PseudoStats.DamageDealtMultiplier *= 1 + (float64(druid.Talents.EarthAndMoon) * 0.02) - druid.PseudoStats.SpiritRegenRateCasting = float64(druid.Talents.Intensity) * 0.1 + druid.PseudoStats.SpiritRegenRateCasting = float64(druid.Talents.Intensity) * (0.5 / 3) druid.PseudoStats.ThreatMultiplier *= 1 - 0.04*float64(druid.Talents.Subtlety) druid.PseudoStats.PhysicalDamageDealtMultiplier *= 1 + 0.02*float64(druid.Talents.Naturalist) if druid.InForm(Bear | Cat) { - druid.AddStat(stats.AttackPower, float64(druid.Talents.PredatoryStrikes)*0.5*float64(core.CharacterLevel)) + if druid.Talents.PredatoryStrikes > 0 { + druid.AddStat(stats.AttackPower, float64(druid.Talents.PredatoryStrikes)*0.5*float64(core.CharacterLevel)) + + weap := druid.GetMHWeapon() + if weap != nil { + weap := druid.Equip[items.ItemSlotMainHand] + dps := (((weap.WeaponDamageMax - weap.WeaponDamageMin) / 2.0) + weap.WeaponDamageMin) / weap.SwingSpeed + fap := (dps - 54.8) * 14 + + druid.AddStat(stats.AttackPower, fap*((0.2/3)*float64(druid.Talents.PredatoryStrikes))) + } + } druid.AddStat(stats.MeleeCrit, float64(druid.Talents.SharpenedClaws)*2*core.CritRatingPerCritChance) druid.AddStat(stats.Dodge, core.DodgeRatingPerDodgeChance*2*float64(druid.Talents.FeralSwiftness)) } @@ -45,18 +57,42 @@ func (druid *Druid) ApplyTalents() { if druid.InForm(Cat) { druid.MultiplyStat(stats.AttackPower, 1.0+0.5*bonus) } else if druid.InForm(Bear) { - druid.MultiplyStat(stats.Stamina, 1.0+bonus) + druid.MultiplyStat(stats.Stamina, 1.0+0.5*bonus) } } if druid.Talents.SurvivalOfTheFittest > 0 { - bonus := 0.01 * float64(druid.Talents.SurvivalOfTheFittest) + bonus := 0.02 * float64(druid.Talents.SurvivalOfTheFittest) + druid.MultiplyStat(stats.Stamina, 1.0+bonus) + druid.MultiplyStat(stats.Strength, 1.0+bonus) + druid.MultiplyStat(stats.Agility, 1.0+bonus) + druid.MultiplyStat(stats.Intellect, 1.0+bonus) + druid.MultiplyStat(stats.Spirit, 1.0+bonus) + druid.PseudoStats.ReducedCritTakenChance += 0.02 * float64(druid.Talents.SurvivalOfTheFittest) + if druid.InForm(Bear) { + druid.AddStat(stats.Armor, druid.Equip.Stats()[stats.Armor]*(0.33/3)*float64(druid.Talents.ThickHide)) + } + } + + if druid.Talents.ImprovedMarkOfTheWild > 0 { + bonus := 0.01 * float64(druid.Talents.ImprovedMarkOfTheWild) druid.MultiplyStat(stats.Stamina, 1.0+bonus) druid.MultiplyStat(stats.Strength, 1.0+bonus) druid.MultiplyStat(stats.Agility, 1.0+bonus) druid.MultiplyStat(stats.Intellect, 1.0+bonus) druid.MultiplyStat(stats.Spirit, 1.0+bonus) - druid.PseudoStats.ReducedCritTakenChance += 0.01 * float64(druid.Talents.SurvivalOfTheFittest) + } + + if druid.Talents.ProtectorOfThePack > 0 { + bonus := 0.02 * float64(druid.Talents.ProtectorOfThePack) + if druid.InForm(Bear) { + druid.MultiplyStat(stats.AttackPower, 1.0+bonus) + druid.PseudoStats.DamageTakenMultiplier -= 0.04 * float64(druid.Talents.ProtectorOfThePack) + } + } + + if druid.Talents.PrimalPrecision > 0 { + druid.AddStat(stats.Expertise, 5.0*float64(druid.Talents.PrimalPrecision)) } if druid.Talents.LivingSpirit > 0 { @@ -64,6 +100,15 @@ func (druid *Druid) ApplyTalents() { druid.MultiplyStat(stats.Spirit, 1.0+bonus) } + if druid.Talents.MasterShapeshifter > 0 { + bonus := 0.02 * float64(druid.Talents.MasterShapeshifter) + if druid.InForm(Bear) { + druid.PseudoStats.DamageDealtMultiplier += bonus + } else if druid.InForm(Cat) { + druid.AddStat(stats.MeleeCrit, 2*float64(druid.Talents.MasterShapeshifter)*core.CritRatingPerCritChance) + } + } + druid.setupNaturesGrace() druid.registerNaturesSwiftnessCD() druid.applyPrimalFury() @@ -197,7 +242,7 @@ func (druid *Druid) applyPrimalFury() { } } } else if druid.InForm(Cat) { - if spell == druid.Mangle || spell == druid.Shred { + if spell == druid.Mangle || spell == druid.Shred || spell == druid.Rake { if spellEffect.Outcome.Matches(core.OutcomeCrit) { if procChance == 1 || sim.RandomFloat("Primal Fury") < procChance { druid.AddComboPoints(sim, 1, cpMetrics) @@ -214,11 +259,7 @@ func (druid *Druid) applyOmenOfClarity() { return } - ppmm := druid.AutoAttacks.NewPPMManager(2.0, core.ProcMaskMelee) - icd := core.Cooldown{ - Timer: druid.NewTimer(), - Duration: time.Second * 10, - } + ppmm := druid.AutoAttacks.NewPPMManager(3.5, core.ProcMaskMelee) druid.ClearcastingAura = druid.RegisterAura(core.Aura{ Label: "Clearcasting", @@ -233,16 +274,12 @@ func (druid *Druid) applyOmenOfClarity() { aura.Activate(sim) }, OnSpellHitDealt: func(aura *core.Aura, sim *core.Simulation, spell *core.Spell, spellEffect *core.SpellEffect) { - if !spellEffect.Landed() || !spellEffect.ProcMask.Matches(core.ProcMaskMelee) { - return - } - if !icd.IsReady(sim) { + if !spellEffect.Landed() || !spellEffect.ProcMask.Matches(core.ProcMaskMeleeSpecial) { return } if !ppmm.Proc(sim, spellEffect.ProcMask, "Omen of Clarity") { return } - icd.Use(sim) druid.ClearcastingAura.Activate(sim) }, }) diff --git a/sim/druid/tigers_fury.go b/sim/druid/tigers_fury.go new file mode 100644 index 0000000000..c7096a4a9f --- /dev/null +++ b/sim/druid/tigers_fury.go @@ -0,0 +1,46 @@ +package druid + +import ( + "time" + + "github.com/wowsims/wotlk/sim/core" +) + +func (druid *Druid) registerTigersFurySpell() { + actionID := core.ActionID{SpellID: 50213} + energyMetrics := druid.NewEnergyMetrics(actionID) + instantEnergy := 20.0 * float64(druid.Talents.KingOfTheJungle) + + dmgBonus := 40.0 + + druid.TigersFuryAura = druid.RegisterAura(core.Aura{ + Label: "Tiger's Fury Aura", + ActionID: actionID, + Duration: 6, + OnGain: func(aura *core.Aura, sim *core.Simulation) { + druid.PseudoStats.BonusDamage += dmgBonus + }, + OnExpire: func(aura *core.Aura, sim *core.Simulation) { + druid.PseudoStats.BonusDamage -= dmgBonus + }, + }) + + spell := druid.RegisterSpell(core.SpellConfig{ + ActionID: actionID, + + Cast: core.CastConfig{ + CD: core.Cooldown{ + Timer: druid.NewTimer(), + Duration: time.Second * 30, + }, + }, + + ApplyEffects: func(sim *core.Simulation, _ *core.Unit, _ *core.Spell) { + druid.AddEnergy(sim, instantEnergy, energyMetrics) + + druid.TigersFuryAura.Activate(sim) + }, + }) + + druid.TigersFury = spell +} diff --git a/ui/feral_druid/presets.ts b/ui/feral_druid/presets.ts index 3dbfbe02c2..c09d0c0767 100644 --- a/ui/feral_druid/presets.ts +++ b/ui/feral_druid/presets.ts @@ -20,7 +20,7 @@ import * as Tooltips from '../core/constants/tooltips.js'; export const StandardTalents = { name: 'Standard', data: SavedTalents.create({ - talentsString: '-503032132322105301251-05503301', + talentsString: '-503202132322010053120230310511-205503012', }), }; From 0d47612473160b1547e96a40df586cb48e2dbc86 Mon Sep 17 00:00:00 2001 From: jarves Date: Fri, 19 Aug 2022 04:21:30 -0500 Subject: [PATCH 2/6] feral: update spell ids / damage for wotlk Signed-off-by: jarves --- sim/druid/demoralizing_roar.go | 2 +- sim/druid/ferocious_bite.go | 11 ++++++----- sim/druid/lacerate.go | 6 +++--- sim/druid/mangle.go | 20 ++++++++++++++++---- sim/druid/maul.go | 2 +- sim/druid/rake.go | 6 +++--- sim/druid/rip.go | 15 +++------------ sim/druid/shred.go | 4 ++-- sim/druid/swipe.go | 4 ++-- sim/druid/tigers_fury.go | 2 +- 10 files changed, 38 insertions(+), 34 deletions(-) diff --git a/sim/druid/demoralizing_roar.go b/sim/druid/demoralizing_roar.go index a7e1847359..3dcc49f00b 100644 --- a/sim/druid/demoralizing_roar.go +++ b/sim/druid/demoralizing_roar.go @@ -36,7 +36,7 @@ func (druid *Druid) registerDemoralizingRoarSpell() { } druid.DemoralizingRoar = druid.RegisterSpell(core.SpellConfig{ - ActionID: core.ActionID{SpellID: 26998}, + ActionID: core.ActionID{SpellID: 48560}, SpellSchool: core.SpellSchoolPhysical, ResourceType: stats.Rage, diff --git a/sim/druid/ferocious_bite.go b/sim/druid/ferocious_bite.go index 0b047e9d0c..271fed1f78 100644 --- a/sim/druid/ferocious_bite.go +++ b/sim/druid/ferocious_bite.go @@ -9,11 +9,11 @@ import ( ) func (druid *Druid) registerFerociousBiteSpell() { - actionID := core.ActionID{SpellID: 24248} + actionID := core.ActionID{SpellID: 48577} baseCost := 35.0 refundAmount := baseCost * (0.4 * float64(druid.Talents.PrimalPrecision)) - dmgPerComboPoint := 169.0 + dmgPerComboPoint := 290.0 if druid.Equip[items.ItemSlotRanged].ID == 25667 { // Idol of the Beast dmgPerComboPoint += 14 } @@ -58,9 +58,10 @@ func (druid *Druid) registerFerociousBiteSpell() { Calculator: func(sim *core.Simulation, hitEffect *core.SpellEffect, spell *core.Spell) float64 { comboPoints := float64(druid.ComboPoints()) - base := 57.0 + dmgPerComboPoint*comboPoints + 4.1*excessEnergy - roll := sim.RandomFloat("Ferocious Bite") * 66.0 - return base + roll + hitEffect.MeleeAttackPower(spell.Unit)*0.05*comboPoints + bonusDmg := excessEnergy * (9.4 + hitEffect.MeleeAttackPower(spell.Unit)/410) + base := 120.0 + dmgPerComboPoint*comboPoints + bonusDmg + roll := sim.RandomFloat("Ferocious Bite") * 140.0 + return base + roll + hitEffect.MeleeAttackPower(spell.Unit)*0.07*comboPoints }, TargetSpellCoefficient: 1, }, diff --git a/sim/druid/lacerate.go b/sim/druid/lacerate.go index 8be9820535..03a84ea6c7 100644 --- a/sim/druid/lacerate.go +++ b/sim/druid/lacerate.go @@ -10,12 +10,12 @@ import ( ) func (druid *Druid) registerLacerateSpell() { - actionID := core.ActionID{SpellID: 33745} + actionID := core.ActionID{SpellID: 48568} cost := 15.0 - float64(druid.Talents.ShreddingAttacks) refundAmount := cost * 0.8 - tickDamage := 155.0 / 5 + tickDamage := 320.0 / 5 if druid.HasSetBonus(ItemSetNordrassilHarness, 4) { tickDamage += 15 } @@ -50,7 +50,7 @@ func (druid *Druid) registerLacerateSpell() { BaseDamage: core.BaseDamageConfig{ Calculator: func(sim *core.Simulation, hitEffect *core.SpellEffect, spell *core.Spell) float64 { - damage := tickDamage + 0.01*hitEffect.MeleeAttackPower(spell.Unit) + damage := 88 + 0.01*hitEffect.MeleeAttackPower(spell.Unit) if mangleAura.IsActive() { return damage * 1.3 } else { diff --git a/sim/druid/mangle.go b/sim/druid/mangle.go index c22c6e67d5..76f469e50d 100644 --- a/sim/druid/mangle.go +++ b/sim/druid/mangle.go @@ -19,7 +19,7 @@ func (druid *Druid) registerMangleBearSpell() { durReduction := (0.5) * float64(druid.Talents.ImprovedMangle) druid.Mangle = druid.RegisterSpell(core.SpellConfig{ - ActionID: core.ActionID{SpellID: 33987}, + ActionID: core.ActionID{SpellID: 48564}, SpellSchool: core.SpellSchoolPhysical, Flags: core.SpellFlagMeleeMetrics, @@ -46,7 +46,7 @@ func (druid *Druid) registerMangleBearSpell() { ThreatMultiplier: (1.5 / 1.15) * core.TernaryFloat64(druid.InForm(Bear) && druid.HasSetBonus(ItemSetThunderheartHarness, 2), 1.15, 1), - BaseDamage: core.BaseDamageConfigMeleeWeapon(core.MainHand, false, 155/1.15, 1.0, 1.15, true), + BaseDamage: core.BaseDamageConfigMeleeWeapon(core.MainHand, false, 299/1.15, 1.0, 1.15, true), OutcomeApplier: druid.OutcomeFuncMeleeSpecialHitAndCrit(druid.MeleeCritMultiplier()), OnSpellHitDealt: func(sim *core.Simulation, spell *core.Spell, spellEffect *core.SpellEffect) { @@ -75,7 +75,7 @@ func (druid *Druid) registerMangleCatSpell() { refundAmount := cost * 0.8 druid.Mangle = druid.RegisterSpell(core.SpellConfig{ - ActionID: core.ActionID{SpellID: 33983}, + ActionID: core.ActionID{SpellID: 48566}, SpellSchool: core.SpellSchoolPhysical, Flags: core.SpellFlagMeleeMetrics, @@ -97,7 +97,7 @@ func (druid *Druid) registerMangleCatSpell() { DamageMultiplier: 1 + 0.1*float64(druid.Talents.SavageFury), ThreatMultiplier: 1, - BaseDamage: core.BaseDamageConfigMeleeWeapon(core.MainHand, false, 264/1.6, 1.0, 1.6, true), + BaseDamage: core.BaseDamageConfigMeleeWeapon(core.MainHand, false, 566/2.0, 1.0, 2.0, true), OutcomeApplier: druid.OutcomeFuncMeleeSpecialHitAndCrit(druid.MeleeCritMultiplier()), OnSpellHitDealt: func(sim *core.Simulation, spell *core.Spell, spellEffect *core.SpellEffect) { @@ -119,3 +119,15 @@ func (druid *Druid) CanMangleBear(sim *core.Simulation) bool { func (druid *Druid) CanMangleCat() bool { return druid.Mangle != nil && druid.CurrentEnergy() >= druid.Mangle.DefaultCast.Cost } + +func (druid *Druid) ShouldMangle(sim *core.Simulation) bool { + if druid.Mangle == nil { + return false + } + + if !druid.Mangle.IsReady(sim) { + return false + } + + return druid.CurrentTarget.ShouldRefreshAuraWithTagAtPriority(sim, core.BleedDamageAuraTag, druid.MangleAura.Priority, time.Second*3) +} diff --git a/sim/druid/maul.go b/sim/druid/maul.go index 8fec386c8e..757aa69137 100644 --- a/sim/druid/maul.go +++ b/sim/druid/maul.go @@ -10,7 +10,7 @@ func (druid *Druid) registerMaulSpell(rageThreshold float64) { cost := 15.0 - float64(druid.Talents.Ferocity) refundAmount := cost * 0.8 - baseDamage := 176.0 + baseDamage := 578.0 if druid.Equip[items.ItemSlotRanged].ID == 23198 { // Idol of Brutality baseDamage += 50 } diff --git a/sim/druid/rake.go b/sim/druid/rake.go index a8f9369287..a42ba28d11 100644 --- a/sim/druid/rake.go +++ b/sim/druid/rake.go @@ -9,7 +9,7 @@ import ( ) func (druid *Druid) registerRakeSpell() { - actionID := core.ActionID{SpellID: 27003} + actionID := core.ActionID{SpellID: 48574} cost := 40.0 - float64(druid.Talents.Ferocity) refundAmount := cost * 0.8 @@ -40,7 +40,7 @@ func (druid *Druid) registerRakeSpell() { BaseDamage: core.BaseDamageConfig{ Calculator: func(sim *core.Simulation, hitEffect *core.SpellEffect, spell *core.Spell) float64 { - damage := 78 + 0.01*hitEffect.MeleeAttackPower(spell.Unit) + damage := 176 + 0.01*hitEffect.MeleeAttackPower(spell.Unit) if mangleAura.IsActive() { return damage * 1.3 } else { @@ -78,7 +78,7 @@ func (druid *Druid) registerRakeSpell() { IsPeriodic: true, BaseDamage: core.BaseDamageConfig{ Calculator: func(sim *core.Simulation, hitEffect *core.SpellEffect, spell *core.Spell) float64 { - return 36 + 0.02*hitEffect.MeleeAttackPower(spell.Unit) + return 358 + 0.06*hitEffect.MeleeAttackPower(spell.Unit) }, TargetSpellCoefficient: 0, }, diff --git a/sim/druid/rip.go b/sim/druid/rip.go index 0f9a25326c..a6c1b04a5f 100644 --- a/sim/druid/rip.go +++ b/sim/druid/rip.go @@ -10,7 +10,7 @@ import ( ) func (druid *Druid) registerRipSpell() { - actionID := core.ActionID{SpellID: 27008} + actionID := core.ActionID{SpellID: 49800} baseCost := 30.0 refundAmount := baseCost * (0.4 * float64(druid.Talents.PrimalPrecision)) @@ -62,7 +62,7 @@ func (druid *Druid) registerRipSpell() { ThreatMultiplier: 1, IsPeriodic: true, BaseDamage: core.BuildBaseDamageConfig(func(sim *core.Simulation, hitEffect *core.SpellEffect, spell *core.Spell) float64 { - comboPoints := druid.ComboPoints() + comboPoints := float64(druid.ComboPoints()) attackPower := hitEffect.MeleeAttackPower(spell.Unit) bonusTickDamage := 0.0 @@ -70,16 +70,7 @@ func (druid *Druid) registerRipSpell() { bonusTickDamage += 7 * float64(comboPoints) } - if comboPoints < 3 { - panic("Only 3-5 CP Rips are supported at present.") - } - if comboPoints == 3 { - return (990+0.18*attackPower)/6 + bonusTickDamage - } else if comboPoints == 4 { - return (1272+0.24*attackPower)/6 + bonusTickDamage - } else { // 5 - return (1554+0.24*attackPower)/6 + bonusTickDamage - } + return (36.0+93.0*comboPoints+0.01*comboPoints*attackPower)/6.0 + bonusTickDamage }, 0), OutcomeApplier: druid.PrimalGoreOutcomeFuncTick(), }), diff --git a/sim/druid/shred.go b/sim/druid/shred.go index 1795609d64..d5d67aa541 100644 --- a/sim/druid/shred.go +++ b/sim/druid/shred.go @@ -12,12 +12,12 @@ func (druid *Druid) registerShredSpell() { baseCost := 60.0 - 9*float64(druid.Talents.ShreddingAttacks) refundAmount := baseCost * 0.8 - flatDamageBonus := 405 + + flatDamageBonus := 666 + core.TernaryFloat64(druid.HasSetBonus(ItemSetNordrassilHarness, 4), 75, 0) + core.TernaryFloat64(druid.Equip[items.ItemSlotRanged].ID == 29390, 88, 0) druid.Shred = druid.RegisterSpell(core.SpellConfig{ - ActionID: core.ActionID{SpellID: 27002}, + ActionID: core.ActionID{SpellID: 48572}, SpellSchool: core.SpellSchoolPhysical, Flags: core.SpellFlagMeleeMetrics, diff --git a/sim/druid/swipe.go b/sim/druid/swipe.go index 86d5a56712..553c16f100 100644 --- a/sim/druid/swipe.go +++ b/sim/druid/swipe.go @@ -9,7 +9,7 @@ import ( func (druid *Druid) registerSwipeSpell() { cost := 20.0 - float64(druid.Talents.Ferocity) - baseDamage := 84.0 + baseDamage := 108.0 if druid.Equip[items.ItemSlotRanged].ID == 23198 { // Idol of Brutality baseDamage += 10 } @@ -38,7 +38,7 @@ func (druid *Druid) registerSwipeSpell() { } druid.Swipe = druid.RegisterSpell(core.SpellConfig{ - ActionID: core.ActionID{SpellID: 26997}, + ActionID: core.ActionID{SpellID: 48562}, SpellSchool: core.SpellSchoolPhysical, Flags: core.SpellFlagMeleeMetrics, diff --git a/sim/druid/tigers_fury.go b/sim/druid/tigers_fury.go index c7096a4a9f..c1063a1802 100644 --- a/sim/druid/tigers_fury.go +++ b/sim/druid/tigers_fury.go @@ -11,7 +11,7 @@ func (druid *Druid) registerTigersFurySpell() { energyMetrics := druid.NewEnergyMetrics(actionID) instantEnergy := 20.0 * float64(druid.Talents.KingOfTheJungle) - dmgBonus := 40.0 + dmgBonus := 80.0 druid.TigersFuryAura = druid.RegisterAura(core.Aura{ Label: "Tiger's Fury Aura", From ccddb1e3833ad0d056ff30c1917ecdb33ad35f5a Mon Sep 17 00:00:00 2001 From: jarves Date: Fri, 19 Aug 2022 23:26:14 -0500 Subject: [PATCH 3/6] feral: merge cat / tank skills, fix crashes - merge cat / tank rotations, preparation for cat 'bearweaving' - fix some crashes Signed-off-by: jarves --- sim/druid/druid.go | 19 ++++++++----------- sim/druid/feral/feral.go | 2 +- sim/druid/feral/rotation.go | 23 ++++++++++++++--------- sim/druid/items.go | 6 +++--- sim/druid/mangle.go | 31 ++++++++++++++----------------- sim/druid/talents.go | 2 +- sim/druid/tank/rotation.go | 6 +++--- sim/druid/tank/tank.go | 2 +- 8 files changed, 45 insertions(+), 46 deletions(-) diff --git a/sim/druid/druid.go b/sim/druid/druid.go index 70f03aa27b..b6b193005e 100644 --- a/sim/druid/druid.go +++ b/sim/druid/druid.go @@ -26,7 +26,8 @@ type Druid struct { Hurricane *core.Spell InsectSwarm *core.Spell Lacerate *core.Spell - Mangle *core.Spell + MangleBear *core.Spell + MangleCat *core.Spell Maul *core.Spell Moonfire *core.Spell Rebirth *core.Spell @@ -152,26 +153,22 @@ func (druid *Druid) RegisterBalanceSpells() { druid.registerStarfallSpell() } -func (druid *Druid) RegisterBearSpells(maulRageThreshold float64) { +func (druid *Druid) RegisterFeralSpells(maulRageThreshold float64) { druid.registerBerserkCD() + druid.registerCatFormSpell() druid.registerBearFormSpell() + druid.registerDemoralizingRoarSpell() druid.registerEnrageSpell() + druid.registerFerociousBiteSpell() druid.registerMangleBearSpell() + druid.registerMangleCatSpell() druid.registerMaulSpell(maulRageThreshold) druid.registerLacerateSpell() - druid.registerSwipeSpell() - druid.registerDemoralizingRoarSpell() -} - -func (druid *Druid) RegisterCatSpells() { - druid.registerBerserkCD() - druid.registerCatFormSpell() - druid.registerFerociousBiteSpell() - druid.registerMangleCatSpell() druid.registerRakeSpell() druid.registerRipSpell() druid.registerSavageRoarSpell() druid.registerShredSpell() + druid.registerSwipeSpell() druid.registerTigersFurySpell() } diff --git a/sim/druid/feral/feral.go b/sim/druid/feral/feral.go index 6ac42fd447..4a84f1cb8b 100644 --- a/sim/druid/feral/feral.go +++ b/sim/druid/feral/feral.go @@ -98,7 +98,7 @@ func (cat *FeralDruid) GetDruid() *druid.Druid { func (cat *FeralDruid) Initialize() { cat.Druid.Initialize() - cat.RegisterCatSpells() + cat.RegisterFeralSpells(15) cat.DelayDPSCooldownsForArmorDebuffs() } diff --git a/sim/druid/feral/rotation.go b/sim/druid/feral/rotation.go index 040c792db0..a7a85b9880 100644 --- a/sim/druid/feral/rotation.go +++ b/sim/druid/feral/rotation.go @@ -82,7 +82,11 @@ func (cat *FeralDruid) doRotation(sim *core.Simulation) bool { (ripDebuff && sim.Duration-ripEnd < RipEndThresh))) mangleNow := !ripNow && !mangleDebuff - mangleCost := cat.Mangle.DefaultCast.Cost + + mangleCost := 45.0 + if cat.MangleCat != nil { + mangleCost = cat.MangleCat.DefaultCast.Cost + } biteBeforeRip := ripDebuff && rotation.UseBite && ripEnd-sim.CurrentTime >= BiteTime @@ -121,9 +125,9 @@ func (cat *FeralDruid) doRotation(sim *core.Simulation) bool { if ripNow && (energy >= 30 || omenProc) { cat.Metrics.MarkOOM(&cat.Unit, time.Second) return cat.Rip.Cast(sim, cat.CurrentTarget) - } else if mangleNow && (energy >= mangleCost || omenProc) { + } else if mangleNow && cat.CanMangleCat() { cat.Metrics.MarkOOM(&cat.Unit, time.Second) - return cat.Mangle.Cast(sim, cat.CurrentTarget) + return cat.MangleCat.Cast(sim, cat.CurrentTarget) } else if biteNow && (energy >= 35 || omenProc) { cat.Metrics.MarkOOM(&cat.Unit, time.Second) return cat.FerociousBite.Cast(sim, cat.CurrentTarget) @@ -197,8 +201,8 @@ func (cat *FeralDruid) doRotation(sim *core.Simulation) bool { } else if mangleNow { if energy < mangleCost-20 && !ripNext { cat.shift(sim) - } else if energy >= mangleCost || omenProc { - return cat.Mangle.Cast(sim, cat.CurrentTarget) + } else if cat.CanMangleCat() { + return cat.MangleCat.Cast(sim, cat.CurrentTarget) } else if timeToNextTick > MaxWaitTime { cat.shift(sim) } @@ -215,14 +219,15 @@ func (cat *FeralDruid) doRotation(sim *core.Simulation) bool { if energy >= 2*mangleCost-20 && energy < 22+mangleCost && timeToNextTick <= 1.0*time.Second && rotation.UseMangleTrick && - (!rotation.UseRakeTrick || mangleCost == 35) { - return cat.Mangle.Cast(sim, cat.CurrentTarget) + (!rotation.UseRakeTrick || mangleCost == 35) && + cat.CanMangleCat() { + return cat.MangleCat.Cast(sim, cat.CurrentTarget) } if energy >= 42 { return cat.Shred.Cast(sim, cat.CurrentTarget) } - if energy >= mangleCost && timeToNextTick > time.Second+cat.latency { - return cat.Mangle.Cast(sim, cat.CurrentTarget) + if cat.CanMangleCat() && timeToNextTick > time.Second+cat.latency { + return cat.MangleCat.Cast(sim, cat.CurrentTarget) } if timeToNextTick > MaxWaitTime { cat.shift(sim) diff --git a/sim/druid/items.go b/sim/druid/items.go index db95a2ee3d..89ce401a3a 100644 --- a/sim/druid/items.go +++ b/sim/druid/items.go @@ -190,7 +190,7 @@ func init() { if sim.RandomFloat("Ashtongue Talisman") < 0.25 { procAura.Activate(sim) } - } else if druid.Mangle != nil && spell == druid.Mangle { + } else if druid.IsMangle(spell) { if sim.RandomFloat("Ashtongue Talisman") < 0.4 { procAura.Activate(sim) } @@ -212,7 +212,7 @@ func init() { aura.Activate(sim) }, OnSpellHitDealt: func(aura *core.Aura, sim *core.Simulation, spell *core.Spell, spellEffect *core.SpellEffect) { - if spell == druid.Mangle && druid.Mangle != nil { + if druid.IsMangle(spell) { procAura.Activate(sim) } }, @@ -238,7 +238,7 @@ func init() { aura.Activate(sim) }, OnSpellHitDealt: func(aura *core.Aura, sim *core.Simulation, spell *core.Spell, spellEffect *core.SpellEffect) { - if spell != druid.Mangle || druid.Mangle == nil { + if !druid.IsMangle(spell) { return } if !icd.IsReady(sim) { diff --git a/sim/druid/mangle.go b/sim/druid/mangle.go index 76f469e50d..a2b22fca16 100644 --- a/sim/druid/mangle.go +++ b/sim/druid/mangle.go @@ -8,17 +8,17 @@ import ( ) func (druid *Druid) registerMangleBearSpell() { + druid.MangleAura = core.MangleAura(druid.CurrentTarget) + if !druid.Talents.Mangle { return } - druid.MangleAura = core.MangleAura(druid.CurrentTarget) - cost := 20.0 - float64(druid.Talents.Ferocity) refundAmount := cost * 0.8 durReduction := (0.5) * float64(druid.Talents.ImprovedMangle) - druid.Mangle = druid.RegisterSpell(core.SpellConfig{ + druid.MangleBear = druid.RegisterSpell(core.SpellConfig{ ActionID: core.ActionID{SpellID: 48564}, SpellSchool: core.SpellSchoolPhysical, Flags: core.SpellFlagMeleeMetrics, @@ -65,16 +65,16 @@ func (druid *Druid) registerMangleBearSpell() { } func (druid *Druid) registerMangleCatSpell() { + druid.MangleAura = core.MangleAura(druid.CurrentTarget) + if !druid.Talents.Mangle { return } - druid.MangleAura = core.MangleAura(druid.CurrentTarget) - cost := 45.0 - (2.0 * float64(druid.Talents.ImprovedMangle)) - float64(druid.Talents.Ferocity) - core.TernaryFloat64(druid.HasSetBonus(ItemSetThunderheartHarness, 2), 5.0, 0) refundAmount := cost * 0.8 - druid.Mangle = druid.RegisterSpell(core.SpellConfig{ + druid.MangleCat = druid.RegisterSpell(core.SpellConfig{ ActionID: core.ActionID{SpellID: 48566}, SpellSchool: core.SpellSchoolPhysical, Flags: core.SpellFlagMeleeMetrics, @@ -113,21 +113,18 @@ func (druid *Druid) registerMangleCatSpell() { } func (druid *Druid) CanMangleBear(sim *core.Simulation) bool { - return druid.Mangle != nil && druid.CurrentRage() >= druid.Mangle.DefaultCast.Cost && druid.Mangle.IsReady(sim) + return druid.MangleBear != nil && druid.InForm(Bear) && (druid.CurrentRage() >= druid.MangleBear.DefaultCast.Cost || druid.ClearcastingAura.IsActive()) && druid.MangleBear.IsReady(sim) } func (druid *Druid) CanMangleCat() bool { - return druid.Mangle != nil && druid.CurrentEnergy() >= druid.Mangle.DefaultCast.Cost + return druid.MangleCat != nil && druid.InForm(Cat) && (druid.CurrentEnergy() >= druid.MangleCat.DefaultCast.Cost || druid.ClearcastingAura.IsActive()) } -func (druid *Druid) ShouldMangle(sim *core.Simulation) bool { - if druid.Mangle == nil { - return false +func (druid *Druid) IsMangle(spell *core.Spell) bool { + if druid.MangleBear != nil && druid.MangleBear == spell { + return true + } else if druid.MangleCat != nil && druid.MangleCat == spell { + return true } - - if !druid.Mangle.IsReady(sim) { - return false - } - - return druid.CurrentTarget.ShouldRefreshAuraWithTagAtPriority(sim, core.BleedDamageAuraTag, druid.MangleAura.Priority, time.Second*3) + return false } diff --git a/sim/druid/talents.go b/sim/druid/talents.go index d6e2c6acb6..fd6aadf3db 100644 --- a/sim/druid/talents.go +++ b/sim/druid/talents.go @@ -242,7 +242,7 @@ func (druid *Druid) applyPrimalFury() { } } } else if druid.InForm(Cat) { - if spell == druid.Mangle || spell == druid.Shred || spell == druid.Rake { + if druid.IsMangle(spell) || spell == druid.Shred || spell == druid.Rake { if spellEffect.Outcome.Matches(core.OutcomeCrit) { if procChance == 1 || sim.RandomFloat("Primal Fury") < procChance { druid.AddComboPoints(sim, 1, cpMetrics) diff --git a/sim/druid/tank/rotation.go b/sim/druid/tank/rotation.go index fb5f995b5b..c4ff56c2f9 100644 --- a/sim/druid/tank/rotation.go +++ b/sim/druid/tank/rotation.go @@ -29,7 +29,7 @@ func (bear *FeralTankDruid) doRotation(sim *core.Simulation) { bear.Swipe.Cast(sim, bear.CurrentTarget) } } else if bear.CanMangleBear(sim) { - bear.Mangle.Cast(sim, bear.CurrentTarget) + bear.MangleBear.Cast(sim, bear.CurrentTarget) } else if bear.shouldSwipe(sim) { bear.Swipe.Cast(sim, bear.CurrentTarget) } else if bear.CanLacerate(sim) { @@ -37,8 +37,8 @@ func (bear *FeralTankDruid) doRotation(sim *core.Simulation) { } } - if bear.GCD.IsReady(sim) && !bear.Mangle.IsReady(sim) && bear.Rotation.Swipe != proto.FeralTankDruid_Rotation_SwipeSpam { - bear.WaitUntil(sim, bear.Mangle.ReadyAt()) + if bear.GCD.IsReady(sim) && (bear.MangleBear != nil && !bear.MangleBear.IsReady(sim)) && bear.Rotation.Swipe != proto.FeralTankDruid_Rotation_SwipeSpam { + bear.WaitUntil(sim, bear.MangleBear.ReadyAt()) } bear.tryQueueMaul(sim) diff --git a/sim/druid/tank/tank.go b/sim/druid/tank/tank.go index 40bbe53a66..fe4347de96 100644 --- a/sim/druid/tank/tank.go +++ b/sim/druid/tank/tank.go @@ -101,7 +101,7 @@ func (bear *FeralTankDruid) GetDruid() *druid.Druid { func (bear *FeralTankDruid) Initialize() { bear.Druid.Initialize() - bear.RegisterBearSpells(float64(bear.Rotation.MaulRageThreshold)) + bear.RegisterFeralSpells(float64(bear.Rotation.MaulRageThreshold)) } func (bear *FeralTankDruid) ApplyGearBonuses() { From 526a7ed62e741623cffbe05fcc9f2190f4fe9a7f Mon Sep 17 00:00:00 2001 From: jarves Date: Sat, 20 Aug 2022 00:20:52 -0500 Subject: [PATCH 4/6] druid: update tests from previous changes - balance gets few percent buff from missing imp motw / regen - feral tank goes up ~20%, for now make sense given 20% increased bleed / maul talents - feral cat goes down....as expected Signed-off-by: jarves --- sim/druid/balance/TestBalance.results | 388 +++++++++++++------------- sim/druid/feral/TestFeral.results | 264 +++++++++--------- sim/druid/tank/TestFeralTank.results | 388 +++++++++++++------------- 3 files changed, 520 insertions(+), 520 deletions(-) diff --git a/sim/druid/balance/TestBalance.results b/sim/druid/balance/TestBalance.results index c06cb1ece4..f5a74aa6af 100644 --- a/sim/druid/balance/TestBalance.results +++ b/sim/druid/balance/TestBalance.results @@ -1,12 +1,12 @@ character_stats_results: { key: "TestBalance-CharacterStats-Default" value: { - final_stats: 151.8 - final_stats: 134.2 - final_stats: 407 - final_stats: 534.6 - final_stats: 276.1 - final_stats: 1222.072 + final_stats: 159.39 + final_stats: 140.91 + final_stats: 427.35 + final_stats: 561.33 + final_stats: 289.905 + final_stats: 1230.6256 final_stats: 863 final_stats: 130 final_stats: 50 @@ -14,29 +14,29 @@ character_stats_results: { final_stats: 80 final_stats: 80 final_stats: 0 - final_stats: 168.46 + final_stats: 171.133 final_stats: 214.928 - final_stats: 656.919954261 + final_stats: 664.305451974 final_stats: 98.37 final_stats: 0 - final_stats: 283.6 + final_stats: 298.78 final_stats: 96 - final_stats: 519.51848 + final_stats: 531.840724 final_stats: 0 final_stats: 0 final_stats: 0 - final_stats: 10109 + final_stats: 10509.95 final_stats: 0 final_stats: 0 - final_stats: 2761.4 + final_stats: 2774.82 final_stats: 0 final_stats: 0 final_stats: 0 final_stats: 0 - final_stats: 328.3154044805 + final_stats: 348.9620497045 final_stats: 0 final_stats: 0 - final_stats: 7675.7 + final_stats: 7879.2 final_stats: 75 final_stats: 75 final_stats: 75 @@ -52,630 +52,630 @@ character_stats_results: { dps_results: { key: "TestBalance-AllItems-AshtongueTalismanofEquilibrium-32486" value: { - dps: 1453.3477307983 - tps: 1438.7300232676 + dps: 1527.6716489902 + tps: 1512.0071630956 } } dps_results: { key: "TestBalance-AllItems-AustereEarthsiegeDiamond" value: { - dps: 1407.2117902401 - tps: 1393.0557515205 + dps: 1512.6758618864 + tps: 1497.0635417339 } } dps_results: { key: "TestBalance-AllItems-Bandit'sInsignia-40371" value: { - dps: 1430.4060662755 - tps: 1416.2471920352 + dps: 1502.8519867127 + tps: 1487.6838940637 } } dps_results: { key: "TestBalance-AllItems-BeamingEarthsiegeDiamond" value: { - dps: 1423.7728863202 - tps: 1409.6123345234 + dps: 1521.8010584214 + tps: 1506.0299343382 } } dps_results: { key: "TestBalance-AllItems-BracingEarthsiegeDiamond" value: { - dps: 1421.9074486435 - tps: 1379.5881107625 + dps: 1528.4243914214 + tps: 1482.5399826063 } } dps_results: { key: "TestBalance-AllItems-Braxley'sBackyardMoonshine-35937" value: { - dps: 1427.0415750791 - tps: 1412.9420906627 + dps: 1509.7975475415 + tps: 1494.4786936759 } } dps_results: { key: "TestBalance-AllItems-ChaoticSkyflareDiamond" value: { - dps: 1444.0000781953 - tps: 1429.4724237166 + dps: 1533.5909994702 + tps: 1517.372376566 } } dps_results: { key: "TestBalance-AllItems-DarkmoonCard:Berserker!-42989" value: { - dps: 1460.1714797599 - tps: 1445.4133472499 + dps: 1543.9852098445 + tps: 1527.8357027328 } } dps_results: { key: "TestBalance-AllItems-DarkmoonCard:Death-42990" value: { - dps: 1490.5165933144 - tps: 1475.1973585334 + dps: 1609.5923708225 + tps: 1592.3276204913 } } dps_results: { key: "TestBalance-AllItems-DarkmoonCard:Greatness-42987" value: { - dps: 1456.5845712509 - tps: 1441.7894269111 + dps: 1595.8959152015 + tps: 1578.9222439827 } } dps_results: { key: "TestBalance-AllItems-DarkmoonCard:Greatness-44253" value: { - dps: 1456.5845712509 - tps: 1441.7894269111 + dps: 1595.8959152015 + tps: 1578.9222439827 } } dps_results: { key: "TestBalance-AllItems-DarkmoonCard:Greatness-44254" value: { - dps: 1595.9193133104 - tps: 1579.0678741295 + dps: 1749.6977630224 + tps: 1730.5090548472 } } dps_results: { key: "TestBalance-AllItems-DeathKnight'sAnguish-38212" value: { - dps: 1430.488888428 - tps: 1416.4294577447 + dps: 1534.325374343 + tps: 1518.5673139414 } } dps_results: { key: "TestBalance-AllItems-Defender'sCode-40257" value: { - dps: 1430.4060662755 - tps: 1416.2471920352 + dps: 1502.8519867127 + tps: 1487.6838940637 } } dps_results: { key: "TestBalance-AllItems-DestructiveSkyflareDiamond" value: { - dps: 1425.4889360761 - tps: 1411.3196544398 + dps: 1519.6059905446 + tps: 1503.8669178189 } } dps_results: { key: "TestBalance-AllItems-EffulgentSkyflareDiamond" value: { - dps: 1407.2117902401 - tps: 1393.0557515205 + dps: 1512.6758618864 + tps: 1497.0635417339 } } dps_results: { key: "TestBalance-AllItems-EmberSkyflareDiamond" value: { - dps: 1431.0726688098 - tps: 1416.8412125189 + dps: 1551.0824499573 + tps: 1534.9141980434 } } dps_results: { key: "TestBalance-AllItems-EnigmaticSkyflareDiamond" value: { - dps: 1419.6961880188 - tps: 1405.6546113436 + dps: 1507.6709327382 + tps: 1491.9707111686 } } dps_results: { key: "TestBalance-AllItems-EnigmaticStarflareDiamond" value: { - dps: 1409.5846283525 - tps: 1395.6662828707 + dps: 1515.9190143318 + tps: 1500.2576311304 } } dps_results: { key: "TestBalance-AllItems-EternalEarthsiegeDiamond" value: { - dps: 1407.2117902401 - tps: 1393.0557515205 + dps: 1512.6758618864 + tps: 1497.0635417339 } } dps_results: { key: "TestBalance-AllItems-ExtractofNecromanticPower-40373" value: { - dps: 1472.9532122786 - tps: 1457.9117951183 + dps: 1527.9516883569 + tps: 1512.057551675 } } dps_results: { key: "TestBalance-AllItems-EyeoftheBroodmother-45308" value: { - dps: 1519.1131578287 - tps: 1503.0713917574 + dps: 1602.1911968168 + tps: 1584.8459699657 } } dps_results: { key: "TestBalance-AllItems-ForgeEmber-37660" value: { - dps: 1487.8636058293 - tps: 1472.527930798 + dps: 1615.036693011 + tps: 1597.6802062361 } } dps_results: { key: "TestBalance-AllItems-ForlornSkyflareDiamond" value: { - dps: 1421.9074486435 - tps: 1407.4574967559 + dps: 1528.4243914214 + tps: 1512.4971006782 } } dps_results: { key: "TestBalance-AllItems-ForlornStarflareDiamond" value: { - dps: 1418.9683169628 - tps: 1404.5771477088 + dps: 1525.2746855144 + tps: 1509.4103888893 } } dps_results: { key: "TestBalance-AllItems-FuryoftheFiveFlights-40431" value: { - dps: 1430.4060662755 - tps: 1416.2471920352 + dps: 1502.8519867127 + tps: 1487.6838940637 } } dps_results: { key: "TestBalance-AllItems-FuturesightRune-38763" value: { - dps: 1492.5840920413 - tps: 1477.2985572857 + dps: 1602.8161703104 + tps: 1585.8307439895 } } dps_results: { key: "TestBalance-AllItems-IdolofTerror-33509" value: { - dps: 1424.422440798 - tps: 1410.3792890673 + dps: 1532.4910788751 + tps: 1516.4666543828 } } dps_results: { key: "TestBalance-AllItems-IdoloftheUnseenMoon-33510" value: { - dps: 1424.422440798 - tps: 1410.3792890673 + dps: 1532.4910788751 + tps: 1516.4666543828 } } dps_results: { key: "TestBalance-AllItems-IdoloftheWhiteStag-32257" value: { - dps: 1424.422440798 - tps: 1410.3792890673 + dps: 1532.4910788751 + tps: 1516.4666543828 } } dps_results: { key: "TestBalance-AllItems-IllustrationoftheDragonSoul-40432" value: { - dps: 1541.5363232066 - tps: 1525.1548438277 + dps: 1620.5600979709 + tps: 1603.0378430968 } } dps_results: { key: "TestBalance-AllItems-ImpassiveSkyflareDiamond" value: { - dps: 1419.6961880188 - tps: 1405.6546113436 + dps: 1507.6709327382 + tps: 1491.9707111686 } } dps_results: { key: "TestBalance-AllItems-ImpassiveStarflareDiamond" value: { - dps: 1409.5846283525 - tps: 1395.6662828707 + dps: 1515.9190143318 + tps: 1500.2576311304 } } dps_results: { key: "TestBalance-AllItems-IncisorFragment-37723" value: { - dps: 1430.4060662755 - tps: 1416.2471920352 + dps: 1502.8519867127 + tps: 1487.6838940637 } } dps_results: { key: "TestBalance-AllItems-InfusedColdstoneRune-35935" value: { - dps: 1449.1454151559 - tps: 1434.712853938 + dps: 1556.9885945749 + tps: 1540.7772697686 } } dps_results: { key: "TestBalance-AllItems-InsightfulEarthsiegeDiamond" value: { - dps: 1567.5111027234 - tps: 1555.9574619514 + dps: 1701.9846131338 + tps: 1688.5443369034 } } dps_results: { key: "TestBalance-AllItems-InvigoratingEarthsiegeDiamond" value: { - dps: 1407.2117902401 - tps: 1393.0557515205 + dps: 1512.6758618864 + tps: 1497.0635417339 } } dps_results: { key: "TestBalance-AllItems-Lavanthor'sTalisman-37872" value: { - dps: 1430.4060662755 - tps: 1416.2471920352 + dps: 1502.8519867127 + tps: 1487.6838940637 } } dps_results: { key: "TestBalance-AllItems-LivingRootoftheWildheart-30664" value: { - dps: 1454.8675520451 - tps: 1440.2194480895 + dps: 1529.7778093047 + tps: 1514.0712002039 } } dps_results: { key: "TestBalance-AllItems-MajesticDragonFigurine-40430" value: { - dps: 1570.020791563 - tps: 1553.8931186093 + dps: 1708.5566574008 + tps: 1690.345071338 } } dps_results: { key: "TestBalance-AllItems-MalorneHarness" value: { - dps: 1000.1752815023 - tps: 992.0883229575 + dps: 1066.5447910071 + tps: 1057.4780422722 } } dps_results: { key: "TestBalance-AllItems-MalorneRegalia" value: { - dps: 1380.2971713758 - tps: 1367.5683250335 + dps: 1510.556018912 + tps: 1495.732795619 } } dps_results: { key: "TestBalance-AllItems-Mana-EtchedRegalia" value: { - dps: 1180.307763012 - tps: 1169.052654837 + dps: 1232.8808674484 + tps: 1220.7796971847 } } dps_results: { key: "TestBalance-AllItems-MeteoriteWhetstone-37390" value: { - dps: 1441.7728655745 - tps: 1427.3590053483 + dps: 1554.1569904243 + tps: 1538.0180977011 } } dps_results: { key: "TestBalance-AllItems-NordrassilHarness" value: { - dps: 1000.1117000214 - tps: 991.9272631063 + dps: 1065.6302440922 + tps: 1056.5343862956 } } dps_results: { key: "TestBalance-AllItems-NordrassilRegalia" value: { - dps: 1433.558212723 - tps: 1417.9964955538 + dps: 1558.7933745807 + tps: 1541.3392041743 } } dps_results: { key: "TestBalance-AllItems-OfferingofSacrifice-37638" value: { - dps: 1430.4060662755 - tps: 1416.2471920352 + dps: 1502.8519867127 + tps: 1487.6838940637 } } dps_results: { key: "TestBalance-AllItems-PersistentEarthshatterDiamond" value: { - dps: 1407.2117902401 - tps: 1393.0557515205 + dps: 1512.6758618864 + tps: 1497.0635417339 } } dps_results: { key: "TestBalance-AllItems-PersistentEarthsiegeDiamond" value: { - dps: 1407.2117902401 - tps: 1393.0557515205 + dps: 1512.6758618864 + tps: 1497.0635417339 } } dps_results: { key: "TestBalance-AllItems-PowerfulEarthshatterDiamond" value: { - dps: 1407.2117902401 - tps: 1393.0557515205 + dps: 1512.6758618864 + tps: 1497.0635417339 } } dps_results: { key: "TestBalance-AllItems-PowerfulEarthsiegeDiamond" value: { - dps: 1407.2117902401 - tps: 1393.0557515205 + dps: 1512.6758618864 + tps: 1497.0635417339 } } dps_results: { key: "TestBalance-AllItems-PrimalIntent" value: { - dps: 1203.2536030052 - tps: 1193.0042780303 + dps: 1289.8051250401 + tps: 1277.9911117691 } } dps_results: { key: "TestBalance-AllItems-PurifiedShardoftheGods" value: { - dps: 1430.4060662755 - tps: 1416.2471920352 + dps: 1502.8519867127 + tps: 1487.6838940637 } } dps_results: { key: "TestBalance-AllItems-ReignoftheDead-47316" value: { - dps: 1533.5351172824 - tps: 1517.060862022 + dps: 1665.7302084497 + tps: 1647.380351366 } } dps_results: { key: "TestBalance-AllItems-ReignoftheDead-47477" value: { - dps: 1550.1063521699 - tps: 1533.3006722117 + dps: 1683.5820939357 + tps: 1664.8751991422 } } dps_results: { key: "TestBalance-AllItems-RelentlessEarthsiegeDiamond" value: { - dps: 1430.9412153399 - tps: 1416.3105881184 + dps: 1538.4384057961 + tps: 1522.3108347654 } } dps_results: { key: "TestBalance-AllItems-RevitalizingSkyflareDiamond" value: { - dps: 1433.5237193596 - tps: 1419.2432420577 + dps: 1514.1598343438 + tps: 1498.6147347422 } } dps_results: { key: "TestBalance-AllItems-RuneofRepulsion-40372" value: { - dps: 1430.4060662755 - tps: 1416.2471920352 + dps: 1502.8519867127 + tps: 1487.6838940637 } } dps_results: { key: "TestBalance-AllItems-SealofthePantheon-36993" value: { - dps: 1430.4060662755 - tps: 1416.2471920352 + dps: 1502.8519867127 + tps: 1487.6838940637 } } dps_results: { key: "TestBalance-AllItems-Serrah'sStar-37559" value: { - dps: 1443.7730599889 - tps: 1429.3389458743 + dps: 1534.6905824454 + tps: 1518.5252678817 } } dps_results: { key: "TestBalance-AllItems-ShinyShardoftheGods" value: { - dps: 1430.4060662755 - tps: 1416.2471920352 + dps: 1502.8519867127 + tps: 1487.6838940637 } } dps_results: { key: "TestBalance-AllItems-Sindragosa'sFlawlessFang-50361" value: { - dps: 1430.4060662755 - tps: 1416.2471920352 + dps: 1502.8519867127 + tps: 1487.6838940637 } } dps_results: { key: "TestBalance-AllItems-SparkofLife-37657" value: { - dps: 1521.5382159571 - tps: 1506.0003487232 + dps: 1656.2785456323 + tps: 1638.8394718049 } } dps_results: { key: "TestBalance-AllItems-SpellstrikeInfusion" value: { - dps: 1273.4473831743 - tps: 1260.1596325961 + dps: 1364.095269488 + tps: 1349.5001611835 } } dps_results: { key: "TestBalance-AllItems-StormshroudArmor" value: { - dps: 1027.485763484 - tps: 1018.7775452995 + dps: 1091.1555119267 + tps: 1081.4187987734 } } dps_results: { key: "TestBalance-AllItems-StrengthoftheClefthoof" value: { - dps: 1155.0693768793 - tps: 1145.363786427 + dps: 1223.0100975405 + tps: 1212.3656426749 } } dps_results: { key: "TestBalance-AllItems-SwiftSkyflareDiamond" value: { - dps: 1407.2117902401 - tps: 1393.0557515205 + dps: 1512.6758618864 + tps: 1497.0635417339 } } dps_results: { key: "TestBalance-AllItems-SwiftStarflareDiamond" value: { - dps: 1407.2117902401 - tps: 1393.0557515205 + dps: 1512.6758618864 + tps: 1497.0635417339 } } dps_results: { key: "TestBalance-AllItems-SwiftWindfireDiamond" value: { - dps: 1407.2117902401 - tps: 1393.0557515205 + dps: 1512.6758618864 + tps: 1497.0635417339 } } dps_results: { key: "TestBalance-AllItems-TheTwinStars" value: { - dps: 1419.1686383749 - tps: 1405.1555126926 + dps: 1554.1276485098 + tps: 1537.9616926249 } } dps_results: { key: "TestBalance-AllItems-ThunderheartHarness" value: { - dps: 944.5444649681 - tps: 937.676772754 + dps: 997.6994248161 + tps: 990.029333405 } } dps_results: { key: "TestBalance-AllItems-ThunderheartRegalia" value: { - dps: 1672.3681104479 - tps: 1652.8201953242 + dps: 1832.146571206 + tps: 1809.7388368671 } } dps_results: { key: "TestBalance-AllItems-ThunderingSkyflareDiamond" value: { - dps: 1407.2117902401 - tps: 1393.0557515205 + dps: 1512.6758618864 + tps: 1497.0635417339 } } dps_results: { key: "TestBalance-AllItems-TinyAbominationinaJar-50351" value: { - dps: 1456.8687126728 - tps: 1442.3764855046 + dps: 1581.405392064 + tps: 1565.018531308 } } dps_results: { key: "TestBalance-AllItems-TinyAbominationinaJar-50706" value: { - dps: 1456.8687126728 - tps: 1442.3764855046 + dps: 1581.405392064 + tps: 1565.018531308 } } dps_results: { key: "TestBalance-AllItems-TirelessSkyflareDiamond" value: { - dps: 1421.9074486435 - tps: 1407.4574967559 + dps: 1528.4243914214 + tps: 1512.4971006782 } } dps_results: { key: "TestBalance-AllItems-TirelessStarflareDiamond" value: { - dps: 1418.9683169628 - tps: 1404.5771477088 + dps: 1525.2746855144 + tps: 1509.4103888893 } } dps_results: { key: "TestBalance-AllItems-TrenchantEarthshatterDiamond" value: { - dps: 1418.9683169628 - tps: 1404.5771477088 + dps: 1525.2746855144 + tps: 1509.4103888893 } } dps_results: { key: "TestBalance-AllItems-TrenchantEarthsiegeDiamond" value: { - dps: 1421.9074486435 - tps: 1407.4574967559 + dps: 1528.4243914214 + tps: 1512.4971006782 } } dps_results: { key: "TestBalance-AllItems-WastewalkerArmor" value: { - dps: 930.3244584573 - tps: 923.3619663734 + dps: 989.4662382263 + tps: 981.708010547 } } dps_results: { key: "TestBalance-AllItems-WindhawkArmor" value: { - dps: 1560.6003224321 - tps: 1544.8038630687 + dps: 1667.9226892423 + tps: 1650.2626888646 } } dps_results: { key: "TestBalance-AllItems-WrathofSpellfire" value: { - dps: 1388.0904186759 - tps: 1374.6454073876 + dps: 1485.2702126676 + tps: 1470.0735554995 } } dps_results: { key: "TestBalance-Average-Default" value: { - dps: 1428.5704312478 - tps: 1414.066065428 + dps: 1529.1949623193 + tps: 1513.1141296107 } } dps_results: { key: "TestBalance-Settings-Tauren-P1-Starfire-FullBuffs-LongMultiTarget" value: { - dps: 2435.6120963674 - tps: 2990.8397557552 + dps: 2531.050199921 + tps: 3068.9089360236 } } dps_results: { key: "TestBalance-Settings-Tauren-P1-Starfire-FullBuffs-LongSingleTarget" value: { - dps: 1437.7271824708 - tps: 1423.4179359066 + dps: 1546.7608079049 + tps: 1530.4509888321 } } dps_results: { key: "TestBalance-Settings-Tauren-P1-Starfire-FullBuffs-ShortSingleTarget" value: { - dps: 2327.1384687009 - tps: 2316.3837323461 + dps: 2279.3656935233 + tps: 2268.0917019689 } } dps_results: { key: "TestBalance-Settings-Tauren-P1-Starfire-NoBuffs-LongMultiTarget" value: { - dps: 1141.4991331309 - tps: 1289.7906226446 + dps: 1191.7124200419 + tps: 1351.3408467729 } } dps_results: { key: "TestBalance-Settings-Tauren-P1-Starfire-NoBuffs-LongSingleTarget" value: { - dps: 570.726150338 - tps: 560.2016273313 + dps: 587.0569732228 + tps: 576.2458337584 } } dps_results: { key: "TestBalance-Settings-Tauren-P1-Starfire-NoBuffs-ShortSingleTarget" value: { - dps: 1601.6644845904 - tps: 1572.0811948986 + dps: 1665.6030321427 + tps: 1634.8409714999 } } dps_results: { key: "TestBalance-SwitchInFrontOfTarget-Default" value: { - dps: 1437.7271824708 - tps: 1423.4179359066 + dps: 1546.7608079049 + tps: 1530.4509888321 } } diff --git a/sim/druid/feral/TestFeral.results b/sim/druid/feral/TestFeral.results index 9bac4c8420..7a1a8ebfe8 100644 --- a/sim/druid/feral/TestFeral.results +++ b/sim/druid/feral/TestFeral.results @@ -1,11 +1,11 @@ character_stats_results: { key: "TestFeral-CharacterStats-Default" value: { - final_stats: 456.599 - final_stats: 976.646 - final_stats: 532.51 - final_stats: 345.3384 - final_stats: 240.196 + final_stats: 469.898 + final_stats: 1005.092 + final_stats: 548.02 + final_stats: 355.3968 + final_stats: 247.192 final_stats: 0 final_stats: 0 final_stats: 0 @@ -16,27 +16,27 @@ character_stats_results: { final_stats: 0 final_stats: 107 final_stats: 135 - final_stats: 164.0769832932 + final_stats: 166.8561187289 final_stats: 0 final_stats: 0 - final_stats: 5223.38124 + final_stats: 5490.55408 final_stats: 135 - final_stats: 2412.5963144 + final_stats: 2464.8345488 final_stats: 0 final_stats: 0 final_stats: 20 - final_stats: 7270.076 + final_stats: 7420.952 final_stats: 0 final_stats: 0 - final_stats: 5027.292 + final_stats: 5084.184 final_stats: 1494.9 final_stats: 0 final_stats: 0 final_stats: 0 - final_stats: 2920.5186358366 + final_stats: 3008.0468728028 final_stats: 0 final_stats: 0 - final_stats: 8930.8 + final_stats: 9085.9 final_stats: 75 final_stats: 75 final_stats: 75 @@ -52,420 +52,420 @@ character_stats_results: { dps_results: { key: "TestFeral-AllItems-AshtongueTalismanofEquilibrium-32486" value: { - dps: 1820.170279703 - tps: 1316.0304847248 + dps: 1410.1707959434 + tps: 1022.1283901154 } } dps_results: { key: "TestFeral-AllItems-Bandit'sInsignia-40371" value: { - dps: 1908.9757964914 - tps: 1379.0824016446 + dps: 1485.419047143 + tps: 1075.5546484672 } } dps_results: { key: "TestFeral-AllItems-Braxley'sBackyardMoonshine-35937" value: { - dps: 1845.0755329536 - tps: 1333.690100523 + dps: 1438.5459200572 + tps: 1042.4137598869 } } dps_results: { key: "TestFeral-AllItems-DarkmoonCard:Berserker!-42989" value: { - dps: 1856.7893112732 - tps: 1341.9821495271 + dps: 1442.9209071094 + tps: 1045.4317487708 } } dps_results: { key: "TestFeral-AllItems-DarkmoonCard:Death-42990" value: { - dps: 1889.5654021318 - tps: 1365.3098388746 + dps: 1480.1182901968 + tps: 1071.8029421251 } } dps_results: { key: "TestFeral-AllItems-DarkmoonCard:Greatness-42987" value: { - dps: 1977.7487481877 - tps: 1427.8916057952 + dps: 1538.8698881789 + tps: 1113.468073968 } } dps_results: { key: "TestFeral-AllItems-DarkmoonCard:Greatness-44253" value: { - dps: 1997.0478534361 - tps: 1441.5188041442 + dps: 1567.9738789909 + tps: 1134.1635074446 } } dps_results: { key: "TestFeral-AllItems-DarkmoonCard:Greatness-44254" value: { - dps: 1937.4375484098 - tps: 1399.2288826039 + dps: 1502.6466540179 + tps: 1087.9049579196 } } dps_results: { key: "TestFeral-AllItems-DeathKnight'sAnguish-38212" value: { - dps: 1844.8503993055 - tps: 1333.5108368679 + dps: 1426.5884920728 + tps: 1033.8667827328 } } dps_results: { key: "TestFeral-AllItems-Defender'sCode-40257" value: { - dps: 1820.0670940581 - tps: 1315.9572229169 + dps: 1409.9985949847 + tps: 1022.0061274348 } } dps_results: { key: "TestFeral-AllItems-ExtractofNecromanticPower-40373" value: { - dps: 1871.431612658 - tps: 1352.3992983482 + dps: 1462.9204403388 + tps: 1059.6314173638 } } dps_results: { key: "TestFeral-AllItems-EyeoftheBroodmother-45308" value: { - dps: 1848.8396199407 - tps: 1336.3668835189 + dps: 1437.1137261044 + tps: 1041.3047002573 } } dps_results: { key: "TestFeral-AllItems-ForgeEmber-37660" value: { - dps: 1834.3759175447 - tps: 1325.9405479407 + dps: 1437.7520593701 + tps: 1041.7163701611 } } dps_results: { key: "TestFeral-AllItems-FuryoftheFiveFlights-40431" value: { - dps: 1905.9544101473 - tps: 1376.9372173402 + dps: 1473.8746953831 + tps: 1067.3581587176 } } dps_results: { key: "TestFeral-AllItems-FuturesightRune-38763" value: { - dps: 1824.3645073947 - tps: 1318.8127239104 + dps: 1411.4265689357 + tps: 1022.9991973034 } } dps_results: { key: "TestFeral-AllItems-IdolofTerror-33509" value: { - dps: 1803.2291216339 - tps: 1304.0022624957 + dps: 1404.1757788434 + tps: 1017.8719279744 } } dps_results: { key: "TestFeral-AllItems-IdoloftheUnseenMoon-33510" value: { - dps: 1802.995872255 - tps: 1303.8366554367 + dps: 1403.808227614 + tps: 1017.6109666015 } } dps_results: { key: "TestFeral-AllItems-IdoloftheWhiteStag-32257" value: { - dps: 1803.4009295495 - tps: 1304.1242461158 + dps: 1404.3633514665 + tps: 1018.0051045368 } } dps_results: { key: "TestFeral-AllItems-IllustrationoftheDragonSoul-40432" value: { - dps: 1820.0670940581 - tps: 1315.9572229169 + dps: 1409.9985949847 + tps: 1022.0061274348 } } dps_results: { key: "TestFeral-AllItems-IncisorFragment-37723" value: { - dps: 1885.7099397472 - tps: 1362.5636433562 + dps: 1461.4030239943 + tps: 1058.5032720316 } } dps_results: { key: "TestFeral-AllItems-InfusedColdstoneRune-35935" value: { - dps: 1826.0499785069 - tps: 1320.058049753 + dps: 1420.9611303724 + tps: 1029.8225417427 } } dps_results: { key: "TestFeral-AllItems-Lavanthor'sTalisman-37872" value: { - dps: 1820.0670940581 - tps: 1315.9572229169 + dps: 1409.9985949847 + tps: 1022.0061274348 } } dps_results: { key: "TestFeral-AllItems-LivingRootoftheWildheart-30664" value: { - dps: 1840.8061846307 - tps: 1330.6819772235 + dps: 1424.3552381462 + tps: 1032.1993440794 } } dps_results: { key: "TestFeral-AllItems-MajesticDragonFigurine-40430" value: { - dps: 1836.9853973284 - tps: 1327.851482298 + dps: 1413.4978822783 + tps: 1024.4834472242 } } dps_results: { key: "TestFeral-AllItems-MalorneHarness" value: { - dps: 1634.6553906531 - tps: 1183.1783221869 + dps: 1405.2154866883 + tps: 1018.6371195091 } } dps_results: { key: "TestFeral-AllItems-MalorneRegalia" value: { - dps: 1349.4055436274 - tps: 980.3166177059 + dps: 1122.7301853811 + tps: 817.804667803 } } dps_results: { key: "TestFeral-AllItems-Mana-EtchedRegalia" value: { - dps: 1348.0055088118 - tps: 979.3593577598 + dps: 1112.6790398351 + tps: 810.6209912578 } } dps_results: { key: "TestFeral-AllItems-MeteoriteWhetstone-37390" value: { - dps: 1870.3271225998 - tps: 1352.0764394903 + dps: 1460.5796250816 + tps: 1058.3433612073 } } dps_results: { key: "TestFeral-AllItems-NordrassilHarness" value: { - dps: 1621.6113845005 - tps: 1173.5541736914 + dps: 1356.8241767129 + tps: 983.9907156295 } } dps_results: { key: "TestFeral-AllItems-NordrassilRegalia" value: { - dps: 1361.9787542642 - tps: 989.0947902692 + dps: 1129.9245010429 + tps: 822.9164900353 } } dps_results: { key: "TestFeral-AllItems-OfferingofSacrifice-37638" value: { - dps: 1820.0670940581 - tps: 1315.9572229169 + dps: 1409.9985949847 + tps: 1022.0061274348 } } dps_results: { key: "TestFeral-AllItems-PrimalIntent" value: { - dps: 1738.9515062818 - tps: 1257.6274228211 + dps: 1325.0155326322 + tps: 961.4248994392 } } dps_results: { key: "TestFeral-AllItems-PurifiedShardoftheGods" value: { - dps: 1820.0670940581 - tps: 1315.9572229169 + dps: 1409.9985949847 + tps: 1022.0061274348 } } dps_results: { key: "TestFeral-AllItems-ReignoftheDead-47316" value: { - dps: 2003.9787292609 - tps: 1446.5344839109 + dps: 1585.4901576168 + tps: 1146.6051369035 } } dps_results: { key: "TestFeral-AllItems-ReignoftheDead-47477" value: { - dps: 2026.9417990489 - tps: 1462.8382634604 + dps: 1607.4012892816 + tps: 1162.1620403856 } } dps_results: { key: "TestFeral-AllItems-RuneofRepulsion-40372" value: { - dps: 1820.0670940581 - tps: 1315.9572229169 + dps: 1409.9985949847 + tps: 1022.0061274348 } } dps_results: { key: "TestFeral-AllItems-SealofthePantheon-36993" value: { - dps: 1820.0670940581 - tps: 1315.9572229169 + dps: 1409.9985949847 + tps: 1022.0061274348 } } dps_results: { key: "TestFeral-AllItems-Serrah'sStar-37559" value: { - dps: 1836.2565885967 - tps: 1327.3183812647 + dps: 1424.0888961319 + tps: 1032.0254709768 } } dps_results: { key: "TestFeral-AllItems-ShinyShardoftheGods" value: { - dps: 1820.0670940581 - tps: 1315.9572229169 + dps: 1409.9985949847 + tps: 1022.0061274348 } } dps_results: { key: "TestFeral-AllItems-Sindragosa'sFlawlessFang-50361" value: { - dps: 1820.0670940581 - tps: 1315.9572229169 + dps: 1409.9985949847 + tps: 1022.0061274348 } } dps_results: { key: "TestFeral-AllItems-SparkofLife-37657" value: { - dps: 1894.6964749233 - tps: 1369.37695698 + dps: 1434.5906657289 + tps: 1039.765274666 } } dps_results: { key: "TestFeral-AllItems-SpellstrikeInfusion" value: { - dps: 1592.0820805498 - tps: 1152.8116433286 + dps: 1371.2032675849 + tps: 994.4666719916 } } dps_results: { key: "TestFeral-AllItems-StormshroudArmor" value: { - dps: 1554.1300131911 - tps: 1125.7863907875 + dps: 1194.0885154889 + tps: 867.8079952216 } } dps_results: { key: "TestFeral-AllItems-StrengthoftheClefthoof" value: { - dps: 1551.5218502864 - tps: 1124.7012129098 + dps: 1179.321575592 + tps: 858.0080102135 } } dps_results: { key: "TestFeral-AllItems-TheTwinStars" value: { - dps: 1814.8358391077 - tps: 1312.2038320313 + dps: 1384.1178848535 + tps: 1003.640335464 } } dps_results: { key: "TestFeral-AllItems-ThunderheartHarness" value: { - dps: 1654.9182740801 - tps: 1197.4378780275 + dps: 1391.0095320193 + tps: 1008.2494863899 } } dps_results: { key: "TestFeral-AllItems-ThunderheartRegalia" value: { - dps: 1278.8223392076 - tps: 930.2743563131 + dps: 1054.2401442116 + tps: 769.4441557513 } } dps_results: { key: "TestFeral-AllItems-TinyAbominationinaJar-50351" value: { - dps: 1891.2458469552 - tps: 1367.5173961262 + dps: 1453.2743176545 + tps: 1053.6897560752 } } dps_results: { key: "TestFeral-AllItems-TinyAbominationinaJar-50706" value: { - dps: 1896.5698886833 - tps: 1371.3606497185 + dps: 1465.747508395 + tps: 1062.8696167047 } } dps_results: { key: "TestFeral-AllItems-WastewalkerArmor" value: { - dps: 1485.5499187795 - tps: 1076.7791736966 + dps: 1248.1177668022 + tps: 906.7694177906 } } dps_results: { key: "TestFeral-AllItems-WindhawkArmor" value: { - dps: 1667.8816931449 - tps: 1207.6616054939 + dps: 1227.9126927859 + tps: 892.4707894143 } } dps_results: { key: "TestFeral-AllItems-WrathofSpellfire" value: { - dps: 1617.8556443198 - tps: 1171.7343853575 + dps: 1220.5356703023 + tps: 887.2300109582 } } dps_results: { key: "TestFeral-Average-Default" value: { - dps: 1849.1710057282 - tps: 1336.2635264663 + dps: 1428.2118598632 + tps: 1034.8006512579 } } dps_results: { key: "TestFeral-Settings-Tauren-P1-Default-FullBuffs-LongMultiTarget" value: { - dps: 1855.774577963 - tps: 1791.791673067 + dps: 1436.8333664477 + tps: 1438.2941900901 } } dps_results: { key: "TestFeral-Settings-Tauren-P1-Default-FullBuffs-LongSingleTarget" value: { - dps: 1855.774577963 - tps: 1341.3095364894 + dps: 1436.8333664477 + tps: 1041.0588151735 } } dps_results: { key: "TestFeral-Settings-Tauren-P1-Default-FullBuffs-ShortSingleTarget" value: { - dps: 2064.733514972 - tps: 1495.5505817136 + dps: 1639.0226629117 + tps: 1191.4764965001 } } dps_results: { key: "TestFeral-Settings-Tauren-P1-Default-NoBuffs-LongMultiTarget" value: { - dps: 767.4505735265 - tps: 545.4522272038 + dps: 729.7383226683 + tps: 518.6765290945 } } dps_results: { key: "TestFeral-Settings-Tauren-P1-Default-NoBuffs-LongSingleTarget" value: { - dps: 767.4505735265 - tps: 545.4522272038 + dps: 729.7383226683 + tps: 518.6765290945 } } dps_results: { key: "TestFeral-Settings-Tauren-P1-Default-NoBuffs-ShortSingleTarget" value: { - dps: 959.901566434 - tps: 683.0921121681 + dps: 768.2080771609 + tps: 546.9897347843 } } dps_results: { key: "TestFeral-SwitchInFrontOfTarget-Default" value: { - dps: 1708.3401406747 - tps: 1237.0182161522 + dps: 1293.9428638669 + tps: 939.6944798955 } } diff --git a/sim/druid/tank/TestFeralTank.results b/sim/druid/tank/TestFeralTank.results index 44233f1718..6491734626 100644 --- a/sim/druid/tank/TestFeralTank.results +++ b/sim/druid/tank/TestFeralTank.results @@ -1,11 +1,11 @@ character_stats_results: { key: "TestFeralTank-CharacterStats-Default" value: { - final_stats: 629.948 - final_stats: 790.834 - final_stats: 1255.9305 - final_stats: 422.8356 - final_stats: 240.196 + final_stats: 648.296 + final_stats: 813.868 + final_stats: 1184.80175 + final_stats: 435.1512 + final_stats: 247.192 final_stats: 7 final_stats: 7 final_stats: 0 @@ -16,27 +16,27 @@ character_stats_results: { final_stats: 0 final_stats: 91 final_stats: 57 - final_stats: 246.489455922 + final_stats: 249.8922556091 final_stats: 0 final_stats: 0 - final_stats: 3726.6856 + final_stats: 3963.2472 final_stats: 57 - final_stats: 2110.3711576 + final_stats: 2152.6707952 final_stats: 0 final_stats: 0 final_stats: 0 - final_stats: 8432.534 + final_stats: 8617.268 final_stats: 0 final_stats: 0 - final_stats: 15911.668 + final_stats: 15957.736 final_stats: 986.7 final_stats: 78 final_stats: 0 final_stats: 0 - final_stats: 2368.775797928 + final_stats: 2439.6513308774 final_stats: 0 final_stats: 65 - final_stats: 16165.005 + final_stats: 15453.7175 final_stats: 75 final_stats: 75 final_stats: 75 @@ -52,632 +52,632 @@ character_stats_results: { dps_results: { key: "TestFeralTank-AllItems-AshtongueTalismanofEquilibrium-32486" value: { - dps: 632.4020997462 - tps: 868.3094073447 + dps: 880.1086292488 + tps: 1172.9493929985 } } dps_results: { key: "TestFeralTank-AllItems-AustereEarthsiegeDiamond" value: { - dps: 596.7529655217 - tps: 821.283809915 + dps: 820.26602271 + tps: 1094.4757479588 } } dps_results: { key: "TestFeralTank-AllItems-Bandit'sInsignia-40371" value: { - dps: 667.1383156483 - tps: 915.4717839338 + dps: 909.9658313868 + tps: 1207.4378973483 } } dps_results: { key: "TestFeralTank-AllItems-BeamingEarthsiegeDiamond" value: { - dps: 613.4809159007 - tps: 843.5722373768 + dps: 818.0559303155 + tps: 1096.5391225039 } } dps_results: { key: "TestFeralTank-AllItems-BracingEarthsiegeDiamond" value: { - dps: 596.7529655217 - tps: 805.04521705 + dps: 820.26602271 + tps: 1072.7879829997 } } dps_results: { key: "TestFeralTank-AllItems-Braxley'sBackyardMoonshine-35937" value: { - dps: 634.3452092592 - tps: 880.1085321089 + dps: 854.3991001152 + tps: 1141.7090215734 } } dps_results: { key: "TestFeralTank-AllItems-ChaoticSkyflareDiamond" value: { - dps: 618.5924135256 - tps: 855.0965598526 + dps: 853.5785128841 + tps: 1140.3104490798 } } dps_results: { key: "TestFeralTank-AllItems-DarkmoonCard:Berserker!-42989" value: { - dps: 637.1382177853 - tps: 879.9748950155 + dps: 858.4530323396 + tps: 1149.8891951375 } } dps_results: { key: "TestFeralTank-AllItems-DarkmoonCard:Death-42990" value: { - dps: 660.1233528513 - tps: 906.3119080926 + dps: 903.0134123381 + tps: 1205.4058640673 } } dps_results: { key: "TestFeralTank-AllItems-DarkmoonCard:Greatness-42987" value: { - dps: 665.685545606 - tps: 917.5070404545 + dps: 900.7393249101 + tps: 1202.4641849717 } } dps_results: { key: "TestFeralTank-AllItems-DarkmoonCard:Greatness-44253" value: { - dps: 647.3259410899 - tps: 892.0214510818 + dps: 887.4548023582 + tps: 1194.6304464572 } } dps_results: { key: "TestFeralTank-AllItems-DarkmoonCard:Greatness-44254" value: { - dps: 632.2981189347 - tps: 872.7018410189 + dps: 864.5236673968 + tps: 1160.0607161678 } } dps_results: { key: "TestFeralTank-AllItems-DeathKnight'sAnguish-38212" value: { - dps: 634.5256381943 - tps: 878.0464022267 + dps: 847.8880429131 + tps: 1131.1678508009 } } dps_results: { key: "TestFeralTank-AllItems-Defender'sCode-40257" value: { - dps: 618.8655065254 - tps: 857.4037141245 + dps: 835.4808017216 + tps: 1115.2071428332 } } dps_results: { key: "TestFeralTank-AllItems-DestructiveSkyflareDiamond" value: { - dps: 601.8907846525 - tps: 833.1068669978 + dps: 819.1951659684 + tps: 1093.4436324621 } } dps_results: { key: "TestFeralTank-AllItems-EffulgentSkyflareDiamond" value: { - dps: 596.7529655217 - tps: 821.283809915 + dps: 820.26602271 + tps: 1094.4757479588 } } dps_results: { key: "TestFeralTank-AllItems-EmberSkyflareDiamond" value: { - dps: 596.7529655217 - tps: 821.283809915 + dps: 820.26602271 + tps: 1094.4757479588 } } dps_results: { key: "TestFeralTank-AllItems-EnigmaticSkyflareDiamond" value: { - dps: 613.4809159007 - tps: 843.5722373768 + dps: 818.0559303155 + tps: 1096.5391225039 } } dps_results: { key: "TestFeralTank-AllItems-EnigmaticStarflareDiamond" value: { - dps: 607.6986314205 - tps: 839.5903630152 + dps: 821.5667180507 + tps: 1093.5396775835 } } dps_results: { key: "TestFeralTank-AllItems-EternalEarthsiegeDiamond" value: { - dps: 596.7529655217 - tps: 821.283809915 + dps: 820.26602271 + tps: 1094.4757479588 } } dps_results: { key: "TestFeralTank-AllItems-ExtractofNecromanticPower-40373" value: { - dps: 650.1987498579 - tps: 901.0375764993 + dps: 880.4126811054 + tps: 1180.2335274825 } } dps_results: { key: "TestFeralTank-AllItems-EyeoftheBroodmother-45308" value: { - dps: 632.1185463386 - tps: 871.3796448017 + dps: 864.5953926735 + tps: 1148.8740905137 } } dps_results: { key: "TestFeralTank-AllItems-ForgeEmber-37660" value: { - dps: 632.7506761787 - tps: 873.8029040858 + dps: 850.8491751176 + tps: 1132.9459991401 } } dps_results: { key: "TestFeralTank-AllItems-ForlornSkyflareDiamond" value: { - dps: 596.7529655217 - tps: 821.283809915 + dps: 820.26602271 + tps: 1094.4757479588 } } dps_results: { key: "TestFeralTank-AllItems-ForlornStarflareDiamond" value: { - dps: 596.7529655217 - tps: 821.283809915 + dps: 820.26602271 + tps: 1094.4757479588 } } dps_results: { key: "TestFeralTank-AllItems-FuryoftheFiveFlights-40431" value: { - dps: 662.3027164204 - tps: 910.383183147 + dps: 896.3364168754 + tps: 1194.7406018112 } } dps_results: { key: "TestFeralTank-AllItems-FuturesightRune-38763" value: { - dps: 618.8655065254 - tps: 857.4037141245 + dps: 835.4808017216 + tps: 1115.2071428332 } } dps_results: { key: "TestFeralTank-AllItems-IdolofTerror-33509" value: { - dps: 626.1142623157 - tps: 863.0946711834 + dps: 853.2178802879 + tps: 1144.6697560574 } } dps_results: { key: "TestFeralTank-AllItems-IdoloftheUnseenMoon-33510" value: { - dps: 616.958225406 - tps: 854.8746593602 + dps: 832.8699137641 + tps: 1111.7451054015 } } dps_results: { key: "TestFeralTank-AllItems-IdoloftheWhiteStag-32257" value: { - dps: 629.3805528148 - tps: 865.8352797675 + dps: 853.3489193307 + tps: 1139.0859854155 } } dps_results: { key: "TestFeralTank-AllItems-IllustrationoftheDragonSoul-40432" value: { - dps: 618.8655065254 - tps: 857.4037141245 + dps: 835.4808017216 + tps: 1115.2071428332 } } dps_results: { key: "TestFeralTank-AllItems-ImpassiveSkyflareDiamond" value: { - dps: 613.4809159007 - tps: 843.5722373768 + dps: 818.0559303155 + tps: 1096.5391225039 } } dps_results: { key: "TestFeralTank-AllItems-ImpassiveStarflareDiamond" value: { - dps: 607.6986314205 - tps: 839.5903630152 + dps: 821.5667180507 + tps: 1093.5396775835 } } dps_results: { key: "TestFeralTank-AllItems-IncisorFragment-37723" value: { - dps: 665.2511143906 - tps: 916.006437146 + dps: 875.0895750995 + tps: 1171.2185943023 } } dps_results: { key: "TestFeralTank-AllItems-InfusedColdstoneRune-35935" value: { - dps: 617.6240575594 - tps: 851.4884064034 + dps: 852.1044337362 + tps: 1138.6440053751 } } dps_results: { key: "TestFeralTank-AllItems-InsightfulEarthsiegeDiamond" value: { - dps: 596.7529655217 - tps: 821.283809915 + dps: 820.26602271 + tps: 1094.4757479588 } } dps_results: { key: "TestFeralTank-AllItems-InvigoratingEarthsiegeDiamond" value: { - dps: 602.0230187689 - tps: 828.1927581305 + dps: 835.6704185218 + tps: 1112.2123356768 } } dps_results: { key: "TestFeralTank-AllItems-Lavanthor'sTalisman-37872" value: { - dps: 618.8655065254 - tps: 857.4037141245 + dps: 835.4808017216 + tps: 1115.2071428332 } } dps_results: { key: "TestFeralTank-AllItems-LivingRootoftheWildheart-30664" value: { - dps: 618.8655065254 - tps: 857.4037141245 + dps: 835.4808017216 + tps: 1115.2071428332 } } dps_results: { key: "TestFeralTank-AllItems-MajesticDragonFigurine-40430" value: { - dps: 618.8655065254 - tps: 857.4037141245 + dps: 835.4808017216 + tps: 1115.2071428332 } } dps_results: { key: "TestFeralTank-AllItems-MalorneHarness" value: { - dps: 575.8000036461 - tps: 780.5630359445 + dps: 783.3977010612 + tps: 1024.2193143344 } } dps_results: { key: "TestFeralTank-AllItems-MalorneRegalia" value: { - dps: 467.4035017776 - tps: 633.8455226538 + dps: 640.4412438439 + tps: 833.8972323236 } } dps_results: { key: "TestFeralTank-AllItems-Mana-EtchedRegalia" value: { - dps: 459.9060174112 - tps: 630.3730886811 + dps: 638.4865810514 + tps: 827.0682667886 } } dps_results: { key: "TestFeralTank-AllItems-MeteoriteWhetstone-37390" value: { - dps: 640.1203801219 - tps: 880.9413721804 + dps: 871.8778929863 + tps: 1165.5151149222 } } dps_results: { key: "TestFeralTank-AllItems-NordrassilHarness" value: { - dps: 610.8079138781 - tps: 804.3998300429 + dps: 812.3534737101 + tps: 1044.5034411894 } } dps_results: { key: "TestFeralTank-AllItems-NordrassilRegalia" value: { - dps: 474.90902363 - tps: 646.9298616918 + dps: 642.1036192312 + tps: 835.0778013706 } } dps_results: { key: "TestFeralTank-AllItems-OfferingofSacrifice-37638" value: { - dps: 618.8655065254 - tps: 857.4037141245 + dps: 835.4808017216 + tps: 1115.2071428332 } } dps_results: { key: "TestFeralTank-AllItems-PersistentEarthshatterDiamond" value: { - dps: 612.1942859695 - tps: 847.2299816294 + dps: 824.6543151553 + tps: 1106.2970650633 } } dps_results: { key: "TestFeralTank-AllItems-PersistentEarthsiegeDiamond" value: { - dps: 602.0230187689 - tps: 828.1927581305 + dps: 835.6704185218 + tps: 1112.2123356768 } } dps_results: { key: "TestFeralTank-AllItems-PowerfulEarthshatterDiamond" value: { - dps: 596.7529655217 - tps: 821.283809915 + dps: 820.26602271 + tps: 1094.4757479588 } } dps_results: { key: "TestFeralTank-AllItems-PowerfulEarthsiegeDiamond" value: { - dps: 596.7529655217 - tps: 821.283809915 + dps: 820.26602271 + tps: 1094.4757479588 } } dps_results: { key: "TestFeralTank-AllItems-PrimalIntent" value: { - dps: 630.6306889926 - tps: 864.3359875396 + dps: 844.5419362649 + tps: 1124.8845925824 } } dps_results: { key: "TestFeralTank-AllItems-PurifiedShardoftheGods" value: { - dps: 618.8655065254 - tps: 857.4037141245 + dps: 835.4808017216 + tps: 1115.2071428332 } } dps_results: { key: "TestFeralTank-AllItems-ReignoftheDead-47316" value: { - dps: 725.4563336477 - tps: 994.1373240981 + dps: 961.2227438467 + tps: 1277.9037696555 } } dps_results: { key: "TestFeralTank-AllItems-ReignoftheDead-47477" value: { - dps: 739.7748123509 - tps: 1013.1236268586 + dps: 976.5340973271 + tps: 1298.2066243704 } } dps_results: { key: "TestFeralTank-AllItems-RelentlessEarthsiegeDiamond" value: { - dps: 619.5654521867 - tps: 854.9419164874 + dps: 834.3451477586 + tps: 1110.9262833086 } } dps_results: { key: "TestFeralTank-AllItems-RevitalizingSkyflareDiamond" value: { - dps: 596.7529655217 - tps: 821.283809915 + dps: 820.26602271 + tps: 1094.4757479588 } } dps_results: { key: "TestFeralTank-AllItems-RuneofRepulsion-40372" value: { - dps: 618.8655065254 - tps: 857.4037141245 + dps: 835.4808017216 + tps: 1115.2071428332 } } dps_results: { key: "TestFeralTank-AllItems-SealofthePantheon-36993" value: { - dps: 618.8655065254 - tps: 857.4037141245 + dps: 835.4808017216 + tps: 1115.2071428332 } } dps_results: { key: "TestFeralTank-AllItems-Serrah'sStar-37559" value: { - dps: 629.3781813945 - tps: 866.5190218649 + dps: 851.3385999316 + tps: 1135.9045998665 } } dps_results: { key: "TestFeralTank-AllItems-ShinyShardoftheGods" value: { - dps: 618.8655065254 - tps: 857.4037141245 + dps: 835.4808017216 + tps: 1115.2071428332 } } dps_results: { key: "TestFeralTank-AllItems-Sindragosa'sFlawlessFang-50361" value: { - dps: 618.8655065254 - tps: 857.4037141245 + dps: 835.4808017216 + tps: 1115.2071428332 } } dps_results: { key: "TestFeralTank-AllItems-SparkofLife-37657" value: { - dps: 628.2492553749 - tps: 867.9810238915 + dps: 859.9038287781 + tps: 1150.8259814896 } } dps_results: { key: "TestFeralTank-AllItems-SpellstrikeInfusion" value: { - dps: 541.2015612818 - tps: 748.9857838832 + dps: 751.5424849302 + tps: 1008.0252136429 } } dps_results: { key: "TestFeralTank-AllItems-StormshroudArmor" value: { - dps: 516.1895690876 - tps: 700.3942898385 + dps: 693.1647402254 + tps: 902.0877199321 } } dps_results: { key: "TestFeralTank-AllItems-StrengthoftheClefthoof" value: { - dps: 524.5101560617 - tps: 724.5606984202 + dps: 727.5294277041 + tps: 973.3603715351 } } dps_results: { key: "TestFeralTank-AllItems-SwiftSkyflareDiamond" value: { - dps: 602.0230187689 - tps: 828.1927581305 + dps: 835.6704185218 + tps: 1112.2123356768 } } dps_results: { key: "TestFeralTank-AllItems-SwiftStarflareDiamond" value: { - dps: 612.1942859695 - tps: 847.2299816294 + dps: 824.6543151553 + tps: 1106.2970650633 } } dps_results: { key: "TestFeralTank-AllItems-SwiftWindfireDiamond" value: { - dps: 605.9897786959 - tps: 834.6080397487 + dps: 821.6946604023 + tps: 1094.672279531 } } dps_results: { key: "TestFeralTank-AllItems-TheTwinStars" value: { - dps: 600.4681684102 - tps: 827.5249791387 + dps: 818.624508818 + tps: 1098.9575381173 } } dps_results: { key: "TestFeralTank-AllItems-ThunderheartHarness" value: { - dps: 651.2215060783 - tps: 907.0017449295 + dps: 883.4052768595 + tps: 1213.9363033853 } } dps_results: { key: "TestFeralTank-AllItems-ThunderheartRegalia" value: { - dps: 463.0655316032 - tps: 628.3922966309 + dps: 626.6212545926 + tps: 813.2897540864 } } dps_results: { key: "TestFeralTank-AllItems-ThunderingSkyflareDiamond" value: { - dps: 596.4737980635 - tps: 826.9616105473 + dps: 828.2819607671 + tps: 1102.4295217979 } } dps_results: { key: "TestFeralTank-AllItems-TinyAbominationinaJar-50351" value: { - dps: 662.9090957331 - tps: 911.4823069983 + dps: 911.1748201107 + tps: 1213.4833354687 } } dps_results: { key: "TestFeralTank-AllItems-TinyAbominationinaJar-50706" value: { - dps: 666.9620084885 - tps: 919.6826309703 + dps: 927.1888786997 + tps: 1243.5664746951 } } dps_results: { key: "TestFeralTank-AllItems-TirelessSkyflareDiamond" value: { - dps: 596.7529655217 - tps: 821.283809915 + dps: 820.26602271 + tps: 1094.4757479588 } } dps_results: { key: "TestFeralTank-AllItems-TirelessStarflareDiamond" value: { - dps: 596.7529655217 - tps: 821.283809915 + dps: 820.26602271 + tps: 1094.4757479588 } } dps_results: { key: "TestFeralTank-AllItems-TrenchantEarthshatterDiamond" value: { - dps: 596.7529655217 - tps: 821.283809915 + dps: 820.26602271 + tps: 1094.4757479588 } } dps_results: { key: "TestFeralTank-AllItems-TrenchantEarthsiegeDiamond" value: { - dps: 596.7529655217 - tps: 821.283809915 + dps: 820.26602271 + tps: 1094.4757479588 } } dps_results: { key: "TestFeralTank-AllItems-WastewalkerArmor" value: { - dps: 541.1990368166 - tps: 735.5023755057 + dps: 735.3823040715 + tps: 959.8595499903 } } dps_results: { key: "TestFeralTank-AllItems-WindhawkArmor" value: { - dps: 557.9539950843 - tps: 774.1982754846 + dps: 764.3311126045 + tps: 1020.9477373416 } } dps_results: { key: "TestFeralTank-AllItems-WrathofSpellfire" value: { - dps: 561.8650930914 - tps: 760.5232360497 + dps: 760.6435027734 + tps: 991.3288180593 } } dps_results: { key: "TestFeralTank-Average-Default" value: { - dps: 721.4672260502 - tps: 1012.6377162157 - dtps: 643.3972175477 + dps: 1021.047720914 + tps: 1391.1218463444 + dtps: 618.7647110799 } } dps_results: { key: "TestFeralTank-Settings-Tauren-P1-Default-FullBuffs-LongMultiTarget" value: { - dps: 883.2279003555 - tps: 1627.2480435045 + dps: 1298.1189932818 + tps: 2223.3351641223 } } dps_results: { key: "TestFeralTank-Settings-Tauren-P1-Default-FullBuffs-LongSingleTarget" value: { - dps: 708.439310472 - tps: 976.8091824346 + dps: 960.194473825 + tps: 1289.3430587265 } } dps_results: { key: "TestFeralTank-Settings-Tauren-P1-Default-FullBuffs-ShortSingleTarget" value: { - dps: 808.9168249393 - tps: 1129.6569591295 + dps: 1054.48594319 + tps: 1448.03220943 } } dps_results: { key: "TestFeralTank-Settings-Tauren-P1-Default-NoBuffs-LongMultiTarget" value: { - dps: 309.7992876015 - tps: 661.0313862905 + dps: 438.0671159376 + tps: 812.2416137456 } } dps_results: { key: "TestFeralTank-Settings-Tauren-P1-Default-NoBuffs-LongSingleTarget" value: { - dps: 313.6166256591 - tps: 448.8757558783 + dps: 439.7001148937 + tps: 597.660658356 } } dps_results: { key: "TestFeralTank-Settings-Tauren-P1-Default-NoBuffs-ShortSingleTarget" value: { - dps: 307.967228754 - tps: 457.118316281 + dps: 406.1538723962 + tps: 576.394276055 } } dps_results: { key: "TestFeralTank-SwitchInFrontOfTarget-Default" value: { - dps: 820.6968213596 - tps: 1146.112688584 - dtps: 603.1802954092 + dps: 1149.8358409182 + tps: 1574.3520822399 + dtps: 586.9982783728 } } From d99575eae539edf35dc7026f9a12970474c5bab4 Mon Sep 17 00:00:00 2001 From: jarves Date: Fri, 19 Aug 2022 21:45:47 -0500 Subject: [PATCH 5/6] feral: note current missing features Signed-off-by: jarves --- ui/feral_druid/sim.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ui/feral_druid/sim.ts b/ui/feral_druid/sim.ts index bde2dec9ce..d3fe8d0eb5 100644 --- a/ui/feral_druid/sim.ts +++ b/ui/feral_druid/sim.ts @@ -34,6 +34,10 @@ export class FeralDruidSimUI extends IndividualSimUI { cssClass: 'feral-druid-sim-ui', // List any known bugs / issues here and they'll be shown on the site. knownIssues: [ + "Glyphs not implemented", + "Most Sets / new items aren't functional", + "Rotations need updating", + "Lacerate doesn't snapshot correctly", ], warnings: [ // Warning that a frontal rotation is not implemented. From c3d4940b0c8b904ad505f91a3bd535444a78966f Mon Sep 17 00:00:00 2001 From: jarves Date: Sat, 20 Aug 2022 13:55:30 -0500 Subject: [PATCH 6/6] feral: add dps glyphs support Signed-off-by: jarves --- sim/druid/berserk.go | 5 ++++- sim/druid/druid.go | 7 +++++++ sim/druid/mangle.go | 7 +++++-- sim/druid/maul.go | 43 +++++++++++++++++++++++++--------------- sim/druid/rip.go | 13 +++++++++++- sim/druid/savage_roar.go | 4 +++- sim/druid/shred.go | 10 ++++++++++ ui/feral_druid/sim.ts | 1 - 8 files changed, 68 insertions(+), 22 deletions(-) diff --git a/sim/druid/berserk.go b/sim/druid/berserk.go index 49d23d9475..c4a236784d 100644 --- a/sim/druid/berserk.go +++ b/sim/druid/berserk.go @@ -4,6 +4,7 @@ import ( "time" "github.com/wowsims/wotlk/sim/core" + "github.com/wowsims/wotlk/sim/core/proto" ) func (druid *Druid) registerBerserkCD() { @@ -13,10 +14,12 @@ func (druid *Druid) registerBerserkCD() { actionId := core.ActionID{SpellID: 50334} + glyphBonus := core.TernaryDuration(druid.HasMajorGlyph(proto.DruidMajorGlyph_GlyphOfBerserk), time.Second*5.0, 0.0) + druid.BerserkAura = druid.RegisterAura(core.Aura{ Label: "Berserk", ActionID: actionId, - Duration: time.Second * 15, + Duration: (time.Second * 15) + glyphBonus, OnGain: func(aura *core.Aura, sim *core.Simulation) { if druid.InForm(Cat) { druid.PseudoStats.CostMultiplier /= 2.0 diff --git a/sim/druid/druid.go b/sim/druid/druid.go index b6b193005e..92aa094a03 100644 --- a/sim/druid/druid.go +++ b/sim/druid/druid.go @@ -134,6 +134,13 @@ func (druid *Druid) MeleeCritMultiplier() float64 { return druid.Character.MeleeCritMultiplier(primaryModifier, 0) } +func (druid *Druid) HasMajorGlyph(glyph proto.DruidMajorGlyph) bool { + return druid.HasGlyph(int32(glyph)) +} +func (druid *Druid) HasMinorGlyph(glyph proto.DruidMinorGlyph) bool { + return druid.HasGlyph(int32(glyph)) +} + func (druid *Druid) Initialize() { if druid.Talents.PrimalPrecision > 0 { druid.PrimalPrecisionRecoveryMetrics = druid.NewEnergyMetrics(core.ActionID{SpellID: 48410}) diff --git a/sim/druid/mangle.go b/sim/druid/mangle.go index a2b22fca16..52bad60920 100644 --- a/sim/druid/mangle.go +++ b/sim/druid/mangle.go @@ -4,6 +4,7 @@ import ( "time" "github.com/wowsims/wotlk/sim/core" + "github.com/wowsims/wotlk/sim/core/proto" "github.com/wowsims/wotlk/sim/core/stats" ) @@ -17,6 +18,7 @@ func (druid *Druid) registerMangleBearSpell() { cost := 20.0 - float64(druid.Talents.Ferocity) refundAmount := cost * 0.8 durReduction := (0.5) * float64(druid.Talents.ImprovedMangle) + glyphBonus := core.TernaryFloat64(druid.HasMajorGlyph(proto.DruidMajorGlyph_GlyphOfBerserk), 0.1, 0.0) druid.MangleBear = druid.RegisterSpell(core.SpellConfig{ ActionID: core.ActionID{SpellID: 48564}, @@ -42,7 +44,7 @@ func (druid *Druid) registerMangleBearSpell() { ApplyEffects: core.ApplyEffectFuncDirectDamage(core.SpellEffect{ ProcMask: core.ProcMaskMeleeMHSpecial, - DamageMultiplier: 1 + 0.1*float64(druid.Talents.SavageFury), + DamageMultiplier: 1 + 0.1*float64(druid.Talents.SavageFury) + glyphBonus, ThreatMultiplier: (1.5 / 1.15) * core.TernaryFloat64(druid.InForm(Bear) && druid.HasSetBonus(ItemSetThunderheartHarness, 2), 1.15, 1), @@ -73,6 +75,7 @@ func (druid *Druid) registerMangleCatSpell() { cost := 45.0 - (2.0 * float64(druid.Talents.ImprovedMangle)) - float64(druid.Talents.Ferocity) - core.TernaryFloat64(druid.HasSetBonus(ItemSetThunderheartHarness, 2), 5.0, 0) refundAmount := cost * 0.8 + glyphBonus := core.TernaryFloat64(druid.HasMajorGlyph(proto.DruidMajorGlyph_GlyphOfBerserk), 0.1, 0.0) druid.MangleCat = druid.RegisterSpell(core.SpellConfig{ ActionID: core.ActionID{SpellID: 48566}, @@ -94,7 +97,7 @@ func (druid *Druid) registerMangleCatSpell() { ApplyEffects: core.ApplyEffectFuncDirectDamage(core.SpellEffect{ ProcMask: core.ProcMaskMeleeMHSpecial, - DamageMultiplier: 1 + 0.1*float64(druid.Talents.SavageFury), + DamageMultiplier: 1 + 0.1*float64(druid.Talents.SavageFury) + glyphBonus, ThreatMultiplier: 1, BaseDamage: core.BaseDamageConfigMeleeWeapon(core.MainHand, false, 566/2.0, 1.0, 2.0, true), diff --git a/sim/druid/maul.go b/sim/druid/maul.go index 757aa69137..0099dcdf26 100644 --- a/sim/druid/maul.go +++ b/sim/druid/maul.go @@ -3,6 +3,7 @@ package druid import ( "github.com/wowsims/wotlk/sim/core" "github.com/wowsims/wotlk/sim/core/items" + "github.com/wowsims/wotlk/sim/core/proto" "github.com/wowsims/wotlk/sim/core/stats" ) @@ -15,6 +16,31 @@ func (druid *Druid) registerMaulSpell(rageThreshold float64) { baseDamage += 50 } + baseEffect := core.SpellEffect{ + ProcMask: core.ProcMaskMeleeMHAuto | core.ProcMaskMeleeMHSpecial, + + DamageMultiplier: 1 + 0.1*float64(druid.Talents.SavageFury), + ThreatMultiplier: 1, + FlatThreatBonus: 344, + + BaseDamage: core.BaseDamageConfigMeleeWeapon(core.MainHand, false, baseDamage, 1, 1, true), + OutcomeApplier: druid.OutcomeFuncMeleeSpecialHitAndCrit(druid.MeleeCritMultiplier()), + + OnSpellHitDealt: func(sim *core.Simulation, spell *core.Spell, spellEffect *core.SpellEffect) { + if !spellEffect.Landed() { + druid.AddRage(sim, refundAmount, druid.RageRefundMetrics) + } + }, + } + + maxTargets := core.TernaryInt(druid.HasMajorGlyph(proto.DruidMajorGlyph_GlyphOfMaul), 2, 1) + numHits := core.MinInt(maxTargets, int(druid.Env.GetNumTargets())) + effects := make([]core.SpellEffect, 0, numHits) + for i := 0; i < numHits; i++ { + effects = append(effects, baseEffect) + effects[i].Target = druid.Env.GetTargetUnit(int32(i)) + } + druid.Maul = druid.RegisterSpell(core.SpellConfig{ ActionID: core.ActionID{SpellID: 26996}, SpellSchool: core.SpellSchoolPhysical, @@ -30,22 +56,7 @@ func (druid *Druid) registerMaulSpell(rageThreshold float64) { ModifyCast: druid.ApplyClearcasting, }, - ApplyEffects: core.ApplyEffectFuncDirectDamage(core.SpellEffect{ - ProcMask: core.ProcMaskMeleeMHAuto | core.ProcMaskMeleeMHSpecial, - - DamageMultiplier: 1 + 0.1*float64(druid.Talents.SavageFury), - ThreatMultiplier: 1, - FlatThreatBonus: 344, - - BaseDamage: core.BaseDamageConfigMeleeWeapon(core.MainHand, false, baseDamage, 1, 1, true), - OutcomeApplier: druid.OutcomeFuncMeleeSpecialHitAndCrit(druid.MeleeCritMultiplier()), - - OnSpellHitDealt: func(sim *core.Simulation, spell *core.Spell, spellEffect *core.SpellEffect) { - if !spellEffect.Landed() { - druid.AddRage(sim, refundAmount, druid.RageRefundMetrics) - } - }, - }), + ApplyEffects: core.ApplyEffectFuncDamageMultiple(effects), }) druid.MaulQueueAura = druid.RegisterAura(core.Aura{ diff --git a/sim/druid/rip.go b/sim/druid/rip.go index a6c1b04a5f..51869f991b 100644 --- a/sim/druid/rip.go +++ b/sim/druid/rip.go @@ -6,6 +6,7 @@ import ( "github.com/wowsims/wotlk/sim/core" "github.com/wowsims/wotlk/sim/core/items" + "github.com/wowsims/wotlk/sim/core/proto" "github.com/wowsims/wotlk/sim/core/stats" ) @@ -14,6 +15,8 @@ func (druid *Druid) registerRipSpell() { baseCost := 30.0 refundAmount := baseCost * (0.4 * float64(druid.Talents.PrimalPrecision)) + glyphBonus := core.TernaryInt(druid.HasMajorGlyph(proto.DruidMajorGlyph_GlyphOfRip), 2, 0) + druid.Rip = druid.RegisterSpell(core.SpellConfig{ ActionID: actionID, SpellSchool: core.SpellSchoolPhysical, @@ -54,7 +57,7 @@ func (druid *Druid) registerRipSpell() { Label: "Rip-" + strconv.Itoa(int(druid.Index)), ActionID: actionID, }), - NumberOfTicks: 6, + NumberOfTicks: 6 + glyphBonus, TickLength: time.Second * 2, TickEffects: core.TickFuncSnapshot(target, core.SpellEffect{ ProcMask: core.ProcMaskPeriodicDamage, @@ -76,3 +79,11 @@ func (druid *Druid) registerRipSpell() { }), }) } + +func (druid *Druid) maxRipTicks() int { + // TODO: This should handle sets as well + base := 6 + ripGlyphBonus := core.TernaryInt(druid.HasMajorGlyph(proto.DruidMajorGlyph_GlyphOfRip), 2, 0) + shredGlyphBonus := core.TernaryInt(druid.HasMajorGlyph(proto.DruidMajorGlyph_GlyphOfShred), 3, 0) + return base + ripGlyphBonus + shredGlyphBonus +} diff --git a/sim/druid/savage_roar.go b/sim/druid/savage_roar.go index 7f5e60f0e6..bb7ce16d90 100644 --- a/sim/druid/savage_roar.go +++ b/sim/druid/savage_roar.go @@ -4,11 +4,13 @@ import ( "time" "github.com/wowsims/wotlk/sim/core" + "github.com/wowsims/wotlk/sim/core/proto" "github.com/wowsims/wotlk/sim/core/stats" ) func (druid *Druid) getSavageRoarMultiplier() float64 { - return 1.3 + glyphBonus := core.TernaryFloat64(druid.HasMajorGlyph(proto.DruidMajorGlyph_GlyphOfSavageRoar), 0.03, 0) + return 1.3 + glyphBonus } func (druid *Druid) registerSavageRoarSpell() { diff --git a/sim/druid/shred.go b/sim/druid/shred.go index d5d67aa541..9d5582c30f 100644 --- a/sim/druid/shred.go +++ b/sim/druid/shred.go @@ -5,6 +5,7 @@ import ( "github.com/wowsims/wotlk/sim/core" "github.com/wowsims/wotlk/sim/core/items" + "github.com/wowsims/wotlk/sim/core/proto" "github.com/wowsims/wotlk/sim/core/stats" ) @@ -59,6 +60,15 @@ func (druid *Druid) registerShredSpell() { OnSpellHitDealt: func(sim *core.Simulation, spell *core.Spell, spellEffect *core.SpellEffect) { if spellEffect.Landed() { druid.AddComboPoints(sim, 1, spell.ComboPointMetrics()) + + if druid.HasMajorGlyph(proto.DruidMajorGlyph_GlyphOfShred) && druid.RipDot.IsActive() { + maxRipTicks := druid.maxRipTicks() + if druid.RipDot.NumberOfTicks < maxRipTicks { + druid.RipDot.NumberOfTicks += 1 + druid.RipDot.RecomputeAuraDuration() + } + } + } else { druid.AddEnergy(sim, refundAmount, druid.EnergyRefundMetrics) } diff --git a/ui/feral_druid/sim.ts b/ui/feral_druid/sim.ts index d3fe8d0eb5..1f1149e85e 100644 --- a/ui/feral_druid/sim.ts +++ b/ui/feral_druid/sim.ts @@ -34,7 +34,6 @@ export class FeralDruidSimUI extends IndividualSimUI { cssClass: 'feral-druid-sim-ui', // List any known bugs / issues here and they'll be shown on the site. knownIssues: [ - "Glyphs not implemented", "Most Sets / new items aren't functional", "Rotations need updating", "Lacerate doesn't snapshot correctly",