StatusPanelUI.cs 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. using UnityEngine;
  2. namespace MazeGen
  3. {
  4. /// <summary>
  5. /// Displays simulation status: elapsed time, agents finished/dead count, level completion state.
  6. /// Also owns the simulation controls (pause/resume, speed adjust, fight pause toggle, watch/log mode).
  7. /// </summary>
  8. public class StatusPanelUI
  9. {
  10. private float targetFinishedAgentCount;
  11. private float timeLimitSeconds;
  12. private CombatDirector director;
  13. private MazeCameraController cameraController;
  14. private Bounds mazeBounds;
  15. public StatusPanelUI(float targetFinished, float timeLimit, CombatDirector combatDirector, MazeCameraController camera, Bounds bounds)
  16. {
  17. targetFinishedAgentCount = targetFinished;
  18. timeLimitSeconds = timeLimit;
  19. director = combatDirector;
  20. cameraController = camera;
  21. mazeBounds = bounds;
  22. }
  23. public void Draw(float elapsedTime, int totalAgents, int finishedCount, int deadCount, bool levelEnded, System.Action onZoomToFit)
  24. {
  25. GUILayout.BeginArea(new Rect(10, 10, 280, Screen.height - 20), GUI.skin.box);
  26. // Elapsed time display
  27. string timeLabel = timeLimitSeconds > 0f ? $"{elapsedTime:0.0}s / {timeLimitSeconds:0.0}s" : $"{elapsedTime:0.0}s";
  28. GUILayout.Label($"Elapsed: {timeLabel}");
  29. // Finished/dead count
  30. string finishLabel = targetFinishedAgentCount > 0 ? $"{finishedCount} / {(int)targetFinishedAgentCount}" : $"{finishedCount}";
  31. GUILayout.Label($"Finished: {finishLabel} Dead: {deadCount}");
  32. // Level completion status
  33. if (levelEnded)
  34. GUILayout.Label("LEVEL COMPLETE", GUI.skin.box);
  35. GUILayout.Space(4);
  36. DrawSimulationControls();
  37. GUILayout.Space(4);
  38. if (GUILayout.Button("Zoom to fit maze"))
  39. onZoomToFit?.Invoke();
  40. GUILayout.EndArea();
  41. }
  42. private void DrawSimulationControls()
  43. {
  44. bool paused = SimulationClock.IsPaused;
  45. GUILayout.Label(paused ? $"PAUSED ({SimulationClock.HoldSummary ?? "manual"})" : $"Running at {SimulationClock.TimeScale:0.0}x", GUI.skin.box);
  46. GUILayout.BeginHorizontal();
  47. if (GUILayout.Button(SimulationClock.UserPaused ? "Resume (space)" : "Pause (space)"))
  48. SimulationClock.UserPaused = !SimulationClock.UserPaused;
  49. if (GUILayout.Button("0.5x")) SimulationClock.TimeScale = 0.5f;
  50. if (GUILayout.Button("1x")) SimulationClock.TimeScale = 1f;
  51. if (GUILayout.Button("4x")) SimulationClock.TimeScale = 4f;
  52. GUILayout.EndHorizontal();
  53. director.PauseOnFightDeclared = GUILayout.Toggle(director.PauseOnFightDeclared, " Pause when a fight is declared");
  54. GUILayout.BeginHorizontal();
  55. GUILayout.Label("On join window end:", GUILayout.Width(120f));
  56. bool watch = director.TimeoutResolution == CombatViewMode.Watch;
  57. if (GUILayout.Button(watch ? "Watch fight" : "Log only"))
  58. director.TimeoutResolution = watch ? CombatViewMode.Simulate : CombatViewMode.Watch;
  59. GUILayout.EndHorizontal();
  60. }
  61. }
  62. }