StartScreen.razor
@using Sandbox;
@using Sandbox.UI;
@using System;
@inherits PanelComponent
<root>
<!-- Your Game Score / Fill Bars -->
<div class="hud">
<div class="bar-container">
<label class="bar-label">Fill Progress</label>
<div class="bar-track">
<div class="bar-fill fill-bar" style="width: @(GetFillPercentage())%;"></div>
</div>
</div>
<div class="bar-container">
<label class="bar-label">Pour Budget</label>
<div class="bar-track">
<div class="bar-fill pour-bar" style="width: @(GetBudgetPercentage())%;"></div>
</div>
</div>
</div>
<!-- Start Screen Overlay -->
<div class="start-screen-overlay @(IsWaitingToStart() ? "" : "hidden")">
<div class="title-container">
<h1>BOTTOMS UP</h1>
<p class="subtitle">Pour the drink into the mouth. Don't run out of juice!</p>
</div>
<div class="instructions-box">
<h2>How to Play</h2>
<ul>
<li><strong>Tilt the Bottle:</strong> Move your mouse to tilt the bottle.</li>
<li><strong>Score Points:</strong> Land droplets successfully in the mouth target.</li>
<li><strong>Watch the Budget:</strong> If you run out of pour budget before hitting the goal, you fail!</li>
</ul>
</div>
<div class="prompt">
<span class="click-text">CLICK LEFT MOUSE BUTTON TO START</span>
</div>
</div>
</root>
@code {
private bool IsWaitingToStart()
{
var roundManager = Scene.GetAllComponents<RoundManager>().FirstOrDefault();
return roundManager == null || roundManager.CurrentState == RoundManager.State.WaitingToStart;
}
private float GetFillPercentage()
{
var pour = Scene.GetAllComponents<PourController>().FirstOrDefault();
if ( pour == null ) return 0;
return MathF.Min( 100f, (pour.FillProgress / pour.FillGoal) * 100f );
}
private float GetBudgetPercentage()
{
var pour = Scene.GetAllComponents<PourController>().FirstOrDefault();
if ( pour == null ) return 0;
return MathF.Min( 100f, (pour.TotalPoured / pour.PourBudget) * 100f );
}
protected override int BuildHash()
{
return HashCode.Combine(IsWaitingToStart(), GetFillPercentage(), GetBudgetPercentage());
}
}