Newer
Older
rpg / docs / art-style.md

Пепельные луга — арт-библия пиксель-арта

Основа — docs/world.md. Ключевое правило арта из сеттинга: тёплый цвет — только жизнь. Золото колокольчика, бронза, огонь кузни. Всё остальное — серо-оливковое, ржавое, тёмное.

1. Палитра (32 цвета)

Движок и генератор (apps/game/tools/pixelart/) используют ровно эти цвета. Имя цвета — тоже комментарий к настроению.

Пепел (нейтраль)

Слот HEX Роль
P0 #17171d контур, самая тёмная тень
P1 #23232b тень плащей, ночная сторона
P2 #2f2f38 тёмный серый
P3 #3e3e48 пепельный накат, тень тайлов
P4 #52525c базовый серый
P5 #6a6a74 светлая пыль
P6 #86868f пепельный бугор, свет
P5H #a3a3ac выгоревший свет (редко!)

Мёртвая трава (оливково-серая)

Слот HEX Роль
G0 #2b3026 тень травы
G1 #3d4436 базовый луг
G2 #525b44 трава, свет
G2H #687053 сухие стебли

Ржавчина и металл (индастриал)

Слот HEX Роль
R0 #3a2822 тёмная ржавчина, тень
R1 #5c3b2e базовая ржавчина
R2 #82503a светлая ржавчина
M0 #26262e тёмный металл
M1 #44454e сталь
M2 #61626c светлый металл

Вода (Серые пруды)

Слот HEX Роль
W0 #22343c глубина
W1 #32505c базовая
W2 #4a737f блики, рябь

Тепло (только жизнь!)

Слот HEX Роль
B0 #8a6a2e бронза, тень
B1 #d99a32 бронза, свет / цветок
B2 #f2cd68 золото,highlight цветка и колоколов
F0 #d97f2b огонь кузни, уголёк
F1 #f2b45a огонь, свет

Люди и ткань

Слот HEX Роль
C0 #3a4356 плащ звонаря (тень)
C1 #4d5a72 плащ звонаря (свет)
W3 #8a8f7d вощёное полотно, Мила
S0 #8a6d55 кожа, тень
S1 #c9a689 кожа, свет
T0 #5a4a3c шляпа/плащ Ирвина
T1 #77634f шляпа/плащ Ирвина, свет

Правила палитры: чёрный/белый запрещены (крайности — P0 и P5H). B1/B2/F0/F1 занимают не более 5% площади любого спрайта — золото должно быть событием, а не заливкой.

2. Формат и размеры

Источник номиналов — реестр apps/game/tools/pixelart/sizes.mjs (его читают генераторы и линтер; рантайм берёт размер кадра из атласа — AssetLoader.frameSize).

  • Тайл: ромб 32×16 (движок, DEFAULT_ISO).
  • Персонаж: 16×24, якорь — центр между ступней (низ спрайта = центр ромба тайла).
  • Дерево (высокий объект): 32×48, якорь — центр ствола у земли.
  • Пропсы (бочки, тележка Милы, рельсы): 16×16 или 16×24, тоже якорь у земли.
  • Крупные объекты (props, footprint w×h): спрайт покрывает весь footprint, якорь — низ-центр footprint'а (движок ставит сам). Слоты:
    • дом 2×2: 64×80 (footprint 64×32 + стены/крыша);
    • дом 3×3: 96×96;
    • большое здание 4×4: 128×112. Плотность пикселя — та же, что у тайлов и персонажей (1 px спрайта = 1 px мира): апскейл-болванки из AI-генерации в эти слоты не попадают — только как плейсхолдеры.
  • AI-атласы персонажей: пайплайн npm run aiart (gen/build/promote, манифест apps/game/tools/aiart/atlas-manifest.json); в assets/ — только после ручного апрува обзорного листа (status: approved). Палитра — параметр манифеста; по умолчанию эти 32 цвета.
  • Шрифт интерфейса: системный monospace до появления пиксельного шрифта (8px в виртуальном разрешении).

3. Стиль

  1. Контур: 1px P0 только на внешнем силуэте; внутренние формы отделяются тенью, не контуром.
  2. Свет: сверху-слева. Три тона на форму: тень → база → свет. Хайлайт — 1px, редко.
  3. Дизеринг: разрешён шахматный 1px на границе двух тонов, не более 2px полосы.
  4. Цветы жизни: цветок = 3 пикселя B1 + 1px B2 сверху. Никаких «нарисованных» лепестков крупнее.
  5. Механизмы: ржавчина по нижним граням, сталь сверху. Пепел ложится на горизонтальные грани (P5 сверху рельсов).
  6. Анимация ходьбы: 2 кадра (ноги в разнобой) + idle. Читается на 16×24 — крупность важнее плавности.
  7. Свет сцены — оверлей, не пиксели спрайта: тёплые гало источников (Lighting в renderer.lightRoot) рисуются поверх затемнения ступенчатыми кругами и в палитру спрайтов не входят. Цвет света — из тёплой гаммы жизни (F1 #f2b45a по умолчанию); холодный свет — только для неживого (резонанс башни — W2). Интенсивность источника ≤ 1.1, радиус ≤ 5 юнитов; «золото — событие, а не заливка» относится и к свету: гало — событие сцены, не фон.

4. Ассеты и чеклист

Все PNG — из apps/game/assets/, генерируются apps/game/tools/pixelart/gen.mjs.

Тайлы (32×16, id совпадает с apps/game/src/data/map.ts)

id файл содержание
0 tiles/grass.png серая трава, редкие сухие стебли
1 tiles/path.png звонёная тропа: утоптанный пепел, светлее травы
2 tiles/water.png Серый пруд: W1 база, блики W2
3 tiles/tree.png дерево Ржавой рощи — 32×48, tall-объект
4 tiles/ash.png пепельный бугор: P4/P6 с тёмным ободом
5 tiles/bellflower.png трава + цветок B1/B2 (квестовый тайл)
6 tiles/tower.png башня Звенца — 32×80, tall-объект 2.5 юнита: бак на ногах-рельсах, колокол B0/B2 под баком
7 tiles/house.png дом Звенца — 32×56, tall-объект 1.75 юнита: стены из вагонных щитов, крыша из шпал
tiles/house_big.png большой дом — 64×80, prop-объект footprint 2×2: два модуля щитов, козырёк над дверью, окна с переплётом
tiles/chest.png сундук — 24×18, prop интерьеров: вощёное дерево T0/T1, бронзовая полоса по стыку крышки и замок B0/B1/B2 (см. SIZES.prop.chest)
tiles/grass_2/3.png, tiles/path_2.png, tiles/ash_2.png варианты текстур 32×16 (та же палитра, другой seed шума) — микс по хэшу координат, в tiles не попадают
tiles/decor_tuft/stone/bald.png декор 16×16, рисунок в ромб 16×8: кустик G1/G2/G2H, камешек P3/P5, проплешина G0/G1 — прозрачное поле, рисуются плашмя

Персонажи (16×24)

файл кадры содержание
chars/hero_down_1.png, hero_down_2.png ходьба вниз звонарь: плащ C0/C1, шляпа T0, колокольчик B0
chars/hero_up_1.png, hero_up_2.png ходьба вверх спина: узел плаща, лампа
chars/hero_side_1.png, hero_side_2.png ходьба влево вправо — горизонтальный флип
chars/elder_irwin.png idle длинный плащ T0/T1, борода S0, стилос
chars/trader_mila.png idle платок W3, тележка-ручка, ручной колокольчик B1
chars/fauna_deer_1.png, fauna_deer_2.png стоит/шаг безгласный олень: серо-оливковый G1/G2, рога M2, без тёплых пикселей

Интерьер/UI (позже)

  • Панель диалога: 9-patch, тёмный P1 с бронзовой окантовкой B0.
  • Иконки: цветок, маска-полотно, колокольчик — 8×8.

5. Что где хранится

  • apps/game/tools/pixelart/gen.mjs — генератор: пиксель-карты в ASCII + энкодер PNG (без зависимостей).
  • apps/game/assets/ — выход генератора, загружается AssetLoader по ключу = пути без расширения (tiles/grassassets/tiles/grass.png).
  • После замены сгенерированного арта на нарисованный руками имена файлов и размеры не меняются.