arx-level-generator
Version:
A tool for creating Arx Fatalis maps
67 lines • 2.25 kB
JavaScript
import fs from 'node:fs/promises';
import path from 'node:path';
import { DLF, FTS, LLF } from 'arx-convert';
import { createCacheFolderIfNotExists } from './services/cache.js';
export class LevelLoader {
levelIdx;
settings;
constructor(levelIdx, settings) {
this.levelIdx = levelIdx;
this.settings = settings;
}
async readDlf() {
return this.readData('dlf');
}
async readFts() {
return this.readData('fts');
}
async readLlf() {
return this.readData('llf');
}
async readData(format) {
const jsonFolder = await createCacheFolderIfNotExists(this.getCachedJsonFolder(), this.settings);
const jsonFilename = path.resolve(jsonFolder, './' + this.getFilename(format) + '.json');
const parser = this.getParser(format);
let data;
try {
const jsonData = await fs.readFile(jsonFilename, 'utf-8');
data = JSON.parse(jsonData);
}
catch (e) {
const binaryFolder = this.getBinaryFolder();
const binaryFilename = path.resolve(binaryFolder, './' + this.getFilename(format) + '.unpacked');
try {
await fs.access(binaryFolder, fs.constants.R_OK | fs.constants.W_OK);
}
catch (e) {
throw new Error(`attempted to read folder containing binary level data at "${binaryFolder}"`);
}
const binaryData = await fs.readFile(binaryFilename);
data = parser.load(binaryData);
await fs.writeFile(jsonFilename, JSON.stringify(data), 'utf-8');
}
return data;
}
getParser(format) {
if (format === 'dlf') {
return DLF;
}
if (format === 'fts') {
return FTS;
}
return LLF;
}
getFilename(format) {
if (format === 'fts') {
return 'fast.fts';
}
return `level${this.levelIdx}.${format}`;
}
getCachedJsonFolder() {
return `./levels/level${this.levelIdx}`;
}
getBinaryFolder() {
return path.resolve(this.settings.originalLevelFiles, `./arx-fatalis/level${this.levelIdx}`);
}
}
//# sourceMappingURL=LevelLoader.js.map