using System; using System.Collections.Generic; using System.Diagnostics; using SUISS.Storage; using SUISSEngine; using UnityEngine; public sealed class OngoingRewardManager : Singleton { //[DebuggerBrowsable(DebuggerBrowsableState.Never)] public event OngoingRewardManager.RewardAddedHandler RewardAdded; //[DebuggerBrowsable(DebuggerBrowsableState.Never)] public event OngoingRewardManager.RewardRemovedHandler RewardRemoved; private Dictionary _storage { get { return Storage.Get(StorageLifecycle.Game).GetDictionary("OngoingRewardManager"); } } public IEnumerable ActiveRewards { get { Dictionary storage = this._storage; if (!storage.ContainsKey("ActiveRewards")) { storage["ActiveRewards"] = new List(); } List list = (List)storage["ActiveRewards"]; List list2 = new List(); for (int i = 0; i < list.Count; i++) { object obj = list[i]; IOngoingReward ongoingReward = obj as IOngoingReward; if (ongoingReward == null) { if (obj == null) { UnityEngine.Debug.LogError("The stored list of ongoing rewards contains an object of type 'null'."); } else { UnityEngine.Debug.LogError(string.Format("The stored list of ongoing rewards contains an object of type '{0}'.", obj.GetType())); } } else if (!ongoingReward.IsActive) { list.RemoveAt(i--); } else { list2.Add(ongoingReward); } } return list2; } private set { List list = new List(); foreach (IOngoingReward item in value) { list.Add(item); } this._storage["ActiveRewards"] = list; } } public void AddReward(IOngoingReward reward) { IList list = (IList)this.ActiveRewards; bool flag = false; foreach (IOngoingReward ongoingReward in list) { if (ongoingReward.Add(reward)) { flag = true; break; } } if (!flag) { list.Add(reward); reward.Run(); } this.ActiveRewards = list; this.OnRewardAdded(reward); } public void RemoveReward(IOngoingReward reward) { IList list = (IList)this.ActiveRewards; list.Remove(reward); this.ActiveRewards = list; this.OnRewardRemoved(reward); } public void RemoveRewards(IEnumerable rewards) { IList list = (IList)this.ActiveRewards; IList list2 = new List(); foreach (IOngoingReward item in rewards) { int num = list.IndexOf(item); if (num != -1) { list.RemoveAt(num); list2.Add(item); } } this.ActiveRewards = list; foreach (IOngoingReward reward in list2) { this.OnRewardRemoved(reward); } } public bool RewardIsActive() where RewardType : class, IOngoingReward { RewardType rewardType = this.FindActiveReward(null); return rewardType != null && rewardType.IsActive; } public RewardType FindActiveReward(Predicate optionalPredicate = null) where RewardType : class, IOngoingReward { foreach (IOngoingReward ongoingReward in this.ActiveRewards) { RewardType rewardType = ongoingReward as RewardType; if (rewardType != null && (optionalPredicate == null || optionalPredicate(rewardType))) { return rewardType; } } return (RewardType)((object)null); } public IOngoingReward FindActiveReward(Predicate predicate) { foreach (IOngoingReward ongoingReward in this.ActiveRewards) { if (predicate(ongoingReward)) { return ongoingReward; } } return null; } public IEnumerable FindActiveRewards(Predicate predicate) { List list = new List(); foreach (IOngoingReward ongoingReward in this.ActiveRewards) { if (predicate(ongoingReward)) { list.Add(ongoingReward); } } return list; } private void OnRewardAdded(IOngoingReward reward) { if (this.RewardAdded != null) { this.RewardAdded(reward); } } private void OnRewardRemoved(IOngoingReward reward) { if (this.RewardRemoved != null) { this.RewardRemoved(reward); } } private const string StorageKey = "OngoingRewardManager"; private const string ActiveRewardsKey = "ActiveRewards"; public delegate void RewardAddedHandler(IOngoingReward reward); public delegate void RewardRemovedHandler(IOngoingReward reward); }