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.
 
 
 

176 lines
4.4 KiB

  1. using System;
  2. using System.Collections;
  3. using CIG.Translation;
  4. using CIGEnums;
  5. using SUISS.Core;
  6. using SUISS.Scheduling;
  7. using SUISSEngine;
  8. using UnityEngine;
  9. using UnityEngine.UI;
  10. public class BuildDemolishItem : MonoBehaviour
  11. {
  12. protected void OnEnable()
  13. {
  14. if (this._updateTimeLeftRoutine == null)
  15. {
  16. this._updateTimeLeftRoutine = base.StartCoroutine(this.UpdateTimeLeftRoutine());
  17. }
  18. }
  19. protected void OnDisable()
  20. {
  21. if (this._updateTimeLeftRoutine != null)
  22. {
  23. base.StopCoroutine(this._updateTimeLeftRoutine);
  24. this._updateTimeLeftRoutine = null;
  25. }
  26. }
  27. public void SetInfo(CIGBuilderManager.BuildInfo info)
  28. {
  29. this._building = null;
  30. this._info = info;
  31. Building component = info.prefab.GetComponent<Building>();
  32. this._name.LocalizedString = component.LocalName;
  33. this.FillViews(component);
  34. }
  35. public void SetBuilding(Building building, Action<BuildDemolishItem, Building> cancelDemolishCallback)
  36. {
  37. this._building = building;
  38. this._cancelDemolishCallback = cancelDemolishCallback;
  39. this._info = null;
  40. this._name.LocalizedString = building.LocalName;
  41. this._demolishCancelled = false;
  42. this.FillViews(building);
  43. }
  44. public void OnCancelClicked()
  45. {
  46. if (!this._demolishCancelled)
  47. {
  48. this._demolishCancelled = true;
  49. this._cancelDemolishCallback(this, this._building);
  50. }
  51. }
  52. protected void FillViews(Building building)
  53. {
  54. if (building == null || this == null)
  55. {
  56. return;
  57. }
  58. base.name = string.Format("{2}:{0}:{1}", base.GetType().Name, building.name, (this.FinishTime() + 10000000.0).ToString("F3"));
  59. SurfaceType requiredGridType = (SurfaceType)building.gameObject.GetComponent<GridTile>().requiredGridType;
  60. GridTile component = building.GetComponent<GridTile>();
  61. this._topImage.sprite = component.spriteRenderer.sprite;
  62. if (component.bottomRenderer != null)
  63. {
  64. this._bottomImage.gameObject.SetActive(true);
  65. this._bottomImage.sprite = component.bottomRenderer.sprite;
  66. }
  67. else
  68. {
  69. this._bottomImage.gameObject.SetActive(false);
  70. }
  71. Sprite asset;
  72. if (building is CIGBuilding && SingletonMonobehaviour<SurfaceSpriteAssetCollection>.Instance.ContainsAsset(requiredGridType))
  73. {
  74. asset = SingletonMonobehaviour<SurfaceSpriteAssetCollection>.Instance.GetAsset(requiredGridType);
  75. }
  76. else
  77. {
  78. asset = SingletonMonobehaviour<SurfaceSpriteAssetCollection>.Instance.GetAsset(SurfaceType.AnyTypeOfLand);
  79. }
  80. this._surfaceFrameImage.sprite = asset;
  81. this.UpdateTimeleft();
  82. this._cancelButton.gameObject.SetActive(this._info == null);
  83. }
  84. protected void UpdateTimeleft()
  85. {
  86. if (this != null && this._timeLeft != null)
  87. {
  88. double num = this.FinishTime();
  89. if (num < 1E-06)
  90. {
  91. this._timeLeft.LocalizedString = Localization.EmptyLocalizedString;
  92. return;
  93. }
  94. TimeSpan timeSpan = TimeSpan.FromSeconds(num);
  95. this._timeLeft.LocalizedString = Localization.TimeSpan(timeSpan, false);
  96. }
  97. }
  98. protected double FinishTime()
  99. {
  100. if (this._building != null && !this._demolishCancelled)
  101. {
  102. switch (this._building.state)
  103. {
  104. case BuildingState.Constructing:
  105. return this._building.ConstructionTimeLeft;
  106. case BuildingState.WaitingForDemolishing:
  107. {
  108. Destroyer destroyer = IsometricIsland.Current.destroyer;
  109. return destroyer.GetTimeTillDestroyed(this._building);
  110. }
  111. case BuildingState.Demolishing:
  112. return this._building.DemolishTimeLeft;
  113. }
  114. if (this._building is CIGBuilding)
  115. {
  116. return ((CIGBuilding)this._building).UpgradeTimeLeft;
  117. }
  118. }
  119. else if (this._info != null)
  120. {
  121. if (this._info.IsFinished)
  122. {
  123. return 0.0;
  124. }
  125. return this._info.finishTime - Timing.time;
  126. }
  127. return 0.0;
  128. }
  129. private IEnumerator UpdateTimeLeftRoutine()
  130. {
  131. for (;;)
  132. {
  133. this.UpdateTimeleft();
  134. yield return new WaitForSeconds(1f);
  135. }
  136. yield break;
  137. }
  138. [SerializeField]
  139. private LocalizedText _timeLeft;
  140. [SerializeField]
  141. private Image _surfaceFrameImage;
  142. [SerializeField]
  143. private Image _topImage;
  144. [SerializeField]
  145. private Image _bottomImage;
  146. [SerializeField]
  147. private LocalizedText _name;
  148. [SerializeField]
  149. private Button _cancelButton;
  150. private bool _demolishCancelled;
  151. private Building _building;
  152. private Action<BuildDemolishItem, Building> _cancelDemolishCallback;
  153. private CIGBuilderManager.BuildInfo _info;
  154. private Coroutine _updateTimeLeftRoutine;
  155. }