patchwork-mapconverter
Version:
Executable wrapper for https://github.com/ChiefOfGxBxL/WC3MapTranslator
197 lines • 15.7 kB
JavaScript
;
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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