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; } }
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)); }
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()})"); } }
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()})"); } }
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); }
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; }
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) ); } }
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}"); } } } } }