X-Git-Url: https://git.auder.net/?a=blobdiff_plain;f=client%2Fsrc%2Fvariants%2FHiddenqueen.js;h=1ce85bea997ef7b083ad0b2d50a13f6082359ab4;hb=4313762da3237b04f204e121a20cab3ba7bb5dd2;hp=f8247856add80cbcb035eeedf2f406aed217a89d;hpb=00eef1ca12534a43cb8e2e12155a46c00353eac2;p=vchess.git diff --git a/client/src/variants/Hiddenqueen.js b/client/src/variants/Hiddenqueen.js index f8247856..1ce85bea 100644 --- a/client/src/variants/Hiddenqueen.js +++ b/client/src/variants/Hiddenqueen.js @@ -3,6 +3,7 @@ import { ArrayFun } from "@/utils/array"; import { randInt } from "@/utils/alea"; export class HiddenqueenRules extends ChessRules { + // Analyse in Hiddenqueen mode makes no sense static get CanAnalyze() { return false; @@ -42,6 +43,31 @@ export class HiddenqueenRules extends ChessRules { return b; } + getEpSquare(moveOrSquare) { + if (!moveOrSquare) return undefined; + if (typeof moveOrSquare === "string") { + const square = moveOrSquare; + if (square == "-") return undefined; + return V.SquareToCoords(square); + } + const move = moveOrSquare; + const s = move.start, + e = move.end; + const color = move.vanish[0].c; + if ( + s.y == e.y && + Math.abs(s.x - e.x) == 2 && + ((color == 'w' && s.x == 6) || (color == 'b' && s.x == 1)) && + [V.PAWN, V.HIDDEN_QUEEN].includes(move.vanish[0].p) + ) { + return { + x: (s.x + e.x) / 2, + y: s.y + }; + } + return undefined; //default + } + isValidPawnMove(move) { const color = move.vanish[0].c; const pawnShift = color == "w" ? -1 : 1; @@ -91,6 +117,27 @@ export class HiddenqueenRules extends ChessRules { return super.getPotentialMovesFrom([x, y]); } + getEnpassantCaptures([x, y], shiftX) { + const Lep = this.epSquares.length; + const epSquare = this.epSquares[Lep - 1]; + let enpassantMove = null; + if ( + !!epSquare && + epSquare.x == x + shiftX && + Math.abs(epSquare.y - y) == 1 + ) { + enpassantMove = this.getBasicMove([x, y], [epSquare.x, epSquare.y]); + enpassantMove.vanish.push({ + x: x, + y: epSquare.y, + // Captured piece may be a hidden queen + p: this.board[x][epSquare.y][1], + c: this.getColor(x, epSquare.y) + }); + } + return !!enpassantMove ? [enpassantMove] : []; + } + getPotentialPawnMoves([x, y]) { const piece = this.getPiece(x, y); const promotions = @@ -105,8 +152,8 @@ export class HiddenqueenRules extends ChessRules { return this.filterValid(this.getPotentialMovesFrom(sq)); } - static GenRandInitFen(randomness) { - let fen = ChessRules.GenRandInitFen(randomness); + static GenRandInitFen(options) { + let fen = ChessRules.GenRandInitFen(options); // Place hidden queens at random (always): let hiddenQueenPos = randInt(8); let pawnRank = "PPPPPPPP".split(""); @@ -134,12 +181,21 @@ export class HiddenqueenRules extends ChessRules { this.kingPos[oppCol] = [move.vanish[1].x, move.vanish[1].y]; } + underCheck(color) { + if (this.kingPos[color][0] < 0) return false; + return super.underCheck(color); + } + getCurrentScore() { const color = this.turn; if (this.kingPos[color][0] < 0) // King disappeared - return color == "w" ? "0-1" : "1-0"; - return super.getCurrentScore(); + return (color == "w" ? "0-1" : "1-0"); + const oldSide = this.side; + this.side = color; + const res = super.getCurrentScore(); + this.side = oldSide; + return res; } // Search is biased, so not really needed to explore deeply @@ -160,7 +216,8 @@ export class HiddenqueenRules extends ChessRules { } getNotation(move) { - if (this.getPiece(move.start.x, move.start.y) != V.HIDDEN_QUEEN) + // Not using getPiece() method because it would transform HQ into pawn: + if (this.board[move.start.x][move.start.y].charAt(1) != V.HIDDEN_QUEEN) return super.getNotation(move); const finalSquare = V.CoordsToSquare(move.end); if (move.appear[0].p == V.QUEEN) { @@ -178,4 +235,5 @@ export class HiddenqueenRules extends ChessRules { else notation = finalSquare; return notation; } + };