diff options
| -rw-r--r-- | go/game/targets.go | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/go/game/targets.go b/go/game/targets.go index 02f63378..2e29d64e 100644 --- a/go/game/targets.go +++ b/go/game/targets.go @@ -1,6 +1,7 @@ package game import ( + "errors" "fmt" "log" "strconv" @@ -183,7 +184,18 @@ func (d *TargetDesc) requirement() TargetRequirement { } } -func (t *Target) AddSelection(sel interface{}) (err error) { +var ( + ErrAlreadySelected = errors.New("already selected") +) + +// AddSelection adds an object as selection to the target. +// If the provided object does not satisfy the target contraint err != nil is returned. +// Selecting the same object multiple times reaul%s in an error. +func (t *Target) AddSelection(sel any) (err error) { + if slices.Contains(t.sel, sel) { + return ErrAlreadySelected + } + if err = t.constraint(sel); err == nil { t.sel = append(t.sel, sel) } @@ -227,7 +239,8 @@ func (t *Target) CheckSelection(s *LocalState) error { return nil } -func (t *Targets) AddSelection(sel interface{}) error { return t.ts[t.idx].AddSelection(sel) } +// AddSelection adds an object as selection to the current target. +func (t *Targets) AddSelection(sel any) error { return t.ts[t.idx].AddSelection(sel) } func (t *Targets) HasSelections() bool { for _, t := range t.ts { |
