From 1968631cbdf99c516aab649b4303c49d421c60a8 Mon Sep 17 00:00:00 2001 From: Soar Qin Date: Wed, 30 Nov 2022 01:34:01 +0800 Subject: [PATCH] Work in progress --- CheatEnabler/CheatEnabler.cs | 179 +++++++++++++++++- DSP_Mods.sln | 6 + OverclockEverything/BeltFix.cs | 98 ++++++++++ OverclockEverything/OverclockEverything.cs | 103 ++++++++++ .../OverclockEverything.csproj | 28 +++ OverclockEverything/README.md | 12 ++ OverclockEverything/package/icon.png | Bin 0 -> 10253 bytes OverclockEverything/package/manifest.json | 9 + README.md | 5 + 9 files changed, 437 insertions(+), 3 deletions(-) create mode 100644 OverclockEverything/BeltFix.cs create mode 100644 OverclockEverything/OverclockEverything.cs create mode 100644 OverclockEverything/OverclockEverything.csproj create mode 100644 OverclockEverything/README.md create mode 100644 OverclockEverything/package/icon.png create mode 100644 OverclockEverything/package/manifest.json diff --git a/CheatEnabler/CheatEnabler.cs b/CheatEnabler/CheatEnabler.cs index d55c706..6672f5c 100644 --- a/CheatEnabler/CheatEnabler.cs +++ b/CheatEnabler/CheatEnabler.cs @@ -1,4 +1,6 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; +using System.Linq; using System.Reflection.Emit; using BepInEx; using HarmonyLib; @@ -14,6 +16,11 @@ public class CheatEnabler : BaseUnityPlugin private bool _devShortcuts = true; private bool _disableAbnormalChecks = true; private bool _alwaysInfiniteResource = true; + private bool _waterPumpAnywhere = true; + private static bool _rareVeinsOnBirthPlanet = true; + private static bool _flatBirthPlanet = true; + private static string _unlockTechToMaximumLevel = ""; + private static readonly List TechToUnlock = new(); private void Awake() { @@ -22,6 +29,14 @@ public class CheatEnabler : BaseUnityPlugin "disable all abnormal checks").Value; _alwaysInfiniteResource = Config.Bind("General", "AlwaysInfiniteResource", _alwaysInfiniteResource, "always infinite resource").Value; + _unlockTechToMaximumLevel = Config.Bind("General", "UnlockTechToMaxLevel", _unlockTechToMaximumLevel, + "Unlock listed tech to MaxLevel").Value; + _waterPumpAnywhere = Config.Bind("General", "WaterPumpAnywhere", _waterPumpAnywhere, + "Can pump water anywhere (while water type is not None)").Value; + _rareVeinsOnBirthPlanet = Config.Bind("General", "RareVeinsOnBirthPlanet", _rareVeinsOnBirthPlanet, + "Has rare veins on birth planet (except unipolar magnet)").Value; + _flatBirthPlanet = Config.Bind("General", "FlatBirthPlanet", _flatBirthPlanet, + "Birth planet is solid flat (no water)").Value; if (_devShortcuts) { Harmony.CreateAndPatchAll(typeof(DevShortcuts)); @@ -34,6 +49,26 @@ public class CheatEnabler : BaseUnityPlugin { Harmony.CreateAndPatchAll(typeof(AlwaysInfiniteResource)); } + + foreach (var idstr in _unlockTechToMaximumLevel.Split(',')) + { + if (int.TryParse(idstr, out var id)) + { + TechToUnlock.Add(id); + } + } + if (TechToUnlock.Count > 0) + { + Harmony.CreateAndPatchAll(typeof(UnlockTechOnGameStart)); + } + if (_waterPumpAnywhere) + { + Harmony.CreateAndPatchAll(typeof(WaterPumperCheat)); + } + if (_rareVeinsOnBirthPlanet || _flatBirthPlanet) + { + Harmony.CreateAndPatchAll(typeof(BirthPlanetCheat)); + } } private class DevShortcuts @@ -111,7 +146,7 @@ public class CheatEnabler : BaseUnityPlugin { foreach (var instruction in instructions) { - if (instruction.opcode == OpCodes.Ldc_R4 && instruction.operand.Equals(99.5f)) + if (instruction.opcode == OpCodes.Ldc_R4 && instruction.OperandIs(99.5f)) { yield return new CodeInstruction(OpCodes.Ldc_R4, 0f); } @@ -122,4 +157,142 @@ public class CheatEnabler : BaseUnityPlugin } } } -} \ No newline at end of file + + private class UnlockTechOnGameStart + { + [HarmonyPostfix] + [HarmonyPatch(typeof(GameScenarioLogic), "NotifyOnGameBegin")] + private static void UnlockTechPatch() + { + var history = GameMain.history; + if (GameMain.mainPlayer == null || GameMain.mainPlayer.mecha == null) + { + return; + } + foreach (var currentTech in TechToUnlock) + { + UnlockTechRecursive(history, currentTech, 5000); + } + var techQueue = history.techQueue; + if (techQueue == null || techQueue.Length == 0) + { + return; + } + history.VarifyTechQueue(); + if (history.currentTech > 0 && history.currentTech != techQueue[0]) + { + history.AlterCurrentTech(techQueue[0]); + } + } + + private static void UnlockTechRecursive(GameHistoryData history, int currentTech, int maxLevel = 10000) + { + var techStates = history.techStates; + if (techStates == null || !techStates.ContainsKey(currentTech)) + { + return; + } + var techProto = LDB.techs.Select(currentTech); + if (techProto == null) + { + return; + } + var value = techStates[currentTech]; + var maxLvl = Math.Min(maxLevel, value.maxLevel); + if (value.unlocked && value.curLevel >= maxLvl && value.hashUploaded >= value.hashNeeded) + { + return; + } + foreach (var preid in techProto.PreTechs) + { + UnlockTechRecursive(history, preid, maxLevel); + } + + var techQueue = history.techQueue; + if (techQueue != null) + { + for (var i = 0; i < techQueue.Length; i++) + { + if (techQueue[i] == currentTech) + { + techQueue[i] = 0; + } + } + } + + while (value.curLevel <= maxLvl) + { + for (var j = 0; j < techProto.UnlockFunctions.Length; j++) + { + history.UnlockTechFunction(techProto.UnlockFunctions[j], techProto.UnlockValues[j], value.curLevel); + } + value.curLevel++; + } + value.curLevel = maxLvl; + value.unlocked = maxLvl >= value.maxLevel; + value.hashNeeded = techProto.GetHashNeeded(value.curLevel); + value.hashUploaded = maxLvl >= value.maxLevel ? value.hashNeeded : 0; + techStates[currentTech] = value; + } + } + + private class BirthPlanetCheat + { + [HarmonyPostfix, HarmonyPatch(typeof(VFPreload), "InvokeOnLoadWorkEnded")] + private static void VFPreload_InvokeOnLoadWorkEnded_Postfix() + { + var theme = LDB.themes.Select(1); + if (_flatBirthPlanet) + { + theme.Algos[0] = 2; + } + + if (_rareVeinsOnBirthPlanet) + { + theme.VeinSpot[2] = 2; + theme.VeinSpot[3] = 2; + theme.VeinCount[2] = 0.5f; + theme.VeinCount[3] = 0.5f; + theme.VeinOpacity[2] = 0.5f; + theme.VeinOpacity[3] = 0.5f; + theme.RareVeins = theme.RareVeins.Append(8).ToArray(); + theme.RareSettings = theme.RareSettings.Concat(new float[] + { + 0.3f, 0.5f, 0.7f, 0.5f, + 0.3f, 0.5f, 0.7f, 0.5f, + 0.3f, 0.5f, 0.7f, 0.5f, + 0.3f, 0.5f, 0.7f, 0.5f, + 0.3f, 0.5f, 0.7f, 0.5f, + 0.3f, 0.5f, 0.7f, 0.5f, + }).ToArray(); + } + } + } + + private class WaterPumperCheat + { + [HarmonyTranspiler] + [HarmonyPatch(typeof(BuildTool_BlueprintPaste), "CheckBuildConditions")] + [HarmonyPatch(typeof(BuildTool_Click), "CheckBuildConditions")] + private static IEnumerable BuildTool_CheckBuildConditions_Transpiler(IEnumerable instructions) + { + var isFirst = true; + foreach (var instr in instructions) + { + if (instr.opcode == OpCodes.Ldc_I4_S && instr.OperandIs(22)) + { + if (isFirst) + { + isFirst = false; + } + else + { + yield return new CodeInstruction(OpCodes.Ldc_I4_S, 0); + continue; + } + } + yield return instr; + } + } + } +} diff --git a/DSP_Mods.sln b/DSP_Mods.sln index cbb0748..4435c63 100644 --- a/DSP_Mods.sln +++ b/DSP_Mods.sln @@ -14,6 +14,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OCBatchBuild", "OCBatchBuil EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UniverseGenTweaks", "UniverseGenTweaks\UniverseGenTweaks.csproj", "{9534694E-14F0-4498-852D-BBB3FCA986CD}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OverclockEverything", "OverclockEverything\OverclockEverything.csproj", "{0168941C-EEA6-49CF-9A67-E829FE06CF9B}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -48,5 +50,9 @@ Global {9534694E-14F0-4498-852D-BBB3FCA986CD}.Debug|Any CPU.Build.0 = Debug|Any CPU {9534694E-14F0-4498-852D-BBB3FCA986CD}.Release|Any CPU.ActiveCfg = Release|Any CPU {9534694E-14F0-4498-852D-BBB3FCA986CD}.Release|Any CPU.Build.0 = Release|Any CPU + {0168941C-EEA6-49CF-9A67-E829FE06CF9B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0168941C-EEA6-49CF-9A67-E829FE06CF9B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0168941C-EEA6-49CF-9A67-E829FE06CF9B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0168941C-EEA6-49CF-9A67-E829FE06CF9B}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection EndGlobal diff --git a/OverclockEverything/BeltFix.cs b/OverclockEverything/BeltFix.cs new file mode 100644 index 0000000..0e1a357 --- /dev/null +++ b/OverclockEverything/BeltFix.cs @@ -0,0 +1,98 @@ +using System.Collections.Generic; +using System.Reflection.Emit; +using HarmonyLib; + +namespace OverclockEverything; + +[HarmonyPatch] +public static class BeltFix +{ + private static CodeInstruction[] LdcInstrs = new[] + { + new CodeInstruction(OpCodes.Ldc_I4_0), new CodeInstruction(OpCodes.Ldc_I4_1), new CodeInstruction(OpCodes.Ldc_I4_2), + new CodeInstruction(OpCodes.Ldc_I4_3), new CodeInstruction(OpCodes.Ldc_I4_4), new CodeInstruction(OpCodes.Ldc_I4_5), + new CodeInstruction(OpCodes.Ldc_I4_6), new CodeInstruction(OpCodes.Ldc_I4_7), new CodeInstruction(OpCodes.Ldc_I4_8), + new CodeInstruction(OpCodes.Ldc_I4_S, 9), new CodeInstruction(OpCodes.Ldc_I4_S, 10) + }; + [HarmonyTranspiler, HarmonyPatch(typeof(CargoTraffic), "AlterBeltRenderer")] + public static IEnumerable CargoTraffic_AlterBeltRenderer_Transpiler(IEnumerable instructions) + { + bool lastIsSpeed = false; + foreach (var instr in instructions) + { + if (lastIsSpeed) + { + lastIsSpeed = false; + if (instr.opcode == OpCodes.Ldc_I4_1) + { + yield return LdcInstrs[Patch.beltSpeed[0]]; + } + else if (instr.opcode == OpCodes.Ldc_I4_2) + { + yield return LdcInstrs[Patch.beltSpeed[1]]; + } + else + { + yield return instr; + } + } + else + { + lastIsSpeed = instr.opcode == OpCodes.Ldfld && + instr.OperandIs(AccessTools.Field(typeof(BeltComponent), nameof(BeltComponent.speed))); + yield return instr; + } + } + } + + [HarmonyPrefix] + [HarmonyPatch(typeof(ConnGizmoRenderer), "AddBlueprintBeltMajorPoint")] + [HarmonyPatch(typeof(ConnGizmoRenderer), "AddBlueprintBeltPoint")] + [HarmonyPatch(typeof(ConnGizmoRenderer), "AddBlueprintBeltConn")] + public static void ConnGizmoRenderer_AddBlueprintBelt_Prefix(ref ConnGizmoRenderer __instance, ref uint color) + { + var bspeed = Patch.beltSpeed; + color = color >= bspeed[2] ? 3u : color >= bspeed[1] ? 2u : 1u; + } + + [HarmonyTranspiler] + [HarmonyPatch(typeof(ConnGizmoRenderer), "Update")] + public static IEnumerable ConnGizmoRenderer_Update_Transpiler(IEnumerable instructions, ILGenerator generator) + { + bool lastIsLdcI4_3 = false; + foreach (var instr in instructions) + { + if (lastIsLdcI4_3) + { + lastIsLdcI4_3 = false; + yield return instr; + if (instr.opcode == OpCodes.Stfld && instr.OperandIs(AccessTools.Field(typeof(ConnGizmoObj), nameof(ConnGizmoObj.color)))) + { + var label1 = generator.DefineLabel(); + var label2 = generator.DefineLabel(); + yield return new CodeInstruction(OpCodes.Ldloc_S, 6); + yield return LdcInstrs[Patch.beltSpeed[1]]; + yield return new CodeInstruction(OpCodes.Bne_Un_S, label1); + yield return new CodeInstruction(OpCodes.Ldloca_S, 0); + yield return new CodeInstruction(OpCodes.Ldc_I4_2); + yield return new CodeInstruction(OpCodes.Stfld, + AccessTools.Field(typeof(ConnGizmoObj), nameof(ConnGizmoObj.color))); + yield return new CodeInstruction(OpCodes.Br, label2); + yield return new CodeInstruction(OpCodes.Ldloc_S, 6).WithLabels(label1); + yield return LdcInstrs[Patch.beltSpeed[0]]; + yield return new CodeInstruction(OpCodes.Bne_Un_S, label2); + yield return new CodeInstruction(OpCodes.Ldloca_S, 0); + yield return new CodeInstruction(OpCodes.Ldc_I4_1); + yield return new CodeInstruction(OpCodes.Stfld, + AccessTools.Field(typeof(ConnGizmoObj), nameof(ConnGizmoObj.color))); + yield return new CodeInstruction(OpCodes.Nop).WithLabels(label2); + } + } + else + { + lastIsLdcI4_3 = instr.opcode == OpCodes.Ldc_I4_3; + yield return instr; + } + } + } +} diff --git a/OverclockEverything/OverclockEverything.cs b/OverclockEverything/OverclockEverything.cs new file mode 100644 index 0000000..3d9b42f --- /dev/null +++ b/OverclockEverything/OverclockEverything.cs @@ -0,0 +1,103 @@ +using BepInEx; +using BepInEx.Configuration; +using HarmonyLib; + +namespace OverclockEverything; + +[BepInPlugin(PluginInfo.PLUGIN_GUID, PluginInfo.PLUGIN_NAME, PluginInfo.PLUGIN_VERSION)] +public class Patch : BaseUnityPlugin +{ + private new static readonly BepInEx.Logging.ManualLogSource Logger = + BepInEx.Logging.Logger.CreateLogSource(PluginInfo.PLUGIN_NAME); + + private bool _cfgEnabled = true; + public static uint[] beltSpeed = { + 2, 5, 10 + }; + private static int inserterSpeedMultiplier = 2; + private static int assembleSpeedMultiplier = 2; + private static int powerConsumptionMultiplier = 2; + private static long powerGenerationMultiplier = 4; + private static long powerFuelConsumptionMultiplier = 1; + + private void Awake() + { + _cfgEnabled = Config.Bind("General", "Enabled", _cfgEnabled, "enable/disable this plugin").Value; + if (!_cfgEnabled) return; + beltSpeed[0] = Config.Bind("Belt", "MkI_Speed", beltSpeed[0], + new ConfigDescription("Speed for Belt Mk.I.\n 1: 6/s\n 2: 12/s\n 3: 15/s(Displayed as 18/s)\n 4: 20/s(Displayed as 24/s)\n 5+: 6*n/s", new AcceptableValueRange(1, 10))).Value; + beltSpeed[1] = Config.Bind("Belt", "MkII_Speed", beltSpeed[1], + new ConfigDescription("Speed for Belt Mk.II", new AcceptableValueRange(1, 10))).Value; + beltSpeed[2] = Config.Bind("Belt", "MkIII_Speed", beltSpeed[2], + new ConfigDescription("Speed for Belt Mk.III", new AcceptableValueRange(1, 10))).Value; + inserterSpeedMultiplier = Config.Bind("Inserter", "SpeedMultiplier", inserterSpeedMultiplier, + new ConfigDescription("Speed multiplier for Inserters", new AcceptableValueRange(1, 5))).Value; + assembleSpeedMultiplier = Config.Bind("Assemble", "SpeedMultiplier", assembleSpeedMultiplier, + new ConfigDescription("Speed multiplier for Smelters and Assembling Machines", new AcceptableValueRange(1, 10))).Value; + powerConsumptionMultiplier = Config.Bind("Assemble", "PowerConsumptionMultiplier", powerConsumptionMultiplier, + new ConfigDescription("Power consumption multiplier for Smelters and Assembling Machines", new AcceptableValueRange(1, 100))).Value; + powerGenerationMultiplier = Config.Bind("Power", "GenerationMultiplier", powerGenerationMultiplier, + new ConfigDescription("Power generation multiplier for all power providers", new AcceptableValueRange(1, 10))).Value; + powerFuelConsumptionMultiplier = Config.Bind("Power", "FuelConsumptionMultiplier", powerFuelConsumptionMultiplier, + new ConfigDescription("Fuel consumption multiplier for all fuel-consuming power providers", new AcceptableValueRange(1, 10))).Value; + Harmony.CreateAndPatchAll(typeof(Patch)); + Harmony.CreateAndPatchAll(typeof(BeltFix)); + } + + private static void BoostAssembler(int id) + { + var prefabDesc = LDB.items.Select(id).prefabDesc; + prefabDesc.assemblerSpeed *= assembleSpeedMultiplier; + prefabDesc.idleEnergyPerTick *= powerConsumptionMultiplier; + prefabDesc.workEnergyPerTick *= powerConsumptionMultiplier; + } + + private static void BoostPower(int id) + { + var prefabDesc = LDB.items.Select(id).prefabDesc; + prefabDesc.genEnergyPerTick *= powerGenerationMultiplier; + prefabDesc.useFuelPerTick *= powerFuelConsumptionMultiplier; + } + + [HarmonyPostfix, HarmonyPatch(typeof(VFPreload), "InvokeOnLoadWorkEnded")] + private static void VFPreload_InvokeOnLoadWorkEnded_Postfix() + { + // Belts + LDB.items.Select(2001).prefabDesc.beltSpeed = (int)beltSpeed[0]; + LDB.items.Select(2002).prefabDesc.beltSpeed = (int)beltSpeed[1]; + LDB.items.Select(2003).prefabDesc.beltSpeed = (int)beltSpeed[2]; + + // Inserters + LDB.items.Select(2011).prefabDesc.inserterSTT /= inserterSpeedMultiplier; + LDB.items.Select(2012).prefabDesc.inserterSTT /= inserterSpeedMultiplier; + LDB.items.Select(2013).prefabDesc.inserterSTT /= inserterSpeedMultiplier; + + // Smelters + BoostAssembler(2302); + BoostAssembler(2315); + // Assemblers + BoostAssembler(2303); + BoostAssembler(2304); + BoostAssembler(2305); + // Chemical Plants + BoostAssembler(2309); + BoostAssembler(2317); + // Refiner + BoostAssembler(2308); + // Collider + BoostAssembler(2310); + + // Thermal + BoostPower(2204); + // Fusion + BoostPower(2211); + // Artificial Star + BoostPower(2210); + // Wind Turbine + BoostPower(2203); + // Solar Panel + BoostPower(2205); + // Geothermal + BoostPower(2213); + } +} diff --git a/OverclockEverything/OverclockEverything.csproj b/OverclockEverything/OverclockEverything.csproj new file mode 100644 index 0000000..29ef12a --- /dev/null +++ b/OverclockEverything/OverclockEverything.csproj @@ -0,0 +1,28 @@ + + + + net472 + org.soardev.overclockeverything + DSP MOD - OverclockEverything + 1.0.0 + true + latest + OverclockEverything + OverclockEverything + + + + + + + + + + + + + + + + + diff --git a/OverclockEverything/README.md b/OverclockEverything/README.md new file mode 100644 index 0000000..f104d4b --- /dev/null +++ b/OverclockEverything/README.md @@ -0,0 +1,12 @@ +# OverclockEverything + +#### Boost nearly all structures +#### 加速几乎所有建筑功能 + +## Usage + +* Boost power generation, assembling speed, belt and sorter speed. + +## 使用说明 + +* 加快发电,制造,传送带和分拣器速度。 diff --git a/OverclockEverything/package/icon.png b/OverclockEverything/package/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..2345e305c438a8ab233d79d40500064c551aca9f GIT binary patch literal 10253 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 literal 0 HcmV?d00001 diff --git a/OverclockEverything/package/manifest.json b/OverclockEverything/package/manifest.json new file mode 100644 index 0000000..cf346cb --- /dev/null +++ b/OverclockEverything/package/manifest.json @@ -0,0 +1,9 @@ +{ + "name": "OverclockEverything", + "version_number": "1.0.0", + "website_url": "https://github.com/soarqin/DSP_Mods/tree/master/OverclockEverything", + "description": "Overclock everything in game / 加速游戏中的所有建筑", + "dependencies": [ + "xiaoye97-BepInEx-5.4.17" + ] +} diff --git a/README.md b/README.md index f715aff..0e70068 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,11 @@ Hide/Disable various tutorial tips/messages Can turn Storages and Tanks into Dustbin(Destroy incoming items) 储物仓和储液罐可以转变为垃圾桶(销毁送进的物品) +# [OverclockEverything](OverclockEverything) + +Boost nearly all structures +加速几乎所有建筑功能 + # [OrbitalCollectorBatchBuild](OCBatchBuild) Batch build Orbital Collectors