86 lines
2.0 KiB
Go
86 lines
2.0 KiB
Go
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)
|
|
}
|
|
}
|