UI/Foundation/OMRSceneFlow.cs
using Sandbox;

public enum OMRGameplayEntry
{
	None,
	FindMatch,
	BotMatch,
	SandboxSetup
}

public enum OMRMenuPreviewPage
{
	Home,
	Play,
	Practice,
	Settings
}

/// <summary>
/// Carries a one-shot local menu intent across the startup-menu to gameplay
/// scene transition. It never stores match state and never replaces the
/// authoritative RoundManager/GameFlowManager flow.
/// </summary>
public static class OMRSceneFlow
{
	// Local explanation survives a clean scene reload after a lost session.
	public static string SessionNotice { get; set; } = "";
	private static OMRGameplayEntry _pendingEntry;

	// Practice-vs-bot preference must survive the menu.scene -> main.scene handoff.
	// This is local UI state only; RoundManager remains authoritative once gameplay starts.
	public static OMRBotDifficulty BotMatchDifficulty { get; set; } = OMRBotDifficulty.Hard;

	public static void CycleBotMatchDifficulty( int delta )
	{
		int count = System.Enum.GetValues<OMRBotDifficulty>().Length;
		if ( count <= 0 ) return;
		int next = ( (int)BotMatchDifficulty + delta ) % count;
		if ( next < 0 ) next += count;
		BotMatchDifficulty = (OMRBotDifficulty)next;
	}

	public static string GetBotMatchDifficultyName() =>
		BotMatchDifficulty.ToString().ToUpperInvariant();

	public static void RequestGameplayEntry( OMRGameplayEntry entry )
	{
		_pendingEntry = entry;
	}

	public static OMRGameplayEntry ConsumeGameplayEntry()
	{
		OMRGameplayEntry entry = _pendingEntry;
		_pendingEntry = OMRGameplayEntry.None;
		return entry;
	}
}