UNPKG

arx-convert

Version:

Converts various Arx Fatalis formats to JSON or YAML and back

77 lines 2.73 kB
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