您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 

189 行
4.6 KiB

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Diagnostics;
  4. using SUISS.Storage;
  5. using SUISSEngine;
  6. using UnityEngine;
  7. public sealed class OngoingRewardManager : Singleton<OngoingRewardManager>
  8. {
  9. //[DebuggerBrowsable(DebuggerBrowsableState.Never)]
  10. public event OngoingRewardManager.RewardAddedHandler RewardAdded;
  11. //[DebuggerBrowsable(DebuggerBrowsableState.Never)]
  12. public event OngoingRewardManager.RewardRemovedHandler RewardRemoved;
  13. private Dictionary<string, object> _storage
  14. {
  15. get
  16. {
  17. return Storage.Get(StorageLifecycle.Game).GetDictionary("OngoingRewardManager");
  18. }
  19. }
  20. public IEnumerable<IOngoingReward> ActiveRewards
  21. {
  22. get
  23. {
  24. Dictionary<string, object> storage = this._storage;
  25. if (!storage.ContainsKey("ActiveRewards"))
  26. {
  27. storage["ActiveRewards"] = new List<object>();
  28. }
  29. List<object> list = (List<object>)storage["ActiveRewards"];
  30. List<IOngoingReward> list2 = new List<IOngoingReward>();
  31. for (int i = 0; i < list.Count; i++)
  32. {
  33. object obj = list[i];
  34. IOngoingReward ongoingReward = obj as IOngoingReward;
  35. if (ongoingReward == null)
  36. {
  37. if (obj == null)
  38. {
  39. UnityEngine.Debug.LogError("The stored list of ongoing rewards contains an object of type 'null'.");
  40. }
  41. else
  42. {
  43. UnityEngine.Debug.LogError(string.Format("The stored list of ongoing rewards contains an object of type '{0}'.", obj.GetType()));
  44. }
  45. }
  46. else if (!ongoingReward.IsActive)
  47. {
  48. list.RemoveAt(i--);
  49. }
  50. else
  51. {
  52. list2.Add(ongoingReward);
  53. }
  54. }
  55. return list2;
  56. }
  57. private set
  58. {
  59. List<object> list = new List<object>();
  60. foreach (IOngoingReward item in value)
  61. {
  62. list.Add(item);
  63. }
  64. this._storage["ActiveRewards"] = list;
  65. }
  66. }
  67. public void AddReward(IOngoingReward reward)
  68. {
  69. IList<IOngoingReward> list = (IList<IOngoingReward>)this.ActiveRewards;
  70. bool flag = false;
  71. foreach (IOngoingReward ongoingReward in list)
  72. {
  73. if (ongoingReward.Add(reward))
  74. {
  75. flag = true;
  76. break;
  77. }
  78. }
  79. if (!flag)
  80. {
  81. list.Add(reward);
  82. reward.Run();
  83. }
  84. this.ActiveRewards = list;
  85. this.OnRewardAdded(reward);
  86. }
  87. public void RemoveReward(IOngoingReward reward)
  88. {
  89. IList<IOngoingReward> list = (IList<IOngoingReward>)this.ActiveRewards;
  90. list.Remove(reward);
  91. this.ActiveRewards = list;
  92. this.OnRewardRemoved(reward);
  93. }
  94. public void RemoveRewards(IEnumerable<IOngoingReward> rewards)
  95. {
  96. IList<IOngoingReward> list = (IList<IOngoingReward>)this.ActiveRewards;
  97. IList<IOngoingReward> list2 = new List<IOngoingReward>();
  98. foreach (IOngoingReward item in rewards)
  99. {
  100. int num = list.IndexOf(item);
  101. if (num != -1)
  102. {
  103. list.RemoveAt(num);
  104. list2.Add(item);
  105. }
  106. }
  107. this.ActiveRewards = list;
  108. foreach (IOngoingReward reward in list2)
  109. {
  110. this.OnRewardRemoved(reward);
  111. }
  112. }
  113. public bool RewardIsActive<RewardType>() where RewardType : class, IOngoingReward
  114. {
  115. RewardType rewardType = this.FindActiveReward<RewardType>(null);
  116. return rewardType != null && rewardType.IsActive;
  117. }
  118. public RewardType FindActiveReward<RewardType>(Predicate<RewardType> optionalPredicate = null) where RewardType : class, IOngoingReward
  119. {
  120. foreach (IOngoingReward ongoingReward in this.ActiveRewards)
  121. {
  122. RewardType rewardType = ongoingReward as RewardType;
  123. if (rewardType != null && (optionalPredicate == null || optionalPredicate(rewardType)))
  124. {
  125. return rewardType;
  126. }
  127. }
  128. return (RewardType)((object)null);
  129. }
  130. public IOngoingReward FindActiveReward(Predicate<IOngoingReward> predicate)
  131. {
  132. foreach (IOngoingReward ongoingReward in this.ActiveRewards)
  133. {
  134. if (predicate(ongoingReward))
  135. {
  136. return ongoingReward;
  137. }
  138. }
  139. return null;
  140. }
  141. public IEnumerable<IOngoingReward> FindActiveRewards(Predicate<IOngoingReward> predicate)
  142. {
  143. List<IOngoingReward> list = new List<IOngoingReward>();
  144. foreach (IOngoingReward ongoingReward in this.ActiveRewards)
  145. {
  146. if (predicate(ongoingReward))
  147. {
  148. list.Add(ongoingReward);
  149. }
  150. }
  151. return list;
  152. }
  153. private void OnRewardAdded(IOngoingReward reward)
  154. {
  155. if (this.RewardAdded != null)
  156. {
  157. this.RewardAdded(reward);
  158. }
  159. }
  160. private void OnRewardRemoved(IOngoingReward reward)
  161. {
  162. if (this.RewardRemoved != null)
  163. {
  164. this.RewardRemoved(reward);
  165. }
  166. }
  167. private const string StorageKey = "OngoingRewardManager";
  168. private const string ActiveRewardsKey = "ActiveRewards";
  169. public delegate void RewardAddedHandler(IOngoingReward reward);
  170. public delegate void RewardRemovedHandler(IOngoingReward reward);
  171. }