Several small improvements + integrate options + first working draft of Cwda
[vchess.git] / client / src / variants / Balaklava.js
1 import { ChessRules } from "@/base_rules";
2
3 export class BalaklavaRules extends ChessRules {
4
5 static get PawnSpecs() {
6 return Object.assign(
7 {},
8 ChessRules.PawnSpecs,
9 { promotions: [V.ROOK, V.MAMMOTH, V.BISHOP, V.QUEEN] }
10 );
11 }
12
13 static get HasEnpassant() {
14 return false;
15 }
16
17 getPpath(b) {
18 return (b[1] == V.MAMMOTH ? "Balaklava/" : "") + b;
19 }
20
21 // Alfil + Dabbaba:
22 static get MAMMOTH() {
23 return "m";
24 }
25
26 static get PIECES() {
27 return [V.PAWN, V.ROOK, V.MAMMOTH, V.BISHOP, V.QUEEN, V.KING];
28 }
29
30 static get steps() {
31 return Object.assign(
32 {},
33 ChessRules.steps,
34 {
35 m: [
36 [-2, -2],
37 [-2, 0],
38 [-2, 2],
39 [0, -2],
40 [0, 2],
41 [2, -2],
42 [2, 0],
43 [2, 2],
44 ]
45 }
46 );
47 }
48
49 static GenRandInitFen(options) {
50 // No collision between 'n' and castle flags, so next replacement is fine
51 return (
52 ChessRules.GenRandInitFen(options).replace(/n/g, 'm').replace(/N/g, 'M')
53 );
54 }
55
56 getPotentialMovesFrom([x, y]) {
57 const piece = this.getPiece(x, y);
58 let moves =
59 piece == V.MAMMOTH
60 ? this.getPotentialMammothMoves([x, y])
61 : super.getPotentialMovesFrom([x, y]);
62 if (piece != V.KING) {
63 // Add non-capturing knight movements
64 const color = this.turn;
65 const lastRank = (color == 'w' ? 0 : 7);
66 V.steps[V.KNIGHT].forEach(step => {
67 // Pawns cannot go backward:
68 if (
69 piece == V.PAWN &&
70 (
71 (color == 'w' && step[0] > 0) ||
72 (color == 'b' && step[0] < 0)
73 )
74 ) {
75 return;
76 }
77 const [i, j] = [x + step[0], y + step[1]];
78 if (
79 V.OnBoard(i, j) &&
80 this.board[i][j] == V.EMPTY &&
81 // Pawns don't promote with a knight move
82 (piece != V.PAWN || i != lastRank)
83 ) {
84 moves.push(this.getBasicMove([x, y], [i, j]));
85 }
86 });
87 }
88 return moves;
89 }
90
91 getPotentialMammothMoves(sq) {
92 return this.getSlideNJumpMoves(sq, V.steps[V.MAMMOTH], 1);
93 }
94
95 isAttacked(sq, color) {
96 return (
97 super.isAttacked(sq, color) ||
98 this.isAttackedByMammoth(sq, color)
99 );
100 }
101
102 isAttackedByMammoth(sq, color) {
103 return this.isAttackedBySlideNJump(
104 sq, color, V.MAMMOTH, V.steps[V.MAMMOTH], 1);
105 }
106
107 static get SEARCH_DEPTH() {
108 return 2;
109 }
110
111 static get VALUES() {
112 return Object.assign(
113 // A mammoth is probably worth a little more than a knight
114 { m: 4 },
115 ChessRules.VALUES
116 );
117 }
118
119 };