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.
 
 
 

232 lines
6.2 KiB

  1. using System;
  2. using System.Collections.Generic;
  3. using CIG.Extensions;
  4. using CIG.Translation;
  5. using CIGEnums;
  6. using SparkLinq;
  7. using SUISS.Core;
  8. using SUISSEngine;
  9. using UnityEngine;
  10. public class BuildDemolishPopupState : PopupBaseState
  11. {
  12. public override void Enter(State oldState)
  13. {
  14. base.Enter(oldState);
  15. this._buildList = from x in SingletonMonobehaviour<CIGBuilderManager>.Instance.BuildList
  16. orderby x.finishTime
  17. select x;
  18. Destroyer destroyer = IsometricIsland.Current.destroyer;
  19. List<Building> demolishList = destroyer.DemolishList;
  20. Dictionary<Building, double> demolishTimeOf = demolishList.ToDictionary((Building x) => x, (Building x) => destroyer.GetTimeTillDestroyed(x));
  21. this._demolishList = from x in demolishList
  22. orderby demolishTimeOf[x]
  23. select x;
  24. this._lastOpenedTab = ((this._demolishList.Count <= 0 || this._buildList.Count != 0) ? BuildDemolishTabs.Build : BuildDemolishTabs.Demolish);
  25. this.InvokeNextFrame(delegate
  26. {
  27. this.SwitchTab(this._lastOpenedTab);
  28. });
  29. }
  30. public override void ClosePopup(Action callback, bool animate, bool synchronous)
  31. {
  32. this._buildList.Clear();
  33. this._demolishList.Clear();
  34. base.ClosePopup(callback, animate, synchronous);
  35. }
  36. public void OpenCranesShop()
  37. {
  38. base.ClosePopup(delegate()
  39. {
  40. SingletonMonobehaviour<PopupManager>.Instance.OpenShopMenu(ShopMenuTabs.Cranes);
  41. });
  42. }
  43. public void Speedup(Currencies cost)
  44. {
  45. if (this._buildList.Count == 0 && this._demolishList.Count == 0)
  46. {
  47. return;
  48. }
  49. BuildDemolishTabs tab = this._lastOpenedTab;
  50. SingletonMonobehaviour<PopupManager>.Instance.RequestGenericPopup(null, Localization.Key("speedup"), Localization.Format(Localization.Key("speedup_for"), new ILocalizedString[]
  51. {
  52. cost.LocalizedString()
  53. }), Localization.Key("ok"), Localization.Key("not_now"), delegate()
  54. {
  55. SingletonMonobehaviour<CIGGameState>.Instance.SpendCurrencies(cost, false, delegate(bool ok, Currencies spent)
  56. {
  57. if (ok)
  58. {
  59. if (tab != BuildDemolishTabs.Build)
  60. {
  61. if (tab != BuildDemolishTabs.Demolish)
  62. {
  63. UnityEngine.Debug.LogErrorFormat("Missing speedup action for '{0}'", new object[]
  64. {
  65. tab
  66. });
  67. }
  68. else
  69. {
  70. int spent2 = Mathf.RoundToInt((float)cost.GetValue("Cash"));
  71. SingletonMonobehaviour<CIGGameStats>.Instance.AddSpeedupExecuted(0);
  72. SingletonMonobehaviour<CIGGameStats>.Instance.AddCashSpent_BulldozerQueue(spent2);
  73. CityIsland.Current.isometricIsland.destroyer.FinishAll();
  74. }
  75. }
  76. else
  77. {
  78. int num = Mathf.RoundToInt((float)cost.GetValue("Gold"));
  79. SingletonMonobehaviour<CIGGameStats>.Instance.AddSpeedupExecuted(num);
  80. SingletonMonobehaviour<CIGGameStats>.Instance.AddGoldSpent_CraneQueue(num);
  81. SingletonMonobehaviour<CIGBuilderManager>.Instance.SpeedupAll();
  82. }
  83. }
  84. });
  85. }, null, null, true);
  86. base.ClosePopup();
  87. }
  88. public void SwitchTab(BuildDemolishTabs buildDemolishTab)
  89. {
  90. this._lastOpenedTab = buildDemolishTab;
  91. ((BuildDemolishPopupView)this.View).SwitchTab(buildDemolishTab);
  92. }
  93. public Currencies DemolishQueueSpeedupCost(out int totalTime)
  94. {
  95. totalTime = 0;
  96. int num = 0;
  97. foreach (Building building in this._demolishList)
  98. {
  99. int num2 = this.BuildingTimeLeft(building);
  100. if (num2 > 0)
  101. {
  102. totalTime += num2;
  103. num++;
  104. }
  105. }
  106. decimal value = num * CIGBuilding.GetSpeedupCostCashForSeconds(300L);
  107. return new Currencies("Cash", value);
  108. }
  109. public Currencies BuildQueueSpeedupCost(out int totalTime)
  110. {
  111. decimal num = 0m;
  112. decimal num2 = 0m;
  113. totalTime = 0;
  114. int num3 = 0;
  115. foreach (CIGBuilderManager.BuildInfo buildInfo in this._buildList)
  116. {
  117. if (!buildInfo.IsFinished)
  118. {
  119. int num4 = (int)buildInfo.Timeleft;
  120. decimal speedupCostGoldForSeconds = CIGBuilding.GetSpeedupCostGoldForSeconds((long)num4);
  121. num2 = Math.Max(num2, speedupCostGoldForSeconds);
  122. num += speedupCostGoldForSeconds;
  123. totalTime += num4;
  124. num3++;
  125. }
  126. }
  127. if (num3 > 1)
  128. {
  129. num = Math.Max(1m, Math.Round(0.75m * num));
  130. }
  131. num = Math.Max(num, num2);
  132. return new Currencies("Gold", num);
  133. }
  134. public bool CancelDemolish(Building building)
  135. {
  136. if (this._lastOpenedTab != BuildDemolishTabs.Demolish)
  137. {
  138. return false;
  139. }
  140. if (this._demolishList.Remove(building))
  141. {
  142. building.CancelDemolishment();
  143. IsometricIsland.Current.destroyer.CancelDestroyBuilding(building);
  144. return true;
  145. }
  146. return false;
  147. }
  148. public CIGBuilderManager.BuildInfo GetBuildListItem(int index)
  149. {
  150. return this._buildList[index];
  151. }
  152. public Building GetDemolishListItem(int index)
  153. {
  154. return this._demolishList[index];
  155. }
  156. public bool IsFirstBuildingBuilt()
  157. {
  158. if (this._buildList.Count == 0)
  159. {
  160. return false;
  161. }
  162. CIGBuilderManager.BuildInfo buildInfo = this._buildList[0];
  163. return buildInfo.IsFinished && this._buildList.Remove(buildInfo);
  164. }
  165. public bool IsFirstBuildingDemolished()
  166. {
  167. if (this._demolishList.Count == 0)
  168. {
  169. return false;
  170. }
  171. Building building = this._demolishList[0];
  172. return this.BuildingTimeLeft(building) <= 0 && this._demolishList.Remove(building);
  173. }
  174. public int BuildListCount
  175. {
  176. get
  177. {
  178. return this._buildList.Count;
  179. }
  180. }
  181. public int DemolishListCount
  182. {
  183. get
  184. {
  185. return this._demolishList.Count;
  186. }
  187. }
  188. private int BuildingTimeLeft(Building building)
  189. {
  190. if (building == null || building.tile == null || building.tile.status == GridTile.Status.Destroyed)
  191. {
  192. return -1;
  193. }
  194. double num = Math.Max(building.ConstructionTimeLeft, building.DemolishTimeLeft);
  195. CIGBuilding cigbuilding = building as CIGBuilding;
  196. if (cigbuilding != null)
  197. {
  198. if (building.state == BuildingState.Normal && !cigbuilding.IsUpgrading)
  199. {
  200. return -1;
  201. }
  202. num = Math.Max(num, cigbuilding.UpgradeTimeLeft);
  203. }
  204. else if (building.state == BuildingState.Normal)
  205. {
  206. return -1;
  207. }
  208. return (int)num;
  209. }
  210. private BuildDemolishTabs _lastOpenedTab;
  211. private List<CIGBuilderManager.BuildInfo> _buildList = new List<CIGBuilderManager.BuildInfo>();
  212. private List<Building> _demolishList = new List<Building>();
  213. }