generated from gligneul/rollmelette-template
-
Notifications
You must be signed in to change notification settings - Fork 0
/
build.go
78 lines (70 loc) · 2.33 KB
/
build.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
package main
import (
"fmt"
"github.com/rollmelette/rollmelette"
)
func (a *GameApplication) handleBuildArmy(
metadata rollmelette.Metadata,
inputPayload BuildArmyPayload,
) error {
if a.state.Turn != "build" {
return fmt.Errorf("cant build an army outside build phase")
}
if !a.state.Board[inputPayload.Position].SupplyCenter {
return fmt.Errorf("cant build an army outside a suply center")
}
if a.state.Board[inputPayload.Position].Occupied && inputPayload.Delete == 0 {
return fmt.Errorf("cant build an army in occupied region")
}
if !a.state.Board[inputPayload.Position].Occupied && inputPayload.Delete != 0 {
return fmt.Errorf("cant delete an army in empty region")
}
if a.state.Players[metadata.MsgSender].Name != a.state.Board[inputPayload.Position].Owner {
return fmt.Errorf("cant build an army in a territory you dont own")
}
if inputPayload.Type == "navy" && !a.state.Board[inputPayload.Position].Coastal {
return fmt.Errorf("cant build a navy in a landlocked territory")
}
if a.state.Players[metadata.MsgSender].Name != inputPayload.Owner {
return fmt.Errorf("cant build another player's army")
}
if len(a.state.Players[metadata.MsgSender].Armies) >= a.state.Players[metadata.MsgSender].Bases && inputPayload.Delete == 0 {
return fmt.Errorf(("cant build another army without extra supply centers"))
}
build := BuildArmyInput{
Info: inputPayload,
Player: metadata.MsgSender,
}
a.state.Players[metadata.MsgSender].Builds = append(a.state.Players[metadata.MsgSender].Builds, &build)
return nil
}
func BuildUnits(a *GameApplication) {
for _, player := range a.state.Players {
if len(player.Builds) == 0 {
continue
}
for _, order := range player.Builds {
if order.Info.Delete != 0 {
a.state.Board[order.Info.Position].Occupied = false
delete(a.state.Players[order.Player].Armies, order.Info.Delete)
delete(a.state.Units, order.Info.Delete)
} else {
a.state.Board[order.Info.Position].Occupied = true
a.state.Players[order.Player].Armies[UnitID] = order.Info.Position
a.state.Units[UnitID] = &Unit{
ID: UnitID,
Type: order.Info.Type,
Position: order.Info.Position,
Owner: order.Player,
CurrentOrder: Orders{
UnitID: UnitID,
Ordertype: "hold",
OrderOwner: "",
},
}
UnitID += 1
}
}
player.Builds = nil
}
}