From: Benjamin Auder Date: Wed, 3 Jun 2020 21:08:16 +0000 (+0200) Subject: Merge branch 'simu' X-Git-Url: https://git.auder.net/?a=commitdiff_plain;h=8e346ebebfdaec1538f9728fa7a279027c990f78;hp=7805351e0b70a08e8c9a7d913cd172424067feb3;p=vchess.git Merge branch 'simu' --- diff --git a/TODO b/TODO index ca05de47..6fe14fc3 100644 --- a/TODO +++ b/TODO @@ -16,6 +16,8 @@ https://www.chessvariants.com/mvopponent.dir/avalanche.html https://www.chessvariants.com/mvopponent.dir/hypnotic-chess.html https://www.chessvariants.com/mvopponent.dir/mesmer-chess.html +https://brainking.com/en/GameRules?tp=47&fwa=ArchivedGame!g=8204276$i=1 + Squatter Chess: safe on last rank = win Companion Chess : pieces of same nature don't attack each others https://www.chessvariants.com/difftaking.dir/brotherhood.html diff --git a/client/src/variants/Capture.js b/client/src/variants/Capture.js index 19ce734e..c5f86dcd 100644 --- a/client/src/variants/Capture.js +++ b/client/src/variants/Capture.js @@ -9,15 +9,18 @@ export class CaptureRules extends ChessRules { // Stop at the first capture found (if any) atLeastOneCapture() { const color = this.turn; - const oppCol = V.GetOppCol(color); for (let i = 0; i < V.size.x; i++) { for (let j = 0; j < V.size.y; j++) { if ( this.board[i][j] != V.EMPTY && - this.getColor(i, j) != oppCol && - this.filterValid(this.getPotentialMovesFrom([i, j])).some(m => - // Warning: discard castle moves - m.vanish.length == 2 && m.appear.length == 1) + this.getColor(i, j) == color && + this.filterValid(this.getPotentialMovesFrom([i, j])).some(m => { + return ( + // Warning: discard castle moves + m.vanish.length == 2 && m.appear.length == 1 && + this.filterValid([m]).length == 1 + ); + }) ) { return true; } diff --git a/client/src/variants/Hiddenqueen.js b/client/src/variants/Hiddenqueen.js index f8247856..aa536a6b 100644 --- a/client/src/variants/Hiddenqueen.js +++ b/client/src/variants/Hiddenqueen.js @@ -42,6 +42,29 @@ 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; + if ( + s.y == e.y && + Math.abs(s.x - e.x) == 2 && + [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 +114,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 = @@ -160,7 +204,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][1] != V.HIDDEN_QUEEN) return super.getNotation(move); const finalSquare = V.CoordsToSquare(move.end); if (move.appear[0].p == V.QUEEN) { diff --git a/client/src/variants/Losers.js b/client/src/variants/Losers.js index d82e57d5..3ac46c2f 100644 --- a/client/src/variants/Losers.js +++ b/client/src/variants/Losers.js @@ -11,15 +11,18 @@ export class LosersRules extends ChessRules { // Stop at the first capture found (if any) atLeastOneCapture() { const color = this.turn; - const oppCol = V.GetOppCol(color); for (let i = 0; i < V.size.x; i++) { for (let j = 0; j < V.size.y; j++) { if ( this.board[i][j] != V.EMPTY && - this.getColor(i, j) != oppCol && - this.getPotentialMovesFrom([i, j]).some(m => - // Warning: discard castle moves - m.vanish.length == 2 && m.appear.length == 1) + this.getColor(i, j) == color && + this.getPotentialMovesFrom([i, j]).some(m => { + return ( + // Warning: discard castle moves + m.vanish.length == 2 && m.appear.length == 1 && + this.filterValid([m]).length == 1 + ); + }) ) { return true; } @@ -31,6 +34,9 @@ export class LosersRules extends ChessRules { getPossibleMovesFrom(sq) { let moves = this.filterValid(this.getPotentialMovesFrom(sq)); const captureMoves = V.KeepCaptures(moves); + +console.log(this.atLeastOneCapture()); + if (captureMoves.length > 0) return captureMoves; if (this.atLeastOneCapture()) return []; return moves; diff --git a/client/src/variants/Suicide.js b/client/src/variants/Suicide.js index ecb2aef1..e3630bb4 100644 --- a/client/src/variants/Suicide.js +++ b/client/src/variants/Suicide.js @@ -50,12 +50,11 @@ export class SuicideRules extends ChessRules { // Stop at the first capture found (if any) atLeastOneCapture() { const color = this.turn; - const oppCol = V.GetOppCol(color); for (let i = 0; i < V.size.x; i++) { for (let j = 0; j < V.size.y; j++) { if ( this.board[i][j] != V.EMPTY && - this.getColor(i, j) != oppCol && + this.getColor(i, j) == color && this.getPotentialMovesFrom([i, j]).some(m => m.vanish.length == 2) ) { return true; diff --git a/server/models/User.js b/server/models/User.js index c193d6db..d91045b7 100644 --- a/server/models/User.js +++ b/server/models/User.js @@ -139,7 +139,7 @@ const UserModel = { }, tryNotify: function(id, message) { - UserModel.getOne("id", id, "name, email", (err, user) => { + UserModel.getOne("id", id, "name, email, notify", (err, user) => { if (!err && user.notify) UserModel.notify(user, message); }); },