You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

167 lines
4.9 KiB

  1. using System;
  2. using System.Collections.Generic;
  3. using CIG.Extensions;
  4. using SparkLinq;
  5. using SUISS.Core;
  6. using SUISSEngine;
  7. using UnityEngine;
  8. namespace CIG
  9. {
  10. [RequireComponent(typeof(Serializing))]
  11. public class CIGBalloonManager : MonoBehaviour
  12. {
  13. private void OnDestroy()
  14. {
  15. if (SingletonMonobehaviour<CIGTutorialManager>.IsAvailable)
  16. {
  17. CIGTutorialManager instance = SingletonMonobehaviour<CIGTutorialManager>.Instance;
  18. instance.HasDeserializedEvent -= this.OnTutorialManagerHasDeserialized;
  19. instance.TutorialFinishedEvent -= this.OnTutorialFinished;
  20. }
  21. if (this._balloonManager != null)
  22. {
  23. this._balloonManager.BalloonSpawnedEvent -= this.OnBalloonSpawned;
  24. this._balloonManager.BalloonCollectedEvent -= this.OnBalloonCollected;
  25. this._balloonManager.BalloonExpiredEvent -= this.OnBalloonExpired;
  26. this._balloonManager = null;
  27. }
  28. }
  29. private void TrySpawningBalloon()
  30. {
  31. if (this._hasFinishedTutorial)
  32. {
  33. this.TrySpawningVehicleBalloon();
  34. }
  35. this.Invoke(new Action(this.TrySpawningBalloon), (float)this.RandomTimeBetweenBalloons, false);
  36. }
  37. private void TrySpawningVehicleBalloon()
  38. {
  39. List<Vehicle> list = new List<Vehicle>();
  40. CIGVehicleManager.RoadType[] array = (CIGVehicleManager.RoadType[])Enum.GetValues(typeof(CIGVehicleManager.RoadType));
  41. int num = array.Length;
  42. for (int i = 0; i < num; i++)
  43. {
  44. CIGVehicleManager.RoadType type = array[i];
  45. foreach (VehicleManager.VehicleRegistration vehicleRegistration in this._vehicleManager.GetStatsForRoadType((int)type).Registrations)
  46. {
  47. list.AddRange(vehicleRegistration.Instances);
  48. }
  49. }
  50. List<Vehicle> list2 = list.FindAll((Vehicle vehicle) => vehicle.Balloon != null);
  51. int count = list2.Count;
  52. int num2 = Mathf.Max(1, list.Count / 4);
  53. if (count < num2)
  54. {
  55. BalloonFactory balloonFactory = this._balloonManager.PickRandomVehicleBalloonFactory();
  56. list.RemoveAll((Vehicle vehicle) => vehicle.Balloon != null);
  57. if (list.Count > 0 && balloonFactory != null && balloonFactory.CanProduce())
  58. {
  59. Balloon balloon = this._balloonManager.SpawnBalloon(balloonFactory);
  60. if (balloon != null)
  61. {
  62. Vehicle vehicle2 = list.PickRandom<Vehicle>();
  63. vehicle2.ShowBalloon(balloon);
  64. }
  65. }
  66. }
  67. }
  68. private void OnBalloonSpawned(Balloon balloon)
  69. {
  70. this._serializing.Serialize();
  71. }
  72. private void OnBalloonExpired(Balloon balloon)
  73. {
  74. this._serializing.Serialize();
  75. }
  76. private void OnBalloonCollected(Balloon balloon)
  77. {
  78. this._serializing.Serialize();
  79. }
  80. private void OnTutorialFinished()
  81. {
  82. this._hasFinishedTutorial = true;
  83. SingletonMonobehaviour<CIGTutorialManager>.Instance.TutorialFinishedEvent -= this.OnTutorialFinished;
  84. }
  85. private void OnTutorialManagerHasDeserialized()
  86. {
  87. CIGTutorialManager instance = SingletonMonobehaviour<CIGTutorialManager>.Instance;
  88. instance.HasDeserializedEvent -= this.OnTutorialManagerHasDeserialized;
  89. this._hasFinishedTutorial = instance.IsFinished;
  90. if (!this._hasFinishedTutorial)
  91. {
  92. instance.TutorialFinishedEvent += this.OnTutorialFinished;
  93. }
  94. }
  95. private int RandomTimeBetweenBalloons
  96. {
  97. get
  98. {
  99. return UnityEngine.Random.Range(5, 15);
  100. }
  101. }
  102. private void OnSerialize(Dictionary<string, object> values)
  103. {
  104. values["BalloonManager"] = this._balloonManager.Serialize().InternalDictionary;
  105. }
  106. private void OnDeserialize(Dictionary<string, object> values)
  107. {
  108. object obj;
  109. if (values.TryGetValue("BalloonManager", out obj))
  110. {
  111. StorageDictionary storage = new StorageDictionary((Dictionary<string, object>)obj);
  112. this._balloonManager = new BalloonManager(storage);
  113. }
  114. }
  115. private void OnDeserialized()
  116. {
  117. if (this._balloonManager == null)
  118. {
  119. this._balloonManager = new BalloonManager();
  120. }
  121. this._balloonManager.BalloonSpawnedEvent += this.OnBalloonSpawned;
  122. this._balloonManager.BalloonCollectedEvent += this.OnBalloonCollected;
  123. this._balloonManager.BalloonExpiredEvent += this.OnBalloonExpired;
  124. CIGTutorialManager instance = SingletonMonobehaviour<CIGTutorialManager>.Instance;
  125. if (instance.HasDeserialized)
  126. {
  127. this.OnTutorialManagerHasDeserialized();
  128. }
  129. else
  130. {
  131. instance.HasDeserializedEvent += this.OnTutorialManagerHasDeserialized;
  132. }
  133. this.Invoke(new Action(this.TrySpawningBalloon), (float)this.RandomTimeBetweenBalloons, false);
  134. }
  135. private const int MinSecondsBetweenBalloons = 5;
  136. private const int MaxSecondsBetweenBalloons = 15;
  137. private const int VehicleToBalloonRatio = 4;
  138. [SerializeField]
  139. private Serializing _serializing;
  140. [SerializeField]
  141. private CIGVehicleManager _vehicleManager;
  142. private BalloonManager _balloonManager;
  143. private bool _hasFinishedTutorial;
  144. private const string BalloonManagerKey = "BalloonManager";
  145. }
  146. }