From 1d9410e4ed371d19a6d9074cc7daf1215d31344b Mon Sep 17 00:00:00 2001 From: Kayla Glick Date: Sat, 6 Jul 2024 23:04:02 -0400 Subject: [PATCH 1/4] remove sharp restriction on elemental sharpening stone --- ui/core/components/inputs/consumables.ts | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/ui/core/components/inputs/consumables.ts b/ui/core/components/inputs/consumables.ts index 90064105ba..2dced8c8df 100644 --- a/ui/core/components/inputs/consumables.ts +++ b/ui/core/components/inputs/consumables.ts @@ -821,13 +821,9 @@ export const BlackfathomManaOil: ConsumableInputConfig = { }; // Sharpening Stones -// Original lvl 50 but not obtainable in Phase 3 -export const ElementalSharpeningStone = (slot: ItemSlot): ConsumableInputConfig => { - return { - actionId: player => player.getMatchingItemActionId([{ id: 18262, minLevel: 51 }]), - value: WeaponImbue.ElementalSharpeningStone, - showWhen: player => isSharpWeaponType(player.getEquippedItem(slot)?.item.weaponType ?? WeaponType.WeaponTypeUnknown), - }; +export const ElementalSharpeningStone: ConsumableInputConfig = { + actionId: player => player.getMatchingItemActionId([{ id: 18262, minLevel: 50 }]), + value: WeaponImbue.ElementalSharpeningStone, }; export const DenseSharpeningStone = (slot: ItemSlot): ConsumableInputConfig => { return { @@ -901,7 +897,7 @@ const CONSUMABLES_IMBUES = (slot: ItemSlot): ConsumableStatOption[] { config: MinorManaOil, stats: [Stat.StatHealingPower, Stat.StatSpellPower] }, { config: BlackfathomManaOil, stats: [Stat.StatSpellPower, Stat.StatMP5] }, - { config: ElementalSharpeningStone(slot), stats: [Stat.StatAttackPower] }, + { config: ElementalSharpeningStone, stats: [Stat.StatAttackPower] }, { config: DenseSharpeningStone(slot), stats: [Stat.StatAttackPower] }, { config: SolidSharpeningStone(slot), stats: [Stat.StatAttackPower] }, { config: BlackfathomSharpeningStone(slot), stats: [Stat.StatMeleeHit] }, From e1d99582fbf88948f9fb2c80dcfab9530fabfaaa Mon Sep 17 00:00:00 2001 From: sanguinerarogue Date: Sat, 6 Jul 2024 21:11:45 -0600 Subject: [PATCH 2/4] Adds presets for P4 --- ui/rogue/apls/Mutilate_60.apl.json | 25 +++++ ui/rogue/apls/Saber_DPS_60.apl.json | 28 ++++++ ui/rogue/apls/Slaughter_Cutthroat_60.apl.json | 24 +++++ ui/rogue/gear_sets/p4_dagger.gear.json | 21 ++++ ui/rogue/gear_sets/p4_saber.gear.json | 21 ++++ ui/rogue/presets.ts | 97 ++++++++++++++----- ui/rogue/sim.ts | 82 +++++++--------- 7 files changed, 227 insertions(+), 71 deletions(-) create mode 100644 ui/rogue/apls/Mutilate_60.apl.json create mode 100644 ui/rogue/apls/Saber_DPS_60.apl.json create mode 100644 ui/rogue/apls/Slaughter_Cutthroat_60.apl.json create mode 100644 ui/rogue/gear_sets/p4_dagger.gear.json create mode 100644 ui/rogue/gear_sets/p4_saber.gear.json diff --git a/ui/rogue/apls/Mutilate_60.apl.json b/ui/rogue/apls/Mutilate_60.apl.json new file mode 100644 index 0000000000..f255efc92b --- /dev/null +++ b/ui/rogue/apls/Mutilate_60.apl.json @@ -0,0 +1,25 @@ +{ + "type": "TypeAPL", + "prepullActions": [ + {"action":{"activateAura":{"auraId":{"spellId":1787}}},"doAtValue":{"const":{"val":"0s"}}}, + {"action":{"castSpell":{"spellId":{"spellId":20572}}},"doAtValue":{"const":{"val":"-1.5s"}}}, + {"action":{"addComboPoints":{"numPoints":"5"}},"doAtValue":{"const":{"val":"-.5s"}},"hide":true} + ], + "priorityList": [ + {"action":{"condition":{"not":{"val":{"auraIsActive":{"auraId":{"spellId":1787,"rank":4}}}}},"autocastOtherCooldowns":{}}}, + {"action":{"condition":{"or":{"vals":[{"and":{"vals":[{"runeIsEquipped":{"runeId":{"spellId":424785}}},{"cmp":{"op":"OpLt","lhs":{"auraNumStacks":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":424785,"tag":100}}},"rhs":{"const":{"val":"5"}}}},{"not":{"val":{"energyThreshold":{"threshold":20}}}}]}},{"not":{"val":{"energyThreshold":{"threshold":10}}}}]}},"castSpell":{"spellId":{"itemId":7676}}}}, + {"action":{"condition":{"and":{"vals":[{"not":{"val":{"auraIsActive":{"auraId":{"spellId":1787,"rank":4}}}}},{"auraIsActive":{"auraId":{"spellId":6774,"rank":2}}},{"or":{"vals":[{"not":{"val":{"runeIsEquipped":{"runeId":{"spellId":432276}}}}},{"auraIsActive":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":432276}}}]}}]}},"castSpell":{"spellId":{"itemId":10646}}}}, + {"action":{"condition":{"and":{"vals":[{"not":{"val":{"auraIsActive":{"auraId":{"spellId":1787,"rank":4}}}}},{"auraIsActive":{"auraId":{"spellId":6774,"rank":2}}},{"or":{"vals":[{"not":{"val":{"runeIsEquipped":{"runeId":{"spellId":432276}}}}},{"auraIsActive":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":432276}}}]}}]}},"strictSequence":{"actions":[{"castSpell":{"spellId":{"itemId":215168}}},{"castSpell":{"spellId":{"itemId":18641}}}]}}}, + {"action":{"condition":{"and":{"vals":[{"runeIsEquipped":{"runeId":{"spellId":432276}}},{"or":{"vals":[{"not":{"val":{"auraIsActive":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":432276}}}}},{"and":{"vals":[{"auraIsActive":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":11275,"rank":6}}},{"cmp":{"op":"OpLt","lhs":{"auraRemainingTime":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":11275,"rank":6}}},"rhs":{"const":{"val":"1s"}}}}]}},{"and":{"vals":[{"not":{"val":{"auraIsActive":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":11275,"rank":6}}}}},{"cmp":{"op":"OpLt","lhs":{"auraRemainingTime":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":11289}}},"rhs":{"const":{"val":"1.5s"}}}}]}}]}},{"cmp":{"op":"OpGe","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"4"}}}},{"cmp":{"op":"OpGt","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"8s"}}}},{"not":{"val":{"runeIsEquipped":{"runeId":{"spellId":424785}}}}}]}},"castSpell":{"spellId":{"spellId":11275,"rank":6}}}}, + {"action":{"condition":{"and":{"vals":[{"runeIsEquipped":{"runeId":{"spellId":432271}}},{"not":{"val":{"auraIsActive":{"auraId":{"spellId":6774,"rank":2}}}}},{"cmp":{"op":"OpGe","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"1"}}}},{"cmp":{"op":"OpGe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"10s"}}}}]}},"castSpell":{"spellId":{"spellId":6774,"rank":2}}}}, + {"action":{"condition":{"and":{"vals":[{"not":{"val":{"runeIsEquipped":{"runeId":{"spellId":432271}}}}},{"cmp":{"op":"OpLt","lhs":{"auraRemainingTime":{"auraId":{"spellId":6774,"rank":2}}},"rhs":{"const":{"val":"1s"}}}},{"cmp":{"op":"OpGe","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"4"}}}},{"cmp":{"op":"OpGe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"20"}}}}]}},"castSpell":{"spellId":{"spellId":6774,"rank":2}}}}, + {"action":{"condition":{"and":{"vals":[{"runeIsEquipped":{"runeId":{"spellId":425096}}},{"not":{"val":{"auraIsActive":{"auraId":{"spellId":425096}}}}},{"cmp":{"op":"OpEq","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"5"}}}},{"spellCanCast":{"spellId":{"spellId":399963}}}]}},"castSpell":{"spellId":{"spellId":1856}}}}, + {"action":{"condition":{"and":{"vals":[{"or":{"vals":[{"auraIsActive":{"auraId":{"spellId":425096}}},{"not":{"val":{"runeIsEquipped":{"runeId":{"spellId":425096}}}}}]}},{"cmp":{"op":"OpEq","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"5"}}}},{"spellCanCast":{"spellId":{"spellId":399963}}},{"cmp":{"op":"OpEq","lhs":{"auraNumStacks":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":11356,"tag":100,"rank":4}}},"rhs":{"const":{"val":"5"}}}}]}},"strictSequence":{"actions":[{"castSpell":{"spellId":{"spellId":14177}}},{"castSpell":{"spellId":{"spellId":399963}}}]}}}, + {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpLt","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"5"}}}},{"cmp":{"op":"OpEq","lhs":{"auraNumStacks":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":11356,"tag":100,"rank":4}}},"rhs":{"const":{"val":"5"}}}},{"cmp":{"op":"OpLe","lhs":{"currentEnergy":{}},"rhs":{"const":{"val":"75"}}}}]}},"castSpell":{"spellId":{"spellId":425012}}}}, + {"action":{"condition":{"and":{"vals":[{"not":{"val":{"runeIsEquipped":{"runeId":{"spellId":432264}}}}},{"cmp":{"op":"OpGe","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"4"}}}},{"or":{"vals":[{"energyThreshold":{"threshold":-20}},{"not":{"val":{"auraIsActive":{"auraId":{"spellId":399963}}}}},{"cmp":{"op":"OpLe","lhs":{"spellTimeToReady":{"spellId":{"spellId":425012}}},"rhs":{"const":{"val":"1"}}}},{"auraIsActive":{"auraId":{"spellId":16551}}}]}}]}},"castSpell":{"spellId":{"spellId":399963}}}}, + {"action":{"condition":{"and":{"vals":[{"runeIsEquipped":{"runeId":{"spellId":432264}}},{"or":{"vals":[{"cmp":{"op":"OpEq","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"5"}}}},{"and":{"vals":[{"cmp":{"op":"OpGe","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"4"}}}},{"energyThreshold":{"threshold":-20}}]}},{"cmp":{"op":"OpLe","lhs":{"spellTimeToReady":{"spellId":{"spellId":425012}}},"rhs":{"const":{"val":"1"}}}}]}}]}},"castSpell":{"spellId":{"spellId":399963}}}}, + {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"3s"}}}},{"cmp":{"op":"OpGe","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"2"}}}}]}},"castSpell":{"spellId":{"spellId":399963}}}}, + {"action":{"condition":{"and":{"vals":[{"runeIsEquipped":{"runeId":{"spellId":432264}}},{"or":{"vals":[{"cmp":{"op":"OpLe","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"1"}}}},{"and":{"vals":[{"or":{"vals":[{"energyThreshold":{"threshold":-20}},{"and":{"vals":[{"auraIsKnown":{"auraId":{"spellId":13750}}},{"auraIsActive":{"auraId":{"spellId":13750}}},{"energyThreshold":{"threshold":-40}}]}}]}},{"cmp":{"op":"OpLt","lhs":{"timeToEnergyTick":{}},"rhs":{"const":{"val":"1s"}}}}]}},{"and":{"vals":[{"auraIsKnown":{"auraId":{"spellId":425096}}},{"auraIsActive":{"auraId":{"spellId":425096}}},{"cmp":{"op":"OpLe","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"3"}}}}]}},{"cmp":{"op":"OpLt","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"6s"}}}}]}}]}},"castSpell":{"spellId":{"spellId":399956}}}}, + {"action":{"condition":{"and":{"vals":[{"not":{"val":{"runeIsEquipped":{"runeId":{"spellId":432264}}}}},{"cmp":{"op":"OpLe","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"3"}}}}]}},"castSpell":{"spellId":{"spellId":399956}}}} + ] +} \ No newline at end of file diff --git a/ui/rogue/apls/Saber_DPS_60.apl.json b/ui/rogue/apls/Saber_DPS_60.apl.json new file mode 100644 index 0000000000..fd74367667 --- /dev/null +++ b/ui/rogue/apls/Saber_DPS_60.apl.json @@ -0,0 +1,28 @@ +{ + "type": "TypeAPL", + "prepullActions": [ + {"action":{"activateAura":{"auraId":{"spellId":1787}}},"doAtValue":{"const":{"val":"0s"}}}, + {"action":{"castSpell":{"spellId":{"spellId":20572}}},"doAtValue":{"const":{"val":"-1.5s"}}}, + {"action":{"addComboPoints":{"numPoints":"5"}},"doAtValue":{"const":{"val":"-.5s"}},"hide":true} + ], + "priorityList": [ + {"action":{"condition":{"not":{"val":{"auraIsActive":{"auraId":{"spellId":1787,"rank":4}}}}},"autocastOtherCooldowns":{}}}, + {"action":{"condition":{"or":{"vals":[{"and":{"vals":[{"runeIsEquipped":{"runeId":{"spellId":424785}}},{"cmp":{"op":"OpLt","lhs":{"auraNumStacks":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":424785,"tag":100}}},"rhs":{"const":{"val":"3"}}}},{"not":{"val":{"energyThreshold":{"threshold":20}}}}]}},{"not":{"val":{"energyThreshold":{"threshold":10}}}}]}},"castSpell":{"spellId":{"itemId":7676}}}}, + {"action":{"condition":{"and":{"vals":[{"not":{"val":{"auraIsActive":{"auraId":{"spellId":1787,"rank":4}}}}},{"auraIsActive":{"auraId":{"spellId":6774,"rank":2}}},{"or":{"vals":[{"not":{"val":{"runeIsEquipped":{"runeId":{"spellId":432276}}}}},{"auraIsActive":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":432276}}}]}}]}},"castSpell":{"spellId":{"itemId":10646}}}}, + {"action":{"condition":{"and":{"vals":[{"not":{"val":{"auraIsActive":{"auraId":{"spellId":1787,"rank":4}}}}},{"auraIsActive":{"auraId":{"spellId":6774,"rank":2}}},{"or":{"vals":[{"not":{"val":{"runeIsEquipped":{"runeId":{"spellId":432276}}}}},{"auraIsActive":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":432276}}}]}}]}},"strictSequence":{"actions":[{"castSpell":{"spellId":{"itemId":215168}}},{"castSpell":{"spellId":{"itemId":18641}}}]}}}, + {"action":{"condition":{"and":{"vals":[{"runeIsEquipped":{"runeId":{"spellId":432271}}},{"not":{"val":{"auraIsActive":{"auraId":{"spellId":6774,"rank":2}}}}},{"cmp":{"op":"OpGe","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"1"}}}},{"cmp":{"op":"OpGe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"10s"}}}}]}},"castSpell":{"spellId":{"spellId":6774,"rank":2}}}}, + {"action":{"condition":{"and":{"vals":[{"not":{"val":{"runeIsEquipped":{"runeId":{"spellId":432271}}}}},{"cmp":{"op":"OpLt","lhs":{"auraRemainingTime":{"auraId":{"spellId":6774,"rank":2}}},"rhs":{"const":{"val":"1s"}}}},{"cmp":{"op":"OpGe","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"4"}}}},{"cmp":{"op":"OpGe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"20"}}}}]}},"castSpell":{"spellId":{"spellId":6774,"rank":2}}}}, + {"action":{"condition":{"and":{"vals":[{"runeIsEquipped":{"runeId":{"spellId":425096}}},{"not":{"val":{"auraIsActive":{"auraId":{"spellId":425096}}}}},{"cmp":{"op":"OpEq","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"5"}}}},{"spellCanCast":{"spellId":{"spellId":399963}}}]}},"castSpell":{"spellId":{"spellId":1856}}}}, + {"action":{"condition":{"and":{"vals":[{"or":{"vals":[{"auraIsActive":{"auraId":{"spellId":425096}}},{"not":{"val":{"runeIsEquipped":{"runeId":{"spellId":425096}}}}}]}},{"cmp":{"op":"OpEq","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"5"}}}},{"spellCanCast":{"spellId":{"spellId":399963}}},{"cmp":{"op":"OpEq","lhs":{"auraNumStacks":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":11355,"tag":100}}},"rhs":{"const":{"val":"5"}}}}]}},"strictSequence":{"actions":[{"castSpell":{"spellId":{"spellId":14177}}},{"castSpell":{"spellId":{"spellId":399963}}}]}}}, + {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpLt","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"5"}}}},{"cmp":{"op":"OpEq","lhs":{"auraNumStacks":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":11356,"tag":100,"rank":4}}},"rhs":{"const":{"val":"5"}}}},{"cmp":{"op":"OpLe","lhs":{"currentEnergy":{}},"rhs":{"const":{"val":"75"}}}}]}},"castSpell":{"spellId":{"spellId":425012}}}}, + {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpLe","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"4"}}}},{"cmp":{"op":"OpLt","lhs":{"auraNumStacks":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":424785,"tag":100}}},"rhs":{"const":{"val":"3"}}}}]}},"castSpell":{"spellId":{"spellId":424785}}}}, + {"action":{"castSpell":{"spellId":{"spellId":13877}}}}, + {"action":{"condition":{"and":{"vals":[{"not":{"val":{"runeIsEquipped":{"runeId":{"spellId":432264}}}}},{"cmp":{"op":"OpGe","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"4"}}}},{"or":{"vals":[{"energyThreshold":{"threshold":-20}},{"not":{"val":{"auraIsActive":{"auraId":{"spellId":399963}}}}},{"cmp":{"op":"OpLe","lhs":{"spellTimeToReady":{"spellId":{"spellId":425012}}},"rhs":{"const":{"val":"1"}}}}]}}]}},"castSpell":{"spellId":{"spellId":399963}}}}, + {"action":{"condition":{"and":{"vals":[{"runeIsEquipped":{"runeId":{"spellId":432264}}},{"or":{"vals":[{"cmp":{"op":"OpEq","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"5"}}}},{"and":{"vals":[{"cmp":{"op":"OpGe","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"4"}}}},{"energyThreshold":{"threshold":-20}}]}},{"and":{"vals":[{"cmp":{"op":"OpLe","lhs":{"spellTimeToReady":{"spellId":{"spellId":425012}}},"rhs":{"const":{"val":"1"}}}},{"cmp":{"op":"OpGe","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"4"}}}}]}}]}}]}},"castSpell":{"spellId":{"spellId":399963}}}}, + {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"3s"}}}},{"cmp":{"op":"OpGe","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"2"}}}}]}},"castSpell":{"spellId":{"spellId":399963}}}}, + {"hide":true,"action":{"condition":{"and":{"vals":[{"runeIsEquipped":{"runeId":{"spellId":432264}}},{"or":{"vals":[{"cmp":{"op":"OpLe","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"2"}}}},{"and":{"vals":[{"or":{"vals":[{"energyThreshold":{"threshold":-20}},{"and":{"vals":[{"auraIsKnown":{"auraId":{"spellId":13750}}},{"auraIsActive":{"auraId":{"spellId":13750}}},{"energyThreshold":{"threshold":-40}}]}}]}},{"cmp":{"op":"OpLt","lhs":{"timeToEnergyTick":{}},"rhs":{"const":{"val":"1s"}}}}]}},{"and":{"vals":[{"auraIsKnown":{"auraId":{"spellId":425096}}},{"auraIsActive":{"auraId":{"spellId":425096}}},{"cmp":{"op":"OpLe","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"3"}}}}]}},{"cmp":{"op":"OpLt","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"6s"}}}}]}},{"and":{"vals":[{"cmp":{"op":"OpEq","lhs":{"auraNumStacks":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":424785,"tag":100}}},"rhs":{"const":{"val":"5"}}}},{"cmp":{"op":"OpGe","lhs":{"auraRemainingTime":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":424785,"tag":100}}},"rhs":{"const":{"val":"8s"}}}}]}},{"runeIsEquipped":{"runeId":{"spellId":424785}}}]}},"castSpell":{"spellId":{"spellId":11293}}}}, + {"hide":true,"action":{"condition":{"and":{"vals":[{"not":{"val":{"runeIsEquipped":{"runeId":{"spellId":432264}}}}},{"and":{"vals":[{"cmp":{"op":"OpEq","lhs":{"auraNumStacks":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":424785,"tag":100}}},"rhs":{"const":{"val":"5"}}}},{"cmp":{"op":"OpGe","lhs":{"auraRemainingTime":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":424785,"tag":100}}},"rhs":{"const":{"val":"6s"}}}}]}},{"cmp":{"op":"OpLe","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"3"}}}},{"runeIsEquipped":{"runeId":{"spellId":424785}}}]}},"castSpell":{"spellId":{"spellId":11293}}}}, + {"action":{"condition":{"and":{"vals":[{"runeIsEquipped":{"runeId":{"spellId":432264}}},{"or":{"vals":[{"cmp":{"op":"OpLe","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"2"}}}},{"and":{"vals":[{"or":{"vals":[{"energyThreshold":{"threshold":-20}},{"and":{"vals":[{"auraIsKnown":{"auraId":{"spellId":13750}}},{"auraIsActive":{"auraId":{"spellId":13750}}},{"energyThreshold":{"threshold":-40}}]}}]}},{"cmp":{"op":"OpLt","lhs":{"timeToEnergyTick":{}},"rhs":{"const":{"val":"1s"}}}}]}},{"and":{"vals":[{"auraIsKnown":{"auraId":{"spellId":425096}}},{"auraIsActive":{"auraId":{"spellId":425096}}},{"cmp":{"op":"OpLe","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"3"}}}}]}},{"cmp":{"op":"OpLt","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"6s"}}}},{"cmp":{"op":"OpLt","lhs":{"auraRemainingTime":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":424785,"tag":100}}},"rhs":{"const":{"val":"1s"}}}}]}}]}},"castSpell":{"spellId":{"spellId":424785}}}}, + {"action":{"condition":{"and":{"vals":[{"not":{"val":{"runeIsEquipped":{"runeId":{"spellId":432264}}}}},{"cmp":{"op":"OpLe","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"3"}}}}]}},"castSpell":{"spellId":{"spellId":424785}}}} + ] +} \ No newline at end of file diff --git a/ui/rogue/apls/Slaughter_Cutthroat_60.apl.json b/ui/rogue/apls/Slaughter_Cutthroat_60.apl.json new file mode 100644 index 0000000000..7233e40cab --- /dev/null +++ b/ui/rogue/apls/Slaughter_Cutthroat_60.apl.json @@ -0,0 +1,24 @@ +{ + "type": "TypeAPL", + "prepullActions": [ + {"action":{"activateAura":{"auraId":{"spellId":1787}}},"doAtValue":{"const":{"val":"0s"}}}, + {"action":{"castSpell":{"spellId":{"spellId":20572}}},"doAtValue":{"const":{"val":"-1.5s"}}}, + {"action":{"addComboPoints":{"numPoints":"5"}},"doAtValue":{"const":{"val":"-.5s"}},"hide":true} + ], + "priorityList": [ + {"action":{"condition":{"not":{"val":{"auraIsActive":{"auraId":{"spellId":1787,"rank":4}}}}},"autocastOtherCooldowns":{}}}, + {"action":{"condition":{"and":{"vals":[{"not":{"val":{"auraIsActive":{"auraId":{"spellId":1787,"rank":4}}}}},{"auraIsActive":{"auraId":{"spellId":6774,"rank":2}}},{"or":{"vals":[{"not":{"val":{"runeIsEquipped":{"runeId":{"spellId":432276}}}}},{"auraIsActive":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":432276}}}]}}]}},"castSpell":{"spellId":{"itemId":10646}}}}, + {"action":{"condition":{"and":{"vals":[{"not":{"val":{"auraIsActive":{"auraId":{"spellId":1787,"rank":4}}}}},{"auraIsActive":{"auraId":{"spellId":6774,"rank":2}}},{"or":{"vals":[{"not":{"val":{"runeIsEquipped":{"runeId":{"spellId":432276}}}}},{"auraIsActive":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":432276}}}]}}]}},"strictSequence":{"actions":[{"castSpell":{"spellId":{"itemId":215168}}},{"castSpell":{"spellId":{"itemId":18641}}}]}}}, + {"action":{"condition":{"and":{"vals":[{"runeIsEquipped":{"runeId":{"spellId":432276}}},{"or":{"vals":[{"not":{"val":{"auraIsActive":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":432276}}}}},{"and":{"vals":[{"auraIsActive":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":11275,"rank":6}}},{"cmp":{"op":"OpLt","lhs":{"auraRemainingTime":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":11275,"rank":6}}},"rhs":{"const":{"val":"1s"}}}}]}},{"and":{"vals":[{"not":{"val":{"auraIsActive":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":11275,"rank":6}}}}},{"cmp":{"op":"OpLt","lhs":{"auraRemainingTime":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":11289}}},"rhs":{"const":{"val":"1.5s"}}}}]}}]}},{"cmp":{"op":"OpGe","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"4"}}}},{"cmp":{"op":"OpGt","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"8s"}}}},{"not":{"val":{"runeIsEquipped":{"runeId":{"spellId":424785}}}}}]}},"castSpell":{"spellId":{"spellId":11275,"rank":6}}}}, + {"action":{"condition":{"and":{"vals":[{"runeIsEquipped":{"runeId":{"spellId":432271}}},{"not":{"val":{"auraIsActive":{"auraId":{"spellId":6774,"rank":2}}}}},{"cmp":{"op":"OpGe","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"1"}}}},{"cmp":{"op":"OpGe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"10s"}}}}]}},"castSpell":{"spellId":{"spellId":6774,"rank":2}}}}, + {"action":{"condition":{"and":{"vals":[{"not":{"val":{"runeIsEquipped":{"runeId":{"spellId":432271}}}}},{"cmp":{"op":"OpLt","lhs":{"auraRemainingTime":{"auraId":{"spellId":6774,"rank":2}}},"rhs":{"const":{"val":"1s"}}}},{"cmp":{"op":"OpGe","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"4"}}}},{"cmp":{"op":"OpGe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"20"}}}}]}},"castSpell":{"spellId":{"spellId":6774,"rank":2}}}}, + {"action":{"condition":{"and":{"vals":[{"runeIsEquipped":{"runeId":{"spellId":425096}}},{"not":{"val":{"auraIsActive":{"auraId":{"spellId":425096}}}}},{"cmp":{"op":"OpEq","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"5"}}}},{"spellCanCast":{"spellId":{"spellId":399963}}}]}},"castSpell":{"spellId":{"spellId":1856}}}}, + {"action":{"condition":{"and":{"vals":[{"or":{"vals":[{"auraIsActive":{"auraId":{"spellId":425096}}},{"not":{"val":{"runeIsEquipped":{"runeId":{"spellId":425096}}}}}]}},{"cmp":{"op":"OpEq","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"5"}}}},{"spellCanCast":{"spellId":{"spellId":399963}}},{"cmp":{"op":"OpEq","lhs":{"auraNumStacks":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":11356,"tag":100,"rank":4}}},"rhs":{"const":{"val":"5"}}}}]}},"strictSequence":{"actions":[{"castSpell":{"spellId":{"spellId":14177}}},{"castSpell":{"spellId":{"spellId":399963}}}]}}}, + {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpLt","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"5"}}}},{"cmp":{"op":"OpEq","lhs":{"auraNumStacks":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":11356,"tag":100,"rank":4}}},"rhs":{"const":{"val":"5"}}}},{"cmp":{"op":"OpLe","lhs":{"currentEnergy":{}},"rhs":{"const":{"val":"85"}}}}]}},"castSpell":{"spellId":{"spellId":425012}}}}, + {"action":{"condition":{"and":{"vals":[{"not":{"val":{"runeIsEquipped":{"runeId":{"spellId":432264}}}}},{"cmp":{"op":"OpGe","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"4"}}}},{"or":{"vals":[{"energyThreshold":{"threshold":-20}},{"not":{"val":{"auraIsActive":{"auraId":{"spellId":399963}}}}},{"cmp":{"op":"OpLe","lhs":{"spellTimeToReady":{"spellId":{"spellId":425012}}},"rhs":{"const":{"val":"1"}}}}]}}]}},"castSpell":{"spellId":{"spellId":399963}}}}, + {"action":{"condition":{"and":{"vals":[{"runeIsEquipped":{"runeId":{"spellId":432264}}},{"or":{"vals":[{"cmp":{"op":"OpEq","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"5"}}}},{"and":{"vals":[{"cmp":{"op":"OpGe","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"4"}}}},{"energyThreshold":{"threshold":-20}}]}},{"cmp":{"op":"OpLe","lhs":{"spellTimeToReady":{"spellId":{"spellId":425012}}},"rhs":{"const":{"val":"1"}}}}]}}]}},"castSpell":{"spellId":{"spellId":399963}}}}, + {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"3s"}}}},{"cmp":{"op":"OpGe","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"2"}}}}]}},"castSpell":{"spellId":{"spellId":399963}}}}, + {"action":{"condition":{"cmp":{"op":"OpLe","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"4"}}}},"castSpell":{"spellId":{"spellId":11269,"rank":6}}}}, + {"action":{"condition":{"cmp":{"op":"OpLe","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"4"}}}},"castSpell":{"spellId":{"spellId":11281,"rank":8}}}} + ] +} \ No newline at end of file diff --git a/ui/rogue/gear_sets/p4_dagger.gear.json b/ui/rogue/gear_sets/p4_dagger.gear.json new file mode 100644 index 0000000000..c5c2b639eb --- /dev/null +++ b/ui/rogue/gear_sets/p4_dagger.gear.json @@ -0,0 +1,21 @@ +{ + "items": [ + {"id":226829,"enchant":1508,"rune":432256}, + {"id":228684}, + {"id":15058,"enchant":7328}, + {"id":13340,"enchant":849}, + {"id":226825,"enchant":928,"rune":399965}, + {"id":226830,"enchant":1885,"rune":432276}, + {"id":21278,"enchant":1887,"rune":399956}, + {"id":226832,"rune":425012}, + {"id":15057,"enchant":1508,"rune":399963}, + {"id":228091,"enchant":911,"rune":425096}, + {"id":228469,"rune":442887}, + {"id":228469,"rune":442896}, + {"id":221307}, + {"id":221309}, + {"id":12590,"enchant":1900}, + {"id":228472,"enchant":1900}, + {"id":228050} + ] +} \ No newline at end of file diff --git a/ui/rogue/gear_sets/p4_saber.gear.json b/ui/rogue/gear_sets/p4_saber.gear.json new file mode 100644 index 0000000000..8f6feaf3d5 --- /dev/null +++ b/ui/rogue/gear_sets/p4_saber.gear.json @@ -0,0 +1,21 @@ +{ + "items": [ + {"id":226829,"enchant":1508,"rune":432264}, + {"id":228684}, + {"id":227056,"enchant":7328}, + {"id":13340,"enchant":849}, + {"id":226825,"enchant":928,"rune":399965}, + {"id":226830,"enchant":1885,"rune":432276}, + {"id":226828,"enchant":1887,"rune":424785}, + {"id":226832,"rune":425012}, + {"id":227059,"enchant":1508,"rune":399963}, + {"id":228091,"enchant":911,"rune":425096}, + {"id":228469,"rune":442881}, + {"id":228469,"rune":442896}, + {"id":221307}, + {"id":221309}, + {"id":227991,"enchant":1900}, + {"id":228600,"enchant":1900}, + {"id":228050} + ] +} \ No newline at end of file diff --git a/ui/rogue/presets.ts b/ui/rogue/presets.ts index 27d952459b..7255cfc9c1 100644 --- a/ui/rogue/presets.ts +++ b/ui/rogue/presets.ts @@ -1,15 +1,29 @@ import { Phase } from '../core/constants/other.js'; import * as PresetUtils from '../core/preset_utils.js'; -import { AgilityElixir, Consumes, Debuffs, IndividualBuffs, Profession, RaidBuffs, StrengthBuff, TristateEffect, WeaponImbue } from '../core/proto/common.js'; +import { + AgilityElixir, + AttackPowerBuff, + Consumes, + Debuffs, + IndividualBuffs, + Profession, + RaidBuffs, + StrengthBuff, + TristateEffect, + WeaponImbue, +} from '../core/proto/common.js'; import { RogueOptions } from '../core/proto/rogue.js'; import { SavedTalents } from '../core/proto/ui.js'; import SinisterApl25 from './apls/basic_strike_25.apl.json'; import MutilateApl40 from './apls/mutilate.apl.json'; +import MutilateDPSAPL60 from './apls/Mutilate_60.apl.json'; import MutilateDPSApl50 from './apls/Mutilate_DPS_50.apl.json'; import MutilateIEAApl40 from './apls/mutilate_IEA.apl.json'; import MutilateIEAApl50 from './apls/Mutilate_IEA_50.apl.json'; import SaberDPSApl50 from './apls/Saber_DPS_50.apl.json'; +import SaberDPSAPL60 from './apls/Saber_DPS_60.apl.json'; import SaberIEAApl50 from './apls/Saber_IEA_50.apl.json'; +import SlaughterCutthroatDPSAPL60 from './apls/Slaughter_Cutthroat_60.apl.json'; import BlankGear from './gear_sets/blank.gear.json'; import P1CombatGear from './gear_sets/p1_combat.gear.json'; import P1Daggers from './gear_sets/p1_daggers.gear.json'; @@ -17,6 +31,8 @@ import P2DaggersGear from './gear_sets/p2_daggers.gear.json'; import P3MutiGear from './gear_sets/p3_muti.gear.json'; import P3MutiHatGear from './gear_sets/p3_muti_hat.gear.json'; import P3SaberGear from './gear_sets/p3_saber.gear.json'; +import P4DaggerGear from './gear_sets/p4_dagger.gear.json'; +import P4SaberGear from './gear_sets/p4_saber.gear.json'; // Preset options for this spec. // Eventually we will import these values for the raid sim too, so its good to @@ -30,19 +46,21 @@ export const GearBlank = PresetUtils.makePresetGear('Blank', BlankGear); export const P1GearDaggers = PresetUtils.makePresetGear('P1 Daggers', P1Daggers, { customCondition: player => player.getLevel() == 25 }); export const P1GearSaber = PresetUtils.makePresetGear('P1 Saber', P1CombatGear, { customCondition: player => player.getLevel() == 25 }); export const P2GearDaggers = PresetUtils.makePresetGear('P2 Daggers', P2DaggersGear, { customCondition: player => player.getLevel() == 40 }); -export const P3GearMuti = PresetUtils.makePresetGear('P3 Mutilate', P3MutiGear, { customCondition: player => player.getLevel() >= 50 }); -export const P3GearMutiHat = PresetUtils.makePresetGear('P3 Mutilate (HaT)', P3MutiHatGear, { customCondition: player => player.getLevel() >= 50 }); -export const P3GearSaber = PresetUtils.makePresetGear('P3 Saber', P3SaberGear, { customCondition: player => player.getLevel() >= 50 }); +export const P3GearMuti = PresetUtils.makePresetGear('P3 Mutilate', P3MutiGear, { customCondition: player => player.getLevel() == 50 }); +export const P3GearMutiHat = PresetUtils.makePresetGear('P3 Mutilate (HaT)', P3MutiHatGear, { customCondition: player => player.getLevel() == 50 }); +export const P3GearSaber = PresetUtils.makePresetGear('P3 Saber', P3SaberGear, { customCondition: player => player.getLevel() == 50 }); +export const P4GearDagger = PresetUtils.makePresetGear('P4 Dagger', P4DaggerGear, { customCondition: player => player.getLevel() == 60 }); +export const P4GearSaber = PresetUtils.makePresetGear('P4 Saber', P4SaberGear, { customCondition: player => player.getLevel() == 60 }); export const GearPresets = { [Phase.Phase1]: [P1GearDaggers, P1GearSaber], [Phase.Phase2]: [P2GearDaggers], [Phase.Phase3]: [P3GearMuti, P3GearMutiHat, P3GearSaber], - [Phase.Phase4]: [], + [Phase.Phase4]: [P4GearDagger, P4GearSaber], [Phase.Phase5]: [], }; -export const DefaultGear = GearPresets[Phase.Phase3][0]; +export const DefaultGear = GearPresets[Phase.Phase4][1]; /////////////////////////////////////////////////////////////////////////// // APL Presets[] @@ -56,23 +74,32 @@ export const ROTATION_PRESET_SINISTER_25 = PresetUtils.makePresetAPLRotation('P1 customCondition: player => player.getLevel() == 25, }); export const ROTATION_PRESET_MUTILATE_DPS_50 = PresetUtils.makePresetAPLRotation('P3 Mutilate DPS', MutilateDPSApl50, { - customCondition: player => player.getLevel() >= 50, + customCondition: player => player.getLevel() == 50, }); export const ROTATION_PRESET_MUTILATE_IEA_50 = PresetUtils.makePresetAPLRotation('P3 Mutilate IEA', MutilateIEAApl50, { - customCondition: player => player.getLevel() >= 50, + customCondition: player => player.getLevel() == 50, }); export const ROTATION_PRESET_SABER_SLASH_DPS_50 = PresetUtils.makePresetAPLRotation('P3 Saber Slash DPS', SaberDPSApl50, { - customCondition: player => player.getLevel() >= 50, + customCondition: player => player.getLevel() == 50, }); export const ROTATION_PRESET_SABER_SLASH_IEA_50 = PresetUtils.makePresetAPLRotation('P3 Saber Slash IEA', SaberIEAApl50, { - customCondition: player => player.getLevel() >= 50, + customCondition: player => player.getLevel() == 50, +}); +export const ROTATION_PRESET_SABER_SLASH_DPS_60 = PresetUtils.makePresetAPLRotation('P4 Saber Slash', SaberDPSAPL60, { + customCondition: player => player.getLevel() == 60, +}); +export const ROTATION_PRESET_MUTILATE_DPS_60 = PresetUtils.makePresetAPLRotation('P4 Mutilate', MutilateDPSAPL60, { + customCondition: player => player.getLevel() == 60, +}); +export const ROTATION_PRESET_SLAUGHTER_CUTTHROAT_DPS_60 = PresetUtils.makePresetAPLRotation('P4 Slaughter and Cutthroat', SlaughterCutthroatDPSAPL60, { + customCondition: player => player.getLevel() == 60, }); export const APLPresets = { [Phase.Phase1]: [ROTATION_PRESET_MUTILATE, ROTATION_PRESET_SINISTER_25], [Phase.Phase2]: [ROTATION_PRESET_MUTILATE, ROTATION_PRESET_MUTILATE_IEA], [Phase.Phase3]: [ROTATION_PRESET_MUTILATE_DPS_50, ROTATION_PRESET_SABER_SLASH_DPS_50, ROTATION_PRESET_MUTILATE_IEA_50, ROTATION_PRESET_SABER_SLASH_IEA_50], - [Phase.Phase4]: [], + [Phase.Phase4]: [ROTATION_PRESET_MUTILATE_DPS_60, ROTATION_PRESET_SLAUGHTER_CUTTHROAT_DPS_60, ROTATION_PRESET_SABER_SLASH_DPS_60], [Phase.Phase5]: [], }; @@ -92,9 +119,9 @@ export const DefaultAPLs: Record player.getLevel() >= 50, + customCondition: player => player.getLevel() == 50, }); export const P3TalentsMutiHat = PresetUtils.makePresetTalents('P3 Mutilate (HaT)', SavedTalents.create({ talentsString: '005323101551051-3203-01' }), { - customCondition: player => player.getLevel() >= 50, + customCondition: player => player.getLevel() == 50, }); export const P3TalentsSaber = PresetUtils.makePresetTalents('P3 Saber', SavedTalents.create({ talentsString: '005323101551051-320004' }), { - customCondition: player => player.getLevel() >= 50, + customCondition: player => player.getLevel() == 50, +}); + +export const P4TalentsMuti = PresetUtils.makePresetTalents('P4 Mutilate', SavedTalents.create({ talentsString: '00532310155104-02330520000501' }), { + customCondition: player => player.getLevel() == 60, +}); + +export const P4TalentsSlaughter = PresetUtils.makePresetTalents('P4 Backstab', SavedTalents.create({ talentsString: '005323105521051-023305-05' }), { + customCondition: player => player.getLevel() == 60, +}); + +export const P4TalentsSaber = PresetUtils.makePresetTalents('P4 Saber', SavedTalents.create({ talentsString: '00532310155104-02330520000501' }), { + customCondition: player => player.getLevel() == 60, }); export const TalentPresets = { [Phase.Phase1]: [CombatDagger25Talents], [Phase.Phase2]: [ColdBloodMutilate40Talents, IEAMutilate40Talents, CombatMutilate40Talents], [Phase.Phase3]: [P3TalentsMuti, P3TalentsMutiHat, P3TalentsSaber], - [Phase.Phase4]: [], - [Phase.Phase5]: [], + [Phase.Phase4]: [P4TalentsMuti, P4TalentsSlaughter, P4TalentsSaber], + [Phase.Phase5]: [P4TalentsMuti, P4TalentsSlaughter, P4TalentsSaber], }; -export const DefaultTalentsAssassin = TalentPresets[Phase.Phase3][0]; -export const DefaultTalentsCombat = TalentPresets[Phase.Phase3][0]; -export const DefaultTalentsSubtlety = TalentPresets[Phase.Phase3][0]; +export const DefaultTalentsAssassin = TalentPresets[Phase.Phase4][0]; +export const DefaultTalentsCombat = TalentPresets[Phase.Phase4][0]; +export const DefaultTalentsSubtlety = TalentPresets[Phase.Phase4][0]; export const DefaultTalents = DefaultTalentsAssassin; @@ -184,17 +223,29 @@ export const P3Consumes = Consumes.create({ offHandImbue: WeaponImbue.ShadowOil, }); +export const P4Consumes = Consumes.create({ + agilityElixir: AgilityElixir.ElixirOfTheMongoose, + dragonBreathChili: true, + attackPowerBuff: AttackPowerBuff.JujuMight, + strengthBuff: StrengthBuff.JujuPower, + mainHandImbue: WeaponImbue.WildStrikes, + offHandImbue: WeaponImbue.WizardOil, +}); + export const DefaultConsumes = { [Phase.Phase1]: P1Consumes, [Phase.Phase2]: P2Consumes, [Phase.Phase3]: P3Consumes, + [Phase.Phase4]: P4Consumes, }; export const DefaultRaidBuffs = RaidBuffs.create({ aspectOfTheLion: true, - battleShout: TristateEffect.TristateEffectRegular, + battleShout: TristateEffect.TristateEffectImproved, giftOfTheWild: TristateEffect.TristateEffectImproved, strengthOfEarthTotem: TristateEffect.TristateEffectImproved, + graceOfAirTotem: TristateEffect.TristateEffectImproved, + leaderOfThePack: true, }); export const DefaultIndividualBuffs = IndividualBuffs.create({ diff --git a/ui/rogue/sim.ts b/ui/rogue/sim.ts index b90b5c32b2..a9185a9a4e 100644 --- a/ui/rogue/sim.ts +++ b/ui/rogue/sim.ts @@ -3,18 +3,7 @@ import * as OtherInputs from '../core/components/other_inputs.js'; import { Phase } from '../core/constants/other.js'; import { IndividualSimUI, registerSpecConfig } from '../core/individual_sim_ui.js'; import { Player } from '../core/player.js'; -import { - Class, - Faction, - ItemSlot, - PartyBuffs, - PseudoStat, - Race, - Spec, - Stat, - Target, - WeaponType -} from '../core/proto/common.js'; +import { Class, Faction, ItemSlot, PartyBuffs, PseudoStat, Race, Spec, Stat, Target, WeaponType } from '../core/proto/common.js'; import { Stats } from '../core/proto_utils/stats.js'; import { getSpecIcon } from '../core/proto_utils/utils.js'; import { HonorOfThievesCritRate } from './inputs'; @@ -24,15 +13,13 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecRogue, { cssClass: 'rogue-sim-ui', cssScheme: 'rogue', // List any known bugs / issues here and they'll be shown on the site. - knownIssues: [ - 'Rotations are not fully optimized, especially for non-standard setups.', - ], + knownIssues: ['Rotations are not fully optimized, especially for non-standard setups.'], warnings: [ (simUI: IndividualSimUI) => { return { updateOn: simUI.sim.encounter.changeEmitter, getContent: () => { - const hasNoArmor = !!(simUI.sim.encounter.targets ?? []).find((target: Target) => new Stats(target.stats).getStat(Stat.StatArmor) <= 0) + const hasNoArmor = !!(simUI.sim.encounter.targets ?? []).find((target: Target) => new Stats(target.stats).getStat(Stat.StatArmor) <= 0); if (hasNoArmor) { return 'One or more targets have no armor. Check advanced encounter settings.'; } else { @@ -46,8 +33,10 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecRogue, { updateOn: simUI.player.changeEmitter, getContent: () => { if (simUI.player.getTalents().maceSpecialization) { - if (simUI.player.getGear().getEquippedItem(ItemSlot.ItemSlotMainHand)?.item.weaponType == WeaponType.WeaponTypeMace || - simUI.player.getGear().getEquippedItem(ItemSlot.ItemSlotOffHand)?.item.weaponType == WeaponType.WeaponTypeMace) { + if ( + simUI.player.getGear().getEquippedItem(ItemSlot.ItemSlotMainHand)?.item.weaponType == WeaponType.WeaponTypeMace || + simUI.player.getGear().getEquippedItem(ItemSlot.ItemSlotOffHand)?.item.weaponType == WeaponType.WeaponTypeMace + ) { return ''; } else { return '"Mace Specialization" talent selected, but maces not equipped.'; @@ -74,10 +63,7 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecRogue, { Stat.StatSpellCrit, Stat.StatMeleeHaste, ], - epPseudoStats: [ - PseudoStat.PseudoStatMainHandDps, - PseudoStat.PseudoStatOffHandDps, - ], + epPseudoStats: [PseudoStat.PseudoStatMainHandDps, PseudoStat.PseudoStatOffHandDps], // Reference stat against which to calculate EP. epReferenceStat: Stat.StatAttackPower, // Which stats to display in the Character Stats section, at the bottom of the left-hand sidebar. @@ -99,25 +85,27 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecRogue, { // Default equipped gear. gear: Presets.DefaultGear.gear, // Default EP weights for sorting gear in the gear picker. - epWeights: Stats.fromMap({ - [Stat.StatAgility]: 1.69, - [Stat.StatStrength]: 1.10, - [Stat.StatAttackPower]: 1, - [Stat.StatSpellDamage]: .68, - [Stat.StatNaturePower]: .68, - [Stat.StatSpellCrit]: 2.0, - [Stat.StatSpellHit]: 5.54, - [Stat.StatMeleeHit]: 14.2, - [Stat.StatMeleeCrit]: 8.64, - [Stat.StatMeleeHaste]: 6.51, - }, { - [PseudoStat.PseudoStatMainHandDps]: 2.94, - [PseudoStat.PseudoStatOffHandDps]: 2.45, - }), - + epWeights: Stats.fromMap( + { + [Stat.StatAgility]: 1.23, + [Stat.StatStrength]: 1.64, + [Stat.StatAttackPower]: 1.0, + [Stat.StatSpellDamage]: 1.09, + [Stat.StatNaturePower]: 0.81, + [Stat.StatSpellCrit]: 4.93, + [Stat.StatSpellHit]: 11.94, + [Stat.StatMeleeHit]: 14.11, + [Stat.StatMeleeCrit]: 25.97, + [Stat.StatMeleeHaste]: 14.51, + }, + { + [PseudoStat.PseudoStatMainHandDps]: 4.05, + [PseudoStat.PseudoStatOffHandDps]: 2.74, + }, + ), // Default consumes settings. - consumes: Presets.DefaultConsumes[Phase.Phase3], + consumes: Presets.DefaultConsumes[Phase.Phase4], // Default talents. talents: Presets.DefaultTalents.data, // Default spec-specific settings. @@ -131,7 +119,7 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecRogue, { }, playerInputs: { - inputs: [] + inputs: [], }, // IconInputs to include in the 'Player' section on the settings tab. playerIconInputs: [], @@ -142,17 +130,12 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecRogue, { BuffDebuffInputs.NatureSpellDamageDebuff, BuffDebuffInputs.MekkatorqueFistDebuff, BuffDebuffInputs.SpellScorchDebuff, - BuffDebuffInputs.PowerInfusion - ], - excludeBuffDebuffInputs: [ + BuffDebuffInputs.PowerInfusion, ], + excludeBuffDebuffInputs: [], // Inputs to include in the 'Other' section on the settings tab. otherInputs: { - inputs: [ - OtherInputs.TankAssignment, - OtherInputs.InFrontOfTarget, - HonorOfThievesCritRate, - ], + inputs: [OtherInputs.TankAssignment, OtherInputs.InFrontOfTarget, HonorOfThievesCritRate], }, encounterPicker: { // Whether to include 'Execute Duration (%)' in the 'Encounter' section of the settings tab. @@ -162,18 +145,21 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecRogue, { presets: { // Preset talents that the user can quickly select. talents: [ + ...Presets.TalentPresets[Phase.Phase4], ...Presets.TalentPresets[Phase.Phase3], ...Presets.TalentPresets[Phase.Phase2], ...Presets.TalentPresets[Phase.Phase1], ], // Preset rotations that the user can quickly select. rotations: [ + ...Presets.APLPresets[Phase.Phase4], ...Presets.APLPresets[Phase.Phase3], ...Presets.APLPresets[Phase.Phase2], ...Presets.APLPresets[Phase.Phase1], ], // Preset gear configurations that the user can quickly select. gear: [ + ...Presets.GearPresets[Phase.Phase4], ...Presets.GearPresets[Phase.Phase3], ...Presets.GearPresets[Phase.Phase2], ...Presets.GearPresets[Phase.Phase1], From 208197100f585e836cf8eb07272449a24abf4101 Mon Sep 17 00:00:00 2001 From: Kayla Glick Date: Sat, 6 Jul 2024 23:27:49 -0400 Subject: [PATCH 3/4] fix bloodfury str=>ap conversion --- sim/core/base_stats.go | 12 +++++ sim/core/racials.go | 2 +- sim/druid/druid.go | 2 +- sim/hunter/TestBM.results | 46 +++++++++--------- sim/hunter/TestSV.results | 44 ++++++++--------- sim/hunter/hunter.go | 2 +- sim/mage/TestArcane.results | 4 +- sim/mage/TestFire.results | 6 +-- sim/mage/TestFrost.results | 4 +- sim/mage/mage.go | 1 + sim/paladin/paladin.go | 2 +- sim/priest/priest.go | 1 + sim/priest/shadow/TestShadow.results | 8 ++-- sim/rogue/dps_rogue/TestAssassination.results | 48 +++++++++---------- sim/rogue/dps_rogue/TestCombat.results | 24 +++++----- sim/rogue/rogue.go | 2 +- sim/shaman/shaman.go | 2 +- sim/warlock/tank/TestDemonology.results | 18 +++---- sim/warlock/tank/TestDestruction.results | 32 ++++++------- sim/warlock/warlock.go | 3 +- sim/warrior/warrior.go | 4 +- 21 files changed, 140 insertions(+), 127 deletions(-) diff --git a/sim/core/base_stats.go b/sim/core/base_stats.go index 5af4741169..5d5b1be474 100644 --- a/sim/core/base_stats.go +++ b/sim/core/base_stats.go @@ -130,6 +130,18 @@ var ClassBaseCrit = map[proto.Class]stats.Stats{ }, } +var APPerStrength = map[proto.Class]float64{ + proto.Class_ClassWarrior: 2, + proto.Class_ClassPaladin: 2, + proto.Class_ClassHunter: 1, + proto.Class_ClassRogue: 1, + proto.Class_ClassPriest: 1, + proto.Class_ClassShaman: 2, + proto.Class_ClassMage: 1, + proto.Class_ClassWarlock: 1, + proto.Class_ClassDruid: 2, +} + // Melee/Ranged crit agi scaling var CritPerAgiAtLevel = map[proto.Class]map[int]float64{ proto.Class_ClassUnknown: {25: 0.0, 40: 0.0, 50: 0.0, 60: 0.0}, diff --git a/sim/core/racials.go b/sim/core/racials.go index 9727f79150..71ba141aa7 100644 --- a/sim/core/racials.go +++ b/sim/core/racials.go @@ -78,7 +78,7 @@ func applyRaceEffects(agent Agent) { Duration: time.Second * 15, // Tooltip is misleading; ap bonus is base AP plus AP from current strength, does not include +attackpower on items/buffs OnGain: func(aura *Aura, sim *Simulation) { - bloodFuryAP = (character.GetBaseStats()[stats.AttackPower] + (character.GetStat(stats.Strength) * 2)) * 0.25 + bloodFuryAP = (character.GetBaseStats()[stats.AttackPower] + (character.GetStat(stats.Strength) * APPerStrength[character.Class])) * 0.25 character.AddStatDynamic(sim, stats.AttackPower, bloodFuryAP) }, diff --git a/sim/druid/druid.go b/sim/druid/druid.go index 30d983ea15..9901eeec83 100644 --- a/sim/druid/druid.go +++ b/sim/druid/druid.go @@ -256,7 +256,7 @@ func New(character *core.Character, form DruidForm, selfBuffs SelfBuffs, talents druid.EnableManaBar() // TODO: Class druid physical stats - druid.AddStatDependency(stats.Strength, stats.AttackPower, 2) + druid.AddStatDependency(stats.Strength, stats.AttackPower, core.APPerStrength[character.Class]) druid.AddStatDependency(stats.BonusArmor, stats.Armor, 1) druid.AddStatDependency(stats.Agility, stats.MeleeCrit, core.CritPerAgiAtLevel[character.Class][int(druid.Level)]*core.CritRatingPerCritChance) druid.AddStatDependency(stats.Intellect, stats.SpellCrit, core.CritPerIntAtLevel[character.Class][int(druid.Level)]*core.SpellCritRatingPerCritChance) diff --git a/sim/hunter/TestBM.results b/sim/hunter/TestBM.results index ef0f2c9e75..09972fe65e 100644 --- a/sim/hunter/TestBM.results +++ b/sim/hunter/TestBM.results @@ -149,7 +149,7 @@ stat_weights_results: { key: "TestBM-Lvl40-StatWeights-Default" value: { weights: 0 - weights: 0.8085 + weights: 0.8079 weights: 0 weights: 0 weights: 0 @@ -166,8 +166,8 @@ stat_weights_results: { weights: 0 weights: 0 weights: 0.31124 - weights: 8.46821 - weights: 7.64026 + weights: 8.44271 + weights: 7.62158 weights: 0 weights: 0 weights: 0 @@ -302,22 +302,22 @@ dps_results: { dps_results: { key: "TestBM-Lvl40-AllItems-BeastmasterArmor" value: { - dps: 527.83604 - tps: 239.75095 + dps: 527.06296 + tps: 238.97786 } } dps_results: { key: "TestBM-Lvl40-AllItems-SignetofBeasts-209823" value: { - dps: 838.59889 - tps: 321.29786 + dps: 836.59954 + tps: 320.1109 } } dps_results: { key: "TestBM-Lvl40-Average-Default" value: { - dps: 849.12016 - tps: 328.13556 + dps: 847.09336 + tps: 326.90583 } } dps_results: { @@ -491,43 +491,43 @@ dps_results: { dps_results: { key: "TestBM-Lvl40-Settings-Orc-p2_melee-Basic-p2_melee-FullBuffs-Phase 2 Consumes-LongMultiTarget" value: { - dps: 1635.24911 - tps: 992.4943 + dps: 1630.77885 + tps: 990.55107 } } dps_results: { key: "TestBM-Lvl40-Settings-Orc-p2_melee-Basic-p2_melee-FullBuffs-Phase 2 Consumes-LongSingleTarget" value: { - dps: 745.63236 - tps: 236.04306 + dps: 744.69965 + tps: 235.90031 } } dps_results: { key: "TestBM-Lvl40-Settings-Orc-p2_melee-Basic-p2_melee-FullBuffs-Phase 2 Consumes-ShortSingleTarget" value: { - dps: 788.82445 - tps: 249.1845 + dps: 787.53742 + tps: 249.04312 } } dps_results: { key: "TestBM-Lvl40-Settings-Orc-p2_melee-Basic-p2_melee-NoBuffs-Phase 2 Consumes-LongMultiTarget" value: { - dps: 865.15225 - tps: 634.09869 + dps: 863.26146 + tps: 633.2562 } } dps_results: { key: "TestBM-Lvl40-Settings-Orc-p2_melee-Basic-p2_melee-NoBuffs-Phase 2 Consumes-LongSingleTarget" value: { - dps: 373.97251 - tps: 129.19582 + dps: 373.62562 + tps: 129.14291 } } dps_results: { key: "TestBM-Lvl40-Settings-Orc-p2_melee-Basic-p2_melee-NoBuffs-Phase 2 Consumes-ShortSingleTarget" value: { - dps: 407.26555 - tps: 135.24739 + dps: 406.77043 + tps: 135.17851 } } dps_results: { @@ -659,7 +659,7 @@ dps_results: { dps_results: { key: "TestBM-Lvl40-SwitchInFrontOfTarget-Default" value: { - dps: 805.77815 - tps: 300.9746 + dps: 803.96822 + tps: 299.90694 } } diff --git a/sim/hunter/TestSV.results b/sim/hunter/TestSV.results index 2d4f79c0b5..edf36daac8 100644 --- a/sim/hunter/TestSV.results +++ b/sim/hunter/TestSV.results @@ -166,8 +166,8 @@ stat_weights_results: { weights: 0 weights: 0 weights: 0.35631 - weights: 0.43666 - weights: 6.71901 + weights: 0.36455 + weights: 6.70309 weights: 0 weights: 0 weights: 0 @@ -302,22 +302,22 @@ dps_results: { dps_results: { key: "TestSV-Lvl40-AllItems-BeastmasterArmor" value: { - dps: 435.22146 - tps: 272.1554 + dps: 434.39369 + tps: 271.32762 } } dps_results: { key: "TestSV-Lvl40-AllItems-SignetofBeasts-209823" value: { - dps: 792.67024 - tps: 356.36949 + dps: 790.46674 + tps: 355.09957 } } dps_results: { key: "TestSV-Lvl40-Average-Default" value: { - dps: 801.81039 - tps: 362.65002 + dps: 799.53008 + tps: 361.30319 } } dps_results: { @@ -365,49 +365,49 @@ dps_results: { dps_results: { key: "TestSV-Lvl40-Settings-Orc-p2_melee-Basic-p2_melee-FullBuffs-Phase 2 Consumes-LongMultiTarget" value: { - dps: 1622.39123 - tps: 1026.15453 + dps: 1617.31294 + tps: 1023.9301 } } dps_results: { key: "TestSV-Lvl40-Settings-Orc-p2_melee-Basic-p2_melee-FullBuffs-Phase 2 Consumes-LongSingleTarget" value: { - dps: 663.99075 - tps: 245.00558 + dps: 662.87964 + tps: 244.83736 } } dps_results: { key: "TestSV-Lvl40-Settings-Orc-p2_melee-Basic-p2_melee-FullBuffs-Phase 2 Consumes-ShortSingleTarget" value: { - dps: 682.32512 - tps: 258.2862 + dps: 680.75712 + tps: 258.06929 } } dps_results: { key: "TestSV-Lvl40-Settings-Orc-p2_melee-Basic-p2_melee-NoBuffs-Phase 2 Consumes-LongMultiTarget" value: { - dps: 859.13143 - tps: 636.55664 + dps: 856.99433 + tps: 635.62351 } } dps_results: { key: "TestSV-Lvl40-Settings-Orc-p2_melee-Basic-p2_melee-NoBuffs-Phase 2 Consumes-LongSingleTarget" value: { - dps: 338.27763 - tps: 134.99062 + dps: 337.85046 + tps: 134.93215 } } dps_results: { key: "TestSV-Lvl40-Settings-Orc-p2_melee-Basic-p2_melee-NoBuffs-Phase 2 Consumes-ShortSingleTarget" value: { - dps: 360.65389 - tps: 138.63798 + dps: 359.98879 + tps: 138.54583 } } dps_results: { key: "TestSV-Lvl40-SwitchInFrontOfTarget-Default" value: { - dps: 758.75605 - tps: 337.89003 + dps: 756.63543 + tps: 336.64431 } } diff --git a/sim/hunter/hunter.go b/sim/hunter/hunter.go index d2ca3178f6..bbd5681e5a 100644 --- a/sim/hunter/hunter.go +++ b/sim/hunter/hunter.go @@ -260,7 +260,7 @@ func NewHunter(character *core.Character, options *proto.Player) *Hunter { hunter.pet = hunter.NewHunterPet() - hunter.AddStatDependency(stats.Strength, stats.AttackPower, 1) + hunter.AddStatDependency(stats.Strength, stats.AttackPower, core.APPerStrength[character.Class]) hunter.AddStatDependency(stats.Agility, stats.AttackPower, 1) hunter.AddStatDependency(stats.Agility, stats.RangedAttackPower, 2) hunter.AddStatDependency(stats.Agility, stats.MeleeCrit, core.CritPerAgiAtLevel[character.Class][int(character.Level)]*core.CritRatingPerCritChance) diff --git a/sim/mage/TestArcane.results b/sim/mage/TestArcane.results index 667e6624ac..789f70a46c 100644 --- a/sim/mage/TestArcane.results +++ b/sim/mage/TestArcane.results @@ -18,7 +18,7 @@ character_stats_results: { final_stats: 30.39344 final_stats: 0 final_stats: 0 - final_stats: 328 + final_stats: 406.4 final_stats: 2 final_stats: 8.2 final_stats: 0 @@ -67,7 +67,7 @@ character_stats_results: { final_stats: 50.2224 final_stats: 0 final_stats: 0 - final_stats: 1042 + final_stats: 1201.5 final_stats: 2 final_stats: 18.2 final_stats: 0 diff --git a/sim/mage/TestFire.results b/sim/mage/TestFire.results index a66e6be9dd..9c4db658cd 100644 --- a/sim/mage/TestFire.results +++ b/sim/mage/TestFire.results @@ -18,7 +18,7 @@ character_stats_results: { final_stats: 30.39344 final_stats: 0 final_stats: 0 - final_stats: 328 + final_stats: 406.4 final_stats: 2 final_stats: 8.2 final_stats: 0 @@ -67,7 +67,7 @@ character_stats_results: { final_stats: 42.9179 final_stats: 0 final_stats: 0 - final_stats: 460 + final_stats: 572.28 final_stats: 0 final_stats: 19.2 final_stats: 0 @@ -116,7 +116,7 @@ character_stats_results: { final_stats: 50.25936 final_stats: 0 final_stats: 0 - final_stats: 1042 + final_stats: 1201.5 final_stats: 2 final_stats: 18.2 final_stats: 0 diff --git a/sim/mage/TestFrost.results b/sim/mage/TestFrost.results index 67b5b883ae..11099a4cf6 100644 --- a/sim/mage/TestFrost.results +++ b/sim/mage/TestFrost.results @@ -18,7 +18,7 @@ character_stats_results: { final_stats: 23.04324 final_stats: 0 final_stats: 0 - final_stats: 460 + final_stats: 572.28 final_stats: 0 final_stats: 19.2 final_stats: 0 @@ -67,7 +67,7 @@ character_stats_results: { final_stats: 13.1808 final_stats: 0 final_stats: 0 - final_stats: -10 + final_stats: 24 final_stats: 2 final_stats: 5.2 final_stats: 0 diff --git a/sim/mage/mage.go b/sim/mage/mage.go index 72f07b19d5..bee5ca23d4 100644 --- a/sim/mage/mage.go +++ b/sim/mage/mage.go @@ -153,6 +153,7 @@ func NewMage(character *core.Character, options *proto.Player) *Mage { mage.EnableManaBar() + mage.AddStatDependency(stats.Strength, stats.AttackPower, core.APPerStrength[character.Class]) mage.AddStatDependency(stats.Intellect, stats.SpellCrit, core.CritPerIntAtLevel[mage.Class][int(mage.Level)]*core.SpellCritRatingPerCritChance) switch mage.Options.Armor { diff --git a/sim/paladin/paladin.go b/sim/paladin/paladin.go index 761dd46cd1..0f491b85e6 100644 --- a/sim/paladin/paladin.go +++ b/sim/paladin/paladin.go @@ -91,7 +91,7 @@ func NewPaladin(character *core.Character, talentsStr string) *Paladin { paladin.PseudoStats.CanParry = true paladin.EnableManaBar() - paladin.AddStatDependency(stats.Strength, stats.AttackPower, 2.0) + paladin.AddStatDependency(stats.Strength, stats.AttackPower, core.APPerStrength[character.Class]) paladin.AddStatDependency(stats.Agility, stats.MeleeCrit, core.CritPerAgiAtLevel[character.Class][int(paladin.Level)]*core.CritRatingPerCritChance) paladin.AddStatDependency(stats.Intellect, stats.SpellCrit, core.CritPerIntAtLevel[character.Class][int(paladin.Level)]*core.SpellCritRatingPerCritChance) diff --git a/sim/priest/priest.go b/sim/priest/priest.go index 89d373eb1f..288bb7f6e0 100644 --- a/sim/priest/priest.go +++ b/sim/priest/priest.go @@ -133,6 +133,7 @@ func New(character *core.Character, talents string) *Priest { priest.EnableManaBar() + priest.AddStatDependency(stats.Strength, stats.AttackPower, core.APPerStrength[character.Class]) priest.AddStatDependency(stats.Intellect, stats.SpellCrit, core.CritPerIntAtLevel[priest.Class][int(priest.Level)]*core.SpellCritRatingPerCritChance) // Set mana regen to 12.5 + Spirit/4 each 2s tick diff --git a/sim/priest/shadow/TestShadow.results b/sim/priest/shadow/TestShadow.results index d0c6c17e02..2c55b25efa 100644 --- a/sim/priest/shadow/TestShadow.results +++ b/sim/priest/shadow/TestShadow.results @@ -18,7 +18,7 @@ character_stats_results: { final_stats: 6.93294 final_stats: 0 final_stats: 10 - final_stats: 207 + final_stats: 265.2 final_stats: 1 final_stats: 5 final_stats: 0 @@ -67,7 +67,7 @@ character_stats_results: { final_stats: 13.48128 final_stats: 0 final_stats: 0 - final_stats: 328 + final_stats: 415.2 final_stats: 2 final_stats: 6 final_stats: 0 @@ -116,7 +116,7 @@ character_stats_results: { final_stats: 20.9776 final_stats: 0 final_stats: 0 - final_stats: 460 + final_stats: 577.032 final_stats: 3 final_stats: 17 final_stats: 0 @@ -165,7 +165,7 @@ character_stats_results: { final_stats: 28.04832 final_stats: 0 final_stats: 0 - final_stats: 1042 + final_stats: 1207 final_stats: 3 final_stats: 17 final_stats: 0 diff --git a/sim/rogue/dps_rogue/TestAssassination.results b/sim/rogue/dps_rogue/TestAssassination.results index a370eb12c6..025f9e8781 100644 --- a/sim/rogue/dps_rogue/TestAssassination.results +++ b/sim/rogue/dps_rogue/TestAssassination.results @@ -253,43 +253,43 @@ dps_results: { dps_results: { key: "TestAssassination-Lvl25-Settings-Orc-p1_daggers-No Poisons-mutilate-FullBuffs-Phase 1 Consumes-LongMultiTarget" value: { - dps: 131.7088 - tps: 93.51325 + dps: 131.16598 + tps: 93.12785 } } dps_results: { key: "TestAssassination-Lvl25-Settings-Orc-p1_daggers-No Poisons-mutilate-FullBuffs-Phase 1 Consumes-LongSingleTarget" value: { - dps: 131.7088 - tps: 93.51325 + dps: 131.16598 + tps: 93.12785 } } dps_results: { key: "TestAssassination-Lvl25-Settings-Orc-p1_daggers-No Poisons-mutilate-FullBuffs-Phase 1 Consumes-ShortSingleTarget" value: { - dps: 141.28421 - tps: 100.31179 + dps: 140.20728 + tps: 99.54717 } } dps_results: { key: "TestAssassination-Lvl25-Settings-Orc-p1_daggers-No Poisons-mutilate-NoBuffs-Phase 1 Consumes-LongMultiTarget" value: { - dps: 61.54616 - tps: 43.69777 + dps: 61.31141 + tps: 43.5311 } } dps_results: { key: "TestAssassination-Lvl25-Settings-Orc-p1_daggers-No Poisons-mutilate-NoBuffs-Phase 1 Consumes-LongSingleTarget" value: { - dps: 61.54616 - tps: 43.69777 + dps: 61.31141 + tps: 43.5311 } } dps_results: { key: "TestAssassination-Lvl25-Settings-Orc-p1_daggers-No Poisons-mutilate-NoBuffs-Phase 1 Consumes-ShortSingleTarget" value: { - dps: 65.37916 - tps: 46.4192 + dps: 64.90476 + tps: 46.08238 } } dps_results: { @@ -358,43 +358,43 @@ dps_results: { dps_results: { key: "TestAssassination-Lvl40-Settings-Orc-p2_daggers-No Poisons-mutilate-FullBuffs-Phase 2 Consumes-LongMultiTarget" value: { - dps: 295.77694 - tps: 210.00163 + dps: 294.21124 + tps: 208.88998 } } dps_results: { key: "TestAssassination-Lvl40-Settings-Orc-p2_daggers-No Poisons-mutilate-FullBuffs-Phase 2 Consumes-LongSingleTarget" value: { - dps: 295.77694 - tps: 210.00163 + dps: 294.21124 + tps: 208.88998 } } dps_results: { key: "TestAssassination-Lvl40-Settings-Orc-p2_daggers-No Poisons-mutilate-FullBuffs-Phase 2 Consumes-ShortSingleTarget" value: { - dps: 320.56003 - tps: 227.59762 + dps: 317.15897 + tps: 225.18287 } } dps_results: { key: "TestAssassination-Lvl40-Settings-Orc-p2_daggers-No Poisons-mutilate-NoBuffs-Phase 2 Consumes-LongMultiTarget" value: { - dps: 156.66349 - tps: 111.23108 + dps: 155.90753 + tps: 110.69434 } } dps_results: { key: "TestAssassination-Lvl40-Settings-Orc-p2_daggers-No Poisons-mutilate-NoBuffs-Phase 2 Consumes-LongSingleTarget" value: { - dps: 156.66349 - tps: 111.23108 + dps: 155.90753 + tps: 110.69434 } } dps_results: { key: "TestAssassination-Lvl40-Settings-Orc-p2_daggers-No Poisons-mutilate-NoBuffs-Phase 2 Consumes-ShortSingleTarget" value: { - dps: 168.06366 - tps: 119.3252 + dps: 166.41612 + tps: 118.15545 } } dps_results: { diff --git a/sim/rogue/dps_rogue/TestCombat.results b/sim/rogue/dps_rogue/TestCombat.results index 60ef643541..b5f8269208 100644 --- a/sim/rogue/dps_rogue/TestCombat.results +++ b/sim/rogue/dps_rogue/TestCombat.results @@ -358,43 +358,43 @@ dps_results: { dps_results: { key: "TestCombat-Lvl40-Settings-Orc-p2_daggers-No Poisons-mutilate-FullBuffs-Phase 2 Consumes-LongMultiTarget" value: { - dps: 223.44004 - tps: 158.64243 + dps: 221.66081 + tps: 157.37918 } } dps_results: { key: "TestCombat-Lvl40-Settings-Orc-p2_daggers-No Poisons-mutilate-FullBuffs-Phase 2 Consumes-LongSingleTarget" value: { - dps: 193.33138 - tps: 137.26528 + dps: 192.32796 + tps: 136.55285 } } dps_results: { key: "TestCombat-Lvl40-Settings-Orc-p2_daggers-No Poisons-mutilate-FullBuffs-Phase 2 Consumes-ShortSingleTarget" value: { - dps: 255.18255 - tps: 181.17961 + dps: 252.34822 + tps: 179.16724 } } dps_results: { key: "TestCombat-Lvl40-Settings-Orc-p2_daggers-No Poisons-mutilate-NoBuffs-Phase 2 Consumes-LongMultiTarget" value: { - dps: 117.49761 - tps: 83.4233 + dps: 116.66216 + tps: 82.83013 } } dps_results: { key: "TestCombat-Lvl40-Settings-Orc-p2_daggers-No Poisons-mutilate-NoBuffs-Phase 2 Consumes-LongSingleTarget" value: { - dps: 102.13979 - tps: 72.51925 + dps: 101.66278 + tps: 72.18058 } } dps_results: { key: "TestCombat-Lvl40-Settings-Orc-p2_daggers-No Poisons-mutilate-NoBuffs-Phase 2 Consumes-ShortSingleTarget" value: { - dps: 134.24229 - tps: 95.31203 + dps: 132.8841 + tps: 94.34771 } } dps_results: { diff --git a/sim/rogue/rogue.go b/sim/rogue/rogue.go index 872ad7898d..3966b0c9c9 100644 --- a/sim/rogue/rogue.go +++ b/sim/rogue/rogue.go @@ -170,7 +170,7 @@ func NewRogue(character *core.Character, options *proto.Player, rogueOptions *pr }) rogue.applyPoisons() - rogue.AddStatDependency(stats.Strength, stats.AttackPower, 1) + rogue.AddStatDependency(stats.Strength, stats.AttackPower, core.APPerStrength[character.Class]) rogue.AddStatDependency(stats.Agility, stats.AttackPower, 1) rogue.AddStatDependency(stats.Agility, stats.RangedAttackPower, 1) rogue.AddStatDependency(stats.Agility, stats.MeleeCrit, core.CritPerAgiAtLevel[character.Class][int(rogue.Level)]*core.CritRatingPerCritChance) diff --git a/sim/shaman/shaman.go b/sim/shaman/shaman.go index 1ae1a7961e..69c4706588 100644 --- a/sim/shaman/shaman.go +++ b/sim/shaman/shaman.go @@ -28,7 +28,7 @@ func NewShaman(character *core.Character, talents string) *Shaman { shaman.EnableManaBar() // Add Shaman stat dependencies - shaman.AddStatDependency(stats.Strength, stats.AttackPower, 2) + shaman.AddStatDependency(stats.Strength, stats.AttackPower, core.APPerStrength[character.Class]) shaman.AddStatDependency(stats.Agility, stats.MeleeCrit, core.CritPerAgiAtLevel[character.Class][int(shaman.Level)]*core.CritRatingPerCritChance) shaman.AddStatDependency(stats.Intellect, stats.SpellCrit, core.CritPerIntAtLevel[character.Class][int(shaman.Level)]*core.SpellCritRatingPerCritChance) shaman.AddStatDependency(stats.BonusArmor, stats.Armor, 1) diff --git a/sim/warlock/tank/TestDemonology.results b/sim/warlock/tank/TestDemonology.results index 13270634d0..6e6c080d1e 100644 --- a/sim/warlock/tank/TestDemonology.results +++ b/sim/warlock/tank/TestDemonology.results @@ -53,9 +53,9 @@ stat_weights_results: { weights: 0 weights: 0 weights: 0 - weights: 0.23519 + weights: 0.23486 weights: 0 - weights: 0.72341 + weights: 0.72345 weights: 0 weights: 0 weights: 0 @@ -63,7 +63,7 @@ stat_weights_results: { weights: 0 weights: 0 weights: 0 - weights: 5.96036 + weights: 5.95994 weights: 1.47474 weights: 0 weights: 0 @@ -99,15 +99,15 @@ stat_weights_results: { dps_results: { key: "TestDemonology-Lvl40-AllItems-DeathmistRaiment" value: { - dps: 257.32939 - tps: 146.08926 + dps: 257.18706 + tps: 145.94692 } } dps_results: { key: "TestDemonology-Lvl40-Average-Default" value: { - dps: 545.64793 - tps: 986.91034 + dps: 545.54 + tps: 986.74844 } } dps_results: { @@ -155,7 +155,7 @@ dps_results: { dps_results: { key: "TestDemonology-Lvl40-SwitchInFrontOfTarget-Default" value: { - dps: 539.17506 - tps: 976.57408 + dps: 539.0973 + tps: 976.45744 } } diff --git a/sim/warlock/tank/TestDestruction.results b/sim/warlock/tank/TestDestruction.results index a1a26358e8..3d4ce29f3d 100644 --- a/sim/warlock/tank/TestDestruction.results +++ b/sim/warlock/tank/TestDestruction.results @@ -200,7 +200,7 @@ stat_weights_results: { weights: 0 weights: 0 weights: 0 - weights: -0.24876 + weights: -0.24874 weights: 0 weights: 0.63064 weights: 0 @@ -210,7 +210,7 @@ stat_weights_results: { weights: 0 weights: 0 weights: 0 - weights: 5.76186 + weights: 5.76182 weights: 2.61946 weights: 0 weights: 0 @@ -249,9 +249,9 @@ stat_weights_results: { weights: 0 weights: 0 weights: 0 - weights: -0.75862 + weights: -0.76078 weights: 0 - weights: 2.1923 + weights: 2.19305 weights: 0 weights: 0 weights: 0 @@ -358,15 +358,15 @@ dps_results: { dps_results: { key: "TestDestruction-Lvl40-AllItems-DeathmistRaiment" value: { - dps: 128.8589 - tps: 86.32779 + dps: 128.73751 + tps: 86.2064 } } dps_results: { key: "TestDestruction-Lvl40-Average-Default" value: { - dps: 411.30694 - tps: 963.92204 + dps: 411.22147 + tps: 963.79384 } } dps_results: { @@ -414,23 +414,23 @@ dps_results: { dps_results: { key: "TestDestruction-Lvl40-SwitchInFrontOfTarget-Default" value: { - dps: 404.67862 - tps: 953.12491 + dps: 404.61652 + tps: 953.03176 } } dps_results: { key: "TestDestruction-Lvl50-AllItems-DeathmistRaiment" value: { - dps: 303.64877 - tps: 211.60178 + dps: 303.50094 + tps: 211.45395 hps: 9.8368 } } dps_results: { key: "TestDestruction-Lvl50-Average-Default" value: { - dps: 1176.57707 - tps: 2032.13683 + dps: 1176.36583 + tps: 2031.81997 hps: 18.3079 } } @@ -485,8 +485,8 @@ dps_results: { dps_results: { key: "TestDestruction-Lvl50-SwitchInFrontOfTarget-Default" value: { - dps: 1149.32382 - tps: 1985.98969 + dps: 1149.17696 + tps: 1985.7694 hps: 18.35945 } } diff --git a/sim/warlock/warlock.go b/sim/warlock/warlock.go index 94ab788658..1dce68ea9d 100644 --- a/sim/warlock/warlock.go +++ b/sim/warlock/warlock.go @@ -180,9 +180,8 @@ func NewWarlock(character *core.Character, options *proto.Player, warlockOptions core.FillTalentsProto(warlock.Talents.ProtoReflect(), options.TalentsString, TalentTreeSizes) warlock.EnableManaBar() - warlock.AddStatDependency(stats.Strength, stats.AttackPower, 1) + warlock.AddStatDependency(stats.Strength, stats.AttackPower, core.APPerStrength[character.Class]) warlock.AddStatDependency(stats.BonusArmor, stats.Armor, 1) - warlock.AddStatDependency(stats.Intellect, stats.SpellCrit, core.CritPerIntAtLevel[warlock.Class][int(warlock.Level)]*core.SpellCritRatingPerCritChance) warlock.AddStatDependency(stats.Agility, stats.MeleeCrit, core.CritPerAgiAtLevel[warlock.Class][int(warlock.Level)]*core.CritRatingPerCritChance) diff --git a/sim/warrior/warrior.go b/sim/warrior/warrior.go index b31568c81f..1173a68dd7 100644 --- a/sim/warrior/warrior.go +++ b/sim/warrior/warrior.go @@ -157,10 +157,10 @@ func NewWarrior(character *core.Character, talents string, inputs WarriorInputs) warrior.PseudoStats.CanParry = true + warrior.AddStatDependency(stats.Strength, stats.AttackPower, core.APPerStrength[character.Class]) + warrior.AddStatDependency(stats.Strength, stats.BlockValue, .05) // 20 str = 1 block warrior.AddStatDependency(stats.Agility, stats.MeleeCrit, core.CritPerAgiAtLevel[character.Class][int(warrior.Level)]*core.CritRatingPerCritChance) warrior.AddStatDependency(stats.Agility, stats.Dodge, core.DodgePerAgiAtLevel[character.Class][int(warrior.Level)]) - warrior.AddStatDependency(stats.Strength, stats.AttackPower, 2) - warrior.AddStatDependency(stats.Strength, stats.BlockValue, .05) // 20 str = 1 block warrior.AddStatDependency(stats.BonusArmor, stats.Armor, 1) guardians.ConstructGuardians(&warrior.Character) From aa0af8ebba022c63bfa0eb3b60a500e739154528 Mon Sep 17 00:00:00 2001 From: Kayla Glick Date: Sat, 6 Jul 2024 23:33:03 -0400 Subject: [PATCH 4/4] apply Bane to shadowflame, remove shadowflame cooldown --- sim/warlock/dps/TestAffliction.results | 48 +++++++++++++------------- sim/warlock/shadowflame.go | 4 --- sim/warlock/talents.go | 2 +- 3 files changed, 25 insertions(+), 29 deletions(-) diff --git a/sim/warlock/dps/TestAffliction.results b/sim/warlock/dps/TestAffliction.results index 990f2a1171..1dbe912880 100644 --- a/sim/warlock/dps/TestAffliction.results +++ b/sim/warlock/dps/TestAffliction.results @@ -249,9 +249,9 @@ stat_weights_results: { weights: 0 weights: 0 weights: 0 - weights: 6.06502 + weights: -0.97751 weights: 0 - weights: 0.92632 + weights: 1.893 weights: 0 weights: 0 weights: 0 @@ -259,8 +259,8 @@ stat_weights_results: { weights: 0 weights: 0 weights: 0 - weights: 9.79909 - weights: 15.09323 + weights: 15.96845 + weights: 15.89471 weights: 0 weights: 0 weights: 0 @@ -442,8 +442,8 @@ dps_results: { dps_results: { key: "TestAffliction-Lvl60-AllItems-InfernalPactEssence-216509" value: { - dps: 2022.23838 - tps: 1861.96727 + dps: 2058.1844 + tps: 1903.18656 } } dps_results: { @@ -477,63 +477,63 @@ dps_results: { dps_results: { key: "TestAffliction-Lvl60-AllItems-ZilaGular-223214" value: { - dps: 2021.16916 - tps: 1863.32879 + dps: 2042.09457 + tps: 1885.68575 } } dps_results: { key: "TestAffliction-Lvl60-Average-Default" value: { - dps: 2085.07759 - tps: 1922.44953 + dps: 2121.57534 + tps: 1961.06149 } } dps_results: { key: "TestAffliction-Lvl60-Settings-Orc-affliction-Affliction Warlock-affliction-FullBuffs-Phase 4 Consumes-LongMultiTarget" value: { - dps: 2074.38586 - tps: 3024.20083 + dps: 2101.29597 + tps: 3098.79402 } } dps_results: { key: "TestAffliction-Lvl60-Settings-Orc-affliction-Affliction Warlock-affliction-FullBuffs-Phase 4 Consumes-LongSingleTarget" value: { - dps: 2074.38586 - tps: 1912.4589 + dps: 2101.29597 + tps: 1941.82259 } } dps_results: { key: "TestAffliction-Lvl60-Settings-Orc-affliction-Affliction Warlock-affliction-FullBuffs-Phase 4 Consumes-ShortSingleTarget" value: { - dps: 2079.81274 - tps: 1925.80314 + dps: 2079.47205 + tps: 1913.71566 } } dps_results: { key: "TestAffliction-Lvl60-Settings-Orc-affliction-Affliction Warlock-affliction-NoBuffs-Phase 4 Consumes-LongMultiTarget" value: { - dps: 1075.74169 - tps: 2195.55742 + dps: 1122.29813 + tps: 2285.84038 } } dps_results: { key: "TestAffliction-Lvl60-Settings-Orc-affliction-Affliction Warlock-affliction-NoBuffs-Phase 4 Consumes-LongSingleTarget" value: { - dps: 1075.74169 - tps: 986.59251 + dps: 1122.29813 + tps: 1036.44803 } } dps_results: { key: "TestAffliction-Lvl60-Settings-Orc-affliction-Affliction Warlock-affliction-NoBuffs-Phase 4 Consumes-ShortSingleTarget" value: { - dps: 1099.60413 - tps: 999.65186 + dps: 1144.9641 + tps: 1050.30375 } } dps_results: { key: "TestAffliction-Lvl60-SwitchInFrontOfTarget-Default" value: { - dps: 2059.43029 - tps: 1896.82049 + dps: 2107.58657 + tps: 1947.22715 } } diff --git a/sim/warlock/shadowflame.go b/sim/warlock/shadowflame.go index 8c6373a448..b2383be386 100644 --- a/sim/warlock/shadowflame.go +++ b/sim/warlock/shadowflame.go @@ -39,10 +39,6 @@ func (warlock *Warlock) registerShadowflameSpell() { GCD: core.GCDDefault, CastTime: time.Second * 2, }, - CD: core.Cooldown{ - Timer: warlock.NewTimer(), - Duration: 15 * time.Second, - }, }, Dot: core.DotConfig{ diff --git a/sim/warlock/talents.go b/sim/warlock/talents.go index 2185cfedab..bbac1f0e7a 100644 --- a/sim/warlock/talents.go +++ b/sim/warlock/talents.go @@ -602,7 +602,7 @@ func (warlock *Warlock) applyBane() { points := time.Duration(warlock.Talents.Bane) warlock.OnSpellRegistered(func(spell *core.Spell) { - if spell.SpellCode == SpellCode_WarlockShadowBolt || spell.SpellCode == SpellCode_WarlockImmolate { + if spell.SpellCode == SpellCode_WarlockShadowBolt || spell.SpellCode == SpellCode_WarlockImmolate || spell.SpellCode == SpellCode_WarlockShadowflame { spell.DefaultCast.CastTime -= time.Millisecond * 100 * points } else if spell.SpellCode == SpellCode_WarlockSoulFire { spell.DefaultCast.CastTime -= time.Millisecond * 400 * points