Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.
 
 
 

324 wiersze
8.9 KiB

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Globalization;
  4. using CIG;
  5. using CIG.Translation;
  6. using SUISS.Core;
  7. using SUISSEngine;
  8. using UnityEngine;
  9. [RequireComponent(typeof(Serializing))]
  10. public sealed class DailyRewardsManager : SingletonMonobehaviour<DailyRewardsManager>, IHasNotification
  11. {
  12. private bool IsEnabled
  13. {
  14. get
  15. {
  16. CIGTutorialManager instance = SingletonMonobehaviour<CIGTutorialManager>.Instance;
  17. return SingletonMonobehaviour<CIGGameState>.Instance.Level >= this._minimumLevel && instance.HasDeserialized && instance.IsFinished && SingletonMonobehaviour<PopupManager>.Instance.AreStatesInitialized;
  18. }
  19. }
  20. private bool HasStarted
  21. {
  22. get
  23. {
  24. return this._endTimeStampUTC != null && this._streak != null;
  25. }
  26. }
  27. private bool HasDayLapsed
  28. {
  29. get
  30. {
  31. return this._endTimeStampUTC == null || this._endTimeStampUTC.Value < DateTime.UtcNow;
  32. }
  33. }
  34. protected override void OnDestroy()
  35. {
  36. if (SingletonMonobehaviour<CIGGameState>.IsAvailable)
  37. {
  38. SingletonMonobehaviour<CIGGameState>.Instance.LevelledUp -= this.OnLevelledUp;
  39. }
  40. if (SingletonMonobehaviour<CIGTutorialManager>.IsAvailable)
  41. {
  42. CIGTutorialManager instance = SingletonMonobehaviour<CIGTutorialManager>.Instance;
  43. instance.TutorialFinishedEvent -= this.OnTutorialFinished;
  44. instance.HasDeserializedEvent -= this.OnTutorialManagerDeserialized;
  45. }
  46. if (SingletonMonobehaviour<CIGLocalNotificationManager>.IsAvailable)
  47. {
  48. SingletonMonobehaviour<CIGLocalNotificationManager>.Instance.NoLongerHasNotification(this);
  49. }
  50. if (SingletonMonobehaviour<WorldMap>.IsAvailable)
  51. {
  52. SingletonMonobehaviour<WorldMap>.Instance.VisibilityChangedEvent -= this.OnWorldMapVisibilityChanged;
  53. }
  54. if (SingletonMonobehaviour<PopupManager>.IsAvailable)
  55. {
  56. SingletonMonobehaviour<PopupManager>.Instance.StatesInitializedEvent -= this.OnPopupManagerStatesInitialized;
  57. }
  58. base.OnDestroy();
  59. }
  60. public void Collect(object source)
  61. {
  62. if (this.HasStarted && !this._hasCollected)
  63. {
  64. this._hasCollected = true;
  65. DailyReward dailyReward = this._streak.GetDailyReward(this._dayIndex);
  66. dailyReward.CollectReward(source);
  67. if (this._dayIndex == this._streak.TotalDays - 1)
  68. {
  69. SingletonMonobehaviour<CIGGameStats>.Instance.AddDailyBonusStreakCompleted();
  70. }
  71. this._serializing.Serialize();
  72. }
  73. }
  74. private void TryLapseDay()
  75. {
  76. if (this.IsEnabled)
  77. {
  78. if (this.HasDayLapsed)
  79. {
  80. if (this.HasStarted)
  81. {
  82. this.IncrementStreak();
  83. }
  84. this._endTimeStampUTC = new DateTime?(this.GetMidnightDateTime());
  85. this._serializing.Serialize();
  86. }
  87. if (this.HasStarted && !this._hasShownPopup && !this._hasCollected && !SingletonMonobehaviour<WorldMap>.Instance.IsVisible)
  88. {
  89. SingletonMonobehaviour<PopupManager>.Instance.RequestPopup<DailyRewardPopupState>(delegate(State state)
  90. {
  91. ((DailyRewardPopupState)state).ShowStreak(this._streak, this._dayIndex);
  92. });
  93. this._hasShownPopup = true;
  94. }
  95. }
  96. }
  97. private DailyRewardsManager.Streak GetStreak(int index)
  98. {
  99. return this._streaks[index % this._streaks.Count];
  100. }
  101. private void IncrementStreak()
  102. {
  103. TimeSpan timeSpan = (this._endTimeStampUTC == null) ? TimeSpan.Zero : (DateTime.UtcNow - this._endTimeStampUTC.Value);
  104. if (this._hasCollected && timeSpan.TotalDays < 1.0)
  105. {
  106. this._dayIndex++;
  107. this._hasCollected = false;
  108. if (this._dayIndex >= this._streak.TotalDays)
  109. {
  110. this.ResetStreak();
  111. }
  112. }
  113. else
  114. {
  115. this.ResetStreak();
  116. }
  117. }
  118. private void ResetStreak()
  119. {
  120. this._dayIndex = 0;
  121. this._streakIndex = UnityEngine.Random.Range(0, this._streaks.Count);
  122. this._hasCollected = false;
  123. this._streak = this.GetStreak(this._streakIndex);
  124. }
  125. private void OnTutorialFinished()
  126. {
  127. SingletonMonobehaviour<CIGTutorialManager>.Instance.TutorialFinishedEvent -= this.OnTutorialFinished;
  128. this.TryLapseDay();
  129. }
  130. private void OnLevelledUp(int level)
  131. {
  132. this.TryLapseDay();
  133. }
  134. private void OnWorldMapVisibilityChanged(bool isVisible)
  135. {
  136. this.TryLapseDay();
  137. }
  138. private DateTime GetMidnightDateTime()
  139. {
  140. TimeSpan value = DateTime.UtcNow - DateTime.Now;
  141. return DateTime.Today.AddDays(1.0).Add(value);
  142. }
  143. private void OnTutorialManagerDeserialized()
  144. {
  145. CIGTutorialManager instance = SingletonMonobehaviour<CIGTutorialManager>.Instance;
  146. if (instance.IsFinished)
  147. {
  148. instance.TutorialFinishedEvent -= this.OnTutorialFinished;
  149. }
  150. instance.HasDeserializedEvent -= this.OnTutorialManagerDeserialized;
  151. this.TryLapseDay();
  152. }
  153. private void OnPopupManagerStatesInitialized()
  154. {
  155. SingletonMonobehaviour<PopupManager>.Instance.StatesInitializedEvent -= this.OnPopupManagerStatesInitialized;
  156. this.TryLapseDay();
  157. }
  158. PlannedNotification[] IHasNotification.GetNotifications()
  159. {
  160. List<PlannedNotification> list = new List<PlannedNotification>();
  161. if (this._endTimeStampUTC != null)
  162. {
  163. if (this._hasCollected)
  164. {
  165. list.Add(new PlannedNotification((int)(this._endTimeStampUTC.Value.AddDays(0.5) - DateTime.UtcNow).TotalSeconds, Localization.Key("notification_daily_reward1"), false));
  166. list.Add(new PlannedNotification((int)(this._endTimeStampUTC.Value.AddDays(0.75) - DateTime.UtcNow).TotalSeconds, Localization.Key("notification_daily_reward2"), false));
  167. }
  168. else
  169. {
  170. int num = (int)(this._endTimeStampUTC.Value.AddDays(-0.5) - DateTime.UtcNow).TotalSeconds;
  171. int num2 = (int)(this._endTimeStampUTC.Value.AddDays(-0.25) - DateTime.UtcNow).TotalSeconds;
  172. if (num > 0)
  173. {
  174. list.Add(new PlannedNotification(num, Localization.Key("notification_daily_reward1"), false));
  175. }
  176. if (num2 > 0)
  177. {
  178. list.Add(new PlannedNotification(num2, Localization.Key("notification_daily_reward2"), false));
  179. }
  180. }
  181. }
  182. return list.ToArray();
  183. }
  184. private void OnSerialize(Dictionary<string, object> values)
  185. {
  186. DateTime? endTimeStampUTC = this._endTimeStampUTC;
  187. if (endTimeStampUTC != null)
  188. {
  189. values["endTimeStampTicks"] = this._endTimeStampUTC.Value.Ticks;
  190. }
  191. else if (values.ContainsKey("endTimeStampTicks"))
  192. {
  193. values.Remove("endTimeStampTicks");
  194. }
  195. values["streakIndex"] = this._streakIndex;
  196. values["dayIndex"] = this._dayIndex;
  197. values["hasCollected"] = this._hasCollected;
  198. }
  199. private void OnDeserialize(Dictionary<string, object> values)
  200. {
  201. if (values.ContainsKey("endTimeStampTicks"))
  202. {
  203. long ticks = (long)values["endTimeStampTicks"];
  204. this._endTimeStampUTC = new DateTime?(new DateTime(ticks));
  205. }
  206. else
  207. {
  208. this._endTimeStampUTC = null;
  209. }
  210. this._streakIndex = values.GetInt("streakIndex", UnityEngine.Random.Range(0, this._streaks.Count));
  211. this._dayIndex = values.GetInt("dayIndex", 0);
  212. this._hasCollected = values.GetBoolean("hasCollected", false);
  213. }
  214. private void OnDeserialized()
  215. {
  216. if (this._streakIndex == -1)
  217. {
  218. this._streakIndex = UnityEngine.Random.Range(0, this._streaks.Count);
  219. }
  220. SingletonMonobehaviour<CIGLocalNotificationManager>.Instance.HasNotification(this);
  221. CIGTutorialManager instance = SingletonMonobehaviour<CIGTutorialManager>.Instance;
  222. SingletonMonobehaviour<CIGGameState>.Instance.LevelledUp += this.OnLevelledUp;
  223. instance.TutorialFinishedEvent += this.OnTutorialFinished;
  224. SingletonMonobehaviour<WorldMap>.Instance.VisibilityChangedEvent += this.OnWorldMapVisibilityChanged;
  225. this._streak = this.GetStreak(this._streakIndex);
  226. if (instance.HasDeserialized)
  227. {
  228. this.OnTutorialManagerDeserialized();
  229. }
  230. else
  231. {
  232. instance.HasDeserializedEvent += this.OnTutorialManagerDeserialized;
  233. }
  234. PopupManager instance2 = SingletonMonobehaviour<PopupManager>.Instance;
  235. if (instance2.AreStatesInitialized)
  236. {
  237. this.OnPopupManagerStatesInitialized();
  238. }
  239. else
  240. {
  241. instance2.StatesInitializedEvent += this.OnPopupManagerStatesInitialized;
  242. }
  243. }
  244. [SerializeField]
  245. private Serializing _serializing;
  246. [SerializeField]
  247. private List<DailyRewardsManager.Streak> _streaks;
  248. [SerializeField]
  249. private int _minimumLevel;
  250. private int _streakIndex = -1;
  251. private int _dayIndex;
  252. private bool _hasCollected;
  253. private bool _hasShownPopup;
  254. private DailyRewardsManager.Streak _streak;
  255. private DateTime? _endTimeStampUTC;
  256. private const string EndTimeStampTicksKey = "endTimeStampTicks";
  257. private const string StreakIndexKey = "streakIndex";
  258. private const string DayIndexKey = "dayIndex";
  259. private const string HasCollectedKey = "hasCollected";
  260. [Serializable]
  261. public class Streak
  262. {
  263. public string Identifier
  264. {
  265. get
  266. {
  267. return this._identifier;
  268. }
  269. }
  270. public DailyReward GetDailyReward(int dayIndex)
  271. {
  272. return this._dailyRewards[dayIndex];
  273. }
  274. public int TotalDays
  275. {
  276. get
  277. {
  278. return this._dailyRewards.Count;
  279. }
  280. }
  281. [SerializeField]
  282. private string _identifier;
  283. [SerializeField]
  284. private List<DailyReward> _dailyRewards;
  285. }
  286. }