X-Git-Url: https://git.auder.net/assets/icon_close.svg?a=blobdiff_plain;f=client%2Fsrc%2Fbase_rules.js;h=71fa13cfaa4e756d96b7e04445ec009d14964620;hb=7c8d5dc740c701b2f744fe492753a876270ac689;hp=cd4bb77805a483e516afc2eca5c373e3984f123c;hpb=1c58eb76b86d89b9aad29920240b12451f77ab95;p=vchess.git diff --git a/client/src/base_rules.js b/client/src/base_rules.js index cd4bb778..71fa13cf 100644 --- a/client/src/base_rules.js +++ b/client/src/base_rules.js @@ -132,8 +132,7 @@ export const ChessRules = class ChessRules { for (let row of rows) { let sumElts = 0; for (let i = 0; i < row.length; i++) { - if (['K','k'].includes(row[i])) - kings[row[i]] = true; + if (['K','k'].includes(row[i])) kings[row[i]] = true; if (V.PIECES.includes(row[i].toLowerCase())) sumElts++; else { const num = parseInt(row[i]); @@ -144,8 +143,7 @@ export const ChessRules = class ChessRules { if (sumElts != V.size.y) return false; } // Both kings should be on board: - if (Object.keys(kings).length != 2) - return false; + if (Object.keys(kings).length != 2) return false; return true; } @@ -433,7 +431,7 @@ export const ChessRules = class ChessRules { // Extract (relevant) flags from fen setFlags(fenflags) { // white a-castle, h-castle, black a-castle, h-castle - this.castleFlags = { w: [true, true], b: [true, true] }; + this.castleFlags = { w: [-1, -1], b: [-1, -1] }; for (let i = 0; i < 4; i++) { this.castleFlags[i < 2 ? "w" : "b"][i % 2] = V.ColumnToCoord(fenflags.charAt(i)); @@ -810,7 +808,8 @@ export const ChessRules = class ChessRules { return moves; } - getCastleMoves([x, y]) { + // "castleInCheck" arg to let some variants castle under check + getCastleMoves([x, y], castleInCheck) { const c = this.getColor(x, y); if (x != (c == "w" ? V.size.x - 1 : 0) || y != this.INIT_COL_KING[c]) return []; //x isn't first rank, or king has moved (shortcut) @@ -832,7 +831,9 @@ export const ChessRules = class ChessRules { if (this.castleFlags[c][castleSide] >= V.size.y) continue; // If this code is reached, rooks and king are on initial position + // NOTE: in some variants this is not a rook, but let's keep variable name const rookPos = this.castleFlags[c][castleSide]; + const castlingPiece = this.getPiece(x, rookPos); if (this.getColor(x, rookPos) != c) // Rook is here but changed color (see Benedict) continue; @@ -843,11 +844,11 @@ export const ChessRules = class ChessRules { i = y; do { if ( - this.isAttacked([x, i], oppCol) || + (!castleInCheck && this.isAttacked([x, i], oppCol)) || (this.board[x][i] != V.EMPTY && // NOTE: next check is enough, because of chessboard constraints (this.getColor(x, i) != c || - ![V.KING, V.ROOK].includes(this.getPiece(x, i)))) + ![V.KING, castlingPiece].includes(this.getPiece(x, i)))) ) { continue castlingCheck; } @@ -876,11 +877,11 @@ export const ChessRules = class ChessRules { new Move({ appear: [ new PiPo({ x: x, y: finalSquares[castleSide][0], p: V.KING, c: c }), - new PiPo({ x: x, y: finalSquares[castleSide][1], p: V.ROOK, c: c }) + new PiPo({ x: x, y: finalSquares[castleSide][1], p: castlingPiece, c: c }) ], vanish: [ new PiPo({ x: x, y: y, p: V.KING, c: c }), - new PiPo({ x: x, y: rookPos, p: V.ROOK, c: c }) + new PiPo({ x: x, y: rookPos, p: castlingPiece, c: c }) ], end: Math.abs(y - rookPos) <= 2 @@ -1078,13 +1079,15 @@ export const ChessRules = class ChessRules { this.postPlay(move); } - updateCastleFlags(move) { + updateCastleFlags(move, piece) { const c = V.GetOppCol(this.turn); const firstRank = (c == "w" ? V.size.x - 1 : 0); // Update castling flags if rooks are moved const oppCol = V.GetOppCol(c); const oppFirstRank = V.size.x - 1 - firstRank; - if ( + if (piece == V.KING && move.appear.length > 0) + this.castleFlags[c] = [V.size.y, V.size.y]; + else if ( move.start.x == firstRank && //our rook moves? this.castleFlags[c].includes(move.start.y) ) { @@ -1114,10 +1117,9 @@ export const ChessRules = class ChessRules { if (piece == V.KING && move.appear.length > 0) { this.kingPos[c][0] = move.appear[0].x; this.kingPos[c][1] = move.appear[0].y; - if (V.HasCastle) this.castleFlags[c] = [V.size.y, V.size.y]; return; } - if (V.HasCastle) this.updateCastleFlags(move); + if (V.HasCastle) this.updateCastleFlags(move, piece); } preUndo() {} @@ -1151,14 +1153,11 @@ export const ChessRules = class ChessRules { // What is the score ? (Interesting if game is over) getCurrentScore() { - if (this.atLeastOneMove()) - return "*"; - + if (this.atLeastOneMove()) return "*"; // Game over const color = this.turn; // No valid move: stalemate or checkmate? - if (!this.isAttacked(this.kingPos[color], V.GetOppCol(color))) - return "1/2"; + if (!this.underCheck(color)) return "1/2"; // OK, checkmate return (color == "w" ? "0-1" : "1-0"); }