Визуальный мод · Ale & Tale Tavern

Neon Dark Fantasy

Мне понравился игровой стиль Dark Fantasy: пререндеренная CGI-графика конца 90-х, ночь цвета индиго, свет из конкретных источников. Этот мод переносит его в Ale & Tale Tavern — без правки файлов игры и без изменений геймплея.

в работе · версия 0.7 собрана, проверка в игре впереди
Арт-дирекшнПроцедурные текстурыСветUnity-моддингC# / BepInEx
Луна мода: половина — звёздная ночь, половина — кратеры, огненный и ледяной глаз
7версий мода за неделю: от 0.1 до 0.7
35+процедурных текстур, сгенерированных кодом
3 275текстур игры проанализировано дампером
~250текстур мод перекрашивает на лету

Роли

Трифон / WwolDEM — идея, арт-дирекшн, референсы, тесты в игре, солнце и луна.

Claude (Anthropic) — код плагина, процедурные текстуры, техническое исследование игры.

Стек

Unity 2022.3 · URP · BepInEx 5 · C# (~1 600 строк) · Python / NumPy (~1 000 строк генераторов) · рефлексия к URP Volume без Harmony

01 · Откуда стиль

Понравился стиль — разобрал его по частям

Отправная точка — два коротких ролика .dark.reverie: луна с лицом над замком, гора, которая открывает глаз, светящаяся дорога к замку под спиралью звёзд.

Стиль разобран в двух документах: гайд Neon Dark Fantasy (10 страниц) и исследование визуального языка по двум роликам (26 страниц). Вывод исследования: слова «dark fantasy» мало — под ним уживаются и реалистичный хоррор, и руины, и сказка. Рабочее название точнее — гротескное ретро-CGI-фэнтези.

Ролики — чужие работы, поэтому здесь они описаны словами. Все изображения ниже созданы в проекте или сняты в игре с модом.

Ранняя CGI-материальность

Вещи выглядят собранными из вещества: жирный рельеф, горячие блики, грязь в щелях.

Цветная магия

Цвет — признак действующей магии: порталы, котлы, светящиеся тропы, фиолетовое небо.

Живое окружение

У мира есть лица и взгляд: светила, вывески, входы. Но не у каждого камня — иначе это орнамент.

Постановка

Опора взгляда впереди, главное действие в середине, огромное чудо вдали.

02 · Палитра из гайда

Цвет по ролям

Три слоя: тёмная база, насыщенные материалы и узкий набор светящихся цветов, которые появляются только на источниках света и магии.

Нажми на цвет — HEX скопируется.

База и ночь

Материалы

Свечение — только для источников

≈ 60% тёмная база30% материалы10% свечение

Правило выведено на тестах: если светящегося больше 10%, кадр превращается в кашу и ничего не читается.

03 · Лаборатория текстур

Ни одного пикселя руками

Каждая текстура — Python-генератор: фрактальный шум, диаграммы Вороного и фальшивое бамп-освещение с горячим бликом дают тот самый «пластиковый» CGI-вид. Все поверхности бесшовные. У светящихся есть отдельная маска свечения — наведи на плитку со значком ◐, чтобы увидеть, что именно светится в игре.

# швы между камнями светятся изнутри f1, f2, cid = voronoi(cells=49) edge = f2 - f1 seam = clip(1 - edge*22) ** 1.5 emis = glow(seam, radius=5) * CYAN
Текстура Cobble Arcaneмаска свечения
Cobble ArcaneКамень в циановой магии
Текстура Cobble Emberмаска свечения
Cobble EmberЛава в швах
Текстура Slime Acidмаска свечения
Slime AcidЯдовитая слизь, пузыри
Текстура Mushroom Capмаска свечения
Mushroom CapСветящиеся пятна
Текстура Planks Violet
Planks VioletСливовые доски, мох
Текстура Glowflowerмаска свечения
GlowflowerТрава с синими искрами
Текстура Violet Storm
Violet StormНебо с молниями
Текстура Star Spiral
Star SpiralЗвёздный вихрь

Первая пачка. Реакция после первого просмотра была простой: «это прям оно».

03 · Таверна и мир

Вторая пачка и «грязный» проход

Первая версия второй пачки получилась слишком чистой и «новенькой». Отдельный проход добавил всем материалам грязь: копоть забивается в углубления, пятна и потёки воды, потёртости на выступах, мелкое зерно и лёгкая десатурация.

Mossy Stone
Mossy StoneБугристая моховая кладка
Teal Beam
Teal BeamЛакированные балки
Candle Wax
Candle WaxОплывший воск
Hammered Copper
Hammered CopperМедь с патиной
Potion Glass
Potion GlassСтекло зелий
Teal Tiles
Teal TilesГлазурованная черепица
Gnarly Bark
Gnarly BarkКривая фиолетовая кора
Violet Water
Violet WaterЗеркальная вода
Mossy Stone, чистая версияMossy Stone после грязи
Mossy Stone
Hammered Copper, чистая версияHammered Copper после грязи
Hammered Copper
Gnarly Bark, чистая версияGnarly Bark после грязи
Gnarly Bark

04 · Инженерия

Вскрыть игру, не трогая её файлы

Чтобы рисовать прицельно, нужно знать, из чего собрана игра. Для этого написан плагин-дампер: он ничего не меняет и только читает, какие материалы, текстуры и источники света загружены в каждой сцене.

BepInEx 5

загрузчик модов для Unity-игр на Mono

→

Дампер

CSV материалов, текстур и света по сценам

→

Анализ

шейдеры, слоты, атласы, раскладки

Первая версия дампера подвешивала игру: она сохраняла 3 000 картинок в одном кадре. Версия 1.1 раскладывает сохранение по кадрам, не больше 6 мс за кадр.

Что показал дамп

Unity2022.3.62 · URP
СценыMMH (меню) · Playtest (весь мир)
Материалов в мире715 из 1 817 загруженных
Текстур3 275
Источников света~140, почти все белые
Тумансерый, ExponentialSquared

Шейдеры мира

Polyart Dreamscape · Tiling POM — 187
URP / Lit — 174
Polyart · Surface — 94
Polyart · Trim POM — 83

04 · Перекраска на лету

Атласы нельзя заменить, их можно перекрасить

Столы, бочки, свечи нарисованы атласами: все детали предмета на одной картинке. Бесшовная текстура превратила бы их в кашу. Поэтому мод читает каждую текстуру с видеокарты, по имени определяет, что это (дерево, камень, металл, листва), и переводит её в палитру стиля через градиентную карту. Раскладка атласа сохраняется; около 250 текстур перекрашиваются за первые секунды после загрузки сейва, работа разложена по кадрам.

R("Bark|Trunk|Logs", PlumWood, Glow.None), R("Plaster|Wall", MossStone, Glow.Seams), R("Cave|Stone|Floor", BlueSlate, Glow.None), R("Lantern|Torch", Copper, Glow.Bright),
12 реальных текстур игры: оригинал и результат перекраски

Оригинал игры → результат перекраски, 12 реальных текстур · нажми, чтобы открыть крупно

04 · Подмена

Было → стало

Двигай ползунок. Слева родные текстуры игры, справа текстуры мода, подключённые по точным игровым именам. Найти эти имена получилось только благодаря дампу: первая попытка подмены промахнулась мимо половины поверхностей.

Каменная кладка в игреКаменная кладка в модеиграмод

Каменная кладка · в 0.7 рельефный сланец

Деревянный пол в игреДеревянный пол в модеиграмод

Деревянный пол · сливовые доски

Штукатурка в игреШтукатурка в модеиграмод

Штукатурка · мох и зелёные швы

Луг в игреЛуг в модеиграмод

Луг · тёмная кислотная слизь

Земля в игреЗемля в модеиграмод

Земля · тропа из углей

Кора в игреКора в модеиграмод

Кора · корявая фиолетовая

Текстуры игры — собственность Scienart Games, показаны маленькими превью только для сравнения.

05 · Небо

Небо — главный герой

Солнце и луну нарисовал Трифон. Мод почистил края, добавил ореол и маску свечения. Встроенные диски игры отключены: лица висят в небе всегда и не тонут в тумане у горизонта.

Солнце с лицом
СолнцеОгненные лучи-языки и лава в трещинах
Луна с лицом
ЛунаЗвёздная ночь и кратеры, драгоценные зубы, огненный и ледяной глаз

05 · Версия 0.6

Мир, который мод строит сам

Куст светящихся цветов

Поля цветов

Родная трава приглушена до 15%. По карте слоёв террейна мод расставляет светящиеся кусты чанками по 16 м вокруг игрока.

Уголь

Угли на тропах

У террейна нет слота свечения, поэтому угли лежат поверх земли отдельной сеткой с аддитивным блендингом.

Молния

Молнии

Каждые 7–20 секунд ночью: вспышка по рисунку из 8 кадров и короткая подсветка всего мира.

Звёздный вихрь

Звёздный вихрь

Медленно вращается над миром, ночью ярче. Облака заменены на грозовые.

float wf = /* вес травы */, we = /* вес песка/грязи */; if (we > 0.5f) AddFlat (embers, x, y + 0.04f, z, size); // уголь на тропе else if (wf > 0.45f) AddCross(flowers, x, y, z, size); // крест из двух плоскостей
Тропа из углеймаска свечения
Тропа из углейЯркость пришлось поднимать дважды: на первом проходе угли терялись
Ковёр синих цветовмаска свечения
Ковёр синих цветовСамое сильное сияние даёт bloom в игре, поэтому в картинке его нет

06 · Итерации

Семь версий за неделю

Каждая версия — гипотеза, скриншоты из игры и разбор. Ошибки не скрыты: из них сложились правила стиля. Скриншоты открываются крупно по нажатию.

0.1 — первый запуск: красный монохром

Сработало

Текстуры, туман, свет и bloom заработали из одного плагина.

Не сработало

Сливовое дерево, янтарный свет и повышенная насыщенность сложились в одну красную кашу, а улица утонула в сиреневой дымке.

Вывод

Оттенок света нельзя накладывать поверх цветных материалов вслепую.

Версия 0.1, интерьерВерсия 0.1, улица

Главный поворот. До версии 0.6 атмосферу пытались собрать из свечения и цветной заливки. Итог работы: атмосфера строится на фактуре и направленном свете и должна читаться даже в пустом кадре. Свечение и ожившие предметы — только приправа.

07 · Свет

Что светится, а что нет

Светится

  • фонари, свечи, люстры, факелы, окна
  • угли, лава, огонь
  • руны, кристаллы, зелья, порталы
  • цветы и грибы
  • глаза, лица луны и солнца, молнии

Только освещено

  • дерево: балки, мебель, бочки
  • камень, кладка, черепица, кора
  • ткань, кожа, металл, посуда
  • трава и листва
  • персонажи и животные — лёгкая самоподсветка, чтобы не уходить в черноту

Что делает мод

  • перекрашивает туман и эмбиент с учётом времени суток
  • свечи светят ярче в 3,5 раза и дальше
  • до 60 тёплых ламп у люстр и подсвечников
  • bloom, контраст, сплит-тонинг: тени синие, света тёплые
  • F10 — сравнение «до / после»

Значения стиля из гайда

ПараметрЗначениеКомментарий
Эмбиент ночью0.42, 0.40, 0.56Светлая лавандовая ночь
Эмбиент днём0.74, 0.70, 0.84Прохладный сиреневый день
Цвет тумана0.20, 0.07, 0.32Royal Violet, плотность ниже обычной
Лунный свет0.82, 0.76, 1.0 × 2.2Почти белый с лавандой
Свечи1.0, 0.68, 0.38 × 3.5Тёплый янтарь, увеличенный радиус
Bloom0.9 · порог 1.0Только яркие источники
Контраст / насыщенность+22 / +12Сочно, но не кислотно
Сплит-тонингтени 0.55, 0.50, 1Холодные тени, тёплые света

Исследование отдельно оговаривает: это сохранённые настройки конкретного подхода, а не универсальные эталонные значения для любой сцены.

08 · Версия 0.7

Один свет — разный рисунок бликов

Раньше свет и блики были нарисованы прямо в картинке, поэтому настоящий свет игры ложился на камень и дерево одинаково плоско. В 0.7 у каждого материала три карты: цвет без запечённого света, рельеф и глянец. Камень — крупная неровная кладка, глубокие швы, короткие блики на выступах. Дерево — длинное текучее волокно и потёртый лак.

Камень: цветКамень: рельефКамень: глянец

Камень

Дерево: цветДерево: рельефДерево: глянец

Дерево

Тест пустого угла

Четыре варианта с одной камеры: угол таверны, где видно стену, балку и пол. Мод запоминает исходное состояние материалов и переключает его на лету, без перезапуска; режим подписывается в углу экрана, чтобы скриншоты не перепутались.

ВариантТекстуры · F6Свет · F7
A0.60.6
B0.7 рельеф0.6
C0.60.7 направленный
D0.7 рельеф0.7 направленный

Что исследование советует проверять первым

  • отношения в кадре: главный объект, тихий фон, направление взгляда
  • материальность: у камня, дерева и ткани разный масштаб детали и блик
  • одна смысловая странность вместо глаз на каждом камне
  • связь источника с миром: цвет котла повторяется на ближайшей поверхности
  • движение и эффекты — только после того, как кадр читается сам

09 · Правила, выведенные на тестах

Делай / не делай

Делай

  • Строй атмосферу фактурой и направленным светом: пустой кадр тоже должен работать
  • Свети только источниками, магией и важными тропами
  • Делай ночь синей и читаемой, а не чёрной
  • Держи пару «холодный мир + тёплые огни»
  • Освещай помещения множеством мелких тёплых источников
  • Давай камню, дереву и металлу разный рельеф и глянец
  • Внутри — тёплый янтарь, снаружи — зелёное сияние стен
  • Оставляй небу лица, грозы и вихри

Не делай

  • Неоновые обводки на досках и мебели
  • Свечение всего подряд: глаз теряет главное
  • Монохромную заливку, которая съедает цвета материалов
  • Чёрные силуэты травы, людей и животных
  • Свет и блики, нарисованные прямо в текстуре
  • Сплошной красный интерьер
  • Пустое плоское небо
  • Bloom с низким порогом, заливающий пол-экрана

09 · Дальше

Что впереди

PDF · кейс

Полный кейс одним файлом

24 страницы: концепция, палитра, текстуры, инженерия, все версии со скриншотами и правила. Облегчённая версия для экрана, 2,7 МБ.

↓ Скачать PDF