Skip to content

Commit 99b8aba

Browse files
committed
start work on new dat memory model
1 parent b4e95e8 commit 99b8aba

File tree

2 files changed

+77
-2
lines changed

2 files changed

+77
-2
lines changed

OpenLocoTool/DatFileParsing/LocoObject.cs

Lines changed: 75 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System.ComponentModel;
22
using OpenLocoTool.Headers;
3+
using OpenLocoTool.Objects;
34

45
namespace OpenLocoTool.DatFileParsing
56
{
@@ -103,12 +104,85 @@ public G1Dat(G1Header g1Header, List<G1Element32> g1Elements)
103104
//{
104105
// public byte[] S5Header { get; }
105106
// public byte[] ObjectHeader { get; set; }
106-
// public byte[] Object { get; set; }
107+
// public byte[] FixedData { get; set; }
108+
// public byte[] VariableData { get; set; }
107109
// public byte[] StringTable { get; set; }
108110
// public byte[] G1Header { get; set; }
109111
// public byte[] G1Elements { get; set; }
110112
//}
111113

114+
public static class ObjectTypeFixedSize
115+
{
116+
public static int GetSize(ObjectType objectType)
117+
=> objectType switch
118+
{
119+
ObjectType.Airport => AirportObject.StructSize,
120+
ObjectType.Bridge => BridgeObject.StructSize,
121+
ObjectType.Building => BuildingObject.StructSize,
122+
ObjectType.Cargo => CargoObject.StructSize,
123+
ObjectType.CliffEdge => CliffEdgeObject.StructSize,
124+
ObjectType.Climate => ClimateObject.StructSize,
125+
ObjectType.Competitor => CompetitorObject.StructSize,
126+
ObjectType.Currency => CurrencyObject.StructSize,
127+
ObjectType.Dock => DockObject.StructSize,
128+
ObjectType.HillShapes => HillShapesObject.StructSize,
129+
ObjectType.Industry => IndustryObject.StructSize,
130+
ObjectType.InterfaceSkin => InterfaceSkinObject.StructSize,
131+
ObjectType.Land => LandObject.StructSize,
132+
ObjectType.LevelCrossing => LevelCrossingObject.StructSize,
133+
ObjectType.Region => RegionObject.StructSize,
134+
ObjectType.RoadExtra => RoadExtraObject.StructSize,
135+
ObjectType.Road => RoadObject.StructSize,
136+
ObjectType.RoadStation => RoadStationObject.StructSize,
137+
ObjectType.Scaffolding => ScaffoldingObject.StructSize,
138+
ObjectType.ScenarioText => ScenarioTextObject.StructSize,
139+
ObjectType.Snow => SnowObject.StructSize,
140+
ObjectType.Sound => SoundObject.StructSize,
141+
ObjectType.Steam => SteamObject.StructSize,
142+
ObjectType.StreetLight => StreetLightObject.StructSize,
143+
ObjectType.TownNames => TownNamesObject.StructSize,
144+
ObjectType.TrackExtra => TrackExtraObject.StructSize,
145+
ObjectType.Track => TrackObject.StructSize,
146+
ObjectType.TrainSignal => TrainSignalObject.StructSize,
147+
ObjectType.TrainStation => TrainStationObject.StructSize,
148+
ObjectType.Tree => TreeObject.StructSize,
149+
ObjectType.Tunnel => TunnelObject.StructSize,
150+
ObjectType.Vehicle => VehicleObject.StructSize,
151+
ObjectType.Wall => WallObject.StructSize,
152+
ObjectType.Water => WaterObject.StructSize,
153+
_ => throw new ArgumentOutOfRangeException(nameof(objectType), $"unknown object type {objectType}")
154+
};
155+
}
156+
157+
public class LocoMemoryObject
158+
{
159+
byte[] full; // the full bytes of the object, decoded
160+
161+
public S5Header SHeader
162+
{
163+
get => S5Header.Read(full.AsSpan()[0..S5Header.StructLength]);
164+
set => value.Write().CopyTo(full.AsSpan()[0..S5Header.StructLength]);
165+
}
166+
167+
public ObjectHeader OHeader
168+
{
169+
get => ObjectHeader.Read(full.AsSpan()[0..ObjectHeader.StructLength]);
170+
set => value.Write().CopyTo(full.AsSpan()[S5Header.StructLength..ObjectHeader.StructLength]);
171+
}
172+
173+
int FixedDataOffset => S5Header.StructLength + ObjectHeader.StructLength;
174+
int FixedDataLength => ObjectTypeFixedSize.GetSize(SHeader.ObjectType);
175+
public ILocoStruct FixedData
176+
{
177+
get => SawyerStreamReader.GetLocoStruct(SHeader.ObjectType, full.AsSpan()[FixedDataOffset..FixedDataLength]);
178+
set => ByteWriter.WriteLocoStruct(value).CopyTo(full.AsSpan()[FixedDataOffset..FixedDataLength]);
179+
}
180+
181+
// variable data
182+
// string table
183+
// graphics data
184+
}
185+
112186
[TypeConverter(typeof(ExpandableObjectConverter))]
113187
public class LocoObject : ILocoObject
114188
{

OpenLocoTool/DatFileParsing/SawyerStreamReader.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,12 +87,13 @@ public ILocoObject LoadFull(string filename, bool loadExtra = true)
8787
locoStructString.LoadPostStringTable(stringTable);
8888
}
8989

90-
// special handling per object type
90+
// some objects have variable-sized data
9191
if (loadExtra && locoStruct is ILocoStructVariableData locoStructExtra)
9292
{
9393
remainingData = locoStructExtra.Load(remainingData);
9494
}
9595

96+
// some objects have graphics data
9697
var (g1Header, imageTable, imageTableBytesRead) = LoadImageTable(remainingData);
9798
Logger.Log(LogLevel.Info, $"FileLength={new FileInfo(filename).Length} HeaderLength={S5Header.StructLength} DataLength={objectHeader.DataLength} StringTableLength={stringTableBytesRead} ImageTableLength={imageTableBytesRead}");
9899

0 commit comments

Comments
 (0)