package input import "github.com/alpacahq/alpacadecimal" type shieldChangeEffect interface { ShieldChange(before, after alpacadecimal.Decimal) bool } func (our *Input) CurrentShield() alpacadecimal.Decimal { currentPet := our.PrimaryCurPet() if currentPet == nil { return alpacadecimal.Zero } return currentPet.Shield } func (our *Input) HasShield() bool { return our.CurrentShield().Cmp(alpacadecimal.Zero) > 0 } func (our *Input) AddShield(value alpacadecimal.Decimal) bool { currentPet := our.PrimaryCurPet() if currentPet == nil { return false } if value.Cmp(alpacadecimal.Zero) <= 0 { return false } before := currentPet.Shield currentPet.Shield = currentPet.Shield.Add(value) our.notifyShieldChange(before, currentPet.Shield) return true } func (our *Input) AbsorbShieldDamage(damage alpacadecimal.Decimal) alpacadecimal.Decimal { currentPet := our.PrimaryCurPet() if currentPet == nil { return alpacadecimal.Zero } if damage.Cmp(alpacadecimal.Zero) <= 0 || currentPet.Shield.Cmp(alpacadecimal.Zero) <= 0 { return alpacadecimal.Zero } before := currentPet.Shield absorbed := alpacadecimal.Min(currentPet.Shield, damage) currentPet.Shield = currentPet.Shield.Sub(absorbed) if currentPet.Shield.Cmp(alpacadecimal.Zero) < 0 { currentPet.Shield = alpacadecimal.Zero } our.notifyShieldChange(before, currentPet.Shield) return absorbed } func (our *Input) ConsumeAllShield() alpacadecimal.Decimal { currentPet := our.PrimaryCurPet() if currentPet == nil { return alpacadecimal.Zero } before := currentPet.Shield value := currentPet.Shield currentPet.Shield = alpacadecimal.Zero our.notifyShieldChange(before, 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) } }