您不能選擇超過 %s 個話題 話題必須以字母或數字為開頭,可包含連接號 ('-') 且最長為 35 個字
 
 
 

337 行
9.6 KiB

  1. using System;
  2. using System.Collections.Generic;
  3. using CIG.Translation;
  4. using CIG3.ExtensionMethods;
  5. using CIGEnums;
  6. using SUISS.Core;
  7. using SUISSEngine;
  8. using UnityEngine;
  9. public sealed class CIGCityAdvisor : SingletonMonobehaviour<CIGCityAdvisor>
  10. {
  11. public void Show()
  12. {
  13. if (this.RetrieveComponents())
  14. {
  15. this.ConstructAdvice();
  16. }
  17. }
  18. public void Build()
  19. {
  20. if (this._advice.advicedBuilding != null)
  21. {
  22. this._island.StartBuilding(this._advice.advicedBuilding.Prefab);
  23. }
  24. }
  25. public void Cancel()
  26. {
  27. }
  28. public AdviceType AdviceType
  29. {
  30. get
  31. {
  32. return this._advice.type;
  33. }
  34. }
  35. public void UpdateAdvise()
  36. {
  37. this.RetrieveComponents();
  38. if (this._advice == null)
  39. {
  40. this._advice = new CIGCityAdvisor.AdviceProperties();
  41. }
  42. this.DetermineAdviceType();
  43. }
  44. private static int GetHappiness(CIGBuilding x)
  45. {
  46. return x.baseHappinessValue;
  47. }
  48. private static int GetJobs(CIGBuilding x)
  49. {
  50. return x.GetComponent<CIGCommercialBuilding>().maxEmployeesBaseValue;
  51. }
  52. private static int GetHousing(CIGBuilding x)
  53. {
  54. return x.GetComponent<CIGResidentialBuilding>().maxPeopleBaseValue;
  55. }
  56. private bool RetrieveComponents()
  57. {
  58. this._island = CityIsland.Current;
  59. if (this._island == null)
  60. {
  61. UnityEngine.Debug.LogError("Cannot find CityIsland component");
  62. return false;
  63. }
  64. this._grid = this._island.isometricIsland.grid;
  65. this._land = this._island.expansions;
  66. if (this._gameState == null)
  67. {
  68. this._gameState = SingletonMonobehaviour<CIGGameState>.Instance;
  69. if (this._gameState == null)
  70. {
  71. UnityEngine.Debug.LogError("Cannot find CIGGameState component");
  72. return false;
  73. }
  74. }
  75. return true;
  76. }
  77. private void ConstructAdvice()
  78. {
  79. this._advice = new CIGCityAdvisor.AdviceProperties();
  80. this.DetermineAdviceType();
  81. this.DetermineAdviceText();
  82. this.DetermineParameters();
  83. this.ChooseBuilding();
  84. this.LocalizeAdviceText();
  85. this._advice.title = Localization.Key("city_advisor");
  86. if (this._advice.advicedBuilding != null)
  87. {
  88. this._advice.okButtonText = Localization.Key("build");
  89. this._advice.cancelButtonText = Localization.Key("perhaps_later");
  90. }
  91. else
  92. {
  93. this._advice.okButtonText = Localization.Key("thank_you");
  94. }
  95. SingletonMonobehaviour<PopupManager>.Instance.RequestFirstAdvicePopup(this._advice.image, this._advice.title, this._advice.text, this._advice.okButtonText, this._advice.cancelButtonText, new Action(this.Build), new Action(this.Cancel), null, this._advice.advicedBuilding, true);
  96. }
  97. private void LocalizeAdviceText()
  98. {
  99. ILocalizedString localizedString = (!(this._advice.advicedBuilding != null)) ? Localization.EmptyLocalizedString : this._advice.advicedBuilding.LocalName;
  100. ILocalizedString localizedString2 = this._advice.localizedString;
  101. string text = localizedString2.Translate();
  102. if (text.Contains("{1}"))
  103. {
  104. this._advice.text = Localization.Format(localizedString2, new ILocalizedString[]
  105. {
  106. Localization.Integer(this._advice.deficiency),
  107. localizedString
  108. });
  109. }
  110. else if (text.Contains("{0}"))
  111. {
  112. this._advice.text = Localization.Format(localizedString2, new ILocalizedString[]
  113. {
  114. localizedString
  115. });
  116. }
  117. else
  118. {
  119. this._advice.text = localizedString2;
  120. }
  121. }
  122. private void ChooseBuilding()
  123. {
  124. List<CIGBuilding> list = new List<CIGBuilding>();
  125. bool[] availableSurfaceTypes = this._grid.AvailableSurfaceTypes;
  126. foreach (CIGBuilding cigbuilding in this._advice.buildings)
  127. {
  128. if (!cigbuilding.island.IsValid() || cigbuilding.island == this._island.island)
  129. {
  130. if (!cigbuilding.activatable && cigbuilding.IsUnlocked)
  131. {
  132. int requiredGridType = cigbuilding.tile.requiredGridType;
  133. if (requiredGridType < availableSurfaceTypes.Length && availableSurfaceTypes[requiredGridType])
  134. {
  135. list.Add(cigbuilding);
  136. }
  137. }
  138. }
  139. }
  140. list.Sort((CIGBuilding x, CIGBuilding y) => this._advice.getter(x) - this._advice.getter(y));
  141. foreach (CIGBuilding cigbuilding2 in list)
  142. {
  143. if (this._advice.getter(cigbuilding2) >= this._advice.deficiency)
  144. {
  145. this._advice.advicedBuilding = cigbuilding2;
  146. break;
  147. }
  148. }
  149. if (this._advice.advicedBuilding == null && list.Count > 0)
  150. {
  151. this._advice.advicedBuilding = list[list.Count - 1];
  152. }
  153. if (this._advice.advicedBuilding != null)
  154. {
  155. this._advice.image = this._advice.advicedBuilding.GetComponent<SpriteRenderer>().sprite;
  156. }
  157. }
  158. private void DetermineParameters()
  159. {
  160. switch (this._advice.type)
  161. {
  162. case AdviceType.BuildDecorations:
  163. this._advice.buildings.AddRange(SingletonMonobehaviour<GameObjectManager>.Instance.Decoration);
  164. this._advice.buildings.AddRange(SingletonMonobehaviour<GameObjectManager>.Instance.Community);
  165. this._advice.getter = new CIGCityAdvisor.GetProperty(CIGCityAdvisor.GetHappiness);
  166. break;
  167. case AdviceType.BuyLand:
  168. this._advice.image = this.ExpandSprite;
  169. break;
  170. case AdviceType.CreateJobs:
  171. this._advice.buildings.AddRange(SingletonMonobehaviour<GameObjectManager>.Instance.Commercial);
  172. this._advice.getter = new CIGCityAdvisor.GetProperty(CIGCityAdvisor.GetJobs);
  173. break;
  174. case AdviceType.BuildHouses:
  175. case AdviceType.AttractPeople:
  176. this._advice.buildings.AddRange(SingletonMonobehaviour<GameObjectManager>.Instance.Residential);
  177. this._advice.getter = new CIGCityAdvisor.GetProperty(CIGCityAdvisor.GetHousing);
  178. break;
  179. case AdviceType.ContinueBuilding:
  180. this._advice.image = this.ThumbsUpSprite;
  181. break;
  182. default:
  183. UnityEngine.Debug.LogError("Unknown advice type encountered");
  184. break;
  185. }
  186. }
  187. private void DetermineAdviceText()
  188. {
  189. CIGIslandState cigislandState = UnityEngine.Object.FindObjectOfType<CIGIslandState>();
  190. switch (this._advice.type)
  191. {
  192. case AdviceType.BuildDecorations:
  193. if (cigislandState.Population == 0)
  194. {
  195. this._advice.localizedString = Localization.Key("city_advisor_build_decorations");
  196. }
  197. else
  198. {
  199. this._advice.localizedString = Localization.Key("city_advisor_not_happy");
  200. }
  201. break;
  202. case AdviceType.BuyLand:
  203. this._advice.localizedString = Localization.Key("city_advisor_expand");
  204. break;
  205. case AdviceType.CreateJobs:
  206. if (cigislandState.Jobs == 0)
  207. {
  208. this._advice.localizedString = Localization.Key("city_advisor_make_money");
  209. }
  210. else
  211. {
  212. this._advice.localizedString = Localization.PluralKey("city_advisor_jobs_needed", (long)this._advice.deficiency);
  213. }
  214. break;
  215. case AdviceType.BuildHouses:
  216. if (cigislandState.Housing == 0)
  217. {
  218. this._advice.localizedString = Localization.Key("city_advisor_people_needed");
  219. }
  220. else
  221. {
  222. this._advice.localizedString = Localization.PluralKey("city_advisor_more_people_needed", (long)this._advice.deficiency);
  223. }
  224. break;
  225. case AdviceType.AttractPeople:
  226. if (cigislandState.Housing == 0)
  227. {
  228. this._advice.localizedString = Localization.Key("city_advisor_atttract_people");
  229. }
  230. else
  231. {
  232. this._advice.localizedString = Localization.Key("city_advisor_atttract_more_people");
  233. }
  234. break;
  235. case AdviceType.ContinueBuilding:
  236. this._advice.localizedString = Localization.Key("city_advisor_balanced");
  237. break;
  238. default:
  239. UnityEngine.Debug.LogError("Unknown advice type encountered");
  240. break;
  241. }
  242. }
  243. private void DetermineAdviceType()
  244. {
  245. CIGGameState instance = SingletonMonobehaviour<CIGGameState>.Instance;
  246. float num = (1f - (float)SingletonMonobehaviour<CIGGameStats>.Instance.NumberOfUsedElements / (float)SingletonMonobehaviour<CIGGameStats>.Instance.NumberOfUnlockedElements) * 100f;
  247. if ((double)instance.GlobalHappiness <= 0.95 * (double)instance.GlobalHousing)
  248. {
  249. this._advice.type = AdviceType.BuildDecorations;
  250. this._advice.deficiency = instance.GlobalHousing - instance.GlobalHappiness;
  251. }
  252. else if (this._land.HaveExpansionsLeft && num <= 5f)
  253. {
  254. this._advice.type = AdviceType.BuyLand;
  255. }
  256. else if (instance.GlobalJobs < instance.GlobalHousing)
  257. {
  258. this._advice.type = AdviceType.CreateJobs;
  259. this._advice.deficiency = instance.GlobalHousing - instance.GlobalJobs;
  260. }
  261. else if (instance.GlobalJobs > instance.GlobalHousing)
  262. {
  263. this._advice.type = AdviceType.BuildHouses;
  264. this._advice.deficiency = instance.GlobalJobs - instance.GlobalHousing;
  265. }
  266. else if (instance.GlobalHousing == 0 || instance.GlobalHappiness > instance.GlobalHousing)
  267. {
  268. this._advice.type = AdviceType.AttractPeople;
  269. this._advice.deficiency = instance.GlobalHappiness - instance.GlobalHousing;
  270. }
  271. else if (this._land.HaveExpansionsLeft && num <= 15f)
  272. {
  273. this._advice.type = AdviceType.BuyLand;
  274. }
  275. else
  276. {
  277. this._advice.type = AdviceType.ContinueBuilding;
  278. }
  279. }
  280. public Sprite ExpandSprite;
  281. public Sprite ThumbsUpSprite;
  282. private CIGGameState _gameState;
  283. private CIGCityAdvisor.AdviceProperties _advice;
  284. private CityIsland _island;
  285. private IsometricGrid _grid;
  286. private CIGExpansions _land;
  287. public delegate int GetProperty(CIGBuilding building);
  288. public class AdviceProperties
  289. {
  290. public AdviceType type;
  291. public int deficiency;
  292. public CIGCityAdvisor.GetProperty getter;
  293. public ILocalizedString localizedString;
  294. public List<CIGBuilding> buildings = new List<CIGBuilding>();
  295. public CIGBuilding advicedBuilding;
  296. public ILocalizedString text = Localization.EmptyLocalizedString;
  297. public Sprite image;
  298. public ILocalizedString title = Localization.EmptyLocalizedString;
  299. public ILocalizedString okButtonText = Localization.EmptyLocalizedString;
  300. public ILocalizedString cancelButtonText = Localization.EmptyLocalizedString;
  301. }
  302. }