X-Git-Url: https://git.auder.net/images/pieces/current/gitweb.js?a=blobdiff_plain;f=public%2Fjavascripts%2Fvariants%2FAlice.js;h=d457f5f5b2afe9933b1efff5e4e539937b7c294e;hb=0b5fa571c10c5d5befc81b3984ead9b4b1a3e14e;hp=cc7a46448c6d15b3e123ecac3cbda1ddd8d8f9bf;hpb=a3eb4cc5131333f1ef08a3f41ba68692a7d6bb63;p=vchess.git diff --git a/public/javascripts/variants/Alice.js b/public/javascripts/variants/Alice.js index cc7a4644..d457f5f5 100644 --- a/public/javascripts/variants/Alice.js +++ b/public/javascripts/variants/Alice.js @@ -1,12 +1,228 @@ -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]) + { + let sideBoard = this.getBoardOfPiece([x,y]); + + // Search valid moves on sideBoard + let saveBoard = this.board; + this.board = sideBoard; + let moves = super.getPotentialMovesFrom([x,y]); + this.board = saveBoard; - // Idee : this.board assigné tour à tour à board1, board2 - // board1 initialisé plein, board2 vide (via fen: s,t,u,o,c) - // coups cherchés suivant règles normales sur l'un puis l'autre - // puis au final filtre. + // Finally filter impossible moves + const mirrorSide = (Object.keys(VariantRules.ALICE_CODES).includes(this.getPiece(x,y)) ? 1 : 2); + return 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 && Object.keys(VariantRules.ALICE_PIECES).includes(piece)) + || (mirrorSide==2 && Object.keys(VariantRules.ALICE_CODES).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]; + }); + } + return true; + }); + } + + underCheck(move) + { + const color = this.turn; + this.play(move); + let sideBoard = this.getBoardOfPiece(this.kingPos[color]); + let saveBoard = this.board; + this.board = sideBoard; + let res = this.isAttacked(this.kingPos[color], this.getOppCol(color)); + this.board = saveBoard; + this.undo(move); + return res; + } + + getCheckSquares(move) + { + this.play(move); + const color = this.turn; //opponent + let sideBoard = this.getBoardOfPiece(this.kingPos[color]); + let saveBoard = this.board; + this.board = sideBoard; + let res = this.isAttacked(this.kingPos[color], this.getOppCol(color)) + ? [ JSON.parse(JSON.stringify(this.kingPos[color])) ] + : [ ]; + this.board = saveBoard; + this.undo(move); + return res; + } + + updateVariables(move) + { + super.updateVariables(move); //standard king + const piece = this.getPiece(move.start.x,move.start.y); + const c = this.getColor(move.start.x,move.start.y); + // "l" = Alice king + if (piece == "l") + { + this.kingPos[c][0] = move.appear[0].x; + this.kingPos[c][1] = move.appear[0].y; + this.castleFlags[c] = [false,false]; + } + } + + unupdateVariables(move) + { + super.unupdateVariables(move); + const c = this.getColor(move.start.x,move.start.y); + if (this.getPiece(move.start.x,move.start.y) == "l") + this.kingPos[c] = [move.start.x, move.start.y]; + } + + getNotation(move) + { + if (move.appear.length == 2 && move.appear[0].p == VariantRules.KING) + { + if (move.end.y < move.start.y) + return "0-0-0"; + else + return "0-0"; + } + + const finalSquare = + String.fromCharCode(97 + move.end.y) + (VariantRules.size[0]-move.end.x); + const piece = this.getPiece(move.start.x, move.start.y); + + // Piece or pawn movement + let notation = piece.toUpperCase() + + (move.vanish.length > move.appear.length ? "x" : "") + finalSquare; + if (['s','p'].includes(piece) && !['s','p'].includes(move.appear[0].p)) + { + // Promotion + notation += "=" + move.appear[0].p.toUpperCase(); + } + 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; + } }