Files
bl/logic/service/fight/input/shield.go
xinian 9c6f3988de
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
refactor: 重构 CurrentPet 为 CurPet
2026-04-04 04:34:43 +08:00

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)
}
}