fix: some boop states are not updated in produce

This commit is contained in:
hypercross 2026-04-04 15:23:56 +08:00
parent aba035f2ec
commit 0dbb4fc2ba
1 changed files with 38 additions and 29 deletions

View File

@ -193,7 +193,6 @@ export function placePiece(host: MutableSignal<BoopState>, row: number, col: num
}
export function applyBoops(host: MutableSignal<BoopState>, 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<BoopState>, 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<BoopState>, 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][] = [