Skip to content

Commit 4dbff9a

Browse files
committed
Add support for 32-bit string units
1 parent 4341be7 commit 4dbff9a

File tree

3 files changed

+60
-10
lines changed

3 files changed

+60
-10
lines changed

src/MagesScriptTool/CompiledStringEncoding.cs

Lines changed: 45 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,27 +3,31 @@
33
namespace MagesScriptTool;
44

55
sealed class CompiledStringEncoding {
6+
readonly CompiledStringUnitEncoding _unitEncoding;
67
readonly StringTagsSpec _spec;
78

8-
public CompiledStringEncoding(StringTagsSpec spec) {
9+
public CompiledStringEncoding(CompiledStringUnitEncoding unitEncoding, StringTagsSpec spec) {
10+
_unitEncoding = unitEncoding;
911
_spec = spec;
1012
}
1113

1214
public void Encode(Stream stream, ImmutableArray<StringToken> tokens) {
13-
new CompiledStringEncoder(stream, _spec, tokens).Encode();
15+
new CompiledStringEncoder(stream, _unitEncoding, _spec, tokens).Encode();
1416
}
1517

1618
public ImmutableArray<StringToken> Decode(Stream stream) {
17-
return new CompiledStringDecoder(stream, _spec).Decode();
19+
return new CompiledStringDecoder(stream, _unitEncoding, _spec).Decode();
1820
}
1921

2022
sealed class CompiledStringEncoder {
2123
readonly Stream _stream;
24+
readonly CompiledStringUnitEncoding _unitEncoding;
2225
readonly StringTagsSpec _spec;
2326
readonly ImmutableArray<StringToken> _tokens;
2427

25-
public CompiledStringEncoder(Stream stream, StringTagsSpec spec, ImmutableArray<StringToken> tokens) {
28+
public CompiledStringEncoder(Stream stream, CompiledStringUnitEncoding unitEncoding, StringTagsSpec spec, ImmutableArray<StringToken> tokens) {
2629
_stream = stream;
30+
_unitEncoding = unitEncoding;
2731
_spec = spec;
2832
_tokens = tokens;
2933
}
@@ -64,8 +68,23 @@ void EncodeTag(StringTokenTag tag) {
6468

6569
void EncodeUnit(StringTokenUnit unit) {
6670
int value = unit.Value;
67-
PutByte((byte)((value >> 8) & 0x7F | 0x80));
68-
PutByte((byte)((value >> 0) & 0xFF));
71+
switch (_unitEncoding) {
72+
case CompiledStringUnitEncoding.UInt16: {
73+
PutByte((byte)((value >> 8) & 0x7F | 0x80));
74+
PutByte((byte)((value >> 0) & 0xFF));
75+
break;
76+
}
77+
case CompiledStringUnitEncoding.UInt32: {
78+
PutByte((byte)((value >> 24) & 0x7F | 0x80));
79+
PutByte((byte)((value >> 16) & 0xFF));
80+
PutByte((byte)((value >> 8) & 0xFF));
81+
PutByte((byte)((value >> 0) & 0xFF));
82+
break;
83+
}
84+
default: {
85+
throw new NotImplementedException($"{_unitEncoding} is not implemented.");
86+
}
87+
}
6988
}
7089

7190
void EncodeOperand(OperandKind kind, ExpressionNode expression) {
@@ -107,10 +126,12 @@ void PutByte(byte value) {
107126

108127
sealed class CompiledStringDecoder {
109128
readonly Stream _stream;
129+
readonly CompiledStringUnitEncoding _unitEncoding;
110130
readonly StringTagsSpec _spec;
111131

112-
public CompiledStringDecoder(Stream stream, StringTagsSpec spec) {
132+
public CompiledStringDecoder(Stream stream, CompiledStringUnitEncoding unitEncoding, StringTagsSpec spec) {
113133
_stream = stream;
134+
_unitEncoding = unitEncoding;
114135
_spec = spec;
115136
}
116137

@@ -154,8 +175,23 @@ StringTokenTag DecodeTag() {
154175

155176
StringTokenUnit DecodeUnit() {
156177
int value = 0;
157-
value |= (GetByte() & 0x7F) << 8;
158-
value |= (GetByte() & 0xFF) << 0;
178+
switch (_unitEncoding) {
179+
case CompiledStringUnitEncoding.UInt16: {
180+
value |= (GetByte() & 0x7F) << 8;
181+
value |= (GetByte() & 0xFF) << 0;
182+
break;
183+
}
184+
case CompiledStringUnitEncoding.UInt32: {
185+
value |= (GetByte() & 0x7F) << 24;
186+
value |= (GetByte() & 0xFF) << 16;
187+
value |= (GetByte() & 0xFF) << 8;
188+
value |= (GetByte() & 0xFF) << 0;
189+
break;
190+
}
191+
default: {
192+
throw new NotImplementedException($"{_unitEncoding} is not implemented.");
193+
}
194+
};
159195
return new(value);
160196
}
161197

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
namespace MagesScriptTool;
2+
3+
enum CompiledStringUnitEncoding {
4+
UInt16,
5+
UInt32,
6+
}

src/MagesScriptTool/Program.cs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,12 @@ static class Program {
5959
IsRequired = true,
6060
};
6161

62+
static readonly Option<CompiledStringUnitEncoding> StringUnitEncodingOption = new(
63+
name: "--string-unit-encoding",
64+
getDefaultValue: () => CompiledStringUnitEncoding.UInt16,
65+
description: "The encoding to use for compiled string units."
66+
);
67+
6268
static readonly Option<bool> GenerateSdbOption = new(
6369
name: "--generate-sdb",
6470
description: "Enable generation of SDB files. (currently only works for decompilation)"
@@ -94,6 +100,7 @@ public Tool(ParseResult result) {
94100
string bankDirectory = result.GetValueForOption(BankDirectoryOption)!;
95101
string flagSet = result.GetValueForOption(FlagSetOption)!;
96102
string charsetName = result.GetValueForOption(CharsetOption)!;
103+
CompiledStringUnitEncoding compiledStringUnitEncoding = result.GetValueForOption(StringUnitEncodingOption)!;
97104

98105
SpecBank bank = SpecBank.Load(bankDirectory);
99106
ImmutableDictionary<string, bool> flags = bank.GetFlags(flagSet);
@@ -110,7 +117,7 @@ public Tool(ParseResult result) {
110117
ImmutableArray<StringTagSpec> stringTagSpecs = bank.GetStringTagSpecs(flags);
111118
StringTagsSpec stringTagsSpec = new(stringTagSpecs);
112119

113-
CompiledStringEncoding compiledStringEncoding = new(stringTagsSpec);
120+
CompiledStringEncoding compiledStringEncoding = new(compiledStringUnitEncoding, stringTagsSpec);
114121
CompiledScriptPackageEncoding = new(compiledStringEncoding);
115122
CompiledStringTableEncoding = new(compiledStringEncoding);
116123
}
@@ -143,6 +150,7 @@ static async Task<int> Main(string[] args) {
143150
rootCommand.AddGlobalOption(BankDirectoryOption);
144151
rootCommand.AddGlobalOption(FlagSetOption);
145152
rootCommand.AddGlobalOption(CharsetOption);
153+
rootCommand.AddGlobalOption(StringUnitEncodingOption);
146154

147155
rootCommand.SetHandler(async context => {
148156
try {

0 commit comments

Comments
 (0)