arx-convert
Version:
Converts various Arx Fatalis formats to JSON or YAML and back
77 lines • 2.73 kB
JavaScript
import { Key } from './Key.js';
import { BinaryIO } from '../common/BinaryIO.js';
import { concatArrayBuffers, times } from '../common/helpers.js';
/**
* @see https://github.com/arx/ArxLibertatis/blob/1.2.1/src/audio/Ambiance.cpp#L230
*/
export var ArxTrackFlags;
(function (ArxTrackFlags) {
ArxTrackFlags[ArxTrackFlags["None"] = 0] = "None";
ArxTrackFlags[ArxTrackFlags["Position"] = 1] = "Position";
// ? = 1 << 1,
ArxTrackFlags[ArxTrackFlags["Master"] = 4] = "Master";
// ? = 1 << 3,
ArxTrackFlags[ArxTrackFlags["Paused"] = 16] = "Paused";
ArxTrackFlags[ArxTrackFlags["Prefetched"] = 32] = "Prefetched";
})(ArxTrackFlags || (ArxTrackFlags = {}));
export class Track {
/**
* @see https://github.com/arx/ArxLibertatis/blob/1.2.1/src/audio/Ambiance.cpp#L531
*/
static readFrom(binary, isNewerVersion) {
const filename = Track.toRelativePath(binary.readString());
if (isNewerVersion) {
binary.readString(); // name - always ""
}
const flags = binary.readUint32();
const numberOfKeys = binary.readUint32();
const keys = times(() => {
return Key.readFrom(binary);
}, numberOfKeys);
if (isNewerVersion) {
keys.reverse();
}
return {
filename,
flags,
keys,
};
}
static accumulateFrom(track) {
const buffer = new ArrayBuffer(Track.sizeOf(track));
const binary = new BinaryIO(buffer);
binary.writeString(Track.toAbsolutePath(track.filename));
binary.writeString(''); // name
binary.writeUint32(track.flags);
binary.writeUint32(track.keys.length);
binary.writeBuffer(concatArrayBuffers(track.keys.reverse().map(Key.accumulateFrom)));
return buffer;
}
/**
* from: SFX\\AMBIANCE\\LOOP_GOBLIN_MAIN.WAV
* to: sfx/ambiance/loop_goblin_main.wav
*
* from: SFX\\AMBIANCE\\FX_ADDON\\SCREAM3.WAV
* to: sfx/ambiance/fx_addon/scream3.wav
*
* from: Sfx\Strange_noise10c.wav
* to: sfc/strange_noise10c.wav
*/
static toRelativePath(filename) {
return filename.toLowerCase().replaceAll('\\', '/');
}
/**
* from: srx/ambiance/loop_goblin_main.wav
* to: sfx\\ambiance\\loop_goblin_main.wav
*/
static toAbsolutePath(filename) {
return filename.toLowerCase().replaceAll('/', '\\');
}
static sizeOf(track) {
return (BinaryIO.sizeOfNullTerminatedString(track.filename) +
BinaryIO.sizeOfNullTerminatedString('') +
BinaryIO.sizeOfUint32() * 2 +
Key.sizeOf() * track.keys.length);
}
}
//# sourceMappingURL=Track.js.map