diff --git a/OpenRA.Mods.Common/Widgets/Logic/Ingame/IngameMenuLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/Ingame/IngameMenuLogic.cs index 8e86b5966f..1746fee0ef 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/Ingame/IngameMenuLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/Ingame/IngameMenuLogic.cs @@ -126,6 +126,18 @@ namespace OpenRA.Mods.Common.Widgets.Logic [TranslationReference] const string PlayMapWarningCancel = "dialog-play-map-warning.cancel"; + [TranslationReference] + const string ExitToMapEditorTitle = "dialog-exit-to-map-editor.title"; + + [TranslationReference] + const string ExitToMapEditorPrompt = "dialog-exit-to-map-editor.prompt"; + + [TranslationReference] + const string ExitToMapEditorConfirm = "dialog-exit-to-map-editor.confirm"; + + [TranslationReference] + const string ExitToMapEditorCancel = "dialog-exit-to-map-editor.cancel"; + readonly Widget menu; readonly Widget buttonContainer; readonly ButtonWidget buttonTemplate; @@ -142,6 +154,8 @@ namespace OpenRA.Mods.Common.Widgets.Logic bool leaving; bool hideMenu; + static bool lastGameEditor = false; + [ObjectCreator.UseCtor] public IngameMenuLogic(Widget widget, ModData modData, World world, Action onExit, WorldRenderer worldRenderer, IngameInfoPanel initialPanel, Dictionary logicArgs) @@ -154,6 +168,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic var buttonHandlers = new Dictionary { { "ABORT_MISSION", CreateAbortMissionButton }, + { "BACK_TO_EDITOR", CreateBackToEditorButton }, { "RESTART", CreateRestartButton }, { "SURRENDER", CreateSurrenderButton }, { "LOAD_GAME", CreateLoadGameButton }, @@ -244,6 +259,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic exitDelay += 40 * mpe.Info.FadeLength; } + lastGameEditor = false; Game.RunAfterDelay(exitDelay, () => { if (!Game.IsCurrentWorld(world)) @@ -513,6 +529,8 @@ namespace OpenRA.Mods.Common.Widgets.Logic ExitEditor(actionManager, () => { + lastGameEditor = true; + Ui.CloseWindow(); Ui.ResetTooltips(); void CloseMenu() @@ -546,6 +564,38 @@ namespace OpenRA.Mods.Common.Widgets.Logic }; } + void CreateBackToEditorButton() + { + if (world.Type != WorldType.Regular || !lastGameEditor) + return; + + AddButton("BACK_TO_EDITOR", "Back To Editor") + .OnClick = () => + { + hideMenu = true; + void OnConfirm() + { + lastGameEditor = false; + var map = modData.MapCache.GetUpdatedMap(world.Map.Uid); + if (map == null) + Game.LoadShellMap(); + else + { + DiscordService.UpdateStatus(DiscordState.InMapEditor); + Game.LoadEditor(map); + } + } + + ConfirmationDialogs.ButtonPrompt(modData, + title: ExitToMapEditorTitle, + text: ExitToMapEditorPrompt, + onConfirm: OnConfirm, + onCancel: ShowMenu, + confirmText: ExitToMapEditorConfirm, + cancelText: ExitToMapEditorCancel); + }; + } + void CreateExitEditorButton() { if (world.Type != WorldType.Editor) diff --git a/mods/cnc/chrome/ingame-menu.yaml b/mods/cnc/chrome/ingame-menu.yaml index 3b995b491e..4f6330dd36 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, PLAY_MAP, SAVE_MAP, ABORT_MISSION, SURRENDER, RESTART, LOAD_GAME, SAVE_GAME, MUSIC, SETTINGS, RESUME + Buttons: EXIT_EDITOR, PLAY_MAP, SAVE_MAP, ABORT_MISSION, BACK_TO_EDITOR, 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 df0567f196..c0dd23aca7 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, PLAY_MAP, EXIT_EDITOR + Buttons: RESUME, LOAD_GAME, SAVE_GAME, SETTINGS, MUSIC, SURRENDER, RESTART, BACK_TO_EDITOR, 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 d6be610f7e..447c3445bb 100644 --- a/mods/common/languages/en.ftl +++ b/mods/common/languages/en.ftl @@ -228,6 +228,12 @@ dialog-play-map-warning = errors preventing it from being loaded. .cancel = Okay +dialog-exit-to-map-editor = + .title = Leave Mission + .prompt = Leave this game and return to the editor? + .confirm = Back To Editor + .cancel = Stay + ## 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 84f981cb0d..92fae414e8 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, PLAY_MAP, EXIT_EDITOR + Buttons: RESUME, LOAD_GAME, SAVE_GAME, SETTINGS, MUSIC, SURRENDER, RESTART, BACK_TO_EDITOR, ABORT_MISSION, SAVE_MAP, PLAY_MAP, EXIT_EDITOR ButtonStride: 0, 40 Children: Label@VERSION_LABEL: