ui/TimerPanel.razor

A Razor UI panel that displays a game timer and optionally a difficulty label. It computes the time string and progress toward a boss spawn each Tick and combines manager state for UI rebuild hashing.

NetworkingFile Access
@namespace Sandbox
@using Sandbox;
@using Sandbox.UI;
@using System;
@inherits Panel
@attribute [StyleSheet("TimerPanel.razor.scss")]

<root>
	<div class="container">
		@*<div class="bar" style="opacity:@(Progress < 1f ? 1f : 0f);">
			<div class="fill" style="width:@((Progress.Clamp(0f, 1f)) * 100)%;"></div>
		</div>*@
		<div class="time" style="color: @(Manager.Instance.HasSpawnedBoss ? "#ff9999cc" : "#eeffeebb");">@TimerString</div>

		@if(Manager.Instance.Difficulty > 0 && (Manager.Instance.IsPaused || Manager.Instance.IsEscMenuOpen || Manager.Instance.ShouldShowGameOverScreen || Manager.Instance.IsOptionsMenuOpen))
		{
			<div class="difficulty" style="color:@(Color.Lerp(Manager.GetDifficultyLabelColor(Manager.Instance.Difficulty), Color.White, 0.35f).Rgba);">@Manager.GetNameForDifficulty(Manager.Instance.Difficulty)</div>
		}
	</div>
</root>

@code {
	public string TimerString { get; set; }
	public float Progress { get; set; }

	public override void Tick()
	{
		base.Tick();

		var bossTime = Manager.Instance.BossSpawnTime;
		var elapsedTime = Manager.Instance.ElapsedTime.Relative;
		TimeSpan time;

		if(Manager.Instance.IsGameOver)
		{
			time = Manager.Instance.HasSpawnedBoss
				? TimeSpan.FromSeconds(Manager.Instance.GameOverTime)
				: TimeSpan.FromSeconds(Manager.Instance.BossSpawnTime) - TimeSpan.FromSeconds(Manager.Instance.GameOverTime);
		}
		else
		{
			time = Manager.Instance.HasSpawnedBoss
				? TimeSpan.FromSeconds(Manager.Instance.ElapsedTime.Relative)
				: TimeSpan.FromSeconds(Manager.Instance.BossSpawnTime) - TimeSpan.FromSeconds(Manager.Instance.ElapsedTime.Relative);
		}

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

		Progress = elapsedTime / bossTime;
	}

	protected override int BuildHash()
	{
		var manager = Manager.Instance;

		return HashCode.Combine(
			manager.ElapsedTime.Relative,
			manager.BossSpawnTime,
			manager.IsPaused,
			manager.IsEscMenuOpen,
			manager.ShouldShowGameOverScreen,
			manager.IsOptionsMenuOpen,
			manager.IsGameOver,
			manager.GameOverTime
		);
	}
}