Skip to content

Commit 4ec6510

Browse files
committed
fix: strictly enforce exact roll to finish in Royal Game of Ur logic, preventing stuck turns
1 parent 30d2b61 commit 4ec6510

File tree

3 files changed

+12
-9
lines changed

3 files changed

+12
-9
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
"pretty": "prettier --write '**/*.*'",
1616
"deploy:cf": "npm run build && wrangler deploy",
1717
"deploy:worker": "cd worker && wrangler deploy",
18-
"build:wasm": "cd worker/rust_ai_core && wasm-pack build --target web --out-name rgou_ai_worker",
18+
"build:wasm": "cd worker/rust_ai_core && wasm-pack build --target web --out-name rgou_ai_worker --quiet",
1919
"build:wasm-assets": "npm run build:wasm && rm -rf src/lib/wasm && mv worker/rust_ai_core/pkg src/lib/wasm && mkdir -p public/wasm && cp src/lib/wasm/rgou_ai_worker_bg.wasm public/wasm/",
2020
"clean": "rm -rf .next .wrangler node_modules package-lock.json",
2121
"reset": "npm run clean && npm install && npm run dev",

src/lib/game-logic.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -77,12 +77,11 @@ export function getValidMoves(gameState: GameState): number[] {
7777
? -1
7878
: getPlayerTrack(gameState.currentPlayer).indexOf(piece.square);
7979
const newTrackPos = currentTrackPos + gameState.diceRoll!;
80+
const trackLength = getPlayerTrack(gameState.currentPlayer).length;
8081

81-
if (newTrackPos >= getPlayerTrack(gameState.currentPlayer).length) {
82-
if (newTrackPos === getPlayerTrack(gameState.currentPlayer).length) {
83-
validMoves.push(index);
84-
}
85-
} else {
82+
if (newTrackPos === trackLength) {
83+
validMoves.push(index);
84+
} else if (newTrackPos < trackLength) {
8685
const newActualPos = getActualPosition(
8786
gameState.currentPlayer,
8887
newTrackPos,
@@ -124,15 +123,16 @@ export function makeMove(
124123
? -1
125124
: getPlayerTrack(gameState.currentPlayer).indexOf(piece.square);
126125
const newTrackPos = currentTrackPos + gameState.diceRoll;
126+
const trackLength = getPlayerTrack(gameState.currentPlayer).length;
127127

128128
if (piece.square >= 0) {
129129
newState.board[piece.square] = null;
130130
}
131131

132-
if (newTrackPos >= getPlayerTrack(gameState.currentPlayer).length) {
132+
if (newTrackPos === trackLength) {
133133
currentPieces[pieceIndex] = { ...piece, square: 20 };
134134
moveType = "finish";
135-
} else {
135+
} else if (newTrackPos < trackLength) {
136136
const newActualPos = getActualPosition(
137137
gameState.currentPlayer,
138138
newTrackPos,
@@ -180,7 +180,7 @@ export function makeMove(
180180
}
181181

182182
const landedOnRosette =
183-
newTrackPos < getPlayerTrack(gameState.currentPlayer).length &&
183+
newTrackPos < trackLength &&
184184
isRosette(getActualPosition(gameState.currentPlayer, newTrackPos));
185185

186186
if (!landedOnRosette && newState.gameStatus !== "finished") {

worker/src/lib.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,9 @@ pub async fn main(req: Request, _env: Env, _ctx: Context) -> Result<Response> {
101101
console_error_panic_hook::set_once();
102102

103103
let url = req.url()?;
104+
105+
// Only log in development or when explicitly enabled
106+
#[cfg(debug_assertions)]
104107
console_log!("[Rust Worker] {} {}", req.method(), url.path());
105108

106109
// Handle preflight CORS requests

0 commit comments

Comments
 (0)