Factorio. Добыча ресурсов с помощью AAI Programmable Vehicles
Игра изначально разрабатывалась с поддержкой пользовательских модификаций, среди которых есть горная машина (miner) и грузовик (hauler) со средствами их автоматизации. Схема может быть удобной в случае сравнительно небольших месторождений, которые не особо хочется разрабатывать стандартным способом с помощью комбинации рудников и поездов или конвейеров.
Справедливости ради, подобная автоматизация в свою очередь требует больших ментальных ресурсов, а также вполне себе материальных (игровых) на постройку депо, управляющих зданий и сооружений, ну и самих машин. Горную машину я позволю себе иногда (часто) называть экскаватором, а грузовик – самосвалом.
Итак, минимально понадобятся следующие моды:
Поскольку какого-то особого пользовательского интерфейса (подобно поездам) нет, всю логику придется реализовывать на комбинаторах – вот для чего наконец-то потребуются логические сети. В рамках базовой игры я вообще не понял, для чего они могли бы пригодиться, а в Space Age я начал ими пользоваться крайне минималистичным образом типа контроля количества космических исследовательских пакетов и боеприпасов в хабе платформы во избежание переполнения.
Некая инструкция есть на форуме. К сожалению, она писалась во времена условных альфа-версий самой Factorio, но в целом принцип не изменился – хотя в нюансах несколько поменялась работа комбинаторов, да и предлагаемые мной решения отличаются логикой.
Добыча
Иными словами, автоматизация экскаватора. Проблема в том, что сама добыча происходит только в движении – следовательно, необходимо каким-то образом заставить его двигаться по месторождению без участия оператора (т.е. вас как игрока).
Первый способ – нарисовать путь «змейкой» по всему месторождению и отправить машину «копать от забора до обеда». Недостаток – избыточность по мере исчерпания ресурсов, но в принципе способ вполне рабочий.
Второй, более сложный способ – автоматизация с помощью, например, сканера местности (Tile Scanner), башни управления техникой (Unit Controller) и логической схемы.
Мое решение заключается в следующем.
- Получить текущую позицию экскаватора.
- Просканировать произвольную клетку в пределах заданной дистанции.
- Если клетка содержит необходимый ресурс, направить туда экскаватор для добычи.
Помимо вышеупомянутых башен также потребуется сканер техники (Unit Scanner) и несколько комбинаторов. Логическая схема:
- Постоянным комбинатором подаем на вход сканера техники идентифицирующий сигнал – нагляднее, мне кажется, по типу техники (AI Miner), либо непосредственно ID экскаватора.
- Для порядка убираем ненужные сигналы из выхода сканера техники – минимально нам понадобятся собственно ID техники, позиция (Tile) и данные инвентаря.
- Подсоединяем выход сканера техники ко входу сканера местности – тем самым подаем на вход сигналы
X
иY
(начальные координаты). - Постоянным комбинатором подаем на вход сканера местности сигнал дистанции (я на всякий случай сделал это проводом другого цвета). Значение, к примеру,
10
. - Настраиваем сканер местности – я убрал пульсацию (иначе непонятно, какие собственно сигналы выходят) и установил частоту
60
(1 раз в секунду). - На вход сравнивающего комбинатора проводом одного цвета (зеленым) подключаем выход сканера техники, а другим (красным) – сканера местности.
- Условие сравнивающего комбинатора: сигнал ресурса (например железа) со сканера местности (красная сеть) больше нуля. Также я добавил условия отсутствия в этих координатах экскаваторов и самосвалов для минимизации вероятности столкновений. А чтобы «набитый битком» экскаватор не крутился туда-сюда, целесообразно добавить проверку количества ресурса в зеленой сети. Конкретное значение зависит от уровня горной машины – на начальном уровне хранилище предоставляет 50 мест, т.е. 2500 единиц железной руды.
- На выход комбинатора пробрасываем
ID
машины со сканера техники (зеленая сеть) и координаты (X
иY
) со сканера местности (красная). - Подсоединяем выход сравнивающего комбинатора к башне управления техникой. Тем самым, при соблюдении условий, мы отправляем экскаватору команду перемещения в новые координаты.
Компромиссы таковы:
- возможны пропуски «тактов», т.е. при неудачном сканировании экскаватор ничего не делает (уменьшить эффект можно регулировкой частоты);
- вроде бы невозможно полностью исчерпать месторождение, так как для этого нужно перемещаться на клетки без ресурса, а это запрещено условием. Очень теоретически есть некие субкоординаты, но углубляться не стал.
Опять же в теории с помощью сканера зон (Zone Scanner) можно усложнить схему и заставить перемещаться экскаватор на новое месторождение при исчерпании текущего (предварительно разметив эти самые месторождения), но на практике я такой вариант не прорабатывал – мне кажется проще «врукопашную» это все отслеживать и перемещать (а заодно и остатки ресурса добыть).
Доставка
Т.е. автоматизация самосвала. Как и в случае с экскаватором, можно заставить его гонять по заданному маршруту, но в данном случае это будет уже очень нерационально, плюс возникает проблема со сближением грузовика с экскаватором для обмена ресурсами. Игровая условность заключается в том, что обмен происходит «мгновенно» при «достаточном» сближении машин (друг с другом или депо), причем «курьер» пополняет экскаватор топливом в случае наличия такового среди груза. Нюанс еще и в том, что в экскаватор скорее всего помещается меньше ресурсов, чем в грузовик, да и разгрузка может произойти не сразу, если депо заполнено – нужно обеспечить технологические паузы.
Совершенно точно потребуется отдельный сканер техники (теперь для грузовиков) и две логических сети – одна для «прямого» пути (к экскаватору) и вторая для обратного (в депо). Можно ли переиспользовать ту же башню управления техникой, что и для экскаваторов – вопрос. Наверное для порядка все же скорее нет, так что я построил еще одну.
Также надо немного настроить сигналы депо и грузовика, чтобы, например, твердое топливо выгружалось в грузовик (-1
), а у самого грузовика ограничить количество загружаемого топлива – иначе места для самих ресурсов не останется.
По координатам
Простейший вариант – направлять грузовик непосредственно к экскаватору и депо, в этом случае он сам будет искать путь по тому же алгоритму, что и кусаки. В большинстве случаев скорее всего это будет работать удовлетворительно – главное чтобы где-то там не ходили поезда (иначе придется каким-то образом разбираться еще и с железнодорожными переездами), либо воспользоваться к примеру транспортными самолетами вместо наземной техники (которые, к сожалению, появляются на относительно поздней стадии игры).
Вообще говоря можно воспользоваться маяками позиций, но если заменить «динамические» координаты экскаватора статичным маяком, то придется ожидать, когда рандом (или маршрут) приведет экскаватор к маяку вместо того, чтобы сразу же забрать всю добычу. Есть еще сигнал «следовать за единицей», но у меня есть подозрения, что в этом случае машины будут постоянно сталкиваться друг с другом.
Подадим на вход вновь построенного сканера техники соответствующий сигнал (по типу техники или конкретному ID) от постоянного комбинатора. К выходу этого сканера подключаем два сравнивающих комбинатора разными проводами.
Первый – для «прямого» пути (зеленый провод). Соответственно красным проводом соединяем его вход с выходом сканера экскаваторов. Условие: ресурс (медная руда) в зеленой сети меньше заданной константы (например размера пачки – 50, или даже вовсе равен нулю для полной разгрузки). Пробрасываем ID грузовика из зеленой сети, а координаты экскаватора – из красной. Подсоединяем выход комбинатора к башне управления техникой.
Обратный путь (в депо, красный провод) делается симметрично – зеленым проводом соединяем комбинатор депо (правый верхний угол, не путать с самим депо) со входом комбинатора, в условии теперь проверим, что ресурса в красной сети больше либо равно заданной константы (например 5000 – почти полная загрузка, но для отладки лучше взять поменьше), ID грузовика также теперь пробрасывается из красной сети, а ID депо (вместо координат) – из зеленой, и не забываем подключить выход комбинатора к башне управления.
Теоретически есть сигнал «следовать за техникой», но есть подозрение, что в этом случае будут постоянно происходить микростолкновения, поэтому такой вариант, на мой взгляд, лучше применять как раз с транспортными самолетами.
Для красоты можно добавить выходные сигналы соответствующих цветов и дополнительно подключить к выходам комбинаторов фонари. В идеале тогда наверное еще стоило бы отдельным комбинатором сделать индикацию того, что самосвал ожидает заполнения…
По заданным маршрутам
Исторически я этот вариант у себя реализовал первым, поскольку грузовику мало того, что надо было объехать вокруг всей базы, так еще и потом по всяким лесам-болотам неочевидным образом ехать.
Особенностей у данного режима работы несколько. Во-первых, сами маршруты. Они не должны быть зациклены (чтобы еще и с точками маршрута не заморачиваться) и все точки (кроме конечной) должны иметь опцию Direct drive through (иначе грузовик будет делать остановки).
Во-вторых, в условиях комбинаторов надо будет проверять, что машина не находится на каком-либо из маршрутов (иначе он потом будет «ломиться» в начало маршрута).
Если сканер экскаватора не передает данные о маршруте, то вроде как достаточно будет одного сравнивающего комбинатора, иначе придется разделять логику между несколькими комбинаторами, чтобы правильно пробросить все необходимые сигналы.
Еще у меня возникла проблема с определением ID маршрута. Для максимальной уверенности стоит отправить технику по нужному маршруту и посмотреть, что показывает сканер, но вроде бы ID маршрута соответствует его порядковому номеру в списке. Увы, визуально это вроде бы никак не отображается, в отличие от идентификаторов техники.
Модифицируем логические схемы из предыдущего примера. Допустим, ID «прямого» маршрута (т.е. за ресурсом) – 2
, а обратного (в депо) – 3
. Тогда на красный вход «зеленого» сравнивающего комбинатора подаем постоянный сигнал маршрута 2
, а на зеленый вход «красного» – 3
. Добавляем условия, что сигнал маршрута грузовика равен нулю (по соответствующим цветам), а вместо координат пробрасываем ID маршрута с постоянных комбинаторов.
За железом:
В депо:
Заключение
Сохранение, которое иллюстрирует данную статью, можно скачать из каталога файлов. Для наглядности я включил еще пару модов типа плашек и авиации.
Как видите, такая казалось бы тривиальная задача решается весьма нетривиальным методом. Стоит ли оно того – тоже далеко на факт. Лично я все же решил попробовать, поскольку в моей «партии» получилось так, что месторождения камня разбросаны по всей карте и при этом каждое из них «маленькое» (100-200 тысяч), в отличие от «больших» (по несколько миллионов) остальных ресурсов (это была предустановка «железнодорожный мир» и еще куча модов).
С другой стороны, логику можно «бесконечно» усложнять и в итоге получить крайне изощренную автоматизацию. К тому же подобным образом можно автоматизировать и боевую технику, скажем для охраны зон добычи, патрулирования и т.п.
Категория: Стратегии | Опубликовано 14.02.2025 | Редакция от 08.06.2025
Похожие материалы
Heroes III
Heroes III: Restoration of Erathia. Рассуждения о том, какая раса самая крутая, а какая – самая хилая.