A Razor UI component for the in-game pause menu. It shows pause controls (Resume, Quit), displays WM and Tofu counts, high score, best time, and simple how-to-play text. It toggles pause on Escape and sets Scene.TimeScale to freeze/unfreeze the game, and can load a specified scene on Quit.
@using Sandbox;
@using Sandbox.UI;
@inherits PanelComponent
@namespace Sandbox
<root class="@(IsPaused ? "" : "hide")">
<h2>PAUSED</h2>
<div class="options">
<div class="button" onclick=@OnResume>
Resume
</div>
<div class="button" onclick=@Quit>
Quit
</div>
</div>
</root>
<root>
<div class="totalWM">
<p>🍉 @ScoreManager.WMCount/10</p>
</div>
</root>
<root>
<div class="totaltofu">
<p>⬜ @ScoreManager.TofuCount/10</p>
</div>
</root>
<root>
<div class="highscore">
<p>High Score: @ScoreManager.HighScore</p>
</div>
</root>
<root>
<div class="besttime">
<p>Best Time: @BestTimeString()</p>
</div>
</root>
<root>
<div class="howtoplay">
<p>Press A & D to move.</p>
<p>Press Space to jump.</p>
<p>Press Shift to dodge.</p>
</div>
</root>
@code
{
[Property] public SceneFile nextscene { get; set; }
public bool IsPaused { get; set; }
protected override void OnUpdate()
{
base.OnUpdate();
if(Input.EscapePressed)
{
IsPaused = !IsPaused;
}
Scene.TimeScale = IsPaused ? 0 : 1;
}
void OnResume()
{
IsPaused = false;
}
void Quit()
{
Scene.Load(nextscene);
}
public string BestTimeString()
{
var time = ScoreManager.BestTime;
var minutes = (int)time / 60;
var seconds = (int)time % 60;
return $"{minutes:00}:{seconds:00}";
}
protected override int BuildHash() => System.HashCode.Combine(IsPaused);
}