@connectorvol/chessops 0.15.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.txt +674 -0
- package/README.md +61 -0
- package/dist/cjs/attacks.js +152 -0
- package/dist/cjs/attacks.js.map +1 -0
- package/dist/cjs/board.js +143 -0
- package/dist/cjs/board.js.map +1 -0
- package/dist/cjs/chess.js +638 -0
- package/dist/cjs/chess.js.map +1 -0
- package/dist/cjs/compat.js +89 -0
- package/dist/cjs/compat.js.map +1 -0
- package/dist/cjs/debug.js +103 -0
- package/dist/cjs/debug.js.map +1 -0
- package/dist/cjs/fen.js +325 -0
- package/dist/cjs/fen.js.map +1 -0
- package/dist/cjs/index.js +94 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/pgn.js +796 -0
- package/dist/cjs/pgn.js.map +1 -0
- package/dist/cjs/san.js +174 -0
- package/dist/cjs/san.js.map +1 -0
- package/dist/cjs/setup.js +167 -0
- package/dist/cjs/setup.js.map +1 -0
- package/dist/cjs/squareSet.js +206 -0
- package/dist/cjs/squareSet.js.map +1 -0
- package/dist/cjs/transform.js +57 -0
- package/dist/cjs/transform.js.map +1 -0
- package/dist/cjs/types.js +24 -0
- package/dist/cjs/types.js.map +1 -0
- package/dist/cjs/util.js +104 -0
- package/dist/cjs/util.js.map +1 -0
- package/dist/cjs/variant.js +833 -0
- package/dist/cjs/variant.js.map +1 -0
- package/dist/esm/attacks.js +140 -0
- package/dist/esm/attacks.js.map +1 -0
- package/dist/esm/board.js +138 -0
- package/dist/esm/board.js.map +1 -0
- package/dist/esm/chess.js +624 -0
- package/dist/esm/chess.js.map +1 -0
- package/dist/esm/compat.js +81 -0
- package/dist/esm/compat.js.map +1 -0
- package/dist/esm/debug.js +94 -0
- package/dist/esm/debug.js.map +1 -0
- package/dist/esm/fen.js +308 -0
- package/dist/esm/fen.js.map +1 -0
- package/dist/esm/index.js +15 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/pgn.js +769 -0
- package/dist/esm/pgn.js.map +1 -0
- package/dist/esm/san.js +167 -0
- package/dist/esm/san.js.map +1 -0
- package/dist/esm/setup.js +157 -0
- package/dist/esm/setup.js.map +1 -0
- package/dist/esm/squareSet.js +202 -0
- package/dist/esm/squareSet.js.map +1 -0
- package/dist/esm/transform.js +48 -0
- package/dist/esm/transform.js.map +1 -0
- package/dist/esm/types.js +19 -0
- package/dist/esm/types.js.map +1 -0
- package/dist/esm/util.js +87 -0
- package/dist/esm/util.js.map +1 -0
- package/dist/esm/variant.js +812 -0
- package/dist/esm/variant.js.map +1 -0
- package/dist/types/attacks.d.ts +58 -0
- package/dist/types/board.d.ts +62 -0
- package/dist/types/chess.d.ts +82 -0
- package/dist/types/compat.d.ts +26 -0
- package/dist/types/debug.d.ts +10 -0
- package/dist/types/fen.d.ts +40 -0
- package/dist/types/index.d.ts +14 -0
- package/dist/types/pgn.d.ts +203 -0
- package/dist/types/san.d.ts +6 -0
- package/dist/types/setup.d.ts +65 -0
- package/dist/types/squareSet.d.ts +50 -0
- package/dist/types/transform.d.ts +9 -0
- package/dist/types/types.d.ts +58 -0
- package/dist/types/util.d.ts +21 -0
- package/dist/types/variant.d.ts +92 -0
- package/package.json +86 -0
- package/src/attacks.ts +160 -0
- package/src/board.ts +168 -0
- package/src/chess.ts +687 -0
- package/src/compat.ts +120 -0
- package/src/debug.ts +100 -0
- package/src/fen.ts +328 -0
- package/src/index.ts +85 -0
- package/src/pgn.ts +876 -0
- package/src/san.ts +190 -0
- package/src/setup.ts +203 -0
- package/src/squareSet.ts +243 -0
- package/src/transform.ts +49 -0
- package/src/types.ts +93 -0
- package/src/util.ts +116 -0
- package/src/variant.ts +939 -0
package/README.md
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# chessops
|
|
2
|
+
|
|
3
|
+
[](https://www.npmjs.com/package/chessops)
|
|
4
|
+
|
|
5
|
+
Chess and chess variant rules and operations in TypeScript.
|
|
6
|
+
|
|
7
|
+
## Documentation
|
|
8
|
+
|
|
9
|
+
[View TypeDoc](https://niklasf.github.io/chessops/)
|
|
10
|
+
|
|
11
|
+
## Features
|
|
12
|
+
|
|
13
|
+
- [Read and write FEN](https://niklasf.github.io/chessops/modules/fen.html)
|
|
14
|
+
- Vocabulary
|
|
15
|
+
- `Square`
|
|
16
|
+
- `SquareSet` (implemented as bitboards)
|
|
17
|
+
- `Color`
|
|
18
|
+
- `Role` (piece type)
|
|
19
|
+
- `Piece` (`Role` and `Color`)
|
|
20
|
+
- `Board` (map of piece positions)
|
|
21
|
+
- `Castles`
|
|
22
|
+
- `Setup` (a not necessarily legal position)
|
|
23
|
+
- `Position` (base class for legal positions, `Chess` is a concrete implementation)
|
|
24
|
+
- [Variant rules](https://niklasf.github.io/chessops/modules/variant.html):
|
|
25
|
+
Standard chess, Crazyhouse, King of the Hill, Three-check,
|
|
26
|
+
Antichess, Atomic, Horde, Racing Kings
|
|
27
|
+
- Move making
|
|
28
|
+
- Legal move and drop move generation
|
|
29
|
+
- Game end and outcome
|
|
30
|
+
- Insufficient material
|
|
31
|
+
- Setup validation
|
|
32
|
+
- Supports Chess960
|
|
33
|
+
- [Attacks and rays](https://niklasf.github.io/chessops/modules/attacks.html)
|
|
34
|
+
using Hyperbola Quintessence (faster to initialize than Magic Bitboards)
|
|
35
|
+
- Read and write UCI move notation
|
|
36
|
+
- [Read and write SAN](https://niklasf.github.io/chessops/modules/san.html)
|
|
37
|
+
- [Read and write PGN](https://niklasf.github.io/chessops/modules/pgn.html)
|
|
38
|
+
- Parser supports asynchronous streaming
|
|
39
|
+
- Game tree model
|
|
40
|
+
- Transform game tree to augment nodes with arbitrary user data
|
|
41
|
+
- Parse comments with evaluations, clocks and shapes
|
|
42
|
+
- [Transformations](https://niklasf.github.io/chessops/modules/transform.html): Mirroring and rotating
|
|
43
|
+
- [Compatibility](https://niklasf.github.io/chessops/modules/compat.html):
|
|
44
|
+
[chessground](https://github.com/ornicar/chessground) and
|
|
45
|
+
[scalachess](https://github.com/ornicar/scalachess)
|
|
46
|
+
|
|
47
|
+
## Example
|
|
48
|
+
|
|
49
|
+
```javascript
|
|
50
|
+
import { Chess } from "@connectorvol/chessops/chess";
|
|
51
|
+
import { parseFen } from "chessops/fen";
|
|
52
|
+
|
|
53
|
+
const setup = parseFen("r1bqkbnr/ppp2Qpp/2np4/4p3/2B1P3/8/PPPP1PPP/RNB1K1NR b KQkq - 0 4").unwrap();
|
|
54
|
+
const pos = Chess.fromSetup(setup).unwrap();
|
|
55
|
+
console.assert(pos.isCheckmate());
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## License
|
|
59
|
+
|
|
60
|
+
chessops is licensed under the GNU General Public License 3 or any later
|
|
61
|
+
version at your choice. See LICENSE.txt for details.
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Compute attacks and rays.
|
|
4
|
+
*
|
|
5
|
+
* These are low-level functions that can be used to implement chess rules.
|
|
6
|
+
*
|
|
7
|
+
* Implementation notes: Sliding attacks are computed using
|
|
8
|
+
* [Hyperbola Quintessence](https://www.chessprogramming.org/Hyperbola_Quintessence).
|
|
9
|
+
* Magic Bitboards would deliver slightly faster lookups, but also require
|
|
10
|
+
* initializing considerably larger attack tables. On the web, initialization
|
|
11
|
+
* time is important, so the chosen method may strike a better balance.
|
|
12
|
+
*
|
|
13
|
+
* @packageDocumentation
|
|
14
|
+
*/
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.between = exports.ray = exports.attacks = exports.queenAttacks = exports.rookAttacks = exports.bishopAttacks = exports.pawnAttacks = exports.knightAttacks = exports.kingAttacks = void 0;
|
|
17
|
+
const squareSet_js_1 = require("./squareSet.js");
|
|
18
|
+
const util_js_1 = require("./util.js");
|
|
19
|
+
const computeRange = (square, deltas) => {
|
|
20
|
+
let range = squareSet_js_1.SquareSet.empty();
|
|
21
|
+
for (const delta of deltas) {
|
|
22
|
+
const sq = square + delta;
|
|
23
|
+
if (0 <= sq && sq < 64 && Math.abs((0, util_js_1.squareFile)(square) - (0, util_js_1.squareFile)(sq)) <= 2) {
|
|
24
|
+
range = range.with(sq);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return range;
|
|
28
|
+
};
|
|
29
|
+
const tabulate = (f) => {
|
|
30
|
+
const table = [];
|
|
31
|
+
for (let square = 0; square < 64; square++)
|
|
32
|
+
table[square] = f(square);
|
|
33
|
+
return table;
|
|
34
|
+
};
|
|
35
|
+
const KING_ATTACKS = tabulate((sq) => computeRange(sq, [-9, -8, -7, -1, 1, 7, 8, 9]));
|
|
36
|
+
const KNIGHT_ATTACKS = tabulate((sq) => computeRange(sq, [-17, -15, -10, -6, 6, 10, 15, 17]));
|
|
37
|
+
const PAWN_ATTACKS = {
|
|
38
|
+
white: tabulate((sq) => computeRange(sq, [7, 9])),
|
|
39
|
+
black: tabulate((sq) => computeRange(sq, [-7, -9])),
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* Gets squares attacked or defended by a king on `square`.
|
|
43
|
+
*/
|
|
44
|
+
const kingAttacks = (square) => KING_ATTACKS[square];
|
|
45
|
+
exports.kingAttacks = kingAttacks;
|
|
46
|
+
/**
|
|
47
|
+
* Gets squares attacked or defended by a knight on `square`.
|
|
48
|
+
*/
|
|
49
|
+
const knightAttacks = (square) => KNIGHT_ATTACKS[square];
|
|
50
|
+
exports.knightAttacks = knightAttacks;
|
|
51
|
+
/**
|
|
52
|
+
* Gets squares attacked or defended by a pawn of the given `color`
|
|
53
|
+
* on `square`.
|
|
54
|
+
*/
|
|
55
|
+
const pawnAttacks = (color, square) => PAWN_ATTACKS[color][square];
|
|
56
|
+
exports.pawnAttacks = pawnAttacks;
|
|
57
|
+
const FILE_RANGE = tabulate((sq) => squareSet_js_1.SquareSet.fromFile((0, util_js_1.squareFile)(sq)).without(sq));
|
|
58
|
+
const RANK_RANGE = tabulate((sq) => squareSet_js_1.SquareSet.fromRank((0, util_js_1.squareRank)(sq)).without(sq));
|
|
59
|
+
const DIAG_RANGE = tabulate((sq) => {
|
|
60
|
+
const diag = new squareSet_js_1.SquareSet(134480385, 2151686160);
|
|
61
|
+
const shift = 8 * ((0, util_js_1.squareRank)(sq) - (0, util_js_1.squareFile)(sq));
|
|
62
|
+
return (shift >= 0 ? diag.shl64(shift) : diag.shr64(-shift)).without(sq);
|
|
63
|
+
});
|
|
64
|
+
const ANTI_DIAG_RANGE = tabulate((sq) => {
|
|
65
|
+
const diag = new squareSet_js_1.SquareSet(270549120, 16909320);
|
|
66
|
+
const shift = 8 * ((0, util_js_1.squareRank)(sq) + (0, util_js_1.squareFile)(sq) - 7);
|
|
67
|
+
return (shift >= 0 ? diag.shl64(shift) : diag.shr64(-shift)).without(sq);
|
|
68
|
+
});
|
|
69
|
+
const hyperbola = (bit, range, occupied) => {
|
|
70
|
+
let forward = occupied.intersect(range);
|
|
71
|
+
let reverse = forward.bswap64(); // Assumes no more than 1 bit per rank
|
|
72
|
+
forward = forward.minus64(bit);
|
|
73
|
+
reverse = reverse.minus64(bit.bswap64());
|
|
74
|
+
return forward.xor(reverse.bswap64()).intersect(range);
|
|
75
|
+
};
|
|
76
|
+
const fileAttacks = (square, occupied) => hyperbola(squareSet_js_1.SquareSet.fromSquare(square), FILE_RANGE[square], occupied);
|
|
77
|
+
const rankAttacks = (square, occupied) => {
|
|
78
|
+
const range = RANK_RANGE[square];
|
|
79
|
+
let forward = occupied.intersect(range);
|
|
80
|
+
let reverse = forward.rbit64();
|
|
81
|
+
forward = forward.minus64(squareSet_js_1.SquareSet.fromSquare(square));
|
|
82
|
+
reverse = reverse.minus64(squareSet_js_1.SquareSet.fromSquare(63 - square));
|
|
83
|
+
return forward.xor(reverse.rbit64()).intersect(range);
|
|
84
|
+
};
|
|
85
|
+
/**
|
|
86
|
+
* Gets squares attacked or defended by a bishop on `square`, given `occupied`
|
|
87
|
+
* squares.
|
|
88
|
+
*/
|
|
89
|
+
const bishopAttacks = (square, occupied) => {
|
|
90
|
+
const bit = squareSet_js_1.SquareSet.fromSquare(square);
|
|
91
|
+
return hyperbola(bit, DIAG_RANGE[square], occupied).xor(hyperbola(bit, ANTI_DIAG_RANGE[square], occupied));
|
|
92
|
+
};
|
|
93
|
+
exports.bishopAttacks = bishopAttacks;
|
|
94
|
+
/**
|
|
95
|
+
* Gets squares attacked or defended by a rook on `square`, given `occupied`
|
|
96
|
+
* squares.
|
|
97
|
+
*/
|
|
98
|
+
const rookAttacks = (square, occupied) => fileAttacks(square, occupied).xor(rankAttacks(square, occupied));
|
|
99
|
+
exports.rookAttacks = rookAttacks;
|
|
100
|
+
/**
|
|
101
|
+
* Gets squares attacked or defended by a queen on `square`, given `occupied`
|
|
102
|
+
* squares.
|
|
103
|
+
*/
|
|
104
|
+
const queenAttacks = (square, occupied) => (0, exports.bishopAttacks)(square, occupied).xor((0, exports.rookAttacks)(square, occupied));
|
|
105
|
+
exports.queenAttacks = queenAttacks;
|
|
106
|
+
/**
|
|
107
|
+
* Gets squares attacked or defended by a `piece` on `square`, given
|
|
108
|
+
* `occupied` squares.
|
|
109
|
+
*/
|
|
110
|
+
const attacks = (piece, square, occupied) => {
|
|
111
|
+
switch (piece.role) {
|
|
112
|
+
case "pawn":
|
|
113
|
+
return (0, exports.pawnAttacks)(piece.color, square);
|
|
114
|
+
case "knight":
|
|
115
|
+
return (0, exports.knightAttacks)(square);
|
|
116
|
+
case "bishop":
|
|
117
|
+
return (0, exports.bishopAttacks)(square, occupied);
|
|
118
|
+
case "rook":
|
|
119
|
+
return (0, exports.rookAttacks)(square, occupied);
|
|
120
|
+
case "queen":
|
|
121
|
+
return (0, exports.queenAttacks)(square, occupied);
|
|
122
|
+
case "king":
|
|
123
|
+
return (0, exports.kingAttacks)(square);
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
exports.attacks = attacks;
|
|
127
|
+
/**
|
|
128
|
+
* Gets all squares of the rank, file or diagonal with the two squares
|
|
129
|
+
* `a` and `b`, or an empty set if they are not aligned.
|
|
130
|
+
*/
|
|
131
|
+
const ray = (a, b) => {
|
|
132
|
+
const other = squareSet_js_1.SquareSet.fromSquare(b);
|
|
133
|
+
if (RANK_RANGE[a].intersects(other))
|
|
134
|
+
return RANK_RANGE[a].with(a);
|
|
135
|
+
if (ANTI_DIAG_RANGE[a].intersects(other))
|
|
136
|
+
return ANTI_DIAG_RANGE[a].with(a);
|
|
137
|
+
if (DIAG_RANGE[a].intersects(other))
|
|
138
|
+
return DIAG_RANGE[a].with(a);
|
|
139
|
+
if (FILE_RANGE[a].intersects(other))
|
|
140
|
+
return FILE_RANGE[a].with(a);
|
|
141
|
+
return squareSet_js_1.SquareSet.empty();
|
|
142
|
+
};
|
|
143
|
+
exports.ray = ray;
|
|
144
|
+
/**
|
|
145
|
+
* Gets all squares between `a` and `b` (bounds not included), or an empty set
|
|
146
|
+
* if they are not on the same rank, file or diagonal.
|
|
147
|
+
*/
|
|
148
|
+
const between = (a, b) => (0, exports.ray)(a, b)
|
|
149
|
+
.intersect(squareSet_js_1.SquareSet.full().shl64(a).xor(squareSet_js_1.SquareSet.full().shl64(b)))
|
|
150
|
+
.withoutFirst();
|
|
151
|
+
exports.between = between;
|
|
152
|
+
//# sourceMappingURL=attacks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attacks.js","sourceRoot":"","sources":["../../src/attacks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.boardEquals = exports.Board = void 0;
|
|
4
|
+
const squareSet_js_1 = require("./squareSet.js");
|
|
5
|
+
const types_js_1 = require("./types.js");
|
|
6
|
+
/**
|
|
7
|
+
* Piece positions on a board.
|
|
8
|
+
*
|
|
9
|
+
* Properties are sets of squares, like `board.occupied` for all occupied
|
|
10
|
+
* squares, `board[color]` for all pieces of that color, and `board[role]`
|
|
11
|
+
* for all pieces of that role. When modifying the properties directly, take
|
|
12
|
+
* care to keep them consistent.
|
|
13
|
+
*/
|
|
14
|
+
class Board {
|
|
15
|
+
constructor() { }
|
|
16
|
+
static default() {
|
|
17
|
+
const board = new Board();
|
|
18
|
+
board.reset();
|
|
19
|
+
return board;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Resets all pieces to the default starting position for standard chess.
|
|
23
|
+
*/
|
|
24
|
+
reset() {
|
|
25
|
+
this.occupied = new squareSet_js_1.SquareSet(0xffff, 4294901760);
|
|
26
|
+
this.promoted = squareSet_js_1.SquareSet.empty();
|
|
27
|
+
this.white = new squareSet_js_1.SquareSet(0xffff, 0);
|
|
28
|
+
this.black = new squareSet_js_1.SquareSet(0, 4294901760);
|
|
29
|
+
this.pawn = new squareSet_js_1.SquareSet(0xff00, 16711680);
|
|
30
|
+
this.knight = new squareSet_js_1.SquareSet(0x42, 1107296256);
|
|
31
|
+
this.bishop = new squareSet_js_1.SquareSet(0x24, 603979776);
|
|
32
|
+
this.rook = new squareSet_js_1.SquareSet(0x81, 2164260864);
|
|
33
|
+
this.queen = new squareSet_js_1.SquareSet(0x8, 134217728);
|
|
34
|
+
this.king = new squareSet_js_1.SquareSet(0x10, 268435456);
|
|
35
|
+
}
|
|
36
|
+
static empty() {
|
|
37
|
+
const board = new Board();
|
|
38
|
+
board.clear();
|
|
39
|
+
return board;
|
|
40
|
+
}
|
|
41
|
+
clear() {
|
|
42
|
+
this.occupied = squareSet_js_1.SquareSet.empty();
|
|
43
|
+
this.promoted = squareSet_js_1.SquareSet.empty();
|
|
44
|
+
for (const color of types_js_1.COLORS)
|
|
45
|
+
this[color] = squareSet_js_1.SquareSet.empty();
|
|
46
|
+
for (const role of types_js_1.ROLES)
|
|
47
|
+
this[role] = squareSet_js_1.SquareSet.empty();
|
|
48
|
+
}
|
|
49
|
+
clone() {
|
|
50
|
+
const board = new Board();
|
|
51
|
+
board.occupied = this.occupied;
|
|
52
|
+
board.promoted = this.promoted;
|
|
53
|
+
for (const color of types_js_1.COLORS)
|
|
54
|
+
board[color] = this[color];
|
|
55
|
+
for (const role of types_js_1.ROLES)
|
|
56
|
+
board[role] = this[role];
|
|
57
|
+
return board;
|
|
58
|
+
}
|
|
59
|
+
getColor(square) {
|
|
60
|
+
if (this.white.has(square))
|
|
61
|
+
return "white";
|
|
62
|
+
if (this.black.has(square))
|
|
63
|
+
return "black";
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
getRole(square) {
|
|
67
|
+
for (const role of types_js_1.ROLES) {
|
|
68
|
+
if (this[role].has(square))
|
|
69
|
+
return role;
|
|
70
|
+
}
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
get(square) {
|
|
74
|
+
const color = this.getColor(square);
|
|
75
|
+
if (!color)
|
|
76
|
+
return;
|
|
77
|
+
const role = this.getRole(square);
|
|
78
|
+
const promoted = this.promoted.has(square);
|
|
79
|
+
return { color, role, promoted };
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Removes and returns the piece from the given `square`, if any.
|
|
83
|
+
*/
|
|
84
|
+
take(square) {
|
|
85
|
+
const piece = this.get(square);
|
|
86
|
+
if (piece) {
|
|
87
|
+
this.occupied = this.occupied.without(square);
|
|
88
|
+
this[piece.color] = this[piece.color].without(square);
|
|
89
|
+
this[piece.role] = this[piece.role].without(square);
|
|
90
|
+
if (piece.promoted)
|
|
91
|
+
this.promoted = this.promoted.without(square);
|
|
92
|
+
}
|
|
93
|
+
return piece;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Put `piece` onto `square`, potentially replacing an existing piece.
|
|
97
|
+
* Returns the existing piece, if any.
|
|
98
|
+
*/
|
|
99
|
+
set(square, piece) {
|
|
100
|
+
const old = this.take(square);
|
|
101
|
+
this.occupied = this.occupied.with(square);
|
|
102
|
+
this[piece.color] = this[piece.color].with(square);
|
|
103
|
+
this[piece.role] = this[piece.role].with(square);
|
|
104
|
+
if (piece.promoted)
|
|
105
|
+
this.promoted = this.promoted.with(square);
|
|
106
|
+
return old;
|
|
107
|
+
}
|
|
108
|
+
has(square) {
|
|
109
|
+
return this.occupied.has(square);
|
|
110
|
+
}
|
|
111
|
+
*[Symbol.iterator]() {
|
|
112
|
+
for (const square of this.occupied) {
|
|
113
|
+
yield [square, this.get(square)];
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
pieces(color, role) {
|
|
117
|
+
return this[color].intersect(this[role]);
|
|
118
|
+
}
|
|
119
|
+
rooksAndQueens() {
|
|
120
|
+
return this.rook.union(this.queen);
|
|
121
|
+
}
|
|
122
|
+
bishopsAndQueens() {
|
|
123
|
+
return this.bishop.union(this.queen);
|
|
124
|
+
}
|
|
125
|
+
steppers() {
|
|
126
|
+
return this.knight.union(this.pawn).union(this.king);
|
|
127
|
+
}
|
|
128
|
+
sliders() {
|
|
129
|
+
return this.bishop.union(this.rook).union(this.queen);
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Finds the unique king of the given `color`, if any.
|
|
133
|
+
*/
|
|
134
|
+
kingOf(color) {
|
|
135
|
+
return this.pieces(color, "king").singleSquare();
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
exports.Board = Board;
|
|
139
|
+
const boardEquals = (left, right) => left.white.equals(right.white) &&
|
|
140
|
+
left.promoted.equals(right.promoted) &&
|
|
141
|
+
types_js_1.ROLES.every((role) => left[role].equals(right[role]));
|
|
142
|
+
exports.boardEquals = boardEquals;
|
|
143
|
+
//# sourceMappingURL=board.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"board.js","sourceRoot":"","sources":["../../src/board.ts"],"names":[],"mappings":"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"}
|