feat: add runtime gameInfo enrichment with gameOver condition
- Add gameOverCondition to GameManager for runtime tracking - Create enrichGameInfo() function to merge runtime condition with static gameInfo - Add formatGameOverCondition() utility to stringify boolean/function conditions - Returns enriched info with: - condition: formatted string representation - type: 'none' | 'static' | 'function' - Platform can call enrichGameInfo(gameManager) to get complete game configuration - Handles all condition types: undefined, boolean, function - Truncates long function strings at 200 chars
This commit is contained in:
+7
-2
@@ -1,4 +1,4 @@
|
|||||||
import { useGame, version, calculateMazeScore } from "../../src";
|
import { useGame, version, calculateMazeScore, type ScoreManager } from "../../src";
|
||||||
import { useKeyBindings } from "./useKeyBindings";
|
import { useKeyBindings } from "./useKeyBindings";
|
||||||
import { useIsMobile } from "./useIsMobile";
|
import { useIsMobile } from "./useIsMobile";
|
||||||
import { useMemo } from "react";
|
import { useMemo } from "react";
|
||||||
@@ -9,7 +9,12 @@ function App() {
|
|||||||
const cols = isMobile ? 12 : 32;
|
const cols = isMobile ? 12 : 32;
|
||||||
const rows = isMobile ? 8 : 24;
|
const rows = isMobile ? 8 : 24;
|
||||||
|
|
||||||
const gameManager = useGame({ cols, rows }, useKeyBindings);
|
const gameOver = (scroreManager: ScoreManager) => {
|
||||||
|
console.log('gameOver', scroreManager);
|
||||||
|
return scoreManager.efficiency < 70;
|
||||||
|
}
|
||||||
|
|
||||||
|
const gameManager = useGame({ cols, rows, gameOver }, useKeyBindings);
|
||||||
const { containerRef, gameStatus, scoreManager } = gameManager;
|
const { containerRef, gameStatus, scoreManager } = gameManager;
|
||||||
const { timeValue, keystrokes, optimalSteps, efficiency } = scoreManager;
|
const { timeValue, keystrokes, optimalSteps, efficiency } = scoreManager;
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,54 @@
|
|||||||
|
import type { GameManager } from './types';
|
||||||
|
import { gameInfo as baseGameInfo } from './gameInfo';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Format the gameOver condition as a readable string
|
||||||
|
*/
|
||||||
|
function formatGameOverCondition(condition: GameManager['gameOverCondition']): string {
|
||||||
|
if (condition === undefined) {
|
||||||
|
return 'None - game continues indefinitely';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (condition === true) {
|
||||||
|
return 'Always (immediate game over)';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (condition === false) {
|
||||||
|
return 'Never (game never ends)';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof condition === 'function') {
|
||||||
|
// Try to get the function source
|
||||||
|
const source = condition.toString();
|
||||||
|
// Clean up and format
|
||||||
|
const cleaned = source
|
||||||
|
.replace(/\s+/g, ' ')
|
||||||
|
.replace(/=>/, '→')
|
||||||
|
.trim();
|
||||||
|
return cleaned.length > 200 ? cleaned.substring(0, 197) + '...' : cleaned;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 'Unknown condition';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enrich gameInfo with runtime gameOver condition
|
||||||
|
* Returns the base gameInfo plus runtime condition info
|
||||||
|
*/
|
||||||
|
export function enrichGameInfo(gameManager: GameManager) {
|
||||||
|
const runtimeCondition = formatGameOverCondition(gameManager.gameOverCondition);
|
||||||
|
|
||||||
|
return {
|
||||||
|
...baseGameInfo,
|
||||||
|
gameOverRuntime: {
|
||||||
|
condition: runtimeCondition,
|
||||||
|
type: gameManager.gameOverCondition === undefined
|
||||||
|
? 'none'
|
||||||
|
: typeof gameManager.gameOverCondition === 'boolean'
|
||||||
|
? 'static'
|
||||||
|
: 'function',
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export { formatGameOverCondition };
|
||||||
@@ -3,6 +3,7 @@ export * from './useGame';
|
|||||||
export * from './useGameStatus';
|
export * from './useGameStatus';
|
||||||
export { gameInfo } from './gameInfo';
|
export { gameInfo } from './gameInfo';
|
||||||
export { calculateMazeScore } from './useScore';
|
export { calculateMazeScore } from './useScore';
|
||||||
|
export { enrichGameInfo, formatGameOverCondition } from './formatGameInfo';
|
||||||
import { version } from '../package.json';
|
import { version } from '../package.json';
|
||||||
export type { GameInfo } from './gameInfo';
|
export type { GameInfo } from './gameInfo';
|
||||||
export { version };
|
export { version };
|
||||||
|
|||||||
@@ -29,4 +29,5 @@ export type GameManager = {
|
|||||||
hero: HeroManager;
|
hero: HeroManager;
|
||||||
renderer: HeroRenderManager;
|
renderer: HeroRenderManager;
|
||||||
scoreManager: ScoreManager;
|
scoreManager: ScoreManager;
|
||||||
|
gameOverCondition?: boolean | ((scoreManager: ScoreManager) => boolean);
|
||||||
} & GameStatusManager & GameKeyManager;
|
} & GameStatusManager & GameKeyManager;
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ export function useGame(options: GameOptions, platformHook?: unknown): GameManag
|
|||||||
hero,
|
hero,
|
||||||
renderer,
|
renderer,
|
||||||
scoreManager,
|
scoreManager,
|
||||||
|
gameOverCondition: gameOver,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (typeof platformHook === 'function') {
|
if (typeof platformHook === 'function') {
|
||||||
|
|||||||
Reference in New Issue
Block a user