Files
vim-maze/src_old/useGame/useGame.ts
T
2025-10-17 03:07:07 +01:00

71 lines
2.1 KiB
TypeScript

import { useMaze } from "./useMaze";
import { usePlayer } from "./usePlayer";
import { useGameStatus } from "./useGameStatus";
import { useHeroRender } from "./useHeroRender";
import { useScore } from "../useScore";
import type { UseScoreType } from '../types'
import { useKeyBindings, type UseKeyBindingsType } from "./useKeyBindings";
export function useGame(cols: number, rows: number, platformHook?: unknown) {
const mazeManager = useMaze(cols, rows);
const playerManager = usePlayer(mazeManager);
const gameManager = useGameStatus(mazeManager, playerManager);
useHeroRender({ mazeManager, playerManager });
const { render } = mazeManager;
const { movePlayer } = playerManager;
const { gameStatus, setGameStatus, startGame, stopGame } = gameManager;
const { containerRef } = mazeManager;
// 🎮 key bindings integrated
const keyBindings: UseKeyBindingsType = useKeyBindings({
gameManager: {
movePlayer: (dr: number, dc: number, count: number = 1) =>
movePlayer(dr, dc, count, gameStatus, setGameStatus),
gameStatus,
mazeManager,
playerManager,
} as any, // minimal shape needed by useKeyBindings
});
// 🏆 scoring integrated — pass the full context it needs (incl. maze/player)
const scoreManager: UseScoreType = useScore({
gameContext: {
gameStatus,
setGameStatus,
stopGame,
mazeManager, // <-- provide for useScorePaths
playerManager, // <-- provide for step counting
},
keyManager: { keyLog: keyBindings.keyLog }, // minimal info; avoids type cycles
});
const fullGameManager = {
containerRef,
gameStatus,
mazeManager,
playerManager,
render,
startGame,
togglePause,
movePlayer: (dr: number, dc: number, count: number = 1) =>
movePlayer(dr, dc, count, gameStatus, setGameStatus),
stopGame,
// key bindings
...keyBindings,
// scoring
scoreManager,
};
if (typeof platformHook === 'function') {
platformHook(fullGameManager);
}
return fullGameManager;
}
export type { GameStatus } from "../types";