X-Git-Url: https://git.auder.net/?p=vchess.git;a=blobdiff_plain;f=client%2Fsrc%2Fvariants%2FHiddenqueen.js;h=b180c6fd70b434aa79a7b956b72ae8d75471ebff;hp=f3b5e3c89fba8dbe4b7a685ea750f16a1ffb5593;hb=4eb0915a0659c8bece6930866a526c5e2c296d9f;hpb=6f2f94374f1e73c375edf732d9425e575e81fff7 diff --git a/client/src/variants/Hiddenqueen.js b/client/src/variants/Hiddenqueen.js index f3b5e3c8..b180c6fd 100644 --- a/client/src/variants/Hiddenqueen.js +++ b/client/src/variants/Hiddenqueen.js @@ -12,6 +12,10 @@ export class HiddenqueenRules extends ChessRules { return 't'; } + static get SomeHiddenMoves() { + return true; + } + static get PIECES() { return ChessRules.PIECES.concat([V.HIDDEN_QUEEN]); } @@ -38,6 +42,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; @@ -87,6 +116,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 = @@ -156,10 +206,23 @@ export class HiddenqueenRules extends ChessRules { } getNotation(move) { - const notation = super.getNotation(move); - if (notation.charAt(0) == 'T') - // Do not reveal hidden queens - return notation.substr(1); + // Not using getPiece() method because it would transform HQ into pawn: + if (this.board[move.start.x][move.start.y][1] != V.HIDDEN_QUEEN) + return super.getNotation(move); + const finalSquare = V.CoordsToSquare(move.end); + if (move.appear[0].p == V.QUEEN) { + return ( + "Q" + + (move.vanish.length > move.appear.length ? "x" : "") + + finalSquare + ); + } + // Do not reveal hidden queens playing as pawns + let notation = ""; + if (move.vanish.length == 2) + // Capture + notation = V.CoordToColumn(move.start.y) + "x" + finalSquare; + else notation = finalSquare; return notation; } };