Для «Проклятых земель» уже более 15 лет создают модификации, делают ретекстуры предметов и объектов карт, но до сих пор не выпущено ни одного набора текстур ландшафта с большим разрешением.
Для исправления ситуации в 2019 году было проведено исследование текстур ландшафта в игре и выявлен метод, с помощью которого создавались текстуры, а также предпринята попытка восстановить исходные материалы для упрощения перерисовки.
Как результат, представляем данный набор инструментов. С его помощью можно проводить ретекстурирование оригинальных карт, а также использовать его для создания атласов и к новым картам, что должно отдельно заинтересовать мододелов.
В «Проклятых землях» используется тайловое текстурирование: это значит, что карта разбивается на квадраты (2х2 метра), на каждый из которых «натягивают» квадратное изображение (тайл). Тайлы хранят в атласах - это большая текстура, где тайлы размещены таблицей 8х8.
Всего на уровень может быть выделено 8 атласов, по 64 тайла в каждом - то есть, всего 512 уникальных тайлов.
Так как делать уникальный тайл на каждую квадратную область уровня слишком затратно по памяти, в игре применяется объединение похожих тайлов. Каждый из них при вставке на уровень может быть повёрнут на угол, кратный 90 градусам. Из-за этого необходимо специальным образом подготавливать исходный материал для тайла, иначе швы между соседними будут сильно заметны.
Разрешение тайла в атласе в оригинальной игре 64х64 пикселя, однако 8 пикселей с каждой стороны отведено под рамку - это сделано для того, чтобы при выборке пикселей на видеокарте не происходил выход за цвета тайла.
То есть, реальным разрешением тайла является 48х48 пикселей, а в игровом мире он изображён как квадрат 2х2 метра, то есть, один пиксель на 4.2 сантиметра.
Максимальное разрешение тайла - 192 пикселя, то есть, один пиксель на чуть больше, чем один сантиметр. Это уже достаточно высокое качество картинки для вида от третьего лица.
Тайл получают смешиванием нескольких слоёв так называемых базовых материалов (базовых тайлов), которые накладываются друг на друга с учётом масок смешивания (или просто масок). Подробнее про маски и базовые тайлы смотрите «Создание масок» и «Создание базовых тайлов».
Как мы выяснили ранее, уровень текстурируется тайлами, которые создаются смешиванием из масок и базовых материалов, после чего добавляются рамки и полученные результаты склеиваются в атлас (один или несколько).
После этого атласы конвертируются в MMP файлы, собираются в RES архив и подключаются как мод в игру.
При использовании данного набора инструментов, весь процесс будет выглядеть так:
- Рисуются маски смешивания (см. файл «Создание масок»);
- Рисуются базовые тайлы (см. файл «Создание базовых тайлов»);
- Подготавливается описание атласов;
- Подготавливается описание мода;
- Вызывается сборка мода.
В результате, получаем к распространению мод в виде .zip архива.
Состав инструментов:
docs - справка и руководства
prepared - пример масок и базовых тайлов (см. ниже)
gen_tileset.bat - сборщик атласов
gen_mod.bat - сборщик мода
config.yaml - настройки сборщиков атласов/модов
check_masks.bat - генерация тестовой текстуры из масок
check_tile.bat - генерация тестовой текстуры из базового тайла
check_map.bat - генерация сборной текстуры уровня для проверки
tiles - базовые тайлы
masks - маски
maps - описания атласов
tools - инструменты
output - результаты сборки текстур/модов
В папке prepared
присутствуют 6 архивов с именами masks_x48.zip
, masks_x96.zip
, masks_x192.zip
, tiles_x48.zip
, tiles_x96.zip
, tiles_x192.zip
. В этих архивах содержатся маски и тайлы с заданным разрешением. Тайлы размером 48x48 взяты из игры, остальные - получены с помощью алгоритмов увеличения изображений.
После того, как вы определитесь с используемым разрешением тайлов, распакуйте содержимое архивов с нужным размером тайлов/масок в корневую папку (т.е. появится содержимое в папках tiles
и masks
).
В файле config.yaml
задаются настройки, общие для gen_mod
и gen_tileset
. Стандартное содержание:
# Разрешение тайлов и масок (48, 96 или 192 пикселя)
tile_resolution: 192
# Где расположены базовые материалы (тайлы)
tiles_directory: "tiles"
# Где расположены маски
masks_directory: "masks"
# Где расположены описания карт (для сборки модов)
maps_directory: "maps"
# Куда выводить результаты
output_directory: "output"
# Где расположены инструменты
tools_directory: "tools"
Изучите файл «Создание масок». Если вы делаете текстуры для оригинальной игры, то вам необходимо подготовить четыре комплекта по три маски в каждом (см. файлы в директории masks
).
Не забывайте проверять корректность стыковки масок внутри одного комплекта (одного стиля)!
Рекомендуется при перерисовке масок заменять оригинальные в директории masks
с сохранением имён.
Файл с маской должен иметь 3 канала (красный, синий, зелёный), желательно сохранение в формате со сжатием без потерь (png, bmp, tiff).
Изучите файл «Создание базовых тайлов». Если вы делаете текстуры для оригинальной игры, вам понадобится перерисовать все тайлы в директории tiles
. Можно это делать постепенно - заменить несколько, проверить, как это выглядит в игре, повторить процесс.
Не забывайте проверять корректность стыковки базового тайла с самим собой!
Рекомендуется при перерисовке базовых тайлов заменять оригинальные в директории tiles
с сохранением имён.
Файл с базовым материалом должен иметь 3 канала (красный, синий, зелёный), желательно сохранение в формате со сжатием без потерь (png, bmp, tiff).
Как говорилось ранее, на одну карту может приходиться несколько атласов.
Атлас состоит из тайлов, при этом в атласе их 8 рядов по 8 столбцов, всего 64.
Описание атласов = описание тайлов карты. Файл с описанием обычно называется по имени карты + разрешение .yaml
и хранится в директории maps
.
В состав инструментов входят готовые атласы, основанные на результатах конкурса пользовательского разбора 2019 года. Они могут содержать ошибки, но вполне подходят в качестве базы для старта.
Внутри файла соблюдается следующая структура (на примере карты из меню игры):
map_name: "ZoneMainMenuNew"
tiles:
- # комментарий, изначально содержит размещение тайла
- base: "grass/common/c"
rotation: 0
- # Tile 1 (atlas 0, row 0, column 1)
- base: "grass/common/a"
rotation: 0
# пропустим 188 тайлов для краткости
- # Tile 190 (atlas 2, row 7, column 6)
- base: "grass/irregular/a"
rotation: 0
- mask: "1/diagonal"
rotation: 90
inverted: true
- base: "grass/common/b"
rotation: 90
- # Tile 191 (atlas 2, row 7, column 7)
- base: "grass/dark/a"
rotation: 90
- mask: "1/diagonal"
rotation: 90
inverted: true
- base: "grass/common/c"
rotation: 0
- mask: "1/diagonal"
rotation: 270
inverted: true
- base: "grass/common/a"
rotation: 180
То есть, указывается имя уровня (например, Zone1
или bz3g
) - ровно так, как уровень называется в игре.
Далее в секции tiles
идёт описание тайлов, составляющих атласы, подряд. Количество тайлов должно быть кратно 64, но не более 512.
Описание тайла может состоять из:
- Строки "
base: ""
" - такой тайл считается пустым, будет закрашен чёрным цветом. - Одного или нескольких слоёв базовых материалов, перемежающихся масками.
Рассмотрим второй случай подробнее. Для этого возьмём конкретный тайл:
- # Tile 190 (atlas 2, row 7, column 6)
- base: "grass/irregular/a"
rotation: 0
- mask: "1/diagonal"
rotation: 90
inverted: true
- base: "grass/common/b"
rotation: 90
В качестве нижнего слоя берётся базовый материал grass/irregular/a
. Это значит, что при сборке мы будем искать файл tiles/grass/irregular/a
с разными разрешениями, например, tiles/grass/irregular/a.png
.
При этом он не будет повёрнут, так как rotation: 0
.
Вторым слоем идёт grass/common/b
, который будет повёрнут на угол 90 градусов по часовой стрелке.
Второй слой будет наложен на первый с использованием маски 1/diagonal
(например, masks/1/diagonal.bmp
), которая:
- Будет повёрнута на 90 градусов по часовой стрелке
- Будет инвертирована
Если маска не инвертирована, то чёрная часть означает «взять пиксели из нижнего слоя», белая - «взять пиксели из верхнего», серый - «смешать нижний и верхний в пропорции».
Инверсия маски означает, что чёрный будет задавать верхний слой, а белый - нижний.
Максимум может быть 4 слоя базовых материалов, с тремя масками между ними.
Для проверки корректности описания атласов уровня, можно собрать атласы в текстуры.
Для этого просто перетащите .yaml файл на gen_tileset.bat
- это выдаст необходимое количество текстур с атласами в формате png.
Также можно сгенерировать полную карту уровня с помощью check_map.bat
. Для этого запустите его в консоли в следующем виде:
check_map.bat bz2g output
- первым аргументом указывается имя карты, вторым - директория с уже сгенерированными атласами. Результат будет в директории src
.
Под модом понимается модификация одной или нескольких карт, которая предназначена для установки и запуска через стартер с аддоном.
Описание мода имеет следующий вид:
mod_name: "HD pack"
author: "yourname"
version: "1.0.0"
author_email: "[email protected]"
author_url: "yoursite.com"
maps:
- "BaseGipat"
- "Zone1"
- "ZoneMainMenuNew"
Параметр mod_name
задаёт отображаемое в стартере имя мода и имя выходного .zip файла.
author
- ваше имя или ник.
version
- какая версия мода (полезно для сбора отзывов).
author_email
- ваш адрес электронной почты.
author_url
- ваш сайт.
Далее в секции maps
указываются имена .yaml файлов с описаниями атласов, которые войдут в мод.
В данном случае, в мод будут включены Посёлок (BaseGipat
), Руины (Zone1
), главное меню (ZoneMainMenuNew
).
Сборка мода выполняется перетаскиванием .yaml файла с описанием мода на gen_mod.bat
- это выдаст готовый к распространению мод в виде zip файла.
Собранный мод представляет собой zip файл, в который входит:
mod_name/config.reg
- информация о модеmod_name/textures.res
- сконвертированные и упакованные атласы
Для добавления в игру, содержимое zip файла нужно распаковать в директорию Mods
стартера, т.е. файлы config.reg
и textures.res
будут расположены примерно так: C:/Program Files (x86)/Проклятые Земли (Дополнение)/Mods/mod_name/config.reg
.
После этого в стартере в выпадающем списке выбираете мод по имени и запускаете игру.
При конвертации атласов в данном инструменте, MIP-уровни не генерируются! Из-за этого ландшафт в игре может слегка «рябить» вдалеке. Сделано с целью экономии памяти, так как игра может не запускаться с модами большого объёма.
При замене атласов всех игровых карт с разрешением тайлов 192х192, размер мода составит 518 мегабайт, для 96х96 - 130 мегабайт.
В качестве базовых материалов я выбирал изначально присутствующие в оригинальных атласах тайлы, которые обычно идут в самом начале - похоже, что при сборке атласов самые используемые ставились в начало.
Маски выделялись методом «пристального вглядывания»: сперва находился тайл, состоящий из двух смешанных базовых, потом находились эти два базовых тайла, после чего решалось обратное к смешиванию уравнение.
Если смешанный = вес * нижний + (1 - вес) * верхний
, (более понятно: r = w * b + (1 - w) * u
), то зная конкретное значение смешанный
, нижний
и верхний
, получим, что:
вес = (смешанный - верхний) / (нижний - верхний)
. (более понятно: w = (r - u) / (b - u)
)
Несколько раз решив подобное уравнение (с разными входными данными), усреднил и подчистил результаты.
Рамка у тайлов используется для корректировки округления при выборке пикселей и применения фильтрации текстур. Если её не делать, то у тайлов в игре будут явно видимые швы.
На каждой из карт есть свой достаточно небольшой набор базовых тайлов, образующий несколько слоёв. При этом от порядка слоёв зависит наложение по маскам - этот момент можно использовать для написания своего редактора карт.
Фактически, весь процесс раскраски карты - это создание поля из квадратов с несколькими слоями разного цвета и указание границ цветных областей. По этим границам и располагаются маски.
Изначально программы представляют из себя скрипты на Python 3, которые отлично работают в Linux. То есть, «запуск из исходников» - это то, как стоит использовать данный инструмент. Есть несколько добавленных строк для удобства использования в Windows, которые необходимо удалить.
Если вам нужны исходники, что-то непонятно или есть желание использовать наработки - пишите мне, я буду очень рад, что хоть кто-то интересуется дальнейшим развитием ПЗ.
В теории, данный набор инструментов уже позволяет разработать тайлы для карт, созданных с нуля, а не переработанных из существующих. Поскольку используется файловый интерфейс через yaml файлы, возможен и вызов инструментов из ваших проектов (например, редактор карт с «раскраской» тайлов, который выдаст информацию в yaml, а атласы будут сгенерированы моим инструментом).
Вы можете использовать программу и мои наработки по ПЗ в своих проектах со следующими ограничениями:
- Запрещено использование в коммерческих продуктах и с прямой целью получения материальной прибыли (платные моды, инструменты с подпиской и т.д.).
- Запрещено распространение без указания оригинального авторства и данных ограничений.
Автор также крайне негативно относится к попыткам и без того малочисленных моддеров ПЗ ограничить остальных путём шифрования модов и их частей, скрытия информации и наработок. Увы, ничего с этим сделать он не может и не будет.
Разработал aspadm.
Отдельная благодарность Demoth и MorgenS за поддержку (информационную и моральную) и что не дали забросить проект.
Спасибо John Cupitt, а также остальным авторам библиотеки vips.
Спасибо тем, кто активно участвовал в разборе тайлов в конце 2019 года, а именно:
- Oleksii Zhelo
- Михаил Петросянов
- Сергей Кириллов
- MorgenS
Спасибо пассивному коммьюнити за то, что дали возможность сделать что-то новое, что не потеряется среди множества крутых проектов.