js-chess-engine 1.0.3 → 2.0.1-rc.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 +387 -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 +25 -29
  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,CA2CT;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,387 @@
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
+ const pawnAttacks = attackerColor === types_1.InternalColor.WHITE
31
+ ? (0, Position_1.getBlackPawnAttacks)(square) // If white attacks, check where black pawns would be
32
+ : (0, Position_1.getWhitePawnAttacks)(square); // If black attacks, check where white pawns would be
33
+ const pawns = attackerColor === types_1.InternalColor.WHITE ? board.whitePawns : board.blackPawns;
34
+ if ((pawnAttacks & pawns) !== 0n) {
35
+ return true;
36
+ }
37
+ // Check knight attacks
38
+ const knightAttacks = (0, Position_1.getKnightAttacks)(square);
39
+ const knights = attackerColor === types_1.InternalColor.WHITE ? board.whiteKnights : board.blackKnights;
40
+ if ((knightAttacks & knights) !== 0n) {
41
+ return true;
42
+ }
43
+ // Check bishop and queen diagonal attacks
44
+ const bishopAttacks = (0, Position_1.getBishopAttacks)(square, board.allPieces);
45
+ const bishops = attackerColor === types_1.InternalColor.WHITE ? board.whiteBishops : board.blackBishops;
46
+ const queens = attackerColor === types_1.InternalColor.WHITE ? board.whiteQueens : board.blackQueens;
47
+ if ((bishopAttacks & (bishops | queens)) !== 0n) {
48
+ return true;
49
+ }
50
+ // Check rook and queen straight attacks
51
+ const rookAttacks = (0, Position_1.getRookAttacks)(square, board.allPieces);
52
+ const rooks = attackerColor === types_1.InternalColor.WHITE ? board.whiteRooks : board.blackRooks;
53
+ if ((rookAttacks & (rooks | queens)) !== 0n) {
54
+ return true;
55
+ }
56
+ // Check king attacks
57
+ const kingAttacks = (0, Position_1.getKingAttacks)(square);
58
+ const king = attackerColor === types_1.InternalColor.WHITE ? board.whiteKing : board.blackKing;
59
+ if ((kingAttacks & king) !== 0n) {
60
+ return true;
61
+ }
62
+ return false;
63
+ }
64
+ /**
65
+ * Check if the current player's king is in check
66
+ *
67
+ * @param board - Board to check
68
+ * @returns true if king is in check
69
+ */
70
+ function isKingInCheck(board) {
71
+ const kingBitboard = board.turn === types_1.InternalColor.WHITE ? board.whiteKing : board.blackKing;
72
+ if (kingBitboard === 0n) {
73
+ return false; // No king (shouldn't happen in real game)
74
+ }
75
+ const kingSquare = (0, conversion_1.getLowestSetBit)(kingBitboard);
76
+ const opponentColor = board.turn === types_1.InternalColor.WHITE ? types_1.InternalColor.BLACK : types_1.InternalColor.WHITE;
77
+ return isSquareAttacked(board, kingSquare, opponentColor);
78
+ }
79
+ /**
80
+ * Get all squares attacked by a specific color
81
+ *
82
+ * @param board - Board to check
83
+ * @param attackerColor - Color of attacking pieces
84
+ * @returns Bitboard of all attacked squares
85
+ */
86
+ function getAttackedSquares(board, attackerColor) {
87
+ let attacked = 0n;
88
+ // Pawn attacks
89
+ const pawns = attackerColor === types_1.InternalColor.WHITE ? board.whitePawns : board.blackPawns;
90
+ if (attackerColor === types_1.InternalColor.WHITE) {
91
+ // White pawns attack north-east and north-west
92
+ attacked |= ((pawns & 0xfefefefefefefefen) << 9n); // North-East (not on H-file)
93
+ attacked |= ((pawns & 0x7f7f7f7f7f7f7f7fn) << 7n); // North-West (not on A-file)
94
+ }
95
+ else {
96
+ // Black pawns attack south-east and south-west
97
+ attacked |= ((pawns & 0xfefefefefefefefen) >> 7n); // South-East (not on H-file)
98
+ attacked |= ((pawns & 0x7f7f7f7f7f7f7f7fn) >> 9n); // South-West (not on A-file)
99
+ }
100
+ // Knight attacks
101
+ const knights = attackerColor === types_1.InternalColor.WHITE ? board.whiteKnights : board.blackKnights;
102
+ let knightsBB = knights;
103
+ while (knightsBB !== 0n) {
104
+ const sq = (0, conversion_1.getLowestSetBit)(knightsBB);
105
+ attacked |= (0, Position_1.getKnightAttacks)(sq);
106
+ knightsBB &= knightsBB - 1n; // Clear lowest bit
107
+ }
108
+ // Bishop attacks
109
+ const bishops = attackerColor === types_1.InternalColor.WHITE ? board.whiteBishops : board.blackBishops;
110
+ let bishopsBB = bishops;
111
+ while (bishopsBB !== 0n) {
112
+ const sq = (0, conversion_1.getLowestSetBit)(bishopsBB);
113
+ attacked |= (0, Position_1.getBishopAttacks)(sq, board.allPieces);
114
+ bishopsBB &= bishopsBB - 1n;
115
+ }
116
+ // Rook attacks
117
+ const rooks = attackerColor === types_1.InternalColor.WHITE ? board.whiteRooks : board.blackRooks;
118
+ let rooksBB = rooks;
119
+ while (rooksBB !== 0n) {
120
+ const sq = (0, conversion_1.getLowestSetBit)(rooksBB);
121
+ attacked |= (0, Position_1.getRookAttacks)(sq, board.allPieces);
122
+ rooksBB &= rooksBB - 1n;
123
+ }
124
+ // Queen attacks
125
+ const queens = attackerColor === types_1.InternalColor.WHITE ? board.whiteQueens : board.blackQueens;
126
+ let queensBB = queens;
127
+ while (queensBB !== 0n) {
128
+ const sq = (0, conversion_1.getLowestSetBit)(queensBB);
129
+ attacked |= (0, Position_1.getQueenAttacks)(sq, board.allPieces);
130
+ queensBB &= queensBB - 1n;
131
+ }
132
+ // King attacks
133
+ const king = attackerColor === types_1.InternalColor.WHITE ? board.whiteKing : board.blackKing;
134
+ if (king !== 0n) {
135
+ const kingSquare = (0, conversion_1.getLowestSetBit)(king);
136
+ attacked |= (0, Position_1.getKingAttacks)(kingSquare);
137
+ }
138
+ return attacked;
139
+ }
140
+ /**
141
+ * Get all pieces attacking a specific square
142
+ *
143
+ * @param board - Board to check
144
+ * @param square - Square being attacked
145
+ * @param attackerColor - Color of attacking pieces
146
+ * @returns Bitboard of all pieces attacking the square
147
+ */
148
+ function getAttackers(board, square, attackerColor) {
149
+ let attackers = 0n;
150
+ // Pawn attackers
151
+ const pawnAttacks = attackerColor === types_1.InternalColor.WHITE
152
+ ? (0, Position_1.getBlackPawnAttacks)(square)
153
+ : (0, Position_1.getWhitePawnAttacks)(square);
154
+ const pawns = attackerColor === types_1.InternalColor.WHITE ? board.whitePawns : board.blackPawns;
155
+ attackers |= pawnAttacks & pawns;
156
+ // Knight attackers
157
+ const knightAttacks = (0, Position_1.getKnightAttacks)(square);
158
+ const knights = attackerColor === types_1.InternalColor.WHITE ? board.whiteKnights : board.blackKnights;
159
+ attackers |= knightAttacks & knights;
160
+ // Bishop and queen diagonal attackers
161
+ const bishopAttacks = (0, Position_1.getBishopAttacks)(square, board.allPieces);
162
+ const bishops = attackerColor === types_1.InternalColor.WHITE ? board.whiteBishops : board.blackBishops;
163
+ const queens = attackerColor === types_1.InternalColor.WHITE ? board.whiteQueens : board.blackQueens;
164
+ attackers |= bishopAttacks & (bishops | queens);
165
+ // Rook and queen straight attackers
166
+ const rookAttacks = (0, Position_1.getRookAttacks)(square, board.allPieces);
167
+ const rooks = attackerColor === types_1.InternalColor.WHITE ? board.whiteRooks : board.blackRooks;
168
+ attackers |= rookAttacks & (rooks | queens);
169
+ // King attackers
170
+ const kingAttacks = (0, Position_1.getKingAttacks)(square);
171
+ const king = attackerColor === types_1.InternalColor.WHITE ? board.whiteKing : board.blackKing;
172
+ attackers |= kingAttacks & king;
173
+ return attackers;
174
+ }
175
+ /**
176
+ * Check if moving a piece would leave the king in check (pinned piece detection)
177
+ *
178
+ * @param board - Board state
179
+ * @param from - Square piece is moving from
180
+ * @param to - Square piece is moving to
181
+ * @returns true if move would leave king in check
182
+ */
183
+ function wouldLeaveKingInCheck(board, from, to) {
184
+ const piece = board.mailbox[from];
185
+ const capturedPiece = board.mailbox[to];
186
+ const color = board.turn;
187
+ // Make the move temporarily
188
+ board.mailbox[from] = types_1.Piece.EMPTY;
189
+ board.mailbox[to] = piece;
190
+ // Update bitboards
191
+ const fromBit = 1n << BigInt(from);
192
+ const toBit = 1n << BigInt(to);
193
+ const moveBits = fromBit | toBit;
194
+ // Save original bitboard state
195
+ let originalPieceBB;
196
+ let originalCapturedBB = null;
197
+ // Update piece bitboard
198
+ switch (piece) {
199
+ case types_1.Piece.WHITE_PAWN:
200
+ originalPieceBB = board.whitePawns;
201
+ board.whitePawns = (board.whitePawns & ~fromBit) | toBit;
202
+ break;
203
+ case types_1.Piece.WHITE_KNIGHT:
204
+ originalPieceBB = board.whiteKnights;
205
+ board.whiteKnights = (board.whiteKnights & ~fromBit) | toBit;
206
+ break;
207
+ case types_1.Piece.WHITE_BISHOP:
208
+ originalPieceBB = board.whiteBishops;
209
+ board.whiteBishops = (board.whiteBishops & ~fromBit) | toBit;
210
+ break;
211
+ case types_1.Piece.WHITE_ROOK:
212
+ originalPieceBB = board.whiteRooks;
213
+ board.whiteRooks = (board.whiteRooks & ~fromBit) | toBit;
214
+ break;
215
+ case types_1.Piece.WHITE_QUEEN:
216
+ originalPieceBB = board.whiteQueens;
217
+ board.whiteQueens = (board.whiteQueens & ~fromBit) | toBit;
218
+ break;
219
+ case types_1.Piece.WHITE_KING:
220
+ originalPieceBB = board.whiteKing;
221
+ board.whiteKing = (board.whiteKing & ~fromBit) | toBit;
222
+ break;
223
+ case types_1.Piece.BLACK_PAWN:
224
+ originalPieceBB = board.blackPawns;
225
+ board.blackPawns = (board.blackPawns & ~fromBit) | toBit;
226
+ break;
227
+ case types_1.Piece.BLACK_KNIGHT:
228
+ originalPieceBB = board.blackKnights;
229
+ board.blackKnights = (board.blackKnights & ~fromBit) | toBit;
230
+ break;
231
+ case types_1.Piece.BLACK_BISHOP:
232
+ originalPieceBB = board.blackBishops;
233
+ board.blackBishops = (board.blackBishops & ~fromBit) | toBit;
234
+ break;
235
+ case types_1.Piece.BLACK_ROOK:
236
+ originalPieceBB = board.blackRooks;
237
+ board.blackRooks = (board.blackRooks & ~fromBit) | toBit;
238
+ break;
239
+ case types_1.Piece.BLACK_QUEEN:
240
+ originalPieceBB = board.blackQueens;
241
+ board.blackQueens = (board.blackQueens & ~fromBit) | toBit;
242
+ break;
243
+ case types_1.Piece.BLACK_KING:
244
+ originalPieceBB = board.blackKing;
245
+ board.blackKing = (board.blackKing & ~fromBit) | toBit;
246
+ break;
247
+ default:
248
+ originalPieceBB = 0n;
249
+ }
250
+ // Update captured piece bitboard if there's a capture
251
+ if (capturedPiece !== types_1.Piece.EMPTY) {
252
+ switch (capturedPiece) {
253
+ case types_1.Piece.WHITE_PAWN:
254
+ originalCapturedBB = board.whitePawns;
255
+ board.whitePawns &= ~toBit;
256
+ break;
257
+ case types_1.Piece.WHITE_KNIGHT:
258
+ originalCapturedBB = board.whiteKnights;
259
+ board.whiteKnights &= ~toBit;
260
+ break;
261
+ case types_1.Piece.WHITE_BISHOP:
262
+ originalCapturedBB = board.whiteBishops;
263
+ board.whiteBishops &= ~toBit;
264
+ break;
265
+ case types_1.Piece.WHITE_ROOK:
266
+ originalCapturedBB = board.whiteRooks;
267
+ board.whiteRooks &= ~toBit;
268
+ break;
269
+ case types_1.Piece.WHITE_QUEEN:
270
+ originalCapturedBB = board.whiteQueens;
271
+ board.whiteQueens &= ~toBit;
272
+ break;
273
+ case types_1.Piece.BLACK_PAWN:
274
+ originalCapturedBB = board.blackPawns;
275
+ board.blackPawns &= ~toBit;
276
+ break;
277
+ case types_1.Piece.BLACK_KNIGHT:
278
+ originalCapturedBB = board.blackKnights;
279
+ board.blackKnights &= ~toBit;
280
+ break;
281
+ case types_1.Piece.BLACK_BISHOP:
282
+ originalCapturedBB = board.blackBishops;
283
+ board.blackBishops &= ~toBit;
284
+ break;
285
+ case types_1.Piece.BLACK_ROOK:
286
+ originalCapturedBB = board.blackRooks;
287
+ board.blackRooks &= ~toBit;
288
+ break;
289
+ case types_1.Piece.BLACK_QUEEN:
290
+ originalCapturedBB = board.blackQueens;
291
+ board.blackQueens &= ~toBit;
292
+ break;
293
+ }
294
+ }
295
+ // Update composite bitboards
296
+ const originalWhitePieces = board.whitePieces;
297
+ const originalBlackPieces = board.blackPieces;
298
+ const originalAllPieces = board.allPieces;
299
+ board.whitePieces = board.whitePawns | board.whiteKnights | board.whiteBishops |
300
+ board.whiteRooks | board.whiteQueens | board.whiteKing;
301
+ board.blackPieces = board.blackPawns | board.blackKnights | board.blackBishops |
302
+ board.blackRooks | board.blackQueens | board.blackKing;
303
+ board.allPieces = board.whitePieces | board.blackPieces;
304
+ // Check if king is in check
305
+ const inCheck = isKingInCheck(board);
306
+ // Undo the move
307
+ board.mailbox[from] = piece;
308
+ board.mailbox[to] = capturedPiece;
309
+ // Restore bitboards
310
+ switch (piece) {
311
+ case types_1.Piece.WHITE_PAWN:
312
+ board.whitePawns = originalPieceBB;
313
+ break;
314
+ case types_1.Piece.WHITE_KNIGHT:
315
+ board.whiteKnights = originalPieceBB;
316
+ break;
317
+ case types_1.Piece.WHITE_BISHOP:
318
+ board.whiteBishops = originalPieceBB;
319
+ break;
320
+ case types_1.Piece.WHITE_ROOK:
321
+ board.whiteRooks = originalPieceBB;
322
+ break;
323
+ case types_1.Piece.WHITE_QUEEN:
324
+ board.whiteQueens = originalPieceBB;
325
+ break;
326
+ case types_1.Piece.WHITE_KING:
327
+ board.whiteKing = originalPieceBB;
328
+ break;
329
+ case types_1.Piece.BLACK_PAWN:
330
+ board.blackPawns = originalPieceBB;
331
+ break;
332
+ case types_1.Piece.BLACK_KNIGHT:
333
+ board.blackKnights = originalPieceBB;
334
+ break;
335
+ case types_1.Piece.BLACK_BISHOP:
336
+ board.blackBishops = originalPieceBB;
337
+ break;
338
+ case types_1.Piece.BLACK_ROOK:
339
+ board.blackRooks = originalPieceBB;
340
+ break;
341
+ case types_1.Piece.BLACK_QUEEN:
342
+ board.blackQueens = originalPieceBB;
343
+ break;
344
+ case types_1.Piece.BLACK_KING:
345
+ board.blackKing = originalPieceBB;
346
+ break;
347
+ }
348
+ if (originalCapturedBB !== null) {
349
+ switch (capturedPiece) {
350
+ case types_1.Piece.WHITE_PAWN:
351
+ board.whitePawns = originalCapturedBB;
352
+ break;
353
+ case types_1.Piece.WHITE_KNIGHT:
354
+ board.whiteKnights = originalCapturedBB;
355
+ break;
356
+ case types_1.Piece.WHITE_BISHOP:
357
+ board.whiteBishops = originalCapturedBB;
358
+ break;
359
+ case types_1.Piece.WHITE_ROOK:
360
+ board.whiteRooks = originalCapturedBB;
361
+ break;
362
+ case types_1.Piece.WHITE_QUEEN:
363
+ board.whiteQueens = originalCapturedBB;
364
+ break;
365
+ case types_1.Piece.BLACK_PAWN:
366
+ board.blackPawns = originalCapturedBB;
367
+ break;
368
+ case types_1.Piece.BLACK_KNIGHT:
369
+ board.blackKnights = originalCapturedBB;
370
+ break;
371
+ case types_1.Piece.BLACK_BISHOP:
372
+ board.blackBishops = originalCapturedBB;
373
+ break;
374
+ case types_1.Piece.BLACK_ROOK:
375
+ board.blackRooks = originalCapturedBB;
376
+ break;
377
+ case types_1.Piece.BLACK_QUEEN:
378
+ board.blackQueens = originalCapturedBB;
379
+ break;
380
+ }
381
+ }
382
+ board.whitePieces = originalWhitePieces;
383
+ board.blackPieces = originalBlackPieces;
384
+ board.allPieces = originalAllPieces;
385
+ return inCheck;
386
+ }
387
+ //# 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"}