druid

package
v0.0.39 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 4, 2025 License: MIT Imports: 10 Imported by: 0

Documentation

Index

Constants

View Source
const (
	SpellFlagOmen    = core.SpellFlagAgentReserved1
	SpellFlagBuilder = core.SpellFlagAgentReserved2
)
View Source
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
)
View Source
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
	IdolOfUrsinPower                 = 234468
	IdolOfFelineFerocity             = 234469
	IdolOfSiderealWrath              = 234474
)

Totem Item IDs

View Source
const (
	Gore_BearResetProcChance = .15
	Gore_CatResetProcChance  = .15
)
View Source
const (
	ElunesFires_BonusMoonfireTime = time.Second * 6
	ElunesFires_BonusSunfireTime  = time.Second * 3
	ElunesFires_BonusRipTime      = time.Second * 2
)
View Source
const InsectSwarmRanks = 5
View Source
const MoonfireRanks = 10
View Source
const RakeAPCoef = 0.05

Rake given 5% AP scaling in SoD

View Source
const RakeBaseDmgModifier = 1.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%:

View Source
const RipBaseDamageMultiplier = 1.5
View Source
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

View Source
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

View Source
const ShredFlatDmgMultiplier = .75 // decreases flat damage modifier multiplicatively by -25% to counteract 3.0/2.25 overall scaling buff
View Source
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:

View Source
const StarfireRanks = 7
View Source
const SunfireTicks = int32(4)
View Source
const SwipeRanks = 5
View Source
const SwipeThreatMultiplier = 2.0

See https://www.wowhead.com/classic/spell=436895/s03-tuning-and-overrides-passive-druid Modifies Threat +101%:

View Source
const WrathRanks = 8

Variables

View Source
var InsectSwarmBaseDamage = [InsectSwarmRanks + 1]float64{0, 66, 138, 174, 264, 324}
View Source
var InsectSwarmLevel = [InsectSwarmRanks + 1]int{0, 20, 30, 40, 50, 60}
View Source
var InsectSwarmManaCost = [InsectSwarmRanks + 1]float64{0, 45, 85, 100, 140, 160}
View Source
var InsectSwarmSpellId = [InsectSwarmRanks + 1]int32{0, 5570, 24974, 24975, 24976, 24977}
View Source
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)
		},
	},
})
View Source
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)
		},
	},
})
View Source
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) {
		},
	},
})
View Source
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) {

		},
	},
})
View Source
var ItemSetCenarionCunning = core.NewItemSet(core.ItemSet{
	Name: "Cenarion Cunning",
	Bonuses: map[int32]core.ApplyEffect{
		2: func(agent core.Agent) {
			druid := agent.(DruidAgent).GetDruid()
			druid.applyT1Feral2PBonus()
		},
		4: func(agent core.Agent) {
			druid := agent.(DruidAgent).GetDruid()
			druid.applyT1Feral4PBonus()
		},
		6: func(agent core.Agent) {
			druid := agent.(DruidAgent).GetDruid()
			druid.applyT1Feral6PBonus()
		},
	},
})
View Source
var ItemSetCenarionEclipse = core.NewItemSet(core.ItemSet{
	Name: "Cenarion Eclipse",
	Bonuses: map[int32]core.ApplyEffect{

		2: func(agent core.Agent) {

		},
		4: func(agent core.Agent) {
			druid := agent.(DruidAgent).GetDruid()
			druid.applyT1Balance4PBonus()
		},
		6: func(agent core.Agent) {
			druid := agent.(DruidAgent).GetDruid()
			druid.applyT1Balance6PBonus()
		},
	},
})
View Source
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) {
			druid := agent.(DruidAgent).GetDruid()
			druid.applyT1Guardian6PBonus()
		},
	},
})
View Source
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)
		},
	},
})
View Source
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)
		},
	},
})
View Source
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)
		},
	},
})
View Source
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)
					}
				},
			})

		},
	},
})
View Source
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.applyT2Feral2PBonus()
		},
		4: func(agent core.Agent) {
			druid := agent.(DruidAgent).GetDruid()
			druid.applyT2Feral4PBonus()
		},
		6: func(agent core.Agent) {
			druid := agent.(DruidAgent).GetDruid()
			druid.applyT2Feral6PBonus()
		},
	},
})
View Source
var ItemSetDreamwalkerEclipse = core.NewItemSet(core.ItemSet{
	Name: "Dreamwalker Eclipse",
	Bonuses: map[int32]core.ApplyEffect{
		2: func(agent core.Agent) {
			druid := agent.(DruidAgent).GetDruid()
			druid.applyNaxxramasBalance2PBonus()
		},
		4: func(agent core.Agent) {
			druid := agent.(DruidAgent).GetDruid()
			druid.applyNaxxramasBalance4PBonus()
		},
		6: func(agent core.Agent) {
			druid := agent.(DruidAgent).GetDruid()
			druid.applyNaxxramasBalance6PBonus()
		},
	},
})
View Source
var ItemSetDreamwalkerFerocity = core.NewItemSet(core.ItemSet{
	Name: "Dreamwalker Ferocity",
	Bonuses: map[int32]core.ApplyEffect{
		2: func(agent core.Agent) {
			druid := agent.(DruidAgent).GetDruid()
			druid.applyNaxxramasFeral2PBonus()
		},
		4: func(agent core.Agent) {
			druid := agent.(DruidAgent).GetDruid()
			druid.applyNaxxramasFeral4PBonus()
		},
		6: func(agent core.Agent) {
			druid := agent.(DruidAgent).GetDruid()
			druid.applyNaxxramasFeral6PBonus()
		},
	},
})
View Source
var ItemSetDreamwalkerGuardian = core.NewItemSet(core.ItemSet{
	Name: "Dreamwalker Guardian",
	Bonuses: map[int32]core.ApplyEffect{
		2: func(agent core.Agent) {
			druid := agent.(DruidAgent).GetDruid()
			druid.applyNaxxramasGuardian2PBonus()
		},
		4: func(agent core.Agent) {
			druid := agent.(DruidAgent).GetDruid()
			druid.applyNaxxramasGuardian4PBonus()
		},
		6: func(agent core.Agent) {
			druid := agent.(DruidAgent).GetDruid()
			druid.applyNaxxramasGuardian6PBonus()
		},
	},
})
View Source
var ItemSetDreamwalkerRaiment = core.NewItemSet(core.ItemSet{
	Name: "Dreamwalker Raiment",
	Bonuses: map[int32]core.ApplyEffect{

		2: func(agent core.Agent) {
		},

		4: func(agent core.Agent) {
		},

		6: func(agent core.Agent) {
		},
	},
})
View Source
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.applyT2Balance2PBonus()
		},
		4: func(agent core.Agent) {
			druid := agent.(DruidAgent).GetDruid()
			druid.applyT2Balance4PBonus()
		},
		6: func(agent core.Agent) {
			druid := agent.(DruidAgent).GetDruid()
			druid.applyT2Balance6PBonus()
		},
	},
})
View Source
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)
		},
	},
})
View Source
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)
		},
	},
})
View Source
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)
					},
				})
			}
		},
	},
})
View Source
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)
		},
	},
})
View Source
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)
		},
	},
})
View Source
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)
		},
	},
})
View Source
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)
		},
	},
})
View Source
var ItemSetFuryOfStormrage = core.NewItemSet(core.ItemSet{
	Name: "Fury of Stormrage",
	Bonuses: map[int32]core.ApplyEffect{
		2: func(agent core.Agent) {
			druid := agent.(DruidAgent).GetDruid()
			druid.applyT2Guardian2PBonus()
		},
		4: func(agent core.Agent) {
			druid := agent.(DruidAgent).GetDruid()
			druid.applyT2Guardian4PBonus()
		},
		6: func(agent core.Agent) {
			druid := agent.(DruidAgent).GetDruid()
			druid.applyT2Guardian6PBonus()
		},
	},
})
View Source
var ItemSetGenesisBounty = core.NewItemSet(core.ItemSet{
	Name: "Genesis Bounty",
	Bonuses: map[int32]core.ApplyEffect{

		2: func(agent core.Agent) {
		},

		4: func(agent core.Agent) {
		},
	},
})
View Source
var ItemSetGenesisCunning = core.NewItemSet(core.ItemSet{
	Name: "Genesis Cunning",
	Bonuses: map[int32]core.ApplyEffect{
		2: func(agent core.Agent) {
			druid := agent.(DruidAgent).GetDruid()
			druid.applyTAQFeral2PBonus()
		},
		4: func(agent core.Agent) {
			druid := agent.(DruidAgent).GetDruid()
			druid.applyTAQFeral4PBonus()
		},
	},
})
View Source
var ItemSetGenesisEclipse = core.NewItemSet(core.ItemSet{
	Name: "Genesis Eclipse",
	Bonuses: map[int32]core.ApplyEffect{
		2: func(agent core.Agent) {
			druid := agent.(DruidAgent).GetDruid()
			druid.applyTAQBalance2PBonus()
		},
		4: func(agent core.Agent) {
			druid := agent.(DruidAgent).GetDruid()
			druid.applyTAQBalance4PBonus()
		},
	},
})
View Source
var ItemSetGenesisFury = core.NewItemSet(core.ItemSet{
	Name: "Genesis Fury",
	Bonuses: map[int32]core.ApplyEffect{
		2: func(agent core.Agent) {
			druid := agent.(DruidAgent).GetDruid()
			druid.applyTAQGuardian2PBonus()
		},
		4: func(agent core.Agent) {
			druid := agent.(DruidAgent).GetDruid()
			druid.applyTAQGuardian4PBonus()
		},
	},
})
View Source
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.applyZGBalance3PBonus()
		},
		5: func(agent core.Agent) {
			druid := agent.(DruidAgent).GetDruid()
			druid.applyZGBalance5PBonus()
		},
	},
})
View Source
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)
		},
	},
})
View Source
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)
		},
	},
})
View Source
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)
		},
	},
})
View Source
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)
		},
	},
})
View Source
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)
		},
	},
})
View Source
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
				}
			})
		},
	},
})
View Source
var ItemSetSymbolsOfUnendingLife = core.NewItemSet(core.ItemSet{
	Name: "Symbols of Unending Life",
	Bonuses: map[int32]core.ApplyEffect{
		3: func(agent core.Agent) {
			druid := agent.(DruidAgent).GetDruid()
			druid.applyRAQFeral3PBonus()
		},
	},
})
View Source
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)
		},
	},
})
View Source
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)
		},
	},
})
View Source
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)
		},
	},
})
View Source
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}}
View Source
var MoonfireBaseDotDamage = [MoonfireRanks + 1]float64{0, 12, 32, 52, 80, 124, 164, 212, 264, 320, 384}
View Source
var MoonfireDotTicks = [MoonfireRanks + 1]int32{0, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4}
View Source
var MoonfireLevel = [MoonfireRanks + 1]int{0, 4, 10, 16, 22, 28, 34, 40, 46, 52, 58}
View Source
var MoonfireManaCost = [MoonfireRanks + 1]float64{0, 25, 50, 75, 105, 150, 190, 235, 280, 325, 375}
View Source
var MoonfireSpellId = [MoonfireRanks + 1]int32{0, 8921, 8924, 8925, 8926, 8927, 8928, 8929, 9833, 9834, 9835}
View Source
var MoonfiresSellDotCoeff = [MoonfireRanks + 1]float64{0, .052, .081, .111, .13, .13, .13, .13, .13, .13, .13}
View Source
var MoonfiresSpellCoeff = [MoonfireRanks + 1]float64{0, .06, .094, .128, .15, .15, .15, .15, .15, .15, .15}
View Source
var StarfireBaseDamage = [StarfireRanks + 1][]float64{{0}, {95, 115}, {146, 177}, {212, 253}, {293, 348}, {378, 445}, {451, 531}, {496, 584}}
View Source
var StarfireLevel = [StarfireRanks + 1]int{0, 20, 26, 34, 42, 50, 58, 60}
View Source
var StarfireManaCost = [StarfireRanks + 1]float64{0, 95, 135, 180, 230, 275, 315, 340}
View Source
var StarfireSpellId = [StarfireRanks + 1]int32{0, 2912, 8949, 8950, 8951, 9875, 9876, 25298}
View Source
var SwipeBaseDamage = [SwipeRanks + 1]float64{0, 18, 25, 36, 60, 83}
View Source
var SwipeLevel = [SwipeRanks + 1]int{0, 16, 24, 34, 44, 54}
View Source
var SwipeSpellId = [SwipeRanks + 1]int32{0, 779, 780, 769, 9754, 9908}
View Source
var TalentTreeSizes = [3]int{16, 16, 15}
View Source
var WrathBaseDamage = [WrathRanks + 1][]float64{{0}, {13, 16}, {28, 33}, {48, 57}, {69, 79}, {108, 123}, {148, 167}, {198, 221}, {248, 277}}
View Source
var WrathCastTime = [WrathRanks + 1]int{0, 1500, 1700, 2000, 2000, 2000, 2000, 2000, 2000}
View Source
var WrathLevel = [WrathRanks + 1]int{0, 1, 6, 14, 22, 30, 38, 46, 54}
View Source
var WrathManaCost = [WrathRanks + 1]float64{0, 20, 35, 55, 70, 100, 125, 155, 180}
View Source
var WrathSpellCoeff = [WrathRanks + 1]float64{0, 0.123, 0.231, 0.443, 0.571, 0.571, 0.571, 0.571, 0.571}
View Source
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

	// Extra data used for various calculations and overrides
	AllowRakeRipDoTCrits              bool // From T1 Feral 4p bonus
	FerociousBiteExcessEnergyOverride bool // When true, disables the excess energy consumption of Ferocious bite
	// Sunfire/Moonfire modifiers applied when in Moonkin form
	MoonfireDotMultiplier float64
	ShredPositionOverride bool
	SunfireDotMultiplier  float64
	// contains filtered or unexported fields
}

func New

func New(character *core.Character, form DruidForm, selfBuffs SelfBuffs, talents string) *Druid

func (*Druid) AddRaidBuffs

func (druid *Druid) AddRaidBuffs(raidBuffs *proto.RaidBuffs)

func (*Druid) ApplyRunes

func (druid *Druid) ApplyRunes()

func (*Druid) ApplyTalents

func (druid *Druid) ApplyTalents()

func (*Druid) BearArmorMultiplier

func (druid *Druid) BearArmorMultiplier() float64

func (*Druid) CanShred

func (druid *Druid) CanShred() bool

func (*Druid) CurrentFerociousBiteCost

func (druid *Druid) CurrentFerociousBiteCost() float64

func (*Druid) CurrentMangleCatCost

func (druid *Druid) CurrentMangleCatCost() float64

func (*Druid) CurrentRakeCost

func (druid *Druid) CurrentRakeCost() float64

func (*Druid) CurrentRipCost

func (druid *Druid) CurrentRipCost() float64

func (*Druid) CurrentSavageRoarCost

func (druid *Druid) CurrentSavageRoarCost() float64

func (*Druid) CurrentShredCost

func (druid *Druid) CurrentShredCost() float64

func (*Druid) CurrentSwipeCatCost added in v0.0.14

func (druid *Druid) CurrentSwipeCatCost() float64

func (*Druid) GetCatWeapon

func (druid *Druid) GetCatWeapon(level int32) core.Weapon

TODO: don't hardcode numbers

func (*Druid) GetCharacter

func (druid *Druid) GetCharacter() *core.Character

func (*Druid) GetDynamicPredStrikeStats

func (druid *Druid) GetDynamicPredStrikeStats() stats.Stats

func (*Druid) GetForm

func (druid *Druid) GetForm() DruidForm

func (*Druid) GetFormShiftStats

func (druid *Druid) GetFormShiftStats() stats.Stats

TODO: Class bonus stats for both cat and bear.

func (*Druid) HasRune

func (druid *Druid) HasRune(rune proto.DruidRune) bool

func (*Druid) InForm

func (druid *Druid) InForm(form DruidForm) bool

func (*Druid) Initialize

func (druid *Druid) Initialize()

func (*Druid) IsMangle

func (druid *Druid) IsMangle(spell *core.Spell) bool

func (*Druid) NewT2Treants added in v0.0.24

func (druid *Druid) NewT2Treants() *T2Treants

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 *Druid) ShouldFaerieFire(sim *core.Simulation, target *core.Unit) bool

func (*Druid) ThickHideMultiplier

func (druid *Druid) ThickHideMultiplier() float64

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 DruidForm

type DruidForm uint8
const (
	Humanoid DruidForm = 1 << iota
	Bear
	Cat
	Moonkin
	Tree
	Any = Humanoid | Bear | Cat | Moonkin | Tree
)

func (DruidForm) Matches

func (form DruidForm) Matches(other DruidForm) bool

type DruidSpell

type DruidSpell struct {
	*core.Spell
	FormMask DruidForm
}

func (*DruidSpell) CanCast

func (ds *DruidSpell) CanCast(sim *core.Simulation, target *core.Unit) bool

func (*DruidSpell) IsEqual

func (ds *DruidSpell) IsEqual(s *core.Spell) 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

type T2Treants struct {
	core.Pet

	Druid           *Druid
	Shadowcrawl     *core.Spell
	ShadowcrawlAura *core.Aura
}

func (*T2Treants) ExecuteCustomRotation added in v0.0.24

func (treants *T2Treants) ExecuteCustomRotation(sim *core.Simulation)

func (*T2Treants) GetPet added in v0.0.24

func (treants *T2Treants) GetPet() *core.Pet

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)

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL