25'ten fazla konu seçemezsiniz Konular bir harf veya rakamla başlamalı, kısa çizgiler ('-') içerebilir ve en fazla 35 karakter uzunluğunda olabilir.
 
 
 

236 satır
5.9 KiB

  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using CIG.Extensions;
  5. using SUISS.Core;
  6. using SUISS.Storage;
  7. using SUISSEngine;
  8. using UnityEngine;
  9. public class IAPSaleScheduler : MonoBehaviour
  10. {
  11. private void Start()
  12. {
  13. IAPPackDealManager instance = Singleton<IAPPackDealManager>.Instance;
  14. if (instance != null)
  15. {
  16. instance.DealStartedEvent += this.OnSaleStarted;
  17. instance.DealEndedEvent += this.OnSaleEnded;
  18. }
  19. this.CheckNextSaleInSequence();
  20. }
  21. private void OnDestroy()
  22. {
  23. if (SingletonMonobehaviour<CIGTutorialManager>.IsAvailable)
  24. {
  25. SingletonMonobehaviour<CIGTutorialManager>.Instance.TutorialFinishedEvent -= this.OnTutorialFinished;
  26. }
  27. if (Singleton<IAPPackDealManager>.IsAvailable)
  28. {
  29. IAPPackDealManager instance = Singleton<IAPPackDealManager>.Instance;
  30. instance.DealStartedEvent -= this.OnSaleStarted;
  31. instance.DealEndedEvent -= this.OnSaleEnded;
  32. }
  33. this.CancelInvoke(new Action(this.StartNextSale));
  34. }
  35. private void OnSaleStarted(string packName, DateTime start, TimeSpan duration)
  36. {
  37. if (IAPSaleScheduler.StateSaleMapping.ContainsKey(this.CurrentState) && packName == IAPSaleScheduler.StateSaleMapping[this.CurrentState])
  38. {
  39. this.OnDealChanged();
  40. }
  41. }
  42. private void OnSaleEnded(string packName)
  43. {
  44. if (IAPSaleScheduler.StateSaleMapping.ContainsKey(this.CurrentState) && packName == IAPSaleScheduler.StateSaleMapping[this.CurrentState])
  45. {
  46. this.OnDealChanged();
  47. }
  48. }
  49. private void OnDealChanged()
  50. {
  51. IAPPackDealManager instance = Singleton<IAPPackDealManager>.Instance;
  52. IAPPackDealManager.PackDeal packDeal = instance.FindFirstActive(IAPSaleScheduler.StateSaleMapping[this.CurrentState]);
  53. if (packDeal == null)
  54. {
  55. this.StorageDict["nextpack_firststarttime"] = DateTime.UtcNow.ToBinary();
  56. }
  57. else
  58. {
  59. DateTime dealEnds = packDeal.DealEnds;
  60. this.StorageDict["nextpack_firststarttime"] = dealEnds.ToBinary();
  61. }
  62. }
  63. private void StartSale(IAPSaleScheduler.State sale)
  64. {
  65. if (sale == IAPSaleScheduler.State.End || !SingletonMonobehaviour<CIGWebService>.Instance.UseIAPDeal)
  66. {
  67. return;
  68. }
  69. if (IAPSaleScheduler.StateSaleMapping.ContainsKey(sale))
  70. {
  71. string saleName = IAPSaleScheduler.StateSaleMapping[sale];
  72. base.StartCoroutine(this.StartSaleWhenProductAvailable(saleName, new TimeSpan(1, 0, 0)));
  73. }
  74. else
  75. {
  76. UnityEngine.Debug.LogErrorFormat("Sale state '{0}'has no associated sale name", new object[]
  77. {
  78. sale
  79. });
  80. }
  81. }
  82. private IEnumerator StartSaleWhenProductAvailable(string saleName, TimeSpan timespan)
  83. {
  84. while (!IAPPackManager.StoreHasIAPPack(saleName))
  85. {
  86. yield return new WaitForSeconds(2f);
  87. }
  88. Singleton<IAPPackDealManager>.Instance.StartDeal(saleName, timespan);
  89. yield break;
  90. }
  91. private void CheckNextSaleInSequence()
  92. {
  93. if (this.StorageDict.ContainsKey("nextpack_firststarttime"))
  94. {
  95. DateTime t = DateTime.FromBinary((long)this.StorageDict["nextpack_firststarttime"]);
  96. if (DateTime.UtcNow > t)
  97. {
  98. this.StartNextSale();
  99. }
  100. }
  101. else
  102. {
  103. CIGTutorialManager instance = SingletonMonobehaviour<CIGTutorialManager>.Instance;
  104. if (instance != null)
  105. {
  106. base.StartCoroutine(this.CheckTutorialFinishedRoutine(instance));
  107. }
  108. }
  109. }
  110. private IEnumerator CheckTutorialFinishedRoutine(CIGTutorialManager tm)
  111. {
  112. while (tm.state == CIGTutorialState.Initial)
  113. {
  114. yield return null;
  115. }
  116. if (tm.IsFinished)
  117. {
  118. this.OnTutorialFinished();
  119. }
  120. else
  121. {
  122. SingletonMonobehaviour<CIGTutorialManager>.Instance.TutorialFinishedEvent += this.OnTutorialFinished;
  123. }
  124. yield break;
  125. }
  126. private void OnTutorialFinished()
  127. {
  128. SingletonMonobehaviour<CIGTutorialManager>.Instance.TutorialFinishedEvent -= this.OnTutorialFinished;
  129. this.Invoke(new Action(this.StartNextSale), 120f, true);
  130. }
  131. private void StartNextSale()
  132. {
  133. if (SingletonMonobehaviour<CIGWebService>.Instance.UseIAPDeal)
  134. {
  135. this.MoveToNextState();
  136. this.StartSale(this.CurrentState);
  137. }
  138. }
  139. private void MoveToNextState()
  140. {
  141. this.CurrentState = this.NextState;
  142. this.NextState = this.CurrentState + 1;
  143. }
  144. private Dictionary<string, object> StorageDict
  145. {
  146. get
  147. {
  148. return Storage.Get(StorageLifecycle.Game).GetDictionary("iap_sale_scheduler");
  149. }
  150. }
  151. private IAPSaleScheduler.State CurrentState
  152. {
  153. get
  154. {
  155. if (this.StorageDict.ContainsKey("state"))
  156. {
  157. int value = (int)this.StorageDict["state"];
  158. return (IAPSaleScheduler.State)Mathf.Clamp(value, 0, 4);
  159. }
  160. return IAPSaleScheduler.State.WaitingForTutorial;
  161. }
  162. set
  163. {
  164. IAPSaleScheduler.State state = (IAPSaleScheduler.State)Mathf.Clamp((int)value, 0, 4);
  165. this.StorageDict["state"] = (int)state;
  166. }
  167. }
  168. private IAPSaleScheduler.State NextState
  169. {
  170. get
  171. {
  172. if (this.StorageDict.ContainsKey("next_state"))
  173. {
  174. int value = (int)this.StorageDict["next_state"];
  175. return (IAPSaleScheduler.State)Mathf.Clamp(value, 1, 4);
  176. }
  177. return IAPSaleScheduler.State.FourPack;
  178. }
  179. set
  180. {
  181. IAPSaleScheduler.State state = (IAPSaleScheduler.State)Mathf.Clamp((int)value, 1, 4);
  182. this.StorageDict["next_state"] = (int)state;
  183. }
  184. }
  185. private static readonly Dictionary<IAPSaleScheduler.State, string> StateSaleMapping = new Dictionary<IAPSaleScheduler.State, string>
  186. {
  187. {
  188. IAPSaleScheduler.State.FourPack,
  189. "pack_4x"
  190. },
  191. {
  192. IAPSaleScheduler.State.Level5Pack,
  193. "pack_5_levels"
  194. },
  195. {
  196. IAPSaleScheduler.State.TimeBoost12Pack,
  197. "pack_timeboost_12"
  198. }
  199. };
  200. private const float TutorialCompletedWaitTimeInSeconds = 120f;
  201. private const string StorageKey = "iap_sale_scheduler";
  202. private const string NextPackFirstStartTimestampKey = "nextpack_firststarttime";
  203. private const string StateKey = "state";
  204. private const string NextStateKey = "next_state";
  205. private enum State
  206. {
  207. WaitingForTutorial,
  208. FourPack,
  209. Level5Pack,
  210. TimeBoost12Pack,
  211. End
  212. }
  213. }