示例#1
0
        public static void LanGameOptionsMenuSystem(Control control, WndWindowMessage message, ControlCallbackContext context)
        {
            logger.Info($"Have message {message.MessageType} for control {control.Name}");
            if (!GameOptions.HandleSystem(control, message, context))
            {
                switch (message.MessageType)
                {
                case WndWindowMessageType.SelectedButton:
                    switch (message.Element.Name)
                    {
                    case "LanGameOptionsMenu.wnd:ButtonBack":
                        context.Game.LobbyManager.Stop();
                        context.WindowManager.SetWindow(@"Menus\LanLobbyMenu.wnd");
                        // TODO: Go back to Single Player sub-menu
                        break;

                    default:
                        logger.Warn($"No callback for {message.Element.Name}");
                        break;
                    }
                    break;
                }
            }
        }
示例#2
0
        public static void MainMenuSystem(Control control, WndWindowMessage message, ControlCallbackContext context)
        {
            void QueueTransition(string transition)
            {
                context.WindowManager.TransitionManager.QueueTransition(null, control.Window, transition);
            }

            switch (message.MessageType)
            {
            case WndWindowMessageType.SelectedButton:
                switch (message.Element.Name)
                {
                case "MainMenu.wnd:ButtonSinglePlayer":
                    QueueTransition("MainMenuDefaultMenuBack");
                    QueueTransition("MainMenuSinglePlayerMenu");
                    break;

                case "MainMenu.wnd:ButtonSkirmish":
                    context.WindowManager.SetWindow(@"Menus\SkirmishGameOptionsMenu.wnd");
                    break;

                case "MainMenu.wnd:ButtonSingleBack":
                    QueueTransition("MainMenuSinglePlayerMenuBack");
                    QueueTransition("MainMenuDefaultMenu");
                    break;

                case "MainMenu.wnd:ButtonMultiplayer":
                    QueueTransition("MainMenuDefaultMenuBack");
                    QueueTransition("MainMenuMultiPlayerMenu");
                    break;

                case "MainMenu.wnd:ButtonMultiBack":
                    QueueTransition("MainMenuMultiPlayerMenuReverse");
                    QueueTransition("MainMenuDefaultMenu");
                    break;

                case "MainMenu.wnd:ButtonLoadReplay":
                    QueueTransition("MainMenuDefaultMenuBack");
                    QueueTransition("MainMenuLoadReplayMenu");
                    break;

                case "MainMenu.wnd:ButtonLoadReplayBack":
                    QueueTransition("MainMenuLoadReplayMenuBack");
                    QueueTransition("MainMenuDefaultMenu");
                    break;

                case "MainMenu.wnd:ButtonReplay":
                    context.WindowManager.SetWindow(@"Menus\ReplayMenu.wnd");
                    break;

                case "MainMenu.wnd:ButtonOptions":
                    context.WindowManager.PushWindow(@"Menus\OptionsMenu.wnd");
                    break;

                case "MainMenu.wnd:ButtonCredits":
                    context.WindowManager.SetWindow(@"Menus\CreditsMenu.wnd");
                    break;

                case "MainMenu.wnd:ButtonExit":
                    var exitWindow = context.WindowManager.PushWindow(@"Menus\QuitMessageBox.wnd");
                    exitWindow.Controls.FindControl("QuitMessageBox.wnd:StaticTextTitle").Text = "EXIT?";
                    ((Label)exitWindow.Controls.FindControl("QuitMessageBox.wnd:StaticTextTitle")).TextAlignment = TextAlignment.Leading;
                    exitWindow.Controls.FindControl("QuitMessageBox.wnd:StaticTextMessage").Text = "Are you sure you want to exit?";
                    exitWindow.Controls.FindControl("QuitMessageBox.wnd:ButtonOk").Show();
                    exitWindow.Controls.FindControl("QuitMessageBox.wnd:ButtonOk").Text = "YES";
                    exitWindow.Controls.FindControl("QuitMessageBox.wnd:ButtonCancel").Show();
                    exitWindow.Controls.FindControl("QuitMessageBox.wnd:ButtonCancel").Text = "NO";
                    break;
                }
                break;
            }
        }
示例#3
0
        public static void ReplayMenuSystem(Control control, WndWindowMessage message, ControlCallbackContext context)
        {
            switch (message.MessageType)
            {
            case WndWindowMessageType.SelectedButton:
                switch (message.Element.Name)
                {
                case "ReplayMenu.wnd:ButtonLoadReplay":
                    // TODO: Handle no selected item.

                    var listBox = (ListBox)control.Window.Controls.FindControl("ReplayMenu.wnd:ListboxReplayFiles");
                    using (var fileSystem = GetReplaysFileSystem(context.Game))
                    {
                        var replayFileEntry = fileSystem.GetFile((string)listBox.Items[listBox.SelectedIndex].DataItem);

                        context.Game.Scene2D.WndWindowManager.PopWindow();

                        context.Game.LoadReplayFile(replayFileEntry);
                    }

                    break;

                case "ReplayMenu.wnd:ButtonBack":
                    context.WindowManager.SetWindow(@"Menus\MainMenu.wnd");
                    // TODO: Go back to Replay sub-menu
                    break;
                }
                break;
            }
        }
示例#4
0
 public static void JoinGame(ControlCallbackContext context, IPEndPoint endPoint)
 {
     context.Game.SkirmishManager = new SkirmishManager.Client(context.Game, endPoint);
     context.WindowManager.SetWindow(@"Menus\LanGameOptionsMenu.wnd");
 }
示例#5
0
        public static void LanLobbyMenuSystem(Control control, WndWindowMessage message, ControlCallbackContext context)
        {
            switch (message.MessageType)
            {
            case WndWindowMessageType.SelectedButton:
                logger.Info($"Have message {message.MessageType} for control {message.Element.Name}");
                switch (message.Element.Name)
                {
                case "LanLobbyMenu.wnd:ButtonBack":
                    LeaveLobby(context);
                    context.WindowManager.SetWindow(@"Menus\MainMenu.wnd");
                    // TODO: Go back to Multiplayer sub-menu
                    break;

                case "LanLobbyMenu.wnd:ButtonHost":
                    context.Game.SkirmishManager = new SkirmishManager.Host(context.Game);
                    context.WindowManager.SetWindow(@"Menus\LanGameOptionsMenu.wnd");
                    break;

                case "LanLobbyMenu.wnd:ButtonJoin":

                    var listBoxGames = (ListBox)control.Window.Controls.FindControl(ListBoxGamesPrefix);

                    if (listBoxGames.SelectedIndex < 0)
                    {
                        return;
                    }

                    var selectedItemIndex = listBoxGames.SelectedIndex;
                    var selectedItem      = listBoxGames.Items[selectedItemIndex];

                    var player = (LobbyPlayer)selectedItem.DataItem;

                    logger.Info($"Requesting to join {player.EndPoint}");

                    context.Game.SkirmishManager = new SkirmishManager.Client(context.Game, player.EndPoint);

                    context.WindowManager.SetWindow(@"Menus\LanGameOptionsMenu.wnd");
                    break;

                case "LanLobbyMenu.wnd:ButtonDirectConnect":
                    context.WindowManager.SetWindow(@"Menus\NetworkDirectConnect.wnd");
                    break;
                }
                break;
            }
        }
 public static void OptionsMenuSystem(Control control, WndWindowMessage message, ControlCallbackContext context)
 {
     switch (message.MessageType)
     {
     case WndWindowMessageType.SelectedButton:
         switch (message.Element.Name)
         {
         case "OptionsMenu.wnd:ButtonBack":
             context.WindowManager.PopWindow();
             break;
         }
         break;
     }
 }
示例#7
0
 public static void CreditsMenuInput(Control control, WndWindowMessage message, ControlCallbackContext context)
 {
     //switch (message.MessageType)
     //{
     //    case WndWindowMessageType.KeyDown:
     //        if (message.Key == Key.Escape)
     //        {
     //            context.WindowManager.SetWindow(@"Menus\MainMenu.wnd");
     //        }
     //        break;
     //}
 }
        public static async void LanGameOptionsMenuSystem(Control control, WndWindowMessage message, ControlCallbackContext context)
        {
            Logger.Trace($"Have message {message.MessageType} for control {control.Name}");
            if (!await GameOptions.HandleSystemAsync(control, message, context))
            {
                switch (message.MessageType)
                {
                case WndWindowMessageType.SelectedButton:
                    switch (message.Element.Name)
                    {
                    case "LanGameOptionsMenu.wnd:ButtonBack":
                        context.Game.SkirmishManager.Stop();

                        if (UPnP.Status == UPnPStatus.PortsForwarded)
                        {
                            await UPnP.RemovePortForwardingAsync();
                        }

                        context.WindowManager.SetWindow(@"Menus\LanLobbyMenu.wnd");
                        break;

                    default:
                        Logger.Warn($"No callback for {message.Element.Name}");
                        break;
                    }
                    break;
                }
            }
        }
示例#9
0
        public static void ControlBarSystem(Control control, WndWindowMessage message, ControlCallbackContext context)
        {
            switch (message.MessageType)
            {
            case WndWindowMessageType.SelectedButton:
                switch (message.Element.Name)
                {
                case "ControlBar.wnd:ButtonLarge":
                    ((GeneralsControlBar)context.Game.Scene2D.ControlBar).ToggleSize();
                    break;

                case "ControlBar.wnd:ButtonOptions":
                    context.WindowManager.PushWindow("Menus/QuitMenu.wnd");
                    break;
                }
                break;
            }
        }
示例#10
0
        public static void QuitMessageBoxSystem(Control control, WndWindowMessage message, ControlCallbackContext context)
        {
            switch (message.MessageType)
            {
            case WndWindowMessageType.SelectedButton:
                switch (message.Element.Name)
                {
                case "QuitMessageBox.wnd:ButtonCancel":
                    context.WindowManager.PopWindow();
                    break;

                case "QuitMessageBox.wnd:ButtonOk":
                    // TODO: Cleanup resources before closing window.
                    context.Game.Window.Close();
                    break;
                }
                break;
            }
        }
示例#11
0
        public static void MainMenuSystem(Control control, WndWindowMessage message, ControlCallbackContext context)
        {
            void QueueTransition(string transition)
            {
                context.WindowManager.TransitionManager.QueueTransition(null, control.Window, transition);
            }

            void OpenSinglePlayerSideMenu(string side, string sideWindowSuffix)
            {
                _currentSide             = side;
                _currentSideWindowSuffix = sideWindowSuffix;

                var selectDifficultyLabel = (Label)control.Window.Controls.FindControl("MainMenu.wnd:StaticTextSelectDifficulty");

                // TODO: This should be animated as part of the transition.
                selectDifficultyLabel.Opacity     = 1;
                selectDifficultyLabel.TextOpacity = 1;
                selectDifficultyLabel.Show();

                QueueTransition("MainMenuSinglePlayerMenuBack");
                QueueTransition($"MainMenuDifficultyMenu{sideWindowSuffix}");
            }

            var translation = context.Game.ContentManager.TranslationManager;

            switch (message.MessageType)
            {
            case WndWindowMessageType.SelectedButton:
                switch (message.Element.Name)
                {
                case "MainMenu.wnd:ButtonSinglePlayer":
                    QueueTransition("MainMenuDefaultMenuBack");
                    QueueTransition("MainMenuSinglePlayerMenu");
                    break;

                case "MainMenu.wnd:ButtonTRAINING":
                    OpenSinglePlayerSideMenu("TRAINING", "Training");
                    break;

                case "MainMenu.wnd:ButtonChina":
                    OpenSinglePlayerSideMenu("China", "China");
                    break;

                case "MainMenu.wnd:ButtonGLA":
                    OpenSinglePlayerSideMenu("GLA", "GLA");
                    break;

                case "MainMenu.wnd:ButtonUSA":
                    OpenSinglePlayerSideMenu("USA", "US");
                    break;

                case "MainMenu.wnd:ButtonEasy":
                case "MainMenu.wnd:ButtonMedium":
                case "MainMenu.wnd:ButtonHard":
                    context.Game.StartCampaign(_currentSide);
                    break;

                case "MainMenu.wnd:ButtonDiffBack":
                    QueueTransition($"MainMenuDifficultyMenu{_currentSideWindowSuffix}Back");
                    QueueTransition($"MainMenuSinglePlayer{_currentSideWindowSuffix}MenuFromDiff");
                    break;

                case "MainMenu.wnd:ButtonSkirmish":
                    context.WindowManager.SetWindow(@"Menus\SkirmishGameOptionsMenu.wnd");
                    break;

                case "MainMenu.wnd:ButtonSingleBack":
                    QueueTransition("MainMenuSinglePlayerMenuBack");
                    QueueTransition("MainMenuDefaultMenu");
                    break;

                case "MainMenu.wnd:ButtonMultiplayer":
                    QueueTransition("MainMenuDefaultMenuBack");
                    QueueTransition("MainMenuMultiPlayerMenu");
                    break;

                case "MainMenu.wnd:ButtonNetwork":
                    context.WindowManager.SetWindow(@"Menus\LanLobbyMenu.wnd");
                    break;

                case "MainMenu.wnd:ButtonMultiBack":
                    QueueTransition("MainMenuMultiPlayerMenuReverse");
                    QueueTransition("MainMenuDefaultMenu");
                    break;

                case "MainMenu.wnd:ButtonLoadReplay":
                    QueueTransition("MainMenuDefaultMenuBack");
                    QueueTransition("MainMenuLoadReplayMenu");
                    break;

                case "MainMenu.wnd:ButtonLoadReplayBack":
                    QueueTransition("MainMenuLoadReplayMenuBack");
                    QueueTransition("MainMenuDefaultMenu");
                    break;

                case "MainMenu.wnd:ButtonReplay":
                    context.WindowManager.SetWindow(@"Menus\ReplayMenu.wnd");
                    break;

                case "MainMenu.wnd:ButtonLoadGame":
                    context.WindowManager.SetWindow(@"Menus\SaveLoad.wnd");
                    break;

                case "MainMenu.wnd:ButtonOptions":
                    context.WindowManager.PushWindow(@"Menus\OptionsMenu.wnd");
                    break;

                case "MainMenu.wnd:ButtonCredits":
                    context.WindowManager.SetWindow(@"Menus\CreditsMenu.wnd");
                    break;

                case "MainMenu.wnd:ButtonExit":
                    var exitWindow = context.WindowManager.PushWindow(@"Menus\QuitMessageBox.wnd");
                    exitWindow.Controls.FindControl("QuitMessageBox.wnd:StaticTextTitle").Text = "GUI:QuitPopupTitle".Translate();
                    ((Label)exitWindow.Controls.FindControl("QuitMessageBox.wnd:StaticTextTitle")).TextAlignment = TextAlignment.Leading;
                    exitWindow.Controls.FindControl("QuitMessageBox.wnd:StaticTextMessage").Text = "GUI:QuitPopupMessage".Translate();
                    exitWindow.Controls.FindControl("QuitMessageBox.wnd:ButtonOk").Show();
                    exitWindow.Controls.FindControl("QuitMessageBox.wnd:ButtonOk").Text = "GUI:Yes".Translate();
                    exitWindow.Controls.FindControl("QuitMessageBox.wnd:ButtonCancel").Show();
                    exitWindow.Controls.FindControl("QuitMessageBox.wnd:ButtonCancel").Text = "GUI:No".Translate();
                    break;
                }
                break;
            }
        }
示例#12
0
        protected override void DefaultInputOverride(WndWindowMessage message, ControlCallbackContext context)
        {
            // TODO: Capture input on mouse down.
            // TODO: Only fire click event when mouse was pressed and released inside same button.

            switch (message.MessageType)
            {
            case WndWindowMessageType.MouseUp:
                context.WindowManager.Focus(this);
                Click?.Invoke(this, EventArgs.Empty);
                break;

            case WndWindowMessageType.MouseEnter:
            case WndWindowMessageType.MouseMove:
            case WndWindowMessageType.MouseExit:
            case WndWindowMessageType.MouseDown:

                break;

            case WndWindowMessageType.KeyDown:
                if (!IsReadOnly)
                {
                    switch (message.Key)
                    {
                    case Veldrid.Key.A:
                    case Veldrid.Key.B:
                    case Veldrid.Key.C:
                    case Veldrid.Key.D:
                    case Veldrid.Key.E:
                    case Veldrid.Key.F:
                    case Veldrid.Key.G:
                    case Veldrid.Key.H:
                    case Veldrid.Key.I:
                    case Veldrid.Key.J:
                    case Veldrid.Key.K:
                    case Veldrid.Key.L:
                    case Veldrid.Key.M:
                    case Veldrid.Key.N:
                    case Veldrid.Key.O:
                    case Veldrid.Key.P:
                    case Veldrid.Key.Q:
                    case Veldrid.Key.R:
                    case Veldrid.Key.S:
                    case Veldrid.Key.T:
                    case Veldrid.Key.U:
                    case Veldrid.Key.V:
                    case Veldrid.Key.W:
                    case Veldrid.Key.X:
                    case Veldrid.Key.Y:
                    case Veldrid.Key.Z:
                        Text += message.Key;
                        break;

                    case Veldrid.Key.Space:
                        Text += " ";
                        break;

                    case Veldrid.Key.Minus:
                        Text += "-";
                        break;

                    case Veldrid.Key.Number0:
                    case Veldrid.Key.Number1:
                    case Veldrid.Key.Number2:
                    case Veldrid.Key.Number3:
                    case Veldrid.Key.Number4:
                    case Veldrid.Key.Number5:
                    case Veldrid.Key.Number6:
                    case Veldrid.Key.Number7:
                    case Veldrid.Key.Number8:
                    case Veldrid.Key.Number9:
                        Text += message.Key.ToString().Substring(6, 1);
                        break;


                    case Veldrid.Key.BackSpace:
                        if (Text != "")
                        {
                            Text = Text.Substring(0, Text.Length - 1);
                        }
                        break;
                    }
                }
                break;

            default:
                logger.Info($"Unhandled event: {message.MessageType} {message.Element} {message.MousePosition} {message.Key}");
                break;
            }
        }
示例#13
0
 public static void CreditsMenuInput(Control control, WndWindowMessage message, ControlCallbackContext context)
 {
     switch (message.MessageType)
     {
     case WndWindowMessageType.KeyDown:
         if (message.Key == Key.Escape)
         {
             //Should load a loading screen
             context.WindowManager.SetWindow(@"Menus\MainMenu.wnd");
         }
         break;
     }
 }
示例#14
0
        public static void ControlBarSystem(Control control, WndWindowMessage message, ControlCallbackContext context)
        {
            switch (message.MessageType)
            {
            case WndWindowMessageType.SelectedButton:
                switch (message.Element.Name)
                {
                case "ControlBar.wnd:ButtonLarge":
                    ((GeneralsControlBar)context.Game.Scene2D.ControlBar).ToggleSize();
                    break;

                case "ControlBar.wnd:ButtonOptions":
                    context.WindowManager.PushWindow(Path.Combine("Menus", "QuitMenu.wnd"));
                    break;

                case "ControlBar.wnd:ButtonGeneral":
                    var window = context.WindowManager.PushWindow("GeneralsExpPoints.wnd");
                    GeneralsExpPointsCallbacks.SetWindow(window);
                    break;
                }
                break;
            }
        }
示例#15
0
        public static void LanMapSelectMenuSystem(Control control, WndWindowMessage message, ControlCallbackContext context)
        {
            switch (message.MessageType)
            {
            case WndWindowMessageType.SelectedButton:
                switch (message.Element.Name)
                {
                case "LanMapSelectMenu.wnd:ButtonBack":
                    LanGameOptionsMenuCallbacks.GameOptions.CloseMapSelection(context);
                    break;

                case "LanMapSelectMenu.wnd:ButtonOK":
                    LanGameOptionsMenuCallbacks.GameOptions.SetCurrentMap(_previewMap);
                    LanGameOptionsMenuCallbacks.GameOptions.CloseMapSelection(context);
                    break;
                }
                break;
            }
        }
示例#16
0
        public static void ReplayMenuSystem(Control control, WndWindowMessage message, ControlCallbackContext context)
        {
            switch (message.MessageType)
            {
            case WndWindowMessageType.SelectedButton:
                switch (message.Element.Name)
                {
                case "ReplayMenu.wnd:ButtonLoadReplay":
                    // TODO: Handle no selected item.

                    var        listBox = (ListBox)control.Window.Controls.FindControl("ReplayMenu.wnd:ListboxReplayFiles");
                    ReplayFile replayFile;
                    using (var fileSystem = GetReplaysFileSystem(context.Game))
                    {
                        var replayFileEntry = fileSystem.GetFile((string)listBox.Items[listBox.SelectedIndex].DataItem);
                        replayFile = ReplayFile.FromFileSystemEntry(replayFileEntry);
                    }

                    // TODO: This probably isn't right.
                    var mapFilenameParts = replayFile.Header.Metadata.MapFile.Split('/');
                    var mapFilename      = $"Maps\\{mapFilenameParts[1]}\\{mapFilenameParts[1]}.map";

                    context.Game.Scene2D.WndWindowManager.PopWindow();

                    // TODO: set the correct factions & colors
                    PlayerSetting[] pSettings = new[]
                    {
                        new PlayerSetting("America", new ColorRgb(255, 0, 0)),
                        new PlayerSetting("Observer", new ColorRgb(255, 255, 255)),
                    };

                    context.Game.StartMultiPlayerGame(
                        mapFilename,
                        new ReplayConnection(replayFile),
                        pSettings,
                        0);

                    break;

                case "ReplayMenu.wnd:ButtonBack":
                    context.WindowManager.SetWindow(@"Menus\MainMenu.wnd");
                    // TODO: Go back to Replay sub-menu
                    break;
                }
                break;
            }
        }
 public static void SkirmishGameOptionsMenuSystem(Control control, WndWindowMessage message, ControlCallbackContext context)
 {
     if (!GameOptions.HandleSystem(control, message, context))
     {
         switch (message.MessageType)
         {
         case WndWindowMessageType.SelectedButton:
             switch (message.Element.Name)
             {
             case "SkirmishGameOptionsMenu.wnd:ButtonBack":
                 context.WindowManager.SetWindow(@"Menus\MainMenu.wnd");
                 // TODO: Go back to Single Player sub-menu
                 break;
             }
             break;
         }
     }
 }
示例#18
0
        public static void NetworkDirectConnectSystem(Control control, WndWindowMessage message, ControlCallbackContext context)
        {
            switch (message.MessageType)
            {
            case WndWindowMessageType.SelectedButton:
                switch (message.Element.Name)
                {
                case "NetworkDirectConnect.wnd:ButtonBack":
                    context.WindowManager.SetWindow(@"Menus\LanLobbyMenu.wnd");
                    break;

                case "NetworkDirectConnect.wnd:ButtonHost":
                    NetworkUtils.HostGame(context, control.Window.Tag);
                    break;

                case "NetworkDirectConnect.wnd:ButtonJoin":
                    var comboboxRemoteIp = (ComboBox)control.Window.Controls.FindControl(ComboboxRemoteIPPrefix);
                    if (System.Net.IPAddress.TryParse(comboboxRemoteIp.Controls[0].Text, out var ipAddress))
                    {
                        var endPoint = new System.Net.IPEndPoint(ipAddress, Ports.SkirmishHost);
                        NetworkUtils.JoinGame(context, endPoint);
                    }
                    break;
                }
                break;
            }
        }
示例#19
0
        public async Task <bool> HandleSystemAsync(Control control, WndWindowMessage message, ControlCallbackContext context)
        {
            switch (message.MessageType)
            {
            case WndWindowMessageType.SelectedButton:
                if (message.Element.Name == _optionsPath + ButtonSelectMap)
                {
                    OpenMapSelection(context);
                }
                else if (message.Element.Name == _optionsPath + ButtonStart)
                {
                    if (_game.SkirmishManager.Settings.Slots.Count(s => s.State != SkirmishSlotState.Open && s.State != SkirmishSlotState.Closed) > CurrentMap.NumPlayers)
                    {
                        context.WindowManager.ShowMessageBox(
                            "GUI:ErrorStartingGame".Translate(),
                            "LAN:TooManyPlayers".TranslateFormatted(CurrentMap.NumPlayers));     // TODO: this doesn't replace %d correctly yet

                        return(true);
                    }
                    else
                    {
                        var availablePositions = new List <byte>(CurrentMap.NumPlayers);
                        for (byte a = 1; a <= CurrentMap.NumPlayers; a++)
                        {
                            availablePositions.Add(a);
                        }

                        foreach (var slot in _game.SkirmishManager.Settings.Slots)
                        {
                            if (slot.StartPosition != 0)
                            {
                                availablePositions.Remove(slot.StartPosition);
                            }
                        }

                        var random = new Random(_game.SkirmishManager.Settings.Seed);

                        foreach (var slot in _game.SkirmishManager.Settings.Slots)
                        {
                            // Close open slots.
                            if (slot.State == SkirmishSlotState.Open)
                            {
                                slot.State = SkirmishSlotState.Closed;
                            }

                            if (slot.State != SkirmishSlotState.Closed)
                            {
                                if (slot.StartPosition == 0)
                                {
                                    slot.StartPosition = availablePositions.Last();
                                    availablePositions.Remove(slot.StartPosition);
                                }

                                if (slot.FactionIndex == 0)
                                {
                                    slot.FactionIndex = (byte)random.Next(slot.FactionIndex, _game.GetPlayableSides().Count());
                                }

                                if (slot.ColorIndex == -1)
                                {
                                    slot.ColorIndex = (sbyte)random.Next(slot.ColorIndex, _game.AssetStore.MultiplayerColors.Count);
                                }
                            }
                        }

                        await context.Game.SkirmishManager.HandleStartButtonClickAsync();
                    }
                }

                break;
            }

            return(false);
        }
示例#20
0
 public static void LanGameOptionsMenuInput(Control control, WndWindowMessage message, ControlCallbackContext context)
 {
     logger.Info($"Have message {message.MessageType} for control {message.Element.DisplayName}");
 }
示例#21
0
 public static void HostGame(ControlCallbackContext context, object windowTag = null)
 {
     context.Game.SkirmishManager = new SkirmishManager.Host(context.Game);
     context.WindowManager.SetWindow(@"Menus\LanGameOptionsMenu.wnd", windowTag);
 }
示例#22
0
        public static void LanGameOptionsMenuSystem(Control control, WndWindowMessage message, ControlCallbackContext context)
        {
            logger.Info($"Have message {message.MessageType} for control {control.Name}");
            if (!GameOptions.HandleSystem(control, message, context))
            {
                switch (message.MessageType)
                {
                case WndWindowMessageType.SelectedButton:
                    switch (message.Element.Name)
                    {
                    case "LanGameOptionsMenu.wnd:ButtonBack":
                        context.Game.SkirmishManager.Quit();

                        //this should be called by the OnStop callback
                        context.WindowManager.SetWindow(@"Menus\LanLobbyMenu.wnd");
                        break;

                    default:
                        logger.Warn($"No callback for {message.Element.Name}");
                        break;
                    }
                    break;
                }
            }
        }
        public static void LanLobbyMenuSystem(Control control, WndWindowMessage message, ControlCallbackContext context)
        {
            switch (message.MessageType)
            {
            case WndWindowMessageType.SelectedButton:
                logger.Info($"Have message {message.MessageType} for control {message.Element.Name}");
                switch (message.Element.Name)
                {
                case "LanLobbyMenu.wnd:ButtonBack":
                    LeaveLobby(context);
                    context.WindowManager.SetWindow(@"Menus\MainMenu.wnd");
                    // TODO: Go back to Multiplayer sub-menu
                    break;

                case "LanLobbyMenu.wnd:ButtonHost":
                    context.Game.LobbyManager.Hosting = true;
                    context.WindowManager.SetWindow(@"Menus\LanGameOptionsMenu.wnd");
                    context.Game.SkirmishManager.Host();
                    break;

                case "LanLobbyMenu.wnd:ButtonJoin":

                    var listBoxGames      = (ListBox)control.Window.Controls.FindControl(ListBoxGamesPrefix);
                    var selectedItemIndex = listBoxGames.SelectedIndex;
                    var selectedItem      = listBoxGames.Items[selectedItemIndex];

                    var dataItem = (KeyValuePair <IPEndPoint, LobbyPlayer>)selectedItem.DataItem;

                    var endpoint = dataItem.Key;

                    logger.Info($"Requesting to join {endpoint}");

                    context.Game.SkirmishManager.Join(endpoint);
                    // TODO: Connect to the currently selected game
                    break;

                case "LanLobbyMenu.wnd:ButtonDirectConnect":
                    context.WindowManager.SetWindow(@"Menus\NetworkDirectConnect.wnd");
                    break;
                }
                break;
            }
        }
示例#24
0
        public static void SkirmishGameOptionsMenuSystem(Control control, WndWindowMessage message, ControlCallbackContext context)
        {
            switch (message.MessageType)
            {
            case WndWindowMessageType.SelectedButton:
                switch (message.Element.Name)
                {
                case "SkirmishGameOptionsMenu.wnd:ButtonSelectMap":
                    context.WindowManager.PushWindow(@"Menus\SkirmishMapSelectMenu.wnd");
                    break;

                case "SkirmishGameOptionsMenu.wnd:ButtonStart":
                    context.Game.Scene2D.WndWindowManager.PopWindow();
                    context.Game.StartGame(
                        @"maps\Alpine Assault\Alpine Assault.map", // TODO
                        new EchoConnection(),
                        new[] { "America" },                       // TODO: We need to receive the player list from UI.
                        0);
                    break;

                case "SkirmishGameOptionsMenu.wnd:ButtonBack":
                    context.WindowManager.SetWindow(@"Menus\MainMenu.wnd");
                    // TODO: Go back to Single Player sub-menu
                    break;
                }
                break;
            }
        }
示例#25
0
 private static void LeaveLobby(ControlCallbackContext context)
 {
     context.Game.LobbyManager.Stop();
 }
示例#26
0
        public static void NetworkDirectConnectSystem(Control control, WndWindowMessage message, ControlCallbackContext context)
        {
            switch (message.MessageType)
            {
            case WndWindowMessageType.SelectedButton:
                switch (message.Element.Name)
                {
                case "NetworkDirectConnect.wnd:ButtonBack":
                    context.WindowManager.SetWindow(@"Menus\LanLobbyMenu.wnd");
                    // TODO: Go back to Multiplayer sub-menu
                    break;

                case "NetworkDirectConnect.wnd:ButtonHost":
                    context.WindowManager.SetWindow(@"Menus\LanGameOptionsMenu.wnd");
                    break;

                case "NetworkDirectConnect.wnd:ButtonJoin":
                    // TODO: Connect to the currently selected game
                    break;
                }
                break;
            }
        }
示例#27
0
        public override InputMessageResult HandleMessage(InputMessage message)
        {
            bool GetControlAtPoint(in Point2D mousePosition, out Control control, out Point2D controlRelativePosition)
            {
                control = _windowManager.GetControlAtPoint(mousePosition);

                if (control != null)
                {
                    controlRelativePosition = control.PointToClient(mousePosition);
                    return(true);
                }

                controlRelativePosition = Point2D.Zero;;
                return(false);
            }

            var context = new ControlCallbackContext(_windowManager, _game);

            switch (message.MessageType)
            {
            case InputMessageType.MouseMove:
            {
                var mouseOverControls = _windowManager.GetControlsAtPoint(message.Value.MousePosition).ToList();
                foreach (var control in _lastMouseOverControls)
                {
                    if (!mouseOverControls.Contains(control))
                    {
                        control.InputCallback.Invoke(
                            control,
                            new WndWindowMessage(WndWindowMessageType.MouseExit, control),
                            context);
                    }
                }
                foreach (var control in mouseOverControls)
                {
                    if (!_lastMouseOverControls.Contains(control))
                    {
                        control.InputCallback.Invoke(
                            control,
                            new WndWindowMessage(WndWindowMessageType.MouseEnter, control),
                            context);
                    }
                }

                _lastMouseOverControls.Clear();
                _lastMouseOverControls.AddRange(mouseOverControls);

                foreach (var control in mouseOverControls)
                {
                    var mousePosition = control.PointToClient(message.Value.MousePosition);
                    control.InputCallback.Invoke(
                        control,
                        new WndWindowMessage(WndWindowMessageType.MouseMove, control, mousePosition),
                        context);
                }
                return(mouseOverControls.Count > 0
                            ? InputMessageResult.Handled
                            : InputMessageResult.NotHandled);
            }

            case InputMessageType.MouseLeftButtonDown:
            {
                if (GetControlAtPoint(message.Value.MousePosition, out var element, out var mousePosition))
                {
                    element.InputCallback.Invoke(
                        element,
                        new WndWindowMessage(WndWindowMessageType.MouseDown, element, mousePosition),
                        context);
                    return(InputMessageResult.Handled);
                }
                break;
            }

            case InputMessageType.MouseLeftButtonUp:
            {
                if (GetControlAtPoint(message.Value.MousePosition, out var element, out var mousePosition))
                {
                    element.InputCallback.Invoke(
                        element,
                        new WndWindowMessage(WndWindowMessageType.MouseUp, element, mousePosition),
                        context);
                    return(InputMessageResult.Handled);
                }
                break;
            }

            // For the time being, just consume right and middle click events so that they don't go through controls:
            case InputMessageType.MouseRightButtonUp:
            case InputMessageType.MouseRightButtonDown:
            case InputMessageType.MouseMiddleButtonDown:
            case InputMessageType.MouseMiddleButtonUp:
            {
                return(GetControlAtPoint(message.Value.MousePosition, out var _, out var _)
                            ? InputMessageResult.Handled
                            : InputMessageResult.NotHandled);
            }

            case InputMessageType.KeyDown:
            {
                if (GetControlAtPoint(message.Value.MousePosition, out var element, out var mousePosition))
                {
                    element.InputCallback.Invoke(
                        element,
                        new WndWindowMessage(WndWindowMessageType.KeyDown, element, mousePosition, message.Value.Key),
                        context);
                    return(InputMessageResult.Handled);
                }
                break;
            }
            }

            return(InputMessageResult.NotHandled);
        }
示例#28
0
        public static void QuitMessageBoxSystem(Control control, WndWindowMessage message, ControlCallbackContext context)
        {
            switch (message.MessageType)
            {
            case WndWindowMessageType.SelectedButton:
                switch (message.Element.Name)
                {
                case "QuitMessageBox.wnd:ButtonCancel":
                    context.WindowManager.PopWindow();
                    break;

                case "QuitMessageBox.wnd:ButtonOk":
                    context.Game.Exit();
                    break;
                }
                break;
            }
        }
 public static void LanLobbyMenuInput(Control control, WndWindowMessage message, ControlCallbackContext context)
 {
     logger.Trace($"Have message {message.MessageType} for control {control.Name}");
 }
示例#30
0
        public async Task <bool> HandleSystemAsync(Control control, WndWindowMessage message, ControlCallbackContext context)
        {
            switch (message.MessageType)
            {
            case WndWindowMessageType.SelectedButton:
                if (message.Element.Name == _optionsPath + ButtonSelectMap)
                {
                    OpenMapSelection(context);
                }
                else if (message.Element.Name == _optionsPath + ButtonStart)
                {
                    if (_game.SkirmishManager.Settings.Slots.Count(s => s.State != SkirmishSlotState.Open && s.State != SkirmishSlotState.Closed) > CurrentMap.NumPlayers)
                    {
                        context.WindowManager.ShowMessageBox(
                            "GUI:ErrorStartingGame".Translate(),
                            "LAN:TooManyPlayers".TranslateFormatted(CurrentMap.NumPlayers));     // TODO: this doesn't replace %d correctly yet

                        return(true);
                    }
                    else
                    {
                        await context.Game.SkirmishManager.HandleStartButtonClickAsync();
                    }
                }

                break;
            }

            return(false);
        }