@gamepark/react-game 7.7.4 → 7.7.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) hide show
  1. package/dist/components/GameProvider/GameErrorBoundary.js +108 -108
  2. package/dist/components/GameProvider/GameInternalProviders.d.ts +6 -0
  3. package/dist/components/GameProvider/GameInternalProviders.js +10 -0
  4. package/dist/components/GameProvider/GameInternalProviders.js.map +1 -0
  5. package/dist/components/GameProvider/LogHistoryBridge.d.ts +7 -0
  6. package/dist/components/GameProvider/LogHistoryBridge.js +23 -0
  7. package/dist/components/GameProvider/LogHistoryBridge.js.map +1 -0
  8. package/dist/components/JournalTabs/History/History.js +52 -13
  9. package/dist/components/JournalTabs/History/History.js.map +1 -1
  10. package/dist/components/JournalTabs/History/LazyLogItem.d.ts +10 -0
  11. package/dist/components/JournalTabs/History/LazyLogItem.js +35 -0
  12. package/dist/components/JournalTabs/History/LazyLogItem.js.map +1 -0
  13. package/dist/components/JournalTabs/History/SetupLogItem.js +19 -19
  14. package/dist/components/JournalTabs/History/SharedIntersectionContext.d.ts +9 -0
  15. package/dist/components/JournalTabs/History/SharedIntersectionContext.js +36 -0
  16. package/dist/components/JournalTabs/History/SharedIntersectionContext.js.map +1 -0
  17. package/dist/components/JournalTabs/History/VirtualizedLogItem.d.ts +12 -0
  18. package/dist/components/JournalTabs/History/VirtualizedLogItem.js +6 -0
  19. package/dist/components/JournalTabs/History/VirtualizedLogItem.js.map +1 -0
  20. package/dist/components/Log/LogHistoryProvider.d.ts +7 -0
  21. package/dist/components/Log/LogHistoryProvider.js +22 -0
  22. package/dist/components/Log/LogHistoryProvider.js.map +1 -0
  23. package/dist/components/material/Dices/OctahedralDiceDescription.d.ts +48 -0
  24. package/dist/components/material/Dices/OctahedralDiceDescription.js +142 -0
  25. package/dist/components/material/Dices/OctahedralDiceDescription.js.map +1 -0
  26. package/dist/components/material/GameTable/DevToolEntry.d.ts +17 -0
  27. package/dist/components/material/GameTable/DevToolEntry.js +13 -0
  28. package/dist/components/material/GameTable/DevToolEntry.js.map +1 -0
  29. package/dist/components/material/GameTable/DevTools/BotTool.d.ts +8 -0
  30. package/dist/components/material/GameTable/DevTools/BotTool.js +13 -0
  31. package/dist/components/material/GameTable/DevTools/BotTool.js.map +1 -0
  32. package/dist/components/material/GameTable/DevTools/DevToolsStyles.d.ts +58 -0
  33. package/dist/components/material/GameTable/DevTools/DevToolsStyles.js +706 -0
  34. package/dist/components/material/GameTable/DevTools/DevToolsStyles.js.map +1 -0
  35. package/dist/components/material/GameTable/DevTools/GamePanel.d.ts +1 -0
  36. package/dist/components/material/GameTable/DevTools/GamePanel.js +7 -179
  37. package/dist/components/material/GameTable/DevTools/GamePanel.js.map +1 -1
  38. package/dist/components/material/GameTable/DevTools/NewGameTool.d.ts +9 -0
  39. package/dist/components/material/GameTable/DevTools/NewGameTool.js +64 -0
  40. package/dist/components/material/GameTable/DevTools/NewGameTool.js.map +1 -0
  41. package/dist/components/material/GameTable/DevTools/SwitchPlayerTool.d.ts +8 -0
  42. package/dist/components/material/GameTable/DevTools/SwitchPlayerTool.js +9 -0
  43. package/dist/components/material/GameTable/DevTools/SwitchPlayerTool.js.map +1 -0
  44. package/dist/components/material/GameTable/DevTools/TutorialTool.d.ts +8 -0
  45. package/dist/components/material/GameTable/DevTools/TutorialTool.js +4 -0
  46. package/dist/components/material/GameTable/DevTools/TutorialTool.js.map +1 -0
  47. package/dist/components/material/GameTable/DevTools/UndoTool.d.ts +8 -0
  48. package/dist/components/material/GameTable/DevTools/UndoTool.js +9 -0
  49. package/dist/components/material/GameTable/DevTools/UndoTool.js.map +1 -0
  50. package/dist/components/material/GameTable/DevTools/devtools.css.d.ts +24 -0
  51. package/dist/components/material/GameTable/DevTools/devtools.css.js +183 -0
  52. package/dist/components/material/GameTable/DevTools/devtools.css.js.map +1 -0
  53. package/dist/components/material/GameTable/DevToolsHub.d.ts +4 -21
  54. package/dist/components/material/GameTable/DevToolsHub.js +24 -830
  55. package/dist/components/material/GameTable/DevToolsHub.js.map +1 -1
  56. package/dist/components/material/GameTable/DevToolsStyles.d.ts +67 -0
  57. package/dist/components/material/GameTable/DevToolsStyles.js +752 -0
  58. package/dist/components/material/GameTable/DevToolsStyles.js.map +1 -0
  59. package/dist/components/material/GameTable/JsonHighlighter.d.ts +3 -0
  60. package/dist/components/material/GameTable/JsonHighlighter.js +37 -0
  61. package/dist/components/material/GameTable/JsonHighlighter.js.map +1 -0
  62. package/dist/components/material/sound/bellSound.d.ts +1 -0
  63. package/dist/components/material/sound/bellSound.js +2 -0
  64. package/dist/components/material/sound/bellSound.js.map +1 -0
  65. package/dist/components/material/sound/useYourTurnSound.d.ts +4 -0
  66. package/dist/components/material/sound/useYourTurnSound.js +34 -0
  67. package/dist/components/material/sound/useYourTurnSound.js.map +1 -0
  68. package/dist/css/backgroundCss.js +3 -3
  69. package/dist/css/cursorCss.js +6 -6
  70. package/dist/css/fadeIn.js +6 -6
  71. package/dist/css/shineEffect.js +28 -28
  72. package/dist/css/transformCss.js +4 -4
  73. package/dist/hooks/LogHistoryContext.d.ts +6 -0
  74. package/dist/hooks/LogHistoryContext.js +4 -0
  75. package/dist/hooks/LogHistoryContext.js.map +1 -0
  76. package/dist/hooks/flatHistoryEngine.d.ts +37 -0
  77. package/dist/hooks/flatHistoryEngine.js +101 -0
  78. package/dist/hooks/flatHistoryEngine.js.map +1 -0
  79. package/dist/hooks/useBackgroundTabHandler.d.ts +1 -0
  80. package/dist/hooks/useBackgroundTabHandler.js +38 -0
  81. package/dist/hooks/useBackgroundTabHandler.js.map +1 -0
  82. package/dist/hooks/useFastAnimationsOnReturn.d.ts +1 -0
  83. package/dist/hooks/useFastAnimationsOnReturn.js +38 -0
  84. package/dist/hooks/useFastAnimationsOnReturn.js.map +1 -0
  85. package/dist/hooks/useFlatHistory.js +120 -44
  86. package/dist/hooks/useFlatHistory.js.map +1 -1
  87. package/dist/locators/PileLocator.d.ts +5 -0
  88. package/dist/locators/PileLocator.js +9 -1
  89. package/dist/locators/PileLocator.js.map +1 -1
  90. package/package.json +80 -79
  91. package/dist/components/material/Wheel/WheelContent.d.ts +0 -13
  92. package/dist/components/material/Wheel/WheelContent.js +0 -37
  93. package/dist/components/material/Wheel/WheelContent.js.map +0 -1
  94. package/dist/hooks/useFailures.d.ts +0 -1
  95. package/dist/hooks/useFailures.js +0 -11
  96. package/dist/hooks/useFailures.js.map +0 -1
  97. package/dist/hooks/useWebP.d.ts +0 -1
  98. package/dist/hooks/useWebP.js +0 -13
  99. package/dist/hooks/useWebP.js.map +0 -1
@@ -0,0 +1,101 @@
1
+ export const CHECKPOINT_INTERVAL = 50;
2
+ /**
3
+ * Replays moves from the nearest checkpoint to produce the game state at a given move index.
4
+ */
5
+ export const replayFromCheckpoint = (targetMoveIndex, checkpoints, allPlayedMoves, RulesClass, setup, gameOver, player, getAction) => {
6
+ let nearest;
7
+ for (let i = checkpoints.length - 1; i >= 0; i--) {
8
+ if (checkpoints[i].moveIndex <= targetMoveIndex) {
9
+ nearest = checkpoints[i];
10
+ break;
11
+ }
12
+ }
13
+ const startState = nearest ? nearest.gameState : setup;
14
+ const startIndex = nearest ? nearest.moveIndex : 0;
15
+ const tempRules = new RulesClass(JSON.parse(JSON.stringify(startState)), gameOver ? undefined : { player });
16
+ for (let i = startIndex; i < targetMoveIndex; i++) {
17
+ try {
18
+ const action = getAction(allPlayedMoves[i].actionId);
19
+ tempRules.play(JSON.parse(JSON.stringify(allPlayedMoves[i].move)), { local: action?.local });
20
+ }
21
+ catch (error) {
22
+ console.error('Error replaying move for lazy game state', error);
23
+ }
24
+ }
25
+ return JSON.parse(JSON.stringify(tempRules.game));
26
+ };
27
+ export const saveCheckpointIfNeeded = (engine, moveIndex) => {
28
+ if (moveIndex > 0 && moveIndex % CHECKPOINT_INTERVAL === 0) {
29
+ engine.checkpoints.push({
30
+ moveIndex,
31
+ gameState: JSON.parse(JSON.stringify(engine.rules.game))
32
+ });
33
+ }
34
+ };
35
+ export const playMoveOnEngine = (engine, move, getAction) => {
36
+ try {
37
+ const action = getAction(move.actionId);
38
+ engine.rules.play(JSON.parse(JSON.stringify(move.move)), { local: action?.local });
39
+ }
40
+ catch (error) {
41
+ console.error('Error while playing a move in useFlatHistory', engine.rules.game, move, error);
42
+ }
43
+ };
44
+ export const buildActionMap = (actions) => {
45
+ const map = new Map();
46
+ if (actions) {
47
+ for (const action of actions) {
48
+ if (action.id)
49
+ map.set(action.id, action);
50
+ }
51
+ }
52
+ return map;
53
+ };
54
+ export const getMoveEntry = (playedMove, moveIndex, engine, allPlayedMoves, ctx) => {
55
+ const { move, consequenceIndex } = playedMove;
56
+ const action = ctx.getAction(playedMove.actionId);
57
+ if (!action)
58
+ return undefined;
59
+ let cachedGame = undefined;
60
+ const moveComponentContext = {
61
+ move, consequenceIndex, action,
62
+ get game() {
63
+ if (cachedGame === undefined) {
64
+ cachedGame = JSON.parse(JSON.stringify(engine.rules.game));
65
+ }
66
+ return cachedGame;
67
+ }
68
+ };
69
+ const description = ctx.logs?.getMovePlayedLogDescription(move, moveComponentContext);
70
+ if (!description?.Component)
71
+ return;
72
+ const capturedMoveIndex = moveIndex;
73
+ const capturedCheckpoints = [...engine.checkpoints];
74
+ return {
75
+ ...description, move, consequenceIndex, action,
76
+ get game() {
77
+ if (cachedGame === undefined) {
78
+ cachedGame = replayFromCheckpoint(capturedMoveIndex, capturedCheckpoints, allPlayedMoves, ctx.RulesClass, ctx.setup, ctx.gameOver, ctx.player, ctx.getAction);
79
+ }
80
+ return cachedGame;
81
+ }
82
+ };
83
+ };
84
+ /**
85
+ * Processes a list of moves synchronously, returning history entries.
86
+ * This is the core logic extracted from the hook for testability.
87
+ */
88
+ export const processMovesSync = (moves, startIndex, engine, allPlayedMoves, ctx) => {
89
+ const entries = [];
90
+ let moveIndex = startIndex;
91
+ for (const move of moves) {
92
+ const entry = getMoveEntry(move, moveIndex, engine, allPlayedMoves, ctx);
93
+ if (entry)
94
+ entries.push(entry);
95
+ playMoveOnEngine(engine, move, ctx.getAction);
96
+ saveCheckpointIfNeeded(engine, moveIndex + 1);
97
+ moveIndex++;
98
+ }
99
+ return entries;
100
+ };
101
+ //# sourceMappingURL=flatHistoryEngine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flatHistoryEngine.js","sourceRoot":"","sources":["../../src/hooks/flatHistoryEngine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare const useBackgroundTabHandler: () => void;
@@ -0,0 +1,38 @@
1
+ import { isActionToAnimate, setAnimationsSpeed, store } from '@gamepark/react-client';
2
+ import { useEffect } from 'react';
3
+ const SKIP_SPEED = 0;
4
+ export const useBackgroundTabHandler = () => {
5
+ useEffect(() => {
6
+ let speededUp = false;
7
+ const onVisibilityChange = () => {
8
+ if (document.visibilityState !== 'visible')
9
+ return;
10
+ const { actions } = store.getState();
11
+ if (!actions)
12
+ return;
13
+ const hasPendingAnimations = actions.some(a => a.animation || isActionToAnimate(a));
14
+ if (hasPendingAnimations) {
15
+ speededUp = true;
16
+ store.dispatch(setAnimationsSpeed(SKIP_SPEED));
17
+ }
18
+ };
19
+ const unsubscribe = store.subscribe(() => {
20
+ if (!speededUp)
21
+ return;
22
+ const { actions } = store.getState();
23
+ if (!actions)
24
+ return;
25
+ const hasPendingAnimations = actions.some(a => a.animation || isActionToAnimate(a));
26
+ if (!hasPendingAnimations) {
27
+ speededUp = false;
28
+ store.dispatch(setAnimationsSpeed(1));
29
+ }
30
+ });
31
+ document.addEventListener('visibilitychange', onVisibilityChange);
32
+ return () => {
33
+ document.removeEventListener('visibilitychange', onVisibilityChange);
34
+ unsubscribe();
35
+ };
36
+ }, []);
37
+ };
38
+ //# sourceMappingURL=useBackgroundTabHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useBackgroundTabHandler.js","sourceRoot":"","sources":["../../src/hooks/useBackgroundTabHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAA;AACrF,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAEjC,MAAM,UAAU,GAAG,CAAC,CAAA;AAEpB,MAAM,CAAC,MAAM,uBAAuB,GAAG,GAAG,EAAE;IAC1C,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,SAAS,GAAG,KAAK,CAAA;QAErB,MAAM,kBAAkB,GAAG,GAAG,EAAE;YAC9B,IAAI,QAAQ,CAAC,eAAe,KAAK,SAAS;gBAAE,OAAM;YAClD,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAA;YACpC,IAAI,CAAC,OAAO;gBAAE,OAAM;YAEpB,MAAM,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,IAAI,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAA;YACnF,IAAI,oBAAoB,EAAE,CAAC;gBACzB,SAAS,GAAG,IAAI,CAAA;gBAChB,KAAK,CAAC,QAAQ,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC,CAAA;YAChD,CAAC;QACH,CAAC,CAAA;QAED,MAAM,WAAW,GAAG,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;YACvC,IAAI,CAAC,SAAS;gBAAE,OAAM;YACtB,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAA;YACpC,IAAI,CAAC,OAAO;gBAAE,OAAM;YAEpB,MAAM,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,IAAI,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAA;YACnF,IAAI,CAAC,oBAAoB,EAAE,CAAC;gBAC1B,SAAS,GAAG,KAAK,CAAA;gBACjB,KAAK,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAA;YACvC,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,QAAQ,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,kBAAkB,CAAC,CAAA;QACjE,OAAO,GAAG,EAAE;YACV,QAAQ,CAAC,mBAAmB,CAAC,kBAAkB,EAAE,kBAAkB,CAAC,CAAA;YACpE,WAAW,EAAE,CAAA;QACf,CAAC,CAAA;IACH,CAAC,EAAE,EAAE,CAAC,CAAA;AACR,CAAC,CAAA"}
@@ -0,0 +1 @@
1
+ export declare const useFastAnimationsOnReturn: () => void;
@@ -0,0 +1,38 @@
1
+ import { isActionToAnimate, setAnimationsSpeed, store } from '@gamepark/react-client';
2
+ import { useEffect } from 'react';
3
+ const SKIP_SPEED = 0;
4
+ export const useFastAnimationsOnReturn = () => {
5
+ useEffect(() => {
6
+ let speededUp = false;
7
+ const onVisibilityChange = () => {
8
+ if (document.visibilityState !== 'visible')
9
+ return;
10
+ const { actions } = store.getState();
11
+ if (!actions)
12
+ return;
13
+ const hasPendingAnimations = actions.some(a => a.animation || isActionToAnimate(a));
14
+ if (hasPendingAnimations) {
15
+ speededUp = true;
16
+ store.dispatch(setAnimationsSpeed(SKIP_SPEED));
17
+ }
18
+ };
19
+ const unsubscribe = store.subscribe(() => {
20
+ if (!speededUp)
21
+ return;
22
+ const { actions } = store.getState();
23
+ if (!actions)
24
+ return;
25
+ const hasPendingAnimations = actions.some(a => a.animation || isActionToAnimate(a));
26
+ if (!hasPendingAnimations) {
27
+ speededUp = false;
28
+ store.dispatch(setAnimationsSpeed(1));
29
+ }
30
+ });
31
+ document.addEventListener('visibilitychange', onVisibilityChange);
32
+ return () => {
33
+ document.removeEventListener('visibilitychange', onVisibilityChange);
34
+ unsubscribe();
35
+ };
36
+ }, []);
37
+ };
38
+ //# sourceMappingURL=useFastAnimationsOnReturn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useFastAnimationsOnReturn.js","sourceRoot":"","sources":["../../src/hooks/useFastAnimationsOnReturn.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAA;AACrF,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAEjC,MAAM,UAAU,GAAG,CAAC,CAAA;AAEpB,MAAM,CAAC,MAAM,yBAAyB,GAAG,GAAG,EAAE;IAC5C,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,SAAS,GAAG,KAAK,CAAA;QAErB,MAAM,kBAAkB,GAAG,GAAG,EAAE;YAC9B,IAAI,QAAQ,CAAC,eAAe,KAAK,SAAS;gBAAE,OAAM;YAClD,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAA;YACpC,IAAI,CAAC,OAAO;gBAAE,OAAM;YAEpB,MAAM,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,IAAI,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAA;YACnF,IAAI,oBAAoB,EAAE,CAAC;gBACzB,SAAS,GAAG,IAAI,CAAA;gBAChB,KAAK,CAAC,QAAQ,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC,CAAA;YAChD,CAAC;QACH,CAAC,CAAA;QAED,MAAM,WAAW,GAAG,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;YACvC,IAAI,CAAC,SAAS;gBAAE,OAAM;YACtB,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAA;YACpC,IAAI,CAAC,OAAO;gBAAE,OAAM;YAEpB,MAAM,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,IAAI,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAA;YACnF,IAAI,CAAC,oBAAoB,EAAE,CAAC;gBAC1B,SAAS,GAAG,KAAK,CAAA;gBACjB,KAAK,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAA;YACvC,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,QAAQ,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,kBAAkB,CAAC,CAAA;QACjE,OAAO,GAAG,EAAE;YACV,QAAQ,CAAC,mBAAmB,CAAC,kBAAkB,EAAE,kBAAkB,CAAC,CAAA;YACpE,WAAW,EAAE,CAAA;QACf,CAAC,CAAA;IACH,CAAC,EAAE,EAAE,CAAC,CAAA;AACR,CAAC,CAAA"}
@@ -1,8 +1,17 @@
1
1
  import { useGameSelector } from '@gamepark/react-client';
2
2
  import { findLastIndex } from 'es-toolkit/compat';
3
- import { useContext, useEffect, useRef, useState } from 'react';
3
+ import { useContext, useEffect, useMemo, useRef, useState } from 'react';
4
4
  import { gameContext } from '../components';
5
+ import { buildActionMap, getMoveEntry, playMoveOnEngine, processMovesSync, saveCheckpointIfNeeded } from './flatHistoryEngine';
5
6
  import { usePlayerId } from './usePlayerId';
7
+ const BATCH_TIME_BUDGET_MS = 8; // stay under 1 frame (16ms), leave room for rendering
8
+ // Polyfill for Safari
9
+ const scheduleIdle = typeof requestIdleCallback === 'function'
10
+ ? requestIdleCallback
11
+ : (cb) => setTimeout(() => cb({ timeRemaining: () => BATCH_TIME_BUDGET_MS }), 1);
12
+ const cancelIdle = typeof cancelIdleCallback === 'function'
13
+ ? cancelIdleCallback
14
+ : (id) => clearTimeout(id);
6
15
  export const useFlatHistory = () => {
7
16
  const context = useContext(gameContext);
8
17
  const player = usePlayerId();
@@ -12,32 +21,67 @@ export const useFlatHistory = () => {
12
21
  const playedMoves = useGameSelector((state) => state.playedMoves);
13
22
  const gameOver = useGameSelector((state) => state.gameOver);
14
23
  const actions = useGameSelector((state) => state.actions);
24
+ const actionMap = useMemo(() => buildActionMap(actions), [actions]);
25
+ const getAction = (actionId) => actionMap.get(actionId);
15
26
  const moves = useRef([]);
16
- const rules = useRef(null);
27
+ const engine = useRef(null);
28
+ const playedMovesRef = useRef([]);
29
+ const idleCallbackId = useRef(null);
30
+ const processingIndex = useRef(0);
31
+ const pendingEntries = useRef([]);
32
+ const pendingMoves = useRef([]);
17
33
  useEffect(() => {
18
- if (!rules.current && setup) {
19
- rules.current = new context.Rules(JSON.parse(JSON.stringify(setup)), gameOver ? undefined : { player });
34
+ if (!engine.current && setup) {
35
+ engine.current = {
36
+ rules: new context.Rules(JSON.parse(JSON.stringify(setup)), gameOver ? undefined : { player }),
37
+ checkpoints: [],
38
+ movesProcessed: 0
39
+ };
20
40
  }
21
41
  }, [setup]);
22
- const getAction = (actionId) => actions?.find((action) => action.id === actionId);
23
- const getMoveEntry = (playedMove) => {
24
- const { move, consequenceIndex } = playedMove;
25
- const action = getAction(playedMove.actionId);
26
- if (!action)
27
- return undefined;
28
- const moveComponentContext = { move, consequenceIndex, action, game: JSON.parse(JSON.stringify(rules.current.game)) };
29
- const description = context.logs?.getMovePlayedLogDescription(move, moveComponentContext);
30
- if (!description?.Component)
42
+ const makeLogContext = () => ({
43
+ logs: context.logs,
44
+ RulesClass: context.Rules,
45
+ setup,
46
+ gameOver,
47
+ player,
48
+ getAction
49
+ });
50
+ const processBatch = (deadline) => {
51
+ if (!engine.current)
31
52
  return;
32
- return { ...moveComponentContext, ...description };
33
- };
34
- const playMove = (move) => {
35
- try {
36
- const action = getAction(move.actionId);
37
- rules.current?.play(JSON.parse(JSON.stringify(move.move)), { local: action?.local });
53
+ const movesToProcess = pendingMoves.current;
54
+ const ctx = makeLogContext();
55
+ let i = processingIndex.current;
56
+ while (i < movesToProcess.length && deadline.timeRemaining() > 1) {
57
+ const move = movesToProcess[i];
58
+ const entry = getMoveEntry(move, moves.current.length + i, engine.current, playedMovesRef.current, ctx);
59
+ if (entry)
60
+ pendingEntries.current.push(entry);
61
+ playMoveOnEngine(engine.current, move, getAction);
62
+ saveCheckpointIfNeeded(engine.current, moves.current.length + i + 1);
63
+ i++;
38
64
  }
39
- catch (error) {
40
- console.error('Error while playing a move in useFlatHistory', rules.current?.game, move, error);
65
+ processingIndex.current = i;
66
+ if (i < movesToProcess.length) {
67
+ if (pendingEntries.current.length > 0) {
68
+ const entriesToFlush = pendingEntries.current;
69
+ pendingEntries.current = [];
70
+ setHistory((h) => h.concat(entriesToFlush));
71
+ }
72
+ idleCallbackId.current = scheduleIdle(processBatch);
73
+ }
74
+ else {
75
+ if (pendingEntries.current.length > 0) {
76
+ const entriesToFlush = pendingEntries.current;
77
+ pendingEntries.current = [];
78
+ setHistory((h) => h.concat(entriesToFlush));
79
+ }
80
+ const processedCount = movesToProcess.length;
81
+ moves.current = playedMovesRef.current.slice(0, moves.current.length + processedCount);
82
+ idleCallbackId.current = null;
83
+ pendingMoves.current = [];
84
+ processingIndex.current = 0;
41
85
  }
42
86
  };
43
87
  useEffect(() => {
@@ -45,45 +89,77 @@ export const useFlatHistory = () => {
45
89
  setLoaded(true);
46
90
  }, [playedMoves]);
47
91
  useEffect(() => {
48
- if (!playedMoves)
92
+ if (!playedMoves || !engine.current)
49
93
  return;
94
+ playedMovesRef.current = playedMoves;
50
95
  const actualSize = moves.current.length;
96
+ const ctx = makeLogContext();
51
97
  if (actualSize < playedMoves.length) {
98
+ if (idleCallbackId.current !== null) {
99
+ cancelIdle(idleCallbackId.current);
100
+ idleCallbackId.current = null;
101
+ }
52
102
  const newMoves = playedMoves.slice(actualSize - playedMoves.length);
53
- const entries = [];
54
- for (const move of newMoves) {
55
- const entry = getMoveEntry(move);
56
- if (entry)
57
- entries.push(entry);
58
- playMove(move);
103
+ if (newMoves.length <= 20) {
104
+ const entries = processMovesSync(newMoves, actualSize, engine.current, playedMovesRef.current, ctx);
105
+ setHistory((h) => h.concat(entries));
106
+ moves.current = playedMoves;
107
+ }
108
+ else {
109
+ pendingMoves.current = newMoves;
110
+ pendingEntries.current = [];
111
+ processingIndex.current = 0;
112
+ idleCallbackId.current = scheduleIdle(processBatch);
59
113
  }
60
- setHistory((h) => h.concat(entries));
61
114
  }
62
115
  else if (actualSize > playedMoves.length) {
116
+ if (idleCallbackId.current !== null) {
117
+ cancelIdle(idleCallbackId.current);
118
+ idleCallbackId.current = null;
119
+ }
63
120
  const firstIndexChange = moves.current.findIndex((currentMove, index) => currentMove.actionId !== playedMoves[index]?.actionId);
64
121
  const invalidatedMoves = moves.current.slice(firstIndexChange);
65
122
  const lastValidHistoryIndex = findLastIndex(history, (moveHistory) => !invalidatedMoves.some((move) => move.actionId === moveHistory.action.id));
123
+ // Use the nearest checkpoint at or before the invalidation point instead of replaying from a history entry's game state
124
+ const validCheckpoints = engine.current.checkpoints.filter((cp) => cp.moveIndex <= firstIndexChange);
125
+ const nearestCheckpoint = validCheckpoints.length > 0 ? validCheckpoints[validCheckpoints.length - 1] : undefined;
126
+ const restartState = nearestCheckpoint ? nearestCheckpoint.gameState : setup;
127
+ const restartIndex = nearestCheckpoint ? nearestCheckpoint.moveIndex : 0;
128
+ engine.current.checkpoints = validCheckpoints;
129
+ engine.current.rules = new context.Rules(JSON.parse(JSON.stringify(restartState)), gameOver ? undefined : { player });
130
+ // Replay from checkpoint to the start of remaining moves
131
+ for (let i = restartIndex; i < firstIndexChange; i++) {
132
+ playMoveOnEngine(engine.current, playedMoves[i], getAction);
133
+ }
134
+ // Find the last valid history entry that's still in the new playedMoves
66
135
  const lastValidHistory = lastValidHistoryIndex !== -1 ? history[lastValidHistoryIndex] : undefined;
67
- const previousGameState = lastValidHistory ? lastValidHistory.game : setup;
68
- rules.current = new context.Rules(JSON.parse(JSON.stringify(previousGameState)), gameOver ? undefined : { player });
69
- const movesToReplay = lastValidHistory ?
70
- playedMoves.slice(findLastIndex(playedMoves, move => move.actionId === lastValidHistory.action.id && move.consequenceIndex === lastValidHistory.consequenceIndex))
71
- : playedMoves;
72
- if (lastValidHistory) {
73
- const move = movesToReplay.shift();
74
- playMove(move);
136
+ const replayStartIndex = lastValidHistory
137
+ ? findLastIndex(playedMoves, move => move.actionId === lastValidHistory.action.id && move.consequenceIndex === lastValidHistory.consequenceIndex)
138
+ : firstIndexChange;
139
+ // Replay moves between firstIndexChange and replayStartIndex (these have valid history entries already)
140
+ for (let i = firstIndexChange; i < replayStartIndex; i++) {
141
+ playMoveOnEngine(engine.current, playedMoves[i], getAction);
75
142
  }
76
- const entries = [];
77
- for (const move of movesToReplay) {
78
- const entry = getMoveEntry(move);
79
- if (entry)
80
- entries.push(entry);
81
- playMove(move);
143
+ // Skip the last valid history move itself
144
+ if (lastValidHistory && replayStartIndex >= 0) {
145
+ playMoveOnEngine(engine.current, playedMoves[replayStartIndex], getAction);
82
146
  }
147
+ // Process remaining moves for new entries
148
+ const newMovesStart = lastValidHistory ? replayStartIndex + 1 : firstIndexChange;
149
+ const movesToProcess = playedMoves.slice(newMovesStart);
150
+ const entries = processMovesSync(movesToProcess, newMovesStart, engine.current, playedMovesRef.current, ctx);
83
151
  setHistory((h) => h.slice(0, lastValidHistoryIndex + 1).concat(entries));
152
+ moves.current = playedMoves;
84
153
  }
85
- moves.current = playedMoves;
86
154
  }, [playedMoves]);
155
+ // Cleanup on unmount
156
+ useEffect(() => {
157
+ return () => {
158
+ if (idleCallbackId.current !== null) {
159
+ cancelIdle(idleCallbackId.current);
160
+ }
161
+ };
162
+ }, []);
87
163
  return {
88
164
  history,
89
165
  isLoaded
@@ -1 +1 @@
1
- {"version":3,"file":"useFlatHistory.js","sourceRoot":"","sources":["../../src/hooks/useFlatHistory.ts"],"names":[],"mappings":"AAAA,OAAO,EAA+B,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAErF,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAC/D,OAAO,EAAE,WAAW,EAA4B,MAAM,eAAe,CAAA;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAU3C,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,EAAE;IACjC,MAAM,OAAO,GAAG,UAAU,CAAC,WAAW,CAAC,CAAA;IACvC,MAAM,MAAM,GAAG,WAAW,EAAE,CAAA;IAC5B,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAgB,EAAE,CAAC,CAAA;IACzD,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAC7C,MAAM,KAAK,GAAG,eAAe,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAA;IAC3D,MAAM,WAAW,GAAG,eAAe,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,CAAA;IACjE,MAAM,QAAQ,GAAG,eAAe,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;IAC3D,MAAM,OAAO,GAAG,eAAe,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IAEzD,MAAM,KAAK,GAAG,MAAM,CAAe,EAAE,CAAC,CAAA;IACtC,MAAM,KAAK,GAAG,MAAM,CAAQ,IAAI,CAAC,CAAA;IACjC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,EAAE,CAAC;YAC5B,KAAK,CAAC,OAAO,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAA;QACzG,CAAC;IACH,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAA;IAEX,MAAM,SAAS,GAAG,CAAC,QAAgB,EAAE,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAA;IAEzF,MAAM,YAAY,GAAG,CAAC,UAAsB,EAA2B,EAAE;QACvE,MAAM,EAAE,IAAI,EAAE,gBAAgB,EAAE,GAAG,UAAU,CAAA;QAC7C,MAAM,MAAM,GAAG,SAAS,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAA;QAC7C,IAAI,CAAC,MAAM;YAAE,OAAO,SAAS,CAAA;QAC7B,MAAM,oBAAoB,GAAG,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,CAAA;QACtH,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,EAAE,2BAA2B,CAAC,IAAI,EAAE,oBAAoB,CAAC,CAAA;QACzF,IAAI,CAAC,WAAW,EAAE,SAAS;YAAE,OAAM;QACnC,OAAO,EAAE,GAAG,oBAAoB,EAAE,GAAG,WAAW,EAAE,CAAA;IACpD,CAAC,CAAA;IAED,MAAM,QAAQ,GAAG,CAAC,IAAgB,EAAE,EAAE;QACpC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YACvC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAA;QACtF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,8CAA8C,EAAE,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAA;QACjG,CAAC;IACH,CAAC,CAAA;IAED,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,WAAW,KAAK,SAAS,IAAI,CAAC,QAAQ;YAAE,SAAS,CAAC,IAAI,CAAC,CAAA;IAC7D,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAA;IAEjB,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,WAAW;YAAE,OAAM;QACxB,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAA;QACvC,IAAI,UAAU,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC;YACpC,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC,UAAU,GAAG,WAAW,CAAC,MAAM,CAAC,CAAA;YACnE,MAAM,OAAO,GAAkB,EAAE,CAAA;YACjC,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;gBAC5B,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,CAAA;gBAChC,IAAI,KAAK;oBAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;gBAC9B,QAAQ,CAAC,IAAI,CAAC,CAAA;YAChB,CAAC;YACD,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAA;QACtC,CAAC;aAAM,IAAI,UAAU,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC;YAC3C,MAAM,gBAAgB,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,QAAQ,KAAK,WAAW,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC,CAAA;YAC/H,MAAM,gBAAgB,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAA;YAC9D,MAAM,qBAAqB,GAAG,aAAa,CAAC,OAAO,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,KAAK,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAA;YAChJ,MAAM,gBAAgB,GAAG,qBAAqB,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;YAClG,MAAM,iBAAiB,GAAG,gBAAgB,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAA;YAC1E,KAAK,CAAC,OAAO,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAA;YACnH,MAAM,aAAa,GAAG,gBAAgB,CAAC,CAAC;gBACtC,WAAW,CAAC,KAAK,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,EAAE,CAClD,IAAI,CAAC,QAAQ,KAAK,gBAAgB,CAAC,MAAM,CAAC,EAAE,IAAI,IAAI,CAAC,gBAAgB,KAAK,gBAAgB,CAAC,gBAAgB,CAC5G,CAAC;gBACF,CAAC,CAAC,WAAW,CAAA;YACf,IAAI,gBAAgB,EAAE,CAAC;gBACrB,MAAM,IAAI,GAAG,aAAa,CAAC,KAAK,EAAG,CAAA;gBACnC,QAAQ,CAAC,IAAI,CAAC,CAAA;YAChB,CAAC;YACD,MAAM,OAAO,GAAkB,EAAE,CAAA;YACjC,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;gBACjC,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,CAAA;gBAChC,IAAI,KAAK;oBAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;gBAC9B,QAAQ,CAAC,IAAI,CAAC,CAAA;YAChB,CAAC;YAED,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,qBAAqB,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAA;QAC1E,CAAC;QAED,KAAK,CAAC,OAAO,GAAG,WAAW,CAAA;IAC7B,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAA;IAEjB,OAAO;QACL,OAAO;QACP,QAAQ;KACT,CAAA;AACH,CAAC,CAAA"}
1
+ {"version":3,"file":"useFlatHistory.js","sourceRoot":"","sources":["../../src/hooks/useFlatHistory.ts"],"names":[],"mappings":"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"}
@@ -34,6 +34,11 @@ export declare class PileLocator<P extends number = number, M extends number = n
34
34
  * @returns the maximum angle of rotation of the items
35
35
  */
36
36
  getMaxAngle(_location: Location<P, L>, _context: MaterialContext<P, M, L, R, V>): number;
37
+ /**
38
+ * When true, the z-index is derived from the item's Y offset instead of the item index.
39
+ * Items with a higher Y appear on top, simulating depth perspective.
40
+ */
41
+ zFromY: boolean;
37
42
  minimumDistance: number;
38
43
  /**
39
44
  * Identifier of the pile. By default, distinct location areas (different player, id or parent) forms distinct piles.
@@ -40,6 +40,11 @@ export class PileLocator extends Locator {
40
40
  getMaxAngle(_location, _context) {
41
41
  return this.maxAngle;
42
42
  }
43
+ /**
44
+ * When true, the z-index is derived from the item's Y offset instead of the item index.
45
+ * Items with a higher Y appear on top, simulating depth perspective.
46
+ */
47
+ zFromY = false;
43
48
  minimumDistance = 0;
44
49
  /**
45
50
  * Identifier of the pile. By default, distinct location areas (different player, id or parent) forms distinct piles.
@@ -72,7 +77,10 @@ export class PileLocator extends Locator {
72
77
  }
73
78
  }
74
79
  const itemPosition = pilePositions.get(itemUniqueId);
75
- return { x: x + itemPosition.x, y: y + itemPosition.y, z: z + index * 0.05 };
80
+ const radius = this.getRadius(location, context);
81
+ const maxRadius = typeof radius === 'number' ? radius : radius.y;
82
+ const itemZ = this.zFromY ? (maxRadius > 0 ? (itemPosition.y + maxRadius) / (2 * maxRadius) : 0) : index * 0.05;
83
+ return { x: x + itemPosition.x, y: y + itemPosition.y, z: z + itemZ };
76
84
  }
77
85
  generateItemPosition(item, context) {
78
86
  const distance = Math.random();
@@ -1 +1 @@
1
- {"version":3,"file":"PileLocator.js","sourceRoot":"","sources":["../../src/locators/PileLocator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"PileLocator.js","sourceRoot":"","sources":["../../src/locators/PileLocator.ts"],"names":[],"mappings":"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"}