Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.
 
 
 

1027 lignes
29 KiB

  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using CIG;
  5. using CIG.Translation;
  6. using CIGEnums;
  7. using Inno.DLC;
  8. using SUISS.Core;
  9. using SUISS.Scheduling;
  10. using SUISSEngine;
  11. using UnityEngine;
  12. public class CityIsland : MonoBehaviour, IHasNotification
  13. {
  14. public CIGBuilding[] BuiltBuildings
  15. {
  16. get
  17. {
  18. return base.GetComponentInChildren<IsometricGrid>().GetComponentsInChildren<CIGBuilding>();
  19. }
  20. }
  21. public static string VersionString
  22. {
  23. get
  24. {
  25. return string.Format("{0} ({1}Build {2})", NativeGameVersion.Version, (!Debug.isDebugBuild) ? string.Empty : "Debug ", NativeGameVersion.Build);
  26. }
  27. }
  28. public bool IsTimeSpeedupActive
  29. {
  30. get
  31. {
  32. return this.timeSpeedupActive;
  33. }
  34. }
  35. public DateTime TimeWarpEnd { get; private set; }
  36. public double TimeBoostMultiplier { get; private set; }
  37. public string DlcMusicName
  38. {
  39. get
  40. {
  41. return this.dlcMusicName + ".mp3";
  42. }
  43. }
  44. public static CityIsland GetParent(Component node)
  45. {
  46. return node.GetComponentInParent<CityIsland>();
  47. }
  48. public static bool IsCurrent(CityIsland cityIsland)
  49. {
  50. if (cityIsland == null)
  51. {
  52. return CityIsland.Current == null;
  53. }
  54. return CityIsland.Current != null && cityIsland.island == CityIsland.Current.island;
  55. }
  56. public static bool IsCurrent(Island island)
  57. {
  58. if (CityIsland.Current == null)
  59. {
  60. return island == Island.None;
  61. }
  62. return island == CityIsland.Current.island;
  63. }
  64. public PlannedNotification[] GetNotifications()
  65. {
  66. List<PlannedNotification> list = new List<PlannedNotification>();
  67. list.Add(IAPPackSaleLocalNotifications.GetNotification());
  68. int num = 0;
  69. int num2 = 0;
  70. foreach (GridTile gridTile in this.isometricIsland.grid.Tiles)
  71. {
  72. CIGCommercialBuilding component = gridTile.GetComponent<CIGCommercialBuilding>();
  73. if (component != null)
  74. {
  75. num2++;
  76. num = Math.Max(num, component.ProfitTimeLeft);
  77. }
  78. }
  79. if (num > 0 && num2 >= 5)
  80. {
  81. int seconds = Math.Max(300, num + 60);
  82. list.Add(new PlannedNotification(seconds, Localization.Key("notification_commercial_buildings_ready"), false));
  83. }
  84. return list.ToArray();
  85. }
  86. protected void Awake()
  87. {
  88. if (this.expansions == null)
  89. {
  90. UnityEngine.Debug.LogWarning("Cannot find CIGExpansions component");
  91. }
  92. IsometricIsland oldIsland = null;
  93. if (CityIsland.Current != null)
  94. {
  95. oldIsland = CityIsland.Current.isometricIsland;
  96. }
  97. HUDState hudstate = UnityEngine.Object.FindObjectOfType<HUDState>();
  98. if (hudstate != null)
  99. {
  100. hudstate.OnIslandChange(oldIsland, this.isometricIsland);
  101. }
  102. CityIsland.Current = this;
  103. if (this.isometricIsland == null)
  104. {
  105. UnityEngine.Debug.LogError("Cannot find IsometricIsland component to set Current!");
  106. }
  107. else
  108. {
  109. IsometricIsland.Current = this.isometricIsland;
  110. }
  111. }
  112. protected void Start()
  113. {
  114. this.fsm = UnityEngine.Object.FindObjectOfType<FiniteStateMachine>();
  115. SingletonMonobehaviour<CIGAudioManager>.Instance.EnableMusic(Singleton<CIGSettings>.Instance.MusicEnabled);
  116. SingletonMonobehaviour<CIGAudioManager>.Instance.EnableSFX(Singleton<CIGSettings>.Instance.SoundEffectsEnabled);
  117. SingletonMonobehaviour<CIGWebService>.Instance.PullRequestCompleted += this.PullRequestFinished;
  118. this.SetupMusic();
  119. TimeBoostReward timeBoostReward = Singleton<OngoingRewardManager>.Instance.FindActiveReward((IOngoingReward reward) => reward is TimeBoostReward) as TimeBoostReward;
  120. if (timeBoostReward != null)
  121. {
  122. timeBoostReward.Run();
  123. }
  124. SingletonMonobehaviour<CIGLocalNotificationManager>.Instance.HasNotification(this);
  125. IAPPackSaleLocalNotifications.Init();
  126. }
  127. protected void OnGridDeserialized()
  128. {
  129. this.islandState.LoadValuesFromBuildings();
  130. if (SingletonMonobehaviour<CIGGameStats>.IsAvailable)
  131. {
  132. CIGGameStats instance = SingletonMonobehaviour<CIGGameStats>.Instance;
  133. instance.SetCurrentCityIsland(this);
  134. }
  135. }
  136. protected void Update()
  137. {
  138. TimeBoostReward timeBoostReward = Singleton<OngoingRewardManager>.Instance.FindActiveReward((IOngoingReward reward) => reward is TimeBoostReward) as TimeBoostReward;
  139. if (this.TimeWarpEnd <= DateTime.UtcNow || (this.warpType == CityIsland.TimeWarpType.Boost && timeBoostReward == null))
  140. {
  141. Timing.scale = 1.0;
  142. this.timeSpeedupActive = false;
  143. }
  144. }
  145. public void DownloadCompleted(string group, string name)
  146. {
  147. if (group == this.island.ToString() && this.DlcMusicName == name)
  148. {
  149. this.SetupMusic();
  150. }
  151. }
  152. private void SetupMusic()
  153. {
  154. AudioClip x = this.music;
  155. if (!string.IsNullOrEmpty(this.DlcMusicName) && this.island != Island.GoneGreenlands)
  156. {
  157. DLCManager dlcmanager = ServiceLocator.Find<DLCManager>();
  158. if (dlcmanager != null && dlcmanager.IsEnabled)
  159. {
  160. string text = this.island.ToString();
  161. DLCGroup dlcgroup = dlcmanager.GetGroup(text).FileSelection("Type", "Music");
  162. if (dlcgroup.IsDownloaded)
  163. {
  164. DLCFile fileWithName = dlcgroup.GetFileWithName(this.DlcMusicName);
  165. if (fileWithName != null)
  166. {
  167. SingletonMonobehaviour<Scheduler>.Instance.StartRoutine(this.PlayWhenReady(fileWithName), base.gameObject);
  168. return;
  169. }
  170. UnityEngine.Debug.LogError(string.Format("No file with name {0} in group {1}", this.DlcMusicName, text));
  171. }
  172. }
  173. else
  174. {
  175. UnityEngine.Debug.LogWarning("No DLC manager");
  176. }
  177. }
  178. if (x != null)
  179. {
  180. SingletonMonobehaviour<CIGAudioManager>.Instance.SetMusic(x);
  181. }
  182. }
  183. private IEnumerator PlayWhenReady(DLCFile file)
  184. {
  185. WWW www = new WWW(file.URI);
  186. yield return www;
  187. yield return this.PlayWhenReady(www.GetAudioClip());
  188. yield break;
  189. }
  190. private IEnumerator PlayWhenReady(AudioClip clip)
  191. {
  192. yield return null;
  193. while (clip.loadState != AudioDataLoadState.Loaded)
  194. {
  195. yield return Timing.time + 0.1;
  196. }
  197. SingletonMonobehaviour<CIGAudioManager>.Instance.SetMusic(clip);
  198. yield break;
  199. }
  200. public static Currencies GetTotalSpeedupCost()
  201. {
  202. Currencies currencies = Currencies.Zero;
  203. int num = 0;
  204. foreach (CIGBuilding cigbuilding in UnityEngine.Object.FindObjectsOfType<CIGBuilding>())
  205. {
  206. if (cigbuilding.GetSecondsLeft() > 0L)
  207. {
  208. currencies += new Currencies("Gold", cigbuilding.SpeedupCostGold);
  209. num++;
  210. }
  211. }
  212. if (num > 2)
  213. {
  214. currencies *= 0.5m;
  215. }
  216. else if (num == 2)
  217. {
  218. currencies *= 0.75m;
  219. }
  220. return currencies.Round();
  221. }
  222. public static void SpeedupAllBuildings()
  223. {
  224. foreach (CIGBuilding cigbuilding in UnityEngine.Object.FindObjectsOfType<CIGBuilding>())
  225. {
  226. if (cigbuilding.GetSecondsLeft() > 0L)
  227. {
  228. if (!cigbuilding.IsConstructed)
  229. {
  230. cigbuilding.FinishConstruction();
  231. }
  232. else if (cigbuilding.IsUpgrading)
  233. {
  234. cigbuilding.FinishUpgrade();
  235. }
  236. else
  237. {
  238. cigbuilding.FinishDemolishing();
  239. }
  240. }
  241. }
  242. }
  243. private void OnApplicationPause(bool pause)
  244. {
  245. CIGGameState instance = SingletonMonobehaviour<CIGGameState>.Instance;
  246. if (pause)
  247. {
  248. int value = instance.GetValue<int>("currentRetentionReward", 0);
  249. if (value < this.RetentionRewards.Length && this.RetentionRewards[value] > 0L)
  250. {
  251. long num = 86400L * this.RetentionRewards[value];
  252. long num2 = (long)Timing.UtcNow + num;
  253. instance.SetValue("retentionRewardTimestamp", num2);
  254. this.isometricIsland.EnsureSave();
  255. }
  256. }
  257. else
  258. {
  259. long value2 = instance.GetValue<long>("retentionRewardTimestamp", -1L);
  260. if (value2 != -1L)
  261. {
  262. if (Singleton<CIGSettings>.Instance.NotificationsEnabled && (long)Timing.UtcNow > value2)
  263. {
  264. decimal value3 = 2m;
  265. Currencies currencies = new Currencies("Gold", value3);
  266. SingletonMonobehaviour<PopupManager>.Instance.ShowReceiveRewardPopup(currencies);
  267. instance.EarnCurrencies(currencies, null);
  268. instance.SetValue("currentRetentionReward", instance.GetValue<int>("currentRetentionReward", 0) + 1);
  269. }
  270. instance.SetValue("retentionRewardTimestamp", -1L);
  271. }
  272. }
  273. SingletonMonobehaviour<CIGSessionRestarter>.Instance.ApplicationPause(pause);
  274. }
  275. private void OnDestroy()
  276. {
  277. if (SingletonMonobehaviour<CIGLocalNotificationManager>.IsAvailable)
  278. {
  279. SingletonMonobehaviour<CIGLocalNotificationManager>.Instance.NoLongerHasNotification(this);
  280. }
  281. if (SingletonMonobehaviour<CIGGameStats>.IsAvailable)
  282. {
  283. CIGGameStats instance = SingletonMonobehaviour<CIGGameStats>.Instance;
  284. instance.SetCurrentCityIsland(null);
  285. }
  286. }
  287. private IEnumerator TimeSpeedUp(double seconds)
  288. {
  289. double MaxTimeScale = (seconds >= 3600.0) ? 1000.0 : 100.0;
  290. while (Timing.scale < MaxTimeScale)
  291. {
  292. Timing.scale = Math.Min(MaxTimeScale, Timing.scale * 1.2);
  293. yield return null;
  294. }
  295. Timing.scale = MaxTimeScale;
  296. yield return new WaitForSeconds((float)seconds / (float)Timing.scale * (float)Timing.Instance.maximumTimeScale);
  297. while (Timing.scale > 1.0)
  298. {
  299. Timing.scale = Math.Max(1.0, Timing.scale * 0.8);
  300. yield return null;
  301. }
  302. Timing.scale = 1.0;
  303. foreach (CIGBuilding cigbuilding in CityIsland.ProfitGeneratingBuildings())
  304. {
  305. cigbuilding.GetComponent<Serializing>().Serialize();
  306. }
  307. this.timeSpeedupActive = false;
  308. SingletonMonobehaviour<PopupManager>.Instance.RequestGenericPopup(UISpriteType.TimeWarpClock, Localization.Key("timewarp_title"), Localization.Format("{0} ({1})", new ILocalizedString[]
  309. {
  310. Localization.Key("timewarp_executed"),
  311. Localization.TimeSpan(TimeSpan.FromSeconds(seconds), false)
  312. }), Localization.Key("ok"), null, null, null, null, true);
  313. yield break;
  314. }
  315. private static List<CIGBuilding> ProfitGeneratingBuildings()
  316. {
  317. List<CIGBuilding> list = new List<CIGBuilding>();
  318. list.AddRange(UnityEngine.Object.FindObjectsOfType<CIGCommercialBuilding>());
  319. return list;
  320. }
  321. public void StartSpeedup(double seconds)
  322. {
  323. if (this.timeSpeedupActive)
  324. {
  325. UnityEngine.Debug.LogWarning("Cannot StartSpeedup when timeSpeedupActive.");
  326. return;
  327. }
  328. this.timeSpeedupActive = true;
  329. base.StartCoroutine(this.TimeSpeedUp(seconds));
  330. }
  331. public bool TimeBoost(double multiplier, TimeSpan duration)
  332. {
  333. if (this.timeSpeedupActive)
  334. {
  335. UnityEngine.Debug.LogWarning("Cannot TimeBoost when timeSpeedupActive.");
  336. return false;
  337. }
  338. TimingScaleRestore.Instance.SetScaleUntil(multiplier, DateTime.UtcNow + duration);
  339. this.timeSpeedupActive = true;
  340. this.TimeWarpEnd = DateTime.UtcNow + duration;
  341. this.warpType = CityIsland.TimeWarpType.Boost;
  342. return true;
  343. }
  344. public bool TimeWarp(TimeSpan warpedTime, TimeSpan duration)
  345. {
  346. if (this.timeSpeedupActive)
  347. {
  348. UnityEngine.Debug.LogWarning("Cannot TimeWarp when timeSpeedupActive.");
  349. return false;
  350. }
  351. TimingScaleRestore.Instance.SetScaleUntil(warpedTime.TotalSeconds / duration.TotalSeconds, DateTime.UtcNow + duration);
  352. this.timeSpeedupActive = true;
  353. this.TimeWarpEnd = DateTime.UtcNow + duration;
  354. this.warpType = CityIsland.TimeWarpType.Warp;
  355. return true;
  356. }
  357. public void StartBuilding(GameObject buildingPrefab)
  358. {
  359. this.isometricIsland.builder.BeginBuild(buildingPrefab);
  360. this.SetupConfirmState(true, this.GetHintLocalization(buildingPrefab, Localization.Key("help_building_drag_to_empty_space")), CIGBuilding.GetImmediateConstructionCost(buildingPrefab));
  361. }
  362. public void StartMoving(GameObject building)
  363. {
  364. if (!building.GetComponent<Building>().movable)
  365. {
  366. UnityEngine.Debug.LogWarning("Trying to move an unmovable building; aborting move");
  367. return;
  368. }
  369. this.isometricIsland.builder.BeginMove(building);
  370. this.SetupConfirmState(true, this.GetHintLocalization(building, Localization.Key("help_building_drag_to_empty_space")), null);
  371. }
  372. private ILocalizedString GetHintLocalization(GameObject building, ILocalizedString defaultValue)
  373. {
  374. int num = -1;
  375. GridTile component = building.GetComponent<GridTile>();
  376. if (component != null)
  377. {
  378. num = component.requiredGridType;
  379. }
  380. if (num == 2)
  381. {
  382. return Localization.Key("building_tile_type_beach");
  383. }
  384. if (num == 3)
  385. {
  386. return Localization.Key("building_tile_type_water");
  387. }
  388. return defaultValue;
  389. }
  390. private void SetupConfirmState(bool flip, ILocalizedString hintLocalization, Currencies cost)
  391. {
  392. HUDConfirmState hudconfirmState = this.fsm.SwitchState<HUDConfirmState>();
  393. if (flip)
  394. {
  395. hudconfirmState.ShowFlipButton();
  396. }
  397. if (hintLocalization != null)
  398. {
  399. hudconfirmState.SetHintText(hintLocalization);
  400. }
  401. hudconfirmState.SetImmediateCost(cost);
  402. hudconfirmState.OKEvent += this.FinishBuilding;
  403. hudconfirmState.CancelEvent += this.CancelBuilding;
  404. if (flip)
  405. {
  406. hudconfirmState.FlipEvent += this.FlipBuilding;
  407. }
  408. if (cost != null)
  409. {
  410. hudconfirmState.InstantEvent += this.ImmediateBuild;
  411. }
  412. }
  413. private void RemoveConfirmEventHandlers()
  414. {
  415. if (!(this.fsm.CurrentState is HUDConfirmState))
  416. {
  417. UnityEngine.Debug.LogWarning("Unable to remove event handlers because current state is no longer HUDConfirmState");
  418. return;
  419. }
  420. HUDConfirmState hudconfirmState = (HUDConfirmState)this.fsm.CurrentState;
  421. hudconfirmState.OKEvent -= this.FinishBuilding;
  422. hudconfirmState.CancelEvent -= this.CancelBuilding;
  423. hudconfirmState.FlipEvent -= this.FlipBuilding;
  424. hudconfirmState.InstantEvent -= this.ImmediateBuild;
  425. }
  426. public bool FlipBuilding()
  427. {
  428. this.isometricIsland.builder.UpdateBuild(!this.isometricIsland.builder.currentTile.mirrored);
  429. return false;
  430. }
  431. public bool FinishBuilding()
  432. {
  433. if (this.isometricIsland.builder.isBuildingRoad)
  434. {
  435. this.isometricIsland.builder.FinishRoad();
  436. }
  437. else if (this.isometricIsland.builder.isBuilding)
  438. {
  439. if (!this.isometricIsland.builder.CanBuild())
  440. {
  441. return false;
  442. }
  443. GridTile currentTile = this.isometricIsland.builder.currentTile;
  444. if (currentTile.status == GridTile.Status.Moving)
  445. {
  446. this.isometricIsland.builder.FinishBuild();
  447. }
  448. else
  449. {
  450. CIGBuilding building = currentTile.GetComponent<CIGBuilding>();
  451. if (building != null)
  452. {
  453. Currencies cost = building.PurchasePrice;
  454. decimal extraCost = 0m;
  455. Action action = delegate()
  456. {
  457. cost += new Currencies("Gold", extraCost);
  458. this.isometricIsland.gameState.SpendCurrencies(cost, true, delegate(bool succes, Currencies spent)
  459. {
  460. if (succes)
  461. {
  462. CIGGameStats instance = SingletonMonobehaviour<CIGGameStats>.Instance;
  463. int num = Mathf.RoundToInt((float)extraCost);
  464. int num2 = Mathf.RoundToInt((float)spent.GetValue("Gold"));
  465. if (num2 > 0)
  466. {
  467. if (building.initialPurchasePrice.ContainsPositive("Gold"))
  468. {
  469. instance.AddGoldSpent_GoldBuildings(num2 - num);
  470. }
  471. else
  472. {
  473. instance.AddGoldSpent_CashBuildings(num2 - num);
  474. }
  475. }
  476. if (num > 0)
  477. {
  478. instance.AddGoldSpent_CraneHire(num);
  479. }
  480. if (spent.GetValue("Cash") > 0m)
  481. {
  482. instance.AddCashBuilding(building.name);
  483. }
  484. else
  485. {
  486. instance.AddVirtualCurrencySpent();
  487. }
  488. if (SingletonMonobehaviour<CIGPurchasedBuildingsManager>.Instance.IsUnconsumed(building))
  489. {
  490. SingletonMonobehaviour<CIGPurchasedBuildingsManager>.Instance.ConsumeBuilding(building);
  491. }
  492. this.isometricIsland.builder.FinishBuild();
  493. }
  494. else
  495. {
  496. this.CancelBuilding();
  497. }
  498. });
  499. };
  500. Action cancelAction = delegate()
  501. {
  502. this.isometricIsland.builder.CancelBuild();
  503. };
  504. if (SingletonMonobehaviour<CIGBuilderManager>.Instance.CurrentBuildCount < SingletonMonobehaviour<CIGBuilderManager>.Instance.MaxBuildCount)
  505. {
  506. action();
  507. }
  508. else
  509. {
  510. extraCost = 1m;
  511. Currencies extraCost2 = new Currencies("Gold", extraCost);
  512. SingletonMonobehaviour<PopupManager>.Instance.ShowTooMuchParallelBuildsPopup(action, cancelAction, extraCost2);
  513. }
  514. this.RemoveConfirmEventHandlers();
  515. return true;
  516. }
  517. this.CancelBuilding();
  518. return false;
  519. }
  520. }
  521. else if (this.isometricIsland.destroyer.isSelecting)
  522. {
  523. this.isometricIsland.destroyer.DestroySelection();
  524. }
  525. else
  526. {
  527. UnityEngine.Debug.LogWarning("Don't know what we're finishing.");
  528. }
  529. this.RemoveConfirmEventHandlers();
  530. return true;
  531. }
  532. public bool CancelBuilding()
  533. {
  534. if (this.isometricIsland.builder.isBuildingRoad)
  535. {
  536. this.isometricIsland.builder.CancelRoad();
  537. }
  538. else if (this.isometricIsland.builder.isBuilding)
  539. {
  540. this.isometricIsland.builder.CancelBuild();
  541. }
  542. else if (this.isometricIsland.destroyer.isSelecting)
  543. {
  544. this.isometricIsland.destroyer.CancelSelecting();
  545. }
  546. else
  547. {
  548. UnityEngine.Debug.LogWarning("Don't know what we're canceling.");
  549. }
  550. this.RemoveConfirmEventHandlers();
  551. return true;
  552. }
  553. public bool ImmediateBuild()
  554. {
  555. HUDConfirmState hudconfirmState = this.fsm.CurrentState as HUDConfirmState;
  556. if (hudconfirmState == null)
  557. {
  558. UnityEngine.Debug.LogWarning("Current FSM state is not HUDConfirmState.");
  559. return false;
  560. }
  561. Currencies immediateCost = hudconfirmState.ImmediateCost;
  562. if (this.isometricIsland.builder.isBuilding && this.isometricIsland.builder.CanBuild())
  563. {
  564. GridTile currentTile = this.isometricIsland.builder.currentTile;
  565. if (currentTile.status == GridTile.Status.Preview)
  566. {
  567. this.isometricIsland.gameState.SpendCurrencies(immediateCost, true, delegate(bool success, Currencies spent)
  568. {
  569. if (success)
  570. {
  571. GridTile gridTile = this.isometricIsland.builder.FinishBuild();
  572. CIGBuilding component = gridTile.GetComponent<CIGBuilding>();
  573. if (component != null)
  574. {
  575. int num = (int)spent.GetValue("Gold");
  576. CIGGameStats instance = SingletonMonobehaviour<CIGGameStats>.Instance;
  577. instance.AddGoldSpent_ImmediateBuild(num);
  578. instance.AddVirtualCurrencySpent();
  579. component.FinishConstruction();
  580. }
  581. }
  582. else
  583. {
  584. this.CancelBuilding();
  585. }
  586. });
  587. this.RemoveConfirmEventHandlers();
  588. return true;
  589. }
  590. }
  591. UnityEngine.Debug.LogWarning("Cannot handle this state with ImmediateBuild.");
  592. return false;
  593. }
  594. public void StartBuildingRoad(GameObject road)
  595. {
  596. this.isometricIsland.builder.BeginRoad(road);
  597. this.SetupConfirmState(false, Localization.Key("help_build_roads"), null);
  598. }
  599. public void StartDestroying()
  600. {
  601. this.isometricIsland.destroyer.StartSelecting();
  602. this.SetupConfirmState(false, Localization.Key("help_destroy"), null);
  603. }
  604. private void PrefabRegistrationRequest(GameObjectManager manager)
  605. {
  606. }
  607. private IEnumerator AllBuildingPrefabs()
  608. {
  609. GameObjectManager goManager = SingletonMonobehaviour<GameObjectManager>.Instance;
  610. int length = goManager.Residential.Length;
  611. for (int i = 0; i < length; i++)
  612. {
  613. yield return goManager.Residential[i].Prefab;
  614. }
  615. length = goManager.Community.Length;
  616. for (int j = 0; j < length; j++)
  617. {
  618. yield return goManager.Community[j].Prefab;
  619. }
  620. length = goManager.Commercial.Length;
  621. for (int k = 0; k < length; k++)
  622. {
  623. yield return goManager.Commercial[k].Prefab;
  624. }
  625. length = goManager.Decoration.Length;
  626. for (int l = 0; l < length; l++)
  627. {
  628. yield return goManager.Decoration[l].Prefab;
  629. }
  630. yield break;
  631. }
  632. private void TryUpdateRoad(GridIndex index)
  633. {
  634. if (index.isInvalid || index.u >= this.isometricIsland.grid.sizeU || index.v >= this.isometricIsland.grid.sizeV)
  635. {
  636. return;
  637. }
  638. if (this.isometricIsland.grid[index] != null && this.isometricIsland.grid[index].Tile != null)
  639. {
  640. return;
  641. }
  642. this.isometricIsland.builder.UpdateRoad(index);
  643. }
  644. private IEnumerator BuildScriptRoutine()
  645. {
  646. Queue<Building> queue = new Queue<Building>();
  647. IEnumerator prefabs = this.AllBuildingPrefabs();
  648. while (prefabs.MoveNext())
  649. {
  650. object obj = prefabs.Current;
  651. GameObject prefab = obj as GameObject;
  652. UnityEngine.Debug.Log(string.Format("Prefab name is {0}", prefab.name));
  653. CIGBuilding cigBuilding = prefab.GetComponent<CIGBuilding>();
  654. if (!cigBuilding.activatable)
  655. {
  656. int count = Mathf.Min(2, Mathf.Max(1, cigBuilding.unlockLevels.Length));
  657. for (int i = 0; i < count; i++)
  658. {
  659. this.isometricIsland.builder.BeginBuild(prefab);
  660. if (this.isometricIsland.builder.isBuilding)
  661. {
  662. yield return null;
  663. GridTile tile = null;
  664. if (this.isometricIsland.builder.CanBuild())
  665. {
  666. tile = this.isometricIsland.builder.FinishBuild();
  667. }
  668. else
  669. {
  670. this.isometricIsland.builder.CancelBuild();
  671. }
  672. yield return null;
  673. if (tile == null)
  674. {
  675. if (this.expansions == null)
  676. {
  677. UnityEngine.Debug.LogWarning("Unable to find a CIGExpensions object.");
  678. }
  679. else
  680. {
  681. bool done = false;
  682. for (int u = 0; u < this.expansions.BlocksU; u++)
  683. {
  684. for (int v = 0; v < this.expansions.BlocksV; v++)
  685. {
  686. CIGExpansions.ExpansionBlock block = this.expansions.GetBlock(u, v);
  687. if (block != null)
  688. {
  689. if ((double)block.AvailableFraction >= 0.4 && (double)block.VisibleFraction >= 0.4)
  690. {
  691. if (!block.Unlocked && block.CanUnlock)
  692. {
  693. this.expansions.UnlockBlock(block, new Currencies());
  694. for (u = block.Origin.u; u < block.Origin.u + block.Size.u; u++)
  695. {
  696. for (v = block.Origin.v; v < block.Origin.v + block.Size.v; v++)
  697. {
  698. GridIndex index = new GridIndex(u, v);
  699. if (this.isometricIsland.grid.IsWithinBounds(index))
  700. {
  701. GridElement gridElement = this.isometricIsland.grid[index];
  702. if (gridElement != null)
  703. {
  704. GridTile tile2 = gridElement.Tile;
  705. if (tile2 != null)
  706. {
  707. CIGScenery component = tile2.GetComponent<CIGScenery>();
  708. if (component != null)
  709. {
  710. this.isometricIsland.destroyer.DestroyBuilding(component);
  711. }
  712. }
  713. }
  714. }
  715. }
  716. }
  717. yield return null;
  718. this.isometricIsland.destroyer.FinishAll();
  719. yield return null;
  720. done = true;
  721. break;
  722. }
  723. }
  724. }
  725. }
  726. if (done)
  727. {
  728. break;
  729. }
  730. }
  731. if (!done)
  732. {
  733. UnityEngine.Debug.LogWarning("Did not manage to unlock a new expansions block.");
  734. }
  735. else
  736. {
  737. this.isometricIsland.builder.BeginBuild(prefab);
  738. if (this.isometricIsland.builder.isBuilding)
  739. {
  740. yield return null;
  741. if (this.isometricIsland.builder.CanBuild())
  742. {
  743. tile = this.isometricIsland.builder.FinishBuild();
  744. }
  745. else
  746. {
  747. this.isometricIsland.builder.CancelBuild();
  748. }
  749. yield return null;
  750. }
  751. }
  752. }
  753. }
  754. if (tile != null)
  755. {
  756. int roadType = UnityEngine.Random.Range(0, Math.Min(3, this.roads.Length));
  757. this.isometricIsland.builder.BeginRoad(this.roads[roadType]);
  758. if (this.isometricIsland.builder.isBuildingRoad)
  759. {
  760. yield return null;
  761. for (int j = tile.index.u - tile.size.u; j <= tile.index.u + 1; j++)
  762. {
  763. this.TryUpdateRoad(new GridIndex(j, tile.index.v + 1));
  764. this.TryUpdateRoad(new GridIndex(j, tile.index.v - tile.size.v));
  765. }
  766. for (int k = tile.index.v - tile.size.v + 1; k <= tile.index.v; k++)
  767. {
  768. this.TryUpdateRoad(new GridIndex(tile.index.u + 1, k));
  769. this.TryUpdateRoad(new GridIndex(tile.index.u - tile.size.u, k));
  770. }
  771. yield return null;
  772. this.isometricIsland.builder.FinishRoad();
  773. }
  774. Building building = tile.GetComponent<Building>();
  775. if (building != null)
  776. {
  777. queue.Enqueue(building);
  778. }
  779. }
  780. else
  781. {
  782. UnityEngine.Debug.LogWarning("Failed to build " + prefab.name);
  783. }
  784. }
  785. else
  786. {
  787. UnityEngine.Debug.LogWarning("Failed to start building " + prefab.name);
  788. }
  789. yield return null;
  790. }
  791. yield return new WaitForSeconds(1f);
  792. if (queue.Count > 0 && UnityEngine.Random.Range(0, 2) == 0)
  793. {
  794. yield return null;
  795. queue.Dequeue().FinishConstruction();
  796. }
  797. }
  798. }
  799. while (queue.Count > 0)
  800. {
  801. yield return null;
  802. queue.Dequeue().FinishConstruction();
  803. yield return new WaitForSeconds(1f);
  804. }
  805. yield break;
  806. }
  807. public void StartBuildScript()
  808. {
  809. base.StartCoroutine("BuildScriptRoutine");
  810. }
  811. public void StopBuildScript()
  812. {
  813. base.StopCoroutine("BuildScriptRoutine");
  814. }
  815. private void UpdateConfirmed()
  816. {
  817. Application.OpenURL(SingletonMonobehaviour<CIGGameConstants>.Instance.UpdateUrl);
  818. }
  819. private void PullRequestFinished()
  820. {
  821. CIGWebService instance = SingletonMonobehaviour<CIGWebService>.Instance;
  822. if (instance.UpdateAvailable)
  823. {
  824. bool flag = true;
  825. string value = this.isometricIsland.gameState.GetValue<string>(CityIsland.ShownUpdatePopupVersionKey, string.Empty);
  826. if (value != null && value == "3.0.6")
  827. {
  828. double value2 = this.isometricIsland.gameState.GetValue<double>(CityIsland.ShownUpdatePopupTimestampKey, 0.0);
  829. flag = (Timing.UtcNow - value2 >= 172800.0);
  830. }
  831. if (flag)
  832. {
  833. this.isometricIsland.gameState.SetValue(CityIsland.ShownUpdatePopupVersionKey, "3.0.6");
  834. this.isometricIsland.gameState.SetValue(CityIsland.ShownUpdatePopupTimestampKey, Timing.UtcNow);
  835. SingletonMonobehaviour<PopupManager>.Instance.RequestGenericPopup(UISpriteType.UpgradeIcon, Localization.Key("update_available"), Localization.Key("update_older_version"), Localization.Key("update_go"), Localization.Key("not_now"), new Action(this.UpdateConfirmed), null, null, true);
  836. }
  837. }
  838. if (!instance.Undelivered.IsEmpty())
  839. {
  840. this.DeliverCurrencies(instance.Undelivered);
  841. instance.ClearUndelivered();
  842. }
  843. }
  844. private void DeliverCurrencies(Currencies currencies)
  845. {
  846. if (currencies.ContainsPositive("XP") && !currencies.ContainsPositive("Cash") && !currencies.ContainsPositive("Gold"))
  847. {
  848. SingletonMonobehaviour<PopupManager>.Instance.ShowInfoPopup(null, Localization.Format(Localization.Key("you_have_received"), new ILocalizedString[]
  849. {
  850. currencies.LocalizedString()
  851. }));
  852. }
  853. else
  854. {
  855. SingletonMonobehaviour<PopupManager>.Instance.ShowReceiveRewardPopup(currencies);
  856. }
  857. CIGGameState instance = SingletonMonobehaviour<CIGGameState>.Instance;
  858. instance.GiveCurrencies(currencies);
  859. }
  860. private void OnNativeMessage(string message)
  861. {
  862. if (message.Equals("DeviceShake"))
  863. {
  864. base.StartCoroutine(this.DoEarthquake());
  865. }
  866. else
  867. {
  868. UnityEngine.Debug.Log("Unknown native message: " + message);
  869. }
  870. }
  871. public IEnumerator DoEarthquake()
  872. {
  873. if (this.quakeActive)
  874. {
  875. yield break;
  876. }
  877. this.quakeActive = true;
  878. UnityEngine.Debug.LogWarning("RUN FOR YOUR LIVES!!!!");
  879. GameObject eq = new GameObject("Earthquake");
  880. eq.transform.parent = base.transform;
  881. eq.transform.localPosition = Vector3.zero;
  882. AudioSource audio = eq.AddComponent<AudioSource>();
  883. Animator animator = this.isometricIsland.islandCamera.GetComponent<Animator>();
  884. audio.PlayOneShot(this.earthquakeSound);
  885. animator.SetBool("Quake", true);
  886. AudioSource music = SingletonMonobehaviour<CIGAudioManager>.Instance.GetComponent<AudioSource>();
  887. if (music.isPlaying)
  888. {
  889. float v = music.volume;
  890. while (v > 0.01f)
  891. {
  892. v -= Time.deltaTime;
  893. music.volume = v;
  894. yield return null;
  895. }
  896. music.volume = 0f;
  897. yield return new WaitForSeconds(8f);
  898. animator.SetBool("Quake", false);
  899. yield return new WaitForSeconds(4f);
  900. v = music.volume;
  901. while (v < 0.99f)
  902. {
  903. v += Time.deltaTime * 0.5f;
  904. music.volume = v;
  905. yield return null;
  906. }
  907. music.volume = 1f;
  908. }
  909. else
  910. {
  911. yield return new WaitForSeconds(9f);
  912. animator.SetBool("Quake", false);
  913. yield return new WaitForSeconds(5f);
  914. }
  915. UnityEngine.Object.Destroy(eq);
  916. this.quakeActive = false;
  917. yield break;
  918. }
  919. public static readonly string TimewarpLength = "TimewarpDuration";
  920. public static readonly string TimeboostMultiplierKey = "TimeboostMultiplier";
  921. private static readonly string ShownUpdatePopupVersionKey = "shownUpdatePopupVersion";
  922. private static readonly string ShownUpdatePopupTimestampKey = "shownUpdatePopupTimestamp";
  923. private long[] RetentionRewards = new long[]
  924. {
  925. 3L,
  926. 7L,
  927. 14L,
  928. 30L
  929. };
  930. public static CityIsland Current;
  931. public CityIsland.TimeWarpType warpType;
  932. public GameObject[] roads;
  933. public AudioClip earthquakeSound;
  934. public Island island;
  935. public Transform UI3D;
  936. public AudioClip music;
  937. [SerializeField]
  938. private string dlcMusicName;
  939. [SelfReference]
  940. public IsometricIsland isometricIsland;
  941. [SelfReference]
  942. public CIGExpansions expansions;
  943. [SelfReference]
  944. public CIGIslandState islandState;
  945. private FiniteStateMachine fsm;
  946. private bool timeSpeedupActive;
  947. private bool quakeActive;
  948. public const string CurrentRetentionRewardKey = "currentRetentionReward";
  949. public const string RetentionRewardTimestampKey = "retentionRewardTimestamp";
  950. public enum TimeWarpType
  951. {
  952. Warp,
  953. Boost
  954. }
  955. }