diff options
Diffstat (limited to 'Thronefall_v1.0/Decompile/SceneTransitionManager.cs')
-rw-r--r-- | Thronefall_v1.0/Decompile/SceneTransitionManager.cs | 254 |
1 files changed, 254 insertions, 0 deletions
diff --git a/Thronefall_v1.0/Decompile/SceneTransitionManager.cs b/Thronefall_v1.0/Decompile/SceneTransitionManager.cs new file mode 100644 index 0000000..0142bc4 --- /dev/null +++ b/Thronefall_v1.0/Decompile/SceneTransitionManager.cs @@ -0,0 +1,254 @@ +using System.Collections; +using System.Collections.Generic; +using TMPro; +using UnityEngine; +using UnityEngine.Events; +using UnityEngine.SceneManagement; +using UnityEngine.UI; + +public class SceneTransitionManager : MonoBehaviour +{ + public enum SceneState + { + MainMenu, + LevelSelect, + InGame + } + + public static SceneTransitionManager instance; + + public string uiScene = "_UI"; + + public string mainMenuScene = "_StartMenu"; + + public string levelSelectScene; + + public Image placeholderCloudsTransition; + + public TMP_Text loadingText; + + public float cloudFadeInTime = 1f; + + public float cloudFadeOutTime = 2f; + + [HideInInspector] + public UnityEvent onSceneChange = new UnityEvent(); + + private SceneState currentSceneState; + + private SceneState lastSceneState; + + private int ingameScoreFromLastMatch; + + private int goldBonusScoreFromLastMatch; + + private int mutatorBonusScoreFromLastMatch; + + private string comingFromGameplayScene = ""; + + private int totalScoreFromLastMatch; + + private bool totalScoreFromLastMatchIsNewPersonalRecord; + + private LevelData levelDataFromLastMatch; + + private bool sceneTransitionIsRunning; + + private Color cloudsIn; + + private Color cloudsOut; + + private Coroutine currentTransition; + + public SceneState CurrentSceneState => currentSceneState; + + public SceneState LastSceneState => lastSceneState; + + public int IngameScoreFromLastMatch => ingameScoreFromLastMatch; + + public int GoldBonusScoreFromLastMatch => goldBonusScoreFromLastMatch; + + public int MutatorBonusScoreFromLastMatch => mutatorBonusScoreFromLastMatch; + + public int TotalScoreFromLastMatch => totalScoreFromLastMatch; + + public bool TotalScoreFromLastMatchIsNewPersonalRecord => totalScoreFromLastMatchIsNewPersonalRecord; + + public string ComingFromGameplayScene => comingFromGameplayScene; + + public LevelData LevelDataFromLastMatch => levelDataFromLastMatch; + + public bool SceneTransitionIsRunning => sceneTransitionIsRunning; + + private void Awake() + { + if ((bool)instance) + { + Object.Destroy(base.gameObject); + return; + } + instance = this; + Object.DontDestroyOnLoad(base.transform.root.gameObject); + if (!SceneManager.GetSceneByName(uiScene).IsValid()) + { + SceneManager.LoadScene(uiScene, LoadSceneMode.Additive); + } + cloudsIn = placeholderCloudsTransition.color; + cloudsOut = cloudsIn; + cloudsOut.a = 0f; + loadingText.alpha = 0f; + } + + private void Start() + { + } + + public void TransitionFromLevelSelectToLevel(string _levelname) + { + if (currentSceneState != SceneState.LevelSelect) + { + Debug.LogWarning("You should only transition to a specific level from the level selection scene."); + } + else + { + TransitionToScene(_levelname); + } + } + + public void TransitionFromNullToLevel(string _levelname) + { + TransitionToScene(_levelname); + } + + public void RestartCurrentLevel() + { + TransitionToScene(SceneManager.GetActiveScene().name); + } + + public void TransitionFromGameplayToEndScreen(int _score, int _goldBonusScore, int _mutatorBonusScore) + { + comingFromGameplayScene = SceneManager.GetActiveScene().name; + LevelData levelData = (levelDataFromLastMatch = LevelProgressManager.instance.GetLevelDataForScene(comingFromGameplayScene)); + if (currentSceneState != SceneState.InGame) + { + Debug.LogWarning("You should only transition to the end screen from a gameply level."); + return; + } + ingameScoreFromLastMatch = _score; + goldBonusScoreFromLastMatch = _goldBonusScore; + mutatorBonusScoreFromLastMatch = _mutatorBonusScore; + levelData.highscore = _score + _goldBonusScore + _mutatorBonusScore; + totalScoreFromLastMatch = levelData.highscore; + totalScoreFromLastMatchIsNewPersonalRecord = totalScoreFromLastMatch > levelData.highscoreBest; + UIFrameManager.TriggerEndOfMatch(); + } + + public void TransitionFromEndScreenToLevelSelect() + { + TransitionToScene(levelSelectScene); + } + + private void TransitionToScene(string _scenename) + { + if (!sceneTransitionIsRunning) + { + lastSceneState = currentSceneState; + if (_scenename == levelSelectScene) + { + currentSceneState = SceneState.LevelSelect; + } + else if (_scenename == mainMenuScene) + { + currentSceneState = SceneState.MainMenu; + } + else + { + currentSceneState = SceneState.InGame; + } + onSceneChange.Invoke(); + StartCoroutine(SceneTransitionAnimation(_scenename)); + } + } + + private float FadeFormula(float f) + { + return Mathf.Pow(f, 4f); + } + + private IEnumerator SceneTransitionAnimation(string _scenename) + { + sceneTransitionIsRunning = true; + int sceneCount = SceneManager.sceneCount; + placeholderCloudsTransition.gameObject.SetActive(value: true); + float clock2 = 0f; + while (clock2 <= cloudFadeInTime) + { + float num = Mathf.Clamp(Time.unscaledDeltaTime, 0f, 0.1f); + clock2 += num; + placeholderCloudsTransition.color = Color.Lerp(cloudsOut, cloudsIn, 1f - FadeFormula(1f - clock2 / cloudFadeInTime)); + loadingText.alpha = 1f - FadeFormula(1f - clock2 / cloudFadeInTime); + yield return null; + } + placeholderCloudsTransition.color = cloudsIn; + loadingText.alpha = 1f; + List<AsyncOperation> loadOperations = new List<AsyncOperation>(); + if (sceneCount > 0) + { + for (int num2 = sceneCount - 1; num2 >= 0; num2--) + { + Scene sceneAt = SceneManager.GetSceneAt(num2); + if (sceneAt.name != uiScene) + { + loadOperations.Add(SceneManager.UnloadSceneAsync(sceneAt)); + } + } + } + loadOperations.Add(SceneManager.LoadSceneAsync(_scenename, LoadSceneMode.Additive)); + while (loadOperations.Count > 0) + { + for (int num3 = loadOperations.Count - 1; num3 >= 0; num3--) + { + if (loadOperations[num3].isDone) + { + loadOperations.RemoveAt(num3); + } + } + yield return null; + } + SceneManager.SetActiveScene(SceneManager.GetSceneByName(_scenename)); + UIFrameManager.instance.CloseAllFrames(); + if (_scenename == mainMenuScene) + { + UIFrameManager.instance.SwitchToTitleFrame(); + } + clock2 = 0f; + while (clock2 <= cloudFadeOutTime) + { + float num4 = Mathf.Clamp(Time.unscaledDeltaTime, 0f, 0.1f); + clock2 += num4; + placeholderCloudsTransition.color = Color.Lerp(cloudsIn, cloudsOut, FadeFormula(clock2 / cloudFadeOutTime)); + loadingText.alpha = 1f - FadeFormula(1f - clock2 / cloudFadeInTime); + yield return null; + } + placeholderCloudsTransition.color = cloudsOut; + loadingText.alpha = 0f; + placeholderCloudsTransition.gameObject.SetActive(value: false); + sceneTransitionIsRunning = false; + } + + public void TransitionFromNullToLevelSelect() + { + TransitionToScene(levelSelectScene); + } + + public void TransitionFromLevelToLevelSelect() + { + comingFromGameplayScene = SceneManager.GetActiveScene().name; + TransitionToScene(levelSelectScene); + } + + public void TransitionToMainMenu() + { + TransitionToScene(mainMenuScene); + } +} |