1e1ce46dc47da9740cf403a4eb319a57d653839e
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 // If the move is computed on board1, m.appear change for Alice pieces.
82 m
.appear
.forEach(psq
=> { //forEach: castling taken into account
83 psq
.p
= VariantRules
.ALICE_CODES
[psq
.p
]; //goto board2
86 else //move on board2: mark vanishing piece as Alice
87 m
.vanish
[0].p
= VariantRules
.ALICE_CODES
[m
.vanish
[0].p
]
94 const color
= this.turn
;
96 let sideBoard
= this.getBoardOfPiece(this.kingPos
[color
]);
97 let saveBoard
= this.board
;
98 this.board
= sideBoard
;
99 let res
= this.isAttacked(this.kingPos
[color
], this.getOppCol(color
));
100 this.board
= saveBoard
;
105 getCheckSquares(move)
108 const color
= this.turn
; //opponent
109 let sideBoard
= this.getBoardOfPiece(this.kingPos
[color
]);
110 let saveBoard
= this.board
;
111 this.board
= sideBoard
;
112 let res
= this.isAttacked(this.kingPos
[color
], this.getOppCol(color
))
113 ? [ JSON
.parse(JSON
.stringify(this.kingPos
[color
])) ]
115 this.board
= saveBoard
;
122 if (move.appear
.length
== 2 && move.appear
[0].p
== VariantRules
.KING
)
124 if (move.end
.y
< move.start
.y
)
131 String
.fromCharCode(97 + move.end
.y
) + (VariantRules
.size
[0]-move.end
.x
);
132 const piece
= this.getPiece(move.start
.x
, move.start
.y
);
134 // Piece or pawn movement
135 let notation
= piece
.toUpperCase() +
136 (move.vanish
.length
> move.appear
.length
? "x" : "") + finalSquare
;
137 if (['s','p'].includes(piece
) && !['s','p'].includes(move.appear
[0].p
))
140 notation
+= "=" + move.appear
[0].p
.toUpperCase();
147 const color
= this.turn
;
148 let sideBoard
= this.getBoardOfPiece(this.kingPos
[color
]);
149 let saveBoard
= this.board
;
150 this.board
= sideBoard
;
152 if (!this.isAttacked(this.kingPos
[color
], this.getOppCol(color
)))
155 res
= (color
== "w" ? "0-1" : "1-0");
156 this.board
= saveBoard
;