using System; using System.Collections; using System.Collections.Generic; using CIG.Extensions; using SUISS.Core; using SUISS.Storage; using SUISSEngine; using UnityEngine; public class IAPSaleScheduler : MonoBehaviour { private void Start() { IAPPackDealManager instance = Singleton.Instance; if (instance != null) { instance.DealStartedEvent += this.OnSaleStarted; instance.DealEndedEvent += this.OnSaleEnded; } this.CheckNextSaleInSequence(); } private void OnDestroy() { if (SingletonMonobehaviour.IsAvailable) { SingletonMonobehaviour.Instance.TutorialFinishedEvent -= this.OnTutorialFinished; } if (Singleton.IsAvailable) { IAPPackDealManager instance = Singleton.Instance; instance.DealStartedEvent -= this.OnSaleStarted; instance.DealEndedEvent -= this.OnSaleEnded; } this.CancelInvoke(new Action(this.StartNextSale)); } private void OnSaleStarted(string packName, DateTime start, TimeSpan duration) { if (IAPSaleScheduler.StateSaleMapping.ContainsKey(this.CurrentState) && packName == IAPSaleScheduler.StateSaleMapping[this.CurrentState]) { this.OnDealChanged(); } } private void OnSaleEnded(string packName) { if (IAPSaleScheduler.StateSaleMapping.ContainsKey(this.CurrentState) && packName == IAPSaleScheduler.StateSaleMapping[this.CurrentState]) { this.OnDealChanged(); } } private void OnDealChanged() { IAPPackDealManager instance = Singleton.Instance; IAPPackDealManager.PackDeal packDeal = instance.FindFirstActive(IAPSaleScheduler.StateSaleMapping[this.CurrentState]); if (packDeal == null) { this.StorageDict["nextpack_firststarttime"] = DateTime.UtcNow.ToBinary(); } else { DateTime dealEnds = packDeal.DealEnds; this.StorageDict["nextpack_firststarttime"] = dealEnds.ToBinary(); } } private void StartSale(IAPSaleScheduler.State sale) { if (sale == IAPSaleScheduler.State.End || !SingletonMonobehaviour.Instance.UseIAPDeal) { return; } if (IAPSaleScheduler.StateSaleMapping.ContainsKey(sale)) { string saleName = IAPSaleScheduler.StateSaleMapping[sale]; base.StartCoroutine(this.StartSaleWhenProductAvailable(saleName, new TimeSpan(1, 0, 0))); } else { UnityEngine.Debug.LogErrorFormat("Sale state '{0}'has no associated sale name", new object[] { sale }); } } private IEnumerator StartSaleWhenProductAvailable(string saleName, TimeSpan timespan) { while (!IAPPackManager.StoreHasIAPPack(saleName)) { yield return new WaitForSeconds(2f); } Singleton.Instance.StartDeal(saleName, timespan); yield break; } private void CheckNextSaleInSequence() { if (this.StorageDict.ContainsKey("nextpack_firststarttime")) { DateTime t = DateTime.FromBinary((long)this.StorageDict["nextpack_firststarttime"]); if (DateTime.UtcNow > t) { this.StartNextSale(); } } else { CIGTutorialManager instance = SingletonMonobehaviour.Instance; if (instance != null) { base.StartCoroutine(this.CheckTutorialFinishedRoutine(instance)); } } } private IEnumerator CheckTutorialFinishedRoutine(CIGTutorialManager tm) { while (tm.state == CIGTutorialState.Initial) { yield return null; } if (tm.IsFinished) { this.OnTutorialFinished(); } else { SingletonMonobehaviour.Instance.TutorialFinishedEvent += this.OnTutorialFinished; } yield break; } private void OnTutorialFinished() { SingletonMonobehaviour.Instance.TutorialFinishedEvent -= this.OnTutorialFinished; this.Invoke(new Action(this.StartNextSale), 120f, true); } private void StartNextSale() { if (SingletonMonobehaviour.Instance.UseIAPDeal) { this.MoveToNextState(); this.StartSale(this.CurrentState); } } private void MoveToNextState() { this.CurrentState = this.NextState; this.NextState = this.CurrentState + 1; } private Dictionary StorageDict { get { return Storage.Get(StorageLifecycle.Game).GetDictionary("iap_sale_scheduler"); } } private IAPSaleScheduler.State CurrentState { get { if (this.StorageDict.ContainsKey("state")) { int value = (int)this.StorageDict["state"]; return (IAPSaleScheduler.State)Mathf.Clamp(value, 0, 4); } return IAPSaleScheduler.State.WaitingForTutorial; } set { IAPSaleScheduler.State state = (IAPSaleScheduler.State)Mathf.Clamp((int)value, 0, 4); this.StorageDict["state"] = (int)state; } } private IAPSaleScheduler.State NextState { get { if (this.StorageDict.ContainsKey("next_state")) { int value = (int)this.StorageDict["next_state"]; return (IAPSaleScheduler.State)Mathf.Clamp(value, 1, 4); } return IAPSaleScheduler.State.FourPack; } set { IAPSaleScheduler.State state = (IAPSaleScheduler.State)Mathf.Clamp((int)value, 1, 4); this.StorageDict["next_state"] = (int)state; } } private static readonly Dictionary StateSaleMapping = new Dictionary { { IAPSaleScheduler.State.FourPack, "pack_4x" }, { IAPSaleScheduler.State.Level5Pack, "pack_5_levels" }, { IAPSaleScheduler.State.TimeBoost12Pack, "pack_timeboost_12" } }; private const float TutorialCompletedWaitTimeInSeconds = 120f; private const string StorageKey = "iap_sale_scheduler"; private const string NextPackFirstStartTimestampKey = "nextpack_firststarttime"; private const string StateKey = "state"; private const string NextStateKey = "next_state"; private enum State { WaitingForTutorial, FourPack, Level5Pack, TimeBoost12Pack, End } }