using System; using System.Collections.Generic; using System.Globalization; using CIG; using CIG.Translation; using SUISS.Core; using SUISSEngine; using UnityEngine; [RequireComponent(typeof(Serializing))] public sealed class DailyRewardsManager : SingletonMonobehaviour, IHasNotification { private bool IsEnabled { get { CIGTutorialManager instance = SingletonMonobehaviour.Instance; return SingletonMonobehaviour.Instance.Level >= this._minimumLevel && instance.HasDeserialized && instance.IsFinished && SingletonMonobehaviour.Instance.AreStatesInitialized; } } private bool HasStarted { get { return this._endTimeStampUTC != null && this._streak != null; } } private bool HasDayLapsed { get { return this._endTimeStampUTC == null || this._endTimeStampUTC.Value < DateTime.UtcNow; } } protected override void OnDestroy() { if (SingletonMonobehaviour.IsAvailable) { SingletonMonobehaviour.Instance.LevelledUp -= this.OnLevelledUp; } if (SingletonMonobehaviour.IsAvailable) { CIGTutorialManager instance = SingletonMonobehaviour.Instance; instance.TutorialFinishedEvent -= this.OnTutorialFinished; instance.HasDeserializedEvent -= this.OnTutorialManagerDeserialized; } if (SingletonMonobehaviour.IsAvailable) { SingletonMonobehaviour.Instance.NoLongerHasNotification(this); } if (SingletonMonobehaviour.IsAvailable) { SingletonMonobehaviour.Instance.VisibilityChangedEvent -= this.OnWorldMapVisibilityChanged; } if (SingletonMonobehaviour.IsAvailable) { SingletonMonobehaviour.Instance.StatesInitializedEvent -= this.OnPopupManagerStatesInitialized; } base.OnDestroy(); } public void Collect(object source) { if (this.HasStarted && !this._hasCollected) { this._hasCollected = true; DailyReward dailyReward = this._streak.GetDailyReward(this._dayIndex); dailyReward.CollectReward(source); if (this._dayIndex == this._streak.TotalDays - 1) { SingletonMonobehaviour.Instance.AddDailyBonusStreakCompleted(); } this._serializing.Serialize(); } } private void TryLapseDay() { if (this.IsEnabled) { if (this.HasDayLapsed) { if (this.HasStarted) { this.IncrementStreak(); } this._endTimeStampUTC = new DateTime?(this.GetMidnightDateTime()); this._serializing.Serialize(); } if (this.HasStarted && !this._hasShownPopup && !this._hasCollected && !SingletonMonobehaviour.Instance.IsVisible) { SingletonMonobehaviour.Instance.RequestPopup(delegate(State state) { ((DailyRewardPopupState)state).ShowStreak(this._streak, this._dayIndex); }); this._hasShownPopup = true; } } } private DailyRewardsManager.Streak GetStreak(int index) { return this._streaks[index % this._streaks.Count]; } private void IncrementStreak() { TimeSpan timeSpan = (this._endTimeStampUTC == null) ? TimeSpan.Zero : (DateTime.UtcNow - this._endTimeStampUTC.Value); if (this._hasCollected && timeSpan.TotalDays < 1.0) { this._dayIndex++; this._hasCollected = false; if (this._dayIndex >= this._streak.TotalDays) { this.ResetStreak(); } } else { this.ResetStreak(); } } private void ResetStreak() { this._dayIndex = 0; this._streakIndex = UnityEngine.Random.Range(0, this._streaks.Count); this._hasCollected = false; this._streak = this.GetStreak(this._streakIndex); } private void OnTutorialFinished() { SingletonMonobehaviour.Instance.TutorialFinishedEvent -= this.OnTutorialFinished; this.TryLapseDay(); } private void OnLevelledUp(int level) { this.TryLapseDay(); } private void OnWorldMapVisibilityChanged(bool isVisible) { this.TryLapseDay(); } private DateTime GetMidnightDateTime() { TimeSpan value = DateTime.UtcNow - DateTime.Now; return DateTime.Today.AddDays(1.0).Add(value); } private void OnTutorialManagerDeserialized() { CIGTutorialManager instance = SingletonMonobehaviour.Instance; if (instance.IsFinished) { instance.TutorialFinishedEvent -= this.OnTutorialFinished; } instance.HasDeserializedEvent -= this.OnTutorialManagerDeserialized; this.TryLapseDay(); } private void OnPopupManagerStatesInitialized() { SingletonMonobehaviour.Instance.StatesInitializedEvent -= this.OnPopupManagerStatesInitialized; this.TryLapseDay(); } PlannedNotification[] IHasNotification.GetNotifications() { List list = new List(); if (this._endTimeStampUTC != null) { if (this._hasCollected) { list.Add(new PlannedNotification((int)(this._endTimeStampUTC.Value.AddDays(0.5) - DateTime.UtcNow).TotalSeconds, Localization.Key("notification_daily_reward1"), false)); list.Add(new PlannedNotification((int)(this._endTimeStampUTC.Value.AddDays(0.75) - DateTime.UtcNow).TotalSeconds, Localization.Key("notification_daily_reward2"), false)); } else { int num = (int)(this._endTimeStampUTC.Value.AddDays(-0.5) - DateTime.UtcNow).TotalSeconds; int num2 = (int)(this._endTimeStampUTC.Value.AddDays(-0.25) - DateTime.UtcNow).TotalSeconds; if (num > 0) { list.Add(new PlannedNotification(num, Localization.Key("notification_daily_reward1"), false)); } if (num2 > 0) { list.Add(new PlannedNotification(num2, Localization.Key("notification_daily_reward2"), false)); } } } return list.ToArray(); } private void OnSerialize(Dictionary values) { DateTime? endTimeStampUTC = this._endTimeStampUTC; if (endTimeStampUTC != null) { values["endTimeStampTicks"] = this._endTimeStampUTC.Value.Ticks; } else if (values.ContainsKey("endTimeStampTicks")) { values.Remove("endTimeStampTicks"); } values["streakIndex"] = this._streakIndex; values["dayIndex"] = this._dayIndex; values["hasCollected"] = this._hasCollected; } private void OnDeserialize(Dictionary values) { if (values.ContainsKey("endTimeStampTicks")) { long ticks = (long)values["endTimeStampTicks"]; this._endTimeStampUTC = new DateTime?(new DateTime(ticks)); } else { this._endTimeStampUTC = null; } this._streakIndex = values.GetInt("streakIndex", UnityEngine.Random.Range(0, this._streaks.Count)); this._dayIndex = values.GetInt("dayIndex", 0); this._hasCollected = values.GetBoolean("hasCollected", false); } private void OnDeserialized() { if (this._streakIndex == -1) { this._streakIndex = UnityEngine.Random.Range(0, this._streaks.Count); } SingletonMonobehaviour.Instance.HasNotification(this); CIGTutorialManager instance = SingletonMonobehaviour.Instance; SingletonMonobehaviour.Instance.LevelledUp += this.OnLevelledUp; instance.TutorialFinishedEvent += this.OnTutorialFinished; SingletonMonobehaviour.Instance.VisibilityChangedEvent += this.OnWorldMapVisibilityChanged; this._streak = this.GetStreak(this._streakIndex); if (instance.HasDeserialized) { this.OnTutorialManagerDeserialized(); } else { instance.HasDeserializedEvent += this.OnTutorialManagerDeserialized; } PopupManager instance2 = SingletonMonobehaviour.Instance; if (instance2.AreStatesInitialized) { this.OnPopupManagerStatesInitialized(); } else { instance2.StatesInitializedEvent += this.OnPopupManagerStatesInitialized; } } [SerializeField] private Serializing _serializing; [SerializeField] private List _streaks; [SerializeField] private int _minimumLevel; private int _streakIndex = -1; private int _dayIndex; private bool _hasCollected; private bool _hasShownPopup; private DailyRewardsManager.Streak _streak; private DateTime? _endTimeStampUTC; private const string EndTimeStampTicksKey = "endTimeStampTicks"; private const string StreakIndexKey = "streakIndex"; private const string DayIndexKey = "dayIndex"; private const string HasCollectedKey = "hasCollected"; [Serializable] public class Streak { public string Identifier { get { return this._identifier; } } public DailyReward GetDailyReward(int dayIndex) { return this._dailyRewards[dayIndex]; } public int TotalDays { get { return this._dailyRewards.Count; } } [SerializeField] private string _identifier; [SerializeField] private List _dailyRewards; } }