3cba8d021f877505dd970b18337458ec1c2a0402
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 // TODO: castle & enPassant https://www.chessvariants.com/other.dir/alice.html
54 // TODO: enPassant seulement si l'on est du même coté que le coté de départ du pion adverse
55 // (en passant en sortant du monde... : il faut donc ajouter des coups non trouvés)
56 // castle: check that all destination squares are not occupied
57 getPotentialMovesFrom([x
,y
])
59 let sideBoard
= this.getBoardOfPiece([x
,y
]);
61 // Search valid moves on sideBoard
62 let saveBoard
= this.board
;
63 this.board
= sideBoard
;
64 let moves
= super.getPotentialMovesFrom([x
,y
]);
65 this.board
= saveBoard
;
67 // Finally filter impossible moves
68 const mirrorSide
= (Object
.keys(VariantRules
.ALICE_CODES
).includes(this.getPiece(x
,y
)) ? 1 : 2);
69 return moves
.filter(m
=> {
70 if (this.board
[m
.end
.x
][m
.end
.y
] != VariantRules
.EMPTY
)
72 const piece
= this.getPiece(m
.end
.x
,m
.end
.y
);
73 if ((mirrorSide
==1 && Object
.keys(VariantRules
.ALICE_PIECES
).includes(piece
))
74 || (mirrorSide
==2 && Object
.keys(VariantRules
.ALICE_CODES
).includes(piece
)))
79 m
.appear
.forEach(psq
=> {
80 if (Object
.keys(VariantRules
.ALICE_CODES
).includes(psq
.p
))
81 psq
.p
= VariantRules
.ALICE_CODES
[psq
.p
]; //goto board2
83 psq
.p
= VariantRules
.ALICE_PIECES
[psq
.p
]; //goto board1
91 const color
= this.turn
;
93 let sideBoard
= this.getBoardOfPiece(this.kingPos
[color
]);
94 let saveBoard
= this.board
;
95 this.board
= sideBoard
;
96 let res
= this.isAttacked(this.kingPos
[color
], this.getOppCol(color
));
97 this.board
= saveBoard
;
102 getCheckSquares(move)
105 const color
= this.turn
; //opponent
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 ? [ JSON
.parse(JSON
.stringify(this.kingPos
[color
])) ]
112 this.board
= saveBoard
;
119 if (move.appear
.length
== 2 && move.appear
[0].p
== VariantRules
.KING
)
121 if (move.end
.y
< move.start
.y
)
128 String
.fromCharCode(97 + move.end
.y
) + (VariantRules
.size
[0]-move.end
.x
);
129 const piece
= this.getPiece(move.start
.x
, move.start
.y
);
131 // Piece or pawn movement
132 let notation
= piece
.toUpperCase() +
133 (move.vanish
.length
> move.appear
.length
? "x" : "") + finalSquare
;
134 if (['s','p'].includes(piece
) && !['s','p'].includes(move.appear
[0].p
))
137 notation
+= "=" + move.appear
[0].p
.toUpperCase();
144 const color
= this.turn
;
145 let sideBoard
= this.getBoardOfPiece(this.kingPos
[color
]);
146 let saveBoard
= this.board
;
147 this.board
= sideBoard
;
149 if (!this.isAttacked(this.kingPos
[color
], this.getOppCol(color
)))
152 res
= (color
== "w" ? "0-1" : "1-0");
153 this.board
= saveBoard
;