/// <summary> /// Harmony Prefix patch to OfficeBuildingAI.CalculateProductionCapacity to implement mod production calculations. /// </summary> /// <param name="__result">Original method result</param> /// <param name="__instance">Original AI instance reference</param> /// <param name="level">Building level</param> /// <returns>False (don't execute base game method after this)</returns> public static bool Prefix(ref int __result, OfficeBuildingAI __instance, ItemClass.Level level) { // Get builidng info. BuildingInfo info = __instance.m_info; ItemClass.SubService subService = info.GetSubService(); // Get cached workplace count and calculate total workplaces. int[] workplaces = PopData.instance.WorkplaceCache(info, (int)level); int totalWorkers = workplaces[0] + workplaces[1] + workplaces[2] + workplaces[3]; // Using legacy settings? if (PopData.instance.ActivePack(info).version == (int)DataVersion.legacy) { // Legacy settings. int[] array = LegacyAIUtils.GetOfficeArray(info, (int)level); // Original method return value. __result = totalWorkers / array[DataStore.PRODUCTION]; } else { // Hew settings - multiply total workers by overall multiplier (from settings) to get result; divisor is 1,000 to match original mod 1/10th when at 100% production. __result = (totalWorkers * (subService == ItemClass.SubService.OfficeHightech ? highTechOfficeProdMult : genericOfficeProdMult)) / 1000; } // Always set at least one. if (__result < 1) { __result = 1; } // Don't execute base method after this. return(false); }
/// <summary> /// Pre-emptive Harmony Prefix patch for OfficeBuildingAI.GetConsumptionRates, to implement the mod's consumption calculations. /// </summary> /// <param name="__instance">AI instance reference</param> /// <param name="level">Building level</param> /// <param name="r">Randomizer</param> /// <param name="productionRate">Building production rate</param> /// <param name="electricityConsumption">Building electricity consumption</param> /// <param name="waterConsumption">Building water consumption</param> /// <param name="sewageAccumulation">Building sewage accumulation</param> /// <param name="garbageAccumulation">Building garbage accumulation</param> /// <param name="incomeAccumulation">Building income accumulation</param> /// <param name="mailAccumulation">Building mail accumulation</param> /// <returns>Always false (never execute original method)</returns> public static bool Prefix(OfficeBuildingAI __instance, ItemClass.Level level, Randomizer r, int productionRate, out int electricityConsumption, out int waterConsumption, out int sewageAccumulation, out int garbageAccumulation, out int incomeAccumulation, out int mailAccumulation) { // Get relevant array from datastore. int[] array = LegacyAIUtils.GetOfficeArray(__instance.m_info, (int)level); // Get consumption rates from array. electricityConsumption = array[DataStore.POWER]; waterConsumption = array[DataStore.WATER]; sewageAccumulation = array[DataStore.SEWAGE]; garbageAccumulation = array[DataStore.GARBAGE]; mailAccumulation = array[DataStore.MAIL]; // Calculate land value. int landValue = LegacyAIUtils.GetLandValueIncomeComponent(r.seed); incomeAccumulation = array[DataStore.INCOME] + landValue; // Apply consumption rates. electricityConsumption = Mathf.Max(100, productionRate * electricityConsumption) / 100; waterConsumption = Mathf.Max(100, productionRate * waterConsumption) / 100; sewageAccumulation = Mathf.Max(100, productionRate * sewageAccumulation) / 100; garbageAccumulation = Mathf.Max(100, productionRate * garbageAccumulation) / 100; incomeAccumulation = productionRate * incomeAccumulation; mailAccumulation = Mathf.Max(100, productionRate * mailAccumulation) / 100; // Don't execute base method after this. return(false); }
static bool Prefix(OfficeBuildingAI __instance, ItemClass.Level level, Randomizer r, int productionRate, out int electricityConsumption, out int waterConsumption, out int sewageAccumulation, out int garbageAccumulation, out int incomeAccumulation, out int mailAccumulation) { ItemClass item = __instance.m_info.m_class; int[] array = OfficeBuildingAIMod.GetArray(__instance.m_info, (int)level); electricityConsumption = array[DataStore.POWER]; waterConsumption = array[DataStore.WATER]; sewageAccumulation = array[DataStore.SEWAGE]; garbageAccumulation = array[DataStore.GARBAGE]; mailAccumulation = array[DataStore.MAIL]; int landVal = AI_Utils.GetLandValueIncomeComponent(r.seed); incomeAccumulation = array[DataStore.INCOME] + landVal; electricityConsumption = Mathf.Max(100, productionRate * electricityConsumption) / 100; waterConsumption = Mathf.Max(100, productionRate * waterConsumption) / 100; sewageAccumulation = Mathf.Max(100, productionRate * sewageAccumulation) / 100; garbageAccumulation = Mathf.Max(100, productionRate * garbageAccumulation) / 100; incomeAccumulation = productionRate * incomeAccumulation; mailAccumulation = Mathf.Max(100, productionRate * mailAccumulation) / 100; // Don't execute base method after this. return(false); }
static bool Prefix(ref int __result, OfficeBuildingAI __instance, ItemClass.Level level, Randomizer r, int width, int length) { ulong seed = r.seed; BuildingInfo item = __instance.m_info; PrefabEmployStruct worker; if (DataStore.prefabWorkerVisit.TryGetValue(item.gameObject.GetHashCode(), out worker)) { // Employment is available int workers = worker.level0 + worker.level1 + worker.level2 + worker.level3; int[] array = OfficeBuildingAIMod.GetArray(__instance.m_info, (int)level); // Original method return value. __result = Mathf.Max(1, workers / array[DataStore.PRODUCTION]); } else { // Original method return value. // Return minimum to be safe. __result = 1; } // Don't execute base method after this. return(false); }
public static bool Prefix(OfficeBuildingAI __instance, ItemClass.Level level, out int groundPollution, out int noisePollution) { int[] array = LegacyAIUtils.GetOfficeArray(__instance.m_info, (int)level); groundPollution = array[DataStore.GROUND_POLLUTION]; noisePollution = array[DataStore.NOISE_POLLUTION]; // Don't execute base method after this. return(false); }
static bool Prefix(OfficeBuildingAI __instance, ItemClass.Level level, int productionRate, DistrictPolicies.CityPlanning cityPlanningPolicies, out int groundPollution, out int noisePollution) { ItemClass @class = __instance.m_info.m_class; int[] array = OfficeBuildingAIMod.GetArray(__instance.m_info, (int)level); groundPollution = array[DataStore.GROUND_POLLUTION]; noisePollution = array[DataStore.NOISE_POLLUTION]; // Don't execute base method after this. return(false); }
static bool Prefix(OfficeBuildingAI __instance, ItemClass.Level level, Randomizer r, int width, int length, out int level0, out int level1, out int level2, out int level3) { ulong seed = r.seed; BuildingInfo item = __instance.m_info; int[] array = OfficeBuildingAIMod.GetArray(__instance.m_info, (int)level); PrefabEmployStruct output; // If not seen prefab, calculate if (!DataStore.prefabWorkerVisit.TryGetValue(item.gameObject.GetHashCode(), out output)) { AI_Utils.CalculateprefabWorkerVisit(width, length, ref item, 10, ref array, out output); DataStore.prefabWorkerVisit.Add(item.gameObject.GetHashCode(), output); } level0 = output.level0; level1 = output.level1; level2 = output.level2; level3 = output.level3; // Don't execute base method after this. return(false); }