diff --git a/proto/common.proto b/proto/common.proto index a2a0a2a0c0..dc94f18059 100644 --- a/proto/common.proto +++ b/proto/common.proto @@ -816,6 +816,8 @@ message Cooldowns { // % HP threshold, below which defensive cooldowns can be used. double hp_percent_for_defensives = 2; + int32 desync_proc_trinket1_seconds = 3; + int32 desync_proc_trinket2_seconds = 4; } message HealingModel { diff --git a/sim/common/tbc/melee_items.go b/sim/common/tbc/melee_items.go index 3da9300e0d..03d2df2b99 100644 --- a/sim/common/tbc/melee_items.go +++ b/sim/common/tbc/melee_items.go @@ -239,6 +239,7 @@ func init() { core.MakeProcTriggerAura(&character.Unit, core.ProcTrigger{ Name: "Blade of Unquenched Thirst Trigger", + ActionID: core.ActionID{ItemID: 31193}, Callback: core.CallbackOnSpellHitDealt, ProcMask: procMask, Outcome: core.OutcomeLanded, diff --git a/sim/common/wotlk/capacitors.go b/sim/common/wotlk/capacitors.go index 9eab8667c9..dc462210ec 100644 --- a/sim/common/wotlk/capacitors.go +++ b/sim/common/wotlk/capacitors.go @@ -90,6 +90,7 @@ func init() { ProcMask: core.ProcMaskSpellDamage, Outcome: core.OutcomeCrit, ICD: time.Millisecond * 2500, + ActionID: core.ActionID{ItemID: 38072}, }, School: core.SpellSchoolNature, MinDmg: 1181, @@ -104,6 +105,7 @@ func init() { ProcMask: core.ProcMaskSpellDamage, Outcome: core.OutcomeCrit, ICD: time.Millisecond * 2000, + ActionID: core.ActionID{ItemID: 47182}, }, School: core.SpellSchoolFire, MinDmg: 1741, @@ -118,6 +120,7 @@ func init() { ProcMask: core.ProcMaskSpellDamage, Outcome: core.OutcomeCrit, ICD: time.Millisecond * 2000, + ActionID: core.ActionID{ItemID: 47188}, }, School: core.SpellSchoolFire, MinDmg: 1959, @@ -135,6 +138,7 @@ func init() { ProcMask: core.ProcMaskSpellDamage, Outcome: core.OutcomeCrit, ICD: time.Millisecond * 2000, + ActionID: core.ActionID{ItemID: 47316}, }, School: core.SpellSchoolFire, MinDmg: 1741, @@ -149,6 +153,7 @@ func init() { ProcMask: core.ProcMaskSpellDamage, Outcome: core.OutcomeCrit, ICD: time.Millisecond * 2000, + ActionID: core.ActionID{ItemID: 47477}, }, School: core.SpellSchoolFire, MinDmg: 1959, @@ -232,6 +237,7 @@ func init() { Callback: core.CallbackOnSpellHitDealt, ProcMask: core.ProcMaskMelee, Outcome: core.OutcomeLanded, + ActionID: core.ActionID{ItemID: itemID}, ProcChance: 0.5, Handler: func(sim *core.Simulation, spell *core.Spell, result *core.SpellResult) { if spell == mhSpell || spell == ohSpell { // can't proc itself diff --git a/sim/common/wotlk/damage_procs.go b/sim/common/wotlk/damage_procs.go index 6c947cdfa7..0ce52cab14 100644 --- a/sim/common/wotlk/damage_procs.go +++ b/sim/common/wotlk/damage_procs.go @@ -55,6 +55,7 @@ func init() { Outcome: core.OutcomeLanded, ProcChance: 0.15, ICD: time.Second * 45, + ActionID: core.ActionID{ItemID: 37064}, }, School: core.SpellSchoolFire, MinDmg: 1024, @@ -70,6 +71,7 @@ func init() { Outcome: core.OutcomeLanded, ProcChance: 0.15, ICD: time.Second * 45, + ActionID: core.ActionID{ItemID: 37264}, }, School: core.SpellSchoolShadow, MinDmg: 1168, @@ -85,6 +87,7 @@ func init() { Outcome: core.OutcomeLanded, ProcChance: 0.15, ICD: time.Second * 45, + ActionID: core.ActionID{ItemID: 39889}, }, School: core.SpellSchoolHoly, MinDmg: 1024, @@ -102,6 +105,7 @@ func init() { Outcome: core.OutcomeLanded, ProcChance: 0.15, ICD: time.Second * 45, + ActionID: core.ActionID{ItemID: 40371}, }, School: core.SpellSchoolArcane, MinDmg: 1504, @@ -116,6 +120,7 @@ func init() { Harmful: true, ProcChance: 0.10, ICD: time.Second * 15, + ActionID: core.ActionID{ItemID: 40373}, }, School: core.SpellSchoolShadow, MinDmg: 788, @@ -130,6 +135,7 @@ func init() { Harmful: true, ProcChance: 0.15, ICD: time.Second * 45, + ActionID: core.ActionID{ItemID: 42990}, }, School: core.SpellSchoolShadow, MinDmg: 1750, diff --git a/sim/common/wotlk/highest_stat_effects.go b/sim/common/wotlk/highest_stat_effects.go index 7233a1d0b3..a1a9d28bb5 100644 --- a/sim/common/wotlk/highest_stat_effects.go +++ b/sim/common/wotlk/highest_stat_effects.go @@ -72,6 +72,7 @@ func init() { Harmful: true, ProcChance: 0.35, ICD: time.Second * 45, + ActionID: core.ActionID{ItemID: itemID}, Handler: func(sim *core.Simulation, _ *core.Spell, _ *core.SpellResult) { hsa.Get(character).Activate(sim) }, @@ -106,6 +107,7 @@ func init() { Callback: core.CallbackOnSpellHitDealt | core.CallbackOnPeriodicDamageDealt, Harmful: true, ProcChance: 0.35, + ActionID: core.ActionID{ItemID: itemID}, ICD: time.Second * 45, Handler: func(sim *core.Simulation, _ *core.Spell, _ *core.SpellResult) { hsa.Get(character).Activate(sim) diff --git a/sim/common/wotlk/other_effects.go b/sim/common/wotlk/other_effects.go index 38686547e0..dbbdc3fa10 100644 --- a/sim/common/wotlk/other_effects.go +++ b/sim/common/wotlk/other_effects.go @@ -33,6 +33,7 @@ func init() { Harmful: true, ProcChance: 0.05, ICD: time.Second * 50, + ActionID: actionID, Handler: func(sim *core.Simulation, _ *core.Spell, _ *core.SpellResult) { procAura.Activate(sim) }, @@ -61,6 +62,7 @@ func init() { Harmful: true, ProcChance: 0.05, ICD: time.Second * 50, + ActionID: actionID, Handler: func(sim *core.Simulation, _ *core.Spell, _ *core.SpellResult) { procAura.Activate(sim) }, @@ -179,6 +181,7 @@ func init() { ProcMask: core.ProcMaskMeleeOrRanged, Outcome: core.OutcomeLanded, ProcChance: 0.35, + ActionID: core.ActionID{ItemID: itemID}, ICD: time.Second * 105, Handler: func(sim *core.Simulation, _ *core.Spell, _ *core.SpellResult) { rand := sim.RandomFloat("Deathbringer's Will") @@ -228,6 +231,7 @@ func init() { Outcome: core.OutcomeCrit, ProcChance: 0.2, ICD: time.Second * 45, + ActionID: core.ActionID{ItemID: 40258}, Handler: func(sim *core.Simulation, _ *core.Spell, result *core.SpellResult) { healSpell.Hot(result.Target).Apply(sim) }, @@ -246,6 +250,7 @@ func init() { Outcome: core.OutcomeCrit, ProcChance: 0.25, ICD: time.Second * 45, + ActionID: core.ActionID{ItemID: 40382}, Handler: func(sim *core.Simulation, _ *core.Spell, _ *core.SpellResult) { character.AddMana(sim, 900, manaMetrics) }, @@ -329,6 +334,7 @@ func init() { Callback: core.CallbackOnHealDealt | core.CallbackOnPeriodicHealDealt, Harmful: true, // Better name for this would be, 'nonzero' ProcChance: 0.1, + ActionID: core.ActionID{ItemID: 46017}, ICD: time.Second * 45, Handler: func(sim *core.Simulation, _ *core.Spell, _ *core.SpellResult) { activeAura.Activate(sim) @@ -445,6 +451,7 @@ func init() { Name: name + " Trigger", Callback: core.CallbackOnSpellHitTaken, ProcMask: core.ProcMaskMelee, + ActionID: core.ActionID{ItemID: itemID}, Harmful: true, Handler: func(sim *core.Simulation, _ *core.Spell, _ *core.SpellResult) { if icd.IsReady(sim) && character.CurrentHealthPercent() < 0.35 { @@ -486,6 +493,7 @@ func init() { ProcMask: core.ProcMaskSpellDamage, Harmful: true, ProcChance: 0.10, + ActionID: core.ActionID{ItemID: itemID}, ICD: time.Second * 45, Handler: func(sim *core.Simulation, _ *core.Spell, _ *core.SpellResult) { procAura.Activate(sim) @@ -545,6 +553,7 @@ func init() { SpellFlags: core.SpellFlagHelpful, ProcChance: 0.25, ICD: time.Second * 45, + ActionID: core.ActionID{ItemID: 47215}, Handler: func(sim *core.Simulation, _ *core.Spell, _ *core.SpellResult) { character.AddMana(sim, 500, manaMetrics) }, @@ -609,6 +618,7 @@ func init() { Callback: core.CallbackOnSpellHitDealt, ProcMask: core.ProcMaskMelee, PPM: 1, + ActionID: core.ActionID{ItemID: itemID}, Handler: func(sim *core.Simulation, _ *core.Spell, _ *core.SpellResult) { // Deactivate first, to cancel old PA. procAura.Deactivate(sim) @@ -627,6 +637,7 @@ func init() { Name: "Ephemeral Snowflake", Callback: core.CallbackOnHealDealt | core.CallbackOnPeriodicHealDealt, ICD: time.Millisecond * 250, + ActionID: actionID, Handler: func(sim *core.Simulation, _ *core.Spell, _ *core.SpellResult) { character.AddMana(sim, 11, manaMetrics) }, @@ -753,6 +764,7 @@ func init() { Callback: core.CallbackOnHealDealt | core.CallbackOnPeriodicHealDealt, ProcChance: 0.3, ICD: time.Second * 45, + ActionID: core.ActionID{ItemID: itemID}, Handler: func(sim *core.Simulation, _ *core.Spell, _ *core.SpellResult) { randIndex := int(math.Floor(sim.RandomFloat("Althor's Abacus") * float64(len(eligibleUnits)))) healTarget := eligibleUnits[randIndex] @@ -863,6 +875,7 @@ func init() { Callback: core.CallbackOnSpellHitTaken, ProcMask: core.ProcMaskMelee, Harmful: true, + ActionID: core.ActionID{ItemID: itemID}, Handler: func(sim *core.Simulation, _ *core.Spell, _ *core.SpellResult) { if icd.IsReady(sim) && character.CurrentHealthPercent() < 0.35 { icd.Use(sim) @@ -972,6 +985,7 @@ func init() { Callback: core.CallbackOnSpellHitDealt, ProcMask: core.ProcMaskMelee, ProcChance: 0.03, + ActionID: core.ActionID{ItemID: itemID}, Handler: func(sim *core.Simulation, _ *core.Spell, _ *core.SpellResult) { procAura.Activate(sim) }, @@ -1010,6 +1024,7 @@ func init() { Callback: core.CallbackOnHealDealt, ProcMask: core.ProcMaskSpellHealing, ProcChance: 0.02, + ActionID: actionID, Handler: func(sim *core.Simulation, _ *core.Spell, _ *core.SpellResult) { procAura.Activate(sim) }, diff --git a/sim/common/wotlk/stat_bonus_procs.go b/sim/common/wotlk/stat_bonus_procs.go index 73b810f749..15fd59ed60 100644 --- a/sim/common/wotlk/stat_bonus_procs.go +++ b/sim/common/wotlk/stat_bonus_procs.go @@ -42,6 +42,7 @@ func newProcStatBonusEffect(config ProcStatBonusEffect) { } core.MakeProcTriggerAura(&character.Unit, core.ProcTrigger{ + ActionID: core.ActionID{ItemID: config.ID}, Name: config.Name, Callback: config.Callback, ProcMask: config.ProcMask, diff --git a/sim/common/wotlk/stat_bonus_stacking.go b/sim/common/wotlk/stat_bonus_stacking.go index fa221e9dd1..c3210daa7e 100644 --- a/sim/common/wotlk/stat_bonus_stacking.go +++ b/sim/common/wotlk/stat_bonus_stacking.go @@ -36,6 +36,7 @@ func newStackingStatBonusEffect(config StackingStatBonusEffect) { }) core.MakeProcTriggerAura(&character.Unit, core.ProcTrigger{ + ActionID: core.ActionID{ItemID: config.ID}, Name: config.Name, Callback: config.Callback, ProcMask: config.ProcMask, @@ -153,6 +154,7 @@ func init() { ProcMask: core.ProcMaskMeleeOrRanged, Outcome: core.OutcomeLanded, ProcChance: 0.1, + ActionID: core.ActionID{ItemID: 38212}, ICD: time.Second * 45, Handler: func(sim *core.Simulation, _ *core.Spell, _ *core.SpellResult) { procAura.Activate(sim) diff --git a/sim/core/character.go b/sim/core/character.go index 2234184075..20fda76eab 100644 --- a/sim/core/character.go +++ b/sim/core/character.go @@ -370,6 +370,7 @@ func (character *Character) AddPartyBuffs(partyBuffs *proto.PartyBuffs) { func (character *Character) initialize(agent Agent) { character.majorCooldownManager.initialize(character) + character.DesyncTrinketProcs() character.gcdAction = &PendingAction{ Priority: ActionPriorityGCD, diff --git a/sim/core/major_cooldown.go b/sim/core/major_cooldown.go index 2727536cbe..ee305b40d1 100644 --- a/sim/core/major_cooldown.go +++ b/sim/core/major_cooldown.go @@ -1,6 +1,7 @@ package core import ( + "strings" "time" "golang.org/x/exp/slices" @@ -160,8 +161,10 @@ func (mcd *MajorCooldown) tryActivateHelper(sim *Simulation, character *Characte } type cooldownConfigs struct { - Cooldowns []*proto.Cooldown - HpPercentForDefensives float64 + Cooldowns []*proto.Cooldown + HpPercentForDefensives float64 + DesyncProcTrinket1Seconds int32 + DesyncProcTrinket2Seconds int32 } type majorCooldownManager struct { @@ -190,7 +193,9 @@ func newMajorCooldownManager(cooldowns *proto.Cooldowns) majorCooldownManager { } cooldownConfigs := cooldownConfigs{ - HpPercentForDefensives: cooldowns.HpPercentForDefensives, + HpPercentForDefensives: cooldowns.HpPercentForDefensives, + DesyncProcTrinket1Seconds: cooldowns.DesyncProcTrinket1Seconds, + DesyncProcTrinket2Seconds: cooldowns.DesyncProcTrinket2Seconds, } for _, cooldownConfig := range cooldowns.Cooldowns { if cooldownConfig.Id != nil { @@ -269,6 +274,93 @@ func (mcdm *majorCooldownManager) DelayDPSCooldowns(delay time.Duration) { }) } +func desyncTrinketProcAura(aura *Aura, delay time.Duration) { + if cb := aura.OnSpellHitDealt; cb != nil { + aura.OnSpellHitDealt = func(aura *Aura, sim *Simulation, spell *Spell, result *SpellResult) { + if sim.CurrentTime >= delay { + cb(aura, sim, spell, result) + } + } + } + + if cb := aura.OnSpellHitTaken; cb != nil { + aura.OnSpellHitTaken = func(aura *Aura, sim *Simulation, spell *Spell, result *SpellResult) { + if sim.CurrentTime >= delay { + cb(aura, sim, spell, result) + } + } + } + + if cb := aura.OnPeriodicDamageDealt; cb != nil { + aura.OnPeriodicDamageDealt = func(aura *Aura, sim *Simulation, spell *Spell, result *SpellResult) { + if sim.CurrentTime >= delay { + cb(aura, sim, spell, result) + } + } + } + + if cb := aura.OnHealDealt; cb != nil { + aura.OnHealDealt = func(aura *Aura, sim *Simulation, spell *Spell, result *SpellResult) { + if sim.CurrentTime >= delay { + cb(aura, sim, spell, result) + } + } + } + + if cb := aura.OnPeriodicHealDealt; cb != nil { + aura.OnPeriodicHealDealt = func(aura *Aura, sim *Simulation, spell *Spell, result *SpellResult) { + if sim.CurrentTime >= delay { + cb(aura, sim, spell, result) + } + } + } + + if cb := aura.OnCastComplete; cb != nil { + aura.OnCastComplete = func(aura *Aura, sim *Simulation, spell *Spell) { + if sim.CurrentTime >= delay { + cb(aura, sim, spell) + } + } + } +} + +func findTrinketAura(character *Character, trinketID int32) *Aura { + for _, aura := range character.auras { + if strings.HasSuffix(aura.Label, "Proc") { + continue + } + if aura.ActionID.ItemID == trinketID || aura.metrics.ID.ItemID == trinketID { + return aura + } + } + return nil +} + +// Desyncs trinket procs per configured user settings. +// Hold the first proc back until some time into the simulation (i.e. because the player +// un-equipped and re-equipped the trinket before pull). +func (mcdm *majorCooldownManager) DesyncTrinketProcs() { + if delay := time.Duration(mcdm.cooldownConfigs.DesyncProcTrinket1Seconds) * time.Second; delay > 0 { + if trinket1 := mcdm.character.Equip[ItemSlotTrinket1]; trinket1.ID > 0 && HasItemEffect(trinket1.ID) { + mcdm.character.Env.RegisterPostFinalizeEffect(func() { + if aura := findTrinketAura(mcdm.character, trinket1.ID); aura != nil { + desyncTrinketProcAura(aura, delay) + } + }) + } + } + + if delay := time.Duration(mcdm.cooldownConfigs.DesyncProcTrinket2Seconds) * time.Second; delay > 0 { + if trinket2 := mcdm.character.Equip[ItemSlotTrinket2]; trinket2.ID > 0 && HasItemEffect(trinket2.ID) { + mcdm.character.Env.RegisterPostFinalizeEffect(func() { + if aura := findTrinketAura(mcdm.character, trinket2.ID); aura != nil { + desyncTrinketProcAura(aura, delay) + } + }) + } + } +} + func (mcdm *majorCooldownManager) reset(sim *Simulation) { for i := range mcdm.majorCooldowns { newMCD := &MajorCooldown{} diff --git a/sim/core/test_generators.go b/sim/core/test_generators.go index 4a23395c11..47df7e892c 100644 --- a/sim/core/test_generators.go +++ b/sim/core/test_generators.go @@ -112,6 +112,7 @@ type SettingsCombos struct { Encounters []EncounterCombo SimOptions *proto.SimOptions IsHealer bool + Cooldowns *proto.Cooldowns } func (combos *SettingsCombos) NumTests() int { @@ -169,6 +170,7 @@ func (combos *SettingsCombos) GetTest(testIdx int) (string, *proto.ComputeStatsR Consumes: buffsCombo.Consumes, Buffs: buffsCombo.Player, Profession1: proto.Profession_Engineering, + Cooldowns: combos.Cooldowns, }, specOptionsCombo.SpecOptions), buffsCombo.Party, buffsCombo.Raid, @@ -472,6 +474,8 @@ type CharacterSuiteConfig struct { StatsToWeigh []proto.Stat EPReferenceStat proto.Stat + + Cooldowns *proto.Cooldowns } func FullCharacterTestSuiteGenerator(config CharacterSuiteConfig) TestGenerator { @@ -496,6 +500,7 @@ func FullCharacterTestSuiteGenerator(config CharacterSuiteConfig) TestGenerator Glyphs: config.Glyphs, Profession1: proto.Profession_Engineering, Rotation: config.Rotation.Rotation, + Cooldowns: config.Cooldowns, InFrontOfTarget: config.InFrontOfTarget, DistanceFromTarget: 30, @@ -546,6 +551,7 @@ func FullCharacterTestSuiteGenerator(config CharacterSuiteConfig) TestGenerator IsHealer: config.IsHealer, Encounters: MakeDefaultEncounterCombos(), SimOptions: DefaultSimTestOptions, + Cooldowns: config.Cooldowns, }, }, { diff --git a/sim/druid/feral/TestFeralDoubleArmorPenTrinketsNoDesync.results b/sim/druid/feral/TestFeralDoubleArmorPenTrinketsNoDesync.results new file mode 100644 index 0000000000..a2f74f1a4c --- /dev/null +++ b/sim/druid/feral/TestFeralDoubleArmorPenTrinketsNoDesync.results @@ -0,0 +1,973 @@ +character_stats_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-CharacterStats-Default" + value: { + final_stats: 560.16972 + final_stats: 1930.26636 + final_stats: 1888.0455 + final_stats: 379.63094 + final_stats: 390.09696 + final_stats: 500 + final_stats: 125 + final_stats: 309 + final_stats: 1149.05664 + final_stats: 276 + final_stats: 0 + final_stats: 11551.63502 + final_stats: 309 + final_stats: 2845.52168 + final_stats: 276 + final_stats: 602 + final_stats: 207.975 + final_stats: 8910.46416 + final_stats: 0 + final_stats: 0 + final_stats: 10481.03272 + final_stats: 2863.3 + final_stats: 0 + final_stats: 0 + final_stats: 0 + final_stats: 1852.08975 + final_stats: 0 + final_stats: 0 + final_stats: 26117.055 + final_stats: 75 + final_stats: 75 + final_stats: 75 + final_stats: 75 + final_stats: 130 + final_stats: 0 + final_stats: 0 + final_stats: 0 + final_stats: 0 + final_stats: 0 + final_stats: 0 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-Althor'sAbacus-50359" + value: { + dps: 9659.13436 + tps: 6921.10535 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-Althor'sAbacus-50366" + value: { + dps: 9659.13436 + tps: 6921.10535 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-AshtongueTalismanofEquilibrium-32486" + value: { + dps: 9659.13436 + tps: 6921.10535 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-AustereEarthsiegeDiamond" + value: { + dps: 9661.3169 + tps: 6924.07589 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-Bandit'sInsignia-40371" + value: { + dps: 9843.44772 + tps: 7052.34176 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-BaubleofTrueBlood-50354" + value: { + dps: 9659.13436 + tps: 6921.10535 + hps: 90.47701 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-BaubleofTrueBlood-50726" + value: { + dps: 9659.13436 + tps: 6921.10535 + hps: 90.47701 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-BeamingEarthsiegeDiamond" + value: { + dps: 9694.29123 + tps: 6947.48766 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-BlessedRegaliaofUndeadCleansing" + value: { + dps: 7622.64518 + tps: 5476.17025 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-BracingEarthsiegeDiamond" + value: { + dps: 9661.3169 + tps: 6785.59437 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-BrutalGladiator'sIdolofResolve-35019" + value: { + dps: 9628.96689 + tps: 6901.10738 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-ChaoticSkyflareDiamond" + value: { + dps: 9909.59814 + tps: 7100.35557 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-CorpseTongueCoin-50349" + value: { + dps: 9659.13436 + tps: 6921.10535 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-CorpseTongueCoin-50352" + value: { + dps: 9659.13436 + tps: 6921.10535 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-CorrodedSkeletonKey-50356" + value: { + dps: 9659.13436 + tps: 6921.10535 + hps: 64 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-DarkmoonCard:Berserker!-42989" + value: { + dps: 9886.22076 + tps: 7082.18711 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-DarkmoonCard:Death-42990" + value: { + dps: 9874.07177 + tps: 7073.93526 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-DarkmoonCard:Greatness-44255" + value: { + dps: 9877.63732 + tps: 7076.61637 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-DeadlyGladiator'sIdolofResolve-42588" + value: { + dps: 9628.96689 + tps: 6901.10738 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-Death'sChoice-47464" + value: { + dps: 10265.77853 + tps: 7352.12185 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-DeathKnight'sAnguish-38212" + value: { + dps: 9813.21053 + tps: 7030.79857 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-Deathbringer'sWill-50362" + value: { + dps: 10325.60212 + tps: 7394.67139 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-Deathbringer'sWill-50363" + value: { + dps: 10398.41767 + tps: 7446.37043 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-Defender'sCode-40257" + value: { + dps: 9659.13436 + tps: 6921.10535 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-DestructiveSkyflareDiamond" + value: { + dps: 9700.68035 + tps: 6951.94915 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-DislodgedForeignObject-50348" + value: { + dps: 9908.71748 + tps: 7098.15979 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-DislodgedForeignObject-50353" + value: { + dps: 9892.22433 + tps: 7086.30007 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-DreamwalkerBattlegear" + value: { + dps: 8540.65505 + tps: 6128.55555 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-DreamwalkerGarb" + value: { + dps: 7237.49346 + tps: 5204.5822 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-EffulgentSkyflareDiamond" + value: { + dps: 9661.3169 + tps: 6924.07589 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-EmberSkyflareDiamond" + value: { + dps: 9661.3169 + tps: 6924.07589 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-EnigmaticSkyflareDiamond" + value: { + dps: 9694.29123 + tps: 6947.48766 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-EnigmaticStarflareDiamond" + value: { + dps: 9690.05668 + tps: 6944.48113 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-EphemeralSnowflake-50260" + value: { + dps: 9842.00842 + tps: 7050.87114 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-EssenceofGossamer-37220" + value: { + dps: 9659.13436 + tps: 6921.10535 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-EternalEarthsiegeDiamond" + value: { + dps: 9661.3169 + tps: 6924.07589 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-ExtractofNecromanticPower-40373" + value: { + dps: 9880.13048 + tps: 7077.9378 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-EyeoftheBroodmother-45308" + value: { + dps: 9830.29553 + tps: 7042.4802 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-Figurine-SapphireOwl-42413" + value: { + dps: 9659.13436 + tps: 6921.10535 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-ForethoughtTalisman-40258" + value: { + dps: 9659.13436 + tps: 6921.10535 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-ForgeEmber-37660" + value: { + dps: 9779.95197 + tps: 7006.73627 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-ForlornSkyflareDiamond" + value: { + dps: 9661.3169 + tps: 6924.07589 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-ForlornStarflareDiamond" + value: { + dps: 9661.3169 + tps: 6924.07589 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-FuriousGladiator'sIdolofResolve-42589" + value: { + dps: 9628.96689 + tps: 6901.10738 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-FuryoftheFiveFlights-40431" + value: { + dps: 9881.68236 + tps: 7079.11442 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-FuturesightRune-38763" + value: { + dps: 9659.13436 + tps: 6921.10535 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-Gladiator'sSanctuary" + value: { + dps: 9123.42106 + tps: 6541.64634 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-Gladiator'sWildhide" + value: { + dps: 7392.92287 + tps: 5313.51613 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-GlowingTwilightScale-54573" + value: { + dps: 9659.13436 + tps: 6921.10535 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-GlowingTwilightScale-54589" + value: { + dps: 9659.13436 + tps: 6921.10535 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-GnomishLightningGenerator-41121" + value: { + dps: 9852.20048 + tps: 7058.03271 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-HatefulGladiator'sIdolofResolve-42587" + value: { + dps: 9628.96689 + tps: 6901.10738 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-Heartpierce-49982" + value: { + dps: 10121.22097 + tps: 7251.0565 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-Heartpierce-50641" + value: { + dps: 10128.44997 + tps: 7255.74037 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-IdolofLunarFury-47670" + value: { + dps: 9628.96689 + tps: 6901.10738 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-IdolofMutilation-47668" + value: { + dps: 9999.95769 + tps: 7164.58564 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-IdoloftheCorruptor-45509" + value: { + dps: 9628.96689 + tps: 6901.10738 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-IdoloftheCryingMoon-50456" + value: { + dps: 9963.05325 + tps: 7138.60785 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-IdoloftheLunarEclipse-50457" + value: { + dps: 9628.96689 + tps: 6901.10738 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-IdoloftheRavenGoddess-32387" + value: { + dps: 9696.44032 + tps: 6949.01352 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-IdoloftheUnseenMoon-33510" + value: { + dps: 9628.96689 + tps: 6901.10738 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-IdoloftheWhiteStag-32257" + value: { + dps: 9628.96689 + tps: 6901.10738 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-IllustrationoftheDragonSoul-40432" + value: { + dps: 9659.13436 + tps: 6921.10535 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-ImpassiveSkyflareDiamond" + value: { + dps: 9694.29123 + tps: 6947.48766 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-ImpassiveStarflareDiamond" + value: { + dps: 9690.05668 + tps: 6944.48113 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-IncisorFragment-37723" + value: { + dps: 9903.7744 + tps: 7094.57541 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-InsightfulEarthsiegeDiamond" + value: { + dps: 9661.3169 + tps: 6924.07589 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-InvigoratingEarthsiegeDiamond" + value: { + dps: 9691.05873 + tps: 6945.19259 + hps: 13.49381 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-LasherweaveBattlegear" + value: { + dps: 9872.74301 + tps: 7073.88928 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-LasherweaveRegalia" + value: { + dps: 7603.36561 + tps: 5465.47322 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-Lavanthor'sTalisman-37872" + value: { + dps: 9659.13436 + tps: 6921.10535 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-MajesticDragonFigurine-40430" + value: { + dps: 9659.13436 + tps: 6921.10535 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-Malfurion'sBattlegear" + value: { + dps: 8890.02486 + tps: 6379.30044 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-Malfurion'sRegalia" + value: { + dps: 7241.51016 + tps: 5208.55585 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-MeteoriteWhetstone-37390" + value: { + dps: 9989.26821 + tps: 7155.64995 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-NevermeltingIceCrystal-50259" + value: { + dps: 9920.61591 + tps: 7106.90681 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-NightsongBattlegear" + value: { + dps: 8896.07584 + tps: 6381.72696 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-NightsongGarb" + value: { + dps: 7144.18571 + tps: 5139.90421 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-OfferingofSacrifice-37638" + value: { + dps: 9659.13436 + tps: 6921.10535 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-PersistentEarthshatterDiamond" + value: { + dps: 9685.39362 + tps: 6941.17037 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-PersistentEarthsiegeDiamond" + value: { + dps: 9691.05873 + tps: 6945.19259 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-PetrifiedTwilightScale-54571" + value: { + dps: 9659.13436 + tps: 6921.10535 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-PetrifiedTwilightScale-54591" + value: { + dps: 9659.13436 + tps: 6921.10535 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-PowerfulEarthshatterDiamond" + value: { + dps: 9661.3169 + tps: 6924.07589 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-PowerfulEarthsiegeDiamond" + value: { + dps: 9661.3169 + tps: 6924.07589 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-PurifiedShardoftheGods" + value: { + dps: 9659.13436 + tps: 6921.10535 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-ReignoftheDead-47316" + value: { + dps: 9659.13436 + tps: 6921.10535 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-ReignoftheDead-47477" + value: { + dps: 9659.13436 + tps: 6921.10535 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-RelentlessEarthsiegeDiamond" + value: { + dps: 9915.89628 + tps: 7104.82725 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-RelentlessGladiator'sIdolofResolve-42591" + value: { + dps: 9628.96689 + tps: 6901.10738 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-RevitalizingSkyflareDiamond" + value: { + dps: 9661.3169 + tps: 6924.07589 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-RuneofRepulsion-40372" + value: { + dps: 9659.13436 + tps: 6921.10535 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-SavageGladiator'sIdolofResolve-42574" + value: { + dps: 9628.96689 + tps: 6901.10738 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-SealofthePantheon-36993" + value: { + dps: 9659.13436 + tps: 6921.10535 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-ShinyShardoftheGods" + value: { + dps: 9659.13436 + tps: 6921.10535 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-Sindragosa'sFlawlessFang-50361" + value: { + dps: 9659.13436 + tps: 6921.10535 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-SliverofPureIce-50339" + value: { + dps: 9659.13436 + tps: 6921.10535 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-SliverofPureIce-50346" + value: { + dps: 9659.13436 + tps: 6921.10535 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-SoulPreserver-37111" + value: { + dps: 9659.13436 + tps: 6921.10535 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-SouloftheDead-40382" + value: { + dps: 9839.54441 + tps: 7049.04691 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-SparkofLife-37657" + value: { + dps: 9808.32325 + tps: 7027.10424 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-SphereofRedDragon'sBlood-37166" + value: { + dps: 9869.57544 + tps: 7072.08903 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-StormshroudArmor" + value: { + dps: 7808.2169 + tps: 5607.1783 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-SwiftSkyflareDiamond" + value: { + dps: 9691.05873 + tps: 6945.19259 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-SwiftStarflareDiamond" + value: { + dps: 9685.39362 + tps: 6941.17037 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-SwiftWindfireDiamond" + value: { + dps: 9675.47968 + tps: 6934.13147 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-TalismanofTrollDivinity-37734" + value: { + dps: 9659.13436 + tps: 6921.10535 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-TearsoftheVanquished-47215" + value: { + dps: 9659.13436 + tps: 6921.10535 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-TheGeneral'sHeart-45507" + value: { + dps: 9659.13436 + tps: 6921.10535 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-ThunderheartHarness" + value: { + dps: 7062.41561 + tps: 5077.21067 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-ThunderheartRegalia" + value: { + dps: 6179.43194 + tps: 4451.04013 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-ThunderingSkyflareDiamond" + value: { + dps: 9729.96139 + tps: 6973.63613 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-TinyAbominationinaJar-50351" + value: { + dps: 9853.56324 + tps: 7061.24387 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-TinyAbominationinaJar-50706" + value: { + dps: 9933.89779 + tps: 7117.90747 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-TirelessSkyflareDiamond" + value: { + dps: 9661.3169 + tps: 6924.07589 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-TirelessStarflareDiamond" + value: { + dps: 9661.3169 + tps: 6924.07589 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-TomeofArcanePhenomena-36972" + value: { + dps: 9810.84878 + tps: 7029.34609 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-TrenchantEarthshatterDiamond" + value: { + dps: 9661.3169 + tps: 6924.07589 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-TrenchantEarthsiegeDiamond" + value: { + dps: 9661.3169 + tps: 6924.07589 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-UndeadSlayer'sBlessedArmor" + value: { + dps: 7950.21997 + tps: 5708.97271 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-Val'anyr,HammerofAncientKings-46017" + value: { + dps: 7502.15023 + tps: 5391.44149 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-VengefulGladiator'sIdolofResolve-33947" + value: { + dps: 9628.96689 + tps: 6901.10738 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-WingedTalisman-37844" + value: { + dps: 9659.13436 + tps: 6921.10535 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-AllItems-WrathfulGladiator'sIdolofResolve-51429" + value: { + dps: 9628.96689 + tps: 6901.10738 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-Average-Default" + value: { + dps: 10008.47363 + tps: 7171.34463 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-Settings-Tauren-P2DoubleArmorPenTrinkets-Default-FullBuffs-LongMultiTarget" + value: { + dps: 9915.89628 + tps: 7104.82725 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-Settings-Tauren-P2DoubleArmorPenTrinkets-Default-FullBuffs-LongSingleTarget" + value: { + dps: 9915.89628 + tps: 7104.82725 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-Settings-Tauren-P2DoubleArmorPenTrinkets-Default-FullBuffs-ShortSingleTarget" + value: { + dps: 11154.43644 + tps: 7975.73987 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-Settings-Tauren-P2DoubleArmorPenTrinkets-Default-NoBuffs-LongMultiTarget" + value: { + dps: 6206.38206 + tps: 4470.32429 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-Settings-Tauren-P2DoubleArmorPenTrinkets-Default-NoBuffs-LongSingleTarget" + value: { + dps: 6206.38206 + tps: 4470.32429 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-Settings-Tauren-P2DoubleArmorPenTrinkets-Default-NoBuffs-ShortSingleTarget" + value: { + dps: 6623.21545 + tps: 4758.19903 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsNoDesync-SwitchInFrontOfTarget-Default" + value: { + dps: 7849.29759 + tps: 5636.34559 + } +} diff --git a/sim/druid/feral/TestFeralDoubleArmorPenTrinketsWithDesync.results b/sim/druid/feral/TestFeralDoubleArmorPenTrinketsWithDesync.results new file mode 100644 index 0000000000..02b7569194 --- /dev/null +++ b/sim/druid/feral/TestFeralDoubleArmorPenTrinketsWithDesync.results @@ -0,0 +1,973 @@ +character_stats_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-CharacterStats-Default" + value: { + final_stats: 560.16972 + final_stats: 1930.26636 + final_stats: 1888.0455 + final_stats: 379.63094 + final_stats: 390.09696 + final_stats: 500 + final_stats: 125 + final_stats: 309 + final_stats: 1149.05664 + final_stats: 276 + final_stats: 0 + final_stats: 11551.63502 + final_stats: 309 + final_stats: 2845.52168 + final_stats: 276 + final_stats: 602 + final_stats: 207.975 + final_stats: 8910.46416 + final_stats: 0 + final_stats: 0 + final_stats: 10481.03272 + final_stats: 2863.3 + final_stats: 0 + final_stats: 0 + final_stats: 0 + final_stats: 1852.08975 + final_stats: 0 + final_stats: 0 + final_stats: 26117.055 + final_stats: 75 + final_stats: 75 + final_stats: 75 + final_stats: 75 + final_stats: 130 + final_stats: 0 + final_stats: 0 + final_stats: 0 + final_stats: 0 + final_stats: 0 + final_stats: 0 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-Althor'sAbacus-50359" + value: { + dps: 9659.13436 + tps: 6921.10535 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-Althor'sAbacus-50366" + value: { + dps: 9659.13436 + tps: 6921.10535 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-AshtongueTalismanofEquilibrium-32486" + value: { + dps: 9659.13436 + tps: 6921.10535 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-AustereEarthsiegeDiamond" + value: { + dps: 9757.17739 + tps: 6992.43598 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-Bandit'sInsignia-40371" + value: { + dps: 9842.05377 + tps: 7051.05291 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-BaubleofTrueBlood-50354" + value: { + dps: 9659.13436 + tps: 6921.10535 + hps: 90.47701 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-BaubleofTrueBlood-50726" + value: { + dps: 9659.13436 + tps: 6921.10535 + hps: 90.47701 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-BeamingEarthsiegeDiamond" + value: { + dps: 9802.22199 + tps: 7024.41765 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-BlessedRegaliaofUndeadCleansing" + value: { + dps: 7632.96611 + tps: 5483.34854 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-BracingEarthsiegeDiamond" + value: { + dps: 9757.17739 + tps: 6852.58726 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-BrutalGladiator'sIdolofResolve-35019" + value: { + dps: 9724.77501 + tps: 6969.50508 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-ChaoticSkyflareDiamond" + value: { + dps: 10020.81555 + tps: 7179.61908 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-CorpseTongueCoin-50349" + value: { + dps: 9659.13436 + tps: 6921.10535 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-CorpseTongueCoin-50352" + value: { + dps: 9659.13436 + tps: 6921.10535 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-CorrodedSkeletonKey-50356" + value: { + dps: 9659.13436 + tps: 6921.10535 + hps: 64 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-DarkmoonCard:Berserker!-42989" + value: { + dps: 9853.1364 + tps: 7058.84679 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-DarkmoonCard:Death-42990" + value: { + dps: 9873.11366 + tps: 7073.25501 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-DarkmoonCard:Greatness-44255" + value: { + dps: 9868.14736 + tps: 7069.50457 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-DeadlyGladiator'sIdolofResolve-42588" + value: { + dps: 9724.77501 + tps: 6969.50508 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-Death'sChoice-47464" + value: { + dps: 10197.32732 + tps: 7303.37192 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-DeathKnight'sAnguish-38212" + value: { + dps: 9755.01458 + tps: 6989.40466 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-Deathbringer'sWill-50362" + value: { + dps: 10326.55922 + tps: 7395.27614 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-Deathbringer'sWill-50363" + value: { + dps: 10339.59135 + tps: 7404.30459 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-Defender'sCode-40257" + value: { + dps: 9659.13436 + tps: 6921.10535 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-DestructiveSkyflareDiamond" + value: { + dps: 9806.46937 + tps: 7027.43329 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-DislodgedForeignObject-50348" + value: { + dps: 9908.71748 + tps: 7098.15979 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-DislodgedForeignObject-50353" + value: { + dps: 9892.22433 + tps: 7086.30007 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-DreamwalkerBattlegear" + value: { + dps: 8587.82036 + tps: 6162.1925 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-DreamwalkerGarb" + value: { + dps: 7270.36886 + tps: 5227.84894 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-EffulgentSkyflareDiamond" + value: { + dps: 9757.17739 + tps: 6992.43598 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-EmberSkyflareDiamond" + value: { + dps: 9757.17739 + tps: 6992.43598 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-EnigmaticSkyflareDiamond" + value: { + dps: 9802.22199 + tps: 7024.41765 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-EnigmaticStarflareDiamond" + value: { + dps: 9797.43405 + tps: 7021.01821 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-EphemeralSnowflake-50260" + value: { + dps: 9842.00842 + tps: 7050.87114 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-EssenceofGossamer-37220" + value: { + dps: 9659.13436 + tps: 6921.10535 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-EternalEarthsiegeDiamond" + value: { + dps: 9757.17739 + tps: 6992.43598 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-ExtractofNecromanticPower-40373" + value: { + dps: 9880.00974 + tps: 7077.7025 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-EyeoftheBroodmother-45308" + value: { + dps: 9830.29553 + tps: 7042.4802 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-Figurine-SapphireOwl-42413" + value: { + dps: 9659.13436 + tps: 6921.10535 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-ForethoughtTalisman-40258" + value: { + dps: 9659.13436 + tps: 6921.10535 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-ForgeEmber-37660" + value: { + dps: 9779.95197 + tps: 7006.73627 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-ForlornSkyflareDiamond" + value: { + dps: 9757.17739 + tps: 6992.43598 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-ForlornStarflareDiamond" + value: { + dps: 9757.17739 + tps: 6992.43598 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-FuriousGladiator'sIdolofResolve-42589" + value: { + dps: 9724.77501 + tps: 6969.50508 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-FuryoftheFiveFlights-40431" + value: { + dps: 9869.22432 + tps: 7070.26921 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-FuturesightRune-38763" + value: { + dps: 9659.13436 + tps: 6921.10535 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-Gladiator'sSanctuary" + value: { + dps: 9155.12494 + tps: 6564.60481 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-Gladiator'sWildhide" + value: { + dps: 7389.457 + tps: 5310.98057 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-GlowingTwilightScale-54573" + value: { + dps: 9659.13436 + tps: 6921.10535 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-GlowingTwilightScale-54589" + value: { + dps: 9659.13436 + tps: 6921.10535 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-GnomishLightningGenerator-41121" + value: { + dps: 9852.20048 + tps: 7058.03271 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-HatefulGladiator'sIdolofResolve-42587" + value: { + dps: 9724.77501 + tps: 6969.50508 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-Heartpierce-49982" + value: { + dps: 10225.42893 + tps: 7325.04415 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-Heartpierce-50641" + value: { + dps: 10305.82884 + tps: 7381.67937 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-IdolofLunarFury-47670" + value: { + dps: 9724.77501 + tps: 6969.50508 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-IdolofMutilation-47668" + value: { + dps: 10102.72172 + tps: 7237.62289 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-IdoloftheCorruptor-45509" + value: { + dps: 9724.77501 + tps: 6969.50508 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-IdoloftheCryingMoon-50456" + value: { + dps: 10060.5893 + tps: 7207.85844 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-IdoloftheLunarEclipse-50457" + value: { + dps: 9724.77501 + tps: 6969.50508 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-IdoloftheRavenGoddess-32387" + value: { + dps: 9786.38918 + tps: 7013.17636 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-IdoloftheUnseenMoon-33510" + value: { + dps: 9724.77501 + tps: 6969.50508 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-IdoloftheWhiteStag-32257" + value: { + dps: 9724.77501 + tps: 6969.50508 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-IllustrationoftheDragonSoul-40432" + value: { + dps: 9659.13436 + tps: 6921.10535 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-ImpassiveSkyflareDiamond" + value: { + dps: 9802.22199 + tps: 7024.41765 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-ImpassiveStarflareDiamond" + value: { + dps: 9797.43405 + tps: 7021.01821 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-IncisorFragment-37723" + value: { + dps: 9903.7744 + tps: 7094.57541 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-InsightfulEarthsiegeDiamond" + value: { + dps: 9757.17739 + tps: 6992.43598 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-InvigoratingEarthsiegeDiamond" + value: { + dps: 9787.25952 + tps: 7013.7943 + hps: 13.49381 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-LasherweaveBattlegear" + value: { + dps: 9987.3708 + tps: 7154.8263 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-LasherweaveRegalia" + value: { + dps: 7616.36677 + tps: 5474.92841 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-Lavanthor'sTalisman-37872" + value: { + dps: 9659.13436 + tps: 6921.10535 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-MajesticDragonFigurine-40430" + value: { + dps: 9659.13436 + tps: 6921.10535 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-Malfurion'sBattlegear" + value: { + dps: 8921.27149 + tps: 6401.48554 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-Malfurion'sRegalia" + value: { + dps: 7244.71639 + tps: 5210.75749 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-MeteoriteWhetstone-37390" + value: { + dps: 9995.00161 + tps: 7159.64587 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-NevermeltingIceCrystal-50259" + value: { + dps: 9920.61591 + tps: 7106.90681 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-NightsongBattlegear" + value: { + dps: 8881.14845 + tps: 6371.05373 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-NightsongGarb" + value: { + dps: 7120.88627 + tps: 5122.91289 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-OfferingofSacrifice-37638" + value: { + dps: 9659.13436 + tps: 6921.10535 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-PersistentEarthshatterDiamond" + value: { + dps: 9781.52959 + tps: 7009.72605 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-PersistentEarthsiegeDiamond" + value: { + dps: 9787.25952 + tps: 7013.7943 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-PetrifiedTwilightScale-54571" + value: { + dps: 9659.13436 + tps: 6921.10535 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-PetrifiedTwilightScale-54591" + value: { + dps: 9659.13436 + tps: 6921.10535 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-PowerfulEarthshatterDiamond" + value: { + dps: 9757.17739 + tps: 6992.43598 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-PowerfulEarthsiegeDiamond" + value: { + dps: 9757.17739 + tps: 6992.43598 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-PurifiedShardoftheGods" + value: { + dps: 9659.13436 + tps: 6921.10535 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-ReignoftheDead-47316" + value: { + dps: 9659.13436 + tps: 6921.10535 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-ReignoftheDead-47477" + value: { + dps: 9659.13436 + tps: 6921.10535 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-RelentlessEarthsiegeDiamond" + value: { + dps: 10014.84974 + tps: 7175.45814 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-RelentlessGladiator'sIdolofResolve-42591" + value: { + dps: 9724.77501 + tps: 6969.50508 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-RevitalizingSkyflareDiamond" + value: { + dps: 9757.17739 + tps: 6992.43598 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-RuneofRepulsion-40372" + value: { + dps: 9659.13436 + tps: 6921.10535 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-SavageGladiator'sIdolofResolve-42574" + value: { + dps: 9724.77501 + tps: 6969.50508 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-SealofthePantheon-36993" + value: { + dps: 9659.13436 + tps: 6921.10535 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-ShinyShardoftheGods" + value: { + dps: 9659.13436 + tps: 6921.10535 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-Sindragosa'sFlawlessFang-50361" + value: { + dps: 9659.13436 + tps: 6921.10535 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-SliverofPureIce-50339" + value: { + dps: 9659.13436 + tps: 6921.10535 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-SliverofPureIce-50346" + value: { + dps: 9659.13436 + tps: 6921.10535 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-SoulPreserver-37111" + value: { + dps: 9659.13436 + tps: 6921.10535 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-SouloftheDead-40382" + value: { + dps: 9839.54441 + tps: 7049.04691 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-SparkofLife-37657" + value: { + dps: 9808.32325 + tps: 7027.10424 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-SphereofRedDragon'sBlood-37166" + value: { + dps: 9869.57544 + tps: 7072.08903 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-StormshroudArmor" + value: { + dps: 7817.14948 + tps: 5614.04394 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-SwiftSkyflareDiamond" + value: { + dps: 9787.25952 + tps: 7013.7943 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-SwiftStarflareDiamond" + value: { + dps: 9781.52959 + tps: 7009.72605 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-SwiftWindfireDiamond" + value: { + dps: 9771.50221 + tps: 7002.60661 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-TalismanofTrollDivinity-37734" + value: { + dps: 9659.13436 + tps: 6921.10535 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-TearsoftheVanquished-47215" + value: { + dps: 9659.13436 + tps: 6921.10535 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-TheGeneral'sHeart-45507" + value: { + dps: 9659.13436 + tps: 6921.10535 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-ThunderheartHarness" + value: { + dps: 7094.72716 + tps: 5099.85272 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-ThunderheartRegalia" + value: { + dps: 6152.41561 + tps: 4431.78375 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-ThunderingSkyflareDiamond" + value: { + dps: 9849.53145 + tps: 7058.60566 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-TinyAbominationinaJar-50351" + value: { + dps: 9908.62254 + tps: 7100.1864 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-TinyAbominationinaJar-50706" + value: { + dps: 9872.67971 + tps: 7074.51742 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-TirelessSkyflareDiamond" + value: { + dps: 9757.17739 + tps: 6992.43598 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-TirelessStarflareDiamond" + value: { + dps: 9757.17739 + tps: 6992.43598 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-TomeofArcanePhenomena-36972" + value: { + dps: 9810.84878 + tps: 7029.34609 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-TrenchantEarthshatterDiamond" + value: { + dps: 9757.17739 + tps: 6992.43598 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-TrenchantEarthsiegeDiamond" + value: { + dps: 9757.17739 + tps: 6992.43598 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-UndeadSlayer'sBlessedArmor" + value: { + dps: 7976.7958 + tps: 5727.5424 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-Val'anyr,HammerofAncientKings-46017" + value: { + dps: 7579.80786 + tps: 5447.02713 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-VengefulGladiator'sIdolofResolve-33947" + value: { + dps: 9724.77501 + tps: 6969.50508 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-WingedTalisman-37844" + value: { + dps: 9659.13436 + tps: 6921.10535 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-AllItems-WrathfulGladiator'sIdolofResolve-51429" + value: { + dps: 9724.77501 + tps: 6969.50508 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-Average-Default" + value: { + dps: 10094.4565 + tps: 7232.41265 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-Settings-Tauren-P2DoubleArmorPenTrinkets-Default-FullBuffs-LongMultiTarget" + value: { + dps: 10014.84974 + tps: 7175.45814 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-Settings-Tauren-P2DoubleArmorPenTrinkets-Default-FullBuffs-LongSingleTarget" + value: { + dps: 10014.84974 + tps: 7175.45814 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-Settings-Tauren-P2DoubleArmorPenTrinkets-Default-FullBuffs-ShortSingleTarget" + value: { + dps: 11380.79978 + tps: 8136.83178 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-Settings-Tauren-P2DoubleArmorPenTrinkets-Default-NoBuffs-LongMultiTarget" + value: { + dps: 6248.08814 + tps: 4500.08518 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-Settings-Tauren-P2DoubleArmorPenTrinkets-Default-NoBuffs-LongSingleTarget" + value: { + dps: 6248.08814 + tps: 4500.08518 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-Settings-Tauren-P2DoubleArmorPenTrinkets-Default-NoBuffs-ShortSingleTarget" + value: { + dps: 6675.14554 + tps: 4795.0694 + } +} +dps_results: { + key: "TestFeralDoubleArmorPenTrinketsWithDesync-SwitchInFrontOfTarget-Default" + value: { + dps: 7855.86896 + tps: 5641.83392 + } +} diff --git a/sim/druid/feral/feral_test.go b/sim/druid/feral/feral_test.go index 4f1d43f2c6..e65680c3f3 100644 --- a/sim/druid/feral/feral_test.go +++ b/sim/druid/feral/feral_test.go @@ -46,6 +46,68 @@ func TestFeral(t *testing.T) { })) } +func TestFeralDoubleArmorPenTrinketsNoDesync(t *testing.T) { + core.RunTestSuite(t, t.Name(), core.FullCharacterTestSuiteGenerator(core.CharacterSuiteConfig{ + Class: proto.Class_ClassDruid, + Race: proto.Race_RaceTauren, + GearSet: core.GearSetCombo{Label: "P2DoubleArmorPenTrinkets", GearSet: P2GearDoubleArmorPenTrinkets}, + Talents: StandardTalents, + Glyphs: StandardGlyphs, + Consumes: FullConsumes, + SpecOptions: core.SpecOptionsCombo{Label: "Default", SpecOptions: PlayerOptionsMonoCat}, + + ItemFilter: core.ItemFilter{ + WeaponTypes: []proto.WeaponType{ + proto.WeaponType_WeaponTypeDagger, + proto.WeaponType_WeaponTypeMace, + proto.WeaponType_WeaponTypeOffHand, + proto.WeaponType_WeaponTypeStaff, + proto.WeaponType_WeaponTypePolearm, + }, + ArmorType: proto.ArmorType_ArmorTypeLeather, + RangedWeaponTypes: []proto.RangedWeaponType{ + proto.RangedWeaponType_RangedWeaponTypeIdol, + }, + }, + + Cooldowns: &proto.Cooldowns{ + DesyncProcTrinket1Seconds: 0, + DesyncProcTrinket2Seconds: 0, + }, + })) +} + +func TestFeralDoubleArmorPenTrinketsWithDesync(t *testing.T) { + core.RunTestSuite(t, t.Name(), core.FullCharacterTestSuiteGenerator(core.CharacterSuiteConfig{ + Class: proto.Class_ClassDruid, + Race: proto.Race_RaceTauren, + GearSet: core.GearSetCombo{Label: "P2DoubleArmorPenTrinkets", GearSet: P2GearDoubleArmorPenTrinkets}, + Talents: StandardTalents, + Glyphs: StandardGlyphs, + Consumes: FullConsumes, + SpecOptions: core.SpecOptionsCombo{Label: "Default", SpecOptions: PlayerOptionsMonoCat}, + + ItemFilter: core.ItemFilter{ + WeaponTypes: []proto.WeaponType{ + proto.WeaponType_WeaponTypeDagger, + proto.WeaponType_WeaponTypeMace, + proto.WeaponType_WeaponTypeOffHand, + proto.WeaponType_WeaponTypeStaff, + proto.WeaponType_WeaponTypePolearm, + }, + ArmorType: proto.ArmorType_ArmorTypeLeather, + RangedWeaponTypes: []proto.RangedWeaponType{ + proto.RangedWeaponType_RangedWeaponTypeIdol, + }, + }, + + Cooldowns: &proto.Cooldowns{ + DesyncProcTrinket1Seconds: 0, + DesyncProcTrinket2Seconds: 10, + }, + })) +} + func BenchmarkSimulate(b *testing.B) { rsr := &proto.RaidSimRequest{ Raid: core.SinglePlayerRaidProto( @@ -379,3 +441,114 @@ var P2Gear = core.EquipmentSpecFromJsonString(`{"items": [ "id": 40713 } ]}`) + +var P2GearDoubleArmorPenTrinkets = core.EquipmentSpecFromJsonString(`{"items": [ + { + "id": 46161, + "enchant": 3817, + "gems": [ + 41398, + 40002 + ] + }, + { + "id": 45517, + "gems": [ + 40002 + ] + }, + { + "id": 45245, + "enchant": 3808, + "gems": [ + 40002, + 40002 + ] + }, + { + "id": 46032, + "enchant": 3605, + "gems": [ + 40002, + 40058 + ] + }, + { + "id": 45473, + "enchant": 3832, + "gems": [ + 40002, + 40002, + 40002 + ] + }, + { + "id": 45869, + "enchant": 3845, + "gems": [ + 40037 + ] + }, + { + "id": 46158, + "enchant": 3604, + "gems": [ + 40002 + ] + }, + { + "id": 46095, + "gems": [ + 40002, + 40002, + 40002 + ] + }, + { + "id": 45536, + "enchant": 3823, + "gems": [ + 39996, + 39996, + 39996 + ] + }, + { + "id": 45564, + "enchant": 3606, + "gems": [ + 39996, + 39996 + ] + }, + { + "id": 46048, + "gems": [ + 45862 + ] + }, + { + "id": 45608, + "gems": [ + 39996 + ] + }, + { + "id": 45931 + }, + { + "id": 40256 + }, + { + "id": 45613, + "enchant": 3789, + "gems": [ + 40037, + 42702 + ] + }, + {}, + { + "id": 40713 + } +]}`) diff --git a/sim/hunter/wotlk_items.go b/sim/hunter/wotlk_items.go index dfea1aa532..d91bc578cb 100644 --- a/sim/hunter/wotlk_items.go +++ b/sim/hunter/wotlk_items.go @@ -244,6 +244,7 @@ func init() { ProcMask: core.ProcMaskRanged, Outcome: core.OutcomeLanded, ProcChance: procChance, + ActionID: core.ActionID{ItemID: itemID}, Handler: func(sim *core.Simulation, _ *core.Spell, result *core.SpellResult) { rangedSpell.Cast(sim, result.Target) }, diff --git a/ui/core/components/individual_sim_ui/cooldowns_picker.ts b/ui/core/components/individual_sim_ui/cooldowns_picker.ts index 02950b4e54..fb177dd1ac 100644 --- a/ui/core/components/individual_sim_ui/cooldowns_picker.ts +++ b/ui/core/components/individual_sim_ui/cooldowns_picker.ts @@ -4,7 +4,7 @@ import { Input, InputConfig } from '../input.js'; import { NumberListPicker } from '../number_list_picker.js'; import { Player } from '../../player.js'; import { EventID, TypedEvent } from '../../typed_event.js'; -import { ActionID as ActionIdProto } from '../../proto/common.js'; +import { ActionID as ActionIdProto, ItemSlot } from '../../proto/common.js'; import { Cooldowns } from '../../proto/common.js'; import { Cooldown } from '../../proto/common.js'; import { ActionId } from '../../proto_utils/action_id.js'; @@ -13,6 +13,8 @@ import { Spec } from '../../proto/common.js'; import { getEnumValues } from '../../utils.js'; import { wait } from '../../utils.js'; import { Tooltip } from 'bootstrap'; +import { NumberPicker } from '../number_picker.js'; +import { Sim } from 'ui/core/sim.js'; export class CooldownsPicker extends Component { readonly player: Player; @@ -80,6 +82,55 @@ export class CooldownsPicker extends Component { this.cooldownPickers.push(row); } + + this.addTrinketDesyncPicker(ItemSlot.ItemSlotTrinket1); + this.addTrinketDesyncPicker(ItemSlot.ItemSlotTrinket2); + } + + private addTrinketDesyncPicker(slot: ItemSlot) { + const index = slot - ItemSlot.ItemSlotTrinket1 + 1; + const picker = new NumberPicker(this.rootElem, this.player.sim, { + label: `Desync Proc Trinket ${index}`, + labelTooltip: ' Put the trinket on a cooldown before pull by re-equipping it. Must be between 0 and 30 seconds.', + extraCssClasses: [ + 'within-raid-sim-hide', + ], + inline: true, + changedEvent: (_: Sim) => this.player.cooldownsChangeEmitter, + getValue: (_: Sim) => { + const cooldowns = this.player.getCooldowns(); + return (slot == ItemSlot.ItemSlotTrinket1) ? cooldowns.desyncProcTrinket1Seconds : cooldowns.desyncProcTrinket2Seconds; + }, + setValue: (eventID: EventID, _: Sim, newValue: number) => { + if (newValue >= 0 && newValue <= 30) { + const newCooldowns = this.player.getCooldowns(); + if (slot == ItemSlot.ItemSlotTrinket1) { + newCooldowns.desyncProcTrinket1Seconds = newValue; + } else { + newCooldowns.desyncProcTrinket2Seconds = newValue + } + this.player.setCooldowns(eventID, newCooldowns); + } + }, + enableWhen: (sim: Sim) => { + // TODO(Riotdog-GehennasEU): Only show if the slot is non-empty and the + // trinket has a proc effect? + return true; + }, + }); + + const pickerInput = picker.rootElem.querySelector('.number-picker-input') as HTMLInputElement; + pickerInput.type = 'number'; + pickerInput.min = "0"; + pickerInput.max = "30"; + + const validator = () => { + if (!pickerInput.checkValidity()) { + pickerInput.reportValidity(); + } + }; + pickerInput.addEventListener('change', validator); + pickerInput.addEventListener('focusout', validator); } private makeActionPicker(parentElem: HTMLElement, cooldownIndex: number): IconEnumPicker, ActionIdProto> {