mirror of
https://github.com/soarqin/DSP_Mods.git
synced 2025-12-09 06:13:36 +08:00
WIP
This commit is contained in:
@@ -214,8 +214,7 @@ public class LabOptPatch : BaseUnityPlugin
|
|||||||
[HarmonyPatch(typeof(FactorySystem), nameof(FactorySystem.FindLabFunctionsForBuild))]
|
[HarmonyPatch(typeof(FactorySystem), nameof(FactorySystem.FindLabFunctionsForBuild))]
|
||||||
[HarmonyPatch(typeof(FactorySystem), nameof(FactorySystem.GameTickLabResearchMode))]
|
[HarmonyPatch(typeof(FactorySystem), nameof(FactorySystem.GameTickLabResearchMode))]
|
||||||
[HarmonyPatch(typeof(FactorySystem), nameof(FactorySystem.SyncLabFunctions))]
|
[HarmonyPatch(typeof(FactorySystem), nameof(FactorySystem.SyncLabFunctions))]
|
||||||
// no need to patch this function, it just set everything to empty
|
[HarmonyPatch(typeof(FactorySystem), nameof(FactorySystem.TakeBackItems_Lab))]
|
||||||
// [HarmonyPatch(typeof(FactorySystem), nameof(FactorySystem.TakeBackItems_Lab))]
|
|
||||||
private static IEnumerable<CodeInstruction> FactorySystem_ReplaceLabSetFunction_Transpiler(IEnumerable<CodeInstruction> instructions, ILGenerator generator)
|
private static IEnumerable<CodeInstruction> FactorySystem_ReplaceLabSetFunction_Transpiler(IEnumerable<CodeInstruction> instructions, ILGenerator generator)
|
||||||
{
|
{
|
||||||
var matcher = new CodeMatcher(instructions, generator);
|
var matcher = new CodeMatcher(instructions, generator);
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using BepInEx;
|
using System;
|
||||||
|
using BepInEx;
|
||||||
using HarmonyLib;
|
using HarmonyLib;
|
||||||
|
|
||||||
namespace PoolOpt;
|
namespace PoolOpt;
|
||||||
@@ -19,6 +20,48 @@ public class PoolOptPatch : BaseUnityPlugin
|
|||||||
private static void GameSave_LoadCurrentGame_Postfix()
|
private static void GameSave_LoadCurrentGame_Postfix()
|
||||||
{
|
{
|
||||||
DebugOutput();
|
DebugOutput();
|
||||||
|
foreach (var planet in GameMain.data.factories)
|
||||||
|
{
|
||||||
|
if (planet == null) continue;
|
||||||
|
var factorySystem = planet.factorySystem;
|
||||||
|
if (factorySystem != null)
|
||||||
|
{
|
||||||
|
OptimizePool((in MinerComponent n) => n.id, 256,
|
||||||
|
ref factorySystem.minerPool, ref factorySystem.minerCursor, ref factorySystem.minerCapacity,
|
||||||
|
ref factorySystem.minerRecycle, ref factorySystem.minerRecycleCursor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
DebugOutput();
|
||||||
|
}
|
||||||
|
|
||||||
|
private delegate int GetId<T>(in T s) where T : struct;
|
||||||
|
|
||||||
|
private static bool OptimizePool<T>(GetId<T> getter, int initCapacity, ref T[] pool, ref int cursor, ref int capacity, ref int[] recycle, ref int recycleCursor) where T : struct
|
||||||
|
{
|
||||||
|
if (cursor <= 1) return false;
|
||||||
|
var pos = cursor;
|
||||||
|
while (pos > 0)
|
||||||
|
{
|
||||||
|
if (getter(pool[pos]) == pos) break;
|
||||||
|
pos--;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pos == cursor) return false;
|
||||||
|
if (pos == 0)
|
||||||
|
{
|
||||||
|
cursor = 1;
|
||||||
|
capacity = initCapacity;
|
||||||
|
pool = new T[initCapacity];
|
||||||
|
recycle = new int[initCapacity];
|
||||||
|
recycleCursor = 0;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
cursor = pos + 1;
|
||||||
|
Array.Sort(recycle);
|
||||||
|
var idx = Array.BinarySearch(recycle, 0, recycleCursor, pos);
|
||||||
|
recycleCursor = idx < 0 ? ~idx : idx + 1;
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void DebugOutput()
|
private static void DebugOutput()
|
||||||
@@ -44,6 +87,7 @@ public class PoolOptPatch : BaseUnityPlugin
|
|||||||
Logger.LogDebug($" Storage: Storage=[{factoryStorage.storageCursor},{factoryStorage.storageCapacity},{factoryStorage.storageRecycleCursor}]");
|
Logger.LogDebug($" Storage: Storage=[{factoryStorage.storageCursor},{factoryStorage.storageCapacity},{factoryStorage.storageRecycleCursor}]");
|
||||||
Logger.LogDebug($" Tank=[{factoryStorage.tankCursor},{factoryStorage.tankCapacity},{factoryStorage.tankRecycleCursor}]");
|
Logger.LogDebug($" Tank=[{factoryStorage.tankCursor},{factoryStorage.tankCapacity},{factoryStorage.tankRecycleCursor}]");
|
||||||
}
|
}
|
||||||
|
|
||||||
var factorySystem = planet.factorySystem;
|
var factorySystem = planet.factorySystem;
|
||||||
if (factorySystem != null)
|
if (factorySystem != null)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user