Skip to content

Commit

Permalink
Merge branch 'master' of https://github.com/ironclad88/wowsims-sod in…
Browse files Browse the repository at this point in the history
…to bearstuff
  • Loading branch information
emsimpson92 committed Nov 27, 2024
2 parents 8a9c3f1 + 1cb7958 commit 90d46a4
Show file tree
Hide file tree
Showing 15 changed files with 226 additions and 218 deletions.
10 changes: 5 additions & 5 deletions sim/druid/druid.go
Original file line number Diff line number Diff line change
Expand Up @@ -162,9 +162,9 @@ func (druid *Druid) AddRaidBuffs(raidBuffs *proto.RaidBuffs) {
}
}

// func (druid *Druid) TryMaul(sim *core.Simulation, mhSwingSpell *core.Spell) *core.Spell {
// return druid.MaulReplaceMH(sim, mhSwingSpell)
// }
func (druid *Druid) TryMaul(sim *core.Simulation, mhSwingSpell *core.Spell) *core.Spell {
return druid.MaulReplaceMH(sim, mhSwingSpell)
}

func (druid *Druid) RegisterSpell(formMask DruidForm, config core.SpellConfig) *DruidSpell {
prev := config.ExtraCastCondition
Expand Down Expand Up @@ -233,12 +233,12 @@ func (druid *Druid) RegisterFeralCatSpells() {
func (druid *Druid) RegisterFeralTankSpells() {
// druid.registerBarkskinCD()
// druid.registerBerserkCD()
// druid.registerBearFormSpell()
druid.registerBearFormSpell()
// druid.registerDemoralizingRoarSpell()
// druid.registerEnrageSpell()
// druid.registerFrenziedRegenerationCD()
// druid.registerMangleBearSpell()
// druid.registerMaulSpell()
druid.registerMaulSpell()
// druid.registerLacerateSpell()
// druid.registerRakeSpell()
// druid.registerRipSpell()
Expand Down
303 changes: 156 additions & 147 deletions sim/druid/forms.go
Original file line number Diff line number Diff line change
Expand Up @@ -62,15 +62,15 @@ func (druid *Druid) GetCatWeapon(level int32) core.Weapon {
return claws
}

// Func (druid *Druid) GetBearWeapon() core.Weapon {
// return core.Weapon{
// BaseDamageMin: 109,
// BaseDamageMax: 165,
// SwingSpeed: 2.5,
// NormalizedSwingSpeed: 2.5,
// AttackPowerPerDPS: core.DefaultAttackPowerPerDPS,
// }
// }
func (druid *Druid) GetBearWeapon() core.Weapon {
return core.Weapon{
BaseDamageMin: 109,
BaseDamageMax: 165,
SwingSpeed: 2.5,
NormalizedSwingSpeed: 2.5,
AttackPowerPerDPS: core.DefaultAttackPowerPerDPS,
}
}

// TODO: Class bonus stats for both cat and bear.
func (druid *Druid) GetFormShiftStats() stats.Stats {
Expand Down Expand Up @@ -263,144 +263,153 @@ func (druid *Druid) registerCatFormSpell() {
})
}

// func (druid *Druid) registerBearFormSpell() {
// actionID := core.ActionID{SpellID: 9634}
// healthMetrics := druid.NewHealthMetrics(actionID)

// statBonus := druid.GetFormShiftStats().Add(stats.Stats{
// stats.AttackPower: 3 * float64(druid.Level),
// })

// stamDep := druid.NewDynamicMultiplyStat(stats.Stamina, 1.25)

// var potpDep *stats.StatDependency
// if druid.Talents.ProtectorOfThePack > 0 {
// potpDep = druid.NewDynamicMultiplyStat(stats.AttackPower, 1.0+0.02*float64(druid.Talents.ProtectorOfThePack))
// }

// var hotwDep *stats.StatDependency
// if druid.Talents.HeartOfTheWild > 0 {
// hotwDep = druid.NewDynamicMultiplyStat(stats.Stamina, 1.0+0.02*float64(druid.Talents.HeartOfTheWild))
// }

// potpdtm := 1 - 0.04*float64(druid.Talents.ProtectorOfThePack)

// clawWeapon := druid.GetBearWeapon()
// predBonus := stats.Stats{}

// druid.BearFormAura = druid.RegisterAura(core.Aura{
// Label: "Bear Form",
// ActionID: actionID,
// Duration: core.NeverExpires,
// BuildPhase: core.Ternary(druid.StartingForm.Matches(Bear), core.CharacterBuildPhaseBase, core.CharacterBuildPhaseNone),
// OnGain: func(aura *core.Aura, sim *core.Simulation) {
// if !druid.Env.MeasuringStats && druid.form != Humanoid {
// druid.CancelShapeshift(sim)
// }
// druid.form = Bear
// druid.SetCurrentPowerBar(core.RageBar)

// druid.AutoAttacks.SetMH(clawWeapon)

// druid.PseudoStats.ThreatMultiplier *= 2.1021
// druid.PseudoStats.SchoolDamageDealtMultiplier[stats.SchoolIndexPhysical] *= 1.0 + 0.02*float64(druid.Talents.MasterShapeshifter)
// druid.PseudoStats.DamageTakenMultiplier *= potpdtm
// Switch to using AddStat as PseudoStat is being removed
// druid.PseudoStats.BaseDodge += 0.02 * float64(druid.Talents.FeralSwiftness+druid.Talents.NaturalReaction)

// predBonus = druid.GetDynamicPredStrikeStats()
// druid.AddStatsDynamic(sim, predBonus)
// druid.AddStatsDynamic(sim, statBonus)
// druid.ApplyDynamicEquipScaling(sim, stats.Armor, druid.BearArmorMultiplier())
// if potpDep != nil {
// druid.EnableDynamicStatDep(sim, potpDep)
// }

// // Preserve fraction of max health when shifting
// healthFrac := druid.CurrentHealth() / druid.MaxHealth()
// druid.EnableDynamicStatDep(sim, stamDep)
// if hotwDep != nil {
// druid.EnableDynamicStatDep(sim, hotwDep)
// }
// druid.GainHealth(sim, healthFrac*druid.MaxHealth()-druid.CurrentHealth(), healthMetrics)

// if !druid.Env.MeasuringStats {
// druid.AutoAttacks.SetReplaceMHSwing(druid.ReplaceBearMHFunc)
// druid.AutoAttacks.EnableAutoSwing(sim)

// druid.manageCooldownsEnabled()
// druid.UpdateManaRegenRates()
// }
// },
// OnExpire: func(aura *core.Aura, sim *core.Simulation) {
// druid.form = Humanoid
// druid.AutoAttacks.SetMH(druid.WeaponFromMainHand())

// druid.PseudoStats.ThreatMultiplier /= 2.1021
// druid.PseudoStats.SchoolDamageDealtMultiplier[stats.SchoolIndexPhysical] /= 1.0 + 0.02*float64(druid.Talents.MasterShapeshifter)
// druid.PseudoStats.DamageTakenMultiplier /= potpdtm
// Switch to using AddStat as PseudoStat is being removed
// druid.PseudoStats.BaseDodge -= 0.02 * float64(druid.Talents.FeralSwiftness+druid.Talents.NaturalReaction)

// druid.AddStatsDynamic(sim, predBonus.Invert())
// druid.AddStatsDynamic(sim, statBonus.Invert())
// druid.RemoveDynamicEquipScaling(sim, stats.Armor, druid.BearArmorMultiplier())
// if potpDep != nil {
// druid.DisableDynamicStatDep(sim, potpDep)
// }

// healthFrac := druid.CurrentHealth() / druid.MaxHealth()
// druid.DisableDynamicStatDep(sim, stamDep)
// if hotwDep != nil {
// druid.DisableDynamicStatDep(sim, hotwDep)
// }
// druid.RemoveHealth(sim, druid.CurrentHealth()-healthFrac*druid.MaxHealth())

// if !druid.Env.MeasuringStats {
// druid.AutoAttacks.SetReplaceMHSwing(nil)
// druid.AutoAttacks.EnableAutoSwing(sim)

// druid.manageCooldownsEnabled()
// druid.UpdateManaRegenRates()
// druid.EnrageAura.Deactivate(sim)
// druid.MaulQueueAura.Deactivate(sim)
// }
// },
// })

// rageMetrics := druid.NewRageMetrics(actionID)

// furorProcChance := []float64{0, 0.2, 0.4, 0.6, 0.8, 1}[druid.Talents.Furor]

// druid.BearForm = druid.RegisterSpell(Any, core.SpellConfig{
// ActionID: actionID,
// Flags: core.SpellFlagNoOnCastComplete | core.SpellFlagAPL,

// ManaCost: core.ManaCostOptions{
// BaseCost: 0.55,
// Multiplier: (1 - 0.2*float64(druid.Talents.KingOfTheJungle)) * (1 - 0.1*float64(druid.Talents.NaturalShapeshifter)),
// },
// Cast: core.CastConfig{
// DefaultCast: core.Cast{
// GCD: core.GCDDefault,
// },
// IgnoreHaste: true,
// },

// ApplyEffects: func(sim *core.Simulation, _ *core.Unit, spell *core.Spell) {
// rageDelta := 0 - druid.CurrentRage()
// if sim.Proc(furorProcChance, "Furor") {
// rageDelta += 10
// }
// if rageDelta > 0 {
// druid.AddRage(sim, rageDelta, rageMetrics)
// } else if rageDelta < 0 {
// druid.SpendRage(sim, -rageDelta, rageMetrics)
// }
// druid.BearFormAura.Activate(sim)
// },
// })
// }
func (druid *Druid) registerBearFormSpell() {
actionID := core.ActionID{SpellID: 9634}
healthMetrics := druid.NewHealthMetrics(actionID)

statBonus := druid.GetFormShiftStats().Add(stats.Stats{
stats.AttackPower: 3 * float64(druid.Level),
})

stamDep := druid.NewDynamicMultiplyStat(stats.Stamina, 1.25)
feralApDep := druid.NewDynamicStatDependency(stats.FeralAttackPower, stats.AttackPower, 1)

// var potpDep *stats.StatDependency
// if druid.Talents.ProtectorOfThePack > 0 {
// potpDep = druid.NewDynamicMultiplyStat(stats.AttackPower, 1.0+0.02*float64(druid.Talents.ProtectorOfThePack))
// }

var hotwDep *stats.StatDependency
if druid.Talents.HeartOfTheWild > 0 {
hotwDep = druid.NewDynamicMultiplyStat(stats.Stamina, 1.0+0.04*float64(druid.Talents.HeartOfTheWild))
}

sotfdtm := 1.0
if druid.HasRune(proto.DruidRune_RuneChestSurvivalOfTheFittest) {
sotfdtm = 0.81
// potpdtm := 1 - 0.04*float64(druid.Talents.ProtectorOfThePack)
}

clawWeapon := druid.GetBearWeapon()
// predBonus := stats.Stats{}

druid.BearFormAura = druid.RegisterAura(core.Aura{
Label: "Bear Form",
ActionID: actionID,
Duration: core.NeverExpires,
BuildPhase: core.Ternary(druid.StartingForm.Matches(Bear), core.CharacterBuildPhaseBase, core.CharacterBuildPhaseNone),
OnGain: func(aura *core.Aura, sim *core.Simulation) {
if !druid.Env.MeasuringStats && druid.form != Humanoid {
druid.CancelShapeshift(sim)
}
druid.form = Bear
druid.SetCurrentPowerBar(core.RageBar)

druid.AutoAttacks.SetMH(clawWeapon)

druid.PseudoStats.ThreatMultiplier *= 2.1021
// druid.PseudoStats.SchoolDamageDealtMultiplier[stats.SchoolIndexPhysical] *= 1.0 + 0.02*float64(druid.Talents.MasterShapeshifter)
druid.PseudoStats.DamageTakenMultiplier *= sotfdtm
// Switch to using AddStat as PseudoStat is being removed
// druid.PseudoStats.BaseDodge += 0.02 * float64(druid.Talents.FeralSwiftness+druid.Talents.NaturalReaction)

// predBonus = druid.GetDynamicPredStrikeStats()
// druid.AddStatsDynamic(sim, predBonus)
druid.AddStatsDynamic(sim, statBonus)
druid.ApplyDynamicEquipScaling(sim, stats.Armor, druid.BearArmorMultiplier())
// if potpDep != nil {
// druid.EnableDynamicStatDep(sim, potpDep)
// }

// Preserve fraction of max health when shifting
healthFrac := druid.CurrentHealth() / druid.MaxHealth()
druid.EnableDynamicStatDep(sim, stamDep)
druid.EnableDynamicStatDep(sim, feralApDep)
if hotwDep != nil {
druid.EnableDynamicStatDep(sim, hotwDep)
}
druid.GainHealth(sim, healthFrac*druid.MaxHealth()-druid.CurrentHealth(), healthMetrics)

if !druid.Env.MeasuringStats {
druid.AutoAttacks.SetReplaceMHSwing(druid.ReplaceBearMHFunc)
druid.AutoAttacks.EnableAutoSwing(sim)

druid.manageCooldownsEnabled()
druid.UpdateManaRegenRates()
}
},
OnExpire: func(aura *core.Aura, sim *core.Simulation) {
druid.form = Humanoid
druid.SetCurrentPowerBar(core.ManaBar)
druid.AutoAttacks.SetMH(druid.WeaponFromMainHand())

druid.PseudoStats.ThreatMultiplier /= 2.1021
// druid.PseudoStats.SchoolDamageDealtMultiplier[stats.SchoolIndexPhysical] /= 1.0 + 0.02*float64(druid.Talents.MasterShapeshifter)
druid.PseudoStats.DamageTakenMultiplier /= sotfdtm
// Switch to using AddStat as PseudoStat is being removed
// druid.PseudoStats.BaseDodge -= 0.02 * float64(druid.Talents.FeralSwiftness+druid.Talents.NaturalReaction)

// druid.AddStatsDynamic(sim, predBonus.Invert())
druid.AddStatsDynamic(sim, statBonus.Invert())
druid.RemoveDynamicEquipScaling(sim, stats.Armor, druid.BearArmorMultiplier())
// if potpDep != nil {
// druid.DisableDynamicStatDep(sim, potpDep)
// }

healthFrac := druid.CurrentHealth() / druid.MaxHealth()
druid.DisableDynamicStatDep(sim, stamDep)
if hotwDep != nil {
druid.DisableDynamicStatDep(sim, hotwDep)
}
druid.RemoveHealth(sim, druid.CurrentHealth()-healthFrac*druid.MaxHealth())

if !druid.Env.MeasuringStats {
druid.AutoAttacks.SetReplaceMHSwing(nil)
druid.AutoAttacks.EnableAutoSwing(sim)

druid.manageCooldownsEnabled()
druid.UpdateManaRegenRates()
// druid.EnrageAura.Deactivate(sim)
if(druid.BearFormAura.IsActive()) {
druid.MaulQueueAura.Deactivate(sim)
}
}
},
})

rageMetrics := druid.NewRageMetrics(actionID)

furorProcChance := []float64{0, 0.2, 0.4, 0.6, 0.8, 1}[druid.Talents.Furor]

druid.BearForm = druid.RegisterSpell(Any, core.SpellConfig{
ActionID: actionID,
Flags: core.SpellFlagNoOnCastComplete | core.SpellFlagAPL,

ManaCost: core.ManaCostOptions{
BaseCost: 0.55,
Multiplier: 100 - 10*druid.Talents.NaturalShapeshifter,
},
Cast: core.CastConfig{
DefaultCast: core.Cast{
GCD: core.GCDDefault,
},
IgnoreHaste: true,
},

ApplyEffects: func(sim *core.Simulation, _ *core.Unit, spell *core.Spell) {
rageDelta := 0 - druid.CurrentRage()
if sim.Proc(furorProcChance, "Furor") {
rageDelta += 10
}
if rageDelta > 0 {
druid.AddRage(sim, rageDelta, rageMetrics)
} else if rageDelta < 0 {
druid.SpendRage(sim, -rageDelta, rageMetrics)
}
druid.BearFormAura.Activate(sim)
},
})
}

func (druid *Druid) manageCooldownsEnabled() {
// Disable cooldowns not usable in form and/or delay others
Expand Down
21 changes: 10 additions & 11 deletions sim/druid/_maul.go → sim/druid/maul.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,14 +18,14 @@ func (druid *Druid) registerMaulSpell() {
SpellSchool: core.SpellSchoolPhysical,
DefenseType: core.DefenseTypeMelee,
ProcMask: core.ProcMaskMeleeMHSpecial | core.ProcMaskMeleeMHAuto,
Flags: SpellFlagOmen | core.SpellFlagMeleeMetrics | core.SpellFlagIncludeTargetBonusDamage | core.SpellFlagNoOnCastComplete,
Flags: SpellFlagOmen | core.SpellFlagMeleeMetrics | core.SpellFlagNoOnCastComplete,

RageCost: core.RageCostOptions{
Cost: rageCost,
Refund: 0.8,
},

DamageMultiplier: 1 + 0.1*float64(druid.Talents.SavageFury),
DamageMultiplier: 1,
ThreatMultiplier: 1,
FlatThreatBonus: 424,

Expand All @@ -36,19 +36,18 @@ func (druid *Druid) registerMaulSpell() {
}

modifier := 1.0
if druid.BleedCategories.Get(target).AnyActive() {
modifier += .3
}
if druid.AssumeBleedActive || druid.Rip.Dot(target).IsActive() || druid.Rake.Dot(target).IsActive() || druid.Lacerate.Dot(target).IsActive() {
modifier *= 1.0 + (0.04 * float64(druid.Talents.RendAndTear))
}
// if druid.BleedCategories.Get(target).AnyActive() {
// modifier += .3
// }
// if druid.AssumeBleedActive || druid.Rip.Dot(target).IsActive() || druid.Rake.Dot(target).IsActive() || druid.Lacerate.Dot(target).IsActive() {
// modifier *= 1.0 + (0.04 * float64(druid.Talents.RendAndTear))
// }

baseDamage := flatBaseDamage +
spell.Unit.MHWeaponDamage(sim, spell.MeleeAttackPower()) +
spell.BonusWeaponDamage()
spell.Unit.MHWeaponDamage(sim, spell.MeleeAttackPower())
baseDamage *= modifier

result := spell.CalcAndDealDamage(sim, curTarget, baseDamage, spell.OutcomeMeleeSpecialHitAndCrit)
result := spell.CalcAndDealDamage(sim, target, baseDamage, spell.OutcomeMeleeSpecialHitAndCrit)

if !result.Landed() {
spell.IssueRefund(sim)
Expand Down
Loading

0 comments on commit 90d46a4

Please sign in to comment.