mage

package
v0.0.182 Latest Latest
Warning

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

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

Documentation

Index

Constants

View Source
const (
	FireSpellMaxTimeUntilResult       = 750 * time.Millisecond
	HeatingUpDeactivateBuffer         = 250 * time.Millisecond
	MageSpellFlagNone           int64 = 0
	MageSpellAlterTime          int64 = 1 << iota
	MageSpellArcaneBarrage
	MageSpellArcaneBlast
	MageSpellArcaneExplosion
	MageSpellArcanePower
	MageSpellArcaneMissilesCast
	MageSpellArcaneMissilesTick
	MageSpellBlizzard
	MageSpellConeOfCold
	MageSpellDeepFreeze
	MageSpellDragonsBreath
	MageSpellEvocation
	MageSpellFireBlast
	MageSpellFireball
	MageSpellFlamestrike
	MageSpellFlamestrikeDot
	MageSpellFrostArmor
	MageSpellFrostbolt
	MageSpellFrostBomb
	MageSpellFrostBombExplosion
	MageSpellFrostfireBolt
	MageSpellFrostNova
	MageSpellFrozenOrb
	MageSpellFrozenOrbTick
	MageSpellIcicle
	MageSpellIceFloes
	MageSpellIceLance
	MageSpellIcyVeins
	MageSpellIgnite
	MageSpellInfernoBlast
	MageSpellLivingBombApply
	MageSpellLivingBombExplosion
	MageSpellLivingBombDot
	MageSpellMageArmor
	MageSpellManaGems
	MageSpellMirrorImage
	MageSpellMoltenArmor
	MageSpellNetherTempest
	MageSpellNetherTempestDot
	MageSpellPresenceOfMind
	MageSpellPyroblast
	MageSpellPyroblastDot
	MagespellRuneOfPower
	MageSpellScorch
	MageSpellCombustion
	MageSpellCombustionDot
	MageMirrorImageSpellArcaneBlast
	MageWaterElementalSpellWaterBolt
	MageSpellLast
	MageSpellsAll       = MageSpellLast<<1 - 1
	MageSpellLivingBomb = MageSpellLivingBombDot | MageSpellLivingBombExplosion
	MageSpellFire       = MageSpellDragonsBreath | MageSpellFireball | MageSpellCombustion |
		MageSpellFireBlast | MageSpellFlamestrike | MageSpellFrostfireBolt | MageSpellIgnite |
		MageSpellLivingBomb | MageSpellPyroblast | MageSpellScorch
	MageSpellBrainFreeze  = MageSpellFireball | MageSpellFrostfireBolt
	MageSpellsAllDamaging = MageSpellArcaneBarrage | MageSpellArcaneBlast | MageSpellArcaneExplosion | MageSpellArcaneMissilesTick | MageSpellBlizzard | MageSpellDeepFreeze |
		MageSpellDragonsBreath | MageSpellFireBlast | MageSpellFireball | MageSpellFlamestrike | MageSpellFrostbolt | MageSpellFrostfireBolt | MageSpellFrozenOrbTick |
		MageSpellIceLance | MageSpellLivingBombExplosion | MageSpellLivingBombDot | MageSpellPyroblast | MageSpellPyroblastDot | MageSpellScorch | MageSpellInfernoBlast
	MageSpellInstantCast = MageSpellArcaneBarrage | MageSpellArcaneMissilesCast | MageSpellArcaneMissilesTick |
		MageSpellFireBlast | MageSpellArcaneExplosion | MageSpellInfernoBlast | MageSpellPyroblastDot |
		MageSpellCombustion | MageSpellConeOfCold | MageSpellDeepFreeze |
		MageSpellDragonsBreath | MageSpellIceLance | MageSpellManaGems | MageSpellMirrorImage |
		MageSpellPresenceOfMind | MageSpellLivingBombDot | MageSpellFrostBomb | MageSpellNetherTempest | MageSpellNetherTempestDot
	MageSpellExtraResult = MageSpellLivingBombExplosion | MageSpellArcaneMissilesTick | MageSpellBlizzard
	FireSpellIgnitable   = MageSpellFireball | MageSpellFrostfireBolt | MageSpellInfernoBlast | MageSpellScorch | MageSpellPyroblast
)

Variables

View Source
var ItemSetChronomancerRegalia = core.NewItemSet(core.ItemSet{
	Name:                    "Chronomancer Regalia",
	DisabledInChallengeMode: true,
	Bonuses: map[int32]core.ApplySetBonus{

		2: func(agent core.Agent, setBonusAura *core.Aura) {
			mage := agent.(MageAgent).GetMage()

			arcaneBlastMod := mage.AddDynamicMod(core.SpellModConfig{
				Kind:       core.SpellMod_PowerCost_Pct,
				ClassMask:  MageSpellArcaneBlast,
				FloatValue: 0,
			})

			arcaneAura := mage.GetOrRegisterAura(core.Aura{
				Label:     "Profound Magic",
				ActionID:  core.ActionID{SpellID: 145252},
				Duration:  time.Second * 10,
				MaxStacks: 4,
				OnStacksChange: func(aura *core.Aura, sim *core.Simulation, oldStacks int32, newStacks int32) {
					arcaneBlastMod.UpdateFloatValue(0.25 * float64(newStacks))
				},
			})

			setBonusAura.MakeDependentProcTriggerAura(&mage.Unit, core.ProcTrigger{
				Name:           "Profound Magic - Consume",
				ClassSpellMask: MageSpellArcaneBlast,
				Callback:       core.CallbackOnSpellHitDealt,
				Handler: func(sim *core.Simulation, spell *core.Spell, result *core.SpellResult) {
					arcaneAura.Deactivate(sim)
				},
			})

			setBonusAura.MakeDependentProcTriggerAura(&mage.Unit, core.ProcTrigger{
				Name:           "Item - Mage T16 2P Bonus",
				ClassSpellMask: MageSpellArcaneMissilesCast,
				Callback:       core.CallbackOnSpellHitDealt,
				Handler: func(sim *core.Simulation, spell *core.Spell, result *core.SpellResult) {
					arcaneAura.Activate(sim)
					arcaneAura.AddStack(sim)
				},
			})

			fireAura := core.MakeStackingAura(&mage.Character, core.StackingStatAura{
				Aura: core.Aura{
					Label:     "Potent Flames",
					ActionID:  core.ActionID{SpellID: 145254},
					Duration:  time.Second * 5,
					MaxStacks: 5,
				},
				BonusPerStack: stats.Stats{stats.HasteRating: 750},
			})

			mage.OnSpellRegistered(func(spell *core.Spell) {
				if !spell.Matches(MageSpellPyroblast) {
					return
				}

				mage.InstantPyroblastAura.ApplyOnExpire(func(_ *core.Aura, sim *core.Simulation) {
					if setBonusAura.IsActive() {
						fireAura.Activate(sim)
						fireAura.AddStack(sim)
					}
				})
			})

			frostClassMask := MageSpellIceLance | MageSpellFrostbolt | MageSpellFrostfireBolt | MageSpellConeOfCold
			frostAura := mage.GetOrRegisterAura(core.Aura{
				Label:    "Frozen Thoughts",
				ActionID: core.ActionID{SpellID: 146557},
				Duration: time.Second * 15,
			}).AttachSpellMod(core.SpellModConfig{
				Kind:       core.SpellMod_DamageDone_Pct,
				ClassMask:  frostClassMask,
				FloatValue: 0.25,
			})

			setBonusAura.MakeDependentProcTriggerAura(&mage.Unit, core.ProcTrigger{
				Name:           "Frozen Thoughts - Consume",
				ClassSpellMask: frostClassMask,
				Callback:       core.CallbackOnSpellHitDealt,
				Handler: func(sim *core.Simulation, spell *core.Spell, result *core.SpellResult) {
					frostAura.Deactivate(sim)
				},
			})

			mage.OnSpellRegistered(func(spell *core.Spell) {
				if !spell.Matches(MageSpellFrostbolt) {
					return
				}
				if mage.BrainFreezeAura == nil {
					return
				}
				mage.BrainFreezeAura.ApplyOnExpire(func(_ *core.Aura, sim *core.Simulation) {
					if setBonusAura.IsActive() {
						frostAura.Activate(sim)
					}
				})
			})

			setBonusAura.ExposeToAPL(145251)
		},

		4: func(agent core.Agent, setBonusAura *core.Aura) {
			mage := agent.(MageAgent).GetMage()

			mage.T16_4pc = setBonusAura

			frigidBlast := mage.RegisterSpell(core.SpellConfig{
				ActionID:    core.ActionID{SpellID: 145264},
				SpellSchool: core.SpellSchoolFrost,
				ProcMask:    core.ProcMaskSpellProc,
				Flags:       core.SpellFlagPassiveSpell,

				DamageMultiplier: 1,
				CritMultiplier:   mage.DefaultCritMultiplier(),
				ThreatMultiplier: 1,

				BonusCoefficient: 1.5,

				ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) {
					baseDamage := mage.CalcAndRollDamageRange(sim, 1.5, 0.15000000596)
					spell.CalcAndDealDamage(sim, target, baseDamage, spell.OutcomeMagicCrit)
				},
			})

			mage.OnSpellRegistered(func(spell *core.Spell) {
				if !spell.Matches(MageSpellFrostbolt) {
					return
				}
				if mage.BrainFreezeAura == nil {
					return
				}
				mage.BrainFreezeAura.ApplyOnExpire(func(_ *core.Aura, sim *core.Simulation) {
					if setBonusAura.IsActive() {
						frigidBlast.Cast(sim, mage.CurrentTarget)
					}
				})
			})

			fireAura := mage.GetOrRegisterAura(core.Aura{
				Label:    "Fiery Adept",
				ActionID: core.ActionID{SpellID: 145261},
				Duration: time.Second * 15,
			}).AttachSpellMod(core.SpellModConfig{
				Kind:       core.SpellMod_BonusCrit_Percent,
				ClassMask:  MageSpellPyroblast | MageSpellPyroblastDot,
				FloatValue: 100,
			})

			setBonusAura.MakeDependentProcTriggerAura(&mage.Unit, core.ProcTrigger{
				Name:               "Fiery Adept - Consume",
				ClassSpellMask:     MageSpellPyroblast,
				RequireDamageDealt: true,
				Callback:           core.CallbackOnSpellHitDealt,
				Handler: func(sim *core.Simulation, spell *core.Spell, result *core.SpellResult) {
					fireAura.Deactivate(sim)
				},
			})

			setBonusAura.MakeDependentProcTriggerAura(&mage.Unit, core.ProcTrigger{
				Name:           "Item - Mage T16 4P Bonus",
				ClassSpellMask: MageSpellInfernoBlast,
				Callback:       core.CallbackOnSpellHitDealt,
				Handler: func(sim *core.Simulation, spell *core.Spell, result *core.SpellResult) {
					fireAura.Activate(sim)
				},
			})

			setBonusAura.ExposeToAPL(145257)
		},
	},
})

T16

View Source
var ItemSetGladiatorsRegalia = core.NewItemSet(core.ItemSet{
	Name:                    "Gladiator's Regalia",
	DisabledInChallengeMode: true,
	Bonuses: map[int32]core.ApplySetBonus{
		2: func(agent core.Agent, setBonusAura *core.Aura) {},

		4: func(agent core.Agent, setBonusAura *core.Aura) {
			setBonusAura.AttachSpellMod(core.SpellModConfig{
				Kind:      core.SpellMod_Cooldown_Flat,
				ClassMask: MageSpellAlterTime,
				TimeValue: -90 * time.Second,
			})

			setBonusAura.ExposeToAPL(131619)
		},
	},
})

PVP S12 / S13 / S14

View Source
var ItemSetRegaliaOfTheBurningScroll = core.NewItemSet(core.ItemSet{
	Name:                    "Regalia of the Burning Scroll",
	DisabledInChallengeMode: true,
	Bonuses: map[int32]core.ApplySetBonus{

		2: func(_ core.Agent, setBonusAura *core.Aura) {
			setBonusAura.AttachSpellMod(core.SpellModConfig{
				Kind:       core.SpellMod_DamageDone_Pct,
				ClassMask:  MageSpellIceLance,
				FloatValue: 0.12,
			}).AttachSpellMod(core.SpellModConfig{
				Kind:       core.SpellMod_DamageDone_Pct,
				ClassMask:  MageSpellArcaneMissilesTick,
				FloatValue: 0.07,
			}).AttachSpellMod(core.SpellModConfig{
				Kind:       core.SpellMod_DamageDone_Pct,
				ClassMask:  MageSpellPyroblast | MageSpellPyroblastDot,
				FloatValue: 0.08,
			})
			setBonusAura.ExposeToAPL(123097)
		},

		4: func(agent core.Agent, setBonusAura *core.Aura) {
			mage := agent.(MageAgent).GetMage()

			setBonusAura.AttachSpellMod(core.SpellModConfig{
				FloatValue: 0.5,
				Kind:       core.SpellMod_Cooldown_Multiplier,
				ClassMask:  MageSpellIcyVeins,
			}).AttachSpellMod(core.SpellModConfig{
				FloatValue: 1 - 0.2,
				Kind:       core.SpellMod_Cooldown_Multiplier,
				ClassMask:  MageSpellCombustion,
			})

			mage.OnSpellRegistered(func(spell *core.Spell) {
				if !spell.Matches(MageSpellArcanePower) {
					return
				}

				setBonusAura.ApplyOnGain(func(_ *core.Aura, _ *core.Simulation) {
					mage.ArcanePowerDamageMod.UpdateFloatValue(mage.ArcanePowerDamageMod.GetFloatValue() + 0.1)
				}).ApplyOnExpire(func(_ *core.Aura, _ *core.Simulation) {
					mage.ArcanePowerDamageMod.UpdateFloatValue(mage.ArcanePowerDamageMod.GetFloatValue() - 0.1)
				})
			})

			setBonusAura.ExposeToAPL(123101)
		},
	},
})

T14

View Source
var ItemSetRegaliaOfTheChromaticHydra = core.NewItemSet(core.ItemSet{
	Name:                    "Regalia of the Chromatic Hydra",
	DisabledInChallengeMode: true,
	Bonuses: map[int32]core.ApplySetBonus{

		2: func(agent core.Agent, setBonusAura *core.Aura) {
			mage := agent.(MageAgent).GetMage()
			statValue := 1800.0
			aura := mage.NewTemporaryStatsAura(
				"Time Lord",
				core.ActionID{SpellID: 138317},
				stats.Stats{stats.HasteRating: statValue, stats.CritRating: statValue, stats.MasteryRating: statValue},
				time.Second*30,
			)

			mage.OnSpellRegistered(func(spell *core.Spell) {
				if !spell.Matches(MageSpellAlterTime) {
					return
				}

				spell.RelatedSelfBuff.ApplyOnExpire(func(_ *core.Aura, sim *core.Simulation) {
					if setBonusAura.IsActive() {
						aura.Activate(sim)
					}
				})
			})

			setBonusAura.ExposeToAPL(138316)
		},

		4: func(agent core.Agent, setBonusAura *core.Aura) {
			mage := agent.(MageAgent).GetMage()

			mage.T15_4pc = setBonusAura
			setBonusAura.ApplyOnGain(func(_ *core.Aura, _ *core.Simulation) {
				mage.T15_4PC_ArcaneChargeEffect += 0.05
			}).ApplyOnExpire(func(_ *core.Aura, _ *core.Simulation) {
				mage.T15_4PC_ArcaneChargeEffect -= 0.05
			})

			setBonusAura.ExposeToAPL(138376)
		},
	},
})

T15

Functions

This section is empty.

Types

type Mage

type Mage struct {
	core.Character

	ClassSpellScaling float64

	Talents       *proto.MageTalents
	Options       *proto.MageOptions
	ArcaneOptions *proto.ArcaneMage_Options
	FireOptions   *proto.FireMage_Options
	FrostOptions  *proto.FrostMage_Options

	AlterTime            *core.Spell
	Combustion           *core.Spell
	Ignite               *core.Spell
	LivingBomb           *core.Spell
	NetherTempest        *core.Spell
	FireBlast            *core.Spell
	FlameOrbExplode      *core.Spell
	Flamestrike          *core.Spell
	FlamestrikeBW        *core.Spell
	FrostfireOrb         *core.Spell
	Pyroblast            *core.Spell
	SummonWaterElemental *core.Spell
	SummonMirrorImages   *core.Spell
	IcyVeins             *core.Spell
	Icicle               *core.Spell

	AlterTimeAura        *core.Aura
	InvocationAura       *core.Aura
	RuneOfPowerAura      *core.Aura
	PresenceOfMindAura   *core.Aura
	FingersOfFrostAura   *core.Aura
	BrainFreezeAura      *core.Aura
	IcyVeinsAura         *core.Aura
	IceFloesAura         *core.Aura
	IciclesAura          *core.Aura
	ArcaneChargesAura    *core.Aura
	HeatingUp            *core.Aura
	InstantPyroblastAura *core.Aura

	ArcanePowerDamageMod *core.SpellMod

	T15_4PC_ArcaneChargeEffect float64
	Icicles                    []float64

	// Item sets
	T15_4pc *core.Aura
	T16_4pc *core.Aura
	// contains filtered or unexported fields
}

func NewMage

func NewMage(character *core.Character, options *proto.Player, mageOptions *proto.MageOptions) *Mage

func (*Mage) AddPartyBuffs

func (mage *Mage) AddPartyBuffs(partyBuffs *proto.PartyBuffs)

func (*Mage) AddRaidBuffs

func (mage *Mage) AddRaidBuffs(raidBuffs *proto.RaidBuffs)

func (*Mage) ApplyTalents

func (mage *Mage) ApplyTalents()

func (*Mage) GainIcicle

func (mage *Mage) GainIcicle(sim *core.Simulation, target *core.Unit, baseDamage float64)

func (*Mage) GetCharacter

func (mage *Mage) GetCharacter() *core.Character

func (*Mage) GetFrostMasteryBonus

func (mage *Mage) GetFrostMasteryBonus() float64

func (*Mage) GetMage

func (mage *Mage) GetMage() *Mage

func (*Mage) HandleHeatingUp added in v0.0.4

func (mage *Mage) HandleHeatingUp(sim *core.Simulation, spell *core.Spell, result *core.SpellResult)

func (*Mage) HasMajorGlyph

func (mage *Mage) HasMajorGlyph(glyph proto.MageMajorGlyph) bool

func (*Mage) HasMinorGlyph

func (mage *Mage) HasMinorGlyph(glyph proto.MageMinorGlyph) bool

func (*Mage) HeatingUpSpellHandler added in v0.0.4

func (mage *Mage) HeatingUpSpellHandler(sim *core.Simulation, spell *core.Spell, result *core.SpellResult, callback func())

func (*Mage) Initialize

func (mage *Mage) Initialize()

func (*Mage) NewMirrorImage

func (mage *Mage) NewMirrorImage() *MirrorImage

func (*Mage) OnEncounterStart added in v0.0.13

func (mage *Mage) OnEncounterStart(sim *core.Simulation)

func (*Mage) ProcFingersOfFrost

func (mage *Mage) ProcFingersOfFrost(sim *core.Simulation, spell *core.Spell)

func (*Mage) Reset

func (mage *Mage) Reset(sim *core.Simulation)

func (*Mage) SpendIcicle

func (mage *Mage) SpendIcicle(sim *core.Simulation, target *core.Unit, damage float64)

type MageAgent

type MageAgent interface {
	GetMage() *Mage
}

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

type MirrorImage

type MirrorImage struct {
	core.Pet

	Frostbolt   *core.Spell
	Fireblast   *core.Spell
	Fireball    *core.Spell
	ArcaneBlast *core.Spell
	// contains filtered or unexported fields
}

func (*MirrorImage) ExecuteCustomRotation

func (mi *MirrorImage) ExecuteCustomRotation(sim *core.Simulation)

func (*MirrorImage) GetPet

func (mi *MirrorImage) GetPet() *core.Pet

func (*MirrorImage) Initialize

func (mi *MirrorImage) Initialize()

func (*MirrorImage) OnEncounterStart added in v0.0.13

func (mi *MirrorImage) OnEncounterStart(_ *core.Simulation)

func (*MirrorImage) Reset

func (mi *MirrorImage) Reset(_ *core.Simulation)

Directories

Path Synopsis

Jump to

Keyboard shortcuts

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