@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.
@@ -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)), [_, b] = d(null), [g, v] = d([]), [k, R] = d(null), [$, I] = d(null), [x, T] = d(t.current.board()), h = N(() => {
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()), T(t.current.board()), f(pe(t.current));
12
- }, []), le = N((L) => {
13
- const m = t.current, S = m.turn();
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(L)) {
16
+ if (r && i.includes(T)) {
17
17
  const q = m.get(r);
18
- if (q?.type === "p" && (q.color === "w" && L[1] === "8" || q.color === "b" && L[1] === "1")) {
19
- b({ from: r, to: L }), h();
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 M = m.move({ from: r, to: L });
24
- M && (R({ from: M.from, to: M.to }), I({ captured: !!M.captured, check: M.san.includes("+") || M.san.includes("#") }), v((P) => [
25
- ...P,
26
- { san: M.san, fen: m.fen(), color: M.color }
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(L);
34
- if (H && H.color === S) {
35
- if (L === r) {
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(L);
40
- const q = m.moves({ square: L, verbose: !0 });
41
- l(q.map((M) => M.to));
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((L) => {
45
+ }, [r, i, _, h, D]), W = N((T) => {
46
46
  if (!_) return;
47
47
  const m = t.current;
48
48
  try {
49
- const S = m.move({
49
+ const M = m.move({
50
50
  from: _.from,
51
51
  to: _.to,
52
- promotion: L
52
+ promotion: T
53
53
  });
54
- S && (R({ from: S.from, to: S.to }), I({ captured: !!S.captured, check: S.san.includes("+") || S.san.includes("#") }), v((H) => [
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: S.san, fen: m.fen(), color: S.color }
56
+ { san: M.san, fen: m.fen(), color: M.color }
57
57
  ]));
58
58
  } catch {
59
59
  }
60
- b(null), h(), D();
61
- }, [_, h, D]), Z = N((L) => {
60
+ P(null), h(), D();
61
+ }, [_, h, D]), Z = N((T) => {
62
62
  const m = t.current;
63
63
  try {
64
- m.load(L), h(), D();
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), b(null), D();
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 Me(t, e) {
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 = Me(t, r);
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 = Me(t, r);
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), b = y(t), g = y(e), v = y(n), k = y(s), R = y(0), $ = y(null);
431
- b.current = t, g.current = e, v.current = n, k.current = s;
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 T = pt(v.current), h = Math.ceil(T / 1e3);
434
- i(h), r(h), R.current = Date.now() + T;
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 T = Math.max(0, Math.ceil((R.current - Date.now()) / 1e3));
439
- if (r(T), T <= 0) {
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(b.current);
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 T = Date.now() - x.current;
456
- R.current += T, x.current = null;
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", St = "_pieceWhite_1tsnw_78", Mt = "_pieceBlack_1tsnw_83", O = {
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: St,
473
- pieceBlack: Mt
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 b = [
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: b, onClick: () => _(t), children: [
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], b = 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) => b.map((v) => {
552
- const k = Oe(g, v), R = e[g][v], $ = _.indexOf(g), I = b.indexOf(v);
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 Sn({ depth: t, onDepthChange: e, stupidLevel: n, onStupidLevelChange: s, onSelectSide: o }) {
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 Mn({ muted: t, onToggle: e }) {
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: b = !0,
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), T = r ?? I, h = c ?? x, [D, le] = d(n), W = i ?? D, Z = l ?? le, [ue, L] = d(s ?? "w"), m = ue, [S, H] = d(o), [q, M] = d(
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: P,
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: P,
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, P), ye.current = V;
870
- }, [V, P, k]);
871
- const he = y(P);
872
- he.current = P;
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), Se = { from: j, to: Je };
879
- Le && (Se.promotion = Le), Pe.move(Se) ? te(Pe.fen()) : console.warn("[ChaosChess] Stockfish move invalid for current position, will retry");
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
- L(p), M("playing");
882
+ T(p), S("playing");
885
883
  }, []), Qe = N(() => {
886
- ge(), M(f || s ? "playing" : "setup"), R?.();
884
+ ge(), S(f || s ? "playing" : "setup"), R?.();
887
885
  }, [ge, f, s, R]);
888
886
  F(() => {
889
- Y.setMuted(S);
890
- }, [S]);
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 !== P && (m === "b" && !me.current && (me.current = !0), ne(P, T).then((p) => {
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
- console.warn("[ChaosChess] Stockfish returned no move for position, skipping retries"), U.current = P;
912
+ U.current = L;
915
913
  return;
916
914
  }
917
915
  U.current = null, re(p);
916
+ }).catch(() => {
918
917
  }));
919
- }, [q, P, E, B.isGameOver, K, A, m, ne, T, re]), F(() => {
920
- if (q !== "playing" || E || A || B.isGameOver || !K || U.current === P) return;
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(P, T).then((j) => {
921
+ ne(L, b).then((j) => {
923
922
  if (!j) {
924
- U.current = P;
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, P, T, ne, re]);
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
- Sn,
939
+ Mn,
940
940
  {
941
- depth: T,
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
- b && /* @__PURE__ */ a(Mn, { muted: S, onToggle: () => H((p) => !p) })
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: T, onChange: h }),
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 }),
@@ -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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@maxr0ssi/chaos-chess",
3
- "version": "0.1.6",
3
+ "version": "0.1.7",
4
4
  "publishConfig": {
5
5
  "registry": "https://registry.npmjs.org",
6
6
  "access": "public"