Newer
Older
rpg / apps / game / src / Game.ts
import { Engine, SaveManager, AssetLoader, type Renderer, type SceneManager } from '@rpg/engine';

/**
 * Игровой контекст: движок, сохранения, загрузчик ассетов.
 * Движок ничего не знает об этом классе — он только потребляет его API.
 */
export class Game {
    /** Виртуальное разрешение (пиксель-арт). */
    static readonly VIRTUAL_W = 480;
    static readonly VIRTUAL_H = 270;

    readonly saves: SaveManager;
    readonly assets: AssetLoader;

    /** Все ассеты игры: ключ = путь в apps/game/assets без расширения. */
    static readonly ASSET_KEYS = [
        'tiles/grass',
        'tiles/path',
        'tiles/water',
        'tiles/ash',
        'tiles/bellflower',
        'tiles/tree',
        'chars/hero_down_1',
        'chars/hero_down_2',
        'chars/hero_up_1',
        'chars/hero_up_2',
        'chars/hero_side_1',
        'chars/hero_side_2',
        'chars/elder_irwin',
        'chars/trader_mila'
    ];

    constructor(readonly engine: Engine) {
        this.saves = new SaveManager(window.localStorage);
        this.assets = new AssetLoader((key) => `${import.meta.env.BASE_URL}assets/${key}.png`);
    }

    get scenes(): SceneManager {
        return this.engine.scenes;
    }

    get renderer(): Renderer {
        return this.engine.renderer;
    }

    get camera() {
        return this.engine.camera;
    }

    get worldRoot() {
        return this.engine.renderer.worldRoot;
    }
}