Fix Koopa promotions with captures, and Balakhlava: pawns move forward
[vchess.git] / client / src / variants / Capture.js
CommitLineData
6b7b2cf7 1import { ChessRules } from "@/base_rules";
6b7b2cf7 2
32f6285e 3export class CaptureRules extends ChessRules {
6b7b2cf7
BA
4 // Trim all non-capturing moves
5 static KeepCaptures(moves) {
3a2a7b5f 6 return moves.filter(m => m.vanish.length == 2 && m.appear.length == 1);
6b7b2cf7
BA
7 }
8
801e2870 9 // Stop at the first capture found (if any)
6b7b2cf7
BA
10 atLeastOneCapture() {
11 const color = this.turn;
12 const oppCol = V.GetOppCol(color);
13 for (let i = 0; i < V.size.x; i++) {
14 for (let j = 0; j < V.size.y; j++) {
15 if (
16 this.board[i][j] != V.EMPTY &&
17 this.getColor(i, j) != oppCol &&
32f6285e
BA
18 this.filterValid(this.getPotentialMovesFrom([i, j])).some(m =>
19 // Warning: discard castle moves
6b7b2cf7
BA
20 m.vanish.length == 2 && m.appear.length == 1)
21 ) {
22 return true;
23 }
24 }
25 }
26 return false;
27 }
28
29 getPossibleMovesFrom(sq) {
30 let moves = this.filterValid(this.getPotentialMovesFrom(sq));
31 const captureMoves = V.KeepCaptures(moves);
32 if (captureMoves.length > 0) return captureMoves;
33 if (this.atLeastOneCapture()) return [];
34 return moves;
35 }
36
37 getAllValidMoves() {
38 const moves = super.getAllValidMoves();
a34caace
BA
39 if (moves.some(m => m.vanish.length == 2 && m.appear.length == 1))
40 return V.KeepCaptures(moves);
6b7b2cf7
BA
41 return moves;
42 }
6b7b2cf7 43};