diff --git a/Projects/CaptainOfIndustry/CaptainOfIndustry.sln.DotSettings.user b/Projects/CaptainOfIndustry/CaptainOfIndustry.sln.DotSettings.user index 85bd2d3..d9622d3 100644 --- a/Projects/CaptainOfIndustry/CaptainOfIndustry.sln.DotSettings.user +++ b/Projects/CaptainOfIndustry/CaptainOfIndustry.sln.DotSettings.user @@ -14,6 +14,11 @@ True True True + True + True + True + True + True True True <AssemblyExplorer /> diff --git a/Projects/CaptainOfIndustry/CaptainOfIndustry/CaptainOfIndustry.csproj b/Projects/CaptainOfIndustry/CaptainOfIndustry/CaptainOfIndustry.csproj index e3242b9..1ed6736 100644 --- a/Projects/CaptainOfIndustry/CaptainOfIndustry/CaptainOfIndustry.csproj +++ b/Projects/CaptainOfIndustry/CaptainOfIndustry/CaptainOfIndustry.csproj @@ -64,6 +64,21 @@ ..\libs\Mafi.Unity.dll + + ..\libs\Sirenix.OdinInspector.Attributes.dll + + + ..\libs\Sirenix.OdinInspector.CompatibilityLayer.dll + + + ..\libs\Sirenix.Serialization.dll + + + ..\libs\Sirenix.Serialization.Config.dll + + + ..\libs\Sirenix.Utilities.dll + ..\libs\UnityEngine.dll diff --git a/Projects/CaptainOfIndustry/CaptainOfIndustry/Class1.cs b/Projects/CaptainOfIndustry/CaptainOfIndustry/Class1.cs index 49f1033..626a720 100644 --- a/Projects/CaptainOfIndustry/CaptainOfIndustry/Class1.cs +++ b/Projects/CaptainOfIndustry/CaptainOfIndustry/Class1.cs @@ -18,17 +18,19 @@ namespace CaptainOfIndustry { public static ConfigEntry truckCapacityMultiplier; public static ConfigEntry cargoShipCapacityMultiplier; public static ConfigEntry excavatorMiningAreaMultiplier; - public static ConfigEntry vehicleSpeedMultiplier; + public static ConfigEntry bufferCapacityMultiplier; public static ConfigEntry unityGenerationMultiplier; + public static ConfigEntry depotTransferSpeedMultiplier; public void Awake() { excavatorCapacityMultiplier = Config.Bind("General", "Excavator Capacity Multiplier", 1, new ConfigDescription("Excavator Capacity Multiplier")); truckCapacityMultiplier = Config.Bind("General", "Truck Capacity Multiplier", 1, new ConfigDescription("Truck Capacity Multiplier")); cargoShipCapacityMultiplier = Config.Bind("General", "Cargo Ship Capacity Multiplier", 1, new ConfigDescription("Cargo Ship Capacity Multiplier")); excavatorMiningAreaMultiplier = Config.Bind("General", "Excavator Mining Area Multiplier", 1f, new ConfigDescription("Excavator Mining Area Multiplier")); - vehicleSpeedMultiplier = Config.Bind("General", "Vehicle Speed Multiplier", 1f, new ConfigDescription("Vehicle Speed Multiplier")); + bufferCapacityMultiplier = Config.Bind("General", "Buffer Capacity Multiplier", 1f, new ConfigDescription("Buffer Capacity Multiplier")); storageCapacityMultiplier = Config.Bind("General", "Storage Capacity Multiplier", 1f, new ConfigDescription("Storage Capacity Multiplier")); unityGenerationMultiplier = Config.Bind("General", "Unity Generation Multiplier", 1f, new ConfigDescription("Unity Generation Multiplier")); + depotTransferSpeedMultiplier = Config.Bind("General", "Depot Transfer Speed Multiplier", 1f, new ConfigDescription("Depot Transfer Speed Multiplier")); // shootingSpeedMultiplier.SettingChanged += (sender, args) => WeaponPropertiesManager.DoPatch(); // energyGenMultiplier.SettingChanged += (sender, args) => GeneratorPropertiesManager.DoPatch(); diff --git a/Projects/CaptainOfIndustry/CaptainOfIndustry/Patches.cs b/Projects/CaptainOfIndustry/CaptainOfIndustry/Patches.cs index 536221e..4b3e491 100644 --- a/Projects/CaptainOfIndustry/CaptainOfIndustry/Patches.cs +++ b/Projects/CaptainOfIndustry/CaptainOfIndustry/Patches.cs @@ -1,13 +1,18 @@ using System; using System.Collections.Generic; +using System.Linq; using System.Reflection; +using System.Reflection.Emit; using HarmonyLib; using Mafi; +using Mafi.Core.Buildings.Cargo; +using Mafi.Core.Buildings.Cargo.Modules; using Mafi.Core.Buildings.Cargo.Ships.Modules; using Mafi.Core.Buildings.Storages; using Mafi.Core.Entities.Dynamic; using Mafi.Core.Entities.Static; using Mafi.Core.Entities.Static.Layout; +using Mafi.Core.Factory.Machines; using Mafi.Core.Map; using Mafi.Core.Population; using Mafi.Core.Products; @@ -16,30 +21,28 @@ using Mafi.Core.Prototypes; namespace CaptainOfIndustry { [HarmonyPatch] public class Patches { - private static Traverse maxForwardsSpeedField; - [HarmonyPrefix] [HarmonyPatch(typeof(ExcavatorProtoBuilder.ExcavatorProtoBuilderState), "SetCapacity")] static void excavatorCapacityMultiplier(ref int quantity) { - // Console.WriteLine("IndustrialCyka: Old excavator capacity: {0}", quantity); +// Console.WriteLine("IndustrialCyka: Old excavator capacity: {0}", quantity); quantity *= Main.excavatorCapacityMultiplier.Value; - Console.WriteLine("IndustrialCyka: Old excavator capacity: {0}", quantity); +// Console.WriteLine("IndustrialCyka: Old excavator capacity: {0}", quantity); } [HarmonyPrefix] [HarmonyPatch(typeof(TruckProtoBuilder.TruckProtoBuilderState), "SetCapacity")] static void truckCapacityMultiplier(ref int quantity) { - Console.WriteLine("IndustrialCyka: Old truck capacity: {0}", quantity); +// Console.WriteLine("IndustrialCyka: Old truck capacity: {0}", quantity); quantity *= Main.truckCapacityMultiplier.Value; - Console.WriteLine("IndustrialCyka: New truck capacity: {0}", quantity); +// Console.WriteLine("IndustrialCyka: New truck capacity: {0}", quantity); } // [HarmonyPrefix] // [HarmonyPatch(typeof(StorageProtoBuilder.State), "SetCapacity")] // static void storageCapacityMultiplier(ref int capacity) { - // Console.WriteLine("IndustrialCyka: Old storage capacity: {0}", capacity); +// // Console.WriteLine("IndustrialCyka: Old storage capacity: {0}", capacity); // capacity = (int)(capacity * Main.storageCapacityMultiplier.Value); - // Console.WriteLine("IndustrialCyka: New storage capacity: {0}", capacity); +// // Console.WriteLine("IndustrialCyka: New storage capacity: {0}", capacity); // } [HarmonyPostfix] @@ -49,18 +52,18 @@ namespace CaptainOfIndustry { typeof(CargoShipModuleProto.Gfx) })] static void cargoShipCapacityMultiplier(CargoShipModuleProto __instance) { - Console.WriteLine("IndustrialCyka: Old ship capacity: {0}", __instance.Capacity.Value); +// Console.WriteLine("IndustrialCyka: Old ship capacity: {0}", __instance.Capacity.Value); __instance.Capacity = new Quantity(__instance.Capacity.Value * Main.cargoShipCapacityMultiplier.Value); - Console.WriteLine("IndustrialCyka: New ship capacity: {0}", __instance.Capacity.Value); +// Console.WriteLine("IndustrialCyka: New ship capacity: {0}", __instance.Capacity.Value); } [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]); +// Console.WriteLine("IndustrialCyka: Old mining area: {0}", thicknessMeters[i]); thicknessMeters[i] *= Main.excavatorMiningAreaMultiplier.Value; - Console.WriteLine("IndustrialCyka: New mining area: {0}", thicknessMeters[i]); +// Console.WriteLine("IndustrialCyka: New mining area: {0}", thicknessMeters[i]); } } @@ -68,35 +71,35 @@ namespace CaptainOfIndustry { // [HarmonyPrefix] // [HarmonyPatch(typeof(DrivingEntity), "SetSpeedFactor")] // static void vehicleSpeedMultiplier(ref Percent speedFactor) { - // Console.WriteLine("IndustrialCyka: Old speed: {0}", speedFactor.ToString()); +// // 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; - // Console.WriteLine("IndustrialCyka: New speed: {1}", newSpeedFactor.RawValue.ToString()); +// // Console.WriteLine("IndustrialCyka: New speed: {1}", newSpeedFactor.RawValue.ToString()); // } - [HarmonyPostfix] - [HarmonyPatch(typeof(SmoothDriver), "SetSpeedFactor")] - static void vehicleSpeedMultiplier(SmoothDriver __instance) { - Fix32 speedMulti = Fix32.FromFloat(Main.vehicleSpeedMultiplier.Value); - - Traverse traverse = Traverse.Create(__instance); - Traverse maxForwardsSpeedField = traverse.Field("m_maxForwardsSpeed"); - Traverse maxBackwardsSpeedField = traverse.Field("m_maxBackwardsSpeed"); - Traverse maxAccelerationField = traverse.Field("m_maxAcceleration"); - - Console.WriteLine("IndustrialCyka: Old speeds: (F) {0}, (B) {1}, (A) {2}", maxForwardsSpeedField.GetValue(), - maxBackwardsSpeedField.GetValue(), maxAccelerationField.GetValue()); - - maxForwardsSpeedField.SetValue((Fix32)maxForwardsSpeedField.GetValue() * speedMulti); - maxBackwardsSpeedField.SetValue((Fix32)maxBackwardsSpeedField.GetValue() * speedMulti); - maxAccelerationField.SetValue((Fix32)maxAccelerationField.GetValue() * speedMulti); - - Console.WriteLine("IndustrialCyka: New speeds: (F) {0}, (B) {1}, (A) {2}", maxForwardsSpeedField.GetValue(), - maxBackwardsSpeedField.GetValue(), maxAccelerationField.GetValue()); - } +// [HarmonyPostfix] +// [HarmonyPatch(typeof(SmoothDriver), "SetSpeedFactor")] +// static void vehicleSpeedMultiplier(SmoothDriver __instance) { +// Fix32 speedMulti = Fix32.FromFloat(Main.vehicleSpeedMultiplier.Value); +// +// Traverse traverse = Traverse.Create(__instance); +// Traverse maxForwardsSpeedField = traverse.Field("m_maxForwardsSpeed"); +// Traverse maxBackwardsSpeedField = traverse.Field("m_maxBackwardsSpeed"); +// Traverse maxAccelerationField = traverse.Field("m_maxAcceleration"); +// +// // Console.WriteLine("IndustrialCyka: Old speeds: (F) {0}, (B) {1}, (A) {2}", maxForwardsSpeedField.GetValue(), +// // maxBackwardsSpeedField.GetValue(), maxAccelerationField.GetValue()); +// +// maxForwardsSpeedField.SetValue((Fix32)maxForwardsSpeedField.GetValue() * speedMulti); +// maxBackwardsSpeedField.SetValue((Fix32)maxBackwardsSpeedField.GetValue() * speedMulti); +// maxAccelerationField.SetValue((Fix32)maxAccelerationField.GetValue() * speedMulti); +// +// // Console.WriteLine("IndustrialCyka: New speeds: (F) {0}, (B) {1}, (A) {2}", maxForwardsSpeedField.GetValue(), +// // maxBackwardsSpeedField.GetValue(), maxAccelerationField.GetValue()); +// } [HarmonyPostfix] [HarmonyPatch(typeof(StorageBaseProto), MethodType.Constructor, @@ -112,37 +115,125 @@ namespace CaptainOfIndustry { 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); +// 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.Field("Capacity").SetValue(new Quantity((int)(__instance.Capacity.Value * Main.storageCapacityMultiplier.Value))); + 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); +// 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) { - Console.WriteLine("IndustrialCyka: Old generated {0} unity", generated.Value); +// Console.WriteLine("IndustrialCyka: Old generated {0} unity", generated.Value); Fix32 multi = Fix32.FromFloat(Main.unityGenerationMultiplier.Value); generated = new Upoints(generated.Value * multi); - Console.WriteLine("IndustrialCyka: New generated {0} unity", generated.Value); +// 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; + + 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; + } + + matches++; + } + } + + // for (int i = 0; i < codes.Count; i++) { + // Console.WriteLine(codes[i].ToString()); + // } + + return codes.AsEnumerable(); + } + + // static IEnumerable Transpiler(IEnumerable instructions) + // { + // var found = false; + // foreach (var instruction in instructions) + // { + // if (instruction.StoresField(f_someField)) + // { + // yield return new CodeInstruction(OpCodes.Call, m_MyExtraMethod); + // found = true; + // } + // yield return instruction; + // } + // if (found is false) + // ReportError("Cannot find in OriginalType.OriginalMethod"); + // } + // 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)"); +// // 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); // } + + [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; + } + + [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))); + +// Console.WriteLine("IndustrialCyka: New storage capacity: {0}", __instance.Capacity.Value); + } } }