diff options
Diffstat (limited to 'go/game/effect.go')
| -rw-r--r-- | go/game/effect.go | 51 |
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 +} |
