Генерация боевой карты в Stone of Adventure

Всем привет! Подписывайтесь на наш блог, чтобы следить за новостями и оставляйте свои реакции. Сегодня разговор пойдет о генерации боевой карты!

Одной из ключевых особенностей игр в жанре rogue-like является непредсказуемость. Добиться этого можно разными способами, но одним из самых популярных является случайная генерация уровней. В этой статье я расскажу, как реализована генерация боевой карты в нашей игре.

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

На данном этапе генерация карты включает три основных этапа:

  • Генерация ландшафта
  • Генерация интерактивных объектов
  • Генерация статичных (декоративных) объектов

В этой статье мы рассмотрим только первый этап.

Генерация ландшафта

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

Генерация начинается с задания размера карты: её длины и ширины. Далее происходит поуровневая генерация, начиная с самого нижнего уровня и заканчивая верхним. Каждый уровень можно настраивать индивидуально, что позволяет создавать уникальные карты для каждого сражения.

В настройках уровня высоты задается процент площади, которую он будет занимать относительно предыдущего уровня, и список декоративных объектов, которые будут на нем сгенерированы. У нас много планов по расширению генератора карты, и со временем появятся новые параметры.

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

Пример конфигурации карты
Пример конфигурации карты

Для определения того, будет ли в определенной координате сгенерирован тайл, мы используем алгоритм Окрестности Мура. Окрестность Мура — это как если бы ты смотрел на тайл и проверял все соседние клетки по сторонам, чтобы решить, стоит ли там появляться новому тайлу. Этот алгоритм помогает распределить тайлы на каждом уровне, создавая логичные и разнообразные ландшафты, которые делают игру более интересной и вариативной.

Обязательно напишите, в каких играх генерация уровней показалась вам интересной!

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

Не понял зачем генерировать нулевой слой

2

0 слой не всегда заполняется целиком. В игре будет механика позволяющая столкнуть врагов в пропасть. Просто конкретно в этом конфиге было задано заполнение на 100%

1