blob: b174a95686f6e9e5f1a50afd4be868dfcd167d2c (
plain)
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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
|
package game
import (
"errors"
"net/http"
)
var (
ErrNotYourTurn = errors.New("Not your turn")
ErrEventDoesNotPermit = errors.New("Event does not permit this action")
ErrNotEnoughMoney = errors.New("Not enough money")
ErrNotInJail = errors.New("Not in jail")
ErrNotEnoughPardons = errors.New("Not enough pardons")
)
func ErrStatusCode(err error) int {
switch {
case errors.Is(err, ErrNotYourTurn), errors.Is(err, ErrNotInJail):
return http.StatusForbidden
case errors.Is(err, ErrEventDoesNotPermit):
return http.StatusConflict
case errors.Is(err, ErrNotEnoughMoney), errors.Is(err, ErrNotEnoughPardons):
return http.StatusBadRequest
default:
return http.StatusInternalServerError
}
}
func (ctx *Context) ValidateIsTurn(userUUID string) error {
if ctx.GetCurrentTurnPlayer().UserUUID != userUUID {
return ErrNotYourTurn
}
return nil
}
func (ctx *Context) ValidateCanBuy(userUUID string) error {
player := ctx.Players.Alive[ctx.Turn.Current.Index()]
prop := ColorProperties[BoardSpaces[player.CurrentSpaceID.Index()].SubIndexID]
if err := ctx.ValidateIsTurn(userUUID); err != nil {
return err
}
if ctx.EventPeek() != EventLandUnowned {
return ErrEventDoesNotPermit
}
if player.Money < prop.Price {
return ErrNotEnoughMoney
}
return nil
}
func (ctx *Context) ValidateCanRoll(userUUID string) error {
if err := ctx.ValidateIsTurn(userUUID); err != nil {
return err
}
if !(ctx.EventPeek() == EventRollDice || ctx.EventPeek() == EventJail) {
return ErrEventDoesNotPermit
}
return nil
}
func (ctx *Context) ValidateCanEndTurn(userUUID string) error {
if err := ctx.ValidateIsTurn(userUUID); err != nil {
return err
}
if ctx.EventPeek() != EventEndTurn {
return ErrEventDoesNotPermit
}
if ctx.GetCurrentTurnPlayer().Money >= 0 {
return ErrNotEnoughMoney
}
return nil
}
func (ctx *Context) ValidateCanPardonJail(userUUID string) error {
if err := ctx.ValidateIsTurn(userUUID); err != nil {
return err
}
if ctx.EventPeek() != EventJail {
return ErrEventDoesNotPermit
}
inJail := false
for _, iJV := range ctx.Visitors.InJail {
if ctx.Players.Alive[iJV.VisitorID.Index()].UserUUID == userUUID {
inJail = true
}
}
if !inJail {
return ErrNotInJail
}
player := ctx.Players.Alive[ctx.Turn.Current.Index()]
if player.PardonCards == 0 {
return ErrNotEnoughPardons
}
return nil
}
func (ctx *Context) ValidateCanBuyoutJail(userUUID string) error {
if err := ctx.ValidateIsTurn(userUUID); err != nil {
return err
}
if ctx.EventPeek() != EventJail {
return ErrEventDoesNotPermit
}
inJail := false
for _, iJV := range ctx.Visitors.InJail {
if ctx.Players.Alive[iJV.VisitorID.Index()].UserUUID == userUUID {
inJail = true
}
}
if !inJail {
return ErrNotInJail
}
player := ctx.Players.Alive[ctx.Turn.Current.Index()]
if player.Money < JailBuyoutCost {
return ErrNotEnoughMoney
}
return nil
}
|