Ejemplo n.º 1
0
        public static void Postfix(int resourceIndex, ref int amount, ref int capacity, ref InstanceID ___m_InstanceID)
        {
            Building        building = Singleton <BuildingManager> .instance.m_buildings.m_buffer[___m_InstanceID.Building];
            UniqueFactoryAI ai       = building.Info.m_buildingAI as UniqueFactoryAI;

            switch (resourceIndex)
            {
            case 0:
                amount   = Convert.ToInt32(RI_Data.GetFactorCargo(ai.m_inputResource1) * building.m_customBuffer2);
                capacity = Convert.ToInt32(RI_Data.GetFactorCargo(ai.m_inputResource1) * ai.GetInputBufferSize1(___m_InstanceID.Building, ref building));
                break;

            case 1:
                amount   = Convert.ToInt32(RI_Data.GetFactorCargo(ai.m_inputResource2) * Mod.CombineBytes(building.m_teens, building.m_youngs));
                capacity = Convert.ToInt32(RI_Data.GetFactorCargo(ai.m_inputResource2) * ai.GetInputBufferSize2(___m_InstanceID.Building, ref building));
                break;

            case 2:
                amount   = Convert.ToInt32(RI_Data.GetFactorCargo(ai.m_inputResource3) * Mod.CombineBytes(building.m_adults, building.m_seniors));
                capacity = Convert.ToInt32(RI_Data.GetFactorCargo(ai.m_inputResource3) * ai.GetInputBufferSize3(___m_InstanceID.Building, ref building));
                break;

            case 3:
                amount   = Convert.ToInt32(RI_Data.GetFactorCargo(ai.m_inputResource4) * Mod.CombineBytes(building.m_education1, building.m_education2));
                capacity = Convert.ToInt32(RI_Data.GetFactorCargo(ai.m_inputResource4) * ai.GetInputBufferSize4(___m_InstanceID.Building, ref building));
                break;
            }
        }
Ejemplo n.º 2
0
        private static void _updateTooltip(int id, int volume, int bufferSize, TransferManager.TransferReason cargo, ref UIPanel panel, ref UIPanel panel2)
        {
            //Debug.Log($"uTt-{id}");
            int customBuffer     = Convert.ToInt32(volume * RI_Data.GetFactorCargo(cargo));
            int outputBufferSize = Convert.ToInt32(bufferSize * RI_Data.GetFactorCargo(cargo));

            panel2.tooltip = panel.tooltip = StringUtils.SafeFormat(ColossalFramework.Globalization.Locale.Get("INDUSTRYPANEL_BUFFERTOOLTIP"), IndustryWorldInfoPanel.FormatResource((uint)customBuffer), IndustryWorldInfoPanel.FormatResourceWithUnit((uint)outputBufferSize, cargo));
        }
        private void _switchWorkPlaces(PlayerBuildingAI ai, int minimumSize, ref int wp0, ref int wp1, ref int wp2, ref int wp3)
        {
            int oldTotal           = wp0 + wp1 + wp2 + wp3;
            RI_EmployeeRatio ratio = RI_Data.GetEmployeeRatio(ai);

            if (oldTotal >= minimumSize)
            {
                decimal factor = RI_Data.GetFactorBuilding(ai).Workers;
                //Mod.DebugLine($"{ai.name} - AI: {ai.GetType().ToString()}, factor: {factor}x");
                //Mod.DebugLine($"    _switchWorkplaces: old={oldTotal}; wp0={wp0}, wp1={wp1}, wp2={wp2}, wp3={wp3}");
                wp0 = Convert.ToInt32(Math.Round(wp0 / factor));
                wp1 = Convert.ToInt32(Math.Round(wp1 / factor));
                wp2 = Convert.ToInt32(Math.Round(wp2 / factor));
                wp3 = Convert.ToInt32(Math.Round(wp3 / factor));
                //Mod.DebugLine($"    _switchWorkplaces: new={wp0 + wp1 + wp2 + wp3}; wp0={wp0}, wp1={wp1}, wp2={wp2}, wp3={wp3}");
                //Mod.DebugLine($"");
            }
        }
Ejemplo n.º 4
0
 public static bool IsField(PlayerBuildingAI ai)
 {
     if (ai is ExtractingFacilityAI)
     {
         if (ai.m_info.m_class.m_subService == ItemClass.SubService.PlayerIndustryFarming)
         {
             return(true);
         }
     }
     if (ai is ProcessingFacilityAI) // Rebalance pastures as fields
     {
         foreach (string name in RI_Data.GetProcessorFieldNameStarts())
         {
             if (ai.name.Length >= name.Length && ai.name.Substring(0, name.Length) == name)
             {
                 return(true);
             }
         }
     }
     return(false);
 }
        private void SwitchWorkPlaces(IndustryBuildingAI ai, int minimumSize = 10)
        {
            if (ai is ExtractingFacilityAI && Mod.IsField(ai)) // It's an extracting field
            {
                RI_EmployeeRatio ratio = RI_Data.GetEmployeeRatio(ai);
                int workPlaceTotal     = (int)Math.Ceiling(Math.Sqrt(ai.m_info.m_cellLength * ai.m_info.m_cellWidth) / 2);

                //int oldTotal = ai.m_workPlaceCount0 + ai.m_workPlaceCount1 + ai.m_workPlaceCount2 + ai.m_workPlaceCount3;

                ai.m_workPlaceCount0 = Convert.ToInt32(Math.Round(workPlaceTotal * ratio.GetModifier(0)));
                ai.m_workPlaceCount1 = Convert.ToInt32(Math.Round(workPlaceTotal * ratio.GetModifier(1)));
                ai.m_workPlaceCount2 = Convert.ToInt32(Math.Round(workPlaceTotal * ratio.GetModifier(2)));
                ai.m_workPlaceCount3 = Convert.ToInt32(Math.Round(workPlaceTotal * ratio.GetModifier(3)));
                //Mod.DebugLine($"_switchWorkplaces: maths={ratio.GetModifier(0)}x{workPlaceTotal}={workPlaceTotal * ratio.GetModifier(0)}, wpc0={ai.m_workPlaceCount0}");
                //Mod.DebugLine($"FARM FIELD:{ai.m_workPlaceCount0 + ai.m_workPlaceCount1 + ai.m_workPlaceCount2 + ai.m_workPlaceCount3} (was {oldTotal}, should be {workPlaceTotal})");
            }
            else
            {
                //Mod.DebugLine($"SWP: subservice={ai.m_info.m_class.m_subService}");
                _switchWorkPlaces(ai, minimumSize, ref ai.m_workPlaceCount0, ref ai.m_workPlaceCount1, ref ai.m_workPlaceCount2, ref ai.m_workPlaceCount3);
            }
        }
Ejemplo n.º 6
0
        public static void Postfix(ushort buildingID, ref Building buildingData, ProcessingFacilityAI __instance, ref ushort[] __state)
        {
            int cargoDiff = 0;

            if (Mod.IsIndustriesBuilding(__instance))
            {
                // Input
                if (__instance.m_inputResource1 != TransferManager.TransferReason.None)
                {
                    cargoDiff = Convert.ToInt32((__state[1] - buildingData.m_customBuffer2) / RI_Data.GetFactorCargo(__instance.m_inputResource1));
                    buildingData.m_customBuffer2 = (ushort)Mathf.Clamp(__state[1] - cargoDiff, 0, 64000);
                }

                if (__instance.m_inputResource2 != TransferManager.TransferReason.None)
                {
                    cargoDiff = Convert.ToInt32((__state[2] - Mod.CombineBytes(buildingData.m_teens, buildingData.m_youngs)) / RI_Data.GetFactorCargo(__instance.m_inputResource2));
                    Mod.SplitBytes((ushort)Mathf.Clamp(__state[2] - cargoDiff, 0, 64000), ref buildingData.m_teens, ref buildingData.m_youngs);
                }

                if (__instance.m_inputResource3 != TransferManager.TransferReason.None)
                {
                    cargoDiff = Convert.ToInt32((__state[3] - Mod.CombineBytes(buildingData.m_adults, buildingData.m_seniors)) / RI_Data.GetFactorCargo(__instance.m_inputResource3));
                    Mod.SplitBytes((ushort)Mathf.Clamp(__state[3] - cargoDiff, 0, 64000), ref buildingData.m_adults, ref buildingData.m_seniors);
                }

                if (__instance.m_inputResource4 != TransferManager.TransferReason.None)
                {
                    cargoDiff = Convert.ToInt32((__state[4] - Mod.CombineBytes(buildingData.m_education1, buildingData.m_education2)) / RI_Data.GetFactorCargo(__instance.m_inputResource4));
                    Mod.SplitBytes((ushort)Mathf.Clamp(__state[4] - cargoDiff, 0, 64000), ref buildingData.m_education1, ref buildingData.m_education2);
                }

                // Output (materials being produced)
                if (__instance.m_outputResource != TransferManager.TransferReason.None)
                {
                    //try
                    //{
                    //} catch (OverflowException Ex)
                    //{
                    //    Debug.Log($"Output overflow caught: cargoDiff:{buildingData.m_customBuffer1}-{__state[0]}={(buildingData.m_customBuffer1 - __state[0])} factor:{RI_Data.GetFactorCargo(__instance.m_outputResource)}\n{Ex.ToString()}");
                    //    Singleton<SimulationManager>.instance.SimulationPaused = true;
                    //}

                    cargoDiff = Convert.ToInt32((buildingData.m_customBuffer1 - __state[0]) / RI_Data.GetFactorCargo(__instance.m_outputResource));
                    buildingData.m_customBuffer1 = (ushort)Mathf.Clamp(__state[0] + cargoDiff, 0, 64000);
                    //Debug.Log($"Out ID:{buildingID}, state:{__state}, buff:{buildingData.m_customBuffer1}, diff:{cargoDiff}");
                }

                //if (__instance is UniqueFactoryAI)
                //    Debug.Log($"PF:{__instance.name}, ID:{buildingID}, lastDiff:{cargoDiff} (Old:{__state[0]}-{__state[1]},{__state[2]},{__state[3]},{__state[4]} - New:{buildingData.m_customBuffer1}-{buildingData.m_customBuffer2},{Mod.CombineBytes(buildingData.m_teens, buildingData.m_youngs)},{Mod.CombineBytes(buildingData.m_adults, buildingData.m_seniors)},{Mod.CombineBytes(buildingData.m_education1, buildingData.m_education2)})");
                //else
                //    Debug.Log($"PF:{__instance.name}, ID:{buildingID}, lastDiff:{cargoDiff} (Old:{__state[0]}-{__state[1]} - New:{buildingData.m_customBuffer1}-{buildingData.m_customBuffer2})");
            }
            else
            {
                Mod.DebugLine($"Unknown PF instance {__instance.name} ({__instance.GetType()})");
            }
        }
Ejemplo n.º 7
0
        public static void Prefix(byte parkID)
        {
            //Mod.DebugLine($"DPIP-Pre: {__instance.m_parkProperties.m_industryLevelInfo[1].m_workerLevelupRequirement}");

            DistrictManager dm    = Singleton <DistrictManager> .instance;
            DistrictPark    dp    = dm.m_parks.m_buffer[parkID];
            uint            level = (uint)dp.m_parkLevel;

            //Debug.Log($"DPIP-Pre - Inst:{__instance}, IsPark:{__instance.IsPark} IsInd:{__instance.IsIndustry}, {(uint)__instance.m_parkLevel}({__instance.m_parkLevel}), Type:{__instance.m_parkType}  -  ";
            //Debug.Log($"DPIP-Pre - Inst:{dp}, IsInd:{dp.IsIndustry}, {level}({dp.m_parkLevel}), Type:{dp.m_parkType}");

            if (DistrictPark.IsIndustryType(dp.m_parkType))
            {
                if (initialised[level])
                {
                    return;
                }
                initialised[level] = true;
                //Debug.Log($"DPIP-Pre: {dm.m_properties.m_parkProperties.m_industryLevelInfo[level].m_workerLevelupRequirement}");
                dm.m_properties.m_parkProperties.m_industryLevelInfo[level].m_workerLevelupRequirement = RI_Data.GetMilestone(level);
            }
        }
Ejemplo n.º 8
0
        public static void Postfix(ushort buildingID, ref Building buildingData, ExtractingFacilityAI __instance, ref ushort __state)
        {
            int cargoDiff;

            if (Mod.IsIndustriesBuilding(__instance))
            {
                // Output
                cargoDiff = Convert.ToInt32((buildingData.m_customBuffer1 - __state) / RI_Data.GetFactorCargo(__instance.m_outputResource));
                //Debug.Log($"ID:{buildingID}={(ushort)Mathf.Clamp(__state + cargoDiff, 0, 64000)} ({__state + cargoDiff}), state:{__state}, buff:{buildingData.m_customBuffer1}, diff:{cargoDiff}");
                buildingData.m_customBuffer1 = (ushort)Mathf.Clamp(__state + cargoDiff, 0, 64000);
            }
            else
            {
                Mod.DebugLine($"Unknown EF instance {__instance.name} ({__instance.GetType()})");
            }
        }
Ejemplo n.º 9
0
        public static void Postfix(ref InstanceID ___m_InstanceID, ref UILabel ___m_expenses)
        {
            ushort          id       = ___m_InstanceID.Building;
            Building        building = Singleton <BuildingManager> .instance.m_buildings.m_buffer[id];
            UniqueFactoryAI ai       = (UniqueFactoryAI)building.Info.m_buildingAI;
            int             volume;
            byte            health = Singleton <BuildingManager> .instance.m_buildings.m_buffer[id].m_health;

            volume = health * ai.m_inputRate1 * 16 / 100;
            long input1 = volume * IndustryBuildingAI.GetResourcePrice(ai.m_inputResource1) / (long)RI_Data.GetFactorCargo(ai.m_inputResource1) / 10000;

            volume = health * ai.m_inputRate2 * 16 / 100;
            long input2 = volume * IndustryBuildingAI.GetResourcePrice(ai.m_inputResource2) / (long)RI_Data.GetFactorCargo(ai.m_inputResource2) / 10000;

            volume = health * ai.m_inputRate3 * 16 / 100;
            long input3 = volume * IndustryBuildingAI.GetResourcePrice(ai.m_inputResource3) / (long)RI_Data.GetFactorCargo(ai.m_inputResource3) / 10000;

            volume = health * ai.m_inputRate4 * 16 / 100;
            long input4 = volume * IndustryBuildingAI.GetResourcePrice(ai.m_inputResource4) / (long)RI_Data.GetFactorCargo(ai.m_inputResource4) / 10000;

            ___m_expenses.text = (input1 + input2 + input3 + input4).ToString(Settings.moneyFormatNoCents, LocaleManager.cultureInfo);
        }
Ejemplo n.º 10
0
        public static void Postfix(ref InstanceID ___m_InstanceID, ref UILabel ___m_capacityLabel, ref UIPanel ___m_buffer)
        {
            ushort      id       = ___m_InstanceID.Building;
            Building    building = Singleton <BuildingManager> .instance.m_buildings.m_buffer[id];
            WarehouseAI ai       = (WarehouseAI)building.Info.m_buildingAI;

            TransferManager.TransferReason cargoType = ai.GetActualTransferReason(id, ref Singleton <BuildingManager> .instance.m_buildings.m_buffer[id]);

            /*Debug.Log($"id:{id} - {ai.name}: {cargoType} ({RI_Data.GetFactorCargo(cargoType)}x), m_sT={ai.m_storageType}, " +
             *  $"{(ulong)(building.m_customBuffer1 * 100 * RI_Data.GetFactorCargo(cargoType))}/" +
             *  $"{(uint)(ai.m_storageCapacity * RI_Data.GetFactorCargo(cargoType))} (actual {ai.m_storageCapacity})"
             *  );*/

            string text = StringUtils.SafeFormat(
                Locale.Get("INDUSTRYPANEL_BUFFERTOOLTIP"),
                IndustryWorldInfoPanel.FormatResource((ulong)(building.m_customBuffer1 * 100 * RI_Data.GetFactorCargo(cargoType))),
                IndustryWorldInfoPanel.FormatResourceWithUnit((uint)(ai.m_storageCapacity * RI_Data.GetFactorCargo(cargoType)), cargoType)
                );

            ___m_buffer.tooltip     = text;
            ___m_capacityLabel.text = text;
        }
Ejemplo n.º 11
0
        public static void Postfix(ref ExtractingFacilityAI ___m_extractingFacilityAI, ref ProcessingFacilityAI ___m_processingFacilityAI, ref InstanceID ___m_InstanceID, ref UIProgressBar ___m_inputBuffer, ref UIPanel ___m_inputSection, ref UIProgressBar ___m_outputBuffer, ref UIPanel ___m_outputSection)
        {
            ushort id = ___m_InstanceID.Building;

            ExtractingFacilityAI ai_ef = ___m_extractingFacilityAI;

            if (ai_ef != null)
            {
                int customBuffer = Convert.ToInt32(Singleton <BuildingManager> .instance.m_buildings.m_buffer[id].m_customBuffer1 * RI_Data.GetFactorCargo(ai_ef.m_outputResource));
                int capacity     = Convert.ToInt32(ai_ef.GetOutputBufferSize(id, ref Singleton <BuildingManager> .instance.m_buildings.m_buffer[id]) * RI_Data.GetFactorCargo(ai_ef.m_outputResource));
                //Debug.Log($"EFAI-OST: {id} - {customBuffer}/{capacity}");
                //___m_outputBuffer.value = IndustryWorldInfoPanel.SafelyNormalize(customBuffer, capacity);
                ___m_outputSection.tooltip = StringUtils.SafeFormat(
                    Locale.Get("INDUSTRYPANEL_BUFFERTOOLTIP"),
                    IndustryWorldInfoPanel.FormatResource((uint)customBuffer),
                    IndustryWorldInfoPanel.FormatResourceWithUnit((uint)capacity, ai_ef.m_outputResource)
                    );
            }
        }
Ejemplo n.º 12
0
 public static int Postfix(int price, TransferManager.TransferReason material)
 {
     return(Convert.ToInt32(price * RI_Data.GetFactorCargo(material)));
 }
        public override void OnLevelLoaded(LoadMode mode)
        {
            if (!(mode == LoadMode.LoadGame || mode == LoadMode.LoadScenario || mode == LoadMode.NewGame || mode == LoadMode.NewGameFromScenario))
            {
                return;
            }

            HarmonyInstance harmony = Mod.GetHarmonyInstance();

            harmony.PatchAll(Assembly.GetExecutingAssembly());
            Building[] buffer = ColossalFramework.Singleton <BuildingManager> .instance.m_buildings.m_buffer;

            // Reset re-balanced WorkShop assets before applying modifiers
            for (uint i = 0; i < PrefabCollection <BuildingInfo> .LoadedCount(); i++)
            {
                if (PrefabCollection <BuildingInfo> .GetLoaded(i) != null)
                {
                    BuildingInfo prefab = PrefabCollection <BuildingInfo> .GetLoaded(i);

                    if (prefab.m_class.m_service == ItemClass.Service.PlayerIndustry)
                    {
                        Dictionary <string, string> resetList = RI_Data.GetWSResets();
                        if (resetList.ContainsKey(prefab.name))
                        {
                            ResetBuildingToVanilla(ref prefab, PrefabCollection <BuildingInfo> .FindLoaded(resetList[prefab.name]));
                        }
                    }
                }
            }


            // Apply Modifiers
            for (uint i = 0; i < PrefabCollection <BuildingInfo> .LoadedCount(); i++)
            {
                if (PrefabCollection <BuildingInfo> .GetLoaded(i) != null)
                {
                    BuildingInfo prefab = PrefabCollection <BuildingInfo> .GetLoaded(i);

                    if (prefab.m_class.m_service == ItemClass.Service.PlayerIndustry)
                    {
                        //Mod.DebugLine($" - {prefab.m_buildingAI}");
                        if (prefab.m_buildingAI is ExtractingFacilityAI ai_ef)
                        {
                            //int oldExtract = ai_ef.m_extractRate; int oldOutputRate = ai_ef.m_outputRate; int oldVehicles = ai_ef.m_outputVehicleCount;
                            RI_BuildingFactor factor = RI_Data.GetFactorBuilding(ai_ef);
                            ai_ef.m_constructionCost   = Convert.ToInt32(ai_ef.m_constructionCost / factor.Costs);
                            ai_ef.m_maintenanceCost    = Convert.ToInt32(ai_ef.m_maintenanceCost / factor.Costs);
                            ai_ef.m_outputVehicleCount = Math.Max(RI_Data.MIN_VEHICLES, Convert.ToInt32(Math.Floor(ai_ef.m_outputVehicleCount / RI_Data.GetFactorCargo(ai_ef.m_outputResource))));

                            ai_ef.m_extractRate            = Convert.ToInt32(ai_ef.m_extractRate / factor.Production);
                            ai_ef.m_outputRate             = Convert.ToInt32(ai_ef.m_outputRate / factor.Production);
                            ai_ef.m_electricityConsumption = Convert.ToInt32(ai_ef.m_electricityConsumption / factor.Production);
                            ai_ef.m_waterConsumption       = Convert.ToInt32(ai_ef.m_waterConsumption / factor.Production);
                            ai_ef.m_sewageAccumulation     = Convert.ToInt32(ai_ef.m_sewageAccumulation / factor.Production);
                            ai_ef.m_garbageAccumulation    = Convert.ToInt32(ai_ef.m_garbageAccumulation / factor.Production);
                            ai_ef.m_fireHazard             = Convert.ToInt32(ai_ef.m_fireHazard / factor.Production);
                            //Mod.DebugLine($"Production F={Convert.ToInt32(factor.Production)}, ai={ai_ef.GetType().ToString()}, Extract:{oldExtract}=>{ai_ef.m_extractRate}, Output:{oldOutputRate}=>{ai_ef.m_outputRate}, Output:{oldVehicles}=>{ai_ef.m_outputVehicleCount}");
                            SwitchWorkPlaces(ai_ef);
                        }
                        else if (prefab.m_buildingAI is UniqueFactoryAI ai_uf) // Must be processed before ProcessingFacilityAI
                        {
                            //Mod.DebugLine($"UF: {prefab.m_buildingAI.name}");
                            RI_UniqueFactoryProfile profile = RI_Data.GetUniqueFactoryProfile(ai_uf);
                            if (profile.Cost >= 0)
                            {
                                ai_uf.m_maintenanceCost = Convert.ToInt32(profile.Cost * 100 / 16);
                            }
                            if (profile.Workers[0] >= 0)
                            {
                                ai_uf.m_workPlaceCount0 = profile.Workers[0];
                            }
                            if (profile.Workers[1] >= 0)
                            {
                                ai_uf.m_workPlaceCount1 = profile.Workers[1];
                            }
                            if (profile.Workers[2] >= 0)
                            {
                                ai_uf.m_workPlaceCount2 = profile.Workers[2];
                            }
                            if (profile.Workers[3] >= 0)
                            {
                                ai_uf.m_workPlaceCount3 = profile.Workers[3];
                            }
                            //Mod.DebugLine($"{ai_uf.name}: {profile.Cost} - {profile.Workers[0]},{profile.Workers[1]},{profile.Workers[2]},{profile.Workers[3]}");
                        }
                        else if (prefab.m_buildingAI is ProcessingFacilityAI ai_pf) // Must be processed after UniqueFactoryAI
                        {
                            if (Mod.IsField(ai_pf))                                 // Pasture
                            {
                                RI_BuildingFactor factor = RI_Data.GetFactorBuilding(ai_pf);
                                ai_pf.m_constructionCost = Convert.ToInt32(ai_pf.m_constructionCost / factor.Costs);
                                ai_pf.m_maintenanceCost  = Convert.ToInt32(ai_pf.m_maintenanceCost / factor.Costs);
                                SwitchWorkPlaces(ai_pf);
                            }
                            ai_pf.m_outputVehicleCount  = Math.Max(RI_Data.MIN_VEHICLES, Convert.ToInt32(Math.Floor(ai_pf.m_outputVehicleCount / RI_Data.GetFactorCargo(ai_pf.m_outputResource))));
                            ai_pf.m_outputVehicleCount += 1;
                        }
                        else if (prefab.m_buildingAI is WarehouseAI ai_w)
                        {
                            Mod.DebugLine($"Warehouse {ai_w.name}: T={ai_w.m_truckCount}, SC={ai_w.m_storageCapacity}, ST={ai_w.m_storageType}");
                            if (Mod.IsExtractorWarehouse(ai_w))
                            {
                                if (RI_Data.GetFactorCargo(ai_w.m_storageType) != 1)
                                {
                                    decimal subfactor = (RI_Data.GetFactorCargo(ai_w.m_storageType) - 1) / 1.5m + 1;
                                    ai_w.m_truckCount = Convert.ToInt32(Math.Ceiling(ai_w.m_truckCount / subfactor));
                                    if (ai_w.m_storageCapacity <= RI_Data.TINY_WAREHOUSE_CAPACITY)
                                    {
                                        ai_w.m_truckCount = Math.Max(1, ai_w.m_truckCount);
                                    }
                                    else
                                    {
                                        ai_w.m_truckCount = Math.Max(RI_Data.MIN_VEHICLES, ai_w.m_truckCount);
                                    }
                                }
                            }
                            else
                            {
                                if (RI_Data.GetFactorBuilding(ai_w).Production != 1)
                                {
                                    ai_w.m_truckCount = Convert.ToInt32(ai_w.m_truckCount / RI_Data.GetFactorBuilding(ai_w).Production);
                                    if (ai_w.m_storageCapacity <= RI_Data.TINY_WAREHOUSE_CAPACITY)
                                    {
                                        ai_w.m_truckCount = Math.Max(1, ai_w.m_truckCount);
                                    }
                                    else
                                    {
                                        ai_w.m_truckCount = Math.Max(RI_Data.MIN_VEHICLES, ai_w.m_truckCount);
                                    }
                                }
                            }
                            ai_w.m_constructionCost = Convert.ToInt32(ai_w.m_constructionCost / RI_Data.GetFactorBuilding(ai_w).Costs);
                            ai_w.m_maintenanceCost  = Convert.ToInt32(ai_w.m_maintenanceCost / RI_Data.GetFactorBuilding(ai_w).Costs);
                            SwitchWorkPlaces(ai_w);
                            Mod.DebugLine($"       Now {ai_w.name}: T={ai_w.m_truckCount}, SC={ai_w.m_storageCapacity}, ST={ai_w.m_storageType}");
                        }
                        else if (!(prefab.m_buildingAI is AuxiliaryBuildingAI || prefab.m_buildingAI is MainIndustryBuildingAI || prefab.m_buildingAI is DummyBuildingAI))
                        {
                            Mod.DebugLine($"Applying modifiers: Unknown prefab={prefab.name}, {prefab.m_buildingAI}");
                        }
                    }
                }
            }
        }