X-Git-Url: https://git.auder.net/img/rock_paper_scissors_lizard_spock.gif?a=blobdiff_plain;f=public%2Fjavascripts%2Fvariants%2FAlice.js;h=761682750c5820316d0668376e3d096d98e570b1;hb=b8121223012a3eb331022adc465bbfb4014363c8;hp=4d105069e1cb55b1773723b9dcadd04c8cf04859;hpb=55eb331d0a9262baafcae5a42258a44d00f38da4;p=vchess.git diff --git a/public/javascripts/variants/Alice.js b/public/javascripts/variants/Alice.js index 4d105069..76168275 100644 --- a/public/javascripts/variants/Alice.js +++ b/public/javascripts/variants/Alice.js @@ -28,11 +28,42 @@ class AliceRules extends ChessRules return (Object.keys(this.ALICE_PIECES).includes(b[1]) ? "Alice/" : "") + b; } - getBoardOfPiece([x,y]) + initVariables(fen) + { + super.initVariables(fen); + const fenParts = fen.split(" "); + const position = fenParts[0].split("/"); + if (this.kingPos["w"][0] < 0 || this.kingPos["b"][0] < 0) + { + // INIT_COL_XXX won't be used, so no need to set them for Alice kings + for (let i=0; i Should be OK as is. - getPotentialMovesFrom([x,y]) + getPotentialMovesFrom([x,y], sideBoard) { - let sideBoard = this.getBoardOfPiece([x,y]); + const pieces = Object.keys(VariantRules.ALICE_CODES); + const codes = Object.keys(VariantRules.ALICE_PIECES); + const mirrorSide = (pieces.includes(this.getPiece(x,y)) ? 1 : 2); // Search valid moves on sideBoard let saveBoard = this.board; - this.board = sideBoard; + this.board = sideBoard || this.getSideBoard(mirrorSide); let moves = super.getPotentialMovesFrom([x,y]); this.board = saveBoard; // Finally filter impossible moves - const mirrorSide = (Object.keys(VariantRules.ALICE_CODES).includes(this.getPiece(x,y)) ? 1 : 2); - return moves.filter(m => { + let res = moves.filter(m => { if (m.appear.length == 2) //castle { // If appear[i] not in vanish array, then must be empty square on other board @@ -80,8 +112,8 @@ class AliceRules extends ChessRules { // Attempt to capture const piece = this.getPiece(m.end.x,m.end.y); - if ((mirrorSide==1 && Object.keys(VariantRules.ALICE_PIECES).includes(piece)) - || (mirrorSide==2 && Object.keys(VariantRules.ALICE_CODES).includes(piece))) + if ((mirrorSide==1 && codes.includes(piece)) + || (mirrorSide==2 && pieces.includes(piece))) { return false; } @@ -93,19 +125,75 @@ class AliceRules extends ChessRules psq.p = VariantRules.ALICE_CODES[psq.p]; //goto board2 }); } - else //move on board2: mark vanishing piece as Alice - m.vanish[0].p = VariantRules.ALICE_CODES[m.vanish[0].p] + else //move on board2: mark vanishing pieces as Alice + { + m.vanish.forEach(psq => { + psq.p = VariantRules.ALICE_CODES[psq.p]; + }); + } + // Fix en-passant captures + if (m.vanish.length == 2 && this.board[m.end.x][m.end.y] == VariantRules.EMPTY) + { + m.vanish[1].c = this.getOppCol(this.getColor(x,y)); + // In the special case of en-passant, if + // - board1 takes board2 : vanish[1] --> Alice + // - board2 takes board1 : vanish[1] --> normal + let van = m.vanish[1]; + if (mirrorSide==1 && codes.includes(this.getPiece(van.x,van.y))) + van.p = VariantRules.ALICE_CODES[van.p]; + else if (mirrorSide==2 && pieces.includes(this.getPiece(van.x,van.y))) + van.p = VariantRules.ALICE_PIECES[van.p]; + } return true; }); + return res; + } + + // NOTE: alternative implementation, recompute sideBoard's in this function + filterValid(moves, sideBoard) + { + if (moves.length == 0) + return []; + const pieces = Object.keys(VariantRules.ALICE_CODES); + return moves.filter(m => { + // WARNING: for underCheck(), we need the sideBoard of the arrival world ! + const mirrorSide = (pieces.includes(this.getPiece(m.start.x,m.start.y)) ? 2 : 1); + return !this.underCheck(m, !!sideBoard ? sideBoard[mirrorSide-1] : null); + }); } - underCheck(move) + getAllValidMoves() + { + const color = this.turn; + const oppCol = this.getOppCol(color); + var potentialMoves = []; + let [sizeX,sizeY] = VariantRules.size; + let sideBoard = [this.getSideBoard(1), this.getSideBoard(2)]; + for (var i=0; i move.appear.length ? "x" : ""); + let pawnMark = ""; + if (["p","s"].includes(piece) && captureMark.length == 1) + pawnMark = String.fromCharCode(97 + move.start.y); //start column + // Piece or pawn movement - let notation = piece.toUpperCase() + - (move.vanish.length > move.appear.length ? "x" : "") + finalSquare; + let notation = piece.toUpperCase() + pawnMark + captureMark + finalSquare; if (['s','p'].includes(piece) && !['s','p'].includes(move.appear[0].p)) { // Promotion @@ -151,19 +303,4 @@ class AliceRules extends ChessRules } return notation; } - - checkGameEnd() - { - const color = this.turn; - let sideBoard = this.getBoardOfPiece(this.kingPos[color]); - let saveBoard = this.board; - this.board = sideBoard; - let res = "*"; - if (!this.isAttacked(this.kingPos[color], this.getOppCol(color))) - res = "1/2"; - else - res = (color == "w" ? "0-1" : "1-0"); - this.board = saveBoard; - return res; - } }