diff --git a/OpenRA.Mods.Common/Widgets/Logic/Ingame/IngameMenuLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/Ingame/IngameMenuLogic.cs index 66608cafa5..8e86b5966f 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/Ingame/IngameMenuLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/Ingame/IngameMenuLogic.cs @@ -117,6 +117,15 @@ namespace OpenRA.Mods.Common.Widgets.Logic [TranslationReference] const string ExitMapEditorConfirm = "dialog-exit-map-editor.confirm"; + [TranslationReference] + const string PlayMapWarningTitle = "dialog-play-map-warning.title"; + + [TranslationReference] + const string PlayMapWarningPrompt = "dialog-play-map-warning.prompt"; + + [TranslationReference] + const string PlayMapWarningCancel = "dialog-play-map-warning.cancel"; + readonly Widget menu; readonly Widget buttonContainer; readonly ButtonWidget buttonTemplate; @@ -153,6 +162,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic { "SETTINGS", CreateSettingsButton }, { "RESUME", CreateResumeButton }, { "SAVE_MAP", CreateSaveMapButton }, + { "PLAY_MAP", CreatePlayMapButton }, { "EXIT_EDITOR", CreateExitEditorButton } }; @@ -478,6 +488,64 @@ namespace OpenRA.Mods.Common.Widgets.Logic }; } + void CreatePlayMapButton() + { + if (world.Type != WorldType.Editor) + return; + + var actionManager = world.WorldActor.Trait(); + AddButton("PLAY_MAP", "Play Map") + .OnClick = () => + { + hideMenu = true; + var uid = modData.MapCache.GetUpdatedMap(world.Map.Uid); + var map = uid == null ? null : modData.MapCache[uid]; + if (map == null || (map.Visibility != MapVisibility.Lobby && map.Visibility != MapVisibility.MissionSelector)) + { + ConfirmationDialogs.ButtonPrompt(modData, + title: PlayMapWarningTitle, + text: PlayMapWarningPrompt, + onCancel: ShowMenu, + cancelText: PlayMapWarningCancel); + + return; + } + + ExitEditor(actionManager, () => + { + Ui.CloseWindow(); + Ui.ResetTooltips(); + void CloseMenu() + { + mpe?.Fade(MenuPaletteEffect.EffectType.None); + onExit(); + } + + if (map.Visibility == MapVisibility.Lobby) + { + ConnectionLogic.Connect(Game.CreateLocalServer(uid), + "", + () => Game.OpenWindow("SERVER_LOBBY", new WidgetArgs + { + { "onExit", CloseMenu }, + { "onStart", () => { } }, + { "skirmishMode", true } + }), + () => Game.CloseServer()); + } + else if (map.Visibility == MapVisibility.MissionSelector) + { + Game.OpenWindow("MISSIONBROWSER_PANEL", new WidgetArgs + { + { "onExit", CloseMenu }, + { "onStart", () => { } }, + { "initialMap", uid } + }); + } + }); + }; + } + void CreateExitEditorButton() { if (world.Type != WorldType.Editor) diff --git a/mods/cnc/chrome/ingame-menu.yaml b/mods/cnc/chrome/ingame-menu.yaml index f7992af6f5..3b995b491e 100644 --- a/mods/cnc/chrome/ingame-menu.yaml +++ b/mods/cnc/chrome/ingame-menu.yaml @@ -2,7 +2,7 @@ Container@INGAME_MENU: Width: WINDOW_RIGHT Height: WINDOW_BOTTOM Logic: IngameMenuLogic - Buttons: EXIT_EDITOR, SAVE_MAP, ABORT_MISSION, SURRENDER, RESTART, LOAD_GAME, SAVE_GAME, MUSIC, SETTINGS, RESUME + Buttons: EXIT_EDITOR, PLAY_MAP, SAVE_MAP, ABORT_MISSION, SURRENDER, RESTART, LOAD_GAME, SAVE_GAME, MUSIC, SETTINGS, RESUME ButtonStride: 130, 0 Children: Image@EVA: diff --git a/mods/common/chrome/ingame-menu.yaml b/mods/common/chrome/ingame-menu.yaml index ca83af6efd..df0567f196 100644 --- a/mods/common/chrome/ingame-menu.yaml +++ b/mods/common/chrome/ingame-menu.yaml @@ -2,7 +2,7 @@ Container@INGAME_MENU: Width: WINDOW_RIGHT Height: WINDOW_BOTTOM Logic: IngameMenuLogic - Buttons: RESUME, LOAD_GAME, SAVE_GAME, SETTINGS, MUSIC, SURRENDER, RESTART, ABORT_MISSION, SAVE_MAP, EXIT_EDITOR + Buttons: RESUME, LOAD_GAME, SAVE_GAME, SETTINGS, MUSIC, SURRENDER, RESTART, ABORT_MISSION, SAVE_MAP, PLAY_MAP, EXIT_EDITOR ButtonStride: 0, 40 Children: Background@BORDER: diff --git a/mods/common/languages/en.ftl b/mods/common/languages/en.ftl index bccff3d1ac..d6be610f7e 100644 --- a/mods/common/languages/en.ftl +++ b/mods/common/languages/en.ftl @@ -222,6 +222,12 @@ dialog-exit-map-editor = .confirm-anyway = Exit anyway .confirm = Exit +dialog-play-map-warning = + .title = Warning + .prompt = The map may have been deleted or has + errors preventing it from being loaded. + .cancel = Okay + ## IngamePowerBarLogic ## IngamePowerCounterLogic label-power-usage = Power Usage: { $usage }/{ $capacity } diff --git a/mods/d2k/chrome/ingame-menu.yaml b/mods/d2k/chrome/ingame-menu.yaml index c19c87bb38..84f981cb0d 100644 --- a/mods/d2k/chrome/ingame-menu.yaml +++ b/mods/d2k/chrome/ingame-menu.yaml @@ -2,7 +2,7 @@ Container@INGAME_MENU: Width: WINDOW_RIGHT Height: WINDOW_BOTTOM Logic: IngameMenuLogic - Buttons: RESUME, LOAD_GAME, SAVE_GAME, SETTINGS, MUSIC, SURRENDER, RESTART, ABORT_MISSION, SAVE_MAP, EXIT_EDITOR + Buttons: RESUME, LOAD_GAME, SAVE_GAME, SETTINGS, MUSIC, SURRENDER, RESTART, ABORT_MISSION, SAVE_MAP, PLAY_MAP, EXIT_EDITOR ButtonStride: 0, 40 Children: Label@VERSION_LABEL: