Дизайн уровней и генератор случайного контента

Креативный директор компании Kitfox Games Таня Шорт рассказала порталу Gamasutra о проблемах автоматической генерации контента на примере своей игры Shattered Planet, которая появится в марте этого года на планшетах.

Мне этот материал показался интересным и я решила его перевести для читателей нашего блога.

Введение

По профессии я левелдизайнер. Я занималась и системным планированием, и геймдизайном, и сценарным планированием, но сердце мое принадлежит контент-дизайну. Больше всего удовольствия я получала от создания самодельных впечатлений. Поэтому я немного занервничала, когда в Kitfox решили, что мы, как маленькая команда, выживающая на переполненном рынке, вложим все силы в автоматизацию контента.

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

Для начала я расскажу немного о структуре наших данных, продемонстрирую, как мы использовали Unity для создания дизайнерских «инструментов», и покажу как из простой идеи выросла сложная структура. Помните, что я дизайнер — в нашей игре я не написала ни единой строчки кода.
pocgen3

Моя работа в качестве дизайнера заключается в том, чтобы определить, чего мы хотим от игрока, и вместе с программистами перевести все это в рабочие правила для движка игры. Параллельно мы с художником создавали эстетически приятные декорации из модульных составляющих на основе этих правил. Так что с моей точки зрения тут описан довольно поверхностный взгляд на логику системы, в отличии от кода, который управляет генератором уровней, или спрайтов, которые он использует, чтобы отрендерить графику.

Так что без лишних слов… начнем с самого начала.

Цель

Мы начали работу в июне 2013 года. После двух недель работы мы закончили маленький прототип, который обернулся пошаговой RPG с алгоритмически создаваемыми уровнями. Мы уже знали, что будем использовать движок Unity.

Вскоре были определены три кита, на которых будут стоять все наши дизайнерские решения (с некоторой поправкой на арт):

  • Интрига: пробуждает любопытство, награждает за эксперименты и исследования;
  • Стратегия: награждает за тактическое мышление, подразумевает несколько разных путей достижения превосходства в бою;
  • Доступность: мгновенно захватывает, много фидбека, поощрений, дополнительной информации.

Все эти столпы, конечно, имеют собственные недостатки, особенно если их плохо реализовать. Если «интригующий» контент слишком загадочен, то игроки будут его не замечать или просто звереть. Если стратегическая составляющая слишком сильна, то это оттолкнет или испугает игроков, особенно планшетную аудиторию (если мы, конечно, не планируем сманить фанатов Paradox). С другой стороны, если игра доступная, но в ней нет ни интриги, ни стратегии, то она будет лишь пустышкой, которой нечем зацепить хардкорных игроков.

С ориентирами определились. Теперь, чтобы приступить к возведению уровней, нам понадобятся строительные блоки.

Структура комнат

Мы хотели почерпнуть информацию об алгоритмах генерации уровней из всего того обилия информации, что можно найти в Интернете. В большинстве своем это были алгоритмы для “подземелий”, строящихся из прямоугольных “комнат” и “коридоров”. Увы, для создания впечатления “расколотой планеты” нам нужно было что-то более естественное. Мы прочитали и освоили столько, сколько смогли, и в итоге пришли к умозаключению, что использовать существующие алгоритмы наша команда не сможет. (Хотя буквально через пару месяцев был написан этот генератор пещер).

Итак, мы задали для каждой комнаты минимальные и максимальные значения длины и ширины, используя квадратные плитки. Например, минимальный размер комнаты может быть 2х2, а максимальный 4х4. В итоге это дает разнообразие вариантов. Вот как в действительности выглядел инструмент для определения размера комнат (для каждого уровня были заданы 4-5 комнат):

roomdata(без контекста не очень ясно, так что поясняю: Min и Max “Num Rooms” в действительности лишь показывают, как много комнат этого типа появится на уровне)

Я, как дизайнер уровней,  хотела, чтобы разные по размеру комнаты вызывали у игрока различные эмоции.  Маленькие (2х2) комнаты более клаустрофобичны, зато дают больше тактических возможностей, чтобы победить ИИ, блокируя и запирая врагов в коридоре. Напротив, большие комнаты чувствуются более обширными и свободными, но с другой стороны, на них игрок может быть окружен со всех сторон. Ваш алгоритм становится более непредсказуемым, когда разные уровни становятся различны по эмоциональному восприятию. Нам было очень важно сохранять алгоритм непредсказуемым, давая уникальное ощущение для каждого уровня.

Картинка выше – часть базового набора, а вот такие варианты можно получить, если добавить еще несколько правил – например, “дырки” для отображения пропастей и озер:

level-generation-design

Как видите, в каждом варианте есть возможность появления пропастей. Это всецело решается движком — как дизайнер я лишь отмечаю, должны в этой комнате быть дырки или нет. В зависимости от окружения (пустыня, лаборатория, и т.д), дырка превращается в воду, лазеры, кислотное болото и т.д. Также я решаю, какие материалы будут использованы в комнате (грязь и трава, камень и трава или все вместе) и какие препятствия (камни, грибы, все вместе). Скриншот еще одного инструмента: themedata (GenDirt = грязь, Des Sandstone = песчаник, StoneDirt – пополам и того и другого, этот тип образует границу между основными и второстепенными типами материалов).

В каждой комнате также есть от 2 до 4 видов “плитки”, работающих в качестве тайлов перехода. Как только они соединяются с другими комнатами, игра использует алгоритм поиска пути, решая где «безопасно» ставить препятствия — так, чтобы они не мешали игроку исследовать комнату или находить сокровища. obstaclesВот так, используя эти наброски и мой опыт в традиционном левелдизайне, мы создали исходный алгоритм построения уровней.

Критический Путь

Если вы дизайнер уровней, то вы знаете что «критический путь» – это отрезок, мимо которого игрок никак не пройдет, если он хочет завершить уровень (без учета ответвлений и сайд-квестов). Обычно, чтобы заставить игрока продолжать идти в «правильном» направлении, дизайнеры расставляют награды (бонусы, враги). Такой путь может показаться не совсем интуитивным, но учитывая, что бои — занятие веселое и вообще центральная особенность игры (если речь не про стелс), то скорее всего игроки будут искать себе приключений на острый конец клинка. Именно этот фактор заставляет их идти дальше.

Поэтому в Shattered Planet одно из первых правил алгоритмического дизайна уровней – создание «критического пути», который содержал бы стартовую комнату, конечную комнату с телепортом и все комнаты между ними. Вот сделанный вручную прототип, которым я объясняла мою идею программистам в далеком июне 2013-го. criticalpath С этими комнатами мы работали иначе, нежели с побочными. Если на главной дороге разбросаны в больших количествах монетки, которые ведут игрока вперед, то у побочных комнат есть «сокровища» — редкие, но гораздо более ценные награды. Как следствие, если на критическом пути монстры обладают средней силой, то в побочных комнатах есть шанс нарваться на очень сильных противников. Это создает ощущение должного риска за награду. В общем, избегая сильных монстров, вы придете к конечному телепорту, но при этом не найдете сокровищ.

Вот как выглядела карта в редакторе (середина июля 2013). На первой картинке вы можете заметить более привлекательные декорации, такие как рассыпающиеся плитки и полуплиточные переходы. Следующие две картинки взяты из ранних набросков, поэтому они менее детализированы. pocgentriptych

Закрытые Двери

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

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

Альтернативные Пути

И все равно, как только мы закончили делать критический путь и побочные комнаты с закрыми дверьми, мы осознали, что уровни у нас получаются скучные. Возникало слишком много тупиков, что приводило к постоянному возвращению на исходные позицию, что особенно раздражало тех, кто хотел отыскать все сокровища… совсем не то, что мы хотели. В действительности, у комнаты могло максимум быть 2 выхода— не так уж и много вариантов!

Чтобы добавить разнообразия, мы прикрутили связи между комнатами, превращая тупики в сквозные проходы. Помните, в параграфе «Структура Комнат» я сказала, что мы помечаем несколько «дверей» для каждой комнаты? Так вот, их-то мы и используем! Мы (то есть, алгоритмы движка) находим пару дверей поблизости и рисуем линию между ними, поворачивая там, где требуется. junction Это решило проблему тупиков и сделало исследование намного более интересным.

Исключения

У любого правила всегда есть исключения. Даже в геймдизайне. Особенно в геймдизайне. Хотя большая часть нашей игры генерируется автоматически, нам пришлось вручную нарисовать несколько уровней – вроде космического корабля, служащего базой для игрока, секретных уровней и боев с боссами. Мы старались использовать одни и те же данные настолько часто, насколько это возможно. Так, например, для плиток я использовала те же самые кубы как и в примерах выше — взгляните, на этом скриншоте я просто взяла обычную плитку и заменила текстуры из примеров выше. tilehub

 

Усвоенные уроки и планы на будущее

Впереди еще много работы. Дизайн уровней для Shattered Planet почти закончен, но мы хотим (как вы могли заметить на иллюстрациях выше) добавить альтернативные телепорты, которые позволят перейти к специальным/секретным уровням, а также дать игроку возможность прокладывать собственный путь через разного рода пропасти.

С помощью всех этих экспериментов за последние несколько месяцев мы выяснили следующее:

  • Применяйте традиционные принципы геймдизайна (с некоторыми изменениями) – это до сих пор работает!
  • Алгоритмическая генерация отнимает уйму времени на тестирование! Простое воспроизведение ошибки отнимает часы запусков и перезапусков, дабы изолировать нужную часть алгоритма.
  • Не старайтесь избегать возможных нововведений, даже после того как вы «закончили» разработку алгоритмов. Как и в любой другой области планирования, вы вряд ли когда-нибудь “закончите”.

Спасибо за чтение!

Автор: Tanya X. Short, перевод: Карина, редактор: Тайный Редактор

10 комментариев

  1. OMFGNuts

    Охуенно, пробежал глазами пока, сохранил в Покет себе, почитаю

  2. Жук

    Вот подобных статей/переводов больше жду.

    • meow

      подобных = о геймдизайне?

      • DarkCyMPAK

        Подобных это обо всем околоигровом. =3

      • meow

        геймдизайн это совсем игровое игровое, кажется

      • bucher48

        Статьи про проблемы в создании игр и их решения всегда очень интересны (для меня)

      • Жук

        Именно о геймдизайне. Все правильно ты (Вы), я хз как принято у вас (Вас?) тут) поняла.

  3. Andrey Viktorov

    Большое спасибо за статью. Такое читать всегда полезно. :)

    • meow

      отлично, значит таким материалам быть!

  4. FYPIIN

    Спасибо за перевод. Побольше бы таких.
    Хотя статья по ссылке, о генерации пещер, интереснее и полезнее)