Add ink integration UI and media playback
This commit is contained in:
Vendored
+38
@@ -0,0 +1,38 @@
|
||||
export type EngineName = 'yaml' | 'ink' | 'zork' | string;
|
||||
export interface GameMetadata {
|
||||
title: string;
|
||||
author?: string;
|
||||
subtitle?: string;
|
||||
version?: string;
|
||||
copyright?: string;
|
||||
}
|
||||
export interface GamePaths {
|
||||
mainGameFile: string;
|
||||
inkSource?: string;
|
||||
inkCompiled?: string;
|
||||
promptDir?: string;
|
||||
music?: string;
|
||||
sfx?: string;
|
||||
images?: string;
|
||||
[key: string]: string | undefined;
|
||||
}
|
||||
export interface GameEngineConfig {
|
||||
engine: EngineName;
|
||||
locale: 'en_US' | 'de_DE' | string;
|
||||
paths: GamePaths;
|
||||
metadata: GameMetadata;
|
||||
}
|
||||
export declare function projectPath(relativeOrAbsolutePath: string): string;
|
||||
export declare function loadGameConfig(configPath: string, engine: EngineName): GameEngineConfig;
|
||||
export declare function ensureConfiguredAssetDirectories(config: GameEngineConfig): void;
|
||||
export declare function clientGameConfig(config: GameEngineConfig): {
|
||||
engine: string;
|
||||
locale: string;
|
||||
metadata: GameMetadata;
|
||||
assets: {
|
||||
music: string;
|
||||
sfx: string;
|
||||
sounds: string;
|
||||
images: string;
|
||||
};
|
||||
};
|
||||
Vendored
+94
@@ -0,0 +1,94 @@
|
||||
"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
|
||||
Vendored
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"game-config.js","sourceRoot":"","sources":["../../src/config/game-config.ts"],"names":[],"mappings":"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"}
|
||||
Reference in New Issue
Block a user