From 8aceb8a26e37f8f5ca2a0b70f893cab68d89ee10 Mon Sep 17 00:00:00 2001 From: Adrian Klingen Date: Wed, 19 Jun 2024 22:20:06 +0200 Subject: [PATCH 1/8] Add Arcane soft cap logic --- ui/mage/arcane/presets.ts | 8 ++++---- ui/mage/arcane/sim.ts | 19 +++++++++++++++++++ 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/ui/mage/arcane/presets.ts b/ui/mage/arcane/presets.ts index ce3b7b537d..cc340893a1 100644 --- a/ui/mage/arcane/presets.ts +++ b/ui/mage/arcane/presets.ts @@ -46,11 +46,11 @@ export const ARCANE_ROTATION_PRESET_DEFAULT = PresetUtils.makePresetAPLRotation( export const P1_EP_PRESET = PresetUtils.makePresetEpWeights( 'Arcane P1', Stats.fromMap({ - [Stat.StatIntellect]: 1.74, + [Stat.StatIntellect]: 1.76, [Stat.StatSpellPower]: 1, - [Stat.StatSpellHit]: 1.27, - [Stat.StatSpellCrit]: 0.5, - [Stat.StatSpellHaste]: 0.25, + [Stat.StatSpellHit]: 1.29, + [Stat.StatSpellCrit]: 0.53, + [Stat.StatSpellHaste]: 0.48, [Stat.StatMastery]: 0.56, }), ); diff --git a/ui/mage/arcane/sim.ts b/ui/mage/arcane/sim.ts index 21d21af62e..ff1beae5c2 100644 --- a/ui/mage/arcane/sim.ts +++ b/ui/mage/arcane/sim.ts @@ -7,6 +7,7 @@ import { PlayerClasses } from '../../core/player_classes'; import { Mage } from '../../core/player_classes/mage'; import { APLRotation } from '../../core/proto/apl'; import { Faction, IndividualBuffs, PartyBuffs, Race, Spec, Stat } from '../../core/proto/common'; +import { StatCapType } from '../../core/proto/ui'; import { Stats } from '../../core/proto_utils/stats'; import * as ArcaneInputs from './inputs'; import * as Presets from './presets'; @@ -53,6 +54,24 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecArcaneMage, { statCaps: (() => { return new Stats().withStat(Stat.StatSpellHit, 17 * Mechanics.SPELL_HIT_RATING_PER_HIT_CHANCE); })(), + // Default soft caps for the Reforge optimizer + softCapBreakpoints: (() => { + // Sources: + // https://www.icy-veins.com/cataclysm-classic/arcane-mage-pve-stat-priority + // https://www.wowhead.com/cata/guide/classes/mage/arcane/dps-stat-priority-attributes-pve + + // 2497 haste rating is the breakpoint + // 1343 base haste rating - totals to 2497 with raid buffs + const breakpoints = [1768]; + const hasteSoftCapConfig = { + stat: Stat.StatSpellHaste, + breakpoints, + capType: StatCapType.TypeSoftCap, + postCapEPs: [0.56], + }; + + return [hasteSoftCapConfig]; + })(), // Default consumes settings. consumes: Presets.DefaultArcaneConsumes, // Default talents. From 9cbb1cc9eda19dcf107a5d1cef344875703bcb40 Mon Sep 17 00:00:00 2001 From: Adrian Klingen Date: Fri, 21 Jun 2024 10:39:31 +0200 Subject: [PATCH 2/8] Calculate Mage softcaps & post cap EPs --- ui/mage/fire/presets.ts | 12 +++++------ ui/mage/fire/sim.ts | 45 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 6 deletions(-) diff --git a/ui/mage/fire/presets.ts b/ui/mage/fire/presets.ts index e56bb2f4f7..7e62b9adb3 100644 --- a/ui/mage/fire/presets.ts +++ b/ui/mage/fire/presets.ts @@ -1,5 +1,5 @@ import * as PresetUtils from '../../core/preset_utils'; -import { Conjured, Consumes, Debuffs, Flask, Food, Glyphs, Potions, Profession, RaidBuffs, Spec, Stat } from '../../core/proto/common'; +import { Consumes, Debuffs, Flask, Food, Glyphs, Potions, Profession, RaidBuffs, Spec, Stat } from '../../core/proto/common'; import { FireMage_Options as MageOptions, MageMajorGlyph as MajorGlyph, @@ -32,12 +32,12 @@ export const FIRE_ROTATION_PRESET_DEFAULT = PresetUtils.makePresetAPLRotation('F export const P1_EP_PRESET = PresetUtils.makePresetEpWeights( 'Fire P1', Stats.fromMap({ - [Stat.StatIntellect]: 1.32, + [Stat.StatIntellect]: 1.33, [Stat.StatSpellPower]: 1.0, - [Stat.StatSpellHit]: 1.05, - [Stat.StatSpellCrit]: 0.56, - [Stat.StatSpellHaste]: 0.64, - [Stat.StatMastery]: 0.47, + [Stat.StatSpellHit]: 1.09, + [Stat.StatSpellCrit]: 0.61, + [Stat.StatSpellHaste]: 0.69, + [Stat.StatMastery]: 0.46, }), ); diff --git a/ui/mage/fire/sim.ts b/ui/mage/fire/sim.ts index 83d7444044..418665fc49 100644 --- a/ui/mage/fire/sim.ts +++ b/ui/mage/fire/sim.ts @@ -6,6 +6,7 @@ import { Player } from '../../core/player'; import { PlayerClasses } from '../../core/player_classes'; import { APLRotation } from '../../core/proto/apl'; import { Faction, IndividualBuffs, PartyBuffs, Race, Spec, Stat } from '../../core/proto/common'; +import { StatCapType } from '../../core/proto/ui'; import { Stats } from '../../core/proto_utils/stats'; import * as FireInputs from './inputs'; import * as Presets from './presets'; @@ -53,6 +54,50 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecFireMage, { statCaps: (() => { return new Stats().withStat(Stat.StatSpellHit, 17 * Mechanics.SPELL_HIT_RATING_PER_HIT_CHANCE); })(), + // Default soft caps for the Reforge optimizer + softCapBreakpoints: (() => { + // Picked from Mage Discord + // Sources: + // https://docs.google.com/spreadsheets/d/17cJJUReg2uz-XxBB3oDWb1kCncdH_-X96mSb0HAu4Ko/edit?gid=0#gid=0 + // https://docs.google.com/spreadsheets/d/1WLOZ1YevGPw_WZs0JhGzVVy906W5y0i9UqHa3ejyBkE/htmlview?gid=19 + const breakpoints = [ + 639, // 4.99% - 11-tick Combust + 1602, // 12.51% - 5-tick LvB + Pyro + 1922, // 15.01% - 12-tick Combust + 3212, // 25.08% - 13-tick Combust + 4488, // 35.04% - 14-tick Combust + 4805, // 37.52% - 6-tick LvB + Pyro + 5767, // 45.03% - 15-tick Combust + 7033, // 54.92% - 16-tick Combust + // 8000, // 62.47% - 7-tick LvB + Pyro + // 8309, // 64.88% - 17-tick Combust + // 9602, // 74.98% - 18-tick Combust + // 10887, // 85.01% - 19-tick Combust + // 11198, // 87.44% - 8-tick LvB + Pyro + // 12182, // 95.12% - 20-tick Combust + // 13463, + // 14412, + // 14704, + // 16004, + // 17290, + // 17600, + // 18543, + // 19821, + // 20820, + // 21117, + // 22424, + // 23730, + // 24010, + ]; + const hasteSoftCapConfig = { + stat: Stat.StatSpellHaste, + breakpoints, + capType: StatCapType.TypeSoftCap, + postCapEPs: [2.16, 0.94, 0.75, 0.73, 0.77, 0.93, 0.73, 0.65], + }; + + return [hasteSoftCapConfig]; + })(), // Default consumes settings. consumes: Presets.DefaultFireConsumes, // Default talents. From d97eb8178abddb6ab3d6d56700dbd9b3eaa7d2ee Mon Sep 17 00:00:00 2001 From: Adrian Klingen Date: Fri, 21 Jun 2024 12:12:23 +0200 Subject: [PATCH 3/8] Modify mage & add haste tooltips --- ui/core/components/character_stats.tsx | 8 ++++- .../components/suggest_reforges_action.tsx | 10 +++++-- ui/mage/arcane/presets.ts | 29 ++++--------------- ui/mage/arcane/sim.ts | 16 ++++++++-- ui/mage/fire/sim.ts | 13 ++++++++- 5 files changed, 45 insertions(+), 31 deletions(-) diff --git a/ui/core/components/character_stats.tsx b/ui/core/components/character_stats.tsx index 30e7e175ba..924e05a91b 100644 --- a/ui/core/components/character_stats.tsx +++ b/ui/core/components/character_stats.tsx @@ -24,6 +24,7 @@ export class CharacterStats extends Component { private readonly player: Player; private readonly modifyDisplayStats?: (player: Player) => StatMods; private readonly overwriteDisplayStats?: (player: Player) => StatWrites; + private static _computedFinalStats: Stats = new Stats(); constructor( parent: HTMLElement, @@ -116,7 +117,6 @@ export class CharacterStats extends Component { private updateStats(player: Player) { const playerStats = player.getCurrentStats(); - const statMods = this.modifyDisplayStats ? this.modifyDisplayStats(this.player) : {}; const baseStats = Stats.fromProto(playerStats.baseStats); @@ -176,6 +176,8 @@ export class CharacterStats extends Component { (baseSpellHasteMultiplier * spellHasteBuffsMultiplier - 1) * 100 * Mechanics.HASTE_RATING_PER_HASTE_PERCENT, ); + CharacterStats._computedFinalStats = finalStats; + const masteryPoints = this.player.getBaseMastery() + (playerStats.finalStats?.stats[Stat.StatMastery] || 0) / Mechanics.MASTERY_RATING_PER_MASTERY_POINT; @@ -318,6 +320,10 @@ export class CharacterStats extends Component { } } + public static get computedFinalStats(): Stats { + return this._computedFinalStats; + } + private statDisplayString(stats: Stats, deltaStats: Stats, stat: Stat, includeBase?: boolean): string { let rawValue = deltaStats.getStat(stat); diff --git a/ui/core/components/suggest_reforges_action.tsx b/ui/core/components/suggest_reforges_action.tsx index bc96e1813a..356404e7a1 100644 --- a/ui/core/components/suggest_reforges_action.tsx +++ b/ui/core/components/suggest_reforges_action.tsx @@ -39,7 +39,9 @@ const INCLUDED_STATS = [ Stat.StatParry, ]; -const STAT_TOOLTIP: { [key in Stat]?: () => Element | string } = { +type StatTooltips = { [key in Stat]?: () => Element | string }; + +const STAT_TOOLTIPS: StatTooltips = { [Stat.StatMastery]: () => ( <> Rating: Excludes your base mastery @@ -47,10 +49,12 @@ const STAT_TOOLTIP: { [key in Stat]?: () => Element | string } = { %: Includes base mastery ), + [Stat.StatSpellHaste]: () => <>This value should be excluding any external buffs that affect your haste rating., }; export type ReforgeOptimizerOptions = { experimental?: true; + statTooltips?: StatTooltips; // Allows you to modify the stats before they are returned for the calculations // For example: Adding class specific Glyphs/Talents that are not added by the backend updateGearStatsModifier?: (baseStats: Stats) => Stats; @@ -66,6 +70,7 @@ export class ReforgeOptimizer { protected _statCaps: Stats; protected updateGearStatsModifier: ReforgeOptimizerOptions['updateGearStatsModifier']; protected softCapsConfig: StatCapConfig[]; + protected statTooltips: StatTooltips = {}; constructor(simUI: IndividualSimUI, options?: ReforgeOptimizerOptions) { this.simUI = simUI; @@ -76,6 +81,7 @@ export class ReforgeOptimizer { this.defaults = simUI.individualConfig.defaults; this.updateGearStatsModifier = options?.updateGearStatsModifier; this.softCapsConfig = this.defaults.softCapBreakpoints || []; + this.statTooltips = { ...STAT_TOOLTIPS, ...options?.statTooltips }; this._statCaps = this.statCaps; const startReforgeOptimizationEntry: ActionGroupItem = { @@ -329,7 +335,7 @@ export class ReforgeOptimizer { }, }); - const tooltipText = STAT_TOOLTIP[stat]; + const tooltipText = this.statTooltips[stat]; const statTooltipRef = ref(); const row = ( diff --git a/ui/mage/arcane/presets.ts b/ui/mage/arcane/presets.ts index cc340893a1..039316ed21 100644 --- a/ui/mage/arcane/presets.ts +++ b/ui/mage/arcane/presets.ts @@ -1,25 +1,6 @@ import * as PresetUtils from '../../core/preset_utils'; -import { - Conjured, - Consumes, - Debuffs, - Flask, - Food, - Glyphs, - Potions, - Profession, - RaidBuffs, - Spec, - Stat, - TinkerHands, - UnitReference, -} from '../../core/proto/common'; -import { - ArcaneMage_Options as MageOptions, - MageMajorGlyph as MajorGlyph, - MageMinorGlyph as MinorGlyph, - MagePrimeGlyph as PrimeGlyph, -} from '../../core/proto/mage'; +import { Consumes, Debuffs, Flask, Food, Glyphs, Potions, Profession, RaidBuffs, Stat, TinkerHands, UnitReference } from '../../core/proto/common'; +import { ArcaneMage_Options as MageOptions, MageMajorGlyph as MajorGlyph, MagePrimeGlyph as PrimeGlyph } from '../../core/proto/mage'; import { SavedTalents } from '../../core/proto/ui'; import { Stats } from '../../core/proto_utils/stats'; import ArcaneApl from './apls/arcane.apl.json'; @@ -48,10 +29,10 @@ export const P1_EP_PRESET = PresetUtils.makePresetEpWeights( Stats.fromMap({ [Stat.StatIntellect]: 1.76, [Stat.StatSpellPower]: 1, - [Stat.StatSpellHit]: 1.29, + [Stat.StatSpellHit]: 1.31, [Stat.StatSpellCrit]: 0.53, - [Stat.StatSpellHaste]: 0.48, - [Stat.StatMastery]: 0.56, + [Stat.StatSpellHaste]: 0.49, + [Stat.StatMastery]: 0.57, }), ); diff --git a/ui/mage/arcane/sim.ts b/ui/mage/arcane/sim.ts index ff1beae5c2..223c7f3161 100644 --- a/ui/mage/arcane/sim.ts +++ b/ui/mage/arcane/sim.ts @@ -1,3 +1,4 @@ +import { CharacterStats } from '../../core/components/character_stats'; import * as OtherInputs from '../../core/components/inputs/other_inputs'; import { ReforgeOptimizer } from '../../core/components/suggest_reforges_action'; import * as Mechanics from '../../core/constants/mechanics'; @@ -61,8 +62,7 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecArcaneMage, { // https://www.wowhead.com/cata/guide/classes/mage/arcane/dps-stat-priority-attributes-pve // 2497 haste rating is the breakpoint - // 1343 base haste rating - totals to 2497 with raid buffs - const breakpoints = [1768]; + const breakpoints = [2497]; const hasteSoftCapConfig = { stat: Stat.StatSpellHaste, breakpoints, @@ -229,7 +229,17 @@ export class ArcaneMageSimUI extends IndividualSimUI { super(parentElem, player, SPEC_CONFIG); player.sim.waitForInit().then(() => { - new ReforgeOptimizer(this, { experimental: true }); + new ReforgeOptimizer(this, { + experimental: true, + statTooltips: { + [Stat.StatSpellHaste]: () => 'This value includes all sources of Haste, including buffs and debuffs.', + }, + updateGearStatsModifier: baseStats => { + // Include all the Haste buffs to more accurately target the GCD breakpoint + baseStats = baseStats.withStat(Stat.StatSpellHaste, CharacterStats.computedFinalStats.getStat(Stat.StatSpellHaste)); + return baseStats; + }, + }); }); } } diff --git a/ui/mage/fire/sim.ts b/ui/mage/fire/sim.ts index 418665fc49..c68dc69fc9 100644 --- a/ui/mage/fire/sim.ts +++ b/ui/mage/fire/sim.ts @@ -1,3 +1,4 @@ +import { CharacterStats } from '../../core/components/character_stats'; import * as OtherInputs from '../../core/components/inputs/other_inputs'; import { ReforgeOptimizer } from '../../core/components/suggest_reforges_action'; import * as Mechanics from '../../core/constants/mechanics'; @@ -188,7 +189,17 @@ export class FireMageSimUI extends IndividualSimUI { super(parentElem, player, SPEC_CONFIG); player.sim.waitForInit().then(() => { - new ReforgeOptimizer(this, { experimental: true }); + new ReforgeOptimizer(this, { + experimental: true, + statTooltips: { + [Stat.StatSpellHaste]: () => 'This value should include all sources of Haste, including buffs.', + }, + updateGearStatsModifier: baseStats => { + // Include all the Haste buffs to more accurately target the tick breakpoints + baseStats = baseStats.withStat(Stat.StatSpellHaste, CharacterStats.computedFinalStats.getStat(Stat.StatSpellHaste)); + return baseStats; + }, + }); }); } } From 4a41f990e8dde1bd53b6f08ced35ca22ee5cb293 Mon Sep 17 00:00:00 2001 From: Adrian Klingen Date: Fri, 21 Jun 2024 21:53:44 +0200 Subject: [PATCH 4/8] Revert some changes & recalc haste caps --- ui/core/components/suggest_reforges_action.tsx | 12 +++++++++--- ui/mage/arcane/sim.ts | 10 ---------- ui/mage/fire/sim.ts | 5 +---- 3 files changed, 10 insertions(+), 17 deletions(-) diff --git a/ui/core/components/suggest_reforges_action.tsx b/ui/core/components/suggest_reforges_action.tsx index 356404e7a1..94592d9d63 100644 --- a/ui/core/components/suggest_reforges_action.tsx +++ b/ui/core/components/suggest_reforges_action.tsx @@ -44,12 +44,18 @@ type StatTooltips = { [key in Stat]?: () => Element | string }; const STAT_TOOLTIPS: StatTooltips = { [Stat.StatMastery]: () => ( <> - Rating: Excludes your base mastery + Rating: excluding your base mastery
- %: Includes base mastery + %: including your base mastery + + ), + [Stat.StatSpellHaste]: () => ( + <> + Rating: base rating required excluding any gear/buffs. +
+ %: final value including all buffs/gear. ), - [Stat.StatSpellHaste]: () => <>This value should be excluding any external buffs that affect your haste rating., }; export type ReforgeOptimizerOptions = { diff --git a/ui/mage/arcane/sim.ts b/ui/mage/arcane/sim.ts index 223c7f3161..3a6a420f8a 100644 --- a/ui/mage/arcane/sim.ts +++ b/ui/mage/arcane/sim.ts @@ -60,8 +60,6 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecArcaneMage, { // Sources: // https://www.icy-veins.com/cataclysm-classic/arcane-mage-pve-stat-priority // https://www.wowhead.com/cata/guide/classes/mage/arcane/dps-stat-priority-attributes-pve - - // 2497 haste rating is the breakpoint const breakpoints = [2497]; const hasteSoftCapConfig = { stat: Stat.StatSpellHaste, @@ -231,14 +229,6 @@ export class ArcaneMageSimUI extends IndividualSimUI { player.sim.waitForInit().then(() => { new ReforgeOptimizer(this, { experimental: true, - statTooltips: { - [Stat.StatSpellHaste]: () => 'This value includes all sources of Haste, including buffs and debuffs.', - }, - updateGearStatsModifier: baseStats => { - // Include all the Haste buffs to more accurately target the GCD breakpoint - baseStats = baseStats.withStat(Stat.StatSpellHaste, CharacterStats.computedFinalStats.getStat(Stat.StatSpellHaste)); - return baseStats; - }, }); }); } diff --git a/ui/mage/fire/sim.ts b/ui/mage/fire/sim.ts index c68dc69fc9..e250022548 100644 --- a/ui/mage/fire/sim.ts +++ b/ui/mage/fire/sim.ts @@ -94,7 +94,7 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecFireMage, { stat: Stat.StatSpellHaste, breakpoints, capType: StatCapType.TypeSoftCap, - postCapEPs: [2.16, 0.94, 0.75, 0.73, 0.77, 0.93, 0.73, 0.65], + postCapEPs: [3.85, 0.96, 0.86, 0.77, 0.77, 1.17, 0.76, 0.65], }; return [hasteSoftCapConfig]; @@ -191,9 +191,6 @@ export class FireMageSimUI extends IndividualSimUI { player.sim.waitForInit().then(() => { new ReforgeOptimizer(this, { experimental: true, - statTooltips: { - [Stat.StatSpellHaste]: () => 'This value should include all sources of Haste, including buffs.', - }, updateGearStatsModifier: baseStats => { // Include all the Haste buffs to more accurately target the tick breakpoints baseStats = baseStats.withStat(Stat.StatSpellHaste, CharacterStats.computedFinalStats.getStat(Stat.StatSpellHaste)); From a25a988edecc650900e6c8e0a814c6a8929f5b02 Mon Sep 17 00:00:00 2001 From: Adrian Klingen Date: Sun, 23 Jun 2024 08:47:15 +0200 Subject: [PATCH 5/8] Remove finalStats from character stats again --- ui/core/components/character_stats.tsx | 7 ------- 1 file changed, 7 deletions(-) diff --git a/ui/core/components/character_stats.tsx b/ui/core/components/character_stats.tsx index e77d09d967..42c1eb877c 100644 --- a/ui/core/components/character_stats.tsx +++ b/ui/core/components/character_stats.tsx @@ -24,7 +24,6 @@ export class CharacterStats extends Component { private readonly player: Player; private readonly modifyDisplayStats?: (player: Player) => StatMods; private readonly overwriteDisplayStats?: (player: Player) => StatWrites; - private static _computedFinalStats: Stats = new Stats(); constructor( parent: HTMLElement, @@ -162,8 +161,6 @@ export class CharacterStats extends Component { // Apply multiplicative Haste buffs to the final displayed value finalStats = finalStats.withHasteMultipliers(this.player.getClass()); - CharacterStats._computedFinalStats = finalStats; - const masteryPoints = this.player.getBaseMastery() + (playerStats.finalStats?.stats[Stat.StatMastery] || 0) / Mechanics.MASTERY_RATING_PER_MASTERY_POINT; @@ -306,10 +303,6 @@ export class CharacterStats extends Component { } } - public static get computedFinalStats(): Stats { - return this._computedFinalStats; - } - private statDisplayString(stats: Stats, deltaStats: Stats, stat: Stat, includeBase?: boolean): string { let rawValue = deltaStats.getStat(stat); From 4ba452e7cecf2cd34298e53425ac9c652120d4ff Mon Sep 17 00:00:00 2001 From: Adrian Klingen Date: Sun, 23 Jun 2024 08:48:37 +0200 Subject: [PATCH 6/8] Remove custom spell haste logic from fire --- ui/mage/fire/sim.ts | 5 ----- 1 file changed, 5 deletions(-) diff --git a/ui/mage/fire/sim.ts b/ui/mage/fire/sim.ts index e250022548..b950fd301e 100644 --- a/ui/mage/fire/sim.ts +++ b/ui/mage/fire/sim.ts @@ -191,11 +191,6 @@ export class FireMageSimUI extends IndividualSimUI { player.sim.waitForInit().then(() => { new ReforgeOptimizer(this, { experimental: true, - updateGearStatsModifier: baseStats => { - // Include all the Haste buffs to more accurately target the tick breakpoints - baseStats = baseStats.withStat(Stat.StatSpellHaste, CharacterStats.computedFinalStats.getStat(Stat.StatSpellHaste)); - return baseStats; - }, }); }); } From d08fc13026842b1bf1ce836ccd6541aebca5f40b Mon Sep 17 00:00:00 2001 From: Adrian Klingen Date: Sun, 23 Jun 2024 09:18:08 +0200 Subject: [PATCH 7/8] Fix tooltip & formatting --- ui/core/components/suggest_reforges_action.tsx | 4 ++-- ui/core/proto_utils/stats.ts | 7 +++++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/ui/core/components/suggest_reforges_action.tsx b/ui/core/components/suggest_reforges_action.tsx index 00b3906ffc..a7c50d6309 100644 --- a/ui/core/components/suggest_reforges_action.tsx +++ b/ui/core/components/suggest_reforges_action.tsx @@ -51,9 +51,9 @@ const STAT_TOOLTIPS: StatTooltips = { ), [Stat.StatSpellHaste]: () => ( <> - Rating: base rating required excluding any gear/buffs. + Rating: final rating including all buffs/gear.
- %: final value including all buffs/gear. + %: final percentage value including all buffs/gear. ), }; diff --git a/ui/core/proto_utils/stats.ts b/ui/core/proto_utils/stats.ts index 0005ba33fc..3fa0a9c6e8 100644 --- a/ui/core/proto_utils/stats.ts +++ b/ui/core/proto_utils/stats.ts @@ -192,7 +192,10 @@ export class Stats { getHasteMultipliers(playerClass: Class): number[] { const baseMeleeHasteMultiplier = 1 + this.getStat(Stat.StatMeleeHaste) / (Mechanics.HASTE_RATING_PER_HASTE_PERCENT * 100); - const meleeHasteBuffsMultiplier = (playerClass == Class.ClassHunter) ? this.getPseudoStat(PseudoStat.PseudoStatRangedSpeedMultiplier) : this.getPseudoStat(PseudoStat.PseudoStatMeleeSpeedMultiplier); + const meleeHasteBuffsMultiplier = + playerClass == Class.ClassHunter + ? this.getPseudoStat(PseudoStat.PseudoStatRangedSpeedMultiplier) + : this.getPseudoStat(PseudoStat.PseudoStatMeleeSpeedMultiplier); const baseSpellHasteMultiplier = 1 + this.getStat(Stat.StatSpellHaste) / (Mechanics.HASTE_RATING_PER_HASTE_PERCENT * 100); const spellHasteBuffsMultiplier = this.getPseudoStat(PseudoStat.PseudoStatCastSpeedMultiplier); return [baseMeleeHasteMultiplier, meleeHasteBuffsMultiplier, baseSpellHasteMultiplier, spellHasteBuffsMultiplier]; @@ -209,7 +212,7 @@ export class Stats { // Assumes that Haste multipliers have already been applied to both Stats arrays computeStatCapsDelta(statCaps: Stats, playerClass: Class): Stats { - const [finalMeleeHasteMulti, meleeHasteBuffsMulti, finalSpellHasteMulti, spellHasteBuffsMulti] = this.getHasteMultipliers(playerClass); + const [_finalMeleeHasteMulti, meleeHasteBuffsMulti, _finalSpellHasteMulti, spellHasteBuffsMulti] = this.getHasteMultipliers(playerClass); return new Stats( this.stats.map((value, stat) => { if (statCaps.stats[stat] > 0) { From e426eb5043d9fce90f9de39757ddec8cfb928285 Mon Sep 17 00:00:00 2001 From: Adrian Klingen Date: Sun, 23 Jun 2024 21:26:41 +0200 Subject: [PATCH 8/8] Remove first breakpoint --- ui/mage/fire/sim.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ui/mage/fire/sim.ts b/ui/mage/fire/sim.ts index b950fd301e..0aadfa6b9f 100644 --- a/ui/mage/fire/sim.ts +++ b/ui/mage/fire/sim.ts @@ -62,7 +62,6 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecFireMage, { // https://docs.google.com/spreadsheets/d/17cJJUReg2uz-XxBB3oDWb1kCncdH_-X96mSb0HAu4Ko/edit?gid=0#gid=0 // https://docs.google.com/spreadsheets/d/1WLOZ1YevGPw_WZs0JhGzVVy906W5y0i9UqHa3ejyBkE/htmlview?gid=19 const breakpoints = [ - 639, // 4.99% - 11-tick Combust 1602, // 12.51% - 5-tick LvB + Pyro 1922, // 15.01% - 12-tick Combust 3212, // 25.08% - 13-tick Combust @@ -94,7 +93,7 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecFireMage, { stat: Stat.StatSpellHaste, breakpoints, capType: StatCapType.TypeSoftCap, - postCapEPs: [3.85, 0.96, 0.86, 0.77, 0.77, 1.17, 0.76, 0.65], + postCapEPs: [0.96, 0.86, 0.77, 0.77, 1.17, 0.76, 0.65], }; return [hasteSoftCapConfig];