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

59 lines
1.7 KiB
TypeScript

import { useEffect, useState } from "react";
import type { GameStatus } from "../types";
// explicit so as not to break with circular deps, but should be UseGameType
type UseScorePathsParams = {
gameManager: {
gameStatus: GameStatus;
mazeManager: {
mazeInstanceRef: { current: any };
};
playerManager: {
playerPos: { r: number; c: number } | null;
};
};
};
export function useScorePaths({ gameManager }: UseScorePathsParams) {
const { gameStatus } = gameManager;
const { mazeInstanceRef } = gameManager.mazeManager;
const { playerPos } = gameManager.playerManager;
const [distances, setDistances] = useState({
entranceToKey: Infinity,
entranceToExit: Infinity,
heroToKey: Infinity,
heroToExit: Infinity,
});
// 🧭 1️⃣ Calculate static distances (entrance-based) when game starts
useEffect(() => {
if (gameStatus !== "started") return;
const maze = mazeInstanceRef.current;
if (!maze) return;
setDistances((prev) => ({
...prev,
entranceToKey: maze.getDistance("entrance", "key"),
entranceToExit: maze.getDistance("entrance", "exit"),
}));
}, [gameStatus, mazeInstanceRef]);
// 🚶 2️⃣ Update dynamic distances (hero-based) on every move
useEffect(() => {
const maze = mazeInstanceRef.current;
if (!maze || !playerPos) return;
setDistances((prev) => ({
...prev,
heroToKey: maze.getDistance("hero", "key", [playerPos.r, playerPos.c]),
heroToExit: maze.getDistance("hero", "exit", [playerPos.r, playerPos.c]),
}));
}, [playerPos, mazeInstanceRef]);
return distances;
}
export type UseScorePathsReturn = ReturnType<typeof useScorePaths>;