Перевод ретроспективной статьи о разработке сложной пошаговой видеоигры 8 More Lives. Статья еще готовится к выходу в блоге компании Luden.io, я уже переводил для Хабра некоторые их статьи, так что как обычно — прямая речь сохранена.

Авторы не возражали чтобы перевод вышел раньше оригинала, поэтому мы здесь. Кроме того, можно попроситься пораньше в закрытый плейтест на Steam, скажите в Discord проекта что вы от DMinsky — обещали впустить без очереди. Приятного чтения!


Будет сложно, вам понравится

Привет! Меня зовут Иван, и я делаю игры последние 10 лет. В частности, я работал над while True: learn(), Learning Factory и SuperWEIRD, но пост не про них.

8 More Lives
Карта компании в 8 More Lives

8 More Lives — это хардкорная пошаговая стратегия, в которой вы возглавите отряд котов‑наёмников. Я начал делать её, потому что люблю игры с глубокими, взаимосвязанными системами — особенно пошаговые тактики.

Немного о том, откуда взялся этот проект

8 More Lives не появилась сразу как цельная, полностью сформированная игра. Её особенности выросли из нескольких прототипов, экспериментов и уроков, накопленных за последние десять лет. Вот несколько идей, которые сформировали игру такой, какой вы видите её сегодня.

Пошаговые средневековые сражения

Я уже пытался сделать пошаговую игру о средневековых сражениях. Самый ранний прототип с похожей идеей появился ещё в 2015–2016 годах. Это был своего рода «средневековый XCOM», и некоторые системы из нынешней игры существовали уже тогда. Сражаться нужно было с демонами. Прототип собрался довольно быстро, но дальше itch.io дело так и не пошло.

Ранний прототип пошаговых сражений

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

Примерно тогда же вышла Battle Brothers. Оригинальная версия без дополнений была немного бедна контентом, но с точки зрения механик работала именно так, как нужно. Идея сделать собственную игру отошла на второй план, а я отправился играть в Battle Brothers — ведь я, по сути, получил именно ту игру, которую пытался создать сам.

Тактические сражения в разных биомах
Лагерь Отряда

Процедурная генерация мира, биомы и поворот карты

В 2019 году мне захотелось сделать для Civilization V не очередной генератор «островов из шума», а систему, которая сначала учится на формах настоящего рельефа, а затем превращает результат в пригодную для стратегии карту.

Откуда брались данные

Основой стала SRTM-30 — глобальная карта высот, полученная в рамках Shuttle Radar Topography Mission NASA/JPL с шагом около 30 угловых секунд. Для игры она была слишком большой и «сырой», поэтому сперва пришлось построить отдельный конвейер подготовки данных.

TIFF‑файлы переводились в PNG, после чего из них скользящим окном вырезались фрагменты 1081×1081 с шагом 200 пикселей. Высоты нормализовались и раскладывались по 11 диапазонам. Слишком пустые, слишком заполненные и почти плоские куски отбрасывались: доля суши должна была быть примерно 15–85%, стандартное отклонение классов высоты — больше 1,25, а среднее и медиана попадать в заданные интервалы. Так в выборке оставались карты с читаемыми берегами и заметным рельефом.

Затем примеры сортировались по тому, к каким границам подходит суша. Фрагменты отражались и комбинировались, чтобы береговые линии можно было продолжать без очевидных швов. Длинные прямые контуры находились через Canny и преобразование Хафа, разбивались фрактальным шумом и сглаживались. Если суши оставалось меньше 44%, пример смешивался с другими картами. В конце изображения поворачивались, масштабировались и приводились к 256×256 оттенкам серого.

Как обучалась модель

На этой выборке обучался GAN. Обучение шло через BCEWithLogitsLoss.

Шесть этапов генератора Civilization: от SRTM-30 до биомов

Во время генерации одной нейросетевой выборки было недостаточно. Модель запускалась заново, пока суша не переставала упираться в края. Если она занимала меньше 40% поля, алгоритм находил самый большой пустой прямоугольник и вставлял туда ещё один сгенерированный фрагмент, масштабируя его под свободное место. Так получались не только одиночные острова, но и более сложные материки.

Что происходило после GAN

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

Влага распространялась от океана и рек, теряя силу с расстоянием и при подъёме в горы. Истоки рек выбирались среди гор и наиболее влажных клеток, после чего русло искало путь вниз и могло соединяться с другими реками или образовывать озёра в понижениях. Температура зависела от широты, высоты и соседства с водой; в коде уже была заложена поправка примерно 6,5 °C на километр. Затем таблица из 25 диапазонов влажности и 23 диапазонов температуры выбирала один из 15 биомов, а поверх неё появлялись леса, болота, пустыни, рифы и игровые ресурсы.

Генератор получился отличным, но встроить его в Civilization V мне так и не удалось. Зато код, подготовленная выборка и сама идея цепочки «рельеф → вода и климат → биомы → игровые правила» сохранились.

Ранняя версия глобальной карты

Как эта логика превратилась в генератор 8 More Lives

Позже этот заброшенный эксперимент стал основой глобальной карты 8 More Lives — но переносить нейросеть в игру целиком оказалось неразумно. Один только сохранённый checkpoint генератора весит около 213 МБ. К нему пришлось бы добавлять runtime, операции для инференса, память на промежуточные тензоры и отдельную поддержку Windows, macOS, Linux и будущих консолей. Для системы, которая нужна лишь несколько секунд при создании мира, это слишком высокая цена по размеру билда, времени запуска, тестированию и сертификации платформ.

Сама карта в игре тоже гексагональная — это не прямоугольное поле, обрезанное маской. При размере 100 от центра до каждой из шести граней лежит 100 гексов, поэтому в мире получается 1 + 3R(R + 1) = 30 301 ячейка. Сейчас в игре доступен только один стиль генерации — Континент. Всю карту можно вращать вокруг центра шагами по 30°: для каждого гекса заранее рассчитываются 12 состояний поворота, чтобы рельеф и границы корректно читались с любой стороны.

От обученной модели мы отказались, но сохранили её уроки. Текущий генератор начинает с шести октав детерминированного шума: координаты переводятся в гексагональное пространство, на каждой октаве частота удваивается, амплитуда уменьшается вдвое, а результат нормализуется. Один и тот же seed даёт один и тот же мир без внешней модели и платформенных различий.

Шаг 1. Поле высот реальной игровой карты из сохранения: океан, низины, равнины и горные области.
Шаг 1. Поле высот реальной игровой карты из сохранения: океан, низины, равнины и горные области.

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

Затем непрерывная высота раскладывается по 21 порогу. Замкнутые низины внутри материка на этом шаге возвращаются в сушу: позже отдельный генератор сможет превратить подходящие из них в озёра.

Следом генераторы добавляют реки, броды и озёра.

Реки и их выходы к связанному с краями карты океану.
Реки и их выходы к связанному с краями карты океану.
Броды и мостовые переходы поверх уже построенной речной сети.
Броды и мостовые переходы поверх уже построенной речной сети.
Озёра и внутренние водоёмы на той же реальной карте после гидрографической обработки.
Озёра и внутренние водоёмы на той же реальной карте после гидрографической обработки.

После гидрографии генератор рассчитывает климат.

Температура меняется от −25 до +50 °C вдоль карты и понижается с высотой. Влага распространяется очередью приоритетов от океана, рек и озёр, на каждом шаге умножается примерно на 0,885 и теряется при подъёме и в дождевой тени. Один из тёплых секторов специально получает мало осадков, для генерации большой пустыни.

Температурное поле: широтный градиент и охлаждение с высотой.
Температурное поле: широтный градиент и охлаждение с высотой.
Распределение влаги: источники воды, затухание, подъём рельефа и дождевые тени.
Распределение влаги: источники воды, затухание, подъём рельефа и дождевые тени.

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

Итоговое распределение арктики, тайги, умеренных биомов, саванны и пустыни.
Итоговое распределение арктики, тайги, умеренных биомов, саванны и пустыни.
Особенности клеток и игровые объекты поверх готовой биомной карты.
Особенности клеток и игровые объекты поверх готовой биомной карты.

Боевая карта и улучшения

Глобальная карта 8 More Lives

Во время пандемии заниматься было особо нечем, и прямо посреди «самоизоляции», в мае 2020 года, мне пришла безумная идея откопать старый проект и посмотреть, что интересного можно сделать со средневековой пошаговой тактикой. В то время единственной по‑настоящему «большой» игрой в этом жанре всё ещё оставалась Battle Brothers, поэтому вопрос постепенно свёлся к следующему: «Что я могу сделать такого, чего нельзя реализовать модами для Battle Brothers?»

Первым ответом стал поворот карты.

Поворот карты

Затем появились биомы, и игра уже могла генерировать боевые карты для нескольких биомов сразу. Изначально их было ещё больше, да и на самом деле они до сих пор есть в игре, просто пока скрыты. Мы будем постепенно возвращать их по мере готовности графики.

Ранний концепт города

Генерация боёв на основе глобальной карты

А что ещё я могу сделать?

Глобальная карта превращается в карту боя

Давным‑давно вышла великая и ужасная Rome: Total War, в которой карты сражений процедурно генерировались на основе глобальной карты кампании. Так чем же я хуже? И я начал возрождать забытую технологию двадцатилетней давности.

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

Большие юниты, маленькие юниты и девять жизней

Что ещё можно добавить в игру? Как насчёт больших и маленьких юнитов? Одногексовых юнитов недостаточно!

Большие юниты занимают несколько гексов

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

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

К тому же как референсы в голову пришли «Рэдволл» и диснеевский «Робин Гуд», так что оставалось лишь добавить немного мрачного фэнтези.

Кот автора

То, что в двух наших предыдущих играх главными героями тоже были коты, — чистое совпадение. Определённо. Сто процентов. А ещё вот вам мой кот.

Удобство для стратегической игры

К 2024–2025 годам прототип стал достаточно играбельным, чтобы я мог уделять больше внимания удобству и качеству игрового процесса. Мне нужно было доказать остальной команде, что этот симулятор Excel с котами — действительно игра, в которую могут играть люди.

Вложенные подсказки

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

Гиперссылки в игровом тексте

Правдоподобное историчное оружие и слои брони

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

Многослойная броня

Лично для меня всё это очень важно, но оставался вопрос: много ли игроков разделяют этот интерес? К счастью, вышла Kingdom Come: Deliverance II, стала хитом и немного развеяла мои опасения.

От закрытого прототипа к открытому плейтесту

В октябре 2025 года один стример сыграл в прототип. Он провёл два часа в совершенно сырой, наполовину сломанной версии игры — и она ему понравилась! Зрителям тоже.

Первый стрим прототипа

Так мы добрались до февраля 2026 года и начала полноценной разработки — небольшого окна между «наш билд уже достаточно хорош» и «весь мир будет играть в GTA 6», когда мы наконец можем показать вам игру.

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

Добавляйте в желаемое, записывайтесь на плейтест!

Ссылочка на Steam, если захотите добавить в вишлист и записаться на плейтест:

8 More Lives в Steam

8 More Lives в Steam
8 More Lives в Steam