package input import "github.com/alpacahq/alpacadecimal" type shieldChangeEffect interface { ShieldChange(before, after alpacadecimal.Decimal) bool } func (our *Input) CurrentShield() alpacadecimal.Decimal { if our == nil || our.CurrentPet == nil { return alpacadecimal.Zero } return our.CurrentPet.Shield } func (our *Input) HasShield() bool { return our.CurrentShield().Cmp(alpacadecimal.Zero) > 0 } func (our *Input) AddShield(value alpacadecimal.Decimal) bool { if our == nil || our.CurrentPet == nil { return false } if value.Cmp(alpacadecimal.Zero) <= 0 { return false } before := our.CurrentPet.Shield our.CurrentPet.Shield = our.CurrentPet.Shield.Add(value) our.notifyShieldChange(before, our.CurrentPet.Shield) return true } func (our *Input) AbsorbShieldDamage(damage alpacadecimal.Decimal) alpacadecimal.Decimal { if our == nil || our.CurrentPet == nil { return alpacadecimal.Zero } if damage.Cmp(alpacadecimal.Zero) <= 0 || our.CurrentPet.Shield.Cmp(alpacadecimal.Zero) <= 0 { return alpacadecimal.Zero } before := our.CurrentPet.Shield absorbed := alpacadecimal.Min(our.CurrentPet.Shield, damage) our.CurrentPet.Shield = our.CurrentPet.Shield.Sub(absorbed) if our.CurrentPet.Shield.Cmp(alpacadecimal.Zero) < 0 { our.CurrentPet.Shield = alpacadecimal.Zero } our.notifyShieldChange(before, our.CurrentPet.Shield) return absorbed } func (our *Input) ConsumeAllShield() alpacadecimal.Decimal { if our == nil || our.CurrentPet == nil { return alpacadecimal.Zero } before := our.CurrentPet.Shield value := our.CurrentPet.Shield our.CurrentPet.Shield = alpacadecimal.Zero our.notifyShieldChange(before, our.CurrentPet.Shield) return value } func (our *Input) notifyShieldChange(before, after alpacadecimal.Decimal) { if our == nil || before.Cmp(after) == 0 { return } for _, effect := range our.Effects { if effect == nil || !effect.Alive() { continue } hook, ok := effect.(shieldChangeEffect) if !ok { continue } effect.Ctx().Our = our effect.Ctx().Opp = our.Opp hook.ShieldChange(before, after) } }