From fc780f27a217174cd05a98ffa8137414afe7ebc3 Mon Sep 17 00:00:00 2001 From: Saji Date: Fri, 13 Mar 2026 00:40:45 -0400 Subject: [PATCH 1/2] Update P4 Bis sets. Correct T16 4pc Bonus for Frost and Arcane. Add new haste soft cap breakpoint to frost Sim. Add new 6tick LB Breakpoint to Arcane sim. --- sim/mage/arcane/TestArcane.results | 4 +- sim/mage/arcane/arcane_missiles.go | 3 -- sim/mage/frost/TestFrost.results | 4 +- sim/mage/items.go | 17 ++++++- ui/mage/arcane/gear_sets/p4_bis.gear.json | 20 ++++++++ ui/mage/arcane/presets.ts | 58 +++++++++++++++++++++-- ui/mage/arcane/sim.tsx | 16 +++++-- ui/mage/fire/gear_sets/p4_bis.gear.json | 20 ++++++++ ui/mage/fire/presets.ts | 2 + ui/mage/fire/sim.tsx | 2 +- ui/mage/frost/gear_sets/p4_bis.gear.json | 20 ++++++++ ui/mage/frost/presets.ts | 2 + ui/mage/frost/sim.ts | 13 +++-- ui/mage/presets.ts | 9 +++- 14 files changed, 166 insertions(+), 24 deletions(-) create mode 100644 ui/mage/arcane/gear_sets/p4_bis.gear.json create mode 100644 ui/mage/fire/gear_sets/p4_bis.gear.json create mode 100644 ui/mage/frost/gear_sets/p4_bis.gear.json diff --git a/sim/mage/arcane/TestArcane.results b/sim/mage/arcane/TestArcane.results index ec8681a63f..0f5007675b 100644 --- a/sim/mage/arcane/TestArcane.results +++ b/sim/mage/arcane/TestArcane.results @@ -75,8 +75,8 @@ dps_results: { dps_results: { key: "TestArcane-AllItems-ChronomancerRegalia" value: { - dps: 211716.34559 - tps: 204402.36752 + dps: 214624.5418 + tps: 206557.52494 } } dps_results: { diff --git a/sim/mage/arcane/arcane_missiles.go b/sim/mage/arcane/arcane_missiles.go index db7ae5cebf..23136d80a0 100644 --- a/sim/mage/arcane/arcane_missiles.go +++ b/sim/mage/arcane/arcane_missiles.go @@ -68,9 +68,6 @@ func (arcane *ArcaneMage) registerArcaneMissilesSpell() { arcane.ExtendGCDUntil(sim, sim.CurrentTime+arcane.ReactionTime) }, OnReset: func(aura *core.Aura, sim *core.Simulation) { - if arcane.T16_4pc != nil && arcane.T16_4pc.IsActive() && sim.Proc(0.15, "Item - Mage T16 4P Bonus") { - return - } arcane.ArcaneChargesAura.Deactivate(sim) }, }, diff --git a/sim/mage/frost/TestFrost.results b/sim/mage/frost/TestFrost.results index dc849e1df9..9f04fcbc7f 100644 --- a/sim/mage/frost/TestFrost.results +++ b/sim/mage/frost/TestFrost.results @@ -75,8 +75,8 @@ dps_results: { dps_results: { key: "TestFrost-AllItems-ChronomancerRegalia" value: { - dps: 157888.40404 - tps: 117880.536 + dps: 145281.79401 + tps: 105142.50597 } } dps_results: { diff --git a/sim/mage/items.go b/sim/mage/items.go index 02fe76297b..9cf33fc0d8 100644 --- a/sim/mage/items.go +++ b/sim/mage/items.go @@ -225,6 +225,21 @@ var ItemSetChronomancerRegalia = core.NewItemSet(core.ItemSet{ mage.T16_4pc = setBonusAura + // Arcane: 15% chance when casting Arcane Missiles to gain an additional Arcane Missiles! proc stack + setBonusAura.MakeDependentProcTriggerAura(&mage.Unit, core.ProcTrigger{ + Name: "Item - Mage T16 4P Bonus - Arcane", + ClassSpellMask: MageSpellArcaneMissilesCast, + ProcChance: 0.15, + Callback: core.CallbackOnSpellHitDealt, + Handler: func(sim *core.Simulation, spell *core.Spell, result *core.SpellResult) { + amProcAura := mage.GetAuraByID(core.ActionID{SpellID: 79683}) + if amProcAura != nil { + amProcAura.Activate(sim) + amProcAura.AddStack(sim) + } + }, + }) + frigidBlast := mage.RegisterSpell(core.SpellConfig{ ActionID: core.ActionID{SpellID: 145264}, SpellSchool: core.SpellSchoolFrost, @@ -251,7 +266,7 @@ var ItemSetChronomancerRegalia = core.NewItemSet(core.ItemSet{ return } mage.BrainFreezeAura.ApplyOnExpire(func(_ *core.Aura, sim *core.Simulation) { - if setBonusAura.IsActive() { + if setBonusAura.IsActive() && sim.Proc(0.30, "Item - Mage T16 4P Bonus - Frigid Blast") { frigidBlast.Cast(sim, mage.CurrentTarget) } }) diff --git a/ui/mage/arcane/gear_sets/p4_bis.gear.json b/ui/mage/arcane/gear_sets/p4_bis.gear.json new file mode 100644 index 0000000000..93ce29fe56 --- /dev/null +++ b/ui/mage/arcane/gear_sets/p4_bis.gear.json @@ -0,0 +1,20 @@ +{ + "items": [ + { "id": 96635, "gems": [95347, 76700], "reforging": 140, "upgradeStep": "UpgradeStepTwo" }, + { "id": 96453, "reforging": 140, "upgradeStep": "UpgradeStepTwo" }, + { "id": 96638, "enchant": 4806, "gems": [76672, 76700], "reforging": 147, "upgradeStep": "UpgradeStepTwo" }, + { "id": 98150, "enchant": 4892, "gems": [76672], "reforging": 144, "upgradeStep": "UpgradeStepTwo" }, + { "id": 96637, "enchant": 4419, "gems": [76672, 76700, 76643], "reforging": 138, "upgradeStep": "UpgradeStepTwo" }, + { "id": 96452, "randomSuffix": -339, "enchant": 4414, "gems": [76700, 0], "upgradeStep": "UpgradeStepTwo" }, + { "id": 96634, "enchant": 4433, "gems": [76672, 0], "reforging": 145, "upgradeStep": "UpgradeStepTwo", "tinker": 4898 }, + { "id": 96462, "gems": [76672, 76700, 76700], "reforging": 140, "upgradeStep": "UpgradeStepTwo" }, + { "id": 95030, "enchant": 4825, "gems": [76672, 76700, 76700], "upgradeStep": "UpgradeStepTwo" }, + { "id": 95004, "enchant": 4429, "gems": [76700, 76643], "reforging": 145, "upgradeStep": "UpgradeStepTwo" }, + { "id": 96529, "gems": [76643], "reforging": 145, "upgradeStep": "UpgradeStepTwo" }, + { "id": 95019, "gems": [76643], "reforging": 154, "upgradeStep": "UpgradeStepTwo" }, + { "id": 96785, "reforging": 140, "upgradeStep": "UpgradeStepTwo" }, + { "id": 96558, "upgradeStep": "UpgradeStepTwo" }, + { "id": 96518, "enchant": 4442, "gems": [76672, 76700], "upgradeStep": "UpgradeStepTwo" }, + { "id": 96562, "enchant": 4434, "gems": [76672], "reforging": 147, "upgradeStep": "UpgradeStepTwo" } + ] +} diff --git a/ui/mage/arcane/presets.ts b/ui/mage/arcane/presets.ts index 2d689bba8f..4991fe1383 100644 --- a/ui/mage/arcane/presets.ts +++ b/ui/mage/arcane/presets.ts @@ -1,22 +1,39 @@ import { Encounter } from '../../core/encounter'; +import { Player } from '../../core/player'; import * as PresetUtils from '../../core/preset_utils'; -import { ConsumesSpec, Glyphs, Profession, Race, Stat } from '../../core/proto/common'; +import { ConsumesSpec, Glyphs, Profession, Race, Spec, Stat } from '../../core/proto/common'; import { ArcaneMage_Options as MageOptions, MageMajorGlyph as MajorGlyph, MageMinorGlyph, MageArmor } from '../../core/proto/mage'; import { SavedTalents } from '../../core/proto/ui'; import { Stats } from '../../core/proto_utils/stats'; +import { TypedEvent } from '../../core/typed_event'; +import { DefaultDebuffs, DefaultRaidBuffs } from '../presets'; import ArcaneApl from './apls/default.apl.json'; import ArcaneCleaveApl from './apls/arcane_cleave.apl.json'; import ArcaneP3APL from './apls/arcane_t15_4pc.apl.json'; import PreBISGear from './gear_sets/prebis.gear.json'; import P2BISGear from './gear_sets/p2_bis.gear.json'; import P3BISGear from './gear_sets/p3_bis.gear.json'; +import P4BISGear from './gear_sets/p4_bis.gear.json'; // Preset options for this spec. // Eventually we will import these values for the raid sim too, so its good to // keep them in a separate file. -export const PREBIS = PresetUtils.makePresetGear('Pre-BIS', PreBISGear); -export const P2_BIS = PresetUtils.makePresetGear('P2 - BIS', P2BISGear); -export const P3_BIS = PresetUtils.makePresetGear('P3 - BIS', P3BISGear); +const setFrostArmor = (player: Player) => { + const specOptions = player.getSpecOptions(); + specOptions.classOptions!.defaultMageArmor = MageArmor.MageArmorFrostArmor; + player.setSpecOptions(TypedEvent.nextEventID(), specOptions); +}; + +const setMageArmor = (player: Player) => { + const specOptions = player.getSpecOptions(); + specOptions.classOptions!.defaultMageArmor = MageArmor.MageArmorMageArmor; + player.setSpecOptions(TypedEvent.nextEventID(), specOptions); +}; + +export const PREBIS = PresetUtils.makePresetGear('Pre-BIS', PreBISGear, { onLoad: setFrostArmor }); +export const P2_BIS = PresetUtils.makePresetGear('P2 - BIS', P2BISGear, { onLoad: setFrostArmor }); +export const P3_BIS = PresetUtils.makePresetGear('P3 - BIS', P3BISGear, { onLoad: setFrostArmor }); +export const P4_BIS = PresetUtils.makePresetGear('P4 - BIS', P4BISGear, { onLoad: setMageArmor }); export const ROTATION_PRESET_DEFAULT = PresetUtils.makePresetAPLRotation('Default', ArcaneApl); export const ROTATION_PRESET_T15_4PC = PresetUtils.makePresetAPLRotation('P3 - T15 4PC', ArcaneP3APL); @@ -111,6 +128,12 @@ export const DefaultArcaneOptions = MageOptions.create({ defaultMageArmor: MageArmor.MageArmorFrostArmor, }, }); + +export const MageArmorOptions = MageOptions.create({ + classOptions: { + defaultMageArmor: MageArmor.MageArmorMageArmor, + }, +}); export const DefaultConsumables = ConsumesSpec.create({ flaskId: 76085, // Flask of the Warm Sun foodId: 74650, // Mogu Fish Stew @@ -125,14 +148,41 @@ export const OtherDefaults = { race: Race.RaceTroll, }; +export const DEFAULT_SETTINGS: PresetUtils.PresetSettings = { + name: 'Default', + specOptions: DefaultArcaneOptions, + consumables: DefaultConsumables, + raidBuffs: DefaultRaidBuffs, + debuffs: DefaultDebuffs, + playerOptions: OtherDefaults, +}; + +export const P4_SETTINGS: PresetUtils.PresetSettings = { + name: 'P4', + specOptions: MageArmorOptions, + consumables: DefaultConsumables, + raidBuffs: DefaultRaidBuffs, + debuffs: DefaultDebuffs, + playerOptions: OtherDefaults, +}; + export const T14_PRESET_BUILD = PresetUtils.makePresetBuild('T14', { gear: P2_BIS, rotation: ROTATION_PRESET_DEFAULT, epWeights: P1_BIS_EP_PRESET, + settings: DEFAULT_SETTINGS, }); export const T15_PRESET_BUILD = PresetUtils.makePresetBuild('T15', { gear: P3_BIS, rotation: ROTATION_PRESET_T15_4PC, epWeights: P3_BIS_EP_PRESET, + settings: DEFAULT_SETTINGS, +}); + +export const T15_P4_PRESET_BUILD = PresetUtils.makePresetBuild('T15 P4', { + gear: P4_BIS, + rotation: ROTATION_PRESET_T15_4PC, + epWeights: P3_BIS_EP_PRESET, + settings: P4_SETTINGS, }); diff --git a/ui/mage/arcane/sim.tsx b/ui/mage/arcane/sim.tsx index a0d94fb561..a2b6e08d99 100644 --- a/ui/mage/arcane/sim.tsx +++ b/ui/mage/arcane/sim.tsx @@ -45,7 +45,7 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecArcaneMage, { defaults: { // Default equipped gear. - gear: Presets.P2_BIS.gear, + gear: Presets.P4_BIS.gear, // Default EP weights for sorting gear in the gear picker. epWeights: Presets.P1_BIS_EP_PRESET.epWeights, // Default stat caps for the Reforge Optimizer @@ -60,7 +60,7 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecArcaneMage, { const hasteBreakpointConfig = StatCap.fromPseudoStat(PseudoStat.PseudoStatSpellHastePercent, { breakpoints: [ hasteBreakpoints.get('5-tick - Living Bomb')!, - // hasteBreakpoints.get('6-tick - Living Bomb')!, + hasteBreakpoints.get('6-tick - Living Bomb')!, hasteBreakpoints.get('7-tick - Living Bomb')!, // hasteBreakpoints.get('8-tick - Living Bomb')!, // hasteBreakpoints.get('9-tick - Living Bomb')!, @@ -119,9 +119,15 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecArcaneMage, { // Preset talents that the user can quickly select. talents: [Presets.ArcaneTalents, Presets.ArcaneTalentsCleave], // Preset gear configurations that the user can quickly select. - gear: [Presets.PREBIS, Presets.P2_BIS, Presets.P3_BIS], - - builds: [Presets.P1_PRESET_BUILD_DEFAULT, Presets.P1_PRESET_BUILD_CLEAVE, Presets.T14_PRESET_BUILD, Presets.T15_PRESET_BUILD], + gear: [Presets.PREBIS, Presets.P2_BIS, Presets.P3_BIS, Presets.P4_BIS], + + builds: [ + Presets.P1_PRESET_BUILD_DEFAULT, + Presets.P1_PRESET_BUILD_CLEAVE, + Presets.T14_PRESET_BUILD, + Presets.T15_PRESET_BUILD, + Presets.T15_P4_PRESET_BUILD, + ], }, autoRotation: (player: Player): APLRotation => { diff --git a/ui/mage/fire/gear_sets/p4_bis.gear.json b/ui/mage/fire/gear_sets/p4_bis.gear.json new file mode 100644 index 0000000000..273748e0af --- /dev/null +++ b/ui/mage/fire/gear_sets/p4_bis.gear.json @@ -0,0 +1,20 @@ +{ + "items": [ + { "id": 96635, "gems": [95347, 76697], "reforging": 137, "upgradeStep": "UpgradeStepTwo" }, + { "id": 96453, "reforging": 140, "upgradeStep": "UpgradeStepTwo" }, + { "id": 96638, "enchant": 4806, "gems": [76660, 76697], "reforging": 154, "upgradeStep": "UpgradeStepTwo" }, + { "id": 98150, "enchant": 4892, "gems": [76660], "upgradeStep": "UpgradeStepTwo" }, + { "id": 96637, "enchant": 4419, "gems": [76660, 76697, 76641], "reforging": 137, "upgradeStep": "UpgradeStepTwo" }, + { "id": 96452, "randomSuffix": -336, "enchant": 4414, "gems": [76697, 0], "upgradeStep": "UpgradeStepTwo" }, + { "id": 96634, "enchant": 4433, "gems": [76660, 0], "upgradeStep": "UpgradeStepTwo", "tinker": 4898 }, + { "id": 94996, "gems": [76641, 76641, 76697], "reforging": 140, "upgradeStep": "UpgradeStepTwo" }, + { "id": 95030, "enchant": 4825, "gems": [76660, 76697, 76697], "reforging": 152, "upgradeStep": "UpgradeStepTwo" }, + { "id": 95004, "enchant": 4429, "gems": [76697, 76641], "upgradeStep": "UpgradeStepTwo" }, + { "id": 96529, "gems": [76697], "reforging": 168, "upgradeStep": "UpgradeStepTwo" }, + { "id": 95019, "gems": [76697], "reforging": 152, "upgradeStep": "UpgradeStepTwo" }, + { "id": 96516, "upgradeStep": "UpgradeStepTwo" }, + { "id": 96413, "reforging": 137, "upgradeStep": "UpgradeStepTwo" }, + { "id": 96610, "enchant": 4442, "gems": [76697, 76697], "reforging": 140, "upgradeStep": "UpgradeStepTwo" }, + { "id": 96562, "enchant": 4434, "gems": [76660], "reforging": 154, "upgradeStep": "UpgradeStepTwo" } + ] +} diff --git a/ui/mage/fire/presets.ts b/ui/mage/fire/presets.ts index d72805eb6f..579517535b 100755 --- a/ui/mage/fire/presets.ts +++ b/ui/mage/fire/presets.ts @@ -15,6 +15,7 @@ import FireApl from './apls/fire.apl.json'; import MasteryApl from './apls/mastery_fire.apl.json'; import P3BISGear from './gear_sets/p3_bis.gear.json'; import P3MasteryGear from './gear_sets/mastery_fire.gear.json'; +import P4BISGear from './gear_sets/p4_bis.gear.json'; // Preset options for this spec. // Eventually we will import these values for the raid sim too, so its good to @@ -24,6 +25,7 @@ import P3MasteryGear from './gear_sets/mastery_fire.gear.json'; // export const P2_BIS = PresetUtils.makePresetGear('P2 - BIS', P2BISGear); export const P3_BIS = PresetUtils.makePresetGear('P3 - Crit BiS', P3BISGear); export const P3_MASTERY = PresetUtils.makePresetGear('P3 - Mastery BiS', P3MasteryGear); +export const P4_BIS = PresetUtils.makePresetGear('P4 - BIS', P4BISGear); export const P1TrollDefaultSimpleRotation = FireMage_Rotation.create({ combustAlwaysSend: 4000000, diff --git a/ui/mage/fire/sim.tsx b/ui/mage/fire/sim.tsx index 21bf98ff06..873e932545 100755 --- a/ui/mage/fire/sim.tsx +++ b/ui/mage/fire/sim.tsx @@ -161,7 +161,7 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecFireMage, { // Preset talents that the user can quickly select. talents: [Presets.FireTalents, Presets.FireTalentsCleave, Presets.FireTalentsMastery], // Preset gear configurations that the user can quickly select. - gear: [Presets.P3_BIS, Presets.P3_MASTERY], + gear: [Presets.P3_BIS, Presets.P3_MASTERY, Presets.P4_BIS], // gear: [Presets.P1_PREBIS, Presets.P1_BIS, Presets.P2_BIS, Presets.P3_BIS, Presets.P3_MASTERY], builds: [ diff --git a/ui/mage/frost/gear_sets/p4_bis.gear.json b/ui/mage/frost/gear_sets/p4_bis.gear.json new file mode 100644 index 0000000000..057937da84 --- /dev/null +++ b/ui/mage/frost/gear_sets/p4_bis.gear.json @@ -0,0 +1,20 @@ +{ + "items": [ + { "id": 96635, "gems": [95347, 76672], "reforging": 140, "upgradeStep": "UpgradeStepTwo" }, + { "id": 96453, "reforging": 140, "upgradeStep": "UpgradeStepTwo" }, + { "id": 96638, "enchant": 4806, "gems": [76694, 76672], "reforging": 147, "upgradeStep": "UpgradeStepTwo" }, + { "id": 98150, "enchant": 4892, "gems": [76694], "upgradeStep": "UpgradeStepTwo" }, + { "id": 96637, "enchant": 4419, "gems": [76694, 76672, 76682], "reforging": 138, "upgradeStep": "UpgradeStepTwo" }, + { "id": 96452, "randomSuffix": -339, "enchant": 4414, "gems": [76672, 0], "upgradeStep": "UpgradeStepTwo" }, + { "id": 96634, "enchant": 4430, "gems": [76694, 0], "reforging": 145, "upgradeStep": "UpgradeStepTwo", "tinker": 4898 }, + { "id": 96462, "gems": [76694, 76672, 76694], "reforging": 140, "upgradeStep": "UpgradeStepTwo" }, + { "id": 95030, "enchant": 4895, "gems": [76694, 76668, 76672], "upgradeStep": "UpgradeStepTwo" }, + { "id": 95004, "enchant": 4429, "gems": [76672, 76682], "reforging": 145, "upgradeStep": "UpgradeStepTwo" }, + { "id": 95019, "gems": [76682], "reforging": 154, "upgradeStep": "UpgradeStepTwo" }, + { "id": 96529, "gems": [76682], "reforging": 145, "upgradeStep": "UpgradeStepTwo" }, + { "id": 96785, "reforging": 140, "upgradeStep": "UpgradeStepTwo" }, + { "id": 96827, "reforging": 154, "upgradeStep": "UpgradeStepTwo" }, + { "id": 96404, "enchant": 4442, "gems": [76682, 76694], "reforging": 147, "upgradeStep": "UpgradeStepTwo" }, + { "id": 96562, "enchant": 4434, "gems": [76694], "reforging": 151, "upgradeStep": "UpgradeStepTwo" } + ] +} diff --git a/ui/mage/frost/presets.ts b/ui/mage/frost/presets.ts index 86ce248c92..97ea014f70 100644 --- a/ui/mage/frost/presets.ts +++ b/ui/mage/frost/presets.ts @@ -10,6 +10,7 @@ import P1PreBISGear from './gear_sets/p1_prebis.gear.json'; import P1BISGear from './gear_sets/p1_bis.gear.json'; import P2BSISGear from './gear_sets/p2_bis.gear.json'; import P3BSISGear from './gear_sets/p3_bis.gear.json'; +import P4BISGear from './gear_sets/p4_bis.gear.json'; // Preset options for this spec. // Eventually we will import these values for the raid sim too, so its good to // keep them in a separate file. @@ -18,6 +19,7 @@ export const P1_PREBIS = PresetUtils.makePresetGear('P1 - Pre-BIS', P1PreBISGear export const P1_BIS = PresetUtils.makePresetGear('P1 - BIS', P1BISGear); export const P2_BIS = PresetUtils.makePresetGear('P2 - BIS', P2BSISGear); export const P3_BIS = PresetUtils.makePresetGear('P3 - BIS', P3BSISGear); +export const P4_BIS = PresetUtils.makePresetGear('P4 - BIS', P4BISGear); export const ROTATION_PRESET_DEFAULT = PresetUtils.makePresetAPLRotation('Default', FrostApl); export const ROTATION_PRESET_AOE = PresetUtils.makePresetAPLRotation('AOE', FrostAoeApl); diff --git a/ui/mage/frost/sim.ts b/ui/mage/frost/sim.ts index 2d4a978d37..92228b8e6c 100644 --- a/ui/mage/frost/sim.ts +++ b/ui/mage/frost/sim.ts @@ -19,6 +19,9 @@ const livingBombBreakpoints = [ mageBombBreakpoints.get('7-tick - Living Bomb')!, mageBombBreakpoints.get('8-tick - Living Bomb')!, ]; +const softcapBreakpoints = [ + mageBombBreakpoints.get('GCD Soft Cap')!, +]; const netherTempestBreakpoints = [ mageBombBreakpoints.get('15-tick - Nether Tempest')!, mageBombBreakpoints.get('16-tick - Nether Tempest')!, @@ -82,7 +85,7 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecFrostMage, { // Default soft caps for the Reforge optimizer softCapBreakpoints: (() => { const hasteSoftCapConfig = StatCap.fromPseudoStat(PseudoStat.PseudoStatSpellHastePercent, { - breakpoints: livingBombBreakpoints, + breakpoints: [...livingBombBreakpoints, ...softcapBreakpoints], capType: StatCapType.TypeThreshold, postCapEPs: P2HastePostCapEPs, }); @@ -140,7 +143,7 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecFrostMage, { // Preset talents that the user can quickly select. talents: [Presets.FrostDefaultTalents, Presets.FrostTalentsCleave, Presets.FrostTalentsAoE], // Preset gear configurations that the user can quickly select. - gear: [Presets.P1_PREBIS, Presets.P1_BIS, Presets.P2_BIS, Presets.P3_BIS], + gear: [Presets.P1_PREBIS, Presets.P1_BIS, Presets.P2_BIS, Presets.P3_BIS, Presets.P4_BIS], builds: [Presets.P1_PRESET_BUILD_DEFAULT, Presets.P1_PRESET_BUILD_CLEAVE, Presets.P1_PRESET_BUILD_AOE], }, @@ -205,9 +208,11 @@ export class FrostMageSimUI extends IndividualSimUI { if (softCap.unitStat.equalsPseudoStat(PseudoStat.PseudoStatSpellHastePercent) && softCapToModify) { const talents = player.getTalents(); if (talents.livingBomb) { - softCapToModify.breakpoints = livingBombBreakpoints; + softCapToModify.breakpoints = [...livingBombBreakpoints, ...softcapBreakpoints]; } else if (talents.netherTempest) { - softCapToModify.breakpoints = netherTempestBreakpoints; + softCapToModify.breakpoints = [...netherTempestBreakpoints, ...softcapBreakpoints]; + } else { + softCapToModify.breakpoints = softcapBreakpoints; } if (avgIlvl >= 517) { softCapToModify.postCapEPs = P3HastePostCapEPs; diff --git a/ui/mage/presets.ts b/ui/mage/presets.ts index 8d8b39f4a0..c47cb87ceb 100644 --- a/ui/mage/presets.ts +++ b/ui/mage/presets.ts @@ -1,4 +1,4 @@ -import { Debuffs, PseudoStat, RaidBuffs } from '../core/proto/common'; +import { Debuffs, PseudoStat, RaidBuffs } from '../core/proto/common'; import { UnitStat, UnitStatPresets } from '../core/proto_utils/stats'; import { defaultRaidBuffMajorDamageCooldowns } from '../core/proto_utils/utils'; @@ -16,6 +16,11 @@ export const LIVING_BOMB_BREAKPOINTS: UnitStatPresets = { ]), }; +export const MISC_BREAKPOINTS: UnitStatPresets = { + unitStat: UnitStat.fromPseudoStat(PseudoStat.PseudoStatSpellHastePercent), + presets: new Map([['GCD Soft Cap', 50.0]]), +}; + export const NETHER_TEMPEST_BREAKPOINTS: UnitStatPresets = { unitStat: UnitStat.fromPseudoStat(PseudoStat.PseudoStatSpellHastePercent), presets: new Map([ @@ -42,7 +47,7 @@ export const NETHER_TEMPEST_BREAKPOINTS: UnitStatPresets = { export const MAGE_BREAKPOINTS: UnitStatPresets = { unitStat: UnitStat.fromPseudoStat(PseudoStat.PseudoStatSpellHastePercent), - presets: new Map([...LIVING_BOMB_BREAKPOINTS.presets, ...NETHER_TEMPEST_BREAKPOINTS.presets].sort((a, b) => a[1] - b[1])), + presets: new Map([...LIVING_BOMB_BREAKPOINTS.presets, ...NETHER_TEMPEST_BREAKPOINTS.presets, ...MISC_BREAKPOINTS.presets].sort((a, b) => a[1] - b[1])), }; export const DefaultRaidBuffs = RaidBuffs.create({ From 3440b1f53215097873e40ed17de91215fdb6385c Mon Sep 17 00:00:00 2001 From: Saji Date: Fri, 13 Mar 2026 09:58:25 -0400 Subject: [PATCH 2/2] review updates --- sim/mage/arcane/arcane_missiles.go | 1 + sim/mage/items.go | 7 +++---- sim/mage/mage.go | 25 +++++++++++++------------ ui/mage/fire/presets.ts | 6 +++--- ui/mage/fire/sim.tsx | 29 ++++++++--------------------- ui/mage/frost/sim.ts | 10 +++++----- 6 files changed, 33 insertions(+), 45 deletions(-) diff --git a/sim/mage/arcane/arcane_missiles.go b/sim/mage/arcane/arcane_missiles.go index 23136d80a0..0706cbe314 100644 --- a/sim/mage/arcane/arcane_missiles.go +++ b/sim/mage/arcane/arcane_missiles.go @@ -20,6 +20,7 @@ func (arcane *ArcaneMage) registerArcaneMissilesSpell() { Duration: time.Second * 20, MaxStacks: 2, })) + arcane.ArcaneMissilesProcAura = arcaneMissilesProcAura arcaneMissilesTickSpell := arcane.GetOrRegisterSpell(core.SpellConfig{ ActionID: actionID.WithTag(1), diff --git a/sim/mage/items.go b/sim/mage/items.go index 9cf33fc0d8..14a1c0bf2b 100644 --- a/sim/mage/items.go +++ b/sim/mage/items.go @@ -232,10 +232,9 @@ var ItemSetChronomancerRegalia = core.NewItemSet(core.ItemSet{ ProcChance: 0.15, Callback: core.CallbackOnSpellHitDealt, Handler: func(sim *core.Simulation, spell *core.Spell, result *core.SpellResult) { - amProcAura := mage.GetAuraByID(core.ActionID{SpellID: 79683}) - if amProcAura != nil { - amProcAura.Activate(sim) - amProcAura.AddStack(sim) + if mage.ArcaneMissilesProcAura != nil { + mage.ArcaneMissilesProcAura.Activate(sim) + mage.ArcaneMissilesProcAura.AddStack(sim) } }, }) diff --git a/sim/mage/mage.go b/sim/mage/mage.go index a92d8a9756..91aeab591c 100644 --- a/sim/mage/mage.go +++ b/sim/mage/mage.go @@ -37,18 +37,19 @@ type Mage struct { IcyVeins *core.Spell Icicle *core.Spell - AlterTimeAura *core.Aura - InvocationAura *core.Aura - RuneOfPowerAura *core.Aura - PresenceOfMindAura *core.Aura - FingersOfFrostAura *core.Aura - BrainFreezeAura *core.Aura - IcyVeinsAura *core.Aura - IceFloesAura *core.Aura - IciclesAura *core.Aura - ArcaneChargesAura *core.Aura - HeatingUp *core.Aura - InstantPyroblastAura *core.Aura + AlterTimeAura *core.Aura + InvocationAura *core.Aura + RuneOfPowerAura *core.Aura + PresenceOfMindAura *core.Aura + FingersOfFrostAura *core.Aura + BrainFreezeAura *core.Aura + IcyVeinsAura *core.Aura + IceFloesAura *core.Aura + IciclesAura *core.Aura + ArcaneChargesAura *core.Aura + HeatingUp *core.Aura + InstantPyroblastAura *core.Aura + ArcaneMissilesProcAura *core.Aura ArcanePowerDamageMod *core.SpellMod diff --git a/ui/mage/fire/presets.ts b/ui/mage/fire/presets.ts index 579517535b..d6de198600 100755 --- a/ui/mage/fire/presets.ts +++ b/ui/mage/fire/presets.ts @@ -23,9 +23,9 @@ import P4BISGear from './gear_sets/p4_bis.gear.json'; // export const P1_PREBIS = PresetUtils.makePresetGear('P1 - Pre-BIS', P1PreBISGear); // export const P1_BIS = PresetUtils.makePresetGear('P1 - BIS', P1BISGear); // export const P2_BIS = PresetUtils.makePresetGear('P2 - BIS', P2BISGear); -export const P3_BIS = PresetUtils.makePresetGear('P3 - Crit BiS', P3BISGear); +// export const P3_BIS = PresetUtils.makePresetGear('P3 - Crit BiS', P3BISGear); export const P3_MASTERY = PresetUtils.makePresetGear('P3 - Mastery BiS', P3MasteryGear); -export const P4_BIS = PresetUtils.makePresetGear('P4 - BIS', P4BISGear); +export const P4_BIS = PresetUtils.makePresetGear('P3/P4 - BIS', P4BISGear); export const P1TrollDefaultSimpleRotation = FireMage_Rotation.create({ combustAlwaysSend: 4000000, @@ -229,7 +229,7 @@ export const MASTERY_SETTINGS: PresetUtils.PresetSettings = { }; export const P3_CRIT_PRESET_BUILD = PresetUtils.makePresetBuild('P3 - Crit', { - gear: P3_BIS, + gear: P4_BIS, rotation: P3_SIMPLE_ROTATION_PRESET_DEFAULT, talents: FireTalents, epWeights: DEFAULT_EP_PRESET, diff --git a/ui/mage/fire/sim.tsx b/ui/mage/fire/sim.tsx index 873e932545..f3127fcc64 100755 --- a/ui/mage/fire/sim.tsx +++ b/ui/mage/fire/sim.tsx @@ -98,7 +98,7 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecFireMage, { defaults: { // Default equipped gear. - gear: Presets.P3_BIS.gear, + gear: Presets.P4_BIS.gear, // Default EP weights for sorting gear in the gear picker. epWeights: Presets.DEFAULT_EP_PRESET.epWeights, // Default stat caps for the Reforge Optimizer @@ -153,33 +153,20 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecFireMage, { presets: { epWeights: [Presets.DEFAULT_EP_PRESET, Presets.P1_PREBIS_EP_PRESET, Presets.MASTERY_EP_PRESET], // Preset rotations that the user can quickly select. - rotations: [ - Presets.P1_ROTATION_PRESET_APL, - Presets.P3_SIMPLE_ROTATION_PRESET_DEFAULT, - Presets.MASTERY_ROTATION_PRESET_APL, - ], + rotations: [Presets.P1_ROTATION_PRESET_APL, Presets.P3_SIMPLE_ROTATION_PRESET_DEFAULT, Presets.MASTERY_ROTATION_PRESET_APL], // Preset talents that the user can quickly select. talents: [Presets.FireTalents, Presets.FireTalentsCleave, Presets.FireTalentsMastery], // Preset gear configurations that the user can quickly select. - gear: [Presets.P3_BIS, Presets.P3_MASTERY, Presets.P4_BIS], + gear: [Presets.P3_MASTERY, Presets.P4_BIS], // gear: [Presets.P1_PREBIS, Presets.P1_BIS, Presets.P2_BIS, Presets.P3_BIS, Presets.P3_MASTERY], - builds: [ - Presets.P3_CRIT_PRESET_BUILD, - Presets.P3_MASTERY_PRESET_BUILD, - ], + builds: [Presets.P3_CRIT_PRESET_BUILD, Presets.P3_MASTERY_PRESET_BUILD], // Saved Encounter presets - encounters: [ - Presets.ENCOUNTER_SINGLE_TARGET, - Presets.ENCOUNTER_MASTERY, - ], + encounters: [Presets.ENCOUNTER_SINGLE_TARGET, Presets.ENCOUNTER_MASTERY], // Saved Settings presets - settings: [ - Presets.CRIT_SETTINGS, - Presets.MASTERY_SETTINGS, - ], + settings: [Presets.CRIT_SETTINGS, Presets.MASTERY_SETTINGS], }, autoRotation: (player: Player): APLRotation => { @@ -284,10 +271,10 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecFireMage, { defaultGear: { [Faction.Unknown]: {}, [Faction.Alliance]: { - 1: Presets.P3_BIS.gear, + 1: Presets.P4_BIS.gear, }, [Faction.Horde]: { - 1: Presets.P3_BIS.gear, + 1: Presets.P4_BIS.gear, }, }, }, diff --git a/ui/mage/frost/sim.ts b/ui/mage/frost/sim.ts index 92228b8e6c..f377813d2e 100644 --- a/ui/mage/frost/sim.ts +++ b/ui/mage/frost/sim.ts @@ -19,9 +19,7 @@ const livingBombBreakpoints = [ mageBombBreakpoints.get('7-tick - Living Bomb')!, mageBombBreakpoints.get('8-tick - Living Bomb')!, ]; -const softcapBreakpoints = [ - mageBombBreakpoints.get('GCD Soft Cap')!, -]; +const softcapBreakpoints = [mageBombBreakpoints.get('GCD Soft Cap')!]; const netherTempestBreakpoints = [ mageBombBreakpoints.get('15-tick - Nether Tempest')!, mageBombBreakpoints.get('16-tick - Nether Tempest')!, @@ -39,14 +37,16 @@ const P2CritPostCapEPs = [ 0.45 * Mechanics.CRIT_RATING_PER_CRIT_PERCENT, 0.35 * Mechanics.CRIT_RATING_PER_CRIT_PERCENT, ]; -const P2HastePostCapEPs = [0.46 * Mechanics.HASTE_RATING_PER_HASTE_PERCENT]; + +const P2HastePostCapEPs = [0.46 * Mechanics.HASTE_RATING_PER_HASTE_PERCENT, 0.44 * Mechanics.HASTE_RATING_PER_HASTE_PERCENT]; const P3CritPostCapEPs = [ 0.51 * Mechanics.CRIT_RATING_PER_CRIT_PERCENT, 0.44 * Mechanics.CRIT_RATING_PER_CRIT_PERCENT, 0.38 * Mechanics.CRIT_RATING_PER_CRIT_PERCENT, ]; -const P3HastePostCapEPs = [0.48 * Mechanics.HASTE_RATING_PER_HASTE_PERCENT]; + +const P3HastePostCapEPs = [0.48 * Mechanics.HASTE_RATING_PER_HASTE_PERCENT, 0.46 * Mechanics.HASTE_RATING_PER_HASTE_PERCENT]; const SPEC_CONFIG = registerSpecConfig(Spec.SpecFrostMage, { cssClass: 'frost-mage-sim-ui',