//TODO: Maybe move this logic into it's own module later? public int HandleWorkers(ushort buildingID, ref Building buildingData, ref Citizen.BehaviourData behaviour, ref int aliveWorkerCount, ref int totalWorkerCount, ref int workPlaceCount) { int b = 0; base.GetWorkBehaviour(buildingID, ref buildingData, ref behaviour, ref aliveWorkerCount, ref totalWorkerCount); int num; int num2; int num3; int num4; //this.CalculateWorkplaceCount(new Randomizer((int)buildingID), buildingData.Width, buildingData.Length, out num, out num2, out num3, out num4); num = this.occupants.m_workPlaceCount0; num2 = this.occupants.m_workPlaceCount1; num3 = this.occupants.m_workPlaceCount2; num4 = this.occupants.m_workPlaceCount3; workPlaceCount = num + num2 + num3 + num4; if (buildingData.m_fireIntensity == 0) { base.HandleWorkPlaces(buildingID, ref buildingData, num, num2, num3, num4, ref behaviour, aliveWorkerCount, totalWorkerCount); if (aliveWorkerCount != 0 && workPlaceCount != 0) { int num5 = (behaviour.m_efficiencyAccumulation + aliveWorkerCount - 1) / aliveWorkerCount; b = 2 * num5 - 200 * num5 / ((100 * aliveWorkerCount + workPlaceCount - 1) / workPlaceCount + 100); } } Notification.Problem problem = Notification.RemoveProblems(buildingData.m_problems, Notification.Problem.NoWorkers | Notification.Problem.NoEducatedWorkers); int num6 = (num4 * 300 + num3 * 200 + num2 * 100) / (workPlaceCount + 1); int num7 = (behaviour.m_educated3Count * 300 + behaviour.m_educated2Count * 200 + behaviour.m_educated1Count * 100) / (aliveWorkerCount + 1); if (aliveWorkerCount < workPlaceCount >> 1) { buildingData.m_workerProblemTimer = (byte)Mathf.Min(255, (int)(buildingData.m_workerProblemTimer + 1)); if (buildingData.m_workerProblemTimer >= 128) { problem = Notification.AddProblems(problem, Notification.Problem.NoWorkers | Notification.Problem.MajorProblem); } else if (buildingData.m_workerProblemTimer >= 64) { problem = Notification.AddProblems(problem, Notification.Problem.NoWorkers); } } else if (num7 < num6 - 50) { buildingData.m_workerProblemTimer = (byte)Mathf.Min(255, (int)(buildingData.m_workerProblemTimer + 1)); if (buildingData.m_workerProblemTimer >= 128) { problem = Notification.AddProblems(problem, Notification.Problem.NoEducatedWorkers | Notification.Problem.MajorProblem); } else if (buildingData.m_workerProblemTimer >= 64) { problem = Notification.AddProblems(problem, Notification.Problem.NoEducatedWorkers); } } else { buildingData.m_workerProblemTimer = 0; } buildingData.m_problems = problem; return(Mathf.Max(1, b)); }
public static void ProcessZeroWorker(ushort buildingID, ref Building data) { if (data.m_flags.IsFlagSet(Building.Flags.Completed)) { int aliveWorkCount = 0; int totalWorkCount = 0; Citizen.BehaviourData behaviour = default; RealCityCommonBuildingAI.InitDelegate(); RealCityCommonBuildingAI.GetWorkBehaviour((PlayerBuildingAI)data.Info.m_buildingAI, buildingID, ref data, ref behaviour, ref aliveWorkCount, ref totalWorkCount); int allWorkCount; if (RealCityEconomyExtension.Can16timesUpdate(buildingID)) { allWorkCount = RealCityResidentAI.TotalWorkCount(buildingID, data, true, true); } else { allWorkCount = RealCityResidentAI.TotalWorkCount(buildingID, data, true, false); } if (RealCityEconomyExtension.Can16timesUpdate(buildingID)) { if (totalWorkCount == 0 && allWorkCount != 0) { int budget = Singleton <EconomyManager> .instance.GetBudget(data.Info.m_class); int education3Salary = Math.Max((int)((budget * MainDataStore.govermentEducation3SalaryFixed) / 100), (int)(MainDataStore.govermentSalary * 0.8f)); float num1 = education3Salary * allWorkCount; Singleton <EconomyManager> .instance.FetchResource((EconomyManager.Resource) 16, (int)num1, data.Info.m_class); MainDataStore.outsideTouristMoney += (num1 * MainDataStore.outsideTouristSalaryProfitRatio); } } } }
private void RefreshDisplayData() { if (refeshOnce || (BuildingData.lastBuildingID != WorldInfoPanel.GetCurrentInstanceID().Building)) { if (isVisible) { BuildingData.lastBuildingID = WorldInfoPanel.GetCurrentInstanceID().Building; Building buildingData = Singleton <BuildingManager> .instance.m_buildings.m_buffer[BuildingData.lastBuildingID]; int aliveWorkCount = 0; int totalWorkCount = 0; Citizen.BehaviourData behaviour = default; RealCityCommonBuildingAI.InitDelegate(); RealCityCommonBuildingAI.GetWorkBehaviour((PlayerBuildingAI)buildingData.Info.m_buildingAI, BuildingData.lastBuildingID, ref buildingData, ref behaviour, ref aliveWorkCount, ref totalWorkCount); int allWorkCount = RealCityResidentAI.TotalWorkCount(BuildingData.lastBuildingID, buildingData, true, false); maintainFeeTips.text = Localization.Get("MAINTAIN_FEE_TIPS"); workerStatus.text = Localization.Get("LOCAL_WORKERS_DIV_TOTAL_WORKERS") + totalWorkCount.ToString() + "/" + allWorkCount.ToString(); if (buildingData.Info.m_buildingAI is MarketAI) { fishAmount.text = Localization.Get("MATERIAL_BUFFER") + "/" + Localization.Get("PRODUCTION_BUFFER") + ":" + buildingData.m_customBuffer1.ToString() + "/" + buildingData.m_customBuffer2.ToString(); int aliveVisitCount = 0; int totalVisitCount = 0; RealCityMarketAI.InitDelegate(); RealCityMarketAI.GetVisitBehaviour((MarketAI)(buildingData.Info.m_buildingAI), BuildingData.lastBuildingID, ref buildingData, ref behaviour, ref aliveVisitCount, ref totalVisitCount); var amount = buildingData.m_customBuffer2 / MainDataStore.maxGoodPurchase - totalVisitCount + aliveVisitCount; fishVisitor.text = string.Format("FORDEBUG" + " [{0}/{1}/{2}]", aliveVisitCount, totalVisitCount, amount); } refeshOnce = false; } else { Hide(); } } }
public int CaculateLandFee(Building building, ushort buildingID) { DistrictManager instance = Singleton <DistrictManager> .instance; byte district = instance.GetDistrict(building.m_position); DistrictPolicies.Services servicePolicies = instance.m_districts.m_buffer[district].m_servicePolicies; DistrictPolicies.Taxation taxationPolicies = instance.m_districts.m_buffer[district].m_taxationPolicies; DistrictPolicies.CityPlanning cityPlanningPolicies = instance.m_districts.m_buffer[district].m_cityPlanningPolicies; GetLandRent(building, out int landFee); float taxRate; taxRate = Singleton <EconomyManager> .instance.GetTaxRate(building.Info.m_class, taxationPolicies); if (instance.IsPolicyLoaded(DistrictPolicies.Policies.ExtraInsulation)) { if ((servicePolicies & DistrictPolicies.Services.ExtraInsulation) != DistrictPolicies.Services.None) { taxRate = taxRate * 95 / 100; } } if ((servicePolicies & DistrictPolicies.Services.Recycling) != DistrictPolicies.Services.None) { taxRate = taxRate * 95 / 100; } if (((taxationPolicies & DistrictPolicies.Taxation.DontTaxLeisure) != DistrictPolicies.Taxation.None) && (building.Info.m_class.m_subService == ItemClass.SubService.CommercialLeisure)) { landFee = 0; } if (BuildingData.buildingMoney[buildingID] > 0) { if ((building.Info.m_class.m_service == ItemClass.Service.Commercial) || (building.Info.m_class.m_service == ItemClass.Service.Industrial)) { if (BuildingData.buildingMoney[buildingID] > (taxRate * landFee / 100f)) { return((int)(taxRate * landFee / 100f)); } else { return(0); } } else if (building.Info.m_class.m_service == ItemClass.Service.Office) { Citizen.BehaviourData behaviourData = default; int aliveWorkerCount = 0; int totalWorkerCount = 0; RealCityCommonBuildingAI.InitDelegate(); RealCityCommonBuildingAI.GetWorkBehaviour((OfficeBuildingAI)building.Info.m_buildingAI, buildingID, ref building, ref behaviourData, ref aliveWorkerCount, ref totalWorkerCount); return((int)(totalWorkerCount * taxRate / 10f)); } } return(0); }
public static void Prefix(uint citizenID, ref Citizen data, ref ushort sourceBuilding, ref ushort targetBuilding) { if (data.m_workBuilding != targetBuilding) { var building = Singleton <BuildingManager> .instance.m_buildings.m_buffer[targetBuilding]; if (building.Info.m_class.m_service == ItemClass.Service.Commercial) { CitizenManager instance = Singleton <CitizenManager> .instance; ushort homeBuilding = data.m_homeBuilding; uint citizenUnit = CitizenData.GetCitizenUnit(homeBuilding); uint containingUnit = data.GetContainingUnit((uint)citizenID, citizenUnit, CitizenUnit.Flags.Home); Citizen.BehaviourData behaviour = default; int aliveVisitCount = 0; int totalVisitCount = 0; RealCityCommercialBuildingAI.InitDelegate(); RealCityCommercialBuildingAI.GetVisitBehaviour((CommercialBuildingAI)(building.Info.m_buildingAI), targetBuilding, ref building, ref behaviour, ref aliveVisitCount, ref totalVisitCount); var amount = building.m_customBuffer2 / MainDataStore.maxGoodPurchase - totalVisitCount + aliveVisitCount; var CommercialBuildingAI = building.Info.m_buildingAI as CommercialBuildingAI; var maxCount = CommercialBuildingAI.CalculateVisitplaceCount((ItemClass.Level)building.m_level, new Randomizer(targetBuilding), building.m_width, building.m_length); if ((amount <= 0) || (maxCount <= totalVisitCount)) { //Close CommercialBuilding //Reject citizen to building which lack of goods sourceBuilding = targetBuilding; building.m_flags &= ~Building.Flags.Active; return; } if (data.m_flags.IsFlagSet(Citizen.Flags.Tourist)) { //DebugLog.LogToFileOnly("Find Tourist in HumanAIStartMovingPatch"); } else { //DebugLog.LogToFileOnly("Find Resident in HumanAIStartMovingPatch"); if (CitizenUnitData.familyMoney[containingUnit] < MainDataStore.maxGoodPurchase * RealCityIndustryBuildingAI.GetResourcePrice(TransferManager.TransferReason.Shopping)) { //Reject poor citizen to building if (CitizenUnitData.familyGoods[containingUnit] > 1000) { //If a family is lacking goods very seriously, even they do not have enough money, they can buy goods. //minimumLivingAllowance will cover this expense. sourceBuilding = targetBuilding; return; } } else if (CitizenUnitData.familyGoods[containingUnit] > 2000) { //Reject citizen who already have enough goods to building sourceBuilding = targetBuilding; return; } } } } }
/// <summary> /// Harmony Postfix patch to ZonedBuildingWorldInfoPanel.UpdateBindings to display visitor counts for commercial buildings. /// </summary> public static void Postfix() { // Currently selected building. ushort building = WorldInfoPanel.GetCurrentInstanceID().Building; // Create visit label if it isn't already set up. if (visitLabel == null) { // Get info panel. ZonedBuildingWorldInfoPanel infoPanel = UIView.library.Get <ZonedBuildingWorldInfoPanel>(typeof(ZonedBuildingWorldInfoPanel).Name); // Add current visitor count label. visitLabel = UIControls.AddLabel(infoPanel.component, 65f, 280f, Translations.Translate("RPR_INF_VIS"), textScale: 0.75f); visitLabel.textColor = new Color32(185, 221, 254, 255); visitLabel.font = Resources.FindObjectsOfTypeAll <UIFont>().FirstOrDefault((UIFont f) => f.name == "OpenSans-Regular"); // Position under existing Highly Educated workers count row in line with total workplace count label. UIComponent situationLabel = infoPanel.Find("WorkSituation"); UIComponent workerLabel = infoPanel.Find("HighlyEducatedWorkers"); if (situationLabel != null && workerLabel != null) { visitLabel.absolutePosition = new Vector2(situationLabel.absolutePosition.x, workerLabel.absolutePosition.y + 25f); } else { Logging.Error("couldn't find ZonedBuildingWorldInfoPanel components"); } } // Local references. Building[] buildingBuffer = Singleton <BuildingManager> .instance.m_buildings.m_buffer; BuildingInfo buildingInfo = buildingBuffer[building].Info; // Is this a commercial building? CommercialBuildingAI commercialAI = buildingInfo.GetAI() as CommercialBuildingAI; if (commercialAI == null) { // Not a commercial building - hide the label. visitLabel.Hide(); } else { // Commercial building - show the label. visitLabel.Show(); // Get current visitor count. int aliveCount = 0, totalCount = 0; Citizen.BehaviourData behaviour = new Citizen.BehaviourData(); GetVisitBehaviour(commercialAI, building, ref buildingBuffer[building], ref behaviour, ref aliveCount, ref totalCount); // Display visitor count. visitLabel.text = totalCount.ToString() + " / " + commercialAI.CalculateVisitplaceCount((ItemClass.Level)buildingBuffer[building].m_level, new ColossalFramework.Math.Randomizer(building), buildingBuffer[building].Width, buildingBuffer[building].Length).ToString() + " " + Translations.Translate("RPR_INF_VIS"); } }
public static float GetComsumptionDivider(Building data, ushort buildingID) { Citizen.BehaviourData behaviourData = default; int aliveWorkerCount = 0; int totalWorkerCount = 0; RealCityCommonBuildingAI.GetWorkBehaviour((CommonBuildingAI)data.Info.m_buildingAI, buildingID, ref data, ref behaviourData, ref aliveWorkerCount, ref totalWorkerCount); float comsumptionDivider = aliveWorkerCount / 8f; if (comsumptionDivider < 1f) { comsumptionDivider = 1f; } if (data.Info.m_class.m_service == ItemClass.Service.Industrial) { RealCityIndustrialBuildingAI.InitDelegate(); var incomingTransferReason = RealCityIndustrialBuildingAI.GetIncomingTransferReason((IndustrialBuildingAI)data.Info.m_buildingAI, buildingID); //petrol related if (incomingTransferReason == TransferManager.TransferReason.Petrol) { //*2 / 4 comsumptionDivider /= 2f; } else if (incomingTransferReason == TransferManager.TransferReason.Coal) { //*1.67 / 4 comsumptionDivider /= 2.4f; } else if (incomingTransferReason == TransferManager.TransferReason.Lumber) { //*1.33 / 4 comsumptionDivider /= 3f; } else if (incomingTransferReason == TransferManager.TransferReason.Food) { comsumptionDivider /= 4f; } } return(comsumptionDivider); }
public void GetVisitBehaviour(ushort buildingID, Building buildingData, ref Citizen.BehaviourData behaviour, ref int aliveCount, ref int totalCount) { CitizenManager instance = Singleton <CitizenManager> .instance; uint num = buildingData.m_citizenUnits; int num2 = 0; while (num != 0u) { if ((ushort)(instance.m_units.m_buffer[(int)((UIntPtr)num)].m_flags & CitizenUnit.Flags.Visit) != 0) { instance.m_units.m_buffer[(int)((UIntPtr)num)].GetCitizenVisitBehaviour(ref behaviour, ref aliveCount, ref totalCount); } num = instance.m_units.m_buffer[(int)((UIntPtr)num)].m_nextUnit; if (++num2 > 524288) { CODebugBase <LogChannel> .Error(LogChannel.Core, "Invalid list detected!\n" + Environment.StackTrace); break; } } }
public void GetVisitBehaviour(ref Building building, ref Citizen.BehaviourData behaviour, ref int aliveCount, ref int totalCount) { CitizenManager instance = Singleton <CitizenManager> .instance; uint num = building.m_citizenUnits; int num2 = 0; while (num != 0u) { if (EnumExtensions.IsFlagSet(instance.m_units.m_buffer[num].m_flags, CitizenUnit.Flags.Visit)) { instance.m_units.m_buffer[num].GetCitizenVisitBehaviour(ref behaviour, ref aliveCount, ref totalCount); } num = instance.m_units.m_buffer[num].m_nextUnit; if (++num2 > 524288) { CODebugBase <LogChannel> .Error(LogChannel.Core, "Invalid list detected!\n" + Environment.StackTrace); break; } } }
//commercial building history updates public void UpdateVisitsCount(int buildIndex) { ResilientInfoV1 ri = m_resilients[buildIndex]; CitizenManager instance = Singleton <CitizenManager> .instance; Citizen.BehaviourData behaviour = new Citizen.BehaviourData(); int aliveCount = 0; int totalCount = 0; uint num = Singleton <BuildingManager> .instance.m_buildings.m_buffer[ri.buildingID].m_citizenUnits; int num2 = 0; while (num != 0u) { if ((ushort)(instance.m_units.m_buffer[(int)((UIntPtr)num)].m_flags & CitizenUnit.Flags.Visit) != 0) { instance.m_units.m_buffer[(int)((UIntPtr)num)].GetCitizenVisitBehaviour(ref behaviour, ref aliveCount, ref totalCount); } num = instance.m_units.m_buffer[(int)((UIntPtr)num)].m_nextUnit; if (++num2 > 524288) { CODebugBase <LogChannel> .Error(LogChannel.Core, "Invalid list detected!\n" + Environment.StackTrace); break; } } if (totalCount < ri.currentVisits) //assume some visitors have left { ri.totalVisits += ri.currentVisits - totalCount; } ri.currentVisits = totalCount; m_resilients[buildIndex] = ri; }
public void GetHomeBehaviour(ref Building building, ref Citizen.BehaviourData behaviour, ref int aliveCount, ref int totalCount, ref int COMPANYCount, ref int aliveCOMPANYCount, ref int emptyCOMPANYCount) { CitizenManager instance = Singleton <CitizenManager> .instance; uint num = building.m_citizenUnits; int num2 = 0; while (num != 0u) { if (EnumExtensions.IsFlagSet(instance.m_units.m_buffer[num].m_flags, CitizenUnit.Flags.Home)) { int num3 = 0; int num4 = 0; instance.m_units.m_buffer[num].GetCitizenHomeBehaviour(ref behaviour, ref num3, ref num4); if (num3 != 0) { aliveCOMPANYCount++; aliveCount += num3; } if (num4 != 0) { totalCount += num4; } else { emptyCOMPANYCount++; } COMPANYCount++; } num = instance.m_units.m_buffer[num].m_nextUnit; if (++num2 > 524288) { CODebugBase <LogChannel> .Error(LogChannel.Core, "Invalid list detected!\n" + Environment.StackTrace); break; } } }
public static float CaculateEmployeeOutcome(ushort buildingID, Building building) { float allSalary = 0; Citizen.BehaviourData behaviour = default(Citizen.BehaviourData); int aliveWorkerCount = 0; int totalWorkerCount = 0; RealCityCommonBuildingAI.InitDelegate(); RealCityCommonBuildingAI.GetWorkBehaviour((PlayerBuildingAI)building.Info.m_buildingAI, buildingID, ref building, ref behaviour, ref aliveWorkerCount, ref totalWorkerCount); int budget = Singleton <EconomyManager> .instance.GetBudget(building.Info.m_class); int education0Salary = Math.Max((int)((budget * MainDataStore.govermentEducation0SalaryFixed) / 100), (int)(MainDataStore.govermentSalary * 0.5f)); int education1Salary = Math.Max((int)((budget * MainDataStore.govermentEducation1SalaryFixed) / 100), (int)(MainDataStore.govermentSalary * 0.55f)); int education2Salary = Math.Max((int)((budget * MainDataStore.govermentEducation2SalaryFixed) / 100), (int)(MainDataStore.govermentSalary * 0.65f)); int education3Salary = Math.Max((int)((budget * MainDataStore.govermentEducation3SalaryFixed) / 100), (int)(MainDataStore.govermentSalary * 0.8f)); allSalary += behaviour.m_educated0Count * education0Salary; allSalary += behaviour.m_educated1Count * education1Salary; allSalary += behaviour.m_educated2Count * education2Salary; allSalary += behaviour.m_educated3Count * education3Salary; int allWorkCount = RealCityResidentAI.TotalWorkCount(buildingID, building, true, false); if (totalWorkerCount > allWorkCount) { allWorkCount = RealCityResidentAI.TotalWorkCount(buildingID, building, true, true); } if ((aliveWorkerCount == 0) && (allWorkCount != 0)) { allSalary = education3Salary * allWorkCount; } float outsideWorkerRatio = (totalWorkerCount != 0) ? (allWorkCount / totalWorkerCount) : 1; return(allSalary * outsideWorkerRatio / 16f); }
public static void HandleWorkPlaces(PrivateBuildingAI thisAI, ushort buildingID, ref Building data, int workPlaces0, int workPlaces1, int workPlaces2, int workPlaces3, ref Citizen.BehaviourData behaviour, int aliveWorkerCount, int totalWorkerCount) { Debug.LogWarning("HandleWorkPlaces is not overridden!"); }
public static int HandleWorkers(PrivateBuildingAI thisAI, ushort buildingID, ref Building buildingData, ref Citizen.BehaviourData behaviour, ref int aliveWorkerCount, ref int totalWorkerCount, ref int workPlaceCount) { //Not messed with this code too much yet. Still requires cleaning up. int b = 0; int level0, level1, level2, level3; //Fix for crashing? Modification added for this statement if (thisAI != null) { GetWorkBehaviour(thisAI, buildingID, ref buildingData, ref behaviour, ref aliveWorkerCount, ref totalWorkerCount); thisAI.CalculateWorkplaceCount(new Randomizer((int)buildingID), buildingData.Width, buildingData.Length, out level0, out level1, out level2, out level3); workPlaceCount = level0 + level1 + level2 + level3; if ((int)buildingData.m_fireIntensity == 0) { HandleWorkPlaces(thisAI, buildingID, ref buildingData, level0, level1, level2, level3, ref behaviour, aliveWorkerCount, totalWorkerCount); if (aliveWorkerCount != 0 && workPlaceCount != 0) { int num = (behaviour.m_efficiencyAccumulation + aliveWorkerCount - 1) / aliveWorkerCount; b = 2 * num - 200 * num / ((100 * aliveWorkerCount + workPlaceCount - 1) / workPlaceCount + 100); } } Notification.Problem problems1 = Notification.RemoveProblems(buildingData.m_problems, Notification.Problem.NoWorkers | Notification.Problem.NoEducatedWorkers); int num1 = (level3 * 300 + level2 * 200 + level1 * 100) / (workPlaceCount + 1); int num2 = (behaviour.m_educated3Count * 300 + behaviour.m_educated2Count * 200 + behaviour.m_educated1Count * 100) / (aliveWorkerCount + 1); //Start of modification if (Chances.WorkHour()) { if (aliveWorkerCount < workPlaceCount >> 1) { buildingData.m_workerProblemTimer = (byte)Mathf.Min((int)byte.MaxValue, (int)buildingData.m_workerProblemTimer + 1); if ((int)buildingData.m_workerProblemTimer >= 128) { problems1 = Notification.AddProblems(problems1, Notification.Problem.NoWorkers | Notification.Problem.MajorProblem); } else if ((int)buildingData.m_workerProblemTimer >= 64) { problems1 = Notification.AddProblems(problems1, Notification.Problem.NoWorkers); } } else if (num2 < num1 - 50) { buildingData.m_workerProblemTimer = (byte)Mathf.Min((int)byte.MaxValue, (int)buildingData.m_workerProblemTimer + 1); if ((int)buildingData.m_workerProblemTimer >= 128) { problems1 = Notification.AddProblems(problems1, Notification.Problem.NoEducatedWorkers | Notification.Problem.MajorProblem); } else if ((int)buildingData.m_workerProblemTimer >= 64) { problems1 = Notification.AddProblems(problems1, Notification.Problem.NoEducatedWorkers); } } } //End of modification buildingData.m_problems = problems1; } return(Mathf.Max(1, b)); }
protected override void ProduceGoods(ushort buildingID, ref Building buildingData, ref Building.Frame frameData, int productionRate, ref Citizen.BehaviourData behaviour, int aliveWorkerCount, int totalWorkerCount, int workPlaceCount, int aliveVisitorCount, int totalVisitorCount, int visitPlaceCount) { base.ProduceGoods(buildingID, ref buildingData, ref frameData, productionRate, ref behaviour, aliveWorkerCount, totalWorkerCount, workPlaceCount, aliveVisitorCount, totalVisitorCount, visitPlaceCount); int num = productionRate * this.m_noiseAccumulation / 100; if (num != 0) { Singleton <ImmaterialResourceManager> .instance.AddResource(ImmaterialResourceManager.Resource.NoisePollution, num, buildingData.m_position, this.m_noiseRadius); } base.HandleDead(buildingID, ref buildingData, ref behaviour, totalWorkerCount); TransferManager.TransferReason vehicleReason = this.m_transportInfo.m_vehicleReason; if (vehicleReason != TransferManager.TransferReason.None) { int num2 = (productionRate * this.m_maxVehicleCount + 99) / 100; if (this.m_transportInfo.m_transportType == TransportInfo.TransportType.Taxi) { DistrictManager instance = Singleton <DistrictManager> .instance; byte district = instance.GetDistrict(buildingData.m_position); District[] expr_B4_cp_0_cp_0 = instance.m_districts.m_buffer; byte expr_B4_cp_0_cp_1 = district; expr_B4_cp_0_cp_0 [(int)expr_B4_cp_0_cp_1].m_productionData.m_tempTaxiCapacity = expr_B4_cp_0_cp_0 [(int)expr_B4_cp_0_cp_1].m_productionData.m_tempTaxiCapacity + (uint)num2; } int num3 = 0; int num4 = 0; ushort num5 = 0; VehicleManager instance2 = Singleton <VehicleManager> .instance; ushort num6 = buildingData.m_ownVehicles; int num7 = 0; while (num6 != 0) { if ((TransferManager.TransferReason)instance2.m_vehicles.m_buffer [(int)num6].m_transferType == vehicleReason) { VehicleInfo info = instance2.m_vehicles.m_buffer [(int)num6].Info; int num8; int num9; info.m_vehicleAI.GetSize(num6, ref instance2.m_vehicles.m_buffer [(int)num6], out num8, out num9); num3++; if ((instance2.m_vehicles.m_buffer [(int)num6].m_flags & Vehicle.Flags.GoingBack) != Vehicle.Flags.None) { num4++; } else { if ((instance2.m_vehicles.m_buffer [(int)num6].m_flags & Vehicle.Flags.WaitingTarget) != Vehicle.Flags.None) { num5 = num6; } else { if (instance2.m_vehicles.m_buffer [(int)num6].m_targetBuilding != 0) { num5 = num6; } } } } num6 = instance2.m_vehicles.m_buffer [(int)num6].m_nextOwnVehicle; if (++num7 > 65536) { CODebugBase <LogChannel> .Error(LogChannel.Core, "Invalid list detected!\n" + Environment.StackTrace); break; } } if (this.m_maxVehicleCount < 65536 && num3 - num4 > num2 && num5 != 0) { VehicleInfo info2 = instance2.m_vehicles.m_buffer [(int)num5].Info; info2.m_vehicleAI.SetTarget(num5, ref instance2.m_vehicles.m_buffer [(int)num5], buildingID); } if (num3 < num2) { TransferManager.TransferOffer offer = default(TransferManager.TransferOffer); offer.Priority = 0; offer.Building = buildingID; offer.Position = buildingData.m_position; offer.Amount = Mathf.Min(2, num2 - num3); offer.Active = true; Singleton <TransferManager> .instance.AddOutgoingOffer(vehicleReason, offer); } } }
protected override void ProduceGoods(ushort buildingID, ref Building buildingData, ref Building.Frame frameData, int productionRate, int finalProductionRate, ref Citizen.BehaviourData behaviour, int aliveWorkerCount, int totalWorkerCount, int workPlaceCount, int aliveVisitorCount, int totalVisitorCount, int visitPlaceCount) { base.ProduceGoods(buildingID, ref buildingData, ref frameData, productionRate, finalProductionRate, ref behaviour, aliveWorkerCount, totalWorkerCount, workPlaceCount, aliveVisitorCount, totalVisitorCount, visitPlaceCount); int num = productionRate * m_deathCareAccumulation / 100; if (num != 0) { Singleton <ImmaterialResourceManager> .instance.AddResource(ImmaterialResourceManager.Resource.DeathCare, num, buildingData.m_position, m_deathCareRadius); } if (finalProductionRate != 0) { int num2 = buildingData.m_customBuffer1; int num3 = (m_burialRate * finalProductionRate * 100 + m_corpseCapacity - 1) / m_corpseCapacity; CitizenManager instance = Singleton <CitizenManager> .instance; uint num4 = buildingData.m_citizenUnits; int num5 = 0; int num6 = 0; int num7 = 0; while (num4 != 0) { uint nextUnit = instance.m_units.m_buffer[num4].m_nextUnit; if ((instance.m_units.m_buffer[num4].m_flags & CitizenUnit.Flags.Visit) != 0) { for (int i = 0; i < 5; i++) { uint citizen = instance.m_units.m_buffer[num4].GetCitizen(i); if (citizen != 0) { if (instance.m_citizens.m_buffer[citizen].Dead) { if (instance.m_citizens.m_buffer[citizen].CurrentLocation == Citizen.Location.Visit) { if (Singleton <SimulationManager> .instance.m_randomizer.Int32(10000u) < num3) { instance.ReleaseCitizen(citizen); num7++; num2++; } else { num6++; } } else { num6++; } } else if (instance.m_citizens.m_buffer[citizen].Sick && instance.m_citizens.m_buffer[citizen].CurrentLocation == Citizen.Location.Visit) { instance.m_citizens.m_buffer[citizen].Sick = false; } } } } num4 = nextUnit; if (++num5 > 524288) { CODebugBase <LogChannel> .Error(LogChannel.Core, "Invalid list detected!\n" + Environment.StackTrace); break; } } behaviour.m_deadCount += num6; if (m_graveCount == 0) { for (int j = num7; j < num2; j++) { if (Singleton <SimulationManager> .instance.m_randomizer.Int32(10000u) < num3) { num7++; num2--; } else { num6++; } } } buildingData.m_tempExport = (byte)Mathf.Min(buildingData.m_tempExport + num7, 255); DistrictManager instance2 = Singleton <DistrictManager> .instance; byte district = instance2.GetDistrict(buildingData.m_position); bool flag = IsFull(buildingID, ref buildingData); if (m_graveCount != 0) { num2 = Mathf.Min(num2, m_graveCount); buildingData.m_customBuffer1 = (ushort)num2; instance2.m_districts.m_buffer[district].m_productionData.m_tempDeadAmount += (uint)num2; instance2.m_districts.m_buffer[district].m_productionData.m_tempDeadCapacity += (uint)m_graveCount; } else { buildingData.m_customBuffer1 = (ushort)num2; instance2.m_districts.m_buffer[district].m_productionData.m_tempCremateCapacity += (uint)m_corpseCapacity; } bool flag2 = IsFull(buildingID, ref buildingData); if (flag != flag2) { if (flag2) { if ((object)m_fullPassMilestone != null) { m_fullPassMilestone.Unlock(); } } else if ((object)m_fullPassMilestone != null) { m_fullPassMilestone.Relock(); } } int count = 0; int count2 = 0; int cargo = 0; int capacity = 0; int outside = 0; CalculateOwnVehicles(buildingID, ref buildingData, TransferManager.TransferReason.Dead, ref count, ref cargo, ref capacity, ref outside); CalculateGuestVehicles(buildingID, ref buildingData, TransferManager.TransferReason.DeadMove, ref count2, ref cargo, ref capacity, ref outside); int num8 = m_corpseCapacity - num6 - capacity; int num9 = (finalProductionRate * m_hearseCount + 99) / 100; if ((buildingData.m_flags & Building.Flags.Downgrading) != 0) { if (m_graveCount != 0) { int count3 = 0; int cargo2 = 0; int capacity2 = 0; int outside2 = 0; CalculateOwnVehicles(buildingID, ref buildingData, TransferManager.TransferReason.DeadMove, ref count3, ref cargo2, ref capacity2, ref outside2); if (num2 > 0 && count3 < num9) { TransferManager.TransferOffer offer = default(TransferManager.TransferOffer); offer.Priority = 7; offer.Building = buildingID; offer.Position = buildingData.m_position; offer.Amount = 1; offer.Active = true; Singleton <TransferManager> .instance.AddOutgoingOffer(TransferManager.TransferReason.DeadMove, offer); } } } else if (m_graveCount != 0) { num8 = Mathf.Min(num8, m_graveCount - num2 - num6 - capacity + 9); int num10 = num8 / 10; if (count != 0) { num10--; } bool flag4 = num10 >= 1 && count < num9 && (num10 > 1); if (flag4) { TransferManager.TransferOffer offer3 = default(TransferManager.TransferOffer); offer3.Priority = 2 - count; offer3.Building = buildingID; offer3.Position = buildingData.m_position; offer3.Amount = 1; offer3.Active = true; Singleton <TransferManager> .instance.AddIncomingOffer(TransferManager.TransferReason.Dead, offer3); } if (buildingData.m_customBuffer1 > (m_corpseCapacity * 2 / 3)) { TransferManager.TransferOffer offer = default(TransferManager.TransferOffer); offer.Priority = 0; offer.Building = buildingID; offer.Position = buildingData.m_position; offer.Amount = 1; offer.Active = true; Singleton <TransferManager> .instance.AddOutgoingOffer(TransferManager.TransferReason.DeadMove, offer); } } else { int num11 = num8 / 10; bool flag5 = num11 >= 1 && (num11 > 1 || count >= num9 || Singleton <SimulationManager> .instance.m_randomizer.Int32(2u) == 0); bool flag6 = num11 >= 1 && count < num9 && (num11 > 1 || !flag5); if (flag5) { TransferManager.TransferOffer offer4 = default(TransferManager.TransferOffer); offer4.Priority = Mathf.Max(1, num8 * 6 / m_corpseCapacity); offer4.Building = buildingID; offer4.Position = buildingData.m_position; offer4.Amount = Mathf.Max(1, num11 - 1); offer4.Active = false; Singleton <TransferManager> .instance.AddIncomingOffer(TransferManager.TransferReason.DeadMove, offer4); } if (flag6) { TransferManager.TransferOffer offer5 = default(TransferManager.TransferOffer); offer5.Priority = 2 - count; offer5.Building = buildingID; offer5.Position = buildingData.m_position; offer5.Amount = 1; offer5.Active = true; Singleton <TransferManager> .instance.AddIncomingOffer(TransferManager.TransferReason.Dead, offer5); } } } }
protected override void ProduceGoods(ushort buildingID, ref Building buildingData, ref Building.Frame frameData, int productionRate, int finalProductionRate, ref Citizen.BehaviourData behaviour, int aliveWorkerCount, int totalWorkerCount, int workPlaceCount, int aliveVisitorCount, int totalVisitorCount, int visitPlaceCount) { base.ProduceGoods(buildingID, ref buildingData, ref frameData, productionRate, finalProductionRate, ref behaviour, aliveWorkerCount, totalWorkerCount, workPlaceCount, aliveVisitorCount, totalVisitorCount, visitPlaceCount); }
protected override void ProduceGoods(ushort buildingID, ref Building buildingData, ref Building.Frame frameData, int productionRate, int finalProductionRate, ref Citizen.BehaviourData behaviour, int aliveWorkerCount, int totalWorkerCount, int workPlaceCount, int aliveVisitorCount, int totalVisitorCount, int visitPlaceCount) { DistrictManager instance = Singleton <DistrictManager> .instance; byte district = instance.GetDistrict(buildingData.m_position); byte b = instance.GetPark(buildingData.m_position); if (b != 0) { if (!instance.m_parks.m_buffer[(int)b].IsIndustry) { b = 0; } else if (this.m_industryType == DistrictPark.ParkType.Industry || this.m_industryType != instance.m_parks.m_buffer[(int)b].m_parkType) { b = 0; } } float num = (float)buildingData.Width * -4f; float num2 = (float)buildingData.Width * 4f; float num3 = (float)buildingData.Length * -4f; float num4 = (float)buildingData.Length * 4f; if (this.m_info.m_subBuildings != null) { for (int i = 0; i < this.m_info.m_subBuildings.Length; i++) { if (this.m_info.m_subBuildings[i].m_buildingInfo != null) { float num5 = (float)this.m_info.m_subBuildings[i].m_buildingInfo.m_cellWidth; float num6 = (float)this.m_info.m_subBuildings[i].m_buildingInfo.m_cellLength; float x = this.m_info.m_subBuildings[i].m_position.x; float num7 = -this.m_info.m_subBuildings[i].m_position.z; num = Mathf.Min(num, x - num5 * 4f); num2 = Mathf.Max(num2, x + num5 * 4f); num3 = Mathf.Min(num3, num7 - num6 * 4f); num4 = Mathf.Max(num4, num7 + num6 * 4f); } } } float angle = buildingData.m_angle; float num8 = -(num + num2) * 0.5f; float num9 = -(num3 + num4) * 0.5f; float num10 = Mathf.Sin(angle); float num11 = Mathf.Cos(angle); Vector3 position = buildingData.m_position - new Vector3(num11 * num8 + num10 * num9, 0f, num10 * num8 - num11 * num9); Notification.Problem problem = Notification.RemoveProblems(buildingData.m_problems, Notification.Problem.NoResources | Notification.Problem.NoPlaceforGoods | Notification.Problem.NoInputProducts | Notification.Problem.NoFishingGoods); bool flag = this.m_info.m_class.m_service == ItemClass.Service.Fishing; DistrictPolicies.Park parkPolicies = instance.m_parks.m_buffer[(int)b].m_parkPolicies; DistrictPark[] buffer = instance.m_parks.m_buffer; byte b2 = b; buffer[(int)b2].m_parkPoliciesEffect = (buffer[(int)b2].m_parkPoliciesEffect | (parkPolicies & (DistrictPolicies.Park.ImprovedLogistics | DistrictPolicies.Park.WorkSafety | DistrictPolicies.Park.AdvancedAutomation))); if ((parkPolicies & DistrictPolicies.Park.ImprovedLogistics) != DistrictPolicies.Park.None) { int num12 = this.GetMaintenanceCost() / 100; num12 = finalProductionRate * num12 / 1000; if (num12 != 0) { Singleton <EconomyManager> .instance.FetchResource(EconomyManager.Resource.Maintenance, num12, this.m_info.m_class); } } int num13 = this.m_outputRate; if ((parkPolicies & DistrictPolicies.Park.AdvancedAutomation) != DistrictPolicies.Park.None) { num13 = (num13 * 110 + 50) / 100; int num14 = this.GetMaintenanceCost() / 100; num14 = finalProductionRate * num14 / 1000; if (num14 != 0) { Singleton <EconomyManager> .instance.FetchResource(EconomyManager.Resource.Maintenance, num14, this.m_info.m_class); } } if ((parkPolicies & DistrictPolicies.Park.WorkSafety) != DistrictPolicies.Park.None) { int num15 = (aliveWorkerCount + (int)(Singleton <SimulationManager> .instance.m_currentFrameIndex >> 8 & 15U)) / 16; if (num15 != 0) { Singleton <EconomyManager> .instance.FetchResource(EconomyManager.Resource.PolicyCost, num15, this.m_info.m_class); } } if (finalProductionRate != 0) { int num16 = this.m_pollutionAccumulation; if (b != 0) { int num17; int num18; instance.m_parks.m_buffer[(int)b].GetProductionFactors(out num17, out num18); finalProductionRate = (finalProductionRate * num17 + 50) / 100; num16 = (num16 * num18 + 50) / 100; } else if (this.m_industryType != DistrictPark.ParkType.Industry) { finalProductionRate = 0; } int num19 = 0; int num20 = 0; if (this.m_inputResource1 != TransferManager.TransferReason.None) { num19 = this.GetInputBufferSize1(parkPolicies, (int)instance.m_parks.m_buffer[(int)b].m_finalStorageDelta); num20 = (int)buildingData.m_customBuffer2; int num21 = (this.m_inputRate1 * finalProductionRate + 99) / 100; if (num20 < num21) { finalProductionRate = (num20 * 100 + this.m_inputRate1 - 1) / this.m_inputRate1; problem = Notification.AddProblems(problem, (!flag) ? ((!this.IsRawMaterial(this.m_inputResource1)) ? Notification.Problem.NoInputProducts : Notification.Problem.NoResources) : Notification.Problem.NoFishingGoods); } } int num22 = 0; int num23 = 0; if (this.m_inputResource2 != TransferManager.TransferReason.None) { num22 = this.GetInputBufferSize2(parkPolicies, (int)instance.m_parks.m_buffer[(int)b].m_finalStorageDelta); num23 = ((int)buildingData.m_teens << 8 | (int)buildingData.m_youngs); int num24 = (this.m_inputRate2 * finalProductionRate + 99) / 100; if (num23 < num24) { finalProductionRate = (num23 * 100 + this.m_inputRate2 - 1) / this.m_inputRate2; problem = Notification.AddProblems(problem, (!flag) ? ((!this.IsRawMaterial(this.m_inputResource2)) ? Notification.Problem.NoInputProducts : Notification.Problem.NoResources) : Notification.Problem.NoFishingGoods); } } int num25 = 0; int num26 = 0; if (this.m_inputResource3 != TransferManager.TransferReason.None) { num25 = this.GetInputBufferSize3(parkPolicies, (int)instance.m_parks.m_buffer[(int)b].m_finalStorageDelta); num26 = ((int)buildingData.m_adults << 8 | (int)buildingData.m_seniors); int num27 = (this.m_inputRate3 * finalProductionRate + 99) / 100; if (num26 < num27) { finalProductionRate = (num26 * 100 + this.m_inputRate3 - 1) / this.m_inputRate3; problem = Notification.AddProblems(problem, (!flag) ? ((!this.IsRawMaterial(this.m_inputResource3)) ? Notification.Problem.NoInputProducts : Notification.Problem.NoResources) : Notification.Problem.NoFishingGoods); } } int num28 = 0; int num29 = 0; if (this.m_inputResource4 != TransferManager.TransferReason.None) { num28 = this.GetInputBufferSize4(parkPolicies, (int)instance.m_parks.m_buffer[(int)b].m_finalStorageDelta); num29 = ((int)buildingData.m_education1 << 8 | (int)buildingData.m_education2); int num30 = (this.m_inputRate4 * finalProductionRate + 99) / 100; if (num29 < num30) { finalProductionRate = (num29 * 100 + this.m_inputRate4 - 1) / this.m_inputRate4; problem = Notification.AddProblems(problem, (!flag) ? ((!this.IsRawMaterial(this.m_inputResource4)) ? Notification.Problem.NoInputProducts : Notification.Problem.NoResources) : Notification.Problem.NoFishingGoods); } } int num31 = 0; int num32 = 0; if (this.m_outputResource != TransferManager.TransferReason.None) { num31 = this.GetOutputBufferSize(parkPolicies, (int)instance.m_parks.m_buffer[(int)b].m_finalStorageDelta); num32 = (int)buildingData.m_customBuffer1; int num33 = (num13 * finalProductionRate + 99) / 100; if (num31 - num32 < num33) { num33 = Mathf.Max(0, num31 - num32); finalProductionRate = (num33 * 100 + num13 - 1) / num13; if (this.m_outputVehicleCount != 0) { problem = Notification.AddProblems(problem, Notification.Problem.NoPlaceforGoods); if (this.m_info.m_class.m_service == ItemClass.Service.PlayerIndustry) { GuideController properties = Singleton <GuideManager> .instance.m_properties; if (properties != null) { Singleton <BuildingManager> .instance.m_warehouseNeeded.Activate(properties.m_warehouseNeeded, buildingID); } } } } } if (this.m_inputResource1 != TransferManager.TransferReason.None) { int num34 = (this.m_inputRate1 * finalProductionRate + 99) / 100; num20 = Mathf.Max(0, num20 - num34); buildingData.m_customBuffer2 = (ushort)num20; instance.m_parks.m_buffer[(int)b].AddConsumptionAmount(this.m_inputResource1, num34); } if (this.m_inputResource2 != TransferManager.TransferReason.None) { int num35 = (this.m_inputRate2 * finalProductionRate + 99) / 100; num23 = Mathf.Max(0, num23 - num35); buildingData.m_youngs = (byte)(num23 & 255); buildingData.m_teens = (byte)(num23 >> 8); instance.m_parks.m_buffer[(int)b].AddConsumptionAmount(this.m_inputResource2, num35); } if (this.m_inputResource3 != TransferManager.TransferReason.None) { int num36 = (this.m_inputRate3 * finalProductionRate + 99) / 100; num26 = Mathf.Max(0, num26 - num36); buildingData.m_seniors = (byte)(num26 & 255); buildingData.m_adults = (byte)(num26 >> 8); instance.m_parks.m_buffer[(int)b].AddConsumptionAmount(this.m_inputResource3, num36); } if (this.m_inputResource4 != TransferManager.TransferReason.None) { int num37 = (this.m_inputRate4 * finalProductionRate + 99) / 100; num29 = Mathf.Max(0, num29 - num37); buildingData.m_education2 = (byte)(num29 & 255); buildingData.m_education1 = (byte)(num29 >> 8); instance.m_parks.m_buffer[(int)b].AddConsumptionAmount(this.m_inputResource4, num37); } if (this.m_outputResource != TransferManager.TransferReason.None) { int num38 = (num13 * finalProductionRate + 99) / 100; num32 = Mathf.Min(num31, num32 + num38); buildingData.m_customBuffer1 = (ushort)num32; instance.m_parks.m_buffer[(int)b].AddProductionAmountFish(this.m_outputResource, num38); } num16 = (finalProductionRate * num16 + 50) / 100; if (num16 != 0) { num16 = UniqueFacultyAI.DecreaseByBonus(UniqueFacultyAI.FacultyBonus.Science, num16); Singleton <NaturalResourceManager> .instance.TryDumpResource(NaturalResourceManager.Resource.Pollution, num16, num16, position, this.m_pollutionRadius); } base.HandleDead2(buildingID, ref buildingData, ref behaviour, totalWorkerCount); if (b != 0 || this.m_industryType == DistrictPark.ParkType.Industry) { int num39 = 0; if (this.m_inputResource1 != TransferManager.TransferReason.None) { int num40 = 0; int num41 = 0; int num42 = 0; int num43 = 0; base.CalculateGuestVehicles(buildingID, ref buildingData, this.m_inputResource1, ref num40, ref num41, ref num42, ref num43); if (num43 != 0) { num39 |= 1; } int num44 = num19 - num20 - num41; if (num44 >= 8000) { TransferManager.TransferOffer offer = default(TransferManager.TransferOffer); offer.Priority = Mathf.Max(1, num44 * 8 / num19); offer.Building = buildingID; offer.Position = buildingData.m_position; offer.Amount = 1; offer.Active = false; Singleton <TransferManager> .instance.AddIncomingOffer(this.m_inputResource1, offer); } instance.m_parks.m_buffer[(int)b].AddBufferStatus(this.m_inputResource1, num20, num41, num19); } if (this.m_inputResource2 != TransferManager.TransferReason.None) { int num45 = 0; int num46 = 0; int num47 = 0; int num48 = 0; base.CalculateGuestVehicles(buildingID, ref buildingData, this.m_inputResource2, ref num45, ref num46, ref num47, ref num48); if (num48 != 0) { num39 |= 2; } int num49 = num22 - num23 - num46; if (num49 >= 8000) { TransferManager.TransferOffer offer2 = default(TransferManager.TransferOffer); offer2.Priority = Mathf.Max(1, num49 * 8 / num22); offer2.Building = buildingID; offer2.Position = buildingData.m_position; offer2.Amount = 1; offer2.Active = false; Singleton <TransferManager> .instance.AddIncomingOffer(this.m_inputResource2, offer2); } instance.m_parks.m_buffer[(int)b].AddBufferStatus(this.m_inputResource2, num23, num46, num22); } if (this.m_inputResource3 != TransferManager.TransferReason.None) { int num50 = 0; int num51 = 0; int num52 = 0; int num53 = 0; base.CalculateGuestVehicles(buildingID, ref buildingData, this.m_inputResource3, ref num50, ref num51, ref num52, ref num53); if (num53 != 0) { num39 |= 4; } int num54 = num25 - num26 - num51; if (num54 >= 8000) { TransferManager.TransferOffer offer3 = default(TransferManager.TransferOffer); offer3.Priority = Mathf.Max(1, num54 * 8 / num25); offer3.Building = buildingID; offer3.Position = buildingData.m_position; offer3.Amount = 1; offer3.Active = false; Singleton <TransferManager> .instance.AddIncomingOffer(this.m_inputResource3, offer3); } instance.m_parks.m_buffer[(int)b].AddBufferStatus(this.m_inputResource3, num26, num51, num25); } if (this.m_inputResource4 != TransferManager.TransferReason.None) { int num55 = 0; int num56 = 0; int num57 = 0; int num58 = 0; base.CalculateGuestVehicles(buildingID, ref buildingData, this.m_inputResource4, ref num55, ref num56, ref num57, ref num58); if (num58 != 0) { num39 |= 8; } int num59 = num28 - num29 - num56; if (num59 >= 8000) { TransferManager.TransferOffer offer4 = default(TransferManager.TransferOffer); offer4.Priority = Mathf.Max(1, num59 * 8 / num28); offer4.Building = buildingID; offer4.Position = buildingData.m_position; offer4.Amount = 1; offer4.Active = false; Singleton <TransferManager> .instance.AddIncomingOffer(this.m_inputResource4, offer4); } instance.m_parks.m_buffer[(int)b].AddBufferStatus(this.m_inputResource4, num29, num56, num28); } buildingData.m_tempImport |= (byte)num39; if (this.m_outputResource != TransferManager.TransferReason.None) { if (this.m_outputVehicleCount == 0) { if (num32 == num31) { int num60 = (num32 * IndustryBuildingAI.GetResourcePrice(this.m_outputResource, ItemClass.Service.None) + 50) / 100; if ((instance.m_districts.m_buffer[(int)district].m_cityPlanningPolicies & DistrictPolicies.CityPlanning.SustainableFishing) != DistrictPolicies.CityPlanning.None) { num60 = (num60 * 105 + 99) / 100; } num60 = UniqueFacultyAI.IncreaseByBonus(UniqueFacultyAI.FacultyBonus.Science, num60); Singleton <EconomyManager> .instance.AddResource(EconomyManager.Resource.ResourcePrice, num60, this.m_info.m_class); if (b != 0) { instance.m_parks.m_buffer[(int)b].AddExportAmountFish(this.m_outputResource, num32); } num32 = 0; buildingData.m_customBuffer1 = (ushort)num32; buildingData.m_tempExport = byte.MaxValue; } } else { int num61 = 0; int num62 = 0; int num63 = 0; int value = 0; base.CalculateOwnVehicles(buildingID, ref buildingData, this.m_outputResource, ref num61, ref num62, ref num63, ref value); buildingData.m_tempExport = (byte)Mathf.Clamp(value, (int)buildingData.m_tempExport, 255); int budget = Singleton <EconomyManager> .instance.GetBudget(this.m_info.m_class); int productionRate2 = PlayerBuildingAI.GetProductionRate(100, budget); int num64 = (productionRate2 * this.m_outputVehicleCount + 99) / 100; int num65 = num32; if (num65 >= 8000 && num61 < num64) { TransferManager.TransferOffer offer5 = default(TransferManager.TransferOffer); offer5.Priority = Mathf.Max(1, num65 * 8 / num31); offer5.Building = buildingID; offer5.Position = buildingData.m_position; offer5.Amount = 1; offer5.Active = true; Singleton <TransferManager> .instance.AddOutgoingOffer(this.m_outputResource, offer5); } } instance.m_parks.m_buffer[(int)b].AddBufferStatusFish(this.m_outputResource, num32, 0, num31); } } if (buildingData.m_finalImport != 0) { District[] buffer2 = instance.m_districts.m_buffer; byte b3 = district; buffer2[(int)b3].m_playerConsumption.m_finalImportAmount = buffer2[(int)b3].m_playerConsumption.m_finalImportAmount + (uint)buildingData.m_finalImport; } if (buildingData.m_finalExport != 0) { District[] buffer3 = instance.m_districts.m_buffer; byte b4 = district; buffer3[(int)b4].m_playerConsumption.m_finalExportAmount = buffer3[(int)b4].m_playerConsumption.m_finalExportAmount + (uint)buildingData.m_finalExport; } int num66 = finalProductionRate * this.m_noiseAccumulation / 100; if (num66 != 0) { Singleton <ImmaterialResourceManager> .instance.AddResource(ImmaterialResourceManager.Resource.NoisePollution, num66, position, this.m_noiseRadius); } } buildingData.m_problems = problem; buildingData.m_education3 = (byte)Mathf.Clamp(finalProductionRate * num13 / Mathf.Max(1, this.m_outputRate), 0, 255); buildingData.m_health = (byte)Mathf.Clamp(finalProductionRate, 0, 255); if (b != 0) { instance.m_parks.m_buffer[(int)b].AddWorkers(aliveWorkerCount); } else if (this.m_industryType != DistrictPark.ParkType.Industry) { GuideController properties2 = Singleton <GuideManager> .instance.m_properties; if (properties2 != null) { Singleton <BuildingManager> .instance.m_industryBuildingOutsideIndustryArea.Activate(properties2.m_industryBuildingOutsideIndustryArea, buildingID); } } base.ProduceGoods(buildingID, ref buildingData, ref frameData, productionRate, finalProductionRate, ref behaviour, aliveWorkerCount, totalWorkerCount, workPlaceCount, aliveVisitorCount, totalVisitorCount, visitPlaceCount); }
public static void LimitCommericalBuildingAccess(ushort buildingID, ref Building buildingData) { if (buildingData.Info.m_class.m_service == ItemClass.Service.Commercial) { Citizen.BehaviourData behaviour = default; int aliveVisitCount = 0; int totalVisitCount = 0; RealCityCommercialBuildingAI.InitDelegate(); RealCityCommercialBuildingAI.GetVisitBehaviour((CommercialBuildingAI)buildingData.Info.m_buildingAI, buildingID, ref buildingData, ref behaviour, ref aliveVisitCount, ref totalVisitCount); var amount = buildingData.m_customBuffer2 / MainDataStore.maxGoodPurchase - totalVisitCount + aliveVisitCount; var AI = buildingData.Info.m_buildingAI as CommercialBuildingAI; var maxcount = AI.CalculateVisitplaceCount((ItemClass.Level)buildingData.m_level, new Randomizer(buildingID), buildingData.m_width, buildingData.m_length); if ((amount <= 0) || (maxcount <= totalVisitCount)) { buildingData.m_flags &= ~Building.Flags.Active; } if (RealCityEconomyExtension.Can16timesUpdate(buildingID)) { //Remove citizen which already have goods CitizenManager instance = Singleton <CitizenManager> .instance; uint num = buildingData.m_citizenUnits; int num2 = 0; while (num != 0u) { if ((ushort)(instance.m_units.m_buffer[(int)((UIntPtr)num)].m_flags & CitizenUnit.Flags.Visit) != 0) { var citizenID = instance.m_units.m_buffer[(int)((UIntPtr)num)].m_citizen0; if (citizenID != 0u) { ushort homeBuilding = instance.m_citizens.m_buffer[citizenID].m_homeBuilding; uint citizenUnit = CitizenData.GetCitizenUnit(homeBuilding); uint containingUnit = instance.m_citizens.m_buffer[citizenID].GetContainingUnit((uint)citizenID, citizenUnit, CitizenUnit.Flags.Home); if (CitizenUnitData.familyGoods[containingUnit] > 2000) { if (!instance.m_citizens.m_buffer[citizenID].m_flags.IsFlagSet(Citizen.Flags.Tourist)) { BuildingManager instance1 = Singleton <BuildingManager> .instance; instance.m_citizens.m_buffer[citizenID].RemoveFromUnits(citizenID, instance1.m_buildings.m_buffer[buildingID].m_citizenUnits, CitizenUnit.Flags.Visit); return; } } } citizenID = instance.m_units.m_buffer[(int)((UIntPtr)num)].m_citizen1; if (citizenID != 0u) { ushort homeBuilding = instance.m_citizens.m_buffer[citizenID].m_homeBuilding; uint citizenUnit = CitizenData.GetCitizenUnit(homeBuilding); uint containingUnit = instance.m_citizens.m_buffer[citizenID].GetContainingUnit((uint)citizenID, citizenUnit, CitizenUnit.Flags.Home); if (CitizenUnitData.familyGoods[containingUnit] > 2000) { if (!instance.m_citizens.m_buffer[citizenID].m_flags.IsFlagSet(Citizen.Flags.Tourist)) { BuildingManager instance1 = Singleton <BuildingManager> .instance; instance.m_citizens.m_buffer[citizenID].RemoveFromUnits(citizenID, instance1.m_buildings.m_buffer[buildingID].m_citizenUnits, CitizenUnit.Flags.Visit); return; } } } citizenID = instance.m_units.m_buffer[(int)((UIntPtr)num)].m_citizen2; if (citizenID != 0u) { ushort homeBuilding = instance.m_citizens.m_buffer[citizenID].m_homeBuilding; uint citizenUnit = CitizenData.GetCitizenUnit(homeBuilding); uint containingUnit = instance.m_citizens.m_buffer[citizenID].GetContainingUnit((uint)citizenID, citizenUnit, CitizenUnit.Flags.Home); if (CitizenUnitData.familyGoods[containingUnit] > 2000) { if (!instance.m_citizens.m_buffer[citizenID].m_flags.IsFlagSet(Citizen.Flags.Tourist)) { BuildingManager instance1 = Singleton <BuildingManager> .instance; instance.m_citizens.m_buffer[citizenID].RemoveFromUnits(citizenID, instance1.m_buildings.m_buffer[buildingID].m_citizenUnits, CitizenUnit.Flags.Visit); return; } } } citizenID = instance.m_units.m_buffer[(int)((UIntPtr)num)].m_citizen3; if (citizenID != 0u) { ushort homeBuilding = instance.m_citizens.m_buffer[citizenID].m_homeBuilding; uint citizenUnit = CitizenData.GetCitizenUnit(homeBuilding); uint containingUnit = instance.m_citizens.m_buffer[citizenID].GetContainingUnit((uint)citizenID, citizenUnit, CitizenUnit.Flags.Home); if (CitizenUnitData.familyGoods[containingUnit] > 2000) { if (!instance.m_citizens.m_buffer[citizenID].m_flags.IsFlagSet(Citizen.Flags.Tourist)) { BuildingManager instance1 = Singleton <BuildingManager> .instance; instance.m_citizens.m_buffer[citizenID].RemoveFromUnits(citizenID, instance1.m_buildings.m_buffer[buildingID].m_citizenUnits, CitizenUnit.Flags.Visit); return; } } } citizenID = instance.m_units.m_buffer[(int)((UIntPtr)num)].m_citizen4; if (citizenID != 0u) { ushort homeBuilding = instance.m_citizens.m_buffer[citizenID].m_homeBuilding; uint citizenUnit = CitizenData.GetCitizenUnit(homeBuilding); uint containingUnit = instance.m_citizens.m_buffer[citizenID].GetContainingUnit((uint)citizenID, citizenUnit, CitizenUnit.Flags.Home); if (CitizenUnitData.familyGoods[containingUnit] > 2000) { if (!instance.m_citizens.m_buffer[citizenID].m_flags.IsFlagSet(Citizen.Flags.Tourist)) { BuildingManager instance1 = Singleton <BuildingManager> .instance; instance.m_citizens.m_buffer[citizenID].RemoveFromUnits(citizenID, instance1.m_buildings.m_buffer[buildingID].m_citizenUnits, CitizenUnit.Flags.Visit); return; } } } } num = instance.m_units.m_buffer[(int)((UIntPtr)num)].m_nextUnit; if (++num2 > 524288) { CODebugBase <LogChannel> .Error(LogChannel.Core, "Invalid list detected!\n" + Environment.StackTrace); break; } } } } }
public static void SimulationStepActive(CommercialBuildingAI thisAI, ushort buildingID, ref Building buildingData, ref Building.Frame frameData) { //This is a mess because I pulled it directly from the decompiled code and patched it up slightly. //It works though, and that's all I'm bothered about for now. if (thisAI) { DistrictManager instance1 = Singleton<DistrictManager>.instance; byte district = instance1.GetDistrict(buildingData.m_position); DistrictPolicies.Services policies = instance1.m_districts.m_buffer[(int)district].m_servicePolicies; DistrictPolicies.Taxation taxationPolicies = instance1.m_districts.m_buffer[(int)district].m_taxationPolicies; DistrictPolicies.CityPlanning cityPlanningPolicies = instance1.m_districts.m_buffer[(int)district].m_cityPlanningPolicies; instance1.m_districts.m_buffer[(int)district].m_servicePoliciesEffect |= policies & (DistrictPolicies.Services.PowerSaving | DistrictPolicies.Services.WaterSaving | DistrictPolicies.Services.SmokeDetectors | DistrictPolicies.Services.Recycling | DistrictPolicies.Services.RecreationalUse); switch (thisAI.m_info.m_class.m_subService) { case ItemClass.SubService.CommercialLow: if ((taxationPolicies & (DistrictPolicies.Taxation.TaxRaiseComLow | DistrictPolicies.Taxation.TaxLowerComLow)) != (DistrictPolicies.Taxation.TaxRaiseComLow | DistrictPolicies.Taxation.TaxLowerComLow)) instance1.m_districts.m_buffer[(int)district].m_taxationPoliciesEffect |= taxationPolicies & (DistrictPolicies.Taxation.TaxRaiseComLow | DistrictPolicies.Taxation.TaxLowerComLow); instance1.m_districts.m_buffer[(int)district].m_cityPlanningPoliciesEffect |= cityPlanningPolicies & DistrictPolicies.CityPlanning.SmallBusiness; break; case ItemClass.SubService.CommercialHigh: if ((taxationPolicies & (DistrictPolicies.Taxation.TaxRaiseComHigh | DistrictPolicies.Taxation.TaxLowerComHigh)) != (DistrictPolicies.Taxation.TaxRaiseComHigh | DistrictPolicies.Taxation.TaxLowerComHigh)) instance1.m_districts.m_buffer[(int)district].m_taxationPoliciesEffect |= taxationPolicies & (DistrictPolicies.Taxation.TaxRaiseComHigh | DistrictPolicies.Taxation.TaxLowerComHigh); instance1.m_districts.m_buffer[(int)district].m_cityPlanningPoliciesEffect |= cityPlanningPolicies & DistrictPolicies.CityPlanning.BigBusiness; break; case ItemClass.SubService.CommercialLeisure: instance1.m_districts.m_buffer[(int)district].m_taxationPoliciesEffect |= taxationPolicies & DistrictPolicies.Taxation.DontTaxLeisure; instance1.m_districts.m_buffer[(int)district].m_cityPlanningPoliciesEffect |= cityPlanningPolicies & DistrictPolicies.CityPlanning.NoLoudNoises; break; } Citizen.BehaviourData behaviour = new Citizen.BehaviourData(); int aliveWorkerCount = 0; int totalWorkerCount = 0; int workPlaceCount = 0; int workers = NewPrivateBuildingAI.HandleWorkers(thisAI, buildingID, ref buildingData, ref behaviour, ref aliveWorkerCount, ref totalWorkerCount, ref workPlaceCount); int width = buildingData.Width; int length = buildingData.Length; int maxIncomingLoadSize = MaxIncomingLoadSize(thisAI); int aliveCount = 0; int totalCount = 0; GetVisitBehaviour(thisAI, buildingID, ref buildingData, ref behaviour, ref aliveCount, ref totalCount); int visitCount = thisAI.CalculateVisitplaceCount(new Randomizer((int)buildingID), width, length); int num3 = Mathf.Max(0, visitCount - totalCount); int a1 = visitCount * 500; int num4 = Mathf.Max(a1, maxIncomingLoadSize * 4); TransferManager.TransferReason incomingTransferReason = GetIncomingTransferReason(thisAI); TransferManager.TransferReason outgoingTransferReason = GetOutgoingTransferReason(thisAI, buildingID); if (workers != 0) { int num5 = num4; if (incomingTransferReason != TransferManager.TransferReason.None) num5 = Mathf.Min(num5, (int)buildingData.m_customBuffer1); if (outgoingTransferReason != TransferManager.TransferReason.None) num5 = Mathf.Min(num5, num4 - (int)buildingData.m_customBuffer2); int num6 = Mathf.Max(0, Mathf.Min(workers, (num5 * 200 + num4 - 1) / num4)); int a2 = (visitCount * num6 + 9) / 10; if (Singleton<SimulationManager>.instance.m_isNightTime) a2 = a2 + 1 >> 1; int num7 = Mathf.Max(0, Mathf.Min(a2, num5)); if (incomingTransferReason != TransferManager.TransferReason.None) buildingData.m_customBuffer1 -= (ushort)num7; if (outgoingTransferReason != TransferManager.TransferReason.None) buildingData.m_customBuffer2 += (ushort)num7; workers = (num7 + 9) / 10; } int electricityConsumption; int waterConsumption; int sewageAccumulation; int garbageAccumulation; int incomeAccumulation; thisAI.GetConsumptionRates(new Randomizer((int)buildingID), workers, out electricityConsumption, out waterConsumption, out sewageAccumulation, out garbageAccumulation, out incomeAccumulation); if (garbageAccumulation != 0 && (policies & DistrictPolicies.Services.Recycling) != DistrictPolicies.Services.None) { garbageAccumulation = Mathf.Max(1, garbageAccumulation * 85 / 100); incomeAccumulation = incomeAccumulation * 95 / 100; } int taxRate; switch (thisAI.m_info.m_class.m_subService) { case ItemClass.SubService.CommercialLeisure: taxRate = (buildingData.m_flags & Building.Flags.HighDensity) == Building.Flags.None ? Singleton<EconomyManager>.instance.GetTaxRate(ItemClass.Service.Commercial, ItemClass.SubService.CommercialLow, thisAI.m_info.m_class.m_level, taxationPolicies) : Singleton<EconomyManager>.instance.GetTaxRate(ItemClass.Service.Commercial, ItemClass.SubService.CommercialHigh, thisAI.m_info.m_class.m_level, taxationPolicies); if ((taxationPolicies & DistrictPolicies.Taxation.DontTaxLeisure) != DistrictPolicies.Taxation.None) taxRate = 0; if ((cityPlanningPolicies & DistrictPolicies.CityPlanning.NoLoudNoises) != DistrictPolicies.CityPlanning.None && Singleton<SimulationManager>.instance.m_isNightTime) { electricityConsumption = electricityConsumption + 1 >> 1; waterConsumption = waterConsumption + 1 >> 1; sewageAccumulation = sewageAccumulation + 1 >> 1; garbageAccumulation = garbageAccumulation + 1 >> 1; incomeAccumulation = 0; break; } break; case ItemClass.SubService.CommercialTourist: taxRate = (buildingData.m_flags & Building.Flags.HighDensity) == Building.Flags.None ? Singleton<EconomyManager>.instance.GetTaxRate(ItemClass.Service.Commercial, ItemClass.SubService.CommercialLow, thisAI.m_info.m_class.m_level, taxationPolicies) : Singleton<EconomyManager>.instance.GetTaxRate(ItemClass.Service.Commercial, ItemClass.SubService.CommercialHigh, thisAI.m_info.m_class.m_level, taxationPolicies); break; default: taxRate = Singleton<EconomyManager>.instance.GetTaxRate(thisAI.m_info.m_class, taxationPolicies); break; } if (workers != 0) { int num5 = HandleCommonConsumption(thisAI, buildingID, ref buildingData, ref electricityConsumption, ref waterConsumption, ref sewageAccumulation, ref garbageAccumulation, policies); workers = (workers * num5 + 99) / 100; if (workers != 0) { int amount1 = incomeAccumulation; if (amount1 != 0) { if (thisAI.m_info.m_class.m_subService == ItemClass.SubService.CommercialLow) { if ((cityPlanningPolicies & DistrictPolicies.CityPlanning.SmallBusiness) != DistrictPolicies.CityPlanning.None) { Singleton<EconomyManager>.instance.FetchResource(EconomyManager.Resource.PolicyCost, 12, thisAI.m_info.m_class); amount1 *= 2; } } else if ((cityPlanningPolicies & DistrictPolicies.CityPlanning.BigBusiness) != DistrictPolicies.CityPlanning.None) { Singleton<EconomyManager>.instance.FetchResource(EconomyManager.Resource.PolicyCost, 25, thisAI.m_info.m_class); amount1 *= 3; } if ((policies & DistrictPolicies.Services.RecreationalUse) != DistrictPolicies.Services.None) amount1 = (amount1 * 105 + 99) / 100; int num6 = Singleton<EconomyManager>.instance.AddPrivateIncome(amount1, ItemClass.Service.Commercial, thisAI.m_info.m_class.m_subService, thisAI.m_info.m_class.m_level, taxRate); int amount2 = (behaviour.m_touristCount * num6 + (aliveCount >> 1)) / Mathf.Max(1, aliveCount); int amount3 = Mathf.Max(0, num6 - amount2); if (amount3 != 0) Singleton<EconomyManager>.instance.AddResource(EconomyManager.Resource.CitizenIncome, amount3, thisAI.m_info.m_class); if (amount2 != 0) Singleton<EconomyManager>.instance.AddResource(EconomyManager.Resource.TourismIncome, amount2, thisAI.m_info.m_class); } int groundPollution; int noisePollution; thisAI.GetPollutionRates(workers, cityPlanningPolicies, out groundPollution, out noisePollution); if (groundPollution != 0 && Singleton<SimulationManager>.instance.m_randomizer.Int32(3U) == 0) Singleton<NaturalResourceManager>.instance.TryDumpResource(NaturalResourceManager.Resource.Pollution, groundPollution, groundPollution, buildingData.m_position, 60f); if (noisePollution != 0) Singleton<ImmaterialResourceManager>.instance.AddResource(ImmaterialResourceManager.Resource.NoisePollution, noisePollution, buildingData.m_position, 60f); if (num5 < 100) buildingData.m_flags |= Building.Flags.RateReduced; else buildingData.m_flags &= ~Building.Flags.RateReduced; buildingData.m_flags |= Building.Flags.Active; } else buildingData.m_flags &= ~(Building.Flags.RateReduced | Building.Flags.Active); } else { buildingData.m_problems = Notification.RemoveProblems(buildingData.m_problems, Notification.Problem.Electricity | Notification.Problem.Water | Notification.Problem.Sewage | Notification.Problem.Flood); buildingData.m_flags &= ~(Building.Flags.RateReduced | Building.Flags.Active); } int health = 0; int wellbeing = 0; float radius = (float)(buildingData.Width + buildingData.Length) * 2.5f; if (behaviour.m_healthAccumulation != 0) { if (aliveWorkerCount + aliveCount != 0) health = (behaviour.m_healthAccumulation + (aliveWorkerCount + aliveCount >> 1)) / (aliveWorkerCount + aliveCount); Singleton<ImmaterialResourceManager>.instance.AddResource(ImmaterialResourceManager.Resource.Health, behaviour.m_healthAccumulation, buildingData.m_position, radius); } if (behaviour.m_wellbeingAccumulation != 0) { if (aliveWorkerCount + aliveCount != 0) wellbeing = (behaviour.m_wellbeingAccumulation + (aliveWorkerCount + aliveCount >> 1)) / (aliveWorkerCount + aliveCount); Singleton<ImmaterialResourceManager>.instance.AddResource(ImmaterialResourceManager.Resource.Wellbeing, behaviour.m_wellbeingAccumulation, buildingData.m_position, radius); } int num8 = Citizen.GetHappiness(health, wellbeing) * 15 / 100; int a3 = aliveWorkerCount * 20 / workPlaceCount; if ((buildingData.m_problems & Notification.Problem.MajorProblem) == Notification.Problem.None) num8 += 20; if (buildingData.m_problems == Notification.Problem.None) num8 += 25; int num9 = num8 + Mathf.Min(a3, (int)buildingData.m_customBuffer1 * a3 / num4) + (a3 - Mathf.Min(a3, (int)buildingData.m_customBuffer2 * a3 / num4)); int num10 = (int)(8 - thisAI.m_info.m_class.m_level); int num11 = (int)(11 - thisAI.m_info.m_class.m_level); if (thisAI.m_info.m_class.m_subService == ItemClass.SubService.CommercialHigh) { ++num10; ++num11; } if (taxRate < num10) num9 += num10 - taxRate; if (taxRate > num11) num9 -= taxRate - num11; if (taxRate >= num11 + 4) { if ((int)buildingData.m_taxProblemTimer != 0 || Singleton<SimulationManager>.instance.m_randomizer.Int32(32U) == 0) { int num5 = taxRate - num11 >> 2; buildingData.m_taxProblemTimer = (byte)Mathf.Min((int)byte.MaxValue, (int)buildingData.m_taxProblemTimer + num5); if ((int)buildingData.m_taxProblemTimer >= 96) buildingData.m_problems = Notification.AddProblems(buildingData.m_problems, Notification.Problem.TaxesTooHigh | Notification.Problem.MajorProblem); else if ((int)buildingData.m_taxProblemTimer >= 32) buildingData.m_problems = Notification.AddProblems(buildingData.m_problems, Notification.Problem.TaxesTooHigh); } } else { buildingData.m_taxProblemTimer = (byte)Mathf.Max(0, (int)buildingData.m_taxProblemTimer - 1); buildingData.m_problems = Notification.RemoveProblems(buildingData.m_problems, Notification.Problem.TaxesTooHigh); } int entertainment; int attractiveness; GetAccumulation(thisAI, new Randomizer((int)buildingID), workers, taxRate, cityPlanningPolicies, taxationPolicies, out entertainment, out attractiveness); if (entertainment != 0) Singleton<ImmaterialResourceManager>.instance.AddResource(ImmaterialResourceManager.Resource.Entertainment, entertainment, buildingData.m_position, radius); if (attractiveness != 0) Singleton<ImmaterialResourceManager>.instance.AddResource(ImmaterialResourceManager.Resource.Attractiveness, attractiveness); int happiness = Mathf.Clamp(num9, 0, 100); buildingData.m_health = (byte)health; buildingData.m_happiness = (byte)happiness; buildingData.m_citizenCount = (byte)(aliveWorkerCount + aliveCount); HandleDead(thisAI, buildingID, ref buildingData, ref behaviour, totalWorkerCount + totalCount); int crimeAccumulation = behaviour.m_crimeAccumulation / 10; if (thisAI.m_info.m_class.m_subService == ItemClass.SubService.CommercialLeisure) crimeAccumulation = crimeAccumulation * 5 + 3 >> 2; if ((policies & DistrictPolicies.Services.RecreationalUse) != DistrictPolicies.Services.None) crimeAccumulation = crimeAccumulation * 3 + 3 >> 2; HandleCrime(thisAI, buildingID, ref buildingData, crimeAccumulation, (int)buildingData.m_citizenCount); int num12 = (int)buildingData.m_crimeBuffer; if (aliveWorkerCount != 0) { Singleton<ImmaterialResourceManager>.instance.AddResource(ImmaterialResourceManager.Resource.Density, aliveWorkerCount, buildingData.m_position, radius); int num5 = (behaviour.m_educated0Count * 100 + behaviour.m_educated1Count * 50 + behaviour.m_educated2Count * 30) / aliveWorkerCount + 50; buildingData.m_fireHazard = (byte)num5; } else buildingData.m_fireHazard = (byte)0; int crimeRate = (int)buildingData.m_citizenCount == 0 ? 0 : (num12 + ((int)buildingData.m_citizenCount >> 1)) / (int)buildingData.m_citizenCount; int count = 0; int cargo = 0; int capacity = 0; int outside = 0; if (incomingTransferReason != TransferManager.TransferReason.None) { CalculateGuestVehicles(thisAI, buildingID, ref buildingData, incomingTransferReason, ref count, ref cargo, ref capacity, ref outside); buildingData.m_tempImport = (byte)Mathf.Clamp(outside, (int)buildingData.m_tempImport, (int)byte.MaxValue); } buildingData.m_tempExport = (byte)Mathf.Clamp(behaviour.m_touristCount, (int)buildingData.m_tempExport, (int)byte.MaxValue); SimulationManager _simulationManager = Singleton<SimulationManager>.instance; if ((long)((_simulationManager.m_currentFrameIndex & 3840U) >> 8) == (long)((int)buildingID & 15) && (thisAI.m_info.m_class.m_subService == ItemClass.SubService.CommercialLow || thisAI.m_info.m_class.m_subService == ItemClass.SubService.CommercialHigh) && ((int)Singleton<ZoneManager>.instance.m_lastBuildIndex == (int)_simulationManager.m_currentBuildIndex && (buildingData.m_flags & Building.Flags.Upgrading) == Building.Flags.None)) { CheckBuildingLevel(thisAI, buildingID, ref buildingData, ref frameData, ref behaviour, aliveCount); } if ((buildingData.m_flags & (Building.Flags.Completed | Building.Flags.Upgrading)) == Building.Flags.None) return; Notification.Problem problems1 = Notification.RemoveProblems(buildingData.m_problems, Notification.Problem.NoCustomers | Notification.Problem.NoGoods); if ((int)buildingData.m_customBuffer2 > num4 - (a1 >> 1) && aliveCount <= visitCount >> 1) { if (_simulationManager.m_currentDayTimeHour > 19 && _simulationManager.m_currentDayTimeHour < 20) { buildingData.m_outgoingProblemTimer = (byte)Mathf.Min(byte.MaxValue, buildingData.m_outgoingProblemTimer + 1); if (buildingData.m_outgoingProblemTimer >= 192) { problems1 = Notification.AddProblems(problems1, Notification.Problem.NoCustomers | Notification.Problem.MajorProblem); } else if (buildingData.m_outgoingProblemTimer >= 128) { problems1 = Notification.AddProblems(problems1, Notification.Problem.NoCustomers); } } else { buildingData.m_outgoingProblemTimer -= 10; } } else buildingData.m_outgoingProblemTimer = (byte)0; if ((int)buildingData.m_customBuffer1 == 0) { buildingData.m_incomingProblemTimer = (byte)Mathf.Min((int)byte.MaxValue, (int)buildingData.m_incomingProblemTimer + 1); problems1 = (int)buildingData.m_incomingProblemTimer >= 64 ? Notification.AddProblems(problems1, Notification.Problem.NoGoods | Notification.Problem.MajorProblem) : Notification.AddProblems(problems1, Notification.Problem.NoGoods); } else buildingData.m_incomingProblemTimer = (byte)0; buildingData.m_problems = problems1; instance1.m_districts.m_buffer[(int)district].AddCommercialData(ref behaviour, health, happiness, crimeRate, workPlaceCount, aliveWorkerCount, Mathf.Max(0, workPlaceCount - totalWorkerCount), visitCount, aliveCount, num3, (int)thisAI.m_info.m_class.m_level, electricityConsumption, waterConsumption, sewageAccumulation, garbageAccumulation, incomeAccumulation, Mathf.Min(100, (int)buildingData.m_garbageBuffer / 50), (int)buildingData.m_waterPollution * 100 / (int)byte.MaxValue, (int)buildingData.m_finalImport, (int)buildingData.m_finalExport, thisAI.m_info.m_class.m_subService); if ((int)buildingData.m_fireIntensity == 0 && incomingTransferReason != TransferManager.TransferReason.None) { int num5 = num4 - (int)buildingData.m_customBuffer1 - capacity - (maxIncomingLoadSize >> 1); if (num5 >= 0) Singleton<TransferManager>.instance.AddIncomingOffer(incomingTransferReason, new TransferManager.TransferOffer() { Priority = num5 * 8 / maxIncomingLoadSize, Building = buildingID, Position = buildingData.m_position, Amount = 1, Active = false }); } if ((int)buildingData.m_fireIntensity == 0 && outgoingTransferReason != TransferManager.TransferReason.None) { int num5 = (int)buildingData.m_customBuffer2 - aliveCount * 100; if (num5 >= 100 && num3 > 0) Singleton<TransferManager>.instance.AddOutgoingOffer(outgoingTransferReason, new TransferManager.TransferOffer() { Priority = Mathf.Max(1, num5 * 8 / num4), Building = buildingID, Position = buildingData.m_position, Amount = Mathf.Min(num5 / 100, num3), Active = false }); } PrivateBuildingAI baseAI = thisAI as PrivateBuildingAI; //Because we don't have access to base here. NewPrivateBuildingAI.SimulationStepActive(baseAI, buildingID, ref buildingData, ref frameData); HandleFire(thisAI, buildingID, ref buildingData, ref frameData, policies); } else { Debug.LogError("Commercial building " + buildingID + " has no AI! This could have been bad."); } }
public static void CalculateBuildingMoneyAndSalary(Building building, ushort buildingID) { if (BuildingData.buildingMoney[buildingID] > MainDataStore.maxBuildingMoneyLimit) { BuildingData.buildingMoney[buildingID] = MainDataStore.maxBuildingMoneyLimit; } else if (BuildingData.buildingMoney[buildingID] < -MainDataStore.maxBuildingMoneyLimit) { BuildingData.buildingMoney[buildingID] = -MainDataStore.maxBuildingMoneyLimit; } if (building.Info.m_class.m_service == ItemClass.Service.Industrial || building.Info.m_class.m_service == ItemClass.Service.Commercial || building.Info.m_class.m_service == ItemClass.Service.Office) { Citizen.BehaviourData behaviourData = default; int aliveWorkerCount = 0; int totalWorkerCount = 0; RealCityCommonBuildingAI.InitDelegate(); RealCityCommonBuildingAI.GetWorkBehaviour((CommonBuildingAI)building.Info.m_buildingAI, buildingID, ref building, ref behaviourData, ref aliveWorkerCount, ref totalWorkerCount); float bossTake = 0; float investToOffice = 0; float profitShare = 0; switch (building.Info.m_class.m_subService) { case ItemClass.SubService.OfficeGeneric: case ItemClass.SubService.OfficeHightech: profitShare = 1f; break; case ItemClass.SubService.IndustrialFarming: case ItemClass.SubService.IndustrialForestry: if (building.Info.m_buildingAI is IndustrialExtractorAI) { bossTake = MainDataStore.bossRatioInduExtractor; investToOffice = MainDataStore.investRatioInduExtractor; profitShare = MainDataStore.profitShareRatioInduExtractor; } else { bossTake = MainDataStore.bossRatioInduOther; investToOffice = MainDataStore.investRatioInduOther; profitShare = MainDataStore.profitShareRatioInduOther; } break; case ItemClass.SubService.IndustrialOil: case ItemClass.SubService.IndustrialOre: bossTake = MainDataStore.bossRatioInduOther; investToOffice = MainDataStore.investRatioInduOther; profitShare = MainDataStore.profitShareRatioInduOther; break; case ItemClass.SubService.IndustrialGeneric: if (building.Info.m_class.m_level == ItemClass.Level.Level1) { bossTake = MainDataStore.bossRatioInduLevel1; investToOffice = MainDataStore.investRatioInduLevel1; profitShare = MainDataStore.profitShareRatioInduLevel1; } else if (building.Info.m_class.m_level == ItemClass.Level.Level2) { bossTake = MainDataStore.bossRatioInduLevel2; investToOffice = MainDataStore.investRatioInduLevel2; profitShare = MainDataStore.profitShareRatioInduLevel2; } else { bossTake = MainDataStore.bossRatioInduLevel3; investToOffice = MainDataStore.investRatioInduLevel3; profitShare = MainDataStore.profitShareRatioInduLevel3; } break; case ItemClass.SubService.CommercialHigh: case ItemClass.SubService.CommercialLow: if (building.Info.m_class.m_level == ItemClass.Level.Level1) { bossTake = MainDataStore.bossRatioCommLevel1; investToOffice = MainDataStore.investRatioCommLevel1; profitShare = MainDataStore.profitShareRatioCommLevel1; } else if (building.Info.m_class.m_level == ItemClass.Level.Level2) { bossTake = MainDataStore.bossRatioCommLevel2; investToOffice = MainDataStore.investRatioCommLevel2; profitShare = MainDataStore.profitShareRatioCommLevel2; } else { bossTake = MainDataStore.bossRatioCommLevel3; investToOffice = MainDataStore.investRatioCommLevel3; profitShare = MainDataStore.profitShareRatioCommLevel1; } break; case ItemClass.SubService.CommercialTourist: bossTake = MainDataStore.bossRatioCommTou; investToOffice = MainDataStore.investRatioCommTou; profitShare = MainDataStore.profitShareRatioCommTou; break; case ItemClass.SubService.CommercialLeisure: bossTake = MainDataStore.bossRatioCommOther; investToOffice = MainDataStore.investRatioCommOther; profitShare = MainDataStore.profitShareRatioCommOther; break; case ItemClass.SubService.CommercialEco: bossTake = MainDataStore.bossRatioCommECO; investToOffice = MainDataStore.investRatioCommECO; profitShare = MainDataStore.profitShareRatioCommECO; break; } // boss take and return to office if (BuildingData.buildingMoney[buildingID] > 0) { //Reduce Boss fee long investToOfficeFee = (long)(BuildingData.buildingMoney[buildingID] * investToOffice); long bossTakeFee = (long)(BuildingData.buildingMoney[buildingID] * bossTake); if (building.Info.m_class.m_service == ItemClass.Service.Commercial) { //Commercial have help tourism MainDataStore.outsideTouristMoney += ((bossTakeFee - investToOfficeFee) * MainDataStore.outsideCompanyProfitRatio * MainDataStore.outsideTouristSalaryProfitRatio); } RealCityPrivateBuildingAI.profitBuildingMoney += investToOfficeFee; BuildingData.buildingMoney[buildingID] -= bossTakeFee; } if (building.Info.m_class.m_service == ItemClass.Service.Office) { float allOfficeWorker = RealCityPrivateBuildingAI.allOfficeLevel1WorkCountFinal + RealCityPrivateBuildingAI.allOfficeLevel2WorkCountFinal + RealCityPrivateBuildingAI.allOfficeLevel3WorkCountFinal + RealCityPrivateBuildingAI.allOfficeHighTechWorkCountFinal; float averageOfficeSalary = 0; if (allOfficeWorker != 0) { averageOfficeSalary = (RealCityPrivateBuildingAI.profitBuildingMoneyFinal / allOfficeWorker); } if (building.Info.m_class.m_subService == ItemClass.SubService.OfficeGeneric) { if (building.Info.m_class.m_level == ItemClass.Level.Level1) { BuildingData.buildingMoney[buildingID] = averageOfficeSalary * totalWorkerCount * 0.6f; } else if (building.Info.m_class.m_level == ItemClass.Level.Level2) { BuildingData.buildingMoney[buildingID] = averageOfficeSalary * totalWorkerCount * 0.8f; } else if (building.Info.m_class.m_level == ItemClass.Level.Level3) { BuildingData.buildingMoney[buildingID] = averageOfficeSalary * totalWorkerCount * 1f; } } else if (building.Info.m_class.m_subService == ItemClass.SubService.OfficeHightech) { BuildingData.buildingMoney[buildingID] = averageOfficeSalary * totalWorkerCount * 0.75f; } ProcessLandFeeOffice(building, buildingID, totalWorkerCount); } //Calculate building salary int buildingAsset = (int)(BuildingData.buildingMoney[buildingID] + building.m_customBuffer1 * RealCityIndustryBuildingAI.GetResourcePrice(RealCityPrivateBuildingAI.GetIncomingProductionType(buildingID, building))); int salary = 0; if ((buildingAsset > 0) && (totalWorkerCount != 0)) { salary = (int)(buildingAsset * profitShare / totalWorkerCount); switch (building.Info.m_class.m_subService) { case ItemClass.SubService.IndustrialFarming: case ItemClass.SubService.IndustrialForestry: case ItemClass.SubService.IndustrialOil: case ItemClass.SubService.IndustrialOre: salary = Math.Min(salary, MainDataStore.salaryInduOtherMax); break; case ItemClass.SubService.IndustrialGeneric: if (building.Info.m_class.m_level == ItemClass.Level.Level1) { salary = Math.Min(salary, MainDataStore.salaryInduLevel1Max); } else if (building.Info.m_class.m_level == ItemClass.Level.Level2) { salary = Math.Min(salary, MainDataStore.salaryInduLevel2Max); } else { salary = Math.Min(salary, MainDataStore.salaryInduLevel3Max); } break; case ItemClass.SubService.CommercialHigh: case ItemClass.SubService.CommercialLow: if (building.Info.m_class.m_level == ItemClass.Level.Level1) { salary = Math.Min(salary, MainDataStore.salaryCommLevel1Max); } else if (building.Info.m_class.m_level == ItemClass.Level.Level2) { salary = Math.Min(salary, MainDataStore.salaryCommLevel2Max); } else { salary = Math.Min(salary, MainDataStore.salaryCommLevel3Max); } break; case ItemClass.SubService.CommercialTourist: salary = Math.Min(salary, MainDataStore.salaryCommTouMax); break; case ItemClass.SubService.CommercialLeisure: salary = Math.Min(salary, MainDataStore.salaryCommOtherMax); break; case ItemClass.SubService.CommercialEco: salary = Math.Min(salary, MainDataStore.salaryCommECOMax); break; } } if (salary > 0) { BuildingData.buildingWorkCount[buildingID] = salary; } else { BuildingData.buildingWorkCount[buildingID] = 0; } } else { //resident building ItemClass @class = building.Info.m_class; int incomeAccumulation = 0; DistrictManager instance = Singleton <DistrictManager> .instance; byte district = instance.GetDistrict(building.m_position); DistrictPolicies.Taxation taxationPolicies = instance.m_districts.m_buffer[district].m_taxationPolicies; if (@class.m_subService == ItemClass.SubService.ResidentialLow) { switch (@class.m_level) { case ItemClass.Level.Level1: incomeAccumulation = MainDataStore.residentLowLevel1Rent; break; case ItemClass.Level.Level2: incomeAccumulation = MainDataStore.residentLowLevel2Rent; break; case ItemClass.Level.Level3: incomeAccumulation = MainDataStore.residentLowLevel3Rent; break; case ItemClass.Level.Level4: incomeAccumulation = MainDataStore.residentLowLevel4Rent; break; case ItemClass.Level.Level5: incomeAccumulation = MainDataStore.residentLowLevel5Rent; break; } } else if (@class.m_subService == ItemClass.SubService.ResidentialLowEco) { switch (@class.m_level) { case ItemClass.Level.Level1: incomeAccumulation = MainDataStore.residentLowLevel1Rent; break; case ItemClass.Level.Level2: incomeAccumulation = MainDataStore.residentLowLevel2Rent; break; case ItemClass.Level.Level3: incomeAccumulation = MainDataStore.residentLowLevel3Rent; break; case ItemClass.Level.Level4: incomeAccumulation = MainDataStore.residentLowLevel4Rent; break; case ItemClass.Level.Level5: incomeAccumulation = MainDataStore.residentLowLevel5Rent; break; } } else if (@class.m_subService == ItemClass.SubService.ResidentialHigh) { switch (@class.m_level) { case ItemClass.Level.Level1: incomeAccumulation = MainDataStore.residentHighLevel1Rent; break; case ItemClass.Level.Level2: incomeAccumulation = MainDataStore.residentHighLevel2Rent; break; case ItemClass.Level.Level3: incomeAccumulation = MainDataStore.residentHighLevel3Rent; break; case ItemClass.Level.Level4: incomeAccumulation = MainDataStore.residentHighLevel4Rent; break; case ItemClass.Level.Level5: incomeAccumulation = MainDataStore.residentHighLevel5Rent; break; } } else { switch (@class.m_level) { case ItemClass.Level.Level1: incomeAccumulation = MainDataStore.residentHighLevel1Rent; break; case ItemClass.Level.Level2: incomeAccumulation = MainDataStore.residentHighLevel2Rent; break; case ItemClass.Level.Level3: incomeAccumulation = MainDataStore.residentHighLevel3Rent; break; case ItemClass.Level.Level4: incomeAccumulation = MainDataStore.residentHighLevel4Rent; break; case ItemClass.Level.Level5: incomeAccumulation = MainDataStore.residentHighLevel5Rent; break; } } int num2; num2 = Singleton <EconomyManager> .instance.GetTaxRate(@class, taxationPolicies); incomeAccumulation = (int)((num2 * incomeAccumulation) / 100f); BuildingData.buildingWorkCount[buildingID] = incomeAccumulation; } }
protected override void ProduceGoods(ushort buildingID, ref Building buildingData, ref Building.Frame frameData, int productionRate, ref Citizen.BehaviourData behaviour, int aliveWorkerCount, int totalWorkerCount, int workPlaceCount, int aliveVisitorCount, int totalVisitorCount, int visitPlaceCount) { bool flag = false; if (buildingData.m_netNode != 0) { NetManager instance = NetManager.instance; for (int i = 0; i < 8; i++) { if (instance.m_nodes.m_buffer[(int)buildingData.m_netNode].GetSegment(i) != 0) { flag = true; break; } } } if (!flag) { productionRate = 0; } DistrictManager instance2 = Singleton <DistrictManager> .instance; byte district = instance2.GetDistrict(buildingData.m_position); int waterProdMp = m_waterConsumption * m_consumption_multiplier; int waterRate = waterProdMp; //Debug.Log("Produce goods"); //Debug.Log("waterRate = " + waterRate); //Debug.Log("productionRate = " + productionRate); if (waterRate != 0) { int bufferedWater = (int)(buildingData.m_waterBuffer * m_bufferMultiplier); //Debug.Log("bufferedWater = " + bufferedWater); int missingWater = waterRate * 10 - bufferedWater; //Debug.Log("missingWater = " + missingWater); if (missingWater > 0) { byte pollution = 0; int fetchedWater = WaterManager.instance.TryFetchWater(buildingData.m_position, missingWater, missingWater, ref pollution); if (buildingData.m_productionRate < 100) { int fetchedWater2 = WaterManager.instance.TryFetchWater(buildingData.m_position, missingWater / 2, missingWater / 2, ref pollution); if (fetchedWater2 > 0) { if (buildingData.m_productionRate + 3 <= 100) { buildingData.m_productionRate += 3; } } } //Debug.Log("fetchedWater = " + fetchedWater); bufferedWater += fetchedWater; } int waterFinalRate = waterRate * productionRate / 100; if (bufferedWater - waterFinalRate > 0) { //Debug.Log("dumping water"); bufferedWater -= waterFinalRate; // Dump water to env this.HandleWaterSource(buildingID, ref buildingData, true, waterFinalRate, waterFinalRate, this.m_maxWaterDistance); } //if (bufferedWater - waterFinalRate * 4 > 0) //{ // if (buildingData.m_productionRate + 3 <= 100) // buildingData.m_productionRate += 3; //} if (bufferedWater - waterFinalRate * 4 < 0) { if (buildingData.m_productionRate > 3) { buildingData.m_productionRate -= 3; } } // Decrease buffer buildingData.m_waterBuffer = (ushort)((bufferedWater) / m_bufferMultiplier); //Debug.Log("m_waterBuffer =" + bufferedWater); DistrictManager.instance.m_districts.m_buffer[district].m_playerConsumption.m_tempWaterConsumption += (uint)waterRate; } base.HandleDead(buildingID, ref buildingData, ref behaviour, totalWorkerCount); int noiseRate = productionRate * this.m_noiseAccumulation / 100; if (noiseRate != 0) { Singleton <ImmaterialResourceManager> .instance.AddResource(ImmaterialResourceManager.Resource.NoisePollution, noiseRate, buildingData.m_position, this.m_noiseRadius); } base.ProduceGoods(buildingID, ref buildingData, ref frameData, productionRate, ref behaviour, aliveWorkerCount, totalWorkerCount, workPlaceCount, aliveVisitorCount, totalVisitorCount, visitPlaceCount); }
protected override void HandleWorkAndVisitPlaces(ushort buildingID, ref Building buildingData, ref Citizen.BehaviourData behaviour, ref int aliveWorkerCount, ref int totalWorkerCount, ref int workPlaceCount, ref int aliveVisitorCount, ref int totalVisitorCount, ref int visitPlaceCount) { workPlaceCount += this.m_workPlaceCount0 + this.m_workPlaceCount1 + this.m_workPlaceCount2 + this.m_workPlaceCount3; base.GetWorkBehaviour(buildingID, ref buildingData, ref behaviour, ref aliveWorkerCount, ref totalWorkerCount); base.HandleWorkPlaces(buildingID, ref buildingData, this.m_workPlaceCount0, this.m_workPlaceCount1, this.m_workPlaceCount2, this.m_workPlaceCount3, ref behaviour, aliveWorkerCount, totalWorkerCount); }
public static void GetLandRentNoOffice(out int landRent, Building building, ushort buildingID) { ItemClass @class = building.Info.m_class; landRent = 0; Citizen.BehaviourData behaviourData = default; int aliveWorkerCount = 0; int totalWorkerCount = 0; ItemClass.SubService subService = @class.m_subService; RealCityCommonBuildingAI.InitDelegate(); switch (subService) { case ItemClass.SubService.OfficeHightech: RealCityCommonBuildingAI.GetWorkBehaviour((OfficeBuildingAI)building.Info.m_buildingAI, buildingID, ref building, ref behaviourData, ref aliveWorkerCount, ref totalWorkerCount); RealCityPrivateBuildingAI.allOfficeHighTechWorkCount += totalWorkerCount; break; case ItemClass.SubService.OfficeGeneric: RealCityCommonBuildingAI.GetWorkBehaviour((OfficeBuildingAI)building.Info.m_buildingAI, buildingID, ref building, ref behaviourData, ref aliveWorkerCount, ref totalWorkerCount); if (building.Info.m_class.m_level == ItemClass.Level.Level1) { RealCityPrivateBuildingAI.allOfficeLevel1WorkCount += totalWorkerCount; } else if (building.Info.m_class.m_level == ItemClass.Level.Level2) { RealCityPrivateBuildingAI.allOfficeLevel2WorkCount += totalWorkerCount; } else if (building.Info.m_class.m_level == ItemClass.Level.Level3) { RealCityPrivateBuildingAI.allOfficeLevel3WorkCount += totalWorkerCount; } break; case ItemClass.SubService.IndustrialFarming: landRent = MainDataStore.induFarm; break; case ItemClass.SubService.IndustrialForestry: landRent = MainDataStore.induForest; break; case ItemClass.SubService.IndustrialOil: landRent = MainDataStore.induOil; break; case ItemClass.SubService.IndustrialOre: landRent = MainDataStore.induOre; break; case ItemClass.SubService.IndustrialGeneric: if (building.Info.m_class.m_level == ItemClass.Level.Level1) { landRent = MainDataStore.induGenLevel1; } else if (building.Info.m_class.m_level == ItemClass.Level.Level2) { landRent = MainDataStore.induGenLevel2; } else if (building.Info.m_class.m_level == ItemClass.Level.Level3) { landRent = MainDataStore.induGenLevel3; } break; case ItemClass.SubService.CommercialHigh: if (building.Info.m_class.m_level == ItemClass.Level.Level1) { landRent = MainDataStore.commHighLevel1; } else if (building.Info.m_class.m_level == ItemClass.Level.Level2) { landRent = MainDataStore.commHighLevel2; } else if (building.Info.m_class.m_level == ItemClass.Level.Level3) { landRent = MainDataStore.commHighLevel3; } break; case ItemClass.SubService.CommercialLow: if (building.Info.m_class.m_level == ItemClass.Level.Level1) { landRent = MainDataStore.commLowLevel1; } else if (building.Info.m_class.m_level == ItemClass.Level.Level2) { landRent = MainDataStore.commLowLevel2; } else if (building.Info.m_class.m_level == ItemClass.Level.Level3) { landRent = MainDataStore.commLowLevel3; } break; case ItemClass.SubService.CommercialLeisure: landRent = MainDataStore.commLeisure; break; case ItemClass.SubService.CommercialTourist: landRent = MainDataStore.commTourist; break; case ItemClass.SubService.CommercialEco: landRent = MainDataStore.commEco; break; default: break; } }