Newer
Older
rpg / apps / game / tools / pixelart / sizes.mjs
/**
 * Реестр размеров спрайтов игры — единственный источник истины для
 * генераторов (gen.mjs), линтера (aiart/lint-art.mjs) и aiart-тулз.
 * Таблица размеров в docs/art-style.md ссылается сюда (§2).
 *
 * Рантайм размеры не отсюда: движок читает их из атласного JSON
 * (`AssetLoader.frameSize`) — тулзовый реестр движок не знает.
 */
export const SIZES = {
    /** Тайл-ромб (изометрия 2:1). */
    tile: { w: 32, h: 16 },
    /** Высокие тайлы: спрайт якорится низом в центр ромба. */
    tall: {
        wall: [32, 32],
        well: [32, 40],
        tree: [32, 48],
        house: [32, 56],
        tower: [32, 80]
    },
    /** Крупные пропы. */
    prop: {
        houseBig: [64, 80],
        chest: [24, 18]
    },
    /** Кадры героя и NPC (общая сетка атласов chars/*_sheet). */
    char: { w: 16, h: 24 },
    /** Кадры фауны (та же сетка, что у героя). */
    fauna: { w: 16, h: 24 },
    /** Кадры сгустков (враги демо-боя; рисунки вписаны по низу-центру). */
    clump: { w: 20, h: 20 },
    /** Спрайты декора поверх тайлов (микро-кусты, камни, проплешины). */
    decor: { w: 16, h: 16 }
};

/** Слоты вне реестра: рукодельные кадры сгустков и крупные AI-ассеты. */
const EXTRA_SLOTS = ['14x12', '14x14', '48x48', '96x96', '128x112'];

const dim = (s) => (Array.isArray(s) ? `${s[0]}x${s[1]}` : `${s.w}x${s.h}`);

/** Все размеры группы: группа — либо один размер {w,h}, либо карта имён → размер. */
const groupDims = (group) =>
    'w' in group ? [group] : Object.values(group);

/** Все допустимые слоты линтера: реестр + исключения. */
export const SLOTS = new Set([
    ...Object.values(SIZES).flatMap((group) => groupDims(group).map(dim)),
    ...EXTRA_SLOTS
]);