Skip to content

Commit 1548bfe

Browse files
authored
Merge pull request #1240 from wowsims/feature/mage
Fix Critical Mass + T15 4PC crit %
2 parents ea7fe5d + dd14312 commit 1548bfe

File tree

4 files changed

+28
-21
lines changed

4 files changed

+28
-21
lines changed

sim/mage/fire/TestFire.results

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1692,8 +1692,8 @@ dps_results: {
16921692
dps_results: {
16931693
key: "TestFire-AllItems-RegaliaoftheChromaticHydra"
16941694
value: {
1695-
dps: 142343.07242
1696-
tps: 138829.67592
1695+
dps: 142225.27308
1696+
tps: 138708.57938
16971697
}
16981698
}
16991699
dps_results: {

sim/mage/fire/critical_mass.go

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,32 +8,44 @@ import (
88

99
func (fire *FireMage) registerCriticalMass() {
1010

11-
getCritPercent := func() float64 {
12-
return fire.GetStat(stats.SpellCritPercent) * fire.criticalMassMultiplier
11+
getCritPercent := func(isPyroblast bool) float64 {
12+
pyroblastCritChance := core.TernaryFloat64(isPyroblast && fire.T15_4pc != nil && fire.T15_4pc.IsActive(), 5, 0)
13+
return pyroblastCritChance + ((fire.GetStat(stats.SpellCritPercent) + pyroblastCritChance) * fire.criticalMassMultiplier)
1314
}
1415

1516
criticalMassCritBuffMod := fire.AddDynamicMod(core.SpellModConfig{
16-
FloatValue: getCritPercent(),
17-
ClassMask: mage.MageSpellFireball | mage.MageSpellFrostfireBolt | mage.MageSpellScorch | mage.MageSpellPyroblast | mage.MageSpellPyroblastDot,
17+
FloatValue: getCritPercent(false),
18+
ClassMask: mage.MageSpellFireball | mage.MageSpellFrostfireBolt | mage.MageSpellScorch,
19+
Kind: core.SpellMod_BonusCrit_Percent,
20+
})
21+
22+
// Separate mod for Pyroblast since it has a different crit bonus from T15 4-piece
23+
// which is additive and Critical Mass is multiplicative.
24+
criticalMassPyroCritBuffMod := fire.AddDynamicMod(core.SpellModConfig{
25+
FloatValue: getCritPercent(true),
26+
ClassMask: mage.MageSpellPyroblast | mage.MageSpellPyroblastDot,
1827
Kind: core.SpellMod_BonusCrit_Percent,
1928
})
2029

2130
core.MakePermanent(fire.RegisterAura(core.Aura{
2231
Label: "Critical Mass",
2332
OnGain: func(aura *core.Aura, sim *core.Simulation) {
2433
criticalMassCritBuffMod.Activate()
34+
criticalMassPyroCritBuffMod.Activate()
2535
},
2636
OnExpire: func(aura *core.Aura, sim *core.Simulation) {
2737
criticalMassCritBuffMod.Deactivate()
38+
criticalMassPyroCritBuffMod.Deactivate()
2839
},
2940
}))
3041

3142
fire.AddOnTemporaryStatsChange(func(sim *core.Simulation, buffAura *core.Aura, statsChangeWithoutDeps stats.Stats) {
32-
criticalMassCritBuffMod.UpdateFloatValue(getCritPercent())
43+
criticalMassCritBuffMod.UpdateFloatValue(getCritPercent(false))
44+
criticalMassPyroCritBuffMod.UpdateFloatValue(getCritPercent(true))
3345
})
3446

3547
fire.RegisterResetEffect(func(sim *core.Simulation) {
36-
criticalMassCritBuffMod.UpdateFloatValue(getCritPercent())
48+
criticalMassCritBuffMod.UpdateFloatValue(getCritPercent(false))
49+
criticalMassPyroCritBuffMod.UpdateFloatValue(getCritPercent(true))
3750
})
38-
3951
}

sim/mage/items.go

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -98,17 +98,13 @@ var ItemSetRegaliaOfTheChromaticHydra = core.NewItemSet(core.ItemSet{
9898
4: func(agent core.Agent, setBonusAura *core.Aura) {
9999
mage := agent.(MageAgent).GetMage()
100100

101-
setBonusAura.AttachSpellMod(core.SpellModConfig{
102-
Kind: core.SpellMod_BonusCrit_Percent,
103-
ClassMask: MageSpellPyroblast | MageSpellPyroblastDot,
104-
FloatValue: 5,
105-
})
101+
// Pyroblast is handled in critical_mass.go
102+
// Frostbolt is handled in mage.go#ProcFingersOfFrost
103+
mage.T15_4pc = setBonusAura
106104
setBonusAura.ApplyOnGain(func(_ *core.Aura, _ *core.Simulation) {
107105
mage.T15_4PC_ArcaneChargeEffect += 0.05
108-
mage.T15_4PC_FrostboltProcChance += 0.06
109106
}).ApplyOnExpire(func(_ *core.Aura, _ *core.Simulation) {
110107
mage.T15_4PC_ArcaneChargeEffect -= 0.05
111-
mage.T15_4PC_FrostboltProcChance -= 0.06
112108
})
113109

114110
setBonusAura.ExposeToAPL(138376)

sim/mage/mage.go

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -52,11 +52,11 @@ type Mage struct {
5252

5353
ArcanePowerDamageMod *core.SpellMod
5454

55-
T15_4PC_FrostboltProcChance float64
56-
T15_4PC_ArcaneChargeEffect float64
57-
Icicles []float64
55+
T15_4PC_ArcaneChargeEffect float64
56+
Icicles []float64
5857

5958
// Item sets
59+
T15_4pc *core.Aura
6060
T16_4pc *core.Aura
6161
}
6262

@@ -91,7 +91,7 @@ func (mage *Mage) ProcFingersOfFrost(sim *core.Simulation, spell *core.Spell) {
9191
return
9292
}
9393
if spell.Matches(MageSpellFrostbolt | MageSpellFrostfireBolt) {
94-
if sim.Proc(0.15+core.TernaryFloat64(spell.Matches(MageSpellFrostbolt), mage.T15_4PC_FrostboltProcChance, 0), "FingersOfFrostProc") {
94+
if sim.Proc(0.15+core.TernaryFloat64(spell.Matches(MageSpellFrostbolt) && mage.T15_4pc != nil && mage.T15_4pc.IsActive(), 0.06, 0), "FingersOfFrostProc") {
9595
mage.FingersOfFrostAura.Activate(sim)
9696
mage.FingersOfFrostAura.AddStack(sim)
9797
}
@@ -166,7 +166,6 @@ func NewMage(character *core.Character, options *proto.Player, mageOptions *prot
166166
mage.HasteEffectsManaRegen()
167167

168168
mage.Icicles = make([]float64, 0)
169-
mage.T15_4PC_FrostboltProcChance = 0
170169
mage.T15_4PC_ArcaneChargeEffect = 1.0
171170

172171
return mage

0 commit comments

Comments
 (0)