priest

package
v0.0.183 Latest Latest
Warning

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

Go to latest
Published: Jan 14, 2026 License: MIT Imports: 5 Imported by: 0

Documentation

Index

Constants

View Source
const (
	PriestSpellFlagNone  int64 = 0
	PriestSpellArchangel int64 = 1 << iota
	PriestSpellDarkArchangel
	PriestSpellBindingHeal
	PriestSpellCascade
	PriestSpellCircleOfHealing
	PriestSpellDevouringPlague
	PriestSpellDevouringPlagueDoT
	PriestSpellDevouringPlagueHeal
	PriestSpellDesperatePrayer
	PriestSpellDispersion
	PriestSpellDivineAegis
	PriestSpellDivineHymn
	PriestSpellDivineStar
	PriestSpellEmpoweredRenew
	PriestSpellFade
	PriestSpellFlashHeal
	PriestSpellGreaterHeal
	PriestSpellGuardianSpirit
	PriestSpellHalo
	PriestSpellHolyFire
	PriestSpellHolyNova
	PriestSpellHolyWordChastise
	PriestSpellHolyWordSanctuary
	PriestSpellHolyWordSerenity
	PriestSpellHymnOfHope
	PriestSpellImprovedDevouringPlague
	PriestSpellInnerFire
	PriestSpellInnerFocus
	PriestSpellInnerWill
	PriestSpellManaBurn
	PriestSpellMindBender
	PriestSpellMindBlast
	PriestSpellMindFlay
	PriestSpellMindSear
	PriestSpellMindSpike
	PriestSpellMindTrauma
	PriestSpellPainSuppresion
	PriestSpellPenance
	PriestSpellPowerInfusion
	PriestSpellPowerWordBarrier
	PriestSpellPowerWordShield
	PriestSpellPrayerOfHealing
	PriestSpellPrayerOfMending
	PriestSpellPsychicScream
	PriestSpellRenew
	PriestSpellShadowOrbPassive
	PriestSpellShadowyRecall
	PriestSpellShadowWordDeath
	PriestSpellShadowWordPain
	PriestSpellShadowFiend
	PriestSpellShadowyApparation
	PriestSpellSmite
	PriestSpellVampiricEmbrace
	PriestSpellVampiricTouch

	PriestSpellLast
	PriestSpellsAll    = PriestSpellLast<<1 - 1
	PriestSpellDoT     = PriestSpellDevouringPlague | PriestSpellHolyFire | PriestSpellMindFlay | PriestSpellShadowWordPain | PriestSpellVampiricTouch | PriestSpellImprovedDevouringPlague
	PriestSpellInstant = PriestSpellCircleOfHealing |
		PriestSpellDesperatePrayer |
		PriestSpellDevouringPlague |
		PriestSpellImprovedDevouringPlague |
		PriestSpellFade |
		PriestSpellGuardianSpirit |
		PriestSpellHolyNova |
		PriestSpellHolyWordChastise |
		PriestSpellHolyWordSanctuary |
		PriestSpellHolyWordSerenity |
		PriestSpellInnerFire |
		PriestSpellPainSuppresion |
		PriestSpellPowerInfusion |
		PriestSpellPowerWordBarrier |
		PriestSpellPowerWordShield |
		PriestSpellRenew |
		PriestSpellShadowWordDeath |
		PriestSpellShadowWordPain |
		PriestSpellVampiricEmbrace
	PriestShadowSpells = PriestSpellImprovedDevouringPlague |
		PriestSpellDevouringPlague |
		PriestSpellShadowWordDeath |
		PriestSpellShadowWordPain |
		PriestSpellMindFlay |
		PriestSpellMindBlast |
		PriestSpellMindSear |
		PriestSpellMindSpike |
		PriestSpellVampiricTouch
)
View Source
const PowerInfusionCD = time.Minute * 2
View Source
const PowerInfusionDuration = time.Second * 20
View Source
const SearCoeff = 0.3
View Source
const SearScale = 0.3
View Source
const SearVariance = 0.08
View Source
const SwpScaleCoeff = 0.629660992297
View Source
const SwpSpellCoeff = 0.310169488695
View Source
const VtScaleCoeff = 0.071
View Source
const VtSpellCoeff = 0.415

Variables

View Source
var ItemSetRegaliaOfTheExorcist = core.NewItemSet(core.ItemSet{
	Name:                    "Regalia of the Exorcist",
	DisabledInChallengeMode: true,
	Bonuses: map[int32]core.ApplySetBonus{
		2: func(agent core.Agent, setBonusAura *core.Aura) {
			priest := agent.(PriestAgent).GetPriest()

			setBonusAura.MaxStacks = math.MaxInt32

			setBonusAura.AttachProcTrigger(core.ProcTrigger{
				Name:           "Regalia of the Exorcist - 2P",
				SpellFlags:     core.SpellFlagPassiveSpell,
				ProcChance:     0.65,
				ClassSpellMask: PriestSpellShadowyApparation,
				Callback:       core.CallbackOnSpellHitDealt,
				Handler: func(sim *core.Simulation, spell *core.Spell, result *core.SpellResult) {
					setBonusAura.AddStack(sim)

					if priest.ShadowWordPain != nil && priest.ShadowWordPain.Dot(result.Target).IsActive() {
						dot := priest.ShadowWordPain.Dot(result.Target)
						if priest.T15_2PC_ExtensionTracker[result.Target.Index].Swp <= sim.CurrentTime {
							dot.DurationExtendSnapshot(sim, dot.CalcTickPeriod())
						} else {
							dot.AddTick()
						}
					}

					if priest.VampiricTouch != nil && priest.VampiricTouch.Dot(result.Target).IsActive() {
						dot := priest.VampiricTouch.Dot(result.Target)
						if priest.T15_2PC_ExtensionTracker[result.Target.Index].VT <= sim.CurrentTime {
							dot.DurationExtendSnapshot(sim, dot.CalcTickPeriod())
						} else {
							dot.AddTick()
						}
					}
				},
			}).ExposeToAPL(138156)
		},
		4: func(agent core.Agent, setBonusAura *core.Aura) {
			priest := agent.(PriestAgent).GetPriest()
			setBonusAura.AttachProcTrigger(core.ProcTrigger{
				Name:           "Regalia of the Exorcist - 4P",
				ProcMask:       core.ProcMaskSpellDamage,
				ProcChance:     0.1,
				ClassSpellMask: PriestSpellVampiricTouch,
				Outcome:        core.OutcomeLanded,
				Callback:       core.CallbackOnPeriodicDamageDealt,
				Handler: func(sim *core.Simulation, spell *core.Spell, result *core.SpellResult) {
					priest.ShadowyApparition.Cast(sim, result.Target)
				},
			}).ExposeToAPL(138158)
		},
	},
})
View Source
var ItemSetRegaliaOfTheGuardianSperpent = core.NewItemSet(core.ItemSet{
	Name:                    "Regalia of the Guardian Serpent",
	DisabledInChallengeMode: true,
	Bonuses: map[int32]core.ApplySetBonus{
		2: func(agent core.Agent, setBonusAura *core.Aura) {
			setBonusAura.AttachSpellMod(core.SpellModConfig{
				Kind:       core.SpellMod_BonusCrit_Percent,
				ClassMask:  PriestSpellShadowWordPain,
				FloatValue: 10,
			}).ExposeToAPL(123114)
		},
		4: func(agent core.Agent, setBonusAura *core.Aura) {
			setBonusAura.AttachSpellMod(core.SpellModConfig{
				Kind:      core.SpellMod_DotNumberOfTicks_Flat,
				ClassMask: PriestSpellShadowWordPain | PriestSpellVampiricTouch,
				IntValue:  1,
			}).ExposeToAPL(123115)
		},
	},
})

T14 - Shadow

View Source
var ItemSetRegaliaOfTheTernionGlory = core.NewItemSet(core.ItemSet{
	Name:                    "Regalia of Ternion Glory",
	DisabledInChallengeMode: true,
	Bonuses: map[int32]core.ApplySetBonus{
		2: func(agent core.Agent, setBonusAura *core.Aura) {
			setBonusAura.AttachSpellMod(core.SpellModConfig{
				Kind:       core.SpellMod_CritMultiplier_Flat,
				FloatValue: 0.4,
				ClassMask:  PriestSpellShadowyRecall,
			}).ExposeToAPL(145174)
		},
		4: func(agent core.Agent, setBonusAura *core.Aura) {
			priest := agent.(PriestAgent).GetPriest()
			mod := priest.Unit.AddDynamicMod(core.SpellModConfig{
				Kind:       core.SpellMod_DamageDone_Pct,
				FloatValue: 0.2,
				ClassMask:  PriestSpellShadowWordDeath | PriestSpellMindSpike | PriestSpellMindBlast,
			})

			var orbsSpend float64 = 0
			priest.Unit.GetSecondaryResourceBar().RegisterOnSpend(func(_ *core.Simulation, amount float64, _ core.ActionID) {
				orbsSpend = amount
			})

			aura := priest.Unit.RegisterAura(core.Aura{
				Label:    "Regalia of the Ternion Glory - 4P (Proc)",
				ActionID: core.ActionID{SpellID: 145180},
				Duration: time.Second * 12,
				OnGain: func(aura *core.Aura, sim *core.Simulation) {
					mod.UpdateFloatValue(0.2 * float64(orbsSpend))
					mod.Activate()
				},
				OnExpire: func(aura *core.Aura, sim *core.Simulation) {
					mod.Deactivate()
				},
				OnCastComplete: func(aura *core.Aura, sim *core.Simulation, spell *core.Spell) {
					if !spell.Matches(PriestSpellMindBlast | PriestSpellMindSpike | PriestSpellShadowWordDeath) {
						return
					}

					aura.Deactivate(sim)
				},
			})

			setBonusAura.AttachProcTrigger(core.ProcTrigger{
				Name:           "Regalia of the Ternion Glory - 4P",
				Outcome:        core.OutcomeLanded,
				Callback:       core.CallbackOnSpellHitDealt,
				ClassSpellMask: PriestSpellDevouringPlague,
				Handler: func(sim *core.Simulation, spell *core.Spell, result *core.SpellResult) {
					aura.Activate(sim)
				},
			}).ExposeToAPL(145179)
		},
	},
})

Functions

This section is empty.

Types

type MindBender

type MindBender struct {
	core.Pet

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

func (*MindBender) ExecuteCustomRotation

func (mindbender *MindBender) ExecuteCustomRotation(sim *core.Simulation)

func (*MindBender) GetPet

func (mindbender *MindBender) GetPet() *core.Pet

func (*MindBender) Initialize

func (mindbender *MindBender) Initialize()

func (*MindBender) OnEncounterStart added in v0.0.13

func (mindbender *MindBender) OnEncounterStart(sim *core.Simulation)

func (*MindBender) OnPetDisable

func (mindbender *MindBender) OnPetDisable(sim *core.Simulation)

func (*MindBender) Reset

func (mindbender *MindBender) Reset(sim *core.Simulation)

type Priest

type Priest struct {
	core.Character
	SelfBuffs
	Talents *proto.PriestTalents

	SurgeOfLight bool

	Latency float64

	ShadowfiendAura *core.Aura
	ShadowfiendPet  *Shadowfiend
	MindbenderPet   *MindBender
	MindbenderAura  *core.Aura

	ShadowOrbsAura      *core.Aura
	EmpoweredShadowAura *core.Aura

	// cached cast stuff
	// TODO: aoe multi-target situations will need multiple spells ticking for each target.
	HolyEvangelismProcAura *core.Aura
	DarkEvangelismProcAura *core.Aura

	SurgeOfLightProcAura *core.Aura

	// might want to move these spell / talents into spec specific initialization
	BindingHeal       *core.Spell
	CircleOfHealing   *core.Spell
	FlashHeal         *core.Spell
	GreaterHeal       *core.Spell
	Penance           *core.Spell
	PenanceHeal       *core.Spell
	PowerWordShield   *core.Spell
	PrayerOfHealing   *core.Spell
	PrayerOfMending   *core.Spell
	Renew             *core.Spell
	EmpoweredRenew    *core.Spell
	InnerFocus        *core.Spell
	HolyFire          *core.Spell
	Smite             *core.Spell
	ShadowWordPain    *core.Spell
	Shadowfiend       *core.Spell
	VampiricTouch     *core.Spell
	MindBender        *core.Spell
	ShadowyApparition *core.Spell

	WeakenedSouls core.AuraArray

	ProcPrayerOfMending      core.ApplySpellResults
	T15_2PC_ExtensionTracker []TargetDoTInfo
}

func New

func New(char *core.Character, selfBuffs SelfBuffs, talents string) *Priest

func (*Priest) AddDarkEvangelismStack

func (priest *Priest) AddDarkEvangelismStack(sim *core.Simulation)

func (*Priest) AddHolyEvanglismStack

func (priest *Priest) AddHolyEvanglismStack(sim *core.Simulation)

func (*Priest) AddPartyBuffs

func (priest *Priest) AddPartyBuffs(_ *proto.PartyBuffs)

func (*Priest) ApplyGlyphs

func (priest *Priest) ApplyGlyphs()

func (*Priest) ApplyTalents

func (priest *Priest) ApplyTalents()

func (*Priest) GetCharacter

func (priest *Priest) GetCharacter() *core.Character

func (*Priest) HasMajorGlyph

func (priest *Priest) HasMajorGlyph(glyph proto.PriestMajorGlyph) bool

func (*Priest) HasMinorGlyph

func (priest *Priest) HasMinorGlyph(glyph proto.PriestMinorGlyph) bool

func (*Priest) Initialize

func (priest *Priest) Initialize()

func (*Priest) NewMindBender

func (priest *Priest) NewMindBender() *MindBender

func (*Priest) NewShadowfiend

func (priest *Priest) NewShadowfiend() *Shadowfiend

func (*Priest) OnEncounterStart added in v0.0.13

func (priest *Priest) OnEncounterStart(sim *core.Simulation)

func (*Priest) Reset

func (priest *Priest) Reset(_ *core.Simulation)

type PriestAgent

type PriestAgent interface {
	GetPriest() *Priest
}

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

type SelfBuffs

type SelfBuffs struct {
	UseShadowfiend bool
	UseInnerFire   bool

	PowerInfusionTarget *proto.UnitReference
}

type Shadowfiend

type Shadowfiend struct {
	core.Pet

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

DISCLAIMER: Shadowfiend need some extensive research on Level 85 Proper Spell Scaling? Wiki says 37.5%, patch notes state 30% WoW Sims implemented priest crit scaling but we do not Right now Stats are inherited statically on spawn, but testing indicates shadow fiend scales per hit based on owner spell power

func (*Shadowfiend) ExecuteCustomRotation

func (shadowfiend *Shadowfiend) ExecuteCustomRotation(sim *core.Simulation)

func (*Shadowfiend) GetPet

func (shadowfiend *Shadowfiend) GetPet() *core.Pet

func (*Shadowfiend) Initialize

func (shadowfiend *Shadowfiend) Initialize()

func (*Shadowfiend) OnEncounterStart added in v0.0.13

func (shadowfiend *Shadowfiend) OnEncounterStart(_ *core.Simulation)

func (*Shadowfiend) OnPetDisable

func (shadowfiend *Shadowfiend) OnPetDisable(sim *core.Simulation)

func (*Shadowfiend) Reset

func (shadowfiend *Shadowfiend) Reset(sim *core.Simulation)

type TargetDoTInfo added in v0.0.89

type TargetDoTInfo struct {
	Swp time.Duration
	VT  time.Duration
}

Directories

Path Synopsis
Implements the shadow priest's mastery Every tick of a priest's DoT can be replicated The chance is based on the mastery a priest has
Implements the shadow priest's mastery Every tick of a priest's DoT can be replicated The chance is based on the mastery a priest has

Jump to

Keyboard shortcuts

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