}
case 4:
- // TODO: GO TO JAIL
+ InJailVisitors = append(InJailVisitors, InJailVisitor{visitorID: visitorID, turns: DEFAULT_JAIL_TURNS})
case 5:
MoveQueue = append(MoveQueue, GetPlayerMoveDistance(currentPos, ReadingRailroadSpaceID))
case 6:
case 12:
AdjustPlayerMoney(visitorID, 25)
case 13:
- // TODO: GO TO JAIL
+ InJailVisitors = append(InJailVisitors, InJailVisitor{visitorID: visitorID, turns: DEFAULT_JAIL_TURNS})
case 14:
// TODO: GET OUT OF JAIL FREE
case 15:
var Users []User
var DebtEvents []int32
+var MoveablePlayers []int32
var MoveQueue []int32
var ModifierRailroadRentMultiplier int32 = 1
var TurnEndedSignal bool = false
var DiceRollsRemaining int32 = 1
var numDiceRolled int32 = 0
-var Doubles bool = false
+var RolledDoubles bool = false
func ValidateCanRoll(UUID string) bool {
if Users[TurnPlayerID].UUID == UUID && DiceRollsRemaining > 0 {
return true
}
+func ProcessLanding() {
+ ProcessGo()
+ ProcessTax()
+
+ ProcessOwnedColors()
+ ProcessOwnedUtility()
+ ProcessOwnedRailroad()
+
+ ProcessChance()
+ ProcessChest()
+ // ProcessPolice()
+
+ ProcessJail()
+}
+
func RollDice() {
// Roll Dice
diceRoll1 := RandSrc.Int32N(6) + 1
numDiceRolled++
if diceRoll1 == diceRoll2 {
- Doubles = true
+ RolledDoubles = true
DiceRollsRemaining++
+ RemovePlayerFromJail(TurnPlayerID)
}
if numDiceRolled >= 3 {
- // TODO: GO TO JAIL
- }
-
- // Movement
- for {
- // condition to stop moving
- if len(MoveQueue) == 0 {
- break
- }
-
- // does one movement
- // TODO: prevent movement while in JAIL
- ProcessMovement()
-
- ProcessGo()
- ProcessTax()
-
- ProcessOwnedColors()
- ProcessOwnedUtility()
- ProcessOwnedRailroad()
-
- ProcessChance()
- ProcessChest()
-
- // ProcessPolice()
- // ProcessJail()
+ InJailVisitors = append(InJailVisitors, InJailVisitor{visitorID: TurnPlayerID, turns: DEFAULT_JAIL_TURNS})
}
}
func EndTurn() {
+ // next player's turn
TurnPlayerID = (TurnPlayerID + 1) % int32(len(Users))
TurnEndedSignal = false
+
+ // reset dice
DiceRollsRemaining = 1
numDiceRolled = 0
- Doubles = false
+ RolledDoubles = false
+
+ // let player move next turn
+ MoveQueue = MoveQueue[:0]
}
--- /dev/null
+package game
+
+const DEFAULT_JAIL_TURNS int32 = 3
+
+func RemovePlayerFromJail(playerID int32) {
+ for i, iJV := range InJailVisitors {
+ if playerID == iJV.visitorID {
+ InJailVisitors[i] = InJailVisitors[len(InJailVisitors)-1]
+ InJailVisitors = InJailVisitors[:len(InJailVisitors)-1]
+
+ }
+
+ }
+}
+
+func RemovePlayerFromMoveable(pID int32) {
+ for i, playerID := range MoveablePlayers {
+ if pID == playerID {
+ MoveablePlayers[i] = MoveablePlayers[len(MoveablePlayers)-1]
+ MoveablePlayers = MoveablePlayers[:len(MoveablePlayers)-1]
+ }
+ }
+}
+
+func ProcessJail() {
+ for _, iJV := range InJailVisitors {
+ visitorID := iJV.visitorID
+ turns := iJV.turns
+
+ if turns <= 0 {
+ RemovePlayerFromJail(visitorID)
+ MoveablePlayers = append(MoveablePlayers, visitorID)
+ } else {
+ RemovePlayerFromMoveable(visitorID)
+ }
+
+ }
+}
propertyID int32
}
+type InJailVisitor struct {
+ visitorID int32
+ turns int32
+}
+
var (
UnownedPropertyVisitors []UnownedPropertyVisitor
OwnedColorVisitors []OwnedColorVisitor
TaxVisitors []int32
ChanceVisitors []int32
ChestVisitors []int32
- JailVisitors []int32
+ InJailVisitors []InJailVisitor
ParkingVisitors []int32
PoliceVisitors []int32
)
+func AllowedToMove(playerID int32) bool {
+ for _, pID := range MoveablePlayers {
+ if playerID == pID {
+ return true
+ }
+ }
+ return false
+}
+
func ProcessMovement() {
- dist := MoveQueue[0]
- MoveQueue = MoveQueue[1:]
- player := Users[TurnPlayerID]
- AdvancePlayer(TurnPlayerID, player.CurrentSpaceID, dist)
+ for i, playerID := range MoveablePlayers {
+ if playerID == TurnPlayerID {
+
+ // Movement
+ for {
+ // condition to stop moving
+ if len(MoveQueue) == 0 {
+ // player can no longer move
+ MoveablePlayers[i] = MoveablePlayers[len(MoveablePlayers)-1]
+ MoveablePlayers = MoveablePlayers[:len(MoveablePlayers)-1]
+ break
+ }
+
+ dist := MoveQueue[0]
+ MoveQueue = MoveQueue[1:]
+ player := Users[playerID]
+ AdvancePlayer(playerID, player.CurrentSpaceID, dist)
+
+ ProcessLanding()
+ }
+
+ }
+
+ }
+
}
func CalculateNextPos(currentPosition int32, distance int32) int32 {
numGoPasses := (currentPosition + diceRoll) / (int32(len(BoardSpaces)) - 1)
if numGoPasses > 0 {
- for _ = range numGoPasses {
+ for range numGoPasses {
GoVisitors = append(GoVisitors, playerID)
}
}
TaxVisitors = append(TaxVisitors, playerID)
// case TypeParking: // nothing ever happens
// ParkingVisitors = append(ParkingVisitors, playerID)
- case TypePolice:
- PoliceVisitors = append(PoliceVisitors, playerID)
+ case TypePolice: // hardcoding to send straight to jail
+ InJailVisitors = append(InJailVisitors, InJailVisitor{visitorID: playerID, turns: DEFAULT_JAIL_TURNS})
case TypeJail:
- JailVisitors = append(JailVisitors, playerID)
+ InJailVisitors = append(InJailVisitors, InJailVisitor{visitorID: playerID, turns: DEFAULT_JAIL_TURNS})
case TypeColor:
propIndex := SpaceToOwnableProperty[nextPos]
if PropertyOwners[propIndex] != -1 { // property owned?
func rollDiceHandler(w http.ResponseWriter, req *http.Request) {
if game.ValidateCanRoll(UUID) {
game.RollDice()
+ game.ProcessMovement()
}
}