Skip to content

Commit 8c8ec8c

Browse files
authored
Merge pull request #98 from Polynomix/racials
MoP Racials
2 parents 1110042 + 66a3085 commit 8c8ec8c

3 files changed

Lines changed: 73 additions & 28 deletions

File tree

sim/core/base_stats.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,7 @@ var ClassBaseStats = map[proto.Class]stats.Stats{
225225
}
226226

227227
var ClassBaseScaling = map[proto.Class]float64{
228+
proto.Class_ClassUnknown: 1710.000000,
228229
proto.Class_ClassWarrior: 1246.298600,
229230
proto.Class_ClassPaladin: 1141.926000,
230231
proto.Class_ClassHunter: 1246.298600,

sim/core/consumes.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,13 +57,18 @@ func applyConsumeEffects(agent Agent) {
5757
}
5858
if consumables.FoodId != 0 {
5959
food := ConsumablesByID[consumables.FoodId]
60-
60+
isPanda := character.Race == proto.Race_RaceHordePandaren || character.Race == proto.Race_RaceAlliancePandaren
6161
var foodBuffStats stats.Stats
6262
if food.BuffsMainStat {
63-
buffAmount := food.Stats[stats.Stamina]
63+
buffAmount := TernaryFloat64(isPanda, food.Stats[stats.Stamina]*2, food.Stats[stats.Stamina])
6464
foodBuffStats[stats.Stamina] = buffAmount
6565
foodBuffStats[character.GetHighestStatType([]stats.Stat{stats.Strength, stats.Agility, stats.Intellect})] = buffAmount
6666
} else {
67+
if isPanda {
68+
for stat, amount := range food.Stats {
69+
food.Stats[stat] = amount * 2
70+
}
71+
}
6772
foodBuffStats = food.Stats
6873
}
6974
character.AddStats(foodBuffStats)

sim/core/racials.go

Lines changed: 65 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,7 @@ func applyRaceEffects(agent Agent) {
1212

1313
switch character.Race {
1414
case proto.Race_RaceBloodElf:
15-
character.PseudoStats.ReducedArcaneHitTakenChance += 0.02
16-
character.PseudoStats.ReducedFireHitTakenChance += 0.02
17-
character.PseudoStats.ReducedFrostHitTakenChance += 0.02
18-
character.PseudoStats.ReducedNatureHitTakenChance += 0.02
19-
character.PseudoStats.ReducedShadowHitTakenChance += 0.02
15+
character.PseudoStats.SchoolDamageTakenMultiplier[stats.SchoolIndexArcane] *= 0.99
2016

2117
var actionID ActionID
2218

@@ -25,6 +21,9 @@ func applyRaceEffects(agent Agent) {
2521
if character.HasRunicPowerBar() {
2622
actionID = ActionID{SpellID: 50613}
2723
resourceMetrics = character.NewRunicPowerMetrics(actionID)
24+
} else if character.Class == proto.Class_ClassMonk {
25+
actionID = ActionID{SpellID: 129597}
26+
resourceMetrics = character.NewChiMetrics(actionID)
2827
} else if character.HasEnergyBar() {
2928
actionID = ActionID{SpellID: 25046}
3029
resourceMetrics = character.NewEnergyMetrics(actionID)
@@ -52,10 +51,12 @@ func applyRaceEffects(agent Agent) {
5251
ApplyEffects: func(sim *Simulation, _ *Unit, spell *Spell) {
5352
if spell.Unit.HasRunicPowerBar() {
5453
spell.Unit.AddRunicPower(sim, 15.0, resourceMetrics)
54+
} else if character.Class == proto.Class_ClassMonk {
55+
spell.Unit.AddComboPoints(sim, 1, resourceMetrics)
5556
} else if spell.Unit.HasEnergyBar() {
5657
spell.Unit.AddEnergy(sim, 15.0, resourceMetrics)
5758
} else if spell.Unit.HasManaBar() {
58-
spell.Unit.AddMana(sim, spell.Unit.MaxMana()*0.06, resourceMetrics)
59+
spell.Unit.AddMana(sim, spell.Unit.MaxMana()*0.02, resourceMetrics)
5960
} else if spell.Unit.HasRageBar() {
6061
spell.Unit.AddRage(sim, 15.0, resourceMetrics)
6162
} else if spell.Unit.HasFocusBar() {
@@ -71,6 +72,8 @@ func applyRaceEffects(agent Agent) {
7172
ShouldActivate: func(sim *Simulation, character *Character) bool {
7273
if spell.Unit.HasRunicPowerBar() {
7374
return character.CurrentRunicPower() <= character.maxRunicPower-15
75+
} else if character.Class == proto.Class_ClassMonk {
76+
return character.ComboPoints() <= character.maxComboPoints-1
7477
} else if spell.Unit.HasEnergyBar() {
7578
return character.CurrentEnergy() <= character.maxEnergy-15
7679
} else if spell.Unit.HasRageBar() {
@@ -82,14 +85,14 @@ func applyRaceEffects(agent Agent) {
8285
},
8386
})
8487
case proto.Race_RaceDraenei:
85-
character.PseudoStats.ReducedShadowHitTakenChance += 0.02
8688
character.AddStats(stats.Stats{
8789
stats.PhysicalHitPercent: 1,
8890
stats.SpellHitPercent: 1,
8991
})
92+
character.PseudoStats.SchoolDamageTakenMultiplier[stats.SchoolIndexShadow] *= 0.99
9093
// TODO: Gift of the naaru for healers
9194
case proto.Race_RaceDwarf:
92-
character.PseudoStats.ReducedFrostHitTakenChance += 0.02
95+
character.PseudoStats.SchoolDamageTakenMultiplier[stats.SchoolIndexFrost] *= 0.99
9396

9497
// Crack Shot: 1% Expertise with Ranged Weapons
9598
ranged := character.Ranged()
@@ -99,18 +102,17 @@ func applyRaceEffects(agent Agent) {
99102
character.AddStat(stats.ExpertiseRating, ExpertisePerQuarterPercentReduction*4)
100103
}
101104

102-
applyWeaponSpecialization(character, 3*ExpertisePerQuarterPercentReduction,
105+
applyWeaponSpecialization(character, 4*ExpertisePerQuarterPercentReduction,
103106
proto.WeaponType_WeaponTypeMace)
104107

105108
actionID := ActionID{SpellID: 20594}
106109

107-
statDep := character.NewDynamicMultiplyStat(stats.Armor, 1.1)
108110
stoneFormAura := character.NewTemporaryStatsAuraWrapped("Stoneform", actionID, stats.Stats{}, time.Second*8, func(aura *Aura) {
109111
aura.ApplyOnGain(func(aura *Aura, sim *Simulation) {
110-
aura.Unit.EnableDynamicStatDep(sim, statDep)
112+
character.PseudoStats.DamageTakenMultiplier *= 0.90
111113
})
112114
aura.ApplyOnExpire(func(aura *Aura, sim *Simulation) {
113-
aura.Unit.DisableDynamicStatDep(sim, statDep)
115+
character.PseudoStats.DamageTakenMultiplier /= 0.90
114116
})
115117
})
116118

@@ -133,16 +135,16 @@ func applyRaceEffects(agent Agent) {
133135
Type: CooldownTypeDPS,
134136
})
135137
case proto.Race_RaceGnome:
136-
character.PseudoStats.ReducedArcaneHitTakenChance += 0.02
138+
character.PseudoStats.SchoolDamageTakenMultiplier[stats.SchoolIndexArcane] *= 0.99
137139
character.MultiplyStat(stats.Mana, 1.05)
138-
applyOneHandWeaponSpecialization(character, 3*ExpertisePerQuarterPercentReduction,
140+
applyOneHandWeaponSpecialization(character, 4*ExpertisePerQuarterPercentReduction,
139141
proto.WeaponType_WeaponTypeSword, proto.WeaponType_WeaponTypeDagger)
140142
case proto.Race_RaceHuman:
141143
character.MultiplyStat(stats.Spirit, 1.03)
142-
applyWeaponSpecialization(character, 3*ExpertisePerQuarterPercentReduction,
144+
applyWeaponSpecialization(character, 4*ExpertisePerQuarterPercentReduction,
143145
proto.WeaponType_WeaponTypeMace, proto.WeaponType_WeaponTypeSword)
144146
case proto.Race_RaceNightElf:
145-
character.PseudoStats.ReducedNatureHitTakenChance += 0.02
147+
character.PseudoStats.SchoolDamageTakenMultiplier[stats.SchoolIndexNature] *= 0.99
146148
character.PseudoStats.ReducedPhysicalHitTakenChance += 0.02
147149

148150
// Shadowmeld
@@ -192,9 +194,9 @@ func applyRaceEffects(agent Agent) {
192194
})
193195

194196
case proto.Race_RaceOrc:
195-
// Command (Pet damage +5%)
197+
// Command (Pet damage +2%)
196198
for _, pet := range character.Pets {
197-
pet.PseudoStats.DamageDealtMultiplier *= 1.05
199+
pet.PseudoStats.DamageDealtMultiplier *= 1.02
198200
}
199201

200202
// Blood Fury
@@ -204,14 +206,17 @@ func applyRaceEffects(agent Agent) {
204206

205207
switch character.Class {
206208
case proto.Class_ClassMage:
207-
spBonus = 584.5
209+
spBonus = 2257.0
208210
case proto.Class_ClassWarlock:
209-
spBonus = 584.5
211+
spBonus = 2257.0
210212
case proto.Class_ClassShaman:
211-
spBonus = 584.5
212-
apBonus = 1169.0
213+
spBonus = 2257.0
214+
apBonus = 4514.0
215+
case proto.Class_ClassMonk:
216+
spBonus = 2257.0
217+
apBonus = 4514.0
213218
default:
214-
apBonus = 1169.0
219+
apBonus = 4514.0
215220
}
216221

217222
buffStats := stats.Stats{stats.AttackPower: apBonus, stats.RangedAttackPower: apBonus, stats.SpellPower: spBonus}
@@ -227,10 +232,10 @@ func applyRaceEffects(agent Agent) {
227232
})
228233

229234
// Axe specialization
230-
applyWeaponSpecialization(character, 3*ExpertisePerQuarterPercentReduction,
235+
applyWeaponSpecialization(character, 4*ExpertisePerQuarterPercentReduction,
231236
proto.WeaponType_WeaponTypeAxe, proto.WeaponType_WeaponTypeFist)
232237
case proto.Race_RaceTauren:
233-
character.PseudoStats.ReducedNatureHitTakenChance += 0.02
238+
character.PseudoStats.SchoolDamageTakenMultiplier[stats.SchoolIndexNature] *= 0.99
234239
character.AddStat(stats.Health, character.GetBaseStats()[stats.Health]*0.05)
235240
case proto.Race_RaceTroll:
236241
// Dead Eye: 1% Expertise with Guns, Bows or Crossbows.
@@ -285,14 +290,48 @@ func applyRaceEffects(agent Agent) {
285290
Type: CooldownTypeDPS,
286291
})
287292
case proto.Race_RaceUndead:
288-
character.PseudoStats.ReducedShadowHitTakenChance += 0.02
293+
character.PseudoStats.SchoolDamageTakenMultiplier[stats.SchoolIndexShadow] *= 0.99
294+
295+
touchOfTheGraveSpell := character.RegisterSpell(SpellConfig{
296+
ActionID: ActionID{SpellID: 127802},
297+
SpellSchool: SpellSchoolShadow,
298+
ProcMask: ProcMaskSpellProc,
299+
CritMultiplier: character.DefaultCritMultiplier(),
300+
ApplyEffects: func(sim *Simulation, target *Unit, spell *Spell) {
301+
baseDamage := sim.Roll(CalcScalingSpellEffectVarianceMinMax(proto.Class_ClassUnknown, 8, 0.15000000596))
302+
result := spell.CalcDamage(sim, target, baseDamage, spell.OutcomeMagicHit)
303+
healAmount := result.Damage * spell.Unit.PseudoStats.HealingTakenMultiplier
304+
spell.DealDamage(sim, result)
305+
result.Target = spell.Unit
306+
result.Damage = healAmount
307+
spell.DealHealing(sim, result)
308+
},
309+
})
310+
311+
MakeProcTriggerAura(&character.Unit, ProcTrigger{
312+
Name: "Touch of the Grave",
313+
ActionID: ActionID{SpellID: 5227},
314+
Callback: CallbackOnSpellHitDealt | CallbackOnPeriodicDamageDealt,
315+
ProcMask: ProcMaskSpellDamage | ProcMaskMelee,
316+
Outcome: OutcomeLanded,
317+
ProcChance: 0.2,
318+
ICD: time.Second * 15,
319+
Handler: func(sim *Simulation, spell *Spell, result *SpellResult) {
320+
touchOfTheGraveSpell.Cast(sim, result.Target)
321+
},
322+
})
289323
case proto.Race_RaceWorgen:
324+
character.PseudoStats.SchoolDamageTakenMultiplier[stats.SchoolIndexNature] *= 0.99
325+
character.PseudoStats.SchoolDamageTakenMultiplier[stats.SchoolIndexShadow] *= 0.99
290326
character.AddStat(stats.PhysicalCritPercent, 1)
291327
character.AddStat(stats.SpellCritPercent, 1)
292328
case proto.Race_RaceGoblin:
293329
character.PseudoStats.MeleeSpeedMultiplier *= 1.01
294330
character.PseudoStats.RangedSpeedMultiplier *= 1.01
295331
character.PseudoStats.CastSpeedMultiplier *= 1.01
332+
case proto.Race_RaceAlliancePandaren:
333+
case proto.Race_RaceHordePandaren:
334+
//Epicurean in consumes.go
296335
}
297336
}
298337

0 commit comments

Comments
 (0)