From ef5896024544a9cda62c3fe938dcdcb1d25180c0 Mon Sep 17 00:00:00 2001 From: PhatPhuckDave Date: Fri, 18 Oct 2024 22:59:48 +0200 Subject: [PATCH] Fix excavator capacity bullshit --- .../CykaOfIndustry/Patches.cs | 732 +++++++++--------- 1 file changed, 375 insertions(+), 357 deletions(-) diff --git a/Projects/CaptainOfIndustry/CykaOfIndustry/Patches.cs b/Projects/CaptainOfIndustry/CykaOfIndustry/Patches.cs index 1fa4924..184a7a0 100644 --- a/Projects/CaptainOfIndustry/CykaOfIndustry/Patches.cs +++ b/Projects/CaptainOfIndustry/CykaOfIndustry/Patches.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Reflection; using System.Reflection.Emit; using HarmonyLib; using Mafi; @@ -22,78 +23,79 @@ using Mafi.Core.Ports.Io; using Mafi.Core.Products; using Mafi.Core.Prototypes; using Mafi.Core.Terrain; +using Mafi.Core.Vehicles.Excavators; using Mafi.Core.World.Entities; namespace CykaOfIndustry { - [HarmonyPatch] - public class Patches { - [HarmonyPrefix] - [HarmonyPatch(typeof(ExcavatorProtoBuilder.ExcavatorProtoBuilderState), "SetCapacity")] - static void excavatorCapacityMultiplier(ref int quantity) { + [HarmonyPatch] + public class Patches { + [HarmonyPrefix] + [HarmonyPatch(typeof(ExcavatorProtoBuilder.ExcavatorProtoBuilderState), "SetCapacity")] + static void excavatorCapacityMultiplier(ref int quantity) { // Console.WriteLine("IndustrialCyka: Old excavator capacity: {0}", quantity); - quantity *= Main.excavatorCapacityMultiplier.Value; + quantity *= Main.excavatorCapacityMultiplier.Value; // Console.WriteLine("IndustrialCyka: Old excavator capacity: {0}", quantity); - } + } - [HarmonyPrefix] - [HarmonyPatch(typeof(ExcavatorProtoBuilder.ExcavatorProtoBuilderState), "SetMinedThicknessByDistanceMeters")] - static void excavatorMiningAreaMultiplier(ref float[] thicknessMeters) { - for (int i = 0; i < thicknessMeters.Length; i++) { + [HarmonyPrefix] + [HarmonyPatch(typeof(ExcavatorProtoBuilder.ExcavatorProtoBuilderState), "SetMinedThicknessByDistanceMeters")] + static void excavatorMiningAreaMultiplier(ref float[] thicknessMeters) { + for (int i = 0; i < thicknessMeters.Length; i++) { // Console.WriteLine("IndustrialCyka: Old mining area: {0}", thicknessMeters[i]); - thicknessMeters[i] *= Main.excavatorMiningAreaMultiplier.Value; + thicknessMeters[i] *= Main.excavatorMiningAreaMultiplier.Value; // Console.WriteLine("IndustrialCyka: New mining area: {0}", thicknessMeters[i]); - } - } + } + } - [HarmonyPrefix] - [HarmonyPatch(typeof(ExcavatorProtoBuilder.ExcavatorProtoBuilderState), "SetMaxMiningDistance")] - static void excavatorReachMultiplier(ref RelTile1i minMiningDistance, ref RelTile1i maxMiningDistance) { - Console.WriteLine("Min distance: {0}, max distance: {1}", minMiningDistance, maxMiningDistance); - minMiningDistance = new RelTile1i((int)(minMiningDistance.Value * Main.excavatorMinReachMultiplier.Value)); - maxMiningDistance = new RelTile1i((int)(maxMiningDistance.Value * Main.excavatorMaxReachMultiplier.Value)); - Console.WriteLine("Min distance: {0}, max distance: {1}", minMiningDistance, maxMiningDistance); - } + [HarmonyPrefix] + [HarmonyPatch(typeof(ExcavatorProtoBuilder.ExcavatorProtoBuilderState), "SetMaxMiningDistance")] + static void excavatorReachMultiplier(ref RelTile1i minMiningDistance, ref RelTile1i maxMiningDistance) { + Console.WriteLine("Min distance: {0}, max distance: {1}", minMiningDistance, maxMiningDistance); + minMiningDistance = new RelTile1i((int)(minMiningDistance.Value * Main.excavatorMinReachMultiplier.Value)); + maxMiningDistance = new RelTile1i((int)(maxMiningDistance.Value * Main.excavatorMaxReachMultiplier.Value)); + Console.WriteLine("Min distance: {0}, max distance: {1}", minMiningDistance, maxMiningDistance); + } - [HarmonyPrefix] - [HarmonyPatch(typeof(TruckProtoBuilder.TruckProtoBuilderState), "SetCapacity")] - static void truckCapacityMultiplier(ref int quantity) { + [HarmonyPrefix] + [HarmonyPatch(typeof(TruckProtoBuilder.TruckProtoBuilderState), "SetCapacity")] + static void truckCapacityMultiplier(ref int quantity) { // Console.WriteLine("IndustrialCyka: Old truck capacity: {0}", quantity); - quantity *= Main.truckCapacityMultiplier.Value; + quantity *= Main.truckCapacityMultiplier.Value; // Console.WriteLine("IndustrialCyka: New truck capacity: {0}", quantity); - } + } - // [HarmonyPrefix] - // [HarmonyPatch(typeof(StorageProtoBuilder.State), "SetCapacity")] - // static void storageCapacityMultiplier(ref int capacity) { + // [HarmonyPrefix] + // [HarmonyPatch(typeof(StorageProtoBuilder.State), "SetCapacity")] + // static void storageCapacityMultiplier(ref int capacity) { // // Console.WriteLine("IndustrialCyka: Old storage capacity: {0}", capacity); - // capacity = (int)(capacity * Main.storageCapacityMultiplier.Value); + // capacity = (int)(capacity * Main.storageCapacityMultiplier.Value); // // Console.WriteLine("IndustrialCyka: New storage capacity: {0}", capacity); - // } + // } - [HarmonyPostfix] - [HarmonyPatch(typeof(CargoShipModuleProto), MethodType.Constructor, - new[] { - typeof(Proto.ID), typeof(Proto.Str), typeof(ProductType), typeof(Quantity), - typeof(CargoShipModuleProto.Gfx) - })] - static void cargoShipCapacityMultiplier(CargoShipModuleProto __instance) { + [HarmonyPostfix] + [HarmonyPatch(typeof(CargoShipModuleProto), MethodType.Constructor, + new[] { + typeof(Proto.ID), typeof(Proto.Str), typeof(ProductType), typeof(Quantity), + typeof(CargoShipModuleProto.Gfx) + })] + static void cargoShipCapacityMultiplier(CargoShipModuleProto __instance) { // Console.WriteLine("IndustrialCyka: Old ship capacity: {0}", __instance.Capacity.Value); - __instance.Capacity = new Quantity(__instance.Capacity.Value * Main.cargoShipCapacityMultiplier.Value); + __instance.Capacity = new Quantity(__instance.Capacity.Value * Main.cargoShipCapacityMultiplier.Value); // Console.WriteLine("IndustrialCyka: New ship capacity: {0}", __instance.Capacity.Value); - } + } - // No workey... idk how it's supposed to work, speed is always 1 or 100% - // [HarmonyPrefix] - // [HarmonyPatch(typeof(DrivingEntity), "SetSpeedFactor")] - // static void vehicleSpeedMultiplier(ref Percent speedFactor) { + // No workey... idk how it's supposed to work, speed is always 1 or 100% + // [HarmonyPrefix] + // [HarmonyPatch(typeof(DrivingEntity), "SetSpeedFactor")] + // static void vehicleSpeedMultiplier(ref Percent speedFactor) { // // Console.WriteLine("IndustrialCyka: Old speed: {0}", speedFactor.ToString()); - // // typeof(Percent) - // // .GetField("RawValue",BindingFlags.Instance|BindingFlags.NonPublic) - // // .SetValue(speedFactor,speedFactor.ToFloat() / Main.vehicleSpeedMultiplier.Value); - // Percent newSpeedFactor = Percent.FromFloat(speedFactor.ToFloat() / Main.vehicleSpeedMultiplier.Value); - // speedFactor = newSpeedFactor; + // // typeof(Percent) + // // .GetField("RawValue",BindingFlags.Instance|BindingFlags.NonPublic) + // // .SetValue(speedFactor,speedFactor.ToFloat() / Main.vehicleSpeedMultiplier.Value); + // Percent newSpeedFactor = Percent.FromFloat(speedFactor.ToFloat() / Main.vehicleSpeedMultiplier.Value); + // speedFactor = newSpeedFactor; // // Console.WriteLine("IndustrialCyka: New speed: {1}", newSpeedFactor.RawValue.ToString()); - // } + // } // [HarmonyPostfix] // [HarmonyPatch(typeof(SmoothDriver), "SetSpeedFactor")] @@ -116,350 +118,366 @@ namespace CykaOfIndustry { // // maxBackwardsSpeedField.GetValue(), maxAccelerationField.GetValue()); // } - [HarmonyPostfix] - [HarmonyPatch(typeof(StorageBaseProto), MethodType.Constructor, - new[] { - typeof(StaticEntityProto.ID), - typeof(Proto.Str), - typeof(EntityLayout), - typeof(Quantity), - typeof(EntityCosts), - typeof(LayoutEntityProto.Gfx), - typeof(Quantity), - typeof(Duration), - typeof(IEnumerable) - })] - static void storageCapacityMultiplier(StorageProto __instance) { + [HarmonyPostfix] + [HarmonyPatch(typeof(StorageBaseProto), MethodType.Constructor, + new[] { + typeof(StaticEntityProto.ID), + typeof(Proto.Str), + typeof(EntityLayout), + typeof(Quantity), + typeof(EntityCosts), + typeof(LayoutEntityProto.Gfx), + typeof(Quantity), + typeof(Duration), + typeof(IEnumerable) + })] + static void storageCapacityMultiplier(StorageProto __instance) { // Console.WriteLine("IndustrialCyka: Old storage capacity: {0}", __instance.Capacity.Value); // Console.WriteLine("IndustrialCyka: Old storage transfer limit: {0}", __instance.TransferLimit.Value); - Traverse traverse = Traverse.Create(__instance); + Traverse traverse = Traverse.Create(__instance); - traverse.Field("Capacity") - .SetValue(new Quantity((int)(__instance.Capacity.Value * Main.storageCapacityMultiplier.Value))); - traverse.Field("TransferLimit").SetValue(new Quantity(10000)); - traverse.Field("TransferLimitDuration").SetValue(Duration.FromTicks(1)); + traverse.Field("Capacity") + .SetValue(new Quantity((int)(__instance.Capacity.Value * Main.storageCapacityMultiplier.Value))); + traverse.Field("TransferLimit").SetValue(new Quantity(10000)); + traverse.Field("TransferLimitDuration").SetValue(Duration.FromTicks(1)); // Console.WriteLine("IndustrialCyka: New storage capacity: {0}", __instance.Capacity.Value); // Console.WriteLine("IndustrialCyka: New storage transfer limit: {0}", __instance.TransferLimit.Value); - } + } - [HarmonyPrefix] - [HarmonyPatch(typeof(UpointsManager), "GenerateUnity")] - static void unityGenerationMultiplier(Proto.ID categoryId, ref Upoints generated) { + [HarmonyPrefix] + [HarmonyPatch(typeof(UpointsManager), "GenerateUnity")] + static void unityGenerationMultiplier(Proto.ID categoryId, ref Upoints generated) { // Console.WriteLine("IndustrialCyka: Old generated {0} unity", generated.Value); - Fix32 multi = Fix32.FromFloat(Main.unityGenerationMultiplier.Value); - generated = new Upoints(generated.Value * multi); + Fix32 multi = Fix32.FromFloat(Main.unityGenerationMultiplier.Value); + generated = new Upoints(generated.Value * multi); // Console.WriteLine("IndustrialCyka: New generated {0} unity", generated.Value); - } + } - [HarmonyTranspiler] - [HarmonyPatch(typeof(Machine), "updateWorkOnRecipes")] - static IEnumerable unityBooster(IEnumerable instructions) { - Dictionary matchTable = new Dictionary(); - matchTable[0] = OpCodes.Ldsfld; - matchTable[1] = OpCodes.Br; - matchTable[2] = OpCodes.Ldc_I4_2; - int matches = 0; - int totalMatch = matchTable.Count; + [HarmonyTranspiler] + [HarmonyPatch(typeof(Machine), "updateWorkOnRecipes")] + static IEnumerable unityBooster(IEnumerable instructions) { + Dictionary matchTable = new Dictionary(); + matchTable[0] = OpCodes.Ldsfld; + matchTable[1] = OpCodes.Br; + matchTable[2] = OpCodes.Ldc_I4_2; + int matches = 0; + int totalMatch = matchTable.Count; - var codes = new List(instructions); - for (int i = 0; i < codes.Count; i++) { - if (matches >= totalMatch) { - break; - } + var codes = new List(instructions); + for (int i = 0; i < codes.Count; i++) { + if (matches >= totalMatch) { + break; + } - if (codes[i].opcode.Equals(matchTable[matches])) { - if (matches == totalMatch - 1) { - codes[i].opcode = OpCodes.Ldc_I4_6; - } + if (codes[i].opcode.Equals(matchTable[matches])) { + if (matches == totalMatch - 1) { + codes[i].opcode = OpCodes.Ldc_I4_6; + } - matches++; - } - } + matches++; + } + } - // for (int i = 0; i < codes.Count; i++) { - // Console.WriteLine(codes[i].ToString()); - // } + // for (int i = 0; i < codes.Count; i++) { + // Console.WriteLine(codes[i].ToString()); + // } - return codes.AsEnumerable(); - } + return codes.AsEnumerable(); + } - // Could not make this work either... idk why... Doesn't make sense... - // [HarmonyPostfix] - // [HarmonyPatch(typeof(SimpleVirtualResource), "MineResourceAt")] - // static void infiniteGroundResources(SimpleVirtualResource __instance) { + // Could not make this work either... idk why... Doesn't make sense... + // [HarmonyPostfix] + // [HarmonyPatch(typeof(SimpleVirtualResource), "MineResourceAt")] + // static void infiniteGroundResources(SimpleVirtualResource __instance) { // // Console.WriteLine("IndustrialCyka: Patching ground resources (Capacity)"); - // Traverse traverse = Traverse.Create(__instance); - // Traverse capacityField = traverse.Field("Capacity"); - // capacityField.SetValue(1000000000); - // Traverse quantityField = traverse.Field("Quantity"); - // quantityField.SetValue(1000000000); - // } + // Traverse traverse = Traverse.Create(__instance); + // Traverse capacityField = traverse.Field("Capacity"); + // capacityField.SetValue(1000000000); + // Traverse quantityField = traverse.Field("Quantity"); + // quantityField.SetValue(1000000000); + // } - [HarmonyPrefix] - [HarmonyPatch(typeof(ProductBuffer), "ForceNewCapacityTo")] - static void bufferCapacityMultiplier(ref Quantity newCapacity) { - if (newCapacity.Value <= 0) { - return; - } + [HarmonyPrefix] + [HarmonyPatch(typeof(ProductBuffer), "ForceNewCapacityTo")] + static void bufferCapacityMultiplier(ref Quantity newCapacity) { + if (newCapacity.Value <= 0) { + return; + } - Quantity newNewCapacity = new Quantity((int)(newCapacity.Value * Main.bufferCapacityMultiplier.Value)); - newCapacity = newNewCapacity; - } + Quantity newNewCapacity = new Quantity((int)(newCapacity.Value * Main.bufferCapacityMultiplier.Value)); + newCapacity = newNewCapacity; + } - [HarmonyPostfix] - [HarmonyPatch(typeof(CargoDepotModuleProto), MethodType.Constructor, - new[] { - typeof(CargoDepotModuleProto.ID), - typeof(Proto.Str), - typeof(EntityLayout), - typeof(ProductType), - typeof(Option), - typeof(Quantity), - typeof(Quantity), - typeof(Duration), - typeof(Electricity), - typeof(bool), - typeof(Percent), - typeof(EntityCosts), - typeof(CargoDepotModuleProto.Gfx), - typeof(IEnumerable), - })] - static void depotTransferSpeedMultiplier(CargoDepotModuleProto __instance) { - // Console.WriteLine("IndustrialCyka: Old storage capacity: {0}", __instance.Capacity.Value); - Traverse traverse = Traverse.Create(__instance); + [HarmonyPostfix] + [HarmonyPatch(typeof(CargoDepotModuleProto), MethodType.Constructor, + new[] { + typeof(CargoDepotModuleProto.ID), + typeof(Proto.Str), + typeof(EntityLayout), + typeof(ProductType), + typeof(Option), + typeof(Quantity), + typeof(Quantity), + typeof(Duration), + typeof(Electricity), + typeof(bool), + typeof(Percent), + typeof(EntityCosts), + typeof(CargoDepotModuleProto.Gfx), + typeof(IEnumerable), + })] + static void depotTransferSpeedMultiplier(CargoDepotModuleProto __instance) { + // Console.WriteLine("IndustrialCyka: Old storage capacity: {0}", __instance.Capacity.Value); + Traverse traverse = Traverse.Create(__instance); - traverse.Field("QuantityPerExchange") - .SetValue(new Quantity((int)(__instance.QuantityPerExchange.Value * - Main.depotTransferSpeedMultiplier.Value))); + traverse.Field("QuantityPerExchange") + .SetValue(new Quantity((int)(__instance.QuantityPerExchange.Value * + Main.depotTransferSpeedMultiplier.Value))); // Console.WriteLine("IndustrialCyka: New storage capacity: {0}", __instance.Capacity.Value); - } + } - [HarmonyPostfix] - [HarmonyPatch(typeof(WorldMapMineProto), MethodType.Constructor, - new[] { - typeof(EntityProto.ID), - typeof(Proto.Str), - typeof(ProductQuantity), - typeof(Duration), - typeof(Upoints), - typeof(UpointsCategoryProto), - typeof(EntityCosts), - typeof(Func), - typeof(int), - typeof(Quantity), - typeof(WorldMapEntityProto.Gfx), - typeof(int), - typeof(int), - typeof(IEnumerable), - })] - static void worldMineSpeedMultiplier(WorldMapMineProto __instance) { - // Console.WriteLine("Before: {0}", __instance.ProducedProductPerStep.Quantity.Value); - ProductQuantity newProductQuantity = new ProductQuantity(__instance.ProducedProductPerStep.Product, - new Quantity((int)(__instance.ProducedProductPerStep.Quantity.Value * - Main.worldMineSpeedMultiplier.Value))); + [HarmonyPostfix] + [HarmonyPatch(typeof(WorldMapMineProto), MethodType.Constructor, + new[] { + typeof(EntityProto.ID), + typeof(Proto.Str), + typeof(ProductQuantity), + typeof(Duration), + typeof(Upoints), + typeof(UpointsCategoryProto), + typeof(EntityCosts), + typeof(Func), + typeof(int), + typeof(Quantity), + typeof(WorldMapEntityProto.Gfx), + typeof(int), + typeof(int), + typeof(IEnumerable), + })] + static void worldMineSpeedMultiplier(WorldMapMineProto __instance) { + // Console.WriteLine("Before: {0}", __instance.ProducedProductPerStep.Quantity.Value); + ProductQuantity newProductQuantity = new ProductQuantity(__instance.ProducedProductPerStep.Product, + new Quantity((int)(__instance.ProducedProductPerStep.Quantity.Value * + Main.worldMineSpeedMultiplier.Value))); - Traverse.Create(__instance) - .Field("ProducedProductPerStep") - .SetValue(newProductQuantity); - // Console.WriteLine("After: {0}", __instance.ProducedProductPerStep.Quantity.Value); - } + Traverse.Create(__instance) + .Field("ProducedProductPerStep") + .SetValue(newProductQuantity); + // Console.WriteLine("After: {0}", __instance.ProducedProductPerStep.Quantity.Value); + } - [HarmonyPostfix] - [HarmonyPatch(typeof(WorldMapMineProto), MethodType.Constructor, - new[] { - typeof(EntityProto.ID), - typeof(Proto.Str), - typeof(ProductQuantity), - typeof(Duration), - typeof(Upoints), - typeof(UpointsCategoryProto), - typeof(EntityCosts), - typeof(Func), - typeof(int), - typeof(Quantity), - typeof(WorldMapEntityProto.Gfx), - typeof(int), - typeof(int), - typeof(IEnumerable), - })] - static void worldMineLevelIncrementMultiplier(WorldMapMineProto __instance) { - Traverse traverse = Traverse.Create(__instance); + [HarmonyPostfix] + [HarmonyPatch(typeof(WorldMapMineProto), MethodType.Constructor, + new[] { + typeof(EntityProto.ID), + typeof(Proto.Str), + typeof(ProductQuantity), + typeof(Duration), + typeof(Upoints), + typeof(UpointsCategoryProto), + typeof(EntityCosts), + typeof(Func), + typeof(int), + typeof(Quantity), + typeof(WorldMapEntityProto.Gfx), + typeof(int), + typeof(int), + typeof(IEnumerable), + })] + static void worldMineLevelIncrementMultiplier(WorldMapMineProto __instance) { + Traverse traverse = Traverse.Create(__instance); - // int level = traverse.Field("Level").GetValue(); - int maxLevel = traverse.Field("MaxLevel").GetValue(); - // int levelsPerUpgrade = traverse.Field("LevelsPerUpgrade").GetValue(); + // int level = traverse.Field("Level").GetValue(); + int maxLevel = traverse.Field("MaxLevel").GetValue(); + // int levelsPerUpgrade = traverse.Field("LevelsPerUpgrade").GetValue(); - int newLevelsPerUpgrade = 10; - int newMaxLevel = (int)Math.Ceiling((double)maxLevel / newLevelsPerUpgrade) * newLevelsPerUpgrade; + int newLevelsPerUpgrade = 10; + int newMaxLevel = (int)Math.Ceiling((double)maxLevel / newLevelsPerUpgrade) * newLevelsPerUpgrade; - // Console.WriteLine("Level: {0}, MaxLevel: {1}, LevelsPerUpgrade: {2}", level, maxLevel, levelsPerUpgrade); - // Console.WriteLine("NewMaxLevel: {0}", newMaxLevel); + // Console.WriteLine("Level: {0}, MaxLevel: {1}, LevelsPerUpgrade: {2}", level, maxLevel, levelsPerUpgrade); + // Console.WriteLine("NewMaxLevel: {0}", newMaxLevel); - traverse.Field("MaxLevel").SetValue(newMaxLevel); - traverse.Field("LevelsPerUpgrade").SetValue(newLevelsPerUpgrade); - } + traverse.Field("MaxLevel").SetValue(newMaxLevel); + traverse.Field("LevelsPerUpgrade").SetValue(newLevelsPerUpgrade); + } - [HarmonyTranspiler] - [HarmonyPatch(typeof(WorldMapMineProto), MethodType.Constructor, - new[] { - typeof(EntityProto.ID), - typeof(Proto.Str), - typeof(ProductQuantity), - typeof(Duration), - typeof(Upoints), - typeof(UpointsCategoryProto), - typeof(EntityCosts), - typeof(Func), - typeof(int), - typeof(Quantity), - typeof(WorldMapEntityProto.Gfx), - typeof(int), - typeof(int), - typeof(IEnumerable), - })] - static IEnumerable cookWorldMineLevelIncrementMultiplier( - IEnumerable instructions) { - Dictionary matchTable = new Dictionary(); - matchTable[0] = OpCodes.Rem; - matchTable[1] = OpCodes.Ldfld; - matchTable[2] = OpCodes.Ldarg_0; - matchTable[3] = OpCodes.Ldfld; - matchTable[4] = OpCodes.Ldarg_0; - int matches = 0; - int totalMatch = matchTable.Count; + [HarmonyTranspiler] + [HarmonyPatch(typeof(WorldMapMineProto), MethodType.Constructor, + new[] { + typeof(EntityProto.ID), + typeof(Proto.Str), + typeof(ProductQuantity), + typeof(Duration), + typeof(Upoints), + typeof(UpointsCategoryProto), + typeof(EntityCosts), + typeof(Func), + typeof(int), + typeof(Quantity), + typeof(WorldMapEntityProto.Gfx), + typeof(int), + typeof(int), + typeof(IEnumerable), + })] + static IEnumerable cookWorldMineLevelIncrementMultiplier( + IEnumerable instructions) { + Dictionary matchTable = new Dictionary(); + matchTable[0] = OpCodes.Rem; + matchTable[1] = OpCodes.Ldfld; + matchTable[2] = OpCodes.Ldarg_0; + matchTable[3] = OpCodes.Ldfld; + matchTable[4] = OpCodes.Ldarg_0; + int matches = 0; + int totalMatch = matchTable.Count; - var codes = new List(instructions); - for (int i = codes.Count - 1; i >= 0; i--) { - if (matches >= totalMatch) { - break; - } + var codes = new List(instructions); + for (int i = codes.Count - 1; i >= 0; i--) { + if (matches >= totalMatch) { + break; + } - if (codes[i].opcode.Equals(matchTable[matches])) { - if (matches == totalMatch - 1) { - codes[i + 4].opcode = OpCodes.Add; - codes[i + 5].opcode = OpCodes.Brtrue_S; - break; - } + if (codes[i].opcode.Equals(matchTable[matches])) { + if (matches == totalMatch - 1) { + codes[i + 4].opcode = OpCodes.Add; + codes[i + 5].opcode = OpCodes.Brtrue_S; + break; + } - matches++; - } - else { - matches = 0; - } - } + matches++; + } + else { + matches = 0; + } + } - return codes.AsEnumerable(); - } + return codes.AsEnumerable(); + } - [HarmonyPostfix] - [HarmonyPatch(typeof(SettlementHousingModuleProto), MethodType.Constructor, new[] { - typeof(StaticEntityProto.ID), - typeof(Proto.Str), - typeof(EntityLayout), - typeof(EntityCosts), - typeof(int), - typeof(Upoints), - typeof(ImmutableArray, Percent>>), - typeof(IReadOnlyDictionary), - typeof(Option), - typeof(SettlementHousingModuleProto.Gfx), - })] - static void housingCapacityMultiplier(SettlementHousingModuleProto __instance) { - Traverse.Create(__instance).Field("Capacity").Value = - (int)(__instance.Capacity * Main.housingCapacityMultiplier.Value); - } + [HarmonyPostfix] + [HarmonyPatch(typeof(SettlementHousingModuleProto), MethodType.Constructor, new[] { + typeof(StaticEntityProto.ID), + typeof(Proto.Str), + typeof(EntityLayout), + typeof(EntityCosts), + typeof(int), + typeof(Upoints), + typeof(ImmutableArray, Percent>>), + typeof(IReadOnlyDictionary), + typeof(Option), + typeof(SettlementHousingModuleProto.Gfx), + })] + static void housingCapacityMultiplier(SettlementHousingModuleProto __instance) { + Traverse.Create(__instance).Field("Capacity").Value = + (int)(__instance.Capacity * Main.housingCapacityMultiplier.Value); + } - [HarmonyPostfix] - [HarmonyPatch(typeof(StackerProto), MethodType.Constructor, new[] { - typeof(StaticEntityProto.ID), - typeof(Proto.Str), - typeof(EntityLayout), - typeof(EntityCosts), - typeof(Electricity), - typeof(ThicknessTilesI), - typeof(RelTile3i), - typeof(Duration), - typeof(Duration), - typeof(StackerProto.Gfx), - typeof(ThicknessTilesI), - typeof(IEnumerable), - })] - static void dumpDelayMultiplier(StackerProto __instance) { - Duration newDelay = - new Duration(Math.Max((int)(__instance.DumpDelay.Ticks * Main.dumpDelayMultiplier.Value), 1)); - Traverse.Create(__instance).Field("DumpDelay").SetValue(newDelay); - } + [HarmonyPostfix] + [HarmonyPatch(typeof(StackerProto), MethodType.Constructor, new[] { + typeof(StaticEntityProto.ID), + typeof(Proto.Str), + typeof(EntityLayout), + typeof(EntityCosts), + typeof(Electricity), + typeof(ThicknessTilesI), + typeof(RelTile3i), + typeof(Duration), + typeof(Duration), + typeof(StackerProto.Gfx), + typeof(ThicknessTilesI), + typeof(IEnumerable), + })] + static void dumpDelayMultiplier(StackerProto __instance) { + Duration newDelay = + new Duration(Math.Max((int)(__instance.DumpDelay.Ticks * Main.dumpDelayMultiplier.Value), 1)); + Traverse.Create(__instance).Field("DumpDelay").SetValue(newDelay); + } - [HarmonyPrefix] - [HarmonyPatch(typeof(TransportProto), MethodType.Constructor, new[] { - typeof(StaticEntityProto.ID), - typeof(Proto.Str), - typeof(ThicknessTilesF), - typeof(Quantity), - typeof(RelTile1f), - typeof(RelTile1f), - typeof(RelTile1i), - typeof(bool), - typeof(bool), - typeof(Option), - typeof(RelTile1i), - typeof(IoPortShapeProto), - typeof(Electricity), - typeof(Percent), - typeof(bool), - typeof(bool), - typeof(EntityCosts), - typeof(RelTile1i), - typeof(Duration), - typeof(Option), - typeof(VirtualProductProto), - typeof(Quantity), - typeof(TransportProto.Gfx), - })] - static void transportSpeedMultiplier(ref StaticEntityProto.ID id, ref Proto.Str strings, - ref ThicknessTilesF surfaceRelativeHeight, ref Quantity maxQuantityPerTransportedProduct, - ref RelTile1f transportedProductsSpacing, ref RelTile1f speedPerTick, ref RelTile1i zStepLength, - ref bool needsPillarsAtGround, ref bool canBeBuried, - ref Option tileSurfaceWhenOnGround, ref RelTile1i maxPillarSupportRadius, - ref IoPortShapeProto portsShape, ref Electricity baseElectricityCost, ref Percent cornersSharpnessPercent, - ref bool allowMixedProducts, ref bool isBuildable, ref EntityCosts costs, ref RelTile1i lengthPerCost, - ref Duration constructionDurationPerProduct, ref Option nextTier, - ref VirtualProductProto maintenanceProduct, Quantity maintenancePerTile, ref TransportProto.Gfx graphics) { - if (TransportPillarProto.MAX_PILLAR_HEIGHT.Value < 25) - typeof(TransportPillarProto).GetField("MAX_PILLAR_HEIGHT").SetValue(null, new ThicknessTilesI(25)); - if (IoPort.MAX_TRANSFER_PER_TICK.Value < 10000) - typeof(IoPort).GetField("MAX_TRANSFER_PER_TICK").SetValue(null, new Quantity(10000)); + [HarmonyPrefix] + [HarmonyPatch(typeof(TransportProto), MethodType.Constructor, new[] { + typeof(StaticEntityProto.ID), + typeof(Proto.Str), + typeof(ThicknessTilesF), + typeof(Quantity), + typeof(RelTile1f), + typeof(RelTile1f), + typeof(RelTile1i), + typeof(bool), + typeof(bool), + typeof(Option), + typeof(RelTile1i), + typeof(IoPortShapeProto), + typeof(Electricity), + typeof(Percent), + typeof(bool), + typeof(bool), + typeof(EntityCosts), + typeof(RelTile1i), + typeof(Duration), + typeof(Option), + typeof(VirtualProductProto), + typeof(Quantity), + typeof(TransportProto.Gfx), + })] + static void transportSpeedMultiplier(ref StaticEntityProto.ID id, ref Proto.Str strings, + ref ThicknessTilesF surfaceRelativeHeight, ref Quantity maxQuantityPerTransportedProduct, + ref RelTile1f transportedProductsSpacing, ref RelTile1f speedPerTick, ref RelTile1i zStepLength, + ref bool needsPillarsAtGround, ref bool canBeBuried, + ref Option tileSurfaceWhenOnGround, ref RelTile1i maxPillarSupportRadius, + ref IoPortShapeProto portsShape, ref Electricity baseElectricityCost, ref Percent cornersSharpnessPercent, + ref bool allowMixedProducts, ref bool isBuildable, ref EntityCosts costs, ref RelTile1i lengthPerCost, + ref Duration constructionDurationPerProduct, ref Option nextTier, + ref VirtualProductProto maintenanceProduct, Quantity maintenancePerTile, ref TransportProto.Gfx graphics) { + if (TransportPillarProto.MAX_PILLAR_HEIGHT.Value < 25) + typeof(TransportPillarProto).GetField("MAX_PILLAR_HEIGHT").SetValue(null, new ThicknessTilesI(25)); + if (IoPort.MAX_TRANSFER_PER_TICK.Value < 10000) + typeof(IoPort).GetField("MAX_TRANSFER_PER_TICK").SetValue(null, new Quantity(10000)); - maxQuantityPerTransportedProduct *= 1000; - maxQuantityPerTransportedProduct = maxQuantityPerTransportedProduct.Min(new Quantity(10000)); - Console.WriteLine("maxQuantityPerTransportedProduct {0}", maxQuantityPerTransportedProduct); + maxQuantityPerTransportedProduct *= 1000; + maxQuantityPerTransportedProduct = maxQuantityPerTransportedProduct.Min(new Quantity(10000)); + Console.WriteLine("maxQuantityPerTransportedProduct {0}", maxQuantityPerTransportedProduct); - speedPerTick *= 10; - transportedProductsSpacing = speedPerTick; - zStepLength = RelTile1i.One; - canBeBuried = true; - maxPillarSupportRadius = new RelTile1i(8); - } + speedPerTick *= 10; + transportedProductsSpacing = speedPerTick; + zStepLength = RelTile1i.One; + canBeBuried = true; + maxPillarSupportRadius = new RelTile1i(8); + } - [HarmonyPostfix] - [HarmonyPatch(typeof(ShipyardProto), MethodType.Constructor, new[] { - typeof(StaticEntityProto.ID), - typeof(Proto.Str), - typeof(EntityLayout), - typeof(EntityCosts), - typeof(bool), - typeof(Quantity), - typeof(Option), - typeof(ImmutableArray>), - typeof(StackerProto.Gfx), - typeof(ImmutableArray), - typeof(bool), - })] - static void shipyardCargoMultiplier(ShipyardProto __instance) { - Traverse.Create(__instance).Field("CargoCapacity").SetValue(new Quantity( - (int)(__instance.CargoCapacity.Value * Main.shipyardCargoMultiplier.Value))); - } - } -} + [HarmonyPostfix] + [HarmonyPatch(typeof(ShipyardProto), MethodType.Constructor, new[] { + typeof(StaticEntityProto.ID), + typeof(Proto.Str), + typeof(EntityLayout), + typeof(EntityCosts), + typeof(bool), + typeof(Quantity), + typeof(Option), + typeof(ImmutableArray>), + typeof(StackerProto.Gfx), + typeof(ImmutableArray), + typeof(bool), + })] + static void shipyardCargoMultiplier(ShipyardProto __instance) { + Traverse.Create(__instance).Field("CargoCapacity").SetValue(new Quantity( + (int)(__instance.CargoCapacity.Value * Main.shipyardCargoMultiplier.Value))); + } + } + + [HarmonyPatch(typeof(Excavator), "MineMixedAt")] + public class MineMixedAtPatch { + public static Dictionary originalCapacity = new Dictionary(); + + static void Prefix(ref Excavator __instance) { + if (!originalCapacity.ContainsKey(__instance)) { + originalCapacity.Add(__instance, __instance.Prototype.Capacity); + } + + var trav = Traverse.Create(__instance.Prototype); + trav.Field("Capacity") + .SetValue(new Quantity(originalCapacity[__instance].Value * Main.excavatorCapacityMultiplier.Value)); + Console.WriteLine("IndustrialCyka: Excavator capacity: {0}", __instance.Prototype.Capacity.Value); + } + } +} \ No newline at end of file