MainMenu.razor.cs

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.

File Access
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;
    }
}