X-Git-Url: https://git.auder.net/?a=blobdiff_plain;f=client%2Fsrc%2Fbase_rules.js;h=4c90f1d87b864fec1a747687a00d949941855e34;hb=2a0672a98b555f0fecfd951d583e69419769d411;hp=aa49f91fa1cbc02bd8476a6be8c8f7b88118872c;hpb=157a72c805261f68aa1adcd4776debf965d7e6cd;p=vchess.git diff --git a/client/src/base_rules.js b/client/src/base_rules.js index aa49f91f..4c90f1d8 100644 --- a/client/src/base_rules.js +++ b/client/src/base_rules.js @@ -112,7 +112,7 @@ export const ChessRules = class ChessRules { return false; } - // Some games are drawn unusually (bottomr right corner is black) + // Some games are drawn unusually (bottom right corner is black) static get DarkBottomRight() { return false; } @@ -158,7 +158,7 @@ export const ChessRules = class ChessRules { // Turn "p" into "bp" (for board) static fen2board(f) { - return f.charCodeAt() <= 90 ? "w" + f.toLowerCase() : "b" + f; + return f.charCodeAt(0) <= 90 ? "w" + f.toLowerCase() : "b" + f; } // Check if FEN describes a board situation correctly @@ -197,7 +197,7 @@ export const ChessRules = class ChessRules { if (V.PIECES.includes(row[i].toLowerCase())) sumElts++; else { const num = parseInt(row[i], 10); - if (isNaN(num)) return false; + if (isNaN(num) || num <= 0) return false; sumElts += num; } } @@ -275,7 +275,7 @@ export const ChessRules = class ChessRules { // En-passant square, if any getEpSquare(moveOrSquare) { - if (!moveOrSquare) return undefined; + if (!moveOrSquare) return undefined; //TODO: necessary line?! if (typeof moveOrSquare === "string") { const square = moveOrSquare; if (square == "-") return undefined; @@ -528,11 +528,11 @@ export const ChessRules = class ChessRules { } // Scan board for kings positions + // TODO: should be done from board, no need for the complete FEN scanKings(fen) { // Squares of white and black king: this.kingPos = { w: [-1, -1], b: [-1, -1] }; const fenRows = V.ParseFen(fen).position.split("/"); - const startRow = { 'w': V.size.x - 1, 'b': 0 }; for (let i = 0; i < fenRows.length; i++) { let k = 0; //column index on board for (let j = 0; j < fenRows[i].length; j++) { @@ -653,22 +653,16 @@ export const ChessRules = class ChessRules { // MOVES GENERATION // All possible moves from selected square - getPotentialMovesFrom([x, y]) { - switch (this.getPiece(x, y)) { - case V.PAWN: - return this.getPotentialPawnMoves([x, y]); - case V.ROOK: - return this.getPotentialRookMoves([x, y]); - case V.KNIGHT: - return this.getPotentialKnightMoves([x, y]); - case V.BISHOP: - return this.getPotentialBishopMoves([x, y]); - case V.QUEEN: - return this.getPotentialQueenMoves([x, y]); - case V.KING: - return this.getPotentialKingMoves([x, y]); + getPotentialMovesFrom(sq) { + switch (this.getPiece(sq[0], sq[1])) { + case V.PAWN: return this.getPotentialPawnMoves(sq); + case V.ROOK: return this.getPotentialRookMoves(sq); + case V.KNIGHT: return this.getPotentialKnightMoves(sq); + case V.BISHOP: return this.getPotentialBishopMoves(sq); + case V.QUEEN: return this.getPotentialQueenMoves(sq); + case V.KING: return this.getPotentialKingMoves(sq); } - return []; //never reached + return []; //never reached (but some variants may use it: Bario...) } // Build a regular move from its initial and destination squares. @@ -681,8 +675,8 @@ export const ChessRules = class ChessRules { new PiPo({ x: ex, y: ey, - c: tr ? tr.c : initColor, - p: tr ? tr.p : initPiece + c: !!tr ? tr.c : initColor, + p: !!tr ? tr.p : initPiece }) ], vanish: [ @@ -719,7 +713,7 @@ export const ChessRules = class ChessRules { let j = y + step[1]; while (V.OnBoard(i, j) && this.board[i][j] == V.EMPTY) { moves.push(this.getBasicMove([x, y], [i, j])); - if (oneStep) continue outerLoop; + if (!!oneStep) continue outerLoop; i += step[0]; j += step[1]; } @@ -898,7 +892,6 @@ export const ChessRules = class ChessRules { // Castling ? const oppCol = V.GetOppCol(c); let moves = []; - let i = 0; // King, then rook: finalSquares = finalSquares || [ [2, 3], [V.size.y - 2, V.size.y - 3] ]; const castlingKing = this.board[x][y].charAt(1); @@ -925,7 +918,7 @@ export const ChessRules = class ChessRules { // Nothing on the path of the king ? (and no checks) const finDist = finalSquares[castleSide][0] - y; let step = finDist / Math.max(1, Math.abs(finDist)); - i = y; + let i = y; do { if ( (!castleInCheck && this.isAttacked([x, i], oppCol)) || @@ -1077,6 +1070,7 @@ export const ChessRules = class ChessRules { } if ( V.OnBoard(rx, ry) && + this.board[rx][ry] != V.EMPTY && this.getPiece(rx, ry) == piece && this.getColor(rx, ry) == color ) { @@ -1178,6 +1172,7 @@ export const ChessRules = class ChessRules { } updateCastleFlags(move, piece, color) { + // TODO: check flags. If already off, no need to always re-evaluate const c = color || V.GetOppCol(this.turn); const firstRank = (c == "w" ? V.size.x - 1 : 0); // Update castling flags if rooks are moved