Beispiel #1
0
    public static void TestWeakReferencePauseLock()
    {
        AsyncUtils.RunWithExceptionHandling(async() =>
        {
            object lockObject = new object();
            WeakReference untypedWeakReference = new WeakReference(lockObject);
            LockPauseModule.PauseGame(PauseLockType.AllowMenu, untypedWeakReference);
            Debug.Log("Untyped lock added!");

            await Task.Delay(3000);
            AsyncUtils.ThrowIfEditorStopped();

            lockObject = null;
            CoreUtils.CollectGarbage(false);

            Debug.Log("Untyped lock released!");

            await Task.Yield();
            AsyncUtils.ThrowIfEditorStopped();

            LockPauseModule.ForceCleanLocks();

            Debug.Log("Locks cleaned!");

            await Task.Delay(5000);
            AsyncUtils.ThrowIfEditorStopped();

            IEnumerable typedLockObject = new string[] { "lol", "hi" };
            WeakReference <IEnumerable> typedWeakReference = new WeakReference <IEnumerable>(typedLockObject);

            LockPauseModule.PauseGame(PauseLockType.AllowMenu, typedWeakReference);
            Debug.Log("Typed lock added!");

            await Task.Delay(3000);
            AsyncUtils.ThrowIfEditorStopped();

            typedLockObject = null;
            CoreUtils.CollectGarbage(false);

            Debug.Log("Typed lock released!");

            await Task.Yield();
            AsyncUtils.ThrowIfEditorStopped();

            LockPauseModule.ForceCleanLocks();

            Debug.Log("Locks cleaned!");
        });
    }
Beispiel #2
0
        /// <summary>
        /// Immediately begin loading the scene
        /// </summary>
        void Start()
        {
            //the loading screen cannot be truly skipped, but it can be hidden
            if (!MetaState.Instance.SkipLoadingScreen)
            {
                //appear the overlay
                DefaultLoadingCanvas.gameObject.SetActive(true);
            }

            CoreUtils.CollectGarbage(false);

            Application.logMessageReceived += HandleLog;

            try
            {
                if (MetaState.Instance.TransitionType == SceneTransitionType.ChangeScene)
                {
                    MetaState.Instance.IntentsExecuteLoading();
                    MetaState.Instance.IntentsRemoveInvalid();
                    //we are merely changing scenes, go straight to loading the next scene
                    GameState.Instance.CurrentScene = MetaState.Instance.NextScene;
                    ScriptingModule.CallHooked(ScriptHook.OnSceneTransition, this);
                    StartCoroutine(LoadNextSceneAsync());
                }
                else if (MetaState.Instance.TransitionType == SceneTransitionType.LoadGame)
                {
                    //we are loading a game, so load the game data and then load the next scene (which is part of save data)
                    GameState.DeserializeFromFile(CoreParams.SavePath + Path.DirectorySeparatorChar + MetaState.Instance.LoadSave);
                    PersistState.Instance.LastCampaignIdentifier = GameState.Instance.CampaignIdentifier;
                    MetaState.Instance.NextScene = GameState.Instance.CurrentScene;
                    ScriptingModule.CallHooked(ScriptHook.OnGameLoad, this);
                    StartCoroutine(LoadNextSceneAsync());
                }
                else if (MetaState.Instance.TransitionType == SceneTransitionType.NewGame)
                {
                    string sceneOverride = MetaState.Instance.NextScene;
                    GameState.Recreate();
                    MetaState.Instance.Clear();
                    MetaState.Instance.NextScene = string.IsNullOrEmpty(sceneOverride) ? CoreParams.InitialScene : sceneOverride;
                    GameState.LoadInitial();
                    PersistState.Instance.LastCampaignIdentifier = GameState.Instance.CampaignIdentifier;
                    GameState.Instance.CurrentScene = MetaState.Instance.NextScene;
                    CCBase.OnGameStart();
                    StartCoroutine(LoadNextSceneAsync());
                }
                else if (MetaState.Instance.TransitionType == SceneTransitionType.EndGame)
                {
                    CCBase.OnGameEnd();
                    GameState.Clear();
                    MetaState.Instance.Clear();
                    if (string.IsNullOrEmpty(MetaState.Instance.NextScene))
                    {
                        MetaState.Instance.NextScene = CoreParams.MainMenuScene;
                    }
                    StartCoroutine(LoadNextSceneAsync());
                }
            }
            catch (Exception e)
            {
                //pokemon exception handling

                Debug.LogError($"Error loading scene ({e.GetType().Name})");
                if (ConfigState.Instance.UseVerboseLogging)
                {
                    Debug.LogException(e);
                }
                Modal.PushConfirmModal(string.Format("{0}\n{1}", e.ToString(), e.StackTrace), "Error loading scene", "Exit", "Return", null, OnErrorConfirmed);
            }

            //clear certain metagamestate on use
            MetaState.Instance.SkipLoadingScreen = false;

            ScriptingModule.CallHooked(ScriptHook.OnLoadingSceneOpen, this);
        }