diff --git a/sim/core/aura_helpers.go b/sim/core/aura_helpers.go index 8017cf1ca2..a9b36fc4e3 100644 --- a/sim/core/aura_helpers.go +++ b/sim/core/aura_helpers.go @@ -267,6 +267,10 @@ func (character *Character) NewTemporaryStatsAuraWrapped(auraLabel string, actio if includesHealthBuff { character.UpdateMaxHealth(sim, amountHealed, healthMetrics) } + + for i := range character.OnTemporaryStatsChanges { + character.OnTemporaryStatsChanges[i](sim, aura, buffs) + } }, OnExpire: func(aura *Aura, sim *Simulation) { if sim.Log != nil { @@ -277,6 +281,10 @@ func (character *Character) NewTemporaryStatsAuraWrapped(auraLabel string, actio if includesHealthBuff { character.UpdateMaxHealth(sim, -amountHealed, healthMetrics) } + + for i := range character.OnTemporaryStatsChanges { + character.OnTemporaryStatsChanges[i](sim, aura, buffs.Invert()) + } }, } diff --git a/sim/core/unit.go b/sim/core/unit.go index 50a19961f6..e1e91a9e89 100644 --- a/sim/core/unit.go +++ b/sim/core/unit.go @@ -12,6 +12,7 @@ type UnitType int type SpellRegisteredHandler func(spell *Spell) type OnMasteryStatChanged func(sim *Simulation, oldMasteryRating float64, newMasteryRating float64) type OnCastSpeedChanged func(oldSpeed float64, newSpeed float64) +type OnTemporaryStatsChange func(sim *Simulation, buffAura *Aura, statsChangeWithoutDeps stats.Stats) const ( PlayerUnit UnitType = iota @@ -181,6 +182,9 @@ type Unit struct { // Used for reacting to cast speed changes if a spec needs it (e.g. for cds reduced by haste) OnCastSpeedChanged []OnCastSpeedChanged + // Used for reacting to transient stat changes if a spec needs if (e.g. for caching snapshotting calculations) + OnTemporaryStatsChanges []OnTemporaryStatsChange + GetSpellPowerValue GetSpellpowerValue } @@ -274,6 +278,13 @@ func (unit *Unit) AddOnCastSpeedChanged(ocsc OnCastSpeedChanged) { unit.OnCastSpeedChanged = append(unit.OnCastSpeedChanged, ocsc) } +func (unit *Unit) AddOnTemporaryStatsChange(otsc OnTemporaryStatsChange) { + if unit.Env != nil && unit.Env.IsFinalized() { + panic("Already finalized, cannot add on temporary stats change callback!") + } + unit.OnTemporaryStatsChanges = append(unit.OnTemporaryStatsChanges, otsc) +} + func (unit *Unit) AddStatsDynamic(sim *Simulation, bonus stats.Stats) { if unit.Env == nil { panic("Environment not constructed.") diff --git a/sim/druid/druid.go b/sim/druid/druid.go index 00c51d46bd..d6fca4c846 100644 --- a/sim/druid/druid.go +++ b/sim/druid/druid.go @@ -31,7 +31,6 @@ type Druid struct { AssumeBleedActive bool LeatherSpecActive bool Feral4pT12Active bool - RipTfSnapshot bool MHAutoSpell *core.Spell ReplaceBearMHFunc core.ReplaceMHSwing @@ -387,6 +386,11 @@ func New(char *core.Character, form DruidForm, selfBuffs SelfBuffs, talents stri type DruidSpell struct { *core.Spell FormMask DruidForm + + // Optional fields used in snapshotting calculations + CurrentSnapshotPower float64 + NewSnapshotPower float64 + ShortName string } func (ds *DruidSpell) IsReady(sim *core.Simulation) bool { @@ -410,6 +414,31 @@ func (ds *DruidSpell) IsEqual(s *core.Spell) bool { return ds.Spell == s } +func (druid *Druid) UpdateBleedPower(bleedSpell *DruidSpell, sim *core.Simulation, target *core.Unit, updateCurrent bool, updateNew bool) { + snapshotPower := bleedSpell.ExpectedTickDamage(sim, target) + + // Assume that Mangle will be up soon if not currently active. + if !druid.BleedCategories.Get(target).AnyActive() { + snapshotPower *= 1.3 + } + + if updateCurrent { + bleedSpell.CurrentSnapshotPower = snapshotPower + + if sim.Log != nil { + druid.Log(sim, "%s Snapshot Power: %.1f", bleedSpell.ShortName, snapshotPower) + } + } + + if updateNew { + bleedSpell.NewSnapshotPower = snapshotPower + + if (sim.Log != nil) && !updateCurrent { + druid.Log(sim, "%s Projected Power: %.1f", bleedSpell.ShortName, snapshotPower) + } + } +} + // Agent is a generic way to access underlying druid on any of the agents (for example balance druid.) type DruidAgent interface { GetDruid() *Druid diff --git a/sim/druid/feral/TestFeral.results b/sim/druid/feral/TestFeral.results index 4a0e5ef458..a2364d7d55 100644 --- a/sim/druid/feral/TestFeral.results +++ b/sim/druid/feral/TestFeral.results @@ -38,1423 +38,1423 @@ character_stats_results: { dps_results: { key: "TestFeral-AllItems-AgileShadowspiritDiamond" value: { - dps: 27119.18803 - tps: 37598.07184 + dps: 27117.59734 + tps: 37966.87896 } } dps_results: { key: "TestFeral-AllItems-Althor'sAbacus-50366" value: { - dps: 25450.96886 - tps: 35195.78233 + dps: 25439.58027 + tps: 36362.43687 } } dps_results: { key: "TestFeral-AllItems-AncientPetrifiedSeed-69001" value: { - dps: 27405.61133 - tps: 37615.19573 + dps: 27428.1848 + tps: 38151.40258 } } dps_results: { key: "TestFeral-AllItems-Anhuur'sHymnal-55889" value: { - dps: 25447.50762 - tps: 35203.99365 + dps: 25434.71204 + tps: 36340.73736 } } dps_results: { key: "TestFeral-AllItems-Anhuur'sHymnal-56407" value: { - dps: 25448.47792 - tps: 35208.88513 + dps: 25434.67118 + tps: 36366.36021 } } dps_results: { key: "TestFeral-AllItems-ApparatusofKhaz'goroth-68972" value: { - dps: 26321.87262 - tps: 36706.35668 + dps: 26410.97375 + tps: 37575.16941 } } dps_results: { key: "TestFeral-AllItems-ApparatusofKhaz'goroth-69113" value: { - dps: 26439.80151 - tps: 36905.42068 + dps: 26546.72332 + tps: 37742.67844 } } dps_results: { key: "TestFeral-AllItems-AustereShadowspiritDiamond" value: { - dps: 26463.57539 - tps: 36625.40027 + dps: 26416.91831 + tps: 37045.52983 } } dps_results: { key: "TestFeral-AllItems-BaubleofTrueBlood-50726" value: { - dps: 25450.96886 - tps: 35195.91525 + dps: 25439.58027 + tps: 36362.5747 hps: 88.86807 } } dps_results: { key: "TestFeral-AllItems-BedrockTalisman-58182" value: { - dps: 25450.96886 - tps: 35195.91525 + dps: 25439.58027 + tps: 36362.5747 } } dps_results: { key: "TestFeral-AllItems-BellofEnragingResonance-59326" value: { - dps: 25784.30641 - tps: 35975.45294 + dps: 25849.43547 + tps: 36666.39859 } } dps_results: { key: "TestFeral-AllItems-BellofEnragingResonance-65053" value: { - dps: 25819.49827 - tps: 35995.13514 + dps: 25964.51456 + tps: 36699.59064 } } dps_results: { key: "TestFeral-AllItems-BindingPromise-67037" value: { - dps: 25450.96886 - tps: 35195.91525 + dps: 25449.81767 + tps: 36392.68362 } } dps_results: { key: "TestFeral-AllItems-Blood-SoakedAleMug-63843" value: { - dps: 26756.15 - tps: 36476.6673 + dps: 26867.90737 + tps: 38343.95344 } } dps_results: { key: "TestFeral-AllItems-BloodofIsiset-55995" value: { - dps: 25736.92385 - tps: 35644.81294 + dps: 25728.16047 + tps: 36832.39858 } } dps_results: { key: "TestFeral-AllItems-BloodofIsiset-56414" value: { - dps: 25774.37034 - tps: 35703.59716 + dps: 25765.95073 + tps: 36893.92313 } } dps_results: { key: "TestFeral-AllItems-BloodthirstyGladiator'sBadgeofConquest-64687" value: { - dps: 27220.33829 - tps: 36957.08241 + dps: 27369.35469 + tps: 38585.72826 } } dps_results: { key: "TestFeral-AllItems-BloodthirstyGladiator'sBadgeofDominance-64688" value: { - dps: 25450.96886 - tps: 35195.91525 + dps: 25449.81767 + tps: 36392.68362 } } dps_results: { key: "TestFeral-AllItems-BloodthirstyGladiator'sBadgeofVictory-64689" value: { - dps: 25962.03263 - tps: 35834.96538 + dps: 25956.86935 + tps: 36966.16061 } } dps_results: { key: "TestFeral-AllItems-BloodthirstyGladiator'sEmblemofCruelty-64740" value: { - dps: 25758.53711 - tps: 35845.80235 + dps: 25829.51377 + tps: 36684.98563 } } dps_results: { key: "TestFeral-AllItems-BloodthirstyGladiator'sEmblemofMeditation-64741" value: { - dps: 25450.96886 - tps: 35195.91525 + dps: 25439.86289 + tps: 36333.51673 } } dps_results: { key: "TestFeral-AllItems-BloodthirstyGladiator'sEmblemofTenacity-64742" value: { - dps: 25450.96886 - tps: 35195.91525 + dps: 25439.86289 + tps: 36333.51673 } } dps_results: { key: "TestFeral-AllItems-BloodthirstyGladiator'sInsigniaofConquest-64761" value: { - dps: 26759.208 - tps: 37215.25684 + dps: 26669.09709 + tps: 36986.17173 } } dps_results: { key: "TestFeral-AllItems-BloodthirstyGladiator'sInsigniaofDominance-64762" value: { - dps: 25450.96886 - tps: 35195.91525 + dps: 25439.58027 + tps: 36362.5747 } } dps_results: { key: "TestFeral-AllItems-BloodthirstyGladiator'sInsigniaofVictory-64763" value: { - dps: 25923.94782 - tps: 35783.69696 + dps: 25844.8467 + tps: 36304.7726 } } dps_results: { key: "TestFeral-AllItems-BottledLightning-66879" value: { - dps: 25521.19094 - tps: 35301.8968 + dps: 25550.70536 + tps: 36681.11551 } } dps_results: { key: "TestFeral-AllItems-BracingShadowspiritDiamond" value: { - dps: 26463.57539 - tps: 35893.11477 + dps: 26416.91831 + tps: 36304.83538 } } dps_results: { key: "TestFeral-AllItems-Brawler'sTrophy-71338" value: { - dps: 25450.96886 - tps: 35195.91525 + dps: 25449.81767 + tps: 36392.68362 } } dps_results: { key: "TestFeral-AllItems-BurningShadowspiritDiamond" value: { - dps: 26893.27743 - tps: 37197.07119 + dps: 26841.18382 + tps: 37615.25567 } } dps_results: { key: "TestFeral-AllItems-ChaoticShadowspiritDiamond" value: { - dps: 27012.04684 - tps: 37151.96647 + dps: 26957.68572 + tps: 37690.61418 } } dps_results: { key: "TestFeral-AllItems-Coren'sChilledChromiumCoaster-71335" value: { - dps: 26711.85909 - tps: 37102.95206 + dps: 26875.14384 + tps: 37745.40322 } } dps_results: { key: "TestFeral-AllItems-CoreofRipeness-58184" value: { - dps: 25450.96886 - tps: 35195.66719 + dps: 25449.81767 + tps: 36392.42557 } } dps_results: { key: "TestFeral-AllItems-CorpseTongueCoin-50349" value: { - dps: 25450.96886 - tps: 35195.91525 + dps: 25439.58027 + tps: 36362.5747 } } dps_results: { key: "TestFeral-AllItems-CrushingWeight-59506" value: { - dps: 26254.66296 - tps: 35768.49639 + dps: 26405.9156 + tps: 36381.84814 } } dps_results: { key: "TestFeral-AllItems-CrushingWeight-65118" value: { - dps: 26309.9802 - tps: 35350.28357 + dps: 26269.22975 + tps: 36142.93612 } } dps_results: { key: "TestFeral-AllItems-DarkmoonCard:Earthquake-62048" value: { - dps: 25450.96886 - tps: 35195.91525 + dps: 25439.86289 + tps: 36333.51673 } } dps_results: { key: "TestFeral-AllItems-DarkmoonCard:Hurricane-62049" value: { - dps: 26079.56154 - tps: 35989.94697 + dps: 26193.99931 + tps: 36675.41024 } } dps_results: { key: "TestFeral-AllItems-DarkmoonCard:Hurricane-62051" value: { - dps: 26744.40406 - tps: 36672.09109 + dps: 26979.3342 + tps: 37948.38698 } } dps_results: { key: "TestFeral-AllItems-DarkmoonCard:Tsunami-62050" value: { - dps: 25450.96886 - tps: 35195.66719 + dps: 25439.58027 + tps: 36362.31772 } } dps_results: { key: "TestFeral-AllItems-DarkmoonCard:Volcano-62047" value: { - dps: 25809.76634 - tps: 35736.39234 + dps: 25804.25858 + tps: 36944.03955 } } dps_results: { key: "TestFeral-AllItems-Deathbringer'sWill-50363" value: { - dps: 26124.46097 - tps: 36120.55599 + dps: 26168.4273 + tps: 36840.89281 } } dps_results: { key: "TestFeral-AllItems-DestructiveShadowspiritDiamond" value: { - dps: 26575.64051 - tps: 36574.98562 + dps: 26527.38014 + tps: 37113.64859 } } dps_results: { key: "TestFeral-AllItems-DislodgedForeignObject-50348" value: { - dps: 25393.51118 - tps: 34827.43299 + dps: 25644.41074 + tps: 35922.43022 } } dps_results: { key: "TestFeral-AllItems-Dwyer'sCaber-70141" value: { - dps: 26348.37573 - tps: 36465.40026 + dps: 26378.09933 + tps: 37481.73971 } } dps_results: { key: "TestFeral-AllItems-EffulgentShadowspiritDiamond" value: { - dps: 26463.57539 - tps: 36625.40027 + dps: 26416.91831 + tps: 37045.52983 } } dps_results: { key: "TestFeral-AllItems-ElectrosparkHeartstarter-67118" value: { - dps: 25450.96886 - tps: 35230.16733 + dps: 25449.81767 + tps: 36427.12674 } } dps_results: { key: "TestFeral-AllItems-EmberShadowspiritDiamond" value: { - dps: 26463.57539 - tps: 36625.33616 + dps: 26416.91831 + tps: 37045.47233 } } dps_results: { key: "TestFeral-AllItems-EnigmaticShadowspiritDiamond" value: { - dps: 26575.64051 - tps: 36574.98562 + dps: 26527.38014 + tps: 37113.64859 } } dps_results: { key: "TestFeral-AllItems-EssenceoftheCyclone-59473" value: { - dps: 27097.97312 - tps: 37401.37653 + dps: 27151.41645 + tps: 38506.52192 } } dps_results: { key: "TestFeral-AllItems-EssenceoftheCyclone-65140" value: { - dps: 27286.85911 - tps: 38289.88494 + dps: 27233.77301 + tps: 38891.88621 } } dps_results: { key: "TestFeral-AllItems-EssenceoftheEternalFlame-69002" value: { - dps: 26474.34544 - tps: 36615.28297 + dps: 26518.69651 + tps: 37835.33269 } } dps_results: { key: "TestFeral-AllItems-EternalShadowspiritDiamond" value: { - dps: 26463.57539 - tps: 36625.40027 + dps: 26416.91831 + tps: 37045.52983 } } dps_results: { key: "TestFeral-AllItems-FallofMortality-59500" value: { - dps: 25450.96886 - tps: 35195.66719 + dps: 25439.58027 + tps: 36362.31772 } } dps_results: { key: "TestFeral-AllItems-FallofMortality-65124" value: { - dps: 25450.96886 - tps: 35195.63473 + dps: 25439.58027 + tps: 36362.28414 } } dps_results: { key: "TestFeral-AllItems-FieryQuintessence-69000" value: { - dps: 25433.75778 - tps: 35212.47544 + dps: 25424.51864 + tps: 36443.4194 } } dps_results: { key: "TestFeral-AllItems-Figurine-DemonPanther-52199" value: { - dps: 26686.57744 - tps: 36811.78222 + dps: 26704.74135 + tps: 37155.5852 } } dps_results: { key: "TestFeral-AllItems-Figurine-DreamOwl-52354" value: { - dps: 25450.96886 - tps: 35195.69501 + dps: 25449.81767 + tps: 36392.45448 } } dps_results: { key: "TestFeral-AllItems-Figurine-EarthenGuardian-52352" value: { - dps: 25450.96886 - tps: 35195.91525 + dps: 25449.81767 + tps: 36392.68362 } } dps_results: { key: "TestFeral-AllItems-Figurine-JeweledSerpent-52353" value: { - dps: 25450.96886 - tps: 35195.69501 + dps: 25449.81767 + tps: 36392.45448 } } dps_results: { key: "TestFeral-AllItems-Figurine-KingofBoars-52351" value: { - dps: 26259.79955 - tps: 36312.16166 + dps: 26257.57289 + tps: 37467.62333 } } dps_results: { key: "TestFeral-AllItems-FleetShadowspiritDiamond" value: { - dps: 26526.88212 - tps: 36725.66279 + dps: 26481.21041 + tps: 37147.92499 } } dps_results: { key: "TestFeral-AllItems-ForlornShadowspiritDiamond" value: { - dps: 26463.57539 - tps: 36625.358 + dps: 26416.91831 + tps: 37045.49191 } } dps_results: { key: "TestFeral-AllItems-FuryofAngerforge-59461" value: { - dps: 26402.2129 - tps: 36774.64558 + dps: 26524.71505 + tps: 37446.76441 } } dps_results: { key: "TestFeral-AllItems-GaleofShadows-56138" value: { - dps: 25595.83346 - tps: 34959.12476 + dps: 25705.16072 + tps: 35704.45007 } } dps_results: { key: "TestFeral-AllItems-GaleofShadows-56462" value: { - dps: 25609.48632 - tps: 34715.49204 + dps: 25759.93617 + tps: 36105.56868 } } dps_results: { key: "TestFeral-AllItems-GearDetector-61462" value: { - dps: 26244.26961 - tps: 35987.36649 + dps: 26205.30586 + tps: 36269.50093 } } dps_results: { key: "TestFeral-AllItems-Gladiator'sSanctuary" value: { - dps: 23097.47364 - tps: 30827.90083 + dps: 23299.99831 + tps: 31989.53815 } } dps_results: { key: "TestFeral-AllItems-GlowingTwilightScale-54589" value: { - dps: 25450.96886 - tps: 35195.77306 + dps: 25439.58027 + tps: 36362.42728 } } dps_results: { key: "TestFeral-AllItems-GraceoftheHerald-55266" value: { - dps: 26283.4406 - tps: 36473.66523 + dps: 26346.92596 + tps: 37715.90733 } } dps_results: { key: "TestFeral-AllItems-GraceoftheHerald-56295" value: { - dps: 26713.16179 - tps: 36940.3432 + dps: 26798.8043 + tps: 38224.83302 } } dps_results: { key: "TestFeral-AllItems-HarmlightToken-63839" value: { - dps: 25460.41251 - tps: 35187.45537 + dps: 25457.98094 + tps: 36417.18737 } } dps_results: { key: "TestFeral-AllItems-Harrison'sInsigniaofPanache-65803" value: { - dps: 26018.64462 - tps: 35984.62221 + dps: 25955.96702 + tps: 36697.48996 } } dps_results: { key: "TestFeral-AllItems-HeartofIgnacious-59514" value: { - dps: 25450.96886 - tps: 35195.91525 + dps: 25439.58027 + tps: 36362.5747 } } dps_results: { key: "TestFeral-AllItems-HeartofIgnacious-65110" value: { - dps: 25450.96886 - tps: 35195.91525 + dps: 25439.58027 + tps: 36362.5747 } } dps_results: { key: "TestFeral-AllItems-HeartofRage-59224" value: { - dps: 26384.95469 - tps: 36337.32067 + dps: 26348.23371 + tps: 36741.18803 } } dps_results: { key: "TestFeral-AllItems-HeartofRage-65072" value: { - dps: 26381.62091 - tps: 36290.47858 + dps: 26449.72842 + tps: 37203.87998 } } dps_results: { key: "TestFeral-AllItems-HeartofSolace-55868" value: { - dps: 25595.83346 - tps: 34959.12476 + dps: 25705.16072 + tps: 35704.45007 } } dps_results: { key: "TestFeral-AllItems-HeartofSolace-56393" value: { - dps: 26160.92507 - tps: 35384.25216 + dps: 26171.25611 + tps: 35543.36665 } } dps_results: { key: "TestFeral-AllItems-HeartofThunder-55845" value: { - dps: 25450.96886 - tps: 35195.91525 + dps: 25439.58027 + tps: 36362.5747 } } dps_results: { key: "TestFeral-AllItems-HeartofThunder-56370" value: { - dps: 25450.96886 - tps: 35195.91525 + dps: 25439.58027 + tps: 36362.5747 } } dps_results: { key: "TestFeral-AllItems-HeartoftheVile-66969" value: { - dps: 26458.75129 - tps: 36862.66963 + dps: 26480.67758 + tps: 37438.08798 } } dps_results: { key: "TestFeral-AllItems-Heartpierce-50641" value: { - dps: 27489.82907 - tps: 37661.75893 + dps: 27651.84066 + tps: 38997.04255 } } dps_results: { key: "TestFeral-AllItems-ImpassiveShadowspiritDiamond" value: { - dps: 26575.64051 - tps: 36574.98562 + dps: 26527.38014 + tps: 37113.64859 } } dps_results: { key: "TestFeral-AllItems-ImpatienceofYouth-62464" value: { - dps: 26362.86493 - tps: 36454.50638 + dps: 26398.39412 + tps: 37353.56432 } } dps_results: { key: "TestFeral-AllItems-ImpatienceofYouth-62469" value: { - dps: 26362.86493 - tps: 36454.50638 + dps: 26398.39412 + tps: 37353.56432 } } dps_results: { key: "TestFeral-AllItems-ImpetuousQuery-55881" value: { - dps: 25741.86338 - tps: 35689.07919 + dps: 25782.75931 + tps: 36883.34508 } } dps_results: { key: "TestFeral-AllItems-ImpetuousQuery-56406" value: { - dps: 25779.32586 - tps: 35747.87846 + dps: 25820.60659 + tps: 36945.03714 } } dps_results: { key: "TestFeral-AllItems-InsigniaofDiplomacy-61433" value: { - dps: 25450.96886 - tps: 35195.91525 + dps: 25439.58027 + tps: 36362.5747 } } dps_results: { key: "TestFeral-AllItems-InsigniaoftheEarthenLord-61429" value: { - dps: 25671.10881 - tps: 35541.49522 + dps: 25646.74997 + tps: 36715.8876 } } dps_results: { key: "TestFeral-AllItems-JarofAncientRemedies-59354" value: { - dps: 25450.96886 - tps: 35196.34982 + dps: 25439.58027 + tps: 36362.85441 } } dps_results: { key: "TestFeral-AllItems-JarofAncientRemedies-65029" value: { - dps: 25450.96886 - tps: 35196.34982 + dps: 25439.58027 + tps: 36362.85441 } } dps_results: { key: "TestFeral-AllItems-JujuofNimbleness-63840" value: { - dps: 26756.15 - tps: 36476.6673 + dps: 26867.90737 + tps: 38343.95344 } } dps_results: { key: "TestFeral-AllItems-KeytotheEndlessChamber-55795" value: { - dps: 26549.42498 - tps: 36576.95792 + dps: 26510.29762 + tps: 37207.01591 } } dps_results: { key: "TestFeral-AllItems-KeytotheEndlessChamber-56328" value: { - dps: 26861.1895 - tps: 37080.94589 + dps: 26939.59884 + tps: 37933.39036 } } dps_results: { key: "TestFeral-AllItems-KvaldirBattleStandard-59685" value: { - dps: 25710.99229 - tps: 35324.14465 + dps: 25856.13405 + tps: 36380.45716 } } dps_results: { key: "TestFeral-AllItems-KvaldirBattleStandard-59689" value: { - dps: 25710.99229 - tps: 35324.14465 + dps: 25856.13405 + tps: 36380.45716 } } dps_results: { key: "TestFeral-AllItems-LadyLa-La'sSingingShell-67152" value: { - dps: 25531.49946 - tps: 34832.8987 + dps: 25640.70942 + tps: 35455.27998 } } dps_results: { key: "TestFeral-AllItems-LastWord-50708" value: { - dps: 27289.91791 - tps: 37835.52028 + dps: 27287.99943 + tps: 38206.37864 } } dps_results: { key: "TestFeral-AllItems-LeadenDespair-55816" value: { - dps: 25450.96886 - tps: 35195.91525 + dps: 25439.58027 + tps: 36362.5747 } } dps_results: { key: "TestFeral-AllItems-LeadenDespair-56347" value: { - dps: 25450.96886 - tps: 35195.91525 + dps: 25439.58027 + tps: 36362.5747 } } dps_results: { key: "TestFeral-AllItems-LeftEyeofRajh-56102" value: { - dps: 26718.61107 - tps: 36887.93257 + dps: 26938.12959 + tps: 37871.87396 } } dps_results: { key: "TestFeral-AllItems-LicensetoSlay-58180" value: { - dps: 25999.21934 - tps: 35976.75065 + dps: 25987.28359 + tps: 37161.08312 } } dps_results: { key: "TestFeral-AllItems-MagnetiteMirror-55814" value: { - dps: 25884.75618 - tps: 35752.02566 + dps: 26005.42503 + tps: 36798.9814 } } dps_results: { key: "TestFeral-AllItems-MagnetiteMirror-56345" value: { - dps: 26136.3476 - tps: 35966.23746 + dps: 26331.03034 + tps: 37062.07428 } } dps_results: { key: "TestFeral-AllItems-MandalaofStirringPatterns-62467" value: { - dps: 25450.96886 - tps: 35195.91525 + dps: 25439.58027 + tps: 36362.5747 } } dps_results: { key: "TestFeral-AllItems-MandalaofStirringPatterns-62472" value: { - dps: 25450.96886 - tps: 35195.91525 + dps: 25439.58027 + tps: 36362.5747 } } dps_results: { key: "TestFeral-AllItems-MarkofKhardros-56132" value: { - dps: 26188.71098 - tps: 36188.14024 + dps: 26206.05748 + tps: 37323.36498 } } dps_results: { key: "TestFeral-AllItems-MarkofKhardros-56458" value: { - dps: 26286.16499 - tps: 36319.19958 + dps: 26373.89865 + tps: 37564.07626 } } dps_results: { key: "TestFeral-AllItems-MatrixRestabilizer-68994" value: { - dps: 27586.12484 - tps: 38515.33782 + dps: 27629.7268 + tps: 38022.22153 } } dps_results: { key: "TestFeral-AllItems-MatrixRestabilizer-69150" value: { - dps: 27895.60056 - tps: 38863.20356 + dps: 27931.24489 + tps: 38939.0687 } } dps_results: { key: "TestFeral-AllItems-MightoftheOcean-55251" value: { - dps: 25724.78041 - tps: 35524.7761 + dps: 25704.65023 + tps: 36740.33347 } } dps_results: { key: "TestFeral-AllItems-MightoftheOcean-56285" value: { - dps: 25964.96645 - tps: 35806.42106 + dps: 25948.13639 + tps: 37032.91181 } } dps_results: { key: "TestFeral-AllItems-MirrorofBrokenImages-62466" value: { - dps: 25820.19402 - tps: 35812.02311 + dps: 25861.89454 + tps: 37012.33756 } } dps_results: { key: "TestFeral-AllItems-MirrorofBrokenImages-62471" value: { - dps: 25820.19402 - tps: 35812.02311 + dps: 25861.89454 + tps: 37012.33756 } } dps_results: { key: "TestFeral-AllItems-MithrilStopwatch-71337" value: { - dps: 25792.69905 - tps: 35973.83492 + dps: 25930.70983 + tps: 36712.41311 } } dps_results: { key: "TestFeral-AllItems-MoonwellChalice-70142" value: { - dps: 25880.65029 - tps: 35824.8033 + dps: 25911.26962 + tps: 36273.09352 } } dps_results: { key: "TestFeral-AllItems-MoonwellPhial-70143" value: { - dps: 25450.96886 - tps: 35195.91525 + dps: 25449.81767 + tps: 36392.68362 } } dps_results: { key: "TestFeral-AllItems-NecromanticFocus-68982" value: { - dps: 25450.96886 - tps: 35195.61928 + dps: 25439.58027 + tps: 36362.26815 } } dps_results: { key: "TestFeral-AllItems-NecromanticFocus-69139" value: { - dps: 25450.96886 - tps: 35195.58064 + dps: 25439.58027 + tps: 36362.22816 } } dps_results: { key: "TestFeral-AllItems-ObsidianArborweaveBattlegarb" value: { - dps: 26518.95905 - tps: 34825.16855 + dps: 26695.45744 + tps: 34717.4876 } } dps_results: { key: "TestFeral-AllItems-ObsidianArborweaveRegalia" value: { - dps: 19316.40579 - tps: 25837.61672 + dps: 19506.14642 + tps: 25899.78735 } } dps_results: { key: "TestFeral-AllItems-Oremantle'sFavor-61448" value: { - dps: 25933.548 - tps: 35795.69365 + dps: 25930.88075 + tps: 37211.47575 } } dps_results: { key: "TestFeral-AllItems-PetrifiedPickledEgg-71336" value: { - dps: 25450.96886 - tps: 35195.65251 + dps: 25439.58027 + tps: 36362.30253 } } dps_results: { key: "TestFeral-AllItems-PetrifiedTwilightScale-54591" value: { - dps: 25450.96886 - tps: 35195.91525 + dps: 25439.58027 + tps: 36362.5747 } } dps_results: { key: "TestFeral-AllItems-PhylacteryoftheNamelessLich-50365" value: { - dps: 25626.72362 - tps: 35620.2474 + dps: 25670.87752 + tps: 36797.91777 } } dps_results: { key: "TestFeral-AllItems-PorcelainCrab-55237" value: { - dps: 25667.17977 - tps: 35498.35159 + dps: 25618.58318 + tps: 36033.14043 } } dps_results: { key: "TestFeral-AllItems-PorcelainCrab-56280" value: { - dps: 25835.92323 - tps: 35749.62926 + dps: 25800.43709 + tps: 35891.48157 } } dps_results: { key: "TestFeral-AllItems-PowerfulShadowspiritDiamond" value: { - dps: 26463.57539 - tps: 36625.40027 + dps: 26416.91831 + tps: 37045.52983 } } dps_results: { key: "TestFeral-AllItems-Prestor'sTalismanofMachination-59441" value: { - dps: 26953.84001 - tps: 35419.54947 + dps: 27074.77605 + tps: 37726.12505 } } dps_results: { key: "TestFeral-AllItems-Prestor'sTalismanofMachination-65026" value: { - dps: 27211.94805 - tps: 36183.70048 + dps: 27287.5818 + tps: 37012.43918 } } dps_results: { key: "TestFeral-AllItems-Rainsong-55854" value: { - dps: 25450.96886 - tps: 35195.91525 + dps: 25439.58027 + tps: 36362.5747 } } dps_results: { key: "TestFeral-AllItems-Rainsong-56377" value: { - dps: 25450.96886 - tps: 35195.91525 + dps: 25439.58027 + tps: 36362.5747 } } dps_results: { key: "TestFeral-AllItems-ReverberatingShadowspiritDiamond" value: { - dps: 26974.03201 - tps: 37308.68059 + dps: 26921.51831 + tps: 37727.80686 } } dps_results: { key: "TestFeral-AllItems-RevitalizingShadowspiritDiamond" value: { - dps: 26893.27743 - tps: 37197.11347 + dps: 26841.18382 + tps: 37615.29359 } } dps_results: { key: "TestFeral-AllItems-Ricket'sMagneticFireball-70144" value: { - dps: 27127.97856 - tps: 37850.57765 + dps: 27230.8375 + tps: 38926.52082 } } dps_results: { key: "TestFeral-AllItems-RightEyeofRajh-56100" value: { - dps: 25900.26005 - tps: 35809.72113 + dps: 25914.57094 + tps: 36833.62379 } } dps_results: { key: "TestFeral-AllItems-RightEyeofRajh-56431" value: { - dps: 25958.25269 - tps: 35863.02874 + dps: 25941.73358 + tps: 36701.51705 } } dps_results: { key: "TestFeral-AllItems-RuneofZeth-68998" value: { - dps: 25864.30876 - tps: 36155.55617 + dps: 25999.4946 + tps: 37063.6913 } } dps_results: { key: "TestFeral-AllItems-Schnottz'sMedallionofCommand-65805" value: { - dps: 26547.26864 - tps: 37060.63392 + dps: 26587.05699 + tps: 37538.98575 } } dps_results: { key: "TestFeral-AllItems-SeaStar-55256" value: { - dps: 25450.96886 - tps: 35195.91525 + dps: 25449.81767 + tps: 36392.68362 } } dps_results: { key: "TestFeral-AllItems-SeaStar-56290" value: { - dps: 25450.96886 - tps: 35195.91525 + dps: 25449.81767 + tps: 36392.68362 } } dps_results: { key: "TestFeral-AllItems-ShardofWoe-60233" value: { - dps: 25628.70153 - tps: 34985.02806 + dps: 25770.84818 + tps: 36218.53411 } } dps_results: { key: "TestFeral-AllItems-Shrine-CleansingPurifier-63838" value: { - dps: 25931.29524 - tps: 35141.37586 + dps: 26172.188 + tps: 36542.0688 } } dps_results: { key: "TestFeral-AllItems-Sindragosa'sFlawlessFang-50364" value: { - dps: 25455.78629 - tps: 35240.06659 + dps: 25493.74368 + tps: 36412.24213 } } dps_results: { key: "TestFeral-AllItems-Skardyn'sGrace-56115" value: { - dps: 26706.14639 - tps: 37310.26832 + dps: 26774.40265 + tps: 37840.7704 } } dps_results: { key: "TestFeral-AllItems-Skardyn'sGrace-56440" value: { - dps: 26875.20232 - tps: 37358.12945 + dps: 26935.40182 + tps: 37887.888 } } dps_results: { key: "TestFeral-AllItems-Sorrowsong-55879" value: { - dps: 25736.92385 - tps: 35644.81294 + dps: 25704.44242 + tps: 36674.76845 } } dps_results: { key: "TestFeral-AllItems-Sorrowsong-56400" value: { - dps: 25774.37034 - tps: 35703.59716 + dps: 25742.20156 + tps: 36735.98651 } } dps_results: { key: "TestFeral-AllItems-Soul'sAnguish-66994" value: { - dps: 25724.78041 - tps: 35524.7761 + dps: 25704.65023 + tps: 36740.33347 } } dps_results: { key: "TestFeral-AllItems-SoulCasket-58183" value: { - dps: 25815.22105 - tps: 35767.72541 + dps: 25817.49748 + tps: 36991.58004 } } dps_results: { key: "TestFeral-AllItems-Stonemother'sKiss-61411" value: { - dps: 25506.0095 - tps: 35159.41117 + dps: 25477.60379 + tps: 36335.36711 } } dps_results: { key: "TestFeral-AllItems-Stormrider'sBattlegarb" value: { - dps: 25021.6888 - tps: 34734.69355 + dps: 25206.99239 + tps: 33792.51756 } } dps_results: { key: "TestFeral-AllItems-Stormrider'sRegalia" value: { - dps: 19232.97277 - tps: 25644.99657 + dps: 19296.63209 + tps: 25678.67406 } } dps_results: { key: "TestFeral-AllItems-StumpofTime-62465" value: { - dps: 25449.44821 - tps: 35213.7766 + dps: 25435.64147 + tps: 36371.25168 } } dps_results: { key: "TestFeral-AllItems-StumpofTime-62470" value: { - dps: 25449.44821 - tps: 35213.7766 + dps: 25431.6945 + tps: 36378.35799 } } dps_results: { key: "TestFeral-AllItems-SymbioticWorm-59332" value: { - dps: 25450.96886 - tps: 35195.91525 + dps: 25439.58027 + tps: 36362.5747 } } dps_results: { key: "TestFeral-AllItems-SymbioticWorm-65048" value: { - dps: 25450.96886 - tps: 35195.91525 + dps: 25439.58027 + tps: 36362.5747 } } dps_results: { key: "TestFeral-AllItems-TalismanofSinisterOrder-65804" value: { - dps: 25471.41004 - tps: 35225.70416 + dps: 25466.21494 + tps: 36405.09909 } } dps_results: { key: "TestFeral-AllItems-Tank-CommanderInsignia-63841" value: { - dps: 25950.00867 - tps: 35066.31404 + dps: 26081.04766 + tps: 35851.1981 } } dps_results: { key: "TestFeral-AllItems-TearofBlood-55819" value: { - dps: 25450.96886 - tps: 35195.7491 + dps: 25439.58027 + tps: 36362.40249 } } dps_results: { key: "TestFeral-AllItems-TearofBlood-56351" value: { - dps: 25450.96886 - tps: 35195.69501 + dps: 25439.58027 + tps: 36362.34651 } } dps_results: { key: "TestFeral-AllItems-TendrilsofBurrowingDark-55810" value: { - dps: 25694.9384 - tps: 35578.90336 + dps: 25673.83718 + tps: 36756.18981 } } dps_results: { key: "TestFeral-AllItems-TendrilsofBurrowingDark-56339" value: { - dps: 25774.37034 - tps: 35703.59716 + dps: 25769.70007 + tps: 36909.39495 } } dps_results: { key: "TestFeral-AllItems-TheHungerer-68927" value: { - dps: 27192.43854 - tps: 36470.43951 + dps: 27287.01243 + tps: 37838.34621 } } dps_results: { key: "TestFeral-AllItems-TheHungerer-69112" value: { - dps: 27546.74333 - tps: 37752.93033 + dps: 27619.66075 + tps: 37844.18594 } } dps_results: { key: "TestFeral-AllItems-Theralion'sMirror-59519" value: { - dps: 25474.56238 - tps: 35232.46268 + dps: 25483.06768 + tps: 36448.72078 } } dps_results: { key: "TestFeral-AllItems-Theralion'sMirror-65105" value: { - dps: 25498.55369 - tps: 35265.80392 + dps: 25502.52438 + tps: 36467.16714 } } dps_results: { key: "TestFeral-AllItems-Throngus'sFinger-56121" value: { - dps: 25450.96886 - tps: 35195.91525 + dps: 25439.58027 + tps: 36362.5747 } } dps_results: { key: "TestFeral-AllItems-Throngus'sFinger-56449" value: { - dps: 25450.96886 - tps: 35195.91525 + dps: 25439.58027 + tps: 36362.5747 } } dps_results: { key: "TestFeral-AllItems-Tia'sGrace-55874" value: { - dps: 26852.29399 - tps: 37360.95805 + dps: 26901.46856 + tps: 38604.79563 } } dps_results: { key: "TestFeral-AllItems-Tia'sGrace-56394" value: { - dps: 27010.58543 - tps: 37736.9806 + dps: 27125.11465 + tps: 38824.14419 } } dps_results: { key: "TestFeral-AllItems-TinyAbominationinaJar-50706" value: { - dps: 25502.10602 - tps: 34918.59629 + dps: 25748.28994 + tps: 36792.40894 } } dps_results: { key: "TestFeral-AllItems-Tyrande'sFavoriteDoll-64645" value: { - dps: 25513.77907 - tps: 35321.90515 + dps: 25565.39578 + tps: 36534.82903 } } dps_results: { key: "TestFeral-AllItems-UnheededWarning-59520" value: { - dps: 27197.13331 - tps: 37754.90561 + dps: 27277.15596 + tps: 38725.54254 } } dps_results: { key: "TestFeral-AllItems-UnquenchableFlame-67101" value: { - dps: 25450.96886 - tps: 35195.91525 + dps: 25449.81767 + tps: 36392.68362 } } dps_results: { key: "TestFeral-AllItems-UnsolvableRiddle-62463" value: { - dps: 27202.2596 - tps: 37434.66394 + dps: 27248.49994 + tps: 37975.46124 } } dps_results: { key: "TestFeral-AllItems-UnsolvableRiddle-62468" value: { - dps: 27202.2596 - tps: 37434.66394 + dps: 27248.49994 + tps: 37975.46124 } } dps_results: { key: "TestFeral-AllItems-UnsolvableRiddle-68709" value: { - dps: 27202.2596 - tps: 37434.66394 + dps: 27248.49994 + tps: 37975.46124 } } dps_results: { key: "TestFeral-AllItems-Val'anyr,HammerofAncientKings-46017" value: { - dps: 22507.88233 - tps: 31896.11599 + dps: 22543.77488 + tps: 31645.23487 } } dps_results: { key: "TestFeral-AllItems-VariablePulseLightningCapacitor-68925" value: { - dps: 25452.14308 - tps: 35201.51258 + dps: 25440.2205 + tps: 36365.45089 } } dps_results: { key: "TestFeral-AllItems-VariablePulseLightningCapacitor-69110" value: { - dps: 25454.61475 - tps: 35213.83075 + dps: 25442.14595 + tps: 36370.85154 } } dps_results: { key: "TestFeral-AllItems-VesselofAcceleration-68995" value: { - dps: 26475.46253 - tps: 36868.26299 + dps: 26652.78214 + tps: 37835.7638 } } dps_results: { key: "TestFeral-AllItems-VesselofAcceleration-69167" value: { - dps: 26603.66709 - tps: 37063.33826 + dps: 26788.2995 + tps: 38017.09863 } } dps_results: { key: "TestFeral-AllItems-VialofStolenMemories-59515" value: { - dps: 25450.96886 - tps: 35195.91525 + dps: 25449.81767 + tps: 36392.68362 } } dps_results: { key: "TestFeral-AllItems-VialofStolenMemories-65109" value: { - dps: 25450.96886 - tps: 35195.91525 + dps: 25449.81767 + tps: 36392.68362 } } dps_results: { key: "TestFeral-AllItems-ViciousGladiator'sBadgeofConquest-61033" value: { - dps: 26818.9786 - tps: 36836.42863 + dps: 26857.75887 + tps: 37356.37923 } } dps_results: { key: "TestFeral-AllItems-ViciousGladiator'sBadgeofDominance-61035" value: { - dps: 25450.96886 - tps: 35195.91525 + dps: 25449.81767 + tps: 36392.68362 } } dps_results: { key: "TestFeral-AllItems-ViciousGladiator'sBadgeofVictory-61034" value: { - dps: 25990.61186 - tps: 35870.70174 + dps: 25985.47066 + tps: 37000.70835 } } dps_results: { key: "TestFeral-AllItems-ViciousGladiator'sEmblemofAccuracy-61027" value: { - dps: 25449.44821 - tps: 35213.7766 + dps: 25435.9241 + tps: 36342.19371 } } dps_results: { key: "TestFeral-AllItems-ViciousGladiator'sEmblemofAlacrity-61028" value: { - dps: 25732.05494 - tps: 35048.13947 + dps: 25843.37488 + tps: 35929.04859 } } dps_results: { key: "TestFeral-AllItems-ViciousGladiator'sEmblemofCruelty-61026" value: { - dps: 25792.69905 - tps: 35973.83492 + dps: 25912.30303 + tps: 36692.58626 } } dps_results: { key: "TestFeral-AllItems-ViciousGladiator'sEmblemofProficiency-61030" value: { - dps: 25760.43272 - tps: 35531.37753 + dps: 25844.02127 + tps: 37248.10701 } } dps_results: { key: "TestFeral-AllItems-ViciousGladiator'sEmblemofProwess-61029" value: { - dps: 25836.78115 - tps: 35801.57087 + dps: 25828.88043 + tps: 36966.00707 } } dps_results: { key: "TestFeral-AllItems-ViciousGladiator'sEmblemofTenacity-61032" value: { - dps: 25450.96886 - tps: 35195.91525 + dps: 25439.86289 + tps: 36333.51673 } } dps_results: { key: "TestFeral-AllItems-ViciousGladiator'sInsigniaofConquest-61047" value: { - dps: 26823.90132 - tps: 37126.83736 + dps: 26806.869 + tps: 37280.27716 } } dps_results: { key: "TestFeral-AllItems-ViciousGladiator'sInsigniaofDominance-61045" value: { - dps: 25450.96886 - tps: 35195.91525 + dps: 25438.43372 + tps: 36275.94736 } } dps_results: { key: "TestFeral-AllItems-ViciousGladiator'sInsigniaofVictory-61046" value: { - dps: 25968.56915 - tps: 35832.58955 + dps: 25948.5179 + tps: 36811.51681 } } dps_results: { key: "TestFeral-AllItems-WitchingHourglass-55787" value: { - dps: 25495.02925 - tps: 35276.88749 + dps: 25452.75795 + tps: 36203.88475 } } dps_results: { key: "TestFeral-AllItems-WitchingHourglass-56320" value: { - dps: 25488.62338 - tps: 35184.83218 + dps: 25457.44808 + tps: 36263.02242 } } dps_results: { key: "TestFeral-AllItems-World-QuellerFocus-63842" value: { - dps: 25699.47737 - tps: 35586.02872 + dps: 25690.37021 + tps: 36770.87402 } } dps_results: { key: "TestFeral-AllItems-Za'brox'sLuckyTooth-63742" value: { - dps: 25765.71244 - tps: 35608.59302 + dps: 25780.79785 + tps: 36726.4235 } } dps_results: { key: "TestFeral-AllItems-Za'brox'sLuckyTooth-63745" value: { - dps: 25765.71244 - tps: 35608.59302 + dps: 25780.79785 + tps: 36726.4235 } } dps_results: { key: "TestFeral-Average-Default" value: { - dps: 27288.79276 - tps: 37253.61722 + dps: 27428.86995 + tps: 38099.78544 } } dps_results: { @@ -1502,85 +1502,85 @@ dps_results: { dps_results: { key: "TestFeral-Settings-Tauren-p1-DefaultTalents-ExternalBleed-default-FullBuffs-25.0yards-LongMultiTarget" value: { - dps: 33620.98087 - tps: 50269.47472 + dps: 34147.15539 + tps: 51467.00617 } } dps_results: { key: "TestFeral-Settings-Tauren-p1-DefaultTalents-ExternalBleed-default-FullBuffs-25.0yards-LongSingleTarget" value: { - dps: 30620.78709 - tps: 41996.72155 + dps: 30596.73369 + tps: 42742.1699 } } dps_results: { key: "TestFeral-Settings-Tauren-p1-DefaultTalents-ExternalBleed-default-FullBuffs-25.0yards-ShortSingleTarget" value: { - dps: 37320.58526 - tps: 36114.06678 + dps: 37555.94487 + tps: 38887.67166 } } dps_results: { key: "TestFeral-Settings-Tauren-p1-DefaultTalents-ExternalBleed-default-NoBuffs-25.0yards-LongMultiTarget" value: { - dps: 21448.28422 - tps: 32457.40302 + dps: 21423.66892 + tps: 33129.29656 } } dps_results: { key: "TestFeral-Settings-Tauren-p1-DefaultTalents-ExternalBleed-default-NoBuffs-25.0yards-LongSingleTarget" value: { - dps: 19423.21711 - tps: 28137.18053 + dps: 19508.92026 + tps: 28537.42221 } } dps_results: { key: "TestFeral-Settings-Tauren-p1-DefaultTalents-ExternalBleed-default-NoBuffs-25.0yards-ShortSingleTarget" value: { - dps: 20784.0776 - tps: 22878.83892 + dps: 20822.92874 + tps: 23263.7434 } } dps_results: { key: "TestFeral-Settings-Tauren-p1-DefaultTalents-ExternalBleed-monocat-FullBuffs-25.0yards-LongMultiTarget" value: { - dps: 30293.56162 - tps: 21510.68939 + dps: 30294.38525 + tps: 21511.27417 } } dps_results: { key: "TestFeral-Settings-Tauren-p1-DefaultTalents-ExternalBleed-monocat-FullBuffs-25.0yards-LongSingleTarget" value: { - dps: 29489.75309 - tps: 20937.72469 + dps: 29699.93003 + tps: 21086.95032 } } dps_results: { key: "TestFeral-Settings-Tauren-p1-DefaultTalents-ExternalBleed-monocat-FullBuffs-25.0yards-ShortSingleTarget" value: { - dps: 36551.5798 - tps: 25951.62166 + dps: 36710.76641 + tps: 26064.64415 } } dps_results: { key: "TestFeral-Settings-Tauren-p1-DefaultTalents-ExternalBleed-monocat-NoBuffs-25.0yards-LongMultiTarget" value: { - dps: 18540.72647 - tps: 13166.27867 + dps: 18558.3292 + tps: 13178.77661 } } dps_results: { key: "TestFeral-Settings-Tauren-p1-DefaultTalents-ExternalBleed-monocat-NoBuffs-25.0yards-LongSingleTarget" value: { - dps: 18693.33193 - tps: 13272.47583 + dps: 18714.01678 + tps: 13287.16207 } } dps_results: { key: "TestFeral-Settings-Tauren-p1-DefaultTalents-ExternalBleed-monocat-NoBuffs-25.0yards-ShortSingleTarget" value: { - dps: 20367.17323 - tps: 14461.261 + dps: 20431.50102 + tps: 14506.93372 } } dps_results: { @@ -1628,85 +1628,337 @@ dps_results: { dps_results: { key: "TestFeral-Settings-Tauren-p1-HybridTalents-ExternalBleed-default-FullBuffs-25.0yards-LongMultiTarget" value: { - dps: 33545.9488 - tps: 51346.62718 + dps: 33209.34787 + tps: 49380.19404 } } dps_results: { key: "TestFeral-Settings-Tauren-p1-HybridTalents-ExternalBleed-default-FullBuffs-25.0yards-LongSingleTarget" value: { - dps: 29716.04571 - tps: 39830.4119 + dps: 29663.76428 + tps: 40864.36479 } } dps_results: { key: "TestFeral-Settings-Tauren-p1-HybridTalents-ExternalBleed-default-FullBuffs-25.0yards-ShortSingleTarget" value: { - dps: 36513.58928 - tps: 34393.04153 + dps: 36353.12147 + tps: 35915.94927 } } dps_results: { key: "TestFeral-Settings-Tauren-p1-HybridTalents-ExternalBleed-default-NoBuffs-25.0yards-LongMultiTarget" value: { - dps: 20895.2485 - tps: 31978.31976 + dps: 20973.38885 + tps: 32671.99402 } } dps_results: { key: "TestFeral-Settings-Tauren-p1-HybridTalents-ExternalBleed-default-NoBuffs-25.0yards-LongSingleTarget" value: { - dps: 18893.53393 - tps: 27361.66578 + dps: 18937.84517 + tps: 27531.40002 } } dps_results: { key: "TestFeral-Settings-Tauren-p1-HybridTalents-ExternalBleed-default-NoBuffs-25.0yards-ShortSingleTarget" value: { - dps: 20200.31087 - tps: 22431.68421 + dps: 20127.66711 + tps: 21995.38784 } } dps_results: { key: "TestFeral-Settings-Tauren-p1-HybridTalents-ExternalBleed-monocat-FullBuffs-25.0yards-LongMultiTarget" value: { - dps: 29618.70117 - tps: 21031.53847 + dps: 29730.60375 + tps: 21110.98931 } } dps_results: { key: "TestFeral-Settings-Tauren-p1-HybridTalents-ExternalBleed-monocat-FullBuffs-25.0yards-LongSingleTarget" value: { - dps: 28997.87019 - tps: 20588.48784 + dps: 28838.33016 + tps: 20475.21442 } } dps_results: { key: "TestFeral-Settings-Tauren-p1-HybridTalents-ExternalBleed-monocat-FullBuffs-25.0yards-ShortSingleTarget" value: { - dps: 35865.45114 - tps: 25464.47031 + dps: 35991.27017 + tps: 25553.80182 } } dps_results: { key: "TestFeral-Settings-Tauren-p1-HybridTalents-ExternalBleed-monocat-NoBuffs-25.0yards-LongMultiTarget" value: { - dps: 18079.31006 - tps: 12838.67302 + dps: 18034.50985 + tps: 12806.86487 } } dps_results: { key: "TestFeral-Settings-Tauren-p1-HybridTalents-ExternalBleed-monocat-NoBuffs-25.0yards-LongSingleTarget" value: { - dps: 18149.23213 - tps: 12886.16497 + dps: 18131.26428 + tps: 12873.4078 } } dps_results: { key: "TestFeral-Settings-Tauren-p1-HybridTalents-ExternalBleed-monocat-NoBuffs-25.0yards-ShortSingleTarget" value: { - dps: 19820.39266 - tps: 14073.04679 + dps: 19777.98396 + tps: 14042.93661 + } +} +dps_results: { + key: "TestFeral-Settings-Tauren-p3-DefaultTalents-ExternalBleed-aoe-FullBuffs-25.0yards-LongMultiTarget" + value: { + dps: 85262.71727 + tps: 117150.37946 + } +} +dps_results: { + key: "TestFeral-Settings-Tauren-p3-DefaultTalents-ExternalBleed-aoe-FullBuffs-25.0yards-LongSingleTarget" + value: { + dps: 20696.85666 + tps: 36480.42335 + } +} +dps_results: { + key: "TestFeral-Settings-Tauren-p3-DefaultTalents-ExternalBleed-aoe-FullBuffs-25.0yards-ShortSingleTarget" + value: { + dps: 24192.69987 + tps: 34000.04722 + } +} +dps_results: { + key: "TestFeral-Settings-Tauren-p3-DefaultTalents-ExternalBleed-aoe-NoBuffs-25.0yards-LongMultiTarget" + value: { + dps: 58365.60254 + tps: 83205.38779 + } +} +dps_results: { + key: "TestFeral-Settings-Tauren-p3-DefaultTalents-ExternalBleed-aoe-NoBuffs-25.0yards-LongSingleTarget" + value: { + dps: 12778.60373 + tps: 23543.10009 + } +} +dps_results: { + key: "TestFeral-Settings-Tauren-p3-DefaultTalents-ExternalBleed-aoe-NoBuffs-25.0yards-ShortSingleTarget" + value: { + dps: 12933.66963 + tps: 23018.86113 + } +} +dps_results: { + key: "TestFeral-Settings-Tauren-p3-DefaultTalents-ExternalBleed-default-FullBuffs-25.0yards-LongMultiTarget" + value: { + dps: 40228.85838 + tps: 55899.35104 + } +} +dps_results: { + key: "TestFeral-Settings-Tauren-p3-DefaultTalents-ExternalBleed-default-FullBuffs-25.0yards-LongSingleTarget" + value: { + dps: 37109.49205 + tps: 48718.16087 + } +} +dps_results: { + key: "TestFeral-Settings-Tauren-p3-DefaultTalents-ExternalBleed-default-FullBuffs-25.0yards-ShortSingleTarget" + value: { + dps: 46306.8583 + tps: 43956.97764 + } +} +dps_results: { + key: "TestFeral-Settings-Tauren-p3-DefaultTalents-ExternalBleed-default-NoBuffs-25.0yards-LongMultiTarget" + value: { + dps: 26010.41107 + tps: 37359.71965 + } +} +dps_results: { + key: "TestFeral-Settings-Tauren-p3-DefaultTalents-ExternalBleed-default-NoBuffs-25.0yards-LongSingleTarget" + value: { + dps: 24152.16981 + tps: 31450.59016 + } +} +dps_results: { + key: "TestFeral-Settings-Tauren-p3-DefaultTalents-ExternalBleed-default-NoBuffs-25.0yards-ShortSingleTarget" + value: { + dps: 26126.82357 + tps: 21252.12537 + } +} +dps_results: { + key: "TestFeral-Settings-Tauren-p3-DefaultTalents-ExternalBleed-monocat-FullBuffs-25.0yards-LongMultiTarget" + value: { + dps: 36786.32328 + tps: 26120.55017 + } +} +dps_results: { + key: "TestFeral-Settings-Tauren-p3-DefaultTalents-ExternalBleed-monocat-FullBuffs-25.0yards-LongSingleTarget" + value: { + dps: 36301.70475 + tps: 25774.21037 + } +} +dps_results: { + key: "TestFeral-Settings-Tauren-p3-DefaultTalents-ExternalBleed-monocat-FullBuffs-25.0yards-ShortSingleTarget" + value: { + dps: 46263.30038 + tps: 32846.94327 + } +} +dps_results: { + key: "TestFeral-Settings-Tauren-p3-DefaultTalents-ExternalBleed-monocat-NoBuffs-25.0yards-LongMultiTarget" + value: { + dps: 23200.03157 + tps: 16474.3853 + } +} +dps_results: { + key: "TestFeral-Settings-Tauren-p3-DefaultTalents-ExternalBleed-monocat-NoBuffs-25.0yards-LongSingleTarget" + value: { + dps: 23399.75827 + tps: 16614.03853 + } +} +dps_results: { + key: "TestFeral-Settings-Tauren-p3-DefaultTalents-ExternalBleed-monocat-NoBuffs-25.0yards-ShortSingleTarget" + value: { + dps: 26155.20169 + tps: 18570.7612 + } +} +dps_results: { + key: "TestFeral-Settings-Tauren-p3-HybridTalents-ExternalBleed-aoe-FullBuffs-25.0yards-LongMultiTarget" + value: { + dps: 84750.38614 + tps: 118261.56235 + } +} +dps_results: { + key: "TestFeral-Settings-Tauren-p3-HybridTalents-ExternalBleed-aoe-FullBuffs-25.0yards-LongSingleTarget" + value: { + dps: 20626.36766 + tps: 36019.40722 + } +} +dps_results: { + key: "TestFeral-Settings-Tauren-p3-HybridTalents-ExternalBleed-aoe-FullBuffs-25.0yards-ShortSingleTarget" + value: { + dps: 23954.63881 + tps: 31651.29393 + } +} +dps_results: { + key: "TestFeral-Settings-Tauren-p3-HybridTalents-ExternalBleed-aoe-NoBuffs-25.0yards-LongMultiTarget" + value: { + dps: 58240.99598 + tps: 84035.27773 + } +} +dps_results: { + key: "TestFeral-Settings-Tauren-p3-HybridTalents-ExternalBleed-aoe-NoBuffs-25.0yards-LongSingleTarget" + value: { + dps: 12783.70923 + tps: 22784.48027 + } +} +dps_results: { + key: "TestFeral-Settings-Tauren-p3-HybridTalents-ExternalBleed-aoe-NoBuffs-25.0yards-ShortSingleTarget" + value: { + dps: 12963.24902 + tps: 23277.67817 + } +} +dps_results: { + key: "TestFeral-Settings-Tauren-p3-HybridTalents-ExternalBleed-default-FullBuffs-25.0yards-LongMultiTarget" + value: { + dps: 39652.25348 + tps: 56419.12785 + } +} +dps_results: { + key: "TestFeral-Settings-Tauren-p3-HybridTalents-ExternalBleed-default-FullBuffs-25.0yards-LongSingleTarget" + value: { + dps: 36285.88477 + tps: 46785.71751 + } +} +dps_results: { + key: "TestFeral-Settings-Tauren-p3-HybridTalents-ExternalBleed-default-FullBuffs-25.0yards-ShortSingleTarget" + value: { + dps: 45575.20636 + tps: 42333.86973 + } +} +dps_results: { + key: "TestFeral-Settings-Tauren-p3-HybridTalents-ExternalBleed-default-NoBuffs-25.0yards-LongMultiTarget" + value: { + dps: 24808.52561 + tps: 34415.9473 + } +} +dps_results: { + key: "TestFeral-Settings-Tauren-p3-HybridTalents-ExternalBleed-default-NoBuffs-25.0yards-LongSingleTarget" + value: { + dps: 23525.65546 + tps: 31140.34294 + } +} +dps_results: { + key: "TestFeral-Settings-Tauren-p3-HybridTalents-ExternalBleed-default-NoBuffs-25.0yards-ShortSingleTarget" + value: { + dps: 25578.14659 + tps: 23097.48397 + } +} +dps_results: { + key: "TestFeral-Settings-Tauren-p3-HybridTalents-ExternalBleed-monocat-FullBuffs-25.0yards-LongMultiTarget" + value: { + dps: 36062.39058 + tps: 25606.55795 + } +} +dps_results: { + key: "TestFeral-Settings-Tauren-p3-HybridTalents-ExternalBleed-monocat-FullBuffs-25.0yards-LongSingleTarget" + value: { + dps: 35484.72305 + tps: 25194.15337 + } +} +dps_results: { + key: "TestFeral-Settings-Tauren-p3-HybridTalents-ExternalBleed-monocat-FullBuffs-25.0yards-ShortSingleTarget" + value: { + dps: 45107.31909 + tps: 32026.19655 + } +} +dps_results: { + key: "TestFeral-Settings-Tauren-p3-HybridTalents-ExternalBleed-monocat-NoBuffs-25.0yards-LongMultiTarget" + value: { + dps: 22616.47062 + tps: 16060.05702 + } +} +dps_results: { + key: "TestFeral-Settings-Tauren-p3-HybridTalents-ExternalBleed-monocat-NoBuffs-25.0yards-LongSingleTarget" + value: { + dps: 22807.27714 + tps: 16193.37693 + } +} +dps_results: { + key: "TestFeral-Settings-Tauren-p3-HybridTalents-ExternalBleed-monocat-NoBuffs-25.0yards-ShortSingleTarget" + value: { + dps: 25341.66489 + tps: 17993.15008 } } dps_results: { @@ -1754,85 +2006,85 @@ dps_results: { dps_results: { key: "TestFeral-Settings-Tauren-preraid-DefaultTalents-ExternalBleed-default-FullBuffs-25.0yards-LongMultiTarget" value: { - dps: 30350.22019 - tps: 45826.32614 + dps: 30401.03656 + tps: 45592.54925 } } dps_results: { key: "TestFeral-Settings-Tauren-preraid-DefaultTalents-ExternalBleed-default-FullBuffs-25.0yards-LongSingleTarget" value: { - dps: 27119.18803 - tps: 37598.07184 + dps: 27117.59734 + tps: 37966.87896 } } dps_results: { key: "TestFeral-Settings-Tauren-preraid-DefaultTalents-ExternalBleed-default-FullBuffs-25.0yards-ShortSingleTarget" value: { - dps: 32961.51429 - tps: 30317.90067 + dps: 33513.87546 + tps: 33600.15854 } } dps_results: { key: "TestFeral-Settings-Tauren-preraid-DefaultTalents-ExternalBleed-default-NoBuffs-25.0yards-LongMultiTarget" value: { - dps: 18918.31014 - tps: 29322.00373 + dps: 19196.21634 + tps: 30495.70905 } } dps_results: { key: "TestFeral-Settings-Tauren-preraid-DefaultTalents-ExternalBleed-default-NoBuffs-25.0yards-LongSingleTarget" value: { - dps: 17006.46706 - tps: 25255.29463 + dps: 17087.17917 + tps: 24668.83484 } } dps_results: { key: "TestFeral-Settings-Tauren-preraid-DefaultTalents-ExternalBleed-default-NoBuffs-25.0yards-ShortSingleTarget" value: { - dps: 18436.73327 - tps: 21532.25817 + dps: 18444.31047 + tps: 21616.62274 } } dps_results: { key: "TestFeral-Settings-Tauren-preraid-DefaultTalents-ExternalBleed-monocat-FullBuffs-25.0yards-LongMultiTarget" value: { - dps: 26931.4035 - tps: 19123.55713 + dps: 26876.9224 + tps: 19084.87555 } } dps_results: { key: "TestFeral-Settings-Tauren-preraid-DefaultTalents-ExternalBleed-monocat-FullBuffs-25.0yards-LongSingleTarget" value: { - dps: 26137.59674 - tps: 18557.69368 + dps: 26430.93816 + tps: 18765.96609 } } dps_results: { key: "TestFeral-Settings-Tauren-preraid-DefaultTalents-ExternalBleed-monocat-FullBuffs-25.0yards-ShortSingleTarget" value: { - dps: 32562.90652 - tps: 23119.66363 + dps: 32897.21141 + tps: 23357.0201 } } dps_results: { key: "TestFeral-Settings-Tauren-preraid-DefaultTalents-ExternalBleed-monocat-NoBuffs-25.0yards-LongMultiTarget" value: { - dps: 16229.08957 - tps: 11525.01647 + dps: 16278.60418 + tps: 11560.17185 } } dps_results: { key: "TestFeral-Settings-Tauren-preraid-DefaultTalents-ExternalBleed-monocat-NoBuffs-25.0yards-LongSingleTarget" value: { - dps: 16294.77939 - tps: 11569.50353 + dps: 16359.11748 + tps: 11615.18357 } } dps_results: { key: "TestFeral-Settings-Tauren-preraid-DefaultTalents-ExternalBleed-monocat-NoBuffs-25.0yards-ShortSingleTarget" value: { - dps: 17983.91661 - tps: 12769.14879 + dps: 18045.08158 + tps: 12812.57592 } } dps_results: { @@ -1880,91 +2132,91 @@ dps_results: { dps_results: { key: "TestFeral-Settings-Tauren-preraid-HybridTalents-ExternalBleed-default-FullBuffs-25.0yards-LongMultiTarget" value: { - dps: 29975.67308 - tps: 45843.91029 + dps: 29312.50173 + tps: 42915.95354 } } dps_results: { key: "TestFeral-Settings-Tauren-preraid-HybridTalents-ExternalBleed-default-FullBuffs-25.0yards-LongSingleTarget" value: { - dps: 26367.77664 - tps: 35350.88867 + dps: 26490.75263 + tps: 36549.96154 } } dps_results: { key: "TestFeral-Settings-Tauren-preraid-HybridTalents-ExternalBleed-default-FullBuffs-25.0yards-ShortSingleTarget" value: { - dps: 32446.80145 - tps: 29914.81393 + dps: 32523.52515 + tps: 31534.69274 } } dps_results: { key: "TestFeral-Settings-Tauren-preraid-HybridTalents-ExternalBleed-default-NoBuffs-25.0yards-LongMultiTarget" value: { - dps: 18265.0067 - tps: 27712.15959 + dps: 18527.65508 + tps: 27808.17759 } } dps_results: { key: "TestFeral-Settings-Tauren-preraid-HybridTalents-ExternalBleed-default-NoBuffs-25.0yards-LongSingleTarget" value: { - dps: 16584.94606 - tps: 24201.5895 + dps: 16595.54488 + tps: 23527.36025 } } dps_results: { key: "TestFeral-Settings-Tauren-preraid-HybridTalents-ExternalBleed-default-NoBuffs-25.0yards-ShortSingleTarget" value: { - dps: 17931.31787 - tps: 20269.16498 + dps: 17957.61252 + tps: 20286.37962 } } dps_results: { key: "TestFeral-Settings-Tauren-preraid-HybridTalents-ExternalBleed-monocat-FullBuffs-25.0yards-LongMultiTarget" value: { - dps: 26286.04526 - tps: 18665.35278 + dps: 26279.70562 + tps: 18660.85163 } } dps_results: { key: "TestFeral-Settings-Tauren-preraid-HybridTalents-ExternalBleed-monocat-FullBuffs-25.0yards-LongSingleTarget" value: { - dps: 25650.69461 - tps: 18211.99317 + dps: 25704.79038 + tps: 18250.40117 } } dps_results: { key: "TestFeral-Settings-Tauren-preraid-HybridTalents-ExternalBleed-monocat-FullBuffs-25.0yards-ShortSingleTarget" value: { - dps: 31930.51231 - tps: 22670.66374 + dps: 32106.35315 + tps: 22795.51074 } } dps_results: { key: "TestFeral-Settings-Tauren-preraid-HybridTalents-ExternalBleed-monocat-NoBuffs-25.0yards-LongMultiTarget" value: { - dps: 15799.19132 - tps: 11219.78872 + dps: 15891.64128 + tps: 11285.42819 } } dps_results: { key: "TestFeral-Settings-Tauren-preraid-HybridTalents-ExternalBleed-monocat-NoBuffs-25.0yards-LongSingleTarget" value: { - dps: 15860.51769 - tps: 11261.17772 + dps: 15894.26701 + tps: 11285.13974 } } dps_results: { key: "TestFeral-Settings-Tauren-preraid-HybridTalents-ExternalBleed-monocat-NoBuffs-25.0yards-ShortSingleTarget" value: { - dps: 17611.83319 - tps: 12504.96957 + dps: 17605.22479 + tps: 12500.2776 } } dps_results: { key: "TestFeral-SwitchInFrontOfTarget-Default" value: { - dps: 23779.06358 - tps: 33371.44773 + dps: 23881.08683 + tps: 34366.74946 } } diff --git a/sim/druid/feral/feral.go b/sim/druid/feral/feral.go index 8cbe490de7..17d1822099 100644 --- a/sim/druid/feral/feral.go +++ b/sim/druid/feral/feral.go @@ -68,6 +68,7 @@ type FeralDruid struct { maxRipTicks int32 berserkUsed bool bleedAura *core.Aura + tempSnapshotAura *core.Aura lastShift time.Duration cachedRipEndThresh time.Duration nextActionAt time.Duration @@ -81,6 +82,28 @@ func (cat *FeralDruid) GetDruid() *druid.Druid { func (cat *FeralDruid) Initialize() { cat.Druid.Initialize() cat.RegisterFeralCatSpells() + + snapshotHandler := func(aura *core.Aura, sim *core.Simulation) { + previousRipSnapshotPower := core.TernaryFloat64(cat.tempSnapshotAura.IsActive(), cat.Rip.NewSnapshotPower, cat.Rip.CurrentSnapshotPower) + previousRakeSnapshotPower := core.TernaryFloat64(cat.tempSnapshotAura.IsActive(), cat.Rake.NewSnapshotPower, cat.Rake.CurrentSnapshotPower) + cat.UpdateBleedPower(cat.Rip, sim, cat.CurrentTarget, false, true) + cat.UpdateBleedPower(cat.Rake, sim, cat.CurrentTarget, false, true) + + if cat.Rip.NewSnapshotPower > previousRipSnapshotPower { + cat.tempSnapshotAura = aura + } else if cat.tempSnapshotAura.IsActive() { + cat.Rip.NewSnapshotPower = previousRipSnapshotPower + cat.Rake.NewSnapshotPower = previousRakeSnapshotPower + } else { + cat.tempSnapshotAura = nil + } + } + + cat.TigersFuryAura.ApplyOnGain(snapshotHandler) + cat.TigersFuryAura.ApplyOnExpire(snapshotHandler) + cat.AddOnTemporaryStatsChange(func(sim *core.Simulation, buffAura *core.Aura, _ stats.Stats) { + snapshotHandler(buffAura, sim) + }) } func (cat *FeralDruid) ApplyTalents() { @@ -96,4 +119,11 @@ func (cat *FeralDruid) Reset(sim *core.Simulation) { cat.waitingForTick = false cat.berserkUsed = false cat.nextActionAt = -core.NeverExpires + + // Reset snapshot power values until first cast + cat.Rip.CurrentSnapshotPower = 0 + cat.Rip.NewSnapshotPower = 0 + cat.Rake.CurrentSnapshotPower = 0 + cat.Rake.NewSnapshotPower = 0 + cat.tempSnapshotAura = nil } diff --git a/sim/druid/feral/feral_test.go b/sim/druid/feral/feral_test.go index 49378763c1..c51e63dd86 100644 --- a/sim/druid/feral/feral_test.go +++ b/sim/druid/feral/feral_test.go @@ -33,7 +33,7 @@ func TestFeral(t *testing.T) { GearSet: core.GetGearSet("../../../ui/druid/feral/gear_sets", "preraid"), OtherGearSets: []core.GearSetCombo{ - core.GetGearSet("../../../ui/druid/feral/gear_sets", "p1"), + core.GetGearSet("../../../ui/druid/feral/gear_sets", "p3"), }, Talents: StandardTalents, Glyphs: StandardGlyphs, diff --git a/sim/druid/feral/rotation.go b/sim/druid/feral/rotation.go index e3943037d9..e140373b51 100644 --- a/sim/druid/feral/rotation.go +++ b/sim/druid/feral/rotation.go @@ -74,7 +74,7 @@ func (cat *FeralDruid) shiftBearCat(sim *core.Simulation, powershift bool) bool } func (cat *FeralDruid) canBite(sim *core.Simulation, isExecutePhase bool) bool { - if cat.TigersFuryAura.IsActive() && isExecutePhase { + if cat.tempSnapshotAura.IsActive() && isExecutePhase { return true } @@ -83,7 +83,7 @@ func (cat *FeralDruid) canBite(sim *core.Simulation, isExecutePhase bool) bool { } if isExecutePhase { - return !cat.RipTfSnapshot + return cat.Rip.NewSnapshotPower >= cat.Rip.CurrentSnapshotPower } return cat.Rip.CurDot().RemainingDuration(sim) >= cat.Rotation.BiteTime @@ -302,57 +302,65 @@ func (cat *FeralDruid) postRotation(sim *core.Simulation, nextAction time.Durati } } -func (cat *FeralDruid) calcRipRefreshTime(sim *core.Simulation, ripDot *core.Dot, isExecutePhase bool) time.Duration { - if !ripDot.IsActive() { +func (cat *FeralDruid) calcBleedRefreshTime(sim *core.Simulation, bleedSpell *druid.DruidSpell, bleedDot *core.Dot, isExecutePhase bool, isRip bool) time.Duration { + if !bleedDot.IsActive() { return sim.CurrentTime - cat.ReactionTime } - // If we're not gaining a new Tiger's Fury snapshot, then use the standard 1 tick refresh window - standardRefreshTime := ripDot.ExpiresAt() - ripDot.BaseTickLength + // If we're not gaining a stronger snapshot, then use the standard 1 + // tick refresh window. + bleedEnd := bleedDot.ExpiresAt() + standardRefreshTime := bleedEnd - bleedDot.BaseTickLength - if !cat.TigersFuryAura.IsActive() || isExecutePhase || (cat.ComboPoints() < cat.Rotation.MinCombosForRip) { + if !cat.tempSnapshotAura.IsActive() { return standardRefreshTime } - // Likewise, if the existing TF buff will still be up at the start of the normal window, then don't clip unnecessarily - tfEnd := cat.TigersFuryAura.ExpiresAt() - - if tfEnd > standardRefreshTime+cat.ReactionTime { + // For Rip specifically, also bypass clipping calculations during Execute phase or + // if CP count is too low for the calculation to be relevant. + if isRip && (isExecutePhase || (cat.ComboPoints() < cat.Rotation.MinCombosForRip)) { return standardRefreshTime } - // Potential clips for a TF snapshot should be done as late as possible - latestPossibleSnapshot := tfEnd - cat.ReactionTime*time.Duration(2) - - // Determine if an early clip would cost us an extra Rip cast over the course of the fight - maxRipDur := time.Duration(cat.maxRipTicks) * ripDot.BaseTickLength - finalPossibleRipCast := core.TernaryDuration(cat.Rotation.BiteDuringExecute, core.DurationFromSeconds(0.75*sim.Duration.Seconds())-cat.ReactionTime, sim.Duration-cat.cachedRipEndThresh) - minRipsPossible := (finalPossibleRipCast - standardRefreshTime) / maxRipDur - projectedRipCasts := (finalPossibleRipCast - latestPossibleSnapshot) / maxRipDur + // Likewise, if the existing buff will still be up at the start of the normal + // window, then don't clip unnecessarily. For long buffs that cover a full bleed + // duration, project "buffEnd" forward in time such that we block clips if we are + // already maxing out the number of full durations we can snapshot. + buffRemains := cat.tempSnapshotAura.RemainingDuration(sim) + maxTickCount := core.TernaryInt32(isRip, cat.maxRipTicks, bleedDot.BaseTickCount) + maxBleedDur := bleedDot.BaseTickLength * time.Duration(maxTickCount) + numCastsCovered := buffRemains / maxBleedDur + buffEnd := cat.tempSnapshotAura.ExpiresAt() - numCastsCovered * maxBleedDur - // If the clip is free, then always allow it - if projectedRipCasts == minRipsPossible { - return latestPossibleSnapshot + if buffEnd > standardRefreshTime + cat.ReactionTime { + return standardRefreshTime } - // If the clip costs us a Rip cast (30 Energy), then we need to determine whether the damage gain is worth the spend. - // First calculate the maximum number of buffed Rip ticks we can get out before the fight ends. - buffedTickCount := min(cat.maxRipTicks+1, int32((sim.Duration-latestPossibleSnapshot)/ripDot.BaseTickLength)) + // Potential clips for a buff snapshot should be done as late as possible + latestPossibleSnapshot := buffEnd - cat.ReactionTime * time.Duration(2) + numClippedTicks := (bleedEnd - latestPossibleSnapshot) / bleedDot.BaseTickLength + targetClipTime := standardRefreshTime - numClippedTicks * bleedDot.BaseTickLength - // Subtract out any ticks that would already be buffed by an existing snapshot - if cat.RipTfSnapshot { - buffedTickCount -= ripDot.RemainingTicks() - } + // Since the clip can cost us 30-35 Energy, we need to determine whether the damage gain is worth the + // spend. First calculate the maximum number of buffed bleed ticks we can get out before the fight + // ends. + buffedTickCount := min(maxTickCount, int32((sim.Duration - targetClipTime) / bleedDot.BaseTickLength)) // Perform a DPE comparison vs. Shred - expectedDamageGain := cat.Rip.ExpectedTickDamage(sim, cat.CurrentTarget) * (1.0 - 1.0/1.15) * float64(buffedTickCount) + expectedDamageGain := (bleedSpell.NewSnapshotPower - bleedSpell.CurrentSnapshotPower) * float64(buffedTickCount) + + // For Rake specifically, we get 1 free "tick" immediately upon cast. + if !isRip { + expectedDamageGain += bleedSpell.NewSnapshotPower + } + energyEquivalent := expectedDamageGain / cat.Shred.ExpectedInitialDamage(sim, cat.CurrentTarget) * cat.Shred.DefaultCast.Cost if sim.Log != nil { - cat.Log(sim, "Rip TF snapshot is worth %.1f Energy", energyEquivalent) + cat.Log(sim, "%s buff snapshot is worth %.1f Energy", bleedSpell.ShortName, energyEquivalent) } - return core.TernaryDuration(energyEquivalent > cat.Rip.DefaultCast.Cost, latestPossibleSnapshot, standardRefreshTime) + return core.TernaryDuration(energyEquivalent > bleedSpell.DefaultCast.Cost, targetClipTime, standardRefreshTime) } func (cat *FeralDruid) canMeleeWeave(sim *core.Simulation, regenRate float64, currentEnergy float64, isClearcast bool, upcomingTimers *PoolingActions) bool { @@ -486,12 +494,12 @@ func (cat *FeralDruid) doRotation(sim *core.Simulation) (bool, time.Duration) { baseEndThresh := cat.calcRipEndThresh(sim) finalTickLeeway := core.TernaryDuration(ripDot.IsActive(), ripDot.TimeUntilNextTick(sim), 0) endThreshForClip := baseEndThresh + finalTickLeeway - ripRefreshTime := cat.calcRipRefreshTime(sim, ripDot, isExecutePhase) + ripRefreshTime := cat.calcBleedRefreshTime(sim, cat.Rip, ripDot, isExecutePhase, true) ripNow := (curCp >= rotation.MinCombosForRip) && (!ripDot.IsActive() || ((sim.CurrentTime > ripRefreshTime) && !isExecutePhase)) && (simTimeRemain >= endThreshForClip) && ripCcCheck biteAtEnd := (curCp >= rotation.MinCombosForBite) && ((simTimeRemain < endThreshForClip) || (ripDot.IsActive() && (simTimeRemain-ripDot.RemainingDuration(sim) < baseEndThresh))) // Delay Rip refreshes if Tiger's Fury will be usable soon enough for the snapshot to outweigh the lost Rip ticks from waiting - if ripNow && !tfActive { + if ripNow && !tfActive && !cat.tempSnapshotAura.IsActive() { buffedTickCount := min(cat.maxRipTicks, int32((simTimeRemain-finalTickLeeway)/ripDot.BaseTickLength)) delayBreakpoint := finalTickLeeway + core.DurationFromSeconds(0.15*float64(buffedTickCount)*ripDot.BaseTickLength.Seconds()) @@ -531,7 +539,8 @@ func (cat *FeralDruid) doRotation(sim *core.Simulation) (bool, time.Duration) { biteNow = (biteNow || emergencyBiteNow) && !t11RefreshNext // Rake calcs - rakeNow := rotation.UseRake && (!rakeDot.IsActive() || (rakeDot.RemainingDuration(sim) < rakeDot.BaseTickLength)) && (simTimeRemain > rakeDot.BaseTickLength) && rakeCcCheck + rakeRefreshTime := cat.calcBleedRefreshTime(sim, cat.Rake, rakeDot, isExecutePhase, false) + rakeNow := rotation.UseRake && (!rakeDot.IsActive() || (sim.CurrentTime > rakeRefreshTime)) && (simTimeRemain > rakeDot.BaseTickLength) && rakeCcCheck // Additionally, don't Rake if the current Shred DPE is higher due to // trinket procs etc. @@ -585,8 +594,7 @@ func (cat *FeralDruid) doRotation(sim *core.Simulation) (bool, time.Duration) { refreshCost := core.Ternary(cat.berserkExpectedAt(sim, ripRefreshTime), baseCost*0.5, baseCost) pendingPool.addAction(ripRefreshTime, refreshCost) } - if rakeRefreshPending && (rakeDot.RemainingDuration(sim) > rakeDot.BaseTickLength) { - rakeRefreshTime := rakeDot.ExpiresAt() - rakeDot.BaseTickLength + if rakeRefreshPending && (sim.CurrentTime < rakeRefreshTime) { rakeCost := core.Ternary(cat.berserkExpectedAt(sim, rakeRefreshTime), cat.Rake.DefaultCast.Cost*0.5, cat.Rake.DefaultCast.Cost) pendingPool.addAction(rakeRefreshTime, rakeCost) } diff --git a/sim/druid/rake.go b/sim/druid/rake.go index da7d11d208..6eb391089b 100644 --- a/sim/druid/rake.go +++ b/sim/druid/rake.go @@ -51,6 +51,9 @@ func (druid *Druid) registerRakeSpell() { attackTable := dot.Spell.Unit.AttackTables[target.UnitIndex] dot.SnapshotCritChance = dot.Spell.PhysicalCritChance(attackTable) dot.SnapshotAttackerMultiplier = dot.Spell.AttackerDamageMultiplier(attackTable, true) + + // Store snapshot power parameters for later use. + druid.UpdateBleedPower(druid.Rake, sim, target, true, true) }, OnTick: func(sim *core.Simulation, target *core.Unit, dot *core.Dot) { dot.CalcAndDealPeriodicSnapshotDamage(sim, target, dot.OutcomeSnapshotCrit) @@ -99,6 +102,8 @@ func (druid *Druid) registerRakeSpell() { druid.AddOnMasteryStatChanged(func(sim *core.Simulation, oldMastery float64, newMastery float64) { druid.Rake.DamageMultiplier *= druid.RazorClawsMultiplier(newMastery) / druid.RazorClawsMultiplier(oldMastery) }) + + druid.Rake.ShortName = "Rake" } func (druid *Druid) CurrentRakeCost() float64 { diff --git a/sim/druid/rip.go b/sim/druid/rip.go index fd81eb68d1..459fa0d299 100644 --- a/sim/druid/rip.go +++ b/sim/druid/rip.go @@ -53,17 +53,19 @@ func (druid *Druid) registerRipSpell() { TickLength: time.Second * 2, OnSnapshot: func(sim *core.Simulation, target *core.Unit, dot *core.Dot, isRollover bool) { + if isRollover { + panic("Rip cannot roll-over snapshots!") + } + cp := float64(comboPointSnapshot) ap := dot.Spell.MeleeAttackPower() - dot.SnapshotBaseDamage = baseDamage + comboPointCoeff*cp + attackPowerCoeff*cp*ap + attackTable := dot.Spell.Unit.AttackTables[target.UnitIndex] + dot.SnapshotCritChance = dot.Spell.PhysicalCritChance(attackTable) + dot.SnapshotAttackerMultiplier = dot.Spell.AttackerDamageMultiplier(attackTable, true) - if !isRollover { - attackTable := dot.Spell.Unit.AttackTables[target.UnitIndex] - dot.SnapshotCritChance = dot.Spell.PhysicalCritChance(attackTable) - dot.SnapshotAttackerMultiplier = dot.Spell.AttackerDamageMultiplier(attackTable, true) - druid.RipTfSnapshot = druid.TigersFuryAura.IsActive() - } + // Store snapshot power parameters for later use. + druid.UpdateBleedPower(druid.Rip, sim, target, true, true) }, OnTick: func(sim *core.Simulation, target *core.Unit, dot *core.Dot) { dot.CalcAndDealPeriodicSnapshotDamage(sim, target, dot.OutcomeSnapshotCrit) @@ -86,7 +88,7 @@ func (druid *Druid) registerRipSpell() { }, ExpectedTickDamage: func(sim *core.Simulation, target *core.Unit, spell *core.Spell, _ bool) *core.SpellResult { - cp := float64(druid.ComboPoints()) + cp := 5.0 // Hard-code this so that snapshotting calculations can be performed at any CP value. ap := spell.MeleeAttackPower() baseTickDamage := baseDamage + comboPointCoeff*cp + attackPowerCoeff*cp*ap result := spell.CalcPeriodicDamage(sim, target, baseTickDamage, spell.OutcomeExpectedMagicAlwaysHit) @@ -101,6 +103,8 @@ func (druid *Druid) registerRipSpell() { druid.AddOnMasteryStatChanged(func(sim *core.Simulation, oldMastery float64, newMastery float64) { druid.Rip.DamageMultiplier *= druid.RazorClawsMultiplier(newMastery) / druid.RazorClawsMultiplier(oldMastery) }) + + druid.Rip.ShortName = "Rip" } func (druid *Druid) MaxRipTicks() int32 {