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.
@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
);
}
}