94 lines
3.2 KiB
JavaScript
94 lines
3.2 KiB
JavaScript
"use strict";
|
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
};
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.projectPath = projectPath;
|
|
exports.loadGameConfig = loadGameConfig;
|
|
exports.ensureConfiguredAssetDirectories = ensureConfiguredAssetDirectories;
|
|
exports.clientGameConfig = clientGameConfig;
|
|
const path_1 = __importDefault(require("path"));
|
|
const fs_1 = require("fs");
|
|
const PROJECT_ROOT = path_1.default.resolve(__dirname, '../..');
|
|
function fallbackConfig(engine) {
|
|
return {
|
|
engine,
|
|
locale: 'en_US',
|
|
paths: {
|
|
mainGameFile: engine === 'ink'
|
|
? 'data/ink/story.ink.json'
|
|
: engine === 'zork'
|
|
? 'data/z-code/zork1.bin'
|
|
: 'data/worlds/example_world.yml',
|
|
music: 'public/music',
|
|
sfx: 'public/sounds',
|
|
images: 'public/images',
|
|
},
|
|
metadata: {
|
|
title: 'AI Interactive Fiction',
|
|
author: 'Generative AI',
|
|
subtitle: 'An open-world text adventure',
|
|
version: '1.0.0',
|
|
copyright: '',
|
|
},
|
|
};
|
|
}
|
|
function projectPath(relativeOrAbsolutePath) {
|
|
return path_1.default.isAbsolute(relativeOrAbsolutePath)
|
|
? relativeOrAbsolutePath
|
|
: path_1.default.resolve(PROJECT_ROOT, relativeOrAbsolutePath);
|
|
}
|
|
function loadGameConfig(configPath, engine) {
|
|
const absolutePath = projectPath(configPath);
|
|
if (!(0, fs_1.existsSync)(absolutePath)) {
|
|
console.warn(`[config] Missing ${absolutePath}; using ${engine} defaults.`);
|
|
return fallbackConfig(engine);
|
|
}
|
|
const parsed = JSON.parse((0, fs_1.readFileSync)(absolutePath, 'utf8'));
|
|
const fallback = fallbackConfig(engine);
|
|
return {
|
|
engine: parsed.engine ?? fallback.engine,
|
|
locale: parsed.locale ?? fallback.locale,
|
|
paths: {
|
|
...fallback.paths,
|
|
...(parsed.paths ?? {}),
|
|
},
|
|
metadata: {
|
|
...fallback.metadata,
|
|
...(parsed.metadata ?? {}),
|
|
},
|
|
};
|
|
}
|
|
function ensureConfiguredAssetDirectories(config) {
|
|
const directories = [
|
|
config.paths.music,
|
|
config.paths.sfx,
|
|
config.paths.images,
|
|
config.paths.inkSource ? path_1.default.dirname(config.paths.inkSource) : undefined,
|
|
config.paths.inkCompiled ? path_1.default.dirname(config.paths.inkCompiled) : undefined,
|
|
config.paths.mainGameFile ? path_1.default.dirname(config.paths.mainGameFile) : undefined,
|
|
config.paths.promptDir,
|
|
];
|
|
for (const directory of directories) {
|
|
if (!directory)
|
|
continue;
|
|
const absolutePath = projectPath(directory);
|
|
if (!(0, fs_1.existsSync)(absolutePath)) {
|
|
(0, fs_1.mkdirSync)(absolutePath, { recursive: true });
|
|
}
|
|
}
|
|
}
|
|
function clientGameConfig(config) {
|
|
return {
|
|
engine: config.engine,
|
|
locale: config.locale,
|
|
metadata: config.metadata,
|
|
assets: {
|
|
music: '/music/',
|
|
sfx: '/sounds/',
|
|
sounds: '/sounds/',
|
|
images: '/images/',
|
|
},
|
|
};
|
|
}
|
|
//# sourceMappingURL=game-config.js.map
|