Skip to content

Commit 15db15c

Browse files
committed
progress on memory model
1 parent 99b8aba commit 15db15c

File tree

4 files changed

+70
-10
lines changed

4 files changed

+70
-10
lines changed

OpenLocoTool/DatFileParsing/LocoObject.cs

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -156,31 +156,45 @@ public static int GetSize(ObjectType objectType)
156156

157157
public class LocoMemoryObject
158158
{
159-
byte[] full; // the full bytes of the object, decoded
159+
public byte[] BytesSHeader { get; } = new byte[S5Header.StructLength];
160+
public byte[] BytesOHeader { get; } = new byte[ObjectHeader.StructLength];
161+
public byte[] BytesFixedData { get; set; }
162+
public byte[] BytesStringTable { get; set; }
163+
public byte[] BytesVariableData { get; set; }
164+
public byte[] BytesG1Header { get; set; } = new byte[G1Header.StructLength];
165+
public byte[] BytesG1Elements { get; set; }
160166

161167
public S5Header SHeader
162168
{
163-
get => S5Header.Read(full.AsSpan()[0..S5Header.StructLength]);
164-
set => value.Write().CopyTo(full.AsSpan()[0..S5Header.StructLength]);
169+
get => S5Header.Read(BytesSHeader);
170+
set => value.Write().CopyTo(BytesSHeader);
165171
}
166172

167173
public ObjectHeader OHeader
168174
{
169-
get => ObjectHeader.Read(full.AsSpan()[0..ObjectHeader.StructLength]);
170-
set => value.Write().CopyTo(full.AsSpan()[S5Header.StructLength..ObjectHeader.StructLength]);
175+
get => ObjectHeader.Read(BytesOHeader);
176+
set => value.Write().CopyTo(BytesOHeader);
171177
}
172178

173-
int FixedDataOffset => S5Header.StructLength + ObjectHeader.StructLength;
179+
const int FixedDataOffset = S5Header.StructLength + ObjectHeader.StructLength;
174180
int FixedDataLength => ObjectTypeFixedSize.GetSize(SHeader.ObjectType);
181+
175182
public ILocoStruct FixedData
176183
{
177-
get => SawyerStreamReader.GetLocoStruct(SHeader.ObjectType, full.AsSpan()[FixedDataOffset..FixedDataLength]);
178-
set => ByteWriter.WriteLocoStruct(value).CopyTo(full.AsSpan()[FixedDataOffset..FixedDataLength]);
184+
get => SawyerStreamReader.GetLocoStruct(SHeader.ObjectType, BytesFixedData.AsSpan()[FixedDataOffset..FixedDataLength]);
185+
set => ByteWriter.WriteLocoStruct(value).CopyTo(BytesFixedData.AsSpan()[FixedDataOffset..FixedDataLength]);
179186
}
180187

181188
// variable data
189+
182190
// string table
191+
183192
// graphics data
193+
//public G1Header G1Header
194+
//{
195+
// get => G1Header.Read(BytesG1Header);
196+
// set => value.Write().CopyTo(BytesG1Header);
197+
//}
184198
}
185199

186200
[TypeConverter(typeof(ExpandableObjectConverter))]

OpenLocoTool/DatFileParsing/SawyerStreamReader.cs

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
using System.Diagnostics;
22
using System.Numerics;
33
using System.Reflection;
4+
using System.Reflection.PortableExecutable;
45
using System.Text;
56
using OpenLocoTool.Headers;
67
using OpenLocoTool.Objects;
78
using OpenLocoToolCommon;
9+
using Zenith.Core;
810

911
namespace OpenLocoTool.DatFileParsing
1012
{
@@ -43,9 +45,53 @@ public IG1Dat LoadG1(string filename)
4345
return new G1Dat(g1Header, imageTable);
4446
}
4547

48+
public void LoadFullExperimental(string filename)
49+
{
50+
var fullData = LoadBytesFromFile(filename);
51+
var locoMemoryObject = new LocoMemoryObject();
52+
53+
fullData[0..S5Header.StructLength].CopyTo(locoMemoryObject.BytesSHeader, 0);
54+
fullData[S5Header.StructLength..(S5Header.StructLength + ObjectHeader.StructLength)].CopyTo(locoMemoryObject.BytesOHeader, 0);
55+
56+
var remainingData = Decode(
57+
locoMemoryObject.OHeader.Encoding,
58+
fullData[(S5Header.StructLength + ObjectHeader.StructLength)..]);
59+
60+
var fixedDataLength = ObjectTypeFixedSize.GetSize(locoMemoryObject.SHeader.ObjectType);
61+
remainingData[0..fixedDataLength].CopyTo(locoMemoryObject.BytesFixedData, 0);
62+
63+
remainingData = remainingData[fixedDataLength..];
64+
65+
var locoStruct = locoMemoryObject.FixedData;
66+
67+
// every object has a string table
68+
var (stringTable, stringTableBytesRead) = LoadStringTable(remainingData, locoStruct);
69+
remainingData = remainingData[stringTableBytesRead..];
70+
71+
if (locoStruct is ILocoStructStringTablePostLoad locoStructString)
72+
{
73+
locoStructString.LoadPostStringTable(stringTable);
74+
}
75+
76+
// variable data
77+
if (locoMemoryObject.FixedData is ILocoStructVariableData locoStructExtra)
78+
{
79+
remainingData = locoStructExtra.Load(remainingData).ToArray();
80+
}
81+
82+
// some objects have graphics data
83+
var (g1Header, imageTable, imageTableBytesRead) = LoadImageTable(remainingData);
84+
Verify.AreEqual(imageTableBytesRead, remainingData.Length);
85+
86+
// no more data
87+
88+
}
89+
4690
// load file
4791
public ILocoObject LoadFull(string filename, bool loadExtra = true)
4892
{
93+
LoadFullExperimental(filename);
94+
4995
ReadOnlySpan<byte> fullData = LoadBytesFromFile(filename);
5096

5197
// make openlocotool useful objects

OpenLocoTool/Headers/ObjectHeader.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ namespace OpenLocoTool.Headers
99
[LocoStructSize(0x05)]
1010
public record ObjectHeader(SawyerEncoding Encoding, uint32_t DataLength)
1111
{
12-
public static int StructLength => 0x05;
12+
public const int StructLength = 0x05;
1313

1414
public static ObjectHeader Read(ReadOnlySpan<byte> data)
1515
{

OpenLocoTool/Headers/S5Header.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ public S5Header(uint32_t flags, string name, uint32_t checksum)
2121
: this(name, checksum)
2222
=> Flags = flags;
2323

24-
public static int StructLength => 0x10;
24+
public const int StructLength = 0x10;
2525

2626
public uint32_t Flags { get; set; }
2727

0 commit comments

Comments
 (0)