-
Notifications
You must be signed in to change notification settings - Fork 22
/
hold.go
114 lines (97 loc) · 2.34 KB
/
hold.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
package orders
import (
"fmt"
"time"
"github.com/zond/godip"
)
var HoldOrder = &hold{}
func Hold(source godip.Province) *hold {
return &hold{
targets: []godip.Province{source},
}
}
type hold struct {
targets []godip.Province
}
func (self *hold) String() string {
return fmt.Sprintf("%v %v", self.targets[0], godip.Hold)
}
func (self *hold) Flags() map[godip.Flag]bool {
return nil
}
func (self *hold) Type() godip.OrderType {
return godip.Hold
}
func (self *hold) DisplayType() godip.OrderType {
return godip.Hold
}
func (self *hold) Targets() []godip.Province {
return self.targets
}
func (self *hold) At() time.Time {
return time.Now()
}
func (self *hold) Adjudicate(r godip.Resolver) error {
return nil
}
func (self *hold) Parse(bits []string) (godip.Adjudicator, error) {
var result godip.Adjudicator
var err error
if len(bits) > 1 && godip.OrderType(bits[1]) == self.DisplayType() {
if len(bits) == 2 {
result = Hold(godip.Province(bits[0]))
}
if result == nil {
err = fmt.Errorf("Can't parse as %+v", bits)
}
}
return result, err
}
func (self *hold) Options(v godip.Validator, nation godip.Nation, src godip.Province) (result godip.Options) {
if src.Super() != src {
return
}
if v.Phase().Type() == godip.Movement {
if v.Graph().Has(src) {
if unit, actualSrc, ok := v.Unit(src); ok {
if unit.Nation == nation {
result = godip.Options{
godip.SrcProvince(actualSrc): nil,
}
}
}
}
}
return
}
func (self *hold) Validate(v godip.Validator) (godip.Nation, error) {
if v.Phase().Type() != godip.Movement {
return "", godip.ErrInvalidPhase
}
if !v.Graph().Has(self.targets[0]) {
return "", godip.ErrInvalidTarget
}
var ok bool
var unit godip.Unit
unit, self.targets[0], ok = v.Unit(self.targets[0])
if !ok {
return "", godip.ErrMissingUnit
}
return unit.Nation, nil
}
func (self *hold) Execute(state godip.State) {
}
/*
HoldSupport returns successful supports of a hold in prov.
*/
func HoldSupport(r godip.Resolver, prov godip.Province) int {
_, supports, _ := r.Find(func(p godip.Province, o godip.Order, u *godip.Unit) bool {
if o != nil && u != nil && o.Type() == godip.Support && p.Super() != prov.Super() && len(o.Targets()) == 2 && o.Targets()[1].Super() == prov.Super() {
if err := r.Resolve(p); err == nil {
return true
}
}
return false
})
return len(supports)
}