public static void Postfix(ushort buildingID, ref Building buildingData, ref Building.Frame frameData) { // Update problems ConstructionAI.ProcessBuildingConstruction(buildingID, ref buildingData, ref frameData); if (!buildingData.m_flags.IsFlagSet(Building.Flags.Completed)) { if (MainDataStore.constructionResourceBuffer[buildingID] >= 8000) { Notification.Problem problem = Notification.RemoveProblems(buildingData.m_problems, Notification.Problem.NoResources); buildingData.m_problems = problem; } else { if (RealConstruction.debugMode) { if (buildingData.m_problems == Notification.Problem.None) { Notification.Problem problem = Notification.AddProblems(buildingData.m_problems, Notification.Problem.NoResources); buildingData.m_problems = problem; } } } } else { Notification.Problem problem = Notification.RemoveProblems(buildingData.m_problems, Notification.Problem.NoResources); buildingData.m_problems = problem; } }
public static void Postfix(ushort buildingID, ref Building buildingData, ref Building.Frame frameData) { if (GasStationAI.IsGasBuilding(buildingID)) { if (buildingData.m_flags.IsFlagSet(Building.Flags.Completed)) { GasStationAI.ProcessGasBuildingIncoming(buildingID, ref buildingData); } } }
public void SimulationStep(ushort buildingID, ref Building buildingData, ref Building.Frame frameData) { var ai = (WildlifeSpawnPointAI)Convert.ChangeType(this, typeof(WildlifeSpawnPointAI)); int num = new Randomizer((int)buildingID).Int32(1, maxAnimalCount); if (CountAnimals(ai, buildingID, ref buildingData) < num) { this.CreateAnimal(buildingID, ref buildingData); } base.SimulationStep(buildingID, ref buildingData, ref frameData); }
public static void Postfix(ushort buildingID, ref Building buildingData, ref Building.Frame frameData) { if ((buildingData.Info.m_class.m_service == ItemClass.Service.HealthCare) && (buildingData.Info.m_class.m_level == ItemClass.Level.Level2)) { CustomPlayerBuildingAI.haveCemetryBuildingTemp = true; } else if (buildingData.Info.m_class.m_service == ItemClass.Service.Garbage) { CustomPlayerBuildingAI.haveGarbageBuildingTemp = true; } else if (buildingData.Info.m_class.m_service == ItemClass.Service.PoliceDepartment) { CustomPlayerBuildingAI.havePoliceBuildingTemp = true; } else if ((buildingData.Info.m_class.m_service == ItemClass.Service.HealthCare) && (buildingData.Info.m_class.m_level == ItemClass.Level.Level1)) { CustomPlayerBuildingAI.haveHospitalBuildingTemp = true; } else if (buildingData.Info.m_class.m_service == ItemClass.Service.FireDepartment) { CustomPlayerBuildingAI.haveFireBuildingTemp = true; } }
public static void CheckBuildingLevel(CommercialBuildingAI thisAI, ushort buildingID, ref Building buildingData, ref Building.Frame frameData, ref Citizen.BehaviourData behaviour, int visitorCount) { Debug.LogWarning("CheckBuildingLevel is not overridden!"); }
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 | DistrictPolicies.Services.ExtraInsulation | DistrictPolicies.Services.NoElectricity | DistrictPolicies.Services.OnlyElectricity | DistrictPolicies.Services.RecyclePlastic); 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; case ItemClass.SubService.CommercialTourist: instance1.m_districts.m_buffer[(int)district].m_cityPlanningPoliciesEffect |= cityPlanningPolicies & DistrictPolicies.CityPlanning.LightningRods; break; case ItemClass.SubService.CommercialEco: instance1.m_districts.m_buffer[(int)district].m_cityPlanningPoliciesEffect |= cityPlanningPolicies; break; } Citizen.BehaviourData behaviour = new Citizen.BehaviourData(); int aliveWorkerCount = 0; int totalWorkerCount = 0; int workPlaceCount = 0; int num1 = NewPrivateBuildingAI.HandleWorkers(thisAI, buildingID, ref buildingData, ref behaviour, ref aliveWorkerCount, ref totalWorkerCount, ref workPlaceCount); if ((buildingData.m_flags & Building.Flags.Evacuating) != Building.Flags.None) { num1 = 0; } int width = buildingData.Width; int length = buildingData.Length; int num2 = 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, num2 * 4); TransferManager.TransferReason incomingTransferReason = GetIncomingTransferReason(thisAI); TransferManager.TransferReason outgoingTransferReason = GetOutgoingTransferReason(thisAI, buildingID); if (num1 != 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(num1, (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; } num1 = (num7 + 9) / 10; } int electricityConsumption; int waterConsumption; int sewageAccumulation; int garbageAccumulation; int incomeAccumulation; thisAI.GetConsumptionRates(new Randomizer((int)buildingID), num1, out electricityConsumption, out waterConsumption, out sewageAccumulation, out garbageAccumulation, out incomeAccumulation); int heatingConsumption = 0; if (electricityConsumption != 0 && instance1.IsPolicyLoaded(DistrictPolicies.Policies.ExtraInsulation)) { if ((policies & DistrictPolicies.Services.ExtraInsulation) != DistrictPolicies.Services.None) { heatingConsumption = Mathf.Max(1, electricityConsumption * 3 + 8 >> 4); incomeAccumulation = incomeAccumulation * 95 / 100; } else { heatingConsumption = Mathf.Max(1, electricityConsumption + 2 >> 2); } } 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 (num1 != 0) { int num5 = HandleCommonConsumption(thisAI, buildingID, ref buildingData, ref frameData, ref electricityConsumption, ref heatingConsumption, ref waterConsumption, ref sewageAccumulation, ref garbageAccumulation, policies); num1 = (num1 * num5 + 99) / 100; if (num1 != 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(num1, 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 { electricityConsumption = 0; heatingConsumption = 0; waterConsumption = 0; sewageAccumulation = 0; garbageAccumulation = 0; buildingData.m_problems = Notification.RemoveProblems(buildingData.m_problems, Notification.Problem.Electricity | Notification.Problem.Water | Notification.Problem.Sewage | Notification.Problem.Flood | Notification.Problem.Heating); 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), num1, 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); //Begin edited section 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 = 0; } } else { buildingData.m_outgoingProblemTimer = (byte)0; } if (!CityEventManager.instance.EventStartsWithin(3D) && !CityEventManager.instance.EventTakingPlace() && !CityEventManager.instance.EventJustEnded()) { 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; } float currentHour = _simulationManager.m_currentDayTimeHour; //Artifically shop at night to keep industry happy. Will give the effect of industry stocking up commercial over night. //Note: ModifyMaterialBuffer is expensive, so if there's any performance impact with the mod now, it'll most likely be this. if ((currentHour > 20f || currentHour < 4f)) { if (_simulationManager.m_randomizer.Int32(80) < 2) { //Simulate 2 people buying things int amount = -200; thisAI.ModifyMaterialBuffer(buildingID, ref buildingData, TransferManager.TransferReason.Shopping, ref amount); } } else if (Experiments.ExperimentsToggle.AllowActiveCommercialFix && _simulationManager.m_randomizer.Int32(40) < 5) //Added in as a potential fix to random inactive buildings. Lack of customers still shuts down commercial. { int amount = -50; thisAI.ModifyMaterialBuffer(buildingID, ref buildingData, TransferManager.TransferReason.Shopping, ref amount); } } else { buildingData.m_incomingProblemTimer = 0; } //End edited section 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, heatingConsumption, 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 - (num2 >> 1); if (num5 >= 0) { Singleton <TransferManager> .instance.AddIncomingOffer(incomingTransferReason, new TransferManager.TransferOffer() { Priority = num5 * 8 / num2, 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. if (baseAI != null) { 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."); } }
protected override void SimulationStepActive(ushort buildingID, ref Building buildingData, ref Building.Frame frameData) { base.SimulationStepActive(buildingID, ref buildingData, ref frameData); if ((buildingData.m_problems & Notification.Problem.MajorProblem) != Notification.Problem.None) { if ((int)buildingData.m_fireIntensity != 0) { return; } buildingData.m_majorProblemTimer = (byte)Mathf.Min((int)byte.MaxValue, (int)buildingData.m_majorProblemTimer + 1); if ((int)buildingData.m_majorProblemTimer < 64 || Singleton <BuildingManager> .instance.m_abandonmentDisabled) { return; } buildingData.m_majorProblemTimer = (byte)192; buildingData.m_flags &= ~Building.Flags.Active; buildingData.m_flags |= Building.Flags.Abandoned; buildingData.m_problems = Notification.Problem.FatalProblem | buildingData.m_problems & ~Notification.Problem.MajorProblem; this.RemovePeople(buildingID, ref buildingData); this.BuildingDeactivated(buildingID, ref buildingData); Singleton <BuildingManager> .instance.UpdateBuildingRenderer(buildingID, true); } else { buildingData.m_majorProblemTimer = (byte)0; } }
// Not much to see from here on public override void SimulationStep(ushort buildingID, ref Building buildingData, ref Building.Frame frameData) { Util.buildingFlags(ref buildingData); if ((buildingData.m_flags & Building.Flags.Completed) == Building.Flags.None) { bool flag = (buildingData.m_flags & Building.Flags.Upgrading) != Building.Flags.None; int constructionTime = this.GetConstructionTime(); if (constructionTime == 0) { frameData.m_constructState = 255; } else { frameData.m_constructState = (byte)Mathf.Min(255, (int)frameData.m_constructState + 1088 / constructionTime); } if (frameData.m_constructState == 255) { this.BuildingCompleted(buildingID, ref buildingData); GuideController properties3 = Singleton <GuideManager> .instance.m_properties; if (properties3 != null) { Singleton <BuildingManager> .instance.m_buildingLevelUp.Deactivate(buildingID, true); } } else if (flag) { GuideController properties4 = Singleton <GuideManager> .instance.m_properties; if (properties4 != null) { Singleton <BuildingManager> .instance.m_buildingLevelUp.Activate(properties4.m_buildingLevelUp, buildingID); } } if (flag) { this.SimulationStepActive(buildingID, ref buildingData, ref frameData); } } else { this.SimulationStepActive(buildingID, ref buildingData, ref frameData); } Util.buildingFlags(ref buildingData); }
/// <summary> /// Calculations performed on each simulation step. /// For a ploppable RICO building we want to force certain building flags to be set before and after each step. /// </summary> /// <param name="buildingID">Instance ID of the building</param> /// <param name="buildingData">Building data struct</param> /// <param name="frameData">Frame data</param> protected override void SimulationStepActive(ushort buildingID, ref Building buildingData, ref Building.Frame frameData) { // Apply flags. Util.buildingFlags(ref buildingData); // Execute base method. base.SimulationStepActive(buildingID, ref buildingData, ref frameData); // Ensure flags are still applied. Util.buildingFlags(ref buildingData); }
/* * public override void CreateBuilding(ushort buildingID, ref Building data) * { * var bdata = RICOBuildingManager.RICOInstanceData[(int)data.m_buildIndex]; * if (bdata.plopped) { * data.m_frame0.m_constructState = 255; * this.BuildingCompleted(buildingID, ref data); * } * base.CreateBuilding(buildingID, ref data); * } */ protected override void SimulationStepActive(ushort buildingID, ref Building buildingData, ref Building.Frame frameData) { //var data = RICOBuildingManager.RICOInstanceData[(int)buildingData.m_buildIndex]; Util.buildingFlags(ref buildingData); base.SimulationStepActive(buildingID, ref buildingData, ref frameData); //if (data.plopped) Util.buildingFlags(ref buildingData); Util.buildingFlags(ref buildingData); }
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); }
public override void SimulationStep(ushort buildingID, ref Building buildingData, ref Building.Frame frameData) { base.SimulationStep(buildingID, ref buildingData, ref frameData); SimulationManager instance = Singleton <SimulationManager> .instance; DistrictManager instance2 = Singleton <DistrictManager> .instance; byte district = instance2.GetDistrict(buildingData.m_position); DistrictPolicies.CityPlanning cityPlanningPolicies = instance2.m_districts.m_buffer[(int)district].m_cityPlanningPolicies; if ((buildingData.m_flags & (Building.Flags.Completed | Building.Flags.Upgrading)) != Building.Flags.None) { instance2.m_districts.m_buffer[(int)district].AddResidentialData(buildingData.Width * buildingData.Length, (buildingData.m_flags & Building.Flags.Abandoned) != Building.Flags.None, (buildingData.m_flags & Building.Flags.Collapsed) != Building.Flags.None && frameData.m_fireDamage == 255, (buildingData.m_flags & Building.Flags.Collapsed) != Building.Flags.None && frameData.m_fireDamage != 255, this.m_info.m_class.m_subService); } if ((buildingData.m_levelUpProgress == 255 || (buildingData.m_flags & Building.Flags.Collapsed) == Building.Flags.None) && buildingData.m_fireIntensity == 0) { /* * if ((this.m_info.m_class.m_subService == ItemClass.SubService.ResidentialHigh || this.m_info.m_class.m_subService == ItemClass.SubService.ResidentialHighEco) && * (cityPlanningPolicies & DistrictPolicies.CityPlanning.HighriseBan) != DistrictPolicies.CityPlanning.None && this.m_info.m_class.m_level == ItemClass.Level.Level5 && * instance.m_randomizer.Int32(10u) == 0 && Singleton<ZoneManager>.instance.m_lastBuildIndex == instance.m_currentBuildIndex) * { * District[] expr_184_cp_0 = instance2.m_districts.m_buffer; * byte expr_184_cp_1 = district; * expr_184_cp_0[(int)expr_184_cp_1].m_cityPlanningPoliciesEffect = (expr_184_cp_0[(int)expr_184_cp_1].m_cityPlanningPoliciesEffect | DistrictPolicies.CityPlanning.HighriseBan); * buildingData.m_flags |= Building.Flags.Demolishing; * instance.m_currentBuildIndex += 1u; * } */ if (instance.m_randomizer.Int32(10u) == 0) { DistrictPolicies.Specialization specializationPolicies = instance2.m_districts.m_buffer[(int)district].m_specializationPolicies; DistrictPolicies.Specialization specialization = this.SpecialPolicyNeeded(); if (specialization != DistrictPolicies.Specialization.None) { if ((specializationPolicies & specialization) == DistrictPolicies.Specialization.None) { if (Singleton <ZoneManager> .instance.m_lastBuildIndex == instance.m_currentBuildIndex) { buildingData.m_flags |= Building.Flags.Demolishing; instance.m_currentBuildIndex += 1u; } } else { District[] expr_240_cp_0 = instance2.m_districts.m_buffer; byte expr_240_cp_1 = district; expr_240_cp_0[(int)expr_240_cp_1].m_specializationPoliciesEffect = (expr_240_cp_0[(int)expr_240_cp_1].m_specializationPoliciesEffect | specialization); } } else if ((specializationPolicies & DistrictPolicies.Specialization.Selfsufficient) != DistrictPolicies.Specialization.None && Singleton <ZoneManager> .instance.m_lastBuildIndex == instance.m_currentBuildIndex) { buildingData.m_flags |= Building.Flags.Demolishing; instance.m_currentBuildIndex += 1u; } } } }
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 HelicopterDepotAISimulationStepPostFix(ushort buildingID, ref Building buildingData, ref Building.Frame frameData) { if (buildingData.Info.m_class.m_service == ItemClass.Service.FireDepartment) { haveFireHelicopterDepot = true; } else if (buildingData.Info.m_class.m_service == ItemClass.Service.HealthCare) { haveSickHelicopterDepot = true; } }
public static void Postfix(ushort buildingID, ref Building buildingData, ref Building.Frame frameData) { // Update problems if (CustomPlayerBuildingAI.CanOperation(buildingID, ref buildingData) && buildingData.m_flags.IsFlagSet(Building.Flags.Completed) && (RealConstruction.operationConsumption != 2)) { OperationAI.ProcessPlayerBuildingOperation(buildingID, ref buildingData); if (MainDataStore.operationResourceBuffer[buildingID] > 100) { if (buildingData.Info.m_class.m_service == ItemClass.Service.PlayerIndustry) { if (buildingData.Info.m_class.m_subService == ItemClass.SubService.PlayerIndustryFarming) { if (RealConstruction.operationConsumption == 1) { MainDataStore.operationResourceBuffer[buildingID] -= 5; } else { MainDataStore.operationResourceBuffer[buildingID] -= 10; } } else if (buildingData.Info.m_class.m_subService == ItemClass.SubService.PlayerIndustryForestry) { if (RealConstruction.operationConsumption == 1) { MainDataStore.operationResourceBuffer[buildingID] -= 10; } else { MainDataStore.operationResourceBuffer[buildingID] -= 20; } } else if (buildingData.Info.m_class.m_subService == ItemClass.SubService.PlayerIndustryOre) { if (RealConstruction.operationConsumption == 1) { MainDataStore.operationResourceBuffer[buildingID] -= 15; } else { MainDataStore.operationResourceBuffer[buildingID] -= 30; } } else if (buildingData.Info.m_class.m_subService == ItemClass.SubService.PlayerIndustryOil) { if (RealConstruction.operationConsumption == 1) { MainDataStore.operationResourceBuffer[buildingID] -= 20; } else { MainDataStore.operationResourceBuffer[buildingID] -= 40; } } else { if (RealConstruction.operationConsumption == 1) { MainDataStore.operationResourceBuffer[buildingID] -= 25; } else { MainDataStore.operationResourceBuffer[buildingID] -= 50; } } } else { if (RealConstruction.operationConsumption == 1) { MainDataStore.operationResourceBuffer[buildingID] -= 50; } else { MainDataStore.operationResourceBuffer[buildingID] -= 100; } } if (CustomPlayerBuildingAI.CanRemoveNoResource(buildingID, ref buildingData)) { Notification.Problem problem = Notification.RemoveProblems(buildingData.m_problems, Notification.Problem.NoResources); buildingData.m_problems = problem; } } else { MainDataStore.operationResourceBuffer[buildingID] = 0; if (RealConstruction.debugMode) { if (buildingData.m_problems == Notification.Problem.None) { Notification.Problem problem = Notification.AddProblems(buildingData.m_problems, Notification.Problem.NoResources); buildingData.m_problems = problem; } } else { if (CustomPlayerBuildingAI.CanRemoveNoResource(buildingID, ref buildingData)) { Notification.Problem problem = Notification.RemoveProblems(buildingData.m_problems, Notification.Problem.NoResources); buildingData.m_problems = problem; } } } } else { if (CustomPlayerBuildingAI.CanRemoveNoResource(buildingID, ref buildingData)) { Notification.Problem problem = Notification.RemoveProblems(buildingData.m_problems, Notification.Problem.NoResources); buildingData.m_problems = problem; } } if (CustomPlayerBuildingAI.CanConstruction(buildingID, ref buildingData)) { if (!buildingData.m_flags.IsFlagSet(Building.Flags.Completed)) { ConstructionAI.ProcessBuildingConstruction(buildingID, ref buildingData, ref frameData); if (MainDataStore.constructionResourceBuffer[buildingID] >= 8000) { Notification.Problem problem = Notification.RemoveProblems(buildingData.m_problems, Notification.Problem.NoResources); buildingData.m_problems = problem; } else { if (RealConstruction.debugMode) { if (buildingData.m_problems == Notification.Problem.None) { Notification.Problem problem = Notification.AddProblems(buildingData.m_problems, Notification.Problem.NoResources); buildingData.m_problems = problem; } } } } } // if (ResourceBuildingAI.IsSpecialBuilding((ushort)buildingID)) { if (buildingData.m_flags.IsFlagSet(Building.Flags.Completed)) { ResourceBuildingAI.ProcessCityResourceDepartmentBuildingGoods(buildingID, ref buildingData); ResourceBuildingAI.ProcessCityResourceDepartmentBuildingOutgoing(buildingID, ref buildingData); ResourceBuildingAI.ProcessCityResourceDepartmentBuildingIncoming(buildingID, ref buildingData); } } }
public static void ProcessBuildingConstruction(ushort buildingID, ref Building buildingData, ref Building.Frame frameData) { if (MainDataStore.constructionResourceBuffer[buildingID] < 8000 && (!ResourceBuildingAI.IsSpecialBuilding(buildingID))) { System.Random rand = new System.Random(); if (buildingData.m_flags.IsFlagSet(Building.Flags.Created) && (!buildingData.m_flags.IsFlagSet(Building.Flags.Completed)) && (!buildingData.m_flags.IsFlagSet(Building.Flags.Deleted))) { frameData.m_constructState = 10; int num27 = 0; int num28 = 0; int num29 = 0; int value = 0; int num34 = 0; TransferManager.TransferReason incomingTransferReason = default(TransferManager.TransferReason); //construction resource incomingTransferReason = (TransferManager.TransferReason) 124; num27 = 0; num28 = 0; num29 = 0; value = 0; num34 = 0; if (incomingTransferReason != TransferManager.TransferReason.None) { CaculationVehicle.CustomCalculateGuestVehicles(buildingID, ref buildingData, incomingTransferReason, ref num27, ref num28, ref num29, ref value); buildingData.m_tempImport = (byte)Mathf.Clamp(value, (int)buildingData.m_tempImport, 255); } num34 = 8000 - MainDataStore.constructionResourceBuffer[buildingID] - num29; if (num34 > 0) { TransferManager.TransferOffer offer = default(TransferManager.TransferOffer); offer.Priority = rand.Next(8); if ((buildingData.Info.m_class.m_service != ItemClass.Service.Residential) && (buildingData.Info.m_class.m_service != ItemClass.Service.Industrial) && (buildingData.Info.m_class.m_service != ItemClass.Service.Commercial) && (buildingData.Info.m_class.m_service != ItemClass.Service.Office)) { offer.Priority = 7; } offer.Building = buildingID; offer.Position = buildingData.m_position; offer.Amount = 1; offer.Active = false; Singleton <TransferManager> .instance.AddIncomingOffer(incomingTransferReason, offer); } } } else { if (!ResourceBuildingAI.IsSpecialBuilding(buildingID) && buildingData.m_flags.IsFlagSet(Building.Flags.Completed)) { MainDataStore.constructionResourceBuffer[buildingID] = 0; } } }
public override void SimulationStep(ushort buildingID, ref Building buildingData, ref Building.Frame frameData) { //var data = RICOBuildingManager.RICOInstanceData[(int)buildingData.m_buildIndex]; // only apply settings for plopped RICO assets. Util.buildingFlags(ref buildingData); base.SimulationStep(buildingID, ref buildingData, ref frameData); Util.buildingFlags(ref buildingData); }
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); } } } }
private void CheckBuildingLevel(ushort buildingID, ref Building buildingData, ref Building.Frame frameData, ref Citizen.BehaviourData behaviour) { DistrictManager instance = Singleton <DistrictManager> .instance; byte district = instance.GetDistrict(buildingData.m_position); DistrictPolicies.CityPlanning cityPlanningPolicies = instance.m_districts.m_buffer[(int)district].m_cityPlanningPolicies; int num = behaviour.m_educated1Count + behaviour.m_educated2Count * 2 + behaviour.m_educated3Count * 3; int num2 = behaviour.m_teenCount + behaviour.m_youngCount * 2 + behaviour.m_adultCount * 3 + behaviour.m_seniorCount * 3; int averageEducation; ItemClass.Level level; int num3; if (num2 != 0) { averageEducation = (num * 300 + (num2 >> 1)) / num2; num = (num * 72 + (num2 >> 1)) / num2; if (num < 15) { level = ItemClass.Level.Level1; num3 = 1 + num; } else if (num < 30) { level = ItemClass.Level.Level2; num3 = 1 + (num - 15); } else if (num < 45) { level = ItemClass.Level.Level3; num3 = 1 + (num - 30); } else if (num < 60) { level = ItemClass.Level.Level4; num3 = 1 + (num - 45); } else { level = ItemClass.Level.Level5; num3 = 1; } if (level < this.m_info.m_class.m_level) { num3 = 1; } else if (level > this.m_info.m_class.m_level) { num3 = 15; } } else { level = ItemClass.Level.Level1; averageEducation = 0; num3 = 0; } int num4; Singleton <ImmaterialResourceManager> .instance.CheckLocalResource(ImmaterialResourceManager.Resource.LandValue, buildingData.m_position, out num4); ItemClass.Level level2; int num5; if (num3 != 0) { if (num4 < 6) { level2 = ItemClass.Level.Level1; num5 = 1 + (num4 * 15 + 3) / 6; } else if (num4 < 21) { level2 = ItemClass.Level.Level2; num5 = 1 + ((num4 - 6) * 15 + 7) / 15; } else if (num4 < 41) { level2 = ItemClass.Level.Level3; num5 = 1 + ((num4 - 21) * 15 + 10) / 20; } else if (num4 < 61) { level2 = ItemClass.Level.Level4; num5 = 1 + ((num4 - 41) * 15 + 10) / 20; } else { level2 = ItemClass.Level.Level5; num5 = 1; } if (level2 < this.m_info.m_class.m_level) { num5 = 1; } else if (level2 > this.m_info.m_class.m_level) { num5 = 15; } } else { level2 = ItemClass.Level.Level1; num5 = 0; } bool flag = false; if (this.m_info.m_class.m_level == ItemClass.Level.Level2) { if (num4 == 0) { flag = true; } } else if (this.m_info.m_class.m_level == ItemClass.Level.Level3) { if (num4 < 11) { flag = true; } } else if (this.m_info.m_class.m_level == ItemClass.Level.Level4) { if (num4 < 31) { flag = true; } } else if (this.m_info.m_class.m_level == ItemClass.Level.Level5 && num4 < 51) { flag = true; } ItemClass.Level level3 = (ItemClass.Level)Mathf.Min((int)level, (int)level2); Singleton <BuildingManager> .instance.m_LevelUpWrapper.OnCalculateResidentialLevelUp(ref level3, ref num3, ref num5, ref flag, averageEducation, num4, buildingID, this.m_info.m_class.m_service, this.m_info.m_class.m_subService, this.m_info.m_class.m_level); if (flag) { buildingData.m_serviceProblemTimer = (byte)Mathf.Min(255, (int)(buildingData.m_serviceProblemTimer + 1)); if (buildingData.m_serviceProblemTimer >= 8) { buildingData.m_problems = Notification.AddProblems(buildingData.m_problems, Notification.Problem.LandValueLow | Notification.Problem.MajorProblem); } else if (buildingData.m_serviceProblemTimer >= 4) { buildingData.m_problems = Notification.AddProblems(buildingData.m_problems, Notification.Problem.LandValueLow); } else { buildingData.m_problems = Notification.RemoveProblems(buildingData.m_problems, Notification.Problem.LandValueLow); } } else { buildingData.m_serviceProblemTimer = 0; buildingData.m_problems = Notification.RemoveProblems(buildingData.m_problems, Notification.Problem.LandValueLow); } /* Remove high rise ban * if (level3 > this.m_info.m_class.m_level) * { * num3 = 0; * num5 = 0; * if (this.m_info.m_class.m_subService == ItemClass.SubService.ResidentialHigh && (cityPlanningPolicies & DistrictPolicies.CityPlanning.HighriseBan) != DistrictPolicies.CityPlanning.None && level3 == ItemClass.Level.Level5) * { * District[] expr_41B_cp_0 = instance.m_districts.m_buffer; * byte expr_41B_cp_1 = district; * expr_41B_cp_0[(int)expr_41B_cp_1].m_cityPlanningPoliciesEffect = (expr_41B_cp_0[(int)expr_41B_cp_1].m_cityPlanningPoliciesEffect | DistrictPolicies.CityPlanning.HighriseBan); * level3 = ItemClass.Level.Level4; * num3 = 1; * } * if (buildingData.m_problems == Notification.Problem.None && level3 > this.m_info.m_class.m_level && this.GetUpgradeInfo(buildingID, ref buildingData) != null) * { * frameData.m_constructState = 0; * base.StartUpgrading(buildingID, ref buildingData); * } * } */ buildingData.m_levelUpProgress = (byte)(num3 | num5 << 4); }
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 SimulationStepActive(ushort buildingID, ref Building buildingData, ref Building.Frame frameData) { Util.buildingFlags(ref buildingData); base.SimulationStepActive(buildingID, ref buildingData, ref frameData); Util.buildingFlags(ref buildingData); }
protected override void SimulationStepActive(ushort buildingID, ref Building buildingData, ref Building.Frame frameData) { // only apply settings for plopped RICO assets. Util.buildingFlags(ref buildingData); base.SimulationStepActive(buildingID, ref buildingData, ref frameData); Util.buildingFlags(ref buildingData); }
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) { productionRate = 0; TerrainManager instance = Singleton <TerrainManager> .instance; WaterSimulation waterSimulation = instance.WaterSimulation; if (this.m_standingWaterDepth > 0 && buildingData.m_waterSource == 0) { HandleWaterSource(buildingID, ref buildingData, true, (int)this.m_standingWaterDepth * 10, 1000, 1); } else if (this.m_standingWaterDepth > 0) { WaterSource watersourceData = waterSimulation.LockWaterSource(buildingData.m_waterSource); float waterSurfaceElevation = Singleton <TerrainManager> .instance.WaterLevel(VectorUtils.XZ(buildingData.m_position)); if (waterSurfaceElevation > watersourceData.m_target) { watersourceData.m_outputRate = 0u; } else if (watersourceData.m_outputRate == 0u) { watersourceData.m_outputRate = ((50u * watersourceData.m_water) / 1000u) - ((50u * watersourceData.m_water) / 1000u) % 50 + 50; } if (watersourceData.m_water < 50u) { watersourceData.m_outputRate += 50u; watersourceData.m_water = 1000u * (watersourceData.m_outputRate / 50); } waterSimulation.UnlockWaterSource(buildingData.m_waterSource, watersourceData); } base.ProduceGoods(buildingID, ref buildingData, ref frameData, productionRate, finalProductionRate, ref behaviour, aliveWorkerCount, totalWorkerCount, workPlaceCount, aliveVisitorCount, totalVisitorCount, visitPlaceCount); }
public static void SimulationStepActive(PrivateBuildingAI baseAI, ushort buildingID, ref Building buildingData, ref Building.Frame frameData) { Debug.LogWarning("SimulationStepActive is not overridden!"); }
public override void SimulationStep(ushort buildingID, ref Building buildingData, ref Building.Frame frameData) { base.SimulationStep(buildingID, ref buildingData, ref frameData); if (Singleton <SimulationManager> .instance.m_randomizer.Int32(10U) == 0) { DistrictManager instance = Singleton <DistrictManager> .instance; byte district = instance.GetDistrict(buildingData.m_position); ushort num = instance.m_districts.m_buffer[(int)district].m_Style; if ((int)num > 0 && (int)num - 1 < instance.m_Styles.Length) { DistrictStyle districtStyle = instance.m_Styles[(int)num - 1]; if (districtStyle != null && (UnityEngine.Object) this.m_info.m_class != (UnityEngine.Object)null && (districtStyle.AffectsService(this.m_info.GetService(), this.m_info.GetSubService(), this.m_info.m_class.m_level) && !districtStyle.Contains(this.m_info)) && (int)Singleton <ZoneManager> .instance.m_lastBuildIndex == (int)Singleton <SimulationManager> .instance.m_currentBuildIndex) { buildingData.m_flags |= Building.Flags.Demolishing; ++Singleton <SimulationManager> .instance.m_currentBuildIndex; } } } if ((buildingData.m_flags & Building.Flags.ZonesUpdated) != Building.Flags.None) { SimulationManager instance = Singleton <SimulationManager> .instance; if ((int)buildingData.m_fireIntensity != 0 || instance.m_randomizer.Int32(10U) != 0 || (int)Singleton <ZoneManager> .instance.m_lastBuildIndex != (int)instance.m_currentBuildIndex) { return; } buildingData.m_flags &= ~Building.Flags.ZonesUpdated; if (buildingData.CheckZoning(this.m_info.m_class.GetZone(), this.m_info.m_class.GetSecondaryZone())) { return; } buildingData.m_flags |= Building.Flags.Demolishing; PrivateBuildingAIDetour.CheckNearbyBuildingZones(buildingData.m_position); ++instance.m_currentBuildIndex; } else { if ((buildingData.m_flags & (Building.Flags.Abandoned | Building.Flags.Downgrading)) == Building.Flags.None || (int)buildingData.m_majorProblemTimer != (int)byte.MaxValue && (buildingData.m_flags & Building.Flags.Abandoned) != Building.Flags.None) { return; } SimulationManager instance1 = Singleton <SimulationManager> .instance; ZoneManager instance2 = Singleton <ZoneManager> .instance; int num1; switch (this.m_info.m_class.m_service) { case ItemClass.Service.Residential: num1 = instance2.m_actualResidentialDemand; break; case ItemClass.Service.Commercial: num1 = instance2.m_actualCommercialDemand; break; case ItemClass.Service.Industrial: num1 = instance2.m_actualWorkplaceDemand; break; case ItemClass.Service.Office: num1 = instance2.m_actualWorkplaceDemand; break; default: num1 = 0; break; } if (instance1.m_randomizer.Int32(100U) >= num1 || (int)instance2.m_lastBuildIndex != (int)instance1.m_currentBuildIndex || (double)Singleton <TerrainManager> .instance.WaterLevel(VectorUtils.XZ(buildingData.m_position)) > (double)buildingData.m_position.y) { return; } ItemClass.SubService subService = this.m_info.m_class.m_subService; ItemClass.Level level = ItemClass.Level.Level1; int width = buildingData.Width; int num2 = buildingData.Length; if (this.m_info.m_class.m_service == ItemClass.Service.Industrial) { ZoneBlock.GetIndustryType(buildingData.m_position, out subService, out level); } else if (this.m_info.m_class.m_service == ItemClass.Service.Commercial) { ZoneBlock.GetCommercialType(buildingData.m_position, this.m_info.m_class.GetZone(), width, num2, out subService, out level); } DistrictManager instance3 = Singleton <DistrictManager> .instance; byte district = instance3.GetDistrict(buildingData.m_position); ushort num3 = instance3.m_districts.m_buffer[(int)district].m_Style; BuildingInfo randomBuildingInfo = Singleton <BuildingManager> .instance.GetRandomBuildingInfo(ref Singleton <SimulationManager> .instance.m_randomizer, this.m_info.m_class.m_service, subService, level, width, num2, this.m_info.m_zoningMode, (int)num3); if (randomBuildingInfo == null) { return; } buildingData.m_flags |= Building.Flags.Demolishing; float num4 = buildingData.m_angle + 1.570796f; float num5; if (this.m_info.m_zoningMode == BuildingInfo.ZoningMode.CornerLeft && randomBuildingInfo.m_zoningMode == BuildingInfo.ZoningMode.CornerRight) { num5 = num4 - 1.570796f; num2 = width; } else if (this.m_info.m_zoningMode == BuildingInfo.ZoningMode.CornerRight && randomBuildingInfo.m_zoningMode == BuildingInfo.ZoningMode.CornerLeft) { num5 = num4 + 1.570796f; num2 = width; } ushort building; if (Singleton <BuildingManager> .instance.CreateBuilding(out building, ref Singleton <SimulationManager> .instance.m_randomizer, randomBuildingInfo, buildingData.m_position, buildingData.m_angle, num2, Singleton <SimulationManager> .instance.m_currentBuildIndex)) { ++Singleton <SimulationManager> .instance.m_currentBuildIndex; switch (this.m_info.m_class.m_service) { case ItemClass.Service.Residential: instance2.m_actualResidentialDemand = Mathf.Max(0, instance2.m_actualResidentialDemand - 5); break; case ItemClass.Service.Commercial: instance2.m_actualCommercialDemand = Mathf.Max(0, instance2.m_actualCommercialDemand - 5); break; case ItemClass.Service.Industrial: instance2.m_actualWorkplaceDemand = Mathf.Max(0, instance2.m_actualWorkplaceDemand - 5); break; case ItemClass.Service.Office: instance2.m_actualWorkplaceDemand = Mathf.Max(0, instance2.m_actualWorkplaceDemand - 5); break; } } ++instance1.m_currentBuildIndex; } }
// Yaaawn. public override void SimulationStep(ushort buildingID, ref Building buildingData, ref Building.Frame frameData) { Util.buildingFlags(ref buildingData); base.SimulationStep(buildingID, ref buildingData, ref frameData); Util.buildingFlags(ref buildingData); }
public static int HandleCommonConsumption(CommercialBuildingAI thisAI, ushort buildingID, ref Building data, ref Building.Frame frameData, ref int electricityConsumption, ref int heatingConsumption, ref int waterConsumption, ref int sewageAccumulation, ref int garbageAccumulation, DistrictPolicies.Services policies) { Debug.LogWarning("HandleCommonConsumption is not overridden!"); return(0); }
/// <summary> /// Calculations performed on each simulation step. /// For a ploppable RICO building we want to force certain building flags to be set before and after each step. /// </summary> /// <param name="buildingID">Instance ID of the building</param> /// <param name="buildingData">Building data struct</param> /// <param name="frameData">Frame data</param> public override void SimulationStep(ushort buildingID, ref Building buildingData, ref Building.Frame frameData) { // Apply flags. AIUtils.SetBuildingFlags(ref buildingData); // Execute base method. base.SimulationStep(buildingID, ref buildingData, ref frameData); // Ensure flags are still applied. AIUtils.SetBuildingFlags(ref buildingData); }
public static void HandleFire(CommercialBuildingAI thisAI, ushort buildingID, ref Building data, ref Building.Frame frameData, DistrictPolicies.Services policies) { Debug.LogWarning("HandleFire is not overridden!"); }
/// <summary> /// postfix patch for ResidentialBuildingAI.SimulationStepActive /// this also patches PloppableRICO.GrowableResidentialAI and PloppableRICO.PloppableResidentialAI because they derive from ResidentialBuildingAI /// </summary> public static void PostfixResidentialBuildingAISimulationStepActive(ushort buildingID, ref Building buildingData, ref Building.Frame frameData) { PopulationDemographicsLoading.panel.ResidentialSimulationStepActive(buildingID, ref buildingData, true); }