diff --git a/OpenRA.Game/Game.cs b/OpenRA.Game/Game.cs index 0ec16f8b1d..47a56f5e57 100644 --- a/OpenRA.Game/Game.cs +++ b/OpenRA.Game/Game.cs @@ -59,6 +59,8 @@ namespace OpenRA static Task discoverNat; static bool takeScreenshot = false; + public static event Action OnShellmapLoaded; + public static OrderManager JoinServer(string host, int port, string password, bool recordReplay = true) { var connection = new NetworkConnection(host, port); @@ -471,7 +473,10 @@ namespace OpenRA var shellmap = ChooseShellmap(); using (new PerfTimer("StartGame")) + { StartGame(shellmap, WorldType.Shellmap); + OnShellmapLoaded(); + } } static string ChooseShellmap() diff --git a/OpenRA.Mods.Common/Widgets/Logic/MainMenuLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/MainMenuLogic.cs index 80ad382c3a..a0793b6888 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/MainMenuLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/MainMenuLogic.cs @@ -28,6 +28,8 @@ namespace OpenRA.Mods.Common.Widgets.Logic { protected enum MenuType { Main, Singleplayer, Extras, MapEditor, SystemInfoPrompt, None } + protected enum MenuPanel { None, Missions, Skirmish, Multiplayer, MapEditor, Replays } + protected MenuType menuType = MenuType.Main; readonly Widget rootMenu; readonly ScrollPanelWidget newsPanel; @@ -37,6 +39,8 @@ namespace OpenRA.Mods.Common.Widgets.Logic // Update news once per game launch static bool fetchedNews; + protected static MenuPanel lastGameState = MenuPanel.None; + bool newsOpen; // Increment the version number when adding new stats @@ -79,17 +83,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic mainMenu.Get("SINGLEPLAYER_BUTTON").OnClick = () => SwitchMenu(MenuType.Singleplayer); - mainMenu.Get("MULTIPLAYER_BUTTON").OnClick = () => - { - SwitchMenu(MenuType.None); - Ui.OpenWindow("MULTIPLAYER_PANEL", new WidgetArgs - { - { "onStart", RemoveShellmapUI }, - { "onExit", () => SwitchMenu(MenuType.Main) }, - { "directConnectHost", null }, - { "directConnectPort", 0 }, - }); - }; + mainMenu.Get("MULTIPLAYER_BUTTON").OnClick = OpenMultiplayerPanel; mainMenu.Get("CONTENT_BUTTON").OnClick = () => { @@ -120,15 +114,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic singleplayerMenu.IsVisible = () => menuType == MenuType.Singleplayer; var missionsButton = singleplayerMenu.Get("MISSIONS_BUTTON"); - missionsButton.OnClick = () => - { - SwitchMenu(MenuType.None); - Game.OpenWindow("MISSIONBROWSER_PANEL", new WidgetArgs - { - { "onExit", () => SwitchMenu(MenuType.Singleplayer) }, - { "onStart", RemoveShellmapUI } - }); - }; + missionsButton.OnClick = OpenMissionBrowserPanel; var hasCampaign = modData.Manifest.Missions.Any(); var hasMissions = modData.MapCache @@ -144,15 +130,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic var extrasMenu = widget.Get("EXTRAS_MENU"); extrasMenu.IsVisible = () => menuType == MenuType.Extras; - extrasMenu.Get("REPLAYS_BUTTON").OnClick = () => - { - SwitchMenu(MenuType.None); - Ui.OpenWindow("REPLAYBROWSER_PANEL", new WidgetArgs - { - { "onExit", () => SwitchMenu(MenuType.Extras) }, - { "onStart", RemoveShellmapUI } - }); - }; + extrasMenu.Get("REPLAYS_BUTTON").OnClick = OpenReplayBrowserPanel; extrasMenu.Get("MUSIC_BUTTON").OnClick = () => { @@ -283,6 +261,8 @@ namespace OpenRA.Mods.Common.Widgets.Logic } else LoadAndDisplayNews(webServices.GameNews, newsBG); + + Game.OnShellmapLoaded += OpenMenuBasedOnLastGame; } void LoadAndDisplayNews(string newsURL, Widget newsBG) @@ -347,6 +327,8 @@ namespace OpenRA.Mods.Common.Widgets.Logic "", () => { Game.LoadEditor(uid); }, () => { Game.CloseServer(); SwitchMenu(MenuType.MapEditor); }); + + lastGameState = MenuPanel.MapEditor; } void SetNewsStatus(string message) @@ -447,17 +429,6 @@ namespace OpenRA.Mods.Common.Widgets.Logic rootMenu.Parent.RemoveChild(rootMenu); } - void OpenSkirmishLobbyPanel() - { - SwitchMenu(MenuType.None); - Game.OpenWindow("SERVER_LOBBY", new WidgetArgs - { - { "onExit", () => { Game.Disconnect(); SwitchMenu(MenuType.Singleplayer); } }, - { "onStart", RemoveShellmapUI }, - { "skirmishMode", true } - }); - } - void StartSkirmishGame() { var map = Game.ModData.MapCache.ChooseInitialMap(Game.Settings.Server.Map, Game.CosmeticRandom); @@ -471,6 +442,49 @@ namespace OpenRA.Mods.Common.Widgets.Logic () => { Game.CloseServer(); SwitchMenu(MenuType.Main); }); } + void OpenMissionBrowserPanel() + { + SwitchMenu(MenuType.None); + Game.OpenWindow("MISSIONBROWSER_PANEL", new WidgetArgs + { + { "onExit", () => SwitchMenu(MenuType.Singleplayer) }, + { "onStart", () => { RemoveShellmapUI(); lastGameState = MenuPanel.Missions; } } + }); + } + + void OpenSkirmishLobbyPanel() + { + SwitchMenu(MenuType.None); + Game.OpenWindow("SERVER_LOBBY", new WidgetArgs + { + { "onExit", () => { Game.Disconnect(); SwitchMenu(MenuType.Singleplayer); } }, + { "onStart", () => { RemoveShellmapUI(); lastGameState = MenuPanel.Skirmish; } }, + { "skirmishMode", true } + }); + } + + void OpenMultiplayerPanel() + { + SwitchMenu(MenuType.None); + Ui.OpenWindow("MULTIPLAYER_PANEL", new WidgetArgs + { + { "onStart", () => { RemoveShellmapUI(); lastGameState = MenuPanel.Multiplayer; } }, + { "onExit", () => SwitchMenu(MenuType.Main) }, + { "directConnectHost", null }, + { "directConnectPort", 0 }, + }); + } + + void OpenReplayBrowserPanel() + { + SwitchMenu(MenuType.None); + Ui.OpenWindow("REPLAYBROWSER_PANEL", new WidgetArgs + { + { "onExit", () => SwitchMenu(MenuType.Extras) }, + { "onStart", () => { RemoveShellmapUI(); lastGameState = MenuPanel.Replays; } } + }); + } + protected override void Dispose(bool disposing) { if (disposing) @@ -479,7 +493,36 @@ namespace OpenRA.Mods.Common.Widgets.Logic Game.BeforeGameStart -= RemoveShellmapUI; } + Game.OnShellmapLoaded -= OpenMenuBasedOnLastGame; base.Dispose(disposing); } + + void OpenMenuBasedOnLastGame() + { + switch (lastGameState) + { + case MenuPanel.Missions: + OpenMissionBrowserPanel(); + break; + + case MenuPanel.Replays: + OpenReplayBrowserPanel(); + break; + + case MenuPanel.Skirmish: + StartSkirmishGame(); + break; + + case MenuPanel.Multiplayer: + OpenMultiplayerPanel(); + break; + + case MenuPanel.MapEditor: + SwitchMenu(MenuType.MapEditor); + break; + } + + lastGameState = MenuPanel.None; + } } }