您不能選擇超過 %s 個話題 話題必須以字母或數字為開頭,可包含連接號 ('-') 且最長為 35 個字
 
 
 

285 行
8.1 KiB

  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Diagnostics;
  5. using CIG3.ExtensionMethods;
  6. using SUISS.Cloud;
  7. using SUISS.Core;
  8. using SUISS.Storage;
  9. using SUISSEngine;
  10. using UnityEngine;
  11. using UnityEngine.SceneManagement;
  12. public sealed class CIGIslandsManager : SingletonMonobehaviour<CIGIslandsManager>
  13. {
  14. //[DebuggerBrowsable(DebuggerBrowsableState.Never)]
  15. public event CIGIslandsManager.IslandChangedEventHandler IslandChangedEvent;
  16. private void FireIslandChangedEvent(Island island, bool isVisiting)
  17. {
  18. if (this.IslandChangedEvent != null)
  19. {
  20. this.IslandChangedEvent(island, isVisiting);
  21. }
  22. }
  23. //[DebuggerBrowsable(DebuggerBrowsableState.Never)]
  24. public event CIGIslandsManager.VisitingStartedEventHandler VisitingStartedEvent;
  25. private void FireVisitingStartedEvent()
  26. {
  27. if (this.VisitingStartedEvent != null)
  28. {
  29. this.VisitingStartedEvent();
  30. }
  31. }
  32. //[DebuggerBrowsable(DebuggerBrowsableState.Never)]
  33. public event CIGIslandsManager.VisitingEndedEventHandler VisitingStoppedEvent;
  34. private void FireVisitingEndedEvent()
  35. {
  36. if (this.VisitingStoppedEvent != null)
  37. {
  38. this.VisitingStoppedEvent();
  39. }
  40. }
  41. private void Start()
  42. {
  43. SingletonMonobehaviour<CIGVisitingIslandsManager>.Instance.DataDownloadedEvent += this.OnVisitingIslandDataDownloaded;
  44. SingletonMonobehaviour<CIGWebService>.Instance.PullRequestCompleted += this.OnWebServicePullRequestCompleted;
  45. Singleton<CIGSettings>.Instance.LanguageChangedEvent += this.OnLanguageChanged;
  46. this._storage = Storage.Get(StorageLifecycle.Game).GetDictionary("WorldMapController");
  47. this.SkipWorldMapOnLoad = this._storage.GetBoolean("SkipWorldMapOnLoad", false);
  48. if (this.SkipWorldMapOnLoad)
  49. {
  50. this.LoadIsland(Island.GoneGreenlands, false);
  51. }
  52. else
  53. {
  54. SingletonMonobehaviour<CinematicEffect>.Instance.ShowInstant();
  55. SingletonMonobehaviour<WorldMap>.Instance.ShowInstant();
  56. SingletonMonobehaviour<CinematicEffect>.Instance.HideAnimated();
  57. }
  58. }
  59. protected override void OnDestroy()
  60. {
  61. if (SingletonMonobehaviour<CIGVisitingIslandsManager>.IsAvailable)
  62. {
  63. SingletonMonobehaviour<CIGVisitingIslandsManager>.Instance.DataDownloadedEvent -= this.OnVisitingIslandDataDownloaded;
  64. }
  65. if (SingletonMonobehaviour<CIGWebService>.IsAvailable)
  66. {
  67. SingletonMonobehaviour<CIGWebService>.Instance.PullRequestCompleted -= this.OnWebServicePullRequestCompleted;
  68. }
  69. if (Singleton<CIGSettings>.IsAvailable)
  70. {
  71. Singleton<CIGSettings>.Instance.LanguageChangedEvent -= this.OnLanguageChanged;
  72. }
  73. base.OnDestroy();
  74. }
  75. public void LoadIsland(Island island, bool animateIn)
  76. {
  77. if (this.IsLoading)
  78. {
  79. return;
  80. }
  81. if (this.IsVisiting)
  82. {
  83. base.StartCoroutine(this.LoadVisitingIslandRoutine(island));
  84. }
  85. else
  86. {
  87. base.StartCoroutine(this.LoadIslandRoutine(island, animateIn));
  88. }
  89. }
  90. public void StartVisiting(LeaderboardEntry player)
  91. {
  92. if (!this.IsVisiting && !this.IsLoading)
  93. {
  94. this._visitingPlayer = player;
  95. base.StartCoroutine(this.StartVisitingRoutine());
  96. }
  97. }
  98. public void StopVisiting()
  99. {
  100. if (this.IsVisiting)
  101. {
  102. this._visitingPlayer = null;
  103. base.StartCoroutine(this.StopVisitingRoutine());
  104. }
  105. }
  106. public bool IsUnlocked(Island island)
  107. {
  108. bool result;
  109. if (this.IsVisiting)
  110. {
  111. bool flag = SingletonMonobehaviour<CIGVisitingIslandsManager>.Instance.VisitingIslandDataAvaible(island, this._visitingPlayer.InstallUuid);
  112. bool flag2 = SingletonMonobehaviour<CIGVisitingIslandsManager>.Instance.IsUnlocked(island, this._visitingPlayer.InstallUuid);
  113. result = (flag && flag2);
  114. }
  115. else
  116. {
  117. result = SingletonMonobehaviour<CIGGameState>.Instance.IsIslandUnlocked(island);
  118. }
  119. return result;
  120. }
  121. public Island CurrentIsland
  122. {
  123. get
  124. {
  125. return this._currentIsland;
  126. }
  127. }
  128. public LeaderboardEntry VisitingPlayer
  129. {
  130. get
  131. {
  132. return this._visitingPlayer;
  133. }
  134. }
  135. public bool IsLoading { get; private set; }
  136. public bool IsVisiting
  137. {
  138. get
  139. {
  140. return this._visitingPlayer != null;
  141. }
  142. }
  143. public bool SkipWorldMapOnLoad { get; private set; }
  144. private IEnumerator LoadIslandRoutine(Island newIsland, bool animateIn)
  145. {
  146. if (newIsland.IsValid())
  147. {
  148. this.IsLoading = true;
  149. if (animateIn)
  150. {
  151. yield return SingletonMonobehaviour<CinematicEffect>.Instance.ShowAnimated();
  152. }
  153. else
  154. {
  155. SingletonMonobehaviour<CinematicEffect>.Instance.ShowInstant();
  156. }
  157. if (newIsland != this._currentIsland)
  158. {
  159. if (this._currentIsland.IsValid())
  160. {
  161. yield return SceneManager.UnloadSceneAsync(this._currentIsland.GetSceneName());
  162. }
  163. this._currentIsland = newIsland;
  164. yield return SceneManager.LoadSceneAsync(newIsland.GetSceneName(), LoadSceneMode.Additive);
  165. yield return new WaitForEndOfFrame();
  166. yield return new WaitForEndOfFrame();
  167. yield return new WaitForEndOfFrame();
  168. }
  169. this.IsLoading = false;
  170. this.FireIslandChangedEvent(this._currentIsland, this.IsVisiting);
  171. yield return SingletonMonobehaviour<CinematicEffect>.Instance.HideAnimated();
  172. }
  173. yield break;
  174. }
  175. private IEnumerator LoadVisitingIslandRoutine(Island visitingIsland)
  176. {
  177. if (SingletonMonobehaviour<CIGVisitingIslandsManager>.Instance.LoadVisitingIslandData(visitingIsland, this._visitingPlayer.InstallUuid))
  178. {
  179. this.IsLoading = true;
  180. yield return SingletonMonobehaviour<CinematicEffect>.Instance.ShowAnimated();
  181. if (SceneManager.GetSceneByName("VisitingIsland").isLoaded)
  182. {
  183. yield return SceneManager.UnloadSceneAsync("VisitingIsland");
  184. }
  185. this._currentIsland = visitingIsland;
  186. yield return SceneManager.LoadSceneAsync("VisitingIsland", LoadSceneMode.Additive);
  187. yield return new WaitForEndOfFrame();
  188. yield return new WaitForEndOfFrame();
  189. yield return new WaitForEndOfFrame();
  190. this.IsLoading = false;
  191. this.FireIslandChangedEvent(this._currentIsland, this.IsVisiting);
  192. yield return SingletonMonobehaviour<CinematicEffect>.Instance.HideAnimated();
  193. }
  194. else
  195. {
  196. UnityEngine.Debug.LogError("Visiting Island data not loaded!");
  197. }
  198. yield break;
  199. }
  200. private IEnumerator StartVisitingRoutine()
  201. {
  202. this.IsLoading = true;
  203. yield return SingletonMonobehaviour<CinematicEffect>.Instance.ShowAnimated();
  204. if (this._currentIsland.IsValid())
  205. {
  206. yield return SceneManager.UnloadSceneAsync(this._currentIsland.GetSceneName());
  207. this._currentIsland = Island.None;
  208. }
  209. this.FireVisitingStartedEvent();
  210. yield return SingletonMonobehaviour<CinematicEffect>.Instance.HideAnimated();
  211. this.IsLoading = false;
  212. yield break;
  213. }
  214. private IEnumerator StopVisitingRoutine()
  215. {
  216. this.IsLoading = true;
  217. yield return SingletonMonobehaviour<CinematicEffect>.Instance.ShowAnimated();
  218. if (SceneManager.GetSceneByName("VisitingIsland").isLoaded)
  219. {
  220. yield return SceneManager.UnloadSceneAsync("VisitingIsland");
  221. }
  222. this._currentIsland = Island.None;
  223. this.FireVisitingEndedEvent();
  224. yield return SingletonMonobehaviour<CinematicEffect>.Instance.HideAnimated();
  225. this.IsLoading = false;
  226. yield break;
  227. }
  228. private void OnVisitingIslandDataDownloaded(Island island, string uuid)
  229. {
  230. SingletonMonobehaviour<WorldMap>.Instance.Refresh();
  231. }
  232. private void OnWebServicePullRequestCompleted()
  233. {
  234. this._storage["SkipWorldMapOnLoad"] = SingletonMonobehaviour<CIGWebService>.Instance.Properties.GetBoolean("SkipWorldMapOnLoad", false);
  235. }
  236. private void OnLanguageChanged()
  237. {
  238. SingletonMonobehaviour<WorldMap>.Instance.Refresh();
  239. }
  240. private const string StorageKey = "WorldMapController";
  241. private const string SkipWorldMapOnLoadKey = "SkipWorldMapOnLoad";
  242. private const StorageLifecycle storageLifecycle = StorageLifecycle.Game;
  243. private const string VisitingIslandSceneName = "VisitingIsland";
  244. private Island _currentIsland = Island.None;
  245. private LeaderboardEntry _visitingPlayer;
  246. private Dictionary<string, object> _storage;
  247. public delegate void IslandChangedEventHandler(Island island, bool isVisiting);
  248. public delegate void VisitingStartedEventHandler();
  249. public delegate void VisitingEndedEventHandler();
  250. }