X-Git-Url: https://git.auder.net/?a=blobdiff_plain;f=client%2Fsrc%2Fvariants%2FChakart.js;h=1795e30c483ed3db360e0c65e71ec2723431a0ee;hb=7e8a7ea1cb66adb4a987badfb0a3c2f99a21bd0a;hp=119ad5490854225eface2e7a9870adb8a7e03586;hpb=978fa11c8c9838018124a36ec14e06856d948d1e;p=vchess.git diff --git a/client/src/variants/Chakart.js b/client/src/variants/Chakart.js index 119ad549..1795e30c 100644 --- a/client/src/variants/Chakart.js +++ b/client/src/variants/Chakart.js @@ -4,6 +4,7 @@ import { ArrayFun } from "@/utils/array"; import { randInt } from "@/utils/alea"; export class ChakartRules extends ChessRules { + static get PawnSpecs() { return SuicideRules.PawnSpecs; } @@ -148,7 +149,7 @@ export class ChakartRules extends ChessRules { if (['K', 'k', 'L', 'l'].includes(row[i])) kings[row[i]]++; if (V.PIECES.includes(row[i].toLowerCase())) sumElts++; else { - const num = parseInt(row[i]); + const num = parseInt(row[i], 10); if (isNaN(num)) return false; sumElts += num; } @@ -210,24 +211,25 @@ export class ChakartRules extends ChessRules { setOtherVariables(fen) { super.setOtherVariables(fen); - const fenParsed = V.ParseFen(fen); // Initialize captured pieces' counts from FEN + const captured = + V.ParseFen(fen).captured.split("").map(x => parseInt(x, 10)); this.captured = { w: { - [V.ROOK]: parseInt(fenParsed.captured[0]), - [V.KNIGHT]: parseInt(fenParsed.captured[1]), - [V.BISHOP]: parseInt(fenParsed.captured[2]), - [V.QUEEN]: parseInt(fenParsed.captured[3]), - [V.KING]: parseInt(fenParsed.captured[4]), - [V.PAWN]: parseInt(fenParsed.captured[5]), + [V.PAWN]: captured[0], + [V.ROOK]: captured[1], + [V.KNIGHT]: captured[2], + [V.BISHOP]: captured[3], + [V.QUEEN]: captured[4], + [V.KING]: captured[5] }, b: { - [V.ROOK]: parseInt(fenParsed.captured[6]), - [V.KNIGHT]: parseInt(fenParsed.captured[7]), - [V.BISHOP]: parseInt(fenParsed.captured[8]), - [V.QUEEN]: parseInt(fenParsed.captured[9]), - [V.KING]: parseInt(fenParsed.captured[10]), - [V.PAWN]: parseInt(fenParsed.captured[11]), + [V.PAWN]: captured[6], + [V.ROOK]: captured[7], + [V.KNIGHT]: captured[8], + [V.BISHOP]: captured[9], + [V.QUEEN]: captured[10], + [V.KING]: captured[11] } }; this.firstMove = []; @@ -269,7 +271,11 @@ export class ChakartRules extends ChessRules { const end = (color == 'b' && p == V.PAWN ? 7 : 8); for (let i = start; i < end; i++) { for (let j = 0; j < V.size.y; j++) { - if (this.board[i][j] == V.EMPTY || this.getColor(i, j) == 'a') { + if ( + this.board[i][j] == V.EMPTY || + this.getColor(i, j) == 'a' || + this.getPiece(i, j) == V.INVISIBLE_QUEEN + ) { let m = this.getBasicMove({ p: p, x: i, y: j}); m.start = { x: x, y: y }; moves.push(m); @@ -316,7 +322,6 @@ export class ChakartRules extends ChessRules { const L = this.firstMove.length; const fm = this.firstMove[L-1]; switch (fm.end.effect) { - // case 0: a click is required (banana or bomb) case "kingboo": // Exchange position with any piece, // except pawns if arriving on last rank. @@ -366,11 +371,12 @@ export class ChakartRules extends ChessRules { // Helper for getBasicMove() getRandomSquare([x, y], steps) { + const color = this.turn; const validSteps = steps.filter(s => { const [i, j] = [x + s[0], y + s[1]]; return ( V.OnBoard(i, j) && - (this.board[i][j] == V.EMPTY || this.getColor(i, j) == 'a') + (this.board[i][j] == V.EMPTY || this.getColor(i, j) != color) ); }); if (validSteps.length == 0) @@ -389,7 +395,7 @@ export class ChakartRules extends ChessRules { return ( V.OnBoard(x + forward, y) && ( - this.board[x + forward][y] != oppCol || + this.board[x + forward][y] == V.EMPTY || ( V.OnBoard(x + forward, y + 1) && this.board[x + forward][y + 1] != V.EMPTY && @@ -1354,7 +1360,7 @@ export class ChakartRules extends ChessRules { // Play a deterministic one: capture king or material if possible return super.getComputerMove(deterministicMoves); // Play a random effect move, at random: - let move1 = randomMoves[randInt(moves.length)]; + let move1 = randomMoves[randInt(randomMoves.length)]; this.play(move1); let move2 = undefined; if (this.subTurn == 2) { @@ -1397,14 +1403,19 @@ export class ChakartRules extends ChessRules { ) ); } - if ( - move.appear.length == 1 && - move.vanish.length == 1 && - move.appear[0].c == 'a' && - move.vanish[0].c == 'a' - ) { - // Bonus replacement: - return move.appear[0].p.toUpperCase() + "@" + finalSquare; + if (move.appear.length == 1 && move.vanish.length == 1) { + const moveStart = move.appear[0].p.toUpperCase() + "@"; + if (move.appear[0].c == 'a' && move.vanish[0].c == 'a') + // Bonus replacement: + return moveStart + finalSquare; + if ( + move.vanish[0].p == V.INVISIBLE_QUEEN && + move.appear[0].x == move.vanish[0].x && + move.appear[0].y == move.vanish[0].y + ) { + // Toadette takes invisible queen + return moveStart + "Q" + finalSquare; + } } if ( move.appear.length == 2 && @@ -1460,4 +1471,5 @@ export class ChakartRules extends ChessRules { } return notation; } + };