using System; using System.Collections.Generic; using CIG.Extensions; using SparkLinq; using SUISS.Core; using SUISSEngine; using UnityEngine; namespace CIG { [RequireComponent(typeof(Serializing))] public class CIGBalloonManager : MonoBehaviour { private void OnDestroy() { if (SingletonMonobehaviour.IsAvailable) { CIGTutorialManager instance = SingletonMonobehaviour.Instance; instance.HasDeserializedEvent -= this.OnTutorialManagerHasDeserialized; instance.TutorialFinishedEvent -= this.OnTutorialFinished; } if (this._balloonManager != null) { this._balloonManager.BalloonSpawnedEvent -= this.OnBalloonSpawned; this._balloonManager.BalloonCollectedEvent -= this.OnBalloonCollected; this._balloonManager.BalloonExpiredEvent -= this.OnBalloonExpired; this._balloonManager = null; } } private void TrySpawningBalloon() { if (this._hasFinishedTutorial) { this.TrySpawningVehicleBalloon(); } this.Invoke(new Action(this.TrySpawningBalloon), (float)this.RandomTimeBetweenBalloons, false); } private void TrySpawningVehicleBalloon() { List list = new List(); CIGVehicleManager.RoadType[] array = (CIGVehicleManager.RoadType[])Enum.GetValues(typeof(CIGVehicleManager.RoadType)); int num = array.Length; for (int i = 0; i < num; i++) { CIGVehicleManager.RoadType type = array[i]; foreach (VehicleManager.VehicleRegistration vehicleRegistration in this._vehicleManager.GetStatsForRoadType((int)type).Registrations) { list.AddRange(vehicleRegistration.Instances); } } List list2 = list.FindAll((Vehicle vehicle) => vehicle.Balloon != null); int count = list2.Count; int num2 = Mathf.Max(1, list.Count / 4); if (count < num2) { BalloonFactory balloonFactory = this._balloonManager.PickRandomVehicleBalloonFactory(); list.RemoveAll((Vehicle vehicle) => vehicle.Balloon != null); if (list.Count > 0 && balloonFactory != null && balloonFactory.CanProduce()) { Balloon balloon = this._balloonManager.SpawnBalloon(balloonFactory); if (balloon != null) { Vehicle vehicle2 = list.PickRandom(); vehicle2.ShowBalloon(balloon); } } } } private void OnBalloonSpawned(Balloon balloon) { this._serializing.Serialize(); } private void OnBalloonExpired(Balloon balloon) { this._serializing.Serialize(); } private void OnBalloonCollected(Balloon balloon) { this._serializing.Serialize(); } private void OnTutorialFinished() { this._hasFinishedTutorial = true; SingletonMonobehaviour.Instance.TutorialFinishedEvent -= this.OnTutorialFinished; } private void OnTutorialManagerHasDeserialized() { CIGTutorialManager instance = SingletonMonobehaviour.Instance; instance.HasDeserializedEvent -= this.OnTutorialManagerHasDeserialized; this._hasFinishedTutorial = instance.IsFinished; if (!this._hasFinishedTutorial) { instance.TutorialFinishedEvent += this.OnTutorialFinished; } } private int RandomTimeBetweenBalloons { get { return UnityEngine.Random.Range(5, 15); } } private void OnSerialize(Dictionary values) { values["BalloonManager"] = this._balloonManager.Serialize().InternalDictionary; } private void OnDeserialize(Dictionary values) { object obj; if (values.TryGetValue("BalloonManager", out obj)) { StorageDictionary storage = new StorageDictionary((Dictionary)obj); this._balloonManager = new BalloonManager(storage); } } private void OnDeserialized() { if (this._balloonManager == null) { this._balloonManager = new BalloonManager(); } this._balloonManager.BalloonSpawnedEvent += this.OnBalloonSpawned; this._balloonManager.BalloonCollectedEvent += this.OnBalloonCollected; this._balloonManager.BalloonExpiredEvent += this.OnBalloonExpired; CIGTutorialManager instance = SingletonMonobehaviour.Instance; if (instance.HasDeserialized) { this.OnTutorialManagerHasDeserialized(); } else { instance.HasDeserializedEvent += this.OnTutorialManagerHasDeserialized; } this.Invoke(new Action(this.TrySpawningBalloon), (float)this.RandomTimeBetweenBalloons, false); } private const int MinSecondsBetweenBalloons = 5; private const int MaxSecondsBetweenBalloons = 15; private const int VehicleToBalloonRatio = 4; [SerializeField] private Serializing _serializing; [SerializeField] private CIGVehicleManager _vehicleManager; private BalloonManager _balloonManager; private bool _hasFinishedTutorial; private const string BalloonManagerKey = "BalloonManager"; } }