コード例 #1
0
    private static void FinishMovingToLoadedScene(ILoadableGameState newScene, Save save)
    {
        newScene.IsLoadedFromSave = true;

        SceneManager.Instance.SwitchToScene(newScene.GameStateRoot);

        newScene.OnFinishLoading(save);
    }
コード例 #2
0
    private void Step()
    {
        switch (state)
        {
        case State.Initial:
            state = State.ReadingData;

            // Invalid is given as the target state here, because it's unknown yet.
            // TODO: See #1847
            LoadingScreen.Instance.Show(TranslationServer.Translate("LOADING_GAME"),
                                        MainGameState.Invalid,
                                        TranslationServer.Translate("READING_SAVE_DATA"));

            // Let all suppressed deletions happen
            TemporaryLoadedNodeDeleter.Instance.ReleaseAllHolds();

            break;

        case State.ReadingData:
        {
            // Start suppressing loaded node deletion
            TemporaryLoadedNodeDeleter.Instance.AddDeletionHold(Constants.DELETION_HOLD_LOAD);

            // TODO: do this in a background thread if possible
            try
            {
                // Invalid is given as the target state here, because it's unknown yet.
                // TODO: See #1847
                save = Save.LoadFromFile(saveName, () => Invoke.Instance.Perform(() =>
                                                                                 LoadingScreen.Instance.Show(TranslationServer.Translate("LOADING_GAME"),
                                                                                                             MainGameState.Invalid,
                                                                                                             TranslationServer.Translate("CREATING_OBJECTS_FROM_SAVE"))));

                state = State.CreatingScene;
            }
            catch (Exception e)
            {
                ReportStatus(false,
                             TranslationServer.Translate("AN_EXCEPTION_HAPPENED_WHILE_LOADING"),
                             e.ToString());
                state = State.Finished;

                // ReSharper disable HeuristicUnreachableCode ConditionIsAlwaysTrueOrFalse
                if (!Constants.CATCH_SAVE_ERRORS)
#pragma warning disable 162
                {
                    throw;
                }
#pragma warning restore 162

                // ReSharper restore HeuristicUnreachableCode ConditionIsAlwaysTrueOrFalse
            }

            break;
        }

        case State.CreatingScene:
        {
            try
            {
                loadedState = save.TargetScene;
            }
            catch (Exception)
            {
                ReportStatus(false, TranslationServer.Translate("SAVE_IS_INVALID"),
                             TranslationServer.Translate("SAVE_HAS_INVALID_GAME_STATE"));
                state = State.Finished;
                break;
            }

            state = State.ProcessingLoadedObjects;
            break;
        }

        case State.ProcessingLoadedObjects:
        {
            LoadingScreen.Instance.Show(TranslationServer.Translate("LOADING_GAME"),
                                        save.GameState,
                                        TranslationServer.Translate("PROCESSING_LOADED_OBJECTS"));

            if (loadedState.IsLoadedFromSave != true)
            {
                throw new Exception("Game load logic not working correctly, IsLoadedFromSave was not set");
            }

            try
            {
                SceneManager.Instance.SwitchToScene(loadedState.GameStateRoot);
                loadedState.OnFinishLoading(save);
            }
            catch (Exception e)
            {
                ReportStatus(false,
                             TranslationServer.Translate("AN_EXCEPTION_HAPPENED_WHILE_PROCESSING"),
                             e.ToString());
                state = State.Finished;
                break;
            }

            ReportStatus(true, TranslationServer.Translate("LOAD_FINISHED"), string.Empty);
            state = State.Finished;
            break;
        }

        case State.Finished:
        {
            stopwatch.Stop();
            GD.Print("load finished, success: ", success, " message: ", message, " elapsed: ", stopwatch.Elapsed);

            // Stop suppressing loaded node deletion
            TemporaryLoadedNodeDeleter.Instance.RemoveDeletionHold(Constants.DELETION_HOLD_LOAD);

            if (success)
            {
                LoadingScreen.Instance.Hide();
                SaveStatusOverlay.Instance.ShowMessage(message);

                // TODO: does this cause problems if the game was paused when saving?
                loadedState.GameStateRoot.GetTree().Paused = false;
            }
            else
            {
                SaveStatusOverlay.Instance.ShowError(TranslationServer.Translate("ERROR_LOADING"),
                                                     message, exception, true,
                                                     () => LoadingScreen.Instance.Hide());
            }

            IsLoading = false;
            return;
        }

        default:
            throw new InvalidOperationException();
        }

        Invoke.Instance.Queue(Step);
    }
コード例 #3
0
    private void Step()
    {
        switch (state)
        {
        case State.Initial:
            state = State.ReadingData;
            LoadingScreen.Instance.Show("Loading Game", "Reading save data");

            // Start suppressing loaded node deletion
            TemporaryLoadedNodeDeleter.Instance.AddDeletionHold(Constants.DELETION_HOLD_LOAD);

            break;

        case State.ReadingData:
        {
            // TODO: do this in a background thread if possible
            try
            {
                save = Save.LoadFromFile(saveName, () => Invoke.Instance.Perform(() =>
                                                                                 LoadingScreen.Instance.Show("Loading Game", "Creating objects from save")));
            }
            catch (Exception e)
            {
                ReportStatus(false, "An exception happened while loading the save data", e.ToString());
                state = State.Finished;
                break;
            }

            state = State.CreatingScene;
            break;
        }

        case State.CreatingScene:
        {
            try
            {
                loadedScene = SceneManager.Instance.LoadScene(save.GameState);
            }
            catch (ArgumentException)
            {
                ReportStatus(false, "Save is invalid", "Save has an unknown game state");
                state = State.Finished;
                break;
            }

            try
            {
                loadedState = (ILoadableGameState)loadedScene.Instance();
            }
            catch (Exception e)
            {
                ReportStatus(false, "An exception happened while instantiating target scene", e.ToString());
                state = State.Finished;
                break;
            }

            state = State.ProcessingLoadedObjects;
            break;
        }

        case State.ProcessingLoadedObjects:
        {
            LoadingScreen.Instance.Show("Loading Game", "Processing loaded objects");

            loadedState.IsLoadedFromSave = true;

            SceneManager.Instance.SwitchToScene(loadedState.GameStateRoot);

            try
            {
                loadedState.OnFinishLoading(save);
            }
            catch (Exception e)
            {
                ReportStatus(false, "An exception happened while processing loaded objects", e.ToString());
                state = State.Finished;
                break;
            }

            ReportStatus(true, "Load finished", string.Empty);
            state = State.Finished;
            break;
        }

        case State.Finished:
        {
            stopwatch.Stop();
            GD.Print("load finished, success: ", success, " message: ", message, " elapsed: ", stopwatch.Elapsed);

            // Stop suppressing loaded node deletion
            TemporaryLoadedNodeDeleter.Instance.RemoveDeletionHold(Constants.DELETION_HOLD_LOAD);

            if (success)
            {
                LoadingScreen.Instance.Hide();
                SaveStatusOverlay.Instance.ShowMessage(message);

                loadedState.GameStateRoot.GetTree().Paused = false;
            }
            else
            {
                SaveStatusOverlay.Instance.ShowError("Error Loading", message, exception, true,
                                                     () => LoadingScreen.Instance.Hide());
            }

            return;
        }

        default:
            throw new InvalidOperationException();
        }

        Invoke.Instance.Queue(Step);
    }
コード例 #4
0
    private void Step()
    {
        switch (state)
        {
        case State.Initial:
            state = State.ReadingData;
            LoadingScreen.Instance.Show("Loading Game", "Reading save data");

            // Let all suppressed deletions happen
            TemporaryLoadedNodeDeleter.Instance.ReleaseAllHolds();

            break;

        case State.ReadingData:
        {
            // Start suppressing loaded node deletion
            TemporaryLoadedNodeDeleter.Instance.AddDeletionHold(Constants.DELETION_HOLD_LOAD);

            // TODO: do this in a background thread if possible
            try
            {
                save = Save.LoadFromFile(saveName, () => Invoke.Instance.Perform(() =>
                                                                                 LoadingScreen.Instance.Show("Loading Game", "Creating objects from save")));

                state = State.CreatingScene;
            }
            catch (Exception e)
            {
                ReportStatus(false, "An exception happened while loading the save data", e.ToString());
                state = State.Finished;

                // ReSharper disable HeuristicUnreachableCode ConditionIsAlwaysTrueOrFalse
                if (!Constants.CATCH_SAVE_ERRORS)
#pragma warning disable 162
                {
                    throw;
                }
#pragma warning restore 162

                // ReSharper restore HeuristicUnreachableCode ConditionIsAlwaysTrueOrFalse
            }

            break;
        }

        case State.CreatingScene:
        {
            try
            {
                loadedState = save.TargetScene;
            }
            catch (Exception)
            {
                ReportStatus(false, "Save is invalid", "Save has invalid game state scene");
                state = State.Finished;
                break;
            }

            state = State.ProcessingLoadedObjects;
            break;
        }

        case State.ProcessingLoadedObjects:
        {
            LoadingScreen.Instance.Show("Loading Game", "Processing loaded objects");

            if (loadedState.IsLoadedFromSave != true)
            {
                throw new Exception("Game load logic not working correctly, IsLoadedFromSave was not set");
            }

            try
            {
                SceneManager.Instance.SwitchToScene(loadedState.GameStateRoot);
                loadedState.OnFinishLoading(save);
            }
            catch (Exception e)
            {
                ReportStatus(false, "An exception happened while processing loaded objects", e.ToString());
                state = State.Finished;
                break;
            }

            ReportStatus(true, "Load finished", string.Empty);
            state = State.Finished;
            break;
        }

        case State.Finished:
        {
            stopwatch.Stop();
            GD.Print("load finished, success: ", success, " message: ", message, " elapsed: ", stopwatch.Elapsed);

            // Stop suppressing loaded node deletion
            TemporaryLoadedNodeDeleter.Instance.RemoveDeletionHold(Constants.DELETION_HOLD_LOAD);

            if (success)
            {
                LoadingScreen.Instance.Hide();
                SaveStatusOverlay.Instance.ShowMessage(message);

                // TODO: does this cause problems if the game was paused when saving?
                loadedState.GameStateRoot.GetTree().Paused = false;
            }
            else
            {
                SaveStatusOverlay.Instance.ShowError("Error Loading", message, exception, true,
                                                     () => LoadingScreen.Instance.Hide());
            }

            IsLoading = false;
            return;
        }

        default:
            throw new InvalidOperationException();
        }

        Invoke.Instance.Queue(Step);
    }