@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
@@ -0,0 +1,624 @@
1
+ import { Result } from "@badrap/result";
2
+ import { attacks, between, bishopAttacks, kingAttacks, knightAttacks, pawnAttacks, queenAttacks, ray, rookAttacks, } from "./attacks.js";
3
+ import { Board, boardEquals } from "./board.js";
4
+ import { SquareSet } from "./squareSet.js";
5
+ import { CASTLING_SIDES, COLORS, isDrop, } from "./types.js";
6
+ import { defined, kingCastlesTo, opposite, rookCastlesTo, squareRank } from "./util.js";
7
+ export var IllegalSetup;
8
+ (function (IllegalSetup) {
9
+ IllegalSetup["Empty"] = "ERR_EMPTY";
10
+ IllegalSetup["OppositeCheck"] = "ERR_OPPOSITE_CHECK";
11
+ IllegalSetup["PawnsOnBackrank"] = "ERR_PAWNS_ON_BACKRANK";
12
+ IllegalSetup["Kings"] = "ERR_KINGS";
13
+ IllegalSetup["Variant"] = "ERR_VARIANT";
14
+ })(IllegalSetup || (IllegalSetup = {}));
15
+ export class PositionError extends Error {
16
+ }
17
+ const attacksTo = (square, attacker, board, occupied) => board[attacker].intersect(rookAttacks(square, occupied)
18
+ .intersect(board.rooksAndQueens())
19
+ .union(bishopAttacks(square, occupied).intersect(board.bishopsAndQueens()))
20
+ .union(knightAttacks(square).intersect(board.knight))
21
+ .union(kingAttacks(square).intersect(board.king))
22
+ .union(pawnAttacks(opposite(attacker), square).intersect(board.pawn)));
23
+ export class Castles {
24
+ constructor() { }
25
+ static default() {
26
+ const castles = new Castles();
27
+ castles.castlingRights = SquareSet.corners();
28
+ castles.rook = {
29
+ white: { a: 0, h: 7 },
30
+ black: { a: 56, h: 63 },
31
+ };
32
+ castles.path = {
33
+ white: { a: new SquareSet(0xe, 0), h: new SquareSet(0x60, 0) },
34
+ black: { a: new SquareSet(0, 0x0e000000), h: new SquareSet(0, 0x60000000) },
35
+ };
36
+ return castles;
37
+ }
38
+ static empty() {
39
+ const castles = new Castles();
40
+ castles.castlingRights = SquareSet.empty();
41
+ castles.rook = {
42
+ white: { a: undefined, h: undefined },
43
+ black: { a: undefined, h: undefined },
44
+ };
45
+ castles.path = {
46
+ white: { a: SquareSet.empty(), h: SquareSet.empty() },
47
+ black: { a: SquareSet.empty(), h: SquareSet.empty() },
48
+ };
49
+ return castles;
50
+ }
51
+ clone() {
52
+ const castles = new Castles();
53
+ castles.castlingRights = this.castlingRights;
54
+ castles.rook = {
55
+ white: { a: this.rook.white.a, h: this.rook.white.h },
56
+ black: { a: this.rook.black.a, h: this.rook.black.h },
57
+ };
58
+ castles.path = {
59
+ white: { a: this.path.white.a, h: this.path.white.h },
60
+ black: { a: this.path.black.a, h: this.path.black.h },
61
+ };
62
+ return castles;
63
+ }
64
+ add(color, side, king, rook) {
65
+ const kingTo = kingCastlesTo(color, side);
66
+ const rookTo = rookCastlesTo(color, side);
67
+ this.castlingRights = this.castlingRights.with(rook);
68
+ this.rook[color][side] = rook;
69
+ this.path[color][side] = between(rook, rookTo)
70
+ .with(rookTo)
71
+ .union(between(king, kingTo).with(kingTo))
72
+ .without(king)
73
+ .without(rook);
74
+ }
75
+ static fromSetup(setup) {
76
+ const castles = Castles.empty();
77
+ const rooks = setup.castlingRights.intersect(setup.board.rook);
78
+ for (const color of COLORS) {
79
+ const backrank = SquareSet.backrank(color);
80
+ const king = setup.board.kingOf(color);
81
+ if (!defined(king) || !backrank.has(king))
82
+ continue;
83
+ const side = rooks.intersect(setup.board[color]).intersect(backrank);
84
+ const aSide = side.first();
85
+ if (defined(aSide) && aSide < king)
86
+ castles.add(color, "a", king, aSide);
87
+ const hSide = side.last();
88
+ if (defined(hSide) && king < hSide)
89
+ castles.add(color, "h", king, hSide);
90
+ }
91
+ return castles;
92
+ }
93
+ discardRook(square) {
94
+ if (this.castlingRights.has(square)) {
95
+ this.castlingRights = this.castlingRights.without(square);
96
+ for (const color of COLORS) {
97
+ for (const side of CASTLING_SIDES) {
98
+ if (this.rook[color][side] === square)
99
+ this.rook[color][side] = undefined;
100
+ }
101
+ }
102
+ }
103
+ }
104
+ discardColor(color) {
105
+ this.castlingRights = this.castlingRights.diff(SquareSet.backrank(color));
106
+ this.rook[color].a = undefined;
107
+ this.rook[color].h = undefined;
108
+ }
109
+ }
110
+ export class Position {
111
+ constructor(rules) {
112
+ this.rules = rules;
113
+ }
114
+ reset() {
115
+ this.board = Board.default();
116
+ this.pockets = undefined;
117
+ this.turn = "white";
118
+ this.castles = Castles.default();
119
+ this.epSquare = undefined;
120
+ this.remainingChecks = undefined;
121
+ this.halfmoves = 0;
122
+ this.fullmoves = 1;
123
+ }
124
+ setupUnchecked(setup) {
125
+ this.board = setup.board.clone();
126
+ this.board.promoted = SquareSet.empty();
127
+ this.pockets = undefined;
128
+ this.turn = setup.turn;
129
+ this.castles = Castles.fromSetup(setup);
130
+ this.epSquare = validEpSquare(this, setup.epSquare);
131
+ this.remainingChecks = undefined;
132
+ this.halfmoves = setup.halfmoves;
133
+ this.fullmoves = setup.fullmoves;
134
+ }
135
+ // When subclassing overwrite at least:
136
+ //
137
+ // - static default()
138
+ // - static fromSetup()
139
+ // - static clone()
140
+ //
141
+ // - dests()
142
+ // - isVariantEnd()
143
+ // - variantOutcome()
144
+ // - hasInsufficientMaterial()
145
+ // - isStandardMaterial()
146
+ kingAttackers(square, attacker, occupied) {
147
+ return attacksTo(square, attacker, this.board, occupied);
148
+ }
149
+ playCaptureAt(square, captured) {
150
+ this.halfmoves = 0;
151
+ if (captured.role === "rook")
152
+ this.castles.discardRook(square);
153
+ if (this.pockets)
154
+ this.pockets[opposite(captured.color)][captured.promoted ? "pawn" : captured.role]++;
155
+ }
156
+ ctx() {
157
+ const variantEnd = this.isVariantEnd();
158
+ const king = this.board.kingOf(this.turn);
159
+ if (!defined(king)) {
160
+ return {
161
+ king,
162
+ blockers: SquareSet.empty(),
163
+ checkers: SquareSet.empty(),
164
+ variantEnd,
165
+ mustCapture: false,
166
+ };
167
+ }
168
+ const snipers = rookAttacks(king, SquareSet.empty())
169
+ .intersect(this.board.rooksAndQueens())
170
+ .union(bishopAttacks(king, SquareSet.empty()).intersect(this.board.bishopsAndQueens()))
171
+ .intersect(this.board[opposite(this.turn)]);
172
+ let blockers = SquareSet.empty();
173
+ for (const sniper of snipers) {
174
+ const b = between(king, sniper).intersect(this.board.occupied);
175
+ if (!b.moreThanOne())
176
+ blockers = blockers.union(b);
177
+ }
178
+ const checkers = this.kingAttackers(king, opposite(this.turn), this.board.occupied);
179
+ return {
180
+ king,
181
+ blockers,
182
+ checkers,
183
+ variantEnd,
184
+ mustCapture: false,
185
+ };
186
+ }
187
+ clone() {
188
+ var _a, _b;
189
+ const pos = new this.constructor();
190
+ pos.board = this.board.clone();
191
+ pos.pockets = (_a = this.pockets) === null || _a === void 0 ? void 0 : _a.clone();
192
+ pos.turn = this.turn;
193
+ pos.castles = this.castles.clone();
194
+ pos.epSquare = this.epSquare;
195
+ pos.remainingChecks = (_b = this.remainingChecks) === null || _b === void 0 ? void 0 : _b.clone();
196
+ pos.halfmoves = this.halfmoves;
197
+ pos.fullmoves = this.fullmoves;
198
+ return pos;
199
+ }
200
+ validate() {
201
+ if (this.board.occupied.isEmpty())
202
+ return Result.err(new PositionError(IllegalSetup.Empty));
203
+ if (this.board.king.size() !== 2)
204
+ return Result.err(new PositionError(IllegalSetup.Kings));
205
+ if (!defined(this.board.kingOf(this.turn)))
206
+ return Result.err(new PositionError(IllegalSetup.Kings));
207
+ const otherKing = this.board.kingOf(opposite(this.turn));
208
+ if (!defined(otherKing))
209
+ return Result.err(new PositionError(IllegalSetup.Kings));
210
+ if (this.kingAttackers(otherKing, this.turn, this.board.occupied).nonEmpty()) {
211
+ return Result.err(new PositionError(IllegalSetup.OppositeCheck));
212
+ }
213
+ if (SquareSet.backranks().intersects(this.board.pawn)) {
214
+ return Result.err(new PositionError(IllegalSetup.PawnsOnBackrank));
215
+ }
216
+ return Result.ok(undefined);
217
+ }
218
+ dropDests(_ctx) {
219
+ return SquareSet.empty();
220
+ }
221
+ dests(square, ctx) {
222
+ ctx = ctx || this.ctx();
223
+ if (ctx.variantEnd)
224
+ return SquareSet.empty();
225
+ const piece = this.board.get(square);
226
+ if (!piece || piece.color !== this.turn)
227
+ return SquareSet.empty();
228
+ let pseudo, legal;
229
+ if (piece.role === "pawn") {
230
+ pseudo = pawnAttacks(this.turn, square).intersect(this.board[opposite(this.turn)]);
231
+ const delta = this.turn === "white" ? 8 : -8;
232
+ const step = square + delta;
233
+ if (0 <= step && step < 64 && !this.board.occupied.has(step)) {
234
+ pseudo = pseudo.with(step);
235
+ const canDoubleStep = this.turn === "white" ? square < 16 : square >= 64 - 16;
236
+ const doubleStep = step + delta;
237
+ if (canDoubleStep && !this.board.occupied.has(doubleStep)) {
238
+ pseudo = pseudo.with(doubleStep);
239
+ }
240
+ }
241
+ if (defined(this.epSquare) && canCaptureEp(this, square, ctx)) {
242
+ legal = SquareSet.fromSquare(this.epSquare);
243
+ }
244
+ }
245
+ else if (piece.role === "bishop")
246
+ pseudo = bishopAttacks(square, this.board.occupied);
247
+ else if (piece.role === "knight")
248
+ pseudo = knightAttacks(square);
249
+ else if (piece.role === "rook")
250
+ pseudo = rookAttacks(square, this.board.occupied);
251
+ else if (piece.role === "queen")
252
+ pseudo = queenAttacks(square, this.board.occupied);
253
+ else
254
+ pseudo = kingAttacks(square);
255
+ pseudo = pseudo.diff(this.board[this.turn]);
256
+ if (defined(ctx.king)) {
257
+ if (piece.role === "king") {
258
+ const occ = this.board.occupied.without(square);
259
+ for (const to of pseudo) {
260
+ if (this.kingAttackers(to, opposite(this.turn), occ).nonEmpty())
261
+ pseudo = pseudo.without(to);
262
+ }
263
+ return pseudo.union(castlingDest(this, "a", ctx)).union(castlingDest(this, "h", ctx));
264
+ }
265
+ if (ctx.checkers.nonEmpty()) {
266
+ const checker = ctx.checkers.singleSquare();
267
+ if (!defined(checker))
268
+ return SquareSet.empty();
269
+ pseudo = pseudo.intersect(between(checker, ctx.king).with(checker));
270
+ }
271
+ if (ctx.blockers.has(square))
272
+ pseudo = pseudo.intersect(ray(square, ctx.king));
273
+ }
274
+ if (legal)
275
+ pseudo = pseudo.union(legal);
276
+ return pseudo;
277
+ }
278
+ isVariantEnd() {
279
+ return false;
280
+ }
281
+ variantOutcome(_ctx) {
282
+ return;
283
+ }
284
+ hasInsufficientMaterial(color) {
285
+ if (this.board[color].intersect(this.board.pawn.union(this.board.rooksAndQueens())).nonEmpty())
286
+ return false;
287
+ if (this.board[color].intersects(this.board.knight)) {
288
+ return (this.board[color].size() <= 2 &&
289
+ this.board[opposite(color)].diff(this.board.king).diff(this.board.queen).isEmpty());
290
+ }
291
+ if (this.board[color].intersects(this.board.bishop)) {
292
+ const sameColor = !this.board.bishop.intersects(SquareSet.darkSquares()) ||
293
+ !this.board.bishop.intersects(SquareSet.lightSquares());
294
+ return sameColor && this.board.pawn.isEmpty() && this.board.knight.isEmpty();
295
+ }
296
+ return true;
297
+ }
298
+ // The following should be identical in all subclasses
299
+ toSetup() {
300
+ var _a, _b;
301
+ return {
302
+ board: this.board.clone(),
303
+ pockets: (_a = this.pockets) === null || _a === void 0 ? void 0 : _a.clone(),
304
+ turn: this.turn,
305
+ castlingRights: this.castles.castlingRights,
306
+ epSquare: legalEpSquare(this),
307
+ remainingChecks: (_b = this.remainingChecks) === null || _b === void 0 ? void 0 : _b.clone(),
308
+ halfmoves: Math.min(this.halfmoves, 150),
309
+ fullmoves: Math.min(Math.max(this.fullmoves, 1), 9999),
310
+ };
311
+ }
312
+ isInsufficientMaterial() {
313
+ return COLORS.every((color) => this.hasInsufficientMaterial(color));
314
+ }
315
+ hasDests(ctx) {
316
+ ctx = ctx || this.ctx();
317
+ for (const square of this.board[this.turn]) {
318
+ if (this.dests(square, ctx).nonEmpty())
319
+ return true;
320
+ }
321
+ return this.dropDests(ctx).nonEmpty();
322
+ }
323
+ isLegal(move, ctx) {
324
+ if (isDrop(move)) {
325
+ if (!this.pockets || this.pockets[this.turn][move.role] <= 0)
326
+ return false;
327
+ if (move.role === "pawn" && SquareSet.backranks().has(move.to))
328
+ return false;
329
+ return this.dropDests(ctx).has(move.to);
330
+ }
331
+ else {
332
+ if (move.promotion === "pawn")
333
+ return false;
334
+ if (move.promotion === "king" && this.rules !== "antichess")
335
+ return false;
336
+ if (!!move.promotion !== (this.board.pawn.has(move.from) && SquareSet.backranks().has(move.to)))
337
+ return false;
338
+ const dests = this.dests(move.from, ctx);
339
+ return dests.has(move.to) || dests.has(normalizeMove(this, move).to);
340
+ }
341
+ }
342
+ isCheck() {
343
+ const king = this.board.kingOf(this.turn);
344
+ return (defined(king) && this.kingAttackers(king, opposite(this.turn), this.board.occupied).nonEmpty());
345
+ }
346
+ isEnd(ctx) {
347
+ if (ctx ? ctx.variantEnd : this.isVariantEnd())
348
+ return true;
349
+ return this.isInsufficientMaterial() || !this.hasDests(ctx);
350
+ }
351
+ isCheckmate(ctx) {
352
+ ctx = ctx || this.ctx();
353
+ return !ctx.variantEnd && ctx.checkers.nonEmpty() && !this.hasDests(ctx);
354
+ }
355
+ isStalemate(ctx) {
356
+ ctx = ctx || this.ctx();
357
+ return !ctx.variantEnd && ctx.checkers.isEmpty() && !this.hasDests(ctx);
358
+ }
359
+ outcome(ctx) {
360
+ const variantOutcome = this.variantOutcome(ctx);
361
+ if (variantOutcome)
362
+ return variantOutcome;
363
+ ctx = ctx || this.ctx();
364
+ if (this.isCheckmate(ctx))
365
+ return { winner: opposite(this.turn) };
366
+ else if (this.isInsufficientMaterial() || this.isStalemate(ctx))
367
+ return { winner: undefined };
368
+ else
369
+ return;
370
+ }
371
+ allDests(ctx) {
372
+ ctx = ctx || this.ctx();
373
+ const d = new Map();
374
+ if (ctx.variantEnd)
375
+ return d;
376
+ for (const square of this.board[this.turn]) {
377
+ d.set(square, this.dests(square, ctx));
378
+ }
379
+ return d;
380
+ }
381
+ play(move) {
382
+ const turn = this.turn;
383
+ const epSquare = this.epSquare;
384
+ const castling = castlingSide(this, move);
385
+ this.epSquare = undefined;
386
+ this.halfmoves += 1;
387
+ if (turn === "black")
388
+ this.fullmoves += 1;
389
+ this.turn = opposite(turn);
390
+ if (isDrop(move)) {
391
+ this.board.set(move.to, { role: move.role, color: turn });
392
+ if (this.pockets)
393
+ this.pockets[turn][move.role]--;
394
+ if (move.role === "pawn")
395
+ this.halfmoves = 0;
396
+ }
397
+ else {
398
+ const piece = this.board.take(move.from);
399
+ if (!piece)
400
+ return;
401
+ let epCapture;
402
+ if (piece.role === "pawn") {
403
+ this.halfmoves = 0;
404
+ if (move.to === epSquare) {
405
+ epCapture = this.board.take(move.to + (turn === "white" ? -8 : 8));
406
+ }
407
+ const delta = move.from - move.to;
408
+ if (Math.abs(delta) === 16 && 8 <= move.from && move.from <= 55) {
409
+ this.epSquare = (move.from + move.to) >> 1;
410
+ }
411
+ if (move.promotion) {
412
+ piece.role = move.promotion;
413
+ piece.promoted = !!this.pockets;
414
+ }
415
+ }
416
+ else if (piece.role === "rook") {
417
+ this.castles.discardRook(move.from);
418
+ }
419
+ else if (piece.role === "king") {
420
+ if (castling) {
421
+ const rookFrom = this.castles.rook[turn][castling];
422
+ if (defined(rookFrom)) {
423
+ const rook = this.board.take(rookFrom);
424
+ this.board.set(kingCastlesTo(turn, castling), piece);
425
+ if (rook)
426
+ this.board.set(rookCastlesTo(turn, castling), rook);
427
+ }
428
+ }
429
+ this.castles.discardColor(turn);
430
+ }
431
+ if (!castling) {
432
+ const capture = this.board.set(move.to, piece) || epCapture;
433
+ if (capture)
434
+ this.playCaptureAt(move.to, capture);
435
+ }
436
+ }
437
+ if (this.remainingChecks) {
438
+ if (this.isCheck())
439
+ this.remainingChecks[turn] = Math.max(this.remainingChecks[turn] - 1, 0);
440
+ }
441
+ }
442
+ }
443
+ export class Chess extends Position {
444
+ constructor() {
445
+ super("chess");
446
+ }
447
+ static default() {
448
+ const pos = new this();
449
+ pos.reset();
450
+ return pos;
451
+ }
452
+ static fromSetup(setup) {
453
+ const pos = new this();
454
+ pos.setupUnchecked(setup);
455
+ return pos.validate().map((_) => pos);
456
+ }
457
+ clone() {
458
+ return super.clone();
459
+ }
460
+ }
461
+ const validEpSquare = (pos, square) => {
462
+ if (!defined(square))
463
+ return;
464
+ const epRank = pos.turn === "white" ? 5 : 2;
465
+ const forward = pos.turn === "white" ? 8 : -8;
466
+ if (squareRank(square) !== epRank)
467
+ return;
468
+ if (pos.board.occupied.has(square + forward))
469
+ return;
470
+ const pawn = square - forward;
471
+ if (!pos.board.pawn.has(pawn) || !pos.board[opposite(pos.turn)].has(pawn))
472
+ return;
473
+ return square;
474
+ };
475
+ const legalEpSquare = (pos) => {
476
+ if (!defined(pos.epSquare))
477
+ return;
478
+ const ctx = pos.ctx();
479
+ const ourPawns = pos.board.pieces(pos.turn, "pawn");
480
+ const candidates = ourPawns.intersect(pawnAttacks(opposite(pos.turn), pos.epSquare));
481
+ for (const candidate of candidates) {
482
+ if (pos.dests(candidate, ctx).has(pos.epSquare))
483
+ return pos.epSquare;
484
+ }
485
+ return;
486
+ };
487
+ const canCaptureEp = (pos, pawnFrom, ctx) => {
488
+ if (!defined(pos.epSquare))
489
+ return false;
490
+ if (!pawnAttacks(pos.turn, pawnFrom).has(pos.epSquare))
491
+ return false;
492
+ if (!defined(ctx.king))
493
+ return true;
494
+ const delta = pos.turn === "white" ? 8 : -8;
495
+ const captured = pos.epSquare - delta;
496
+ return pos
497
+ .kingAttackers(ctx.king, opposite(pos.turn), pos.board.occupied.toggle(pawnFrom).toggle(captured).with(pos.epSquare))
498
+ .without(captured)
499
+ .isEmpty();
500
+ };
501
+ const castlingDest = (pos, side, ctx) => {
502
+ if (!defined(ctx.king) || ctx.checkers.nonEmpty())
503
+ return SquareSet.empty();
504
+ const rook = pos.castles.rook[pos.turn][side];
505
+ if (!defined(rook))
506
+ return SquareSet.empty();
507
+ if (pos.castles.path[pos.turn][side].intersects(pos.board.occupied))
508
+ return SquareSet.empty();
509
+ const kingTo = kingCastlesTo(pos.turn, side);
510
+ const kingPath = between(ctx.king, kingTo);
511
+ const occ = pos.board.occupied.without(ctx.king);
512
+ for (const sq of kingPath) {
513
+ if (pos.kingAttackers(sq, opposite(pos.turn), occ).nonEmpty())
514
+ return SquareSet.empty();
515
+ }
516
+ const rookTo = rookCastlesTo(pos.turn, side);
517
+ const after = pos.board.occupied.toggle(ctx.king).toggle(rook).toggle(rookTo);
518
+ if (pos.kingAttackers(kingTo, opposite(pos.turn), after).nonEmpty())
519
+ return SquareSet.empty();
520
+ return SquareSet.fromSquare(rook);
521
+ };
522
+ export const pseudoDests = (pos, square, ctx) => {
523
+ if (ctx.variantEnd)
524
+ return SquareSet.empty();
525
+ const piece = pos.board.get(square);
526
+ if (!piece || piece.color !== pos.turn)
527
+ return SquareSet.empty();
528
+ let pseudo = attacks(piece, square, pos.board.occupied);
529
+ if (piece.role === "pawn") {
530
+ let captureTargets = pos.board[opposite(pos.turn)];
531
+ if (defined(pos.epSquare))
532
+ captureTargets = captureTargets.with(pos.epSquare);
533
+ pseudo = pseudo.intersect(captureTargets);
534
+ const delta = pos.turn === "white" ? 8 : -8;
535
+ const step = square + delta;
536
+ if (0 <= step && step < 64 && !pos.board.occupied.has(step)) {
537
+ pseudo = pseudo.with(step);
538
+ const canDoubleStep = pos.turn === "white" ? square < 16 : square >= 64 - 16;
539
+ const doubleStep = step + delta;
540
+ if (canDoubleStep && !pos.board.occupied.has(doubleStep)) {
541
+ pseudo = pseudo.with(doubleStep);
542
+ }
543
+ }
544
+ return pseudo;
545
+ }
546
+ else {
547
+ pseudo = pseudo.diff(pos.board[pos.turn]);
548
+ }
549
+ if (square === ctx.king)
550
+ return pseudo.union(castlingDest(pos, "a", ctx)).union(castlingDest(pos, "h", ctx));
551
+ else
552
+ return pseudo;
553
+ };
554
+ export const equalsIgnoreMoves = (left, right) => {
555
+ var _a, _b;
556
+ return left.rules === right.rules &&
557
+ boardEquals(left.board, right.board) &&
558
+ ((right.pockets && ((_a = left.pockets) === null || _a === void 0 ? void 0 : _a.equals(right.pockets))) || (!left.pockets && !right.pockets)) &&
559
+ left.turn === right.turn &&
560
+ left.castles.castlingRights.equals(right.castles.castlingRights) &&
561
+ legalEpSquare(left) === legalEpSquare(right) &&
562
+ ((right.remainingChecks && ((_b = left.remainingChecks) === null || _b === void 0 ? void 0 : _b.equals(right.remainingChecks))) ||
563
+ (!left.remainingChecks && !right.remainingChecks));
564
+ };
565
+ export const castlingSide = (pos, move) => {
566
+ if (isDrop(move))
567
+ return;
568
+ const delta = move.to - move.from;
569
+ if (Math.abs(delta) !== 2 && !pos.board[pos.turn].has(move.to))
570
+ return;
571
+ if (!pos.board.king.has(move.from))
572
+ return;
573
+ return delta > 0 ? "h" : "a";
574
+ };
575
+ export const normalizeMove = (pos, move) => {
576
+ const side = castlingSide(pos, move);
577
+ if (!side)
578
+ return move;
579
+ const rookFrom = pos.castles.rook[pos.turn][side];
580
+ return {
581
+ from: move.from,
582
+ to: defined(rookFrom) ? rookFrom : move.to,
583
+ };
584
+ };
585
+ export const isStandardMaterialSide = (board, color) => {
586
+ const promoted = Math.max(board.pieces(color, "queen").size() - 1, 0) +
587
+ Math.max(board.pieces(color, "rook").size() - 2, 0) +
588
+ Math.max(board.pieces(color, "knight").size() - 2, 0) +
589
+ Math.max(board.pieces(color, "bishop").intersect(SquareSet.lightSquares()).size() - 1, 0) +
590
+ Math.max(board.pieces(color, "bishop").intersect(SquareSet.darkSquares()).size() - 1, 0);
591
+ return board.pieces(color, "pawn").size() + promoted <= 8;
592
+ };
593
+ export const isStandardMaterial = (pos) => COLORS.every((color) => isStandardMaterialSide(pos.board, color));
594
+ export const isImpossibleCheck = (pos) => {
595
+ const ourKing = pos.board.kingOf(pos.turn);
596
+ if (!defined(ourKing))
597
+ return false;
598
+ const checkers = pos.kingAttackers(ourKing, opposite(pos.turn), pos.board.occupied);
599
+ if (checkers.isEmpty())
600
+ return false;
601
+ if (defined(pos.epSquare)) {
602
+ // The pushed pawn must be the only checker, or it has uncovered
603
+ // check by a single sliding piece.
604
+ const pushedTo = pos.epSquare ^ 8;
605
+ const pushedFrom = pos.epSquare ^ 24;
606
+ return (checkers.moreThanOne() ||
607
+ (checkers.first() !== pushedTo &&
608
+ pos
609
+ .kingAttackers(ourKing, opposite(pos.turn), pos.board.occupied.without(pushedTo).with(pushedFrom))
610
+ .nonEmpty()));
611
+ }
612
+ else if (pos.rules === "atomic") {
613
+ // Other king moving away can cause many checks to be given at the same
614
+ // time. Not checking details, or even that the king is close enough.
615
+ return false;
616
+ }
617
+ else {
618
+ // Sliding checkers aligned with king.
619
+ return (checkers.size() > 2 ||
620
+ (checkers.size() === 2 && ray(checkers.first(), checkers.last()).has(ourKing)) || // Sliding checkers aligned with king
621
+ checkers.intersect(pos.board.steppers()).moreThanOne());
622
+ }
623
+ };
624
+ //# sourceMappingURL=chess.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chess.js","sourceRoot":"","sources":["../../src/chess.ts"],"names":[],"mappings":"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"}