using System; using System.Collections.Generic; using CIG.Extensions; using CIG.Translation; using CIGEnums; using SparkLinq; using SUISS.Core; using SUISSEngine; using UnityEngine; public class BuildDemolishPopupState : PopupBaseState { public override void Enter(State oldState) { base.Enter(oldState); this._buildList = from x in SingletonMonobehaviour.Instance.BuildList orderby x.finishTime select x; Destroyer destroyer = IsometricIsland.Current.destroyer; List demolishList = destroyer.DemolishList; Dictionary demolishTimeOf = demolishList.ToDictionary((Building x) => x, (Building x) => destroyer.GetTimeTillDestroyed(x)); this._demolishList = from x in demolishList orderby demolishTimeOf[x] select x; this._lastOpenedTab = ((this._demolishList.Count <= 0 || this._buildList.Count != 0) ? BuildDemolishTabs.Build : BuildDemolishTabs.Demolish); this.InvokeNextFrame(delegate { this.SwitchTab(this._lastOpenedTab); }); } public override void ClosePopup(Action callback, bool animate, bool synchronous) { this._buildList.Clear(); this._demolishList.Clear(); base.ClosePopup(callback, animate, synchronous); } public void OpenCranesShop() { base.ClosePopup(delegate() { SingletonMonobehaviour.Instance.OpenShopMenu(ShopMenuTabs.Cranes); }); } public void Speedup(Currencies cost) { if (this._buildList.Count == 0 && this._demolishList.Count == 0) { return; } BuildDemolishTabs tab = this._lastOpenedTab; SingletonMonobehaviour.Instance.RequestGenericPopup(null, Localization.Key("speedup"), Localization.Format(Localization.Key("speedup_for"), new ILocalizedString[] { cost.LocalizedString() }), Localization.Key("ok"), Localization.Key("not_now"), delegate() { SingletonMonobehaviour.Instance.SpendCurrencies(cost, false, delegate(bool ok, Currencies spent) { if (ok) { if (tab != BuildDemolishTabs.Build) { if (tab != BuildDemolishTabs.Demolish) { UnityEngine.Debug.LogErrorFormat("Missing speedup action for '{0}'", new object[] { tab }); } else { int spent2 = Mathf.RoundToInt((float)cost.GetValue("Cash")); SingletonMonobehaviour.Instance.AddSpeedupExecuted(0); SingletonMonobehaviour.Instance.AddCashSpent_BulldozerQueue(spent2); CityIsland.Current.isometricIsland.destroyer.FinishAll(); } } else { int num = Mathf.RoundToInt((float)cost.GetValue("Gold")); SingletonMonobehaviour.Instance.AddSpeedupExecuted(num); SingletonMonobehaviour.Instance.AddGoldSpent_CraneQueue(num); SingletonMonobehaviour.Instance.SpeedupAll(); } } }); }, null, null, true); base.ClosePopup(); } public void SwitchTab(BuildDemolishTabs buildDemolishTab) { this._lastOpenedTab = buildDemolishTab; ((BuildDemolishPopupView)this.View).SwitchTab(buildDemolishTab); } public Currencies DemolishQueueSpeedupCost(out int totalTime) { totalTime = 0; int num = 0; foreach (Building building in this._demolishList) { int num2 = this.BuildingTimeLeft(building); if (num2 > 0) { totalTime += num2; num++; } } decimal value = num * CIGBuilding.GetSpeedupCostCashForSeconds(300L); return new Currencies("Cash", value); } public Currencies BuildQueueSpeedupCost(out int totalTime) { decimal num = 0m; decimal num2 = 0m; totalTime = 0; int num3 = 0; foreach (CIGBuilderManager.BuildInfo buildInfo in this._buildList) { if (!buildInfo.IsFinished) { int num4 = (int)buildInfo.Timeleft; decimal speedupCostGoldForSeconds = CIGBuilding.GetSpeedupCostGoldForSeconds((long)num4); num2 = Math.Max(num2, speedupCostGoldForSeconds); num += speedupCostGoldForSeconds; totalTime += num4; num3++; } } if (num3 > 1) { num = Math.Max(1m, Math.Round(0.75m * num)); } num = Math.Max(num, num2); return new Currencies("Gold", num); } public bool CancelDemolish(Building building) { if (this._lastOpenedTab != BuildDemolishTabs.Demolish) { return false; } if (this._demolishList.Remove(building)) { building.CancelDemolishment(); IsometricIsland.Current.destroyer.CancelDestroyBuilding(building); return true; } return false; } public CIGBuilderManager.BuildInfo GetBuildListItem(int index) { return this._buildList[index]; } public Building GetDemolishListItem(int index) { return this._demolishList[index]; } public bool IsFirstBuildingBuilt() { if (this._buildList.Count == 0) { return false; } CIGBuilderManager.BuildInfo buildInfo = this._buildList[0]; return buildInfo.IsFinished && this._buildList.Remove(buildInfo); } public bool IsFirstBuildingDemolished() { if (this._demolishList.Count == 0) { return false; } Building building = this._demolishList[0]; return this.BuildingTimeLeft(building) <= 0 && this._demolishList.Remove(building); } public int BuildListCount { get { return this._buildList.Count; } } public int DemolishListCount { get { return this._demolishList.Count; } } private int BuildingTimeLeft(Building building) { if (building == null || building.tile == null || building.tile.status == GridTile.Status.Destroyed) { return -1; } double num = Math.Max(building.ConstructionTimeLeft, building.DemolishTimeLeft); CIGBuilding cigbuilding = building as CIGBuilding; if (cigbuilding != null) { if (building.state == BuildingState.Normal && !cigbuilding.IsUpgrading) { return -1; } num = Math.Max(num, cigbuilding.UpgradeTimeLeft); } else if (building.state == BuildingState.Normal) { return -1; } return (int)num; } private BuildDemolishTabs _lastOpenedTab; private List _buildList = new List(); private List _demolishList = new List(); }