aboutsummaryrefslogtreecommitdiff
path: root/go/game/permanent.go
diff options
context:
space:
mode:
Diffstat (limited to 'go/game/permanent.go')
-rw-r--r--go/game/permanent.go44
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