|
1 | 1 | using System.ComponentModel;
|
2 | 2 | using OpenLocoTool.Headers;
|
3 |
| -using OpenLocoTool.Objects; |
4 | 3 |
|
5 | 4 | namespace OpenLocoTool.DatFileParsing
|
6 | 5 | {
|
7 | 6 | /*
|
8 |
| - === Dat File Format === |
9 |
| - |-File-------------------------------| |
10 |
| - |-S5Header-|-DatHeader--|-ObjectData-| |
| 7 | +=== Dat File Format === |
| 8 | +|-File-------------------------------| |
| 9 | +|-S5Header-|-DatHeader--|-ObjectData-| |
11 | 10 |
|
12 |
| - ============================================================================================================== |
| 11 | +============================================================================================================== |
13 | 12 |
|
14 |
| - |-S5Header----------------| |
15 |
| - |-Flags-|-Name-|-Checksum-| |
| 13 | +|-S5Header----------------| |
| 14 | +|-Flags-|-Name-|-Checksum-| |
16 | 15 |
|
17 |
| - |-DatHeader-------------| |
18 |
| - |-Encoding-|-Datalength-| |
| 16 | +|-DatHeader-------------| |
| 17 | +|-Encoding-|-Datalength-| |
19 | 18 |
|
20 |
| - |-ObjectData-----------------------------------------| |
21 |
| - |-Object-|-StringTable-|-VariableData-|-GraphicsData-| |
| 19 | +|-ObjectData-----------------------------------------| |
| 20 | +|-Object-|-StringTable-|-VariableData-|-GraphicsData-| |
22 | 21 |
|
23 |
| - ============================================================================================================== |
| 22 | +============================================================================================================== |
24 | 23 |
|
25 |
| - |-Object-| |
26 |
| - -- per-object |
| 24 | +|-Object-| |
| 25 | +-- per-object |
27 | 26 |
|
28 |
| - |-StringTable-| |
29 |
| - |-String{n}---| |
| 27 | +|-StringTable-| |
| 28 | +|-String{n}---| |
30 | 29 |
|
31 |
| - |-VariableData-| |
32 |
| - -- per-object |
| 30 | +|-VariableData-| |
| 31 | +-- per-object |
33 | 32 |
|
34 |
| - |-GraphicsData------------------------------| |
35 |
| - |-G1Header-|-G1Element32{n}-|-ImageBytes{n}-| |
| 33 | +|-GraphicsData------------------------------| |
| 34 | +|-G1Header-|-G1Element32{n}-|-ImageBytes{n}-| |
36 | 35 |
|
37 |
| - ============================================================================================================== |
| 36 | +============================================================================================================== |
38 | 37 |
|
39 |
| - |-String-----------------| |
40 |
| - |-Language-|-StringBytes-| |
| 38 | +|-String-----------------| |
| 39 | +|-Language-|-StringBytes-| |
41 | 40 |
|
42 |
| - |-G1Header---------------| |
43 |
| - |-Numentries-|-Totalsize-| |
| 41 | +|-G1Header---------------| |
| 42 | +|-NumEntries-|-TotalSize-| |
44 | 43 |
|
45 |
| - |-G1Element32------------------------------------------------------| |
46 |
| - |-Offset-|-Width-|-Height-|-xOffset-|-yOffset-|-Flags-|-ZoomOffset-| |
47 |
| -
|
48 |
| - |-ImageBytes-| |
49 |
| - -- offset by G1Element32.Offset |
50 |
| - */ |
51 |
| - |
52 |
| - [TypeConverter(typeof(ExpandableObjectConverter))] |
53 |
| - public interface ILocoStruct |
54 |
| - { |
55 |
| - static int StructSize { get; } |
56 |
| - } |
57 |
| - |
58 |
| - [TypeConverter(typeof(ExpandableObjectConverter))] |
59 |
| - public interface ILocoStructVariableData |
60 |
| - { |
61 |
| - ReadOnlySpan<byte> Load(ReadOnlySpan<byte> remainingData); |
62 |
| - |
63 |
| - ReadOnlySpan<byte> Save(); |
64 |
| - } |
65 |
| - |
66 |
| - [TypeConverter(typeof(ExpandableObjectConverter))] |
67 |
| - public interface ILocoStructStringTablePostLoad |
68 |
| - { |
69 |
| - void LoadPostStringTable(StringTable stringTable); |
70 |
| - } |
71 |
| - |
72 |
| - [TypeConverter(typeof(ExpandableObjectConverter))] |
73 |
| - public interface ILocoObject |
74 |
| - { |
75 |
| - S5Header S5Header { get; set; } |
76 |
| - ObjectHeader ObjectHeader { get; set; } |
77 |
| - ILocoStruct Object { get; set; } |
78 |
| - StringTable StringTable { get; set; } |
79 |
| - G1Header G1Header { get; set; } |
80 |
| - List<G1Element32> G1Elements { get; set; } |
81 |
| - } |
82 |
| - |
83 |
| - [TypeConverter(typeof(ExpandableObjectConverter))] |
84 |
| - public class G1Dat(G1Header g1Header, List<G1Element32> g1Elements) |
85 |
| - { |
86 |
| - public G1Header G1Header { get; set; } = g1Header; |
87 |
| - public List<G1Element32> G1Elements { get; set; } = g1Elements; |
88 |
| - } |
89 |
| - |
90 |
| - public static class ObjectTypeFixedSize |
91 |
| - { |
92 |
| - public static int GetSize(ObjectType objectType) |
93 |
| - => objectType switch |
94 |
| - { |
95 |
| - ObjectType.Airport => AirportObject.StructSize, |
96 |
| - ObjectType.Bridge => BridgeObject.StructSize, |
97 |
| - ObjectType.Building => BuildingObject.StructSize, |
98 |
| - ObjectType.Cargo => CargoObject.StructSize, |
99 |
| - ObjectType.CliffEdge => CliffEdgeObject.StructSize, |
100 |
| - ObjectType.Climate => ClimateObject.StructSize, |
101 |
| - ObjectType.Competitor => CompetitorObject.StructSize, |
102 |
| - ObjectType.Currency => CurrencyObject.StructSize, |
103 |
| - ObjectType.Dock => DockObject.StructSize, |
104 |
| - ObjectType.HillShapes => HillShapesObject.StructSize, |
105 |
| - ObjectType.Industry => IndustryObject.StructSize, |
106 |
| - ObjectType.InterfaceSkin => InterfaceSkinObject.StructSize, |
107 |
| - ObjectType.Land => LandObject.StructSize, |
108 |
| - ObjectType.LevelCrossing => LevelCrossingObject.StructSize, |
109 |
| - ObjectType.Region => RegionObject.StructSize, |
110 |
| - ObjectType.RoadExtra => RoadExtraObject.StructSize, |
111 |
| - ObjectType.Road => RoadObject.StructSize, |
112 |
| - ObjectType.RoadStation => RoadStationObject.StructSize, |
113 |
| - ObjectType.Scaffolding => ScaffoldingObject.StructSize, |
114 |
| - ObjectType.ScenarioText => ScenarioTextObject.StructSize, |
115 |
| - ObjectType.Snow => SnowObject.StructSize, |
116 |
| - ObjectType.Sound => SoundObject.StructSize, |
117 |
| - ObjectType.Steam => SteamObject.StructSize, |
118 |
| - ObjectType.StreetLight => StreetLightObject.StructSize, |
119 |
| - ObjectType.TownNames => TownNamesObject.StructSize, |
120 |
| - ObjectType.TrackExtra => TrackExtraObject.StructSize, |
121 |
| - ObjectType.Track => TrackObject.StructSize, |
122 |
| - ObjectType.TrainSignal => TrainSignalObject.StructSize, |
123 |
| - ObjectType.TrainStation => TrainStationObject.StructSize, |
124 |
| - ObjectType.Tree => TreeObject.StructSize, |
125 |
| - ObjectType.Tunnel => TunnelObject.StructSize, |
126 |
| - ObjectType.Vehicle => VehicleObject.StructSize, |
127 |
| - ObjectType.Wall => WallObject.StructSize, |
128 |
| - ObjectType.Water => WaterObject.StructSize, |
129 |
| - _ => throw new ArgumentOutOfRangeException(nameof(objectType), $"unknown object type {objectType}") |
130 |
| - }; |
131 |
| - } |
| 44 | +|-G1Element32------------------------------------------------------| |
| 45 | +|-Offset-|-Width-|-Height-|-xOffset-|-yOffset-|-Flags-|-ZoomOffset-| |
132 | 46 |
|
| 47 | +|-ImageBytes-| |
| 48 | +-- offset by G1Element32.Offset |
| 49 | +*/ |
133 | 50 | [TypeConverter(typeof(ExpandableObjectConverter))]
|
134 | 51 | public class LocoObject : ILocoObject
|
135 | 52 | {
|
136 |
| - public LocoObject(S5Header s5Hdr, ObjectHeader objHdr, ILocoStruct obj, StringTable stringTable, G1Header g1Header, List<G1Element32> g1Elements) |
| 53 | + public LocoObject(S5Header s5Hdr, ObjectHeader objHdr, ILocoStruct obj, StringTable stringTable, G1Header? g1Header, List<G1Element32>? g1Elements) |
137 | 54 | {
|
138 | 55 | S5Header = s5Hdr;
|
139 | 56 | ObjectHeader = objHdr;
|
|
0 commit comments