Делаю стратегию, где весь Марс стал одной картой
Robosoma начинается с посадки. В текущем сценарии игрок сначала ведёт к поверхности большой корабль «Стриж», сажает его на Марс, открывает рампу и выпускает первую робосому. Готового города рядом нет. Есть один робот, немного стартовых ресурсов и целая планета, на которой ещё ничего не построено.
Дальше начинается стратегия. Нужно выбрать место для базы, поставить источник энергии, наладить добычу реголита и руды, построить цех и фабрику, а потом выпускать новых робосом. Если ошибиться с расположением зданий, логистика станет длинной. Если забыть про энергию, производство остановится. Если слишком рано полезть в расширение, колония упрётся в нехватку металла. А если рядом развивается другая сторона, рано или поздно мирное строительство закончится.
Это и есть Robosoma: стратегия в реальном времени про автономную колонию машин на настоящем Марсе. В ней смешались RTS, строительство базы, производственные цепочки, логистика, сражения и немного симулятора техники. В любой момент можно отдалить камеру почти до вида планеты, приблизиться к отдельному роботу, а затем перейти в управление от первого лица или сесть в кабину корабля.
Что игрок делает в первые минуты
Сначала я бы не советовал строить всё подряд. Лучше осмотреться. Поверхность здесь не плоская, поэтому красивый кратер может оказаться плохим местом для первого города. На крутом склоне труднее ставить здания, роботам приходится искать обходы, а длинный путь между добычей и складом быстро превращается в пробку.
Обычно первый рабочий порядок такой: энергия, добыча, переработка, склад, фабрика. Реактор питает сеть. Экстрактор даёт сырьё. Цех превращает его в материалы. Фабрика выпускает новых роботов. Склад сглаживает нехватку ресурсов, а транспортные робосомы развозят грузы между узлами. Потом уже появляются посадочные площадки, топливное производство и более дальние маршруты.
У каждого здания есть не только цена. Ему нужен нормальный подъезд, место для очереди, свободные ворота и связь с остальной цепочкой. Я специально не хотел делать экономику, где ресурс просто возникает в общей цифре сверху экрана. Если на фабрике нет металла, значит металл действительно где-то застрял, его не произвели или не довезли.
Сейчас в игре 11 типов зданий. Есть штаб, реактор, экстрактор, цех, склад, фабрика, топливный завод, посадочная площадка и другие части производственной цепочки. Робосомы строят, добывают, перевозят, воюют, обходят камни и здания, выстраиваются в формации и заходят в шлюзы. Всё это ещё развивается, но это уже не макет из одного юнита и красивого шара.
Какой здесь масштаб
Главная особенность Robosoma не в количестве полигонов и не в огромной дальности прорисовки. Вся карта является одной сферой размером с Марс. Радиус планеты в игре 3389,5 километра. Олимп возвышается примерно на 21 километр, а система каньонов Маринер имеет длину около 4000 километров. Это не отдельные уровни с похожими названиями. Они находятся на своих местах на одной планете.
Можно смотреть на колонию с высоты нескольких десятков метров, затем подняться выше гор, увидеть кривизну горизонта и продолжить отдаление. Я не подменяю ближний Марс одной сценой, а глобус другой. Это один мир с разными уровнями детализации.
Из-за этого привычные для обычной стратегии вещи становятся сложнее. Прямая линия на экране не всегда является кратчайшим путём по поверхности. Луч камеры должен попасть не в гладкий шар, а в реальный рельеф. Здание должно стоять на высоте поверхности именно в этой точке. Маршрут между двумя местами идёт по сфере, а горизонт действительно закрывает то, что находится за ним.
Сначала это кажется лишней технической вознёй. Но потом видишь робота у подножия огромного склона, отдаляешь камеру и понимаешь, что этот склон является частью настоящего рельефа планеты. Ради этого всё и затевалось.
Откуда взялась идея
В начале меня интересовал простой вопрос: можно ли сделать стратегию, в которой карта не заканчивается краем уровня. Не бесконечную процедурную плоскость, а нормальную планету, где можно выбрать любое место и со временем встретить последствия действий других игроков.
Марс подошёл для этого лучше всего. Он достаточно хорошо изучен, по нему есть открытые научные данные, и при этом он остаётся почти пустым полем для большой игры про строительство. Здесь не нужно придумывать, почему на карте нет современных городов, дорог и миллиардов людей. Можно начать с нуля и не ломать реальную географию.
Первый вариант был очень простым: сфера, рельеф, камера и один объект на поверхности. Потом появился робот, строительство, ресурсы, навигация, противник, сетевой матч, корабль. Каждая новая система вытаскивала следующую проблему. Как робот проходит через ворота? Как две тысячи юнитов не сталкиваются в одном месте? Как сохранить мир так, чтобы после загрузки производство продолжилось с того же состояния? Как отдать приказ через сеть и не получить его через пять секунд?
Так проект постепенно перестал быть технической демонстрацией глобуса и стал игрой.
Настоящий Марс, но без притворства
Основу высот дают MOLA и объединённая модель HRSC/MOLA. Цвет планеты опирается на глобальную мозаику Viking. Для геологии и размещения ресурсов я использую материалы USGS и карты подповерхностного льда SWIM. Поверх крупных данных игра добавляет микрорельеф, мелкие камни и детали, иначе даже настоящая карта с высоты робота выглядела бы слишком гладкой.
При этом я не хочу продавать это как «симуляцию каждого камня на Марсе». Глобальные формы настоящие, но мелкие детали там, где не хватает исходных данных, создаются процедурно. Это честный компромисс. Например, изображения CTX могут иметь разрешение около 5 метров на пиксель, но полный набор для всей планеты занимает примерно 5,6 терабайта. Тащить такой объём в обычную игру бессмысленно.
Научная основа нужна не только для красивой подписи. Рельеф влияет на постановку зданий, движение, обзор и выбор места для базы. Лёд нужен как часть будущей экономики местных ресурсов. Марсианские сутки, положение Солнца и масштабы объектов задают ощущение места. Иногда реальность неудобна для геймплея, и тогда приходится искать баланс, а не просто писать слово «реализм» в описании.
Если хочется проверить источники, вот основные:
HRSC/MOLA, глобальная модель высот USGS: https://astrogeology.usgs.gov/search/map/mars_mgs_mola_mex_hrsc_blended_dem_global_200m
Глобальная цветная мозаика Viking: https://astrogeology.usgs.gov/search/map/mars_viking_colorized_global_mosaic_232m
Геологическая карта Марса USGS: https://pubs.usgs.gov/sim/3292/
Карты льда SWIM: https://swim.psi.edu/SWIM4MIMProducts.php
Отдельную страницу с объяснениями я собираю здесь: https://robosoma.ru/nauka.html
Почему я не взял готовый игровой движок
В проекте нет Unity или Unreal. Но я не буду утверждать, что эти движки «слишком слабые» вообще. На них делают вещи намного крупнее моей игры. Моя проблема в другом: для Robosoma мне нужен очень жёсткий контроль над тем, как живёт одна огромная сфера, как переключаются уровни детализации, как хранятся координаты и что именно происходит на телефоне в каждом кадре.
Основной код написан на Rust. Графика идёт через wgpu, шейдеры написаны на WGSL. Глобальные координаты считаются с высокой точностью, а перед отрисовкой переводятся относительно камеры, иначе возле робота начиналась бы дрожь из-за масштаба планеты. Рельеф подгружается и упрощается в зависимости от расстояния. Игровая симуляция работает отдельно от рендера, чтобы тяжёлый поиск пути одного отряда не замораживал камеру и интерфейс.
Есть и своя шина команд BUS. Мышь, сенсорный экран, сетевой игрок, встроенный ИИ или внешний модуль подают игре одинаковые команды. Это было важно заложить заранее. Я не хочу через год обнаружить, что мобильное управление, мультиплеер и ИИ меняют состояние тремя несовместимыми способами.
Конечно, библиотеки в проекте есть. wgpu и экосистема Rust тоже являются библиотеками. Правильнее говорить, что здесь нет готового игрового движка, а рендер планеты, симуляция, навигация, интерфейс, сетевой протокол и сервер собраны под эту задачу.
Баги, которые звучат смешно только после исправления
Самая большая часть разработки такой игры не выглядит как эффектный ролик. Обычно это вечер, когда робот третий час не может войти в ворота, а причина находится в одной переменной.
Однажды робосомы начали бесконечно заходить в здание и тут же выходить обратно. По отдельности ворота работали. Очередь работала. Перевозка тоже работала. А вместе они создавали цикл: робот считал передачу груза завершённой раньше времени, освобождал место, снова видел задачу и возвращался. Пришлось вводить явное состояние передачи и блокировку повторного входа.
Другой случай был с постройкой на склонах. Игроку интерфейс честно запрещал ставить здание на слишком крутом месте, а ИИ спокойно строил там же. Оказалось, у него был отдельный упрощённый путь проверки. После этого я окончательно убедился, что одинаковые действия должны идти через одну систему, иначе они обязательно разойдутся.
У корабля однажды уехала тень. Сам корабль стоял правильно, опоры касались поверхности, а тень висела в стороне. Высота рельефа учитывалась два раза: первый раз при положении корабля, второй при расчёте тени. Ошибка маленькая, но на большом склоне выглядело так, будто рядом с кораблём летит его призрак.
Была и странная «линза» в камере. На крутом рельефе перспектива начинала выглядеть так, будто центр изображения раздуло. Причина оказалась не в текстуре и не в модели горы. Слишком большой перепад высот ломал привычные настройки камеры. Исправлять пришлось не Марс, а то, как камера выбирает параметры на разных высотах.
Производительность тоже регулярно преподносит сюрпризы. На компьютере всё могло летать, а на телефоне игра упиралась в 30 кадров. Я долго смотрел на симуляцию, количество роботов и потоки, но профиль показал другое: узким местом был микрорельеф на видеочипе. Перенос симуляции в отдельный поток был правильным архитектурно, но почти не изменил FPS. Реальный прирост дал рендер мира в половинном разрешении с последующим масштабированием, при этом интерфейс остался резким. На одном и том же телефоне спокойная сцена выросла с 26 до 40 FPS, а движение камеры с панорамой и зумом с 33 до 50 FPS.
На ПК есть отдельный нагрузочный сценарий с боем 1000 на 1000, одновременной панорамой и зумом. В зависимости от сцены и машины он показывает примерно от 90 до 240 FPS. Это не обещание, что любой компьютер всегда получит такие цифры. Это мой способ ловить регрессии: если новая красивая тень забрала треть скорости, она не может попасть в релиз просто потому, что мне нравится.
Навигация тоже успела преподать урок. Пять тысяч роботов возле сложного препятствия заставляли одни и те же дорогие проверки выполняться снова и снова. После кэша препятствий и ограничения работы на тик симуляция перестала проваливаться. А дальний приказ через половину видимой планеты однажды ронял рендер до 5-10 FPS, потому что код обрабатывал то, что всё равно скрыто горизонтом. После правильного отсечения сцена вернулась примерно к 200 FPS.
Самый неприятный сетевой баг проявился только на настоящей паре «компьютер плюс телефон по Wi-Fi». На одном ПК два клиента работали хорошо. В живом тесте приказы иногда шли от одной до пяти секунд, а часть терялась. Это заставило переделывать доставку команд, добавлять повторы и перестать считать тест на одной машине доказательством. Сеть ещё не та часть, про которую я могу сказать «готово навсегда», но теперь у неё хотя бы есть честный живой стенд.
Зачем робосомам корабль
«Стриж» появился не ради заставки. Колония должна уметь перемещать роботов и ресурсы между удалёнными точками планеты. В игре уже есть посадка, взлёт, опоры, рампа, перевозка пассажиров, заправка и кабина с ручным управлением. Можно смотреть на полёт со стороны или сесть внутрь.
Топливо связано с ISRU, то есть использованием местных ресурсов. На Марсе нельзя заказывать готовую канистру с Земли каждый раз, когда нужно перелететь к соседней базе. Поэтому в экономике появляются добыча льда, переработка, производство компонентов топлива, хранение и доставка к площадке.
Здесь я смотрю на реальные эксперименты, но не копирую их как лабораторную инструкцию. Например, MOXIE на Perseverance действительно получал кислород из атмосферы Марса. Для игры это подтверждение, что идея местного производства не взята из воздуха. Дальше начинается геймдизайн: сколько звеньев цепочки интересно обслуживать, а после какого количества игрок превращается в диспетчера труб.
Про MOXIE можно прочитать у NASA: https://www.nasa.gov/missions/mars-2020-perseverance/perseverance-rover/nasas-oxygen-generating-experiment-moxie-completes-mars-mission/
Карта доступного льда: https://www.jpl.nasa.gov/news/nasas-treasure-map-for-water-ice-on-mars/
Почему в начале нет людей
По лору люди не проиграли Марс и не исчезли. Они добрались до него, получили медицинские данные и вернулись. После этого стало понятно, что постоянную инфраструктуру безопаснее сначала построить машинами.
Радиация, пыль, слабая гравитация, задержка связи и отсутствие быстрой помощи делают человека очень дорогой единицей. Робот тоже ломается, но его можно разобрать, заменить модуль или оставить ждать запчасть. Поэтому первая колония состоит из робосом. Они похожи не на железных людей, а скорее на клетки большого организма: каждая выполняет простые задачи, а вместе они строят, добывают, защищаются и размножают инфраструктуру.
Связь с Землёй не позволяет управлять каждым движением в реальном времени. Сигнал идёт минуты. Поэтому машина должна получить цель и сама решить, как объехать камень, где встать в очередь и что делать, если путь изменился. Из этой особенности вырос и игровой ИИ.
Конфликт в мире тоже не строится вокруг злого инопланетянина. Хорошие места редки, лёд и удобный рельеф распределены неравномерно, а две автономные системы могут по-разному понимать безопасность. Сначала они мешают друг другу маршрутами, потом спорят за ресурсы, потом появляются границы и оружие. Мне интереснее такой конфликт, чем сюжет, где красные роботы плохие просто потому, что они красные.
Техническая сторона задержки связи у NASA: https://www.nasa.gov/communicating-with-missions/delay-disruption-tolerant-networking/
О времени сигнала между Землёй и Марсом у ESA: https://blogs.esa.int/mex/2012/08/05/time-delay-between-mars-and-earth/
ИИ в самой игре и нейросети в разработке
В Robosoma есть встроенный командир, матчи ИИ против ИИ и коннектор для внешних модулей. Для меня важно, чтобы ИИ не получал тайную карту и не менял мир напрямую. Он должен видеть доступное игроку состояние и отдавать те же команды через BUS. Иначе это не соперник, а скрипт с читами.
Сам проект я делаю один в свободное от основной работы время. Это просто мой режим работы, не попытка вызвать жалость. Нейросети использую как инструменты: обсуждаю варианты, прошу искать слабые места, помогаю себе с кодом, тестами и документацией. Иногда одна модель пишет вариант, другая его критикует, а затем всё приходится проверять в запущенной игре.
Нейросеть может уверенно предложить код, который собирается и делает не то. Поэтому у проекта есть автоматические тесты, нагрузочные стенды, снимки кадров и живые сценарии через ту же шину команд, которой пользуется игрок. Сейчас библиотечный набор проекта содержит больше четырёхсот тестов. Это не делает игру безошибочной, но сильно сокращает количество багов, которые возвращаются второй раз.
Что уже можно попробовать
Сейчас работают одиночная колония, сражения с ИИ, режим наблюдения за ИИ против ИИ, управление робосомой от первого лица, корабль, сохранения и сетевой матч один на один через собственный релейный сервер. Игра запускается на Windows и Android, управление сделано отдельно под мышь и сенсорный экран.
Она бесплатная. Рекламы, покупки энергии, ускорителей и платных роботов нет. Я не знаю, какой будет модель проекта через несколько лет, если серверный мир станет большим и дорогим, но текущую игру я распространяю бесплатно и без коммерции.
Скачать версию для Windows и Android можно на официальном сайте: https://robosoma.ru/skachat.html
Основной сайт проекта: https://robosoma.ru
Обновлённые сборки также отправлены в Google Play и RuStore и на момент написания проходят проверку. Если в магазине пока видна старая версия или страницы ещё нет, актуальная сборка лежит на сайте.
Куда всё это должно прийти
Ближайшие задачи довольно земные: сделать первые минуты понятнее, улучшить объяснение экономики, довести сетевой матч, развивать здания, транспорт и боевую часть. Ещё нужны нормальные обучающие подсказки. Я слишком хорошо знаю, почему база встала, а новый игрок видит молчащую фабрику и не обязан читать мои мысли.
Дальняя цель гораздо больше. Я хочу, чтобы Марс был не набором отдельных комнат, а одним постоянным миром. Тысячи игроков строят города на одной сфере, торгуют, воюют, заключают союзы, запускают транспорт и встречают результаты чужих решений. Клиент при этом получает только ближайшую важную область, а дальние события приходят реже и грубее. Без такого уровня детализации сеть просто утонет в данных.
Сейчас массового мира ещё нет. Есть фундамент: настоящая сфера, детерминированная симуляция, сетевой матч, сервер, разделение мира на области интереса в архитектуре. Между этим фундаментом и «тысячами игроков на одной планете» огромное количество работы. Я лучше буду показывать её по частям, чем поставлю на сайт счётчик несуществующих пользователей.
После Windows и Android хочу добраться до Linux, macOS и iOS. Веб-версия тоже интересна, хотя там придётся серьёзно пересматривать объём данных и качество рендера. Полная кроссплатформенность для меня не просто галочка. Если на одной планете живут разные игроки, странно делить их по устройствам.
Теперь мне действительно нужен совет
До этого проект в основном жил внутри разработки. Сообщества вокруг него почти нет, и я только начинаю показывать игру людям. Поэтому вместо обычного «ставьте лайк и подписывайтесь» хочу спросить конкретно.
Что из описанного вам интереснее всего: строительство колонии, настоящая география Марса, корабли и логистика, сражения или идея одного глобального мира?
Что в первых двадцати минутах такой игры обязательно нужно объяснить, а что лучше дать открыть самому?
Где вы вообще находите небольшие стратегии и проекты одиночных разработчиков? DTF, YouTube, VK, Telegram, игровые фестивали, itch.io, VK Play или другие площадки?
И отдельно вопрос к тем, кто уже вёл дневник разработки с нулевой аудиторией. Что реально помогло получить первые живые отзывы, а что оказалось пустой тратой времени?
Если попробуете сборку, напишите самую неприятную вещь, которую заметили. Непонятная кнопка, долгий старт, плохая камера, застрявший робот, странный баланс. Конкретный багрепорт сейчас полезнее общей похвалы.
Дальше я хочу писать сюда не рекламные объявления, а нормальный дневник: как устроена сферическая навигация, почему ломались ворота, как проходил запуск Android-версии, что происходит с сетевым миром и какие решения пришлось выбросить.
Текст написан мной и в конце прошёл через нейросеть для исправления ошибок и улучшения читаемости. Факты, цифры и ссылки я сверял с документацией проекта и исходными источниками.