diff --git a/sim/encounters/register_all.go b/sim/encounters/register_all.go index b537f0a13d..affe0cf16e 100644 --- a/sim/encounters/register_all.go +++ b/sim/encounters/register_all.go @@ -3,8 +3,8 @@ package encounters import ( "github.com/wowsims/wotlk/sim/core" "github.com/wowsims/wotlk/sim/encounters/naxxramas" + "github.com/wowsims/wotlk/sim/encounters/toc" "github.com/wowsims/wotlk/sim/encounters/ulduar" - "github.com/wowsims/wotlk/sim/encounters/toc" ) func init() { diff --git a/sim/encounters/toc/gormok25h_ai.go b/sim/encounters/toc/gormok25h_ai.go index ed8d94d307..bfd8fec6cf 100644 --- a/sim/encounters/toc/gormok25h_ai.go +++ b/sim/encounters/toc/gormok25h_ai.go @@ -45,12 +45,12 @@ func addGormok25H(bossPrefix string) { type Gormok25HAI struct { Target *core.Target - Impale *core.Spell - StaggeringStomp *core.Spell - RisingAnger *core.Spell - RisingAngerAura *core.Aura - - //ValidStompTarget bool + Impale *core.Spell + StaggeringStomp *core.Spell + RisingAnger *core.Spell + RisingAngerAura *core.Aura + + //ValidStompTarget bool } //func GormokTargetInputs() []*proto.TargetInput { @@ -73,7 +73,7 @@ func NewGormok25HAI() core.AIFactory { func (ai *Gormok25HAI) Initialize(target *core.Target, config *proto.Target) { ai.Target = target - //ai.ValidStompTarget = config.TargetInputs[0].BoolValue + //ai.ValidStompTarget = config.TargetInputs[0].BoolValue ai.registerImpaleSpell(target) ai.registerStaggeringStompSpell(target) @@ -87,7 +87,7 @@ func (ai *Gormok25HAI) Reset(*core.Simulation) { func (ai *Gormok25HAI) registerImpaleSpell(target *core.Target) { actionID := core.ActionID{SpellID: 66331} - // TODO - Allegedly he can be Disarmed to suppress this ability? + // TODO - Allegedly he can be Disarmed to suppress this ability? ai.Impale = target.RegisterSpell(core.SpellConfig{ ActionID: actionID, @@ -127,7 +127,7 @@ func (ai *Gormok25HAI) registerImpaleSpell(target *core.Target) { dot.SnapshotCritChance = dot.Spell.PhysicalCritChance(target, attackTable) dot.SnapshotAttackerMultiplier = dot.Spell.AttackerDamageMultiplier(attackTable) } - }, + }, OnTick: func(sim *core.Simulation, target *core.Unit, dot *core.Dot) { dot.CalcAndDealPeriodicSnapshotDamage(sim, target, dot.Spell.OutcomeAlwaysHit) @@ -135,7 +135,7 @@ func (ai *Gormok25HAI) registerImpaleSpell(target *core.Target) { }, ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) { - // 150% weapon damage + // 150% weapon damage baseDamage := 1.50 * spell.Unit.AutoAttacks.MH.EnemyWeaponDamage(sim, spell.MeleeAttackPower(), false) spell.CalcAndDealDamage(sim, target, baseDamage, spell.OutcomeAlwaysHit) @@ -169,7 +169,7 @@ func (ai *Gormok25HAI) registerStaggeringStompSpell(target *core.Target) { }, DefaultCast: core.Cast{ CastTime: time.Millisecond * 500, - GCD: core.GCDDefault, + GCD: core.GCDDefault, }, }, @@ -179,12 +179,12 @@ func (ai *Gormok25HAI) registerStaggeringStompSpell(target *core.Target) { ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) { for _, aoeTarget := range sim.Raid.GetActiveUnits() { - - // TODO - Filter targets to melee only, right now it just hits everyone - // TODO - Should this ignore armor? Damage in logs seems inconsistent + + // TODO - Filter targets to melee only, right now it just hits everyone + // TODO - Should this ignore armor? Damage in logs seems inconsistent baseDamage := sim.Roll(11700, 12300) spell.CalcAndDealDamage(sim, aoeTarget, baseDamage, spell.OutcomeAlwaysHit) - // TODO - Interrupts spellcasting for 8 seconds. Does NOT stun or knockdown + // TODO - Interrupts spellcasting for 8 seconds. Does NOT stun or knockdown } }, }) @@ -195,10 +195,10 @@ func (ai *Gormok25HAI) registerRisingAngerSpell(target *core.Target) { actionID := core.ActionID{SpellID: 66636} ai.RisingAngerAura = target.GetOrRegisterAura(core.Aura{ - Label: "Rising Anger", - ActionID: actionID.WithTag(1), + Label: "Rising Anger", + ActionID: actionID.WithTag(1), MaxStacks: 99, - Duration: time.Second * 120, + Duration: time.Second * 120, OnStacksChange: func(aura *core.Aura, sim *core.Simulation, oldStacks int32, newStacks int32) { aura.Unit.PseudoStats.DamageDealtMultiplier /= 1 + (.15 * float64(oldStacks)) aura.Unit.PseudoStats.DamageDealtMultiplier *= 1 + (.15 * float64(newStacks)) @@ -228,7 +228,7 @@ func (ai *Gormok25HAI) registerRisingAngerSpell(target *core.Target) { ai.RisingAngerAura.Activate(sim) ai.RisingAngerAura.AddStack(sim) - + }, }) diff --git a/sim/shaman/elemental/TestElemental.results b/sim/shaman/elemental/TestElemental.results index 3d163c78c3..e7344884f2 100644 --- a/sim/shaman/elemental/TestElemental.results +++ b/sim/shaman/elemental/TestElemental.results @@ -1046,42 +1046,42 @@ dps_results: { dps_results: { key: "TestElemental-Settings-Orc-P1-EleFireElemental-FullBuffs-LongMultiTarget" value: { - dps: 15273.10165 + dps: 15129.33896 tps: 9171.71477 } } dps_results: { key: "TestElemental-Settings-Orc-P1-EleFireElemental-FullBuffs-LongSingleTarget" value: { - dps: 7380.27637 + dps: 7347.59063 tps: 4245.09094 } } dps_results: { key: "TestElemental-Settings-Orc-P1-EleFireElemental-FullBuffs-ShortSingleTarget" value: { - dps: 9025.17225 + dps: 8950.53382 tps: 4778.88447 } } dps_results: { key: "TestElemental-Settings-Orc-P1-EleFireElemental-NoBuffs-LongMultiTarget" value: { - dps: 6924.87755 + dps: 6807.8224 tps: 3387.93706 } } dps_results: { key: "TestElemental-Settings-Orc-P1-EleFireElemental-NoBuffs-LongSingleTarget" value: { - dps: 4031.91121 + dps: 4005.52044 tps: 2250.72174 } } dps_results: { key: "TestElemental-Settings-Orc-P1-EleFireElemental-NoBuffs-ShortSingleTarget" value: { - dps: 6642.00121 + dps: 6582.79903 tps: 3416.27543 } } @@ -1130,42 +1130,42 @@ dps_results: { dps_results: { key: "TestElemental-Settings-Troll-P1-EleFireElemental-FullBuffs-LongMultiTarget" value: { - dps: 14838.54833 + dps: 14704.80039 tps: 8999.86316 } } dps_results: { key: "TestElemental-Settings-Troll-P1-EleFireElemental-FullBuffs-LongSingleTarget" value: { - dps: 7341.02902 + dps: 7310.83985 tps: 4243.26408 } } dps_results: { key: "TestElemental-Settings-Troll-P1-EleFireElemental-FullBuffs-ShortSingleTarget" value: { - dps: 8851.28483 + dps: 8782.01111 tps: 4724.57911 } } dps_results: { key: "TestElemental-Settings-Troll-P1-EleFireElemental-NoBuffs-LongMultiTarget" value: { - dps: 6734.19727 + dps: 6625.43171 tps: 3371.56984 } } dps_results: { key: "TestElemental-Settings-Troll-P1-EleFireElemental-NoBuffs-LongSingleTarget" value: { - dps: 3971.06473 + dps: 3946.74017 tps: 2237.18193 } } dps_results: { key: "TestElemental-Settings-Troll-P1-EleFireElemental-NoBuffs-ShortSingleTarget" value: { - dps: 6453.02718 + dps: 6398.01871 tps: 3344.22541 } } diff --git a/sim/shaman/enhancement/TestEnhancement.results b/sim/shaman/enhancement/TestEnhancement.results index cc064b84d8..2c9f251a52 100644 --- a/sim/shaman/enhancement/TestEnhancement.results +++ b/sim/shaman/enhancement/TestEnhancement.results @@ -1002,84 +1002,84 @@ dps_results: { dps_results: { key: "TestEnhancement-Settings-Orc-P1-EnhFireElemental-FullBuffs-LongMultiTarget" value: { - dps: 21830.168 + dps: 21691.69029 tps: 12077.45739 } } dps_results: { key: "TestEnhancement-Settings-Orc-P1-EnhFireElemental-FullBuffs-LongSingleTarget" value: { - dps: 7645.19014 + dps: 7614.48913 tps: 4105.32006 } } dps_results: { key: "TestEnhancement-Settings-Orc-P1-EnhFireElemental-FullBuffs-ShortSingleTarget" value: { - dps: 9455.7919 + dps: 9388.68693 tps: 4470.62374 } } dps_results: { key: "TestEnhancement-Settings-Orc-P1-EnhFireElemental-NoBuffs-LongMultiTarget" value: { - dps: 11984.55155 + dps: 11897.64887 tps: 7238.20997 } } dps_results: { key: "TestEnhancement-Settings-Orc-P1-EnhFireElemental-NoBuffs-LongSingleTarget" value: { - dps: 4240.31396 + dps: 4218.82142 tps: 2227.62593 } } dps_results: { key: "TestEnhancement-Settings-Orc-P1-EnhFireElemental-NoBuffs-ShortSingleTarget" value: { - dps: 5808.43888 + dps: 5761.21984 tps: 2716.23544 } } dps_results: { key: "TestEnhancement-Settings-Orc-P1-EnhItemSwap-FullBuffs-LongMultiTarget" value: { - dps: 21325.26572 + dps: 21202.73907 tps: 11983.50385 } } dps_results: { key: "TestEnhancement-Settings-Orc-P1-EnhItemSwap-FullBuffs-LongSingleTarget" value: { - dps: 7501.58397 + dps: 7475.16809 tps: 4079.05395 } } dps_results: { key: "TestEnhancement-Settings-Orc-P1-EnhItemSwap-FullBuffs-ShortSingleTarget" value: { - dps: 9153.38453 + dps: 9093.76068 tps: 4390.3509 } } dps_results: { key: "TestEnhancement-Settings-Orc-P1-EnhItemSwap-NoBuffs-LongMultiTarget" value: { - dps: 11532.90041 + dps: 11461.30536 tps: 7129.51183 } } dps_results: { key: "TestEnhancement-Settings-Orc-P1-EnhItemSwap-NoBuffs-LongSingleTarget" value: { - dps: 4114.27835 + dps: 4096.59617 tps: 2201.12024 } } dps_results: { key: "TestEnhancement-Settings-Orc-P1-EnhItemSwap-NoBuffs-ShortSingleTarget" value: { - dps: 5578.26982 + dps: 5537.95784 tps: 2671.33841 } } @@ -1128,84 +1128,84 @@ dps_results: { dps_results: { key: "TestEnhancement-Settings-Troll-P1-EnhFireElemental-FullBuffs-LongMultiTarget" value: { - dps: 21443.06045 + dps: 21317.34725 tps: 12015.86236 } } dps_results: { key: "TestEnhancement-Settings-Troll-P1-EnhFireElemental-FullBuffs-LongSingleTarget" value: { - dps: 7617.72156 + dps: 7590.2048 tps: 4146.08764 } } dps_results: { key: "TestEnhancement-Settings-Troll-P1-EnhFireElemental-FullBuffs-ShortSingleTarget" value: { - dps: 9373.9797 + dps: 9313.36781 tps: 4545.22588 } } dps_results: { key: "TestEnhancement-Settings-Troll-P1-EnhFireElemental-NoBuffs-LongMultiTarget" value: { - dps: 11753.70558 + dps: 11675.2001 tps: 7190.74357 } } dps_results: { key: "TestEnhancement-Settings-Troll-P1-EnhFireElemental-NoBuffs-LongSingleTarget" value: { - dps: 4169.71469 + dps: 4150.72648 tps: 2220.94529 } } dps_results: { key: "TestEnhancement-Settings-Troll-P1-EnhFireElemental-NoBuffs-ShortSingleTarget" value: { - dps: 5774.55866 + dps: 5732.73753 tps: 2781.72271 } } dps_results: { key: "TestEnhancement-Settings-Troll-P1-EnhItemSwap-FullBuffs-LongMultiTarget" value: { - dps: 21011.19933 + dps: 20900.34366 tps: 11924.31454 } } dps_results: { key: "TestEnhancement-Settings-Troll-P1-EnhItemSwap-FullBuffs-LongSingleTarget" value: { - dps: 7458.79421 + dps: 7435.0347 tps: 4094.33538 } } dps_results: { key: "TestEnhancement-Settings-Troll-P1-EnhItemSwap-FullBuffs-ShortSingleTarget" value: { - dps: 8955.52501 + dps: 8902.2951 tps: 4378.13273 } } dps_results: { key: "TestEnhancement-Settings-Troll-P1-EnhItemSwap-NoBuffs-LongMultiTarget" value: { - dps: 11298.48918 + dps: 11233.975 tps: 7046.81856 } } dps_results: { key: "TestEnhancement-Settings-Troll-P1-EnhItemSwap-NoBuffs-LongSingleTarget" value: { - dps: 4085.4434 + dps: 4069.6511 tps: 2216.83085 } } dps_results: { key: "TestEnhancement-Settings-Troll-P1-EnhItemSwap-NoBuffs-ShortSingleTarget" value: { - dps: 5399.00434 + dps: 5363.01527 tps: 2634.31029 } } diff --git a/sim/shaman/fire_elemental_pet.go b/sim/shaman/fire_elemental_pet.go index 8d86536ae4..0343e35d1a 100644 --- a/sim/shaman/fire_elemental_pet.go +++ b/sim/shaman/fire_elemental_pet.go @@ -5,6 +5,7 @@ import ( "time" "github.com/wowsims/wotlk/sim/core" + "github.com/wowsims/wotlk/sim/core/proto" "github.com/wowsims/wotlk/sim/core/stats" ) @@ -35,7 +36,7 @@ func (shaman *Shaman) NewFireElemental(bonusSpellPower float64) *FireElemental { fireElemental.EnableAutoAttacks(fireElemental, core.AutoAttackOptions{ MainHand: core.Weapon{ BaseDamageMin: 1, // Estimated from base AP - BaseDamageMax: 24, // Estimated from base AP + BaseDamageMax: 23, // Estimated from base AP SwingSpeed: 2, SwingDuration: time.Second * 2, CritMultiplier: 2, // Pretty sure this is right. @@ -50,6 +51,14 @@ func (shaman *Shaman) NewFireElemental(bonusSpellPower float64) *FireElemental { fireElemental.AddStat(stats.AttackPower, float64(bonusSpellPower)*4.45) } + if shaman.hasHeroicPresence || shaman.Race == proto.Race_RaceDraenei { + fireElemental.AddStats(stats.Stats{ + stats.MeleeHit: -core.MeleeHitRatingPerHitChance, + stats.SpellHit: -core.SpellHitRatingPerHitChance, + stats.Expertise: math.Floor(-core.SpellHitRatingPerHitChance * 0.79), + }) + } + fireElemental.OnPetEnable = fireElemental.enable fireElemental.OnPetDisable = fireElemental.disable @@ -71,12 +80,14 @@ func (fireElemental *FireElemental) GetPet() *core.Pet { } func (fireElemental *FireElemental) Initialize() { + fireElemental.registerFireBlast() fireElemental.registerFireNova() fireElemental.registerFireShieldAura() } func (fireElemental *FireElemental) Reset(sim *core.Simulation) { + } func (fireElemental *FireElemental) OnGCDReady(sim *core.Simulation) { @@ -140,8 +151,8 @@ var fireElementalPetBaseStats = stats.Stats{ stats.Health: 994, stats.Intellect: 147, stats.Stamina: 327, - stats.SpellPower: 995, //Estimated - stats.AttackPower: 1369, //Estimated + stats.SpellPower: 0, //Estimated + stats.AttackPower: 1303, //Estimated // TODO : Log digging and my own samples this seems to be around the 5% mark. stats.MeleeCrit: (5 + 1.8) * core.CritRatingPerCritChance, @@ -158,8 +169,8 @@ func (shaman *Shaman) fireElementalStatInheritance() core.PetStatInheritance { return stats.Stats{ stats.Stamina: ownerStats[stats.Stamina] * 0.75, stats.Intellect: ownerStats[stats.Intellect] * 0.30, - stats.SpellPower: ownerStats[stats.SpellPower] * 0.5218, - stats.AttackPower: ownerStats[stats.SpellPower] * 4.45, + stats.SpellPower: ownerStats[stats.SpellPower] * 0.4970, + stats.AttackPower: ownerStats[stats.SpellPower] * 4.2381, // TODO tested useing pre-patch lvl 70 stats need to confirm in WOTLK at 80. stats.MeleeHit: hitRatingFromOwner, diff --git a/sim/shaman/fire_elemental_spells.go b/sim/shaman/fire_elemental_spells.go index 876610e148..ae1dc0d259 100644 --- a/sim/shaman/fire_elemental_spells.go +++ b/sim/shaman/fire_elemental_spells.go @@ -32,7 +32,7 @@ func (fireElemental *FireElemental) registerFireBlast() { ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) { // TODO these are approximation, from base SP - baseDamage := sim.Roll(323, 459) + 0.429*spell.SpellPower() + baseDamage := sim.Roll(714, 844) + 0.429*spell.SpellPower() spell.CalcAndDealDamage(sim, target, baseDamage, spell.OutcomeMagicHitAndCrit) }, }) @@ -64,11 +64,8 @@ func (fireElemental *FireElemental) registerFireNova() { ThreatMultiplier: 1, ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) { - // TODO is this the right affect should it be Capped? - // TODO these are approximation, from base SP - dmgFromSP := 1.0071 * spell.SpellPower() for _, aoeTarget := range sim.Encounter.TargetUnits { - baseDamage := sim.Roll(1, 150) + dmgFromSP + baseDamage := sim.Roll(955, 1098) + spell.SpellPower() baseDamage *= sim.Encounter.AOECapMultiplier() spell.CalcAndDealDamage(sim, aoeTarget, baseDamage, spell.OutcomeMagicHitAndCrit) } @@ -102,7 +99,7 @@ func (fireElemental *FireElemental) registerFireShieldAura() { // TODO these are approximation, from base SP dmgFromSP := 0.032 * dot.Spell.SpellPower() for _, aoeTarget := range sim.Encounter.TargetUnits { - baseDamage := sim.Roll(68, 70) + dmgFromSP + baseDamage := sim.Roll(95, 97) + dmgFromSP //baseDamage *= sim.Encounter.AOECapMultiplier() dot.Spell.CalcAndDealDamage(sim, aoeTarget, baseDamage, dot.Spell.OutcomeMagicCrit) } diff --git a/sim/shaman/shaman.go b/sim/shaman/shaman.go index 2cb014c885..b08fa0d7a9 100644 --- a/sim/shaman/shaman.go +++ b/sim/shaman/shaman.go @@ -146,6 +146,8 @@ type Shaman struct { EarthShield *core.Spell waterShieldManaMetrics *core.ResourceMetrics + + hasHeroicPresence bool } // Implemented by each Shaman spec. @@ -220,6 +222,8 @@ func (shaman *Shaman) AddPartyBuffs(partyBuffs *proto.PartyBuffs) { if shaman.Talents.ManaTideTotem { partyBuffs.ManaTideTotems++ } + + shaman.hasHeroicPresence = partyBuffs.HeroicPresence } func (shaman *Shaman) Initialize() {