1 class AliceRules
extends ChessRules
3 static get ALICE_PIECES()
14 static get ALICE_CODES()
28 return (Object
.keys(this.ALICE_PIECES
).includes(b
[1]) ? "Alice/" : "") + b
;
31 getBoardOfPiece([x
,y
])
33 const V
= VariantRules
;
34 // Build board where the piece is
35 const mirrorSide
= (Object
.keys(V
.ALICE_CODES
).includes(this.getPiece(x
,y
)) ? 1 : 2);
36 // Build corresponding board from complete board
37 const [sizeX
,sizeY
] = V
.size
;
38 let sideBoard
= doubleArray(sizeX
, sizeY
, "");
39 for (let i
=0; i
<sizeX
; i
++)
41 for (let j
=0; j
<sizeY
; j
++)
43 const piece
= this.getPiece(i
,j
);
44 if (mirrorSide
==1 && Object
.keys(V
.ALICE_CODES
).includes(piece
))
45 sideBoard
[i
][j
] = this.board
[i
][j
];
46 else if (mirrorSide
==2 && Object
.keys(V
.ALICE_PIECES
).includes(piece
))
47 sideBoard
[i
][j
] = this.getColor(i
,j
) + V
.ALICE_PIECES
[piece
];
53 // NOTE: castle & enPassant https://www.chessvariants.com/other.dir/alice.html
54 // --> Should be OK as is.
55 getPotentialMovesFrom([x
,y
])
57 let sideBoard
= this.getBoardOfPiece([x
,y
]);
59 // Search valid moves on sideBoard
60 let saveBoard
= this.board
;
61 this.board
= sideBoard
;
62 let moves
= super.getPotentialMovesFrom([x
,y
]);
63 this.board
= saveBoard
;
65 // Finally filter impossible moves
66 const mirrorSide
= (Object
.keys(VariantRules
.ALICE_CODES
).includes(this.getPiece(x
,y
)) ? 1 : 2);
67 return moves
.filter(m
=> {
68 if (m
.appear
.length
== 2) //castle
70 // If appear[i] not in vanish array, then must be empty square on other board
71 m
.appear
.forEach(psq
=> {
72 if (this.board
[psq
.x
][psq
.y
] != VariantRules
.EMPTY
&&
73 ![m
.vanish
[0].y
,m
.vanish
[1].y
].includes(psq
.y
))
79 else if (this.board
[m
.end
.x
][m
.end
.y
] != VariantRules
.EMPTY
)
82 const piece
= this.getPiece(m
.end
.x
,m
.end
.y
);
83 if ((mirrorSide
==1 && Object
.keys(VariantRules
.ALICE_PIECES
).includes(piece
))
84 || (mirrorSide
==2 && Object
.keys(VariantRules
.ALICE_CODES
).includes(piece
)))
89 // If the move is computed on board1, m.appear change for Alice pieces.
92 m
.appear
.forEach(psq
=> { //forEach: castling taken into account
93 psq
.p
= VariantRules
.ALICE_CODES
[psq
.p
]; //goto board2
96 else //move on board2: mark vanishing piece as Alice
97 m
.vanish
[0].p
= VariantRules
.ALICE_CODES
[m
.vanish
[0].p
]
104 const color
= this.turn
;
106 let sideBoard
= this.getBoardOfPiece(this.kingPos
[color
]);
107 let saveBoard
= this.board
;
108 this.board
= sideBoard
;
109 let res
= this.isAttacked(this.kingPos
[color
], this.getOppCol(color
));
110 this.board
= saveBoard
;
115 getCheckSquares(move)
118 const color
= this.turn
; //opponent
119 let sideBoard
= this.getBoardOfPiece(this.kingPos
[color
]);
120 let saveBoard
= this.board
;
121 this.board
= sideBoard
;
122 let res
= this.isAttacked(this.kingPos
[color
], this.getOppCol(color
))
123 ? [ JSON
.parse(JSON
.stringify(this.kingPos
[color
])) ]
125 this.board
= saveBoard
;
132 if (move.appear
.length
== 2 && move.appear
[0].p
== VariantRules
.KING
)
134 if (move.end
.y
< move.start
.y
)
141 String
.fromCharCode(97 + move.end
.y
) + (VariantRules
.size
[0]-move.end
.x
);
142 const piece
= this.getPiece(move.start
.x
, move.start
.y
);
144 // Piece or pawn movement
145 let notation
= piece
.toUpperCase() +
146 (move.vanish
.length
> move.appear
.length
? "x" : "") + finalSquare
;
147 if (['s','p'].includes(piece
) && !['s','p'].includes(move.appear
[0].p
))
150 notation
+= "=" + move.appear
[0].p
.toUpperCase();
157 const color
= this.turn
;
158 let sideBoard
= this.getBoardOfPiece(this.kingPos
[color
]);
159 let saveBoard
= this.board
;
160 this.board
= sideBoard
;
162 if (!this.isAttacked(this.kingPos
[color
], this.getOppCol(color
)))
165 res
= (color
== "w" ? "0-1" : "1-0");
166 this.board
= saveBoard
;