ui/Panels/DifficultyPanel.razor

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.

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