ui/PanelComponents/PauseMenu.razor

A Razor UI panel component for the pause menu. It displays difficulty, title (Menu or Paused), run time, and buttons for Resume, Restart and Quit to Main Menu, and handles gamepad input and button actions to resume, restart or load the main menu scene.

File Access
@using Sandbox;
@using Sandbox.UI;
@namespace SS1
@inherits PanelComponent

@*<root class="@(Manager.Instance.IsPauseMenuOpen && !Manager.Instance.IsGameOver ? "show" : "")">*@
<root class="@(Manager.Instance.IsPauseMenuOpen ? "show" : "")">

	@if(Manager.Instance.Difficulty != 0) {
		<label class="difficulty" style="color:@(Manager.GetDifficultyLabelColor(Manager.Instance.Difficulty).Rgba);">@Manager.GetNameForDifficulty(Manager.Instance.Difficulty)</label>
	}

	<label class="title">@(Manager.Instance.NumPlayers > 1 ? "Menu" : "Paused")</label>

	@{
		var time = Manager.Instance.IsGameOver
			? TimeSpan.FromSeconds( Manager.Instance.FinalRunTime )
			: TimeSpan.FromSeconds( Manager.Instance.TimeSinceRunStart.Relative );

		string timeStr = time.TotalSeconds > 3600 ? time.ToString(@"hh\:mm\:ss") : time.ToString(@"mm\:ss");
	}

	<label class="timer">@($"Run Time\n{timeStr}")</label>

	<div class="content">
		<button onclick=@(() => Manager.Instance.SetPaused(false))>
			@if(Input.UsingController) { <InputHint class="@(_resumeButton.IsHeld ? "pressed" : "")" Button=@_resumeButton.Action /> }
			Resume
		</button>
		<button class="red" onclick=@(() => Restart())>
			@if(Input.UsingController) { <InputHint class="@(_restartButton.IsHeld ? "pressed" : "")" Button=@_restartButton.Action /> }
			Restart
		</button>
		<button class="red" onclick=@(() => ReturnToMainMenu())>
			@if(Input.UsingController) { <InputHint class="@(_quitButton.IsHeld ? "pressed" : "")" Button=@_quitButton.Action /> }
			Quit to Main Menu
		</button>
	</div>
</root>

@code
{
	public static PauseMenu Instance { get; private set; }
	[Property] SceneFile GameScene { get; set; }
	[Property] SceneFile MenuScene { get; set; }

	protected override void OnAwake()
	{
		Instance = this;
	}

	readonly GamepadButton _resumeButton = new("Back");
	readonly GamepadButton _restartButton = new("reload");
	readonly GamepadButton _quitButton = new("use");

	protected override void OnUpdate()
	{
		base.OnUpdate();

		bool isOpen = Manager.Instance.IsPauseMenuOpen;

		if ( _resumeButton.Update( isOpen ) ) Manager.Instance.SetPaused( false );
		else if ( _restartButton.Update( isOpen ) ) Restart();
		else if ( _quitButton.Update( isOpen ) ) ReturnToMainMenu();
	}

	public void Restart()
	{
		// Game.ActiveScene.Load(GameScene);
		Manager.Instance.Restart();
	}

	public void ReturnToMainMenu()
	{
		Game.ActiveScene.Load(MenuScene);
	}

	protected override int BuildHash()
	{
		var time = Manager.Instance.IsGameOver
			? TimeSpan.FromSeconds( Manager.Instance.FinalRunTime )
			: TimeSpan.FromSeconds( Manager.Instance.TimeSinceRunStart.Relative );

		return System.HashCode.Combine(
			Manager.Instance.IsPauseMenuOpen,
			time.Seconds,
			Input.UsingController,
			_resumeButton.IsHeld,
			_restartButton.IsHeld,
			_quitButton.IsHeld
		);
	}
}