選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。
 
 
 

373 行
12 KiB

  1. using CIGEnums;
  2. using SUISS.Core;
  3. using SUISS.Scheduling;
  4. using SUISSEngine;
  5. using System.Collections.Generic;
  6. using UnityEngine;
  7. public class CIGScenery : Scenery
  8. {
  9. public int happiness;
  10. public bool multiple;
  11. public Sprite[] sprites;
  12. public Island island;
  13. [SelfReference]
  14. public SpriteRenderer spriteRenderer;
  15. private CIGGameStats _gameStats;
  16. private CIGIslandState _islandState;
  17. protected int _effectiveHappiness;
  18. protected const string EffectiveHappinessKey = "EffectiveHappiness";
  19. private SpriteRenderer _spriteRenderer2;
  20. private SpriteRenderer _spriteRenderer3;
  21. private SpriteRenderer _spriteRenderer4;
  22. private MagicalReference<CIGExpansions> expansions = new MagicalReference<CIGExpansions>();
  23. private OverlayButtons _overlayButtons;
  24. protected CIGIslandState IslandState
  25. {
  26. get
  27. {
  28. if (_islandState == null)
  29. {
  30. _islandState = CityIsland.GetParent(this).islandState;
  31. }
  32. return _islandState;
  33. }
  34. }
  35. public override List<BuildingProperty> ShownProperties
  36. {
  37. get
  38. {
  39. List<BuildingProperty> shownProperties = base.ShownProperties;
  40. if (!shownProperties.Contains(BuildingProperty.Happiness) && happiness > 0)
  41. {
  42. shownProperties.Add(BuildingProperty.Happiness);
  43. }
  44. return shownProperties;
  45. }
  46. }
  47. public override bool CanDemolish
  48. {
  49. get
  50. {
  51. if (!base.CanDemolish)
  52. {
  53. return false;
  54. }
  55. if (base.state == BuildingState.Normal)
  56. {
  57. CIGExpansions.ExpansionBlock blockForIndex = expansions.reference.GetBlockForIndex(tile.index);
  58. if (blockForIndex != null && !blockForIndex.Unlocked)
  59. {
  60. return false;
  61. }
  62. }
  63. return true;
  64. }
  65. }
  66. protected override void Awake()
  67. {
  68. base.Awake();
  69. _gameStats = SingletonMonobehaviour<CIGGameStats>.Instance;
  70. }
  71. protected void OnEnable()
  72. {
  73. GameEvents.Subscribe<UnemiShouldCloseEvent>(OnUnemiShouldCloseEvent);
  74. }
  75. protected void OnDisable()
  76. {
  77. GameEvents.Unsubscribe<UnemiShouldCloseEvent>(OnUnemiShouldCloseEvent);
  78. }
  79. protected override void OnSerialize(Dictionary<string, object> values)
  80. {
  81. base.OnSerialize(values);
  82. values["EffectiveHappiness"] = _effectiveHappiness;
  83. }
  84. protected override void OnDeserialize(Dictionary<string, object> values)
  85. {
  86. base.OnDeserialize(values);
  87. if (values.ContainsKey("EffectiveHappiness"))
  88. {
  89. _effectiveHappiness = (int)values["EffectiveHappiness"];
  90. }
  91. }
  92. protected override void OnGridTileStatusChanged(GridTile.Status oldStatus)
  93. {
  94. base.OnGridTileStatusChanged(oldStatus);
  95. if (tile.status == GridTile.Status.Created)
  96. {
  97. SingletonMonobehaviour<Scheduler>.Instance.ExecuteNextFrame(base.gameObject, GridTileStatus);
  98. SingletonMonobehaviour<Scheduler>.Instance.ExecuteNextFrame(base.gameObject, UpdateSprite);
  99. }
  100. else if (oldStatus == GridTile.Status.Created && tile.status == GridTile.Status.Destroyed)
  101. {
  102. UpdateNeighborSprites();
  103. GridTileStatus();
  104. }
  105. }
  106. protected void GridTileStatus()
  107. {
  108. if (tile.status == GridTile.Status.Created && happiness > _effectiveHappiness)
  109. {
  110. IslandState.AddHappiness(happiness - _effectiveHappiness);
  111. _effectiveHappiness = happiness;
  112. serializing.Serialize();
  113. }
  114. else if (tile.status == GridTile.Status.Destroyed && _effectiveHappiness > 0)
  115. {
  116. IslandState.AddHappiness(-_effectiveHappiness);
  117. _gameStats.AddNumberOfRocksRemoved(1);
  118. _effectiveHappiness = 0;
  119. serializing.Serialize();
  120. }
  121. }
  122. private CIGScenery GetMultiScenery(GridIndex index)
  123. {
  124. IsometricGrid grid = tile.grid;
  125. if (grid.IsWithinBounds(index) && grid[index].Tile != null)
  126. {
  127. CIGScenery component = grid[index.u, index.v].Tile.GetComponent<CIGScenery>();
  128. if (component != null && component.multiple)
  129. {
  130. return component;
  131. }
  132. }
  133. return null;
  134. }
  135. private bool HasMultiScenery(GridIndex index)
  136. {
  137. return GetMultiScenery(index) != null;
  138. }
  139. private int GetSpriteNumber(bool index1, bool index2, bool index3, bool index4)
  140. {
  141. int num = 0;
  142. if (index4)
  143. {
  144. num += 8;
  145. }
  146. if (index3)
  147. {
  148. num += 2;
  149. }
  150. if (index2)
  151. {
  152. num += 4;
  153. }
  154. if (index1)
  155. {
  156. num++;
  157. }
  158. return num;
  159. }
  160. private SpriteRenderer createSpriteRendererAt(int u, int v)
  161. {
  162. float x = tile.element.Grid.elementSize.x;
  163. float y = tile.element.Grid.elementSize.y;
  164. GameObject gameObject = new GameObject();
  165. gameObject.transform.parent = base.transform;
  166. gameObject.transform.localScale = Vector3.one;
  167. gameObject.name = "MultiScenerySprite" + u + "." + v;
  168. gameObject.transform.localPosition = new Vector2((float)(u - v) * x * 0.5f, (float)(u + v) * y * -0.5f);
  169. SpriteRenderer spriteRenderer = gameObject.AddComponent<SpriteRenderer>();
  170. spriteRenderer.sortingOrder = this.spriteRenderer.sortingOrder;
  171. return spriteRenderer;
  172. }
  173. public void UpdateNeighborSprites()
  174. {
  175. if (multiple)
  176. {
  177. GridIndex index = tile.index;
  178. CIGScenery multiScenery = GetMultiScenery(new GridIndex(index.u - 1, index.v));
  179. if (multiScenery != null)
  180. {
  181. multiScenery.UpdateSprite();
  182. }
  183. multiScenery = GetMultiScenery(new GridIndex(index.u, index.v - 1));
  184. if (multiScenery != null)
  185. {
  186. multiScenery.UpdateSprite();
  187. }
  188. multiScenery = GetMultiScenery(new GridIndex(index.u - 1, index.v - 1));
  189. if (multiScenery != null)
  190. {
  191. multiScenery.UpdateSprite();
  192. }
  193. multiScenery = GetMultiScenery(new GridIndex(index.u + 1, index.v));
  194. if (multiScenery != null)
  195. {
  196. multiScenery.UpdateSprite();
  197. }
  198. multiScenery = GetMultiScenery(new GridIndex(index.u, index.v + 1));
  199. if (multiScenery != null)
  200. {
  201. multiScenery.UpdateSprite();
  202. }
  203. multiScenery = GetMultiScenery(new GridIndex(index.u + 1, index.v + 1));
  204. if (multiScenery != null)
  205. {
  206. multiScenery.UpdateSprite();
  207. }
  208. multiScenery = GetMultiScenery(new GridIndex(index.u - 1, index.v + 1));
  209. if (multiScenery != null)
  210. {
  211. multiScenery.UpdateSprite();
  212. }
  213. multiScenery = GetMultiScenery(new GridIndex(index.u + 1, index.v - 1));
  214. if (multiScenery != null)
  215. {
  216. multiScenery.UpdateSprite();
  217. }
  218. }
  219. }
  220. public void UpdateSprite()
  221. {
  222. if (!multiple)
  223. {
  224. return;
  225. }
  226. GridIndex index = tile.index;
  227. bool flag = true;
  228. bool flag2 = HasMultiScenery(new GridIndex(index.u - 1, index.v));
  229. bool flag3 = HasMultiScenery(new GridIndex(index.u, index.v - 1));
  230. bool index2 = HasMultiScenery(new GridIndex(index.u - 1, index.v - 1));
  231. bool flag4 = HasMultiScenery(new GridIndex(index.u + 1, index.v));
  232. bool flag5 = HasMultiScenery(new GridIndex(index.u, index.v + 1));
  233. bool flag6 = HasMultiScenery(new GridIndex(index.u + 1, index.v + 1));
  234. bool index3 = HasMultiScenery(new GridIndex(index.u + 1, index.v - 1));
  235. bool flag7 = HasMultiScenery(new GridIndex(index.u - 1, index.v + 1));
  236. spriteRenderer.sprite = sprites[GetSpriteNumber(index2, flag3, flag2, flag)];
  237. if (!flag4 && !flag3)
  238. {
  239. if (_spriteRenderer2 == null)
  240. {
  241. _spriteRenderer2 = createSpriteRendererAt(1, 0);
  242. }
  243. _spriteRenderer2.enabled = true;
  244. _spriteRenderer2.sprite = sprites[GetSpriteNumber(flag3, index3, flag, flag4)];
  245. }
  246. else if (_spriteRenderer2 != null)
  247. {
  248. _spriteRenderer2.enabled = false;
  249. }
  250. if (!flag6)
  251. {
  252. if (_spriteRenderer3 == null)
  253. {
  254. _spriteRenderer3 = createSpriteRendererAt(1, 1);
  255. }
  256. _spriteRenderer3.enabled = true;
  257. _spriteRenderer3.sprite = sprites[GetSpriteNumber(flag, flag4, flag5, flag6)];
  258. }
  259. else if (_spriteRenderer3 != null)
  260. {
  261. _spriteRenderer3.enabled = false;
  262. }
  263. if (!flag5 && !flag7 && !flag2)
  264. {
  265. if (_spriteRenderer4 == null)
  266. {
  267. _spriteRenderer4 = createSpriteRendererAt(0, 1);
  268. }
  269. _spriteRenderer4.enabled = true;
  270. _spriteRenderer4.sprite = sprites[GetSpriteNumber(flag2, flag, flag7, flag5)];
  271. }
  272. else if (_spriteRenderer4 != null)
  273. {
  274. _spriteRenderer4.enabled = false;
  275. }
  276. }
  277. protected override void ClickHandler(GameObject target)
  278. {
  279. base.ClickHandler(target);
  280. if (base.state != BuildingState.Demolishing && base.state != BuildingState.WaitingForDemolishing)
  281. {
  282. ToggleButtons();
  283. }
  284. }
  285. private void ToggleButtons()
  286. {
  287. if (_overlayButtons == null)
  288. {
  289. GameEvents.Invoke(new UnemiShouldCloseEvent(this));
  290. SingletonMonobehaviour<CIGAudioManager>.Instance.PlayClip(Clip.ButtonClick);
  291. _overlayButtons = OverlayButtons.Get(this);
  292. _overlayButtons.ShowOpenAnimation();
  293. _overlayButtons.DisableAllButtons();
  294. if (ShownProperties.Count > 0)
  295. {
  296. _overlayButtons.InfoButton.EnableButton(InfoAction);
  297. }
  298. if (CanDemolish)
  299. {
  300. _overlayButtons.DemolishButton.EnableButton(DemolishAction);
  301. }
  302. }
  303. else
  304. {
  305. RemoveButtons();
  306. }
  307. }
  308. private void RemoveButtons()
  309. {
  310. if ((bool)_overlayButtons)
  311. {
  312. OverlayButtons overlayButtonsTemp = _overlayButtons;
  313. overlayButtonsTemp.ShowCloseAnimation(delegate
  314. {
  315. UnityEngine.Object.Destroy(overlayButtonsTemp.gameObject);
  316. });
  317. _overlayButtons = null;
  318. }
  319. }
  320. private void InfoAction()
  321. {
  322. SingletonMonobehaviour<PopupManager>.Instance.RequestFirstPopup<BuildingInfoPopupState>(delegate (State state)
  323. {
  324. ((BuildingInfoPopupState)state).SetBuildingAndContent(this, BuildingPopupContent.Info);
  325. });
  326. }
  327. private void DemolishAction()
  328. {
  329. RemoveButtons();
  330. CityIsland.Current.isometricIsland.destroyer.DestroyBuilding(this);
  331. }
  332. private void OnUnemiShouldCloseEvent(UnemiShouldCloseEvent e)
  333. {
  334. RemoveButtons();
  335. }
  336. }