aboutsummaryrefslogtreecommitdiff
path: root/go/game/effect.go
diff options
context:
space:
mode:
Diffstat (limited to 'go/game/effect.go')
-rw-r--r--go/game/effect.go51
1 files changed, 51 insertions, 0 deletions
diff --git a/go/game/effect.go b/go/game/effect.go
index 1fd2a630..4d89eea5 100644
--- a/go/game/effect.go
+++ b/go/game/effect.go
@@ -1,5 +1,11 @@
package game
+import (
+ "errors"
+ "regexp"
+ "strconv"
+)
+
type effect interface {
apply(*LocalState)
end(*LocalState)
@@ -45,3 +51,48 @@ func newTmpEffect(p Permanent, effect string) effect {
end := func(*LocalState) { p.removeTmpEffect(effect) }
return &dynamicEffect{apply, end}
}
+
+type xEffect struct {
+ // amount of the effect
+ x int
+ // does the effect set or adjust the value
+ set bool
+ // raw effect description
+ raw string
+}
+
+type ErrXEffectError struct {
+ err error
+}
+
+func (e ErrXEffectError) Error() string {
+ return e.err.Error()
+}
+
+var ErrXEffectFormat = ErrXEffectError{errors.New("invalid format")}
+
+var (
+ xEffectXSuffix = regexp.MustCompile(`\S+ ([\+-]?)(\d+)`)
+ xEffectXPrefix = regexp.MustCompile(`([\+-]?)(\d+) \S+`)
+)
+
+func parseXEffect(desc string) (e xEffect, err error) {
+ e.raw = desc
+ m := xEffectXSuffix.FindAllStringSubmatch(desc, -1)
+ if len(m) == 0 {
+ m = xEffectXPrefix.FindAllStringSubmatch(desc, -1)
+ }
+
+ if len(m) != 0 {
+ e.set = m[0][1] == ""
+
+ e.x, err = strconv.Atoi(m[0][1] + m[0][2])
+ if err != nil {
+ return e, ErrXEffectError{err}
+ }
+ return e, nil
+ }
+
+ // Both regex did not match
+ return e, ErrXEffectFormat
+}