Files
bl/logic/service/fight/input/shield.go
xinian 87fdccaddf
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
feat: 实现大量技能效果及战斗逻辑修复
2026-03-30 00:51:18 +08:00

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