From 8624824848b9bc001470ccec148a5f6714a3baaf Mon Sep 17 00:00:00 2001 From: Kayla Glick Date: Fri, 5 Jul 2024 01:30:00 -0400 Subject: [PATCH 1/2] add eskhandar and magmadar set bonuses --- sim/common/guardians/core_hound.go | 79 ++++++++++++++++ .../emerald_dragon_whelp.go | 29 +----- sim/common/guardians/eskhandar.go | 80 ++++++++++++++++ sim/common/guardians/guardians.go | 9 ++ sim/common/sod/item_effects/phase_3.go | 23 ++++- sim/common/sod/items_sets/phase_4.go | 91 +++++++++++++++++++ sim/druid/druid.go | 13 ++- sim/hunter/hunter.go | 9 +- sim/mage/mage.go | 3 + sim/paladin/paladin.go | 5 +- sim/priest/priest.go | 7 +- sim/rogue/rogue.go | 5 +- sim/shaman/shaman.go | 3 + sim/warlock/warlock.go | 3 + sim/warrior/warrior.go | 5 +- ui/core/proto_utils/action_id.ts | 6 +- 16 files changed, 322 insertions(+), 48 deletions(-) create mode 100644 sim/common/guardians/core_hound.go rename sim/common/{vanilla => guardians}/emerald_dragon_whelp.go (83%) create mode 100644 sim/common/guardians/eskhandar.go create mode 100644 sim/common/guardians/guardians.go diff --git a/sim/common/guardians/core_hound.go b/sim/common/guardians/core_hound.go new file mode 100644 index 0000000000..06bc13f1cd --- /dev/null +++ b/sim/common/guardians/core_hound.go @@ -0,0 +1,79 @@ +package guardians + +import ( + "slices" + + "github.com/wowsims/sod/sim/core" + "github.com/wowsims/sod/sim/core/stats" +) + +// https://www.wowhead.com/classic/item-set=1779/core-hounds-call +// https://www.wowhead.com/classic/spell=461267/core-hounds-call +// https://www.wowhead.com/classic/npc=229001/core-hound + +type CoreHound struct { + core.Pet +} + +func NewCoreHound(character *core.Character) *CoreHound { + coreHound := &CoreHound{ + Pet: core.NewPet("Core Hound", character, stats.Stats{}, coreHoundStatInheritance(), false, true), + } + // TODO: Verify + coreHound.Level = 60 + + coreHound.EnableAutoAttacks(coreHound, core.AutoAttackOptions{ + // TODO: Need Core Hound data + MainHand: core.Weapon{ + BaseDamageMin: 1, + BaseDamageMax: 1, + SwingSpeed: 2.0, + SpellSchool: core.SpellSchoolPhysical, + }, + AutoSwingMelee: true, + }) + + return coreHound +} + +func coreHoundStatInheritance() core.PetStatInheritance { + return func(ownerStats stats.Stats) stats.Stats { + // TODO: Needs more verification + return stats.Stats{} + } +} + +func (hound *CoreHound) Initialize() { +} + +func (hound *CoreHound) ExecuteCustomRotation(sim *core.Simulation) { + // Run the cast check only on swings or cast completes + if hound.AutoAttacks.NextAttackAt() != sim.CurrentTime+hound.AutoAttacks.MainhandSwingSpeed() && hound.AutoAttacks.NextAnyAttackAt()-1 > sim.CurrentTime { + hound.WaitUntil(sim, hound.AutoAttacks.NextAttackAt()-1) + return + } + + hound.WaitUntil(sim, hound.AutoAttacks.NextAttackAt()-1) +} + +func (hound *CoreHound) Reset(sim *core.Simulation) { + hound.Disable(sim) +} + +func (hound *CoreHound) OnPetDisable(sim *core.Simulation) { +} + +func (hound *CoreHound) GetPet() *core.Pet { + return &hound.Pet +} + +func constructCoreHound(character *core.Character) { + // Can't use the set bonus itself because of an import cycle + hasSetBonus := slices.ContainsFunc(character.GetActiveSetBonuses(), func(bonus core.ActiveSetBonus) bool { + return bonus.Name == "Core Hound's Call" && bonus.NumPieces >= 2 + }) + + if hasSetBonus { + character.AddPet(NewCoreHound(character)) + } +} diff --git a/sim/common/vanilla/emerald_dragon_whelp.go b/sim/common/guardians/emerald_dragon_whelp.go similarity index 83% rename from sim/common/vanilla/emerald_dragon_whelp.go rename to sim/common/guardians/emerald_dragon_whelp.go index 02d52e9c2a..4261500d82 100644 --- a/sim/common/vanilla/emerald_dragon_whelp.go +++ b/sim/common/guardians/emerald_dragon_whelp.go @@ -1,4 +1,4 @@ -package vanilla +package guardians import ( "time" @@ -129,32 +129,7 @@ func (whelp *EmeraldDragonWhelp) registerAcidSpitSpell() { }) } -func MakeEmeraldDragonWhelpTriggerAura(agent core.Agent, itemId int32) { - character := agent.GetCharacter() - - procMask := character.GetProcMaskForItem(itemId) - - core.MakeProcTriggerAura(&character.Unit, core.ProcTrigger{ - ActionID: core.ActionID{SpellID: 13049}, - Name: "Emerald Dragon Whelp Proc", - Callback: core.CallbackOnSpellHitDealt, - Outcome: core.OutcomeLanded, - ProcMask: procMask, - PPM: 1.0, // Reported by armaments discord - ICD: time.Minute * 1, - Handler: func(sim *core.Simulation, spell *core.Spell, result *core.SpellResult) { - for _, petAgent := range character.PetAgents { - if whelp, ok := petAgent.(*EmeraldDragonWhelp); ok { - whelp.EnableWithTimeout(sim, whelp, time.Second*15) - whelp.disabledAt = sim.CurrentTime + time.Second*15 - break - } - } - }, - }) -} - -func ConstructEmeralDragonWhelpPets(character *core.Character) { +func constructEmeralDragonWhelps(character *core.Character) { if character.HasMHWeapon() && character.GetMHWeapon().ID == DragonsCry || character.HasOHWeapon() && character.GetOHWeapon().ID == DragonsCry { // Original could have up to 3 whelps active at a time however the SoD version seems to only summon 1 whelp on a 1 minute cooldown diff --git a/sim/common/guardians/eskhandar.go b/sim/common/guardians/eskhandar.go new file mode 100644 index 0000000000..95032be88b --- /dev/null +++ b/sim/common/guardians/eskhandar.go @@ -0,0 +1,80 @@ +package guardians + +import ( + "slices" + + "github.com/wowsims/sod/sim/core" + "github.com/wowsims/sod/sim/core/stats" +) + +// https://www.wowhead.com/classic/item-set=1781/spirit-of-eskhandar +// https://www.wowhead.com/classic/spell=461990/call-of-eskhandar +// https://www.wowhead.com/classic/npc=14306/eskhandar + +type Eskhandar struct { + core.Pet +} + +func NewEskhandar(character *core.Character) *Eskhandar { + eskhandar := &Eskhandar{ + Pet: core.NewPet("Eskhandar", character, stats.Stats{}, eskhandarStatInheritance(), false, true), + } + + // TODO: Verify + eskhandar.Level = 60 + + eskhandar.EnableAutoAttacks(eskhandar, core.AutoAttackOptions{ + // TODO: Need Core Hound data + MainHand: core.Weapon{ + BaseDamageMin: 1, + BaseDamageMax: 1, + SwingSpeed: 2.0, + SpellSchool: core.SpellSchoolPhysical, + }, + AutoSwingMelee: true, + }) + + return eskhandar +} + +func eskhandarStatInheritance() core.PetStatInheritance { + return func(ownerStats stats.Stats) stats.Stats { + // TODO: Needs more verification + return stats.Stats{} + } +} + +func (eskhandar *Eskhandar) Initialize() { +} + +func (eskhandar *Eskhandar) ExecuteCustomRotation(sim *core.Simulation) { + // Run the cast check only on swings or cast completes + if eskhandar.AutoAttacks.NextAttackAt() != sim.CurrentTime+eskhandar.AutoAttacks.MainhandSwingSpeed() && eskhandar.AutoAttacks.NextAnyAttackAt()-1 > sim.CurrentTime { + eskhandar.WaitUntil(sim, eskhandar.AutoAttacks.NextAttackAt()-1) + return + } + + eskhandar.WaitUntil(sim, eskhandar.AutoAttacks.NextAttackAt()-1) +} + +func (eskhandar *Eskhandar) Reset(sim *core.Simulation) { + eskhandar.Disable(sim) +} + +func (eskhandar *Eskhandar) OnPetDisable(sim *core.Simulation) { +} + +func (eskhandar *Eskhandar) GetPet() *core.Pet { + return &eskhandar.Pet +} + +func constructEskhandar(character *core.Character) { + // Can't use the set bonus itself because of an import cycle + hasSetBonus := slices.ContainsFunc(character.GetActiveSetBonuses(), func(bonus core.ActiveSetBonus) bool { + return bonus.Name == "Spirit of Eskhandar" && bonus.NumPieces == 4 + }) + + if hasSetBonus { + character.AddPet(NewEskhandar(character)) + } +} diff --git a/sim/common/guardians/guardians.go b/sim/common/guardians/guardians.go new file mode 100644 index 0000000000..bbd55fd88a --- /dev/null +++ b/sim/common/guardians/guardians.go @@ -0,0 +1,9 @@ +package guardians + +import "github.com/wowsims/sod/sim/core" + +func ConstructGuardians(character *core.Character) { + constructEmeralDragonWhelps(character) + constructEskhandar(character) + constructCoreHound(character) +} diff --git a/sim/common/sod/item_effects/phase_3.go b/sim/common/sod/item_effects/phase_3.go index 63e184bae8..e9dc67cc27 100644 --- a/sim/common/sod/item_effects/phase_3.go +++ b/sim/common/sod/item_effects/phase_3.go @@ -3,8 +3,8 @@ package item_effects import ( "time" + "github.com/wowsims/sod/sim/common/guardians" "github.com/wowsims/sod/sim/common/itemhelpers" - "github.com/wowsims/sod/sim/common/vanilla" "github.com/wowsims/sod/sim/core" "github.com/wowsims/sod/sim/core/proto" "github.com/wowsims/sod/sim/core/stats" @@ -442,7 +442,26 @@ func init() { }) core.NewItemEffect(DragonsCry, func(agent core.Agent) { - vanilla.MakeEmeraldDragonWhelpTriggerAura(agent, DragonsCry) + character := agent.GetCharacter() + + procMask := character.GetProcMaskForItem(DragonsCry) + + core.MakeProcTriggerAura(&character.Unit, core.ProcTrigger{ + Name: "Emerald Dragon Whelp Proc", + Callback: core.CallbackOnSpellHitDealt, + Outcome: core.OutcomeLanded, + ProcMask: procMask, + PPM: 1.0, // Reported by armaments discord + ICD: time.Minute * 1, + Handler: func(sim *core.Simulation, spell *core.Spell, result *core.SpellResult) { + for _, petAgent := range character.PetAgents { + if whelp, ok := petAgent.(*guardians.EmeraldDragonWhelp); ok { + whelp.EnableWithTimeout(sim, whelp, time.Second*15) + break + } + } + }, + }) }) core.NewItemEffect(CobraFangClaw, func(agent core.Agent) { diff --git a/sim/common/sod/items_sets/phase_4.go b/sim/common/sod/items_sets/phase_4.go index 4e1e02b88b..2aa87bdfd6 100644 --- a/sim/common/sod/items_sets/phase_4.go +++ b/sim/common/sod/items_sets/phase_4.go @@ -3,6 +3,7 @@ package item_sets import ( "time" + "github.com/wowsims/sod/sim/common/guardians" "github.com/wowsims/sod/sim/core" "github.com/wowsims/sod/sim/core/stats" ) @@ -457,3 +458,93 @@ var ItemSetShardOfTheGods = core.NewItemSet(core.ItemSet{ }, }, }) + +var ItemSetSpiritOfEskhandar = core.NewItemSet(core.ItemSet{ + Name: "Spirit of Eskhandar", + Bonuses: map[int32]core.ApplyEffect{ + // Improves your chance to hit with all spells and attacks by 1%. + 2: func(agent core.Agent) { + character := agent.GetCharacter() + character.AddStat(stats.MeleeHit, 1) + character.AddStat(stats.SpellHit, 1) + }, + // Improves your chance to get a critical strike with all spells and attacks by 1%. + 3: func(agent core.Agent) { + character := agent.GetCharacter() + character.AddStat(stats.MeleeCrit, 1*core.CritRatingPerCritChance) + character.AddStat(stats.SpellCrit, 1*core.SpellCritRatingPerCritChance) + }, + // 1% chance on a melee hit to call forth the spirit of Eskhandar to protect you in battle for 2 min. + 4: func(agent core.Agent) { + character := agent.GetCharacter() + core.MakeProcTriggerAura(&character.Unit, core.ProcTrigger{ + Name: "Call of Eskhandar Trigger", + Callback: core.CallbackOnSpellHitDealt, + Outcome: core.OutcomeLanded, + ProcMask: core.ProcMaskMelee, + ProcChance: 1, + ICD: time.Minute * 1, + Handler: func(sim *core.Simulation, spell *core.Spell, result *core.SpellResult) { + for _, petAgent := range character.PetAgents { + if eskhandar, ok := petAgent.(*guardians.Eskhandar); ok { + eskhandar.EnableWithTimeout(sim, eskhandar, time.Minute*2) + break + } + } + }, + }) + }, + }, +}) + +var ItemSetCoreHoundsCall = core.NewItemSet(core.ItemSet{ + Name: "Core Hound's Call", + Bonuses: map[int32]core.ApplyEffect{ + // Small chance on melee hit to call forth a Core Hound for 1 min. + 2: func(agent core.Agent) { + character := agent.GetCharacter() + core.MakeProcTriggerAura(&character.Unit, core.ProcTrigger{ + Name: "Core Hound's Call Trigger", + Callback: core.CallbackOnSpellHitDealt, + Outcome: core.OutcomeLanded, + ProcMask: core.ProcMaskMelee, + ProcChance: 1, + ICD: time.Minute * 1, + Handler: func(sim *core.Simulation, spell *core.Spell, result *core.SpellResult) { + for _, petAgent := range character.PetAgents { + if coreHound, ok := petAgent.(*guardians.CoreHound); ok { + coreHound.EnableWithTimeout(sim, coreHound, time.Minute*1) + break + } + } + }, + }) + }, + // Small chance on melee hit to call forth the Spirit of Magmadar to assist you in battle. Increasing your attack speed by 10% for 20 sec. + 3: func(agent core.Agent) { + character := agent.GetCharacter() + procAura := character.RegisterAura(core.Aura{ + ActionID: core.ActionID{SpellID: 461270}, + Label: "Magmadar's Return", + Duration: time.Second * 20, + OnGain: func(aura *core.Aura, sim *core.Simulation) { + character.MultiplyAttackSpeed(sim, 1.1) + }, + OnExpire: func(aura *core.Aura, sim *core.Simulation) { + character.MultiplyAttackSpeed(sim, 1/1.1) + }, + }) + core.MakeProcTriggerAura(&character.Unit, core.ProcTrigger{ + Name: "Magmadar's Return Trigger", + Callback: core.CallbackOnSpellHitDealt, + Outcome: core.OutcomeLanded, + ProcMask: core.ProcMaskMelee, + ProcChance: 1, + ICD: time.Minute * 1, + Handler: func(sim *core.Simulation, spell *core.Spell, result *core.SpellResult) { + procAura.Activate(sim) + }, + }) + }, + }, +}) diff --git a/sim/druid/druid.go b/sim/druid/druid.go index b5207d2373..30d983ea15 100644 --- a/sim/druid/druid.go +++ b/sim/druid/druid.go @@ -3,6 +3,7 @@ package druid import ( "time" + "github.com/wowsims/sod/sim/common/guardians" "github.com/wowsims/sod/sim/core" "github.com/wowsims/sod/sim/core/proto" "github.com/wowsims/sod/sim/core/stats" @@ -243,9 +244,9 @@ func (druid *Druid) Reset(_ *core.Simulation) { druid.disabledMCDs = []*core.MajorCooldown{} } -func New(char *core.Character, form DruidForm, selfBuffs SelfBuffs, talents string) *Druid { +func New(character *core.Character, form DruidForm, selfBuffs SelfBuffs, talents string) *Druid { druid := &Druid{ - Character: *char, + Character: *character, SelfBuffs: selfBuffs, Talents: &proto.DruidTalents{}, StartingForm: form, @@ -257,10 +258,10 @@ func New(char *core.Character, form DruidForm, selfBuffs SelfBuffs, talents stri // TODO: Class druid physical stats druid.AddStatDependency(stats.Strength, stats.AttackPower, 2) druid.AddStatDependency(stats.BonusArmor, stats.Armor, 1) - druid.AddStatDependency(stats.Agility, stats.MeleeCrit, core.CritPerAgiAtLevel[char.Class][int(druid.Level)]*core.CritRatingPerCritChance) - druid.AddStatDependency(stats.Intellect, stats.SpellCrit, core.CritPerIntAtLevel[char.Class][int(druid.Level)]*core.SpellCritRatingPerCritChance) + druid.AddStatDependency(stats.Agility, stats.MeleeCrit, core.CritPerAgiAtLevel[character.Class][int(druid.Level)]*core.CritRatingPerCritChance) + druid.AddStatDependency(stats.Intellect, stats.SpellCrit, core.CritPerIntAtLevel[character.Class][int(druid.Level)]*core.SpellCritRatingPerCritChance) // TODO: Update DodgePerAgiAtLevel with the appropriate value for each level - druid.AddStatDependency(stats.Agility, stats.Dodge, core.DodgePerAgiAtLevel[char.Class][int(druid.Level)]) + druid.AddStatDependency(stats.Agility, stats.Dodge, core.DodgePerAgiAtLevel[character.Class][int(druid.Level)]) // Druids get extra melee haste // druid.PseudoStats.MeleeHasteRatingPerHastePercent /= 1.3 @@ -268,6 +269,8 @@ func New(char *core.Character, form DruidForm, selfBuffs SelfBuffs, talents stri // Switch to using AddStat as PseudoStat is being removed // druid.PseudoStats.BaseDodge += 0.056097 + guardians.ConstructGuardians(&druid.Character) + return druid } diff --git a/sim/hunter/hunter.go b/sim/hunter/hunter.go index 923efd0412..d2ca3178f6 100644 --- a/sim/hunter/hunter.go +++ b/sim/hunter/hunter.go @@ -3,7 +3,7 @@ package hunter import ( "time" - "github.com/wowsims/sod/sim/common/vanilla" + "github.com/wowsims/sod/sim/common/guardians" "github.com/wowsims/sod/sim/core" "github.com/wowsims/sod/sim/core/proto" "github.com/wowsims/sod/sim/core/stats" @@ -74,7 +74,7 @@ type Hunter struct { CobraStrikesAura *core.Aura // The aura that allows you to cast Mongoose Bite - DefensiveState *core.Aura + DefensiveState *core.Aura ImprovedSteadyShotAura *core.Aura LockAndLoadAura *core.Aura @@ -134,7 +134,7 @@ func (hunter *Hunter) Initialize() { if hunter.HasRune(proto.HunterRune_RuneBootsTrapLauncher) { fireTraps := hunter.NewTimer() frostTraps := hunter.NewTimer() - + hunter.registerExplosiveTrapSpell(fireTraps) hunter.registerImmolationTrapSpell(fireTraps) hunter.registerFrostTrapSpell(frostTraps) @@ -266,7 +266,8 @@ func NewHunter(character *core.Character, options *proto.Player) *Hunter { hunter.AddStatDependency(stats.Agility, stats.MeleeCrit, core.CritPerAgiAtLevel[character.Class][int(character.Level)]*core.CritRatingPerCritChance) hunter.AddStatDependency(stats.Intellect, stats.SpellCrit, core.CritPerIntAtLevel[character.Class][int(character.Level)]*core.SpellCritRatingPerCritChance) - vanilla.ConstructEmeralDragonWhelpPets(&hunter.Character) + guardians.ConstructGuardians(&hunter.Character) + return hunter } diff --git a/sim/mage/mage.go b/sim/mage/mage.go index 951227fc92..72f07b19d5 100644 --- a/sim/mage/mage.go +++ b/sim/mage/mage.go @@ -1,6 +1,7 @@ package mage import ( + "github.com/wowsims/sod/sim/common/guardians" "github.com/wowsims/sod/sim/core" "github.com/wowsims/sod/sim/core/proto" "github.com/wowsims/sod/sim/core/stats" @@ -172,6 +173,8 @@ func NewMage(character *core.Character, options *proto.Player) *Mage { mage.frozenOrb = mage.NewFrozenOrb() } + guardians.ConstructGuardians(&mage.Character) + return mage } diff --git a/sim/paladin/paladin.go b/sim/paladin/paladin.go index 9662533f39..761dd46cd1 100644 --- a/sim/paladin/paladin.go +++ b/sim/paladin/paladin.go @@ -3,7 +3,7 @@ package paladin import ( "time" - "github.com/wowsims/sod/sim/common/vanilla" + "github.com/wowsims/sod/sim/common/guardians" "github.com/wowsims/sod/sim/core" "github.com/wowsims/sod/sim/core/proto" "github.com/wowsims/sod/sim/core/stats" @@ -109,7 +109,8 @@ func NewPaladin(character *core.Character, talentsStr string) *Paladin { // paladin.PseudoStats.BaseDodge += 0.034943 // paladin.PseudoStats.BaseParry += 0.05 - vanilla.ConstructEmeralDragonWhelpPets(&paladin.Character) + guardians.ConstructGuardians(&paladin.Character) + return paladin } diff --git a/sim/priest/priest.go b/sim/priest/priest.go index 2c542b1df7..89d373eb1f 100644 --- a/sim/priest/priest.go +++ b/sim/priest/priest.go @@ -1,6 +1,7 @@ package priest import ( + "github.com/wowsims/sod/sim/common/guardians" "github.com/wowsims/sod/sim/core" "github.com/wowsims/sod/sim/core/proto" "github.com/wowsims/sod/sim/core/stats" @@ -123,9 +124,9 @@ func (priest *Priest) Reset(_ *core.Simulation) { priest.MindBlastModifier = 1 } -func New(char *core.Character, talents string) *Priest { +func New(character *core.Character, talents string) *Priest { priest := &Priest{ - Character: *char, + Character: *character, Talents: &proto.PriestTalents{}, } core.FillTalentsProto(priest.Talents.ProtoReflect(), talents, TalentTreeSizes) @@ -152,6 +153,8 @@ func New(char *core.Character, talents string) *Priest { priest.HomunculiPets[2] = priest.NewHomunculus(3, 202391) } + guardians.ConstructGuardians(&priest.Character) + return priest } diff --git a/sim/rogue/rogue.go b/sim/rogue/rogue.go index 49f8f39f42..0024f124e9 100644 --- a/sim/rogue/rogue.go +++ b/sim/rogue/rogue.go @@ -3,7 +3,7 @@ package rogue import ( "time" - "github.com/wowsims/sod/sim/common/vanilla" + "github.com/wowsims/sod/sim/common/guardians" "github.com/wowsims/sod/sim/core" "github.com/wowsims/sod/sim/core/proto" "github.com/wowsims/sod/sim/core/stats" @@ -185,7 +185,8 @@ func NewRogue(character *core.Character, options *proto.Player, rogueOptions *pr rogue.AddStatDependency(stats.Agility, stats.RangedAttackPower, 1) rogue.AddStatDependency(stats.Agility, stats.MeleeCrit, core.CritPerAgiAtLevel[character.Class][int(rogue.Level)]*core.CritRatingPerCritChance) - vanilla.ConstructEmeralDragonWhelpPets(&rogue.Character) + guardians.ConstructGuardians(&rogue.Character) + return rogue } diff --git a/sim/shaman/shaman.go b/sim/shaman/shaman.go index a4ee97340a..1ae1a7961e 100644 --- a/sim/shaman/shaman.go +++ b/sim/shaman/shaman.go @@ -3,6 +3,7 @@ package shaman import ( "time" + "github.com/wowsims/sod/sim/common/guardians" "github.com/wowsims/sod/sim/core" "github.com/wowsims/sod/sim/core/proto" "github.com/wowsims/sod/sim/core/stats" @@ -44,6 +45,8 @@ func NewShaman(character *core.Character, talents string) *Shaman { } } + guardians.ConstructGuardians(&shaman.Character) + return shaman } diff --git a/sim/warlock/warlock.go b/sim/warlock/warlock.go index 0894db47fa..a5b07abbad 100644 --- a/sim/warlock/warlock.go +++ b/sim/warlock/warlock.go @@ -3,6 +3,7 @@ package warlock import ( "time" + "github.com/wowsims/sod/sim/common/guardians" "github.com/wowsims/sod/sim/core" "github.com/wowsims/sod/sim/core/proto" "github.com/wowsims/sod/sim/core/stats" @@ -182,6 +183,8 @@ func NewWarlock(character *core.Character, options *proto.Player, warlockOptions warlock.Pet = warlock.NewWarlockPet() } + guardians.ConstructGuardians(&warlock.Character) + return warlock } diff --git a/sim/warrior/warrior.go b/sim/warrior/warrior.go index 0b5ca00e83..b31568c81f 100644 --- a/sim/warrior/warrior.go +++ b/sim/warrior/warrior.go @@ -3,7 +3,7 @@ package warrior import ( "time" - "github.com/wowsims/sod/sim/common/vanilla" + "github.com/wowsims/sod/sim/common/guardians" "github.com/wowsims/sod/sim/core" "github.com/wowsims/sod/sim/core/proto" "github.com/wowsims/sod/sim/core/stats" @@ -163,7 +163,8 @@ func NewWarrior(character *core.Character, talents string, inputs WarriorInputs) warrior.AddStatDependency(stats.Strength, stats.BlockValue, .05) // 20 str = 1 block warrior.AddStatDependency(stats.BonusArmor, stats.Armor, 1) - vanilla.ConstructEmeralDragonWhelpPets(&warrior.Character) + guardians.ConstructGuardians(&warrior.Character) + return warrior } diff --git a/ui/core/proto_utils/action_id.ts b/ui/core/proto_utils/action_id.ts index a119af0992..b461d60127 100644 --- a/ui/core/proto_utils/action_id.ts +++ b/ui/core/proto_utils/action_id.ts @@ -664,6 +664,7 @@ const spellIDsToShowBuffs = new Set([ 23738, // https://www.wowhead.com/classic/spell=23738/sayges-dark-fortune-of-spirit 23737, // https://www.wowhead.com/classic/spell=23737/sayges-dark-fortune-of-stamina 402808, // https://www.wowhead.com/classic/spell=402808/cripple + 461270, // https://www.wowhead.com/classic/spell=461270/magmadars-return 461615, // https://www.wowhead.com/classic/spell=461615/mark-of-chaos ]); @@ -674,8 +675,6 @@ const petNameToActionId: Record = { 'Frozen Orb': ActionId.fromSpellId(440802), Homunculi: ActionId.fromSpellId(402799), Shadowfiend: ActionId.fromSpellId(401977), - 'Spirit Wolf 1': ActionId.fromSpellId(440580), - 'Spirit Wolf 2': ActionId.fromSpellId(440580), }; // https://wowhead.com/classic/hunter-pets @@ -693,8 +692,11 @@ const petNameToIcon: Record = { Devilsaur: 'https://wow.zamimg.com/images/wow/icons/medium/ability_hunter_pet_devilsaur.jpg', Dragonhawk: 'https://wow.zamimg.com/images/wow/icons/medium/ability_hunter_pet_dragonhawk.jpg', 'Emerald Dragon Whelp': 'https://wow.zamimg.com/images/wow/icons/medium/inv_misc_head_dragon_green.jpg', + Eskhandar: 'https://wow.zamimg.com/images/wow/icons/large/inv_misc_head_tiger_01.jpg', Felguard: 'https://wow.zamimg.com/images/wow/icons/large/spell_shadow_summonfelguard.jpg', Felhunter: 'https://wow.zamimg.com/images/wow/icons/large/spell_shadow_summonfelhunter.jpg', + 'Spirit Wolf 1': 'https://wow.zamimg.com/images/wow/icons/large/spell_shaman_feralspirit.jpg', + 'Spirit Wolf 2': 'https://wow.zamimg.com/images/wow/icons/large/spell_shaman_feralspirit.jpg', Infernal: 'https://wow.zamimg.com/images/wow/icons/large/spell_shadow_summoninfernal.jpg', Gorilla: 'https://wow.zamimg.com/images/wow/icons/medium/ability_hunter_pet_gorilla.jpg', Hyena: 'https://wow.zamimg.com/images/wow/icons/medium/ability_hunter_pet_hyena.jpg', From a2d921c776bf850fb8923b41bd63457ecc324dbc Mon Sep 17 00:00:00 2001 From: Kayla Glick Date: Fri, 5 Jul 2024 01:36:50 -0400 Subject: [PATCH 2/2] tests? --- .../retribution/TestRetribution.results | 68 +++++++++---------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/sim/paladin/retribution/TestRetribution.results b/sim/paladin/retribution/TestRetribution.results index 93e12c96ad..6cf084e9ce 100644 --- a/sim/paladin/retribution/TestRetribution.results +++ b/sim/paladin/retribution/TestRetribution.results @@ -149,7 +149,7 @@ stat_weights_results: { key: "TestRetribution-Lvl25-StatWeights-Default" value: { weights: 0.44437 - weights: 0.25338 + weights: 0.25095 weights: 0 weights: 0 weights: 0 @@ -161,13 +161,13 @@ stat_weights_results: { weights: 0 weights: 0 weights: 0 - weights: 0.47797 + weights: 0.47516 weights: 0 weights: 0 weights: 0 weights: 0.20199 - weights: 1.36856 - weights: 2.19816 + weights: 1.35498 + weights: 2.17677 weights: 0 weights: 0 weights: 0 @@ -295,106 +295,106 @@ stat_weights_results: { dps_results: { key: "TestRetribution-Lvl25-AllItems-SoulforgeArmor" value: { - dps: 197.15212 - tps: 198.89162 + dps: 195.69663 + tps: 197.43613 } } dps_results: { key: "TestRetribution-Lvl25-Average-Default" value: { - dps: 250.61959 - tps: 256.86618 + dps: 248.30532 + tps: 254.55191 } } dps_results: { key: "TestRetribution-Lvl25-Settings-Dwarf-p1ret-P1 Seal of Command Ret-p1ret-FullBuffs-Phase 1 Consumes-LongMultiTarget" value: { - dps: 175.28375 - tps: 298.45007 + dps: 173.67039 + tps: 296.83671 } } dps_results: { key: "TestRetribution-Lvl25-Settings-Dwarf-p1ret-P1 Seal of Command Ret-p1ret-FullBuffs-Phase 1 Consumes-LongSingleTarget" value: { - dps: 92.30493 - tps: 98.46324 + dps: 91.55348 + tps: 97.71179 } } dps_results: { key: "TestRetribution-Lvl25-Settings-Dwarf-p1ret-P1 Seal of Command Ret-p1ret-FullBuffs-Phase 1 Consumes-ShortSingleTarget" value: { - dps: 100.24003 - tps: 104.93794 + dps: 99.41627 + tps: 104.11419 } } dps_results: { key: "TestRetribution-Lvl25-Settings-Dwarf-p1ret-P1 Seal of Command Ret-p1ret-NoBuffs-Phase 1 Consumes-LongMultiTarget" value: { - dps: 95.68327 - tps: 200.95995 + dps: 94.47486 + tps: 199.75155 } } dps_results: { key: "TestRetribution-Lvl25-Settings-Dwarf-p1ret-P1 Seal of Command Ret-p1ret-NoBuffs-Phase 1 Consumes-LongSingleTarget" value: { - dps: 49.98351 - tps: 55.24734 + dps: 49.4182 + tps: 54.68203 } } dps_results: { key: "TestRetribution-Lvl25-Settings-Dwarf-p1ret-P1 Seal of Command Ret-p1ret-NoBuffs-Phase 1 Consumes-ShortSingleTarget" value: { - dps: 59.19972 - tps: 67.19293 + dps: 58.58523 + tps: 66.57844 } } dps_results: { key: "TestRetribution-Lvl25-Settings-Human-p1ret-P1 Seal of Command Ret-p1ret-FullBuffs-Phase 1 Consumes-LongMultiTarget" value: { - dps: 176.80831 - tps: 301.14674 + dps: 175.1736 + tps: 299.51203 } } dps_results: { key: "TestRetribution-Lvl25-Settings-Human-p1ret-P1 Seal of Command Ret-p1ret-FullBuffs-Phase 1 Consumes-LongSingleTarget" value: { - dps: 93.22465 - tps: 99.44157 + dps: 92.46098 + tps: 98.6779 } } dps_results: { key: "TestRetribution-Lvl25-Settings-Human-p1ret-P1 Seal of Command Ret-p1ret-FullBuffs-Phase 1 Consumes-ShortSingleTarget" value: { - dps: 100.88473 - tps: 105.64452 + dps: 100.05152 + tps: 104.81132 } } dps_results: { key: "TestRetribution-Lvl25-Settings-Human-p1ret-P1 Seal of Command Ret-p1ret-NoBuffs-Phase 1 Consumes-LongMultiTarget" value: { - dps: 96.76214 - tps: 202.73391 + dps: 95.53462 + tps: 201.50639 } } dps_results: { key: "TestRetribution-Lvl25-Settings-Human-p1ret-P1 Seal of Command Ret-p1ret-NoBuffs-Phase 1 Consumes-LongSingleTarget" value: { - dps: 50.35161 - tps: 55.6502 + dps: 49.78055 + tps: 55.07914 } } dps_results: { key: "TestRetribution-Lvl25-Settings-Human-p1ret-P1 Seal of Command Ret-p1ret-NoBuffs-Phase 1 Consumes-ShortSingleTarget" value: { - dps: 59.37786 - tps: 67.43357 + dps: 58.75774 + tps: 66.81345 } } dps_results: { key: "TestRetribution-Lvl25-SwitchInFrontOfTarget-Default" value: { - dps: 235.22972 - tps: 241.44664 + dps: 233.06986 + tps: 239.28678 } } dps_results: {