Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 

349 строки
15 KiB

  1. using CIG.Translation;
  2. using CIGEnums;
  3. using SUISS.Core;
  4. using SUISSEngine;
  5. using System;
  6. using System.Collections;
  7. using UnityEngine;
  8. public class BuildingInfoPopupState : PopupBaseState
  9. {
  10. public readonly BuildingProperty[] AllRequiredBuildingProperties = new BuildingProperty[7]
  11. {
  12. BuildingProperty.People,
  13. BuildingProperty.Employees,
  14. BuildingProperty.Profit,
  15. BuildingProperty.ProfitXp,
  16. BuildingProperty.TimeUntilProfit,
  17. BuildingProperty.Happiness,
  18. BuildingProperty.ConstructionXp
  19. };
  20. private BuildingPopupContent _content;
  21. private BonusFieldContent _bonusField;
  22. private Building _building;
  23. private CIGBuilding _cigBuilding;
  24. private Coroutine _updateBuildingInfoCoroutine;
  25. protected Building Building
  26. {
  27. get
  28. {
  29. return _building;
  30. }
  31. private set
  32. {
  33. _building = value;
  34. _cigBuilding = (value as CIGBuilding);
  35. }
  36. }
  37. public void SetBuildingAndContent(Building building, BuildingPopupContent content)
  38. {
  39. Building = building;
  40. _content = content;
  41. BuildingInfoPopupView buildingInfoPopupView = View as BuildingInfoPopupView;
  42. switch (_content)
  43. {
  44. case BuildingPopupContent.Info:
  45. buildingInfoPopupView.HideUpgradeButton();
  46. buildingInfoPopupView.HideBuildingSize();
  47. if (_cigBuilding != null && !_cigBuilding.Activated)
  48. {
  49. buildingInfoPopupView.SetSubtitle(Localization.Key("building_activate"));
  50. }
  51. else
  52. {
  53. buildingInfoPopupView.HideSubtitle();
  54. }
  55. goto default;
  56. case BuildingPopupContent.Activate:
  57. buildingInfoPopupView.SetUpgradeCosts(_cigBuilding.UpgradeCost);
  58. buildingInfoPopupView.HideBuildingSize();
  59. buildingInfoPopupView.SetSubtitle(Localization.Key("building_activate"));
  60. goto default;
  61. case BuildingPopupContent.Upgrade:
  62. {
  63. buildingInfoPopupView.SetUpgradeCosts(_cigBuilding.UpgradeCost);
  64. buildingInfoPopupView.HideBuildingSize();
  65. int num = _cigBuilding.CurrentLevel - (_cigBuilding.activatable ? 1 : 0);
  66. buildingInfoPopupView.SetSubtitle(Localization.Format("{0} ({1} {2})", Localization.Key("building_upgrade"), Localization.Key("level"), Localization.Integer(num + 1)));
  67. _bonusField = BonusFieldContent.DeltaWithNextLevel;
  68. break;
  69. }
  70. case BuildingPopupContent.Preview:
  71. {
  72. buildingInfoPopupView.SetUpgradeCosts(_cigBuilding.PurchasePrice);
  73. buildingInfoPopupView.SetBuildingSize(new GridSize(Building.tile.gridSizeU, Building.tile.gridSizeV));
  74. int requiredGridType2 = building.tile.requiredGridType;
  75. if (requiredGridType2 != 10)
  76. {
  77. SurfaceType surfaceType2 = (SurfaceType)requiredGridType2;
  78. string arg2 = surfaceType2.ToString().ToLower().Replace("driedswamp", "swamp");
  79. string key2 = $"surfacetype_{arg2}";
  80. buildingInfoPopupView.SetSubtitle(Localization.Concat(Localization.Format(Localization.Key("must_be_built_on"), Localization.Key(key2))));
  81. }
  82. else
  83. {
  84. buildingInfoPopupView.HideSubtitle();
  85. }
  86. goto default;
  87. }
  88. case BuildingPopupContent.ReadOnly:
  89. {
  90. buildingInfoPopupView.HideUpgradeButton();
  91. buildingInfoPopupView.SetBuildingSize(new GridSize(Building.tile.gridSizeU, Building.tile.gridSizeV));
  92. int requiredGridType = building.tile.requiredGridType;
  93. if (requiredGridType != 10)
  94. {
  95. SurfaceType surfaceType = (SurfaceType)requiredGridType;
  96. string arg = surfaceType.ToString().ToLower().Replace("driedswamp", "swamp");
  97. string key = $"surfacetype_{arg}";
  98. buildingInfoPopupView.SetSubtitle(Localization.Concat(Localization.Format(Localization.Key("must_be_built_on"), Localization.Key(key))));
  99. }
  100. else
  101. {
  102. buildingInfoPopupView.HideSubtitle();
  103. }
  104. goto default;
  105. }
  106. default:
  107. _bonusField = BonusFieldContent.Empty;
  108. break;
  109. }
  110. buildingInfoPopupView.UpdateInfo(Building);
  111. if (_updateBuildingInfoCoroutine != null)
  112. {
  113. StopCoroutine(_updateBuildingInfoCoroutine);
  114. _updateBuildingInfoCoroutine = null;
  115. }
  116. _updateBuildingInfoCoroutine = StartCoroutine(UpdateBuildingInfoRoutine());
  117. }
  118. public void RequestPurchase()
  119. {
  120. if (_content == BuildingPopupContent.Preview)
  121. {
  122. PopupManager instance = SingletonMonobehaviour<PopupManager>.Instance;
  123. bool suppressQueue = instance.SuppressQueue;
  124. instance.SuppressQueue = true;
  125. instance.CloseRecursive();
  126. if (!SingletonMonobehaviour<WorldMap>.Instance.IsVisible)
  127. {
  128. CityIsland.Current.StartBuilding(_building.gameObject);
  129. }
  130. if (!suppressQueue)
  131. {
  132. instance.SuppressQueue = false;
  133. }
  134. }
  135. else if (_cigBuilding != null)
  136. {
  137. if (SingletonMonobehaviour<WorldMap>.Instance.IsVisible)
  138. {
  139. ClosePopup();
  140. return;
  141. }
  142. if (!_cigBuilding.CanUpgrade)
  143. {
  144. ILocalizedString title;
  145. ILocalizedString reason = _cigBuilding.ReasonWhyCantUpgrade(out title);
  146. if (reason != null && reason != Localization.EmptyLocalizedString)
  147. {
  148. ClosePopup(delegate
  149. {
  150. SingletonMonobehaviour<PopupManager>.Instance.ShowInfoPopup(title, reason);
  151. });
  152. return;
  153. }
  154. }
  155. CIGBuilding building = _cigBuilding;
  156. Action callback = delegate
  157. {
  158. if (!building.StartUpgrade())
  159. {
  160. ILocalizedString title2;
  161. ILocalizedString localizedString = building.ReasonWhyCantUpgrade(out title2);
  162. if (localizedString != null && localizedString != Localization.EmptyLocalizedString)
  163. {
  164. SingletonMonobehaviour<PopupManager>.Instance.ShowInfoPopup(title2, localizedString);
  165. }
  166. }
  167. };
  168. ClosePopup(callback);
  169. }
  170. else
  171. {
  172. UnityEngine.Debug.LogWarning($"{Building.gameObject.name} is not a UpgradableBuilding");
  173. }
  174. }
  175. public override void Leave(State newState)
  176. {
  177. base.Leave(newState);
  178. if (_updateBuildingInfoCoroutine != null)
  179. {
  180. StopCoroutine(_updateBuildingInfoCoroutine);
  181. _updateBuildingInfoCoroutine = null;
  182. }
  183. }
  184. private IEnumerator UpdateBuildingInfoRoutine()
  185. {
  186. if (Building != null)
  187. {
  188. ((BuildingInfoPopupView)View).SetBuildingSprites(Building);
  189. while (Building != null)
  190. {
  191. if (!_isInState)
  192. {
  193. yield break;
  194. }
  195. FillProperties();
  196. yield return new WaitForSeconds((!Building.InfoRequiresFrequentRefresh) ? 60f : 1f);
  197. }
  198. }
  199. _updateBuildingInfoCoroutine = null;
  200. }
  201. private void FillProperties()
  202. {
  203. foreach (BuildingProperty shownProperty in Building.ShownProperties)
  204. {
  205. ILocalizedString value = GetValue(shownProperty);
  206. ILocalizedString bonus;
  207. switch (_bonusField)
  208. {
  209. default:
  210. bonus = Localization.EmptyLocalizedString;
  211. break;
  212. case BonusFieldContent.DeltaWithNextLevel:
  213. bonus = GetLevelUp(shownProperty);
  214. break;
  215. }
  216. ((BuildingInfoPopupView)View).SetInfoLine(shownProperty, value, bonus);
  217. }
  218. }
  219. private ILocalizedString GetValue(BuildingProperty property)
  220. {
  221. switch (property)
  222. {
  223. case BuildingProperty.ConstructionXp:
  224. return (!(_cigBuilding == null)) ? Localization.Integer(_cigBuilding.constructionXP.GetValue("XP")) : Localization.EmptyLocalizedString;
  225. case BuildingProperty.Employees:
  226. {
  227. CIGCommercialBuilding cIGCommercialBuilding = (CIGCommercialBuilding)Building;
  228. if (_content == BuildingPopupContent.Activate || !_cigBuilding.Activated || _content == BuildingPopupContent.Preview || _content == BuildingPopupContent.ReadOnly)
  229. {
  230. return Localization.Integer(cIGCommercialBuilding.maxEmployeesBaseValue);
  231. }
  232. return Localization.Format(Localization.Key("progress"), Localization.Integer(cIGCommercialBuilding.Employees), Localization.Integer(cIGCommercialBuilding.MaxEmployees));
  233. }
  234. case BuildingProperty.Happiness:
  235. {
  236. if (_content == BuildingPopupContent.Activate || (_cigBuilding != null && !_cigBuilding.Activated) || _content == BuildingPopupContent.Preview || _content == BuildingPopupContent.ReadOnly)
  237. {
  238. return Localization.Integer(_cigBuilding.baseHappinessValue);
  239. }
  240. int? num = null;
  241. if (Building is CIGScenery)
  242. {
  243. num = ((CIGScenery)Building).happiness;
  244. }
  245. else if (_cigBuilding != null)
  246. {
  247. num = _cigBuilding.Happiness;
  248. }
  249. if (!num.HasValue)
  250. {
  251. return Localization.EmptyLocalizedString;
  252. }
  253. return Localization.Integer(num.Value);
  254. }
  255. case BuildingProperty.People:
  256. {
  257. CIGResidentialBuilding cIGResidentialBuilding = (CIGResidentialBuilding)Building;
  258. if (_content == BuildingPopupContent.Activate || !_cigBuilding.Activated || _content == BuildingPopupContent.Preview || _content == BuildingPopupContent.ReadOnly)
  259. {
  260. return Localization.Integer(cIGResidentialBuilding.maxPeopleBaseValue);
  261. }
  262. return Localization.Format(Localization.Key("progress"), Localization.Integer(cIGResidentialBuilding.People), Localization.Integer(cIGResidentialBuilding.MaxPeople));
  263. }
  264. case BuildingProperty.Profit:
  265. {
  266. Currencies zero = Currencies.Zero;
  267. zero = ((_content != BuildingPopupContent.Activate && _cigBuilding.Activated && _content != BuildingPopupContent.Preview && _content != BuildingPopupContent.ReadOnly) ? ((CIGCommercialBuilding)Building).Profit.WithoutXPCurrency() : ((CIGCommercialBuilding)Building).baseProfitCurrencies.WithoutXPCurrency());
  268. return Localization.Integer((int)zero.GetValue("Cash"));
  269. }
  270. case BuildingProperty.ProfitXp:
  271. {
  272. decimal num2 = 0m;
  273. num2 = ((_content != BuildingPopupContent.Activate && _cigBuilding.Activated && _content != BuildingPopupContent.Preview && _content != BuildingPopupContent.ReadOnly) ? ((CIGCommercialBuilding)Building).Profit.GetValue("XP") : ((CIGCommercialBuilding)Building).baseProfitCurrencies.GetValue("XP"));
  274. return Localization.Integer(num2);
  275. }
  276. case BuildingProperty.TimeUntilProfit:
  277. if (_content == BuildingPopupContent.Activate || !_cigBuilding.Activated || _content == BuildingPopupContent.Upgrade || _content == BuildingPopupContent.Preview || _content == BuildingPopupContent.ReadOnly)
  278. {
  279. return Localization.TimeSpan(TimeSpan.FromSeconds(((CIGCommercialBuilding)Building).profitTime), hideSecondPartWhenZero: false);
  280. }
  281. return ((CIGCommercialBuilding)Building).TimeLeftString();
  282. case BuildingProperty.Text:
  283. return Building.InfoText();
  284. default:
  285. return Localization.Literal("ERROR");
  286. }
  287. }
  288. private ILocalizedString GetLevelUp(BuildingProperty property)
  289. {
  290. int num = 0;
  291. switch (property)
  292. {
  293. case BuildingProperty.Employees:
  294. {
  295. CIGCommercialBuilding cIGCommercialBuilding = (CIGCommercialBuilding)Building;
  296. num = cIGCommercialBuilding.UpgradeJobs(cIGCommercialBuilding.CurrentLevel + 1);
  297. break;
  298. }
  299. case BuildingProperty.Happiness:
  300. if (Building is CIGCommunityBuilding)
  301. {
  302. num = ((CIGCommunityBuilding)Building).UpgradeHappiness(_cigBuilding.CurrentLevel + 1);
  303. }
  304. break;
  305. case BuildingProperty.People:
  306. num = ((CIGResidentialBuilding)Building).UpgradePeople(_cigBuilding.CurrentLevel + 1);
  307. break;
  308. case BuildingProperty.Profit:
  309. {
  310. Currencies currencies = ((CIGCommercialBuilding)Building).UpgradeProfit(_cigBuilding.CurrentLevel + 1).WithoutXPCurrency();
  311. num = (int)currencies.GetValue("Cash");
  312. break;
  313. }
  314. case BuildingProperty.ProfitXp:
  315. {
  316. decimal value = ((CIGCommercialBuilding)Building).UpgradeProfit(_cigBuilding.CurrentLevel + 1).GetValue("XP");
  317. num = Mathf.RoundToInt((float)value);
  318. break;
  319. }
  320. case BuildingProperty.TimeUntilProfit:
  321. case BuildingProperty.ConstructionXp:
  322. case BuildingProperty.Text:
  323. num = 0;
  324. break;
  325. default:
  326. return Localization.Literal("ERROR");
  327. }
  328. if (num > 0)
  329. {
  330. return Localization.Format(Localization.Key("plus"), Localization.Integer(num));
  331. }
  332. return Localization.EmptyLocalizedString;
  333. }
  334. }