mirror of
https://github.com/soarqin/DSP_Mods.git
synced 2025-12-08 21:33:28 +08:00
WIP
This commit is contained in:
@@ -7,7 +7,9 @@ using CommonAPI.Systems;
|
|||||||
using HarmonyLib;
|
using HarmonyLib;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEngine.EventSystems;
|
using UnityEngine.EventSystems;
|
||||||
|
using UnityEngine.UI;
|
||||||
using UXAssist.Common;
|
using UXAssist.Common;
|
||||||
|
using OpCodes = System.Reflection.Emit.OpCodes;
|
||||||
|
|
||||||
namespace UXAssist;
|
namespace UXAssist;
|
||||||
|
|
||||||
@@ -1842,5 +1844,75 @@ public static class FactoryPatch
|
|||||||
_patch?.UnpatchSelf();
|
_patch?.UnpatchSelf();
|
||||||
_patch = null;
|
_patch = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[HarmonyTranspiler]
|
||||||
|
[HarmonyPatch(typeof(UIStationWindow), nameof(UIStationWindow.OnStationIdChange))]
|
||||||
|
private static IEnumerable<CodeInstruction> UIStationWindow_OnStationIdChange_Transpiler(IEnumerable<CodeInstruction> 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<CodeInstruction> UIStationWindow_OnMaxChargePowerSliderValueChange_Transpiler(IEnumerable<CodeInstruction> 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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user