private void ShowGamepadWarningThen(Action fnAction)
 {
     if (Game.Screen.InputMethod != InputMethod.Keyboard && Game.Screen.InputMethod != InputMethod.Mouse)
     {
         var warning = DialogBox.CreateQueryBox(
             Game.Screen,
             Game.Language.Translate("menus.editor_gamepad_warning.title"),
             Game.Language.Translate("menus.editor_gamepad_warning.info"),
             new string[] {
             Game.Language.Translate("menus.ok"),
             Game.Language.Translate("menus.cancel"),
         },
             true
             );
         warning.OnClosed += delegate(object sender, DialogBoxClosedEventArgs e)
         {
             if (e.Result == 0)
             {
                 EnableGamepad = false;
                 fnAction.Invoke();
             }
         };
         ShowDialog(warning);
     }
     else
     {
         fnAction.Invoke();
     }
 }
        private void DeleteLevel(string levelTitle, int levelIndex)
        {
            var dialog = DialogBox.CreateQueryBox(
                Game.Screen,
                Game.Language.Translate("menus.delete_mod_prompt.title"),
                Game.Language.Translate("menus.delete_mod_prompt.info", levelTitle),
                new string[] {
                Game.Language.Translate("menus.yes"),
                Game.Language.Translate("menus.no"),
            },
                true
                );

            dialog.OnClosed += delegate(object sender2, DialogBoxClosedEventArgs e)
            {
                switch (e.Result)
                {
                case 0:
                {
                    // YES
                    ReallyDeleteLevel(levelIndex);
                    break;
                }
                }
            };
            ShowDialog(dialog);
        }
Beispiel #3
0
 private void PublishMod()
 {
     if (m_mod.SteamWorkshopID.HasValue)
     {
         // Skip confirm when updating existing mod
         ReallyPublishMod();
     }
     else
     {
         // Ask the user to confirm first
         var dialog = DialogBox.CreateQueryBox(
             Game.Screen,
             Game.Language.Translate("menus.reset_progress_prompt.title"),
             Game.Language.Translate("menus.publish_mod_prompt.info", m_mod.Title),
             new string[]
         {
             Game.Language.Translate("menus.yes"),
             Game.Language.Translate("menus.no")
         },
             true
             );
         dialog.OnClosed += delegate(object o, DialogBoxClosedEventArgs args)
         {
             if (args.Result == 0)
             {
                 // YES
                 ReallyPublishMod();
             }
         };
         ShowDialog(dialog);
     }
 }
Beispiel #4
0
        private void ReallyUnpublishThenDeleteMod()
        {
            var promise = Game.Network.Workshop.UpdateItem(
                m_mod.SteamWorkshopID.Value,
                "Deleted",
                title: m_mod.Title + " (Deleted in Editor)",
                visibility: false
                );
            var dialog = PromiseDialogBox.Create(Game.Language.Translate("menus.unpublishing.title"), promise);

            dialog.OnClosed += delegate(object sender, DialogBoxClosedEventArgs e)
            {
                if (promise.Status == Status.Complete)
                {
                    // Continue to delete the mod
                    ReallyDeleteMod();
                }
                else if (promise.Status == Status.Error)
                {
                    // Show the user the error
                    var errorDialog = DialogBox.CreateQueryBox(
                        Game.Screen,
                        Game.Language.Translate("menus.unpublishing_error.title"),
                        promise.Error,
                        new string[] {
                        Game.Language.Translate("menus.ok")
                    },
                        true
                        );
                    ShowDialog(errorDialog);
                }
            };
            ShowDialog(dialog);
        }
Beispiel #5
0
        protected override void OnInit()
        {
            base.OnInit();

            // Enable camera control
            CameraController.AllowUserRotate = true;
            CameraController.AllowUserInvert = true;
            CameraController.AllowUserZoom   = true;
            CameraController.AllowUserPan    = true;

            // Load grid
            m_grid    = new Grid(Level);
            m_outline = new TileOutline(Level);

            // Setup preview
            m_previewEntity = new TilePreview();
            Level.Entities.Add(m_previewEntity);

            // Setup change queue
            m_pendingChanges = new List <TilePreview>();

            // Add GUI elements
            Game.Screen.Elements.Add(m_menuButton);
            Game.Screen.Elements.Add(m_saveButton);
            Game.Screen.Elements.Add(m_testButton);

            m_titleText.Options[0] = MouseButton.Left.GetPrompt() + " " + TranslateTitle(Level.Info.Title);
            Game.Screen.Elements.Add(m_titleText);
            Game.Screen.Elements.Add(m_statusText);
            Game.Screen.Elements.Add(m_tileSelect);

            if (!Game.User.Progress.UsedLevelEditor)
            {
                // Do first time tutorial
                var dialog = DialogBox.CreateQueryBox(
                    Game.Screen,
                    Game.Language.Translate("menus.editor.title"),
                    Game.Language.Translate("menus.editor.first_time_prompt"),
                    new string[] {
                    Game.Language.Translate("menus.yes"),
                    Game.Language.Translate("menus.no"),
                },
                    false
                    );
                dialog.OnClosed += delegate(object sender, DialogBoxClosedEventArgs args)
                {
                    if (args.Result == 0)
                    {
                        // YES
                        ShowGuide();
                    }
                };
                ShowDialog(dialog);

                // Supress it in future
                Game.User.Progress.UsedLevelEditor = true;
                Game.User.Progress.Save();
            }
        }
        private void DeleteCampaign(Campaign campaign, Mod mod)
        {
            var dialog = DialogBox.CreateQueryBox(
                Game.Screen,
                Game.Language.Translate("menus.delete_mod_prompt.title"),
                Game.Language.Translate("menus.delete_mod_prompt.info", campaign.Title),
                new string[] {
                Game.Language.Translate("menus.yes"),
                Game.Language.Translate("menus.no"),
            },
                true
                );

            dialog.OnClosed += delegate(object sender2, DialogBoxClosedEventArgs e)
            {
                switch (e.Result)
                {
                case 0:
                {
                    // YES
                    // Delete the campaign
                    var assetPath = campaign.Path;
                    var fullPath  = Path.Combine(mod.Path, "assets/" + assetPath);
                    File.Delete(fullPath);

                    // Delete the levels and their thumbnails
                    for (int i = 0; i < campaign.Levels.Count; ++i)
                    {
                        var levelPath     = campaign.Levels[i];
                        var fullLevelPath = Path.Combine(mod.Path, "assets/" + levelPath);
                        if (File.Exists(fullLevelPath))
                        {
                            File.Delete(fullLevelPath);
                        }

                        var thumbnailPath     = AssetPath.ChangeExtension(levelPath, "png");
                        var fullThumbnailPath = AssetPath.Combine(mod.Path, "assets/" + thumbnailPath);
                        if (File.Exists(fullThumbnailPath))
                        {
                            File.Delete(fullThumbnailPath);
                        }
                    }

                    // Unload the campaign
                    Assets.Reload(assetPath);
                    var sources = Assets.GetSources(assetPath);
                    if (sources.Count == 0 || (sources.Count == 1 && sources.First() == m_mod.Assets))
                    {
                        Assets.Unload(assetPath);
                    }
                    m_campaigns.Refresh();
                    break;
                }
                }
            };
            ShowDialog(dialog);
        }
Beispiel #7
0
        private void ShowFPSWarning()
        {
            var dialog = DialogBox.CreateQueryBox(
                Game.Screen,
                Game.Language.Translate("menus.fps_warning.title"),
                Game.Language.Translate("menus.fps_warning.info"),
                new string[] {
                Game.Language.Translate("menus.yes"),
                Game.Language.Translate("menus.no")
            },
                true
                );

            dialog.OnClosed += delegate(object sender, DialogBoxClosedEventArgs e)
            {
                int index = e.Result;
                switch (index)
                {
                case 0:
                {
                    // YES
                    WipeToState(new GraphicsOptionsState(Game));
                    break;
                }

                case 1:
                {
                    // NO
                    ShowMenu();
                    break;
                }

                default:
                {
                    // Back
                    GoBack();
                    break;
                }
                }
            };
            ShowDialog(dialog);
        }
        private void ResetProgress()
        {
            // Reset progress
            var dialog = DialogBox.CreateQueryBox(
                Game.Screen,
                Game.Language.Translate("menus.reset_progress_prompt.title"),
                Game.Language.Translate("menus.reset_progress_prompt.info"),
                new string[] {
                Game.Language.Translate("menus.yes"),
                Game.Language.Translate("menus.no"),
            },
                true
                );

            dialog.OnClosed += delegate(object sender2, DialogBoxClosedEventArgs e)
            {
                switch (e.Result)
                {
                case 0:
                {
                    // YES
                    Game.User.Progress.Reset();
                    Game.User.Progress.ResetAllStatistics();
                    if (Game.Keyboard.Keys[Key.LeftShift].Held || Game.Keyboard.Keys[Key.RightShift].Held)
                    {
                        Game.User.Progress.RemoveAllAchievements();
                    }
                    Game.User.Progress.Save();
                    GoBack();
                    break;
                }

                case 1:
                {
                    // NO
                    break;
                }
                }
            };
            ShowDialog(dialog);
        }
Beispiel #9
0
        private void Configure()
        {
            ISteamController controller = null;

            if (Game.ActiveSteamController != null)
            {
                controller = Game.ActiveSteamController;
            }
            else if (Game.SteamControllers.Count > 0)
            {
                controller = Game.SteamControllers.First();
            }
            if (controller == null)
            {
                ShowDialog(DialogBox.CreateQueryBox(
                               Game.Screen,
                               Game.Language.Translate("menus.steam_controller_input_options.configure"),
                               Game.Language.Translate("menus.steam_controller_input_options.no_controller"),
                               new string[] {
                    Game.Language.Translate("menus.ok")
                },
                               false
                               ));
            }
            else if (!Game.Network.OpenSteamControllerConfig(controller))
            {
                if (!m_bigPicture)
                {
                    ShowDialog(DialogBox.CreateQueryBox(
                                   Game.Screen,
                                   Game.Language.Translate("menus.steam_controller_input_options.configure"),
                                   Game.Language.Translate("menus.steam_controller_input_options.no_big_picture"),
                                   new string[] {
                        Game.Language.Translate("menus.ok")
                    },
                                   false
                                   ));
                }
            }
        }
Beispiel #10
0
        private void ExportMod()
        {
            // Update game_version
            m_mod.MinimumGameVersion = App.Info.Version;
            m_mod.SaveInfo();

            // Export the mod
            var modsPath   = Path.Combine(App.SavePath, "mods");
            var outputPath = Path.Combine(modsPath, Path.GetFileName(m_mod.Path) + m_mod.Version.ToString() + ".zip");

            Mods.InitLocalDirectory();
            Mods.Export(m_mod, outputPath);

            // Inform the user
            var dialog = DialogBox.CreateQueryBox(
                Game.Screen,
                Game.Language.Translate("menus.mod_editor.export_mod"),
                Game.Language.Translate("menus.mod_exported.title", m_mod.Title),
                new string[] {
                Game.Language.Translate("menus.ok")
            },
                false
                );

            dialog.OnClosed += delegate(object sender, DialogBoxClosedEventArgs e)
            {
                switch (e.Result)
                {
                case 0:
                {
                    // Open the export folder
                    Game.Network.OpenFileBrowser(Path.GetDirectoryName(outputPath));
                    break;
                }
                }
            };
            ShowDialog(dialog);
        }
Beispiel #11
0
        private void DeleteMod()
        {
            var dialog = DialogBox.CreateQueryBox(
                Game.Screen,
                Game.Language.Translate("menus.delete_mod_prompt.title"),
                Game.Language.Translate("menus.delete_mod_prompt.info", m_mod.Title),
                new string[] {
                Game.Language.Translate("menus.yes"),
                Game.Language.Translate("menus.no"),
            },
                true
                );

            dialog.OnClosed += delegate(object sender, DialogBoxClosedEventArgs e)
            {
                switch (e.Result)
                {
                case 0:
                {
                    // YES
                    if (Game.Network.SupportsWorkshop && m_mod.SteamWorkshopID.HasValue)
                    {
                        var id      = m_mod.SteamWorkshopID.Value;
                        var dialog2 = DialogBox.CreateQueryBox(
                            Game.Screen,
                            Game.Language.Translate("menus.unpublish_mod_prompt.title"),
                            Game.Language.Translate("menus.unpublish_mod_prompt.info", m_mod.Title),
                            new string[] {
                                Game.Language.Translate("menus.yes"),
                                Game.Language.Translate("menus.no"),
                                Game.Language.Translate("menus.cancel"),
                            },
                            false
                            );
                        dialog2.OnClosed += delegate(object sender2, DialogBoxClosedEventArgs e2)
                        {
                            switch (e2.Result)
                            {
                            case 0:
                            {
                                // YES
                                ReallyUnpublishThenDeleteMod();
                                return;
                            }

                            case 1:
                            {
                                // NO
                                ReallyDeleteMod();
                                return;
                            }
                            }
                        };
                        ShowDialog(dialog2);
                    }
                    else
                    {
                        // Delete the mod
                        ReallyDeleteMod();
                    }
                    break;
                }
                }
            };
            ShowDialog(dialog);
        }
Beispiel #12
0
        private void ReallyPublishMod()
        {
            // Update game_version
            m_mod.MinimumGameVersion = App.Info.Version;
            m_mod.SaveInfo();

            // Check every level has a thumbnail and has been completed
            foreach (var campaign in Assets.Find <Campaign>("campaigns", m_mod.Assets))
            {
                for (int i = 0; i < campaign.Levels.Count; ++i)
                {
                    var levelPath = campaign.Levels[i];
                    var levelData = LevelData.Get(levelPath);
                    if (!levelData.EverCompleted)
                    {
                        ShowDialog(DialogBox.CreateQueryBox(
                                       Game.Screen,
                                       Game.Language.Translate("menus.publishing_error.title"),
                                       Game.Language.Translate("menus.publishing_error.level_not_completed", TranslateTitle(levelData.Title)),
                                       new string[] {
                            Game.Language.Translate("menus.ok")
                        }, true)
                                   );
                        return;
                    }

                    var levelThumbnailPath     = AssetPath.ChangeExtension(levelPath, "png");
                    var levelThumbnailFullPath = Path.Combine(m_mod.Path, "assets/" + levelThumbnailPath);
                    if (!File.Exists(levelThumbnailFullPath))
                    {
                        ShowDialog(DialogBox.CreateQueryBox(
                                       Game.Screen,
                                       Game.Language.Translate("menus.publishing_error.title"),
                                       Game.Language.Translate("menus.publishing_error.level_no_thumbnail", TranslateTitle(levelData.Title)),
                                       new string[] {
                            Game.Language.Translate("menus.ok")
                        }, true)
                                   );
                        return;
                    }
                }
            }

            // Find source images for the thumbnail
            var thumbnailSources    = new List <string>();
            var manualThumbnailPath = Path.Combine(m_mod.Path, "thumbnail.png");

            if (File.Exists(manualThumbnailPath))
            {
                // Use thumbnail.png
                thumbnailSources.Add(manualThumbnailPath);
            }
            else
            {
                // Use the thumbnails from the levels
                var campaigns = Assets.List <Campaign>("campaigns", m_mod.Assets).ToArray();
                for (int i = 0; i < campaigns.Length; ++i)
                {
                    var campaign = campaigns[i];
                    for (int j = 0; j < campaign.Levels.Count; ++j)
                    {
                        var levelPath              = campaign.Levels[j];
                        var levelThumbnailPath     = AssetPath.ChangeExtension(levelPath, "png");
                        var levelThumbnailFullPath = Path.Combine(m_mod.Path, "assets/" + levelThumbnailPath);
                        if (File.Exists(levelThumbnailFullPath))
                        {
                            thumbnailSources.Add(levelThumbnailFullPath);
                        }
                    }
                }
            }
            if (thumbnailSources.Count == 0)
            {
                ShowDialog(DialogBox.CreateQueryBox(
                               Game.Screen,
                               Game.Language.Translate("menus.publishing_error.title"),
                               Game.Language.Translate("menus.publishing_error.no_thumbnail"),
                               new string[] {
                    Game.Language.Translate("menus.ok")
                }, true)
                           );
                return;
            }

            // Generate the thumbnail
            var thumbnailPath = GenerateThumbnail(thumbnailSources);

            // Determine the tags
            var tags = new HashSet <string>();

            if (Assets.Find <LuaScript>("animation", m_mod.Assets).Count() > 0)
            {
                tags.Add("Custom Animation");
            }
            if (Assets.List <Campaign>("campaigns", m_mod.Assets).Count() > 0 &&
                Assets.Find <LevelData>("levels", m_mod.Assets).Count() > 0)
            {
                tags.Add("New Levels");
            }
            if (Assets.List <Language>("languages", m_mod.Assets).Where(lang => !lang.IsEnglish).Count() > 0)
            {
                tags.Add("Localisation");
            }
            if (Assets.Find <Model>("models", m_mod.Assets).Count() > 0 ||
                Assets.Find <Sky>("skies", m_mod.Assets).Count() > 0)
            {
                tags.Add("Custom Art");
            }
            if (Assets.Find <Sound>("sound", m_mod.Assets).Count() > 0 ||
                Assets.Find <Sound>("music", m_mod.Assets).Count() > 0)
            {
                tags.Add("Custom Audio");
            }
            if (Assets.List <ArcadeDisk>("arcade", m_mod.Assets).Count() > 0)
            {
                tags.Add("Arcade Games");
            }

            // Publish
            if (m_mod.SteamWorkshopID.HasValue)
            {
                // Update existing mod
                ulong id      = m_mod.SteamWorkshopID.Value;
                var   promise = Game.Network.Workshop.UpdateItem(
                    id,
                    "Modified with the Redirection Mod Editor",
                    filePath: m_mod.Path,
                    previewImagePath: thumbnailPath,
                    title: m_mod.Title,
                    tags: tags.ToArray()
                    );
                var progressDialog = PromiseDialogBox.Create(
                    Game.Language.Translate("menus.publishing.title"),
                    promise
                    );
                progressDialog.OnClosed += delegate(object sender2, DialogBoxClosedEventArgs e2)
                {
                    if (promise.Status == Status.Complete)
                    {
                        // Show the user the mod
                        ShowInWorkshop();

                        // Show a dialog
                        var completeDialog = DialogBox.CreateQueryBox(
                            Game.Screen,
                            Game.Language.Translate("menus.mod_published.title"),
                            promise.Result.AgreementNeeded ?
                            Game.Language.Translate("menus.mod_published.info_agreement_needed", m_mod.Title) :
                            Game.Language.Translate("menus.mod_published.info", m_mod.Title),
                            new string[] {
                            Game.Language.Translate("menus.ok")
                        },
                            true
                            );
                        ShowDialog(completeDialog);
                    }
                    else if (promise.Status == Status.Error)
                    {
                        // Show the user the error
                        var errorDialog = DialogBox.CreateQueryBox(
                            Game.Screen,
                            Game.Language.Translate("menus.publishing_error.title"),
                            promise.Error,
                            new string[] {
                            Game.Language.Translate("menus.ok")
                        },
                            true
                            );
                        ShowDialog(errorDialog);
                    }
                };
                ShowDialog(progressDialog);
            }
            else
            {
                // Create new mod
                var description = "Created with the Redirection Mod Editor";
                var promise     = Game.Network.Workshop.CreateItem(
                    m_mod.Path,
                    thumbnailPath,
                    m_mod.Title,
                    description,
                    tags.ToArray(),
                    true
                    );
                var progressDialog = PromiseDialogBox.Create(
                    Game.Language.Translate("menus.publishing.title"),
                    promise
                    );
                progressDialog.OnClosed += delegate(object sender2, DialogBoxClosedEventArgs e2)
                {
                    if (promise.Status == Status.Complete)
                    {
                        // Save the mod
                        ulong id = promise.Result.ID;
                        m_mod.SteamWorkshopID = id;
                        m_mod.SaveInfo();

                        // Show the user the mod
                        ShowInWorkshop();

                        // Show a dialog
                        var completeDialog = DialogBox.CreateQueryBox(
                            Game.Screen,
                            Game.Language.Translate("menus.mod_published.title"),
                            promise.Result.AgreementNeeded ?
                            Game.Language.Translate("menus.mod_published.info_agreement_needed", m_mod.Title) :
                            Game.Language.Translate("menus.mod_published.info", m_mod.Title),
                            new string[] {
                            Game.Language.Translate("menus.ok")
                        },
                            true
                            );
                        completeDialog.OnClosed += delegate
                        {
                            // Re-enter state so the new "show in workshop" entry appears
                            CutToState(new ModEditorState(Game, m_mod));
                        };
                        ShowDialog(completeDialog);
                    }
                    else if (promise.Status == Status.Error)
                    {
                        // Show the user the error
                        var errorDialog = DialogBox.CreateQueryBox(
                            Game.Screen,
                            Game.Language.Translate("menus.publishing_error.title"),
                            promise.Error,
                            new string[] {
                            Game.Language.Translate("menus.ok")
                        },
                            true
                            );
                        ShowDialog(errorDialog);
                    }
                };
                ShowDialog(progressDialog);
            }
        }
Beispiel #13
0
        private void ShowPauseMenu()
        {
            // Editor pause menu
            string[] options = new string[] {
                Game.Language.Translate("menus.editor.show_guide"),
                Game.Language.Translate("menus.editor.capture_thumbnail"),
                Game.Language.Translate("menus.editor.edit_script"),
                Game.Language.Translate("menus.editor.reload"),
                Game.Language.Translate("menus.editor.go_back")
            };

            var pauseMenu = DialogBox.CreateMenuBox(Game.Language.Translate("menus.editor.title"), options, false);

            pauseMenu.OnClosed += delegate(object sender, DialogBoxClosedEventArgs e)
            {
                switch (e.Result)
                {
                case 0:
                {
                    // Show guide
                    ShowGuide();
                    break;
                }

                case 1:
                {
                    // Create thumbnail
                    if (m_modified)
                    {
                        var tempPath = SaveLevelTemporary();
                        CutToState(new ThumbnailState(Game, m_mod, m_campaign, m_levelIndex, tempPath, LevelSavePath));
                    }
                    else
                    {
                        CutToState(new ThumbnailState(Game, m_mod, m_campaign, m_levelIndex, LevelSavePath, LevelSavePath));
                    }
                    break;
                }

                case 2:
                {
                    // Edit Script
                    EditScript();
                    break;
                }

                case 3:
                {
                    // Reload level
                    ReloadLevel();
                    break;
                }

                case 4:
                {
                    // Back to Menu
                    if (m_modified)
                    {
                        // Modified, so prompt for save first
                        var promptMenu = DialogBox.CreateQueryBox(
                            Game.Screen,
                            Game.Language.Translate("menus.save_prompt.title"),
                            Game.Language.Translate("menus.save_prompt.info"),
                            new string[] {
                                Game.Language.Translate("menus.yes"),
                                Game.Language.Translate("menus.no"),
                            },
                            true
                            );
                        promptMenu.OnClosed += delegate(object sender2, DialogBoxClosedEventArgs e2)
                        {
                            switch (e2.Result)
                            {
                            case 0:
                            {
                                // YES
                                SaveLevel();
                                BackToMenu();
                                break;
                            }

                            case 1:
                            {
                                // NO
                                BackToMenu();
                                break;
                            }
                            }
                        };
                        ShowDialog(promptMenu);
                    }
                    else
                    {
                        // Unmodified, so don't prompt:
                        BackToMenu();
                    }
                    break;
                }
                }
            };
            ShowDialog(pauseMenu);
        }