Documentation ¶
Index ¶
- Constants
- Variables
- type Druid
- func (druid *Druid) AddRaidBuffs(raidBuffs *proto.RaidBuffs)
- func (druid *Druid) ApplyRunes()
- func (druid *Druid) ApplyTalents()
- func (druid *Druid) BearArmorMultiplier() float64
- func (druid *Druid) CanShred() bool
- func (druid *Druid) CurrentFerociousBiteCost() float64
- func (druid *Druid) CurrentMangleCatCost() float64
- func (druid *Druid) CurrentRakeCost() float64
- func (druid *Druid) CurrentRipCost() float64
- func (druid *Druid) CurrentSavageRoarCost() float64
- func (druid *Druid) CurrentShredCost() float64
- func (druid *Druid) CurrentSwipeCatCost() float64
- func (druid *Druid) GetCatWeapon(level int32) core.Weapon
- func (druid *Druid) GetCharacter() *core.Character
- func (druid *Druid) GetDynamicPredStrikeStats() stats.Stats
- func (druid *Druid) GetForm() DruidForm
- func (druid *Druid) GetFormShiftStats() stats.Stats
- func (druid *Druid) HasRune(rune proto.DruidRune) bool
- func (druid *Druid) ImprovedMoonfireCritBonus() float64
- func (druid *Druid) ImprovedMoonfireDamageMultiplier() float64
- func (druid *Druid) InForm(form DruidForm) bool
- func (druid *Druid) Initialize()
- func (druid *Druid) IsMangle(spell *core.Spell) bool
- func (druid *Druid) MoonfuryDamageMultiplier() float64
- func (druid *Druid) MoonglowManaCostMultiplier() int32
- func (druid *Druid) NewT2Treants() *T2Treants
- func (druid *Druid) RegisterBalanceSpells()
- func (druid *Druid) RegisterFeralCatSpells()
- func (druid *Druid) RegisterFeralTankSpells()
- func (druid *Druid) RegisterSpell(formMask DruidForm, config core.SpellConfig) *DruidSpell
- func (druid *Druid) Reset(_ *core.Simulation)
- func (druid *Druid) ShouldFaerieFire(sim *core.Simulation, target *core.Unit) bool
- func (druid *Druid) ThickHideMultiplier() float64
- type DruidAgent
- type DruidForm
- type DruidSpell
- type FerociousBiteRankInfo
- type RakeRankInfo
- type RipRankInfo
- type SelfBuffs
- type T2Treants
Constants ¶
const ( SpellFlagOmen = core.SpellFlagAgentReserved1 SpellFlagBuilder = core.SpellFlagAgentReserved2 )
const ( SpellCode_DruidNone int32 = iota SpellCode_DruidFaerieFire SpellCode_DruidFaerieFireFeral SpellCode_DruidFerociousBite SpellCode_DruidInsectSwarm SpellCode_DruidMangleCat SpellCode_DruidMangleBear SpellCode_DruidMoonfire SpellCode_DruidRake SpellCode_DruidRip SpellCode_DruidShred SpellCode_DruidStarfire SpellCode_DruidStarsurge SpellCode_DruidWrath SpellCode_DruidStarfall SpellCode_DruidStarfallTick SpellCode_DruidStarfallSplash SpellCode_DruidSunfire )
const ( WolfsheadHelm = 8345 IdolOfFerocity = 22397 IdolOfTheMoon = 23197 IdolOfBrutality = 23198 IdolMindExpandingMushroom = 209576 Catnip = 213407 IdolOfWrath = 216490 BloodBarkCrusher = 216499 IdolOfTheDream = 220606 RitualistsHammer = 221446 Glasir = 224281 Raelar = 224282 IdolOfExsanguinationCat = 228181 IdolOfTheSwarm = 228180 IdolOfExsanguinationBear = 228182 BloodGuardDragonhideGrips = 227180 KnightLieutenantsDragonhideGrips = 227183 WushoolaysCharmOfNature = 231280 PristineEnchantedSouthSeasKelp = 231316 IdolOfCelestialFocus = 232390 IdolOfFelineFocus = 232391 )
Totem Item IDs
const ( Gore_BearResetProcChance = .15 Gore_CatResetProcChance = .15 )
const ( ElunesFires_BonusMoonfireTime = time.Second * 6 ElunesFires_BonusSunfireTime = time.Second * 3 ElunesFires_BonusRipTime = time.Second * 1 )
const InsectSwarmRanks = 5
const MoonfireRanks = 10
const RakeBaseDmgMultiplier = 2.25
See https://www.wowhead.com/classic/spell=436895/s03-tuning-and-overrides-passive-druid Mod Eff# should be base value only. Modifies Effect #1's Value +126%: Modifies Effect #2's Value +126%:
const RakeDamageCoef = 0.09
See https://www.wowhead.com/classic/news/development-notes-for-phase-4-ptr-season-of-discovery-new-runes-class-changes-342896 - Rake and Rip damage contributions from attack power increased by roughly 50%. PTR testing comes out to .0993377 AP scaling damageCoef := .04
const RipBaseDamageMultiplier = 1.5
const RipDamageCoefPerAPPerCP = 0.015
See https://www.wowhead.com/classic/news/development-notes-for-phase-4-ptr-season-of-discovery-new-runes-class-changes-342896 - Rake and Rip damage contributions from attack power increased by roughly 50%. PTR testing comes out to .0165563 AP scaling per CP damageCoefPerCP := 0.01
const RipTicks int32 = 8
See https://www.wowhead.com/classic/spell=436895/s03-tuning-and-overrides-passive-druid Modifies Buff Duration +4001: Modifies Periodic Damage/Healing Done +51%: const RipTicks int32 = 6
const ShredFlatDmgMultiplier = .75 // decreases flat damage modifier multiplicatively by -25% to counteract 3.0/2.25 overall scaling buff
const ShredWeaponMultiplierBuff = 0.75 // increases multiplier additively by 75% from 2.25 to 3.0
See https://www.wowhead.com/classic/spell=436895/s03-tuning-and-overrides-passive-druid Modifies Effect #1's Value -24%: Modifies Effect #2's Value +76:
const StarfireRanks = 7
const SunfireTicks = int32(4)
const SwipeRanks = 5
const SwipeThreatMultiplier = 2.0
See https://www.wowhead.com/classic/spell=436895/s03-tuning-and-overrides-passive-druid Modifies Threat +101%:
const WrathRanks = 8
Variables ¶
var InsectSwarmBaseDamage = [InsectSwarmRanks + 1]float64{0, 66, 138, 174, 264, 324}
var InsectSwarmLevel = [InsectSwarmRanks + 1]int{0, 20, 30, 40, 50, 60}
var InsectSwarmManaCost = [InsectSwarmRanks + 1]float64{0, 45, 85, 100, 140, 160}
var InsectSwarmSpellId = [InsectSwarmRanks + 1]int32{0, 5570, 24974, 24975, 24976, 24977}
var ItemSetBloodGuardsCracklingLeather = core.NewItemSet(core.ItemSet{ Name: "Blood Guard's Crackling Leather", Bonuses: map[int32]core.ApplyEffect{ 3: func(agent core.Agent) { c := agent.GetCharacter() c.AddStat(stats.Stamina, 15) }, 6: func(agent core.Agent) { c := agent.GetCharacter() c.AddStat(stats.SpellPower, 18) }, }, })
var ItemSetBloodGuardsRestoredLeather = core.NewItemSet(core.ItemSet{ Name: "Blood Guard's Restored Leather", Bonuses: map[int32]core.ApplyEffect{ 3: func(agent core.Agent) { c := agent.GetCharacter() c.AddStat(stats.Stamina, 15) }, 6: func(agent core.Agent) { c := agent.GetCharacter() c.AddStat(stats.HealingPower, 33) }, }, })
var ItemSetBountyOfStormrage = core.NewItemSet(core.ItemSet{ Name: "Bounty of Stormrage", Bonuses: map[int32]core.ApplyEffect{ 2: func(agent core.Agent) { }, 4: func(agent core.Agent) { }, 6: func(agent core.Agent) { }, }, })
var ItemSetCenarionBounty = core.NewItemSet(core.ItemSet{ Name: "Cenarion Bounty", Bonuses: map[int32]core.ApplyEffect{ 2: func(agent core.Agent) { }, 4: func(agent core.Agent) { }, 6: func(agent core.Agent) { }, }, })
var ItemSetCenarionCunning = core.NewItemSet(core.ItemSet{ Name: "Cenarion Cunning", Bonuses: map[int32]core.ApplyEffect{ 2: func(agent core.Agent) { druid := agent.(DruidAgent).GetDruid() druid.ImprovedFaerieFireAuras = druid.NewEnemyAuraArray(func(target *core.Unit, level int32) *core.Aura { return core.ImprovedFaerieFireAura(target) }) core.MakePermanent(druid.RegisterAura(core.Aura{ Label: "S03 - Item - T1 - Druid - Feral 2P Bonus Trigger", OnSpellHitDealt: func(aura *core.Aura, sim *core.Simulation, spell *core.Spell, result *core.SpellResult) { if (spell.SpellCode == SpellCode_DruidFaerieFire || spell.SpellCode == SpellCode_DruidFaerieFireFeral) && result.Landed() { druid.ImprovedFaerieFireAuras.Get(result.Target).Activate(sim) } }, })) }, 4: func(agent core.Agent) { }, 6: func(agent core.Agent) { druid := agent.(DruidAgent).GetDruid() if !druid.HasRune(proto.DruidRune_RuneLegsSavageRoar) { return } core.MakePermanent(druid.RegisterAura(core.Aura{ Label: "S03 - Item - T1 - Druid - Feral 6P Bonus", ActionID: core.ActionID{SpellID: 455873}, })) druid.OnComboPointsSpent(func(sim *core.Simulation, spell *core.Spell, comboPoints int32) { if spell == druid.SavageRoar.Spell || !druid.SavageRoarAura.IsActive() { return } if sim.Proc(.2*float64(comboPoints), "S03 - Item - T1 - Druid - Feral 6P Bonus") { druid.SavageRoarAura.Refresh(sim) } }) }, }, })
var ItemSetCenarionEclipse = core.NewItemSet(core.ItemSet{ Name: "Cenarion Eclipse", Bonuses: map[int32]core.ApplyEffect{ 2: func(agent core.Agent) { }, 4: func(agent core.Agent) { c := agent.GetCharacter() c.AddStats(stats.Stats{ stats.MeleeHit: 3, stats.SpellHit: 3, }) }, 6: func(agent core.Agent) { druid := agent.(DruidAgent).GetDruid() if !druid.HasRune(proto.DruidRune_RuneCloakStarfall) { return } druid.RegisterAura(core.Aura{ Label: "S03 - Item - T1 - Druid - Balance 6P Bonus", OnInit: func(aura *core.Aura, sim *core.Simulation) { druid.Starfall.CD.Duration /= 2 }, }) }, }, })
var ItemSetCenarionRage = core.NewItemSet(core.ItemSet{ Name: "Cenarion Rage", Bonuses: map[int32]core.ApplyEffect{ 2: func(agent core.Agent) { }, 4: func(agent core.Agent) { }, 6: func(agent core.Agent) { }, }, })
var ItemSetChampionsRefuge = core.NewItemSet(core.ItemSet{ Name: "Champion's Refuge", Bonuses: map[int32]core.ApplyEffect{ 2: func(agent core.Agent) { c := agent.GetCharacter() c.AddStat(stats.HealingPower, 44) }, 4: func(agent core.Agent) { }, 6: func(agent core.Agent) { c := agent.GetCharacter() c.AddStat(stats.Stamina, 20) }, }, })
var ItemSetChampionsSanctuary = core.NewItemSet(core.ItemSet{ Name: "Champion's Sanctuary", Bonuses: map[int32]core.ApplyEffect{ 2: func(agent core.Agent) { c := agent.GetCharacter() c.AddStat(stats.AttackPower, 40) }, 4: func(agent core.Agent) { }, 6: func(agent core.Agent) { c := agent.GetCharacter() c.AddStat(stats.Stamina, 20) }, }, })
var ItemSetChampionsWildhide = core.NewItemSet(core.ItemSet{ Name: "Champion's Wildhide", Bonuses: map[int32]core.ApplyEffect{ 2: func(agent core.Agent) { c := agent.GetCharacter() c.AddStat(stats.SpellPower, 23) }, 4: func(agent core.Agent) { }, 6: func(agent core.Agent) { c := agent.GetCharacter() c.AddStat(stats.Stamina, 20) }, }, })
var ItemSetCoagulateBloodguardsLeathers = core.NewItemSet(core.ItemSet{ Name: "Coagulate Bloodguard's Leathers", Bonuses: map[int32]core.ApplyEffect{ 2: func(agent core.Agent) { c := agent.GetCharacter() c.AddStat(stats.Strength, 10) }, 3: func(agent core.Agent) { druid := agent.(DruidAgent).GetDruid() procAura := druid.GetOrRegisterAura(core.Aura{ Label: "Power Shredder Proc", ActionID: core.ActionID{SpellID: 449925}, Duration: time.Second * 10, OnGain: func(aura *core.Aura, sim *core.Simulation) { druid.CatForm.Cost.Multiplier -= 30 }, OnExpire: func(aura *core.Aura, sim *core.Simulation) { druid.CatForm.Cost.Multiplier += 30 }, OnCastComplete: func(aura *core.Aura, sim *core.Simulation, spell *core.Spell) { if spell == druid.CatForm.Spell { aura.Deactivate(sim) } }, }) core.MakeProcTriggerAura(&druid.Unit, core.ProcTrigger{ Name: "Power Shredder", Callback: core.CallbackOnCastComplete, Handler: func(sim *core.Simulation, spell *core.Spell, result *core.SpellResult) { if spell.SpellCode == SpellCode_DruidShred { procAura.Activate(sim) } }, }) }, }, })
var ItemSetCunningOfStormrage = core.NewItemSet(core.ItemSet{ Name: "Cunning of Stormrage", Bonuses: map[int32]core.ApplyEffect{ 2: func(agent core.Agent) { druid := agent.(DruidAgent).GetDruid() druid.RegisterAura(core.Aura{ Label: "S03 - Item - T2- Druid - Feral 2P Bonus", OnInit: func(aura *core.Aura, sim *core.Simulation) { for _, dot := range druid.Rake.Dots() { if dot != nil { dot.NumberOfTicks += 2 dot.RecomputeAuraDuration() oldOnSnapshot := dot.OnSnapshot dot.OnSnapshot = func(sim *core.Simulation, target *core.Unit, dot *core.Dot, isRollover bool) { oldOnSnapshot(sim, target, dot, isRollover) dot.SnapshotAttackerMultiplier *= 1.50 } } } }, }) }, 4: func(agent core.Agent) { druid := agent.(DruidAgent).GetDruid() druid.RegisterAura(core.Aura{ Label: "S03 - Item - T2- Druid - Feral 4P Bonus", OnInit: func(aura *core.Aura, sim *core.Simulation) { oldOnGain := druid.TigersFuryAura.OnGain druid.TigersFuryAura.OnGain = func(aura *core.Aura, sim *core.Simulation) { oldOnGain(aura, sim) druid.AddStatsDynamic(sim, stats.Stats{stats.MeleeCrit: 15 * core.CritRatingPerCritChance}) } oldOnExpire := druid.TigersFuryAura.OnExpire druid.TigersFuryAura.OnExpire = func(aura *core.Aura, sim *core.Simulation) { oldOnExpire(aura, sim) druid.AddStatsDynamic(sim, stats.Stats{stats.MeleeCrit: -15 * core.CritRatingPerCritChance}) } }, }) }, 6: func(agent core.Agent) { druid := agent.(DruidAgent).GetDruid() druid.RegisterAura(core.Aura{ Label: "S03 - Item - T2- Druid - Feral 6P Bonus", OnInit: func(aura *core.Aura, sim *core.Simulation) { dotSpells := []*DruidSpell{druid.Rake, druid.Rip} for _, spell := range []*DruidSpell{druid.Shred, druid.MangleCat, druid.FerociousBite} { if spell == nil { continue } oldApplyEffects := spell.ApplyEffects spell.ApplyEffects = func(sim *core.Simulation, target *core.Unit, spell *core.Spell) { bonusMultiplier := 1.0 for _, dotSpell := range dotSpells { if dotSpell.Dot(target).IsActive() { bonusMultiplier += .10 } } spell.DamageMultiplier *= bonusMultiplier oldApplyEffects(sim, target, spell) spell.DamageMultiplier /= bonusMultiplier } } }, }) }, }, })
var ItemSetEclipseOfStormrage = core.NewItemSet(core.ItemSet{ Name: "Eclipse of Stormrage", Bonuses: map[int32]core.ApplyEffect{ 2: func(agent core.Agent) { druid := agent.(DruidAgent).GetDruid() druid.RegisterAura(core.Aura{ Label: "S03 - Item - T2 - Druid - Balance 2P Bonus", OnInit: func(aura *core.Aura, sim *core.Simulation) { for _, spell := range druid.Hurricane { spell.DamageMultiplier *= 1.25 } if druid.Starfall != nil { druid.StarfallTick.DamageMultiplier *= 1.25 druid.StarfallSplash.DamageMultiplier *= 1.25 } }, }) }, 4: func(agent core.Agent) { druid := agent.(DruidAgent).GetDruid() affectedSpellCodes := []int32{SpellCode_DruidWrath, SpellCode_DruidStarsurge} core.MakePermanent(druid.RegisterAura(core.Aura{ Label: "S03 - Item - T2 - Druid - Balance 4P Bonus", OnCastComplete: func(aura *core.Aura, sim *core.Simulation, spell *core.Spell) { if slices.Contains(affectedSpellCodes, spell.SpellCode) && !druid.t26pcTreants.IsActive() && sim.Proc(0.10, "Summon Treants") { druid.t26pcTreants.EnableWithTimeout(sim, druid.t26pcTreants, time.Second*15) } }, })) }, 6: func(agent core.Agent) { druid := agent.(DruidAgent).GetDruid() starfires := []*DruidSpell{} buffAura := druid.RegisterAura(core.Aura{ ActionID: core.ActionID{SpellID: 467088}, Label: "Astral Power", Duration: time.Second * 15, MaxStacks: 3, OnInit: func(aura *core.Aura, sim *core.Simulation) { for _, spell := range druid.Starfire { if spell != nil { starfires = append(starfires, spell) } } }, OnStacksChange: func(aura *core.Aura, sim *core.Simulation, oldStacks, newStacks int32) { for _, spell := range starfires { spell.DamageMultiplier /= 1 + .10*float64(oldStacks) spell.DamageMultiplier *= 1 + .10*float64(newStacks) } }, OnCastComplete: func(aura *core.Aura, sim *core.Simulation, spell *core.Spell) { if spell.SpellCode == SpellCode_DruidStarfire { aura.Deactivate(sim) } }, }) procSpellCodes := []int32{SpellCode_DruidWrath, SpellCode_DruidStarsurge} core.MakePermanent(druid.RegisterAura(core.Aura{ Label: "S03 - Item - T2 - Druid - Balance 6P Bonus", OnSpellHitDealt: func(aura *core.Aura, sim *core.Simulation, spell *core.Spell, result *core.SpellResult) { if slices.Contains(procSpellCodes, spell.SpellCode) && result.DidCrit() && sim.Proc(0.50, "Astral Power") { buffAura.Activate(sim) buffAura.AddStack(sim) } }, })) }, }, })
var ItemSetEmeraldDreamkeeperGarb = core.NewItemSet(core.ItemSet{ Name: "Emerald Dreamkeeper Garb", Bonuses: map[int32]core.ApplyEffect{ 3: func(agent core.Agent) { c := agent.GetCharacter() c.AddStat(stats.Stamina, 10) }, 6: func(agent core.Agent) { c := agent.GetCharacter() c.AddStat(stats.HealingPower, 22) }, }, })
var ItemSetEmeraldWatcherVestments = core.NewItemSet(core.ItemSet{ Name: "Emerald Watcher Vestments", Bonuses: map[int32]core.ApplyEffect{ 3: func(agent core.Agent) { c := agent.GetCharacter() c.AddStat(stats.Stamina, 10) }, 6: func(agent core.Agent) { c := agent.GetCharacter() c.AddStat(stats.SpellPower, 12) }, }, })
var ItemSetExiledProphetsRaiment = core.NewItemSet(core.ItemSet{ Name: "Exiled Prophet's Raiment", Bonuses: map[int32]core.ApplyEffect{ 2: func(agent core.Agent) { c := agent.GetCharacter() c.AddStat(stats.MP5, 4) }, 3: func(agent core.Agent) { druid := agent.(DruidAgent).GetDruid() if druid.HasRune(proto.DruidRune_RuneFeetDreamstate) { core.MakeProcTriggerAura(&druid.Unit, core.ProcTrigger{ Name: "Exiled Dreamer", Callback: core.CallbackOnHealDealt, ProcMask: core.ProcMaskSpellHealing, Outcome: core.OutcomeCrit, ProcChance: 0.5, Handler: func(sim *core.Simulation, _ *core.Spell, _ *core.SpellResult) { druid.DreamstateManaRegenAura.Activate(sim) }, }) } }, }, })
var ItemSetFeralheartRaiment = core.NewItemSet(core.ItemSet{ Name: "Feralheart Raiment", Bonuses: map[int32]core.ApplyEffect{ 2: func(agent core.Agent) { c := agent.GetCharacter() c.AddStats(stats.Stats{ stats.AttackPower: 40, stats.RangedAttackPower: 40, stats.SpellDamage: 23, stats.HealingPower: 44, }) }, 4: func(agent core.Agent) { c := agent.GetCharacter() actionID := core.ActionID{SpellID: 450608} manaMetrics := c.NewManaMetrics(actionID) energyMetrics := c.NewEnergyMetrics(actionID) rageMetrics := c.NewRageMetrics(actionID) core.MakeProcTriggerAura(&c.Unit, core.ProcTrigger{ Name: "S03 - Druid Energize Trigger - Wildheart Raiment (Mana)", Callback: core.CallbackOnCastComplete, ProcMask: core.ProcMaskSpellDamage | core.ProcMaskSpellHealing, ProcChance: 0.02, Handler: func(sim *core.Simulation, spell *core.Spell, _ *core.SpellResult) { c.AddMana(sim, 300, manaMetrics) }, }) core.MakeProcTriggerAura(&c.Unit, core.ProcTrigger{ Name: "S03 - Druid Energize Trigger - Wildheart Raiment (Energy)", Callback: core.CallbackOnSpellHitDealt, Outcome: core.OutcomeLanded, ProcMask: core.ProcMaskMeleeWhiteHit, ProcChance: 0.06, Handler: func(sim *core.Simulation, spell *core.Spell, _ *core.SpellResult) { if c.HasEnergyBar() { c.AddEnergy(sim, 40, energyMetrics) } }, }) core.MakeProcTriggerAura(&c.Unit, core.ProcTrigger{ Name: "S03 - Druid Energize Trigger - Wildheart Raiment (Rage)", Callback: core.CallbackOnSpellHitTaken, ProcMask: core.ProcMaskMelee, ProcChance: 0.03, Handler: func(sim *core.Simulation, spell *core.Spell, _ *core.SpellResult) { if c.HasRageBar() { c.AddRage(sim, 10, rageMetrics) } }, }) }, 6: func(agent core.Agent) { c := agent.GetCharacter() c.AddResistances(8) }, 8: func(agent core.Agent) { c := agent.GetCharacter() c.AddStat(stats.Armor, 200) }, }, })
var ItemSetFieldMarshalsRefuge = core.NewItemSet(core.ItemSet{ Name: "Field Marshal's Refuge", Bonuses: map[int32]core.ApplyEffect{ 2: func(agent core.Agent) { c := agent.GetCharacter() c.AddStat(stats.Stamina, 20) }, 3: func(agent core.Agent) { }, 6: func(agent core.Agent) { c := agent.GetCharacter() c.AddStat(stats.HealingPower, 88) c.AddStat(stats.SpellDamage, 15) }, }, })
var ItemSetFieldMarshalsSanctuary = core.NewItemSet(core.ItemSet{ Name: "Field Marshal's Sanctuary", Bonuses: map[int32]core.ApplyEffect{ 2: func(agent core.Agent) { c := agent.GetCharacter() c.AddStat(stats.Stamina, 20) }, 3: func(agent core.Agent) { }, 6: func(agent core.Agent) { c := agent.GetCharacter() c.AddStat(stats.AttackPower, 40) c.AddStat(stats.RangedAttackPower, 40) }, }, })
var ItemSetFieldMarshalsWildhide = core.NewItemSet(core.ItemSet{ Name: "Field Marshal's Wildhide", Bonuses: map[int32]core.ApplyEffect{ 2: func(agent core.Agent) { c := agent.GetCharacter() c.AddStat(stats.Stamina, 20) }, 3: func(agent core.Agent) { }, 6: func(agent core.Agent) { c := agent.GetCharacter() c.AddStat(stats.SpellPower, 23) }, }, })
var ItemSetFuryOfStormrage = core.NewItemSet(core.ItemSet{ Name: "Fury of Stormrage", Bonuses: map[int32]core.ApplyEffect{ 2: func(agent core.Agent) { }, 4: func(agent core.Agent) { }, 6: func(agent core.Agent) { }, }, })
var ItemSetHaruspexsGarb = core.NewItemSet(core.ItemSet{ Name: "Haruspex's Garb", Bonuses: map[int32]core.ApplyEffect{ 2: func(agent core.Agent) { c := agent.GetCharacter() c.AddStat(stats.SpellPower, 12) }, 3: func(agent core.Agent) { druid := agent.(DruidAgent).GetDruid() druid.RegisterAura(core.Aura{ Label: "S03 - Item - ZG - Druid - Balance 3P Bonus", OnInit: func(aura *core.Aura, sim *core.Simulation) { for _, spell := range druid.Starfire { if spell != nil { spell.DefaultCast.CastTime -= time.Millisecond * 500 spell.DefaultCast.GCD -= time.Millisecond * 500 } } }, }) }, 5: func(agent core.Agent) { druid := agent.(DruidAgent).GetDruid() druid.RegisterAura(core.Aura{ Label: "S03 - Item - ZG - Druid - Balance 5P Bonus", OnInit: func(aura *core.Aura, sim *core.Simulation) { for _, spell := range druid.Wrath { if spell != nil { spell.BonusCritRating += 10 * core.SpellCritRatingPerCritChance } } }, }) }, }, })
var ItemSetKnightLieutenantsCracklingLeather = core.NewItemSet(core.ItemSet{ Name: "Knight-Lieutenant's Crackling Leather", Bonuses: map[int32]core.ApplyEffect{ 3: func(agent core.Agent) { c := agent.GetCharacter() c.AddStat(stats.Stamina, 15) }, 6: func(agent core.Agent) { c := agent.GetCharacter() c.AddStat(stats.SpellPower, 18) }, }, })
var ItemSetKnightLieutenantsRestoredLeather = core.NewItemSet(core.ItemSet{ Name: "Knight-Lieutenant's Restored Leather", Bonuses: map[int32]core.ApplyEffect{ 3: func(agent core.Agent) { c := agent.GetCharacter() c.AddStat(stats.Stamina, 15) }, 6: func(agent core.Agent) { c := agent.GetCharacter() c.AddStat(stats.HealingPower, 33) }, }, })
var ItemSetLieutenantCommandersRefuge = core.NewItemSet(core.ItemSet{ Name: "Lieutenant Commander's Refuge", Bonuses: map[int32]core.ApplyEffect{ 2: func(agent core.Agent) { c := agent.GetCharacter() c.AddStat(stats.HealingPower, 44) }, 4: func(agent core.Agent) { }, 6: func(agent core.Agent) { c := agent.GetCharacter() c.AddStat(stats.Stamina, 20) }, }, })
var ItemSetLieutenantCommandersSanctuary = core.NewItemSet(core.ItemSet{ Name: "Lieutenant Commander's Sanctuary", Bonuses: map[int32]core.ApplyEffect{ 2: func(agent core.Agent) { c := agent.GetCharacter() c.AddStat(stats.AttackPower, 40) }, 4: func(agent core.Agent) { }, 6: func(agent core.Agent) { c := agent.GetCharacter() c.AddStat(stats.Stamina, 20) }, }, })
var ItemSetLieutenantCommandersWildhide = core.NewItemSet(core.ItemSet{ Name: "Lieutenant Commander's Wildhide", Bonuses: map[int32]core.ApplyEffect{ 2: func(agent core.Agent) { c := agent.GetCharacter() c.AddStat(stats.SpellPower, 23) }, 4: func(agent core.Agent) { }, 6: func(agent core.Agent) { c := agent.GetCharacter() c.AddStat(stats.Stamina, 20) }, }, })
var ItemSetLostWorshippersArmor = core.NewItemSet(core.ItemSet{ Name: "Lost Worshipper's Armor", Bonuses: map[int32]core.ApplyEffect{ 2: func(agent core.Agent) { c := agent.GetCharacter() c.AddStat(stats.MeleeHit, 1) c.AddStat(stats.SpellHit, 1) }, 3: func(agent core.Agent) { c := agent.GetCharacter() c.OnSpellRegistered(func(spell *core.Spell) { if spell.SpellCode == SpellCode_DruidWrath || spell.SpellCode == SpellCode_DruidStarfire { spell.BonusCritRating += 3 * core.CritRatingPerCritChance } }) }, }, })
var ItemSetWarlordsRefuge = core.NewItemSet(core.ItemSet{ Name: "Warlord's Refuge", Bonuses: map[int32]core.ApplyEffect{ 2: func(agent core.Agent) { c := agent.GetCharacter() c.AddStat(stats.Stamina, 20) }, 3: func(agent core.Agent) { }, 6: func(agent core.Agent) { c := agent.GetCharacter() c.AddStat(stats.HealingPower, 88) c.AddStat(stats.SpellDamage, 15) }, }, })
var ItemSetWarlordsSanctuary = core.NewItemSet(core.ItemSet{ Name: "Warlord's Sanctuary", Bonuses: map[int32]core.ApplyEffect{ 2: func(agent core.Agent) { c := agent.GetCharacter() c.AddStat(stats.Stamina, 20) }, 3: func(agent core.Agent) { }, 6: func(agent core.Agent) { c := agent.GetCharacter() c.AddStat(stats.AttackPower, 40) c.AddStat(stats.RangedAttackPower, 40) }, }, })
var ItemSetWarlordsWildhide = core.NewItemSet(core.ItemSet{ Name: "Warlord's Wildhide", Bonuses: map[int32]core.ApplyEffect{ 2: func(agent core.Agent) { c := agent.GetCharacter() c.AddStat(stats.Stamina, 20) }, 3: func(agent core.Agent) { }, 6: func(agent core.Agent) { c := agent.GetCharacter() c.AddStat(stats.SpellPower, 23) }, }, })
var MoonfireBaseDamage = [MoonfireRanks + 1][]float64{{0}, {9, 12}, {17, 21}, {30, 37}, {44, 53}, {70, 82}, {91, 108}, {117, 137}, {143, 168}, {172, 200}, {195, 228}}
var MoonfireBaseDotDamage = [MoonfireRanks + 1]float64{0, 12, 32, 52, 80, 124, 164, 212, 264, 320, 384}
var MoonfireDotTicks = [MoonfireRanks + 1]int32{0, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4}
var MoonfireLevel = [MoonfireRanks + 1]int{0, 4, 10, 16, 22, 28, 34, 40, 46, 52, 58}
var MoonfireManaCost = [MoonfireRanks + 1]float64{0, 25, 50, 75, 105, 150, 190, 235, 280, 325, 375}
var MoonfireSpellId = [MoonfireRanks + 1]int32{0, 8921, 8924, 8925, 8926, 8927, 8928, 8929, 9833, 9834, 9835}
var MoonfiresSellDotCoeff = [MoonfireRanks + 1]float64{0, .052, .081, .111, .13, .13, .13, .13, .13, .13, .13}
var MoonfiresSpellCoeff = [MoonfireRanks + 1]float64{0, .06, .094, .128, .15, .15, .15, .15, .15, .15, .15}
var StarfireBaseDamage = [StarfireRanks + 1][]float64{{0}, {95, 115}, {146, 177}, {212, 253}, {293, 348}, {378, 445}, {451, 531}, {496, 584}}
var StarfireLevel = [StarfireRanks + 1]int{0, 20, 26, 34, 42, 50, 58, 60}
var StarfireManaCost = [StarfireRanks + 1]float64{0, 95, 135, 180, 230, 275, 315, 340}
var StarfireSpellId = [StarfireRanks + 1]int32{0, 2912, 8949, 8950, 8951, 9875, 9876, 25298}
var SwipeBaseDamage = [SwipeRanks + 1]float64{0, 18, 25, 36, 60, 83}
var SwipeLevel = [SwipeRanks + 1]int{0, 16, 24, 34, 44, 54}
var SwipeSpellId = [SwipeRanks + 1]int32{0, 779, 780, 769, 9754, 9908}
var TalentTreeSizes = [3]int{16, 16, 15}
var WrathBaseDamage = [WrathRanks + 1][]float64{{0}, {13, 16}, {28, 33}, {48, 57}, {69, 79}, {108, 123}, {148, 167}, {198, 221}, {248, 277}}
var WrathCastTime = [WrathRanks + 1]int{0, 1500, 1700, 2000, 2000, 2000, 2000, 2000, 2000}
var WrathLevel = [WrathRanks + 1]int{0, 1, 6, 14, 22, 30, 38, 46, 54}
var WrathManaCost = [WrathRanks + 1]float64{0, 20, 35, 55, 70, 100, 125, 155, 180}
var WrathSpellCoeff = [WrathRanks + 1]float64{0, 0.123, 0.231, 0.443, 0.571, 0.571, 0.571, 0.571, 0.571}
var WrathSpellId = [WrathRanks + 1]int32{0, 5176, 5177, 5178, 5179, 5180, 6780, 8905, 9912}
Functions ¶
This section is empty.
Types ¶
type Druid ¶
type Druid struct { core.Character SelfBuffs Talents *proto.DruidTalents DruidSpells []*DruidSpell StartingForm DruidForm RebirthTiming float64 BleedsActive int AssumeBleedActive bool ReplaceBearMHFunc core.ReplaceMHSwing Barkskin *DruidSpell DemoralizingRoar *DruidSpell Enrage *DruidSpell FaerieFire *DruidSpell FerociousBite *DruidSpell ForceOfNature *DruidSpell FrenziedRegeneration *DruidSpell GiftOfTheWild *DruidSpell Hurricane []*DruidSpell Innervate *DruidSpell InsectSwarm []*DruidSpell Lacerate *DruidSpell Languish *DruidSpell MangleBear *DruidSpell MangleCat *DruidSpell Berserk *DruidSpell Maul *DruidSpell MaulQueueSpell *DruidSpell Moonfire []*DruidSpell Rebirth *DruidSpell Rake *DruidSpell Rip *DruidSpell SavageRoar *DruidSpell Shred *DruidSpell Starfire []*DruidSpell Starfall *DruidSpell StarfallTick *DruidSpell StarfallSplash *DruidSpell Starsurge *DruidSpell Sunfire *DruidSpell SunfireCat *DruidSpell SurvivalInstincts *DruidSpell SwipeBear *DruidSpell SwipeCat *DruidSpell TigersFury *DruidSpell Typhoon *DruidSpell Wrath []*DruidSpell BearForm *DruidSpell CatForm *DruidSpell MoonkinForm *DruidSpell BarkskinAura *core.Aura BearFormAura *core.Aura BerserkAura *core.Aura CatFormAura *core.Aura ClearcastingAura *core.Aura DemoralizingRoarAuras core.AuraArray DreamstateManaRegenAura *core.Aura EnrageAura *core.Aura EclipseAura *core.Aura FaerieFireAuras core.AuraArray ImprovedFaerieFireAuras core.AuraArray FrenziedRegenerationAura *core.Aura FurorAura *core.Aura FuryOfStormrageAura *core.Aura InsectSwarmAuras core.AuraArray MaulQueueAura *core.Aura MoonkinFormAura *core.Aura NaturesGraceProcAura *core.Aura PredatoryInstinctsAura *core.Aura SurvivalInstinctsAura *core.Aura TigersFuryAura *core.Aura SavageRoarAura *core.Aura SolarEclipseProcAura *core.Aura LunarEclipseProcAura *core.Aura WildStrikesBuffAura *core.Aura BleedCategories core.ExclusiveCategoryArray SavageRoarDurationTable [6]time.Duration FerociousBiteExcessEnergyOverride bool // When true, disables the excess energy consumption of Ferocious bite // Sunfire/Moonfire modifiers applied when in Moonkin form MoonfireDotMultiplier float64 SunfireDotMultiplier float64 // contains filtered or unexported fields }
func (*Druid) AddRaidBuffs ¶
func (*Druid) ApplyRunes ¶
func (druid *Druid) ApplyRunes()
func (*Druid) ApplyTalents ¶
func (druid *Druid) ApplyTalents()
func (*Druid) BearArmorMultiplier ¶
func (*Druid) CurrentFerociousBiteCost ¶
func (*Druid) CurrentMangleCatCost ¶
func (*Druid) CurrentRakeCost ¶
func (*Druid) CurrentRipCost ¶
func (*Druid) CurrentSavageRoarCost ¶
func (*Druid) CurrentShredCost ¶
func (*Druid) CurrentSwipeCatCost ¶ added in v0.0.14
func (*Druid) GetCatWeapon ¶
TODO: don't hardcode numbers
func (*Druid) GetCharacter ¶
func (*Druid) GetDynamicPredStrikeStats ¶
func (*Druid) GetFormShiftStats ¶
TODO: Class bonus stats for both cat and bear.
func (*Druid) ImprovedMoonfireCritBonus ¶
func (*Druid) ImprovedMoonfireDamageMultiplier ¶
func (*Druid) Initialize ¶
func (druid *Druid) Initialize()
func (*Druid) MoonfuryDamageMultiplier ¶
func (*Druid) MoonglowManaCostMultiplier ¶ added in v0.0.14
func (*Druid) NewT2Treants ¶ added in v0.0.24
func (*Druid) RegisterBalanceSpells ¶
func (druid *Druid) RegisterBalanceSpells()
func (*Druid) RegisterFeralCatSpells ¶
func (druid *Druid) RegisterFeralCatSpells()
TODO: Classic feral
func (*Druid) RegisterFeralTankSpells ¶
func (druid *Druid) RegisterFeralTankSpells()
TODO: Classic feral tank
func (*Druid) RegisterSpell ¶
func (druid *Druid) RegisterSpell(formMask DruidForm, config core.SpellConfig) *DruidSpell
func (*Druid) Reset ¶
func (druid *Druid) Reset(_ *core.Simulation)
func (*Druid) ShouldFaerieFire ¶
func (*Druid) ThickHideMultiplier ¶
type DruidAgent ¶
type DruidAgent interface {
GetDruid() *Druid
}
Agent is a generic way to access underlying druid on any of the agents (for example balance druid.)
type DruidSpell ¶
func (*DruidSpell) CanCast ¶
func (ds *DruidSpell) CanCast(sim *core.Simulation, target *core.Unit) bool
func (*DruidSpell) IsReady ¶
func (ds *DruidSpell) IsReady(sim *core.Simulation) bool
type FerociousBiteRankInfo ¶
type FerociousBiteRankInfo struct {
// contains filtered or unexported fields
}
type RakeRankInfo ¶
type RakeRankInfo struct {
// contains filtered or unexported fields
}
type RipRankInfo ¶
type RipRankInfo struct {
// contains filtered or unexported fields
}
type SelfBuffs ¶
type SelfBuffs struct {
InnervateTarget *proto.UnitReference
}
type T2Treants ¶ added in v0.0.24
func (*T2Treants) ExecuteCustomRotation ¶ added in v0.0.24
func (treants *T2Treants) ExecuteCustomRotation(sim *core.Simulation)
func (*T2Treants) Initialize ¶ added in v0.0.24
func (treants *T2Treants) Initialize()
func (*T2Treants) OnPetDisable ¶ added in v0.0.24
func (treants *T2Treants) OnPetDisable(sim *core.Simulation)
func (*T2Treants) Reset ¶ added in v0.0.24
func (treants *T2Treants) Reset(sim *core.Simulation)
Source Files ¶
- barkskin.go
- berserk.go
- druid.go
- faerie_fire.go
- ferocious_bite.go
- forms.go
- hurricane.go
- innervate.go
- insect_swarm.go
- item_sets_pve.go
- item_sets_pvp.go
- items.go
- mangle.go
- moonfire.go
- rake.go
- rip.go
- runes.go
- savage_roar.go
- shred.go
- starfall.go
- starfire.go
- starsurge.go
- sunfire.go
- swipe.go
- t2_treants.go
- talents.go
- tigers_fury.go
- wrath.go