]> Skullheadx's Git Forge - monopoly-web.git/commitdiff
escape jail
authorSkullheadx <admonty1@protonmail.com>
Mon, 18 May 2026 03:26:44 +0000 (23:26 -0400)
committerSkullheadx <admonty1@protonmail.com>
Mon, 18 May 2026 03:26:44 +0000 (23:26 -0400)
game/chance.go
game/chest.go
game/game.go
game/jail.go
game/movement.go
game/types.go
main.go
types/types.go [deleted file]

index 756fb01b23c76430bc1044709ea516bfeebac769..5874a101675cef75d518faab737ff4540322fc9d 100644 (file)
@@ -70,7 +70,7 @@ func ProcessChance() {
                case 6:
                        MoveQueue = append(MoveQueue, GetPlayerMoveDistance(currentPos, GoSpaceID))
                case 7:
-               // TODO: GET OUT OF JAIL FREE
+                       Users[visitorID].GetOutOfJailCards++
                case 8:
                        MoveQueue = append(MoveQueue, GetPlayerMoveDistance(currentPos, BoardwalkSpaceID))
                case 9:
index 7f0b34875fad372d931346b91a383cad7dac81d9..1664dc6b2b0ba92b1054e6d11be1b97f4a5fa223 100644 (file)
@@ -76,7 +76,7 @@ func ProcessChest() {
                case 13:
                        InJailVisitors = append(InJailVisitors, InJailVisitor{visitorID: visitorID, turns: DEFAULT_JAIL_TURNS})
                case 14:
-                       // TODO: GET OUT OF JAIL FREE
+                       Users[visitorID].GetOutOfJailCards++
                case 15:
                        AdjustPlayerMoney(visitorID, 10)
                }
index ef774efe9ba871d1624e296e7b44be5ccea68e68..e147eb460139abe89c7a2c08e490d30580b811e4 100644 (file)
@@ -36,6 +36,16 @@ func ValidateCanEndTurn(UUID string) bool {
        return true
 }
 
+func ValidateCanExitJail(UUID string) bool {
+       for _, iJV := range InJailVisitors {
+               player := Users[iJV.visitorID]
+               if Users[TurnPlayerID].UUID == UUID && player.UUID == UUID {
+                       return true
+               }
+       }
+       return false
+}
+
 func ProcessLanding() {
        ProcessGo()
        ProcessTax()
index a1387d4c1b4f4b1b33053b6556cb11456a6b334e..b8211a9f5080a6e88eb826e6a6e00f27fe1555b0 100644 (file)
@@ -1,6 +1,11 @@
 package game
 
+import (
+       "errors"
+)
+
 const DEFAULT_JAIL_TURNS int32 = 3
+const JAIL_BUYOUT_COST int32 = 50
 
 func RemovePlayerFromJail(playerID int32) {
        for i, iJV := range InJailVisitors {
@@ -11,6 +16,7 @@ func RemovePlayerFromJail(playerID int32) {
                }
 
        }
+       MoveablePlayers = append(MoveablePlayers, playerID)
 }
 
 func RemovePlayerFromMoveable(pID int32) {
@@ -29,10 +35,33 @@ func ProcessJail() {
 
                if turns <= 0 {
                        RemovePlayerFromJail(visitorID)
-                       MoveablePlayers = append(MoveablePlayers, visitorID)
                } else {
                        RemovePlayerFromMoveable(visitorID)
                }
 
        }
 }
+
+var ErrNotEnoughJailCards = errors.New("Cannot use jail card: player does not have enough get out of jail free cards")
+var ErrNotEnoughMoney = errors.New("Cannot execute action: player does not have enough money")
+
+func JailUseCard() error {
+       if Users[TurnPlayerID].GetOutOfJailCards > 0 {
+               RemovePlayerFromJail(TurnPlayerID)
+               Users[TurnPlayerID].GetOutOfJailCards -= 1
+               return nil
+
+       } else {
+               return ErrNotEnoughJailCards
+       }
+}
+
+func JailBuyout() error {
+       if Users[TurnPlayerID].Money >= JAIL_BUYOUT_COST {
+               RemovePlayerFromJail(TurnPlayerID)
+               AdjustPlayerMoney(TurnPlayerID, -JAIL_BUYOUT_COST)
+               return nil
+       } else {
+               return ErrNotEnoughMoney
+       }
+}
index 284e91bf7fe850bd4e982e35ac520ca72d721024..8c64ec1bc26fd57d6fc73ec790bf8d778e1f19c7 100644 (file)
@@ -304,7 +304,6 @@ func AllowedToMove(playerID int32) bool {
 func ProcessMovement() {
        for i, playerID := range MoveablePlayers {
                if playerID == TurnPlayerID {
-
                        // Movement
                        for {
                                // condition to stop moving
index 8d104e6907236d1d6a9e7955f858e54e0f32704f..a4fc9e9006873bef929b8fdd2a10d07e0a85f20b 100644 (file)
@@ -1,9 +1,10 @@
 package game
 
 type User struct {
-       UUID           string
-       Money          int32
-       CurrentSpaceID int32
+       UUID              string
+       Money             int32
+       CurrentSpaceID    int32
+       GetOutOfJailCards int32
 }
 
 type PropertyType int
diff --git a/main.go b/main.go
index 3303452c3d0c12cd520facb5ccd6a15c3c787d0c..01ad29d21d347dbb31c92db3ef1fb7a90641fbda 100644 (file)
--- a/main.go
+++ b/main.go
@@ -11,13 +11,14 @@ import (
 func main() {
        fmt.Println("monopoly-web backend")
 
-       game.Users = append(game.Users, game.User{UUID: "abc", Money: 100, CurrentSpaceID: 0})
+       game.Users = append(game.Users, game.User{UUID: "abc", Money: 100, CurrentSpaceID: 0, GetOutOfJailCards: 0})
        fmt.Println(game.Users)
 
        // register routes
        http.HandleFunc("/health", healthHandler)
        http.HandleFunc("/api/v1/roll", rollDiceHandler)
        http.HandleFunc("POST /api/v1/turn", endTurnHandler)
+       http.HandleFunc("POST /api/v1/exit-jail", exitJailHandler)
 
        // listen and serve
        log.Fatal(http.ListenAndServe(":8080", nil))
@@ -41,3 +42,39 @@ func endTurnHandler(w http.ResponseWriter, req *http.Request) {
                game.EndTurn()
        }
 }
+
+func exitJailHandler(w http.ResponseWriter, req *http.Request) {
+       err := req.ParseForm()
+       if err != nil {
+               http.Error(w, "Bad Request: Failed to parse form data", http.StatusBadRequest)
+               return
+       }
+
+       if !game.ValidateCanExitJail(UUID) {
+               w.WriteHeader(http.StatusForbidden)
+               w.Write([]byte(`{"status": "forbidden", "message": "Not your turn or not in jail"}`))
+       }
+
+       method := req.PostForm.Get("method")
+
+       switch method {
+       case "buyout":
+               err = game.JailBuyout()
+               if err == game.ErrNotEnoughMoney {
+                       http.Error(w, "error: Insufficient funds", http.StatusUnprocessableEntity)
+               }
+
+       case "jail_free_card":
+               err = game.JailUseCard()
+               if err == game.ErrNotEnoughJailCards {
+                       http.Error(w, "error: Insufficient jail cards", http.StatusUnprocessableEntity)
+               }
+       default:
+               w.WriteHeader(http.StatusBadRequest)
+               w.Write([]byte(`{"status": "bad req", "message": "escape jail method does not exist"}`))
+               return
+       }
+
+       w.WriteHeader(http.StatusOK)
+       w.Write([]byte(`{"status": "success", "message": "Action processed"}`))
+}
diff --git a/types/types.go b/types/types.go
deleted file mode 100644 (file)
index 7e75639..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-package game
-
-type User struct {
-       UUID  string
-       Money int32
-}
-
-type PropertyType int
-
-const (
-       TypeGo PropertyType = iota
-       TypeColor
-       TypeChest
-       TypeTax
-       TypeRailroad
-       TypeChance
-       TypeJail
-       TypeUtility
-       TypeParking
-       TypePolice
-)