From d0dc34a6aa85db6e31e114c44f4b64e9148b7fcd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johan=20Hillerstr=C3=B6m?= Date: Wed, 27 Nov 2024 15:10:54 +0100 Subject: [PATCH 1/6] Implement movement speed enchants and gems --- sim/common/cata/enchant_effects.go | 18 ++++++++++++++++++ sim/common/cata/metagems.go | 12 ++++++++---- sim/core/movement.go | 12 ++++++------ sim/druid/feral/TestFeral.results | 4 ++-- sim/paladin/talents_retribution.go | 11 +++++++++++ 5 files changed, 45 insertions(+), 12 deletions(-) diff --git a/sim/common/cata/enchant_effects.go b/sim/common/cata/enchant_effects.go index fe418954ac..620d782399 100644 --- a/sim/common/cata/enchant_effects.go +++ b/sim/common/cata/enchant_effects.go @@ -576,4 +576,22 @@ func init() { character.ItemSwap.RegisterOnSwapItemForEnchantEffect(4267, aura) }) + + movementSpeedEnchants := []int32{ + 3232, // Enchant Boots - Tuskarr's Vitality + 4104, // Enchant Boots - Lavawalker + 4105, // Enchant Boots - Assassin's Step + 4062, // Enchant Boots - Earthen Vitality + } + + for _, enchantID := range movementSpeedEnchants { + core.NewEnchantEffect(enchantID, func(agent core.Agent) { + character := agent.GetCharacter() + + // Exclusive with other movement speed passives + if character.PseudoStats.MovementSpeedMultiplier < 1.08 { + character.PseudoStats.MovementSpeedMultiplier = 1.08 + } + }) + } } diff --git a/sim/common/cata/metagems.go b/sim/common/cata/metagems.go index 5ddf7719e8..ea3a5762bc 100644 --- a/sim/common/cata/metagems.go +++ b/sim/common/cata/metagems.go @@ -10,10 +10,14 @@ func init() { // Keep these in order by item ID // Fleet Shadowspirit Diamond - // PLACEHODLER - Until we implement movement speed - // core.NewItemEffect(52289, func(agent core.Agent) { - // agent.GetCharacter().MultiplyStat(Stats.Speed, 1.09) - // }) + core.NewItemEffect(52289, func(agent core.Agent) { + character := agent.GetCharacter() + + // Exclusive with other movement speed passives + if character.PseudoStats.MovementSpeedMultiplier < 1.08 { + character.PseudoStats.MovementSpeedMultiplier = 1.08 + } + }) // Bracing Shadowspirit Diamond core.NewItemEffect(52292, func(agent core.Agent) { diff --git a/sim/core/movement.go b/sim/core/movement.go index d3ace6b3c8..acfba5aaba 100644 --- a/sim/core/movement.go +++ b/sim/core/movement.go @@ -76,7 +76,7 @@ func (unit *Unit) UpdatePosition(sim *Simulation) { return } - unit.OnMovement(unit.DistanceFromTarget, MovementUpdate) + unit.OnMovement(sim, unit.DistanceFromTarget, MovementUpdate) // update auto attack state if unit.AutoAttacks.mh.enabled != unit.AutoAttacks.mh.IsInRange() { @@ -109,7 +109,7 @@ func (unit *Unit) FinalizeMovement(sim *Simulation) { unit.UpdatePosition(sim) unit.moveAura.Deactivate(sim) - unit.OnMovement(unit.DistanceFromTarget, MovementEnd) + unit.OnMovement(sim, unit.DistanceFromTarget, MovementEnd) } func registerMovementAction(unit *Unit, sim *Simulation, speed float64, endTime time.Duration) { @@ -130,7 +130,7 @@ func registerMovementAction(unit *Unit, sim *Simulation, speed float64, endTime unit.FinalizeMovement(sim) } - unit.OnMovement(unit.DistanceFromTarget, MovementStart) + unit.OnMovement(sim, unit.DistanceFromTarget, MovementStart) unit.movementAction = &movementAction sim.AddPendingAction(&movementAction.PendingAction) } @@ -143,15 +143,15 @@ const ( MovementEnd ) -type MovementCallback func(position float64, kind MovementUpdateType) +type MovementCallback func(sim *Simulation, position float64, kind MovementUpdateType) func (unit *Unit) RegisterMovementCallback(callback MovementCallback) { unit.movementCallbacks = append(unit.movementCallbacks, callback) } -func (unit *Unit) OnMovement(position float64, kind MovementUpdateType) { +func (unit *Unit) OnMovement(sim *Simulation, position float64, kind MovementUpdateType) { for _, movementCallback := range unit.movementCallbacks { - movementCallback(position, kind) + movementCallback(sim, position, kind) } } diff --git a/sim/druid/feral/TestFeral.results b/sim/druid/feral/TestFeral.results index 4932233b38..78e0b025bc 100644 --- a/sim/druid/feral/TestFeral.results +++ b/sim/druid/feral/TestFeral.results @@ -641,8 +641,8 @@ dps_results: { dps_results: { key: "TestFeral-AllItems-FleetShadowspiritDiamond" value: { - dps: 31809.54569 - tps: 43875.63602 + dps: 31851.34871 + tps: 43729.52774 } } dps_results: { diff --git a/sim/paladin/talents_retribution.go b/sim/paladin/talents_retribution.go index de80a9e24f..fea7db3d4c 100644 --- a/sim/paladin/talents_retribution.go +++ b/sim/paladin/talents_retribution.go @@ -9,6 +9,7 @@ import ( func (paladin *Paladin) applyRetributionTalents() { paladin.applyCrusade() paladin.applyRuleOfLaw() + paladin.applyPursuitOfJustice() paladin.applySanctityOfBattle() paladin.applySealsOfCommand() paladin.applySanctifiedWrath() @@ -46,6 +47,16 @@ func (paladin *Paladin) applyRuleOfLaw() { }) } +func (paladin *Paladin) applyPursuitOfJustice() { + if paladin.Talents.PursuitOfJustice == 0 { + return + } + + if paladin.PseudoStats.MovementSpeedMultiplier < 1.15 { + paladin.PseudoStats.MovementSpeedMultiplier = 1.15 + } +} + func (paladin *Paladin) applySanctityOfBattle() { if !paladin.Talents.SanctityOfBattle { return From 94f6e476482931ed2689649e5bfe9c62b1134c37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johan=20Hillerstr=C3=B6m?= Date: Thu, 28 Nov 2024 14:20:09 +0100 Subject: [PATCH 2/6] [Warrior] Add MaxRange to abilities that should adhere to it --- sim/warrior/arms/mortal_strike.go | 1 + sim/warrior/colossus_smash.go | 1 + sim/warrior/execute.go | 1 + sim/warrior/fury/bloodthirst.go | 1 + sim/warrior/fury/raging_blow.go | 1 + sim/warrior/heroic_strike_cleave.go | 2 ++ sim/warrior/heroic_throw.go | 1 + sim/warrior/overpower.go | 1 + sim/warrior/protection/concussion_blow.go | 1 + sim/warrior/protection/devastate.go | 1 + sim/warrior/protection/shield_slam.go | 1 + sim/warrior/rend.go | 1 + sim/warrior/revenge.go | 1 + sim/warrior/shattering_throw.go | 1 + sim/warrior/slam.go | 1 + sim/warrior/sunder_armor.go | 1 + 16 files changed, 17 insertions(+) diff --git a/sim/warrior/arms/mortal_strike.go b/sim/warrior/arms/mortal_strike.go index f7ca6c1f9d..9f5fb97cef 100644 --- a/sim/warrior/arms/mortal_strike.go +++ b/sim/warrior/arms/mortal_strike.go @@ -23,6 +23,7 @@ func (war *ArmsWarrior) RegisterMortalStrike() { ProcMask: core.ProcMaskMeleeMHSpecial, Flags: core.SpellFlagAPL | core.SpellFlagIncludeTargetBonusDamage | core.SpellFlagMeleeMetrics, ClassSpellMask: warrior.SpellMaskMortalStrike | warrior.SpellMaskSpecialAttack, + MaxRange: core.MaxMeleeRange, RageCost: core.RageCostOptions{ Cost: 20, diff --git a/sim/warrior/colossus_smash.go b/sim/warrior/colossus_smash.go index 00b5ded944..0f673984b0 100644 --- a/sim/warrior/colossus_smash.go +++ b/sim/warrior/colossus_smash.go @@ -30,6 +30,7 @@ func (warrior *Warrior) RegisterColossusSmash() { ProcMask: core.ProcMaskMeleeMHSpecial, Flags: core.SpellFlagAPL | core.SpellFlagMeleeMetrics | core.SpellFlagIncludeTargetBonusDamage, ClassSpellMask: SpellMaskColossusSmash | SpellMaskSpecialAttack, + MaxRange: core.MaxMeleeRange, RageCost: core.RageCostOptions{ Cost: 20, diff --git a/sim/warrior/execute.go b/sim/warrior/execute.go index 5410ad5a06..b88bc57c3d 100644 --- a/sim/warrior/execute.go +++ b/sim/warrior/execute.go @@ -16,6 +16,7 @@ func (warrior *Warrior) RegisterExecuteSpell() { ProcMask: core.ProcMaskMeleeMHSpecial, Flags: core.SpellFlagMeleeMetrics | core.SpellFlagIncludeTargetBonusDamage | core.SpellFlagAPL, ClassSpellMask: SpellMaskExecute | SpellMaskSpecialAttack, + MaxRange: core.MaxMeleeRange, RageCost: core.RageCostOptions{ Cost: 10, diff --git a/sim/warrior/fury/bloodthirst.go b/sim/warrior/fury/bloodthirst.go index b73c9c79db..034aa4faf7 100644 --- a/sim/warrior/fury/bloodthirst.go +++ b/sim/warrior/fury/bloodthirst.go @@ -15,6 +15,7 @@ func (war *FuryWarrior) RegisterBloodthirst() { ProcMask: core.ProcMaskMeleeMHSpecial, Flags: core.SpellFlagMeleeMetrics | core.SpellFlagIncludeTargetBonusDamage | core.SpellFlagAPL, ClassSpellMask: warrior.SpellMaskBloodthirst | warrior.SpellMaskSpecialAttack, + MaxRange: core.MaxMeleeRange, RageCost: core.RageCostOptions{ Cost: 20, diff --git a/sim/warrior/fury/raging_blow.go b/sim/warrior/fury/raging_blow.go index ab7c1d9868..5ae6e6c61e 100644 --- a/sim/warrior/fury/raging_blow.go +++ b/sim/warrior/fury/raging_blow.go @@ -34,6 +34,7 @@ func (war *FuryWarrior) RegisterRagingBlow() { ProcMask: core.ProcMaskMeleeMHSpecial, Flags: core.SpellFlagMeleeMetrics | core.SpellFlagIncludeTargetBonusDamage | core.SpellFlagAPL, ClassSpellMask: warrior.SpellMaskRagingBlow | warrior.SpellMaskSpecialAttack, + MaxRange: core.MaxMeleeRange, RageCost: core.RageCostOptions{ Cost: 20, diff --git a/sim/warrior/heroic_strike_cleave.go b/sim/warrior/heroic_strike_cleave.go index 033831263d..c35b734fb0 100644 --- a/sim/warrior/heroic_strike_cleave.go +++ b/sim/warrior/heroic_strike_cleave.go @@ -16,6 +16,7 @@ func (warrior *Warrior) RegisterHeroicStrikeSpell() { ProcMask: core.ProcMaskMeleeMHSpecial, Flags: core.SpellFlagAPL | core.SpellFlagMeleeMetrics | core.SpellFlagIncludeTargetBonusDamage, ClassSpellMask: SpellMaskHeroicStrike | SpellMaskSpecialAttack, + MaxRange: core.MaxMeleeRange, RageCost: core.RageCostOptions{ Cost: 30, @@ -62,6 +63,7 @@ func (warrior *Warrior) RegisterCleaveSpell() { ProcMask: core.ProcMaskMeleeMHSpecial, Flags: core.SpellFlagAPL | core.SpellFlagMeleeMetrics | core.SpellFlagIncludeTargetBonusDamage, ClassSpellMask: SpellMaskCleave | SpellMaskSpecialAttack, + MaxRange: core.MaxMeleeRange, RageCost: core.RageCostOptions{ Cost: 30, diff --git a/sim/warrior/heroic_throw.go b/sim/warrior/heroic_throw.go index 4e22b7b47c..98d4ac3647 100644 --- a/sim/warrior/heroic_throw.go +++ b/sim/warrior/heroic_throw.go @@ -15,6 +15,7 @@ func (warrior *Warrior) RegisterHeroicThrow() { ProcMask: core.ProcMaskMeleeMHSpecial, Flags: core.SpellFlagMeleeMetrics | core.SpellFlagAPL, ClassSpellMask: SpellMaskHeroicThrow | SpellMaskSpecialAttack, + MaxRange: 30, Cast: core.CastConfig{ DefaultCast: core.Cast{ diff --git a/sim/warrior/overpower.go b/sim/warrior/overpower.go index 9455cbe95f..98431e7631 100644 --- a/sim/warrior/overpower.go +++ b/sim/warrior/overpower.go @@ -33,6 +33,7 @@ func (warrior *Warrior) RegisterOverpowerSpell() { ProcMask: core.ProcMaskMeleeMHSpecial, Flags: core.SpellFlagMeleeMetrics | core.SpellFlagIncludeTargetBonusDamage | core.SpellFlagAPL, ClassSpellMask: SpellMaskOverpower | SpellMaskSpecialAttack, + MaxRange: core.MaxMeleeRange, RageCost: core.RageCostOptions{ Cost: 5, diff --git a/sim/warrior/protection/concussion_blow.go b/sim/warrior/protection/concussion_blow.go index aaf78cce66..d574701761 100644 --- a/sim/warrior/protection/concussion_blow.go +++ b/sim/warrior/protection/concussion_blow.go @@ -18,6 +18,7 @@ func (war *ProtectionWarrior) RegisterConcussionBlow() { ProcMask: core.ProcMaskMeleeMHSpecial, Flags: core.SpellFlagMeleeMetrics | core.SpellFlagIncludeTargetBonusDamage | core.SpellFlagAPL, ClassSpellMask: warrior.SpellMaskConcussionBlow | warrior.SpellMaskSpecialAttack, + MaxRange: core.MaxMeleeRange, RageCost: core.RageCostOptions{ Cost: 15, diff --git a/sim/warrior/protection/devastate.go b/sim/warrior/protection/devastate.go index 247c6b4e54..fe3e2ff499 100644 --- a/sim/warrior/protection/devastate.go +++ b/sim/warrior/protection/devastate.go @@ -16,6 +16,7 @@ func (war *ProtectionWarrior) RegisterDevastate() { ProcMask: core.ProcMaskMeleeMHSpecial, Flags: core.SpellFlagMeleeMetrics | core.SpellFlagAPL, ClassSpellMask: warrior.SpellMaskDevastate | warrior.SpellMaskSpecialAttack, + MaxRange: core.MaxMeleeRange, RageCost: core.RageCostOptions{ Cost: 15, diff --git a/sim/warrior/protection/shield_slam.go b/sim/warrior/protection/shield_slam.go index 2dd0b87268..ec753b8a6f 100644 --- a/sim/warrior/protection/shield_slam.go +++ b/sim/warrior/protection/shield_slam.go @@ -14,6 +14,7 @@ func (war *ProtectionWarrior) RegisterShieldSlam() { ProcMask: core.ProcMaskMeleeMHSpecial, // TODO: Is this right? Flags: core.SpellFlagMeleeMetrics | core.SpellFlagIncludeTargetBonusDamage | core.SpellFlagAPL, ClassSpellMask: warrior.SpellMaskShieldSlam | warrior.SpellMaskSpecialAttack, + MaxRange: core.MaxMeleeRange, RageCost: core.RageCostOptions{ Cost: 20, diff --git a/sim/warrior/rend.go b/sim/warrior/rend.go index a8e215ab93..9e16bc016c 100644 --- a/sim/warrior/rend.go +++ b/sim/warrior/rend.go @@ -16,6 +16,7 @@ func (warrior *Warrior) RegisterRendSpell() { ProcMask: core.ProcMaskMeleeMHSpecial, Flags: core.SpellFlagAPL | core.SpellFlagMeleeMetrics | SpellFlagBleed | core.SpellFlagPassiveSpell, ClassSpellMask: SpellMaskRend, + MaxRange: core.MaxMeleeRange, RageCost: core.RageCostOptions{ Cost: 10, diff --git a/sim/warrior/revenge.go b/sim/warrior/revenge.go index e138f69b15..0ad0568547 100644 --- a/sim/warrior/revenge.go +++ b/sim/warrior/revenge.go @@ -34,6 +34,7 @@ func (warrior *Warrior) RegisterRevengeSpell() { ProcMask: core.ProcMaskMeleeMHSpecial, Flags: core.SpellFlagMeleeMetrics | core.SpellFlagIncludeTargetBonusDamage | core.SpellFlagAPL, ClassSpellMask: SpellMaskRevenge | SpellMaskSpecialAttack, + MaxRange: core.MaxMeleeRange, RageCost: core.RageCostOptions{ Cost: 5, diff --git a/sim/warrior/shattering_throw.go b/sim/warrior/shattering_throw.go index 0dfae6d246..7cc5b2b734 100644 --- a/sim/warrior/shattering_throw.go +++ b/sim/warrior/shattering_throw.go @@ -17,6 +17,7 @@ func (warrior *Warrior) RegisterShatteringThrowCD() { ProcMask: core.ProcMaskMeleeMHSpecial, Flags: core.SpellFlagMeleeMetrics, ClassSpellMask: SpellMaskShatteringThrow | SpellMaskSpecialAttack, + MaxRange: 30, RageCost: core.RageCostOptions{ Cost: 25, diff --git a/sim/warrior/slam.go b/sim/warrior/slam.go index 0d8e8c08dd..2cc54846ef 100644 --- a/sim/warrior/slam.go +++ b/sim/warrior/slam.go @@ -42,6 +42,7 @@ func (warrior *Warrior) RegisterSlamSpell() { ProcMask: core.ProcMaskMeleeMHSpecial, Flags: core.SpellFlagMeleeMetrics | core.SpellFlagIncludeTargetBonusDamage | core.SpellFlagAPL, ClassSpellMask: SpellMaskSlam | SpellMaskSpecialAttack, + MaxRange: core.MaxMeleeRange, RageCost: core.RageCostOptions{ Cost: 15, diff --git a/sim/warrior/sunder_armor.go b/sim/warrior/sunder_armor.go index a52bf480bf..73f40863a0 100644 --- a/sim/warrior/sunder_armor.go +++ b/sim/warrior/sunder_armor.go @@ -16,6 +16,7 @@ func (warrior *Warrior) RegisterSunderArmor() *core.Spell { ProcMask: core.ProcMaskMeleeMHSpecial, Flags: core.SpellFlagMeleeMetrics | core.SpellFlagAPL, ClassSpellMask: SpellMaskSunderArmor | SpellMaskSpecialAttack, + MaxRange: core.MaxMeleeRange, RageCost: core.RageCostOptions{ Cost: 15, From 9a012c09d7b7e4631ffbee7d32196fcfd17fc801 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johan=20Hillerstr=C3=B6m?= Date: Thu, 28 Nov 2024 14:20:14 +0100 Subject: [PATCH 3/6] [Warrior] Implement movement logic for Charge --- sim/warrior/charge.go | 60 +++++++++++++++++++++++++++++++++++++++--- sim/warrior/warrior.go | 1 + 2 files changed, 58 insertions(+), 3 deletions(-) diff --git a/sim/warrior/charge.go b/sim/warrior/charge.go index 01194df05a..de04adf9b3 100644 --- a/sim/warrior/charge.go +++ b/sim/warrior/charge.go @@ -6,17 +6,51 @@ import ( "github.com/wowsims/cata/sim/core" ) +func performCharge(sim *core.Simulation, warrior *Warrior, metrics *core.ResourceMetrics, rage float64) { + warrior.AddRage(sim, rage, metrics) + if warrior.DistanceFromTarget > core.MaxMeleeRange { + warrior.PseudoStats.MovementSpeedMultiplier *= 2 + warrior.MoveTo(core.MaxMeleeRange-1, sim) // movement aura is discretized in 1 yard intervals, so need to overshoot to guarantee melee range + } else { + warrior.ChargeAura.Deactivate(sim) + } +} + func (warrior *Warrior) RegisterCharge() { metrics := warrior.NewRageMetrics(core.ActionID{SpellID: 100}) + rage := float64(15 + 5*warrior.Talents.Blitz) + chargeMinRange := 8.0 + + warrior.ChargeAura = warrior.RegisterAura(core.Aura{ + Label: "Charge", + ActionID: core.ActionID{SpellID: 100}, + Duration: 5 * time.Second, + }) + + warrior.RegisterMovementCallback(func(sim *core.Simulation, position float64, kind core.MovementUpdateType) { + if warrior.ChargeAura.IsActive() && kind == core.MovementEnd { + if warrior.DistanceFromTarget >= chargeMinRange { + // Has moved out, charge back in + performCharge(sim, warrior, metrics, rage) + } else { + // Has charged back in, reset movement speed + warrior.PseudoStats.MovementSpeedMultiplier /= 2 + warrior.ChargeAura.Deactivate(sim) + } + } + }) warrior.Charge = warrior.RegisterSpell(core.SpellConfig{ ActionID: core.ActionID{SpellID: 100}, SpellSchool: core.SpellSchoolPhysical, Flags: core.SpellFlagAPL, ClassSpellMask: SpellMaskCharge, + MaxRange: 25, Cast: core.CastConfig{ - DefaultCast: core.Cast{}, + DefaultCast: core.Cast{ + NonEmpty: true, + }, CD: core.Cooldown{ Timer: warrior.NewTimer(), Duration: time.Second * 15, @@ -24,10 +58,30 @@ func (warrior *Warrior) RegisterCharge() { IgnoreHaste: true, }, + ExtraCastCondition: core.Ternary(warrior.Talents.Juggernaut || warrior.Talents.Warbringer, nil, func(sim *core.Simulation, target *core.Unit) bool { + return sim.CurrentTime < 0 && warrior.StanceMatches(BattleStance) + }), + ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) { - rage := float64(15 + 5*warrior.Talents.Blitz) - warrior.AddRage(sim, rage, metrics) + // Don't want to deal with adding tons of "not moving" conditions to the APL atm + if sim.CurrentTime < 0 { + performCharge(sim, warrior, metrics, rage) + return + } + + warrior.ChargeAura.Activate(sim) + + if warrior.StartDistanceFromTarget <= core.MaxMeleeRange && sim.CurrentTime < 0 && warrior.DistanceFromTarget < chargeMinRange { + // Always charge from min range in prepull + warrior.DistanceFromTarget = chargeMinRange + } + + if warrior.DistanceFromTarget >= chargeMinRange { + performCharge(sim, warrior, metrics, rage) + return + } + warrior.MoveTo(chargeMinRange, sim) }, }) } diff --git a/sim/warrior/warrior.go b/sim/warrior/warrior.go index 3d194096cc..95f880b20a 100644 --- a/sim/warrior/warrior.go +++ b/sim/warrior/warrior.go @@ -110,6 +110,7 @@ type Warrior struct { Whirlwind *core.Spell DeepWounds *core.Spell Charge *core.Spell + ChargeAura *core.Aura shoutsCD *core.Timer recklessnessDeadlyCalmCD *core.Timer From cdac0ef7533c10e7cd28f9f9c82b63ec067e7d3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johan=20Hillerstr=C3=B6m?= Date: Sun, 15 Dec 2024 03:28:13 +0100 Subject: [PATCH 4/6] Implement movement speed effects as exclusive --- sim/common/cata/enchant_effects.go | 6 +----- sim/common/cata/metagems.go | 6 +----- sim/core/apl_actions_misc.go | 2 +- sim/core/movement.go | 28 ++++++++++++++++++++++++++++ sim/core/spell.go | 4 ++-- sim/death_knight/presences.go | 1 + sim/druid/forms.go | 6 ++++-- sim/paladin/talents_retribution.go | 6 +++--- sim/rogue/talents.go | 6 ++++++ ui/core/proto_utils/action_id.ts | 6 +++++- 10 files changed, 52 insertions(+), 19 deletions(-) diff --git a/sim/common/cata/enchant_effects.go b/sim/common/cata/enchant_effects.go index 620d782399..1df960c022 100644 --- a/sim/common/cata/enchant_effects.go +++ b/sim/common/cata/enchant_effects.go @@ -587,11 +587,7 @@ func init() { for _, enchantID := range movementSpeedEnchants { core.NewEnchantEffect(enchantID, func(agent core.Agent) { character := agent.GetCharacter() - - // Exclusive with other movement speed passives - if character.PseudoStats.MovementSpeedMultiplier < 1.08 { - character.PseudoStats.MovementSpeedMultiplier = 1.08 - } + character.NewMovementSpeedAura("Minor Run Speed", core.ActionID{SpellID: 13889}, 0.08) }) } } diff --git a/sim/common/cata/metagems.go b/sim/common/cata/metagems.go index ea3a5762bc..4ae0645d67 100644 --- a/sim/common/cata/metagems.go +++ b/sim/common/cata/metagems.go @@ -12,11 +12,7 @@ func init() { // Fleet Shadowspirit Diamond core.NewItemEffect(52289, func(agent core.Agent) { character := agent.GetCharacter() - - // Exclusive with other movement speed passives - if character.PseudoStats.MovementSpeedMultiplier < 1.08 { - character.PseudoStats.MovementSpeedMultiplier = 1.08 - } + character.NewMovementSpeedAura("Minor Run Speed", core.ActionID{SpellID: 13889}, 0.08) }) // Bracing Shadowspirit Diamond diff --git a/sim/core/apl_actions_misc.go b/sim/core/apl_actions_misc.go index 732b61ba9b..e753d098be 100644 --- a/sim/core/apl_actions_misc.go +++ b/sim/core/apl_actions_misc.go @@ -178,7 +178,7 @@ func (action *APLActionMove) IsReady(sim *Simulation) bool { func (action *APLActionMove) Execute(sim *Simulation) { moveRange := action.moveRange.GetFloat(sim) if sim.Log != nil { - action.unit.Log(sim, "Moving to %s", moveRange) + action.unit.Log(sim, "[DEBUG] Moving to %.1f yards", moveRange) } action.unit.MoveTo(moveRange, sim) diff --git a/sim/core/movement.go b/sim/core/movement.go index acfba5aaba..e6c6949685 100644 --- a/sim/core/movement.go +++ b/sim/core/movement.go @@ -156,7 +156,12 @@ func (unit *Unit) OnMovement(sim *Simulation, position float64, kind MovementUpd } func (unit *Unit) MultiplyMovementSpeed(sim *Simulation, amount float64) { + oldMultiplier := unit.PseudoStats.MovementSpeedMultiplier + oldSpeed := unit.GetMovementSpeed() unit.PseudoStats.MovementSpeedMultiplier *= amount + if sim.Log != nil { + unit.Log(sim, "[DEBUG] Movement speed changed from %.2f (%.2f%%) to %.2f (%.2f%%)", oldSpeed, (oldMultiplier-1)*100.0, unit.GetMovementSpeed(), (unit.PseudoStats.MovementSpeedMultiplier-1)*100.0) + } // we have a pending movement action that depends on our movement speed if unit.movementAction != nil && unit.movementAction.speed != 0 { @@ -173,3 +178,26 @@ func (unit *Unit) GetMovementSpeed() float64 { return 8. * unit.PseudoStats.MovementSpeedMultiplier } + +func (unit *Unit) NewMovementSpeedAura(label string, actionID ActionID, multiplier float64) *Aura { + aura := MakePermanent(unit.GetOrRegisterAura(Aura{ + Label: label, + ActionID: actionID, + })) + + aura.NewMovementSpeedEffect(multiplier) + + return aura +} + +func (aura *Aura) NewMovementSpeedEffect(multiplier float64) *ExclusiveEffect { + return aura.NewExclusiveEffect("MovementSpeed", true, ExclusiveEffect{ + Priority: multiplier, + OnGain: func(ee *ExclusiveEffect, sim *Simulation) { + ee.Aura.Unit.MultiplyMovementSpeed(sim, 1+multiplier) + }, + OnExpire: func(ee *ExclusiveEffect, sim *Simulation) { + ee.Aura.Unit.MultiplyMovementSpeed(sim, 1.0/(1+multiplier)) + }, + }) +} diff --git a/sim/core/spell.go b/sim/core/spell.go index 3f07a4ea24..32feec5a9e 100644 --- a/sim/core/spell.go +++ b/sim/core/spell.go @@ -310,9 +310,9 @@ func (unit *Unit) RegisterSpell(config SpellConfig) *Spell { oldExtraCastCondition := spell.ExtraCastCondition spell.ExtraCastCondition = func(sim *Simulation, target *Unit) bool { if ((spell.MinRange != 0) && (spell.Unit.DistanceFromTarget < spell.MinRange)) || ((spell.MaxRange != 0) && (spell.Unit.DistanceFromTarget > spell.MaxRange)) { - if sim.Log != nil { + /*if sim.Log != nil { sim.Log("Cannot cast spell %s, out of range!", spell.ActionID) - } + }*/ return false } diff --git a/sim/death_knight/presences.go b/sim/death_knight/presences.go index 0496caae42..5494a36ce2 100644 --- a/sim/death_knight/presences.go +++ b/sim/death_knight/presences.go @@ -141,6 +141,7 @@ func (dk *DeathKnight) registerUnholyPresenceAura(timer *core.Timer) { }, }) presenceAura.NewExclusiveEffect(presenceEffectCategory, true, core.ExclusiveEffect{}) + presenceAura.NewMovementSpeedEffect(0.15) dk.RegisterSpell(core.SpellConfig{ ActionID: actionID, diff --git a/sim/druid/forms.go b/sim/druid/forms.go index 5236f17395..fdeab1681f 100644 --- a/sim/druid/forms.go +++ b/sim/druid/forms.go @@ -113,7 +113,6 @@ func (druid *Druid) registerCatFormSpell() { druid.PseudoStats.ThreatMultiplier *= 0.71 druid.PseudoStats.SpiritRegenMultiplier *= AnimalSpiritRegenSuppression druid.PseudoStats.BaseDodgeChance += 0.02 * float64(druid.Talents.FeralSwiftness) - druid.PseudoStats.MovementSpeedMultiplier *= 1.0 + 0.15*float64(druid.Talents.FeralSwiftness) druid.AddStatsDynamic(sim, statBonus) druid.EnableDynamicStatDep(sim, agiApDep) @@ -147,7 +146,6 @@ func (druid *Druid) registerCatFormSpell() { druid.PseudoStats.ThreatMultiplier /= 0.71 druid.PseudoStats.SpiritRegenMultiplier /= AnimalSpiritRegenSuppression druid.PseudoStats.BaseDodgeChance -= 0.02 * float64(druid.Talents.FeralSwiftness) - druid.PseudoStats.MovementSpeedMultiplier /= 1.0 + 0.15*float64(druid.Talents.FeralSwiftness) druid.AddStatsDynamic(sim, statBonus.Invert()) druid.DisableDynamicStatDep(sim, agiApDep) @@ -181,6 +179,10 @@ func (druid *Druid) registerCatFormSpell() { }, }) + if druid.Talents.FeralSwiftness > 0 { + druid.CatFormAura.NewMovementSpeedEffect(0.15 * float64(druid.Talents.FeralSwiftness)) + } + energyMetrics := druid.NewEnergyMetrics(actionID) druid.CatForm = druid.RegisterSpell(Any, core.SpellConfig{ diff --git a/sim/paladin/talents_retribution.go b/sim/paladin/talents_retribution.go index fea7db3d4c..0a61994459 100644 --- a/sim/paladin/talents_retribution.go +++ b/sim/paladin/talents_retribution.go @@ -52,9 +52,9 @@ func (paladin *Paladin) applyPursuitOfJustice() { return } - if paladin.PseudoStats.MovementSpeedMultiplier < 1.15 { - paladin.PseudoStats.MovementSpeedMultiplier = 1.15 - } + spellID := []int32{0, 26022, 26023}[paladin.Talents.PursuitOfJustice] + multiplier := []float64{0, 0.08, 0.15}[paladin.Talents.PursuitOfJustice] + paladin.NewMovementSpeedAura("Pursuit of Justice", core.ActionID{SpellID: spellID}, multiplier) } func (paladin *Paladin) applySanctityOfBattle() { diff --git a/sim/rogue/talents.go b/sim/rogue/talents.go index 3791e8fe1f..11c01fcb6a 100644 --- a/sim/rogue/talents.go +++ b/sim/rogue/talents.go @@ -45,6 +45,12 @@ func (rogue *Rogue) ApplyTalents() { ClassMask: RogueSpellHemorrhage | RogueSpellFanOfKnives, }) } + + if rogue.Talents.Quickening > 0 { + spellID := []int32{0, 24090, 31209}[rogue.Talents.Quickening] + multiplier := []float64{0, 0.08, 0.15}[rogue.Talents.Quickening] + rogue.NewMovementSpeedAura("Quickening", core.ActionID{SpellID: spellID}, multiplier) + } } // DWSMultiplier returns the offhand damage multiplier diff --git a/ui/core/proto_utils/action_id.ts b/ui/core/proto_utils/action_id.ts index e7c9661c9c..309ec8599f 100644 --- a/ui/core/proto_utils/action_id.ts +++ b/ui/core/proto_utils/action_id.ts @@ -263,6 +263,9 @@ export class ActionId { } switch (baseName) { + case 'Minor Speed': + name = 'Minor Run Speed (8%)'; + break; case 'Explosive Shot': if (this.spellId == 53301) { name += ' (First)'; @@ -831,7 +834,7 @@ export class ActionId { get spellIconOverride(): ActionId | null { const override = spellIdIconOverrides.get(JSON.stringify({ spellId: this.spellId })); if (!override) return null; - return override.itemId ? ActionId.fromItemId(override.itemId) : ActionId.fromItemId(override.spellId!); + return override.itemId ? ActionId.fromItemId(override.itemId) : ActionId.fromSpellId(override.spellId!); } get spellTooltipOverride(): ActionId | null { @@ -852,6 +855,7 @@ const spellIdIconOverrides: Map = new Map([ [JSON.stringify({ spellId: 90299 }), { itemId: 65214 }], // Reinforced Sapphirium Battleplate (4pc bonus) [JSON.stringify({ spellId: 99116 }), { itemId: 71512 }], // Battleplate of Immolation (4pc bonus) [JSON.stringify({ spellId: 105767 }), { itemId: 78727 }], // Battleplate of Radiant Glory (2pc bonus) + [JSON.stringify({ spellId: 13889 }), { spellId: 109709 }], // Minor Run Speed ]); const spellIdTooltipOverrides: Map = new Map([ From ad85ef9f12229b4b353402db23306ed35ec5eaba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johan=20Hillerstr=C3=B6m?= Date: Sun, 15 Dec 2024 03:34:14 +0100 Subject: [PATCH 5/6] [Warrior] Fix charge to have proper limits and remove move out logic --- sim/warrior/charge.go | 59 +++++++++++-------------------------------- 1 file changed, 15 insertions(+), 44 deletions(-) diff --git a/sim/warrior/charge.go b/sim/warrior/charge.go index de04adf9b3..a026491a93 100644 --- a/sim/warrior/charge.go +++ b/sim/warrior/charge.go @@ -6,51 +6,38 @@ import ( "github.com/wowsims/cata/sim/core" ) -func performCharge(sim *core.Simulation, warrior *Warrior, metrics *core.ResourceMetrics, rage float64) { - warrior.AddRage(sim, rage, metrics) - if warrior.DistanceFromTarget > core.MaxMeleeRange { - warrior.PseudoStats.MovementSpeedMultiplier *= 2 - warrior.MoveTo(core.MaxMeleeRange-1, sim) // movement aura is discretized in 1 yard intervals, so need to overshoot to guarantee melee range - } else { - warrior.ChargeAura.Deactivate(sim) - } -} - func (warrior *Warrior) RegisterCharge() { - metrics := warrior.NewRageMetrics(core.ActionID{SpellID: 100}) + actionID := core.ActionID{SpellID: 100} + metrics := warrior.NewRageMetrics(actionID) rage := float64(15 + 5*warrior.Talents.Blitz) - chargeMinRange := 8.0 warrior.ChargeAura = warrior.RegisterAura(core.Aura{ Label: "Charge", - ActionID: core.ActionID{SpellID: 100}, + ActionID: actionID, Duration: 5 * time.Second, + OnGain: func(aura *core.Aura, sim *core.Simulation) { + warrior.MultiplyMovementSpeed(sim, 3.0) + }, + OnExpire: func(aura *core.Aura, sim *core.Simulation) { + warrior.MultiplyMovementSpeed(sim, 1.0/3.0) + }, }) warrior.RegisterMovementCallback(func(sim *core.Simulation, position float64, kind core.MovementUpdateType) { - if warrior.ChargeAura.IsActive() && kind == core.MovementEnd { - if warrior.DistanceFromTarget >= chargeMinRange { - // Has moved out, charge back in - performCharge(sim, warrior, metrics, rage) - } else { - // Has charged back in, reset movement speed - warrior.PseudoStats.MovementSpeedMultiplier /= 2 - warrior.ChargeAura.Deactivate(sim) - } + if kind == core.MovementEnd && warrior.ChargeAura.IsActive() { + warrior.ChargeAura.Deactivate(sim) } }) warrior.Charge = warrior.RegisterSpell(core.SpellConfig{ - ActionID: core.ActionID{SpellID: 100}, + ActionID: actionID, SpellSchool: core.SpellSchoolPhysical, Flags: core.SpellFlagAPL, ClassSpellMask: SpellMaskCharge, + MinRange: 8, MaxRange: 25, Cast: core.CastConfig{ - DefaultCast: core.Cast{ - NonEmpty: true, - }, CD: core.Cooldown{ Timer: warrior.NewTimer(), Duration: time.Second * 15, @@ -63,25 +50,9 @@ func (warrior *Warrior) RegisterCharge() { }), ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) { - // Don't want to deal with adding tons of "not moving" conditions to the APL atm - if sim.CurrentTime < 0 { - performCharge(sim, warrior, metrics, rage) - return - } - warrior.ChargeAura.Activate(sim) - - if warrior.StartDistanceFromTarget <= core.MaxMeleeRange && sim.CurrentTime < 0 && warrior.DistanceFromTarget < chargeMinRange { - // Always charge from min range in prepull - warrior.DistanceFromTarget = chargeMinRange - } - - if warrior.DistanceFromTarget >= chargeMinRange { - performCharge(sim, warrior, metrics, rage) - return - } - - warrior.MoveTo(chargeMinRange, sim) + warrior.AddRage(sim, rage, metrics) + warrior.MoveTo(core.MaxMeleeRange-1, sim) // movement aura is discretized in 1 yard intervals, so need to overshoot to guarantee melee range }, }) } From f25862ddd6b5db01b31a460f86e23b366d9e1b4e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johan=20Hillerstr=C3=B6m?= Date: Sun, 15 Dec 2024 03:34:58 +0100 Subject: [PATCH 6/6] [Arms] Tweak APL and defaults to handle Charge movement during prepull --- sim/warrior/arms/TestArms.results | 1286 ++++++++++++++-------------- ui/warrior/arms/apls/arms.apl.json | 5 +- ui/warrior/arms/presets.ts | 2 +- 3 files changed, 648 insertions(+), 645 deletions(-) diff --git a/sim/warrior/arms/TestArms.results b/sim/warrior/arms/TestArms.results index 2a05b99afc..0b5cb6b77b 100644 --- a/sim/warrior/arms/TestArms.results +++ b/sim/warrior/arms/TestArms.results @@ -38,2246 +38,2246 @@ character_stats_results: { dps_results: { key: "TestArms-AllItems-AgileShadowspiritDiamond" value: { - dps: 33634.07232 - tps: 22609.10736 + dps: 33790.3758 + tps: 22673.70261 } } dps_results: { key: "TestArms-AllItems-Althor'sAbacus-50366" value: { - dps: 31654.07824 - tps: 21331.56748 + dps: 31796.98989 + tps: 21389.85767 } } dps_results: { key: "TestArms-AllItems-AncientPetrifiedSeed-69001" value: { - dps: 32979.26867 - tps: 22259.0212 + dps: 32947.54657 + tps: 22230.6263 } } dps_results: { key: "TestArms-AllItems-Anhuur'sHymnal-55889" value: { - dps: 31654.07824 - tps: 21331.56748 + dps: 31796.98989 + tps: 21389.85767 } } dps_results: { key: "TestArms-AllItems-Anhuur'sHymnal-56407" value: { - dps: 31654.07824 - tps: 21331.56748 + dps: 31796.98989 + tps: 21389.85767 } } dps_results: { key: "TestArms-AllItems-ApparatusofKhaz'goroth-68972" value: { - dps: 34047.90242 - tps: 22926.59381 + dps: 34201.68934 + tps: 22993.98914 } } dps_results: { key: "TestArms-AllItems-ApparatusofKhaz'goroth-69113" value: { - dps: 34334.98216 - tps: 23119.56175 + dps: 34474.55465 + tps: 23180.43011 } } dps_results: { key: "TestArms-AllItems-ArrowofTime-72897" value: { - dps: 33084.28601 - tps: 22381.93042 + dps: 33057.5975 + tps: 22346.54425 } } dps_results: { key: "TestArms-AllItems-AustereShadowspiritDiamond" value: { - dps: 33062.18546 - tps: 22251.67684 + dps: 33201.10995 + tps: 22302.19995 } } dps_results: { key: "TestArms-AllItems-BaubleofTrueBlood-50726" value: { - dps: 31654.07824 - tps: 21331.56748 + dps: 31796.98989 + tps: 21389.85767 hps: 96.7093 } } dps_results: { key: "TestArms-AllItems-BedrockTalisman-58182" value: { - dps: 31654.07824 - tps: 21331.56748 + dps: 31796.98989 + tps: 21389.85767 } } dps_results: { key: "TestArms-AllItems-BellofEnragingResonance-59326" value: { - dps: 32354.38782 - tps: 21807.26705 + dps: 32486.28547 + tps: 21850.37501 } } dps_results: { key: "TestArms-AllItems-BellofEnragingResonance-65053" value: { - dps: 32447.83104 - tps: 21859.68364 + dps: 32593.09322 + tps: 21916.3252 } } dps_results: { key: "TestArms-AllItems-BindingPromise-67037" value: { - dps: 31654.07824 - tps: 21331.56748 + dps: 31796.98989 + tps: 21389.85767 } } dps_results: { key: "TestArms-AllItems-Blood-SoakedAleMug-63843" value: { - dps: 32626.25118 - tps: 22013.11006 + dps: 32656.19697 + tps: 22029.77928 } } dps_results: { key: "TestArms-AllItems-BloodofIsiset-55995" value: { - dps: 32353.94753 - tps: 21733.36796 + dps: 32350.50089 + tps: 21735.06977 } } dps_results: { key: "TestArms-AllItems-BloodofIsiset-56414" value: { - dps: 32242.81699 - tps: 21735.50764 + dps: 32308.02574 + tps: 21761.52214 } } dps_results: { key: "TestArms-AllItems-BloodthirstyGladiator'sBadgeofConquest-64687" value: { - dps: 32177.67116 - tps: 21750.05154 + dps: 32296.10518 + tps: 21804.4158 } } dps_results: { key: "TestArms-AllItems-BloodthirstyGladiator'sBadgeofDominance-64688" value: { - dps: 31625.14868 - tps: 21293.96717 + dps: 31766.36409 + tps: 21353.61841 } } dps_results: { key: "TestArms-AllItems-BloodthirstyGladiator'sBadgeofVictory-64689" value: { - dps: 32780.48486 - tps: 22041.17191 + dps: 32928.09525 + tps: 22102.76624 } } dps_results: { key: "TestArms-AllItems-BloodthirstyGladiator'sEmblemofCruelty-64740" value: { - dps: 32341.98943 - tps: 21806.34026 + dps: 32481.54874 + tps: 21853.15726 } } dps_results: { key: "TestArms-AllItems-BloodthirstyGladiator'sEmblemofMeditation-64741" value: { - dps: 31654.07824 - tps: 21331.56748 + dps: 31796.98989 + tps: 21389.85767 } } dps_results: { key: "TestArms-AllItems-BloodthirstyGladiator'sEmblemofTenacity-64742" value: { - dps: 31654.07824 - tps: 21331.56748 + dps: 31796.98989 + tps: 21389.85767 } } dps_results: { key: "TestArms-AllItems-BloodthirstyGladiator'sInsigniaofConquest-64761" value: { - dps: 32151.51063 - tps: 21694.03833 + dps: 32307.02352 + tps: 21750.7899 } } dps_results: { key: "TestArms-AllItems-BloodthirstyGladiator'sInsigniaofDominance-64762" value: { - dps: 31654.07824 - tps: 21331.56748 + dps: 31796.98989 + tps: 21389.85767 } } dps_results: { key: "TestArms-AllItems-BloodthirstyGladiator'sInsigniaofVictory-64763" value: { - dps: 32656.73993 - tps: 22016.74189 + dps: 32800.20308 + tps: 22072.90176 } } dps_results: { key: "TestArms-AllItems-Bone-LinkFetish-77210" value: { - dps: 34431.90966 - tps: 23560.14166 + dps: 34439.42199 + tps: 23567.654 } } dps_results: { key: "TestArms-AllItems-Bone-LinkFetish-77982" value: { - dps: 34019.92651 - tps: 23130.17387 + dps: 33974.73017 + tps: 23117.73128 } } dps_results: { key: "TestArms-AllItems-Bone-LinkFetish-78002" value: { - dps: 34559.5317 - tps: 23696.77338 + dps: 34501.31928 + tps: 23680.0571 } } dps_results: { key: "TestArms-AllItems-BottledLightning-66879" value: { - dps: 31850.01791 - tps: 21438.31299 + dps: 31972.38849 + tps: 21472.61673 } } dps_results: { key: "TestArms-AllItems-BottledWishes-77114" value: { - dps: 32008.75688 - tps: 21605.54786 + dps: 32098.37548 + tps: 21630.6547 } } dps_results: { key: "TestArms-AllItems-BracingShadowspiritDiamond" value: { - dps: 33062.18546 - tps: 21806.77753 + dps: 33201.10995 + tps: 21856.2895 } } dps_results: { key: "TestArms-AllItems-Brawler'sTrophy-232015" value: { - dps: 31654.07824 - tps: 21331.56748 + dps: 31796.98989 + tps: 21389.85767 } } dps_results: { key: "TestArms-AllItems-Bryntroll,theBoneArbiter-50709" value: { - dps: 34288.35316 - tps: 23055.63139 + dps: 34433.68059 + tps: 23107.07131 } } dps_results: { key: "TestArms-AllItems-BurningShadowspiritDiamond" value: { - dps: 33537.68341 - tps: 22555.2019 + dps: 33680.16083 + tps: 22605.80937 } } dps_results: { key: "TestArms-AllItems-CataclysmicGladiator'sBadgeofConquest-73648" value: { - dps: 32646.41015 - tps: 21991.48802 + dps: 32691.07387 + tps: 21985.79074 } } dps_results: { key: "TestArms-AllItems-CataclysmicGladiator'sBadgeofDominance-73498" value: { - dps: 31625.14868 - tps: 21293.96717 + dps: 31766.36409 + tps: 21353.61841 } } dps_results: { key: "TestArms-AllItems-CataclysmicGladiator'sBadgeofVictory-73496" value: { - dps: 33463.80541 - tps: 22483.10418 + dps: 33615.19808 + tps: 22545.84776 } } dps_results: { key: "TestArms-AllItems-CataclysmicGladiator'sInsigniaofConquest-73643" value: { - dps: 32519.50306 - tps: 21953.8484 + dps: 32668.76258 + tps: 22003.25068 } } dps_results: { key: "TestArms-AllItems-CataclysmicGladiator'sInsigniaofDominance-73497" value: { - dps: 31654.07824 - tps: 21331.56748 + dps: 31796.98989 + tps: 21389.85767 } } dps_results: { key: "TestArms-AllItems-CataclysmicGladiator'sInsigniaofVictory-73491" value: { - dps: 33273.50337 - tps: 22442.80151 + dps: 33425.54187 + tps: 22500.61765 } } dps_results: { key: "TestArms-AllItems-ChaoticShadowspiritDiamond" value: { - dps: 33641.53984 - tps: 22616.57489 + dps: 33797.84332 + tps: 22681.17013 } } dps_results: { key: "TestArms-AllItems-ColossalDragonplateArmor" value: { - dps: 27969.66989 - tps: 19055.85331 + dps: 27910.05376 + tps: 19049.45036 } } dps_results: { key: "TestArms-AllItems-ColossalDragonplateBattlegear" value: { - dps: 31743.78359 - tps: 21726.4373 + dps: 31846.77879 + tps: 21753.00997 } } dps_results: { key: "TestArms-AllItems-Coren'sChilledChromiumCoaster-232012" value: { - dps: 33080.06385 - tps: 22311.30615 + dps: 33227.22973 + tps: 22361.37003 } } dps_results: { key: "TestArms-AllItems-CoreofRipeness-58184" value: { - dps: 31625.14868 - tps: 21293.96717 + dps: 31766.36409 + tps: 21353.61841 } } dps_results: { key: "TestArms-AllItems-CorpseTongueCoin-50349" value: { - dps: 31654.07824 - tps: 21331.56748 + dps: 31796.98989 + tps: 21389.85767 } } dps_results: { key: "TestArms-AllItems-CrecheoftheFinalDragon-77205" value: { - dps: 34598.53347 - tps: 23413.53536 + dps: 34740.71951 + tps: 23455.32328 } } dps_results: { key: "TestArms-AllItems-CrecheoftheFinalDragon-77972" value: { - dps: 34300.33896 - tps: 23141.61947 + dps: 34441.52302 + tps: 23185.089 } } dps_results: { key: "TestArms-AllItems-CrecheoftheFinalDragon-77992" value: { - dps: 35082.19192 - tps: 23667.15104 + dps: 35161.30137 + tps: 23678.85308 } } dps_results: { key: "TestArms-AllItems-CrushingWeight-59506" value: { - dps: 33297.69854 - tps: 22540.79065 + dps: 33185.77518 + tps: 22494.3428 } } dps_results: { key: "TestArms-AllItems-CrushingWeight-65118" value: { - dps: 33361.40601 - tps: 22491.98061 + dps: 33445.1594 + tps: 22573.90279 } } dps_results: { key: "TestArms-AllItems-CunningoftheCruel-77208" value: { - dps: 31654.07824 - tps: 21331.56748 + dps: 31796.98989 + tps: 21389.85767 } } dps_results: { key: "TestArms-AllItems-CunningoftheCruel-77980" value: { - dps: 31654.07824 - tps: 21331.56748 + dps: 31796.98989 + tps: 21389.85767 } } dps_results: { key: "TestArms-AllItems-CunningoftheCruel-78000" value: { - dps: 31654.07824 - tps: 21331.56748 + dps: 31796.98989 + tps: 21389.85767 } } dps_results: { key: "TestArms-AllItems-DarkmoonCard:Earthquake-62048" value: { - dps: 31654.07824 - tps: 21331.56748 + dps: 31796.98989 + tps: 21389.85767 } } dps_results: { key: "TestArms-AllItems-DarkmoonCard:Hurricane-62049" value: { - dps: 33422.91514 - tps: 22750.90027 + dps: 33597.73584 + tps: 22818.20805 } } dps_results: { key: "TestArms-AllItems-DarkmoonCard:Hurricane-62051" value: { - dps: 32922.28182 - tps: 22420.74481 + dps: 33094.10823 + tps: 22482.66185 } } dps_results: { key: "TestArms-AllItems-DarkmoonCard:Tsunami-62050" value: { - dps: 31654.07824 - tps: 21331.56748 + dps: 31796.98989 + tps: 21389.85767 } } dps_results: { key: "TestArms-AllItems-DarkmoonCard:Volcano-62047" value: { - dps: 32402.74301 - tps: 21880.74445 + dps: 32385.66261 + tps: 21884.03135 } } dps_results: { key: "TestArms-AllItems-Deathbringer'sWill-50363" value: { - dps: 32583.77411 - tps: 22054.62639 + dps: 32588.41429 + tps: 22020.81801 } } dps_results: { key: "TestArms-AllItems-DestructiveShadowspiritDiamond" value: { - dps: 33161.72401 - tps: 22310.9204 + dps: 33314.09695 + tps: 22374.97509 } } dps_results: { key: "TestArms-AllItems-DislodgedForeignObject-50348" value: { - dps: 31892.08616 - tps: 21376.31843 + dps: 31920.60498 + tps: 21358.81638 } } dps_results: { key: "TestArms-AllItems-Dwyer'sCaber-70141" value: { - dps: 33422.8236 - tps: 22561.12736 + dps: 33566.40805 + tps: 22615.13509 } } dps_results: { key: "TestArms-AllItems-EarthenBattleplate" value: { - dps: 27449.62251 - tps: 18542.10467 + dps: 27346.53784 + tps: 18476.06639 } } dps_results: { key: "TestArms-AllItems-EarthenWarplate" value: { - dps: 30115.64028 - tps: 20329.70887 + dps: 30117.20834 + tps: 20331.27693 } } dps_results: { key: "TestArms-AllItems-EffulgentShadowspiritDiamond" value: { - dps: 33062.18546 - tps: 22251.67684 + dps: 33201.10995 + tps: 22302.19995 } } dps_results: { key: "TestArms-AllItems-ElectrosparkHeartstarter-67118" value: { - dps: 31625.14868 - tps: 21293.96717 + dps: 31766.36409 + tps: 21353.61841 } } dps_results: { key: "TestArms-AllItems-EmberShadowspiritDiamond" value: { - dps: 33062.18546 - tps: 22251.67684 + dps: 33201.10995 + tps: 22302.19995 } } dps_results: { key: "TestArms-AllItems-EnigmaticShadowspiritDiamond" value: { - dps: 33161.72401 - tps: 22310.9204 + dps: 33314.09695 + tps: 22374.97509 } } dps_results: { key: "TestArms-AllItems-EssenceoftheCyclone-59473" value: { - dps: 32997.32225 - tps: 22237.00993 + dps: 33133.65014 + tps: 22290.26299 } } dps_results: { key: "TestArms-AllItems-EssenceoftheCyclone-65140" value: { - dps: 33141.351 - tps: 22338.46527 + dps: 33229.2943 + tps: 22362.36818 } } dps_results: { key: "TestArms-AllItems-EssenceoftheEternalFlame-69002" value: { - dps: 33598.51805 - tps: 22683.96026 + dps: 33581.2646 + tps: 22665.90574 } } dps_results: { key: "TestArms-AllItems-EternalShadowspiritDiamond" value: { - dps: 33062.18546 - tps: 22251.67684 + dps: 33201.10995 + tps: 22302.19995 } } dps_results: { key: "TestArms-AllItems-EyeofUnmaking-77200" value: { - dps: 34330.0632 - tps: 23115.31345 + dps: 34484.43426 + tps: 23178.00818 } } dps_results: { key: "TestArms-AllItems-EyeofUnmaking-77977" value: { - dps: 34025.974 - tps: 22912.61504 + dps: 34179.04285 + tps: 22974.80926 } } dps_results: { key: "TestArms-AllItems-EyeofUnmaking-77997" value: { - dps: 34664.56132 - tps: 23338.28169 + dps: 34820.3648 + tps: 23401.52699 } } dps_results: { key: "TestArms-AllItems-FallofMortality-59500" value: { - dps: 31654.07824 - tps: 21331.56748 + dps: 31796.98989 + tps: 21389.85767 } } dps_results: { key: "TestArms-AllItems-FallofMortality-65124" value: { - dps: 31654.07824 - tps: 21331.56748 + dps: 31796.98989 + tps: 21389.85767 } } dps_results: { key: "TestArms-AllItems-FieryQuintessence-69000" value: { - dps: 31608.47126 - tps: 21296.47127 + dps: 31750.77288 + tps: 21355.33532 } } dps_results: { key: "TestArms-AllItems-Figurine-DemonPanther-52199" value: { - dps: 32146.24929 - tps: 21689.51919 + dps: 32256.28192 + tps: 21712.97388 } } dps_results: { key: "TestArms-AllItems-Figurine-DreamOwl-52354" value: { - dps: 31625.14868 - tps: 21293.96717 + dps: 31766.36409 + tps: 21353.61841 } } dps_results: { key: "TestArms-AllItems-Figurine-EarthenGuardian-52352" value: { - dps: 31654.07824 - tps: 21331.56748 + dps: 31796.98989 + tps: 21389.85767 } } dps_results: { key: "TestArms-AllItems-Figurine-JeweledSerpent-52353" value: { - dps: 31625.14868 - tps: 21293.96717 + dps: 31766.36409 + tps: 21353.61841 } } dps_results: { key: "TestArms-AllItems-Figurine-KingofBoars-52351" value: { - dps: 33341.08895 - tps: 22458.22921 + dps: 33403.85373 + tps: 22466.94228 } } dps_results: { key: "TestArms-AllItems-FireoftheDeep-77117" value: { - dps: 32374.56942 - tps: 22099.31106 + dps: 32338.40929 + tps: 22088.41028 } } dps_results: { key: "TestArms-AllItems-FleetShadowspiritDiamond" value: { - dps: 33246.42963 - tps: 22406.53913 + dps: 33331.52692 + tps: 22447.11427 } } dps_results: { key: "TestArms-AllItems-FluidDeath-58181" value: { - dps: 32323.68491 - tps: 21788.03575 + dps: 32463.24423 + tps: 21834.85275 } } dps_results: { key: "TestArms-AllItems-ForlornShadowspiritDiamond" value: { - dps: 33062.18546 - tps: 22251.67684 + dps: 33201.10995 + tps: 22302.19995 } } dps_results: { key: "TestArms-AllItems-FoulGiftoftheDemonLord-72898" value: { - dps: 31654.07824 - tps: 21331.56748 + dps: 31796.98989 + tps: 21389.85767 } } dps_results: { key: "TestArms-AllItems-GaleofShadows-56138" value: { - dps: 32042.25436 - tps: 21658.90206 + dps: 32051.67202 + tps: 21663.70668 } } dps_results: { key: "TestArms-AllItems-GaleofShadows-56462" value: { - dps: 32206.34028 - tps: 21776.86447 + dps: 32182.86685 + tps: 21734.3093 } } dps_results: { key: "TestArms-AllItems-GearDetector-61462" value: { - dps: 32440.07426 - tps: 21889.42222 + dps: 32368.71454 + tps: 21852.99439 } } dps_results: { key: "TestArms-AllItems-Gladiator'sBattlegear" value: { - dps: 26937.89423 - tps: 18134.14169 + dps: 26988.2729 + tps: 18151.38976 } } dps_results: { key: "TestArms-AllItems-GlowingTwilightScale-54589" value: { - dps: 31654.07824 - tps: 21331.56748 + dps: 31796.98989 + tps: 21389.85767 } } dps_results: { key: "TestArms-AllItems-GraceoftheHerald-55266" value: { - dps: 32159.79946 - tps: 21708.95404 + dps: 32270.45805 + tps: 21730.33057 } } dps_results: { key: "TestArms-AllItems-GraceoftheHerald-56295" value: { - dps: 32460.30755 - tps: 21944.45022 + dps: 32530.29582 + tps: 21957.98691 } } dps_results: { key: "TestArms-AllItems-Gurthalak,VoiceoftheDeeps-77191" value: { - dps: 36202.85123 - tps: 23674.7943 + dps: 36355.97696 + tps: 23725.77463 } } dps_results: { key: "TestArms-AllItems-Gurthalak,VoiceoftheDeeps-78478" value: { - dps: 36400.72675 - tps: 23884.17778 + dps: 36551.79636 + tps: 23937.9586 } } dps_results: { key: "TestArms-AllItems-Gurthalak,VoiceoftheDeeps-78487" value: { - dps: 35618.38415 - tps: 23603.30374 + dps: 35768.20582 + tps: 23657.41661 } } dps_results: { key: "TestArms-AllItems-HarmlightToken-63839" value: { - dps: 31654.07824 - tps: 21331.56748 + dps: 31796.98989 + tps: 21389.85767 } } dps_results: { key: "TestArms-AllItems-Harrison'sInsigniaofPanache-65803" value: { - dps: 32981.58842 - tps: 22350.53816 + dps: 33130.62416 + tps: 22424.92558 } } dps_results: { key: "TestArms-AllItems-HeartofIgnacious-59514" value: { - dps: 31654.07824 - tps: 21331.56748 + dps: 31796.98989 + tps: 21389.85767 } } dps_results: { key: "TestArms-AllItems-HeartofIgnacious-65110" value: { - dps: 31654.07824 - tps: 21331.56748 + dps: 31796.98989 + tps: 21389.85767 } } dps_results: { key: "TestArms-AllItems-HeartofRage-59224" value: { - dps: 32890.58169 - tps: 22221.53306 + dps: 33034.08688 + tps: 22280.16798 } } dps_results: { key: "TestArms-AllItems-HeartofSolace-55868" value: { - dps: 33020.1999 - tps: 22388.84535 + dps: 33028.04698 + tps: 22391.62043 } } dps_results: { key: "TestArms-AllItems-HeartofSolace-56393" value: { - dps: 33327.87535 - tps: 22592.63044 + dps: 33308.45969 + tps: 22551.08576 } } dps_results: { key: "TestArms-AllItems-HeartofThunder-55845" value: { - dps: 31654.07824 - tps: 21331.56748 + dps: 31796.98989 + tps: 21389.85767 } } dps_results: { key: "TestArms-AllItems-HeartofThunder-56370" value: { - dps: 31654.07824 - tps: 21331.56748 + dps: 31796.98989 + tps: 21389.85767 } } dps_results: { key: "TestArms-AllItems-HeartoftheVile-66969" value: { - dps: 32245.767 - tps: 21761.73024 + dps: 32378.39751 + tps: 21805.97618 } } dps_results: { key: "TestArms-AllItems-ImpassiveShadowspiritDiamond" value: { - dps: 33161.72401 - tps: 22310.9204 + dps: 33314.09695 + tps: 22374.97509 } } dps_results: { key: "TestArms-AllItems-ImpatienceofYouth-62464" value: { - dps: 33702.19321 - tps: 22751.20703 + dps: 33668.70173 + tps: 22728.924 } } dps_results: { key: "TestArms-AllItems-ImpatienceofYouth-62469" value: { - dps: 33702.19321 - tps: 22751.20703 + dps: 33668.70173 + tps: 22728.924 } } dps_results: { key: "TestArms-AllItems-ImpetuousQuery-55881" value: { - dps: 32353.94753 - tps: 21733.36796 + dps: 32350.50089 + tps: 21735.06977 } } dps_results: { key: "TestArms-AllItems-ImpetuousQuery-56406" value: { - dps: 32242.81699 - tps: 21735.50764 + dps: 32308.02574 + tps: 21761.52214 } } dps_results: { key: "TestArms-AllItems-IndomitablePride-77211" value: { - dps: 31654.07824 - tps: 21331.56748 + dps: 31796.98989 + tps: 21389.85767 } } dps_results: { key: "TestArms-AllItems-IndomitablePride-77983" value: { - dps: 31654.07824 - tps: 21331.56748 + dps: 31796.98989 + tps: 21389.85767 } } dps_results: { key: "TestArms-AllItems-IndomitablePride-78003" value: { - dps: 31654.07824 - tps: 21331.56748 + dps: 31796.98989 + tps: 21389.85767 } } dps_results: { key: "TestArms-AllItems-InsigniaofDiplomacy-61433" value: { - dps: 31654.07824 - tps: 21331.56748 + dps: 31796.98989 + tps: 21389.85767 } } dps_results: { key: "TestArms-AllItems-InsigniaoftheCorruptedMind-77203" value: { - dps: 32377.38575 - tps: 22010.07001 + dps: 32351.85726 + tps: 21943.69197 } } dps_results: { key: "TestArms-AllItems-InsigniaoftheCorruptedMind-77971" value: { - dps: 32237.61899 - tps: 21829.01722 + dps: 32298.52177 + tps: 21857.58753 } } dps_results: { key: "TestArms-AllItems-InsigniaoftheCorruptedMind-77991" value: { - dps: 32520.43996 - tps: 22009.80408 + dps: 32469.15601 + tps: 21914.72678 } } dps_results: { key: "TestArms-AllItems-InsigniaoftheEarthenLord-61429" value: { - dps: 32409.83037 - tps: 21934.96977 + dps: 32443.60441 + tps: 21960.62064 } } dps_results: { key: "TestArms-AllItems-JarofAncientRemedies-59354" value: { - dps: 31654.07824 - tps: 21331.56748 + dps: 31796.98989 + tps: 21389.85767 } } dps_results: { key: "TestArms-AllItems-JarofAncientRemedies-65029" value: { - dps: 31654.07824 - tps: 21331.56748 + dps: 31796.98989 + tps: 21389.85767 } } dps_results: { key: "TestArms-AllItems-JawsofDefeat-68926" value: { - dps: 31654.07824 - tps: 21331.56748 + dps: 31796.98989 + tps: 21389.85767 } } dps_results: { key: "TestArms-AllItems-JawsofDefeat-69111" value: { - dps: 31654.07824 - tps: 21331.56748 + dps: 31796.98989 + tps: 21389.85767 } } dps_results: { key: "TestArms-AllItems-JujuofNimbleness-63840" value: { - dps: 32626.25118 - tps: 22013.11006 + dps: 32656.19697 + tps: 22029.77928 } } dps_results: { key: "TestArms-AllItems-KeytotheEndlessChamber-55795" value: { - dps: 32109.21521 - tps: 21630.37717 + dps: 32280.57807 + tps: 21695.73182 } } dps_results: { key: "TestArms-AllItems-KeytotheEndlessChamber-56328" value: { - dps: 32208.31931 - tps: 21697.94827 + dps: 32376.29811 + tps: 21770.11336 } } dps_results: { key: "TestArms-AllItems-KiroptyricSigil-77113" value: { - dps: 32466.69761 - tps: 21984.93383 + dps: 32524.46981 + tps: 22017.75629 } } dps_results: { key: "TestArms-AllItems-KvaldirBattleStandard-59685" value: { - dps: 32409.7235 - tps: 21657.29794 + dps: 32438.93961 + tps: 21677.92026 } } dps_results: { key: "TestArms-AllItems-KvaldirBattleStandard-59689" value: { - dps: 32409.7235 - tps: 21657.29794 + dps: 32438.93961 + tps: 21677.92026 } } dps_results: { key: "TestArms-AllItems-LadyLa-La'sSingingShell-67152" value: { - dps: 31997.1594 - tps: 21435.30964 + dps: 31995.03444 + tps: 21403.66804 } } dps_results: { key: "TestArms-AllItems-LastWord-50708" value: { - dps: 34066.38082 - tps: 22907.65137 + dps: 34210.72976 + tps: 22958.72282 } } dps_results: { key: "TestArms-AllItems-LeadenDespair-55816" value: { - dps: 31654.07824 - tps: 21331.56748 + dps: 31796.98989 + tps: 21389.85767 } } dps_results: { key: "TestArms-AllItems-LeadenDespair-56347" value: { - dps: 31654.07824 - tps: 21331.56748 + dps: 31796.98989 + tps: 21389.85767 } } dps_results: { key: "TestArms-AllItems-LeftEyeofRajh-56102" value: { - dps: 32063.28762 - tps: 21623.58325 + dps: 32219.03706 + tps: 21705.12614 } } dps_results: { key: "TestArms-AllItems-LeftEyeofRajh-56427" value: { - dps: 32079.93215 - tps: 21664.72885 + dps: 32225.32841 + tps: 21727.60004 } } dps_results: { key: "TestArms-AllItems-LicensetoSlay-58180" value: { - dps: 32809.6172 - tps: 22101.82142 + dps: 32957.47723 + tps: 22162.01357 } } dps_results: { key: "TestArms-AllItems-MagnetiteMirror-55814" value: { - dps: 32342.09875 - tps: 21805.77963 + dps: 32481.00834 + tps: 21849.37444 } } dps_results: { key: "TestArms-AllItems-MagnetiteMirror-56345" value: { - dps: 32570.01981 - tps: 21960.63259 + dps: 32710.77614 + tps: 22005.07279 } } dps_results: { key: "TestArms-AllItems-MandalaofStirringPatterns-62467" value: { - dps: 31654.07824 - tps: 21331.56748 + dps: 31796.98989 + tps: 21389.85767 } } dps_results: { key: "TestArms-AllItems-MandalaofStirringPatterns-62472" value: { - dps: 31654.07824 - tps: 21331.56748 + dps: 31796.98989 + tps: 21389.85767 } } dps_results: { key: "TestArms-AllItems-MarkofKhardros-56132" value: { - dps: 32854.26567 - tps: 22188.57853 + dps: 32990.82762 + tps: 22287.06561 } } dps_results: { key: "TestArms-AllItems-MarkofKhardros-56458" value: { - dps: 32939.81272 - tps: 22375.23196 + dps: 33061.02228 + tps: 22456.6623 } } dps_results: { key: "TestArms-AllItems-MatrixRestabilizer-68994" value: { - dps: 33576.38385 - tps: 22667.83992 + dps: 33639.14921 + tps: 22683.31064 } } dps_results: { key: "TestArms-AllItems-MatrixRestabilizer-69150" value: { - dps: 33782.70305 - tps: 22864.9592 + dps: 33805.09706 + tps: 22875.80449 } } dps_results: { key: "TestArms-AllItems-MightoftheOcean-55251" value: { - dps: 32140.22581 - tps: 21668.62416 + dps: 32277.49972 + tps: 21711.47019 } } dps_results: { key: "TestArms-AllItems-MightoftheOcean-56285" value: { - dps: 32570.01981 - tps: 21960.63259 + dps: 32710.77614 + tps: 22005.07279 } } dps_results: { key: "TestArms-AllItems-MirrorofBrokenImages-62466" value: { - dps: 32402.74301 - tps: 21880.74445 + dps: 32385.66261 + tps: 21884.03135 } } dps_results: { key: "TestArms-AllItems-MirrorofBrokenImages-62471" value: { - dps: 32402.74301 - tps: 21880.74445 + dps: 32385.66261 + tps: 21884.03135 } } dps_results: { key: "TestArms-AllItems-MithrilStopwatch-232013" value: { - dps: 32341.98943 - tps: 21806.34026 + dps: 32481.54874 + tps: 21853.15726 } } dps_results: { key: "TestArms-AllItems-MoltenGiantBattleplate" value: { - dps: 28451.80678 - tps: 19503.35913 + dps: 28311.78972 + tps: 19449.99272 } } dps_results: { key: "TestArms-AllItems-MoltenGiantWarplate" value: { - dps: 32770.97292 - tps: 22502.31746 + dps: 32837.99202 + tps: 22521.68321 } } dps_results: { key: "TestArms-AllItems-MoonwellChalice-70142" value: { - dps: 32214.51189 - tps: 21899.26174 + dps: 32121.41441 + tps: 21794.78716 } } dps_results: { key: "TestArms-AllItems-MoonwellPhial-70143" value: { - dps: 31654.07824 - tps: 21331.56748 + dps: 31796.98989 + tps: 21389.85767 } } dps_results: { key: "TestArms-AllItems-NecromanticFocus-68982" value: { - dps: 31654.07824 - tps: 21331.56748 + dps: 31796.98989 + tps: 21389.85767 } } dps_results: { key: "TestArms-AllItems-NecromanticFocus-69139" value: { - dps: 31654.07824 - tps: 21331.56748 + dps: 31796.98989 + tps: 21389.85767 } } dps_results: { key: "TestArms-AllItems-No'Kaled,theElementsofDeath-77188" value: { - dps: 34308.89614 - tps: 23166.99308 + dps: 34477.80325 + tps: 23231.50707 } } dps_results: { key: "TestArms-AllItems-No'Kaled,theElementsofDeath-78472" value: { - dps: 34382.70626 - tps: 23233.5032 + dps: 34551.61688 + tps: 23298.0207 } } dps_results: { key: "TestArms-AllItems-No'Kaled,theElementsofDeath-78481" value: { - dps: 34230.7544 - tps: 23101.79903 + dps: 34399.55961 + tps: 23166.21112 } } dps_results: { key: "TestArms-AllItems-Oremantle'sFavor-61448" value: { - dps: 32702.22819 - tps: 22026.09347 + dps: 32836.764 + tps: 22058.47908 } } dps_results: { key: "TestArms-AllItems-PetrifiedPickledEgg-232014" value: { - dps: 31654.07824 - tps: 21331.56748 + dps: 31796.98989 + tps: 21389.85767 } } dps_results: { key: "TestArms-AllItems-PetrifiedTwilightScale-54591" value: { - dps: 31654.07824 - tps: 21331.56748 + dps: 31796.98989 + tps: 21389.85767 } } dps_results: { key: "TestArms-AllItems-PhylacteryoftheNamelessLich-50365" value: { - dps: 32029.02343 - tps: 21588.96892 + dps: 32137.42216 + tps: 21612.50278 } } dps_results: { key: "TestArms-AllItems-PorcelainCrab-55237" value: { - dps: 31947.00486 - tps: 21594.38626 + dps: 31981.21965 + tps: 21625.51808 } } dps_results: { key: "TestArms-AllItems-PorcelainCrab-56280" value: { - dps: 32203.11312 - tps: 21737.87415 + dps: 32198.53484 + tps: 21674.66764 } } dps_results: { key: "TestArms-AllItems-PowerfulShadowspiritDiamond" value: { - dps: 33062.18546 - tps: 22251.67684 + dps: 33201.10995 + tps: 22302.19995 } } dps_results: { key: "TestArms-AllItems-Prestor'sTalismanofMachination-59441" value: { - dps: 32550.2916 - tps: 22035.6613 + dps: 32604.23532 + tps: 22054.98105 } } dps_results: { key: "TestArms-AllItems-Prestor'sTalismanofMachination-65026" value: { - dps: 32694.26791 - tps: 22291.84497 + dps: 32781.85195 + tps: 22318.00483 } } dps_results: { key: "TestArms-AllItems-Rainsong-55854" value: { - dps: 31654.07824 - tps: 21331.56748 + dps: 31796.98989 + tps: 21389.85767 } } dps_results: { key: "TestArms-AllItems-Rainsong-56377" value: { - dps: 31654.07824 - tps: 21331.56748 + dps: 31796.98989 + tps: 21389.85767 } } dps_results: { key: "TestArms-AllItems-ReflectionoftheLight-77115" value: { - dps: 31642.05549 - tps: 21330.15986 + dps: 31775.29297 + tps: 21371.15808 } } dps_results: { key: "TestArms-AllItems-ResolveofUndying-77201" value: { - dps: 31654.07824 - tps: 21331.56748 + dps: 31796.98989 + tps: 21389.85767 } } dps_results: { key: "TestArms-AllItems-ResolveofUndying-77978" value: { - dps: 31654.07824 - tps: 21331.56748 + dps: 31796.98989 + tps: 21389.85767 } } dps_results: { key: "TestArms-AllItems-ResolveofUndying-77998" value: { - dps: 31654.07824 - tps: 21331.56748 + dps: 31796.98989 + tps: 21389.85767 } } dps_results: { key: "TestArms-AllItems-ReverberatingShadowspiritDiamond" value: { - dps: 33707.2908 - tps: 22668.26965 + dps: 33850.41216 + tps: 22719.06521 } } dps_results: { key: "TestArms-AllItems-RevitalizingShadowspiritDiamond" value: { - dps: 33537.68341 - tps: 22555.2019 + dps: 33680.16083 + tps: 22605.80937 } } dps_results: { key: "TestArms-AllItems-Ricket'sMagneticFireball-70144" value: { - dps: 33135.09648 - tps: 22344.0309 + dps: 33165.18293 + tps: 22347.75933 } } dps_results: { key: "TestArms-AllItems-RightEyeofRajh-56100" value: { - dps: 32545.30289 - tps: 21940.51031 + dps: 32700.19015 + tps: 22009.55643 } } dps_results: { key: "TestArms-AllItems-RightEyeofRajh-56431" value: { - dps: 32696.03425 - tps: 22050.42862 + dps: 32852.86192 + tps: 22117.23977 } } dps_results: { key: "TestArms-AllItems-RosaryofLight-72901" value: { - dps: 33820.33566 - tps: 22812.63562 + dps: 33944.89946 + tps: 22850.16465 } } dps_results: { key: "TestArms-AllItems-RottingSkull-77116" value: { - dps: 34121.11985 - tps: 23027.84351 + dps: 34289.77632 + tps: 23076.55614 } } dps_results: { key: "TestArms-AllItems-RuneofZeth-68998" value: { - dps: 32493.75825 - tps: 21896.60322 + dps: 32625.52196 + tps: 21931.45265 } } dps_results: { key: "TestArms-AllItems-RuthlessGladiator'sBadgeofConquest-70399" value: { - dps: 32490.74117 - tps: 21874.85205 + dps: 32492.71832 + tps: 21862.91166 } } dps_results: { key: "TestArms-AllItems-RuthlessGladiator'sBadgeofConquest-72304" value: { - dps: 32519.21252 - tps: 21896.264 + dps: 32557.03587 + tps: 21890.88177 } } dps_results: { key: "TestArms-AllItems-RuthlessGladiator'sBadgeofDominance-70401" value: { - dps: 31625.14868 - tps: 21293.96717 + dps: 31766.36409 + tps: 21353.61841 } } dps_results: { key: "TestArms-AllItems-RuthlessGladiator'sBadgeofDominance-72448" value: { - dps: 31625.14868 - tps: 21293.96717 + dps: 31766.36409 + tps: 21353.61841 } } dps_results: { key: "TestArms-AllItems-RuthlessGladiator'sBadgeofVictory-70400" value: { - dps: 33167.37047 - tps: 22291.38718 + dps: 33317.12233 + tps: 22353.63219 } } dps_results: { key: "TestArms-AllItems-RuthlessGladiator'sBadgeofVictory-72450" value: { - dps: 33254.78077 - tps: 22347.91911 + dps: 33405.01646 + tps: 22410.31114 } } dps_results: { key: "TestArms-AllItems-RuthlessGladiator'sInsigniaofConquest-70404" value: { - dps: 32389.22508 - tps: 21867.45043 + dps: 32522.10861 + tps: 21908.13492 } } dps_results: { key: "TestArms-AllItems-RuthlessGladiator'sInsigniaofConquest-72309" value: { - dps: 32368.20142 - tps: 21843.59126 + dps: 32492.86678 + tps: 21878.71302 } } dps_results: { key: "TestArms-AllItems-RuthlessGladiator'sInsigniaofDominance-70402" value: { - dps: 31654.07824 - tps: 21331.56748 + dps: 31796.98989 + tps: 21389.85767 } } dps_results: { key: "TestArms-AllItems-RuthlessGladiator'sInsigniaofDominance-72449" value: { - dps: 31654.07824 - tps: 21331.56748 + dps: 31796.98989 + tps: 21389.85767 } } dps_results: { key: "TestArms-AllItems-RuthlessGladiator'sInsigniaofVictory-70403" value: { - dps: 33020.24819 - tps: 22259.19778 + dps: 33167.19778 + tps: 22312.85761 } } dps_results: { key: "TestArms-AllItems-RuthlessGladiator'sInsigniaofVictory-72455" value: { - dps: 33111.54442 - tps: 22318.07227 + dps: 33263.30526 + tps: 22378.25529 } } dps_results: { key: "TestArms-AllItems-ScalesofLife-68915" value: { - dps: 31654.07824 - tps: 21331.56748 + dps: 31796.98989 + tps: 21389.85767 hps: 315.97258 } } dps_results: { key: "TestArms-AllItems-ScalesofLife-69109" value: { - dps: 31654.07824 - tps: 21331.56748 + dps: 31796.98989 + tps: 21389.85767 hps: 356.41412 } } dps_results: { key: "TestArms-AllItems-Schnottz'sMedallionofCommand-65805" value: { - dps: 32587.54818 - tps: 22071.18918 + dps: 32751.30999 + tps: 22169.9753 } } dps_results: { key: "TestArms-AllItems-SeaStar-55256" value: { - dps: 31625.14868 - tps: 21293.96717 + dps: 31766.36409 + tps: 21353.61841 } } dps_results: { key: "TestArms-AllItems-SeaStar-56290" value: { - dps: 31625.14868 - tps: 21293.96717 + dps: 31766.36409 + tps: 21353.61841 } } dps_results: { key: "TestArms-AllItems-Shadowmourne-49623" value: { - dps: 35824.39119 - tps: 23937.47896 + dps: 35726.03698 + tps: 23932.91835 } } dps_results: { key: "TestArms-AllItems-ShardofWoe-60233" value: { - dps: 32275.0318 - tps: 21810.32662 + dps: 32286.91543 + tps: 21810.58481 } } dps_results: { key: "TestArms-AllItems-Shrine-CleansingPurifier-63838" value: { - dps: 32792.3608 - tps: 22085.88353 + dps: 32744.90551 + tps: 22137.43491 } } dps_results: { key: "TestArms-AllItems-Sindragosa'sFlawlessFang-50364" value: { - dps: 31654.07824 - tps: 21331.56748 + dps: 31796.98989 + tps: 21389.85767 } } dps_results: { key: "TestArms-AllItems-Skardyn'sGrace-56115" value: { - dps: 32526.54027 - tps: 21880.82542 + dps: 32495.58498 + tps: 21901.37583 } } dps_results: { key: "TestArms-AllItems-Skardyn'sGrace-56440" value: { - dps: 32837.22223 - tps: 22201.21953 + dps: 32820.38353 + tps: 22201.54341 } } dps_results: { key: "TestArms-AllItems-Sorrowsong-55879" value: { - dps: 32353.94753 - tps: 21733.36796 + dps: 32350.50089 + tps: 21735.06977 } } dps_results: { key: "TestArms-AllItems-Sorrowsong-56400" value: { - dps: 32242.81699 - tps: 21735.50764 + dps: 32308.02574 + tps: 21761.52214 } } dps_results: { key: "TestArms-AllItems-Soul'sAnguish-66994" value: { - dps: 32140.22581 - tps: 21668.62416 + dps: 32277.49972 + tps: 21711.47019 } } dps_results: { key: "TestArms-AllItems-SoulCasket-58183" value: { - dps: 32391.28356 - tps: 21902.00007 + dps: 32364.16039 + tps: 21881.90943 } } dps_results: { key: "TestArms-AllItems-Souldrinker-77193" value: { - dps: 34544.94645 - tps: 23275.57863 - hps: 293.32516 + dps: 34690.77274 + tps: 23327.22194 + hps: 293.48815 } } dps_results: { key: "TestArms-AllItems-Souldrinker-78479" value: { - dps: 34656.28735 - tps: 23356.55565 - hps: 333.83606 + dps: 34802.47071 + tps: 23408.31122 + hps: 334.02155 } } dps_results: { key: "TestArms-AllItems-Souldrinker-78488" value: { - dps: 34446.38489 - tps: 23203.19282 - hps: 253.24591 + dps: 34591.90192 + tps: 23254.73793 + hps: 253.38663 } } dps_results: { key: "TestArms-AllItems-SoulshifterVortex-77206" value: { - dps: 32742.54599 - tps: 22357.1167 + dps: 32802.09626 + tps: 22370.63311 } } dps_results: { key: "TestArms-AllItems-SoulshifterVortex-77970" value: { - dps: 32734.91369 - tps: 22254.39271 + dps: 32680.75451 + tps: 22156.95072 } } dps_results: { key: "TestArms-AllItems-SoulshifterVortex-77990" value: { - dps: 32805.45924 - tps: 22433.47263 + dps: 32748.14391 + tps: 22370.83372 } } dps_results: { key: "TestArms-AllItems-SpidersilkSpindle-68981" value: { - dps: 32480.1356 - tps: 21924.8024 + dps: 32464.53139 + tps: 21908.92349 } } dps_results: { key: "TestArms-AllItems-SpidersilkSpindle-69138" value: { - dps: 32557.88411 - tps: 22080.90871 + dps: 32472.20327 + tps: 22026.82657 } } dps_results: { key: "TestArms-AllItems-StarcatcherCompass-77202" value: { - dps: 33059.51807 - tps: 22321.44262 + dps: 33111.37356 + tps: 22376.1049 } } dps_results: { key: "TestArms-AllItems-StarcatcherCompass-77973" value: { - dps: 32941.44183 - tps: 22262.47188 + dps: 32796.55801 + tps: 22177.29956 } } dps_results: { key: "TestArms-AllItems-StarcatcherCompass-77993" value: { - dps: 33284.21543 - tps: 22468.9396 + dps: 33418.61216 + tps: 22475.68563 } } dps_results: { key: "TestArms-AllItems-StayofExecution-68996" value: { - dps: 31625.33192 - tps: 21294.9341 + dps: 31766.54733 + tps: 21354.58534 } } dps_results: { key: "TestArms-AllItems-Stonemother'sKiss-61411" value: { - dps: 31654.07824 - tps: 21331.56748 + dps: 31796.98989 + tps: 21389.85767 } } dps_results: { key: "TestArms-AllItems-StumpofTime-62465" value: { - dps: 31654.07824 - tps: 21331.56748 + dps: 31796.98989 + tps: 21389.85767 } } dps_results: { key: "TestArms-AllItems-StumpofTime-62470" value: { - dps: 31654.07824 - tps: 21331.56748 + dps: 31796.98989 + tps: 21389.85767 } } dps_results: { key: "TestArms-AllItems-SymbioticWorm-59332" value: { - dps: 31654.07824 - tps: 21331.56748 + dps: 31796.98989 + tps: 21389.85767 } } dps_results: { key: "TestArms-AllItems-SymbioticWorm-65048" value: { - dps: 31654.07824 - tps: 21331.56748 + dps: 31796.98989 + tps: 21389.85767 } } dps_results: { key: "TestArms-AllItems-TalismanofSinisterOrder-65804" value: { - dps: 31654.07824 - tps: 21331.56748 + dps: 31796.98989 + tps: 21389.85767 } } dps_results: { key: "TestArms-AllItems-Tank-CommanderInsignia-63841" value: { - dps: 32854.60176 - tps: 21976.31209 + dps: 32935.21684 + tps: 22062.54953 } } dps_results: { key: "TestArms-AllItems-TearofBlood-55819" value: { - dps: 31654.07824 - tps: 21331.56748 + dps: 31796.98989 + tps: 21389.85767 } } dps_results: { key: "TestArms-AllItems-TearofBlood-56351" value: { - dps: 31654.07824 - tps: 21331.56748 + dps: 31796.98989 + tps: 21389.85767 } } dps_results: { key: "TestArms-AllItems-TendrilsofBurrowingDark-55810" value: { - dps: 32142.77848 - tps: 21707.75739 + dps: 32178.61788 + tps: 21735.59357 } } dps_results: { key: "TestArms-AllItems-TendrilsofBurrowingDark-56339" value: { - dps: 32242.81699 - tps: 21735.50764 + dps: 32308.02574 + tps: 21761.52214 } } dps_results: { key: "TestArms-AllItems-TheHungerer-68927" value: { - dps: 32703.53961 - tps: 22101.04333 + dps: 32833.41665 + tps: 22138.47544 } } dps_results: { key: "TestArms-AllItems-TheHungerer-69112" value: { - dps: 32889.95695 - tps: 22294.3806 + dps: 32933.01535 + tps: 22287.84031 } } dps_results: { key: "TestArms-AllItems-Theralion'sMirror-59519" value: { - dps: 31654.07824 - tps: 21331.56748 + dps: 31796.98989 + tps: 21389.85767 } } dps_results: { key: "TestArms-AllItems-Theralion'sMirror-65105" value: { - dps: 31654.07824 - tps: 21331.56748 + dps: 31796.98989 + tps: 21389.85767 } } dps_results: { key: "TestArms-AllItems-Throngus'sFinger-56121" value: { - dps: 31654.07824 - tps: 21331.56748 + dps: 31796.98989 + tps: 21389.85767 } } dps_results: { key: "TestArms-AllItems-Throngus'sFinger-56449" value: { - dps: 31654.07824 - tps: 21331.56748 + dps: 31796.98989 + tps: 21389.85767 } } dps_results: { key: "TestArms-AllItems-Tia'sGrace-55874" value: { - dps: 32792.23117 - tps: 22059.24545 + dps: 32788.45034 + tps: 22064.51893 } } dps_results: { key: "TestArms-AllItems-Tia'sGrace-56394" value: { - dps: 32790.21342 - tps: 22106.41271 + dps: 32833.87596 + tps: 22123.10678 } } dps_results: { key: "TestArms-AllItems-TinyAbominationinaJar-50706" value: { - dps: 32596.2366 - tps: 22103.53618 + dps: 32509.69233 + tps: 22069.96232 } } dps_results: { key: "TestArms-AllItems-Tyrande'sFavoriteDoll-64645" value: { - dps: 31410.94351 - tps: 21133.51705 + dps: 31551.36955 + tps: 21192.12566 } } dps_results: { key: "TestArms-AllItems-UnheededWarning-59520" value: { - dps: 32732.85247 - tps: 22070.93368 + dps: 32867.67083 + tps: 22116.46135 } } dps_results: { key: "TestArms-AllItems-UnquenchableFlame-67101" value: { - dps: 31625.14868 - tps: 21293.96717 + dps: 31766.36409 + tps: 21353.61841 } } dps_results: { key: "TestArms-AllItems-UnsolvableRiddle-62463" value: { - dps: 32899.68885 - tps: 22229.30309 + dps: 32818.56289 + tps: 22190.58761 } } dps_results: { key: "TestArms-AllItems-UnsolvableRiddle-62468" value: { - dps: 32899.68885 - tps: 22229.30309 + dps: 32818.56289 + tps: 22190.58761 } } dps_results: { key: "TestArms-AllItems-UnsolvableRiddle-68709" value: { - dps: 32899.68885 - tps: 22229.30309 + dps: 32818.56289 + tps: 22190.58761 } } dps_results: { key: "TestArms-AllItems-Val'anyr,HammerofAncientKings-46017" value: { - dps: 18597.00781 - tps: 12124.49011 + dps: 18633.79726 + tps: 12151.8626 } } dps_results: { key: "TestArms-AllItems-VariablePulseLightningCapacitor-68925" value: { - dps: 31654.07824 - tps: 21331.56748 + dps: 31796.98989 + tps: 21389.85767 } } dps_results: { key: "TestArms-AllItems-VariablePulseLightningCapacitor-69110" value: { - dps: 31654.07824 - tps: 21331.56748 + dps: 31796.98989 + tps: 21389.85767 } } dps_results: { key: "TestArms-AllItems-Varo'then'sBrooch-72899" value: { - dps: 33862.8611 - tps: 22853.6895 + dps: 33850.27449 + tps: 22857.36448 } } dps_results: { key: "TestArms-AllItems-VeilofLies-72900" value: { - dps: 31654.07824 - tps: 21331.56748 + dps: 31796.98989 + tps: 21389.85767 } } dps_results: { key: "TestArms-AllItems-VesselofAcceleration-68995" value: { - dps: 33810.7217 - tps: 22792.11664 + dps: 33984.28676 + tps: 22850.27095 } } dps_results: { key: "TestArms-AllItems-VesselofAcceleration-69167" value: { - dps: 34057.47592 - tps: 22957.73135 + dps: 34220.88994 + tps: 23015.14129 } } dps_results: { key: "TestArms-AllItems-VialofShadows-77207" value: { - dps: 32828.90158 - tps: 22262.29914 + dps: 32881.36177 + tps: 22311.53162 } } dps_results: { key: "TestArms-AllItems-VialofShadows-77979" value: { - dps: 32827.38544 - tps: 22298.55816 + dps: 32781.67366 + tps: 22308.46652 } } dps_results: { key: "TestArms-AllItems-VialofShadows-77999" value: { - dps: 33107.53054 - tps: 22603.00104 + dps: 33145.38494 + tps: 22641.19117 } } dps_results: { key: "TestArms-AllItems-VialofStolenMemories-59515" value: { - dps: 31654.07824 - tps: 21331.56748 + dps: 31796.98989 + tps: 21389.85767 } } dps_results: { key: "TestArms-AllItems-VialofStolenMemories-65109" value: { - dps: 31654.07824 - tps: 21331.56748 + dps: 31796.98989 + tps: 21389.85767 } } dps_results: { key: "TestArms-AllItems-ViciousGladiator'sBadgeofConquest-61033" value: { - dps: 32220.90239 - tps: 21722.4904 + dps: 32340.37383 + tps: 21755.3839 } } dps_results: { key: "TestArms-AllItems-ViciousGladiator'sBadgeofConquest-70517" value: { - dps: 32358.54372 - tps: 21776.21733 + dps: 32382.97502 + tps: 21787.09907 } } dps_results: { key: "TestArms-AllItems-ViciousGladiator'sBadgeofDominance-61035" value: { - dps: 31625.14868 - tps: 21293.96717 + dps: 31766.36409 + tps: 21353.61841 } } dps_results: { key: "TestArms-AllItems-ViciousGladiator'sBadgeofDominance-70518" value: { - dps: 31625.14868 - tps: 21293.96717 + dps: 31766.36409 + tps: 21353.61841 } } dps_results: { key: "TestArms-AllItems-ViciousGladiator'sBadgeofVictory-61034" value: { - dps: 32845.09248 - tps: 22082.95638 + dps: 32993.06048 + tps: 22144.65938 } } dps_results: { key: "TestArms-AllItems-ViciousGladiator'sBadgeofVictory-70519" value: { - dps: 32988.74941 - tps: 22175.86539 + dps: 33137.51257 + tps: 22237.81 } } dps_results: { key: "TestArms-AllItems-ViciousGladiator'sEmblemofAccuracy-61027" value: { - dps: 31654.07824 - tps: 21331.56748 + dps: 31796.98989 + tps: 21389.85767 } } dps_results: { key: "TestArms-AllItems-ViciousGladiator'sEmblemofAlacrity-61028" value: { - dps: 32018.44337 - tps: 21610.8149 + dps: 32054.37033 + tps: 21640.33813 } } dps_results: { key: "TestArms-AllItems-ViciousGladiator'sEmblemofCruelty-61026" value: { - dps: 32413.54926 - tps: 21840.53265 + dps: 32536.55888 + tps: 21880.34863 } } dps_results: { key: "TestArms-AllItems-ViciousGladiator'sEmblemofProficiency-61030" value: { - dps: 31654.07824 - tps: 21331.56748 + dps: 31796.98989 + tps: 21389.85767 } } dps_results: { key: "TestArms-AllItems-ViciousGladiator'sEmblemofProwess-61029" value: { - dps: 32519.44443 - tps: 21938.56687 + dps: 32531.48874 + tps: 21942.69873 } } dps_results: { key: "TestArms-AllItems-ViciousGladiator'sEmblemofTenacity-61032" value: { - dps: 31654.07824 - tps: 21331.56748 + dps: 31796.98989 + tps: 21389.85767 } } dps_results: { key: "TestArms-AllItems-ViciousGladiator'sInsigniaofConquest-61047" value: { - dps: 32201.11253 - tps: 21709.91612 + dps: 32353.03709 + tps: 21752.08433 } } dps_results: { key: "TestArms-AllItems-ViciousGladiator'sInsigniaofConquest-70577" value: { - dps: 32263.32007 - tps: 21744.44382 + dps: 32402.38046 + tps: 21774.41019 } } dps_results: { key: "TestArms-AllItems-ViciousGladiator'sInsigniaofDominance-61045" value: { - dps: 31654.07824 - tps: 21331.56748 + dps: 31796.98989 + tps: 21389.85767 } } dps_results: { key: "TestArms-AllItems-ViciousGladiator'sInsigniaofDominance-70578" value: { - dps: 31654.07824 - tps: 21331.56748 + dps: 31796.98989 + tps: 21389.85767 } } dps_results: { key: "TestArms-AllItems-ViciousGladiator'sInsigniaofVictory-61046" value: { - dps: 32754.63358 - tps: 22079.38227 + dps: 32908.0251 + tps: 22140.97055 } } dps_results: { key: "TestArms-AllItems-ViciousGladiator'sInsigniaofVictory-70579" value: { - dps: 32852.03889 - tps: 22144.7338 + dps: 33000.85341 + tps: 22203.61339 } } dps_results: { key: "TestArms-AllItems-Vishanka,JawsoftheEarth-78359" value: { - dps: 33312.13905 - tps: 22413.36372 + dps: 33391.59844 + tps: 22441.85395 } } dps_results: { key: "TestArms-AllItems-Vishanka,JawsoftheEarth-78471" value: { - dps: 33353.00252 - tps: 22437.72739 + dps: 33424.93109 + tps: 22464.89346 } } dps_results: { key: "TestArms-AllItems-Vishanka,JawsoftheEarth-78480" value: { - dps: 33281.23566 - tps: 22393.05589 + dps: 33360.69505 + tps: 22421.54612 } } dps_results: { key: "TestArms-AllItems-WillofUnbinding-77198" value: { - dps: 31654.07824 - tps: 21331.56748 + dps: 31796.98989 + tps: 21389.85767 } } dps_results: { key: "TestArms-AllItems-WillofUnbinding-77975" value: { - dps: 31654.07824 - tps: 21331.56748 + dps: 31796.98989 + tps: 21389.85767 } } dps_results: { key: "TestArms-AllItems-WillofUnbinding-77995" value: { - dps: 31654.07824 - tps: 21331.56748 + dps: 31796.98989 + tps: 21389.85767 } } dps_results: { key: "TestArms-AllItems-WitchingHourglass-55787" value: { - dps: 31654.07824 - tps: 21331.56748 + dps: 31796.98989 + tps: 21389.85767 } } dps_results: { key: "TestArms-AllItems-WitchingHourglass-56320" value: { - dps: 31654.07824 - tps: 21331.56748 + dps: 31796.98989 + tps: 21389.85767 } } dps_results: { key: "TestArms-AllItems-World-QuellerFocus-63842" value: { - dps: 32217.94048 - tps: 21754.92433 + dps: 32252.08427 + tps: 21780.91593 } } dps_results: { key: "TestArms-AllItems-WrathofUnchaining-77197" value: { - dps: 32944.91617 - tps: 22234.82225 + dps: 33116.81699 + tps: 22293.64778 } } dps_results: { key: "TestArms-AllItems-WrathofUnchaining-77974" value: { - dps: 32830.02493 - tps: 22149.14576 + dps: 32996.48134 + tps: 22207.53018 } } dps_results: { key: "TestArms-AllItems-WrathofUnchaining-77994" value: { - dps: 33088.92796 - tps: 22341.07461 + dps: 33247.06293 + tps: 22387.28521 } } dps_results: { key: "TestArms-AllItems-Za'brox'sLuckyTooth-63742" value: { - dps: 32046.23446 - tps: 21747.47864 + dps: 32042.53657 + tps: 21730.77081 } } dps_results: { key: "TestArms-AllItems-Za'brox'sLuckyTooth-63745" value: { - dps: 32046.23446 - tps: 21747.47864 + dps: 32042.53657 + tps: 21730.77081 } } dps_results: { key: "TestArms-Average-Default" value: { - dps: 33816.05185 - tps: 22699.91162 + dps: 33816.50388 + tps: 22702.06121 } } dps_results: { key: "TestArms-Settings-Orc-p1_arms_bis-Basic-arms-FullBuffs-0.0yards-LongMultiTarget" value: { - dps: 69696.24356 - tps: 37217.28958 + dps: 69704.87702 + tps: 37227.38285 } } dps_results: { key: "TestArms-Settings-Orc-p1_arms_bis-Basic-arms-FullBuffs-0.0yards-LongSingleTarget" value: { - dps: 33707.2908 - tps: 22668.26965 + dps: 33850.41216 + tps: 22719.06521 } } dps_results: { key: "TestArms-Settings-Orc-p1_arms_bis-Basic-arms-FullBuffs-0.0yards-ShortSingleTarget" value: { - dps: 41156.91406 - tps: 26609.59198 + dps: 41186.69888 + tps: 26639.37681 } } dps_results: { key: "TestArms-Settings-Orc-p1_arms_bis-Basic-arms-NoBuffs-0.0yards-LongMultiTarget" value: { - dps: 48130.40433 - tps: 24150.99433 + dps: 48136.06716 + tps: 24158.03766 } } dps_results: { key: "TestArms-Settings-Orc-p1_arms_bis-Basic-arms-NoBuffs-0.0yards-LongSingleTarget" value: { - dps: 23076.96818 - tps: 15339.27769 + dps: 23062.96975 + tps: 15351.08717 } } dps_results: { key: "TestArms-Settings-Orc-p1_arms_bis-Basic-arms-NoBuffs-0.0yards-ShortSingleTarget" value: { - dps: 25229.36625 - tps: 15829.6947 + dps: 25242.48633 + tps: 15842.81478 } } dps_results: { key: "TestArms-Settings-Orc-p3_arms_bis-Basic-arms-FullBuffs-0.0yards-LongMultiTarget" value: { - dps: 87325.81113 - tps: 46129.24303 + dps: 87335.88753 + tps: 46141.07743 } } dps_results: { key: "TestArms-Settings-Orc-p3_arms_bis-Basic-arms-FullBuffs-0.0yards-LongSingleTarget" value: { - dps: 42031.88957 - tps: 28828.75515 + dps: 42049.15923 + tps: 28814.77014 } } dps_results: { key: "TestArms-Settings-Orc-p3_arms_bis-Basic-arms-FullBuffs-0.0yards-ShortSingleTarget" value: { - dps: 47572.39466 - tps: 31453.30596 + dps: 47607.75126 + tps: 31488.73131 } } dps_results: { key: "TestArms-Settings-Orc-p3_arms_bis-Basic-arms-NoBuffs-0.0yards-LongMultiTarget" value: { - dps: 61543.14933 - tps: 31135.89379 + dps: 61545.89993 + tps: 31140.73398 } } dps_results: { key: "TestArms-Settings-Orc-p3_arms_bis-Basic-arms-NoBuffs-0.0yards-LongSingleTarget" value: { - dps: 29575.45064 - tps: 20059.409 + dps: 29569.55892 + tps: 20059.51223 } } dps_results: { key: "TestArms-Settings-Orc-p3_arms_bis-Basic-arms-NoBuffs-0.0yards-ShortSingleTarget" value: { - dps: 30980.55198 - tps: 19850.02257 + dps: 30997.74768 + tps: 19867.21827 } } dps_results: { key: "TestArms-Settings-Worgen-p1_arms_bis-Basic-arms-FullBuffs-0.0yards-LongMultiTarget" value: { - dps: 69824.97978 - tps: 37129.61183 + dps: 69836.63261 + tps: 37142.53993 } } dps_results: { key: "TestArms-Settings-Worgen-p1_arms_bis-Basic-arms-FullBuffs-0.0yards-LongSingleTarget" value: { - dps: 33749.77584 - tps: 22703.07225 + dps: 33916.55996 + tps: 22766.33304 } } dps_results: { key: "TestArms-Settings-Worgen-p1_arms_bis-Basic-arms-FullBuffs-0.0yards-ShortSingleTarget" value: { - dps: 40797.21175 - tps: 26334.74009 + dps: 40826.99654 + tps: 26364.52488 } } dps_results: { key: "TestArms-Settings-Worgen-p1_arms_bis-Basic-arms-NoBuffs-0.0yards-LongMultiTarget" value: { - dps: 48282.83378 - tps: 24101.2781 + dps: 48288.32482 + tps: 24108.32799 } } dps_results: { key: "TestArms-Settings-Worgen-p1_arms_bis-Basic-arms-NoBuffs-0.0yards-LongSingleTarget" value: { - dps: 23236.01323 - tps: 15493.14632 + dps: 23212.22874 + tps: 15502.56209 } } dps_results: { key: "TestArms-Settings-Worgen-p1_arms_bis-Basic-arms-NoBuffs-0.0yards-ShortSingleTarget" value: { - dps: 25235.32485 - tps: 15891.18794 + dps: 25248.44492 + tps: 15904.30802 } } dps_results: { key: "TestArms-Settings-Worgen-p3_arms_bis-Basic-arms-FullBuffs-0.0yards-LongMultiTarget" value: { - dps: 87569.23697 - tps: 46144.32157 + dps: 87578.60384 + tps: 46158.13288 } } dps_results: { key: "TestArms-Settings-Worgen-p3_arms_bis-Basic-arms-FullBuffs-0.0yards-LongSingleTarget" value: { - dps: 42114.75186 - tps: 28871.26248 + dps: 42139.83845 + tps: 28863.71833 } } dps_results: { key: "TestArms-Settings-Worgen-p3_arms_bis-Basic-arms-FullBuffs-0.0yards-ShortSingleTarget" value: { - dps: 47492.25625 - tps: 31312.7431 + dps: 47527.59926 + tps: 31348.15486 } } dps_results: { key: "TestArms-Settings-Worgen-p3_arms_bis-Basic-arms-NoBuffs-0.0yards-LongMultiTarget" value: { - dps: 61760.1927 - tps: 31247.31356 + dps: 61762.67916 + tps: 31252.21345 } } dps_results: { key: "TestArms-Settings-Worgen-p3_arms_bis-Basic-arms-NoBuffs-0.0yards-LongSingleTarget" value: { - dps: 29630.18387 - tps: 20147.8625 + dps: 29623.74961 + tps: 20147.11201 } } dps_results: { key: "TestArms-Settings-Worgen-p3_arms_bis-Basic-arms-NoBuffs-0.0yards-ShortSingleTarget" value: { - dps: 30698.70092 - tps: 19660.25638 + dps: 30711.97776 + tps: 19673.53322 } } dps_results: { key: "TestArms-SwitchInFrontOfTarget-Default" value: { - dps: 30918.43414 - tps: 21002.55643 + dps: 30918.82972 + tps: 20951.01196 } } diff --git a/ui/warrior/arms/apls/arms.apl.json b/ui/warrior/arms/apls/arms.apl.json index 5ac4f98300..a142dd82fa 100644 --- a/ui/warrior/arms/apls/arms.apl.json +++ b/ui/warrior/arms/apls/arms.apl.json @@ -2,11 +2,13 @@ "type": "TypeAPL", "prepullActions": [ {"action":{"castSpell":{"spellId":{"spellId":2457}}},"doAtValue":{"const":{"val":"-2s"}}}, + {"action":{"move":{"rangeFromTarget":{"const":{"val":"9"}}}},"doAtValue":{"const":{"val":"-2s"}}}, {"action":{"castSpell":{"spellId":{"spellId":6673}}},"doAtValue":{"const":{"val":"-1.5s"}}}, {"action":{"castSpell":{"spellId":{"otherId":"OtherActionPotion"}}},"doAtValue":{"const":{"val":"-1s"}}}, - {"action":{"castSpell":{"spellId":{"spellId":100}}},"doAtValue":{"const":{"val":"-0.1s"}}} + {"action":{"castSpell":{"spellId":{"spellId":100}}},"doAtValue":{"const":{"val":"-0.2s"}}} ], "priorityList": [ + {"hide":true,"action":{"castSpell":{"spellId":{"spellId":100}}}}, {"action":{"autocastOtherCooldowns":{}}}, {"action":{"condition":{"or":{"vals":[{"and":{"vals":[{"isExecutePhase":{"threshold":"E20"}},{"or":{"vals":[{"spellIsReady":{"spellId":{"itemId":69113}}},{"spellIsReady":{"spellId":{"itemId":68972}}}]}}]}},{"and":{"vals":[{"isExecutePhase":{"threshold":"E20"}},{"not":{"val":{"or":{"vals":[{"spellIsKnown":{"spellId":{"itemId":69113}}},{"spellIsKnown":{"spellId":{"itemId":68972}}}]}}}},{"auraIsActive":{"auraId":{"spellId":57519}}}]}},{"cmp":{"op":"OpLt","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"26.5s"}}}}]}},"castSpell":{"spellId":{"otherId":"OtherActionPotion"}}}}, {"action":{"condition":{"or":{"vals":[{"and":{"vals":[{"cmp":{"op":"OpEq","lhs":{"auraNumStacks":{"auraId":{"spellId":96923}}},"rhs":{"const":{"val":"5"}}}},{"or":{"vals":[{"spellIsReady":{"spellId":{"itemId":69113}}},{"spellIsReady":{"spellId":{"itemId":68972}}}]}},{"or":{"vals":[{"auraIsActive":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":86346}}},{"cmp":{"op":"OpGt","lhs":{"spellTimeToReady":{"spellId":{"spellId":86346}}},"rhs":{"const":{"val":"6s"}}}}]}},{"or":{"vals":[{"cmp":{"op":"OpGt","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"125s"}}}},{"isExecutePhase":{"threshold":"E20"}}]}}]}},{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"16.5s"}}}},{"and":{"vals":[{"cmp":{"op":"OpGe","lhs":{"currentTime":{}},"rhs":{"const":{"val":"1.5s"}}}},{"spellIsReady":{"spellId":{"spellId":1719}}}]}}]}},"castSpell":{"spellId":{"spellId":33697}}}}, @@ -33,6 +35,7 @@ {"action":{"condition":{"or":{"vals":[{"spellCanCast":{"spellId":{"spellId":12294}}},{"and":{"vals":[{"spellCanCast":{"spellId":{"spellId":86346}}},{"not":{"val":{"auraIsActive":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":86346}}}}}]}}]}},"castSpell":{"spellId":{"spellId":2458}}}}, {"action":{"condition":{"and":{"vals":[{"auraIsKnown":{"auraId":{"spellId":99233}}},{"cmp":{"op":"OpGt","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"6s"}}}}]}},"castSpell":{"spellId":{"spellId":6673}}}}, {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpGt","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"1.5s"}}}},{"not":{"val":{"and":{"vals":[{"isExecutePhase":{"threshold":"E20"}},{"auraIsActive":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":86346}}},{"auraIsActive":{"auraId":{"spellId":57519}}}]}}}}]}},"castSpell":{"spellId":{"spellId":12294}}}}, + {"hide":true,"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpLt","lhs":{"currentRage":{}},"rhs":{"const":{"val":"75"}}}},{"cmp":{"op":"OpGe","lhs":{"autoTimeToNext":{}},"rhs":{"const":{"val":"2.5s"}}}},{"not":{"val":{"or":{"vals":[{"auraIsActive":{"auraId":{"spellId":2825,"tag":-1}}},{"auraIsActive":{"auraId":{"spellId":85730}}},{"auraIsActive":{"auraId":{"spellId":1719}}}]}}}},{"spellIsReady":{"spellId":{"spellId":100}}}]}},"move":{"rangeFromTarget":{"const":{"val":"9"}}}}}, {"action":{"condition":{"and":{"vals":[{"not":{"val":{"auraIsActive":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":86346}}}}},{"cmp":{"op":"OpGt","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"3s"}}}}]}},"castSpell":{"spellId":{"spellId":86346}}}}, {"action":{"condition":{"or":{"vals":[{"or":{"vals":[{"cmp":{"op":"OpGt","lhs":{"currentRage":{}},"rhs":{"const":{"val":"75"}}}},{"and":{"vals":[{"auraIsActive":{"auraId":{"spellId":86627}}},{"cmp":{"op":"OpGe","lhs":{"currentRage":{}},"rhs":{"const":{"val":"65"}}}}]}}]}},{"auraIsActive":{"auraId":{"spellId":85730}}},{"auraIsActiveWithReactionTime":{"auraId":{"spellId":12964}}},{"and":{"vals":[{"cmp":{"op":"OpLt","lhs":{"spellTimeToReady":{"spellId":{"spellId":85730}}},"rhs":{"const":{"val":"1s"}}}},{"not":{"val":{"cmp":{"op":"OpLt","lhs":{"spellTimeToReady":{"spellId":{"spellId":1719}}},"rhs":{"const":{"val":"1s"}}}}}},{"cmp":{"op":"OpGt","lhs":{"currentRage":{}},"rhs":{"const":{"val":"30"}}}},{"not":{"val":{"cmp":{"op":"OpLt","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"123s"}}}}}}]}},{"and":{"vals":[{"cmp":{"op":"OpGe","lhs":{"currentRage":{}},"rhs":{"const":{"val":"50"}}}},{"or":{"vals":[{"cmp":{"op":"OpGe","lhs":{"spellTimeToReady":{"spellId":{"spellId":12294}}},"rhs":{"const":{"val":"1.5s"}}}},{"auraIsActive":{"auraId":{"spellId":86627}}}]}},{"isExecutePhase":{"threshold":"E20"}}]}},{"and":{"vals":[{"cmp":{"op":"OpLt","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"2s"}}}},{"cmp":{"op":"OpGe","lhs":{"currentRage":{}},"rhs":{"const":{"val":"40"}}}}]}}]}},"castSpell":{"spellId":{"spellId":78}}}}, {"action":{"condition":{"and":{"vals":[{"auraIsActive":{"auraId":{"spellId":60503}}},{"gcdIsReady":{}},{"not":{"val":{"spellCanCast":{"spellId":{"spellId":12294}}}}},{"not":{"val":{"and":{"vals":[{"spellCanCast":{"spellId":{"spellId":86346}}},{"cmp":{"op":"OpLt","lhs":{"auraRemainingTime":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":86346}}},"rhs":{"const":{"val":"1s"}}}}]}}}},{"cmp":{"op":"OpGe","lhs":{"currentRage":{}},"rhs":{"const":{"val":"5"}}}},{"or":{"vals":[{"not":{"val":{"isExecutePhase":{"threshold":"E20"}}}},{"and":{"vals":[{"not":{"val":{"spellCanCast":{"spellId":{"spellId":86346}}}}},{"auraIsInactiveWithReactionTime":{"auraId":{"spellId":85730}}},{"auraIsInactiveWithReactionTime":{"auraId":{"spellId":1719}}},{"cmp":{"op":"OpLt","lhs":{"currentRage":{}},"rhs":{"const":{"val":"50"}}}}]}}]}},{"auraIsInactiveWithReactionTime":{"auraId":{"spellId":85730}}}]}},"castSpell":{"spellId":{"spellId":2457}}}}, diff --git a/ui/warrior/arms/presets.ts b/ui/warrior/arms/presets.ts index ef961b6751..4266e08ce5 100644 --- a/ui/warrior/arms/presets.ts +++ b/ui/warrior/arms/presets.ts @@ -79,5 +79,5 @@ export const DefaultConsumes = Consumes.create({ export const OtherDefaults = { profession1: Profession.Engineering, profession2: Profession.Blacksmithing, - distanceFromTarget: 5, + distanceFromTarget: 9, };