diff options
Diffstat (limited to 'go/game/permanent.go')
| -rw-r--r-- | go/game/permanent.go | 44 |
1 files changed, 31 insertions, 13 deletions
diff --git a/go/game/permanent.go b/go/game/permanent.go index 1bb1a408..278524fa 100644 --- a/go/game/permanent.go +++ b/go/game/permanent.go @@ -3,7 +3,6 @@ package game import ( "fmt" "log" - "strconv" "strings" "golang.org/x/exp/slices" @@ -120,14 +119,15 @@ func FindPermanent(s *LocalState, desc string) Permanent { func DealDamage(src, dest Permanent, damage int) { actualDamage := damage - shield, err := dest.XEffect("shield") - if err != nil { - // TODO: implement piercing - - actualDamage -= shield - if actualDamage < 0 { - actualDamage = 0 + armor, err := dest.XEffect("armor") + if err == nil { + piercing, err := src.XEffect("piercing") + if err == nil { + piercing = 0 } + + reduction := max(armor-piercing, 0) + actualDamage = max(actualDamage-reduction, 0) } dest.adjustDamage(actualDamage) } @@ -148,8 +148,11 @@ func (p *permanentBase) removeTmpEffect(tmpEffect string) { p.tmpEffects = utils.RemoveFromUnorderedSlice[string](p.tmpEffects, tmpEffect) } +// Effects returnes a slice containing all static effects of a permanent. +// The new slice returned contains the card and temporary effetcs. func (p *permanentBase) Effects() []string { - return append(p.card.getEffects(), p.tmpEffects...) + effects := make([]string, 0, len(p.card.getEffects())+len(p.tmpEffects)) + return append(append(effects, p.card.getEffects()...), p.tmpEffects...) } func (p *permanentBase) HasEffect(effect string) bool { @@ -157,19 +160,34 @@ func (p *permanentBase) HasEffect(effect string) bool { } func (p *permanentBase) XEffect(effect string) (int, error) { - x, err := p.card.getXEffect(effect) + x := 0 + xE, err := p.card.getXEffect(effect) + if err != nil { + return 0, err + } + + x = xE.x + if x < 0 { + log.Panic("initial negativ x effect") + } for _, e := range p.tmpEffects { if !strings.Contains(e, effect) { continue } - tokens := strings.SplitN(e, " ", 2) - tmpX, err := strconv.Atoi(tokens[1]) + tmpX, err := parseXEffect(e) + if err != nil { return 0, err } - x += tmpX + + // TODO: implement layers + if tmpX.set { + x = tmpX.x + } else { + x += tmpX.x + } } return x, err |
