ui/Panels/TimerPanel.razor
@using Sandbox;
@using Sandbox.UI;
@namespace SS1
@inherits Panel
@attribute [StyleSheet("TimerPanel.razor.scss")]

<root>
	@{
		var manager = Manager.Instance;
		var player = manager.Player;
		TimeSpan time;

		if(manager.IsGameOver)
		{
			time = manager.HasSpawnedBoss
				? TimeSpan.FromSeconds(manager.FinalRunTime)
				: TimeSpan.FromSeconds(player.Stats[PlayerStat.BossArrivalTime]) - TimeSpan.FromSeconds(manager.FinalRunTime);
		} 
		else
		{
			time = manager.HasSpawnedBoss
				? TimeSpan.FromSeconds(manager.ElapsedTime.Relative) //TimeSpan.FromSeconds(manager.TimeSinceRunStart.Relative)
				: TimeSpan.FromSeconds(player.Stats[PlayerStat.BossArrivalTime]) - TimeSpan.FromSeconds(manager.ElapsedTime.Relative);
		}
	}

	@if(time.TotalMinutes >= 0)
	{
		<div class="timer_label @(manager.HasSpawnedBoss ? "red" : "white")">
			@(time.TotalSeconds > 3600 ? time.ToString(@"hh\:mm\:ss") : time.ToString(@"mm\:ss"))
		</div>
	}

	@{
		if(manager.IsGameOver || manager.IsPauseMenuOpen || !manager.Player.IsChoosingLevelUpReward || !(manager.Player.Stats[PlayerStat.PauseWhileChoosing] > 0f))
			return;

		var runTime = TimeSpan.FromSeconds(manager.TimeSinceRunStart.Relative);
		string runTimeStr = runTime.TotalSeconds > 3600 ? runTime.ToString(@"hh\:mm\:ss") : runTime.ToString(@"mm\:ss");
	}

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

@code
{
	public Player Player { get; set; }

	protected override int BuildHash()
	{
		var manager = Manager.Instance;
		var seconds = MathX.FloorToInt(manager.ElapsedTime.Relative);
		var runTime = !manager.IsPauseMenuOpen && !manager.IsGameOver && manager.Player.IsChoosingLevelUpReward && manager.Player.Stats[PlayerStat.PauseWhileChoosing] > 0f
			? manager.TimeSinceRunStart.Relative
			: 0f;

		return HashCode.Combine(
			seconds,
			runTime,
			manager.IsPauseMenuOpen,
			manager.Player.IsChoosingLevelUpReward,
			manager.Player.Stats[PlayerStat.PauseWhileChoosing],
			manager.Player.Stats[PlayerStat.BossArrivalTime],
			manager.IsGameOver
		);
	}
}