From 3db7fa5194b7c8e5f1b82a3b7acbc46cc326fd94 Mon Sep 17 00:00:00 2001 From: Soar Qin Date: Fri, 24 May 2024 03:22:04 +0800 Subject: [PATCH] WIP --- UXAssist/FactoryPatch.cs | 72 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git a/UXAssist/FactoryPatch.cs b/UXAssist/FactoryPatch.cs index 8324ced..54c1848 100644 --- a/UXAssist/FactoryPatch.cs +++ b/UXAssist/FactoryPatch.cs @@ -7,7 +7,9 @@ using CommonAPI.Systems; using HarmonyLib; using UnityEngine; using UnityEngine.EventSystems; +using UnityEngine.UI; using UXAssist.Common; +using OpCodes = System.Reflection.Emit.OpCodes; namespace UXAssist; @@ -1842,5 +1844,75 @@ public static class FactoryPatch _patch?.UnpatchSelf(); _patch = null; } + + [HarmonyTranspiler] + [HarmonyPatch(typeof(UIStationWindow), nameof(UIStationWindow.OnStationIdChange))] + private static IEnumerable UIStationWindow_OnStationIdChange_Transpiler(IEnumerable instructions, ILGenerator generator) + { + var matcher = new CodeMatcher(instructions, generator); + matcher.MatchForward(false, + new CodeMatch(OpCodes.Ldarg_0), + new CodeMatch(OpCodes.Ldfld, AccessTools.Field(typeof(UIStationWindow), nameof(UIStationWindow.maxChargePowerSlider))), + new CodeMatch(ci => ci.IsLdloc()), + new CodeMatch(ci => ci.opcode == OpCodes.Ldc_I4 && ci.OperandIs(0xC350)), + new CodeMatch(OpCodes.Conv_I8) + ); + var pos = matcher.Pos + 1; + matcher.Advance(5).MatchForward(false, + new CodeMatch(OpCodes.Conv_R4), + new CodeMatch(OpCodes.Callvirt, AccessTools.PropertySetter(typeof(Slider), nameof(Slider.value))) + ); + var pos2 = matcher.Pos + 2; + matcher.Start().Advance(pos); + var ldvar = matcher.InstructionAt(1).Clone(); + var locWorkEnergyPerTick = matcher.InstructionAt(-2).operand; + matcher.RemoveInstructions(pos2 - pos).Insert( + ldvar, + new CodeInstruction(OpCodes.Ldloc_S, locWorkEnergyPerTick), + Transpilers.EmitDelegate((UIStationWindow window, long maxWorkEnergy, long workEnergyPerTick) => + { + var maxSliderValue = maxWorkEnergy / 50000L; + window.maxChargePowerSlider.maxValue = maxSliderValue + 9; + window.maxChargePowerSlider.minValue = maxWorkEnergy / 500000L; + if (workEnergyPerTick <= maxWorkEnergy) + window.maxChargePowerSlider.value = workEnergyPerTick / 50000L; + else + { + window.maxChargePowerSlider.value = (workEnergyPerTick - 1) / maxWorkEnergy + 1; + } + }) + ); + return matcher.InstructionEnumeration(); + } + } + + [HarmonyTranspiler] + [HarmonyPatch(typeof(UIStationWindow), nameof(UIStationWindow.OnMaxChargePowerSliderValueChange))] + private static IEnumerable UIStationWindow_OnMaxChargePowerSliderValueChange_Transpiler(IEnumerable instructions, ILGenerator generator) + { + var matcher = new CodeMatcher(instructions, generator); + matcher.MatchForward(false, + new CodeMatch(OpCodes.Ldarg_0), + new CodeMatch(OpCodes.Ldfld, AccessTools.Field(typeof(UIStationWindow), nameof(UIStationWindow.factory))), + new CodeMatch(OpCodes.Ldfld, AccessTools.Field(typeof(PlanetFactory), nameof(PlanetFactory.powerSystem))), + new CodeMatch(OpCodes.Ldfld, AccessTools.Field(typeof(PowerSystem), nameof(PowerSystem.consumerPool))) + ); + var labels = matcher.Labels; + matcher.Labels = null; + matcher.Insert( + new CodeInstruction(OpCodes.Ldarg_0).WithLabels(labels), + new CodeInstruction(OpCodes.Ldarg_1), + Transpilers.EmitDelegate((UIStationWindow window, float value) => + { + float prevMax = window.workEnergyPrefab * 5L / 50000L; + if (value <= prevMax) + { + return value; + } + return prevMax * (value - prevMax + 1); + }), + new CodeInstruction(OpCodes.Starg_S, 1) + ); + return matcher.InstructionEnumeration(); } } \ No newline at end of file