patchwork-mapconverter
Version:
Executable wrapper for https://github.com/ChiefOfGxBxL/WC3MapTranslator
167 lines • 16.7 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.DoodadsTranslator = void 0;
const HexBuffer_1 = require("../HexBuffer");
const W3Buffer_1 = require("../W3Buffer");
const AngleConverter_1 = require("../AngleConverter");
class DoodadsTranslator {
constructor() { }
static getInstance() {
if (this.instance == null) {
this.instance = new this();
}
return this.instance;
}
static jsonToWar(doodads) {
return this.getInstance().jsonToWar(doodads);
}
static warToJson(buffer) {
return this.getInstance().warToJson(buffer);
}
jsonToWar(compositeJson) {
const doodadsJson = compositeJson[0];
const specialDoodadsJson = compositeJson[1];
const outBufferToWar = new HexBuffer_1.HexBuffer();
/*
* Header
*/
outBufferToWar.addChars('W3do'); // file id
outBufferToWar.addInt(8); // file version
outBufferToWar.addInt(11); // subversion 0x0B
outBufferToWar.addInt(doodadsJson?.length || 0); // num of trees
/*
* Body
*/
doodadsJson?.forEach((tree) => {
outBufferToWar.addChars(tree.type);
outBufferToWar.addInt(tree.variation != null ? tree.variation : 0); // optional - default value 0
outBufferToWar.addFloat(tree.position[0]);
outBufferToWar.addFloat(tree.position[1]);
outBufferToWar.addFloat(tree.position[2]);
// Angle
// Doodads format is unique because it uses radians for angles, as opposed
// to angles in any other file which use degrees. Hence conversion is needed.
// war3map: Expects angle in RADIANS
// JSON: Spec defines angle in DEGREES
const radAngle = (0, AngleConverter_1.deg2Rad)(tree.angle != null ? tree.angle : 0);
outBufferToWar.addFloat(radAngle); // optional - default value 0
// Scale
if (tree.scale == null)
tree.scale = [1, 1, 1];
outBufferToWar.addFloat(tree.scale[0] != null ? tree.scale[0] : 1);
outBufferToWar.addFloat(tree.scale[1] != null ? tree.scale[1] : 1);
outBufferToWar.addFloat(tree.scale[2] != null ? tree.scale[2] : 1);
outBufferToWar.addChars(tree.skinId);
if (tree.flags == null)
tree.flags = { inUnplayableArea: false, notUsedInScript: true, fixedZ: false }; // defaults if no flags are specified
let treeFlag = 0;
if (tree.flags.fixedZ)
treeFlag |= 0x04;
if (tree.flags.notUsedInScript)
treeFlag |= 0x02;
if (tree.flags.inUnplayableArea)
treeFlag |= 0x01;
outBufferToWar.addByte(treeFlag);
outBufferToWar.addByte(tree.life != null ? tree.life : 100);
outBufferToWar.addInt(tree.randomItemSetPtr);
outBufferToWar.addInt(tree.droppedItemSets?.length || 0);
tree?.droppedItemSets?.forEach(itemSet => {
// Write the item set
outBufferToWar.addInt(itemSet.items?.length || 0);
itemSet.items?.forEach(item => {
outBufferToWar.addChars(item.itemId);
outBufferToWar.addInt(item.chance);
});
});
outBufferToWar.addInt(tree.id);
});
/*
* Footer
*/
outBufferToWar.addInt(0); // special doodad format number, fixed at 0x00
outBufferToWar.addInt(specialDoodadsJson?.length || 0); // number of special doodads
specialDoodadsJson?.forEach(specialDoodad => {
outBufferToWar.addChars(specialDoodad.type);
outBufferToWar.addInt(specialDoodad.position[0]); //x
outBufferToWar.addInt(specialDoodad.position[1]); //y
outBufferToWar.addInt(specialDoodad.position[2]); //z
});
return {
errors: [],
buffer: outBufferToWar.getBuffer()
};
}
warToJson(buffer) {
const result = [];
const outBufferToJSON = new W3Buffer_1.W3Buffer(buffer);
const fileId = outBufferToJSON.readChars(4); // W3do for doodad file
const fileVersion = outBufferToJSON.readInt(); // File version = 8
const subVersion = outBufferToJSON.readInt(); // 0B 00 00 00
const numDoodads = outBufferToJSON.readInt(); // # of doodads
for (let i = 0; i < numDoodads; i++) {
const doodad = {
type: '',
variation: 0,
position: [0, 0, 0],
angle: -1,
scale: [0, 0, 0],
skinId: '',
flags: { inUnplayableArea: false, notUsedInScript: true, fixedZ: false },
life: -1,
randomItemSetPtr: 0,
droppedItemSets: [],
id: -1
};
doodad.type = outBufferToJSON.readChars(4);
doodad.variation = outBufferToJSON.readInt();
doodad.position = [outBufferToJSON.readFloat(), outBufferToJSON.readFloat(), outBufferToJSON.readFloat()]; // X Y Z coords
// Angle
// Doodads format is unique because it uses radians for angles, as opposed
// to angles in any other file which use degrees. Hence conversion is needed.
// war3map: Expects angle in RADIANS
// JSON: Spec defines angle in DEGREES
doodad.angle = (0, AngleConverter_1.rad2Deg)(outBufferToJSON.readFloat());
doodad.scale = [outBufferToJSON.readFloat(), outBufferToJSON.readFloat(), outBufferToJSON.readFloat()]; // X Y Z scaling
doodad.skinId = outBufferToJSON.readChars(4);
const flags = outBufferToJSON.readByte();
doodad.flags = {
fixedZ: !!(flags & 0x04),
notUsedInScript: !!(flags & 0x02),
inUnplayableArea: !!(flags & 0x01),
};
doodad.life = outBufferToJSON.readByte(); // as a %
doodad.randomItemSetPtr = outBufferToJSON.readInt(); // points to an item set defined in the map (rather than custom one defined below)
const numberOfItemSets = outBufferToJSON.readInt(); // this should be 0 if randomItemSetPtr is >= 0
for (let j = 0; j < numberOfItemSets; j++) {
// Read the item set
const numberOfItems = outBufferToJSON.readInt();
doodad.droppedItemSets.push({ items: [] });
for (let k = 0; k < numberOfItems; k++) {
doodad.droppedItemSets[j].items.push({
itemId: outBufferToJSON.readChars(4),
chance: outBufferToJSON.readInt() // % chance to drop
});
}
}
doodad.id = outBufferToJSON.readInt();
result.push(doodad);
}
const resultSpecial = [];
outBufferToJSON.readInt(); // special doodad format version set to '0'
const numSpecialDoodads = outBufferToJSON.readInt();
for (let i = 0; i < numSpecialDoodads; i++) {
resultSpecial.push({
type: outBufferToJSON.readChars(4),
position: [outBufferToJSON.readInt(),
outBufferToJSON.readInt(),
outBufferToJSON.readInt()]
});
}
return {
errors: [],
json: [result, resultSpecial]
};
}
}
exports.DoodadsTranslator = DoodadsTranslator;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRG9vZGFkc1RyYW5zbGF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvd2MzbWFwdHJhbnNsYXRvci90cmFuc2xhdG9ycy9Eb29kYWRzVHJhbnNsYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw0Q0FBd0M7QUFDeEMsMENBQXNDO0FBQ3RDLHNEQUFvRDtBQUtwRCxNQUFhLGlCQUFpQjtJQUc1QixnQkFBd0IsQ0FBQztJQUVsQixNQUFNLENBQUMsV0FBVztRQUN2QixJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxFQUFFO1lBQ3pCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQTtTQUMzQjtRQUNELE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQTtJQUN0QixDQUFDO0lBRU0sTUFBTSxDQUFDLFNBQVMsQ0FBQyxPQUFvQztRQUMxRCxPQUFPLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDOUMsQ0FBQztJQUVNLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBYztRQUNwQyxPQUFPLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDN0MsQ0FBQztJQUVNLFNBQVMsQ0FBQyxhQUEwQztRQUN6RCxNQUFNLFdBQVcsR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckMsTUFBTSxrQkFBa0IsR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUMsTUFBTSxjQUFjLEdBQUcsSUFBSSxxQkFBUyxFQUFFLENBQUE7UUFDdEM7O2VBRU87UUFDUCxjQUFjLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFBLENBQUMsVUFBVTtRQUMxQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsZUFBZTtRQUN4QyxjQUFjLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FB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