huge refactor

This commit is contained in:
Boki 2026-03-02 23:45:12 -05:00
parent e5ebe05571
commit a8341e8232
29 changed files with 3184 additions and 340 deletions

View file

@ -113,32 +113,46 @@ public sealed class GameStateReader
}
snap.StateSlotValues = values;
// Read active states vector
// Read active states vector — scan controller for {begin, end} pairs
// containing known state slot pointers (auto-discovers layout)
if (offsets.ActiveStatesOffset > 0)
{
// Collect known state slot pointers for matching
var knownSlots = new HashSet<nint>();
foreach (var s in slots)
if (s != 0) knownSlots.Add(s);
// Try the configured offset with end at both +8 and +16
var beginPtr = mem.ReadPointer(controller + offsets.ActiveStatesOffset);
var endPtr = mem.ReadPointer(controller + offsets.ActiveStatesOffset + 16);
snap.ActiveStatesBegin = beginPtr;
nint endPtr = 0;
foreach (var endDelta in new[] { 8, 16 })
{
var candidate = mem.ReadPointer(controller + offsets.ActiveStatesOffset + endDelta);
if (candidate > beginPtr && candidate - beginPtr < 0x1000)
{
endPtr = candidate;
break;
}
}
snap.ActiveStatesEnd = endPtr;
if (beginPtr != 0 && endPtr > beginPtr)
{
var size = (int)(endPtr - beginPtr);
if (size is > 0 and < 0x1000)
var data = mem.ReadBytes(beginPtr, size);
if (data is not null)
{
var data = mem.ReadBytes(beginPtr, size);
if (data is not null)
var rawList = new List<nint>();
for (var i = 0; i + 8 <= data.Length; i += 8)
{
var rawList = new List<nint>();
for (var i = 0; i + 8 <= data.Length; i += offsets.StateStride)
{
var ptr = (nint)BitConverter.ToInt64(data, i);
rawList.Add(ptr);
if (ptr != 0)
snap.ActiveStates.Add(ptr);
}
snap.ActiveStatesRaw = rawList.ToArray();
var ptr = (nint)BitConverter.ToInt64(data, i);
rawList.Add(ptr);
if (ptr != 0)
snap.ActiveStates.Add(ptr);
}
snap.ActiveStatesRaw = rawList.ToArray();
}
}
}