You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
116 lines
3.4 KiB
Go
116 lines
3.4 KiB
Go
package model
|
|
|
|
import "time"
|
|
|
|
// ---- Buffs ----
|
|
|
|
type BuffType string
|
|
|
|
const (
|
|
BuffRush BuffType = "rush" // +attack speed
|
|
BuffRage BuffType = "rage" // +damage
|
|
BuffShield BuffType = "shield" // -incoming damage
|
|
BuffLuck BuffType = "luck" // loot mult from tuning.LuckBuffMultiplier when active
|
|
BuffResurrection BuffType = "resurrection" // revive on death
|
|
BuffHeal BuffType = "heal" // +50% HP instantly
|
|
BuffPowerPotion BuffType = "power_potion" // +150% damage
|
|
BuffWarCry BuffType = "war_cry" // +100% attack speed
|
|
)
|
|
|
|
// AllBuffTypes is the complete list of valid buff types.
|
|
var AllBuffTypes = []BuffType{
|
|
BuffRush, BuffRage, BuffShield, BuffLuck, BuffResurrection,
|
|
BuffHeal, BuffPowerPotion, BuffWarCry,
|
|
}
|
|
|
|
// ValidBuffType checks if a string is a valid buff type.
|
|
func ValidBuffType(s string) (BuffType, bool) {
|
|
bt := BuffType(s)
|
|
for _, t := range AllBuffTypes {
|
|
if t == bt {
|
|
return bt, true
|
|
}
|
|
}
|
|
return "", false
|
|
}
|
|
|
|
type Buff struct {
|
|
ID int64 `json:"id"`
|
|
Type BuffType `json:"type"`
|
|
Name string `json:"name"`
|
|
Duration time.Duration `json:"duration"`
|
|
Magnitude float64 `json:"magnitude"` // effect strength (e.g., 0.3 = +30%)
|
|
CooldownDuration time.Duration `json:"cooldownDuration"`
|
|
}
|
|
|
|
type ActiveBuff struct {
|
|
Buff Buff `json:"buff"`
|
|
AppliedAt time.Time `json:"appliedAt"`
|
|
ExpiresAt time.Time `json:"expiresAt"`
|
|
}
|
|
|
|
// IsExpired returns true if the buff has expired relative to the given time.
|
|
func (ab *ActiveBuff) IsExpired(now time.Time) bool {
|
|
return now.After(ab.ExpiresAt)
|
|
}
|
|
|
|
// ---- Debuffs ----
|
|
|
|
type DebuffType string
|
|
|
|
const (
|
|
DebuffPoison DebuffType = "poison" // -2% HP/sec
|
|
DebuffFreeze DebuffType = "freeze" // -50% attack speed
|
|
DebuffBurn DebuffType = "burn" // -3% HP/sec
|
|
DebuffStun DebuffType = "stun" // no attacks for 2 sec
|
|
DebuffSlow DebuffType = "slow" // -40% movement speed (not attack speed)
|
|
DebuffWeaken DebuffType = "weaken" // -30% hero outgoing damage
|
|
DebuffIceSlow DebuffType = "ice_slow" // -20% attack speed (Ice Guardian per spec §4.2)
|
|
)
|
|
|
|
// AllDebuffTypes is the complete list of valid debuff types.
|
|
var AllDebuffTypes = []DebuffType{
|
|
DebuffPoison, DebuffFreeze, DebuffBurn, DebuffStun, DebuffSlow, DebuffWeaken, DebuffIceSlow,
|
|
}
|
|
|
|
// ValidDebuffType checks if a string is a valid debuff type.
|
|
func ValidDebuffType(s string) (DebuffType, bool) {
|
|
dt := DebuffType(s)
|
|
for _, t := range AllDebuffTypes {
|
|
if t == dt {
|
|
return dt, true
|
|
}
|
|
}
|
|
return "", false
|
|
}
|
|
|
|
type Debuff struct {
|
|
ID int64 `json:"id"`
|
|
Type DebuffType `json:"type"`
|
|
Name string `json:"name"`
|
|
Duration time.Duration `json:"duration"`
|
|
Magnitude float64 `json:"magnitude"` // effect strength
|
|
}
|
|
|
|
type ActiveDebuff struct {
|
|
Debuff Debuff `json:"debuff"`
|
|
AppliedAt time.Time `json:"appliedAt"`
|
|
ExpiresAt time.Time `json:"expiresAt"`
|
|
}
|
|
|
|
// IsExpired returns true if the debuff has expired relative to the given time.
|
|
func (ad *ActiveDebuff) IsExpired(now time.Time) bool {
|
|
return now.After(ad.ExpiresAt)
|
|
}
|
|
|
|
// RemoveBuffType returns buffs without any active entry of the given type (e.g. consume Resurrection on manual revive).
|
|
func RemoveBuffType(buff []ActiveBuff, remove BuffType) []ActiveBuff {
|
|
var out []ActiveBuff
|
|
for _, ab := range buff {
|
|
if ab.Buff.Type != remove {
|
|
out = append(out, ab)
|
|
}
|
|
}
|
|
return out
|
|
}
|