warlock

package
v0.0.19 Latest Latest
Warning

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

Go to latest
Published: Jul 28, 2024 License: MIT Imports: 9 Imported by: 0

Documentation

Index

Constants

View Source
const (
	InfernalPactEssence = 216509
	ZIlaGular           = 223214
)
View Source
const (
	WarlockFlagAffliction  = core.SpellFlagAgentReserved1
	WarlockFlagDemonology  = core.SpellFlagAgentReserved2
	WarlockFlagDestruction = core.SpellFlagAgentReserved3
	WarlockFlagHaunt       = core.SpellFlagAgentReserved4
)
View Source
const (
	SpellCode_WarlockNone int32 = iota

	SpellCode_WarlockCorruption
	SpellCode_WarlockCurseOfAgony
	SpellCode_WarlockCurseOfDoom
	SpellCode_WarlockDrainLife
	SpellCode_WarlockDrainSoul
	SpellCode_WarlockHaunt
	SpellCode_WarlockImmolate
	SpellCode_WarlockIncinerate
	SpellCode_WarlockSearingPain
	SpellCode_WarlockShadowflame
	SpellCode_WarlockShadowCleave
	SpellCode_WarlockShadowBolt
	SpellCode_WarlockSoulFire
)
View Source
const ConflagrateRanks = 4
View Source
const CorruptionRanks = 7
View Source
const CurseOfAgonyRanks = 6
View Source
const DeathCoilRanks = 3
View Source
const DrainLifeRanks = 6
View Source
const DrainSoulRanks = 4
View Source
const ImmolateCastTime = time.Millisecond * 2000
View Source
const ImmolateRanks = 8
View Source
const IncinerateCastTime = time.Millisecond * 2250
View Source
const LifeTapRanks = 6
View Source
const RainOfFireRanks = 4
View Source
const SearingPainRanks = 6
View Source
const ShadowBoltRanks = 10
View Source
const ShadowburnRanks = 6
View Source
const ShadowflameCastTime = time.Second * 2
View Source
const SiphonLifeRanks = 4
View Source
const SoulFireCastTime = time.Millisecond * 6000
View Source
const SoulFireRanks = 2
View Source
const SoulSiphonDoTMultiplier = 0.06

https://www.wowhead.com/classic/spell=403511/soul-siphon Causes your Drain Soul to to deal damage 3 times faster and increases the amount drained by your Drain Life and Drain Soul spells by an additional 6% for each of your Warlock Shadow effects afflicting the target, up to a maximum of 18% additional effect. When Drain Soul is cast on a target below 20% health, it instead gains 50% per effect, up to a maximum of 150%.

View Source
const SoulSiphonDoTMultiplierExecute = 1.00
View Source
const SoulSiphonDoTMultiplierMax = 0.18
View Source
const SoulSiphonDoTMultiplierMaxExecute = 3.00

Variables

View Source
var ItemSetChampionsThreads = core.NewItemSet(core.ItemSet{
	Name: "Champion's Threads",
	Bonuses: map[int32]core.ApplyEffect{

		2: func(agent core.Agent) {
			c := agent.GetCharacter()
			c.AddStat(stats.SpellPower, 23)
		},

		4: func(agent core.Agent) {
			warlock := agent.(WarlockAgent).GetWarlock()
			warlock.GetOrRegisterAura(core.Aura{
				Label:    "Champion's Threads Immolate Cast Time Reduction",
				ActionID: core.ActionID{SpellID: 23047},
				Duration: core.NeverExpires,
				OnReset: func(aura *core.Aura, sim *core.Simulation) {
					aura.Activate(sim)
				},
				OnGain: func(aura *core.Aura, sim *core.Simulation) {
					for _, spell := range warlock.Immolate {
						spell.DefaultCast.CastTime -= time.Millisecond * 200
					}
				},
				OnExpire: func(aura *core.Aura, sim *core.Simulation) {
					for _, spell := range warlock.Immolate {
						spell.DefaultCast.CastTime += time.Millisecond * 200
					}
				},
			})
		},

		6: func(agent core.Agent) {
			c := agent.GetCharacter()
			c.AddStat(stats.Stamina, 20)
		},
	},
})
View Source
var ItemSetCorruptedFelheart = core.NewItemSet(core.ItemSet{
	Name: "Corrupted Felheart",
	Bonuses: map[int32]core.ApplyEffect{

		2: func(agent core.Agent) {
			warlock := agent.(WarlockAgent).GetWarlock()
			warlock.RegisterAura(core.Aura{
				Label:    "S03 - Item - T1 - Warlock - Damage 2P Bonus",
				Duration: core.NeverExpires,
				OnReset: func(aura *core.Aura, sim *core.Simulation) {
					aura.Activate(sim)
				},
				OnGain: func(aura *core.Aura, sim *core.Simulation) {
					for _, spell := range warlock.LifeTap {
						spell.DamageMultiplier *= 1.5
						spell.ThreatMultiplier *= -1
					}
				},
				OnExpire: func(aura *core.Aura, sim *core.Simulation) {
					for _, spell := range warlock.LifeTap {
						spell.DamageMultiplier /= 1.5
						spell.ThreatMultiplier *= -1
					}
				},
			})
		},

		4: func(agent core.Agent) {
			c := agent.GetCharacter()
			c.AddStats(stats.Stats{
				stats.MeleeCrit: 2 * core.CritRatingPerCritChance,
				stats.SpellCrit: 2 * core.CritRatingPerCritChance,
			})
		},

		6: func(agent core.Agent) {
			warlock := agent.(WarlockAgent).GetWarlock()

			immolateCastTime := ImmolateCastTime
			shadowflameCastTime := ShadowflameCastTime
			incinerateCastTime := IncinerateCastTime
			affectedSpellCodes := []int32{SpellCode_WarlockImmolate, SpellCode_WarlockShadowflame, SpellCode_WarlockIncinerate}
			fireTranceAura := warlock.RegisterAura(core.Aura{
				ActionID: core.ActionID{SpellID: 457558},
				Label:    "Fire Trance",
				Duration: time.Second * 10,
				OnGain: func(aura *core.Aura, sim *core.Simulation) {
					for _, spell := range warlock.Immolate {
						spell.DefaultCast.CastTime = 0
					}
					if warlock.Shadowflame != nil {
						warlock.Shadowflame.DefaultCast.CastTime = 0
					}
					if warlock.Incinerate != nil {
						warlock.Incinerate.DefaultCast.CastTime = 0
					}
				},
				OnExpire: func(aura *core.Aura, sim *core.Simulation) {
					for _, spell := range warlock.Immolate {
						spell.DefaultCast.CastTime = immolateCastTime
					}
					if warlock.Shadowflame != nil {
						warlock.Shadowflame.DefaultCast.CastTime = shadowflameCastTime
					}
					if warlock.Incinerate != nil {
						warlock.Incinerate.DefaultCast.CastTime = incinerateCastTime
					}
				},
				OnCastComplete: func(aura *core.Aura, sim *core.Simulation, spell *core.Spell) {
					if slices.Contains(affectedSpellCodes, spell.SpellCode) && spell.CurCast.CastTime == 0 {
						aura.Deactivate(sim)
					}
				},
			})

			warlock.RegisterAura(core.Aura{
				Label:    "S03 - Item - T1 - Warlock - Damage 6P Bonus",
				Duration: core.NeverExpires,
				OnReset: func(aura *core.Aura, sim *core.Simulation) {
					aura.Activate(sim)
					immolateCastTime = warlock.Immolate[0].DefaultCast.CastTime
					if warlock.Shadowflame != nil {
						shadowflameCastTime = warlock.Shadowflame.DefaultCast.CastTime
					}
					if warlock.Incinerate != nil {
						incinerateCastTime = warlock.Incinerate.DefaultCast.CastTime
					}
				},
				OnGain: func(_ *core.Aura, _ *core.Simulation) {
					warlock.nightfallProcChance += 0.04
				},
				OnExpire: func(_ *core.Aura, _ *core.Simulation) {
					warlock.nightfallProcChance -= 0.04
				},
				OnPeriodicDamageDealt: func(aura *core.Aura, sim *core.Simulation, spell *core.Spell, result *core.SpellResult) {
					if (spell.SpellCode == SpellCode_WarlockImmolate || spell.SpellCode == SpellCode_WarlockShadowflame) && sim.Proc(.04, "Fire Trance") {
						fireTranceAura.Activate(sim)
					}
				},
			})
		},
	},
})
View Source
var ItemSetDeathmistRaiment = core.NewItemSet(core.ItemSet{
	Name: "Deathmist Raiment",
	Bonuses: map[int32]core.ApplyEffect{

		2: func(agent core.Agent) {
			c := agent.GetCharacter()
			c.AddStat(stats.SpellPower, 23)
		},

		4: func(agent core.Agent) {
			c := agent.GetCharacter()
			manaMetrics := c.NewManaMetrics(core.ActionID{SpellID: 450583})

			handler := func(sim *core.Simulation, spell *core.Spell, _ *core.SpellResult) {
				if c.HasManaBar() {
					c.AddMana(sim, sim.Roll(270, 300), manaMetrics)
				}
			}

			core.MakeProcTriggerAura(&c.Unit, core.ProcTrigger{
				Name:       "S03 - Heal Proc on Cast - Dreadmist Raiment (Melee Auto)",
				Callback:   core.CallbackOnSpellHitDealt,
				Outcome:    core.OutcomeLanded,
				ProcMask:   core.ProcMaskWhiteHit,
				ProcChance: 0.06,
				Handler:    handler,
			})
			core.MakeProcTriggerAura(&c.Unit, core.ProcTrigger{
				Name:       "S03 - Heal Proc on Cast - Dreadmist Raiment (Spell Cast)",
				Callback:   core.CallbackOnCastComplete,
				ProcMask:   core.ProcMaskSpellDamage | core.ProcMaskSpellHealing,
				ProcChance: 0.06,
				Handler:    handler,
			})
		},

		6: func(agent core.Agent) {
			c := agent.GetCharacter()
			c.AddStats(stats.Stats{
				stats.ArcaneResistance: 8,
				stats.FireResistance:   8,
				stats.FrostResistance:  8,
				stats.NatureResistance: 8,
				stats.ShadowResistance: 8,
			})
		},

		8: func(agent core.Agent) {
			c := agent.GetCharacter()
			c.AddStat(stats.Armor, 200)
		},
	},
})
View Source
var ItemSetLieutenantCommandersThreads = core.NewItemSet(core.ItemSet{
	Name: "Lieutenant Commander's Threads",
	Bonuses: map[int32]core.ApplyEffect{

		2: func(agent core.Agent) {
			c := agent.GetCharacter()
			c.AddStat(stats.SpellPower, 23)
		},

		4: func(agent core.Agent) {
			warlock := agent.(WarlockAgent).GetWarlock()
			warlock.GetOrRegisterAura(core.Aura{
				Label:    "Lieutenant Commander's Threads Immolate Cast Time Reduction",
				ActionID: core.ActionID{SpellID: 23047},
				Duration: core.NeverExpires,
				OnReset: func(aura *core.Aura, sim *core.Simulation) {
					aura.Activate(sim)
				},
				OnGain: func(aura *core.Aura, sim *core.Simulation) {
					for _, spell := range warlock.Immolate {
						spell.DefaultCast.CastTime -= time.Millisecond * 200
					}
				},
				OnExpire: func(aura *core.Aura, sim *core.Simulation) {
					for _, spell := range warlock.Immolate {
						spell.DefaultCast.CastTime += time.Millisecond * 200
					}
				},
			})
		},

		6: func(agent core.Agent) {
			c := agent.GetCharacter()
			c.AddStat(stats.Stamina, 20)
		},
	},
})
View Source
var ItemSetNightmareProphetsGarb = core.NewItemSet(core.ItemSet{
	Name: "Nightmare Prophet's Garb",
	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) {
			warlock := agent.(WarlockAgent).GetWarlock()

			warlock.shadowSparkAura = warlock.GetOrRegisterAura(core.Aura{
				Label:     "Shadow Spark Proc",
				ActionID:  core.ActionID{SpellID: 450013},
				Duration:  time.Second * 12,
				MaxStacks: 2,
			})

			core.MakePermanent(warlock.GetOrRegisterAura(core.Aura{
				Label: "Shadow Spark",
				OnSpellHitDealt: func(aura *core.Aura, sim *core.Simulation, spell *core.Spell, result *core.SpellResult) {
					if spell.SpellCode == SpellCode_WarlockShadowCleave && result.Landed() {
						warlock.shadowSparkAura.Activate(sim)
						warlock.shadowSparkAura.AddStack(sim)
					}
				},
			}))
		},
	},
})
View Source
var ItemSetWickedFelheart = core.NewItemSet(core.ItemSet{
	Name: "Wicked Felheart",
	Bonuses: map[int32]core.ApplyEffect{

		2: func(agent core.Agent) {

		},

		4: func(agent core.Agent) {
			warlock := agent.(WarlockAgent).GetWarlock()
			actionID := core.ActionID{SpellID: 457572}
			icd := core.Cooldown{
				Timer:    warlock.NewTimer(),
				Duration: time.Millisecond * 3500,
			}
			manaMetrics := warlock.NewManaMetrics(actionID)
			for _, pet := range warlock.BasePets {
				pet.T1Tank4PManaMetrics = pet.NewManaMetrics(actionID)
			}
			warlock.RegisterAura(core.Aura{
				Label:    "S03 - Item - T1 - Warlock - Tank 4P Bonus",
				Duration: core.NeverExpires,
				OnReset: func(aura *core.Aura, sim *core.Simulation) {
					aura.Activate(sim)
				},
				OnSpellHitTaken: func(aura *core.Aura, sim *core.Simulation, spell *core.Spell, result *core.SpellResult) {
					if icd.IsReady(sim) {
						restoreAmount := min(result.Damage, 420)
						warlock.AddMana(sim, restoreAmount, manaMetrics)
						if warlock.ActivePet != nil {
							warlock.ActivePet.AddMana(sim, restoreAmount, warlock.ActivePet.T1Tank4PManaMetrics)
						}
					}
				},
			})
		},

		6: func(agent core.Agent) {
			warlock := agent.(WarlockAgent).GetWarlock()

			soulFireCastTime := SoulFireCastTime
			procAura := warlock.RegisterAura(core.Aura{
				ActionID: core.ActionID{SpellID: 457643},
				Label:    "Soul Fire!",
				Duration: time.Second * 10,
				OnGain: func(aura *core.Aura, sim *core.Simulation) {
					for _, spell := range warlock.SoulFire {
						spell.DefaultCast.CastTime = 0
					}
				},
				OnExpire: func(aura *core.Aura, sim *core.Simulation) {
					for _, spell := range warlock.SoulFire {
						spell.DefaultCast.CastTime = soulFireCastTime
					}
				},
				OnCastComplete: func(aura *core.Aura, sim *core.Simulation, spell *core.Spell) {
					if spell.SpellCode == SpellCode_WarlockSoulFire {
						aura.Deactivate(sim)
					}
				},
			})

			icd := core.Cooldown{
				Timer:    warlock.NewTimer(),
				Duration: time.Millisecond * 100,
			}

			warlock.RegisterAura(core.Aura{
				Label:    "S03 - Item - T1 - Warlock - Tank 6P Bonus",
				Duration: core.NeverExpires,
				OnReset: func(aura *core.Aura, sim *core.Simulation) {
					aura.Activate(sim)
					soulFireCastTime = warlock.SoulFire[0].DefaultCast.CastTime
				},
				OnSpellHitDealt: func(aura *core.Aura, sim *core.Simulation, spell *core.Spell, result *core.SpellResult) {
					if result.Landed() && spell.SpellCode == SpellCode_WarlockShadowCleave && icd.IsReady(sim) && sim.Proc(0.2, "Soul Fire! Proc") {
						procAura.Activate(sim)
						icd.Use(sim)
					}
				},
			})
		},
	},
})
View Source
var TalentTreeSizes = [3]int{17, 17, 16}

Functions

This section is empty.

Types

type APLValueWarlockCurrentPetMana added in v0.0.6

type APLValueWarlockCurrentPetMana struct {
	core.DefaultAPLValueImpl
	// contains filtered or unexported fields
}

func (*APLValueWarlockCurrentPetMana) GetFloat added in v0.0.6

func (value *APLValueWarlockCurrentPetMana) GetFloat(sim *core.Simulation) float64

func (*APLValueWarlockCurrentPetMana) String added in v0.0.6

func (value *APLValueWarlockCurrentPetMana) String() string

func (*APLValueWarlockCurrentPetMana) Type added in v0.0.6

type APLValueWarlockCurrentPetManaPercent added in v0.0.6

type APLValueWarlockCurrentPetManaPercent struct {
	core.DefaultAPLValueImpl
	// contains filtered or unexported fields
}

func (*APLValueWarlockCurrentPetManaPercent) GetFloat added in v0.0.6

func (*APLValueWarlockCurrentPetManaPercent) String added in v0.0.6

func (*APLValueWarlockCurrentPetManaPercent) Type added in v0.0.6

type APLValueWarlockShouldRecastDrainSoul

type APLValueWarlockShouldRecastDrainSoul struct {
	core.DefaultAPLValueImpl
	// contains filtered or unexported fields
}

func (*APLValueWarlockShouldRecastDrainSoul) GetBool

func (*APLValueWarlockShouldRecastDrainSoul) String

func (*APLValueWarlockShouldRecastDrainSoul) Type

type APLValueWarlockShouldRefreshCorruption

type APLValueWarlockShouldRefreshCorruption struct {
	core.DefaultAPLValueImpl
	// contains filtered or unexported fields
}

func (*APLValueWarlockShouldRefreshCorruption) GetBool

func (*APLValueWarlockShouldRefreshCorruption) String

func (*APLValueWarlockShouldRefreshCorruption) Type

type PetConfig added in v0.0.16

type PetConfig struct {
	Name          string
	PowerModifier float64 // GetUnitPowerModifier("pet")
	Stats         stats.Stats
	AutoAttacks   core.AutoAttackOptions
}

type Warlock

type Warlock struct {
	core.Character
	Talents *proto.WarlockTalents
	Options *proto.WarlockOptions

	BasePets   []*WarlockPet
	ActivePet  *WarlockPet
	Felhunter  *WarlockPet
	Felguard   *WarlockPet
	Imp        *WarlockPet
	Succubus   *WarlockPet
	Voidwalker *WarlockPet

	ChaosBolt          *core.Spell
	Conflagrate        []*core.Spell
	Corruption         []*core.Spell
	DarkPact           *core.Spell
	DrainSoul          []*core.Spell
	Haunt              *core.Spell
	Immolate           []*core.Spell
	Incinerate         *core.Spell
	LifeTap            []*core.Spell
	SearingPain        []*core.Spell
	ShadowBolt         []*core.Spell
	ShadowCleave       []*core.Spell
	Shadowburn         []*core.Spell
	SoulFire           []*core.Spell
	DemonicGrace       *core.Spell
	DrainLife          []*core.Spell
	RainOfFire         []*core.Spell
	SiphonLife         []*core.Spell
	DeathCoil          []*core.Spell
	Shadowflame        *core.Spell
	UnstableAffliction *core.Spell

	ActiveCurseAura          *core.Aura
	CurseOfElements          *core.Spell
	CurseOfElementsAuras     core.AuraArray
	CurseOfShadow            *core.Spell
	CurseOfShadowAuras       core.AuraArray
	CurseOfRecklessness      *core.Spell
	CurseOfRecklessnessAuras core.AuraArray
	CurseOfWeakness          *core.Spell
	CurseOfWeaknessAuras     core.AuraArray
	CurseOfTongues           *core.Spell
	CurseOfTonguesAuras      core.AuraArray
	CurseOfAgony             []*core.Spell
	CurseOfDoom              *core.Spell
	AmplifyCurse             *core.Spell

	SummonDemonSpells []*core.Spell

	DemonicKnowledgeAura    *core.Aura
	HauntDebuffAuras        core.AuraArray
	ImmolationAura          *core.Spell
	IncinerateAura          *core.Aura
	Metamorphosis           *core.Spell
	MetamorphosisAura       *core.Aura
	NightfallProcAura       *core.Aura
	PyroclasmAura           *core.Aura
	DemonicGraceAura        *core.Aura
	AmplifyCurseAura        *core.Aura
	BackdraftAura           *core.Aura
	ImprovedShadowBoltAuras core.AuraArray
	MarkOfChaosAuras        core.AuraArray
	SoulLinkAura            *core.Aura

	// The sum total of demonic pact spell power * seconds.
	DPSPAggregate float64
	PreviousTime  time.Duration
	// contains filtered or unexported fields
}

func NewWarlock

func NewWarlock(character *core.Character, options *proto.Player, warlockOptions *proto.WarlockOptions) *Warlock

func (*Warlock) AddRaidBuffs

func (warlock *Warlock) AddRaidBuffs(raidBuffs *proto.RaidBuffs)

func (*Warlock) ApplyRunes

func (warlock *Warlock) ApplyRunes()

func (*Warlock) ApplyTalents

func (warlock *Warlock) ApplyTalents()

func (*Warlock) GetCharacter

func (warlock *Warlock) GetCharacter() *core.Character

func (*Warlock) GetWarlock

func (warlock *Warlock) GetWarlock() *Warlock

func (*Warlock) HasRune

func (warlock *Warlock) HasRune(rune proto.WarlockRune) bool

func (*Warlock) Initialize

func (warlock *Warlock) Initialize()

func (*Warlock) InvocationRefresh

func (warlock *Warlock) InvocationRefresh(sim *core.Simulation, dot *core.Dot)

func (*Warlock) NewAPLValue

func (warlock *Warlock) NewAPLValue(rot *core.APLRotation, config *proto.APLValue) core.APLValue

func (*Warlock) OnGCDReady

func (warlock *Warlock) OnGCDReady(_ *core.Simulation)

func (*Warlock) Reset

func (warlock *Warlock) Reset(sim *core.Simulation)

type WarlockAgent

type WarlockAgent interface {
	GetWarlock() *Warlock
}

Agent is a generic way to access underlying warlock on any of the agents.

type WarlockPet

type WarlockPet struct {
	core.Pet

	SoulLinkAura           *core.Aura
	DemonicEmpowermentAura *core.Aura

	DanceOfTheWickedManaMetrics *core.ResourceMetrics
	LifeTapManaMetrics          *core.ResourceMetrics
	T1Tank4PManaMetrics         *core.ResourceMetrics // https://www.wowhead.com/classic/spell=457572/s03-item-t1-warlock-tank-4p-bonus
	// contains filtered or unexported fields
}

func (*WarlockPet) ExecuteCustomRotation

func (wp *WarlockPet) ExecuteCustomRotation(sim *core.Simulation)

func (*WarlockPet) GetPet

func (wp *WarlockPet) GetPet() *core.Pet

func (*WarlockPet) Initialize

func (wp *WarlockPet) Initialize()

func (*WarlockPet) Reset

func (wp *WarlockPet) Reset(_ *core.Simulation)

Directories

Path Synopsis

Jump to

Keyboard shortcuts

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