@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.
Files changed (93) hide show
  1. package/LICENSE.txt +674 -0
  2. package/README.md +61 -0
  3. package/dist/cjs/attacks.js +152 -0
  4. package/dist/cjs/attacks.js.map +1 -0
  5. package/dist/cjs/board.js +143 -0
  6. package/dist/cjs/board.js.map +1 -0
  7. package/dist/cjs/chess.js +638 -0
  8. package/dist/cjs/chess.js.map +1 -0
  9. package/dist/cjs/compat.js +89 -0
  10. package/dist/cjs/compat.js.map +1 -0
  11. package/dist/cjs/debug.js +103 -0
  12. package/dist/cjs/debug.js.map +1 -0
  13. package/dist/cjs/fen.js +325 -0
  14. package/dist/cjs/fen.js.map +1 -0
  15. package/dist/cjs/index.js +94 -0
  16. package/dist/cjs/index.js.map +1 -0
  17. package/dist/cjs/pgn.js +796 -0
  18. package/dist/cjs/pgn.js.map +1 -0
  19. package/dist/cjs/san.js +174 -0
  20. package/dist/cjs/san.js.map +1 -0
  21. package/dist/cjs/setup.js +167 -0
  22. package/dist/cjs/setup.js.map +1 -0
  23. package/dist/cjs/squareSet.js +206 -0
  24. package/dist/cjs/squareSet.js.map +1 -0
  25. package/dist/cjs/transform.js +57 -0
  26. package/dist/cjs/transform.js.map +1 -0
  27. package/dist/cjs/types.js +24 -0
  28. package/dist/cjs/types.js.map +1 -0
  29. package/dist/cjs/util.js +104 -0
  30. package/dist/cjs/util.js.map +1 -0
  31. package/dist/cjs/variant.js +833 -0
  32. package/dist/cjs/variant.js.map +1 -0
  33. package/dist/esm/attacks.js +140 -0
  34. package/dist/esm/attacks.js.map +1 -0
  35. package/dist/esm/board.js +138 -0
  36. package/dist/esm/board.js.map +1 -0
  37. package/dist/esm/chess.js +624 -0
  38. package/dist/esm/chess.js.map +1 -0
  39. package/dist/esm/compat.js +81 -0
  40. package/dist/esm/compat.js.map +1 -0
  41. package/dist/esm/debug.js +94 -0
  42. package/dist/esm/debug.js.map +1 -0
  43. package/dist/esm/fen.js +308 -0
  44. package/dist/esm/fen.js.map +1 -0
  45. package/dist/esm/index.js +15 -0
  46. package/dist/esm/index.js.map +1 -0
  47. package/dist/esm/pgn.js +769 -0
  48. package/dist/esm/pgn.js.map +1 -0
  49. package/dist/esm/san.js +167 -0
  50. package/dist/esm/san.js.map +1 -0
  51. package/dist/esm/setup.js +157 -0
  52. package/dist/esm/setup.js.map +1 -0
  53. package/dist/esm/squareSet.js +202 -0
  54. package/dist/esm/squareSet.js.map +1 -0
  55. package/dist/esm/transform.js +48 -0
  56. package/dist/esm/transform.js.map +1 -0
  57. package/dist/esm/types.js +19 -0
  58. package/dist/esm/types.js.map +1 -0
  59. package/dist/esm/util.js +87 -0
  60. package/dist/esm/util.js.map +1 -0
  61. package/dist/esm/variant.js +812 -0
  62. package/dist/esm/variant.js.map +1 -0
  63. package/dist/types/attacks.d.ts +58 -0
  64. package/dist/types/board.d.ts +62 -0
  65. package/dist/types/chess.d.ts +82 -0
  66. package/dist/types/compat.d.ts +26 -0
  67. package/dist/types/debug.d.ts +10 -0
  68. package/dist/types/fen.d.ts +40 -0
  69. package/dist/types/index.d.ts +14 -0
  70. package/dist/types/pgn.d.ts +203 -0
  71. package/dist/types/san.d.ts +6 -0
  72. package/dist/types/setup.d.ts +65 -0
  73. package/dist/types/squareSet.d.ts +50 -0
  74. package/dist/types/transform.d.ts +9 -0
  75. package/dist/types/types.d.ts +58 -0
  76. package/dist/types/util.d.ts +21 -0
  77. package/dist/types/variant.d.ts +92 -0
  78. package/package.json +86 -0
  79. package/src/attacks.ts +160 -0
  80. package/src/board.ts +168 -0
  81. package/src/chess.ts +687 -0
  82. package/src/compat.ts +120 -0
  83. package/src/debug.ts +100 -0
  84. package/src/fen.ts +328 -0
  85. package/src/index.ts +85 -0
  86. package/src/pgn.ts +876 -0
  87. package/src/san.ts +190 -0
  88. package/src/setup.ts +203 -0
  89. package/src/squareSet.ts +243 -0
  90. package/src/transform.ts +49 -0
  91. package/src/types.ts +93 -0
  92. package/src/util.ts +116 -0
  93. package/src/variant.ts +939 -0
package/README.md ADDED
@@ -0,0 +1,61 @@
1
+ # chessops
2
+
3
+ [![npm](https://img.shields.io/npm/v/chessops)](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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"}