Контроль над хаосом процедурной генерации — как создавались локации в Children of Morta
Описание главных принципов алгоритма.
Ведущий программист в Dead Mage Реза Хушенги в тексте 2018 года для блога Unity рассказал, какие принципы лежат в основе алгоритма генерации локаций для Children of Morta. Разработчик подробно описал, как организован процесс компоновки помещений и разного игрового контента. Мы выбрали из текста главное.
По словам Хушенги, для создания процедурной системы важно определить правила и ограничения того, что возможно в вашей игре. В Children of Morta каждый уровень состоит из нескольких помещений, соединённых между собой. Есть много видов комнат, содержащих разный контент — где-то враги, где-то таинственные игры, а где-то NPC, рассказывающие кусочки истории.
У каждого уровня в Children of Morta есть собственные параметры, заданные разработчиками. В основе каждой локации лежит базовая структура, определяющая, как комнаты связаны между собой.
На каждом уровне есть главный путь, который ведёт от стартовой комнаты к финальному помещению. На схеме главный путь представлен в виде цепочки: 0 — 1 — 2 — 3 — 4. Также есть ответвления, приводящие в тупик: 1 — 6 — 7 и 2 — 5.
Следующий шаг — определить конкретные правила, которые влияют на условия расстановки комнат. В следующем примере условие такое — комната с наградой (5) должна соединяться с основным путём, но при этом она должна находиться во второй половине уровня. А ответвление с тупиком (6 — 7) всегда связано с комнатой 1.
На показанных схемах изображена лишь последовательность комнат, но не их реальное расположение. На самом деле компоновка помещений может быть очень разной. Вот несколько примеров:
Одна из главных особенностей Children of Morta — ориентация на повествование, поэтому нарративный аспект играет большую роль в процессе генерации локаций. Если на уровне должно произойти какое-то сюжетное событие, то обычно на нём появляются дополнительные комнаты.
В комнате R1 находится NPC, который просит игрока принести какой-то объект в обмен на вознаграждение. Этот предмет находится в комнате R2: игрок должен добраться до него, забрать и вернуться к персонажу.
Это простой пример процедурного события, которое ограничено одним уровнем. Но есть и другие типы квестов, предлагающие более сложные цели. Такие события упорядочены случайным образом, поэтому разные игроки могут столкнуться с ними в совершенно разных ситуациях.
Как только комнаты расставлены по местам, наступает этап наполнения контентом. В Children of Morta есть несколько подсистем для генерации и управления разными типами контента. Хушенги поклонник трилогии «Матрица», поэтому он назвал эти подсистемы именами персонажей из фильмов:
- Key Maker: ответственна за все двери и переходы между комнатами;
- Oracle and Persephone: размещают ассеты окружения, повествовательные объекты, кат-сцены и многое другое;
- Tank: генерирует и управляет графами поиска пути;
- Smith: спаунит врагов;
- Merovingian: размещает лут.
У каждой подсистемы есть собственный набор параметров, определяющих точное поведение алгоритма для определённого уровня.
В Children of Morta есть линейный сюжет, поэтому разработчикам было важно научиться правильно балансировать подачу нарративных элементов, чтобы их было не слишком много и не слишком мало.
Команда специально создала в Unity инструмент под названием Train Man, который позволяет согласовать между собой кусочки повествования. Эта система следит за событиями в игре и, отталкиваясь от ситуации, меняет параметры генерации уровня.
Эта система позволила разработчикам свободно сопоставлять сгенерированный уровень с текущим состоянием всех активных событий. У Train Man есть ещё несколько применений:
- настройка динамической сложности;
- добавление ранее недоступного контента;
- аналитика поведения игрока.
В результате игра генерирует множество самых разных уровней.