25'ten fazla konu seçemezsiniz Konular bir harf veya rakamla başlamalı, kısa çizgiler ('-') içerebilir ve en fazla 35 karakter uzunluğunda olabilir.
 
 
 

380 satır
11 KiB

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Runtime.InteropServices;
  4. using CIG;
  5. using CIG.Extensions;
  6. using CIG.Translation;
  7. using CIGEnums;
  8. using SUISS.Core;
  9. using SUISSEngine;
  10. using UnityEngine;
  11. using UnityEngine.UI;
  12. public class BuildDemolishPopupView : PopupBaseView
  13. {
  14. private void OnDestroy()
  15. {
  16. this._tabView.TabIndexChangedEvent -= this.OnTabIndexChanged;
  17. this.CancelInvoke(new Action(this.SetupTimersAndListData));
  18. if (SingletonMonobehaviour<FPSLimiter>.IsAvailable)
  19. {
  20. SingletonMonobehaviour<FPSLimiter>.Instance.PopUnlimitedFPSRequest(this);
  21. }
  22. }
  23. public override void Init()
  24. {
  25. base.Init();
  26. this._tabView.TabIndexChangedEvent += this.OnTabIndexChanged;
  27. }
  28. public override void Open()
  29. {
  30. base.Open();
  31. SingletonMonobehaviour<FPSLimiter>.Instance.PushUnlimitedFPSRequest(this);
  32. this.InvokeRepeating(new Action(this.SetupTimersAndListData), 0f, 1f, false);
  33. }
  34. public override void Close()
  35. {
  36. this._lastScrollPositionsPerTab[this._tabView.ActiveTabIndex] = new BuildDemolishPopupView.CachedScrollPosition(this._scrollRect.content.rect.width, this._scrollRect.horizontalNormalizedPosition);
  37. this.CancelInvoke(new Action(this.SetupTimersAndListData));
  38. this.RemoveAllItems();
  39. SingletonMonobehaviour<FPSLimiter>.Instance.PopUnlimitedFPSRequest(this);
  40. base.Close();
  41. }
  42. public void OnSpeedupClicked()
  43. {
  44. int num;
  45. Currencies cost = this.SpeedupCost(out num);
  46. ((BuildDemolishPopupState)this.State).Speedup(cost);
  47. }
  48. public void OnOpenShopClicked()
  49. {
  50. ((BuildDemolishPopupState)this.State).OpenCranesShop();
  51. }
  52. public void SwitchTab(BuildDemolishTabs buildDemolishTab)
  53. {
  54. this._tabView.ActiveTabIndex = (int)buildDemolishTab;
  55. this._titleLabel.LocalizedString = this._tabView.LocalizedTitle;
  56. this.SwitchContent();
  57. }
  58. private BuildDemolishTabs CurrentTab
  59. {
  60. get
  61. {
  62. return (BuildDemolishTabs)this._tabView.ActiveTabIndex;
  63. }
  64. }
  65. private void SetupTimersAndListData()
  66. {
  67. this.UpdateSpeedupCost(false);
  68. this.UpdateListData();
  69. this.UpdateBadgeCounts();
  70. }
  71. private void UpdateSpeedupCost(bool updateActiveState)
  72. {
  73. int num;
  74. Currencies currencies = this.SpeedupCost(out num);
  75. if (updateActiveState)
  76. {
  77. this._speedupButton.gameObject.SetActive(true);
  78. }
  79. if (currencies.Contains("Gold"))
  80. {
  81. this._speedupCostIcon.sprite = SingletonMonobehaviour<UISpriteAssetCollection>.Instance.GetAsset(UISpriteType.GoldSmall);
  82. }
  83. else
  84. {
  85. this._speedupCostIcon.sprite = SingletonMonobehaviour<UISpriteAssetCollection>.Instance.GetAsset(UISpriteType.CashSmall);
  86. }
  87. if (num > 0)
  88. {
  89. this._speedupButton.Interactable = true;
  90. this._speedupCostLabel.LocalizedString = Localization.Integer(Math.Max(currencies.GetValue("Cash"), currencies.GetValue("Gold")));
  91. this._descriptionLabel.LocalizedString = Localization.Format(Localization.Key("time_remaining"), new ILocalizedString[]
  92. {
  93. Localization.TimeSpan(TimeSpan.FromSeconds((double)num), false)
  94. });
  95. }
  96. else
  97. {
  98. this._speedupButton.Interactable = false;
  99. this._speedupCostLabel.LocalizedString = Localization.Integer(0m);
  100. this._descriptionLabel.LocalizedString = Localization.EmptyLocalizedString;
  101. }
  102. }
  103. private void UpdateListData()
  104. {
  105. BuildDemolishPopupState buildDemolishPopupState = (BuildDemolishPopupState)this.State;
  106. BuildDemolishTabs currentTab = this.CurrentTab;
  107. bool flag;
  108. if (currentTab != BuildDemolishTabs.Build)
  109. {
  110. if (currentTab != BuildDemolishTabs.Demolish)
  111. {
  112. UnityEngine.Debug.LogErrorFormat("Missing UpdateListData implementation for '{0}'", new object[]
  113. {
  114. this.CurrentTab
  115. });
  116. return;
  117. }
  118. flag = (buildDemolishPopupState.DemolishListCount > 0);
  119. }
  120. else
  121. {
  122. flag = (buildDemolishPopupState.BuildListCount > 0);
  123. }
  124. if (this._items.Count > 0)
  125. {
  126. while (buildDemolishPopupState.BuildListCount > 0)
  127. {
  128. if (!buildDemolishPopupState.IsFirstBuildingBuilt())
  129. {
  130. break;
  131. }
  132. if (this.CurrentTab == BuildDemolishTabs.Build)
  133. {
  134. BuildDemolishItem buildDemolishItem = this._items[0];
  135. UnityEngine.Object.Destroy(buildDemolishItem.gameObject);
  136. this._items.Remove(buildDemolishItem);
  137. }
  138. }
  139. while (buildDemolishPopupState.DemolishListCount > 0)
  140. {
  141. if (!buildDemolishPopupState.IsFirstBuildingDemolished())
  142. {
  143. break;
  144. }
  145. if (this.CurrentTab == BuildDemolishTabs.Demolish)
  146. {
  147. BuildDemolishItem buildDemolishItem2 = this._items[0];
  148. UnityEngine.Object.Destroy(buildDemolishItem2.gameObject);
  149. this._items.Remove(buildDemolishItem2);
  150. }
  151. }
  152. }
  153. BuildDemolishTabs currentTab2 = this.CurrentTab;
  154. if (currentTab2 != BuildDemolishTabs.Build)
  155. {
  156. if (currentTab2 == BuildDemolishTabs.Demolish)
  157. {
  158. if (flag && buildDemolishPopupState.DemolishListCount == 0)
  159. {
  160. this.SwitchContent();
  161. }
  162. }
  163. }
  164. else if (flag && buildDemolishPopupState.BuildListCount == 0)
  165. {
  166. this.SwitchContent();
  167. }
  168. }
  169. private void UpdateBadgeCounts()
  170. {
  171. BuildDemolishPopupState buildDemolishPopupState = (BuildDemolishPopupState)this.State;
  172. this._tabView.UpdateBadge(0, buildDemolishPopupState.BuildListCount);
  173. this._tabView.UpdateBadge(1, buildDemolishPopupState.DemolishListCount);
  174. }
  175. private Currencies SpeedupCost(out int totalTime)
  176. {
  177. BuildDemolishTabs currentTab = this.CurrentTab;
  178. if (currentTab == BuildDemolishTabs.Build)
  179. {
  180. return ((BuildDemolishPopupState)this.State).BuildQueueSpeedupCost(out totalTime);
  181. }
  182. if (currentTab != BuildDemolishTabs.Demolish)
  183. {
  184. UnityEngine.Debug.LogErrorFormat("Missing speedup cost implementation for '{0}'", new object[]
  185. {
  186. this.CurrentTab
  187. });
  188. totalTime = 0;
  189. return new Currencies("Cash", 0m);
  190. }
  191. return ((BuildDemolishPopupState)this.State).DemolishQueueSpeedupCost(out totalTime);
  192. }
  193. private void RemoveAllItems()
  194. {
  195. int count = this._items.Count;
  196. for (int i = 0; i < count; i++)
  197. {
  198. UnityEngine.Object.Destroy(this._items[i].gameObject);
  199. }
  200. this._items.Clear();
  201. }
  202. private void OnTabIndexChanged(int oldIndex, int newIndex)
  203. {
  204. this._lastScrollPositionsPerTab[oldIndex] = new BuildDemolishPopupView.CachedScrollPosition(this._scrollRect.content.rect.width, this._scrollRect.horizontalNormalizedPosition);
  205. ((BuildDemolishPopupState)this.State).SwitchTab((BuildDemolishTabs)newIndex);
  206. }
  207. private void SwitchContent()
  208. {
  209. BuildDemolishPopupState buildDemolishPopupState = (BuildDemolishPopupState)this.State;
  210. this.RemoveAllItems();
  211. BuildDemolishTabs currentTab = this.CurrentTab;
  212. if (currentTab != BuildDemolishTabs.Build)
  213. {
  214. if (currentTab != BuildDemolishTabs.Demolish)
  215. {
  216. UnityEngine.Debug.LogErrorFormat("Missing SwitchContent implementation for '{0}'", new object[]
  217. {
  218. this.CurrentTab
  219. });
  220. }
  221. else
  222. {
  223. this._cranesContainer.SetActive(false);
  224. int num = buildDemolishPopupState.DemolishListCount;
  225. if (num > 0)
  226. {
  227. this._emptyQueueContainer.SetActive(false);
  228. this._nonEmptyQueueContainer.SetActive(true);
  229. this._speedupContainer.SetActive(true);
  230. for (int i = 0; i < num; i++)
  231. {
  232. BuildDemolishItem buildDemolishItem = UnityEngine.Object.Instantiate<BuildDemolishItem>(this._itemPrefab, this._itemLayoutGroup.transform);
  233. buildDemolishItem.SetBuilding(buildDemolishPopupState.GetDemolishListItem(i), new Action<BuildDemolishItem, Building>(this.CancelDemolish));
  234. this._items.Add(buildDemolishItem);
  235. }
  236. }
  237. else
  238. {
  239. this._emptyQueueContainer.SetActive(true);
  240. this._nonEmptyQueueContainer.SetActive(false);
  241. this._speedupContainer.SetActive(false);
  242. this._emptyQueueLabel.LocalizedString = Localization.Key("bulldozer_empty");
  243. }
  244. }
  245. }
  246. else
  247. {
  248. this._cranesContainer.SetActive(true);
  249. CIGBuilderManager instance = SingletonMonobehaviour<CIGBuilderManager>.Instance;
  250. int num = buildDemolishPopupState.BuildListCount;
  251. if (num > 0)
  252. {
  253. this._emptyQueueContainer.SetActive(false);
  254. this._nonEmptyQueueContainer.SetActive(true);
  255. this._speedupContainer.SetActive(true);
  256. for (int j = 0; j < num; j++)
  257. {
  258. BuildDemolishItem buildDemolishItem2 = UnityEngine.Object.Instantiate<BuildDemolishItem>(this._itemPrefab, this._itemLayoutGroup.transform);
  259. buildDemolishItem2.SetInfo(buildDemolishPopupState.GetBuildListItem(j));
  260. this._items.Add(buildDemolishItem2);
  261. }
  262. }
  263. else
  264. {
  265. this._emptyQueueContainer.SetActive(true);
  266. this._nonEmptyQueueContainer.SetActive(false);
  267. this._speedupContainer.SetActive(false);
  268. this._emptyQueueLabel.LocalizedString = Localization.Key("crane_empty");
  269. }
  270. }
  271. float horizontalNormalizedPosition = 0f;
  272. BuildDemolishPopupView.CachedScrollPosition cachedScrollPosition;
  273. if (this._lastScrollPositionsPerTab.TryGetValue(this._tabView.ActiveTabIndex, out cachedScrollPosition))
  274. {
  275. horizontalNormalizedPosition = cachedScrollPosition.ContentWidth / this._scrollRect.content.rect.width * cachedScrollPosition.NormalizedHorizontalPosition;
  276. }
  277. this._scrollRect.horizontalNormalizedPosition = horizontalNormalizedPosition;
  278. this.UpdateSpeedupCost(true);
  279. }
  280. private void CancelDemolish(BuildDemolishItem buildDemolishItem, Building building)
  281. {
  282. if (!this._items.Contains(buildDemolishItem))
  283. {
  284. UnityEngine.Debug.LogWarningFormat("Can't cancel the demolishment of a non-existing item.", new object[0]);
  285. return;
  286. }
  287. BuildDemolishPopupState buildDemolishPopupState = (BuildDemolishPopupState)this.State;
  288. if (buildDemolishPopupState.CancelDemolish(building))
  289. {
  290. this._items.Remove(buildDemolishItem);
  291. UnityEngine.Object.Destroy(buildDemolishItem.gameObject);
  292. if (this._items.Count == 0)
  293. {
  294. this.SwitchContent();
  295. }
  296. else
  297. {
  298. this.SetupTimersAndListData();
  299. }
  300. }
  301. }
  302. [SerializeField]
  303. private LocalizedText _titleLabel;
  304. [SerializeField]
  305. private TabView _tabView;
  306. [SerializeField]
  307. private ScrollRect _scrollRect;
  308. [SerializeField]
  309. private GameObject _emptyQueueContainer;
  310. [SerializeField]
  311. private GameObject _nonEmptyQueueContainer;
  312. [SerializeField]
  313. private GameObject _cranesContainer;
  314. [SerializeField]
  315. private GameObject _speedupContainer;
  316. [SerializeField]
  317. private LocalizedText _descriptionLabel;
  318. [SerializeField]
  319. private LocalizedText _emptyQueueLabel;
  320. [SerializeField]
  321. private BuildDemolishItem _itemPrefab;
  322. [SerializeField]
  323. private LayoutGroup _itemLayoutGroup;
  324. [SerializeField]
  325. private InteractableButton _speedupButton;
  326. [SerializeField]
  327. private Image _speedupCostIcon;
  328. [SerializeField]
  329. private LocalizedText _speedupCostLabel;
  330. private readonly Dictionary<int, BuildDemolishPopupView.CachedScrollPosition> _lastScrollPositionsPerTab = new Dictionary<int, BuildDemolishPopupView.CachedScrollPosition>();
  331. private List<BuildDemolishItem> _items = new List<BuildDemolishItem>();
  332. [StructLayout(LayoutKind.Sequential, Size = 1)]
  333. private struct CachedScrollPosition
  334. {
  335. public CachedScrollPosition(float contentWidth, float normalizedHorizontalPosition)
  336. {
  337. this.ContentWidth = contentWidth;
  338. this.NormalizedHorizontalPosition = normalizedHorizontalPosition;
  339. }
  340. public float ContentWidth { get; set; }
  341. public float NormalizedHorizontalPosition { get; set; }
  342. }
  343. }