Step toward a one-page application
[vchess.git] / public / javascripts / variants / Alice.js
index 2be714f..04b4a34 100644 (file)
@@ -95,11 +95,25 @@ class AliceRules extends ChessRules
                const pieces = Object.keys(V.ALICE_CODES);
                const codes = Object.keys(V.ALICE_PIECES);
                const mirrorSide = (pieces.includes(this.getPiece(x,y)) ? 1 : 2);
+               const color = this.getColor(x,y);
 
                // Search valid moves on sideBoard
                let saveBoard = this.board;
                this.board = sideBoard || this.getSideBoard(mirrorSide);
-               let moves = super.getPotentialMovesFrom([x,y]);
+               let moves = super.getPotentialMovesFrom([x,y])
+                       .filter(m => {
+                               // Filter out king moves which result in under-check position on
+                               // current board (before mirror traversing)
+                               let aprioriValid = true;
+                               if (m.appear[0].p == V.KING)
+                               {
+                                       this.play(m);
+                                       if (this.underCheck(color))
+                                               aprioriValid = false;
+                                       this.undo(m);
+                               }
+                               return aprioriValid;
+                       });
                this.board = saveBoard;
 
                // Finally filter impossible moves
@@ -140,7 +154,7 @@ class AliceRules extends ChessRules
                        if (m.vanish[0].p == V.PAWN && m.vanish.length == 2
                                && this.board[m.end.x][m.end.y] == V.EMPTY)
                        {
-                               m.vanish[1].c = this.getOppCol(this.getColor(x,y));
+                               m.vanish[1].c = V.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
@@ -172,7 +186,7 @@ class AliceRules extends ChessRules
        getAllValidMoves()
        {
                const color = this.turn;
-               const oppCol = this.getOppCol(color);
+               const oppCol = V.GetOppCol(color);
                var potentialMoves = [];
                let sideBoard = [this.getSideBoard(1), this.getSideBoard(2)];
                for (var i=0; i<V.size.x; i++)
@@ -233,7 +247,7 @@ class AliceRules extends ChessRules
                const mirrorSide = (sideBoard[0][kp[0]][kp[1]] != V.EMPTY ? 1 : 2);
                let saveBoard = this.board;
                this.board = sideBoard[mirrorSide-1];
-               let res = this.isAttacked(kp, [this.getOppCol(color)]);
+               let res = this.isAttacked(kp, [V.GetOppCol(color)]);
                this.board = saveBoard;
                return res;
        }
@@ -246,7 +260,7 @@ class AliceRules extends ChessRules
                let sideBoard = this.getSideBoard(mirrorSide);
                let saveBoard = this.board;
                this.board = sideBoard;
-               let res = this.isAttacked(this.kingPos[color], [this.getOppCol(color)])
+               let res = this.isAttacked(this.kingPos[color], [V.GetOppCol(color)])
                        ? [ JSON.parse(JSON.stringify(this.kingPos[color])) ]
                        : [ ];
                this.board = saveBoard;
@@ -285,7 +299,7 @@ class AliceRules extends ChessRules
                let saveBoard = this.board;
                this.board = sideBoard;
                let res = "*";
-               if (!this.isAttacked(this.kingPos[color], [this.getOppCol(color)]))
+               if (!this.isAttacked(this.kingPos[color], [V.GetOppCol(color)]))
                        res = "1/2";
                else
                        res = (color == "w" ? "0-1" : "1-0");
@@ -324,7 +338,7 @@ class AliceRules extends ChessRules
                const captureMark = (move.vanish.length > move.appear.length ? "x" : "");
                let pawnMark = "";
                if (["p","s"].includes(piece) && captureMark.length == 1)
-                       pawnMark = V.GetColumn(move.start.y); //start column
+                       pawnMark = V.CoordToColumn(move.start.y); //start column
 
                // Piece or pawn movement
                let notation = piece.toUpperCase() + pawnMark + captureMark + finalSquare;
@@ -336,5 +350,3 @@ class AliceRules extends ChessRules
                return notation;
        }
 }
-
-const VariantRules = AliceRules;