@connectorvol/chessops 1.0.0 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{esm/attacks.js → attacks.js} +2 -3
- package/dist/{esm/board.js → board.js} +25 -9
- package/dist/{esm/chess.js → chess.js} +24 -18
- package/dist/{esm/compat.js → compat.js} +1 -2
- package/dist/{esm/debug.js → debug.js} +0 -1
- package/dist/{esm/fen.js → fen.js} +1 -2
- package/dist/{types/index.d.ts → index.d.ts} +6 -3
- package/dist/{esm/index.js → index.js} +1 -2
- package/dist/{esm/pgn.js → pgn.js} +54 -34
- package/dist/pgnOps.svelte.d.ts +31 -0
- package/dist/pgnOps.svelte.js +122 -0
- package/dist/{esm/san.js → san.js} +2 -5
- package/dist/{esm/setup.js → setup.js} +29 -26
- package/dist/{esm/squareSet.js → squareSet.js} +17 -16
- package/dist/{esm/transform.js → transform.js} +10 -14
- package/dist/{esm/types.js → types.js} +0 -1
- package/dist/{esm/util.js → util.js} +0 -1
- package/dist/{types/variant.d.ts → variant.d.ts} +2 -1
- package/dist/{esm/variant.js → variant.js} +21 -26
- package/package.json +31 -59
- package/dist/cjs/attacks.js +0 -152
- package/dist/cjs/attacks.js.map +0 -1
- package/dist/cjs/board.js +0 -143
- package/dist/cjs/board.js.map +0 -1
- package/dist/cjs/chess.js +0 -638
- package/dist/cjs/chess.js.map +0 -1
- package/dist/cjs/compat.js +0 -89
- package/dist/cjs/compat.js.map +0 -1
- package/dist/cjs/debug.js +0 -103
- package/dist/cjs/debug.js.map +0 -1
- package/dist/cjs/fen.js +0 -325
- package/dist/cjs/fen.js.map +0 -1
- package/dist/cjs/index.js +0 -94
- package/dist/cjs/index.js.map +0 -1
- package/dist/cjs/pgn.js +0 -796
- package/dist/cjs/pgn.js.map +0 -1
- package/dist/cjs/san.js +0 -174
- package/dist/cjs/san.js.map +0 -1
- package/dist/cjs/setup.js +0 -167
- package/dist/cjs/setup.js.map +0 -1
- package/dist/cjs/squareSet.js +0 -206
- package/dist/cjs/squareSet.js.map +0 -1
- package/dist/cjs/transform.js +0 -57
- package/dist/cjs/transform.js.map +0 -1
- package/dist/cjs/types.js +0 -24
- package/dist/cjs/types.js.map +0 -1
- package/dist/cjs/util.js +0 -104
- package/dist/cjs/util.js.map +0 -1
- package/dist/cjs/variant.js +0 -833
- package/dist/cjs/variant.js.map +0 -1
- package/dist/esm/attacks.js.map +0 -1
- package/dist/esm/board.js.map +0 -1
- package/dist/esm/chess.js.map +0 -1
- package/dist/esm/compat.js.map +0 -1
- package/dist/esm/debug.js.map +0 -1
- package/dist/esm/fen.js.map +0 -1
- package/dist/esm/index.js.map +0 -1
- package/dist/esm/pgn.js.map +0 -1
- package/dist/esm/san.js.map +0 -1
- package/dist/esm/setup.js.map +0 -1
- package/dist/esm/squareSet.js.map +0 -1
- package/dist/esm/transform.js.map +0 -1
- package/dist/esm/types.js.map +0 -1
- package/dist/esm/util.js.map +0 -1
- package/dist/esm/variant.js.map +0 -1
- package/src/attacks.ts +0 -160
- package/src/board.ts +0 -168
- package/src/chess.ts +0 -687
- package/src/compat.ts +0 -120
- package/src/debug.ts +0 -100
- package/src/fen.ts +0 -328
- package/src/index.ts +0 -85
- package/src/pgn.ts +0 -876
- package/src/san.ts +0 -190
- package/src/setup.ts +0 -203
- package/src/squareSet.ts +0 -243
- package/src/transform.ts +0 -49
- package/src/types.ts +0 -93
- package/src/util.ts +0 -116
- package/src/variant.ts +0 -939
- /package/dist/{types/attacks.d.ts → attacks.d.ts} +0 -0
- /package/dist/{types/board.d.ts → board.d.ts} +0 -0
- /package/dist/{types/chess.d.ts → chess.d.ts} +0 -0
- /package/dist/{types/compat.d.ts → compat.d.ts} +0 -0
- /package/dist/{types/debug.d.ts → debug.d.ts} +0 -0
- /package/dist/{types/fen.d.ts → fen.d.ts} +0 -0
- /package/dist/{types/pgn.d.ts → pgn.d.ts} +0 -0
- /package/dist/{types/san.d.ts → san.d.ts} +0 -0
- /package/dist/{types/setup.d.ts → setup.d.ts} +0 -0
- /package/dist/{types/squareSet.d.ts → squareSet.d.ts} +0 -0
- /package/dist/{types/transform.d.ts → transform.d.ts} +0 -0
- /package/dist/{types/types.d.ts → types.d.ts} +0 -0
- /package/dist/{types/util.d.ts → util.d.ts} +0 -0
|
@@ -67,17 +67,15 @@ const makeSanWithoutSuffix = (pos, move) => {
|
|
|
67
67
|
return san;
|
|
68
68
|
};
|
|
69
69
|
export const makeSanAndPlay = (pos, move) => {
|
|
70
|
-
var _a;
|
|
71
70
|
const san = makeSanWithoutSuffix(pos, move);
|
|
72
71
|
pos.play(move);
|
|
73
|
-
if (
|
|
72
|
+
if (pos.outcome()?.winner)
|
|
74
73
|
return san + "#";
|
|
75
74
|
if (pos.isCheck())
|
|
76
75
|
return san + "+";
|
|
77
76
|
return san;
|
|
78
77
|
};
|
|
79
78
|
export const makeSanVariation = (pos, variation) => {
|
|
80
|
-
var _a;
|
|
81
79
|
pos = pos.clone();
|
|
82
80
|
const line = [];
|
|
83
81
|
for (let i = 0; i < variation.length; i++) {
|
|
@@ -92,7 +90,7 @@ export const makeSanVariation = (pos, variation) => {
|
|
|
92
90
|
line.push(san);
|
|
93
91
|
if (san === "--")
|
|
94
92
|
return line.join("");
|
|
95
|
-
if (i === variation.length - 1 &&
|
|
93
|
+
if (i === variation.length - 1 && pos.outcome()?.winner)
|
|
96
94
|
line.push("#");
|
|
97
95
|
else if (pos.isCheck())
|
|
98
96
|
line.push("+");
|
|
@@ -164,4 +162,3 @@ export const parseSan = (pos, san) => {
|
|
|
164
162
|
promotion,
|
|
165
163
|
};
|
|
166
164
|
};
|
|
167
|
-
//# sourceMappingURL=san.js.map
|
|
@@ -2,6 +2,12 @@ import { Board, boardEquals } from "./board.js";
|
|
|
2
2
|
import { SquareSet } from "./squareSet.js";
|
|
3
3
|
import { ROLES } from "./types.js";
|
|
4
4
|
export class MaterialSide {
|
|
5
|
+
pawn;
|
|
6
|
+
knight;
|
|
7
|
+
bishop;
|
|
8
|
+
rook;
|
|
9
|
+
queen;
|
|
10
|
+
king;
|
|
5
11
|
constructor() { }
|
|
6
12
|
static empty() {
|
|
7
13
|
const m = new MaterialSide();
|
|
@@ -53,6 +59,8 @@ export class MaterialSide {
|
|
|
53
59
|
}
|
|
54
60
|
}
|
|
55
61
|
export class Material {
|
|
62
|
+
white;
|
|
63
|
+
black;
|
|
56
64
|
constructor(white, black) {
|
|
57
65
|
this.white = white;
|
|
58
66
|
this.black = black;
|
|
@@ -95,6 +103,8 @@ export class Material {
|
|
|
95
103
|
}
|
|
96
104
|
}
|
|
97
105
|
export class RemainingChecks {
|
|
106
|
+
white;
|
|
107
|
+
black;
|
|
98
108
|
constructor(white, black) {
|
|
99
109
|
this.white = white;
|
|
100
110
|
this.black = black;
|
|
@@ -129,29 +139,22 @@ export const emptySetup = () => ({
|
|
|
129
139
|
halfmoves: 0,
|
|
130
140
|
fullmoves: 1,
|
|
131
141
|
});
|
|
132
|
-
export const setupClone = (setup) => {
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
(
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
left.epSquare === right.epSquare &&
|
|
152
|
-
((right.remainingChecks && ((_b = left.remainingChecks) === null || _b === void 0 ? void 0 : _b.equals(right.remainingChecks))) ||
|
|
153
|
-
(!left.remainingChecks && !right.remainingChecks)) &&
|
|
154
|
-
left.halfmoves === right.halfmoves &&
|
|
155
|
-
left.fullmoves === right.fullmoves;
|
|
156
|
-
};
|
|
157
|
-
//# sourceMappingURL=setup.js.map
|
|
142
|
+
export const setupClone = (setup) => ({
|
|
143
|
+
board: setup.board.clone(),
|
|
144
|
+
pockets: setup.pockets?.clone(),
|
|
145
|
+
turn: setup.turn,
|
|
146
|
+
castlingRights: setup.castlingRights,
|
|
147
|
+
epSquare: setup.epSquare,
|
|
148
|
+
remainingChecks: setup.remainingChecks?.clone(),
|
|
149
|
+
halfmoves: setup.halfmoves,
|
|
150
|
+
fullmoves: setup.fullmoves,
|
|
151
|
+
});
|
|
152
|
+
export const setupEquals = (left, right) => boardEquals(left.board, right.board) &&
|
|
153
|
+
((right.pockets && left.pockets?.equals(right.pockets)) || (!left.pockets && !right.pockets)) &&
|
|
154
|
+
left.turn === right.turn &&
|
|
155
|
+
left.castlingRights.equals(right.castlingRights) &&
|
|
156
|
+
left.epSquare === right.epSquare &&
|
|
157
|
+
((right.remainingChecks && left.remainingChecks?.equals(right.remainingChecks)) ||
|
|
158
|
+
(!left.remainingChecks && !right.remainingChecks)) &&
|
|
159
|
+
left.halfmoves === right.halfmoves &&
|
|
160
|
+
left.fullmoves === right.fullmoves;
|
|
@@ -1,22 +1,24 @@
|
|
|
1
1
|
const popcnt32 = (n) => {
|
|
2
|
-
n = n - ((n >>> 1) &
|
|
3
|
-
n = (n &
|
|
4
|
-
return Math.imul((n + (n >>> 4)) &
|
|
2
|
+
n = n - ((n >>> 1) & 0x5555_5555);
|
|
3
|
+
n = (n & 0x3333_3333) + ((n >>> 2) & 0x3333_3333);
|
|
4
|
+
return Math.imul((n + (n >>> 4)) & 0x0f0f_0f0f, 0x0101_0101) >> 24;
|
|
5
5
|
};
|
|
6
6
|
const bswap32 = (n) => {
|
|
7
|
-
n = ((n >>> 8) &
|
|
7
|
+
n = ((n >>> 8) & 0x00ff_00ff) | ((n & 0x00ff_00ff) << 8);
|
|
8
8
|
return ((n >>> 16) & 0xffff) | ((n & 0xffff) << 16);
|
|
9
9
|
};
|
|
10
10
|
const rbit32 = (n) => {
|
|
11
|
-
n = ((n >>> 1) &
|
|
12
|
-
n = ((n >>> 2) &
|
|
13
|
-
n = ((n >>> 4) &
|
|
11
|
+
n = ((n >>> 1) & 0x5555_5555) | ((n & 0x5555_5555) << 1);
|
|
12
|
+
n = ((n >>> 2) & 0x3333_3333) | ((n & 0x3333_3333) << 2);
|
|
13
|
+
n = ((n >>> 4) & 0x0f0f_0f0f) | ((n & 0x0f0f_0f0f) << 4);
|
|
14
14
|
return bswap32(n);
|
|
15
15
|
};
|
|
16
16
|
/**
|
|
17
17
|
* An immutable set of squares, implemented as a bitboard.
|
|
18
18
|
*/
|
|
19
19
|
export class SquareSet {
|
|
20
|
+
lo;
|
|
21
|
+
hi;
|
|
20
22
|
constructor(lo, hi) {
|
|
21
23
|
this.lo = lo | 0;
|
|
22
24
|
this.hi = hi | 0;
|
|
@@ -28,31 +30,31 @@ export class SquareSet {
|
|
|
28
30
|
return new SquareSet(0xff, 0).shl64(8 * rank);
|
|
29
31
|
}
|
|
30
32
|
static fromFile(file) {
|
|
31
|
-
return new SquareSet(
|
|
33
|
+
return new SquareSet(0x0101_0101 << file, 0x0101_0101 << file);
|
|
32
34
|
}
|
|
33
35
|
static empty() {
|
|
34
36
|
return new SquareSet(0, 0);
|
|
35
37
|
}
|
|
36
38
|
static full() {
|
|
37
|
-
return new SquareSet(
|
|
39
|
+
return new SquareSet(0xffff_ffff, 0xffff_ffff);
|
|
38
40
|
}
|
|
39
41
|
static corners() {
|
|
40
|
-
return new SquareSet(0x81,
|
|
42
|
+
return new SquareSet(0x81, 0x8100_0000);
|
|
41
43
|
}
|
|
42
44
|
static center() {
|
|
43
|
-
return new SquareSet(
|
|
45
|
+
return new SquareSet(0x1800_0000, 0x18);
|
|
44
46
|
}
|
|
45
47
|
static backranks() {
|
|
46
|
-
return new SquareSet(0xff,
|
|
48
|
+
return new SquareSet(0xff, 0xff00_0000);
|
|
47
49
|
}
|
|
48
50
|
static backrank(color) {
|
|
49
|
-
return color === "white" ? new SquareSet(0xff, 0) : new SquareSet(0,
|
|
51
|
+
return color === "white" ? new SquareSet(0xff, 0) : new SquareSet(0, 0xff00_0000);
|
|
50
52
|
}
|
|
51
53
|
static lightSquares() {
|
|
52
|
-
return new SquareSet(
|
|
54
|
+
return new SquareSet(0x55aa_55aa, 0x55aa_55aa);
|
|
53
55
|
}
|
|
54
56
|
static darkSquares() {
|
|
55
|
-
return new SquareSet(
|
|
57
|
+
return new SquareSet(0xaa55_aa55, 0xaa55_aa55);
|
|
56
58
|
}
|
|
57
59
|
complement() {
|
|
58
60
|
return new SquareSet(~this.lo, ~this.hi);
|
|
@@ -199,4 +201,3 @@ export class SquareSet {
|
|
|
199
201
|
}
|
|
200
202
|
}
|
|
201
203
|
}
|
|
202
|
-
//# sourceMappingURL=squareSet.js.map
|
|
@@ -32,17 +32,13 @@ export const transformBoard = (board, f) => {
|
|
|
32
32
|
b[role] = f(board[role]);
|
|
33
33
|
return b;
|
|
34
34
|
};
|
|
35
|
-
export const transformSetup = (setup, f) => {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
fullmoves: setup.fullmoves,
|
|
46
|
-
});
|
|
47
|
-
};
|
|
48
|
-
//# sourceMappingURL=transform.js.map
|
|
35
|
+
export const transformSetup = (setup, f) => ({
|
|
36
|
+
board: transformBoard(setup.board, f),
|
|
37
|
+
pockets: setup.pockets?.clone(),
|
|
38
|
+
turn: setup.turn,
|
|
39
|
+
castlingRights: f(setup.castlingRights),
|
|
40
|
+
epSquare: defined(setup.epSquare) ? f(SquareSet.fromSquare(setup.epSquare)).first() : undefined,
|
|
41
|
+
remainingChecks: setup.remainingChecks?.clone(),
|
|
42
|
+
halfmoves: setup.halfmoves,
|
|
43
|
+
fullmoves: setup.fullmoves,
|
|
44
|
+
});
|
|
@@ -84,4 +84,3 @@ export const makeUci = (move) => isDrop(move)
|
|
|
84
84
|
(move.promotion ? roleToChar(move.promotion) : "");
|
|
85
85
|
export const kingCastlesTo = (color, side) => color === "white" ? (side === "a" ? 2 : 6) : side === "a" ? 58 : 62;
|
|
86
86
|
export const rookCastlesTo = (color, side) => color === "white" ? (side === "a" ? 3 : 5) : side === "a" ? 59 : 61;
|
|
87
|
-
//# sourceMappingURL=util.js.map
|
|
@@ -3,7 +3,8 @@ import { Castles, castlingSide, Chess, Context, equalsIgnoreMoves, IllegalSetup,
|
|
|
3
3
|
import { Setup } from "./setup.js";
|
|
4
4
|
import { SquareSet } from "./squareSet.js";
|
|
5
5
|
import { Color, Outcome, Piece, Rules, Square } from "./types.js";
|
|
6
|
-
export {
|
|
6
|
+
export type { Context } from "./chess.js";
|
|
7
|
+
export { Castles, castlingSide, Chess, equalsIgnoreMoves, IllegalSetup, isImpossibleCheck, normalizeMove, Position, PositionError, };
|
|
7
8
|
export declare class Crazyhouse extends Position {
|
|
8
9
|
private constructor();
|
|
9
10
|
reset(): void;
|
|
@@ -38,11 +38,10 @@ export class Crazyhouse extends Position {
|
|
|
38
38
|
}
|
|
39
39
|
validate() {
|
|
40
40
|
return super.validate().chain((_) => {
|
|
41
|
-
|
|
42
|
-
if ((_a = this.pockets) === null || _a === void 0 ? void 0 : _a.count("king")) {
|
|
41
|
+
if (this.pockets?.count("king")) {
|
|
43
42
|
return Result.err(new PositionError(IllegalSetup.Kings));
|
|
44
43
|
}
|
|
45
|
-
if ((
|
|
44
|
+
if ((this.pockets?.size() || 0) + this.board.occupied.size() > 64) {
|
|
46
45
|
return Result.err(new PositionError(IllegalSetup.Variant));
|
|
47
46
|
}
|
|
48
47
|
return Result.ok(undefined);
|
|
@@ -62,12 +61,11 @@ export class Crazyhouse extends Position {
|
|
|
62
61
|
this.pockets.count("queen") <= 0);
|
|
63
62
|
}
|
|
64
63
|
dropDests(ctx) {
|
|
65
|
-
var _a, _b;
|
|
66
64
|
const mask = this.board.occupied
|
|
67
65
|
.complement()
|
|
68
|
-
.intersect(
|
|
66
|
+
.intersect(this.pockets?.[this.turn].hasNonPawns()
|
|
69
67
|
? SquareSet.full()
|
|
70
|
-
:
|
|
68
|
+
: this.pockets?.[this.turn].hasPawns()
|
|
71
69
|
? SquareSet.backranks().complement()
|
|
72
70
|
: SquareSet.empty());
|
|
73
71
|
ctx = ctx || this.ctx();
|
|
@@ -129,9 +127,9 @@ export class Atomic extends Position {
|
|
|
129
127
|
.intersect(this.board.occupied)
|
|
130
128
|
.diff(this.board.pawn)) {
|
|
131
129
|
const piece = this.board.take(explode);
|
|
132
|
-
if (
|
|
130
|
+
if (piece?.role === "rook")
|
|
133
131
|
this.castles.discardRook(explode);
|
|
134
|
-
if (
|
|
132
|
+
if (piece?.role === "king")
|
|
135
133
|
this.castles.discardColor(piece.color);
|
|
136
134
|
}
|
|
137
135
|
}
|
|
@@ -329,9 +327,8 @@ export class ThreeCheck extends Position {
|
|
|
329
327
|
this.remainingChecks = RemainingChecks.default();
|
|
330
328
|
}
|
|
331
329
|
setupUnchecked(setup) {
|
|
332
|
-
var _a;
|
|
333
330
|
super.setupUnchecked(setup);
|
|
334
|
-
this.remainingChecks =
|
|
331
|
+
this.remainingChecks = setup.remainingChecks?.clone() || RemainingChecks.default();
|
|
335
332
|
}
|
|
336
333
|
static default() {
|
|
337
334
|
const pos = new this();
|
|
@@ -465,16 +462,16 @@ export class RacingKings extends Position {
|
|
|
465
462
|
}
|
|
466
463
|
const hordeBoard = () => {
|
|
467
464
|
const board = Board.empty();
|
|
468
|
-
board.occupied = new SquareSet(
|
|
465
|
+
board.occupied = new SquareSet(0xffff_ffff, 0xffff_0066);
|
|
469
466
|
board.promoted = SquareSet.empty();
|
|
470
|
-
board.white = new SquareSet(
|
|
471
|
-
board.black = new SquareSet(0,
|
|
472
|
-
board.pawn = new SquareSet(
|
|
473
|
-
board.knight = new SquareSet(0,
|
|
474
|
-
board.bishop = new SquareSet(0,
|
|
475
|
-
board.rook = new SquareSet(0,
|
|
476
|
-
board.queen = new SquareSet(0,
|
|
477
|
-
board.king = new SquareSet(0,
|
|
467
|
+
board.white = new SquareSet(0xffff_ffff, 0x0000_0066);
|
|
468
|
+
board.black = new SquareSet(0, 0xffff_0000);
|
|
469
|
+
board.pawn = new SquareSet(0xffff_ffff, 0x00ff_0066);
|
|
470
|
+
board.knight = new SquareSet(0, 0x4200_0000);
|
|
471
|
+
board.bishop = new SquareSet(0, 0x2400_0000);
|
|
472
|
+
board.rook = new SquareSet(0, 0x8100_0000);
|
|
473
|
+
board.queen = new SquareSet(0, 0x0800_0000);
|
|
474
|
+
board.king = new SquareSet(0, 0x1000_0000);
|
|
478
475
|
return board;
|
|
479
476
|
};
|
|
480
477
|
export class Horde extends Position {
|
|
@@ -782,7 +779,6 @@ export const setupPosition = (rules, setup) => {
|
|
|
782
779
|
}
|
|
783
780
|
};
|
|
784
781
|
export const isStandardMaterial = (pos) => {
|
|
785
|
-
var _a, _b, _c, _d, _e;
|
|
786
782
|
switch (pos.rules) {
|
|
787
783
|
case "chess":
|
|
788
784
|
case "antichess":
|
|
@@ -792,11 +788,11 @@ export const isStandardMaterial = (pos) => {
|
|
|
792
788
|
return COLORS.every((color) => isStandardMaterialSide(pos.board, color));
|
|
793
789
|
case "crazyhouse": {
|
|
794
790
|
const promoted = pos.board.promoted;
|
|
795
|
-
return (promoted.size() + pos.board.pawn.size() + (
|
|
796
|
-
pos.board.knight.diff(promoted).size() + (
|
|
797
|
-
pos.board.bishop.diff(promoted).size() + (
|
|
798
|
-
pos.board.rook.diff(promoted).size() + (
|
|
799
|
-
pos.board.queen.diff(promoted).size() + (
|
|
791
|
+
return (promoted.size() + pos.board.pawn.size() + (pos.pockets?.count("pawn") || 0) <= 16 &&
|
|
792
|
+
pos.board.knight.diff(promoted).size() + (pos.pockets?.count("knight") || 0) <= 4 &&
|
|
793
|
+
pos.board.bishop.diff(promoted).size() + (pos.pockets?.count("bishop") || 0) <= 4 &&
|
|
794
|
+
pos.board.rook.diff(promoted).size() + (pos.pockets?.count("rook") || 0) <= 4 &&
|
|
795
|
+
pos.board.queen.diff(promoted).size() + (pos.pockets?.count("queen") || 0) <= 2);
|
|
800
796
|
}
|
|
801
797
|
case "horde":
|
|
802
798
|
return COLORS.every((color) => pos.board.pieces(color, "king").nonEmpty()
|
|
@@ -809,4 +805,3 @@ export const isStandardMaterial = (pos) => {
|
|
|
809
805
|
pos.board.pieces(color, "queen").size() <= 1);
|
|
810
806
|
}
|
|
811
807
|
};
|
|
812
|
-
//# sourceMappingURL=variant.js.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@connectorvol/chessops",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.1",
|
|
4
4
|
"description": "Chess and chess variant rules and operations",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"chess",
|
|
@@ -10,78 +10,50 @@
|
|
|
10
10
|
"typescript",
|
|
11
11
|
"uci"
|
|
12
12
|
],
|
|
13
|
-
"license": "
|
|
14
|
-
"author": "
|
|
15
|
-
"repository": "
|
|
16
|
-
"funding": "https://
|
|
13
|
+
"license": "MIT",
|
|
14
|
+
"author": "Moiseenko Vadim (mvkvol@yandex.ru)",
|
|
15
|
+
"repository": "sourcecraft.dev/mvkvol/chess",
|
|
16
|
+
"funding": "https://sourcecraft.dev/mvkvol/portal",
|
|
17
17
|
"files": [
|
|
18
|
-
"
|
|
19
|
-
"
|
|
20
|
-
"
|
|
18
|
+
"dist",
|
|
19
|
+
"!dist/**/*.test.*",
|
|
20
|
+
"!dist/**/*.spec.*"
|
|
21
21
|
],
|
|
22
22
|
"type": "module",
|
|
23
23
|
"sideEffects": false,
|
|
24
|
-
"main": "dist/
|
|
25
|
-
"
|
|
26
|
-
"
|
|
27
|
-
"typesVersions": {
|
|
28
|
-
"*": {
|
|
29
|
-
"*": [
|
|
30
|
-
"dist/types/*"
|
|
31
|
-
]
|
|
32
|
-
}
|
|
33
|
-
},
|
|
24
|
+
"main": "./dist/index.js",
|
|
25
|
+
"types": "./dist/index.d.ts",
|
|
26
|
+
"svelte": "./dist/index.js",
|
|
34
27
|
"exports": {
|
|
35
28
|
".": {
|
|
36
|
-
"types": "./dist/
|
|
37
|
-
"
|
|
38
|
-
"
|
|
29
|
+
"types": "./dist/index.d.ts",
|
|
30
|
+
"svelte": "./dist/index.js",
|
|
31
|
+
"import": "./dist/index.js",
|
|
32
|
+
"require": "./dist/index.js"
|
|
39
33
|
},
|
|
40
34
|
"./*": {
|
|
41
|
-
"types": "./dist
|
|
42
|
-
"
|
|
43
|
-
"
|
|
35
|
+
"types": "./dist/*.d.ts",
|
|
36
|
+
"svelte": "./dist/*.js",
|
|
37
|
+
"import": "./dist/*.js",
|
|
38
|
+
"require": "./dist/*.js"
|
|
44
39
|
}
|
|
45
40
|
},
|
|
46
41
|
"scripts": {
|
|
47
|
-
"
|
|
42
|
+
"dev": "vite dev",
|
|
43
|
+
"build": "vite build",
|
|
44
|
+
"preview": "vite preview",
|
|
45
|
+
"package": "svelte-kit sync && svelte-package && bun pm pack",
|
|
48
46
|
"publish": "bun publish",
|
|
49
|
-
"
|
|
50
|
-
"
|
|
51
|
-
"
|
|
52
|
-
"
|
|
53
|
-
"check-format": "dprint check"
|
|
47
|
+
"prepublishOnly": "bun pm pack",
|
|
48
|
+
"check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
|
|
49
|
+
"check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
|
|
50
|
+
"test": "vitest run"
|
|
54
51
|
},
|
|
55
52
|
"dependencies": {
|
|
56
|
-
"@badrap/result": "^0.3"
|
|
57
|
-
|
|
58
|
-
"devDependencies": {
|
|
59
|
-
"@jest/globals": "^30",
|
|
60
|
-
"@types/node": "^24.9.1",
|
|
61
|
-
"@typescript-eslint/eslint-plugin": "^8",
|
|
62
|
-
"@typescript-eslint/parser": "^8",
|
|
63
|
-
"dprint": "^0.50",
|
|
64
|
-
"eslint": "^9",
|
|
65
|
-
"jest": "^30",
|
|
66
|
-
"ts-jest": "^29",
|
|
67
|
-
"typedoc": "^0.28",
|
|
68
|
-
"typescript": "^5"
|
|
53
|
+
"@badrap/result": "^0.3",
|
|
54
|
+
"@connectorvol/shared": "2.0.0"
|
|
69
55
|
},
|
|
70
|
-
"
|
|
71
|
-
"
|
|
72
|
-
".ts"
|
|
73
|
-
],
|
|
74
|
-
"moduleNameMapper": {
|
|
75
|
-
"^(.*)\\.js$": "$1"
|
|
76
|
-
},
|
|
77
|
-
"testRegex": ".*\\.test\\.ts$",
|
|
78
|
-
"transform": {
|
|
79
|
-
"\\.ts$": [
|
|
80
|
-
"ts-jest",
|
|
81
|
-
{
|
|
82
|
-
"useESM": true
|
|
83
|
-
}
|
|
84
|
-
]
|
|
85
|
-
}
|
|
56
|
+
"peerDependencies": {
|
|
57
|
+
"svelte": "^5.53.12"
|
|
86
58
|
}
|
|
87
59
|
}
|
package/dist/cjs/attacks.js
DELETED
|
@@ -1,152 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* Compute attacks and rays.
|
|
4
|
-
*
|
|
5
|
-
* These are low-level functions that can be used to implement chess rules.
|
|
6
|
-
*
|
|
7
|
-
* Implementation notes: Sliding attacks are computed using
|
|
8
|
-
* [Hyperbola Quintessence](https://www.chessprogramming.org/Hyperbola_Quintessence).
|
|
9
|
-
* Magic Bitboards would deliver slightly faster lookups, but also require
|
|
10
|
-
* initializing considerably larger attack tables. On the web, initialization
|
|
11
|
-
* time is important, so the chosen method may strike a better balance.
|
|
12
|
-
*
|
|
13
|
-
* @packageDocumentation
|
|
14
|
-
*/
|
|
15
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
-
exports.between = exports.ray = exports.attacks = exports.queenAttacks = exports.rookAttacks = exports.bishopAttacks = exports.pawnAttacks = exports.knightAttacks = exports.kingAttacks = void 0;
|
|
17
|
-
const squareSet_js_1 = require("./squareSet.js");
|
|
18
|
-
const util_js_1 = require("./util.js");
|
|
19
|
-
const computeRange = (square, deltas) => {
|
|
20
|
-
let range = squareSet_js_1.SquareSet.empty();
|
|
21
|
-
for (const delta of deltas) {
|
|
22
|
-
const sq = square + delta;
|
|
23
|
-
if (0 <= sq && sq < 64 && Math.abs((0, util_js_1.squareFile)(square) - (0, util_js_1.squareFile)(sq)) <= 2) {
|
|
24
|
-
range = range.with(sq);
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
return range;
|
|
28
|
-
};
|
|
29
|
-
const tabulate = (f) => {
|
|
30
|
-
const table = [];
|
|
31
|
-
for (let square = 0; square < 64; square++)
|
|
32
|
-
table[square] = f(square);
|
|
33
|
-
return table;
|
|
34
|
-
};
|
|
35
|
-
const KING_ATTACKS = tabulate((sq) => computeRange(sq, [-9, -8, -7, -1, 1, 7, 8, 9]));
|
|
36
|
-
const KNIGHT_ATTACKS = tabulate((sq) => computeRange(sq, [-17, -15, -10, -6, 6, 10, 15, 17]));
|
|
37
|
-
const PAWN_ATTACKS = {
|
|
38
|
-
white: tabulate((sq) => computeRange(sq, [7, 9])),
|
|
39
|
-
black: tabulate((sq) => computeRange(sq, [-7, -9])),
|
|
40
|
-
};
|
|
41
|
-
/**
|
|
42
|
-
* Gets squares attacked or defended by a king on `square`.
|
|
43
|
-
*/
|
|
44
|
-
const kingAttacks = (square) => KING_ATTACKS[square];
|
|
45
|
-
exports.kingAttacks = kingAttacks;
|
|
46
|
-
/**
|
|
47
|
-
* Gets squares attacked or defended by a knight on `square`.
|
|
48
|
-
*/
|
|
49
|
-
const knightAttacks = (square) => KNIGHT_ATTACKS[square];
|
|
50
|
-
exports.knightAttacks = knightAttacks;
|
|
51
|
-
/**
|
|
52
|
-
* Gets squares attacked or defended by a pawn of the given `color`
|
|
53
|
-
* on `square`.
|
|
54
|
-
*/
|
|
55
|
-
const pawnAttacks = (color, square) => PAWN_ATTACKS[color][square];
|
|
56
|
-
exports.pawnAttacks = pawnAttacks;
|
|
57
|
-
const FILE_RANGE = tabulate((sq) => squareSet_js_1.SquareSet.fromFile((0, util_js_1.squareFile)(sq)).without(sq));
|
|
58
|
-
const RANK_RANGE = tabulate((sq) => squareSet_js_1.SquareSet.fromRank((0, util_js_1.squareRank)(sq)).without(sq));
|
|
59
|
-
const DIAG_RANGE = tabulate((sq) => {
|
|
60
|
-
const diag = new squareSet_js_1.SquareSet(134480385, 2151686160);
|
|
61
|
-
const shift = 8 * ((0, util_js_1.squareRank)(sq) - (0, util_js_1.squareFile)(sq));
|
|
62
|
-
return (shift >= 0 ? diag.shl64(shift) : diag.shr64(-shift)).without(sq);
|
|
63
|
-
});
|
|
64
|
-
const ANTI_DIAG_RANGE = tabulate((sq) => {
|
|
65
|
-
const diag = new squareSet_js_1.SquareSet(270549120, 16909320);
|
|
66
|
-
const shift = 8 * ((0, util_js_1.squareRank)(sq) + (0, util_js_1.squareFile)(sq) - 7);
|
|
67
|
-
return (shift >= 0 ? diag.shl64(shift) : diag.shr64(-shift)).without(sq);
|
|
68
|
-
});
|
|
69
|
-
const hyperbola = (bit, range, occupied) => {
|
|
70
|
-
let forward = occupied.intersect(range);
|
|
71
|
-
let reverse = forward.bswap64(); // Assumes no more than 1 bit per rank
|
|
72
|
-
forward = forward.minus64(bit);
|
|
73
|
-
reverse = reverse.minus64(bit.bswap64());
|
|
74
|
-
return forward.xor(reverse.bswap64()).intersect(range);
|
|
75
|
-
};
|
|
76
|
-
const fileAttacks = (square, occupied) => hyperbola(squareSet_js_1.SquareSet.fromSquare(square), FILE_RANGE[square], occupied);
|
|
77
|
-
const rankAttacks = (square, occupied) => {
|
|
78
|
-
const range = RANK_RANGE[square];
|
|
79
|
-
let forward = occupied.intersect(range);
|
|
80
|
-
let reverse = forward.rbit64();
|
|
81
|
-
forward = forward.minus64(squareSet_js_1.SquareSet.fromSquare(square));
|
|
82
|
-
reverse = reverse.minus64(squareSet_js_1.SquareSet.fromSquare(63 - square));
|
|
83
|
-
return forward.xor(reverse.rbit64()).intersect(range);
|
|
84
|
-
};
|
|
85
|
-
/**
|
|
86
|
-
* Gets squares attacked or defended by a bishop on `square`, given `occupied`
|
|
87
|
-
* squares.
|
|
88
|
-
*/
|
|
89
|
-
const bishopAttacks = (square, occupied) => {
|
|
90
|
-
const bit = squareSet_js_1.SquareSet.fromSquare(square);
|
|
91
|
-
return hyperbola(bit, DIAG_RANGE[square], occupied).xor(hyperbola(bit, ANTI_DIAG_RANGE[square], occupied));
|
|
92
|
-
};
|
|
93
|
-
exports.bishopAttacks = bishopAttacks;
|
|
94
|
-
/**
|
|
95
|
-
* Gets squares attacked or defended by a rook on `square`, given `occupied`
|
|
96
|
-
* squares.
|
|
97
|
-
*/
|
|
98
|
-
const rookAttacks = (square, occupied) => fileAttacks(square, occupied).xor(rankAttacks(square, occupied));
|
|
99
|
-
exports.rookAttacks = rookAttacks;
|
|
100
|
-
/**
|
|
101
|
-
* Gets squares attacked or defended by a queen on `square`, given `occupied`
|
|
102
|
-
* squares.
|
|
103
|
-
*/
|
|
104
|
-
const queenAttacks = (square, occupied) => (0, exports.bishopAttacks)(square, occupied).xor((0, exports.rookAttacks)(square, occupied));
|
|
105
|
-
exports.queenAttacks = queenAttacks;
|
|
106
|
-
/**
|
|
107
|
-
* Gets squares attacked or defended by a `piece` on `square`, given
|
|
108
|
-
* `occupied` squares.
|
|
109
|
-
*/
|
|
110
|
-
const attacks = (piece, square, occupied) => {
|
|
111
|
-
switch (piece.role) {
|
|
112
|
-
case "pawn":
|
|
113
|
-
return (0, exports.pawnAttacks)(piece.color, square);
|
|
114
|
-
case "knight":
|
|
115
|
-
return (0, exports.knightAttacks)(square);
|
|
116
|
-
case "bishop":
|
|
117
|
-
return (0, exports.bishopAttacks)(square, occupied);
|
|
118
|
-
case "rook":
|
|
119
|
-
return (0, exports.rookAttacks)(square, occupied);
|
|
120
|
-
case "queen":
|
|
121
|
-
return (0, exports.queenAttacks)(square, occupied);
|
|
122
|
-
case "king":
|
|
123
|
-
return (0, exports.kingAttacks)(square);
|
|
124
|
-
}
|
|
125
|
-
};
|
|
126
|
-
exports.attacks = attacks;
|
|
127
|
-
/**
|
|
128
|
-
* Gets all squares of the rank, file or diagonal with the two squares
|
|
129
|
-
* `a` and `b`, or an empty set if they are not aligned.
|
|
130
|
-
*/
|
|
131
|
-
const ray = (a, b) => {
|
|
132
|
-
const other = squareSet_js_1.SquareSet.fromSquare(b);
|
|
133
|
-
if (RANK_RANGE[a].intersects(other))
|
|
134
|
-
return RANK_RANGE[a].with(a);
|
|
135
|
-
if (ANTI_DIAG_RANGE[a].intersects(other))
|
|
136
|
-
return ANTI_DIAG_RANGE[a].with(a);
|
|
137
|
-
if (DIAG_RANGE[a].intersects(other))
|
|
138
|
-
return DIAG_RANGE[a].with(a);
|
|
139
|
-
if (FILE_RANGE[a].intersects(other))
|
|
140
|
-
return FILE_RANGE[a].with(a);
|
|
141
|
-
return squareSet_js_1.SquareSet.empty();
|
|
142
|
-
};
|
|
143
|
-
exports.ray = ray;
|
|
144
|
-
/**
|
|
145
|
-
* Gets all squares between `a` and `b` (bounds not included), or an empty set
|
|
146
|
-
* if they are not on the same rank, file or diagonal.
|
|
147
|
-
*/
|
|
148
|
-
const between = (a, b) => (0, exports.ray)(a, b)
|
|
149
|
-
.intersect(squareSet_js_1.SquareSet.full().shl64(a).xor(squareSet_js_1.SquareSet.full().shl64(b)))
|
|
150
|
-
.withoutFirst();
|
|
151
|
-
exports.between = between;
|
|
152
|
-
//# sourceMappingURL=attacks.js.map
|
package/dist/cjs/attacks.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"attacks.js","sourceRoot":"","sources":["../../src/attacks.ts"],"names":[],"mappings":"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"}
|