Skip to content

Commit 2949aab

Browse files
committed
add method to enumerate especs
1 parent 1952f54 commit 2949aab

File tree

1 file changed

+23
-11
lines changed

1 file changed

+23
-11
lines changed

TACTLib/Core/EncodingHandler.cs

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public class EncodingHandler {
2020
private readonly FullEKey[] EKeyESpecHeaderKeys;
2121
private readonly EKeyESpecEntry[][] EKeyESpecPages;
2222

23-
//public readonly string[] ESpecs;
23+
private readonly byte[] ESpecBlock;
2424

2525
public EncodingHandler(ClientHandler client) : this(client,
2626
client.ConfigHandler.BuildConfig.Encoding.EncodingKey, client.ConfigHandler.BuildConfig.EncodingSize!.EncodedSize)
@@ -46,18 +46,12 @@ public EncodingHandler(Stream? stream, bool leaveOpen=false)
4646
header.Version != 1) {
4747
throw new InvalidDataException($"EncodingHandler: encoding header invalid (magic: {header.Signature:X4}, csize: {header.CKeySize}, esize: {header.EKeySize})");
4848
}
49-
50-
var cKeyEKeyPageSize = header.m_ckeyEKeyPageSize.ToInt();
51-
var eKeyESpecPageSize = header.m_eKeyESpecPageSize.ToInt();
52-
53-
var cKeyEKeyPageCount = header.m_cKeyEKeyPageCount.ToInt();
54-
var eKeyEspecPageCount = header.m_eKeyEspecPageCount.ToInt();
55-
5649
Debug.Assert(header.m_unknown == 0); // asserted by agent
5750

58-
//ESpecs = Encoding.ASCII.GetString(reader.ReadBytes((int)header.m_especBlockSize.ToInt())).Split(new[] { '\0' }, StringSplitOptions.RemoveEmptyEntries);
59-
stream.Position += header.m_especBlockSize.ToInt();
51+
ESpecBlock = reader.ReadBytes((int)header.m_especBlockSize.ToInt());
6052

53+
var cKeyEKeyPageSize = header.m_ckeyEKeyPageSize.ToInt();
54+
var cKeyEKeyPageCount = header.m_cKeyEKeyPageCount.ToInt();
6155
var cKeyEKeyHeaders = reader.ReadArray<PageHeader>((int)cKeyEKeyPageCount);
6256
CKeyEKeyHeaderKeys = cKeyEKeyHeaders.Select(x => x.FirstKey).ToArray();
6357
CKeyEKeyPages_CKeys = new LinearCKeyEntry[cKeyEKeyHeaders.Length][];
@@ -95,7 +89,9 @@ public EncodingHandler(Stream? stream, bool leaveOpen=false)
9589

9690
CKeyEKeyPages_CKeys[pageIdx] = CKeyEKeyPages_CKeys[pageIdx].AsSpan(0, entryIdx).ToArray();
9791
}
98-
92+
93+
var eKeyESpecPageSize = header.m_eKeyESpecPageSize.ToInt();
94+
var eKeyEspecPageCount = header.m_eKeyEspecPageCount.ToInt();
9995
var eKeyESpecHeaders = reader.ReadArray<PageHeader>((int)eKeyEspecPageCount);
10096
EKeyESpecHeaderKeys = eKeyESpecHeaders.Select(x => x.FirstKey).ToArray();
10197
EKeyESpecPages = new EKeyESpecEntry[eKeyESpecHeaders.Length][];
@@ -200,6 +196,22 @@ public IEnumerable<CKey> GetCKeys() {
200196
}
201197
}
202198

199+
public IEnumerable<string> GetESpecs() {
200+
var pos = 0;
201+
while (pos < ESpecBlock.Length) {
202+
var span = ESpecBlock.AsSpan(pos);
203+
var terminatorIdx = span.IndexOf((byte)0);
204+
Debug.Assert(terminatorIdx != -1);
205+
Debug.Assert(terminatorIdx != 0);
206+
207+
var especAscii = span.Slice(0, terminatorIdx);
208+
var espec = Encoding.ASCII.GetString(especAscii);
209+
yield return espec;
210+
211+
pos += terminatorIdx + 1;
212+
}
213+
}
214+
203215
[StructLayout(LayoutKind.Sequential, Pack = 1)]
204216
private struct Header {
205217
public ushort Signature; // Encoding signature, "EN"

0 commit comments

Comments
 (0)