diff --git a/packages/boop-game/src/game/boop.ts b/packages/boop-game/src/game/boop.ts index 6cc32bd..366eb78 100644 --- a/packages/boop-game/src/game/boop.ts +++ b/packages/boop-game/src/game/boop.ts @@ -193,7 +193,6 @@ export function placePiece(host: MutableSignal, row: number, col: num } export function applyBoops(host: MutableSignal, placedRow: number, placedCol: number, placedType: PieceType) { - const board = getBoardRegion(host); const pieces = host.value.pieces; const piecesArray = Object.values(pieces); @@ -216,39 +215,49 @@ export function applyBoops(host: MutableSignal, placedRow: number, pl } } - for (const { part, dr, dc } of piecesToBoop) { - const [r, c] = part.position; - const newRow = r + dr; - const newCol = c + dc; + host.produce(state => { + const board = state.board; + const currentPieces = state.pieces; - if (newRow < 0 || newRow >= BOARD_SIZE || newCol < 0 || newCol >= BOARD_SIZE) { - const pt = part.pieceType; - const pl = part.player; - const playerData = getPlayer(host, pl); - removePieceFromBoard(host, part); - incrementSupply(playerData, pt); - continue; + for (const { part, dr, dc } of piecesToBoop) { + const [r, c] = part.position; + const newRow = r + dr; + const newCol = c + dc; + + if (newRow < 0 || newRow >= BOARD_SIZE || newCol < 0 || newCol >= BOARD_SIZE) { + const pt = part.pieceType; + const pl = part.player; + const playerData = state.players[pl]; + // Remove piece from board + board.childIds = board.childIds.filter(id => id !== part.id); + delete board.partMap[part.position.join(',')]; + delete currentPieces[part.id]; + playerData[pt].placed--; + playerData[pt].supply++; + continue; + } + + // Check if target cell is occupied + const targetPosKey = `${newRow},${newCol}`; + if (board.partMap[targetPosKey]) continue; + + // Move piece to new position + delete board.partMap[part.position.join(',')]; + part.position = [newRow, newCol]; + board.partMap[targetPosKey] = part.id; } - - if (isCellOccupied(host, newRow, newCol)) continue; - - part.position = [newRow, newCol]; - board.partMap = Object.fromEntries( - board.childIds.map(id => { - const p = pieces[id]; - return [p.position.join(','), id]; - }) - ); - } + }); } export function removePieceFromBoard(host: MutableSignal, part: BoopPart) { - const board = getBoardRegion(host); - const playerData = getPlayer(host, part.player); - board.childIds = board.childIds.filter(id => id !== part.id); - delete board.partMap[part.position.join(',')]; - delete host.value.pieces[part.id]; - playerData[part.pieceType].placed--; + host.produce(state => { + const board = state.board; + const playerData = state.players[part.player]; + board.childIds = board.childIds.filter(id => id !== part.id); + delete board.partMap[part.position.join(',')]; + delete state.pieces[part.id]; + playerData[part.pieceType].placed--; + }); } const DIRECTIONS: [number, number][] = [