Factorio: Вы разъёбываете ульи руками? Нет, просто показываю. Красивое!

Не без труда я прошёл чистилище своим весьма специфичным видосом по игре Factorio. На сайте присутствуют много любителей игры, мой длиннопост для них.
На видео стая из 20 паукотронов под руководством логического автомата разъёбывает кусак со скоростью ~100 ульев в минуту. Далее в  посте даётся описание работы логического автомата. Для понимания прочитанного желательно понимать принцип работы логики Factorio и примерно представлять, как работает счётчик и запоминающий регистр. Сложность поста со звездочкой, так сказать, для ценителей.
Автомат у меня получился удачный, что пришлось хвастаться не мог не поделиться.
Для Вашего внимания представлена видео и текстовая версия поста.
1.   Ключевые особенности логического автомата
Все паукотроны на карте стаей бегают уничтожают обнаруженные улья и червей. Для ремонта, пополнения боеприпасов и при уровне батарей ниже 30% стая направляется на парковку. Для срыва фокуса огня червей и плевак лидер стаи меняется каждые ~3 сек.

Широкий поиск гнезд и червей осуществляется в установленном радиусе, в случае обнаружения стая выдвигается на точку. При следовании стаи происходит второй «быстрый» поиск уже в значительно меньшем радиусе (50~60 клеток) для оперативного реагирования стаи на вычищение скоплений. После ликвидации всех обнаруженных врагов стая возвращается в место парковки.

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

Не обошлось и без недостатков. Обычно логический автомат работает четко, но он довольно чувствителен к потере паукотронов в стае. Иногда не замечает потери, но обычно все очень плохо заканчивается :-( Простого и эффективного решения «эвакуации» я не додумал, потому ставьте побольше щитов и следите за оповещением «Направляюсь в зону паковки».

И второй недостаток, ID паукотронов должны идти по порядку начиная с единицы, рекомендую ставить паукотронов «на землю» с первого раза, иначе ID могут перескочить через один-два и в этом случае надо править ID «руками» чтоб ID шли по порядку начиная с единицы, иначе автомат «тупит». Кста, иногда достаточно "обвести" паукотронов мышкой и ID "переназначатся" сами.

Третий недостаток не связан с автоматом, а вытекает из поиска пути паукотронами. Паукотрон бегает только по прямой и не может обогнуть лужу, со всем вытекающими последствиями для автомата :-(
2.   Органы управления логическим автоматом
1) "главная кнопка начала Геноцида" вкл/выкл (комбинатор внизу справа),
2) возврат на базу - парковка вкл/выкл (комбинатор в центре),
3) пополнение боекомплекта вкл/выкл (комбинатор слева сверху)
Эта кнопка для бездарных нищуков-неудачников, которые не в состоянии произвести десяток другой тыщ ракет и хотят, чтобы пауканы разбирались с гнездами экологов с помощью персональных лазеров в броне по хардкору, на канале присутствует видео где 40 паукотронов превознемогают хардкор, скорость ниже на порядок, за 4 часа потеряно 5 пакоутронов, для просмотра необходим валидол,
4) радиус поиска гнезд (комбинатор в центре),
5) установка начальных точек зоны поиска (зоны «красная стрелка на юг» - комбинатор в центре),
6) очистка зоны (вспомогательная кнопка, комбинатор справа, сделана для удобства и используется для очистки всех клеток установленной зоны, чтобы не лазить по всей карте вспоминая где установил какую-либо зону),
7) установка числа сменяемых лидеров умноженное на 200 (значение задается в сравнивающем комбинаторе, в данном случае равно 1500, т.е. настроен перебор лидерами первых семи пауков – лучше не меняйте эту настройку, семи паукотронов обычно хватает на ротацию без потерь),
8) оповещение со значком заправки - включается при возврате на место паковки.
3.   Требуемые моды
Для реализации логического автомата необходимы следующие моды игры Factorio:
1. AAI programmable vehicles (возможность управления юнитами как в РТС стратегии),
2. AAI programmable structures (здания для управления юнитами из первого мода)
3. AAI signals (необходим для первых двух модов),
4. AAI zones (необходим для первых двух модов),,
5. Equipment gantry (здания для снаряжения модулями сетки оборудования юнитов).

Вообще автор модов Earendel очень уважаемый и талантливый человек, сделал великолепный мод Space Exploration, весьма рекомендую.  Не смотря на всю гениальность автора, к сожалению моды не отличаются стабильностью, автор видимо слабо владеет напильником, при работе с модами прям чувствуется есть что допилить.
4.   Начальное размещение
Автомат задействует всех паукотронов на карте и снаряжение оборудованием допустим 10+ паукотронов довольно утомительно, для этого используем мод Equipment gantry и вспомогательную схему по автоматическому снаряжению паукотронов в соответствии с заданной сеткой оборудования.

Рассмотрим работу здания Equipment gantry: сверху грузим модули, слева снизу юнит, справа снизу забираем снаряженный юнит модулем. За одну итерацию устанавливается один модуль в крайний верхний левый  свободный слот оборудования, поэтому в этой схеме используется многократный проход со счётчиком проходов. Количество модулей регулируется в манипуляторах слева. В представленной схеме паукотрон снаряжается: портативный термоядерный реактор – 1 шт., персональных лазерных защиты - 3 шт., энергетических щитов МК2 - 6 шт., личных аккумулятора МК2 - 4 шт. Полученный паукотрон грузится в гараж, затем размещается на карте, в постоянном комбинаторе у гаража задаем количество загружаемых в депо ракет 1000 шт. Не забудьте соединить постоянный комбинатор с гаражом, перемычка в схеме почему-то не сохраняется.

И ещё один момент, дроны иногда собирают эту схему в неправильном порядке и первый паукотрон собирается неверно, тут надо обнулить схему закинув паукотрон в конец конвеера, манипулятор снимая паукотрон обнулит схему и остальные паукотроны уже будут снаряжены правильно. Поэтому еще раз, Проверьте сетку оборудования первого паукотрона!

5.   Описание работы логического автомата
Для корректной работы автомата установите депо, загрузите его ракетами, поставьте рядом дронстанции для ремонта. На депо установите первую клетку зоны "чёрная стрелка на юг".

Далее пока наша стая гопников «печется» и заряжается, перейдем к принципу работы логического автомата. Для начала опишем зоны, которые использует автомат:

первая клетка зоны «чёрная левая диагональ» - приоритетная клетка для уничтожения найденная быстрым поиском вокруг лидера стаи в радиусе 60 клеток, паукотроны первым делом бегут именно в эту точку,

первая клетка зоны «чёрная коробка» - клетка для уничтожения найденные широким медленным поиском, паукотроны идут к ней если нет клеток зоны «чёрная левая диагональ»,

первая клетка зоны «чёрная стрелка на юг» - депо для ремонта и пополнения боекомплекта,

клетки зоны «красная стрелка на юг» - начальные точки для широкого поиска, перебираются в цикле и применяются для охвата поиском сложных форм рельефа.
1. Блоки №1 и 2 отвечают за выдачу ID лидера стаи и его координаты.

2. Блок № 1 в цикле Unit Scanner проверяет самочувствие паукотронов. Если здоровье менее 2000 хп, заряд батареи менее 30% или боезапас ниже 30 ракет, то на «проблемном» паукотроне цикл останавливается и выдается сигнал «L» (Load "то биш"), лидером стаи назначается «проблемный» паукотрон.

3. Блок № 2 при отсутствии «проблемных» паукотронов – с шагом ~3 сек осуществляет перебор первых семи паукотронов (можно настроить в сравнивающем комбинаторе, см. первую часть статьи, п. 7) и выдает лидера стаи.

ID лидера из блоков № 1 или 2 преобразуется Unit Scanner’ом в его координаты.

4. Чтобы не делать по паре лишних Tile Scanner’ов и Zone Controller’ов сделан блок № 3, который определяет режим работы сканеров (блоки № 4 и 5):
1 сек - режим 0: случайное сканирование клеток,
0.5 сек – режим 1: перебор уже отмеченных зон с затиранием зон, которые очищенны от гнезд и червей.

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

5. Блок № 4 выполняет «быстрый поиск» вокруг лидера стаи в радиусе 60 клеток (ну как быстрый, просто поле покрытия для поиска значительно меньше чем в блоке № 5). Работает в 2х режимах.
Режим 0 – радиус 60 клеток и координаты лидера,
Режим 1 – последовательный перебор первых 30 клеток зоны «чёрная левая диагональ» с выдачей их координат.

Эти данные поочередно подаются в Tile Scanner для определения наличия гнезд и червей. Далее уже по результатам наличия/отсутствия гнезд и червей производится маркировка клетки.

Тут замечу, что толковая реализация этого блока была проблемой № 1. Так при переборе клеток зоны «чёрная левая диагональ» если заново перемаркировывать зону, то первая клетка зоны начинает «мигрировать». При маркировке «поверх» она записывается последней, а первой клеткой зоны становиться вторая. Иногда это приводит к тому, что паукотроны стоят на месте, т.к. целевая клетка «крутится» вокруг них :-(

Решение вопроса состоит в пропуске промаркированных клеток с червями и ульями. Учитывая двухрежимную работу сканера, реализация этого ветвления мне очень тяжело давалась. Опять же в других схемах могут использоваться свои зоны и удалять эти зоны нельзя, так к примеру сканер в режиме 0 может запросто случайно удалить зону парковки, там же нету улья или червя, а это дополнительные проверки (комбинаторы) уже на тип зоны, пропуске клеток без червей и ульев и т.д. и т.п. Короче после часа попыток пыток «в подумать» я случайно нашел элегантное окологениальное простое решение уложившееся буквально в 3 комбинатора. Вообще, я был настолько поражен простотой решения, что под впечатлением собственно и надумал поделиться схемой с народом. На блоке № 4 реализацию этого решения я обозначил синим, её работу предлагаю изучить самостоятельно, она этого стоит, задание с двумя звёздочками.

При количестве зон «чёрная левая диагональ» больше 50 наблюдаются «провалы» в реакции стаи, поэтому они через логический костыль «рандомно вычищаются» куском блока № 5 ограничиваясь количеством 30 ед. (обозначено зеленым).

6. Блок № 5 работает идентично блоку № 4, просто выполняет широкий поиск в заданной дистанции и маркирует клетки зоной «чёрная коробка». Если вы установили несколько зон «красная стрелка вниз», то начальные точки поиска эти зоны. За счёт размещения зон «красная стрелка вниз» можно охватывать поля сложного рельефа пятнами поиска.

Для удобства в блок размещена реализация очистки всех клеток установленной зоны (обозначено зеленым). Иногда ищешь эту «красную стрелку на юг» чтобы переставить и не можешь найти куда её последний раз воткнул. Вот это как раз для таких случаев.


7. Блок № 6 определяет, что делает стая. Используемые сигналы по порядку приоритета:
L – следование к первой клетке зоны «чёрная стрелка на юг» - парковка,
В – следование к первой клетке зоны «чёрная левая диагональ»,
А – следование к первой клетке зоны «чёрная коробка»,
Если все сигналы равны 0, выдается сигнал L.

Синяя область – Zone Scanner’ы выдают координаты первых клеток зоны «чёрная левая диагональ» и «чёрная коробка», которые подаются в блок расстановки приоритетов между А и В (зеленая область). Под красной областью узел выдает координаты первой клетки зоны «чёрная стрелка на юг».

В зависимости от управляющего сигнала блок выдает координаты следования для лидера.

8. Блок № 7 быстро перебирает всех паукотронов на карте, если паукотрон не лидер, то выдает координаты лидера, если лидер –координаты следования из блока № 6. ID паукотронов и координаты «скармливаются» в Unit Controller.

8*. Внимательные зрители могут обратить внимание, что в блоке № 5 имеется очистка всех клеток зоны «чёрная левая диагональ» раз в 5 мин. Это сделано для того, чтобы стая пореже возвращалась «дочищать рядом обнаруженное, но оставленное далеко позади так как скопления ульев могут перекрываться, и стая не успела зачистить одно скопление как нашла и зашла на следующее», беготни стае и так хватает :-)
6.   Подведение итогов
В общем, как-то так все это и работает. Что хотелось бы добавить, важно понимать, что на демо-видео автомат «работает с идеальными конями длинной один метр и весом один килограмм в сферическом вакуме». «На земле» обычно все не так задорно и заморочки с отладкой и настройкой параметров неизбежны.

Для зрелищности на демо-видео у нас присутствуют бронированные жуки, но еще там же присутствуют ещё «прокаченные» ракеты и лазеры, и минимум воды на карте. Да и то, на демо-видео с танцевальной музыкой нашей стае гопников экологи чуть «не дали за щеку», а потом при эвакуации стая еще как на зло «с позором запуталась даже не в трех, а в одной маленькой лужке», так что пришлось его величеству автору вмешаться лично (на демо-видео № 2 момент "тупника" с 21:35).

«На земле» ракеты и лазеры, у Вас могут быть слабее, через чур много больших луж и т.д. и т.п. Например, я пытался «поиграться» с автоматом на своём сохранении с модами Space Exploration и Krastorio 2. Из-за особенностей механики модов ракеты с пачкой паукотронов там тупо не работают, а лазеры жрут электроэнергию так, что стая бегает на подзарядку после встречи 2-3 ульев и процесс вроде бы и идет, но «в час по чайной ложке», а шанс что дорогостоящая стая «возьмет за щеку» он конечно низкий, но не нулевой. Ну вы сами знаете, критические ситуации развиваются по экспоненте, вот смотришь «вроде все ок, процесс прёт», моргнул, стаю уже доедают... По итогу думаешь: «Че за балет я ставлю уже третий час? Где мой старый добрый арт-поезд, ему тут на 5 минут работы?».

Теперь пройдемся по реализации логики в автомате, тут работает простое правило: чем проще и быстрее узел – тем лучше, "бороться" приходится буквально за каждый такт. Качество? Кому нужно качество, если скорость в мире Факторио главная защита. Остановился = помер, никакой щит не поможет. Да, можно построить ветвистое решение на все случаи жизни, но потом, когда вы выпускаете свою стаю сдавать практический экзамен нашим экологам, то они за любую цепочку принятия решений длиннее трех комбинаторов сообщают: «Тебя оценили и признали ничтожеством». И начинают штрафовать паукотроны как у «профнепригодного».

Скорость логики у игры всего 60 тактов в секунду, и из-за такого быстродействия медленнодействия вытекают проблемы циклопических размеров по организации непрерывного, оперативного и бесперебойного управления стаей логическим автоматом. Чтобы примерно осознать их масштаб приведу пару примеров:

Например, блок № 1 не может перебирать паукотронов для поиска «проблемных» быстрее чем 4-5 тактов, для стаи в 20 штук «пощупывание» всех паукотронов занимает 5 * 20 = 100 тактов или ~2 секунды игрового времени. В самом наихудшем сценарии учитывая время прохождения управляющего сигнала на эвакуацию по тракту блоков № 6 и 7 сама команда «L - следование в зону паковки» дойдет до Unit Controller’а к концу третьей секунды. Еще три секунды ваша стая «слоупоков» будет выполнять разворот в строну базы. Не факт, что они туда доползут в составе, который был на момент принятия решения на эвакуацию…

Или взять блок № 5,  для установленного радиуса поиска в 500-700 клеток для карты с установками «600% размеры и 600% частота скоплений ульев» через 10 минут работы сканера у нас будет порядка ~5к зон «чёрная коробка», их надо оперативно перепроверять и удалять уже очищенные от ульев и червей. Очевидно, что на один проход ~5к зон для удаления зачищенных стаей клеток зоны будет необходимо «всего лишь каких-то» ~100 секунд… А если проверять только первую клетку зоны, то момент обнаружения зоны, с которой надо снять марку, «спешит» от самого момента перемаркировки на ~10 тактов, эти 9 тактов сканер находится в режиме «простоя», ваша стая тоже в режиме «простоя», а наши членистоногие друзья экологи нет...

Приходится две минуты "на проход проверки наличия отсутствия зачистки" зоны через костыль сворачивать в 3 секунды, плюс в зачистке очищенных зон помогает блок 4 в режиме 0. Этим обусловлены редкие некритичные  "простои" работы автомата, они происходят вдали от скоплений и не превышают 3-5 секунд.

Или взять п. 7 второй части поста (там про число сменяемых лидеров стаи), казалось бы, что мешает взять значение «звездочка» из блока № 1 (да даже тупо поставить постоянный комбинатор и забить туда N=7), все подать в комбинатор умножить N на 200 и уже в сравнивающем комбинаторе исправить условие "A < 1500" на "A < N", так же по уму, да? Вообще да, но на самом деле нет! Я так и сделал поначалу. Но диверсант-комбинатор с условием "A > N" c огромным удовольствием может посреди замеса «встать колом» или «начать трусится в эпилептическом припадке» подвешивая весь автомат, 10 сек и гг – ваш молл делает новые 20 пауканов и модули к ним... Этот далеко неочевидный нерегулярный «баг» вызвал очень неприятное удивление и попортил мне много крови, «Факторио мэджик» одним словом.

Учитывая вышеизложенное (и ключевые недостатки, отмеченные ранее в первой части статьи) очевидно, что инженерное проектирование логического автомата с приемлемой скоростью принятия решений на имеющейся элементной базе нетривиальная задача. Неудивительно, что логический автомат изобилует «костылями», оптимизацией всего чего только можно и нельзя, и отказывается «работать из коробки», часто требует доводки с настройкой (да-да, и в логике Факторио не обошлось без руки эффективного менеджера, увы). Поэтому, к сожалению, использовать автомат как рабочий инструмент тяжеловато, а вот поиграться вполне можно. К нашему сожалению...

Кста, а вы в курсе, что сами моды не отличаются стабильностью? Я про это упоминал, например после получаса четкой работы сканер юнита или зоны запросто может принять волевое решение "отдохнуть"  минуту-другую, т.е. выход тупо не работает, даже провод "накинуть" нельзя, шок! :-( Ну теперь вы в курсе, ваши дохлые пауканы кста тоже... Грустно.
Эпилог
Некоторое количество клеток зоны «чёрная коробка» уже имеется, посему запускаем любимую музыку, включаем видео на запись, садимся в паукотрон, на паукотроне не забываем включить режим «Only AI» и жмем главную кнопку автомата. Даже созерцание работы самого автомата завораживает, по миганию лампочек комбинаторов примерно понятно какие решения он в данный момент принимает, конвеер крутится –ресурсы мутятся.

Теперь ждем окончания музыки – поздравляю, Ваш личный скринсэвер готов.

На этом архитектор фабрик Холдмайбир доклад окончил, берегите себя и свою фабрику, всем спасибо и до новых встреч, пока.
П.С.: В ходе полевых испытаний я дорабатывал и чуть изменял автомат и его параметры уже после написания поста, поэтому картинки, представленные в посте, сами схемы и их параметры могут несколько отличаться от видео и картинок в посте. Лень переделывать, да и принцип работы блоков я не трогал, так что пусть в посте все остаётся как было, истинные ценители разбираться в чужом коде в нагороженных мною дебрях думаю разберутся.

На всякий случай, вдруг кто-то не допонял или не может «въехать как тут шо и куды сувать и тыкать» держите сэйв с уже готовой станцией и 20 снаряженными пауканами, играйтесь - автомат готов к труду и обороне, запускается все комбинатором внизу слева, там же сами схемы.