using UnityEngine; namespace MazeGen { /// /// Displays simulation status: elapsed time, agents finished/dead count, level completion state. /// Also owns the simulation controls (pause/resume, speed adjust, fight pause toggle, watch/log mode). /// public class StatusPanelUI { private float targetFinishedAgentCount; private float timeLimitSeconds; private CombatDirector director; private MazeCameraController cameraController; private Bounds mazeBounds; public StatusPanelUI(float targetFinished, float timeLimit, CombatDirector combatDirector, MazeCameraController camera, Bounds bounds) { targetFinishedAgentCount = targetFinished; timeLimitSeconds = timeLimit; director = combatDirector; cameraController = camera; mazeBounds = bounds; } public void Draw(float elapsedTime, int totalAgents, int finishedCount, int deadCount, bool levelEnded, System.Action onZoomToFit) { GUILayout.BeginArea(new Rect(10, 10, 280, Screen.height - 20), GUI.skin.box); // Elapsed time display string timeLabel = timeLimitSeconds > 0f ? $"{elapsedTime:0.0}s / {timeLimitSeconds:0.0}s" : $"{elapsedTime:0.0}s"; GUILayout.Label($"Elapsed: {timeLabel}"); // Finished/dead count string finishLabel = targetFinishedAgentCount > 0 ? $"{finishedCount} / {(int)targetFinishedAgentCount}" : $"{finishedCount}"; GUILayout.Label($"Finished: {finishLabel} Dead: {deadCount}"); // Level completion status if (levelEnded) GUILayout.Label("LEVEL COMPLETE", GUI.skin.box); GUILayout.Space(4); DrawSimulationControls(); GUILayout.Space(4); if (GUILayout.Button("Zoom to fit maze")) onZoomToFit?.Invoke(); GUILayout.EndArea(); } private void DrawSimulationControls() { bool paused = SimulationClock.IsPaused; GUILayout.Label(paused ? $"PAUSED ({SimulationClock.HoldSummary ?? "manual"})" : $"Running at {SimulationClock.TimeScale:0.0}x", GUI.skin.box); GUILayout.BeginHorizontal(); if (GUILayout.Button(SimulationClock.UserPaused ? "Resume (space)" : "Pause (space)")) SimulationClock.UserPaused = !SimulationClock.UserPaused; if (GUILayout.Button("0.5x")) SimulationClock.TimeScale = 0.5f; if (GUILayout.Button("1x")) SimulationClock.TimeScale = 1f; if (GUILayout.Button("4x")) SimulationClock.TimeScale = 4f; GUILayout.EndHorizontal(); director.PauseOnFightDeclared = GUILayout.Toggle(director.PauseOnFightDeclared, " Pause when a fight is declared"); GUILayout.BeginHorizontal(); GUILayout.Label("On join window end:", GUILayout.Width(120f)); bool watch = director.TimeoutResolution == CombatViewMode.Watch; if (GUILayout.Button(watch ? "Watch fight" : "Log only")) director.TimeoutResolution = watch ? CombatViewMode.Simulate : CombatViewMode.Watch; GUILayout.EndHorizontal(); } } }