71 lines
2.1 KiB
TypeScript
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";
|