patchwork-mapconverter
Version:
Executable wrapper for https://github.com/ChiefOfGxBxL/WC3MapTranslator
109 lines • 9.2 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.RegionsTranslator = void 0;
const HexBuffer_1 = require("../HexBuffer");
const W3Buffer_1 = require("../W3Buffer");
class RegionsTranslator {
constructor() { }
static getInstance() {
if (this.instance == null) {
this.instance = new this();
}
return this.instance;
}
static jsonToWar(regions) {
return this.getInstance().jsonToWar(regions);
}
static warToJson(buffer) {
return this.getInstance().warToJson(buffer);
}
jsonToWar(regionsJson) {
const outBufferToWar = new HexBuffer_1.HexBuffer();
/*
* Header
*/
outBufferToWar.addInt(5); // file version
outBufferToWar.addInt(regionsJson?.length || 0); // number of regions
/*
* Body
*/
regionsJson?.forEach(region => {
// Position
// Note that the .w3x guide has these coords wrong - the guide swaps bottom and right, but this is incorrect; bottom should be written before right
outBufferToWar.addFloat(region.position.left);
outBufferToWar.addFloat(region.position.bottom);
outBufferToWar.addFloat(region.position.right);
outBufferToWar.addFloat(region.position.top);
outBufferToWar.addString(region.name);
outBufferToWar.addInt(region.id);
// Weather effect name - lookup necessary: char[4]
if (region.weatherEffect != null) {
outBufferToWar.addChars(region.weatherEffect); // Weather effect is optional - defaults to 0000 for "none"
}
else {
// We can't put a string "0000", because ASCII 0's differ from 0x0 bytes
outBufferToWar.addByte(0);
outBufferToWar.addByte(0);
outBufferToWar.addByte(0);
outBufferToWar.addByte(0);
}
// Ambient sound - refer to names defined in .w3s file
outBufferToWar.addString(region.ambientSound != null ? region.ambientSound : ''); // May be empty string
// Color of region used by editor
// Careful! The order in .w3r is BB GG RR, whereas the JSON spec order is [RR, GG, BB]
outBufferToWar.addByte(region.color[2]); // blue
outBufferToWar.addByte(region.color[1]); // green
outBufferToWar.addByte(region.color[0]); // red
// End of structure - for some reason the .w3r needs this here;
// Value is set to 0xff based on observing the .w3r file, but not sure if it could be something else
outBufferToWar.addByte(0xff);
});
return {
errors: [],
buffer: outBufferToWar.getBuffer()
};
}
warToJson(buffer) {
const result = [];
const outBufferToJSON = new W3Buffer_1.W3Buffer(buffer);
const fileVersion = outBufferToJSON.readInt(); // File version
const numRegions = outBufferToJSON.readInt(); // # of regions
for (let i = 0; i < numRegions; i++) {
const region = {
name: '',
id: 0,
weatherEffect: '',
ambientSound: '',
color: [0, 0, 0],
position: {
left: 0,
bottom: 0,
right: 0,
top: 0
}
};
region.position.left = outBufferToJSON.readFloat();
region.position.bottom = outBufferToJSON.readFloat();
region.position.right = outBufferToJSON.readFloat();
region.position.top = outBufferToJSON.readFloat();
region.name = outBufferToJSON.readString();
region.id = outBufferToJSON.readInt();
region.weatherEffect = outBufferToJSON.readChars(4);
region.ambientSound = outBufferToJSON.readString();
region.color = [
outBufferToJSON.readByte(),
outBufferToJSON.readByte(),
outBufferToJSON.readByte() // blue
];
region.color.reverse(); // json wants it in RGB, but .w3r file stores it as BB GG RR
outBufferToJSON.readByte(); // end of region structure
result.push(region);
}
return {
errors: [],
json: result
};
}
}
exports.RegionsTranslator = RegionsTranslator;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVnaW9uc1RyYW5zbGF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvd2MzbWFwdHJhbnNsYXRvci90cmFuc2xhdG9ycy9SZWdpb25zVHJhbnNsYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw0Q0FBd0M7QUFDeEMsMENBQXNDO0FBS3RDLE1BQWEsaUJBQWlCO0lBRzVCLGdCQUF3QixDQUFDO0lBRWxCLE1BQU0sQ0FBQyxXQUFXO1FBQ3ZCLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLEVBQUU7WUFDekIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFBO1NBQzNCO1FBQ0QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFBO0lBQ3RCLENBQUM7SUFFTSxNQUFNLENBQUMsU0FBUyxDQUFFLE9BQWlCO1FBQ3hDLE9BQU8sSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUM5QyxDQUFDO0lBRU0sTUFBTSxDQUFDLFNBQVMsQ0FBRSxNQUFjO1FBQ3JDLE9BQU8sSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUM3QyxDQUFDO0lBRU0sU0FBUyxDQUFFLFdBQXFCO1FBQ3JDLE1BQU0sY0FBYyxHQUFHLElBQUkscUJBQVMsRUFBRSxDQUFBO1FBRXRDOztlQUVPO1FBQ1AsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLGVBQWU7UUFDeEMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsTUFBTSxJQUFJLENBQUMsQ0FBQyxDQUFBLENBQUMsb0JBQW9CO1FBRXBFOztlQUVPO1FBQ1AsV0FBVyxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUM1QixXQUFXO1lBQ1gsbUpBQW1KO1lBQ25KLGNBQWMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FB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