void RemovePatch(int x, int z, PatchConfiguration ps)
        {
            if (!EditorUtility.DisplayDialog("Remove Patch?", string.Format("The patch ({0}) will be deleted!", ps.FormatPatchName(x, z)), "Remove", "Cancel"))
            {
                return;
            }
            var s = SceneManager.GetSceneByPath(ps.FormatLocalAssetPathPatchName(x, z));

            if (s.IsValid())
            {
                EditorSceneManager.CloseScene(s, true);
            }
            //remove from build settings
            var path           = ps.FormatLocalAssetPathPatchName(x, z);
            var settingsScenes = new List <EditorBuildSettingsScene>(EditorBuildSettings.scenes);

            for (var i = 0; i < settingsScenes.Count; i++)
            {
                if (!settingsScenes[i].path.Equals(path))
                {
                    continue;
                }
                settingsScenes.RemoveAt(i);
                break;
            }
            EditorBuildSettings.scenes = settingsScenes.ToArray();
            //end remove from build settings
            EditorUtility.SetDirty(ps);
            AssetDatabase.DeleteAsset(path);
        }
        void CreateNewPatch(int x, int z, PatchConfiguration ps)
        {
            if (!EditorUtility.DisplayDialog("", "Create Patch?", "Create", "Cancel"))
            {
                return;
            }
            var activeScene = SceneManager.GetActiveScene();
            var s           = EditorSceneManager.NewScene(NewSceneSetup.EmptyScene, NewSceneMode.Additive);

            EditorSceneManager.SaveScene(s, ps.FormatLocalAssetPathPatchName(x, z));
            //add to build settings
            if (!ps.IsSceneAddedToBuildSettings(s.path))
            {
                EditorBuildSettings.scenes = new List <EditorBuildSettingsScene>(EditorBuildSettings.scenes)
                {
                    new EditorBuildSettingsScene(s.path, true)
                }.ToArray();
            }
            //end add to build settings
            EditorUtility.SetDirty(ps);
            if (activeScene.IsValid())
            {
                SceneManager.SetActiveScene(activeScene);
            }
        }