Привет всем инженерам и повелителям конвейерного хаоса!
В прошлой части мы остановились на Боли №8— когда мы наконец-то поженили деревянную паропанк-цивилизацию Лигнумиса с космической экспансией Space Age, выпилили бесконечные дюпы материи и даже встроили собственный мод на био-инженерию (rasta-cultivation).
Казалось бы: баланс причёсан, рецепты согласованы, карта галактики сияет. Пора садиться и с кайфом лететь к звёздам?
Как бы не так. Настоящий босс-файт начался, когда мы решили провести стресс-тестирование на длинной дистанции. И сегодня я расскажу, как скрытые изменения в движке Factorio 2.0 взрывали игру на 40-м часу, как математика спасала нас от софтлоков и зачем мне пришлось полностью снести игру с компьютера, чтобы доказать жизнеспособность Монолита.
Самый подлый и коварный кошмар любого мододела — это когда игра крашится не на старте, а спустя десятки часов прохождения.
Играешь ты себе спокойно, развиваешь базу, запускаешь дальние грузовые дроны или собираешь урожай в кастомных теплицах... и вдруг игра намертво вылетает на рабочий стол с фатальной ошибкой. Без предупреждений, без шанса сохраниться.
Вскрытие логов показало вещь, от которой у меня задергался глаз.
В Factorio 2.0 разработчики из Wube проделали колоссальную работу по чистке движка, попутно вырезав устаревшие сущности. Одной из таких жертв стала сущность flying-text (всплывающий текст над зданиями). В 2.0 её физически удалили, заменив на современный графический API rendering.draw_text.
Но авторы старых модов об этом, естественно, не знали! В скриптах дальних дронов и агро-ферм черным по белому было прописано:
surface.create_entity({ name = "flying-text", text = "Груз доставлен" }).
В старой версии игры это рисовало безобидные буковки. В Factorio 2.0 движок пытается создать сущность, которой больше в природе не существует, ловит панику и роняет весь процесс.
Мне пришлось написать собственный поисковый сканер, прогнать через него файлы всех 470 модов, выловить все до единого вызовы удалённого flying-text и хирургически переписать их на нативный rendering.draw_text. Теперь всплывающие плашки рисуются легковесно и больше не взрывают игру при разгрузке дрона.
Боль №10: Демонтаж стеклянных колб и великая цифровая революция
Вторая проблема, которая не давала мне покоя — эстетическое и логическое несоответствие науки.
В ванильной Factorio вы варите цветную жидкость в стеклянных бутылочках и скармливаете лабораториям. На Наувисе в эпоху пара и шестерёнок это выглядит мило. Но когда вы строите термоядерные корабли, бороздите гиперпространство и интегрируете тяжелый хардкор из Krastorio 2, таскать в грузовых ракетах ящики с разноцветными склянками ощущается полным абсурдом.
Мы устроили масштабную научную революцию:
Прощайте, колбы: Вся исследовательская ось была переведена на исследовательские карты данных (Tech Cards), квантовые процессоры и чипы симуляций.
Космические вычисления: Лаборатории поздней игры перестали быть алхимическими котлами — теперь это настоящие серверные станции. Чтобы исследовать глубокий космос, ты привозишь на орбиту пустые матрицы данных, облучаешь их радиацией звезд, собираешь телеметрию с астероидных буров и записываешь чистые исследовательские данные.
Синхронизация 33 000+ рецептов: Перевязать науку так, чтобы ни один из сотен модовых рецептов не потерял свои ингредиенты и не застрял в воздухе, потребовало филигранной правки таблиц данных. Зато теперь технологический прогресс выглядит монолитно и взросло.
Боль №11: Математическое доказательство проходимости (Алгоритм Тарьяна)
Когда в твоей сборке 2 359 технологий и сотни планет, главный ночной кошмар звучит так: СОФТЛОК.
Представьте: вы наиграли 150 часов, прилетаете на далекую планету за редким изотопом, а игра требует станок, чертеж которого открывается исследованием, требующим этот самый изотоп. Замкнутый круг. Сейв запорот, 150 часов жизни на свалку.
Проверить такое дерево глазами — нереально. Поэтому я решил доказать проходимость математически:
Вся база знаний сборки была выгружена в реляционную базу данных.
Мы прогнали по всему графу технологий алгоритм Тарьяна для поиска циклов (SCC). Алгоритм подтвердил абсолютную ацикличность (DAG Clean): в дереве исследований ровно 0 циклов и 0 тупиков.
Поверх этого был запущен виртуальный симулятор реального игрока, который шаг за шагом прогнал цепочку крафтов от самого начала до титров:
Старт на деревянном Лигнумисе (где нет ни единой крупицы железа, меди или угля — только пар, торф и золото);
Создание первой самодельной ракеты и перелёт на Наувис;
Выход на спутник Мулуна, покорение планетного треугольника Вулканус / Фульгора / Глеба;
Криогеника на ледяном Аквило и финальный марш-бросок на космической платформе по маршруту Дейкстры длиной 21 105 000 километров сквозь астероидные поля к Shattered Planet.
Симуляция завершилась со статусом 100% Reachable. Игра физически и логически проходима от первого добытого бревна до финала.
Боль №12: Испытание «Чистым листом»
Последний рубеж паранойи: «А вдруг сборка работает только у меня, потому что в системе годами копились какие-то остаточные конфиги и кэши?».
Чтобы отмести любые сомнения, я пошёл на радикальный шаг:
Снёс игру под корень: Удалил Factorio, вычистил папку в AppData, удалил все пользовательские настройки и временные профили.
Скачал чистейшую ванильную Factorio 2.0 Space Age из Steam.
Провел тотальную ревизию папки mods: оказалось, что в процессе экспериментов там накопился почти гигабайт (!) скрытых бэкапов, тестовых скриптов и архивных копий. Я безжалостно вычистил весь этот мусор, оставив исключительно рабочие моды, mod-list.json и mod-settings.dat.
Накатил сборку на чистую игру и запустил консольный гаунтлет движка.
Сборка сгенерировала эталонный мир сохранения размером почти 9 МБ и открутила безголовый бенчмарк в 120 тиков со статусом:
Exit Code: 0, Runtime Errors: 0, Runtime Warnings: 0.
Игра стартует «из коробки», сразу на русском языке, без единого конфликта или танцев с бубном.
Эпилог: Монолит готов
То, что начиналось как безумная идея «накатить всё, что есть в мастерской», превратилось в полноценную, математически выверенную космическую оперу на 470 модов.
Теперь фабрика — это не просто завод на одной планете. Это живая межзвёздная паутина, где автоматические грузовые платформы бороздят миллионы километров вакуума, квантовые процессоры рассчитывают траектории полетов, а каждый добытый ресурс на счету.
Фабрика должна расти. И теперь для этого открыта целая галактика. 🚀
Если вам интересны детали оптимизации VRAM под такие мегасборки или то, как разруливать конфликты в скриптах — добро пожаловать в комментарии, с удовольствием пообщаемся!