@maxr0ssi/chaos-chess 0.1.6 → 0.1.7
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/chaos-chess.js +75 -75
- package/dist/chaos-chess.js.map +1 -1
- package/package.json +1 -1
package/dist/chaos-chess.js
CHANGED
|
@@ -5,67 +5,67 @@ function pe(t) {
|
|
|
5
5
|
return t.isGameOver() ? t.isCheckmate() ? { isGameOver: !0, result: "checkmate", winner: t.turn() === "w" ? "b" : "w", inCheck: t.turn() } : t.isStalemate() ? { isGameOver: !0, result: "stalemate", winner: null, inCheck: null } : t.isInsufficientMaterial() ? { isGameOver: !0, result: "insufficient", winner: null, inCheck: null } : t.isThreefoldRepetition() ? { isGameOver: !0, result: "threefold", winner: null, inCheck: null } : { isGameOver: !0, result: "draw", winner: null, inCheck: null } : { isGameOver: !1, result: null, winner: null, inCheck: t.inCheck() ? t.turn() : null };
|
|
6
6
|
}
|
|
7
7
|
function et() {
|
|
8
|
-
const t = y(new oe()), [e, n] = d(t.current.fen()), [s, o] = d(t.current.turn()), [r, c] = d(null), [i, l] = d([]), [w, f] = d(pe(t.current)), [_,
|
|
8
|
+
const t = y(new oe()), [e, n] = d(t.current.fen()), [s, o] = d(t.current.turn()), [r, c] = d(null), [i, l] = d([]), [w, f] = d(pe(t.current)), [_, P] = d(null), [g, v] = d([]), [k, R] = d(null), [$, I] = d(null), [x, b] = d(t.current.board()), h = N(() => {
|
|
9
9
|
c(null), l([]);
|
|
10
10
|
}, []), D = N(() => {
|
|
11
|
-
n(t.current.fen()), o(t.current.turn()),
|
|
12
|
-
}, []), le = N((
|
|
13
|
-
const m = t.current,
|
|
11
|
+
n(t.current.fen()), o(t.current.turn()), b(t.current.board()), f(pe(t.current));
|
|
12
|
+
}, []), le = N((T) => {
|
|
13
|
+
const m = t.current, M = m.turn();
|
|
14
14
|
if (_ || pe(m).isGameOver)
|
|
15
15
|
return;
|
|
16
|
-
if (r && i.includes(
|
|
16
|
+
if (r && i.includes(T)) {
|
|
17
17
|
const q = m.get(r);
|
|
18
|
-
if (q?.type === "p" && (q.color === "w" &&
|
|
19
|
-
|
|
18
|
+
if (q?.type === "p" && (q.color === "w" && T[1] === "8" || q.color === "b" && T[1] === "1")) {
|
|
19
|
+
P({ from: r, to: T }), h();
|
|
20
20
|
return;
|
|
21
21
|
}
|
|
22
22
|
try {
|
|
23
|
-
const
|
|
24
|
-
|
|
25
|
-
...
|
|
26
|
-
{ san:
|
|
23
|
+
const S = m.move({ from: r, to: T });
|
|
24
|
+
S && (R({ from: S.from, to: S.to }), I({ captured: !!S.captured, check: S.san.includes("+") || S.san.includes("#") }), v((L) => [
|
|
25
|
+
...L,
|
|
26
|
+
{ san: S.san, fen: m.fen(), color: S.color }
|
|
27
27
|
]));
|
|
28
28
|
} catch {
|
|
29
29
|
}
|
|
30
30
|
h(), D();
|
|
31
31
|
return;
|
|
32
32
|
}
|
|
33
|
-
const H = m.get(
|
|
34
|
-
if (H && H.color ===
|
|
35
|
-
if (
|
|
33
|
+
const H = m.get(T);
|
|
34
|
+
if (H && H.color === M) {
|
|
35
|
+
if (T === r) {
|
|
36
36
|
h();
|
|
37
37
|
return;
|
|
38
38
|
}
|
|
39
|
-
c(
|
|
40
|
-
const q = m.moves({ square:
|
|
41
|
-
l(q.map((
|
|
39
|
+
c(T);
|
|
40
|
+
const q = m.moves({ square: T, verbose: !0 });
|
|
41
|
+
l(q.map((S) => S.to));
|
|
42
42
|
return;
|
|
43
43
|
}
|
|
44
44
|
h();
|
|
45
|
-
}, [r, i, _, h, D]), W = N((
|
|
45
|
+
}, [r, i, _, h, D]), W = N((T) => {
|
|
46
46
|
if (!_) return;
|
|
47
47
|
const m = t.current;
|
|
48
48
|
try {
|
|
49
|
-
const
|
|
49
|
+
const M = m.move({
|
|
50
50
|
from: _.from,
|
|
51
51
|
to: _.to,
|
|
52
|
-
promotion:
|
|
52
|
+
promotion: T
|
|
53
53
|
});
|
|
54
|
-
|
|
54
|
+
M && (R({ from: M.from, to: M.to }), I({ captured: !!M.captured, check: M.san.includes("+") || M.san.includes("#") }), v((H) => [
|
|
55
55
|
...H,
|
|
56
|
-
{ san:
|
|
56
|
+
{ san: M.san, fen: m.fen(), color: M.color }
|
|
57
57
|
]));
|
|
58
58
|
} catch {
|
|
59
59
|
}
|
|
60
|
-
|
|
61
|
-
}, [_, h, D]), Z = N((
|
|
60
|
+
P(null), h(), D();
|
|
61
|
+
}, [_, h, D]), Z = N((T) => {
|
|
62
62
|
const m = t.current;
|
|
63
63
|
try {
|
|
64
|
-
m.load(
|
|
64
|
+
m.load(T), h(), D();
|
|
65
65
|
} catch {
|
|
66
66
|
}
|
|
67
67
|
}, [h, D]), ue = N(() => {
|
|
68
|
-
t.current.reset(), h(), v([]), R(null), I(null),
|
|
68
|
+
t.current.reset(), h(), v([]), R(null), I(null), P(null), D();
|
|
69
69
|
}, [h, D]);
|
|
70
70
|
return {
|
|
71
71
|
fen: e,
|
|
@@ -191,8 +191,6 @@ function nt(t) {
|
|
|
191
191
|
}, 15e3);
|
|
192
192
|
try {
|
|
193
193
|
return await e.current.getBestMove(l, w);
|
|
194
|
-
} catch (b) {
|
|
195
|
-
return console.warn("Stockfish error:", b), null;
|
|
196
194
|
} finally {
|
|
197
195
|
clearTimeout(_), c.current === f && r(!1);
|
|
198
196
|
}
|
|
@@ -326,7 +324,7 @@ function Fe(t) {
|
|
|
326
324
|
return !1;
|
|
327
325
|
}
|
|
328
326
|
}
|
|
329
|
-
function
|
|
327
|
+
function Se(t, e) {
|
|
330
328
|
const n = ot(t);
|
|
331
329
|
if (n.length === 0) return null;
|
|
332
330
|
for (let s = 0; s < qe; s++) {
|
|
@@ -349,7 +347,7 @@ function Be(t, e) {
|
|
|
349
347
|
function ht(t) {
|
|
350
348
|
const { white: e, black: n } = rt(t), s = ut(e, n), o = Math.random() < 0.5 ? "add" : "remove", r = s === "help_white" ? "w" : "b", c = s === "help_white" ? "b" : "w";
|
|
351
349
|
if (o === "add") {
|
|
352
|
-
const i =
|
|
350
|
+
const i = Se(t, r);
|
|
353
351
|
if (i)
|
|
354
352
|
return {
|
|
355
353
|
newFen: i.newFen,
|
|
@@ -388,7 +386,7 @@ function ht(t) {
|
|
|
388
386
|
blackMaterial: n
|
|
389
387
|
}
|
|
390
388
|
};
|
|
391
|
-
const l =
|
|
389
|
+
const l = Se(t, r);
|
|
392
390
|
if (l)
|
|
393
391
|
return {
|
|
394
392
|
newFen: l.newFen,
|
|
@@ -427,21 +425,21 @@ function ft({
|
|
|
427
425
|
stupidLevel: n,
|
|
428
426
|
onChaosAction: s
|
|
429
427
|
}) {
|
|
430
|
-
const [o, r] = d(0), [c, i] = d(0), [l, w] = d(null), [f, _] = d(null),
|
|
431
|
-
|
|
428
|
+
const [o, r] = d(0), [c, i] = d(0), [l, w] = d(null), [f, _] = d(null), P = y(t), g = y(e), v = y(n), k = y(s), R = y(0), $ = y(null);
|
|
429
|
+
P.current = t, g.current = e, v.current = n, k.current = s;
|
|
432
430
|
const I = N(() => {
|
|
433
|
-
const
|
|
434
|
-
i(h), r(h), R.current = Date.now() +
|
|
431
|
+
const b = pt(v.current), h = Math.ceil(b / 1e3);
|
|
432
|
+
i(h), r(h), R.current = Date.now() + b;
|
|
435
433
|
}, []);
|
|
436
434
|
F(() => (I(), $.current = setInterval(() => {
|
|
437
435
|
if (g.current) return;
|
|
438
|
-
const
|
|
439
|
-
if (r(
|
|
436
|
+
const b = Math.max(0, Math.ceil((R.current - Date.now()) / 1e3));
|
|
437
|
+
if (r(b), b <= 0) {
|
|
440
438
|
if (g.current) {
|
|
441
439
|
I();
|
|
442
440
|
return;
|
|
443
441
|
}
|
|
444
|
-
const h = ht(
|
|
442
|
+
const h = ht(P.current);
|
|
445
443
|
h && (w(h.action), _(h.action.square), k.current(h.newFen), setTimeout(() => _(null), 600)), I();
|
|
446
444
|
}
|
|
447
445
|
}, 200), () => {
|
|
@@ -452,12 +450,12 @@ function ft({
|
|
|
452
450
|
if (e)
|
|
453
451
|
x.current = Date.now();
|
|
454
452
|
else if (x.current !== null) {
|
|
455
|
-
const
|
|
456
|
-
R.current +=
|
|
453
|
+
const b = Date.now() - x.current;
|
|
454
|
+
R.current += b, x.current = null;
|
|
457
455
|
}
|
|
458
456
|
}, [e]), { countdown: o, maxCountdown: c, lastAction: l, chaosSquare: f };
|
|
459
457
|
}
|
|
460
|
-
const vt = "_square_1tsnw_1", _t = "_light_1tsnw_14", gt = "_dark_1tsnw_18", kt = "_selected_1tsnw_22", yt = "_legalMove_1tsnw_26", wt = "_legalCapture_1tsnw_39", Ct = "_check_1tsnw_54", bt = "_lastMoveFrom_1tsnw_58", Tt = "_lastMoveTo_1tsnw_62", Lt = "_chaosFlash_1tsnw_66", Pt = "_piece_1tsnw_70",
|
|
458
|
+
const vt = "_square_1tsnw_1", _t = "_light_1tsnw_14", gt = "_dark_1tsnw_18", kt = "_selected_1tsnw_22", yt = "_legalMove_1tsnw_26", wt = "_legalCapture_1tsnw_39", Ct = "_check_1tsnw_54", bt = "_lastMoveFrom_1tsnw_58", Tt = "_lastMoveTo_1tsnw_62", Lt = "_chaosFlash_1tsnw_66", Pt = "_piece_1tsnw_70", Mt = "_pieceWhite_1tsnw_78", St = "_pieceBlack_1tsnw_83", O = {
|
|
461
459
|
square: vt,
|
|
462
460
|
light: _t,
|
|
463
461
|
dark: gt,
|
|
@@ -469,8 +467,8 @@ const vt = "_square_1tsnw_1", _t = "_light_1tsnw_14", gt = "_dark_1tsnw_18", kt
|
|
|
469
467
|
lastMoveTo: Tt,
|
|
470
468
|
chaosFlash: Lt,
|
|
471
469
|
piece: Pt,
|
|
472
|
-
pieceWhite:
|
|
473
|
-
pieceBlack:
|
|
470
|
+
pieceWhite: Mt,
|
|
471
|
+
pieceBlack: St
|
|
474
472
|
};
|
|
475
473
|
function De({ type: t, color: e, className: n }) {
|
|
476
474
|
const s = `${e}${t}`, o = ie[s];
|
|
@@ -498,7 +496,7 @@ function It({
|
|
|
498
496
|
fileLabel: f,
|
|
499
497
|
onClick: _
|
|
500
498
|
}) {
|
|
501
|
-
const
|
|
499
|
+
const P = [
|
|
502
500
|
O.square,
|
|
503
501
|
n ? O.light : O.dark,
|
|
504
502
|
s && O.selected,
|
|
@@ -508,7 +506,7 @@ function It({
|
|
|
508
506
|
!s && !r && i && O.lastMoveTo,
|
|
509
507
|
l && O.chaosFlash
|
|
510
508
|
].filter(Boolean).join(" ");
|
|
511
|
-
return /* @__PURE__ */ C("div", { className:
|
|
509
|
+
return /* @__PURE__ */ C("div", { className: P, onClick: () => _(t), children: [
|
|
512
510
|
e && /* @__PURE__ */ a(
|
|
513
511
|
De,
|
|
514
512
|
{
|
|
@@ -546,10 +544,10 @@ const Ft = Ze.memo(function({
|
|
|
546
544
|
const k = e[g][v];
|
|
547
545
|
k?.type === "k" && k.color === o && (f = Oe(g, v));
|
|
548
546
|
}
|
|
549
|
-
const _ = i ? [7, 6, 5, 4, 3, 2, 1, 0] : [0, 1, 2, 3, 4, 5, 6, 7],
|
|
547
|
+
const _ = i ? [7, 6, 5, 4, 3, 2, 1, 0] : [0, 1, 2, 3, 4, 5, 6, 7], P = i ? [7, 6, 5, 4, 3, 2, 1, 0] : [0, 1, 2, 3, 4, 5, 6, 7];
|
|
550
548
|
return /* @__PURE__ */ a("div", { className: `${ce.board}${l ? ` ${ce.boardLocked}` : ""}`, children: _.map(
|
|
551
|
-
(g) =>
|
|
552
|
-
const k = Oe(g, v), R = e[g][v], $ = _.indexOf(g), I =
|
|
549
|
+
(g) => P.map((v) => {
|
|
550
|
+
const k = Oe(g, v), R = e[g][v], $ = _.indexOf(g), I = P.indexOf(v);
|
|
553
551
|
return /* @__PURE__ */ a(
|
|
554
552
|
It,
|
|
555
553
|
{
|
|
@@ -711,7 +709,7 @@ function Ge({ level: t, onChange: e }) {
|
|
|
711
709
|
)
|
|
712
710
|
] });
|
|
713
711
|
}
|
|
714
|
-
function
|
|
712
|
+
function Mn({ depth: t, onDepthChange: e, stupidLevel: n, onStupidLevelChange: s, onSelectSide: o }) {
|
|
715
713
|
return /* @__PURE__ */ a("div", { className: u.sidePickerOverlay, children: /* @__PURE__ */ C("div", { className: u.sidePickerCard, children: [
|
|
716
714
|
/* @__PURE__ */ a("h2", { className: u.sidePickerTitle, children: "Choose Your Side" }),
|
|
717
715
|
/* @__PURE__ */ C("div", { className: u.sidePickerOptions, children: [
|
|
@@ -744,7 +742,7 @@ function Sn({ depth: t, onDepthChange: e, stupidLevel: n, onStupidLevelChange: s
|
|
|
744
742
|
] })
|
|
745
743
|
] }) });
|
|
746
744
|
}
|
|
747
|
-
function
|
|
745
|
+
function Sn({ muted: t, onToggle: e }) {
|
|
748
746
|
return /* @__PURE__ */ a(
|
|
749
747
|
"button",
|
|
750
748
|
{
|
|
@@ -833,16 +831,16 @@ function An(t) {
|
|
|
833
831
|
stockfishWorkerPath: w,
|
|
834
832
|
skipSetup: f = !1,
|
|
835
833
|
showControls: _ = !0,
|
|
836
|
-
showMuteButton:
|
|
834
|
+
showMuteButton: P = !0,
|
|
837
835
|
onGameOver: g,
|
|
838
836
|
onMove: v,
|
|
839
837
|
onChaosAction: k,
|
|
840
838
|
onRestart: R,
|
|
841
839
|
className: $
|
|
842
|
-
} = t, [I, x] = d(e),
|
|
840
|
+
} = t, [I, x] = d(e), b = r ?? I, h = c ?? x, [D, le] = d(n), W = i ?? D, Z = l ?? le, [ue, T] = d(s ?? "w"), m = ue, [M, H] = d(o), [q, S] = d(
|
|
843
841
|
f || s ? "playing" : "setup"
|
|
844
842
|
), {
|
|
845
|
-
fen:
|
|
843
|
+
fen: L,
|
|
846
844
|
turn: Q,
|
|
847
845
|
selectedSquare: Ae,
|
|
848
846
|
legalMoves: Ee,
|
|
@@ -857,7 +855,7 @@ function An(t) {
|
|
|
857
855
|
applyFen: te,
|
|
858
856
|
handleRestart: ge
|
|
859
857
|
} = et(), { isReady: K, isThinking: A, getBestMove: ne } = nt(w), se = K, E = Q === m, ke = W > 0, He = q !== "playing" || !ke || !E || A || !!ve || B.isGameOver, { countdown: Ue, maxCountdown: Ye, lastAction: V, chaosSquare: de } = ft({
|
|
860
|
-
fen:
|
|
858
|
+
fen: L,
|
|
861
859
|
isPaused: He,
|
|
862
860
|
stupidLevel: Math.max(1, W),
|
|
863
861
|
onChaosAction: N((p) => {
|
|
@@ -866,28 +864,28 @@ function An(t) {
|
|
|
866
864
|
}, [te])
|
|
867
865
|
}), ye = y(V);
|
|
868
866
|
F(() => {
|
|
869
|
-
V && V !== ye.current && k?.(V,
|
|
870
|
-
}, [V,
|
|
871
|
-
const he = y(
|
|
872
|
-
he.current =
|
|
867
|
+
V && V !== ye.current && k?.(V, L), ye.current = V;
|
|
868
|
+
}, [V, L, k]);
|
|
869
|
+
const he = y(L);
|
|
870
|
+
he.current = L;
|
|
873
871
|
const we = y(m);
|
|
874
872
|
we.current = m;
|
|
875
873
|
const U = y(null), re = N((p) => {
|
|
876
874
|
const j = p.slice(0, 2), Je = p.slice(2, 4), Le = p.length > 4 ? p[4] : void 0;
|
|
877
875
|
try {
|
|
878
|
-
const Pe = new oe(he.current),
|
|
879
|
-
Le && (
|
|
876
|
+
const Pe = new oe(he.current), Me = { from: j, to: Je };
|
|
877
|
+
Le && (Me.promotion = Le), Pe.move(Me) ? te(Pe.fen()) : console.warn("[ChaosChess] Stockfish move invalid for current position, will retry");
|
|
880
878
|
} catch {
|
|
881
879
|
console.warn("[ChaosChess] Stockfish move threw, will retry");
|
|
882
880
|
}
|
|
883
881
|
}, [te]), ze = N((p) => {
|
|
884
|
-
|
|
882
|
+
T(p), S("playing");
|
|
885
883
|
}, []), Qe = N(() => {
|
|
886
|
-
ge(),
|
|
884
|
+
ge(), S(f || s ? "playing" : "setup"), R?.();
|
|
887
885
|
}, [ge, f, s, R]);
|
|
888
886
|
F(() => {
|
|
889
|
-
Y.setMuted(
|
|
890
|
-
}, [
|
|
887
|
+
Y.setMuted(M);
|
|
888
|
+
}, [M]);
|
|
891
889
|
const Ce = y(G.length);
|
|
892
890
|
F(() => {
|
|
893
891
|
if (G.length > Ce.current) {
|
|
@@ -909,26 +907,28 @@ function An(t) {
|
|
|
909
907
|
me.current = !1;
|
|
910
908
|
return;
|
|
911
909
|
}
|
|
912
|
-
E || B.isGameOver || !K || A || U.current !==
|
|
910
|
+
E || B.isGameOver || !K || A || U.current !== L && (m === "b" && !me.current && (me.current = !0), ne(L, b).then((p) => {
|
|
913
911
|
if (!p) {
|
|
914
|
-
|
|
912
|
+
U.current = L;
|
|
915
913
|
return;
|
|
916
914
|
}
|
|
917
915
|
U.current = null, re(p);
|
|
916
|
+
}).catch(() => {
|
|
918
917
|
}));
|
|
919
|
-
}, [q,
|
|
920
|
-
if (q !== "playing" || E || A || B.isGameOver || !K || U.current ===
|
|
918
|
+
}, [q, L, E, B.isGameOver, K, A, m, ne, b, re]), F(() => {
|
|
919
|
+
if (q !== "playing" || E || A || B.isGameOver || !K || U.current === L) return;
|
|
921
920
|
const p = setTimeout(() => {
|
|
922
|
-
ne(
|
|
921
|
+
ne(L, b).then((j) => {
|
|
923
922
|
if (!j) {
|
|
924
|
-
U.current =
|
|
923
|
+
U.current = L;
|
|
925
924
|
return;
|
|
926
925
|
}
|
|
927
926
|
U.current = null, re(j);
|
|
927
|
+
}).catch(() => {
|
|
928
928
|
});
|
|
929
929
|
}, 3e3);
|
|
930
930
|
return () => clearTimeout(p);
|
|
931
|
-
}, [q, E, A, B.isGameOver, K,
|
|
931
|
+
}, [q, E, A, B.isGameOver, K, L, b, ne, re]);
|
|
932
932
|
const Ke = N(
|
|
933
933
|
(p) => {
|
|
934
934
|
se && Q !== m || _e(p);
|
|
@@ -936,9 +936,9 @@ function An(t) {
|
|
|
936
936
|
[se, Q, m, _e]
|
|
937
937
|
), Xe = B.isGameOver ? "Game Over" : A ? "" : se ? E ? "Your turn" : "Opponent thinking..." : `${Q === "w" ? "White" : "Black"} to move`, Te = [z.container, $].filter(Boolean).join(" ");
|
|
938
938
|
return q === "setup" ? /* @__PURE__ */ a("div", { className: Te, "data-chaos-chess": "", children: /* @__PURE__ */ a(
|
|
939
|
-
|
|
939
|
+
Mn,
|
|
940
940
|
{
|
|
941
|
-
depth:
|
|
941
|
+
depth: b,
|
|
942
942
|
onDepthChange: h,
|
|
943
943
|
stupidLevel: W,
|
|
944
944
|
onStupidLevelChange: Z,
|
|
@@ -950,7 +950,7 @@ function An(t) {
|
|
|
950
950
|
/* @__PURE__ */ a("span", { className: z.statusText, children: Xe }),
|
|
951
951
|
A && /* @__PURE__ */ a("span", { className: z.thinking, children: "AI thinking..." })
|
|
952
952
|
] }),
|
|
953
|
-
|
|
953
|
+
P && /* @__PURE__ */ a(Sn, { muted: M, onToggle: () => H((p) => !p) })
|
|
954
954
|
] }),
|
|
955
955
|
ke && /* @__PURE__ */ a(Tn, { countdown: Ue, maxCountdown: Ye }),
|
|
956
956
|
/* @__PURE__ */ a(
|
|
@@ -968,7 +968,7 @@ function An(t) {
|
|
|
968
968
|
}
|
|
969
969
|
),
|
|
970
970
|
_ && /* @__PURE__ */ C("div", { className: z.bottomBar, children: [
|
|
971
|
-
/* @__PURE__ */ a(xe, { depth:
|
|
971
|
+
/* @__PURE__ */ a(xe, { depth: b, onChange: h }),
|
|
972
972
|
/* @__PURE__ */ a(Ge, { level: W, onChange: Z })
|
|
973
973
|
] }),
|
|
974
974
|
/* @__PURE__ */ a(Ln, { action: V }),
|
package/dist/chaos-chess.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chaos-chess.js","sources":["../src/hooks/useChessGame.ts","../src/engine/stockfishWorker.ts","../src/hooks/useStockfish.ts","../src/types/chess.ts","../src/engine/fenManipulator.ts","../src/engine/chaosEngine.ts","../src/hooks/useChaosEngine.ts","../src/components/PieceIcon.tsx","../src/components/Square.tsx","../src/components/ChessBoard.tsx","../src/components/PromotionDialog.tsx","../src/components/GameOverBanner.tsx","../src/components/ChaosTimer.tsx","../src/components/ChaosToast.tsx","../src/components/DifficultySelector.tsx","../src/components/StupidLevel.tsx","../src/components/SidePicker.tsx","../src/components/MuteButton.tsx","../src/utils/sounds.ts","../src/ChessGame.tsx"],"sourcesContent":["import { useState, useRef, useCallback } from 'react';\nimport { Chess } from 'chess.js';\nimport type { Square as ChessSquare, Move, Piece } from 'chess.js';\nimport type { GameStatus, PromotionPending, MoveHistoryEntry, Color } from '../types/chess.ts';\n\ninterface LastMove {\n from: ChessSquare;\n to: ChessSquare;\n}\n\nexport interface LastMoveDetail {\n captured: boolean;\n check: boolean;\n}\n\nexport interface UseChessGameReturn {\n fen: string;\n turn: 'w' | 'b';\n selectedSquare: ChessSquare | null;\n legalMoves: ChessSquare[];\n gameStatus: GameStatus;\n promotionPending: PromotionPending | null;\n moveHistory: MoveHistoryEntry[];\n lastMove: LastMove | null;\n lastMoveDetail: LastMoveDetail | null;\n handleSquareClick: (square: ChessSquare) => void;\n handlePromotion: (piece: 'q' | 'r' | 'b' | 'n') => void;\n applyFen: (newFen: string) => void;\n board: (Piece | null)[][];\n handleRestart: () => void;\n}\n\nfunction getGameStatus(chess: Chess): GameStatus {\n if (!chess.isGameOver()) {\n const inCheck = chess.inCheck() ? chess.turn() : null;\n return { isGameOver: false, result: null, winner: null, inCheck };\n }\n\n if (chess.isCheckmate()) {\n const winner: Color = chess.turn() === 'w' ? 'b' : 'w';\n return { isGameOver: true, result: 'checkmate', winner, inCheck: chess.turn() };\n }\n if (chess.isStalemate()) {\n return { isGameOver: true, result: 'stalemate', winner: null, inCheck: null };\n }\n if (chess.isInsufficientMaterial()) {\n return { isGameOver: true, result: 'insufficient', winner: null, inCheck: null };\n }\n if (chess.isThreefoldRepetition()) {\n return { isGameOver: true, result: 'threefold', winner: null, inCheck: null };\n }\n // 50-move rule or other draw\n return { isGameOver: true, result: 'draw', winner: null, inCheck: null };\n}\n\nexport function useChessGame() {\n const chessRef = useRef(new Chess());\n const [fen, setFen] = useState(chessRef.current.fen());\n const [turn, setTurn] = useState<'w' | 'b'>(chessRef.current.turn());\n const [selectedSquare, setSelectedSquare] = useState<ChessSquare | null>(null);\n const [legalMoves, setLegalMoves] = useState<ChessSquare[]>([]);\n const [gameStatus, setGameStatus] = useState<GameStatus>(getGameStatus(chessRef.current));\n const [promotionPending, setPromotionPending] = useState<PromotionPending | null>(null);\n const [moveHistory, setMoveHistory] = useState<MoveHistoryEntry[]>([]);\n const [lastMove, setLastMove] = useState<LastMove | null>(null);\n const [lastMoveDetail, setLastMoveDetail] = useState<LastMoveDetail | null>(null);\n const [board, setBoard] = useState<(Piece | null)[][]>(chessRef.current.board());\n\n const clearSelection = useCallback(() => {\n setSelectedSquare(null);\n setLegalMoves([]);\n }, []);\n\n const syncState = useCallback(() => {\n setFen(chessRef.current.fen());\n setTurn(chessRef.current.turn());\n setBoard(chessRef.current.board());\n setGameStatus(getGameStatus(chessRef.current));\n }, []);\n\n const handleSquareClick = useCallback((square: ChessSquare) => {\n const chess = chessRef.current;\n const turn = chess.turn();\n\n // Ignore clicks during promotion or game over\n if (promotionPending || getGameStatus(chess).isGameOver) {\n return;\n }\n\n // If we have a selected square and this click is a legal move destination\n if (selectedSquare && legalMoves.includes(square)) {\n // Check if this is a pawn promotion\n const piece = chess.get(selectedSquare);\n if (\n piece?.type === 'p' &&\n ((piece.color === 'w' && square[1] === '8') ||\n (piece.color === 'b' && square[1] === '1'))\n ) {\n setPromotionPending({ from: selectedSquare, to: square });\n clearSelection();\n return;\n }\n\n // Execute the move\n try {\n const move = chess.move({ from: selectedSquare, to: square });\n if (move) {\n setLastMove({ from: move.from, to: move.to });\n setLastMoveDetail({ captured: !!move.captured, check: move.san.includes('+') || move.san.includes('#') });\n setMoveHistory((prev) => [\n ...prev,\n { san: move.san, fen: chess.fen(), color: move.color },\n ]);\n }\n } catch {\n // Invalid move, just deselect\n }\n clearSelection();\n syncState();\n return;\n }\n\n // If clicking on a piece belonging to the side-to-move, select it\n const piece = chess.get(square);\n if (piece && piece.color === turn) {\n if (square === selectedSquare) {\n clearSelection();\n return;\n }\n setSelectedSquare(square);\n const moves = chess.moves({ square, verbose: true }) as Move[];\n setLegalMoves(moves.map((m) => m.to));\n return;\n }\n\n // Clicking empty square or opponent piece without selection\n clearSelection();\n }, [selectedSquare, legalMoves, promotionPending, clearSelection, syncState]);\n\n const handlePromotion = useCallback((piece: 'q' | 'r' | 'b' | 'n') => {\n if (!promotionPending) return;\n const chess = chessRef.current;\n try {\n const move = chess.move({\n from: promotionPending.from,\n to: promotionPending.to,\n promotion: piece,\n });\n if (move) {\n setLastMove({ from: move.from, to: move.to });\n setLastMoveDetail({ captured: !!move.captured, check: move.san.includes('+') || move.san.includes('#') });\n setMoveHistory((prev) => [\n ...prev,\n { san: move.san, fen: chess.fen(), color: move.color },\n ]);\n }\n } catch {\n // Invalid promotion, ignore\n }\n setPromotionPending(null);\n clearSelection();\n syncState();\n }, [promotionPending, clearSelection, syncState]);\n\n const applyFen = useCallback((newFen: string) => {\n const chess = chessRef.current;\n try {\n chess.load(newFen);\n clearSelection();\n syncState();\n } catch {\n // Invalid FEN, ignore\n }\n }, [clearSelection, syncState]);\n\n const handleRestart = useCallback(() => {\n const chess = chessRef.current;\n chess.reset();\n clearSelection();\n setMoveHistory([]);\n setLastMove(null);\n setLastMoveDetail(null);\n setPromotionPending(null);\n syncState();\n }, [clearSelection, syncState]);\n\n return {\n fen,\n turn,\n selectedSquare,\n legalMoves,\n gameStatus,\n promotionPending,\n moveHistory,\n lastMove,\n lastMoveDetail,\n board,\n handleSquareClick,\n handlePromotion,\n applyFen,\n handleRestart,\n } satisfies UseChessGameReturn;\n}\n","/**\n * Wraps the Stockfish WASM Web Worker with a promise-based API.\n *\n * Uses the UCI protocol's `isready`/`readyok` handshake to flush stale\n * `bestmove` responses after `stop`, preventing a new search's listener\n * from picking up results from a cancelled search.\n */\nexport class StockfishEngine {\n private worker: Worker | null = null;\n private resolveMove: ((move: string | null) => void) | null = null;\n private rejectMove: ((reason: Error) => void) | null = null;\n private currentListener: ((e: MessageEvent) => void) | null = null;\n private timeoutId: ReturnType<typeof setTimeout> | null = null;\n private searchId = 0;\n private workerPath: string;\n\n constructor(workerPath = '/stockfish/stockfish-18-lite-single.js') {\n this.workerPath = workerPath;\n }\n\n async init(): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n try {\n this.worker = new Worker(this.workerPath);\n const onReady = (e: MessageEvent) => {\n const msg = typeof e.data === 'string' ? e.data : '';\n if (msg.includes('uciok')) {\n this.worker?.removeEventListener('message', onReady);\n resolve();\n }\n };\n this.worker.addEventListener('message', onReady);\n this.worker.addEventListener('error', (e) => {\n reject(new Error(`Stockfish worker error: ${e.message}`));\n });\n this.worker.postMessage('uci');\n } catch (err) {\n reject(err);\n }\n });\n }\n\n /** Cancel any in-flight search and clean up its listener/promise/timer. */\n private cancelPending(): void {\n if (this.timeoutId !== null) {\n clearTimeout(this.timeoutId);\n this.timeoutId = null;\n }\n if (this.currentListener && this.worker) {\n this.worker.removeEventListener('message', this.currentListener);\n this.currentListener = null;\n }\n if (this.rejectMove) {\n this.rejectMove(new Error('Search cancelled'));\n this.resolveMove = null;\n this.rejectMove = null;\n }\n this.stop();\n }\n\n /**\n * Send `isready` and wait for `readyok`.\n * This flushes any stale `bestmove` from a prior `stop` command,\n * guaranteeing the message queue is clean before a new search starts.\n */\n private waitReady(): Promise<void> {\n return new Promise<void>((resolve) => {\n if (!this.worker) { resolve(); return; }\n\n const onMessage = (e: MessageEvent) => {\n const msg = typeof e.data === 'string' ? e.data : '';\n if (msg === 'readyok') {\n this.worker?.removeEventListener('message', onMessage);\n resolve();\n }\n // Silently consume any other messages (including stale bestmove)\n };\n\n this.worker.addEventListener('message', onMessage);\n this.worker.postMessage('isready');\n });\n }\n\n /**\n * Get the best move for a given FEN position at the specified depth.\n * Returns a UCI move string like \"e2e4\".\n * Calling this while a search is in-flight cancels the previous search.\n */\n async getBestMove(fen: string, depth: number, timeoutMs = 10000): Promise<string | null> {\n // Cancel any in-flight search before starting a new one\n this.cancelPending();\n\n // Flush stale bestmove from the stopped search via UCI isready/readyok\n await this.waitReady();\n\n const mySearchId = ++this.searchId;\n\n return new Promise<string | null>((resolve, reject) => {\n if (!this.worker) {\n reject(new Error('Stockfish not initialized'));\n return;\n }\n\n this.resolveMove = resolve;\n this.rejectMove = reject;\n\n this.timeoutId = setTimeout(() => {\n // Only cancel if this timeout belongs to the current search\n if (this.searchId === mySearchId) {\n this.cancelPending();\n }\n }, timeoutMs);\n\n const onMessage = (e: MessageEvent) => {\n const msg = typeof e.data === 'string' ? e.data : '';\n if (msg.startsWith('bestmove')) {\n if (this.timeoutId !== null) {\n clearTimeout(this.timeoutId);\n this.timeoutId = null;\n }\n this.worker?.removeEventListener('message', onMessage);\n this.currentListener = null;\n const move = msg.split(' ')[1];\n if (this.resolveMove) {\n // \"(none)\" means no legal move exists — resolve with null instead of rejecting.\n // This is expected in chaos chess where piece mutations can create such positions.\n this.resolveMove(move && move !== '(none)' ? move : null);\n this.resolveMove = null;\n this.rejectMove = null;\n }\n }\n };\n\n this.currentListener = onMessage;\n this.worker.addEventListener('message', onMessage);\n // Clear transposition table so chaos-mutated boards start from a clean slate\n this.worker.postMessage('ucinewgame');\n this.worker.postMessage(`position fen ${fen}`);\n this.worker.postMessage(`go depth ${depth}`);\n });\n }\n\n /**\n * Stop any current search.\n */\n stop(): void {\n this.worker?.postMessage('stop');\n }\n\n /**\n * Terminate the worker.\n */\n destroy(): void {\n this.cancelPending();\n this.worker?.postMessage('quit');\n this.worker?.terminate();\n this.worker = null;\n }\n}\n","import { useState, useRef, useEffect, useCallback } from 'react';\nimport { StockfishEngine } from '../engine/stockfishWorker.ts';\n\ninterface UseStockfishReturn {\n isReady: boolean;\n isThinking: boolean;\n getBestMove: (fen: string, depth: number) => Promise<string | null>;\n}\n\nexport function useStockfish(workerPath?: string): UseStockfishReturn {\n const engineRef = useRef<StockfishEngine | null>(null);\n const [isReady, setIsReady] = useState(false);\n const [isThinking, setIsThinking] = useState(false);\n // Track in-flight calls so only the latest one controls isThinking\n const callIdRef = useRef(0);\n\n useEffect(() => {\n const engine = new StockfishEngine(workerPath);\n engineRef.current = engine;\n\n engine\n .init()\n .then(() => setIsReady(true))\n .catch((err) => {\n console.warn('Stockfish failed to load:', err.message);\n });\n\n return () => {\n engine.destroy();\n engineRef.current = null;\n };\n }, []);\n\n const getBestMove = useCallback(\n async (fen: string, depth: number): Promise<string | null> => {\n if (!engineRef.current || !isReady) return null;\n const myCallId = ++callIdRef.current;\n setIsThinking(true);\n\n // Safety timeout: clear isThinking if getBestMove hasn't resolved in 15s\n const safetyTimeout = setTimeout(() => {\n if (callIdRef.current === myCallId) {\n console.warn('[ChaosChess] Safety timeout: clearing isThinking after 15s');\n setIsThinking(false);\n }\n }, 15000);\n\n try {\n const move = await engineRef.current.getBestMove(fen, depth);\n return move;\n } catch (err) {\n console.warn('Stockfish error:', err);\n return null;\n } finally {\n clearTimeout(safetyTimeout);\n // Only clear isThinking if no newer call has started\n if (callIdRef.current === myCallId) {\n setIsThinking(false);\n }\n }\n },\n [isReady]\n );\n\n return { isReady, isThinking, getBestMove };\n}\n","import type { Square as ChessSquare, PieceSymbol, Color } from 'chess.js';\n\nexport type { ChessSquare, PieceSymbol, Color };\n\nexport type GameResult = 'checkmate' | 'stalemate' | 'draw' | 'insufficient' | 'threefold' | 'fifty-move';\n\nexport interface GameStatus {\n isGameOver: boolean;\n result: GameResult | null;\n winner: Color | null;\n inCheck: Color | null;\n}\n\nexport type ChaosActionType = 'add' | 'remove';\nexport type ChaosTarget = 'help_white' | 'help_black';\n\nexport interface ChaosAction {\n type: ChaosActionType;\n target: ChaosTarget;\n square: ChessSquare;\n piece?: PieceSymbol;\n color?: Color;\n whiteMaterial: number;\n blackMaterial: number;\n}\n\nexport interface PromotionPending {\n from: ChessSquare;\n to: ChessSquare;\n}\n\nexport interface MoveHistoryEntry {\n san: string;\n fen: string;\n color: Color;\n}\n\nexport interface MaterialCount {\n white: number;\n black: number;\n}\n\nexport const PIECE_VALUES: Record<PieceSymbol, number> = {\n p: 1,\n n: 3,\n b: 3,\n r: 5,\n q: 9,\n k: 0,\n};\n\n// Filled symbols for white (bright on dark bg), outlines for black\n// \\uFE0E = Variation Selector 15 — forces text presentation on iOS\n// (without it, iOS renders some glyphs as color emoji)\nexport const PIECE_UNICODE: Record<string, string> = {\n wk: '\\u265A\\uFE0E',\n wq: '\\u265B\\uFE0E',\n wr: '\\u265C\\uFE0E',\n wb: '\\u265D\\uFE0E',\n wn: '\\u265E\\uFE0E',\n wp: '\\u265F\\uFE0E',\n bk: '\\u2654\\uFE0E',\n bq: '\\u2655\\uFE0E',\n br: '\\u2656\\uFE0E',\n bb: '\\u2657\\uFE0E',\n bn: '\\u2658\\uFE0E',\n bp: '\\u2659\\uFE0E',\n};\n","import type { PieceSymbol, Color, ChessSquare, MaterialCount } from '../types/chess.ts';\nimport { PIECE_VALUES } from '../types/chess.ts';\n\nexport interface FenPiece {\n type: PieceSymbol;\n color: Color;\n}\n\nexport type Board8x8 = (FenPiece | null)[][];\n\nconst FILES = 'abcdefgh';\n\n/**\n * Parse a FEN string into its components.\n */\nexport function parseFen(fen: string) {\n const parts = fen.split(' ');\n return {\n position: parts[0],\n activeColor: parts[1] as Color,\n castling: parts[2],\n enPassant: parts[3],\n halfmove: parts[4],\n fullmove: parts[5],\n };\n}\n\n/**\n * Convert the position segment of a FEN into an 8x8 board array.\n * board[rank][file] where rank 0 = rank 8 (top), rank 7 = rank 1 (bottom).\n */\nexport function positionToBoard(position: string): Board8x8 {\n const board: Board8x8 = [];\n const ranks = position.split('/');\n for (const rank of ranks) {\n const row: (FenPiece | null)[] = [];\n for (const ch of rank) {\n const emptyCount = parseInt(ch);\n if (!isNaN(emptyCount)) {\n for (let i = 0; i < emptyCount; i++) row.push(null);\n } else {\n const color: Color = ch === ch.toUpperCase() ? 'w' : 'b';\n const type = ch.toLowerCase() as PieceSymbol;\n row.push({ type, color });\n }\n }\n board.push(row);\n }\n return board;\n}\n\n/**\n * Convert an 8x8 board array back to a FEN position string.\n */\nexport function boardToPosition(board: Board8x8): string {\n return board\n .map((row) => {\n let rankStr = '';\n let emptyCount = 0;\n for (const cell of row) {\n if (cell === null) {\n emptyCount++;\n } else {\n if (emptyCount > 0) {\n rankStr += emptyCount;\n emptyCount = 0;\n }\n const ch = cell.color === 'w' ? cell.type.toUpperCase() : cell.type;\n rankStr += ch;\n }\n }\n if (emptyCount > 0) rankStr += emptyCount;\n return rankStr;\n })\n .join('/');\n}\n\n/**\n * Serialize FEN components back into a FEN string.\n */\nexport function serializeFen(parts: ReturnType<typeof parseFen>): string {\n return `${parts.position} ${parts.activeColor} ${parts.castling} ${parts.enPassant} ${parts.halfmove} ${parts.fullmove}`;\n}\n\n/**\n * Calculate material values for both sides from a FEN string.\n */\nexport function calculateMaterial(fen: string): MaterialCount {\n const { position } = parseFen(fen);\n const board = positionToBoard(position);\n let white = 0;\n let black = 0;\n for (const row of board) {\n for (const cell of row) {\n if (cell) {\n const value = PIECE_VALUES[cell.type];\n if (cell.color === 'w') white += value;\n else black += value;\n }\n }\n }\n return { white, black };\n}\n\n/**\n * Get all empty squares on the board.\n */\nexport function getEmptySquares(fen: string): ChessSquare[] {\n const { position } = parseFen(fen);\n const board = positionToBoard(position);\n const squares: ChessSquare[] = [];\n for (let rank = 0; rank < 8; rank++) {\n for (let file = 0; file < 8; file++) {\n if (board[rank][file] === null) {\n squares.push(`${FILES[file]}${8 - rank}` as ChessSquare);\n }\n }\n }\n return squares;\n}\n\n/**\n * Get all squares occupied by pieces of a given color (optionally excluding king).\n */\nexport function getPieceSquares(\n fen: string,\n color: Color,\n excludeKing = true\n): ChessSquare[] {\n const { position } = parseFen(fen);\n const board = positionToBoard(position);\n const squares: ChessSquare[] = [];\n for (let rank = 0; rank < 8; rank++) {\n for (let file = 0; file < 8; file++) {\n const cell = board[rank][file];\n if (cell && cell.color === color) {\n if (excludeKing && cell.type === 'k') continue;\n squares.push(`${FILES[file]}${8 - rank}` as ChessSquare);\n }\n }\n }\n return squares;\n}\n\n/**\n * Convert a square name (e.g. 'e4') to board array indices [rank, file].\n */\nexport function squareToIndices(square: ChessSquare): [number, number] {\n const file = FILES.indexOf(square[0]);\n const rank = 8 - parseInt(square[1]);\n return [rank, file];\n}\n\n/**\n * Add a piece to the board at a given square, returning a new FEN.\n */\nexport function addPieceToFen(\n fen: string,\n square: ChessSquare,\n piece: PieceSymbol,\n color: Color\n): string {\n const parts = parseFen(fen);\n const board = positionToBoard(parts.position);\n const [rank, file] = squareToIndices(square);\n board[rank][file] = { type: piece, color };\n parts.position = boardToPosition(board);\n return serializeFen(parts);\n}\n\n/**\n * Remove a piece from the board at a given square, returning a new FEN.\n */\nexport function removePieceFromFen(\n fen: string,\n square: ChessSquare\n): string {\n const parts = parseFen(fen);\n const board = positionToBoard(parts.position);\n const [rank, file] = squareToIndices(square);\n board[rank][file] = null;\n parts.position = boardToPosition(board);\n return serializeFen(parts);\n}\n","import { Chess } from 'chess.js';\nimport type { PieceSymbol, Color, ChessSquare, ChaosAction, ChaosTarget } from '../types/chess.ts';\nimport {\n calculateMaterial,\n getEmptySquares,\n getPieceSquares,\n addPieceToFen,\n removePieceFromFen,\n} from './fenManipulator.ts';\n\nconst ADDABLE_PIECES: PieceSymbol[] = ['p', 'n', 'b', 'r', 'q'];\nconst MAX_RETRIES = 3;\n\n/**\n * Determine which side to help based on material balance.\n * 70% chance to help the losing side, 30% chance to help the winning side.\n * Equal material = 50/50.\n */\nexport function getChaosTarget(whiteMaterial: number, blackMaterial: number): ChaosTarget {\n if (whiteMaterial > blackMaterial) {\n return Math.random() < 0.7 ? 'help_black' : 'help_white';\n } else if (blackMaterial > whiteMaterial) {\n return Math.random() < 0.7 ? 'help_white' : 'help_black';\n }\n return Math.random() < 0.5 ? 'help_white' : 'help_black';\n}\n\n/**\n * Pick a random element from an array.\n */\nfunction randomChoice<T>(arr: T[]): T {\n return arr[Math.floor(Math.random() * arr.length)];\n}\n\n/**\n * Choose a random piece type to add.\n * If the target square is on rank 1 or 8, avoid pawns.\n */\nfunction chooseRandomPiece(square: ChessSquare): PieceSymbol {\n const rank = parseInt(square[1]);\n if (rank === 1 || rank === 8) {\n // No pawns on first/last rank\n const noPawns: PieceSymbol[] = ['n', 'b', 'r', 'q'];\n return randomChoice(noPawns);\n }\n return randomChoice(ADDABLE_PIECES);\n}\n\n/**\n * Validate that a FEN can be loaded by chess.js (position is legal enough to continue).\n */\nexport function isValidChaosPosition(fen: string): boolean {\n try {\n const test = new Chess();\n test.load(fen);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Try to add a random piece for the given color.\n * Returns { newFen, action } or null if impossible.\n */\nexport function addRandomPiece(\n fen: string,\n color: Color\n): { newFen: string; square: ChessSquare; piece: PieceSymbol } | null {\n const emptySquares = getEmptySquares(fen);\n if (emptySquares.length === 0) return null;\n\n for (let attempt = 0; attempt < MAX_RETRIES; attempt++) {\n const square = randomChoice(emptySquares);\n const piece = chooseRandomPiece(square);\n const newFen = addPieceToFen(fen, square, piece, color);\n if (isValidChaosPosition(newFen)) {\n return { newFen, square, piece };\n }\n }\n return null;\n}\n\n/**\n * Try to remove a random piece of the given color (excluding king).\n * Returns { newFen, square } or null if impossible.\n */\nexport function removeRandomPiece(\n fen: string,\n color: Color\n): { newFen: string; square: ChessSquare } | null {\n const pieceSquares = getPieceSquares(fen, color, true);\n if (pieceSquares.length === 0) return null;\n\n for (let attempt = 0; attempt < MAX_RETRIES; attempt++) {\n const square = randomChoice(pieceSquares);\n // Extra safety: don't remove a piece on rank 1/8 if it's the only defender...\n // Actually, the Python version doesn't check this. Just remove and validate.\n const newFen = removePieceFromFen(fen, square);\n if (isValidChaosPosition(newFen)) {\n return { newFen, square };\n }\n }\n return null;\n}\n\n/**\n * Execute one chaos action: evaluate material, pick target side, randomly add or remove.\n * Returns the action details and new FEN, or null if no valid action was found.\n */\nexport function executeChaosAction(fen: string): { newFen: string; action: ChaosAction } | null {\n const { white: whiteMaterial, black: blackMaterial } = calculateMaterial(fen);\n const target = getChaosTarget(whiteMaterial, blackMaterial);\n const operation = Math.random() < 0.5 ? 'add' : 'remove';\n\n // Determine which color to add to / remove from\n const addColor: Color = target === 'help_white' ? 'w' : 'b';\n const removeColor: Color = target === 'help_white' ? 'b' : 'w';\n\n if (operation === 'add') {\n const result = addRandomPiece(fen, addColor);\n if (result) {\n return {\n newFen: result.newFen,\n action: {\n type: 'add',\n target,\n square: result.square,\n piece: result.piece,\n color: addColor,\n whiteMaterial,\n blackMaterial,\n },\n };\n }\n // Fallback: try remove instead\n const fallback = removeRandomPiece(fen, removeColor);\n if (fallback) {\n return {\n newFen: fallback.newFen,\n action: {\n type: 'remove',\n target,\n square: fallback.square,\n whiteMaterial,\n blackMaterial,\n },\n };\n }\n } else {\n const result = removeRandomPiece(fen, removeColor);\n if (result) {\n return {\n newFen: result.newFen,\n action: {\n type: 'remove',\n target,\n square: result.square,\n whiteMaterial,\n blackMaterial,\n },\n };\n }\n // Fallback: try add instead\n const fallback = addRandomPiece(fen, addColor);\n if (fallback) {\n return {\n newFen: fallback.newFen,\n action: {\n type: 'add',\n target,\n square: fallback.square,\n piece: fallback.piece,\n color: addColor,\n whiteMaterial,\n blackMaterial,\n },\n };\n }\n }\n\n return null;\n}\n\n/**\n * Uniform distribution for chaos interval, parameterized by stupid level (1-5).\n *\n * Level 1: 12–20s (chill)\n * Level 2: 8–15s (moderate)\n * Level 3: 5–12s (default)\n * Level 4: 3–7s (chaotic)\n * Level 5: 1–4s (insane)\n */\nconst STUPID_BOUNDS: [number, number][] = [\n [12, 20], // level 1\n [8, 15], // level 2\n [5, 12], // level 3\n [3, 7], // level 4\n [1, 4], // level 5\n];\n\nexport function getRandomChaosInterval(stupidLevel: number = 3): number {\n const idx = Math.max(0, Math.min(4, stupidLevel - 1));\n const [lo, hi] = STUPID_BOUNDS[idx];\n const seconds = lo + Math.random() * (hi - lo);\n return seconds * 1000;\n}\n","import { useState, useEffect, useRef, useCallback } from 'react';\nimport { executeChaosAction, getRandomChaosInterval } from '../engine/chaosEngine.ts';\nimport type { ChaosAction, ChessSquare } from '../types/chess.ts';\n\ninterface UseChaosEngineParams {\n fen: string;\n isPaused: boolean;\n stupidLevel: number;\n onChaosAction: (newFen: string) => void;\n}\n\ninterface UseChaosEngineReturn {\n countdown: number;\n maxCountdown: number;\n lastAction: ChaosAction | null;\n chaosSquare: ChessSquare | null;\n}\n\nexport function useChaosEngine({\n fen,\n isPaused,\n stupidLevel,\n onChaosAction,\n}: UseChaosEngineParams): UseChaosEngineReturn {\n const [countdown, setCountdown] = useState(0);\n const [maxCountdown, setMaxCountdown] = useState(0);\n const [lastAction, setLastAction] = useState<ChaosAction | null>(null);\n const [chaosSquare, setChaosSquare] = useState<ChessSquare | null>(null);\n\n const fenRef = useRef(fen);\n const isPausedRef = useRef(isPaused);\n const stupidLevelRef = useRef(stupidLevel);\n const onChaosActionRef = useRef(onChaosAction);\n const targetTimeRef = useRef<number>(0);\n const intervalIdRef = useRef<ReturnType<typeof setInterval> | null>(null);\n\n fenRef.current = fen;\n isPausedRef.current = isPaused;\n stupidLevelRef.current = stupidLevel;\n onChaosActionRef.current = onChaosAction;\n\n const scheduleNext = useCallback(() => {\n const intervalMs = getRandomChaosInterval(stupidLevelRef.current);\n const seconds = Math.ceil(intervalMs / 1000);\n setMaxCountdown(seconds);\n setCountdown(seconds);\n targetTimeRef.current = Date.now() + intervalMs;\n }, []);\n\n useEffect(() => {\n // Initial schedule\n scheduleNext();\n\n intervalIdRef.current = setInterval(() => {\n if (isPausedRef.current) return;\n\n const remaining = Math.max(0, Math.ceil((targetTimeRef.current - Date.now()) / 1000));\n setCountdown(remaining);\n\n if (remaining <= 0) {\n if (isPausedRef.current) {\n scheduleNext();\n return;\n }\n // Fire chaos action\n const result = executeChaosAction(fenRef.current);\n if (result) {\n setLastAction(result.action);\n setChaosSquare(result.action.square);\n onChaosActionRef.current(result.newFen);\n\n // Clear chaos square highlight after animation\n setTimeout(() => setChaosSquare(null), 600);\n }\n scheduleNext();\n }\n }, 200);\n\n return () => {\n if (intervalIdRef.current) clearInterval(intervalIdRef.current);\n };\n }, [scheduleNext]);\n\n // Pause: push target time forward so countdown freezes\n const lastPauseRef = useRef<number | null>(null);\n useEffect(() => {\n if (isPaused) {\n lastPauseRef.current = Date.now();\n } else if (lastPauseRef.current !== null) {\n const pausedDuration = Date.now() - lastPauseRef.current;\n targetTimeRef.current += pausedDuration;\n lastPauseRef.current = null;\n }\n }, [isPaused]);\n\n return { countdown, maxCountdown, lastAction, chaosSquare };\n}\n","import type { PieceSymbol, Color } from '../types/chess.ts';\nimport { PIECE_UNICODE } from '../types/chess.ts';\nimport styles from '../styles/Square.module.css';\n\ninterface PieceIconProps {\n type: PieceSymbol;\n color: Color;\n className?: string;\n}\n\nexport function PieceIcon({ type, color, className }: PieceIconProps) {\n const key = `${color}${type}`;\n const symbol = PIECE_UNICODE[key];\n if (!symbol) return null;\n const colorClass = color === 'w' ? styles.pieceWhite : styles.pieceBlack;\n return <span className={`${className ?? ''} ${colorClass}`}>{symbol}</span>;\n}\n","import type { Square as ChessSquare, Piece } from 'chess.js';\nimport { PieceIcon } from './PieceIcon.tsx';\nimport styles from '../styles/Square.module.css';\nimport boardStyles from '../styles/ChessBoard.module.css';\n\ninterface SquareProps {\n square: ChessSquare;\n piece: Piece | null;\n isLight: boolean;\n isSelected: boolean;\n isLegalMove: boolean;\n isCheck: boolean;\n isLastMoveFrom: boolean;\n isLastMoveTo: boolean;\n isChaosFlash: boolean;\n rankLabel?: string | number;\n fileLabel?: string;\n onClick: (square: ChessSquare) => void;\n}\n\nexport function Square({\n square,\n piece,\n isLight,\n isSelected,\n isLegalMove,\n isCheck,\n isLastMoveFrom,\n isLastMoveTo,\n isChaosFlash,\n rankLabel,\n fileLabel,\n onClick,\n}: SquareProps) {\n const classNames = [\n styles.square,\n isLight ? styles.light : styles.dark,\n isSelected && styles.selected,\n isLegalMove && (piece ? styles.legalCapture : styles.legalMove),\n isCheck && styles.check,\n !isSelected && !isCheck && isLastMoveFrom && styles.lastMoveFrom,\n !isSelected && !isCheck && isLastMoveTo && styles.lastMoveTo,\n isChaosFlash && styles.chaosFlash,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div className={classNames} onClick={() => onClick(square)}>\n {piece && (\n <PieceIcon\n type={piece.type}\n color={piece.color}\n className={styles.piece}\n />\n )}\n {rankLabel != null && (\n <span className={boardStyles.rankLabel}>{rankLabel}</span>\n )}\n {fileLabel != null && (\n <span className={boardStyles.fileLabel}>{fileLabel}</span>\n )}\n </div>\n );\n}\n","import React from 'react';\nimport type { Square as ChessSquare, Piece } from 'chess.js';\nimport { Square } from './Square.tsx';\nimport styles from '../styles/ChessBoard.module.css';\n\ninterface LastMove {\n from: ChessSquare;\n to: ChessSquare;\n}\n\ninterface ChessBoardProps {\n board: (Piece | null)[][];\n selectedSquare: ChessSquare | null;\n legalMoves: ChessSquare[];\n inCheck: 'w' | 'b' | null;\n lastMove: LastMove | null;\n chaosSquare: ChessSquare | null;\n flipped: boolean;\n locked: boolean;\n onSquareClick: (square: ChessSquare) => void;\n}\n\nconst FILES = 'abcdefgh';\n\nfunction getSquareName(rank: number, file: number): ChessSquare {\n // board[0] = rank 8, board[7] = rank 1 (white at bottom)\n return `${FILES[file]}${8 - rank}` as ChessSquare;\n}\n\nfunction isLightSquare(rank: number, file: number): boolean {\n return (rank + file) % 2 === 0;\n}\n\nexport const ChessBoard = React.memo(function ChessBoard({\n board,\n selectedSquare,\n legalMoves,\n inCheck,\n lastMove,\n chaosSquare,\n flipped,\n locked,\n onSquareClick,\n}: ChessBoardProps) {\n // Find king squares for check highlighting\n let checkSquare: ChessSquare | null = null;\n if (inCheck) {\n for (let r = 0; r < 8; r++) {\n for (let f = 0; f < 8; f++) {\n const piece = board[r][f];\n if (piece?.type === 'k' && piece.color === inCheck) {\n checkSquare = getSquareName(r, f);\n }\n }\n }\n }\n\n // Build iteration order based on flipped state\n const rankOrder = flipped ? [7, 6, 5, 4, 3, 2, 1, 0] : [0, 1, 2, 3, 4, 5, 6, 7];\n const fileOrder = flipped ? [7, 6, 5, 4, 3, 2, 1, 0] : [0, 1, 2, 3, 4, 5, 6, 7];\n\n return (\n <div className={`${styles.board}${locked ? ` ${styles.boardLocked}` : ''}`}>\n {rankOrder.map((rankIdx) =>\n fileOrder.map((fileIdx) => {\n const square = getSquareName(rankIdx, fileIdx);\n const piece = board[rankIdx][fileIdx];\n\n // Display row/col indices for labels\n const displayRow = rankOrder.indexOf(rankIdx);\n const displayCol = fileOrder.indexOf(fileIdx);\n\n return (\n <Square\n key={square}\n square={square}\n piece={piece}\n isLight={isLightSquare(rankIdx, fileIdx)}\n isSelected={square === selectedSquare}\n isLegalMove={legalMoves.includes(square)}\n isCheck={square === checkSquare}\n isLastMoveFrom={lastMove?.from === square}\n isLastMoveTo={lastMove?.to === square}\n isChaosFlash={chaosSquare === square}\n rankLabel={displayCol === 0 ? 8 - rankIdx : undefined}\n fileLabel={displayRow === 7 ? FILES[fileIdx] : undefined}\n onClick={onSquareClick}\n />\n );\n })\n )}\n </div>\n );\n});\n","import { PieceIcon } from './PieceIcon.tsx';\nimport styles from '../styles/components.module.css';\n\ninterface PromotionDialogProps {\n color: 'w' | 'b';\n onSelect: (piece: 'q' | 'r' | 'b' | 'n') => void;\n}\n\nconst PROMOTION_PIECES: { type: 'q' | 'r' | 'b' | 'n'; label: string }[] = [\n { type: 'q', label: 'Queen' },\n { type: 'r', label: 'Rook' },\n { type: 'b', label: 'Bishop' },\n { type: 'n', label: 'Knight' },\n];\n\nexport function PromotionDialog({ color, onSelect }: PromotionDialogProps) {\n return (\n <div className={styles.promotionOverlay}>\n <div className={styles.promotionDialog}>\n <h3 className={styles.promotionTitle}>Promote pawn</h3>\n <div className={styles.promotionOptions}>\n {PROMOTION_PIECES.map(({ type, label }) => (\n <button\n key={type}\n className={styles.promotionBtn}\n onClick={() => onSelect(type)}\n title={label}\n >\n <PieceIcon type={type} color={color} />\n </button>\n ))}\n </div>\n </div>\n </div>\n );\n}\n","import type { GameStatus } from '../types/chess.ts';\nimport styles from '../styles/components.module.css';\n\ninterface GameOverBannerProps {\n status: GameStatus;\n humanColor: 'w' | 'b';\n onRestart: () => void;\n}\n\nfunction getResultText(status: GameStatus, humanColor: 'w' | 'b'): { title: string; detail: string } {\n if (status.result === 'checkmate') {\n if (status.winner === humanColor) {\n return { title: 'You Win!', detail: 'Checkmate' };\n }\n return { title: 'You Lose', detail: 'Checkmate' };\n }\n if (status.result === 'stalemate') {\n return { title: 'Draw', detail: 'Stalemate' };\n }\n if (status.result === 'insufficient') {\n return { title: 'Draw', detail: 'Insufficient material' };\n }\n if (status.result === 'threefold') {\n return { title: 'Draw', detail: 'Threefold repetition' };\n }\n return { title: 'Draw', detail: 'Game over' };\n}\n\nexport function GameOverBanner({ status, humanColor, onRestart }: GameOverBannerProps) {\n const { title, detail } = getResultText(status, humanColor);\n\n return (\n <div className={styles.gameOverOverlay}>\n <div className={styles.gameOverBanner}>\n <h2 className={styles.gameOverResult}>{title}</h2>\n <p className={styles.gameOverDetail}>{detail}</p>\n <button className={styles.restartBtn} onClick={onRestart}>\n Play Again\n </button>\n </div>\n </div>\n );\n}\n","import styles from '../styles/components.module.css';\n\ninterface ChaosTimerProps {\n countdown: number;\n maxCountdown: number;\n}\n\nexport function ChaosTimer({ countdown, maxCountdown }: ChaosTimerProps) {\n const progress = maxCountdown > 0 ? ((maxCountdown - countdown) / maxCountdown) * 100 : 0;\n const glow = 1 - (countdown / maxCountdown || 0); // 0 at full, 1 at empty\n\n return (\n <div className={styles.chaosBar}>\n <span className={styles.chaosBarLabel}>STUPIDITY</span>\n <div className={styles.chaosBarTrack}>\n <div\n className={styles.chaosBarFill}\n style={{\n width: `${progress}%`,\n '--glow': glow,\n } as React.CSSProperties}\n />\n </div>\n </div>\n );\n}\n","import { useState, useEffect, useRef } from 'react';\nimport { PIECE_UNICODE } from '../types/chess.ts';\nimport type { ChaosAction } from '../types/chess.ts';\nimport styles from '../styles/components.module.css';\n\ninterface ChaosToastProps {\n action: ChaosAction | null;\n}\n\nexport function ChaosToast({ action }: ChaosToastProps) {\n const [visible, setVisible] = useState(false);\n const [fading, setFading] = useState(false);\n const [displayAction, setDisplayAction] = useState<ChaosAction | null>(null);\n const timeoutRef = useRef<ReturnType<typeof setTimeout>>(undefined);\n\n useEffect(() => {\n if (!action) return;\n\n // Clear any existing timeout\n if (timeoutRef.current) clearTimeout(timeoutRef.current);\n\n setDisplayAction(action);\n setFading(false);\n setVisible(true);\n\n // Start fade-out after 1.6s\n timeoutRef.current = setTimeout(() => {\n setFading(true);\n // Remove after fade animation completes\n timeoutRef.current = setTimeout(() => {\n setVisible(false);\n setFading(false);\n }, 400);\n }, 1600);\n\n return () => {\n if (timeoutRef.current) clearTimeout(timeoutRef.current);\n };\n }, [action]);\n\n if (!visible || !displayAction) return null;\n\n const message =\n displayAction.type === 'add' && displayAction.piece && displayAction.color\n ? `A ${PIECE_UNICODE[`${displayAction.color}${displayAction.piece}`]} appeared on ${displayAction.square}!`\n : `The piece on ${displayAction.square} vanished!`;\n\n return (\n <div className={`${styles.chaosToast} ${fading ? styles.chaosToastFading : ''}`}>\n {message}\n </div>\n );\n}\n","import styles from '../styles/components.module.css';\n\ninterface DifficultySelectorProps {\n depth: number;\n onChange: (depth: number) => void;\n}\n\nexport function DifficultySelector({ depth, onChange }: DifficultySelectorProps) {\n return (\n <div className={styles.difficultySelector}>\n <span className={styles.difficultyLabel}>\n AI Depth: <span className={styles.difficultyValue}>{depth}</span>\n </span>\n <input\n className={styles.difficultySlider}\n type=\"range\"\n min={1}\n max={20}\n value={depth}\n onChange={(e) => onChange(parseInt(e.target.value))}\n />\n </div>\n );\n}\n","import styles from '../styles/components.module.css';\n\ninterface StupidLevelProps {\n level: number; // 0 = off, 1-5\n onChange: (level: number) => void;\n}\n\nconst LABELS = ['OFF', 'CHILL', 'MID', 'STUPID', 'CHAOS', 'LOL'];\n\nexport function StupidLevel({ level, onChange }: StupidLevelProps) {\n return (\n <div className={styles.stupidLevel}>\n <div className={styles.stupidLevelHeader}>\n <span className={styles.stupidLevelLabel}>STUPID</span>\n <span className={styles.stupidLevelValue}>{LABELS[level]}</span>\n </div>\n <input\n type=\"range\"\n min={0}\n max={5}\n step={1}\n value={level}\n onChange={(e) => onChange(Number(e.target.value))}\n className={styles.stupidLevelSlider}\n />\n </div>\n );\n}\n","import { PIECE_UNICODE } from '../types/chess.ts';\nimport { DifficultySelector } from './DifficultySelector.tsx';\nimport { StupidLevel } from './StupidLevel.tsx';\nimport styles from '../styles/components.module.css';\n\ninterface SidePickerProps {\n depth: number;\n onDepthChange: (depth: number) => void;\n stupidLevel: number;\n onStupidLevelChange: (level: number) => void;\n onSelectSide: (color: 'w' | 'b') => void;\n}\n\nexport function SidePicker({ depth, onDepthChange, stupidLevel, onStupidLevelChange, onSelectSide }: SidePickerProps) {\n return (\n <div className={styles.sidePickerOverlay}>\n <div className={styles.sidePickerCard}>\n <h2 className={styles.sidePickerTitle}>Choose Your Side</h2>\n <div className={styles.sidePickerOptions}>\n <button\n className={styles.sidePickerBtn}\n onClick={() => onSelectSide('w')}\n >\n <span className={`${styles.sidePickerIcon} ${styles.sidePickerWhite}`}>{PIECE_UNICODE.wk}</span>\n <span className={styles.sidePickerLabel}>White</span>\n </button>\n <button\n className={styles.sidePickerBtn}\n onClick={() => onSelectSide('b')}\n >\n <span className={`${styles.sidePickerIcon} ${styles.sidePickerBlack}`}>{PIECE_UNICODE.bk}</span>\n <span className={styles.sidePickerLabel}>Black</span>\n </button>\n </div>\n <div className={styles.sidePickerSettings}>\n <DifficultySelector depth={depth} onChange={onDepthChange} />\n <StupidLevel level={stupidLevel} onChange={onStupidLevelChange} />\n </div>\n </div>\n </div>\n );\n}\n","import styles from '../styles/components.module.css';\n\ninterface MuteButtonProps {\n muted: boolean;\n onToggle: () => void;\n}\n\nexport function MuteButton({ muted, onToggle }: MuteButtonProps) {\n return (\n <button\n className={`${styles.muteBtn} ${muted ? styles.muteBtnMuted : ''}`}\n onClick={onToggle}\n title={muted ? 'Unmute' : 'Mute'}\n >\n {muted ? '\\u{1F507}' : '\\u{1F50A}'}\n </button>\n );\n}\n","class SoundManager {\n private ctx: AudioContext | null = null;\n private muted = false;\n\n private getCtx(): AudioContext | null {\n if (this.muted) return null;\n if (!this.ctx) {\n try {\n this.ctx = new AudioContext();\n } catch {\n return null;\n }\n }\n if (this.ctx.state === 'suspended') {\n this.ctx.resume();\n }\n return this.ctx;\n }\n\n setMuted(muted: boolean) {\n this.muted = muted;\n }\n\n playMove() {\n const ctx = this.getCtx();\n if (!ctx) return;\n const osc = ctx.createOscillator();\n const gain = ctx.createGain();\n osc.type = 'sine';\n osc.frequency.value = 200;\n gain.gain.setValueAtTime(0.15, ctx.currentTime);\n gain.gain.exponentialRampToValueAtTime(0.001, ctx.currentTime + 0.08);\n osc.connect(gain).connect(ctx.destination);\n osc.start();\n osc.stop(ctx.currentTime + 0.08);\n }\n\n playCapture() {\n const ctx = this.getCtx();\n if (!ctx) return;\n // Metallic clack: noise burst filtered to high-mid band\n const bufferSize = ctx.sampleRate * 0.1;\n const buffer = ctx.createBuffer(1, bufferSize, ctx.sampleRate);\n const data = buffer.getChannelData(0);\n for (let i = 0; i < bufferSize; i++) {\n data[i] = (Math.random() * 2 - 1) * Math.exp(-i / (ctx.sampleRate * 0.015));\n }\n const noise = ctx.createBufferSource();\n noise.buffer = buffer;\n const bandpass = ctx.createBiquadFilter();\n bandpass.type = 'bandpass';\n bandpass.frequency.value = 3000;\n bandpass.Q.value = 2;\n const gain = ctx.createGain();\n gain.gain.setValueAtTime(0.35, ctx.currentTime);\n gain.gain.exponentialRampToValueAtTime(0.001, ctx.currentTime + 0.1);\n noise.connect(bandpass).connect(gain).connect(ctx.destination);\n noise.start();\n noise.stop(ctx.currentTime + 0.1);\n }\n\n playCheck() {\n const ctx = this.getCtx();\n if (!ctx) return;\n const osc = ctx.createOscillator();\n const gain = ctx.createGain();\n osc.type = 'triangle';\n osc.frequency.value = 800;\n gain.gain.setValueAtTime(0.18, ctx.currentTime);\n gain.gain.exponentialRampToValueAtTime(0.001, ctx.currentTime + 0.12);\n osc.connect(gain).connect(ctx.destination);\n osc.start();\n osc.stop(ctx.currentTime + 0.12);\n }\n\n playChaos() {\n const ctx = this.getCtx();\n if (!ctx) return;\n // Soft shimmer: quiet sine blip with a gentle pitch drop\n const osc = ctx.createOscillator();\n const gain = ctx.createGain();\n osc.type = 'sine';\n osc.frequency.setValueAtTime(520, ctx.currentTime);\n osc.frequency.exponentialRampToValueAtTime(320, ctx.currentTime + 0.18);\n gain.gain.setValueAtTime(0.07, ctx.currentTime);\n gain.gain.exponentialRampToValueAtTime(0.001, ctx.currentTime + 0.18);\n osc.connect(gain).connect(ctx.destination);\n osc.start();\n osc.stop(ctx.currentTime + 0.18);\n }\n\n playGameOver() {\n const ctx = this.getCtx();\n if (!ctx) return;\n // C major chord: C4 + E4 + G4\n const freqs = [261.63, 329.63, 392.0];\n for (const freq of freqs) {\n const osc = ctx.createOscillator();\n const gain = ctx.createGain();\n osc.type = 'sine';\n osc.frequency.value = freq;\n gain.gain.setValueAtTime(0.1, ctx.currentTime);\n gain.gain.exponentialRampToValueAtTime(0.001, ctx.currentTime + 0.4);\n osc.connect(gain).connect(ctx.destination);\n osc.start();\n osc.stop(ctx.currentTime + 0.4);\n }\n }\n}\n\nexport const soundManager = new SoundManager();\n","import { useState, useCallback, useEffect, useRef } from 'react';\nimport { Chess } from 'chess.js';\nimport type { Square as ChessSquare } from 'chess.js';\nimport type { ChaosChessProps } from './types/props.ts';\nimport { useChessGame } from './hooks/useChessGame.ts';\nimport { useStockfish } from './hooks/useStockfish.ts';\nimport { useChaosEngine } from './hooks/useChaosEngine.ts';\nimport { ChessBoard } from './components/ChessBoard.tsx';\nimport { PromotionDialog } from './components/PromotionDialog.tsx';\nimport { GameOverBanner } from './components/GameOverBanner.tsx';\nimport { ChaosTimer } from './components/ChaosTimer.tsx';\nimport { ChaosToast } from './components/ChaosToast.tsx';\nimport { DifficultySelector } from './components/DifficultySelector.tsx';\nimport { SidePicker } from './components/SidePicker.tsx';\nimport { StupidLevel } from './components/StupidLevel.tsx';\nimport { MuteButton } from './components/MuteButton.tsx';\nimport { soundManager } from './utils/sounds.ts';\nimport styles from './styles/ChessGame.module.css';\nimport './styles/theme.css';\nimport './styles/animations.css';\n\ntype GamePhase = 'setup' | 'playing';\n\nexport function ChessGame(props: ChaosChessProps) {\n const {\n defaultDepth = 10,\n defaultStupidLevel = 3,\n defaultHumanColor,\n defaultMuted = false,\n depth: controlledDepth,\n onDepthChange,\n stupidLevel: controlledStupidLevel,\n onStupidLevelChange,\n stockfishWorkerPath,\n skipSetup = false,\n showControls = true,\n showMuteButton = true,\n onGameOver,\n onMove,\n onChaosAction: onChaosActionCb,\n onRestart: onRestartCb,\n className,\n } = props;\n\n // --- Controlled / uncontrolled state ---\n const [internalDepth, setInternalDepth] = useState(defaultDepth);\n const depth = controlledDepth ?? internalDepth;\n const setDepth = onDepthChange ?? setInternalDepth;\n\n const [internalStupidLevel, setInternalStupidLevel] = useState(defaultStupidLevel);\n const stupidLevel = controlledStupidLevel ?? internalStupidLevel;\n const setStupidLevel = onStupidLevelChange ?? setInternalStupidLevel;\n\n const [internalHumanColor, setInternalHumanColor] = useState<'w' | 'b'>(defaultHumanColor ?? 'w');\n const humanColor = internalHumanColor;\n\n const [soundMuted, setSoundMuted] = useState(defaultMuted);\n\n // If skipSetup or defaultHumanColor is given, go straight to playing\n const [gamePhase, setGamePhase] = useState<GamePhase>(\n (skipSetup || defaultHumanColor) ? 'playing' : 'setup'\n );\n\n const {\n fen,\n turn,\n selectedSquare,\n legalMoves,\n gameStatus,\n promotionPending,\n lastMove,\n lastMoveDetail,\n moveHistory,\n board,\n handleSquareClick,\n handlePromotion,\n applyFen,\n handleRestart: resetGame,\n } = useChessGame();\n\n const { isReady: stockfishReady, isThinking, getBestMove } = useStockfish(stockfishWorkerPath);\n\n const aiEnabled = stockfishReady;\n const isHumanTurn = turn === humanColor;\n\n // Chaos engine: pause during setup, when off, AI's turn, promotion, or game over\n const chaosEnabled = stupidLevel > 0;\n const chaosPaused = gamePhase !== 'playing' || !chaosEnabled || !isHumanTurn || isThinking || !!promotionPending || gameStatus.isGameOver;\n const { countdown, maxCountdown, lastAction, chaosSquare } = useChaosEngine({\n fen,\n isPaused: chaosPaused,\n stupidLevel: Math.max(1, stupidLevel),\n onChaosAction: useCallback((newFen: string) => {\n // Guard: if the game has moved past the human's turn, skip this chaos event.\n // This catches the race where the interval fires before isPausedRef updates.\n const chess = new Chess(currentFenRef.current);\n if (chess.turn() !== humanColorRef.current) return;\n if (chess.isGameOver()) return;\n applyFen(newFen);\n }, [applyFen]),\n });\n\n // Fire onChaosAction callback\n const prevLastActionRef = useRef(lastAction);\n useEffect(() => {\n if (lastAction && lastAction !== prevLastActionRef.current) {\n onChaosActionCb?.(lastAction, fen);\n }\n prevLastActionRef.current = lastAction;\n }, [lastAction, fen, onChaosActionCb]);\n\n // Refs that always point to latest values (for use in async callbacks)\n const currentFenRef = useRef(fen);\n currentFenRef.current = fen;\n const humanColorRef = useRef(humanColor);\n humanColorRef.current = humanColor;\n\n // Track last FEN where Stockfish returned no move to avoid infinite retries\n const noMoveFenRef = useRef<string | null>(null);\n\n const executeStockfishMove = useCallback((uciMove: string) => {\n const from = uciMove.slice(0, 2) as ChessSquare;\n const to = uciMove.slice(2, 4) as ChessSquare;\n const promotion = uciMove.length > 4 ? uciMove[4] : undefined;\n try {\n const tempChess = new Chess(currentFenRef.current);\n const moveOpts: { from: ChessSquare; to: ChessSquare; promotion?: string } = { from, to };\n if (promotion) moveOpts.promotion = promotion;\n const move = tempChess.move(moveOpts);\n if (move) {\n applyFen(tempChess.fen());\n } else {\n // Move invalid for current position — board changed since Stockfish started.\n // The main effect will re-trigger via isThinking becoming false.\n console.warn('[ChaosChess] Stockfish move invalid for current position, will retry');\n }\n } catch {\n console.warn('[ChaosChess] Stockfish move threw, will retry');\n }\n }, [applyFen]);\n\n // --- Side selection ---\n const handleSideSelect = useCallback((color: 'w' | 'b') => {\n setInternalHumanColor(color);\n setGamePhase('playing');\n }, []);\n\n const handleRestart = useCallback(() => {\n resetGame();\n setGamePhase((skipSetup || defaultHumanColor) ? 'playing' : 'setup');\n onRestartCb?.();\n }, [resetGame, skipSetup, defaultHumanColor, onRestartCb]);\n\n // --- Sound mute sync ---\n useEffect(() => {\n soundManager.setMuted(soundMuted);\n }, [soundMuted]);\n\n // --- Sound: move / capture / check + onMove callback ---\n const prevMoveCountRef = useRef(moveHistory.length);\n useEffect(() => {\n if (moveHistory.length > prevMoveCountRef.current) {\n // Sound\n if (lastMoveDetail) {\n if (lastMoveDetail.check) {\n soundManager.playCheck();\n } else if (lastMoveDetail.captured) {\n soundManager.playCapture();\n } else {\n soundManager.playMove();\n }\n }\n // Fire onMove callback for the new entry\n const latest = moveHistory[moveHistory.length - 1];\n if (latest) {\n onMove?.(latest.fen, latest.san, latest.color);\n }\n }\n prevMoveCountRef.current = moveHistory.length;\n }, [moveHistory.length, lastMoveDetail, moveHistory, onMove]);\n\n // --- Sound: chaos ---\n useEffect(() => {\n if (chaosSquare) {\n soundManager.playChaos();\n }\n }, [chaosSquare]);\n\n // --- Sound + callback: game over ---\n const prevGameOverRef = useRef(false);\n useEffect(() => {\n if (gameStatus.isGameOver && !prevGameOverRef.current) {\n soundManager.playGameOver();\n onGameOver?.(gameStatus);\n }\n prevGameOverRef.current = gameStatus.isGameOver;\n }, [gameStatus, onGameOver]);\n\n // Single effect to trigger Stockfish when it's the AI's turn.\n // Covers: FEN changes, initial move as black, and Stockfish becoming ready.\n // The engine's cancelPending() handles deduplication at the worker level.\n const initialMoveTriggered = useRef(false);\n useEffect(() => {\n if (gamePhase !== 'playing') {\n initialMoveTriggered.current = false;\n return;\n }\n if (isHumanTurn || gameStatus.isGameOver || !stockfishReady || isThinking) return;\n\n // Don't retry a FEN that already returned no move\n if (noMoveFenRef.current === fen) return;\n\n // For initial position when playing as black, mark as triggered\n if (humanColor === 'b' && !initialMoveTriggered.current) {\n initialMoveTriggered.current = true;\n }\n\n getBestMove(fen, depth).then((uciMove) => {\n if (!uciMove) {\n console.warn('[ChaosChess] Stockfish returned no move for position, skipping retries');\n noMoveFenRef.current = fen;\n return;\n }\n noMoveFenRef.current = null;\n executeStockfishMove(uciMove);\n });\n }, [gamePhase, fen, isHumanTurn, gameStatus.isGameOver, stockfishReady, isThinking, humanColor, getBestMove, depth, executeStockfishMove]);\n\n // Retry watchdog: if it's the AI's turn but Stockfish isn't thinking, retry after 3s.\n // This catches edge cases where the above effect's move was invalid for the current position.\n useEffect(() => {\n if (gamePhase !== 'playing' || isHumanTurn || isThinking || gameStatus.isGameOver || !stockfishReady) return;\n\n // Don't retry a FEN that already returned no move\n if (noMoveFenRef.current === fen) return;\n\n const timer = setTimeout(() => {\n getBestMove(fen, depth).then((uciMove) => {\n if (!uciMove) {\n noMoveFenRef.current = fen;\n return;\n }\n noMoveFenRef.current = null;\n executeStockfishMove(uciMove);\n });\n }, 3000);\n\n return () => clearTimeout(timer);\n }, [gamePhase, isHumanTurn, isThinking, gameStatus.isGameOver, stockfishReady, fen, depth, getBestMove, executeStockfishMove]);\n\n // Lock board during AI turn\n const onSquareClick = useCallback(\n (square: ChessSquare) => {\n if (aiEnabled && turn !== humanColor) return;\n handleSquareClick(square);\n },\n [aiEnabled, turn, humanColor, handleSquareClick]\n );\n\n const statusText = gameStatus.isGameOver\n ? 'Game Over'\n : isThinking\n ? ''\n : !aiEnabled\n ? `${turn === 'w' ? 'White' : 'Black'} to move`\n : isHumanTurn\n ? 'Your turn'\n : 'Opponent thinking...';\n\n const rootClassName = [styles.container, className].filter(Boolean).join(' ');\n\n // --- Setup phase ---\n if (gamePhase === 'setup') {\n return (\n <div className={rootClassName} data-chaos-chess=\"\">\n <SidePicker\n depth={depth}\n onDepthChange={setDepth}\n stupidLevel={stupidLevel}\n onStupidLevelChange={setStupidLevel}\n onSelectSide={handleSideSelect}\n />\n </div>\n );\n }\n\n // --- Playing phase ---\n return (\n <div className={rootClassName} data-chaos-chess=\"\">\n <div className={styles.topBar}>\n <div className={styles.topBarLeft}>\n <span className={styles.statusText}>{statusText}</span>\n {isThinking && (\n <span className={styles.thinking}>AI thinking...</span>\n )}\n </div>\n {showMuteButton && (\n <MuteButton muted={soundMuted} onToggle={() => setSoundMuted((m) => !m)} />\n )}\n </div>\n\n {chaosEnabled && (\n <ChaosTimer countdown={countdown} maxCountdown={maxCountdown} />\n )}\n\n <ChessBoard\n board={board}\n selectedSquare={selectedSquare}\n legalMoves={legalMoves}\n inCheck={gameStatus.inCheck}\n lastMove={lastMove}\n chaosSquare={chaosSquare}\n flipped={humanColor === 'b'}\n locked={aiEnabled && !isHumanTurn}\n onSquareClick={onSquareClick}\n />\n\n {showControls && (\n <div className={styles.bottomBar}>\n <DifficultySelector depth={depth} onChange={setDepth} />\n <StupidLevel level={stupidLevel} onChange={setStupidLevel} />\n </div>\n )}\n\n <ChaosToast action={lastAction} />\n {promotionPending && <PromotionDialog color={turn} onSelect={handlePromotion} />}\n {gameStatus.isGameOver && (\n <GameOverBanner status={gameStatus} humanColor={humanColor} onRestart={handleRestart} />\n )}\n </div>\n );\n}\n"],"names":["getGameStatus","chess","useChessGame","chessRef","useRef","Chess","fen","setFen","useState","turn","setTurn","selectedSquare","setSelectedSquare","legalMoves","setLegalMoves","gameStatus","setGameStatus","promotionPending","setPromotionPending","moveHistory","setMoveHistory","lastMove","setLastMove","lastMoveDetail","setLastMoveDetail","board","setBoard","clearSelection","useCallback","syncState","handleSquareClick","square","piece","move","prev","moves","m","handlePromotion","applyFen","newFen","handleRestart","StockfishEngine","workerPath","resolve","reject","onReady","e","err","onMessage","depth","timeoutMs","mySearchId","msg","useStockfish","engineRef","isReady","setIsReady","isThinking","setIsThinking","callIdRef","useEffect","engine","getBestMove","myCallId","safetyTimeout","PIECE_VALUES","PIECE_UNICODE","FILES","parseFen","parts","positionToBoard","position","ranks","rank","row","ch","emptyCount","color","type","boardToPosition","rankStr","cell","serializeFen","calculateMaterial","white","black","value","getEmptySquares","squares","file","getPieceSquares","excludeKing","squareToIndices","addPieceToFen","removePieceFromFen","ADDABLE_PIECES","MAX_RETRIES","getChaosTarget","whiteMaterial","blackMaterial","randomChoice","arr","chooseRandomPiece","isValidChaosPosition","addRandomPiece","emptySquares","attempt","removeRandomPiece","pieceSquares","executeChaosAction","target","operation","addColor","removeColor","result","fallback","STUPID_BOUNDS","getRandomChaosInterval","stupidLevel","idx","lo","hi","useChaosEngine","isPaused","onChaosAction","countdown","setCountdown","maxCountdown","setMaxCountdown","lastAction","setLastAction","chaosSquare","setChaosSquare","fenRef","isPausedRef","stupidLevelRef","onChaosActionRef","targetTimeRef","intervalIdRef","scheduleNext","intervalMs","seconds","remaining","lastPauseRef","pausedDuration","PieceIcon","className","key","symbol","colorClass","styles","jsx","Square","isLight","isSelected","isLegalMove","isCheck","isLastMoveFrom","isLastMoveTo","isChaosFlash","rankLabel","fileLabel","onClick","classNames","jsxs","boardStyles","getSquareName","isLightSquare","ChessBoard","React","inCheck","flipped","locked","onSquareClick","checkSquare","r","f","rankOrder","fileOrder","rankIdx","fileIdx","displayRow","displayCol","PROMOTION_PIECES","PromotionDialog","onSelect","label","getResultText","status","humanColor","GameOverBanner","onRestart","title","detail","ChaosTimer","progress","glow","ChaosToast","action","visible","setVisible","fading","setFading","displayAction","setDisplayAction","timeoutRef","message","DifficultySelector","onChange","LABELS","StupidLevel","level","SidePicker","onDepthChange","onStupidLevelChange","onSelectSide","MuteButton","muted","onToggle","SoundManager","ctx","osc","gain","bufferSize","buffer","data","i","noise","bandpass","freqs","freq","soundManager","ChessGame","props","defaultDepth","defaultStupidLevel","defaultHumanColor","defaultMuted","controlledDepth","controlledStupidLevel","stockfishWorkerPath","skipSetup","showControls","showMuteButton","onGameOver","onMove","onChaosActionCb","onRestartCb","internalDepth","setInternalDepth","setDepth","internalStupidLevel","setInternalStupidLevel","setStupidLevel","internalHumanColor","setInternalHumanColor","soundMuted","setSoundMuted","gamePhase","setGamePhase","resetGame","stockfishReady","aiEnabled","isHumanTurn","chaosEnabled","chaosPaused","currentFenRef","humanColorRef","prevLastActionRef","noMoveFenRef","executeStockfishMove","uciMove","from","to","promotion","tempChess","moveOpts","handleSideSelect","prevMoveCountRef","latest","prevGameOverRef","initialMoveTriggered","timer","statusText","rootClassName"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"chaos-chess.js","sources":["../src/hooks/useChessGame.ts","../src/engine/stockfishWorker.ts","../src/hooks/useStockfish.ts","../src/types/chess.ts","../src/engine/fenManipulator.ts","../src/engine/chaosEngine.ts","../src/hooks/useChaosEngine.ts","../src/components/PieceIcon.tsx","../src/components/Square.tsx","../src/components/ChessBoard.tsx","../src/components/PromotionDialog.tsx","../src/components/GameOverBanner.tsx","../src/components/ChaosTimer.tsx","../src/components/ChaosToast.tsx","../src/components/DifficultySelector.tsx","../src/components/StupidLevel.tsx","../src/components/SidePicker.tsx","../src/components/MuteButton.tsx","../src/utils/sounds.ts","../src/ChessGame.tsx"],"sourcesContent":["import { useState, useRef, useCallback } from 'react';\nimport { Chess } from 'chess.js';\nimport type { Square as ChessSquare, Move, Piece } from 'chess.js';\nimport type { GameStatus, PromotionPending, MoveHistoryEntry, Color } from '../types/chess.ts';\n\ninterface LastMove {\n from: ChessSquare;\n to: ChessSquare;\n}\n\nexport interface LastMoveDetail {\n captured: boolean;\n check: boolean;\n}\n\nexport interface UseChessGameReturn {\n fen: string;\n turn: 'w' | 'b';\n selectedSquare: ChessSquare | null;\n legalMoves: ChessSquare[];\n gameStatus: GameStatus;\n promotionPending: PromotionPending | null;\n moveHistory: MoveHistoryEntry[];\n lastMove: LastMove | null;\n lastMoveDetail: LastMoveDetail | null;\n handleSquareClick: (square: ChessSquare) => void;\n handlePromotion: (piece: 'q' | 'r' | 'b' | 'n') => void;\n applyFen: (newFen: string) => void;\n board: (Piece | null)[][];\n handleRestart: () => void;\n}\n\nfunction getGameStatus(chess: Chess): GameStatus {\n if (!chess.isGameOver()) {\n const inCheck = chess.inCheck() ? chess.turn() : null;\n return { isGameOver: false, result: null, winner: null, inCheck };\n }\n\n if (chess.isCheckmate()) {\n const winner: Color = chess.turn() === 'w' ? 'b' : 'w';\n return { isGameOver: true, result: 'checkmate', winner, inCheck: chess.turn() };\n }\n if (chess.isStalemate()) {\n return { isGameOver: true, result: 'stalemate', winner: null, inCheck: null };\n }\n if (chess.isInsufficientMaterial()) {\n return { isGameOver: true, result: 'insufficient', winner: null, inCheck: null };\n }\n if (chess.isThreefoldRepetition()) {\n return { isGameOver: true, result: 'threefold', winner: null, inCheck: null };\n }\n // 50-move rule or other draw\n return { isGameOver: true, result: 'draw', winner: null, inCheck: null };\n}\n\nexport function useChessGame() {\n const chessRef = useRef(new Chess());\n const [fen, setFen] = useState(chessRef.current.fen());\n const [turn, setTurn] = useState<'w' | 'b'>(chessRef.current.turn());\n const [selectedSquare, setSelectedSquare] = useState<ChessSquare | null>(null);\n const [legalMoves, setLegalMoves] = useState<ChessSquare[]>([]);\n const [gameStatus, setGameStatus] = useState<GameStatus>(getGameStatus(chessRef.current));\n const [promotionPending, setPromotionPending] = useState<PromotionPending | null>(null);\n const [moveHistory, setMoveHistory] = useState<MoveHistoryEntry[]>([]);\n const [lastMove, setLastMove] = useState<LastMove | null>(null);\n const [lastMoveDetail, setLastMoveDetail] = useState<LastMoveDetail | null>(null);\n const [board, setBoard] = useState<(Piece | null)[][]>(chessRef.current.board());\n\n const clearSelection = useCallback(() => {\n setSelectedSquare(null);\n setLegalMoves([]);\n }, []);\n\n const syncState = useCallback(() => {\n setFen(chessRef.current.fen());\n setTurn(chessRef.current.turn());\n setBoard(chessRef.current.board());\n setGameStatus(getGameStatus(chessRef.current));\n }, []);\n\n const handleSquareClick = useCallback((square: ChessSquare) => {\n const chess = chessRef.current;\n const turn = chess.turn();\n\n // Ignore clicks during promotion or game over\n if (promotionPending || getGameStatus(chess).isGameOver) {\n return;\n }\n\n // If we have a selected square and this click is a legal move destination\n if (selectedSquare && legalMoves.includes(square)) {\n // Check if this is a pawn promotion\n const piece = chess.get(selectedSquare);\n if (\n piece?.type === 'p' &&\n ((piece.color === 'w' && square[1] === '8') ||\n (piece.color === 'b' && square[1] === '1'))\n ) {\n setPromotionPending({ from: selectedSquare, to: square });\n clearSelection();\n return;\n }\n\n // Execute the move\n try {\n const move = chess.move({ from: selectedSquare, to: square });\n if (move) {\n setLastMove({ from: move.from, to: move.to });\n setLastMoveDetail({ captured: !!move.captured, check: move.san.includes('+') || move.san.includes('#') });\n setMoveHistory((prev) => [\n ...prev,\n { san: move.san, fen: chess.fen(), color: move.color },\n ]);\n }\n } catch {\n // Invalid move, just deselect\n }\n clearSelection();\n syncState();\n return;\n }\n\n // If clicking on a piece belonging to the side-to-move, select it\n const piece = chess.get(square);\n if (piece && piece.color === turn) {\n if (square === selectedSquare) {\n clearSelection();\n return;\n }\n setSelectedSquare(square);\n const moves = chess.moves({ square, verbose: true }) as Move[];\n setLegalMoves(moves.map((m) => m.to));\n return;\n }\n\n // Clicking empty square or opponent piece without selection\n clearSelection();\n }, [selectedSquare, legalMoves, promotionPending, clearSelection, syncState]);\n\n const handlePromotion = useCallback((piece: 'q' | 'r' | 'b' | 'n') => {\n if (!promotionPending) return;\n const chess = chessRef.current;\n try {\n const move = chess.move({\n from: promotionPending.from,\n to: promotionPending.to,\n promotion: piece,\n });\n if (move) {\n setLastMove({ from: move.from, to: move.to });\n setLastMoveDetail({ captured: !!move.captured, check: move.san.includes('+') || move.san.includes('#') });\n setMoveHistory((prev) => [\n ...prev,\n { san: move.san, fen: chess.fen(), color: move.color },\n ]);\n }\n } catch {\n // Invalid promotion, ignore\n }\n setPromotionPending(null);\n clearSelection();\n syncState();\n }, [promotionPending, clearSelection, syncState]);\n\n const applyFen = useCallback((newFen: string) => {\n const chess = chessRef.current;\n try {\n chess.load(newFen);\n clearSelection();\n syncState();\n } catch {\n // Invalid FEN, ignore\n }\n }, [clearSelection, syncState]);\n\n const handleRestart = useCallback(() => {\n const chess = chessRef.current;\n chess.reset();\n clearSelection();\n setMoveHistory([]);\n setLastMove(null);\n setLastMoveDetail(null);\n setPromotionPending(null);\n syncState();\n }, [clearSelection, syncState]);\n\n return {\n fen,\n turn,\n selectedSquare,\n legalMoves,\n gameStatus,\n promotionPending,\n moveHistory,\n lastMove,\n lastMoveDetail,\n board,\n handleSquareClick,\n handlePromotion,\n applyFen,\n handleRestart,\n } satisfies UseChessGameReturn;\n}\n","/**\n * Wraps the Stockfish WASM Web Worker with a promise-based API.\n *\n * Uses the UCI protocol's `isready`/`readyok` handshake to flush stale\n * `bestmove` responses after `stop`, preventing a new search's listener\n * from picking up results from a cancelled search.\n */\nexport class StockfishEngine {\n private worker: Worker | null = null;\n private resolveMove: ((move: string | null) => void) | null = null;\n private rejectMove: ((reason: Error) => void) | null = null;\n private currentListener: ((e: MessageEvent) => void) | null = null;\n private timeoutId: ReturnType<typeof setTimeout> | null = null;\n private searchId = 0;\n private workerPath: string;\n\n constructor(workerPath = '/stockfish/stockfish-18-lite-single.js') {\n this.workerPath = workerPath;\n }\n\n async init(): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n try {\n this.worker = new Worker(this.workerPath);\n const onReady = (e: MessageEvent) => {\n const msg = typeof e.data === 'string' ? e.data : '';\n if (msg.includes('uciok')) {\n this.worker?.removeEventListener('message', onReady);\n resolve();\n }\n };\n this.worker.addEventListener('message', onReady);\n this.worker.addEventListener('error', (e) => {\n reject(new Error(`Stockfish worker error: ${e.message}`));\n });\n this.worker.postMessage('uci');\n } catch (err) {\n reject(err);\n }\n });\n }\n\n /** Cancel any in-flight search and clean up its listener/promise/timer. */\n private cancelPending(): void {\n if (this.timeoutId !== null) {\n clearTimeout(this.timeoutId);\n this.timeoutId = null;\n }\n if (this.currentListener && this.worker) {\n this.worker.removeEventListener('message', this.currentListener);\n this.currentListener = null;\n }\n if (this.rejectMove) {\n this.rejectMove(new Error('Search cancelled'));\n this.resolveMove = null;\n this.rejectMove = null;\n }\n this.stop();\n }\n\n /**\n * Send `isready` and wait for `readyok`.\n * This flushes any stale `bestmove` from a prior `stop` command,\n * guaranteeing the message queue is clean before a new search starts.\n */\n private waitReady(): Promise<void> {\n return new Promise<void>((resolve) => {\n if (!this.worker) { resolve(); return; }\n\n const onMessage = (e: MessageEvent) => {\n const msg = typeof e.data === 'string' ? e.data : '';\n if (msg === 'readyok') {\n this.worker?.removeEventListener('message', onMessage);\n resolve();\n }\n // Silently consume any other messages (including stale bestmove)\n };\n\n this.worker.addEventListener('message', onMessage);\n this.worker.postMessage('isready');\n });\n }\n\n /**\n * Get the best move for a given FEN position at the specified depth.\n * Returns a UCI move string like \"e2e4\".\n * Calling this while a search is in-flight cancels the previous search.\n */\n async getBestMove(fen: string, depth: number, timeoutMs = 10000): Promise<string | null> {\n // Cancel any in-flight search before starting a new one\n this.cancelPending();\n\n // Flush stale bestmove from the stopped search via UCI isready/readyok\n await this.waitReady();\n\n const mySearchId = ++this.searchId;\n\n return new Promise<string | null>((resolve, reject) => {\n if (!this.worker) {\n reject(new Error('Stockfish not initialized'));\n return;\n }\n\n this.resolveMove = resolve;\n this.rejectMove = reject;\n\n this.timeoutId = setTimeout(() => {\n // Only cancel if this timeout belongs to the current search\n if (this.searchId === mySearchId) {\n this.cancelPending();\n }\n }, timeoutMs);\n\n const onMessage = (e: MessageEvent) => {\n const msg = typeof e.data === 'string' ? e.data : '';\n if (msg.startsWith('bestmove')) {\n if (this.timeoutId !== null) {\n clearTimeout(this.timeoutId);\n this.timeoutId = null;\n }\n this.worker?.removeEventListener('message', onMessage);\n this.currentListener = null;\n const move = msg.split(' ')[1];\n if (this.resolveMove) {\n // \"(none)\" means no legal move exists — resolve with null instead of rejecting.\n // This is expected in chaos chess where piece mutations can create such positions.\n this.resolveMove(move && move !== '(none)' ? move : null);\n this.resolveMove = null;\n this.rejectMove = null;\n }\n }\n };\n\n this.currentListener = onMessage;\n this.worker.addEventListener('message', onMessage);\n // Clear transposition table so chaos-mutated boards start from a clean slate\n this.worker.postMessage('ucinewgame');\n this.worker.postMessage(`position fen ${fen}`);\n this.worker.postMessage(`go depth ${depth}`);\n });\n }\n\n /**\n * Stop any current search.\n */\n stop(): void {\n this.worker?.postMessage('stop');\n }\n\n /**\n * Terminate the worker.\n */\n destroy(): void {\n this.cancelPending();\n this.worker?.postMessage('quit');\n this.worker?.terminate();\n this.worker = null;\n }\n}\n","import { useState, useRef, useEffect, useCallback } from 'react';\nimport { StockfishEngine } from '../engine/stockfishWorker.ts';\n\ninterface UseStockfishReturn {\n isReady: boolean;\n isThinking: boolean;\n getBestMove: (fen: string, depth: number) => Promise<string | null>;\n}\n\nexport function useStockfish(workerPath?: string): UseStockfishReturn {\n const engineRef = useRef<StockfishEngine | null>(null);\n const [isReady, setIsReady] = useState(false);\n const [isThinking, setIsThinking] = useState(false);\n // Track in-flight calls so only the latest one controls isThinking\n const callIdRef = useRef(0);\n\n useEffect(() => {\n const engine = new StockfishEngine(workerPath);\n engineRef.current = engine;\n\n engine\n .init()\n .then(() => setIsReady(true))\n .catch((err) => {\n console.warn('Stockfish failed to load:', err.message);\n });\n\n return () => {\n engine.destroy();\n engineRef.current = null;\n };\n }, []);\n\n const getBestMove = useCallback(\n async (fen: string, depth: number): Promise<string | null> => {\n if (!engineRef.current || !isReady) return null;\n const myCallId = ++callIdRef.current;\n setIsThinking(true);\n\n // Safety timeout: clear isThinking if getBestMove hasn't resolved in 15s\n const safetyTimeout = setTimeout(() => {\n if (callIdRef.current === myCallId) {\n console.warn('[ChaosChess] Safety timeout: clearing isThinking after 15s');\n setIsThinking(false);\n }\n }, 15000);\n\n try {\n // Resolves a move string, or null only when the engine reports \"(none)\"\n // (a genuinely dead position). A cancelled/superseded or timed-out search\n // REJECTS instead, so callers can tell \"no legal move\" apart from\n // \"interrupted, try again\" and avoid permanently giving up on a position.\n const move = await engineRef.current.getBestMove(fen, depth);\n return move;\n } finally {\n clearTimeout(safetyTimeout);\n // Only clear isThinking if no newer call has started\n if (callIdRef.current === myCallId) {\n setIsThinking(false);\n }\n }\n },\n [isReady]\n );\n\n return { isReady, isThinking, getBestMove };\n}\n","import type { Square as ChessSquare, PieceSymbol, Color } from 'chess.js';\n\nexport type { ChessSquare, PieceSymbol, Color };\n\nexport type GameResult = 'checkmate' | 'stalemate' | 'draw' | 'insufficient' | 'threefold' | 'fifty-move';\n\nexport interface GameStatus {\n isGameOver: boolean;\n result: GameResult | null;\n winner: Color | null;\n inCheck: Color | null;\n}\n\nexport type ChaosActionType = 'add' | 'remove';\nexport type ChaosTarget = 'help_white' | 'help_black';\n\nexport interface ChaosAction {\n type: ChaosActionType;\n target: ChaosTarget;\n square: ChessSquare;\n piece?: PieceSymbol;\n color?: Color;\n whiteMaterial: number;\n blackMaterial: number;\n}\n\nexport interface PromotionPending {\n from: ChessSquare;\n to: ChessSquare;\n}\n\nexport interface MoveHistoryEntry {\n san: string;\n fen: string;\n color: Color;\n}\n\nexport interface MaterialCount {\n white: number;\n black: number;\n}\n\nexport const PIECE_VALUES: Record<PieceSymbol, number> = {\n p: 1,\n n: 3,\n b: 3,\n r: 5,\n q: 9,\n k: 0,\n};\n\n// Filled symbols for white (bright on dark bg), outlines for black\n// \\uFE0E = Variation Selector 15 — forces text presentation on iOS\n// (without it, iOS renders some glyphs as color emoji)\nexport const PIECE_UNICODE: Record<string, string> = {\n wk: '\\u265A\\uFE0E',\n wq: '\\u265B\\uFE0E',\n wr: '\\u265C\\uFE0E',\n wb: '\\u265D\\uFE0E',\n wn: '\\u265E\\uFE0E',\n wp: '\\u265F\\uFE0E',\n bk: '\\u2654\\uFE0E',\n bq: '\\u2655\\uFE0E',\n br: '\\u2656\\uFE0E',\n bb: '\\u2657\\uFE0E',\n bn: '\\u2658\\uFE0E',\n bp: '\\u2659\\uFE0E',\n};\n","import type { PieceSymbol, Color, ChessSquare, MaterialCount } from '../types/chess.ts';\nimport { PIECE_VALUES } from '../types/chess.ts';\n\nexport interface FenPiece {\n type: PieceSymbol;\n color: Color;\n}\n\nexport type Board8x8 = (FenPiece | null)[][];\n\nconst FILES = 'abcdefgh';\n\n/**\n * Parse a FEN string into its components.\n */\nexport function parseFen(fen: string) {\n const parts = fen.split(' ');\n return {\n position: parts[0],\n activeColor: parts[1] as Color,\n castling: parts[2],\n enPassant: parts[3],\n halfmove: parts[4],\n fullmove: parts[5],\n };\n}\n\n/**\n * Convert the position segment of a FEN into an 8x8 board array.\n * board[rank][file] where rank 0 = rank 8 (top), rank 7 = rank 1 (bottom).\n */\nexport function positionToBoard(position: string): Board8x8 {\n const board: Board8x8 = [];\n const ranks = position.split('/');\n for (const rank of ranks) {\n const row: (FenPiece | null)[] = [];\n for (const ch of rank) {\n const emptyCount = parseInt(ch);\n if (!isNaN(emptyCount)) {\n for (let i = 0; i < emptyCount; i++) row.push(null);\n } else {\n const color: Color = ch === ch.toUpperCase() ? 'w' : 'b';\n const type = ch.toLowerCase() as PieceSymbol;\n row.push({ type, color });\n }\n }\n board.push(row);\n }\n return board;\n}\n\n/**\n * Convert an 8x8 board array back to a FEN position string.\n */\nexport function boardToPosition(board: Board8x8): string {\n return board\n .map((row) => {\n let rankStr = '';\n let emptyCount = 0;\n for (const cell of row) {\n if (cell === null) {\n emptyCount++;\n } else {\n if (emptyCount > 0) {\n rankStr += emptyCount;\n emptyCount = 0;\n }\n const ch = cell.color === 'w' ? cell.type.toUpperCase() : cell.type;\n rankStr += ch;\n }\n }\n if (emptyCount > 0) rankStr += emptyCount;\n return rankStr;\n })\n .join('/');\n}\n\n/**\n * Serialize FEN components back into a FEN string.\n */\nexport function serializeFen(parts: ReturnType<typeof parseFen>): string {\n return `${parts.position} ${parts.activeColor} ${parts.castling} ${parts.enPassant} ${parts.halfmove} ${parts.fullmove}`;\n}\n\n/**\n * Calculate material values for both sides from a FEN string.\n */\nexport function calculateMaterial(fen: string): MaterialCount {\n const { position } = parseFen(fen);\n const board = positionToBoard(position);\n let white = 0;\n let black = 0;\n for (const row of board) {\n for (const cell of row) {\n if (cell) {\n const value = PIECE_VALUES[cell.type];\n if (cell.color === 'w') white += value;\n else black += value;\n }\n }\n }\n return { white, black };\n}\n\n/**\n * Get all empty squares on the board.\n */\nexport function getEmptySquares(fen: string): ChessSquare[] {\n const { position } = parseFen(fen);\n const board = positionToBoard(position);\n const squares: ChessSquare[] = [];\n for (let rank = 0; rank < 8; rank++) {\n for (let file = 0; file < 8; file++) {\n if (board[rank][file] === null) {\n squares.push(`${FILES[file]}${8 - rank}` as ChessSquare);\n }\n }\n }\n return squares;\n}\n\n/**\n * Get all squares occupied by pieces of a given color (optionally excluding king).\n */\nexport function getPieceSquares(\n fen: string,\n color: Color,\n excludeKing = true\n): ChessSquare[] {\n const { position } = parseFen(fen);\n const board = positionToBoard(position);\n const squares: ChessSquare[] = [];\n for (let rank = 0; rank < 8; rank++) {\n for (let file = 0; file < 8; file++) {\n const cell = board[rank][file];\n if (cell && cell.color === color) {\n if (excludeKing && cell.type === 'k') continue;\n squares.push(`${FILES[file]}${8 - rank}` as ChessSquare);\n }\n }\n }\n return squares;\n}\n\n/**\n * Convert a square name (e.g. 'e4') to board array indices [rank, file].\n */\nexport function squareToIndices(square: ChessSquare): [number, number] {\n const file = FILES.indexOf(square[0]);\n const rank = 8 - parseInt(square[1]);\n return [rank, file];\n}\n\n/**\n * Add a piece to the board at a given square, returning a new FEN.\n */\nexport function addPieceToFen(\n fen: string,\n square: ChessSquare,\n piece: PieceSymbol,\n color: Color\n): string {\n const parts = parseFen(fen);\n const board = positionToBoard(parts.position);\n const [rank, file] = squareToIndices(square);\n board[rank][file] = { type: piece, color };\n parts.position = boardToPosition(board);\n return serializeFen(parts);\n}\n\n/**\n * Remove a piece from the board at a given square, returning a new FEN.\n */\nexport function removePieceFromFen(\n fen: string,\n square: ChessSquare\n): string {\n const parts = parseFen(fen);\n const board = positionToBoard(parts.position);\n const [rank, file] = squareToIndices(square);\n board[rank][file] = null;\n parts.position = boardToPosition(board);\n return serializeFen(parts);\n}\n","import { Chess } from 'chess.js';\nimport type { PieceSymbol, Color, ChessSquare, ChaosAction, ChaosTarget } from '../types/chess.ts';\nimport {\n calculateMaterial,\n getEmptySquares,\n getPieceSquares,\n addPieceToFen,\n removePieceFromFen,\n} from './fenManipulator.ts';\n\nconst ADDABLE_PIECES: PieceSymbol[] = ['p', 'n', 'b', 'r', 'q'];\nconst MAX_RETRIES = 3;\n\n/**\n * Determine which side to help based on material balance.\n * 70% chance to help the losing side, 30% chance to help the winning side.\n * Equal material = 50/50.\n */\nexport function getChaosTarget(whiteMaterial: number, blackMaterial: number): ChaosTarget {\n if (whiteMaterial > blackMaterial) {\n return Math.random() < 0.7 ? 'help_black' : 'help_white';\n } else if (blackMaterial > whiteMaterial) {\n return Math.random() < 0.7 ? 'help_white' : 'help_black';\n }\n return Math.random() < 0.5 ? 'help_white' : 'help_black';\n}\n\n/**\n * Pick a random element from an array.\n */\nfunction randomChoice<T>(arr: T[]): T {\n return arr[Math.floor(Math.random() * arr.length)];\n}\n\n/**\n * Choose a random piece type to add.\n * If the target square is on rank 1 or 8, avoid pawns.\n */\nfunction chooseRandomPiece(square: ChessSquare): PieceSymbol {\n const rank = parseInt(square[1]);\n if (rank === 1 || rank === 8) {\n // No pawns on first/last rank\n const noPawns: PieceSymbol[] = ['n', 'b', 'r', 'q'];\n return randomChoice(noPawns);\n }\n return randomChoice(ADDABLE_PIECES);\n}\n\n/**\n * Validate that a FEN can be loaded by chess.js (position is legal enough to continue).\n */\nexport function isValidChaosPosition(fen: string): boolean {\n try {\n const test = new Chess();\n test.load(fen);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Try to add a random piece for the given color.\n * Returns { newFen, action } or null if impossible.\n */\nexport function addRandomPiece(\n fen: string,\n color: Color\n): { newFen: string; square: ChessSquare; piece: PieceSymbol } | null {\n const emptySquares = getEmptySquares(fen);\n if (emptySquares.length === 0) return null;\n\n for (let attempt = 0; attempt < MAX_RETRIES; attempt++) {\n const square = randomChoice(emptySquares);\n const piece = chooseRandomPiece(square);\n const newFen = addPieceToFen(fen, square, piece, color);\n if (isValidChaosPosition(newFen)) {\n return { newFen, square, piece };\n }\n }\n return null;\n}\n\n/**\n * Try to remove a random piece of the given color (excluding king).\n * Returns { newFen, square } or null if impossible.\n */\nexport function removeRandomPiece(\n fen: string,\n color: Color\n): { newFen: string; square: ChessSquare } | null {\n const pieceSquares = getPieceSquares(fen, color, true);\n if (pieceSquares.length === 0) return null;\n\n for (let attempt = 0; attempt < MAX_RETRIES; attempt++) {\n const square = randomChoice(pieceSquares);\n // Extra safety: don't remove a piece on rank 1/8 if it's the only defender...\n // Actually, the Python version doesn't check this. Just remove and validate.\n const newFen = removePieceFromFen(fen, square);\n if (isValidChaosPosition(newFen)) {\n return { newFen, square };\n }\n }\n return null;\n}\n\n/**\n * Execute one chaos action: evaluate material, pick target side, randomly add or remove.\n * Returns the action details and new FEN, or null if no valid action was found.\n */\nexport function executeChaosAction(fen: string): { newFen: string; action: ChaosAction } | null {\n const { white: whiteMaterial, black: blackMaterial } = calculateMaterial(fen);\n const target = getChaosTarget(whiteMaterial, blackMaterial);\n const operation = Math.random() < 0.5 ? 'add' : 'remove';\n\n // Determine which color to add to / remove from\n const addColor: Color = target === 'help_white' ? 'w' : 'b';\n const removeColor: Color = target === 'help_white' ? 'b' : 'w';\n\n if (operation === 'add') {\n const result = addRandomPiece(fen, addColor);\n if (result) {\n return {\n newFen: result.newFen,\n action: {\n type: 'add',\n target,\n square: result.square,\n piece: result.piece,\n color: addColor,\n whiteMaterial,\n blackMaterial,\n },\n };\n }\n // Fallback: try remove instead\n const fallback = removeRandomPiece(fen, removeColor);\n if (fallback) {\n return {\n newFen: fallback.newFen,\n action: {\n type: 'remove',\n target,\n square: fallback.square,\n whiteMaterial,\n blackMaterial,\n },\n };\n }\n } else {\n const result = removeRandomPiece(fen, removeColor);\n if (result) {\n return {\n newFen: result.newFen,\n action: {\n type: 'remove',\n target,\n square: result.square,\n whiteMaterial,\n blackMaterial,\n },\n };\n }\n // Fallback: try add instead\n const fallback = addRandomPiece(fen, addColor);\n if (fallback) {\n return {\n newFen: fallback.newFen,\n action: {\n type: 'add',\n target,\n square: fallback.square,\n piece: fallback.piece,\n color: addColor,\n whiteMaterial,\n blackMaterial,\n },\n };\n }\n }\n\n return null;\n}\n\n/**\n * Uniform distribution for chaos interval, parameterized by stupid level (1-5).\n *\n * Level 1: 12–20s (chill)\n * Level 2: 8–15s (moderate)\n * Level 3: 5–12s (default)\n * Level 4: 3–7s (chaotic)\n * Level 5: 1–4s (insane)\n */\nconst STUPID_BOUNDS: [number, number][] = [\n [12, 20], // level 1\n [8, 15], // level 2\n [5, 12], // level 3\n [3, 7], // level 4\n [1, 4], // level 5\n];\n\nexport function getRandomChaosInterval(stupidLevel: number = 3): number {\n const idx = Math.max(0, Math.min(4, stupidLevel - 1));\n const [lo, hi] = STUPID_BOUNDS[idx];\n const seconds = lo + Math.random() * (hi - lo);\n return seconds * 1000;\n}\n","import { useState, useEffect, useRef, useCallback } from 'react';\nimport { executeChaosAction, getRandomChaosInterval } from '../engine/chaosEngine.ts';\nimport type { ChaosAction, ChessSquare } from '../types/chess.ts';\n\ninterface UseChaosEngineParams {\n fen: string;\n isPaused: boolean;\n stupidLevel: number;\n onChaosAction: (newFen: string) => void;\n}\n\ninterface UseChaosEngineReturn {\n countdown: number;\n maxCountdown: number;\n lastAction: ChaosAction | null;\n chaosSquare: ChessSquare | null;\n}\n\nexport function useChaosEngine({\n fen,\n isPaused,\n stupidLevel,\n onChaosAction,\n}: UseChaosEngineParams): UseChaosEngineReturn {\n const [countdown, setCountdown] = useState(0);\n const [maxCountdown, setMaxCountdown] = useState(0);\n const [lastAction, setLastAction] = useState<ChaosAction | null>(null);\n const [chaosSquare, setChaosSquare] = useState<ChessSquare | null>(null);\n\n const fenRef = useRef(fen);\n const isPausedRef = useRef(isPaused);\n const stupidLevelRef = useRef(stupidLevel);\n const onChaosActionRef = useRef(onChaosAction);\n const targetTimeRef = useRef<number>(0);\n const intervalIdRef = useRef<ReturnType<typeof setInterval> | null>(null);\n\n fenRef.current = fen;\n isPausedRef.current = isPaused;\n stupidLevelRef.current = stupidLevel;\n onChaosActionRef.current = onChaosAction;\n\n const scheduleNext = useCallback(() => {\n const intervalMs = getRandomChaosInterval(stupidLevelRef.current);\n const seconds = Math.ceil(intervalMs / 1000);\n setMaxCountdown(seconds);\n setCountdown(seconds);\n targetTimeRef.current = Date.now() + intervalMs;\n }, []);\n\n useEffect(() => {\n // Initial schedule\n scheduleNext();\n\n intervalIdRef.current = setInterval(() => {\n if (isPausedRef.current) return;\n\n const remaining = Math.max(0, Math.ceil((targetTimeRef.current - Date.now()) / 1000));\n setCountdown(remaining);\n\n if (remaining <= 0) {\n if (isPausedRef.current) {\n scheduleNext();\n return;\n }\n // Fire chaos action\n const result = executeChaosAction(fenRef.current);\n if (result) {\n setLastAction(result.action);\n setChaosSquare(result.action.square);\n onChaosActionRef.current(result.newFen);\n\n // Clear chaos square highlight after animation\n setTimeout(() => setChaosSquare(null), 600);\n }\n scheduleNext();\n }\n }, 200);\n\n return () => {\n if (intervalIdRef.current) clearInterval(intervalIdRef.current);\n };\n }, [scheduleNext]);\n\n // Pause: push target time forward so countdown freezes\n const lastPauseRef = useRef<number | null>(null);\n useEffect(() => {\n if (isPaused) {\n lastPauseRef.current = Date.now();\n } else if (lastPauseRef.current !== null) {\n const pausedDuration = Date.now() - lastPauseRef.current;\n targetTimeRef.current += pausedDuration;\n lastPauseRef.current = null;\n }\n }, [isPaused]);\n\n return { countdown, maxCountdown, lastAction, chaosSquare };\n}\n","import type { PieceSymbol, Color } from '../types/chess.ts';\nimport { PIECE_UNICODE } from '../types/chess.ts';\nimport styles from '../styles/Square.module.css';\n\ninterface PieceIconProps {\n type: PieceSymbol;\n color: Color;\n className?: string;\n}\n\nexport function PieceIcon({ type, color, className }: PieceIconProps) {\n const key = `${color}${type}`;\n const symbol = PIECE_UNICODE[key];\n if (!symbol) return null;\n const colorClass = color === 'w' ? styles.pieceWhite : styles.pieceBlack;\n return <span className={`${className ?? ''} ${colorClass}`}>{symbol}</span>;\n}\n","import type { Square as ChessSquare, Piece } from 'chess.js';\nimport { PieceIcon } from './PieceIcon.tsx';\nimport styles from '../styles/Square.module.css';\nimport boardStyles from '../styles/ChessBoard.module.css';\n\ninterface SquareProps {\n square: ChessSquare;\n piece: Piece | null;\n isLight: boolean;\n isSelected: boolean;\n isLegalMove: boolean;\n isCheck: boolean;\n isLastMoveFrom: boolean;\n isLastMoveTo: boolean;\n isChaosFlash: boolean;\n rankLabel?: string | number;\n fileLabel?: string;\n onClick: (square: ChessSquare) => void;\n}\n\nexport function Square({\n square,\n piece,\n isLight,\n isSelected,\n isLegalMove,\n isCheck,\n isLastMoveFrom,\n isLastMoveTo,\n isChaosFlash,\n rankLabel,\n fileLabel,\n onClick,\n}: SquareProps) {\n const classNames = [\n styles.square,\n isLight ? styles.light : styles.dark,\n isSelected && styles.selected,\n isLegalMove && (piece ? styles.legalCapture : styles.legalMove),\n isCheck && styles.check,\n !isSelected && !isCheck && isLastMoveFrom && styles.lastMoveFrom,\n !isSelected && !isCheck && isLastMoveTo && styles.lastMoveTo,\n isChaosFlash && styles.chaosFlash,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div className={classNames} onClick={() => onClick(square)}>\n {piece && (\n <PieceIcon\n type={piece.type}\n color={piece.color}\n className={styles.piece}\n />\n )}\n {rankLabel != null && (\n <span className={boardStyles.rankLabel}>{rankLabel}</span>\n )}\n {fileLabel != null && (\n <span className={boardStyles.fileLabel}>{fileLabel}</span>\n )}\n </div>\n );\n}\n","import React from 'react';\nimport type { Square as ChessSquare, Piece } from 'chess.js';\nimport { Square } from './Square.tsx';\nimport styles from '../styles/ChessBoard.module.css';\n\ninterface LastMove {\n from: ChessSquare;\n to: ChessSquare;\n}\n\ninterface ChessBoardProps {\n board: (Piece | null)[][];\n selectedSquare: ChessSquare | null;\n legalMoves: ChessSquare[];\n inCheck: 'w' | 'b' | null;\n lastMove: LastMove | null;\n chaosSquare: ChessSquare | null;\n flipped: boolean;\n locked: boolean;\n onSquareClick: (square: ChessSquare) => void;\n}\n\nconst FILES = 'abcdefgh';\n\nfunction getSquareName(rank: number, file: number): ChessSquare {\n // board[0] = rank 8, board[7] = rank 1 (white at bottom)\n return `${FILES[file]}${8 - rank}` as ChessSquare;\n}\n\nfunction isLightSquare(rank: number, file: number): boolean {\n return (rank + file) % 2 === 0;\n}\n\nexport const ChessBoard = React.memo(function ChessBoard({\n board,\n selectedSquare,\n legalMoves,\n inCheck,\n lastMove,\n chaosSquare,\n flipped,\n locked,\n onSquareClick,\n}: ChessBoardProps) {\n // Find king squares for check highlighting\n let checkSquare: ChessSquare | null = null;\n if (inCheck) {\n for (let r = 0; r < 8; r++) {\n for (let f = 0; f < 8; f++) {\n const piece = board[r][f];\n if (piece?.type === 'k' && piece.color === inCheck) {\n checkSquare = getSquareName(r, f);\n }\n }\n }\n }\n\n // Build iteration order based on flipped state\n const rankOrder = flipped ? [7, 6, 5, 4, 3, 2, 1, 0] : [0, 1, 2, 3, 4, 5, 6, 7];\n const fileOrder = flipped ? [7, 6, 5, 4, 3, 2, 1, 0] : [0, 1, 2, 3, 4, 5, 6, 7];\n\n return (\n <div className={`${styles.board}${locked ? ` ${styles.boardLocked}` : ''}`}>\n {rankOrder.map((rankIdx) =>\n fileOrder.map((fileIdx) => {\n const square = getSquareName(rankIdx, fileIdx);\n const piece = board[rankIdx][fileIdx];\n\n // Display row/col indices for labels\n const displayRow = rankOrder.indexOf(rankIdx);\n const displayCol = fileOrder.indexOf(fileIdx);\n\n return (\n <Square\n key={square}\n square={square}\n piece={piece}\n isLight={isLightSquare(rankIdx, fileIdx)}\n isSelected={square === selectedSquare}\n isLegalMove={legalMoves.includes(square)}\n isCheck={square === checkSquare}\n isLastMoveFrom={lastMove?.from === square}\n isLastMoveTo={lastMove?.to === square}\n isChaosFlash={chaosSquare === square}\n rankLabel={displayCol === 0 ? 8 - rankIdx : undefined}\n fileLabel={displayRow === 7 ? FILES[fileIdx] : undefined}\n onClick={onSquareClick}\n />\n );\n })\n )}\n </div>\n );\n});\n","import { PieceIcon } from './PieceIcon.tsx';\nimport styles from '../styles/components.module.css';\n\ninterface PromotionDialogProps {\n color: 'w' | 'b';\n onSelect: (piece: 'q' | 'r' | 'b' | 'n') => void;\n}\n\nconst PROMOTION_PIECES: { type: 'q' | 'r' | 'b' | 'n'; label: string }[] = [\n { type: 'q', label: 'Queen' },\n { type: 'r', label: 'Rook' },\n { type: 'b', label: 'Bishop' },\n { type: 'n', label: 'Knight' },\n];\n\nexport function PromotionDialog({ color, onSelect }: PromotionDialogProps) {\n return (\n <div className={styles.promotionOverlay}>\n <div className={styles.promotionDialog}>\n <h3 className={styles.promotionTitle}>Promote pawn</h3>\n <div className={styles.promotionOptions}>\n {PROMOTION_PIECES.map(({ type, label }) => (\n <button\n key={type}\n className={styles.promotionBtn}\n onClick={() => onSelect(type)}\n title={label}\n >\n <PieceIcon type={type} color={color} />\n </button>\n ))}\n </div>\n </div>\n </div>\n );\n}\n","import type { GameStatus } from '../types/chess.ts';\nimport styles from '../styles/components.module.css';\n\ninterface GameOverBannerProps {\n status: GameStatus;\n humanColor: 'w' | 'b';\n onRestart: () => void;\n}\n\nfunction getResultText(status: GameStatus, humanColor: 'w' | 'b'): { title: string; detail: string } {\n if (status.result === 'checkmate') {\n if (status.winner === humanColor) {\n return { title: 'You Win!', detail: 'Checkmate' };\n }\n return { title: 'You Lose', detail: 'Checkmate' };\n }\n if (status.result === 'stalemate') {\n return { title: 'Draw', detail: 'Stalemate' };\n }\n if (status.result === 'insufficient') {\n return { title: 'Draw', detail: 'Insufficient material' };\n }\n if (status.result === 'threefold') {\n return { title: 'Draw', detail: 'Threefold repetition' };\n }\n return { title: 'Draw', detail: 'Game over' };\n}\n\nexport function GameOverBanner({ status, humanColor, onRestart }: GameOverBannerProps) {\n const { title, detail } = getResultText(status, humanColor);\n\n return (\n <div className={styles.gameOverOverlay}>\n <div className={styles.gameOverBanner}>\n <h2 className={styles.gameOverResult}>{title}</h2>\n <p className={styles.gameOverDetail}>{detail}</p>\n <button className={styles.restartBtn} onClick={onRestart}>\n Play Again\n </button>\n </div>\n </div>\n );\n}\n","import styles from '../styles/components.module.css';\n\ninterface ChaosTimerProps {\n countdown: number;\n maxCountdown: number;\n}\n\nexport function ChaosTimer({ countdown, maxCountdown }: ChaosTimerProps) {\n const progress = maxCountdown > 0 ? ((maxCountdown - countdown) / maxCountdown) * 100 : 0;\n const glow = 1 - (countdown / maxCountdown || 0); // 0 at full, 1 at empty\n\n return (\n <div className={styles.chaosBar}>\n <span className={styles.chaosBarLabel}>STUPIDITY</span>\n <div className={styles.chaosBarTrack}>\n <div\n className={styles.chaosBarFill}\n style={{\n width: `${progress}%`,\n '--glow': glow,\n } as React.CSSProperties}\n />\n </div>\n </div>\n );\n}\n","import { useState, useEffect, useRef } from 'react';\nimport { PIECE_UNICODE } from '../types/chess.ts';\nimport type { ChaosAction } from '../types/chess.ts';\nimport styles from '../styles/components.module.css';\n\ninterface ChaosToastProps {\n action: ChaosAction | null;\n}\n\nexport function ChaosToast({ action }: ChaosToastProps) {\n const [visible, setVisible] = useState(false);\n const [fading, setFading] = useState(false);\n const [displayAction, setDisplayAction] = useState<ChaosAction | null>(null);\n const timeoutRef = useRef<ReturnType<typeof setTimeout>>(undefined);\n\n useEffect(() => {\n if (!action) return;\n\n // Clear any existing timeout\n if (timeoutRef.current) clearTimeout(timeoutRef.current);\n\n setDisplayAction(action);\n setFading(false);\n setVisible(true);\n\n // Start fade-out after 1.6s\n timeoutRef.current = setTimeout(() => {\n setFading(true);\n // Remove after fade animation completes\n timeoutRef.current = setTimeout(() => {\n setVisible(false);\n setFading(false);\n }, 400);\n }, 1600);\n\n return () => {\n if (timeoutRef.current) clearTimeout(timeoutRef.current);\n };\n }, [action]);\n\n if (!visible || !displayAction) return null;\n\n const message =\n displayAction.type === 'add' && displayAction.piece && displayAction.color\n ? `A ${PIECE_UNICODE[`${displayAction.color}${displayAction.piece}`]} appeared on ${displayAction.square}!`\n : `The piece on ${displayAction.square} vanished!`;\n\n return (\n <div className={`${styles.chaosToast} ${fading ? styles.chaosToastFading : ''}`}>\n {message}\n </div>\n );\n}\n","import styles from '../styles/components.module.css';\n\ninterface DifficultySelectorProps {\n depth: number;\n onChange: (depth: number) => void;\n}\n\nexport function DifficultySelector({ depth, onChange }: DifficultySelectorProps) {\n return (\n <div className={styles.difficultySelector}>\n <span className={styles.difficultyLabel}>\n AI Depth: <span className={styles.difficultyValue}>{depth}</span>\n </span>\n <input\n className={styles.difficultySlider}\n type=\"range\"\n min={1}\n max={20}\n value={depth}\n onChange={(e) => onChange(parseInt(e.target.value))}\n />\n </div>\n );\n}\n","import styles from '../styles/components.module.css';\n\ninterface StupidLevelProps {\n level: number; // 0 = off, 1-5\n onChange: (level: number) => void;\n}\n\nconst LABELS = ['OFF', 'CHILL', 'MID', 'STUPID', 'CHAOS', 'LOL'];\n\nexport function StupidLevel({ level, onChange }: StupidLevelProps) {\n return (\n <div className={styles.stupidLevel}>\n <div className={styles.stupidLevelHeader}>\n <span className={styles.stupidLevelLabel}>STUPID</span>\n <span className={styles.stupidLevelValue}>{LABELS[level]}</span>\n </div>\n <input\n type=\"range\"\n min={0}\n max={5}\n step={1}\n value={level}\n onChange={(e) => onChange(Number(e.target.value))}\n className={styles.stupidLevelSlider}\n />\n </div>\n );\n}\n","import { PIECE_UNICODE } from '../types/chess.ts';\nimport { DifficultySelector } from './DifficultySelector.tsx';\nimport { StupidLevel } from './StupidLevel.tsx';\nimport styles from '../styles/components.module.css';\n\ninterface SidePickerProps {\n depth: number;\n onDepthChange: (depth: number) => void;\n stupidLevel: number;\n onStupidLevelChange: (level: number) => void;\n onSelectSide: (color: 'w' | 'b') => void;\n}\n\nexport function SidePicker({ depth, onDepthChange, stupidLevel, onStupidLevelChange, onSelectSide }: SidePickerProps) {\n return (\n <div className={styles.sidePickerOverlay}>\n <div className={styles.sidePickerCard}>\n <h2 className={styles.sidePickerTitle}>Choose Your Side</h2>\n <div className={styles.sidePickerOptions}>\n <button\n className={styles.sidePickerBtn}\n onClick={() => onSelectSide('w')}\n >\n <span className={`${styles.sidePickerIcon} ${styles.sidePickerWhite}`}>{PIECE_UNICODE.wk}</span>\n <span className={styles.sidePickerLabel}>White</span>\n </button>\n <button\n className={styles.sidePickerBtn}\n onClick={() => onSelectSide('b')}\n >\n <span className={`${styles.sidePickerIcon} ${styles.sidePickerBlack}`}>{PIECE_UNICODE.bk}</span>\n <span className={styles.sidePickerLabel}>Black</span>\n </button>\n </div>\n <div className={styles.sidePickerSettings}>\n <DifficultySelector depth={depth} onChange={onDepthChange} />\n <StupidLevel level={stupidLevel} onChange={onStupidLevelChange} />\n </div>\n </div>\n </div>\n );\n}\n","import styles from '../styles/components.module.css';\n\ninterface MuteButtonProps {\n muted: boolean;\n onToggle: () => void;\n}\n\nexport function MuteButton({ muted, onToggle }: MuteButtonProps) {\n return (\n <button\n className={`${styles.muteBtn} ${muted ? styles.muteBtnMuted : ''}`}\n onClick={onToggle}\n title={muted ? 'Unmute' : 'Mute'}\n >\n {muted ? '\\u{1F507}' : '\\u{1F50A}'}\n </button>\n );\n}\n","class SoundManager {\n private ctx: AudioContext | null = null;\n private muted = false;\n\n private getCtx(): AudioContext | null {\n if (this.muted) return null;\n if (!this.ctx) {\n try {\n this.ctx = new AudioContext();\n } catch {\n return null;\n }\n }\n if (this.ctx.state === 'suspended') {\n this.ctx.resume();\n }\n return this.ctx;\n }\n\n setMuted(muted: boolean) {\n this.muted = muted;\n }\n\n playMove() {\n const ctx = this.getCtx();\n if (!ctx) return;\n const osc = ctx.createOscillator();\n const gain = ctx.createGain();\n osc.type = 'sine';\n osc.frequency.value = 200;\n gain.gain.setValueAtTime(0.15, ctx.currentTime);\n gain.gain.exponentialRampToValueAtTime(0.001, ctx.currentTime + 0.08);\n osc.connect(gain).connect(ctx.destination);\n osc.start();\n osc.stop(ctx.currentTime + 0.08);\n }\n\n playCapture() {\n const ctx = this.getCtx();\n if (!ctx) return;\n // Metallic clack: noise burst filtered to high-mid band\n const bufferSize = ctx.sampleRate * 0.1;\n const buffer = ctx.createBuffer(1, bufferSize, ctx.sampleRate);\n const data = buffer.getChannelData(0);\n for (let i = 0; i < bufferSize; i++) {\n data[i] = (Math.random() * 2 - 1) * Math.exp(-i / (ctx.sampleRate * 0.015));\n }\n const noise = ctx.createBufferSource();\n noise.buffer = buffer;\n const bandpass = ctx.createBiquadFilter();\n bandpass.type = 'bandpass';\n bandpass.frequency.value = 3000;\n bandpass.Q.value = 2;\n const gain = ctx.createGain();\n gain.gain.setValueAtTime(0.35, ctx.currentTime);\n gain.gain.exponentialRampToValueAtTime(0.001, ctx.currentTime + 0.1);\n noise.connect(bandpass).connect(gain).connect(ctx.destination);\n noise.start();\n noise.stop(ctx.currentTime + 0.1);\n }\n\n playCheck() {\n const ctx = this.getCtx();\n if (!ctx) return;\n const osc = ctx.createOscillator();\n const gain = ctx.createGain();\n osc.type = 'triangle';\n osc.frequency.value = 800;\n gain.gain.setValueAtTime(0.18, ctx.currentTime);\n gain.gain.exponentialRampToValueAtTime(0.001, ctx.currentTime + 0.12);\n osc.connect(gain).connect(ctx.destination);\n osc.start();\n osc.stop(ctx.currentTime + 0.12);\n }\n\n playChaos() {\n const ctx = this.getCtx();\n if (!ctx) return;\n // Soft shimmer: quiet sine blip with a gentle pitch drop\n const osc = ctx.createOscillator();\n const gain = ctx.createGain();\n osc.type = 'sine';\n osc.frequency.setValueAtTime(520, ctx.currentTime);\n osc.frequency.exponentialRampToValueAtTime(320, ctx.currentTime + 0.18);\n gain.gain.setValueAtTime(0.07, ctx.currentTime);\n gain.gain.exponentialRampToValueAtTime(0.001, ctx.currentTime + 0.18);\n osc.connect(gain).connect(ctx.destination);\n osc.start();\n osc.stop(ctx.currentTime + 0.18);\n }\n\n playGameOver() {\n const ctx = this.getCtx();\n if (!ctx) return;\n // C major chord: C4 + E4 + G4\n const freqs = [261.63, 329.63, 392.0];\n for (const freq of freqs) {\n const osc = ctx.createOscillator();\n const gain = ctx.createGain();\n osc.type = 'sine';\n osc.frequency.value = freq;\n gain.gain.setValueAtTime(0.1, ctx.currentTime);\n gain.gain.exponentialRampToValueAtTime(0.001, ctx.currentTime + 0.4);\n osc.connect(gain).connect(ctx.destination);\n osc.start();\n osc.stop(ctx.currentTime + 0.4);\n }\n }\n}\n\nexport const soundManager = new SoundManager();\n","import { useState, useCallback, useEffect, useRef } from 'react';\nimport { Chess } from 'chess.js';\nimport type { Square as ChessSquare } from 'chess.js';\nimport type { ChaosChessProps } from './types/props.ts';\nimport { useChessGame } from './hooks/useChessGame.ts';\nimport { useStockfish } from './hooks/useStockfish.ts';\nimport { useChaosEngine } from './hooks/useChaosEngine.ts';\nimport { ChessBoard } from './components/ChessBoard.tsx';\nimport { PromotionDialog } from './components/PromotionDialog.tsx';\nimport { GameOverBanner } from './components/GameOverBanner.tsx';\nimport { ChaosTimer } from './components/ChaosTimer.tsx';\nimport { ChaosToast } from './components/ChaosToast.tsx';\nimport { DifficultySelector } from './components/DifficultySelector.tsx';\nimport { SidePicker } from './components/SidePicker.tsx';\nimport { StupidLevel } from './components/StupidLevel.tsx';\nimport { MuteButton } from './components/MuteButton.tsx';\nimport { soundManager } from './utils/sounds.ts';\nimport styles from './styles/ChessGame.module.css';\nimport './styles/theme.css';\nimport './styles/animations.css';\n\ntype GamePhase = 'setup' | 'playing';\n\nexport function ChessGame(props: ChaosChessProps) {\n const {\n defaultDepth = 10,\n defaultStupidLevel = 3,\n defaultHumanColor,\n defaultMuted = false,\n depth: controlledDepth,\n onDepthChange,\n stupidLevel: controlledStupidLevel,\n onStupidLevelChange,\n stockfishWorkerPath,\n skipSetup = false,\n showControls = true,\n showMuteButton = true,\n onGameOver,\n onMove,\n onChaosAction: onChaosActionCb,\n onRestart: onRestartCb,\n className,\n } = props;\n\n // --- Controlled / uncontrolled state ---\n const [internalDepth, setInternalDepth] = useState(defaultDepth);\n const depth = controlledDepth ?? internalDepth;\n const setDepth = onDepthChange ?? setInternalDepth;\n\n const [internalStupidLevel, setInternalStupidLevel] = useState(defaultStupidLevel);\n const stupidLevel = controlledStupidLevel ?? internalStupidLevel;\n const setStupidLevel = onStupidLevelChange ?? setInternalStupidLevel;\n\n const [internalHumanColor, setInternalHumanColor] = useState<'w' | 'b'>(defaultHumanColor ?? 'w');\n const humanColor = internalHumanColor;\n\n const [soundMuted, setSoundMuted] = useState(defaultMuted);\n\n // If skipSetup or defaultHumanColor is given, go straight to playing\n const [gamePhase, setGamePhase] = useState<GamePhase>(\n (skipSetup || defaultHumanColor) ? 'playing' : 'setup'\n );\n\n const {\n fen,\n turn,\n selectedSquare,\n legalMoves,\n gameStatus,\n promotionPending,\n lastMove,\n lastMoveDetail,\n moveHistory,\n board,\n handleSquareClick,\n handlePromotion,\n applyFen,\n handleRestart: resetGame,\n } = useChessGame();\n\n const { isReady: stockfishReady, isThinking, getBestMove } = useStockfish(stockfishWorkerPath);\n\n const aiEnabled = stockfishReady;\n const isHumanTurn = turn === humanColor;\n\n // Chaos engine: pause during setup, when off, AI's turn, promotion, or game over\n const chaosEnabled = stupidLevel > 0;\n const chaosPaused = gamePhase !== 'playing' || !chaosEnabled || !isHumanTurn || isThinking || !!promotionPending || gameStatus.isGameOver;\n const { countdown, maxCountdown, lastAction, chaosSquare } = useChaosEngine({\n fen,\n isPaused: chaosPaused,\n stupidLevel: Math.max(1, stupidLevel),\n onChaosAction: useCallback((newFen: string) => {\n // Guard: if the game has moved past the human's turn, skip this chaos event.\n // This catches the race where the interval fires before isPausedRef updates.\n const chess = new Chess(currentFenRef.current);\n if (chess.turn() !== humanColorRef.current) return;\n if (chess.isGameOver()) return;\n applyFen(newFen);\n }, [applyFen]),\n });\n\n // Fire onChaosAction callback\n const prevLastActionRef = useRef(lastAction);\n useEffect(() => {\n if (lastAction && lastAction !== prevLastActionRef.current) {\n onChaosActionCb?.(lastAction, fen);\n }\n prevLastActionRef.current = lastAction;\n }, [lastAction, fen, onChaosActionCb]);\n\n // Refs that always point to latest values (for use in async callbacks)\n const currentFenRef = useRef(fen);\n currentFenRef.current = fen;\n const humanColorRef = useRef(humanColor);\n humanColorRef.current = humanColor;\n\n // Track last FEN where Stockfish returned no move to avoid infinite retries\n const noMoveFenRef = useRef<string | null>(null);\n\n const executeStockfishMove = useCallback((uciMove: string) => {\n const from = uciMove.slice(0, 2) as ChessSquare;\n const to = uciMove.slice(2, 4) as ChessSquare;\n const promotion = uciMove.length > 4 ? uciMove[4] : undefined;\n try {\n const tempChess = new Chess(currentFenRef.current);\n const moveOpts: { from: ChessSquare; to: ChessSquare; promotion?: string } = { from, to };\n if (promotion) moveOpts.promotion = promotion;\n const move = tempChess.move(moveOpts);\n if (move) {\n applyFen(tempChess.fen());\n } else {\n // Move invalid for current position — board changed since Stockfish started.\n // The main effect will re-trigger via isThinking becoming false.\n console.warn('[ChaosChess] Stockfish move invalid for current position, will retry');\n }\n } catch {\n console.warn('[ChaosChess] Stockfish move threw, will retry');\n }\n }, [applyFen]);\n\n // --- Side selection ---\n const handleSideSelect = useCallback((color: 'w' | 'b') => {\n setInternalHumanColor(color);\n setGamePhase('playing');\n }, []);\n\n const handleRestart = useCallback(() => {\n resetGame();\n setGamePhase((skipSetup || defaultHumanColor) ? 'playing' : 'setup');\n onRestartCb?.();\n }, [resetGame, skipSetup, defaultHumanColor, onRestartCb]);\n\n // --- Sound mute sync ---\n useEffect(() => {\n soundManager.setMuted(soundMuted);\n }, [soundMuted]);\n\n // --- Sound: move / capture / check + onMove callback ---\n const prevMoveCountRef = useRef(moveHistory.length);\n useEffect(() => {\n if (moveHistory.length > prevMoveCountRef.current) {\n // Sound\n if (lastMoveDetail) {\n if (lastMoveDetail.check) {\n soundManager.playCheck();\n } else if (lastMoveDetail.captured) {\n soundManager.playCapture();\n } else {\n soundManager.playMove();\n }\n }\n // Fire onMove callback for the new entry\n const latest = moveHistory[moveHistory.length - 1];\n if (latest) {\n onMove?.(latest.fen, latest.san, latest.color);\n }\n }\n prevMoveCountRef.current = moveHistory.length;\n }, [moveHistory.length, lastMoveDetail, moveHistory, onMove]);\n\n // --- Sound: chaos ---\n useEffect(() => {\n if (chaosSquare) {\n soundManager.playChaos();\n }\n }, [chaosSquare]);\n\n // --- Sound + callback: game over ---\n const prevGameOverRef = useRef(false);\n useEffect(() => {\n if (gameStatus.isGameOver && !prevGameOverRef.current) {\n soundManager.playGameOver();\n onGameOver?.(gameStatus);\n }\n prevGameOverRef.current = gameStatus.isGameOver;\n }, [gameStatus, onGameOver]);\n\n // Single effect to trigger Stockfish when it's the AI's turn.\n // Covers: FEN changes, initial move as black, and Stockfish becoming ready.\n // The engine's cancelPending() handles deduplication at the worker level.\n const initialMoveTriggered = useRef(false);\n useEffect(() => {\n if (gamePhase !== 'playing') {\n initialMoveTriggered.current = false;\n return;\n }\n if (isHumanTurn || gameStatus.isGameOver || !stockfishReady || isThinking) return;\n\n // Don't retry a FEN that already returned no move\n if (noMoveFenRef.current === fen) return;\n\n // For initial position when playing as black, mark as triggered\n if (humanColor === 'b' && !initialMoveTriggered.current) {\n initialMoveTriggered.current = true;\n }\n\n getBestMove(fen, depth).then((uciMove) => {\n if (!uciMove) {\n // Genuine \"(none)\": no legal move for this exact position. Pin it so we\n // don't tight-loop. (On the AI's turn this lines up with game-over.)\n noMoveFenRef.current = fen;\n return;\n }\n noMoveFenRef.current = null;\n executeStockfishMove(uciMove);\n }).catch(() => {\n // Search was cancelled/superseded or timed out — not a dead position.\n // Leave noMoveFenRef clear so this effect (or the watchdog) retries.\n });\n }, [gamePhase, fen, isHumanTurn, gameStatus.isGameOver, stockfishReady, isThinking, humanColor, getBestMove, depth, executeStockfishMove]);\n\n // Retry watchdog: if it's the AI's turn but Stockfish isn't thinking, retry after 3s.\n // This catches edge cases where the above effect's move was invalid for the current position.\n useEffect(() => {\n if (gamePhase !== 'playing' || isHumanTurn || isThinking || gameStatus.isGameOver || !stockfishReady) return;\n\n // Don't retry a FEN that already returned no move\n if (noMoveFenRef.current === fen) return;\n\n const timer = setTimeout(() => {\n getBestMove(fen, depth).then((uciMove) => {\n if (!uciMove) {\n noMoveFenRef.current = fen;\n return;\n }\n noMoveFenRef.current = null;\n executeStockfishMove(uciMove);\n }).catch(() => {\n // Cancelled/timed-out — let a later tick retry.\n });\n }, 3000);\n\n return () => clearTimeout(timer);\n }, [gamePhase, isHumanTurn, isThinking, gameStatus.isGameOver, stockfishReady, fen, depth, getBestMove, executeStockfishMove]);\n\n // Lock board during AI turn\n const onSquareClick = useCallback(\n (square: ChessSquare) => {\n if (aiEnabled && turn !== humanColor) return;\n handleSquareClick(square);\n },\n [aiEnabled, turn, humanColor, handleSquareClick]\n );\n\n const statusText = gameStatus.isGameOver\n ? 'Game Over'\n : isThinking\n ? ''\n : !aiEnabled\n ? `${turn === 'w' ? 'White' : 'Black'} to move`\n : isHumanTurn\n ? 'Your turn'\n : 'Opponent thinking...';\n\n const rootClassName = [styles.container, className].filter(Boolean).join(' ');\n\n // --- Setup phase ---\n if (gamePhase === 'setup') {\n return (\n <div className={rootClassName} data-chaos-chess=\"\">\n <SidePicker\n depth={depth}\n onDepthChange={setDepth}\n stupidLevel={stupidLevel}\n onStupidLevelChange={setStupidLevel}\n onSelectSide={handleSideSelect}\n />\n </div>\n );\n }\n\n // --- Playing phase ---\n return (\n <div className={rootClassName} data-chaos-chess=\"\">\n <div className={styles.topBar}>\n <div className={styles.topBarLeft}>\n <span className={styles.statusText}>{statusText}</span>\n {isThinking && (\n <span className={styles.thinking}>AI thinking...</span>\n )}\n </div>\n {showMuteButton && (\n <MuteButton muted={soundMuted} onToggle={() => setSoundMuted((m) => !m)} />\n )}\n </div>\n\n {chaosEnabled && (\n <ChaosTimer countdown={countdown} maxCountdown={maxCountdown} />\n )}\n\n <ChessBoard\n board={board}\n selectedSquare={selectedSquare}\n legalMoves={legalMoves}\n inCheck={gameStatus.inCheck}\n lastMove={lastMove}\n chaosSquare={chaosSquare}\n flipped={humanColor === 'b'}\n locked={aiEnabled && !isHumanTurn}\n onSquareClick={onSquareClick}\n />\n\n {showControls && (\n <div className={styles.bottomBar}>\n <DifficultySelector depth={depth} onChange={setDepth} />\n <StupidLevel level={stupidLevel} onChange={setStupidLevel} />\n </div>\n )}\n\n <ChaosToast action={lastAction} />\n {promotionPending && <PromotionDialog color={turn} onSelect={handlePromotion} />}\n {gameStatus.isGameOver && (\n <GameOverBanner status={gameStatus} humanColor={humanColor} onRestart={handleRestart} />\n )}\n </div>\n );\n}\n"],"names":["getGameStatus","chess","useChessGame","chessRef","useRef","Chess","fen","setFen","useState","turn","setTurn","selectedSquare","setSelectedSquare","legalMoves","setLegalMoves","gameStatus","setGameStatus","promotionPending","setPromotionPending","moveHistory","setMoveHistory","lastMove","setLastMove","lastMoveDetail","setLastMoveDetail","board","setBoard","clearSelection","useCallback","syncState","handleSquareClick","square","piece","move","prev","moves","m","handlePromotion","applyFen","newFen","handleRestart","StockfishEngine","workerPath","resolve","reject","onReady","e","err","onMessage","depth","timeoutMs","mySearchId","msg","useStockfish","engineRef","isReady","setIsReady","isThinking","setIsThinking","callIdRef","useEffect","engine","getBestMove","myCallId","safetyTimeout","PIECE_VALUES","PIECE_UNICODE","FILES","parseFen","parts","positionToBoard","position","ranks","rank","row","ch","emptyCount","color","type","boardToPosition","rankStr","cell","serializeFen","calculateMaterial","white","black","value","getEmptySquares","squares","file","getPieceSquares","excludeKing","squareToIndices","addPieceToFen","removePieceFromFen","ADDABLE_PIECES","MAX_RETRIES","getChaosTarget","whiteMaterial","blackMaterial","randomChoice","arr","chooseRandomPiece","isValidChaosPosition","addRandomPiece","emptySquares","attempt","removeRandomPiece","pieceSquares","executeChaosAction","target","operation","addColor","removeColor","result","fallback","STUPID_BOUNDS","getRandomChaosInterval","stupidLevel","idx","lo","hi","useChaosEngine","isPaused","onChaosAction","countdown","setCountdown","maxCountdown","setMaxCountdown","lastAction","setLastAction","chaosSquare","setChaosSquare","fenRef","isPausedRef","stupidLevelRef","onChaosActionRef","targetTimeRef","intervalIdRef","scheduleNext","intervalMs","seconds","remaining","lastPauseRef","pausedDuration","PieceIcon","className","key","symbol","colorClass","styles","jsx","Square","isLight","isSelected","isLegalMove","isCheck","isLastMoveFrom","isLastMoveTo","isChaosFlash","rankLabel","fileLabel","onClick","classNames","jsxs","boardStyles","getSquareName","isLightSquare","ChessBoard","React","inCheck","flipped","locked","onSquareClick","checkSquare","r","f","rankOrder","fileOrder","rankIdx","fileIdx","displayRow","displayCol","PROMOTION_PIECES","PromotionDialog","onSelect","label","getResultText","status","humanColor","GameOverBanner","onRestart","title","detail","ChaosTimer","progress","glow","ChaosToast","action","visible","setVisible","fading","setFading","displayAction","setDisplayAction","timeoutRef","message","DifficultySelector","onChange","LABELS","StupidLevel","level","SidePicker","onDepthChange","onStupidLevelChange","onSelectSide","MuteButton","muted","onToggle","SoundManager","ctx","osc","gain","bufferSize","buffer","data","i","noise","bandpass","freqs","freq","soundManager","ChessGame","props","defaultDepth","defaultStupidLevel","defaultHumanColor","defaultMuted","controlledDepth","controlledStupidLevel","stockfishWorkerPath","skipSetup","showControls","showMuteButton","onGameOver","onMove","onChaosActionCb","onRestartCb","internalDepth","setInternalDepth","setDepth","internalStupidLevel","setInternalStupidLevel","setStupidLevel","internalHumanColor","setInternalHumanColor","soundMuted","setSoundMuted","gamePhase","setGamePhase","resetGame","stockfishReady","aiEnabled","isHumanTurn","chaosEnabled","chaosPaused","currentFenRef","humanColorRef","prevLastActionRef","noMoveFenRef","executeStockfishMove","uciMove","from","to","promotion","tempChess","moveOpts","handleSideSelect","prevMoveCountRef","latest","prevGameOverRef","initialMoveTriggered","timer","statusText","rootClassName"],"mappings":"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"}
|