| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- using UnityEngine;
- namespace MazeGen
- {
- /// <summary>
- /// 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).
- /// </summary>
- 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();
- }
- }
- }
|