From 9db77779b8f928d18a5d4f7687d9ed565ed9d657 Mon Sep 17 00:00:00 2001 From: Andre Padez Date: Sun, 2 Nov 2025 16:54:43 +0000 Subject: [PATCH] feat: resurrect optimalSteps and efficiency metrics - Calculate optimal path from entrance to key to exit using maze.getDistance() - Compute efficiency as keystroke ratio to optimal steps (percentage) - Add optimalSteps and efficiency to ScoreManager return value - No game-over trigger on efficiency threshold (preserved for future use) - Metrics available for display and potential future scoring enhancements --- src/useScore/types.ts | 2 ++ src/useScore/useScore.ts | 22 +++++++++++++++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/useScore/types.ts b/src/useScore/types.ts index 91c46e8..b02a135 100644 --- a/src/useScore/types.ts +++ b/src/useScore/types.ts @@ -20,5 +20,7 @@ export type ScoreManager = { distToKey: number; distToExit: number; keystrokes: number; + optimalSteps: number; + efficiency: number; finalScore: number | null; }; diff --git a/src/useScore/useScore.ts b/src/useScore/useScore.ts index aac5c37..7d18606 100644 --- a/src/useScore/useScore.ts +++ b/src/useScore/useScore.ts @@ -1,4 +1,4 @@ -import { useEffect, useState } from "react"; +import { useEffect, useRef, useState } from "react"; import { useTimer } from "./useTimer"; import { useScoreTime } from "./useScoreTime"; import { useScorePaths } from "./useScorePaths"; @@ -32,10 +32,28 @@ export function useScore({ board, hero, gameStatusManager, keyManager, rows, col const distToExit = entranceToExit || heroToExit; const [finalScore, setFinalScore] = useState(null); + const optimalRef = useRef(0); const keystrokes = keyManager ? keyManager.keyLog.length : 0; useScoreTime({ gameStatus, timer }); + // Calculate optimal steps from entrance -> key -> exit + useEffect(() => { + const maze = board.mazeInstanceRef.current; + if (!maze) return; + + const k = maze.getDistance("entrance", "key"); + const e = maze.getDistance("key", "exit"); + const total = k + e; + + if (Number.isFinite(total) && total > 0) { + optimalRef.current = total; + } + }, [gameStatus, board.mazeInstanceRef]); + + const optimalSteps = optimalRef.current; + const efficiency = optimalSteps > 0 ? Math.round((keystrokes / optimalSteps) * 100) : 0; + useEffect(() => { if (gameStatus !== "started" && gameStatus !== "has-key") return; @@ -70,6 +88,8 @@ export function useScore({ board, hero, gameStatusManager, keyManager, rows, col distToKey, distToExit, keystrokes, + optimalSteps, + efficiency, finalScore, }; }