UNPKG

patchwork-mapconverter

Version:

Executable wrapper for https://github.com/ChiefOfGxBxL/WC3MapTranslator

197 lines 15.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.SoundsTranslator = void 0; /* eslint-disable @typescript-eslint/strict-boolean-expressions */ const HexBuffer_1 = require("../HexBuffer"); const W3Buffer_1 = require("../W3Buffer"); class SoundsTranslator { constructor() { } static getInstance() { if (this.instance == null) { this.instance = new this(); } return this.instance; } static jsonToWar(sounds) { return this.getInstance().jsonToWar(sounds); } static warToJson(buffer) { return this.getInstance().warToJson(buffer); } jsonToWar(soundsJson) { const outBufferToWar = new HexBuffer_1.HexBuffer(); /* * Header */ outBufferToWar.addInt(3); // file version outBufferToWar.addInt(soundsJson?.length || 0); // number of sounds /* * Body */ soundsJson?.forEach((sound) => { outBufferToWar.addString(sound.name); // e.g. gg_snd_HumanGlueScreenLoop1 outBufferToWar.addString(sound.path); // e.g. Sound\Ambient\HumanGlueScreenLoop1.wav // EAX effects enum (e.g. missiles, speech, etc) /* default = DefaultEAXON combat = CombatSoundsEAX drums = KotoDrumsEAX spells = SpellsEAX missiles = MissilesEAX hero speech = HeroAcksEAX doodads = DoodadsEAX */ outBufferToWar.addString(sound.eax != null ? sound.eax : 'DefaultEAXON'); // defaults to "DefaultEAXON" // Flags, if present (optional) let flags = 0; if (sound.flags != null) { if (sound.flags.looping) flags |= 0x1; if (sound.flags['3dSound']) flags |= 0x2; if (sound.flags.stopOutOfRange) flags |= 0x4; if (sound.flags.music) flags |= 0x8; } outBufferToWar.addInt(flags); // Fade in and out rate (optional) outBufferToWar.addInt(sound.fadeRate != null ? sound.fadeRate.in != null ? sound.fadeRate.in : 10 : 10); // default to 10 outBufferToWar.addInt(sound.fadeRate != null ? sound.fadeRate.out != null ? sound.fadeRate.out : 10 : 10); // default to 10 // Volume (optional) outBufferToWar.addInt(sound.volume != null ? sound.volume : -1); // default to -1 (for normal volume) // Pitch (optional) outBufferToWar.addFloat(sound.pitch != null ? sound.pitch : 1.0); // default to 1.0 for normal pitch // Mystery numbers... their use is unknown by the w3x documentation, but they must be present outBufferToWar.addFloat(0); outBufferToWar.addInt(8); // or -1? // Which channel to use? Use the lookup table for more details (optional) /* 0=General 1=Unit Selection 2=Unit Acknowledgement 3=Unit Movement 4=Unit Ready 5=Combat 6=Error 7=Music 8=User Interface 9=Looping Movement 10=Looping Ambient 11=Animations 12=Constructions 13=Birth 14=Fire */ outBufferToWar.addInt(sound.channel != null ? sound.channel : 0); // default to 0 // Distance fields outBufferToWar.addFloat(sound.distance.min); outBufferToWar.addFloat(sound.distance.max); outBufferToWar.addFloat(sound.distance.cutoff); // More mystery numbers... outBufferToWar.addFloat(0); outBufferToWar.addFloat(0); outBufferToWar.addFloat(127); // or -1? outBufferToWar.addFloat(0); outBufferToWar.addFloat(0); outBufferToWar.addFloat(0); outBufferToWar.addString(sound.variableName); outBufferToWar.addString(''); outBufferToWar.addString(sound.path); // More unknowns outBufferToWar.addFloat(0); outBufferToWar.addByte(0); outBufferToWar.addFloat(0); outBufferToWar.addFloat(0); outBufferToWar.addFloat(0); outBufferToWar.addByte(0); outBufferToWar.addFloat(0); }); return { errors: [], buffer: outBufferToWar.getBuffer() }; } warToJson(buffer) { const result = []; const outBufferToJSON = new W3Buffer_1.W3Buffer(buffer); const fileVersion = outBufferToJSON.readInt(); // File version const numSounds = outBufferToJSON.readInt(); // # of sounds for (let i = 0; i < numSounds; i++) { const sound = { name: '', variableName: '', path: '', eax: '', volume: 0, pitch: 0, channel: 0, flags: { looping: true, '3dSound': true, stopOutOfRange: true, music: true // 0x00000008=music}, }, fadeRate: { in: 0, out: 0 }, distance: { min: 0, max: 0, cutoff: 0 } }; sound.name = outBufferToJSON.readString(); sound.path = outBufferToJSON.readString(); sound.eax = outBufferToJSON.readString(); const flags = outBufferToJSON.readInt(); sound.flags = { looping: !!(flags & 0b1), '3dSound': !!(flags & 0b10), stopOutOfRange: !!(flags & 0b100), music: !!(flags & 0b1000) // 0x00000008=music }; sound.fadeRate = { in: outBufferToJSON.readInt(), out: outBufferToJSON.readInt() }; sound.volume = outBufferToJSON.readInt(); sound.pitch = outBufferToJSON.readFloat(); // Unknown values outBufferToJSON.readFloat(); outBufferToJSON.readInt(); sound.channel = outBufferToJSON.readInt(); sound.distance = { min: outBufferToJSON.readFloat(), max: outBufferToJSON.readFloat(), cutoff: outBufferToJSON.readFloat() }; // Unknown values outBufferToJSON.readFloat(); outBufferToJSON.readFloat(); outBufferToJSON.readFloat(); outBufferToJSON.readFloat(); outBufferToJSON.readFloat(); outBufferToJSON.readFloat(); sound.variableName = outBufferToJSON.readString(); // Unknown values outBufferToJSON.readString(); outBufferToJSON.readString(); outBufferToJSON.readChars(4); outBufferToJSON.readChars(1); outBufferToJSON.readChars(4); outBufferToJSON.readChars(4); outBufferToJSON.readChars(4); outBufferToJSON.readChars(1); outBufferToJSON.readChars(4); result.push(sound); } return { errors: [], json: result }; } } exports.SoundsTranslator = SoundsTranslator; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU291bmRzVHJhbnNsYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy93YzNtYXB0cmFuc2xhdG9yL3RyYW5zbGF0b3JzL1NvdW5kc1RyYW5zbGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsa0VBQWtFO0FBQ2xFLDRDQUF3QztBQUN4QywwQ0FBc0M7QUFLdEMsTUFBYSxnQkFBZ0I7SUFHM0IsZ0JBQXdCLENBQUM7SUFFbEIsTUFBTSxDQUFDLFdBQVc7UUFDdkIsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksRUFBRTtZQUN6QixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUE7U0FDM0I7UUFDRCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUE7SUFDdEIsQ0FBQztJQUVNLE1BQU0sQ0FBQyxTQUFTLENBQUUsTUFBZTtRQUN0QyxPQUFPLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDN0MsQ0FBQztJQUVNLE1BQU0sQ0FBQyxTQUFTLENBQUUsTUFBYztRQUNyQyxPQUFPLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDN0MsQ0FBQztJQUVNLFNBQVMsQ0FBRSxVQUFtQjtRQUNuQyxNQUFNLGNBQWMsR0FBRyxJQUFJLHFCQUFTLEVBQUUsQ0FBQTtRQUV0Qzs7ZUFFTztRQUNQLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxlQUFlO1FBQ3hDLGNBQWMsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQSxDQUFDLG1CQUFtQjtRQUVsRTs7ZUFFTztRQUNQLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUM1QixjQUFjLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQSxD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