X-Git-Url: https://git.auder.net/?a=blobdiff_plain;f=client%2Fsrc%2Fvariants%2FMonochrome.js;h=919e7703fe95360020f42262353406a382006e0f;hb=0fbe4ffafd65f35ad939134cc89b8bafcc4cd5ca;hp=b17b6f1ff7218631352b138732efd29968dc0f96;hpb=ad030c7d24804fbfa06158e93d89a3f101d2c8b3;p=vchess.git diff --git a/client/src/variants/Monochrome.js b/client/src/variants/Monochrome.js index b17b6f1f..919e7703 100644 --- a/client/src/variants/Monochrome.js +++ b/client/src/variants/Monochrome.js @@ -6,6 +6,10 @@ export class MonochromeRules extends ChessRules { return false; } + static get HasFlags() { + return false; + } + static get Lines() { return [ [[4, 0], [4, 8]] ]; } @@ -23,7 +27,7 @@ export class MonochromeRules extends ChessRules { for (let i = 0; i < row.length; i++) { if (V.PIECES.includes(row[i])) sumElts++; else { - const num = parseInt(row[i]); + const num = parseInt(row[i], 10); if (isNaN(num)) return false; sumElts += num; } @@ -45,7 +49,19 @@ export class MonochromeRules extends ChessRules { // Trim all non-capturing moves static KeepCaptures(moves) { - return moves.filter(m => m.vanish.length == 2 && m.appear.length == 1); + return moves.filter(m => m.vanish.length == 2); + } + + getPotentialKnightMoves(sq) { + // Knight becomes knightrider: + return this.getSlideNJumpMoves(sq, V.steps[V.KNIGHT]); + } + + getPotentialKingMoves(sq) { + // King become queen: + return ( + this.getSlideNJumpMoves(sq, V.steps[V.ROOK].concat(V.steps[V.BISHOP])) + ); } getAllPotentialMoves() { @@ -88,9 +104,7 @@ export class MonochromeRules extends ChessRules { for (let j = 0; j < V.size.y; j++) { if ( this.board[i][j] != V.EMPTY && - this.getPotentialMovesFrom([i, j]).some(m => - // Warning: discard castle moves - m.vanish.length == 2 && m.appear.length == 1) + this.getPotentialMovesFrom([i, j]).some(m => m.vanish.length == 2) ) { return true; } @@ -120,7 +134,7 @@ export class MonochromeRules extends ChessRules { } getCurrentScore() { - // Is there anything in my half board? + // Is there anything in opponent's half board? const color = V.GetOppCol(this.turn); const xBounds = color == 'w' ? [4,7] : [0,3]; let nothingHere = true; @@ -138,13 +152,17 @@ export class MonochromeRules extends ChessRules { } static GenRandInitFen(randomness) { - // Remove the en-passant part of the FEN - const fen = ChessRules.GenRandInitFen(randomness).slice(0, -2); + // Remove the en-passant + castle part of the FEN + let fen = ChessRules.GenRandInitFen(randomness).slice(0, -6); + // Move pawns up: + fen = fen.replace("pppppppp/8","8/pppppppp") + .replace("8/PPPPPPPP","PPPPPPPP/8"); const firstSpace = fen.indexOf(' '); - return ( + // Paint it black: + fen = fen.substr(0, firstSpace).replace(/[A-Z]/g, (c) => c.toLowerCase()) + - fen.substr(firstSpace) - ); + fen.substr(firstSpace); + return fen; } static get SEARCH_DEPTH() { @@ -164,4 +182,33 @@ export class MonochromeRules extends ChessRules { } return evaluation; } + + getNotation(move) { + // Translate initial square (because pieces may fly unusually!) + const initialSquare = V.CoordsToSquare(move.start); + + // Translate final square + const finalSquare = V.CoordsToSquare(move.end); + + let notation = ""; + const piece = this.getPiece(move.start.x, move.start.y); + if (piece == V.PAWN) { + // pawn move (TODO: enPassant indication) + if (move.vanish.length == 2) { + // capture + notation = initialSquare + "x" + finalSquare; + } + else notation = finalSquare; + if (piece != move.appear[0].p) + //promotion + notation += "=" + move.appear[0].p.toUpperCase(); + } + else { + // Piece movement + notation = piece.toUpperCase(); + if (move.vanish.length > 1) notation += initialSquare + "x"; + notation += finalSquare; + } + return notation; + } };