Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Warrior baseline spells #43

Merged
merged 43 commits into from
Apr 11, 2024
Merged
Changes from 1 commit
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
7c050e7
Implement shouts and adjust related raid buffs
Swillis57 Mar 25, 2024
b54c5f4
Berserker Rage
Swillis57 Mar 25, 2024
e82fa69
Bloodrage removed, replaced by rage gen on shouts
Swillis57 Mar 25, 2024
2c163d5
_execute.go -> execute.go
Swillis57 Mar 25, 2024
4ee18a2
Execute
Swillis57 Mar 25, 2024
d9877e6
_demoralizing_shout -> demoralizing_shout
Swillis57 Mar 25, 2024
4efb5c8
Demo shout
Swillis57 Mar 25, 2024
254d2eb
_heroic_strike_cleave -> heroic_strike_cleave
Swillis57 Mar 25, 2024
221698b
Heroic Strike + Cleave
Swillis57 Mar 25, 2024
c597e6c
_heroic_throw -> heroic_throw
Swillis57 Mar 25, 2024
bbb0b4f
Heroic Throw
Swillis57 Mar 25, 2024
ea3e477
_overpower -> overpower
Swillis57 Mar 25, 2024
2b68f00
Overpower
Swillis57 Mar 25, 2024
f5e99e4
_recklessness -> recklessness
Swillis57 Mar 25, 2024
aea7a61
Recklessness
Swillis57 Mar 26, 2024
fcca6e9
_rend -> rend
Swillis57 Mar 26, 2024
6fa9d2b
Rend
Swillis57 Mar 26, 2024
e6d00cd
_revenge -> revenge
Swillis57 Mar 26, 2024
15ad96e
Revenge
Swillis57 Mar 26, 2024
28eec5b
_shattering_throw -> shattering_throw
Swillis57 Mar 26, 2024
a06565a
Shattering Throw
Swillis57 Mar 26, 2024
a58aa49
_shield_block -> shield_block
Swillis57 Mar 26, 2024
84c8369
Pull target-specific avoidance calculations into their own functions
Swillis57 Mar 26, 2024
a88c100
Shield Block
Swillis57 Mar 26, 2024
c91f362
re-add baseline spell files
Swillis57 Mar 26, 2024
f475a43
Remaining baseline abilities
Swillis57 Mar 29, 2024
c72dff6
New abilities: Inner Rage + Colossus Smash
Swillis57 Mar 29, 2024
1052c3c
Fix test buffs
Swillis57 Mar 29, 2024
0bcb2e6
Fixing raid buffs
Swillis57 Mar 30, 2024
adeca71
General cleanup and early beta tweaks
Swillis57 Mar 30, 2024
7c172e5
Merge branch 'wowsims:master' into warrior-baseline-spells
Swillis57 Mar 30, 2024
7870ecb
Update armor test - Sunder Armor now only stacks to 3
Swillis57 Mar 31, 2024
319f6e1
Merge branch 'warrior-baseline-spells' of https://github.com/Swillis5…
Swillis57 Mar 31, 2024
943aba7
Update test results
Swillis57 Mar 31, 2024
a6f93ad
Merge branch 'master' of https://github.com/wowsims/cata into warrior…
Swillis57 Mar 31, 2024
eb96ed2
Fix dumb implementation mistakes
Swillis57 Mar 31, 2024
6df1f42
Merge branch 'master' of https://github.com/Swillis57/cata into warri…
Swillis57 Apr 11, 2024
cd306e7
Update tests
Swillis57 Apr 11, 2024
3c08bb4
SpellMod system updates. Passive effect glyphs were converted into Sp…
Swillis57 Apr 11, 2024
a26b195
Don't waste a SpellMask bit for 0
Swillis57 Apr 11, 2024
a8748cd
Review fixes
Swillis57 Apr 11, 2024
2ddb49a
Merge branch 'master' of https://github.com/wowsims/cata into warrior…
Swillis57 Apr 11, 2024
f1b91a4
Update tests
Swillis57 Apr 11, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
Implement shouts and adjust related raid buffs
Swillis57 committed Mar 25, 2024
commit 7c050e7308863cb88b5b77a505cf01d24620e7b9
10 changes: 4 additions & 6 deletions proto/common.proto
Original file line number Diff line number Diff line change
@@ -413,24 +413,22 @@ message RaidBuffs {
TristateEffect gift_of_the_wild = 1;

// +Stam
TristateEffect power_word_fortitude = 2;
bool power_word_fortitude = 2;
bool commanding_shout = 3;

// +Health
TristateEffect commanding_shout = 3;
TristateEffect blood_pact = 4;

// + Agi and Str
bool horn_of_winter = 5;
TristateEffect strength_of_earth_totem = 6; // none, normal, 15% improved
bool strength_of_earth_totem = 6;
bool battle_shout = 10;

// +Intell and/or Spi
bool arcane_brilliance = 7;
TristateEffect fel_intelligence = 8;
bool divine_spirit = 9;

// +AP
TristateEffect battle_shout = 10;

// 10% AP
bool trueshot_aura = 11;
bool unleashed_rage = 12;
122 changes: 96 additions & 26 deletions sim/core/buffs.go
Original file line number Diff line number Diff line change
@@ -108,17 +108,14 @@ func applyBuffEffects(agent Agent, raidBuffs *proto.RaidBuffs, partyBuffs *proto
})
}

if raidBuffs.CommandingShout > 0 {
MakePermanent(CommandingShoutAura(&character.Unit, GetTristateValueInt32(raidBuffs.CommandingShout, 0, 5), 0, false))
}
if raidBuffs.BloodPact > 0 {
MakePermanent(BloodPactAura(&character.Unit, GetTristateValueInt32(raidBuffs.BloodPact, 0, 3)))
}

if raidBuffs.PowerWordFortitude != proto.TristateEffect_TristateEffectMissing {
character.AddStats(stats.Stats{
stats.Stamina: GetTristateValueFloat(raidBuffs.PowerWordFortitude, 165, 165*1.3),
})
if raidBuffs.PowerWordFortitude {
MakePermanent(FortitudeAura(&character.Unit))
} else if raidBuffs.CommandingShout {
MakePermanent(CommandingShoutAura(&character.Unit, false))
} else if raidBuffs.ScrollOfStamina {
character.AddStats(stats.Stats{
stats.Stamina: 132,
@@ -209,9 +206,6 @@ func applyBuffEffects(agent Agent, raidBuffs *proto.RaidBuffs, partyBuffs *proto
RetributionAura(character, raidBuffs.SanctifiedRetribution)
}

if raidBuffs.BattleShout > 0 {
MakePermanent(BattleShoutAura(&character.Unit, GetTristateValueInt32(raidBuffs.BattleShout, 0, 5), 0, false))
}
if individualBuffs.BlessingOfMight > 0 {
MakePermanent(BlessingOfMightAura(&character.Unit, GetTristateValueInt32(individualBuffs.BlessingOfMight, 0, 2)))
}
@@ -232,13 +226,14 @@ func applyBuffEffects(agent Agent, raidBuffs *proto.RaidBuffs, partyBuffs *proto
if raidBuffs.WrathOfAirTotem {
character.PseudoStats.CastSpeedMultiplier *= 1.05
}
if raidBuffs.StrengthOfEarthTotem > 0 || raidBuffs.HornOfWinter {
val := max(proto.TristateEffect_TristateEffectRegular, raidBuffs.StrengthOfEarthTotem)
bonus := GetTristateValueFloat(val, 155, 178)
character.AddStats(stats.Stats{
stats.Strength: bonus,
stats.Agility: bonus,
})
if raidBuffs.StrengthOfEarthTotem || raidBuffs.HornOfWinter || raidBuffs.BattleShout {
if raidBuffs.StrengthOfEarthTotem {
MakePermanent(StrengthOfEarthTotemAura(&character.Unit))
} else if raidBuffs.BattleShout {
MakePermanent(BattleShoutAura(&character.Unit, false))
} else {
MakePermanent(HornOfWinterAura(&character.Unit, false))
}
} else {
if raidBuffs.ScrollOfStrength {
character.AddStats(stats.Stats{
@@ -333,7 +328,7 @@ func applyPetBuffEffects(petAgent PetAgent, raidBuffs *proto.RaidBuffs, partyBuf
raidBuffs.ArcaneBrilliance = false
raidBuffs.DivineSpirit = false
raidBuffs.GiftOfTheWild = 0
raidBuffs.PowerWordFortitude = 0
raidBuffs.PowerWordFortitude = false
raidBuffs.Thorns = 0
raidBuffs.ShadowProtection = false
raidBuffs.DrumsOfForgottenKings = false
@@ -1381,17 +1376,62 @@ func spellPowerBonusEffect(aura *Aura, spellPowerBonus float64) *ExclusiveEffect
})
}

func BattleShoutAura(unit *Unit, commandingPresencePts int32, boomingVoicePts int32, minorGlyph bool) *Aura {
// TODO: find the actual str/agi bonus for these. wowhead doesn't have it yet
// guesstimate for now based on lack of SoE totem/HoW buff changes in 4.0.1
func BattleShoutAura(unit *Unit, minorGlyph bool) *Aura {
aura := unit.GetOrRegisterAura(Aura{
Label: "Battle Shout",
ActionID: ActionID{SpellID: 47436},
Duration: time.Duration(float64(time.Minute*2)*(1+0.25*float64(boomingVoicePts))) + TernaryDuration(minorGlyph, 2*time.Minute, 0),
ActionID: ActionID{SpellID: 6673},
Duration: time.Duration(float64(time.Minute*2)) + TernaryDuration(minorGlyph, 2*time.Minute, 0),
BuildPhase: CharacterBuildPhaseBuffs,
})

strengthAgilityBonusEffect(aura, 155)
return aura
}

func HornOfWinterAura(unit *Unit, minorGlyph bool) *Aura {
aura := unit.GetOrRegisterAura(Aura{
Label: "Horn of Winter",
ActionID: ActionID{SpellID: 57330},
Duration: time.Duration(float64(time.Minute*2)) + TernaryDuration(minorGlyph, time.Minute, 0),
BuildPhase: CharacterBuildPhaseBuffs,
})
attackPowerBonusEffect(aura, math.Floor(550*(1+0.05*float64(commandingPresencePts))))

strengthAgilityBonusEffect(aura, 155)
return aura
}

func StrengthOfEarthTotemAura(unit *Unit) *Aura {
aura := unit.GetOrRegisterAura(Aura{
Label: "Strength of Earth Totem",
ActionID: ActionID{SpellID: 8075},
Duration: time.Duration(float64(time.Minute * 5)),
BuildPhase: CharacterBuildPhaseBuffs,
})

strengthAgilityBonusEffect(aura, 155)
return aura
}

func strengthAgilityBonusEffect(aura *Aura, strBonus float64) *ExclusiveEffect {
return aura.NewExclusiveEffect("StrengthAgilityBonus", false, ExclusiveEffect{
Priority: strBonus,
OnGain: func(ee *ExclusiveEffect, sim *Simulation) {
ee.Aura.Unit.AddStatsDynamic(sim, stats.Stats{
stats.Strength: ee.Priority,
stats.Agility: ee.Priority,
})
},
OnExpire: func(ee *ExclusiveEffect, sim *Simulation) {
ee.Aura.Unit.AddStatsDynamic(sim, stats.Stats{
stats.Strength: -ee.Priority,
stats.Agility: -ee.Priority,
})
},
})
}

func BlessingOfMightAura(unit *Unit, impBomPts int32) *Aura {
aura := unit.GetOrRegisterAura(Aura{
Label: "Blessing of Might",
@@ -1424,17 +1464,47 @@ func attackPowerBonusEffect(aura *Aura, apBonus float64) *ExclusiveEffect {
})
}

func CommandingShoutAura(unit *Unit, commandingPresencePts int32, boomingVoicePts int32, minorGlyph bool) *Aura {
// TODO: same as str/agi buffs, placeholder values until we can get the actual values
func CommandingShoutAura(unit *Unit, minorGlyph bool) *Aura {
aura := unit.GetOrRegisterAura(Aura{
Label: "Commanding Shout",
ActionID: ActionID{SpellID: 47440},
Duration: time.Duration(float64(time.Minute*2)*(1+0.25*float64(boomingVoicePts))) + TernaryDuration(minorGlyph, 2*time.Minute, 0),
ActionID: ActionID{SpellID: 469},
Duration: time.Duration(float64(time.Minute*2)) + TernaryDuration(minorGlyph, 2*time.Minute, 0),
BuildPhase: CharacterBuildPhaseBuffs,
})

staminaBonusEffect(aura, 165)
return aura
}

func FortitudeAura(unit *Unit) *Aura {
aura := unit.GetOrRegisterAura(Aura{
Label: "Prayer of Fortitude",
ActionID: ActionID{SpellID: 21562},
Duration: time.Duration(float64(time.Hour)),
BuildPhase: CharacterBuildPhaseBuffs,
})
healthBonusEffect(aura, 2255*(1+0.05*float64(commandingPresencePts)))

staminaBonusEffect(aura, 165)
return aura
}

func staminaBonusEffect(aura *Aura, stamBonus float64) *ExclusiveEffect {
return aura.NewExclusiveEffect("StaminaBonus", false, ExclusiveEffect{
Priority: stamBonus,
OnGain: func(ee *ExclusiveEffect, sim *Simulation) {
ee.Aura.Unit.AddStatsDynamic(sim, stats.Stats{
stats.Stamina: stamBonus,
})
},
OnExpire: func(ee *ExclusiveEffect, sim *Simulation) {
ee.Aura.Unit.AddStatsDynamic(sim, stats.Stats{
stats.Stamina: -stamBonus,
})
},
})
}

func BloodPactAura(unit *Unit, impImpPts int32) *Aura {
aura := unit.GetOrRegisterAura(Aura{
Label: "Blood Pact",
19 changes: 12 additions & 7 deletions sim/warrior/_shouts.go → sim/warrior/shouts.go
Original file line number Diff line number Diff line change
@@ -10,21 +10,26 @@ import (
const ShoutExpirationThreshold = time.Second * 3

func (warrior *Warrior) makeShoutSpellHelper(actionID core.ActionID, allyAuras core.AuraArray) *core.Spell {

shoutMetrics := warrior.NewRageMetrics(actionID)
rageGen := 20.0 + 5.0*float64(warrior.Talents.BoomingVoice)
cd := time.Minute - time.Duration(15*float64(warrior.Talents.BoomingVoice))*time.Second
return warrior.RegisterSpell(core.SpellConfig{
ActionID: actionID,
Flags: core.SpellFlagNoOnCastComplete | core.SpellFlagAPL | core.SpellFlagHelpful,

RageCost: core.RageCostOptions{
Cost: 10,
},
Cast: core.CastConfig{
DefaultCast: core.Cast{
GCD: core.GCDDefault,
},
IgnoreHaste: true,
CD: core.Cooldown{
Duration: cd,
},
},

ApplyEffects: func(sim *core.Simulation, _ *core.Unit, _ *core.Spell) {
warrior.AddRage(sim, rageGen, shoutMetrics)
for _, aura := range allyAuras {
if aura != nil {
aura.Activate(sim)
@@ -37,11 +42,11 @@ func (warrior *Warrior) makeShoutSpellHelper(actionID core.ActionID, allyAuras c
}

func (warrior *Warrior) registerShouts() {
warrior.BattleShout = warrior.makeShoutSpellHelper(core.ActionID{SpellID: 47436}, warrior.NewAllyAuraArray(func(unit *core.Unit) *core.Aura {
return core.BattleShoutAura(unit, warrior.Talents.CommandingPresence, warrior.Talents.BoomingVoice, warrior.HasMinorGlyph(proto.WarriorMinorGlyph_GlyphOfBattle))
warrior.BattleShout = warrior.makeShoutSpellHelper(core.ActionID{SpellID: 6673}, warrior.NewAllyAuraArray(func(unit *core.Unit) *core.Aura {
return core.BattleShoutAura(unit, warrior.HasMinorGlyph(proto.WarriorMinorGlyph_GlyphOfBattle))
}))

warrior.CommandingShout = warrior.makeShoutSpellHelper(core.ActionID{SpellID: 47440}, warrior.NewAllyAuraArray(func(unit *core.Unit) *core.Aura {
return core.CommandingShoutAura(unit, warrior.Talents.CommandingPresence, warrior.Talents.BoomingVoice, warrior.HasMinorGlyph(proto.WarriorMinorGlyph_GlyphOfCommand))
warrior.CommandingShout = warrior.makeShoutSpellHelper(core.ActionID{SpellID: 469}, warrior.NewAllyAuraArray(func(unit *core.Unit) *core.Aura {
return core.CommandingShoutAura(unit, warrior.HasMinorGlyph(proto.WarriorMinorGlyph_GlyphOfCommand))
}))
}