using Noesis; using System; using System.IO; using UnityEngine; using GUI = Noesis.GUI; using NoesisEventArgs = Noesis.EventArgs; using SystemEventArgs = System.EventArgs; using Grid = Noesis.Grid; namespace StellarConquest.Presentation.Unity.UI { [AssetDependency] public partial class ButtonPanelControl : UserControl { public event EventHandler PlayButtonClicked; public event EventHandler CreditsButtonClicked; public event EventHandler DesignerButtonClicked; public event EventHandler SettingsButtonClicked; public event EventHandler LocalizationButtonClicked; public event EventHandler ResumeButtonClicked; public event EventHandler ConquestButtonClicked; public event EventHandler SurvivalButtonClicked; public event EventHandler CreativeButtonClicked; public event EventHandler LoadButtonClicked; public event EventHandler JoinButtonClicked; public event EventHandler BackButtonClicked; private FrameworkElement _Root; private BorderControlBorderless _BorderControl; private StackPanel _PlayStackPanel1; private Button _PlayButton; private Button _OptionsButton; private Button _CreditsButton; private Button _QuitButton; private StackPanel _PlayStackPanel2; private Button _ResumeButton; private Grid _ConquestButtonGrid; private Button _ConquestButton; private Button _SurvivalButton; private Button _CreativeButton; private Button _CustomButton; private Button _DesignerButton; private Button _LocalizationButton; private Button _LoadButton; private Button _JoinButton; private Button _BackButton; private NewsControl _NewsControl; public ButtonPanelControl() { if (!Application.isPlaying) return; Initialized += OnInitialized; InitializeComponent(); } private void InitializeComponent() { GUI.LoadComponent(this, "Assets/User Interface/Screens/Title/Button Panel/ButtonPanelControl.xaml"); _Root = Content as FrameworkElement; _BorderControl = _Root.FindName(nameof(_BorderControl)) as BorderControlBorderless; _PlayStackPanel1 = _Root.FindName(nameof(_PlayStackPanel1)) as StackPanel; _PlayButton = _Root.FindName("_PlayButton") as Button; _OptionsButton = _Root.FindName("_OptionsButton") as Button; _CreditsButton = _Root.FindName("_CreditsButton") as Button; _QuitButton = _Root.FindName("_QuitButton") as Button; _PlayStackPanel2 = _Root.FindName(nameof(_PlayStackPanel2)) as StackPanel; _ResumeButton = _Root.FindName(nameof(_ResumeButton)) as Button; _ConquestButtonGrid = _Root.FindName(nameof(_ConquestButtonGrid)) as Grid; _ConquestButton = _Root.FindName(nameof(_ConquestButton)) as Button; _SurvivalButton = _Root.FindName(nameof(_SurvivalButton)) as Button; _CreativeButton = _Root.FindName(nameof(_CreativeButton)) as Button; _CustomButton = _Root.FindName(nameof(_CustomButton)) as Button; _DesignerButton = _Root.FindName("_DesignerButton") as Button; _LocalizationButton = _Root.FindName("_LocalizationButton") as Button; _LoadButton = _Root.FindName("_LoadButton") as Button; _JoinButton = _Root.FindName("_JoinButton") as Button; _BackButton = _Root.FindName(nameof(_BackButton)) as Button; if (Application.isConsolePlatform || Application.isMobilePlatform) _QuitButton.Visibility = Visibility.Collapsed; _ConquestButton.IsEnabled = false; _LoadButton.Visibility = Visibility.Collapsed; } private void OnInitialized(object sender, NoesisEventArgs args) { _PlayButton.Click += (sender2, e2) => { SoundEffect.PlayUI(SoundEffects.UserInterface.ButtonClick(), 0.25f); PlayButtonClicked(sender, SystemEventArgs.Empty); if (RuntimeSettings.Instance.IsDeveloperMode) _LocalizationButton.Visibility = Visibility.Visible; else _LocalizationButton.Visibility = Visibility.Collapsed; }; _OptionsButton.Click += (sender2, e2) => { SoundEffect.PlayUI(SoundEffects.UserInterface.ButtonClick(), 0.25f); SettingsButtonClicked(sender, SystemEventArgs.Empty); }; _CreditsButton.Click += (sender2, e2) => { SoundEffect.PlayUI(SoundEffects.UserInterface.ButtonClick(), 0.25f); CreditsButtonClicked(sender, SystemEventArgs.Empty); }; _ResumeButton.MouseEnter += (sender2, e2) => { _NewsControl.Update($"Resume game '{PlayerPreferences.Instance.PreviousGameName}'."); }; _ResumeButton.Click += (sender2, e2) => { IsHitTestVisible = false; SoundEffect.PlayUI(SoundEffects.UserInterface.ButtonClick(), 0.25f); ResumeButtonClicked(sender, SystemEventArgs.Empty); }; _ConquestButtonGrid.MouseEnter += (sender2, e2) => { string text = "Join a community of empire builders and [b]CONQUER[/b] an unending universe." + Environment.NewLine + Environment.NewLine + "• Limitless Galaxies" + Environment.NewLine + "• Limitless Players (Internet)" + Environment.NewLine + "• Context-Aware Colonist Dialogue (LLM)"; if (SessionState.Instance.ServerVersion == null) text += Environment.NewLine + Environment.NewLine + "[i]CONQUEST is down for maintenance and will be back up shortly.[/i]"; else if (SessionState.Instance.ClientVersion != SessionState.Instance.ServerVersion) text += Environment.NewLine + Environment.NewLine + $"[i]UPDATE to version {SessionState.Instance.ServerVersion} to play CONQUEST.[/i]"; _NewsControl.Update(text); }; _ConquestButton.Click += (sender2, e2) => { IsHitTestVisible = false; SoundEffect.PlayUI(SoundEffects.UserInterface.ButtonClick(), 0.25f); ConquestButtonClicked(sender, SystemEventArgs.Empty); }; _SurvivalButton.MouseEnter += (sender2, e2) => _NewsControl.Update( "Build an empire alone or with a team of friends witin a single hostile galaxy." + Environment.NewLine + Environment.NewLine + "• Single Galaxy" + Environment.NewLine + "• 1 to 16 Players (Local or Internet)"); _SurvivalButton.Click += (sender2, e2) => { IsHitTestVisible = false; SoundEffect.PlayUI(SoundEffects.UserInterface.ButtonClick(), 0.25f); SurvivalButtonClicked(this, SystemEventArgs.Empty); }; _CreativeButton.MouseEnter += (sender2, e2) => _NewsControl.Update( "Construct and manage an empire without the threat of conflict." + Environment.NewLine + Environment.NewLine + "• Single Galaxy" + Environment.NewLine + "• 1 to 16 Players (Local or Internet)"); _CreativeButton.Click += (sender2, e2) => { IsHitTestVisible = false; SoundEffect.PlayUI(SoundEffects.UserInterface.ButtonClick(), 0.25f); CreativeButtonClicked(this, SystemEventArgs.Empty); }; _CustomButton.MouseEnter += (sender2, e2) => _NewsControl.Update( "Create a [b]NEW GAME[/b] in [b]SURVIVAL[/b] or [b]CREATIVE[/b] mode." + Environment.NewLine + Environment.NewLine + "• Single Galaxy" + Environment.NewLine + "• 1 to 32 Players (Local or Internet)"); _CustomButton.Click += (sender2, e2) => { IsHitTestVisible = false; SoundEffect.PlayUI(SoundEffects.UserInterface.ButtonClick(), 0.25f); SurvivalButtonClicked(sender, SystemEventArgs.Empty); }; _DesignerButton.MouseEnter += (sender2, e2) => _NewsControl.Update( "[b]DESIGN[/b] starship, space station, and building blueprints."); _DesignerButton.Click += (sender2, e2) => { IsHitTestVisible = false; SoundEffect.PlayUI(SoundEffects.UserInterface.ButtonClick(), 0.25f); DesignerButtonClicked(sender, SystemEventArgs.Empty); }; _LocalizationButton.MouseEnter += (sender2, e2) => _NewsControl.Update( "[b]LOCALIZE[/b] game content to supported languages."); _LocalizationButton.Click += (sender2, e2) => { IsHitTestVisible = false; SoundEffect.PlayUI(SoundEffects.UserInterface.ButtonClick(), 0.25f); LocalizationButtonClicked(sender, SystemEventArgs.Empty); }; _LoadButton.MouseEnter += (sender2, e2) => _NewsControl.Update("[b]LOAD[/b] an existing game."); _LoadButton.Click += (sender2, e2) => { IsHitTestVisible = false; SoundEffect.PlayUI(SoundEffects.UserInterface.ButtonClick(), 0.25f); LoadButtonClicked(sender, SystemEventArgs.Empty); }; _JoinButton.MouseEnter += (sender2, e2) => _NewsControl.Update( "[b]JOIN[/b] an existing game (Local or Internet)."); _JoinButton.Click += (sender2, e2) => { IsHitTestVisible = false; SoundEffect.PlayUI(SoundEffects.UserInterface.ButtonClick(), 0.25f); JoinButtonClicked(sender, SystemEventArgs.Empty); }; _BackButton.MouseEnter += (sender2, e2) => _NewsControl.Update(string.Empty); _BackButton.Click += (sender2, e2) => { SoundEffect.PlayUI(SoundEffects.UserInterface.ButtonClick(), 0.25f); BackButtonClicked(this, SystemEventArgs.Empty); _PlayStackPanel1.Visibility = Visibility.Visible; _PlayStackPanel2.Visibility = Visibility.Collapsed; _BorderControl.Resize(); }; _QuitButton.Click += (sender2, e2) => { Application.Quit(); }; } public void SetPlayButtonEnabled(bool isEnabled) { _PlayButton.IsEnabled = isEnabled; } public void SetPlayButtonText(string text) { _PlayButton.Content = text; } public void SetDesignerButtonEnabled(bool isEnabled) { _DesignerButton.IsEnabled = isEnabled; } public void SetConquestButtonEnabled(bool isEnabled) { isEnabled = isEnabled && SessionState.Instance.ClientVersion == SessionState.Instance.ServerVersion; _ConquestButton.IsEnabled = isEnabled; if (isEnabled && InputManager.Instance != null && InputManager.Instance.HasGamepad) _ConquestButton.Focus(); } public void Register(NewsControl newsControl) { _NewsControl = newsControl; } public void ShowTitleOptions() { IsHitTestVisible = true; _PlayStackPanel1.Visibility = Visibility.Visible; _PlayStackPanel2.Visibility = Visibility.Collapsed; _BorderControl.Resize(); } public void ShowPlayOptions() { IsHitTestVisible = true; _PlayStackPanel1.Visibility = Visibility.Collapsed; _PlayStackPanel2.Visibility = Visibility.Visible; string previousGame = PlayerPreferences.Instance.PreviousGameName; if (string.IsNullOrEmpty(previousGame) || !ServerControl.SavedGameExists(previousGame)) _ResumeButton.Visibility = Visibility.Collapsed; else _ResumeButton.Visibility = Visibility.Visible; DirectoryInfo savedGames = new DirectoryInfo(RuntimeSettings.Instance.SavedGamesPath); if (savedGames.Exists && savedGames.GetDirectories().Length > 0) _LoadButton.Visibility = Visibility.Visible; else _LoadButton.Visibility = Visibility.Collapsed; _NewsControl.Update("Select Game Type"); _BorderControl.Resize(); } } }