js-chess-engine 1.0.3 → 2.0.0

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 (104) hide show
  1. package/README.md +586 -205
  2. package/dist/adapters/APIAdapter.d.ts +88 -0
  3. package/dist/adapters/APIAdapter.d.ts.map +1 -0
  4. package/dist/adapters/APIAdapter.js +225 -0
  5. package/dist/adapters/APIAdapter.js.map +1 -0
  6. package/dist/ai/AIEngine.d.ts +42 -0
  7. package/dist/ai/AIEngine.d.ts.map +1 -0
  8. package/dist/ai/AIEngine.js +62 -0
  9. package/dist/ai/AIEngine.js.map +1 -0
  10. package/dist/ai/Evaluator.d.ts +48 -0
  11. package/dist/ai/Evaluator.d.ts.map +1 -0
  12. package/dist/ai/Evaluator.js +248 -0
  13. package/dist/ai/Evaluator.js.map +1 -0
  14. package/dist/ai/MoveOrdering.d.ts +60 -0
  15. package/dist/ai/MoveOrdering.d.ts.map +1 -0
  16. package/dist/ai/MoveOrdering.js +173 -0
  17. package/dist/ai/MoveOrdering.js.map +1 -0
  18. package/dist/ai/Search.d.ts +62 -0
  19. package/dist/ai/Search.d.ts.map +1 -0
  20. package/dist/ai/Search.js +340 -0
  21. package/dist/ai/Search.js.map +1 -0
  22. package/dist/ai/TranspositionTable.d.ts +100 -0
  23. package/dist/ai/TranspositionTable.d.ts.map +1 -0
  24. package/dist/ai/TranspositionTable.js +176 -0
  25. package/dist/ai/TranspositionTable.js.map +1 -0
  26. package/dist/core/AttackDetector.d.ts +52 -0
  27. package/dist/core/AttackDetector.d.ts.map +1 -0
  28. package/dist/core/AttackDetector.js +397 -0
  29. package/dist/core/AttackDetector.js.map +1 -0
  30. package/dist/core/Board.d.ts +109 -0
  31. package/dist/core/Board.d.ts.map +1 -0
  32. package/dist/core/Board.js +410 -0
  33. package/dist/core/Board.js.map +1 -0
  34. package/dist/core/MoveGenerator.d.ts +48 -0
  35. package/dist/core/MoveGenerator.d.ts.map +1 -0
  36. package/dist/core/MoveGenerator.js +678 -0
  37. package/dist/core/MoveGenerator.js.map +1 -0
  38. package/dist/core/Position.d.ts +135 -0
  39. package/dist/core/Position.d.ts.map +1 -0
  40. package/dist/core/Position.js +351 -0
  41. package/dist/core/Position.js.map +1 -0
  42. package/dist/core/index.d.ts +9 -0
  43. package/dist/core/index.d.ts.map +1 -0
  44. package/dist/core/index.js +25 -0
  45. package/dist/core/index.js.map +1 -0
  46. package/dist/core/zobrist.d.ts +93 -0
  47. package/dist/core/zobrist.d.ts.map +1 -0
  48. package/dist/core/zobrist.js +273 -0
  49. package/dist/core/zobrist.js.map +1 -0
  50. package/dist/index.d.ts +154 -0
  51. package/dist/index.d.ts.map +1 -0
  52. package/dist/index.js +353 -0
  53. package/dist/index.js.map +1 -0
  54. package/dist/types/ai.types.d.ts +97 -0
  55. package/dist/types/ai.types.d.ts.map +1 -0
  56. package/dist/types/ai.types.js +17 -0
  57. package/dist/types/ai.types.js.map +1 -0
  58. package/dist/types/board.types.d.ts +140 -0
  59. package/dist/types/board.types.d.ts.map +1 -0
  60. package/dist/types/board.types.js +34 -0
  61. package/dist/types/board.types.js.map +1 -0
  62. package/dist/types/index.d.ts +7 -0
  63. package/dist/types/index.d.ts.map +1 -0
  64. package/dist/types/index.js +26 -0
  65. package/dist/types/index.js.map +1 -0
  66. package/dist/types/move.types.d.ts +70 -0
  67. package/dist/types/move.types.d.ts.map +1 -0
  68. package/dist/types/move.types.js +53 -0
  69. package/dist/types/move.types.js.map +1 -0
  70. package/dist/utils/constants.d.ts +123 -0
  71. package/dist/utils/constants.d.ts.map +1 -0
  72. package/dist/utils/constants.js +259 -0
  73. package/dist/utils/constants.js.map +1 -0
  74. package/dist/utils/conversion.d.ts +152 -0
  75. package/dist/utils/conversion.d.ts.map +1 -0
  76. package/dist/utils/conversion.js +288 -0
  77. package/dist/utils/conversion.js.map +1 -0
  78. package/dist/utils/environment.d.ts +33 -0
  79. package/dist/utils/environment.d.ts.map +1 -0
  80. package/dist/utils/environment.js +71 -0
  81. package/dist/utils/environment.js.map +1 -0
  82. package/dist/utils/fen.d.ts +28 -0
  83. package/dist/utils/fen.d.ts.map +1 -0
  84. package/dist/utils/fen.js +203 -0
  85. package/dist/utils/fen.js.map +1 -0
  86. package/package.json +29 -30
  87. package/.eslintrc.json +0 -16
  88. package/.github/workflows/main.yml +0 -20
  89. package/.nvmrc +0 -1
  90. package/CHANGELOG.md +0 -597
  91. package/dist/js-chess-engine.js +0 -1
  92. package/example/aiMatch.mjs +0 -21
  93. package/example/console.mjs +0 -37
  94. package/example/server.mjs +0 -27
  95. package/lib/Board.mjs +0 -946
  96. package/lib/const/board.mjs +0 -838
  97. package/lib/js-chess-engine.mjs +0 -99
  98. package/lib/utils.mjs +0 -154
  99. package/test/.eslintrc.json +0 -11
  100. package/test/ai.test.mjs +0 -132
  101. package/test/badge.svg +0 -1
  102. package/test/importExport.mjs +0 -108
  103. package/test/moves.test.mjs +0 -798
  104. package/webpack.config.js +0 -12
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Attack detection for chess positions
3
+ *
4
+ * This module provides fast attack detection using bitboards for:
5
+ * - Checking if a square is under attack
6
+ * - Detecting check and checkmate
7
+ * - Generating attack bitboards
8
+ */
9
+ import { InternalBoard, Bitboard, SquareIndex, InternalColor } from '../types';
10
+ /**
11
+ * Check if a square is attacked by a specific color
12
+ *
13
+ * @param board - Board to check
14
+ * @param square - Square index to check
15
+ * @param attackerColor - Color of attacking pieces
16
+ * @returns true if square is attacked by attackerColor
17
+ */
18
+ export declare function isSquareAttacked(board: InternalBoard, square: SquareIndex, attackerColor: InternalColor): boolean;
19
+ /**
20
+ * Check if the current player's king is in check
21
+ *
22
+ * @param board - Board to check
23
+ * @returns true if king is in check
24
+ */
25
+ export declare function isKingInCheck(board: InternalBoard): boolean;
26
+ /**
27
+ * Get all squares attacked by a specific color
28
+ *
29
+ * @param board - Board to check
30
+ * @param attackerColor - Color of attacking pieces
31
+ * @returns Bitboard of all attacked squares
32
+ */
33
+ export declare function getAttackedSquares(board: InternalBoard, attackerColor: InternalColor): Bitboard;
34
+ /**
35
+ * Get all pieces attacking a specific square
36
+ *
37
+ * @param board - Board to check
38
+ * @param square - Square being attacked
39
+ * @param attackerColor - Color of attacking pieces
40
+ * @returns Bitboard of all pieces attacking the square
41
+ */
42
+ export declare function getAttackers(board: InternalBoard, square: SquareIndex, attackerColor: InternalColor): Bitboard;
43
+ /**
44
+ * Check if moving a piece would leave the king in check (pinned piece detection)
45
+ *
46
+ * @param board - Board state
47
+ * @param from - Square piece is moving from
48
+ * @param to - Square piece is moving to
49
+ * @returns true if move would leave king in check
50
+ */
51
+ export declare function wouldLeaveKingInCheck(board: InternalBoard, from: SquareIndex, to: SquareIndex): boolean;
52
+ //# sourceMappingURL=AttackDetector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AttackDetector.d.ts","sourceRoot":"","sources":["../../src/core/AttackDetector.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EACH,aAAa,EACb,QAAQ,EACR,WAAW,EAEX,aAAa,EAChB,MAAM,UAAU,CAAC;AAYlB;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC5B,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,WAAW,EACnB,aAAa,EAAE,aAAa,GAC7B,OAAO,CAqDT;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAW3D;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,GAAG,QAAQ,CA2D/F;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CACxB,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,WAAW,EACnB,aAAa,EAAE,aAAa,GAC7B,QAAQ,CAgCV;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACjC,KAAK,EAAE,aAAa,EACpB,IAAI,EAAE,WAAW,EACjB,EAAE,EAAE,WAAW,GAChB,OAAO,CA4KT"}
@@ -0,0 +1,397 @@
1
+ "use strict";
2
+ /**
3
+ * Attack detection for chess positions
4
+ *
5
+ * This module provides fast attack detection using bitboards for:
6
+ * - Checking if a square is under attack
7
+ * - Detecting check and checkmate
8
+ * - Generating attack bitboards
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.isSquareAttacked = isSquareAttacked;
12
+ exports.isKingInCheck = isKingInCheck;
13
+ exports.getAttackedSquares = getAttackedSquares;
14
+ exports.getAttackers = getAttackers;
15
+ exports.wouldLeaveKingInCheck = wouldLeaveKingInCheck;
16
+ const types_1 = require("../types");
17
+ const Position_1 = require("./Position");
18
+ const conversion_1 = require("../utils/conversion");
19
+ /**
20
+ * Check if a square is attacked by a specific color
21
+ *
22
+ * @param board - Board to check
23
+ * @param square - Square index to check
24
+ * @param attackerColor - Color of attacking pieces
25
+ * @returns true if square is attacked by attackerColor
26
+ */
27
+ function isSquareAttacked(board, square, attackerColor) {
28
+ const attackers = attackerColor === types_1.InternalColor.WHITE ? board.whitePieces : board.blackPieces;
29
+ // Check pawn attacks
30
+ // IMPORTANT: `getWhitePawnAttacks(square)` returns the squares a *white pawn on `square`*
31
+ // would attack (north-east/north-west). For attack detection we need the inverse mapping:
32
+ // which pawn squares could attack `square`.
33
+ // That means:
34
+ // - to see if `square` is attacked by WHITE pawns, look for WHITE pawns on the squares
35
+ // that a BLACK pawn from `square` would attack (south-east/south-west), i.e. potential
36
+ // white pawn origins.
37
+ // - to see if `square` is attacked by BLACK pawns, look for BLACK pawns on the squares
38
+ // that a WHITE pawn from `square` would attack (north-east/north-west), i.e. potential
39
+ // black pawn origins.
40
+ const pawnAttackOrigins = attackerColor === types_1.InternalColor.WHITE
41
+ ? (0, Position_1.getBlackPawnAttacks)(square)
42
+ : (0, Position_1.getWhitePawnAttacks)(square);
43
+ const pawns = attackerColor === types_1.InternalColor.WHITE ? board.whitePawns : board.blackPawns;
44
+ if ((pawnAttackOrigins & pawns) !== 0n) {
45
+ return true;
46
+ }
47
+ // Check knight attacks
48
+ const knightAttacks = (0, Position_1.getKnightAttacks)(square);
49
+ const knights = attackerColor === types_1.InternalColor.WHITE ? board.whiteKnights : board.blackKnights;
50
+ if ((knightAttacks & knights) !== 0n) {
51
+ return true;
52
+ }
53
+ // Check bishop and queen diagonal attacks
54
+ const bishopAttacks = (0, Position_1.getBishopAttacks)(square, board.allPieces);
55
+ const bishops = attackerColor === types_1.InternalColor.WHITE ? board.whiteBishops : board.blackBishops;
56
+ const queens = attackerColor === types_1.InternalColor.WHITE ? board.whiteQueens : board.blackQueens;
57
+ if ((bishopAttacks & (bishops | queens)) !== 0n) {
58
+ return true;
59
+ }
60
+ // Check rook and queen straight attacks
61
+ const rookAttacks = (0, Position_1.getRookAttacks)(square, board.allPieces);
62
+ const rooks = attackerColor === types_1.InternalColor.WHITE ? board.whiteRooks : board.blackRooks;
63
+ if ((rookAttacks & (rooks | queens)) !== 0n) {
64
+ return true;
65
+ }
66
+ // Check king attacks
67
+ const kingAttacks = (0, Position_1.getKingAttacks)(square);
68
+ const king = attackerColor === types_1.InternalColor.WHITE ? board.whiteKing : board.blackKing;
69
+ if ((kingAttacks & king) !== 0n) {
70
+ return true;
71
+ }
72
+ return false;
73
+ }
74
+ /**
75
+ * Check if the current player's king is in check
76
+ *
77
+ * @param board - Board to check
78
+ * @returns true if king is in check
79
+ */
80
+ function isKingInCheck(board) {
81
+ const kingBitboard = board.turn === types_1.InternalColor.WHITE ? board.whiteKing : board.blackKing;
82
+ if (kingBitboard === 0n) {
83
+ return false; // No king (shouldn't happen in real game)
84
+ }
85
+ const kingSquare = (0, conversion_1.getLowestSetBit)(kingBitboard);
86
+ const opponentColor = board.turn === types_1.InternalColor.WHITE ? types_1.InternalColor.BLACK : types_1.InternalColor.WHITE;
87
+ return isSquareAttacked(board, kingSquare, opponentColor);
88
+ }
89
+ /**
90
+ * Get all squares attacked by a specific color
91
+ *
92
+ * @param board - Board to check
93
+ * @param attackerColor - Color of attacking pieces
94
+ * @returns Bitboard of all attacked squares
95
+ */
96
+ function getAttackedSquares(board, attackerColor) {
97
+ let attacked = 0n;
98
+ // Pawn attacks
99
+ const pawns = attackerColor === types_1.InternalColor.WHITE ? board.whitePawns : board.blackPawns;
100
+ if (attackerColor === types_1.InternalColor.WHITE) {
101
+ // White pawns attack north-east and north-west
102
+ attacked |= ((pawns & 0xfefefefefefefefen) << 9n); // North-East (not on H-file)
103
+ attacked |= ((pawns & 0x7f7f7f7f7f7f7f7fn) << 7n); // North-West (not on A-file)
104
+ }
105
+ else {
106
+ // Black pawns attack south-east and south-west
107
+ attacked |= ((pawns & 0xfefefefefefefefen) >> 7n); // South-East (not on H-file)
108
+ attacked |= ((pawns & 0x7f7f7f7f7f7f7f7fn) >> 9n); // South-West (not on A-file)
109
+ }
110
+ // Knight attacks
111
+ const knights = attackerColor === types_1.InternalColor.WHITE ? board.whiteKnights : board.blackKnights;
112
+ let knightsBB = knights;
113
+ while (knightsBB !== 0n) {
114
+ const sq = (0, conversion_1.getLowestSetBit)(knightsBB);
115
+ attacked |= (0, Position_1.getKnightAttacks)(sq);
116
+ knightsBB &= knightsBB - 1n; // Clear lowest bit
117
+ }
118
+ // Bishop attacks
119
+ const bishops = attackerColor === types_1.InternalColor.WHITE ? board.whiteBishops : board.blackBishops;
120
+ let bishopsBB = bishops;
121
+ while (bishopsBB !== 0n) {
122
+ const sq = (0, conversion_1.getLowestSetBit)(bishopsBB);
123
+ attacked |= (0, Position_1.getBishopAttacks)(sq, board.allPieces);
124
+ bishopsBB &= bishopsBB - 1n;
125
+ }
126
+ // Rook attacks
127
+ const rooks = attackerColor === types_1.InternalColor.WHITE ? board.whiteRooks : board.blackRooks;
128
+ let rooksBB = rooks;
129
+ while (rooksBB !== 0n) {
130
+ const sq = (0, conversion_1.getLowestSetBit)(rooksBB);
131
+ attacked |= (0, Position_1.getRookAttacks)(sq, board.allPieces);
132
+ rooksBB &= rooksBB - 1n;
133
+ }
134
+ // Queen attacks
135
+ const queens = attackerColor === types_1.InternalColor.WHITE ? board.whiteQueens : board.blackQueens;
136
+ let queensBB = queens;
137
+ while (queensBB !== 0n) {
138
+ const sq = (0, conversion_1.getLowestSetBit)(queensBB);
139
+ attacked |= (0, Position_1.getQueenAttacks)(sq, board.allPieces);
140
+ queensBB &= queensBB - 1n;
141
+ }
142
+ // King attacks
143
+ const king = attackerColor === types_1.InternalColor.WHITE ? board.whiteKing : board.blackKing;
144
+ if (king !== 0n) {
145
+ const kingSquare = (0, conversion_1.getLowestSetBit)(king);
146
+ attacked |= (0, Position_1.getKingAttacks)(kingSquare);
147
+ }
148
+ return attacked;
149
+ }
150
+ /**
151
+ * Get all pieces attacking a specific square
152
+ *
153
+ * @param board - Board to check
154
+ * @param square - Square being attacked
155
+ * @param attackerColor - Color of attacking pieces
156
+ * @returns Bitboard of all pieces attacking the square
157
+ */
158
+ function getAttackers(board, square, attackerColor) {
159
+ let attackers = 0n;
160
+ // Pawn attackers
161
+ const pawnAttackOrigins = attackerColor === types_1.InternalColor.WHITE
162
+ ? (0, Position_1.getBlackPawnAttacks)(square)
163
+ : (0, Position_1.getWhitePawnAttacks)(square);
164
+ const pawns = attackerColor === types_1.InternalColor.WHITE ? board.whitePawns : board.blackPawns;
165
+ attackers |= pawnAttackOrigins & pawns;
166
+ // Knight attackers
167
+ const knightAttacks = (0, Position_1.getKnightAttacks)(square);
168
+ const knights = attackerColor === types_1.InternalColor.WHITE ? board.whiteKnights : board.blackKnights;
169
+ attackers |= knightAttacks & knights;
170
+ // Bishop and queen diagonal attackers
171
+ const bishopAttacks = (0, Position_1.getBishopAttacks)(square, board.allPieces);
172
+ const bishops = attackerColor === types_1.InternalColor.WHITE ? board.whiteBishops : board.blackBishops;
173
+ const queens = attackerColor === types_1.InternalColor.WHITE ? board.whiteQueens : board.blackQueens;
174
+ attackers |= bishopAttacks & (bishops | queens);
175
+ // Rook and queen straight attackers
176
+ const rookAttacks = (0, Position_1.getRookAttacks)(square, board.allPieces);
177
+ const rooks = attackerColor === types_1.InternalColor.WHITE ? board.whiteRooks : board.blackRooks;
178
+ attackers |= rookAttacks & (rooks | queens);
179
+ // King attackers
180
+ const kingAttacks = (0, Position_1.getKingAttacks)(square);
181
+ const king = attackerColor === types_1.InternalColor.WHITE ? board.whiteKing : board.blackKing;
182
+ attackers |= kingAttacks & king;
183
+ return attackers;
184
+ }
185
+ /**
186
+ * Check if moving a piece would leave the king in check (pinned piece detection)
187
+ *
188
+ * @param board - Board state
189
+ * @param from - Square piece is moving from
190
+ * @param to - Square piece is moving to
191
+ * @returns true if move would leave king in check
192
+ */
193
+ function wouldLeaveKingInCheck(board, from, to) {
194
+ const piece = board.mailbox[from];
195
+ const capturedPiece = board.mailbox[to];
196
+ const color = board.turn;
197
+ // Make the move temporarily
198
+ board.mailbox[from] = types_1.Piece.EMPTY;
199
+ board.mailbox[to] = piece;
200
+ // Update bitboards
201
+ const fromBit = 1n << BigInt(from);
202
+ const toBit = 1n << BigInt(to);
203
+ const moveBits = fromBit | toBit;
204
+ // Save original bitboard state
205
+ let originalPieceBB;
206
+ let originalCapturedBB = null;
207
+ // Update piece bitboard
208
+ switch (piece) {
209
+ case types_1.Piece.WHITE_PAWN:
210
+ originalPieceBB = board.whitePawns;
211
+ board.whitePawns = (board.whitePawns & ~fromBit) | toBit;
212
+ break;
213
+ case types_1.Piece.WHITE_KNIGHT:
214
+ originalPieceBB = board.whiteKnights;
215
+ board.whiteKnights = (board.whiteKnights & ~fromBit) | toBit;
216
+ break;
217
+ case types_1.Piece.WHITE_BISHOP:
218
+ originalPieceBB = board.whiteBishops;
219
+ board.whiteBishops = (board.whiteBishops & ~fromBit) | toBit;
220
+ break;
221
+ case types_1.Piece.WHITE_ROOK:
222
+ originalPieceBB = board.whiteRooks;
223
+ board.whiteRooks = (board.whiteRooks & ~fromBit) | toBit;
224
+ break;
225
+ case types_1.Piece.WHITE_QUEEN:
226
+ originalPieceBB = board.whiteQueens;
227
+ board.whiteQueens = (board.whiteQueens & ~fromBit) | toBit;
228
+ break;
229
+ case types_1.Piece.WHITE_KING:
230
+ originalPieceBB = board.whiteKing;
231
+ board.whiteKing = (board.whiteKing & ~fromBit) | toBit;
232
+ break;
233
+ case types_1.Piece.BLACK_PAWN:
234
+ originalPieceBB = board.blackPawns;
235
+ board.blackPawns = (board.blackPawns & ~fromBit) | toBit;
236
+ break;
237
+ case types_1.Piece.BLACK_KNIGHT:
238
+ originalPieceBB = board.blackKnights;
239
+ board.blackKnights = (board.blackKnights & ~fromBit) | toBit;
240
+ break;
241
+ case types_1.Piece.BLACK_BISHOP:
242
+ originalPieceBB = board.blackBishops;
243
+ board.blackBishops = (board.blackBishops & ~fromBit) | toBit;
244
+ break;
245
+ case types_1.Piece.BLACK_ROOK:
246
+ originalPieceBB = board.blackRooks;
247
+ board.blackRooks = (board.blackRooks & ~fromBit) | toBit;
248
+ break;
249
+ case types_1.Piece.BLACK_QUEEN:
250
+ originalPieceBB = board.blackQueens;
251
+ board.blackQueens = (board.blackQueens & ~fromBit) | toBit;
252
+ break;
253
+ case types_1.Piece.BLACK_KING:
254
+ originalPieceBB = board.blackKing;
255
+ board.blackKing = (board.blackKing & ~fromBit) | toBit;
256
+ break;
257
+ default:
258
+ originalPieceBB = 0n;
259
+ }
260
+ // Update captured piece bitboard if there's a capture
261
+ if (capturedPiece !== types_1.Piece.EMPTY) {
262
+ switch (capturedPiece) {
263
+ case types_1.Piece.WHITE_PAWN:
264
+ originalCapturedBB = board.whitePawns;
265
+ board.whitePawns &= ~toBit;
266
+ break;
267
+ case types_1.Piece.WHITE_KNIGHT:
268
+ originalCapturedBB = board.whiteKnights;
269
+ board.whiteKnights &= ~toBit;
270
+ break;
271
+ case types_1.Piece.WHITE_BISHOP:
272
+ originalCapturedBB = board.whiteBishops;
273
+ board.whiteBishops &= ~toBit;
274
+ break;
275
+ case types_1.Piece.WHITE_ROOK:
276
+ originalCapturedBB = board.whiteRooks;
277
+ board.whiteRooks &= ~toBit;
278
+ break;
279
+ case types_1.Piece.WHITE_QUEEN:
280
+ originalCapturedBB = board.whiteQueens;
281
+ board.whiteQueens &= ~toBit;
282
+ break;
283
+ case types_1.Piece.BLACK_PAWN:
284
+ originalCapturedBB = board.blackPawns;
285
+ board.blackPawns &= ~toBit;
286
+ break;
287
+ case types_1.Piece.BLACK_KNIGHT:
288
+ originalCapturedBB = board.blackKnights;
289
+ board.blackKnights &= ~toBit;
290
+ break;
291
+ case types_1.Piece.BLACK_BISHOP:
292
+ originalCapturedBB = board.blackBishops;
293
+ board.blackBishops &= ~toBit;
294
+ break;
295
+ case types_1.Piece.BLACK_ROOK:
296
+ originalCapturedBB = board.blackRooks;
297
+ board.blackRooks &= ~toBit;
298
+ break;
299
+ case types_1.Piece.BLACK_QUEEN:
300
+ originalCapturedBB = board.blackQueens;
301
+ board.blackQueens &= ~toBit;
302
+ break;
303
+ }
304
+ }
305
+ // Update composite bitboards
306
+ const originalWhitePieces = board.whitePieces;
307
+ const originalBlackPieces = board.blackPieces;
308
+ const originalAllPieces = board.allPieces;
309
+ board.whitePieces = board.whitePawns | board.whiteKnights | board.whiteBishops |
310
+ board.whiteRooks | board.whiteQueens | board.whiteKing;
311
+ board.blackPieces = board.blackPawns | board.blackKnights | board.blackBishops |
312
+ board.blackRooks | board.blackQueens | board.blackKing;
313
+ board.allPieces = board.whitePieces | board.blackPieces;
314
+ // Check if king is in check
315
+ const inCheck = isKingInCheck(board);
316
+ // Undo the move
317
+ board.mailbox[from] = piece;
318
+ board.mailbox[to] = capturedPiece;
319
+ // Restore bitboards
320
+ switch (piece) {
321
+ case types_1.Piece.WHITE_PAWN:
322
+ board.whitePawns = originalPieceBB;
323
+ break;
324
+ case types_1.Piece.WHITE_KNIGHT:
325
+ board.whiteKnights = originalPieceBB;
326
+ break;
327
+ case types_1.Piece.WHITE_BISHOP:
328
+ board.whiteBishops = originalPieceBB;
329
+ break;
330
+ case types_1.Piece.WHITE_ROOK:
331
+ board.whiteRooks = originalPieceBB;
332
+ break;
333
+ case types_1.Piece.WHITE_QUEEN:
334
+ board.whiteQueens = originalPieceBB;
335
+ break;
336
+ case types_1.Piece.WHITE_KING:
337
+ board.whiteKing = originalPieceBB;
338
+ break;
339
+ case types_1.Piece.BLACK_PAWN:
340
+ board.blackPawns = originalPieceBB;
341
+ break;
342
+ case types_1.Piece.BLACK_KNIGHT:
343
+ board.blackKnights = originalPieceBB;
344
+ break;
345
+ case types_1.Piece.BLACK_BISHOP:
346
+ board.blackBishops = originalPieceBB;
347
+ break;
348
+ case types_1.Piece.BLACK_ROOK:
349
+ board.blackRooks = originalPieceBB;
350
+ break;
351
+ case types_1.Piece.BLACK_QUEEN:
352
+ board.blackQueens = originalPieceBB;
353
+ break;
354
+ case types_1.Piece.BLACK_KING:
355
+ board.blackKing = originalPieceBB;
356
+ break;
357
+ }
358
+ if (originalCapturedBB !== null) {
359
+ switch (capturedPiece) {
360
+ case types_1.Piece.WHITE_PAWN:
361
+ board.whitePawns = originalCapturedBB;
362
+ break;
363
+ case types_1.Piece.WHITE_KNIGHT:
364
+ board.whiteKnights = originalCapturedBB;
365
+ break;
366
+ case types_1.Piece.WHITE_BISHOP:
367
+ board.whiteBishops = originalCapturedBB;
368
+ break;
369
+ case types_1.Piece.WHITE_ROOK:
370
+ board.whiteRooks = originalCapturedBB;
371
+ break;
372
+ case types_1.Piece.WHITE_QUEEN:
373
+ board.whiteQueens = originalCapturedBB;
374
+ break;
375
+ case types_1.Piece.BLACK_PAWN:
376
+ board.blackPawns = originalCapturedBB;
377
+ break;
378
+ case types_1.Piece.BLACK_KNIGHT:
379
+ board.blackKnights = originalCapturedBB;
380
+ break;
381
+ case types_1.Piece.BLACK_BISHOP:
382
+ board.blackBishops = originalCapturedBB;
383
+ break;
384
+ case types_1.Piece.BLACK_ROOK:
385
+ board.blackRooks = originalCapturedBB;
386
+ break;
387
+ case types_1.Piece.BLACK_QUEEN:
388
+ board.blackQueens = originalCapturedBB;
389
+ break;
390
+ }
391
+ }
392
+ board.whitePieces = originalWhitePieces;
393
+ board.blackPieces = originalBlackPieces;
394
+ board.allPieces = originalAllPieces;
395
+ return inCheck;
396
+ }
397
+ //# sourceMappingURL=AttackDetector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AttackDetector.js","sourceRoot":"","sources":["../../src/core/AttackDetector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,109 @@
1
+ /**
2
+ * Internal board representation using hybrid bitboards + mailbox
3
+ *
4
+ * This module provides the core board state with:
5
+ * - Bitboards for fast attack detection and piece locations
6
+ * - Mailbox (Int8Array) for O(1) piece lookup by square
7
+ * - Zobrist hashing for transposition table
8
+ * - Efficient copying and comparison
9
+ */
10
+ import { InternalBoard, Piece, InternalColor, SquareIndex, Bitboard } from '../types';
11
+ /**
12
+ * Create a new empty internal board
13
+ *
14
+ * @returns Empty board with no pieces
15
+ */
16
+ export declare function createEmptyBoard(): InternalBoard;
17
+ /**
18
+ * Create a new board for the starting position
19
+ *
20
+ * @returns Board set up for standard chess starting position
21
+ */
22
+ export declare function createStartingBoard(): InternalBoard;
23
+ /**
24
+ * Set a piece on the board
25
+ *
26
+ * @param board - Board to modify
27
+ * @param index - Square index (0-63)
28
+ * @param piece - Piece to place
29
+ */
30
+ export declare function setPiece(board: InternalBoard, index: SquareIndex, piece: Piece): void;
31
+ /**
32
+ * Remove a piece from the board
33
+ *
34
+ * @param board - Board to modify
35
+ * @param index - Square index (0-63)
36
+ */
37
+ export declare function removePiece(board: InternalBoard, index: SquareIndex): void;
38
+ /**
39
+ * Get the piece at a square
40
+ *
41
+ * @param board - Board to query
42
+ * @param index - Square index (0-63)
43
+ * @returns Piece at the square
44
+ */
45
+ export declare function getPiece(board: InternalBoard, index: SquareIndex): Piece;
46
+ /**
47
+ * Get the bitboard for a specific piece type
48
+ *
49
+ * @param board - Board to query
50
+ * @param piece - Piece type
51
+ * @returns Bitboard with all pieces of this type
52
+ */
53
+ export declare function getBitboard(board: InternalBoard, piece: Piece): Bitboard;
54
+ /**
55
+ * Copy a board (efficient struct copy)
56
+ *
57
+ * @param source - Source board
58
+ * @returns New board with same state
59
+ */
60
+ export declare function copyBoard(source: InternalBoard): InternalBoard;
61
+ /**
62
+ * Check if a piece belongs to a specific color
63
+ *
64
+ * @param piece - Piece to check
65
+ * @param color - Color to check
66
+ * @returns true if piece is of the given color
67
+ */
68
+ export declare function isPieceColor(piece: Piece, color: InternalColor): boolean;
69
+ /**
70
+ * Get the color of a piece
71
+ *
72
+ * @param piece - Piece to check
73
+ * @returns Color of the piece, or null if empty
74
+ */
75
+ export declare function getPieceColor(piece: Piece): InternalColor | null;
76
+ /**
77
+ * Get the opposite color
78
+ *
79
+ * @param color - Color
80
+ * @returns Opposite color
81
+ */
82
+ export declare function oppositeColor(color: InternalColor): InternalColor;
83
+ /**
84
+ * Check if a square is empty
85
+ *
86
+ * @param board - Board to check
87
+ * @param index - Square index
88
+ * @returns true if square is empty
89
+ */
90
+ export declare function isSquareEmpty(board: InternalBoard, index: SquareIndex): boolean;
91
+ /**
92
+ * Check if a square is occupied by an enemy piece
93
+ *
94
+ * @param board - Board to check
95
+ * @param index - Square index
96
+ * @param color - Our color
97
+ * @returns true if square has enemy piece
98
+ */
99
+ export declare function isSquareEnemy(board: InternalBoard, index: SquareIndex, color: InternalColor): boolean;
100
+ /**
101
+ * Check if a square is occupied by a friendly piece
102
+ *
103
+ * @param board - Board to check
104
+ * @param index - Square index
105
+ * @param color - Our color
106
+ * @returns true if square has friendly piece
107
+ */
108
+ export declare function isSquareFriendly(board: InternalBoard, index: SquareIndex, color: InternalColor): boolean;
109
+ //# sourceMappingURL=Board.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Board.d.ts","sourceRoot":"","sources":["../../src/core/Board.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EACH,aAAa,EACb,KAAK,EACL,aAAa,EACb,WAAW,EACX,QAAQ,EACX,MAAM,UAAU,CAAC;AAGlB;;;;GAIG;AACH,wBAAgB,gBAAgB,IAAI,aAAa,CA8ChD;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,IAAI,aAAa,CA0CnD;AAED;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI,CAsErF;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI,CAkE1E;AAED;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,WAAW,GAAG,KAAK,CAExE;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,GAAG,QAAQ,CAgBxE;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,aAAa,GAAG,aAAa,CAiC9D;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,GAAG,OAAO,CAUxE;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,KAAK,GAAG,aAAa,GAAG,IAAI,CAOhE;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,aAAa,GAAG,aAAa,CAEjE;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAE/E;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,aAAa,GAAG,OAAO,CAOrG;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,aAAa,GAAG,OAAO,CAMxG"}