using CIG.Translation; using CIGEnums; using SUISS.Core; using SUISSEngine; using System; using System.Collections; using UnityEngine; public class BuildingInfoPopupState : PopupBaseState { public readonly BuildingProperty[] AllRequiredBuildingProperties = new BuildingProperty[7] { BuildingProperty.People, BuildingProperty.Employees, BuildingProperty.Profit, BuildingProperty.ProfitXp, BuildingProperty.TimeUntilProfit, BuildingProperty.Happiness, BuildingProperty.ConstructionXp }; private BuildingPopupContent _content; private BonusFieldContent _bonusField; private Building _building; private CIGBuilding _cigBuilding; private Coroutine _updateBuildingInfoCoroutine; protected Building Building { get { return _building; } private set { _building = value; _cigBuilding = (value as CIGBuilding); } } public void SetBuildingAndContent(Building building, BuildingPopupContent content) { Building = building; _content = content; BuildingInfoPopupView buildingInfoPopupView = View as BuildingInfoPopupView; switch (_content) { case BuildingPopupContent.Info: buildingInfoPopupView.HideUpgradeButton(); buildingInfoPopupView.HideBuildingSize(); if (_cigBuilding != null && !_cigBuilding.Activated) { buildingInfoPopupView.SetSubtitle(Localization.Key("building_activate")); } else { buildingInfoPopupView.HideSubtitle(); } goto default; case BuildingPopupContent.Activate: buildingInfoPopupView.SetUpgradeCosts(_cigBuilding.UpgradeCost); buildingInfoPopupView.HideBuildingSize(); buildingInfoPopupView.SetSubtitle(Localization.Key("building_activate")); goto default; case BuildingPopupContent.Upgrade: { buildingInfoPopupView.SetUpgradeCosts(_cigBuilding.UpgradeCost); buildingInfoPopupView.HideBuildingSize(); int num = _cigBuilding.CurrentLevel - (_cigBuilding.activatable ? 1 : 0); buildingInfoPopupView.SetSubtitle(Localization.Format("{0} ({1} {2})", Localization.Key("building_upgrade"), Localization.Key("level"), Localization.Integer(num + 1))); _bonusField = BonusFieldContent.DeltaWithNextLevel; break; } case BuildingPopupContent.Preview: { buildingInfoPopupView.SetUpgradeCosts(_cigBuilding.PurchasePrice); buildingInfoPopupView.SetBuildingSize(new GridSize(Building.tile.gridSizeU, Building.tile.gridSizeV)); int requiredGridType2 = building.tile.requiredGridType; if (requiredGridType2 != 10) { SurfaceType surfaceType2 = (SurfaceType)requiredGridType2; string arg2 = surfaceType2.ToString().ToLower().Replace("driedswamp", "swamp"); string key2 = $"surfacetype_{arg2}"; buildingInfoPopupView.SetSubtitle(Localization.Concat(Localization.Format(Localization.Key("must_be_built_on"), Localization.Key(key2)))); } else { buildingInfoPopupView.HideSubtitle(); } goto default; } case BuildingPopupContent.ReadOnly: { buildingInfoPopupView.HideUpgradeButton(); buildingInfoPopupView.SetBuildingSize(new GridSize(Building.tile.gridSizeU, Building.tile.gridSizeV)); int requiredGridType = building.tile.requiredGridType; if (requiredGridType != 10) { SurfaceType surfaceType = (SurfaceType)requiredGridType; string arg = surfaceType.ToString().ToLower().Replace("driedswamp", "swamp"); string key = $"surfacetype_{arg}"; buildingInfoPopupView.SetSubtitle(Localization.Concat(Localization.Format(Localization.Key("must_be_built_on"), Localization.Key(key)))); } else { buildingInfoPopupView.HideSubtitle(); } goto default; } default: _bonusField = BonusFieldContent.Empty; break; } buildingInfoPopupView.UpdateInfo(Building); if (_updateBuildingInfoCoroutine != null) { StopCoroutine(_updateBuildingInfoCoroutine); _updateBuildingInfoCoroutine = null; } _updateBuildingInfoCoroutine = StartCoroutine(UpdateBuildingInfoRoutine()); } public void RequestPurchase() { if (_content == BuildingPopupContent.Preview) { PopupManager instance = SingletonMonobehaviour.Instance; bool suppressQueue = instance.SuppressQueue; instance.SuppressQueue = true; instance.CloseRecursive(); if (!SingletonMonobehaviour.Instance.IsVisible) { CityIsland.Current.StartBuilding(_building.gameObject); } if (!suppressQueue) { instance.SuppressQueue = false; } } else if (_cigBuilding != null) { if (SingletonMonobehaviour.Instance.IsVisible) { ClosePopup(); return; } if (!_cigBuilding.CanUpgrade) { ILocalizedString title; ILocalizedString reason = _cigBuilding.ReasonWhyCantUpgrade(out title); if (reason != null && reason != Localization.EmptyLocalizedString) { ClosePopup(delegate { SingletonMonobehaviour.Instance.ShowInfoPopup(title, reason); }); return; } } CIGBuilding building = _cigBuilding; Action callback = delegate { if (!building.StartUpgrade()) { ILocalizedString title2; ILocalizedString localizedString = building.ReasonWhyCantUpgrade(out title2); if (localizedString != null && localizedString != Localization.EmptyLocalizedString) { SingletonMonobehaviour.Instance.ShowInfoPopup(title2, localizedString); } } }; ClosePopup(callback); } else { UnityEngine.Debug.LogWarning($"{Building.gameObject.name} is not a UpgradableBuilding"); } } public override void Leave(State newState) { base.Leave(newState); if (_updateBuildingInfoCoroutine != null) { StopCoroutine(_updateBuildingInfoCoroutine); _updateBuildingInfoCoroutine = null; } } private IEnumerator UpdateBuildingInfoRoutine() { if (Building != null) { ((BuildingInfoPopupView)View).SetBuildingSprites(Building); while (Building != null) { if (!_isInState) { yield break; } FillProperties(); yield return new WaitForSeconds((!Building.InfoRequiresFrequentRefresh) ? 60f : 1f); } } _updateBuildingInfoCoroutine = null; } private void FillProperties() { foreach (BuildingProperty shownProperty in Building.ShownProperties) { ILocalizedString value = GetValue(shownProperty); ILocalizedString bonus; switch (_bonusField) { default: bonus = Localization.EmptyLocalizedString; break; case BonusFieldContent.DeltaWithNextLevel: bonus = GetLevelUp(shownProperty); break; } ((BuildingInfoPopupView)View).SetInfoLine(shownProperty, value, bonus); } } private ILocalizedString GetValue(BuildingProperty property) { switch (property) { case BuildingProperty.ConstructionXp: return (!(_cigBuilding == null)) ? Localization.Integer(_cigBuilding.constructionXP.GetValue("XP")) : Localization.EmptyLocalizedString; case BuildingProperty.Employees: { CIGCommercialBuilding cIGCommercialBuilding = (CIGCommercialBuilding)Building; if (_content == BuildingPopupContent.Activate || !_cigBuilding.Activated || _content == BuildingPopupContent.Preview || _content == BuildingPopupContent.ReadOnly) { return Localization.Integer(cIGCommercialBuilding.maxEmployeesBaseValue); } return Localization.Format(Localization.Key("progress"), Localization.Integer(cIGCommercialBuilding.Employees), Localization.Integer(cIGCommercialBuilding.MaxEmployees)); } case BuildingProperty.Happiness: { if (_content == BuildingPopupContent.Activate || (_cigBuilding != null && !_cigBuilding.Activated) || _content == BuildingPopupContent.Preview || _content == BuildingPopupContent.ReadOnly) { return Localization.Integer(_cigBuilding.baseHappinessValue); } int? num = null; if (Building is CIGScenery) { num = ((CIGScenery)Building).happiness; } else if (_cigBuilding != null) { num = _cigBuilding.Happiness; } if (!num.HasValue) { return Localization.EmptyLocalizedString; } return Localization.Integer(num.Value); } case BuildingProperty.People: { CIGResidentialBuilding cIGResidentialBuilding = (CIGResidentialBuilding)Building; if (_content == BuildingPopupContent.Activate || !_cigBuilding.Activated || _content == BuildingPopupContent.Preview || _content == BuildingPopupContent.ReadOnly) { return Localization.Integer(cIGResidentialBuilding.maxPeopleBaseValue); } return Localization.Format(Localization.Key("progress"), Localization.Integer(cIGResidentialBuilding.People), Localization.Integer(cIGResidentialBuilding.MaxPeople)); } case BuildingProperty.Profit: { Currencies zero = Currencies.Zero; zero = ((_content != BuildingPopupContent.Activate && _cigBuilding.Activated && _content != BuildingPopupContent.Preview && _content != BuildingPopupContent.ReadOnly) ? ((CIGCommercialBuilding)Building).Profit.WithoutXPCurrency() : ((CIGCommercialBuilding)Building).baseProfitCurrencies.WithoutXPCurrency()); return Localization.Integer((int)zero.GetValue("Cash")); } case BuildingProperty.ProfitXp: { decimal num2 = 0m; num2 = ((_content != BuildingPopupContent.Activate && _cigBuilding.Activated && _content != BuildingPopupContent.Preview && _content != BuildingPopupContent.ReadOnly) ? ((CIGCommercialBuilding)Building).Profit.GetValue("XP") : ((CIGCommercialBuilding)Building).baseProfitCurrencies.GetValue("XP")); return Localization.Integer(num2); } case BuildingProperty.TimeUntilProfit: if (_content == BuildingPopupContent.Activate || !_cigBuilding.Activated || _content == BuildingPopupContent.Upgrade || _content == BuildingPopupContent.Preview || _content == BuildingPopupContent.ReadOnly) { return Localization.TimeSpan(TimeSpan.FromSeconds(((CIGCommercialBuilding)Building).profitTime), hideSecondPartWhenZero: false); } return ((CIGCommercialBuilding)Building).TimeLeftString(); case BuildingProperty.Text: return Building.InfoText(); default: return Localization.Literal("ERROR"); } } private ILocalizedString GetLevelUp(BuildingProperty property) { int num = 0; switch (property) { case BuildingProperty.Employees: { CIGCommercialBuilding cIGCommercialBuilding = (CIGCommercialBuilding)Building; num = cIGCommercialBuilding.UpgradeJobs(cIGCommercialBuilding.CurrentLevel + 1); break; } case BuildingProperty.Happiness: if (Building is CIGCommunityBuilding) { num = ((CIGCommunityBuilding)Building).UpgradeHappiness(_cigBuilding.CurrentLevel + 1); } break; case BuildingProperty.People: num = ((CIGResidentialBuilding)Building).UpgradePeople(_cigBuilding.CurrentLevel + 1); break; case BuildingProperty.Profit: { Currencies currencies = ((CIGCommercialBuilding)Building).UpgradeProfit(_cigBuilding.CurrentLevel + 1).WithoutXPCurrency(); num = (int)currencies.GetValue("Cash"); break; } case BuildingProperty.ProfitXp: { decimal value = ((CIGCommercialBuilding)Building).UpgradeProfit(_cigBuilding.CurrentLevel + 1).GetValue("XP"); num = Mathf.RoundToInt((float)value); break; } case BuildingProperty.TimeUntilProfit: case BuildingProperty.ConstructionXp: case BuildingProperty.Text: num = 0; break; default: return Localization.Literal("ERROR"); } if (num > 0) { return Localization.Format(Localization.Key("plus"), Localization.Integer(num)); } return Localization.EmptyLocalizedString; } }