js-chess-engine 1.0.2 → 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 (103) 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 +27 -28
  87. package/.eslintrc.json +0 -16
  88. package/.github/workflows/main.yml +0 -20
  89. package/CHANGELOG.md +0 -587
  90. package/dist/js-chess-engine.js +0 -1
  91. package/example/aiMatch.mjs +0 -21
  92. package/example/console.mjs +0 -37
  93. package/example/server.mjs +0 -27
  94. package/lib/Board.mjs +0 -943
  95. package/lib/const/board.mjs +0 -838
  96. package/lib/js-chess-engine.mjs +0 -99
  97. package/lib/utils.mjs +0 -154
  98. package/test/.eslintrc.json +0 -11
  99. package/test/ai.test.mjs +0 -132
  100. package/test/badge.svg +0 -1
  101. package/test/importExport.mjs +0 -108
  102. package/test/moves.test.mjs +0 -773
  103. package/webpack.config.js +0 -12
@@ -0,0 +1,410 @@
1
+ "use strict";
2
+ /**
3
+ * Internal board representation using hybrid bitboards + mailbox
4
+ *
5
+ * This module provides the core board state with:
6
+ * - Bitboards for fast attack detection and piece locations
7
+ * - Mailbox (Int8Array) for O(1) piece lookup by square
8
+ * - Zobrist hashing for transposition table
9
+ * - Efficient copying and comparison
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.createEmptyBoard = createEmptyBoard;
13
+ exports.createStartingBoard = createStartingBoard;
14
+ exports.setPiece = setPiece;
15
+ exports.removePiece = removePiece;
16
+ exports.getPiece = getPiece;
17
+ exports.getBitboard = getBitboard;
18
+ exports.copyBoard = copyBoard;
19
+ exports.isPieceColor = isPieceColor;
20
+ exports.getPieceColor = getPieceColor;
21
+ exports.oppositeColor = oppositeColor;
22
+ exports.isSquareEmpty = isSquareEmpty;
23
+ exports.isSquareEnemy = isSquareEnemy;
24
+ exports.isSquareFriendly = isSquareFriendly;
25
+ const types_1 = require("../types");
26
+ const constants_1 = require("../utils/constants");
27
+ /**
28
+ * Create a new empty internal board
29
+ *
30
+ * @returns Empty board with no pieces
31
+ */
32
+ function createEmptyBoard() {
33
+ return {
34
+ // Mailbox (64 squares, each can hold a piece enum value)
35
+ mailbox: new Int8Array(constants_1.TOTAL_SQUARES),
36
+ // White piece bitboards
37
+ whitePawns: 0n,
38
+ whiteKnights: 0n,
39
+ whiteBishops: 0n,
40
+ whiteRooks: 0n,
41
+ whiteQueens: 0n,
42
+ whiteKing: 0n,
43
+ // Black piece bitboards
44
+ blackPawns: 0n,
45
+ blackKnights: 0n,
46
+ blackBishops: 0n,
47
+ blackRooks: 0n,
48
+ blackQueens: 0n,
49
+ blackKing: 0n,
50
+ // Composite bitboards
51
+ whitePieces: 0n,
52
+ blackPieces: 0n,
53
+ allPieces: 0n,
54
+ // Game state
55
+ turn: types_1.InternalColor.WHITE,
56
+ castlingRights: {
57
+ whiteShort: true,
58
+ blackShort: true,
59
+ whiteLong: true,
60
+ blackLong: true,
61
+ },
62
+ enPassantSquare: null,
63
+ halfMoveClock: 0,
64
+ fullMoveNumber: 1,
65
+ // Zobrist hash (will be computed)
66
+ zobristHash: 0n,
67
+ // Game status
68
+ isCheck: false,
69
+ isCheckmate: false,
70
+ isStalemate: false,
71
+ };
72
+ }
73
+ /**
74
+ * Create a new board for the starting position
75
+ *
76
+ * @returns Board set up for standard chess starting position
77
+ */
78
+ function createStartingBoard() {
79
+ const board = createEmptyBoard();
80
+ // White pawns (rank 2, indices 8-15)
81
+ for (let i = 8; i < 16; i++) {
82
+ setPiece(board, i, types_1.Piece.WHITE_PAWN);
83
+ }
84
+ // Black pawns (rank 7, indices 48-55)
85
+ for (let i = 48; i < 56; i++) {
86
+ setPiece(board, i, types_1.Piece.BLACK_PAWN);
87
+ }
88
+ // White pieces (rank 1, indices 0-7)
89
+ setPiece(board, 0, types_1.Piece.WHITE_ROOK); // A1
90
+ setPiece(board, 1, types_1.Piece.WHITE_KNIGHT); // B1
91
+ setPiece(board, 2, types_1.Piece.WHITE_BISHOP); // C1
92
+ setPiece(board, 3, types_1.Piece.WHITE_QUEEN); // D1
93
+ setPiece(board, 4, types_1.Piece.WHITE_KING); // E1
94
+ setPiece(board, 5, types_1.Piece.WHITE_BISHOP); // F1
95
+ setPiece(board, 6, types_1.Piece.WHITE_KNIGHT); // G1
96
+ setPiece(board, 7, types_1.Piece.WHITE_ROOK); // H1
97
+ // Black pieces (rank 8, indices 56-63)
98
+ setPiece(board, 56, types_1.Piece.BLACK_ROOK); // A8
99
+ setPiece(board, 57, types_1.Piece.BLACK_KNIGHT); // B8
100
+ setPiece(board, 58, types_1.Piece.BLACK_BISHOP); // C8
101
+ setPiece(board, 59, types_1.Piece.BLACK_QUEEN); // D8
102
+ setPiece(board, 60, types_1.Piece.BLACK_KING); // E8
103
+ setPiece(board, 61, types_1.Piece.BLACK_BISHOP); // F8
104
+ setPiece(board, 62, types_1.Piece.BLACK_KNIGHT); // G8
105
+ setPiece(board, 63, types_1.Piece.BLACK_ROOK); // H8
106
+ // Enable castling rights for starting position
107
+ board.castlingRights = {
108
+ whiteShort: true,
109
+ whiteLong: true,
110
+ blackShort: true,
111
+ blackLong: true,
112
+ };
113
+ return board;
114
+ }
115
+ /**
116
+ * Set a piece on the board
117
+ *
118
+ * @param board - Board to modify
119
+ * @param index - Square index (0-63)
120
+ * @param piece - Piece to place
121
+ */
122
+ function setPiece(board, index, piece) {
123
+ // Remove any existing piece at this square first
124
+ const existingPiece = board.mailbox[index];
125
+ if (existingPiece !== types_1.Piece.EMPTY) {
126
+ removePiece(board, index);
127
+ }
128
+ // Set piece in mailbox
129
+ board.mailbox[index] = piece;
130
+ if (piece === types_1.Piece.EMPTY) {
131
+ return;
132
+ }
133
+ // Set bit in appropriate bitboard
134
+ const bitboard = 1n << BigInt(index);
135
+ switch (piece) {
136
+ case types_1.Piece.WHITE_PAWN:
137
+ board.whitePawns |= bitboard;
138
+ board.whitePieces |= bitboard;
139
+ break;
140
+ case types_1.Piece.WHITE_KNIGHT:
141
+ board.whiteKnights |= bitboard;
142
+ board.whitePieces |= bitboard;
143
+ break;
144
+ case types_1.Piece.WHITE_BISHOP:
145
+ board.whiteBishops |= bitboard;
146
+ board.whitePieces |= bitboard;
147
+ break;
148
+ case types_1.Piece.WHITE_ROOK:
149
+ board.whiteRooks |= bitboard;
150
+ board.whitePieces |= bitboard;
151
+ break;
152
+ case types_1.Piece.WHITE_QUEEN:
153
+ board.whiteQueens |= bitboard;
154
+ board.whitePieces |= bitboard;
155
+ break;
156
+ case types_1.Piece.WHITE_KING:
157
+ board.whiteKing |= bitboard;
158
+ board.whitePieces |= bitboard;
159
+ break;
160
+ case types_1.Piece.BLACK_PAWN:
161
+ board.blackPawns |= bitboard;
162
+ board.blackPieces |= bitboard;
163
+ break;
164
+ case types_1.Piece.BLACK_KNIGHT:
165
+ board.blackKnights |= bitboard;
166
+ board.blackPieces |= bitboard;
167
+ break;
168
+ case types_1.Piece.BLACK_BISHOP:
169
+ board.blackBishops |= bitboard;
170
+ board.blackPieces |= bitboard;
171
+ break;
172
+ case types_1.Piece.BLACK_ROOK:
173
+ board.blackRooks |= bitboard;
174
+ board.blackPieces |= bitboard;
175
+ break;
176
+ case types_1.Piece.BLACK_QUEEN:
177
+ board.blackQueens |= bitboard;
178
+ board.blackPieces |= bitboard;
179
+ break;
180
+ case types_1.Piece.BLACK_KING:
181
+ board.blackKing |= bitboard;
182
+ board.blackPieces |= bitboard;
183
+ break;
184
+ }
185
+ // Update composite bitboards
186
+ board.allPieces = board.whitePieces | board.blackPieces;
187
+ }
188
+ /**
189
+ * Remove a piece from the board
190
+ *
191
+ * @param board - Board to modify
192
+ * @param index - Square index (0-63)
193
+ */
194
+ function removePiece(board, index) {
195
+ const piece = board.mailbox[index];
196
+ if (piece === types_1.Piece.EMPTY) {
197
+ return;
198
+ }
199
+ // Clear piece in mailbox
200
+ board.mailbox[index] = types_1.Piece.EMPTY;
201
+ // Clear bit in appropriate bitboard
202
+ const bitboard = ~(1n << BigInt(index));
203
+ switch (piece) {
204
+ case types_1.Piece.WHITE_PAWN:
205
+ board.whitePawns &= bitboard;
206
+ board.whitePieces &= bitboard;
207
+ break;
208
+ case types_1.Piece.WHITE_KNIGHT:
209
+ board.whiteKnights &= bitboard;
210
+ board.whitePieces &= bitboard;
211
+ break;
212
+ case types_1.Piece.WHITE_BISHOP:
213
+ board.whiteBishops &= bitboard;
214
+ board.whitePieces &= bitboard;
215
+ break;
216
+ case types_1.Piece.WHITE_ROOK:
217
+ board.whiteRooks &= bitboard;
218
+ board.whitePieces &= bitboard;
219
+ break;
220
+ case types_1.Piece.WHITE_QUEEN:
221
+ board.whiteQueens &= bitboard;
222
+ board.whitePieces &= bitboard;
223
+ break;
224
+ case types_1.Piece.WHITE_KING:
225
+ board.whiteKing &= bitboard;
226
+ board.whitePieces &= bitboard;
227
+ break;
228
+ case types_1.Piece.BLACK_PAWN:
229
+ board.blackPawns &= bitboard;
230
+ board.blackPieces &= bitboard;
231
+ break;
232
+ case types_1.Piece.BLACK_KNIGHT:
233
+ board.blackKnights &= bitboard;
234
+ board.blackPieces &= bitboard;
235
+ break;
236
+ case types_1.Piece.BLACK_BISHOP:
237
+ board.blackBishops &= bitboard;
238
+ board.blackPieces &= bitboard;
239
+ break;
240
+ case types_1.Piece.BLACK_ROOK:
241
+ board.blackRooks &= bitboard;
242
+ board.blackPieces &= bitboard;
243
+ break;
244
+ case types_1.Piece.BLACK_QUEEN:
245
+ board.blackQueens &= bitboard;
246
+ board.blackPieces &= bitboard;
247
+ break;
248
+ case types_1.Piece.BLACK_KING:
249
+ board.blackKing &= bitboard;
250
+ board.blackPieces &= bitboard;
251
+ break;
252
+ }
253
+ // Update composite bitboards
254
+ board.allPieces = board.whitePieces | board.blackPieces;
255
+ }
256
+ /**
257
+ * Get the piece at a square
258
+ *
259
+ * @param board - Board to query
260
+ * @param index - Square index (0-63)
261
+ * @returns Piece at the square
262
+ */
263
+ function getPiece(board, index) {
264
+ return board.mailbox[index];
265
+ }
266
+ /**
267
+ * Get the bitboard for a specific piece type
268
+ *
269
+ * @param board - Board to query
270
+ * @param piece - Piece type
271
+ * @returns Bitboard with all pieces of this type
272
+ */
273
+ function getBitboard(board, piece) {
274
+ switch (piece) {
275
+ case types_1.Piece.WHITE_PAWN: return board.whitePawns;
276
+ case types_1.Piece.WHITE_KNIGHT: return board.whiteKnights;
277
+ case types_1.Piece.WHITE_BISHOP: return board.whiteBishops;
278
+ case types_1.Piece.WHITE_ROOK: return board.whiteRooks;
279
+ case types_1.Piece.WHITE_QUEEN: return board.whiteQueens;
280
+ case types_1.Piece.WHITE_KING: return board.whiteKing;
281
+ case types_1.Piece.BLACK_PAWN: return board.blackPawns;
282
+ case types_1.Piece.BLACK_KNIGHT: return board.blackKnights;
283
+ case types_1.Piece.BLACK_BISHOP: return board.blackBishops;
284
+ case types_1.Piece.BLACK_ROOK: return board.blackRooks;
285
+ case types_1.Piece.BLACK_QUEEN: return board.blackQueens;
286
+ case types_1.Piece.BLACK_KING: return board.blackKing;
287
+ default: return 0n;
288
+ }
289
+ }
290
+ /**
291
+ * Copy a board (efficient struct copy)
292
+ *
293
+ * @param source - Source board
294
+ * @returns New board with same state
295
+ */
296
+ function copyBoard(source) {
297
+ return {
298
+ // Copy mailbox
299
+ mailbox: new Int8Array(source.mailbox),
300
+ // Copy bitboards (primitives, so direct copy)
301
+ whitePawns: source.whitePawns,
302
+ whiteKnights: source.whiteKnights,
303
+ whiteBishops: source.whiteBishops,
304
+ whiteRooks: source.whiteRooks,
305
+ whiteQueens: source.whiteQueens,
306
+ whiteKing: source.whiteKing,
307
+ blackPawns: source.blackPawns,
308
+ blackKnights: source.blackKnights,
309
+ blackBishops: source.blackBishops,
310
+ blackRooks: source.blackRooks,
311
+ blackQueens: source.blackQueens,
312
+ blackKing: source.blackKing,
313
+ whitePieces: source.whitePieces,
314
+ blackPieces: source.blackPieces,
315
+ allPieces: source.allPieces,
316
+ // Copy game state
317
+ turn: source.turn,
318
+ castlingRights: { ...source.castlingRights },
319
+ enPassantSquare: source.enPassantSquare,
320
+ halfMoveClock: source.halfMoveClock,
321
+ fullMoveNumber: source.fullMoveNumber,
322
+ zobristHash: source.zobristHash,
323
+ isCheck: source.isCheck,
324
+ isCheckmate: source.isCheckmate,
325
+ isStalemate: source.isStalemate,
326
+ };
327
+ }
328
+ /**
329
+ * Check if a piece belongs to a specific color
330
+ *
331
+ * @param piece - Piece to check
332
+ * @param color - Color to check
333
+ * @returns true if piece is of the given color
334
+ */
335
+ function isPieceColor(piece, color) {
336
+ if (piece === types_1.Piece.EMPTY) {
337
+ return false;
338
+ }
339
+ if (color === types_1.InternalColor.WHITE) {
340
+ return piece >= types_1.Piece.WHITE_PAWN && piece <= types_1.Piece.WHITE_KING;
341
+ }
342
+ else {
343
+ return piece >= types_1.Piece.BLACK_PAWN && piece <= types_1.Piece.BLACK_KING;
344
+ }
345
+ }
346
+ /**
347
+ * Get the color of a piece
348
+ *
349
+ * @param piece - Piece to check
350
+ * @returns Color of the piece, or null if empty
351
+ */
352
+ function getPieceColor(piece) {
353
+ if (piece === types_1.Piece.EMPTY) {
354
+ return null;
355
+ }
356
+ return piece >= types_1.Piece.WHITE_PAWN && piece <= types_1.Piece.WHITE_KING
357
+ ? types_1.InternalColor.WHITE
358
+ : types_1.InternalColor.BLACK;
359
+ }
360
+ /**
361
+ * Get the opposite color
362
+ *
363
+ * @param color - Color
364
+ * @returns Opposite color
365
+ */
366
+ function oppositeColor(color) {
367
+ return color === types_1.InternalColor.WHITE ? types_1.InternalColor.BLACK : types_1.InternalColor.WHITE;
368
+ }
369
+ /**
370
+ * Check if a square is empty
371
+ *
372
+ * @param board - Board to check
373
+ * @param index - Square index
374
+ * @returns true if square is empty
375
+ */
376
+ function isSquareEmpty(board, index) {
377
+ return board.mailbox[index] === types_1.Piece.EMPTY;
378
+ }
379
+ /**
380
+ * Check if a square is occupied by an enemy piece
381
+ *
382
+ * @param board - Board to check
383
+ * @param index - Square index
384
+ * @param color - Our color
385
+ * @returns true if square has enemy piece
386
+ */
387
+ function isSquareEnemy(board, index, color) {
388
+ const piece = board.mailbox[index];
389
+ if (piece === types_1.Piece.EMPTY) {
390
+ return false;
391
+ }
392
+ const pieceColor = getPieceColor(piece);
393
+ return pieceColor !== null && pieceColor !== color;
394
+ }
395
+ /**
396
+ * Check if a square is occupied by a friendly piece
397
+ *
398
+ * @param board - Board to check
399
+ * @param index - Square index
400
+ * @param color - Our color
401
+ * @returns true if square has friendly piece
402
+ */
403
+ function isSquareFriendly(board, index, color) {
404
+ const piece = board.mailbox[index];
405
+ if (piece === types_1.Piece.EMPTY) {
406
+ return false;
407
+ }
408
+ return isPieceColor(piece, color);
409
+ }
410
+ //# sourceMappingURL=Board.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Board.js","sourceRoot":"","sources":["../../src/core/Board.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Move generation for all piece types
3
+ *
4
+ * This module generates all legal moves for a given position using
5
+ * bitboard-based algorithms for performance.
6
+ */
7
+ import { InternalBoard, SquareIndex, InternalMove } from '../types';
8
+ /**
9
+ * Generate all legal moves for the current position
10
+ *
11
+ * @param board - Board state
12
+ * @returns Array of legal moves
13
+ */
14
+ export declare function generateLegalMoves(board: InternalBoard): InternalMove[];
15
+ /**
16
+ * Generate all pseudo-legal moves (may leave king in check)
17
+ *
18
+ * @param board - Board state
19
+ * @returns Array of pseudo-legal moves
20
+ */
21
+ export declare function generatePseudoLegalMoves(board: InternalBoard): InternalMove[];
22
+ /**
23
+ * Get all legal moves for a specific piece
24
+ *
25
+ * @param board - Board state
26
+ * @param square - Square of the piece
27
+ * @returns Array of legal moves for that piece
28
+ */
29
+ export declare function getMovesForPiece(board: InternalBoard, square: SquareIndex): InternalMove[];
30
+ /**
31
+ * Check if a move is legal
32
+ *
33
+ * @param board - Board state
34
+ * @param from - From square
35
+ * @param to - To square
36
+ * @returns true if move is legal
37
+ */
38
+ export declare function isMoveLegal(board: InternalBoard, from: SquareIndex, to: SquareIndex): boolean;
39
+ /**
40
+ * Apply a move to the board with full state updates (mutates the board)
41
+ * Updates turn, castling rights, en passant, move counters, and game status
42
+ *
43
+ * @param board - Board state to modify
44
+ * @param move - Move to apply
45
+ * @returns The applied move
46
+ */
47
+ export declare function applyMoveComplete(board: InternalBoard, move: InternalMove): InternalMove;
48
+ //# sourceMappingURL=MoveGenerator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MoveGenerator.d.ts","sourceRoot":"","sources":["../../src/core/MoveGenerator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACH,aAAa,EAEb,WAAW,EAGX,YAAY,EAEf,MAAM,UAAU,CAAC;AAmBlB;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,aAAa,GAAG,YAAY,EAAE,CAoCvE;AA+ED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,aAAa,GAAG,YAAY,EAAE,CAiB7E;AAkcD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,GAAG,YAAY,EAAE,CAG1F;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,WAAW,GAAG,OAAO,CAG7F;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,YAAY,GAAG,YAAY,CA+ExF"}