X-Git-Url: https://git.auder.net/?a=blobdiff_plain;f=client%2Fsrc%2Fvariants%2FCoregal.js;h=d6c736f848e699d23293dc4515617e13e3dddd96;hb=af34341d92d47d14f396e7f4adb81f2a7e9d9a61;hp=704ce4c53624f0e0693b4709643ec202853a45db;hpb=f82609cd2aea6d5ee880773795278948fbfac666;p=vchess.git diff --git a/client/src/variants/Coregal.js b/client/src/variants/Coregal.js index 704ce4c5..d6c736f8 100644 --- a/client/src/variants/Coregal.js +++ b/client/src/variants/Coregal.js @@ -4,7 +4,7 @@ import { randInt, sample } from "@/utils/alea"; export class CoregalRules extends ChessRules { static IsGoodPosition(position) { - if (!super.IsGoodPosition(position)) return false; + if (!ChessRules.IsGoodPosition(position)) return false; const rows = position.split("/"); // Check that at least one queen of each color is there: let queens = {}; @@ -46,7 +46,8 @@ export class CoregalRules extends ChessRules { } } - getCheckSquares(color) { + getCheckSquares() { + const color = this.turn; let squares = []; const oppCol = V.GetOppCol(color); if (this.isAttacked(this.kingPos[color], oppCol)) @@ -80,11 +81,11 @@ export class CoregalRules extends ChessRules { } // Get random squares for king and queen between b and g files - let randIndex = randInt(6); - let kingPos = randIndex + 1; - randIndex = randInt(5); + let randIndex = randInt(6) + 1; + let kingPos = randIndex; + randIndex = randInt(5) + 1; if (randIndex >= kingPos) randIndex++; - let queenPos = randIndex + 1; + let queenPos = randIndex; // Get random squares for rooks to the left and right of the queen // and king: not all squares of the same colors (for bishops). @@ -140,8 +141,8 @@ export class CoregalRules extends ChessRules { pieces[c][bishop2Pos] = "b"; pieces[c][knight2Pos] = "n"; pieces[c][rook2Pos] = "r"; - flags += - [rook1Pos, queenPos, kingPos, rook2Pos].sort().map(V.CoordToColumn).join(""); + flags += [rook1Pos, queenPos, kingPos, rook2Pos] + .sort().map(V.CoordToColumn).join(""); } // Add turn + flags + enpassant return ( @@ -235,8 +236,18 @@ export class CoregalRules extends ChessRules { moves.push( new Move({ appear: [ - new PiPo({ x: x, y: finalSquares[castleSide][0], p: castlingPiece, c: c }), - new PiPo({ x: x, y: finalSquares[castleSide][1], p: V.ROOK, c: c }) + new PiPo({ + x: x, + y: finalSquares[castleSide][0], + p: castlingPiece, + c: c + }), + new PiPo({ + x: x, + y: finalSquares[castleSide][1], + p: V.ROOK, + c: c + }) ], vanish: [ new PiPo({ x: x, y: y, p: castlingPiece, c: c }), @@ -268,18 +279,21 @@ export class CoregalRules extends ChessRules { return false; } - updateCastleFlags(move, piece) { + // "twoKings" arg for the similar Twokings variant. + updateCastleFlags(move, piece, twoKings) { const c = V.GetOppCol(this.turn); const firstRank = (c == "w" ? V.size.x - 1 : 0); // Update castling flags if castling pieces moved or were captured const oppCol = V.GetOppCol(c); const oppFirstRank = V.size.x - 1 - firstRank; - if (move.start.x == firstRank && [V.KING, V.QUEEN].includes(piece)) { - if (this.castleFlags[c][1] == move.start.y) - this.castleFlags[c][1] = 8; - else if (this.castleFlags[c][2] == move.start.y) - this.castleFlags[c][2] = 8; - // Else: the flag is already turned off + if (move.start.x == firstRank) { + if (piece == V.KING || (!twoKings && piece == V.QUEEN)) { + if (this.castleFlags[c][1] == move.start.y) + this.castleFlags[c][1] = 8; + else if (this.castleFlags[c][2] == move.start.y) + this.castleFlags[c][2] = 8; + // Else: the flag is already turned off + } } else if ( move.start.x == firstRank && //our rook moves? @@ -289,7 +303,8 @@ export class CoregalRules extends ChessRules { this.castleFlags[c][flagIdx] = 8; } else if ( move.end.x == oppFirstRank && //we took opponent rook? - [this.castleFlags[oppCol][0], this.castleFlags[oppCol][3]].includes(move.end.y) + [this.castleFlags[oppCol][0], this.castleFlags[oppCol][3]] + .includes(move.end.y) ) { const flagIdx = (move.end.y == this.castleFlags[oppCol][0] ? 0 : 3); this.castleFlags[oppCol][flagIdx] = 8;