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.
- package/README.md +586 -205
- package/dist/adapters/APIAdapter.d.ts +88 -0
- package/dist/adapters/APIAdapter.d.ts.map +1 -0
- package/dist/adapters/APIAdapter.js +225 -0
- package/dist/adapters/APIAdapter.js.map +1 -0
- package/dist/ai/AIEngine.d.ts +42 -0
- package/dist/ai/AIEngine.d.ts.map +1 -0
- package/dist/ai/AIEngine.js +62 -0
- package/dist/ai/AIEngine.js.map +1 -0
- package/dist/ai/Evaluator.d.ts +48 -0
- package/dist/ai/Evaluator.d.ts.map +1 -0
- package/dist/ai/Evaluator.js +248 -0
- package/dist/ai/Evaluator.js.map +1 -0
- package/dist/ai/MoveOrdering.d.ts +60 -0
- package/dist/ai/MoveOrdering.d.ts.map +1 -0
- package/dist/ai/MoveOrdering.js +173 -0
- package/dist/ai/MoveOrdering.js.map +1 -0
- package/dist/ai/Search.d.ts +62 -0
- package/dist/ai/Search.d.ts.map +1 -0
- package/dist/ai/Search.js +340 -0
- package/dist/ai/Search.js.map +1 -0
- package/dist/ai/TranspositionTable.d.ts +100 -0
- package/dist/ai/TranspositionTable.d.ts.map +1 -0
- package/dist/ai/TranspositionTable.js +176 -0
- package/dist/ai/TranspositionTable.js.map +1 -0
- package/dist/core/AttackDetector.d.ts +52 -0
- package/dist/core/AttackDetector.d.ts.map +1 -0
- package/dist/core/AttackDetector.js +387 -0
- package/dist/core/AttackDetector.js.map +1 -0
- package/dist/core/Board.d.ts +109 -0
- package/dist/core/Board.d.ts.map +1 -0
- package/dist/core/Board.js +410 -0
- package/dist/core/Board.js.map +1 -0
- package/dist/core/MoveGenerator.d.ts +48 -0
- package/dist/core/MoveGenerator.d.ts.map +1 -0
- package/dist/core/MoveGenerator.js +678 -0
- package/dist/core/MoveGenerator.js.map +1 -0
- package/dist/core/Position.d.ts +135 -0
- package/dist/core/Position.d.ts.map +1 -0
- package/dist/core/Position.js +351 -0
- package/dist/core/Position.js.map +1 -0
- package/dist/core/index.d.ts +9 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +25 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/zobrist.d.ts +93 -0
- package/dist/core/zobrist.d.ts.map +1 -0
- package/dist/core/zobrist.js +273 -0
- package/dist/core/zobrist.js.map +1 -0
- package/dist/index.d.ts +154 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +353 -0
- package/dist/index.js.map +1 -0
- package/dist/types/ai.types.d.ts +97 -0
- package/dist/types/ai.types.d.ts.map +1 -0
- package/dist/types/ai.types.js +17 -0
- package/dist/types/ai.types.js.map +1 -0
- package/dist/types/board.types.d.ts +140 -0
- package/dist/types/board.types.d.ts.map +1 -0
- package/dist/types/board.types.js +34 -0
- package/dist/types/board.types.js.map +1 -0
- package/dist/types/index.d.ts +7 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +26 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/move.types.d.ts +70 -0
- package/dist/types/move.types.d.ts.map +1 -0
- package/dist/types/move.types.js +53 -0
- package/dist/types/move.types.js.map +1 -0
- package/dist/utils/constants.d.ts +123 -0
- package/dist/utils/constants.d.ts.map +1 -0
- package/dist/utils/constants.js +259 -0
- package/dist/utils/constants.js.map +1 -0
- package/dist/utils/conversion.d.ts +152 -0
- package/dist/utils/conversion.d.ts.map +1 -0
- package/dist/utils/conversion.js +288 -0
- package/dist/utils/conversion.js.map +1 -0
- package/dist/utils/environment.d.ts +33 -0
- package/dist/utils/environment.d.ts.map +1 -0
- package/dist/utils/environment.js +71 -0
- package/dist/utils/environment.js.map +1 -0
- package/dist/utils/fen.d.ts +28 -0
- package/dist/utils/fen.d.ts.map +1 -0
- package/dist/utils/fen.js +203 -0
- package/dist/utils/fen.js.map +1 -0
- package/package.json +27 -28
- package/.eslintrc.json +0 -16
- package/.github/workflows/main.yml +0 -20
- package/CHANGELOG.md +0 -587
- package/dist/js-chess-engine.js +0 -1
- package/example/aiMatch.mjs +0 -21
- package/example/console.mjs +0 -37
- package/example/server.mjs +0 -27
- package/lib/Board.mjs +0 -943
- package/lib/const/board.mjs +0 -838
- package/lib/js-chess-engine.mjs +0 -99
- package/lib/utils.mjs +0 -154
- package/test/.eslintrc.json +0 -11
- package/test/ai.test.mjs +0 -132
- package/test/badge.svg +0 -1
- package/test/importExport.mjs +0 -108
- package/test/moves.test.mjs +0 -773
- 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"}
|