Skip to content

Commit 604a372

Browse files
committed
Removed unfinished RACE work
Refactored subrecord templating to allow cloning and better handle malformed subrecords Most data types are now classes, more to follow
1 parent e76db08 commit 604a372

36 files changed

Lines changed: 1084 additions & 810 deletions

ESPSharp/DataTypes/AlternateTexture.cs

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,31 @@
88

99
namespace ESPSharp
1010
{
11-
public struct AlternateTexture : IESPToXML
11+
public class AlternateTexture : IESPSerializable, ICloneable<AlternateTexture>
1212
{
1313
public string Name;
1414
public FormID TextureSet;
1515
public int Index;
1616

17+
public AlternateTexture()
18+
{
19+
TextureSet = new FormID();
20+
}
21+
22+
public AlternateTexture(string Name, FormID TextureSet, int Index)
23+
{
24+
this.Name = Name;
25+
this.TextureSet = TextureSet.Clone();
26+
this.Index = Index;
27+
}
28+
29+
public AlternateTexture(AlternateTexture toCopy)
30+
{
31+
Name = toCopy.Name;
32+
TextureSet = toCopy.TextureSet.Clone();
33+
Index = toCopy.Index;
34+
}
35+
1736
public void WriteXML(XElement ele)
1837
{
1938
ele.Add(
@@ -29,5 +48,26 @@ public void ReadXML(XElement ele)
2948
TextureSet.ReadXML(ele.Element("TextureSet"));
3049
Index = ele.Element("Index").ToInt32();
3150
}
51+
52+
public void WriteBinary(ESPWriter writer)
53+
{
54+
writer.Write((uint)Name.Length);
55+
writer.Write(Name.ToCharArray());
56+
writer.Write(TextureSet);
57+
writer.Write(Index);
58+
}
59+
60+
public void ReadBinary(ESPReader reader)
61+
{
62+
int size = reader.ReadInt32();
63+
Name = new String(reader.ReadChars(size));
64+
TextureSet = reader.Read<FormID>();
65+
Index = reader.ReadInt32();
66+
}
67+
68+
public AlternateTexture Clone()
69+
{
70+
return new AlternateTexture(this);
71+
}
3272
}
3373
}

ESPSharp/DataTypes/Color.cs

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Text;
5+
using System.Threading.Tasks;
6+
using ESPSharp.Interfaces;
7+
using System.Xml.Linq;
8+
9+
namespace ESPSharp
10+
{
11+
public class Color : IESPSerializable, ICloneable<Color>
12+
{
13+
public byte Red;
14+
public byte Green;
15+
public byte Blue;
16+
public byte Alpha_Unused;
17+
18+
public Color()
19+
{
20+
Red = new byte();
21+
Green = new byte();
22+
Blue = new byte();
23+
Alpha_Unused = new byte();
24+
}
25+
26+
public Color(byte Red, byte Green, byte Blue, byte Alpha_Unused)
27+
{
28+
this.Red = Red;
29+
this.Green = Green;
30+
this.Blue = Blue;
31+
this.Alpha_Unused = Alpha_Unused;
32+
}
33+
34+
public Color(Color toCopy)
35+
{
36+
Red = toCopy.Red;
37+
Green = toCopy.Green;
38+
Blue = toCopy.Blue;
39+
Alpha_Unused = toCopy.Alpha_Unused;
40+
}
41+
42+
public void WriteXML(XElement ele)
43+
{
44+
ele.Add(
45+
new XElement("Red", Red),
46+
new XElement("Green", Green),
47+
new XElement("Blue", Blue),
48+
new XElement("Alpha_Unused", Alpha_Unused)
49+
);
50+
}
51+
52+
public void ReadXML(XElement ele)
53+
{
54+
Red = ele.Element("Red").ToByte();
55+
Green = ele.Element("Green").ToByte();
56+
Blue = ele.Element("Blue").ToByte();
57+
Alpha_Unused = ele.Element("Alpha_Unused").ToByte();
58+
}
59+
60+
public void WriteBinary(ESPWriter writer)
61+
{
62+
writer.Write(Red);
63+
writer.Write(Green);
64+
writer.Write(Blue);
65+
writer.Write(Alpha_Unused);
66+
}
67+
68+
public void ReadBinary(ESPReader reader)
69+
{
70+
Red = reader.ReadByte();
71+
Green = reader.ReadByte();
72+
Blue = reader.ReadByte();
73+
Alpha_Unused = reader.ReadByte();
74+
}
75+
76+
public Color Clone()
77+
{
78+
return new Color(this);
79+
}
80+
}
81+
}

ESPSharp/DataTypes/FormID.cs

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,34 @@
55
using System.Threading.Tasks;
66
using ESPSharp.Interfaces;
77
using System.Xml.Linq;
8+
using ESPSharp;
89

910
namespace ESPSharp
1011
{
11-
public struct FormID : IESPToXML
12+
public class FormID : IESPSerializable, ICloneable<FormID>
1213
{
1314
uint rawVal;
1415

16+
public FormID()
17+
{
18+
rawVal = 0;
19+
}
20+
1521
public FormID(uint inID)
1622
{
1723
rawVal = inID;
1824
}
1925

26+
public FormID(FormID toCopy)
27+
{
28+
rawVal = (uint)toCopy;
29+
}
30+
31+
public FormID Clone()
32+
{
33+
return new FormID(this);
34+
}
35+
2036
public static explicit operator FormID(uint val)
2137
{
2238
return new FormID(val);
@@ -41,5 +57,15 @@ public void ReadXML(XElement ele)
4157
{
4258
rawVal = uint.Parse(ele.Value, System.Globalization.NumberStyles.HexNumber);
4359
}
60+
61+
public void WriteBinary(ESPWriter writer)
62+
{
63+
writer.Write(rawVal);
64+
}
65+
66+
public void ReadBinary(ESPReader reader)
67+
{
68+
rawVal = reader.ReadUInt32();
69+
}
4470
}
4571
}

ESPSharp/ESPReader.cs

Lines changed: 43 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using System.Threading.Tasks;
66
using System.IO;
77
using System.Diagnostics;
8+
using ESPSharp.Interfaces;
89

910
namespace ESPSharp
1011
{
@@ -53,20 +54,51 @@ public T ReadEnum<T>()
5354
}
5455
}
5556

56-
public FormID ReadFormID()
57+
public T Read<T>() where T : new()
5758
{
58-
return (FormID)ReadUInt32();
59-
}
59+
Type tType = typeof(T);
60+
Type readType = tType;
6061

61-
public AlternateTexture ReadAlternateTexture()
62-
{
63-
AlternateTexture outTex;
64-
int size = ReadInt32();
65-
outTex.Name = new String(ReadChars(size));
66-
outTex.TextureSet = ReadFormID();
67-
outTex.Index = ReadInt32();
62+
if (tType.IsEnum)
63+
{
64+
return ReadEnum<T>();
65+
}
6866

69-
return outTex;
67+
string typeName = readType.FullName;
68+
69+
70+
switch (typeName)
71+
{
72+
case "System.Byte":
73+
return (T)(object)ReadByte();
74+
case "System.SByte":
75+
return (T)(object)ReadSByte();
76+
case "System.Char":
77+
return (T)(object)ReadChar();
78+
case "System.UInt16":
79+
return (T)(object)ReadUInt16();
80+
case "System.Int16":
81+
return (T)(object)ReadInt16();
82+
case "System.UInt32":
83+
return (T)(object)ReadUInt32();
84+
case "System.Int32":
85+
return (T)(object)ReadInt32();
86+
case "System.Single":
87+
return (T)(object)ReadSingle();
88+
case "System.UInt64":
89+
return (T)(object)ReadUInt64();
90+
case "System.Int64":
91+
return (T)(object)ReadInt64();
92+
}
93+
94+
if (typeof(T).GetInterfaces().Any(i => i == typeof(IESPSerializable)))
95+
{
96+
IESPSerializable outT = new T() as IESPSerializable;
97+
outT.ReadBinary(this);
98+
return (T)(object)outT;
99+
}
100+
101+
throw new NotImplementedException(typeName + " is not yet implemented.");
70102
}
71103
}
72104
}

ESPSharp/ESPSharp.csproj

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,10 @@
4343
</ItemGroup>
4444
<ItemGroup>
4545
<Compile Include="DataTypes\AlternateTexture.cs" />
46+
<Compile Include="DataTypes\Color.cs" />
4647
<Compile Include="DataTypes\FormID.cs" />
48+
<Compile Include="Enums\Flags\DecalDataFlags.cs" />
49+
<Compile Include="Interfaces\ICloneable.cs" />
4750
<Compile Include="Enums\ActorValues.cs" />
4851
<Compile Include="Enums\DataSource.cs" />
4952
<Compile Include="Enums\Flags\ClassDataFlag.cs" />
@@ -75,7 +78,7 @@
7578
<Compile Include="Enums\Flags\RecordFlag.cs" />
7679
<Compile Include="Group.cs" />
7780
<Compile Include="Interfaces\IEditorID.cs" />
78-
<Compile Include="Interfaces\IESPToXML.cs" />
81+
<Compile Include="Interfaces\IESPSerializable.cs" />
7982
<Compile Include="Interfaces\IReferenceContainer.cs" />
8083
<Compile Include="ISubgroup.cs" />
8184
<Compile Include="Properties\AssemblyInfo.cs" />
@@ -124,11 +127,6 @@
124127
<DesignTime>True</DesignTime>
125128
<DependentUpon>MenuIcon.tt</DependentUpon>
126129
</Compile>
127-
<Compile Include="Records\GeneratedCode\Race.cs">
128-
<AutoGen>True</AutoGen>
129-
<DesignTime>True</DesignTime>
130-
<DependentUpon>Race.tt</DependentUpon>
131-
</Compile>
132130
<Compile Include="Records\GenericRecord.cs" />
133131
<Compile Include="Records\GeneratedCode\Header.cs">
134132
<AutoGen>True</AutoGen>
@@ -162,7 +160,6 @@
162160
<DesignTime>True</DesignTime>
163161
<DependentUpon>Model.tt</DependentUpon>
164162
</Compile>
165-
<Compile Include="Subrecords\DecalData.cs" />
166163
<Compile Include="Subrecords\FormArray.cs" />
167164
<Compile Include="Subrecords\AlternateTextures.cs" />
168165
<Compile Include="Subrecords\GeneratedCode\Attributes.cs">
@@ -175,18 +172,28 @@
175172
<DesignTime>True</DesignTime>
176173
<DependentUpon>ClassData.tt</DependentUpon>
177174
</Compile>
175+
<Compile Include="Subrecords\GeneratedCode\DecalData.cs">
176+
<AutoGen>True</AutoGen>
177+
<DesignTime>True</DesignTime>
178+
<DependentUpon>DecalData.tt</DependentUpon>
179+
</Compile>
178180
<Compile Include="Subrecords\GeneratedCode\FactionData.cs">
179181
<AutoGen>True</AutoGen>
180182
<DesignTime>True</DesignTime>
181183
<DependentUpon>FactionData.tt</DependentUpon>
182184
</Compile>
185+
<Compile Include="Subrecords\GeneratedCode\PluginHeader.cs">
186+
<AutoGen>True</AutoGen>
187+
<DesignTime>True</DesignTime>
188+
<DependentUpon>PluginHeader.tt</DependentUpon>
189+
</Compile>
183190
<Compile Include="Subrecords\GeneratedCode\Relationship.cs">
184191
<AutoGen>True</AutoGen>
185192
<DesignTime>True</DesignTime>
186193
<DependentUpon>Relationship.tt</DependentUpon>
187194
</Compile>
188195
<Compile Include="Subrecords\ObjectBounds.cs" />
189-
<Compile Include="Subrecords\PluginHeader.cs" />
196+
<Compile Include="Subrecords\RecordReference.cs" />
190197
<Compile Include="Subrecords\SimpleSubrecord.cs" />
191198
<Compile Include="Subrecords\UndecodedSubrecord.cs" />
192199
<Compile Include="Utility.cs" />
@@ -230,10 +237,6 @@
230237
<Generator>TextTemplatingFileGenerator</Generator>
231238
<LastGenOutput>MenuIcon.cs</LastGenOutput>
232239
</None>
233-
<None Include="Records\GeneratedCode\Race.tt">
234-
<Generator>TextTemplatingFileGenerator</Generator>
235-
<LastGenOutput>Race.cs</LastGenOutput>
236-
</None>
237240
<None Include="Records\GeneratedCode\RecordTemplate.t4" />
238241
<None Include="Records\GeneratedCode\TextureSet.tt">
239242
<Generator>TextTemplatingFileGenerator</Generator>
@@ -264,10 +267,18 @@
264267
<Generator>TextTemplatingFileGenerator</Generator>
265268
<LastGenOutput>ClassData.cs</LastGenOutput>
266269
</None>
270+
<None Include="Subrecords\GeneratedCode\DecalData.tt">
271+
<Generator>TextTemplatingFileGenerator</Generator>
272+
<LastGenOutput>DecalData.cs</LastGenOutput>
273+
</None>
267274
<None Include="Subrecords\GeneratedCode\FactionData.tt">
268275
<Generator>TextTemplatingFileGenerator</Generator>
269276
<LastGenOutput>FactionData.cs</LastGenOutput>
270277
</None>
278+
<None Include="Subrecords\GeneratedCode\PluginHeader.tt">
279+
<Generator>TextTemplatingFileGenerator</Generator>
280+
<LastGenOutput>PluginHeader.cs</LastGenOutput>
281+
</None>
271282
<None Include="Subrecords\GeneratedCode\Relationship.tt">
272283
<Generator>TextTemplatingFileGenerator</Generator>
273284
<LastGenOutput>Relationship.cs</LastGenOutput>

ESPSharp/ESPWriter.cs

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using System.Text;
55
using System.Threading.Tasks;
66
using System.IO;
7+
using ESPSharp.Interfaces;
78

89
namespace ESPSharp
910
{
@@ -17,17 +18,9 @@ public void WriteTag(string Tag)
1718
Write(Utility.DesanitizeTag(Tag).ToCharArray());
1819
}
1920

20-
public void Write(FormID id)
21+
public void Write(IESPSerializable writeObject)
2122
{
22-
base.Write((uint)id);
23-
}
24-
25-
public void Write(AlternateTexture tex)
26-
{
27-
Write((uint)tex.Name.Length);
28-
Write(tex.Name.ToCharArray());
29-
Write(tex.TextureSet);
30-
Write(tex.Index);
23+
writeObject.WriteBinary(this);
3124
}
3225
}
3326
}

0 commit comments

Comments
 (0)