diff --git a/sim/paladin/retribution/TestRetribution.results b/sim/paladin/retribution/TestRetribution.results index fd8999cfc6..d66f7ed5d8 100644 --- a/sim/paladin/retribution/TestRetribution.results +++ b/sim/paladin/retribution/TestRetribution.results @@ -97,8 +97,8 @@ dps_results: { dps_results: { key: "TestRetribution-AllItems-BattlegearofWingedTriumph" value: { - dps: 220107.38712 - tps: 209301.73722 + dps: 219578.18026 + tps: 208740.3494 hps: 22.01849 } } @@ -1745,16 +1745,16 @@ dps_results: { dps_results: { key: "TestRetribution-AllItems-PlateofWingedTriumph" value: { - dps: 198300.26187 - tps: 187581.66327 + dps: 197237.50605 + tps: 186416.08954 hps: 21.68227 } } dps_results: { key: "TestRetribution-AllItems-PlateoftheLightningEmperor" value: { - dps: 190509.13643 - tps: 180288.19267 + dps: 190598.81848 + tps: 180354.55575 hps: 21.68227 } } @@ -2665,16 +2665,16 @@ dps_results: { dps_results: { key: "TestRetribution-AllItems-VestmentsofWingedTriumph" value: { - dps: 151014.33863 - tps: 143678.78136 + dps: 152149.58139 + tps: 144779.5247 hps: 22.01849 } } dps_results: { key: "TestRetribution-AllItems-VestmentsoftheLightningEmperor" value: { - dps: 151965.57664 - tps: 144293.14055 + dps: 152869.65999 + tps: 145120.88518 hps: 22.93067 } } @@ -2737,16 +2737,16 @@ dps_results: { dps_results: { key: "TestRetribution-AllItems-WhiteTigerPlate" value: { - dps: 178038.64323 - tps: 168609.79115 + dps: 178172.69382 + tps: 168653.57855 hps: 21.68227 } } dps_results: { key: "TestRetribution-AllItems-WhiteTigerVestments" value: { - dps: 151840.08141 - tps: 144401.87523 + dps: 152414.48109 + tps: 144858.06661 hps: 22.93067 } } diff --git a/ui/paladin/retribution/apls/default.apl.json b/ui/paladin/retribution/apls/default.apl.json index fc14c51541..ca3ac9ddda 100644 --- a/ui/paladin/retribution/apls/default.apl.json +++ b/ui/paladin/retribution/apls/default.apl.json @@ -18,7 +18,7 @@ {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpGe","lhs":{"numberTargets":{}},"rhs":{"const":{"val":"4"}}}},{"cmp":{"op":"OpGt","lhs":{"spellTimeToReady":{"spellId":{"spellId":53595}}},"rhs":{"const":{"val":"0"}}}},{"cmp":{"op":"OpLe","lhs":{"spellTimeToReady":{"spellId":{"spellId":53595}}},"rhs":{"const":{"val":"0.2s"}}}}]}},"wait":{"duration":{"spellTimeToReady":{"spellId":{"spellId":53595}}}}}}, {"action":{"condition":{"and":{"vals":[{"auraIsKnown":{"auraId":{"spellId":138164}}},{"auraIsActive":{"auraId":{"spellId":138169},"includeReactionTime":true}},{"or":{"vals":[{"cmp":{"op":"OpEq","lhs":{"currentGenericResource":{}},"rhs":{"const":{"val":"3"}}}},{"and":{"vals":[{"cmp":{"op":"OpEq","lhs":{"currentGenericResource":{}},"rhs":{"const":{"val":"4"}}}},{"not":{"val":{"spellCanCast":{"spellId":{"spellId":35395}}}}},{"not":{"val":{"spellCanCast":{"spellId":{"spellId":20271}}}}}]}}]}}]}},"castSpell":{"spellId":{"spellId":879}}}}, {"action":{"condition":{"or":{"vals":[{"auraIsActive":{"auraId":{"spellId":31884},"includeReactionTime":true}},{"and":{"vals":[{"auraIsKnown":{"auraId":{"spellId":138164}}},{"auraIsActive":{"auraId":{"spellId":138169},"includeReactionTime":true}},{"cmp":{"op":"OpGe","lhs":{"currentGenericResource":{}},"rhs":{"const":{"val":"4"}}}}]}}]}},"castSpell":{"spellId":{"spellId":85256}}}}, - {"action":{"condition":{"and":{"vals":[{"or":{"vals":[{"not":{"val":{"auraIsKnown":{"auraId":{"spellId":138164}}}}},{"auraIsActive":{"auraId":{"spellId":138169},"includeReactionTime":true}}]}},{"auraIsActive":{"auraId":{"spellId":31884},"includeReactionTime":true}}]}},"castSpell":{"spellId":{"spellId":20271}}}}, + {"action":{"condition":{"and":{"vals":[{"or":{"vals":[{"auraIsKnown":{"auraId":{"spellId":70762}}},{"and":{"vals":[{"auraIsKnown":{"auraId":{"spellId":138164}}},{"auraIsActive":{"auraId":{"spellId":138169},"includeReactionTime":true}}]}}]}},{"auraIsActive":{"auraId":{"spellId":31884},"includeReactionTime":true}}]}},"castSpell":{"spellId":{"spellId":20271}}}}, {"action":{"castSpell":{"spellId":{"spellId":35395}}}}, {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpGt","lhs":{"spellTimeToReady":{"spellId":{"spellId":35395}}},"rhs":{"const":{"val":"0"}}}},{"cmp":{"op":"OpLe","lhs":{"spellTimeToReady":{"spellId":{"spellId":35395}}},"rhs":{"const":{"val":"0.2s"}}}}]}},"wait":{"duration":{"spellTimeToReady":{"spellId":{"spellId":35395}}}}}}, {"action":{"condition":{"and":{"vals":[{"auraIsKnown":{"auraId":{"spellId":138159}}},{"auraIsKnown":{"auraId":{"spellId":122028}}},{"cmp":{"op":"OpGe","lhs":{"numberTargets":{}},"rhs":{"const":{"val":"2"}}}},{"cmp":{"op":"OpLe","lhs":{"numberTargets":{}},"rhs":{"const":{"val":"4"}}}}]}},"castSpell":{"spellId":{"spellId":879}}}}, diff --git a/ui/paladin/retribution/gear_sets/p5.gear.json b/ui/paladin/retribution/gear_sets/p5.gear.json index e8b9096f00..0f358da359 100644 --- a/ui/paladin/retribution/gear_sets/p5.gear.json +++ b/ui/paladin/retribution/gear_sets/p5.gear.json @@ -2,16 +2,16 @@ "items": [ { "id": 99379, "gems": [95346, 76671], "reforging": 152, "upgradeStep": "UpgradeStepFour" }, { "id": 105513, "reforging": 137, "upgradeStep": "UpgradeStepFour" }, - { "id": 99373, "enchant": 4803, "gems": [76671, 76671], "reforging": 160, "upgradeStep": "UpgradeStepFour" }, - { "id": 102249, "enchant": 4424, "gems": [76671], "upgradeStep": "UpgradeStepFour", "tinker": 4897 }, - { "id": 99387, "enchant": 4419, "gems": [76671, 76674, 76674], "upgradeStep": "UpgradeStepFour" }, + { "id": 99373, "enchant": 4803, "gems": [76671, 76674], "reforging": 159, "upgradeStep": "UpgradeStepFour" }, + { "id": 102249, "enchant": 4424, "gems": [76674], "upgradeStep": "UpgradeStepFour", "tinker": 4897 }, + { "id": 99387, "enchant": 4419, "gems": [76674, 76671, 76671], "upgradeStep": "UpgradeStepFour" }, { "id": 105411, "enchant": 4415, "gems": [0], "reforging": 140, "upgradeStep": "UpgradeStepFour" }, - { "id": 99380, "enchant": 4432, "gems": [76671, 76671, 0], "reforging": 154, "upgradeStep": "UpgradeStepFour", "tinker": 4898 }, - { "id": 105509, "enchant": 4223, "gems": [76674, 76700, 76700], "upgradeStep": "UpgradeStepFour", "tinker": 4223 }, - { "id": 105640, "enchant": 4823, "gems": [76643, 76643, 76671], "upgradeStep": "UpgradeStepFour" }, + { "id": 99380, "enchant": 4432, "gems": [76674, 76671, 0], "reforging": 140, "upgradeStep": "UpgradeStepFour", "tinker": 4898 }, + { "id": 105509, "enchant": 4223, "gems": [76674, 76700, 76700], "reforging": 152, "upgradeStep": "UpgradeStepFour", "tinker": 4223 }, + { "id": 105640, "enchant": 4823, "gems": [76636, 76636, 76671], "upgradeStep": "UpgradeStepFour" }, { "id": 105531, "enchant": 4429, "gems": [76700], "reforging": 147, "upgradeStep": "UpgradeStepFour" }, - { "id": 105620, "gems": [76700], "reforging": 161, "upgradeStep": "UpgradeStepFour" }, - { "id": 105589, "gems": [76700], "reforging": 154, "upgradeStep": "UpgradeStepFour" }, + { "id": 105620, "gems": [76671], "reforging": 161, "upgradeStep": "UpgradeStepFour" }, + { "id": 105589, "gems": [76671], "reforging": 147, "upgradeStep": "UpgradeStepFour" }, { "id": 105491, "upgradeStep": "UpgradeStepFour" }, { "id": 105609, "upgradeStep": "UpgradeStepFour" }, { "id": 105610, "enchant": 4444, "gems": [76700], "upgradeStep": "UpgradeStepFour" }, diff --git a/ui/paladin/retribution/presets.ts b/ui/paladin/retribution/presets.ts index c6eb4904c8..31cc45b53a 100644 --- a/ui/paladin/retribution/presets.ts +++ b/ui/paladin/retribution/presets.ts @@ -55,6 +55,24 @@ export const P3_EP_PRESET = PresetUtils.makePresetEpWeights( ), ); +export const P5_EP_PRESET = PresetUtils.makePresetEpWeights( + 'P5 (WiP)', + Stats.fromMap( + { + [Stat.StatStrength]: 1.0, + [Stat.StatHitRating]: 0.76, + [Stat.StatExpertiseRating]: 0.76, + [Stat.StatHasteRating]: 0.75, + [Stat.StatMasteryRating]: 0.74, + [Stat.StatCritRating]: 0.73, + [Stat.StatAttackPower]: 0.44, + }, + { + [PseudoStat.PseudoStatMainHandDps]: 1.8, + }, + ), +); + export const PRERAID_EP_PRESET = PresetUtils.makePresetEpWeights( 'Pre-raid', Stats.fromMap( diff --git a/ui/paladin/retribution/sim.ts b/ui/paladin/retribution/sim.ts index eec2e291d7..7f1dd277ee 100644 --- a/ui/paladin/retribution/sim.ts +++ b/ui/paladin/retribution/sim.ts @@ -6,7 +6,8 @@ import { Player } from '../../core/player.js'; import { PlayerClasses } from '../../core/player_classes'; import { APLRotation, APLRotation_Type } from '../../core/proto/apl.js'; import { Debuffs, Faction, IndividualBuffs, PartyBuffs, PseudoStat, Race, RaidBuffs, Spec, Stat, UnitStats } from '../../core/proto/common.js'; -import { Stats, UnitStat } from '../../core/proto_utils/stats.js'; +import { StatCapType } from '../../core/proto/ui.js'; +import { StatCap, Stats, UnitStat } from '../../core/proto_utils/stats.js'; import { defaultRaidBuffMajorDamageCooldowns } from '../../core/proto_utils/utils'; import * as PaladinInputs from '../inputs.js'; import * as Presets from './presets.js'; @@ -104,6 +105,15 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecRetributionPaladin, { epWeights: Presets.P3_EP_PRESET.epWeights, // Default stat caps for the Reforge Optimizer statCaps: getStatCaps(), + softCapBreakpoints: (() => { + return [ + StatCap.fromPseudoStat(PseudoStat.PseudoStatMeleeHastePercent, { + breakpoints: [50], + capType: StatCapType.TypeSoftCap, + postCapEPs: [0], + }), + ]; + })(), // Default consumes settings. consumables: Presets.DefaultConsumables, // Default talents. @@ -149,7 +159,7 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecRetributionPaladin, { }, presets: { - epWeights: [Presets.P1_P2_EP_PRESET, Presets.P3_EP_PRESET, Presets.PRERAID_EP_PRESET], + epWeights: [Presets.P1_P2_EP_PRESET, Presets.P3_EP_PRESET, Presets.P5_EP_PRESET, Presets.PRERAID_EP_PRESET], rotations: [Presets.APL_PRESET], // Preset talents that the user can quickly select. talents: [Presets.DefaultTalents], @@ -196,6 +206,18 @@ export class RetributionPaladinSimUI extends IndividualSimUI) { super(parentElem, player, SPEC_CONFIG); - this.reforger = new ReforgeOptimizer(this); + this.reforger = new ReforgeOptimizer(this, { + updateSoftCaps: softCaps => { + const hasteCap = softCaps.find(v => v.unitStat.equalsPseudoStat(PseudoStat.PseudoStatMeleeHastePercent)); + if (hasteCap) { + const hasteWeights = player.getEpWeights().getStat(Stat.StatHasteRating); + const critWeights = player.getEpWeights().getStat(Stat.StatCritRating); + const masteryWeights = player.getEpWeights().getStat(Stat.StatMasteryRating); + const postCap = Math.max(0.01, Math.min(hasteWeights, critWeights, masteryWeights) - 0.01); + hasteCap.postCapEPs = [postCap * Mechanics.HASTE_RATING_PER_HASTE_PERCENT]; + } + return softCaps; + }, + }); } }