static bool Prefix(ResidentialBuildingAI __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 = ResidentialBuildingAIMod.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); }
/// <summary> /// Pre-emptive Harmony Prefix patch for ResidentialBuildingAI.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(ResidentialBuildingAI __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.GetResidentialArray(__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); }
public static bool Prefix(ResidentialBuildingAI __instance, ItemClass.Level level, out int groundPollution, out int noisePollution) { int[] array = LegacyAIUtils.GetResidentialArray(__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(ResidentialBuildingAI __instance, ItemClass.Level level, int productionRate, DistrictPolicies.CityPlanning cityPlanningPolicies, out int groundPollution, out int noisePollution) { ItemClass @class = __instance.m_info.m_class; int[] array = ResidentialBuildingAIMod.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); }
/// <summary> /// Harmony Prefix patch to ResidentialBuildingAI.CalculateHomeCount to implement mod population calculations. /// </summary> /// <param name="__result">Original method result</param> /// <param name="__instance">Original AI instance reference</param> /// <param name="level">Building level</param> /// <param name="r">Randomizer (unused)</param> /// <param name="width">Building lot width (unused)</param> /// <param name="length">Building lot length (unused)</param> /// <returns>Always false (don't execute base game method after this)</returns> public static bool Prefix(ref int __result, ResidentialBuildingAI __instance, ItemClass.Level level, Randomizer r, int width, int length) { // Get population value from cache. __result = PopData.instance.HouseholdCache(__instance.m_info, (int)level); // Always set at least one. if (__result < 1) { Logging.Error("invalid homecount result ", __result.ToString(), " for ", __instance.m_info.name, "; setting to 1"); __result = 1; } // Don't execute base method after this. return(false); }
static bool Prefix(ref int __result, ResidentialBuildingAI __instance, ItemClass.Level level, Randomizer r, int width, int length) { BuildingInfo item = __instance.m_info; int returnValue = 0; if (!DataStore.prefabHouseHolds.TryGetValue(item.gameObject.GetHashCode(), out returnValue)) { int[] array = ResidentialBuildingAIMod.GetArray(__instance.m_info, (int)level); returnValue = AI_Utils.CalculatePrefabHousehold(width, length, ref item, ref array, (int)level); DataStore.prefabHouseHolds.Add(item.gameObject.GetHashCode(), returnValue); } // Original method return value. __result = returnValue; // Don't execute base method after this. return(false); }