UI component for the main menu. Defines available game modes, handles UI interactions like opening settings, changing language and volume, plays UI sounds, and starts a selected mode or loads a scene.
using System;
using System.Collections.Generic;
using Sandbox;
using Sandbox.UI;
namespace Sandbox;
public partial class MainMenu
{
[Property] public SoundEvent HoverSound { get; set; }
[Property] public SoundEvent ClickSound { get; set; }
public record ModeItem(
string Id,
string TitleKey,
string TagKey,
string DescKey,
string Icon,
string ScenePath,
string Category,
string TipKey,
GameMode ModeEnum,
string[] HighlightsRu,
string[] HighlightsEn
);
private readonly List<ModeItem> Modes = new()
{
new(
"sumo",
"sumo_title",
"sumo_tag",
"sumo_desc",
"🤼♂️",
"scenes/onemore.scene",
"ARENA BRAWL",
"tip_sumo",
GameMode.SumoPush,
new[] { "🔥 Сужающаяся платформа", "⚡ Физика толчков", "🌪️ Аномалии" },
new[] { "🔥 Shrinking Arena", "⚡ Push Physics", "🌪️ Weather Anomalies" }
),
new(
"nextbot",
"nextbot_title",
"nextbot_tag",
"nextbot_desc",
"🏃♂️",
"scenes/OneMoreS2.scene",
"SURVIVAL",
"tip_nextbot",
GameMode.NextbotRun,
new[] { "🏃 Механики Evade", "🆘 Спасение тиммейтов", "💀 Умный AI" },
new[] { "🏃 Evade Movement", "🆘 Teammate Revive", "💀 Smart AI" }
)
};
private bool IsSettingsOpen { get; set; } = false;
private float Volume { get; set; } = 1.0f;
private bool IsRussian => ModeController.Instance?.CurrentLanguage == GameLanguage.Russian;
private string[] GetHighlights( ModeItem mode ) => IsRussian ? mode.HighlightsRu : mode.HighlightsEn;
private int GetHighScore() => SaveManager.Current?.HighScore ?? 0;
private int GetTotalPushes() => SaveManager.Current?.TotalPushes ?? 0;
protected override void OnStart()
{
base.OnStart();
SaveManager.Load();
}
private void PlayHoverSound()
{
var sound = HoverSound ?? ClickSound;
if ( sound != null )
Sound.Play( sound );
else
Sound.Play( "music/buttonhover.sound" );
}
private void PlayClickSound()
{
if ( ClickSound != null )
Sound.Play( ClickSound );
else
Sound.Play( "music/buttonhover.sound" );
}
private void StartLoadingMode( ModeItem mode )
{
Log.Info( $"[MainMenu] Launching mode: {mode.ModeEnum}, Scene: {mode.ScenePath}" );
MusicManager.StopAllMusic();
if ( ModeController.Instance != null )
{
ModeController.Instance.SelectMode( mode.ModeEnum );
}
else if ( !string.IsNullOrEmpty( mode.ScenePath ) )
{
Game.ActiveScene.LoadFromFile( mode.ScenePath );
}
}
private void OnSettingsClicked()
{
ToggleSettings();
}
private void OnCloseSettingsClicked()
{
ToggleSettings();
}
private void OnLangClicked()
{
OnToggleLanguage();
}
private void OnQuitClicked()
{
Game.Close();
}
private void OnVolumeBtnClicked( float val )
{
SetVolume( val );
}
private void SetLanguage( GameLanguage lang )
{
if ( ModeController.Instance != null )
{
ModeController.Instance.CurrentLanguage = lang;
}
}
private void ToggleSettings()
{
if ( !IsSettingsOpen && ModeController.Instance != null )
Volume = ModeController.Instance.MasterVolume;
IsSettingsOpen = !IsSettingsOpen;
}
private void SetVolume( float val )
{
Volume = val;
if ( ModeController.Instance != null )
{
ModeController.Instance.MasterVolume = val;
}
}
private void OnToggleLanguage()
{
if ( ModeController.Instance != null )
{
ModeController.Instance.ToggleLanguage();
}
}
private void OnMusicToggle( bool enable )
{
PushHud.EnableMusic = enable;
MusicManager.Instance?.ToggleMusic( enable );
StateHasChanged();
}
private string GetText( string key )
{
return ModeController.Instance?.GetText( key ) ?? key;
}
}