diff --git a/Projects/InfectionFreeZone/InfectionFreeZone/InfectionFreeZone.cs b/Projects/InfectionFreeZone/InfectionFreeZone/InfectionFreeZone.cs index 298d292..9ecfbc3 100644 --- a/Projects/InfectionFreeZone/InfectionFreeZone/InfectionFreeZone.cs +++ b/Projects/InfectionFreeZone/InfectionFreeZone/InfectionFreeZone.cs @@ -8,11 +8,13 @@ using Controllers; using Controllers.CharacterLogic; using Controllers.Time; using Controllers.Weather; +using Data.Resorces; using GameCustomization; using Gameplay; using Gameplay.Buildings; using Gameplay.GameResources; using Gameplay.InGameResources; +using Gameplay.Production; using Gameplay.Rebuilding; using Gameplay.Rebuilding.Walls; using Gameplay.Scavenge; @@ -96,6 +98,10 @@ namespace InfectionFreeZone { public static ConfigEntry rotationTimestepMultiplier; public static ConfigEntry sunsetHourOffset; + public static ConfigEntry productionProfitMultiplierDebug; + public static ConfigEntry productionProfitMultiplier; + public static Dictionary productionProfitMultiplierDict; + public void Awake() { resourceMultiplierDebug = Config.Bind("General", "Resource Multiplier Debug", false); resourceMultiplier = Config.Bind("General", "Resource Multiplier", 1f); @@ -159,6 +165,35 @@ namespace InfectionFreeZone { rotationTimestepMultiplier = Config.Bind("General", "Rotation Timestep Multiplier", 1f); sunsetHourOffset = Config.Bind("General", "Sunset Hour Offset", 0f); + productionProfitMultiplierDebug = Config.Bind("General", "Production Profit Multiplier Debug", false); + productionProfitMultiplier = + Config.Bind("General", "Production Profit Multiplier (Resource ID: multiplier)", ""); + productionProfitMultiplierDict = new Dictionary(); + productionProfitMultiplier.SettingChanged += delegate(object sender, EventArgs e) { + productionProfitMultiplierDict.Clear(); + var str = productionProfitMultiplier.Value; + if (str == "") + return; + var split = str.Split(','); + foreach (var s in split) { + if (Main.productionProfitMultiplierDebug.Value) + Console.WriteLine($"Parsing {s}"); + var split2 = s.Split(':'); + if (split2.Length != 2) + continue; + var success = Enum.TryParse(split2[0], out var resourceID); + if (!success) { + Console.WriteLine($"Failed to parse {split2[0]} as a resource ID"); + continue; + } + + var multiplier = float.Parse(split2[1]); + productionProfitMultiplierDict.Add(resourceID, multiplier); + if (Main.productionProfitMultiplierDebug.Value) + Console.WriteLine($"Added {resourceID} with multiplier {multiplier}"); + } + }; + Logger.LogInfo("Cyka mod loaded"); HarmonyFileLog.Enabled = true; Harmony harmony = new Harmony(pluginGuid); @@ -508,5 +543,29 @@ namespace InfectionFreeZone { __result += Main.sunsetHourOffset.Value; } + + [HarmonyPrefix] + [HarmonyPatch(typeof(ProductionWork), "ProduceResources")] + public static void PrefixProduceResources(List productionDataParts) { + if (Main.productionProfitMultiplierDict.Count == 0) + return; + if (productionDataParts.Count == 0) + return; + + for (var i = 0; i < productionDataParts.Count; i++) { + var productionDataPart = productionDataParts[i]; + if (Main.productionProfitMultiplierDebug.Value) + Console.WriteLine( + $"Production data part is {productionDataPart.type} x {productionDataPart.amount}"); + if (Main.productionProfitMultiplierDict.TryGetValue(productionDataPart.type, out var setpoint)) { + if (Main.productionProfitMultiplierDebug.Value) + Console.WriteLine($"Production data part has setpoint {setpoint}"); + productionDataPart.amount = (int)setpoint; + if (Main.productionProfitMultiplierDebug.Value) + Console.WriteLine( + $"Production data part modified to {productionDataPart.type} x {productionDataPart.amount}"); + } + } + } } } \ No newline at end of file