Beispiel #1
0
        public void ShowGUI()
        {
            CustomGUILayout.MultiLineLabelGUI("Scene number:", sceneNumber.ToString());
            CustomGUILayout.MultiLineLabelGUI("Active NavMesh:", navMesh.ToString());
            CustomGUILayout.MultiLineLabelGUI("Default PlayerStart:", playerStart.ToString());
            CustomGUILayout.MultiLineLabelGUI("Default SortingMap:", sortingMap.ToString());
            CustomGUILayout.MultiLineLabelGUI("Default TintMap:", tintMap.ToString());
            CustomGUILayout.MultiLineLabelGUI("OnStart cutscene:", onStartCutscene.ToString());
            CustomGUILayout.MultiLineLabelGUI("OnLoadCutscene:", onLoadCutscene.ToString());

            EditorGUILayout.LabelField("Remember data:");
            if (allScriptData != null && allScriptData.Count > 0)
            {
                foreach (ScriptData scriptData in allScriptData)
                {
                    RememberData rememberData = SaveSystem.FileFormatHandler.DeserializeObject <RememberData> (scriptData.data);
                    if (rememberData != null)
                    {
                        CustomGUILayout.MultiLineLabelGUI("   " + rememberData.GetType().ToString() + ":", EditorJsonUtility.ToJson(rememberData, true));
                    }
                }
            }

            if (allTransformData != null && allTransformData.Count > 0)
            {
                foreach (TransformData transformData in allTransformData)
                {
                    CustomGUILayout.MultiLineLabelGUI("   " + transformData.GetType().ToString() + ":", EditorJsonUtility.ToJson(transformData, true));
                }
            }

            CustomGUILayout.MultiLineLabelGUI("Active ActionLists:", activeLists.ToString());
            CustomGUILayout.MultiLineLabelGUI("Local Variables:", localVariablesData);
        }
Beispiel #2
0
        public void ShowGUI()
        {
            CustomGUILayout.MultiLineLabelGUI("Current Player ID:", currentPlayerID.ToString());
            CustomGUILayout.MultiLineLabelGUI("TimeScale:", timeScale.ToString());

            if (KickStarter.variablesManager != null)
            {
                EditorGUILayout.LabelField("Global Variables:");

                List <GVar> linkedVariables = SaveSystem.UnloadVariablesData(runtimeVariablesData, KickStarter.variablesManager.vars, true);
                foreach (GVar linkedVariable in linkedVariables)
                {
                    if (linkedVariable.link != VarLink.OptionsData)
                    {
                        EditorGUILayout.LabelField("   " + linkedVariable.label + ":", linkedVariable.GetValue());
                    }
                }
            }
            else
            {
                CustomGUILayout.MultiLineLabelGUI("Global Variables:", runtimeVariablesData);
            }

            EditorGUILayout.LabelField("Menus:");
            CustomGUILayout.MultiLineLabelGUI("   Menu locks:", menuLockData);
            CustomGUILayout.MultiLineLabelGUI("   Menu visibility:", menuVisibilityData);
            CustomGUILayout.MultiLineLabelGUI("   Menu element visibility:", menuElementVisibilityData);
            CustomGUILayout.MultiLineLabelGUI("   Menu journal pages:", menuJournalData);
            CustomGUILayout.MultiLineLabelGUI("   Direct-control gameplay?", canKeyboardControlMenusDuringGameplay.ToString());

            EditorGUILayout.LabelField("Inventory:");
            CustomGUILayout.MultiLineLabelGUI("   Selected InvItem ID:", selectedInventoryID.ToString());
            CustomGUILayout.MultiLineLabelGUI("   Is giving item?", isGivingItem.ToString());
            CustomGUILayout.MultiLineLabelGUI("   Global objectives:", globalObjectivesData);

            EditorGUILayout.LabelField("Systems:");
            CustomGUILayout.MultiLineLabelGUI("   Cursors disabled?", cursorIsOff.ToString());
            CustomGUILayout.MultiLineLabelGUI("   Input disabled?", inputIsOff.ToString());
            CustomGUILayout.MultiLineLabelGUI("   Interaction disabled?", interactionIsOff.ToString());
            CustomGUILayout.MultiLineLabelGUI("   Menus disabled?", menuIsOff.ToString());
            CustomGUILayout.MultiLineLabelGUI("   Movement disabled?", movementIsOff.ToString());
            CustomGUILayout.MultiLineLabelGUI("   Cameras disabled?", cameraIsOff.ToString());
            CustomGUILayout.MultiLineLabelGUI("   Triggers disabled", triggerIsOff.ToString());
            CustomGUILayout.MultiLineLabelGUI("   Players disabled?", playerIsOff.ToString());

            CustomGUILayout.MultiLineLabelGUI("Toggle cursor state:", toggleCursorState.ToString());
            CustomGUILayout.MultiLineLabelGUI("Movement method:", ((MovementMethod)movementMethod).ToString());

            EditorGUILayout.LabelField("Music:");
            CustomGUILayout.MultiLineLabelGUI("   Music queue data:", musicQueueData);
            CustomGUILayout.MultiLineLabelGUI("   Last music data:", lastMusicQueueData);
            CustomGUILayout.MultiLineLabelGUI("   Music time samples:", musicTimeSamples.ToString());
            CustomGUILayout.MultiLineLabelGUI("   Last music samples:", lastMusicTimeSamples.ToString());
            CustomGUILayout.MultiLineLabelGUI("   Old music samples:", oldMusicTimeSamples);

            EditorGUILayout.LabelField("Ambience:");
            CustomGUILayout.MultiLineLabelGUI("   Ambience queue data:", ambienceQueueData);
            CustomGUILayout.MultiLineLabelGUI("   Last ambience data:", lastAmbienceQueueData);
            CustomGUILayout.MultiLineLabelGUI("   Ambience time samples:", ambienceTimeSamples.ToString());
            CustomGUILayout.MultiLineLabelGUI("   Last ambience samples:", lastAmbienceTimeSamples.ToString());
            CustomGUILayout.MultiLineLabelGUI("   Old ambience samples:", oldAmbienceTimeSamples);

            EditorGUILayout.LabelField("Speech:");
            CustomGUILayout.MultiLineLabelGUI("Custom tokens:", customTokenData);
            CustomGUILayout.MultiLineLabelGUI("Spoken lines:", spokenLinesData);

            EditorGUILayout.LabelField("Active logic:");
            CustomGUILayout.MultiLineLabelGUI("   Active Conversation:", activeConversation.ToString());
            CustomGUILayout.MultiLineLabelGUI("   Active ArrowPrompt:", activeArrows.ToString());
            CustomGUILayout.MultiLineLabelGUI("   Active ActionList assets:", activeAssetLists);
            CustomGUILayout.MultiLineLabelGUI("   Active inputs:", activeInputsData);
        }
Beispiel #3
0
        public void ShowGUI()
        {
            try
            {
                CustomGUILayout.MultiLineLabelGUI("Player ID:", playerID.ToString());

                EditorGUILayout.LabelField("Scene info:");
                CustomGUILayout.MultiLineLabelGUI("   Current scene:", currentScene.ToString());
                CustomGUILayout.MultiLineLabelGUI("   Previous scene:", previousScene.ToString());
                CustomGUILayout.MultiLineLabelGUI("   Sub-scenes:", openSubScenes);
                if (tempPlayerStart != 0)
                {
                    CustomGUILayout.MultiLineLabelGUI("   PlayerStart ID:", tempPlayerStart.ToString());
                    CustomGUILayout.MultiLineLabelGUI("   PlayerStart method:", tempTeleportPlayerStartMethod.ToString());
                }

                EditorGUILayout.LabelField("Movement:");
                CustomGUILayout.MultiLineLabelGUI("   Position:", "(" + playerLocX.ToString() + ", " + playerLocY.ToString() + ", " + playerLocZ.ToString() + ")");
                CustomGUILayout.MultiLineLabelGUI("   Rotation:", playerRotY.ToString());
                CustomGUILayout.MultiLineLabelGUI("   Walk speed:", playerWalkSpeed.ToString());
                CustomGUILayout.MultiLineLabelGUI("   Run speed:", playerRunSpeed.ToString());
                CustomGUILayout.MultiLineLabelGUI("   Is running?", playerIsRunning.ToString());
                CustomGUILayout.MultiLineLabelGUI("   Up locked?", playerUpLock.ToString());
                CustomGUILayout.MultiLineLabelGUI("   Down locked?", playerDownLock.ToString());
                CustomGUILayout.MultiLineLabelGUI("   Left locked?", playerLeftlock.ToString());
                CustomGUILayout.MultiLineLabelGUI("   Right locked?", playerRightLock.ToString());
                CustomGUILayout.MultiLineLabelGUI("   Run locked?", playerRunLock.ToString());
                CustomGUILayout.MultiLineLabelGUI("   Free-aim locked?", playerFreeAimLock.ToString());
                CustomGUILayout.MultiLineLabelGUI("   Ignore gravity?", playerIgnoreGravity.ToString());

                EditorGUILayout.LabelField("Animation:");
                CustomGUILayout.MultiLineLabelGUI("   Idle animation:", playerIdleAnim);
                CustomGUILayout.MultiLineLabelGUI("   Walk animation:", playerWalkAnim);
                CustomGUILayout.MultiLineLabelGUI("   Talk animation:", playerTalkAnim);
                CustomGUILayout.MultiLineLabelGUI("   Run animation:", playerRunAnim);
                CustomGUILayout.MultiLineLabelGUI("   In custom state?", inCustomCharState.ToString());
                CustomGUILayout.MultiLineLabelGUI("   Left hand IK:", leftHandIKState);
                CustomGUILayout.MultiLineLabelGUI("   Right hand IK:", rightHandIKState);

                EditorGUILayout.LabelField("Sound:");
                CustomGUILayout.MultiLineLabelGUI("   Walk sound:", playerWalkSound);
                CustomGUILayout.MultiLineLabelGUI("   Run sound:", playerRunSound);

                EditorGUILayout.LabelField("Speech:");
                CustomGUILayout.MultiLineLabelGUI("   Portrait graphic:", playerPortraitGraphic);
                CustomGUILayout.MultiLineLabelGUI("   Speech label:", playerSpeechLabel);
                CustomGUILayout.MultiLineLabelGUI("   Speech label ID:", playerDisplayLineID.ToString());

                EditorGUILayout.LabelField("Pathfinding:");
                CustomGUILayout.MultiLineLabelGUI("   Target node:", playerTargetNode.ToString());
                CustomGUILayout.MultiLineLabelGUI("   Previous node:", playerPrevNode.ToString());
                CustomGUILayout.MultiLineLabelGUI("   Path data:", playerPathData);
                CustomGUILayout.MultiLineLabelGUI("   Locked to path?", playerLockedPath.ToString());
                CustomGUILayout.MultiLineLabelGUI("   Active path:", playerActivePath.ToString());
                CustomGUILayout.MultiLineLabelGUI("   Path affects Y?", playerPathAffectY.ToString());
                CustomGUILayout.MultiLineLabelGUI("   Last target node:", lastPlayerTargetNode.ToString());
                CustomGUILayout.MultiLineLabelGUI("   Last previous node:", lastPlayerPrevNode.ToString());
                CustomGUILayout.MultiLineLabelGUI("   Last active path:", lastPlayerActivePath.ToString());

                EditorGUILayout.LabelField("Sprites:");
                CustomGUILayout.MultiLineLabelGUI("   Lock direction?", playerLockDirection.ToString());
                CustomGUILayout.MultiLineLabelGUI("   Sprite direction:", playerSpriteDirection);
                CustomGUILayout.MultiLineLabelGUI("   Scale locked?", playerLockScale.ToString());
                CustomGUILayout.MultiLineLabelGUI("   Sprite scale:", playerSpriteScale.ToString());
                CustomGUILayout.MultiLineLabelGUI("   Lock sorting?", playerLockSorting.ToString());
                CustomGUILayout.MultiLineLabelGUI("   Sorting order:", playerSortingOrder.ToString());
                CustomGUILayout.MultiLineLabelGUI("   Sorting layer:", playerSortingLayer);
                CustomGUILayout.MultiLineLabelGUI("   Follow default Sorting Map?", followSortingMap.ToString());
                if (!followSortingMap)
                {
                    CustomGUILayout.MultiLineLabelGUI("   Sorting map?", customSortingMapID.ToString());
                }

                CustomGUILayout.MultiLineLabelGUI("Inventory:", inventoryData);
                CustomGUILayout.MultiLineLabelGUI("   Active Document:", activeDocumentID.ToString());
                CustomGUILayout.MultiLineLabelGUI("   Collected Documents:", collectedDocumentData.ToString());
                CustomGUILayout.MultiLineLabelGUI("   Last-open Document pages", lastOpenDocumentPagesData.ToString());
                CustomGUILayout.MultiLineLabelGUI("   Objectives:", playerObjectivesData.ToString());

                EditorGUILayout.LabelField("Head-turning:");
                CustomGUILayout.MultiLineLabelGUI("   Head facing Hotspot?", playerLockHotspotHeadTurning.ToString());
                CustomGUILayout.MultiLineLabelGUI("   Head turning?", isHeadTurning.ToString());
                CustomGUILayout.MultiLineLabelGUI("   Head target:", headTargetID.ToString());
                CustomGUILayout.MultiLineLabelGUI("   Head target position:", "(" + headTargetX + ", " + headTargetY + ", " + headTargetZ + ")");

                EditorGUILayout.LabelField("Camera:");
                CustomGUILayout.MultiLineLabelGUI("   Camera:", gameCamera.ToString());
                CustomGUILayout.MultiLineLabelGUI("   Last nav cam:", lastNavCamera.ToString());
                CustomGUILayout.MultiLineLabelGUI("   Last nav cam 2:", lastNavCamera2.ToString());
                CustomGUILayout.MultiLineLabelGUI("   Camera position:", "(" + mainCameraLocX + ", " + mainCameraLocY + ", " + mainCameraLocZ + ")");
                CustomGUILayout.MultiLineLabelGUI("   Camera rotation:", "(" + mainCameraRotX + ", " + mainCameraRotY + ", " + mainCameraRotZ + ")");
                CustomGUILayout.MultiLineLabelGUI("   Split-screen?", isSplitScreen.ToString());
                if (isSplitScreen)
                {
                    CustomGUILayout.MultiLineLabelGUI("   Top-left split?", isTopLeftSplit.ToString());
                    CustomGUILayout.MultiLineLabelGUI("   Vertical split?", splitIsVertical.ToString());
                    CustomGUILayout.MultiLineLabelGUI("   Split camera:", splitCameraID.ToString());
                    CustomGUILayout.MultiLineLabelGUI("   Split amount main:", splitAmountMain.ToString());
                    CustomGUILayout.MultiLineLabelGUI("   Split amount other:", splitAmountOther.ToString());
                    CustomGUILayout.MultiLineLabelGUI("   Overlay rect:", "(" + overlayRectX + ", " + overlayRectY + ", " + overlayRectWidth + ", " + overlayRectHeight + ")");
                }
                CustomGUILayout.MultiLineLabelGUI("   Shake intensity:", shakeIntensity.ToString());
                if (shakeIntensity > 0f)
                {
                    CustomGUILayout.MultiLineLabelGUI("   Shake duration", shakeDuration.ToString());
                    CustomGUILayout.MultiLineLabelGUI("   Shake effect:", ((CameraShakeEffect)shakeEffect).ToString());
                }

                if (playerScriptData != null && playerScriptData.Count > 0)
                {
                    EditorGUILayout.LabelField("Remember data:");
                    foreach (ScriptData scriptData in playerScriptData)
                    {
                        RememberData rememberData = SaveSystem.FileFormatHandler.DeserializeObject <RememberData> (scriptData.data);
                        if (rememberData != null)
                        {
                            CustomGUILayout.MultiLineLabelGUI("   " + rememberData.GetType().ToString() + ":", EditorJsonUtility.ToJson(rememberData, true));
                        }
                    }
                }
            }
            catch (Exception e)
            {
                ACDebug.LogWarning("Error displaying player data. Exception: " + e);
            }
        }
Beispiel #4
0
        private void SaveFileGUI()
        {
            iSaveFileHandler    saveFileHandler          = SaveSystem.SaveFileHandler;
            iOptionsFileHandler optionsFileHandler       = Options.OptionsFileHandler;
            iFileFormatHandler  fileFormatHandler        = SaveSystem.FileFormatHandler;
            iFileFormatHandler  optionsFileFormatHandler = SaveSystem.OptionsFileFormatHandler;

            if (optionsFileHandler == null)
            {
                EditorGUILayout.HelpBox("No Options File Handler assigned - one must be set in order to locate Profile Data.", MessageType.Warning);
                return;
            }

            if (saveFileHandler == null)
            {
                EditorGUILayout.HelpBox("No Save File Handler assigned - one must be set in order to locate Save Data.", MessageType.Warning);
                return;
            }

            EditorGUILayout.BeginVertical(CustomStyles.thinBox);
            showHandlers = CustomGUILayout.ToggleHeader(showHandlers, "File and format handlers");
            if (showHandlers)
            {
                if (saveFileHandler != null)
                {
                    EditorGUILayout.LabelField("Save file location:", saveFileHandler.GetType().Name);
                }

                if (optionsFileHandler != null)
                {
                    EditorGUILayout.LabelField("Options location:", optionsFileHandler.GetType().Name);
                }

                if (fileFormatHandler != null)
                {
                    EditorGUILayout.LabelField("File format:", fileFormatHandler.GetType().Name);
                }

                if (optionsFileFormatHandler != null && fileFormatHandler == null || (optionsFileFormatHandler.GetType().Name != fileFormatHandler.GetType().Name))
                {
                    EditorGUILayout.LabelField("Options format:", optionsFileFormatHandler.GetType().Name);
                }

                EditorGUILayout.HelpBox("Save format and location handlers can be modified through script - see the Manual's 'Custom save formats and handling' chapter.", MessageType.Info);
            }
            EditorGUILayout.EndVertical();

            if (settingsManager.useProfiles)
            {
                EditorGUILayout.Space();

                EditorGUILayout.BeginVertical(CustomStyles.thinBox);
                showProfiles = CustomGUILayout.ToggleHeader(showProfiles, "Profiles");
                if (showProfiles)
                {
                    bool foundSome = false;

                    for (int profileID = 0; profileID < Options.maxProfiles; profileID++)
                    {
                        if (optionsFileHandler.DoesProfileExist(profileID))
                        {
                            foundSome = true;
                            OptionsData tempOptionsData = Options.LoadPrefsFromID(profileID, false, false);

                            string label = profileID.ToString() + ": " + tempOptionsData.label;
                            if (profileID == Options.GetActiveProfileID())
                            {
                                label += " (ACTIVE)";
                            }

                            if (GUILayout.Toggle(selectedProfileID == profileID, label, "Button"))
                            {
                                if (selectedProfileID != profileID)
                                {
                                    selectedProfileID = profileID;
                                    selectedSaveIndex = -1;
                                    foundSaveFiles.Clear();
                                }
                            }
                        }
                    }

                    if (!foundSome)
                    {
                        selectedProfileID = -1;
                        EditorGUILayout.HelpBox("No save profiles found.", MessageType.Warning);
                    }
                }
                EditorGUILayout.EndVertical();
            }
            else
            {
                selectedProfileID = 0;
            }

            if (selectedProfileID < 0 || !optionsFileHandler.DoesProfileExist(selectedProfileID))
            {
                EditorGUILayout.HelpBox("No save profiles found! Run the game to create a new save profile", MessageType.Warning);
                return;
            }

            EditorGUILayout.Space();

            EditorGUILayout.BeginVertical(CustomStyles.thinBox);
            showProfile = CustomGUILayout.ToggleHeader(showProfile, "Profile " + selectedProfileID + ": Properties");
            if (showProfile)
            {
                OptionsData prefsData = GetPrefsData(selectedProfileID);
                if (prefsData != null)
                {
                    EditorGUILayout.LabelField("Label:", prefsData.label);
                    EditorGUILayout.LabelField("ID:", prefsData.ID.ToString());
                    EditorGUILayout.LabelField("Language:", prefsData.language.ToString());
                    if (prefsData.language != prefsData.voiceLanguage)
                    {
                        EditorGUILayout.LabelField("Voice language:", prefsData.voiceLanguage.ToString());
                    }
                    EditorGUILayout.LabelField("Show subtitles:", prefsData.showSubtitles.ToString());
                    EditorGUILayout.LabelField("SFX volume:", prefsData.sfxVolume.ToString());
                    EditorGUILayout.LabelField("Music volume:", prefsData.musicVolume.ToString());
                    EditorGUILayout.LabelField("Speech volume:", prefsData.speechVolume.ToString());

                    if (KickStarter.variablesManager != null)
                    {
                        List <GVar> linkedVariables = SaveSystem.UnloadVariablesData(prefsData.linkedVariables, KickStarter.variablesManager.vars, true);
                        foreach (GVar linkedVariable in linkedVariables)
                        {
                            if (linkedVariable.link == VarLink.OptionsData)
                            {
                                EditorGUILayout.LabelField(linkedVariable.label + ":", linkedVariable.GetValue());
                            }
                        }
                    }
                    else
                    {
                        EditorGUILayout.LabelField("Linked Variables:", prefsData.linkedVariables);
                    }

                    EditorGUILayout.BeginHorizontal();
                    if (settingsManager.useProfiles)
                    {
                        GUI.enabled = (selectedProfileID != Options.GetActiveProfileID());
                        if (GUILayout.Button("Make active"))
                        {
                            SwitchActiveProfile(selectedProfileID);
                        }
                        GUI.enabled = true;
                    }
                    if (GUILayout.Button("Delete profile"))
                    {
                        bool canDelete = EditorUtility.DisplayDialog("Delete profile?", "Are you sure you want to delete profile #" + selectedProfileID + "? This operation cannot be undone.", "Yes", "No");
                        if (canDelete)
                        {
                            Options.DeleteProfilePrefs(selectedProfileID);
                        }
                    }
                    EditorGUILayout.EndHorizontal();
                }
            }
            EditorGUILayout.EndVertical();

            EditorGUILayout.Space();

            foundSaveFiles = saveFileHandler.GatherSaveFiles(selectedProfileID);

            EditorGUILayout.BeginVertical(CustomStyles.thinBox);
            showSaves = CustomGUILayout.ToggleHeader(showSaves, "Save game files");
            if (showSaves)
            {
                if (foundSaveFiles != null)
                {
                    for (int saveIndex = 0; saveIndex < foundSaveFiles.Count; saveIndex++)
                    {
                        SaveFile saveFile = foundSaveFiles[saveIndex];
                        string   label    = saveFile.saveID.ToString() + ": " + saveFile.label;

                        if (GUILayout.Toggle(selectedSaveIndex == saveIndex, label, "Button"))
                        {
                            selectedSaveIndex = saveIndex;
                        }
                    }
                }

                if (foundSaveFiles == null || foundSaveFiles.Count == 0)
                {
                    selectedSaveIndex = -1;
                    EditorGUILayout.HelpBox("No save game files found.", MessageType.Warning);
                }

                EditorGUILayout.Space();
                EditorGUILayout.BeginHorizontal();
                GUI.enabled = Application.isPlaying;
                if (GUILayout.Button("Autosave"))
                {
                    if (!PlayerMenus.IsSavingLocked(null, true))
                    {
                        SwitchActiveProfile(selectedProfileID);
                        SaveSystem.SaveAutoSave();
                    }
                }
                if (GUILayout.Button("Save new"))
                {
                    if (!PlayerMenus.IsSavingLocked(null, true))
                    {
                        SwitchActiveProfile(selectedProfileID);
                        SaveSystem.SaveNewGame();
                    }
                }
                GUI.enabled = (foundSaveFiles != null && foundSaveFiles.Count > 0);
                if (GUILayout.Button("Delete all saves"))
                {
                    bool canDelete = EditorUtility.DisplayDialog("Delete all save files?", "Are you sure you want to delete all save files? This operation cannot be undone.", "Yes", "No");
                    if (canDelete)
                    {
                        saveFileHandler.DeleteAll(selectedProfileID);
                    }
                }
                EditorGUILayout.EndVertical();
            }
            EditorGUILayout.EndVertical();

            if (selectedSaveIndex < 0 || foundSaveFiles == null || selectedSaveIndex >= foundSaveFiles.Count)
            {
                return;
            }

            EditorGUILayout.Space();

            SaveFile selectedSaveFile = foundSaveFiles[selectedSaveIndex];

            EditorGUILayout.BeginVertical(CustomStyles.thinBox);
            showSave = CustomGUILayout.ToggleHeader(showSave, "Save game " + selectedSaveIndex + ": Properties");
            if (showSave)
            {
                EditorGUILayout.LabelField("Label:", selectedSaveFile.label);
                EditorGUILayout.LabelField("ID:", selectedSaveFile.saveID.ToString());

                CustomGUILayout.MultiLineLabelGUI("Filename:", selectedSaveFile.fileName);

                EditorGUILayout.LabelField("Timestamp:", selectedSaveFile.updatedTime.ToString());
                if (!string.IsNullOrEmpty(selectedSaveFile.screenshotFilename))
                {
                    CustomGUILayout.MultiLineLabelGUI("Filename:", selectedSaveFile.screenshotFilename);
                }
                EditorGUILayout.LabelField("Is auto-save?", selectedSaveFile.isAutoSave.ToString());

                GUILayout.BeginHorizontal();
                GUI.enabled = Application.isPlaying;
                if (GUILayout.Button("Load"))
                {
                    SwitchActiveProfile(selectedProfileID);
                    SaveSystem.LoadGame(0, selectedSaveFile.saveID, true);
                }
                if (GUILayout.Button("Save over"))
                {
                    if (!PlayerMenus.IsSavingLocked(null, true))
                    {
                        SwitchActiveProfile(selectedProfileID);
                        SaveSystem.SaveGame(0, selectedSaveFile.saveID, true);
                    }
                }
                GUI.enabled = true;

                if (GUILayout.Button("Delete"))
                {
                    bool canDelete = EditorUtility.DisplayDialog("Delete save file?", "Are you sure you want to delete the save file " + selectedSaveFile.label + "? This operation cannot be undone.", "Yes", "No");
                    if (canDelete)
                    {
                        saveFileHandler.Delete(selectedSaveFile);
                    }
                }
                GUILayout.EndHorizontal();
            }
            EditorGUILayout.EndVertical();

            EditorGUILayout.Space();

            EditorGUILayout.BeginVertical(CustomStyles.thinBox);
            showSaveData = CustomGUILayout.ToggleHeader(showSaveData, "Save game " + selectedSaveIndex + ": Data");
            if (showSaveData)
            {
                if (GUI.changed || !runCache)
                {
                    CacheSaveData(saveFileHandler, selectedSaveFile);
                }

                if (cachedSaveData != null)
                {
                    cachedSaveData.ShowGUI();
                }

                if (cachedLevelData != null)
                {
                    for (int i = 0; i < cachedLevelData.Count; i++)
                    {
                        GUILayout.Box(string.Empty, GUILayout.ExpandWidth(true), GUILayout.Height(1));
                        EditorGUILayout.LabelField("Scene data " + i.ToString() + ":", CustomStyles.subHeader);
                        cachedLevelData[i].ShowGUI();
                    }
                }
            }
            EditorGUILayout.EndVertical();
        }