A UI Razor panel for selecting game difficulty. It shows left/right buttons, current difficulty label and description, handles controller input, updates DifficultyTracker and MenuManager, and records selected difficulty to Sandbox.Services.Stats.
@using Sandbox;
@using Sandbox.UI;
@namespace SS1
@inherits Panel
@attribute [StyleSheet("DifficultyPanel.razor.scss")]
<root>
@{
int diff = DifficultyTracker.Instance.Difficulty;
}
<div class="difficulty_button @(diff <= Manager.MinDifficulty ? "disabled_button" : "")" onclick="@(() => ButtonLeft())">
@if(Input.UsingController && CanDecreaseDifficulty) { <InputHint Button=@LEFT_ACTION /> }
else { @("-") }
</div>
<div class="middle">
<div class="difficulty_label" style="color:@(Manager.GetDifficultyLabelColor(diff).Rgba);">@Manager.GetNameForDifficulty(diff)</div>
<div class="description">@Manager.GetDescriptionForDifficulty(diff)</div>
</div>
<div class="difficulty_button @(diff >= Manager.MaxDifficulty ? "disabled_button" : (MenuManager.Instance.HighestDifficultyBeaten >= diff) ? "" : "locked_button" )" style="opacity:@(diff == Manager.MaxDifficulty ? 0f : 1f);" onclick="@(() => ButtonRight())">
@if(Input.UsingController && CanIncreaseDifficulty) { <InputHint Button=@RIGHT_ACTION /> }
else { @((MenuManager.Instance.HighestDifficultyBeaten >= diff ? (diff == Manager.MaxDifficulty ? "x" : "+") : " ")) }
</div>
</root>
@code
{
const string LEFT_ACTION = "Slot4";
const string RIGHT_ACTION = "Slot2";
bool CanDecreaseDifficulty => DifficultyTracker.Instance.Difficulty > Manager.MinDifficulty;
bool CanIncreaseDifficulty => DifficultyTracker.Instance.Difficulty < Manager.MaxDifficulty && MenuManager.Instance.HighestDifficultyBeaten >= DifficultyTracker.Instance.Difficulty;
public override void Tick()
{
base.Tick();
if (!Input.UsingController || !(MainMenu.Instance?.CanUseButtons ?? false))
return;
if (Input.Pressed(LEFT_ACTION) && CanDecreaseDifficulty) { Sound.Play("ui.button.press"); ButtonLeft(); }
else if (Input.Pressed(RIGHT_ACTION) && CanIncreaseDifficulty) { Sound.Play("ui.button.press"); ButtonRight(); }
}
protected override int BuildHash()
{
return HashCode.Combine(
DifficultyTracker.Instance.Difficulty,
MenuManager.Instance.HighestDifficultyBeaten,
Input.UsingController
);
}
void ButtonLeft()
{
DifficultyTracker.Instance.Difficulty = Math.Max(DifficultyTracker.Instance.Difficulty - 1, Manager.MinDifficulty);
Sandbox.Services.Stats.SetValue("selected_difficulty", DifficultyTracker.Instance.Difficulty);
MenuManager.Instance.SetDifficulty(DifficultyTracker.Instance.Difficulty);
}
void ButtonRight()
{
DifficultyTracker.Instance.Difficulty = Math.Min(DifficultyTracker.Instance.Difficulty + 1, Manager.MaxDifficulty);
Sandbox.Services.Stats.SetValue("selected_difficulty", DifficultyTracker.Instance.Difficulty);
MenuManager.Instance.SetDifficulty(DifficultyTracker.Instance.Difficulty);
}
}