huge refactor
This commit is contained in:
parent
e5ebe05571
commit
a8341e8232
29 changed files with 3184 additions and 340 deletions
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue