ФАБРИКА РАЗМЕРОМ С ГАЛАКТИКУ: КАК МЫ ВЫКОВАЛИ «МОНОЛИТ» НА 470 МОДОВ Часть 5: Месяц спустя — звездная навигация и Рулетка на втором мониторк
Привет, пикабушники, хардкорные инженеры и любители бесконечных конвейеров!
Ровно месяц прошел с момента публикации четвертой части нашей эпопеи по созданию самой масштабной сборки в истории Factorio. Напомню краткое содержание предыдущих серий: мы замахнулись подружить официальное дополнение Space Age, титанический Krastorio 2, глубокий космос, десятки планет и около полутысячи сопутствующих модификаций. В прошлый раз мы с помощью алгоритма Тарьяна развязали все узлы циклических зависимостей в дереве технологий и провели успешный тест «чистым листом».
Казалось бы — вот он, финал! Открывай шампанское и лети строить мегабазы.
Но геймдев и глубокий моддинг Factorio 2.0 любят наказывать за самоуверенность. Этот прошедший месяц превратился в самый насыщенный, потный и технически изощренный этап разработки. Сегодня я расскажу, как мы распутывали паутину межзвездных маршрутов для 36 миров, почему движок Factorio скрытно крашился на 95% загрузки из-за несуществующей текстуры Аквило, как мы создали автономную мета-игру для второго монитора и почему окончательно отказались от формата обычных zip-архивов.
Поехали!
НАЛАЖИВАНИЕ ЗВЕЗДНОЙ КАРТЫ: КАК НЕ ЗАБЛУДИТЬСЯ В 36 МИРАХ
В ванильном Space Age космическая навигация устроена уютно и компактно: у вас есть Наувис, три промежуточные планеты (Вулканус, Глеба, Фульгора) и далекий ледяной Аквило. Орбиты понятны, расстояния предсказуемы, перепутать маршруты физически невозможно.
А теперь представьте, что происходит, когда в космос выкатываются 36 полноценных небесных тел, разбросанных по пяти гигантским звездным секторам: — Колыбель: стартовый древесный спутник Лигнумис; — Ядро Калидус: классический пояс Наувиса с луной Мулуной и спутником Геркизией; — Сектора Альфа, Бета, Гамма и Дельта: лавовые бездны Гефеста и Крусибла, океанические глубины Пелагоса и Мараксиса, ядовитая Тенебрис, ледяная Фрозета, кристаллическая Раббаска, пустынный Арракис; — Святилище АСТРА: сверхсекретная система Древних Предтеч, удаленная на безумные 120 000 000 километров в глубокий войд.
Когда мы впервые активировали всю карту, на экране звездной навигации начался сущий ад.
Линии космических трасс переплелись в нечитаемый клубок спагетти. Орбитальные платформы, летящие за ресурсами, начали попадать в логические «гравитационные колодцы»: платформа рассчитывала траекторию перелета, упиралась в невидимую границу чужой орбиты и зависала на вечной околосветовой скорости с пустыми баками топлива. Хуже того — из-за конфликта кастомных векторов гравитации несколько планет визуально наслаивались друг на друга, превращая карту системы в калейдоскоп.
Как мы это разрулили? Пришлось вручную пересчитать и откалибровать астродинамику всей галактики:
Зонирование секторов: каждую планетарную систему мы жестко привязали к своему звездному эшелону с уникальными радиусами орбит, скоростями вращения и коэффициентами гравитационного притяжения.
Иерархия космических шлюзов: путешествие в дальние сектора больше не происходит по принципу «лечу по прямой». Чтобы пробиться к мирам глубокого космоса, игрок должен создать специализированные межзвездные двигатели и преодолеть транзитные точки в поясах астероидов.
Безопасные коридоры для платформ: автоматические платформы снабжения теперь двигаются по строго выверенным полетным коридорам, где плотность астероидов точно сбалансирована под калибр бортовых турелей. Карта звездного неба наконец-то стала работать как монументальный, кристально понятный космический атлас.
ПРИЗРАК АКВИЛО И САМАЯ ПОДЛАЯ ЛОВУШКА ДВИЖКА (AtlasBuilder.cpp)
Это был один из тех багов, из-за которых хочется выбросить системный блок в окно.
Мы готовим сборку к тестам. Прогоняем валидацию всех сотен модов через консольную утилиту Factorio: factorio.exe --dump-data
Всё чисто: прототипы загружаются идеально, контрольные суммы сходятся, в логе заветные нули ошибок. Запускаем headless-сервер — мир генерируется, симуляция тиков стабильна.
Запускаем игру в обычном режиме с монитором... Полоса загрузки бодро доходит до 95%, оперативная память заполняется до 8 гигабайт, монитор мигает — и игра с грохотом падает на рабочий стол.
Открываем factorio-current.log и видим вот это: AtlasBuilder.cpp:1378: Failed to get last_write_time: The system cannot find the file specified.: "data/space-age/graphics/lut/aquilo-1-day.png"
Начинается детективное расследование. Откуда взялся aquilo-1-day.png? Лезем в файлы официального дополнения Space Age. Смотрим папку space-age/graphics/lut/ — и у нас отваливается челюсть: — Для Фульгоры лежат 5 файлов плавного перехода: noon, afternoon, after-sunset, before-dawn, morning. — Для Глебы — 8 фаз освещения. — Для Вулкануса — честные 1-day.png и 2-night.png. — А для Аквило никаких LUT-файлов нет вовсе! В ваниле Аквило — это мертвый ледяной мир на краю системы, где солнце еле теплится, а смена дня и ночи не имеет цветовой палитры.
Один из сторонних планетарных модов для своего морозного мира решил сделать «как у Аквило» и прописал путь к файлу наугад: мол, «раз у Вулкануса 1-day, значит и у Аквило должен быть aquilo-1-day.png». Файла никогда не существовало в природе!
Но самое дикое в этой истории — почему молчал валидатор Factorio? Оказалось, встроенный верификатор движка при старте проверяет существование иконок, спрайтов сущностей и анимаций. Но таблицы Color LUT (цветокоррекция шейдеров дня и ночи) не участвуют в валидации прототипов! Движок Factorio на C++ обращается к ним напрямую только в тот момент, когда видеокарта начинает запекать огромный массив текстур в видеопамять через AtlasBuilder.cpp. И если файла на диске нет — движок не выдает предупреждение, не берет заглушку, а просто падает с паникой ядра операционной системы.
Мы написали отдельный скрипт глубокого аудита графики, просканировали все графические ссылки в сборке, выкорчевали вымышленные пути и заменили их на эталонные карты освещения из ядра движка. Текстурный атлас весом более 8.5 ГБ собрался с первой попытки без единого нарекания.
РУЛЕТКА БЕЗУМИЯ: КАК МЫ СПАСЛИ ИГРОКА ОТ «ПАРАЛИЧА ВЫБОРА»
Когда в твоей игре 36 планет, возникает непредвиденная психологическая проблема — синдром распыления внимания.
Игрок строит ракету, открывает карту секторов, видит перед собой три десятка миров, сотни новых руд, жидкостей, технологий... и впадает в ступор. Куда лететь в первую очередь? Зачем строить базу на метановом спутнике, если можно полететь на титановый астероид? В итоге грандиозный масштаб рискует превратиться в унылый гринд без цели.
Чтобы превратить прохождение в осмысленный и азартный квест, мы за этот месяц разработали отдельное приложение-компаньон — «Рулетку Безумия».
Идея родилась спонтанно, но выросла в полноценный нативный киберпанк-терминал:
Жребий Столицы (Capital Roll): Забудьте о том, что Наувис обязан быть вечным центром вашей империи. На старте терминал крутит рулетку по всем 36 планетам галактики. Выпал глубоководный Мараксис? Значит, вашей метрополией станет подводный мир на глубине 500 метров. Выпал вулканический Гефест? Придется учиться выживать среди рек лавы.
База из 405 многоступенчатых контрактов: 9 космических отраслей: от лесозаготовок и карьеров до квантовой науки, биоморфизма и технологий Предтеч. Контракты выдаются на 6 барабанах со случайными условиями («достичь 1000 SPM переработки серы на Аквило», «развернуть орбитальный форпост защиты»).
Компактный Mini-HUD (460x820) для второго монитора: Никому не удобно постоянно сворачивать Factorio через Alt+Tab. Поэтому мы упаковали веб-терминал на Chromium в ультралегкий нативный C#-лаунчер с App-Mode режимом. Терминал превращается в аккуратное вертикальное окно без лишних рамок браузера, которое идеально встает на второй монитор рядом с игрой. Нагрузка на процессор и видеокарту — строго 0%.
Бортовой фотоальбом по Ctrl+V: Никакой ручной писанины и скучных отчетов. Выполнили сложнейшую миссию по постройке термоядерного завода? Нажимаете PrintScreen в игре, переводите курсор на второй монитор и жмете Ctrl+V прямо в окне Рулетки. Встроенный модуль сжимает скриншот без потери читаемости интерфейса и подшивает его в карточку выполненного контракта.
Программный Web Audio синтезатор: Чтобы не раздувать вес приложения тяжелыми звуковыми библиотеками, все клики, щелчки вращения слотов и звуковые сигналы выигрыша генерируются процедурно через математический синтез звуковых волн прямо в браузере.
ПОЧЕМУ ZIP-АРХИВЫ МОДОВ — ЭТО ЗЛО, И КАК МЫ ПРИШЛИ К ПОЛНОЦЕННОМУ SETUP
На ранних этапах мы распространяли сборку традиционным для Factorio способом — огромным zip-архивом. Скачал, открыл папку модов, распаковал с заменой и молишься, чтобы взлетело.
Но на дистанции сотен игроков это обернулось бесконечным потоком однотипных проблем: — «У меня затерлись сейвы из ванильной игры!» (потому что игра писала конфиги в одну общую папку); — «Архиватор завис на 70%» (распаковать архив с 50 000 крошечных png-спрайтов — пытка для файловой системы Windows); — «Игра ругается на несовместимость модов» (игрок распаковал новую сборку поверх старых файлов, и получилась гремучая смесь из конфликтующих версий).
В итоге за этот месяц мы окончательно закрыли эту тему: написали полноценный инсталляционный сценарий для компилятора Inno Setup.
Теперь сборка упаковывается в автономный инсталлятор в один клик: — Абсолютная изоляция: установщик разворачивает полностью портативную версию игры в отдельную папку (например, Games\Astro-Genesis). Он вообще не касается системной папки с модами и вашего профиля Steam. Ваши ванильные миры и сторонние моды в абсолютной безопасности. — Всё готово из коробки: внутри установщика уже зашиты преднастроенные графические профили, отключены лишние логи, вычищен весь мусор и вложено готовое чистое тестовое сохранение. — На рабочий стол автоматически выводятся ярлыки: основной игры и терминала Рулетки (включая ярлык быстрого запуска Mini-HUD для второго экрана).
Никаких ручных правок блокнотом, никаких поисков путей — кликнул «Установить» и через три минуты пошел строить фабрику.
ЧТО В СУХОМ ОСТАТКЕ?
За этот месяц проект перешагнул критическую черту между «амбициозной, но капризной связкой модов» и «монолитной, вылизанной до блеска космической игрой».
Позади — недели ковыряния в шейдерах, графах зависимостей, отладке памяти и написании собственного софта. Впереди — чистый инженерный кайф: 36 неизведанных планет, дредноуты в глубоком космосе и конвейерные ленты, связывающие миры через гиперпространственные врата.
Интересно услышать мысли коллег по цеху: как вы организуете межпланетную логистику в Space Age, играете ли со вторым монитором под схемы/калькуляторы и какие самые изощренные баги в модах вам доводилось ловить?
Буду рад пообщаться в комментариях! Завод должен расти!

