using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using CIG3.ExtensionMethods; using SUISS.Cloud; using SUISS.Core; using SUISS.Storage; using SUISSEngine; using UnityEngine; using UnityEngine.SceneManagement; public sealed class CIGIslandsManager : SingletonMonobehaviour { //[DebuggerBrowsable(DebuggerBrowsableState.Never)] public event CIGIslandsManager.IslandChangedEventHandler IslandChangedEvent; private void FireIslandChangedEvent(Island island, bool isVisiting) { if (this.IslandChangedEvent != null) { this.IslandChangedEvent(island, isVisiting); } } //[DebuggerBrowsable(DebuggerBrowsableState.Never)] public event CIGIslandsManager.VisitingStartedEventHandler VisitingStartedEvent; private void FireVisitingStartedEvent() { if (this.VisitingStartedEvent != null) { this.VisitingStartedEvent(); } } //[DebuggerBrowsable(DebuggerBrowsableState.Never)] public event CIGIslandsManager.VisitingEndedEventHandler VisitingStoppedEvent; private void FireVisitingEndedEvent() { if (this.VisitingStoppedEvent != null) { this.VisitingStoppedEvent(); } } private void Start() { SingletonMonobehaviour.Instance.DataDownloadedEvent += this.OnVisitingIslandDataDownloaded; SingletonMonobehaviour.Instance.PullRequestCompleted += this.OnWebServicePullRequestCompleted; Singleton.Instance.LanguageChangedEvent += this.OnLanguageChanged; this._storage = Storage.Get(StorageLifecycle.Game).GetDictionary("WorldMapController"); this.SkipWorldMapOnLoad = this._storage.GetBoolean("SkipWorldMapOnLoad", false); if (this.SkipWorldMapOnLoad) { this.LoadIsland(Island.GoneGreenlands, false); } else { SingletonMonobehaviour.Instance.ShowInstant(); SingletonMonobehaviour.Instance.ShowInstant(); SingletonMonobehaviour.Instance.HideAnimated(); } } protected override void OnDestroy() { if (SingletonMonobehaviour.IsAvailable) { SingletonMonobehaviour.Instance.DataDownloadedEvent -= this.OnVisitingIslandDataDownloaded; } if (SingletonMonobehaviour.IsAvailable) { SingletonMonobehaviour.Instance.PullRequestCompleted -= this.OnWebServicePullRequestCompleted; } if (Singleton.IsAvailable) { Singleton.Instance.LanguageChangedEvent -= this.OnLanguageChanged; } base.OnDestroy(); } public void LoadIsland(Island island, bool animateIn) { if (this.IsLoading) { return; } if (this.IsVisiting) { base.StartCoroutine(this.LoadVisitingIslandRoutine(island)); } else { base.StartCoroutine(this.LoadIslandRoutine(island, animateIn)); } } public void StartVisiting(LeaderboardEntry player) { if (!this.IsVisiting && !this.IsLoading) { this._visitingPlayer = player; base.StartCoroutine(this.StartVisitingRoutine()); } } public void StopVisiting() { if (this.IsVisiting) { this._visitingPlayer = null; base.StartCoroutine(this.StopVisitingRoutine()); } } public bool IsUnlocked(Island island) { bool result; if (this.IsVisiting) { bool flag = SingletonMonobehaviour.Instance.VisitingIslandDataAvaible(island, this._visitingPlayer.InstallUuid); bool flag2 = SingletonMonobehaviour.Instance.IsUnlocked(island, this._visitingPlayer.InstallUuid); result = (flag && flag2); } else { result = SingletonMonobehaviour.Instance.IsIslandUnlocked(island); } return result; } public Island CurrentIsland { get { return this._currentIsland; } } public LeaderboardEntry VisitingPlayer { get { return this._visitingPlayer; } } public bool IsLoading { get; private set; } public bool IsVisiting { get { return this._visitingPlayer != null; } } public bool SkipWorldMapOnLoad { get; private set; } private IEnumerator LoadIslandRoutine(Island newIsland, bool animateIn) { if (newIsland.IsValid()) { this.IsLoading = true; if (animateIn) { yield return SingletonMonobehaviour.Instance.ShowAnimated(); } else { SingletonMonobehaviour.Instance.ShowInstant(); } if (newIsland != this._currentIsland) { if (this._currentIsland.IsValid()) { yield return SceneManager.UnloadSceneAsync(this._currentIsland.GetSceneName()); } this._currentIsland = newIsland; yield return SceneManager.LoadSceneAsync(newIsland.GetSceneName(), LoadSceneMode.Additive); yield return new WaitForEndOfFrame(); yield return new WaitForEndOfFrame(); yield return new WaitForEndOfFrame(); } this.IsLoading = false; this.FireIslandChangedEvent(this._currentIsland, this.IsVisiting); yield return SingletonMonobehaviour.Instance.HideAnimated(); } yield break; } private IEnumerator LoadVisitingIslandRoutine(Island visitingIsland) { if (SingletonMonobehaviour.Instance.LoadVisitingIslandData(visitingIsland, this._visitingPlayer.InstallUuid)) { this.IsLoading = true; yield return SingletonMonobehaviour.Instance.ShowAnimated(); if (SceneManager.GetSceneByName("VisitingIsland").isLoaded) { yield return SceneManager.UnloadSceneAsync("VisitingIsland"); } this._currentIsland = visitingIsland; yield return SceneManager.LoadSceneAsync("VisitingIsland", LoadSceneMode.Additive); yield return new WaitForEndOfFrame(); yield return new WaitForEndOfFrame(); yield return new WaitForEndOfFrame(); this.IsLoading = false; this.FireIslandChangedEvent(this._currentIsland, this.IsVisiting); yield return SingletonMonobehaviour.Instance.HideAnimated(); } else { UnityEngine.Debug.LogError("Visiting Island data not loaded!"); } yield break; } private IEnumerator StartVisitingRoutine() { this.IsLoading = true; yield return SingletonMonobehaviour.Instance.ShowAnimated(); if (this._currentIsland.IsValid()) { yield return SceneManager.UnloadSceneAsync(this._currentIsland.GetSceneName()); this._currentIsland = Island.None; } this.FireVisitingStartedEvent(); yield return SingletonMonobehaviour.Instance.HideAnimated(); this.IsLoading = false; yield break; } private IEnumerator StopVisitingRoutine() { this.IsLoading = true; yield return SingletonMonobehaviour.Instance.ShowAnimated(); if (SceneManager.GetSceneByName("VisitingIsland").isLoaded) { yield return SceneManager.UnloadSceneAsync("VisitingIsland"); } this._currentIsland = Island.None; this.FireVisitingEndedEvent(); yield return SingletonMonobehaviour.Instance.HideAnimated(); this.IsLoading = false; yield break; } private void OnVisitingIslandDataDownloaded(Island island, string uuid) { SingletonMonobehaviour.Instance.Refresh(); } private void OnWebServicePullRequestCompleted() { this._storage["SkipWorldMapOnLoad"] = SingletonMonobehaviour.Instance.Properties.GetBoolean("SkipWorldMapOnLoad", false); } private void OnLanguageChanged() { SingletonMonobehaviour.Instance.Refresh(); } private const string StorageKey = "WorldMapController"; private const string SkipWorldMapOnLoadKey = "SkipWorldMapOnLoad"; private const StorageLifecycle storageLifecycle = StorageLifecycle.Game; private const string VisitingIslandSceneName = "VisitingIsland"; private Island _currentIsland = Island.None; private LeaderboardEntry _visitingPlayer; private Dictionary _storage; public delegate void IslandChangedEventHandler(Island island, bool isVisiting); public delegate void VisitingStartedEventHandler(); public delegate void VisitingEndedEventHandler(); }