mdx-m3-viewer
Version:
A browser WebGL model viewer. Mainly focused on models of the games Warcraft 3 and Starcraft 2.
60 lines (44 loc) • 1.78 kB
text/typescript
import TokenStream from '../../mdlx/tokenstream';
/**
* war3map.wts - the string table file.
*
* Contains a map of number->string.
* When other map data like triggers use the string TRIGSTR_XXX, where XXX is a number, the value will be fetched from the table.
*/
export default class War3MapWts {
stringMap: Map<number, string> = new Map();
load(buffer: string) {
let stream = new TokenStream(buffer);
let token;
// Find the first instance of "STRING".
// There are some weird war3map.wts files that begin with the bytes "", and this causes the tokenizer to see the first token as "STRING".
// Going to the first "STRING" means we can ignore any weird bytes that happened to be before.
let start = buffer.indexOf('STRING');
// Can war3map.wts have no entries? I don't know, might as well add a condition.
if (start === -1) {
return;
}
stream.index = start;
while ((token = stream.readToken())) {
if (token === 'STRING') {
let index = stream.readInt();
stream.read(); // {
let end = buffer.indexOf('}', stream.index);
// For broken files, keep whatever data can be kept, and throw an exception.
if (end === -1) {
this.stringMap.set(index, buffer.slice(stream.index, buffer.length).trim());
throw new Error(`WTS: missing data in string ${this.stringMap.size} (and maybe more)`);
}
this.stringMap.set(index, buffer.slice(stream.index, end).trim());
stream.index = end;
}
}
}
save() {
let buffer = '';
for (let [key, value] of this.stringMap) {
buffer += `STRING ${key}\n{\n${value}\n}\n`;
}
return buffer;
}
}