X-Git-Url: https://git.auder.net/?a=blobdiff_plain;f=public%2Fjavascripts%2Fvariants%2FAlice.js;h=9a7cefa0a344267b51b0e8f4100023444db95241;hb=a0f5dbaac2a9c028aa0ca2559d157b34aeafd3c9;hp=673af088e1c0c77cf979a35a19ba5d632d56ae33;hpb=5bfb09560aa346d132e829a7c63558407bcc8091;p=vchess.git diff --git a/public/javascripts/variants/Alice.js b/public/javascripts/variants/Alice.js index 673af088..9a7cefa0 100644 --- a/public/javascripts/variants/Alice.js +++ b/public/javascripts/variants/Alice.js @@ -1,7 +1,307 @@ -class AliceRules extends ChessRUles +class AliceRules extends ChessRules { - getPpath(b) + static get ALICE_PIECES() { - return ""; //TODO + return { + 's': 'p', + 't': 'q', + 'u': 'r', + 'c': 'b', + 'o': 'n', + 'l': 'k', + }; + } + static get ALICE_CODES() + { + return { + 'p': 's', + 'q': 't', + 'r': 'u', + 'b': 'c', + 'n': 'o', + 'k': 'l', + }; + } + + static getPpath(b) + { + return (Object.keys(this.ALICE_PIECES).includes(b[1]) ? "Alice/" : "") + b; + } + + 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], sideBoard) + { + 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.getSideBoard(mirrorSide); + let moves = super.getPotentialMovesFrom([x,y]); + this.board = saveBoard; + + // Finally filter impossible moves + 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 + m.appear.forEach(psq => { + if (this.board[psq.x][psq.y] != VariantRules.EMPTY && + ![m.vanish[0].y,m.vanish[1].y].includes(psq.y)) + { + return false; + } + }); + } + else if (this.board[m.end.x][m.end.y] != VariantRules.EMPTY) + { + // Attempt to capture + const piece = this.getPiece(m.end.x,m.end.y); + if ((mirrorSide==1 && codes.includes(piece)) + || (mirrorSide==2 && pieces.includes(piece))) + { + return false; + } + } + // If the move is computed on board1, m.appear change for Alice pieces. + if (mirrorSide==1) + { + m.appear.forEach(psq => { //forEach: castling taken into account + psq.p = VariantRules.ALICE_CODES[psq.p]; //goto board2 + }); + } + 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[0].p == VariantRules.PAWN + && 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); + }); + } + + 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() + pawnMark + captureMark + finalSquare; + if (['s','p'].includes(piece) && !['s','p'].includes(move.appear[0].p)) + { + // Promotion + notation += "=" + move.appear[0].p.toUpperCase(); + } + return notation; } }