|
1 |
| -using System.Text; |
| 1 | +using System.Text; |
2 | 2 | using OpenLoco.ObjectEditor.Headers;
|
3 | 3 | using OpenLoco.ObjectEditor.Objects;
|
4 | 4 | using OpenLoco.ObjectEditor.Types;
|
@@ -154,47 +154,47 @@ public static (DatFileInfo DatFileInfo, ILocoObject? LocoObject) LoadFullObjectF
|
154 | 154 | return new(new DatFileInfo(s5Header, objectHeader), newObj);
|
155 | 155 | }
|
156 | 156 |
|
| 157 | + static string CStringToString(ReadOnlySpan<byte> data, Encoding enc) |
| 158 | + { |
| 159 | + var ptr = 0; |
| 160 | + while (data[ptr++] != '\0') ; |
| 161 | + return enc.GetString(data[0..(ptr - 1)]); // do -1 to exclude the \0 |
| 162 | + } |
| 163 | + |
| 164 | + static Dictionary<LanguageId, string> GetNewLanguageDictionary() |
| 165 | + { |
| 166 | + var languageDict = new Dictionary<LanguageId, string>(); |
| 167 | + foreach (var language in Enum.GetValues<LanguageId>()) |
| 168 | + { |
| 169 | + languageDict.Add(language, string.Empty); |
| 170 | + } |
| 171 | + return languageDict; |
| 172 | + } |
| 173 | + |
157 | 174 | public static (StringTable table, int bytesRead) LoadStringTable(ReadOnlySpan<byte> data, string[] stringNames, ILogger? logger = null)
|
158 | 175 | {
|
159 | 176 | var stringTable = new StringTable();
|
160 | 177 |
|
161 | 178 | if (data.Length == 0 || stringNames.Length == 0)
|
162 | 179 | {
|
| 180 | + logger?.Warning($"No data for language table"); |
163 | 181 | return (stringTable, 0);
|
164 | 182 | }
|
165 | 183 |
|
166 | 184 | var ptr = 0;
|
167 | 185 |
|
168 | 186 | foreach (var locoString in stringNames)
|
169 | 187 | {
|
170 |
| - stringTable.Table.Add(locoString, []); |
| 188 | + // init language table |
| 189 | + stringTable.Table.Add(locoString, GetNewLanguageDictionary()); |
171 | 190 | var languageDict = stringTable[locoString];
|
172 | 191 |
|
173 |
| - // add empty strings for every single language |
174 |
| - foreach (var language in Enum.GetValues<LanguageId>()) |
175 |
| - { |
176 |
| - languageDict.Add(language, string.Empty); |
177 |
| - } |
178 |
| - |
179 |
| - for (; ptr < data.Length && data[ptr] != 0xFF;) |
| 192 | + // read string |
| 193 | + for (; ptr < data.Length && data[ptr] != 0xFF; ++ptr) |
180 | 194 | {
|
181 | 195 | var lang = (LanguageId)data[ptr++];
|
182 |
| - var ini = ptr; |
183 |
| - |
184 |
| - while (data[ptr++] != '\0') |
185 |
| - { |
186 |
| - ; |
187 |
| - } |
188 |
| - |
189 |
| - var str = Encoding.Latin1.GetString(data[ini..(ptr - 1)]); // do -1 to exclude the \0 |
190 |
| - |
191 |
| - if (!languageDict.ContainsKey(lang)) |
192 |
| - { |
193 |
| - logger?.Error($"Skipping unknown language: \"{lang}\""); |
194 |
| - break; |
195 |
| - } |
196 |
| - |
197 |
| - languageDict[lang] = str; |
| 196 | + languageDict[lang] = CStringToString(data[ptr..], Encoding.Latin1); |
| 197 | + ptr += languageDict[lang].Length; |
198 | 198 | }
|
199 | 199 |
|
200 | 200 | ptr++; // add one because we skipped the 0xFF byte at the end
|
|
0 commit comments