Статья про тонкости игрового процесса в игре Factorio.
В этой статье поговорим об использовании интервального триггера в Factorio.
Предисловие
Оказывается, не все игроки Factorio понимают, как сделать мягкое ограничение «не больше стольки и не меньше стольки» в схемах, где происходит регулировка жидкости или сборка предметов или имеется контроль электроэнергии. Казалось бы, всё просто: сливай жидкость, если она превысила максимум, и начинай снова доливать жидкость, если она опустилась ниже минимума. Но как это реализовать, если между минимумом и максимумом есть целый интервал значений? А, тем более, как это реализовать, если требуется такое ограничение использовать как триггер для включения/выключения в другой схеме? Как «ловить» эти минимум и максимум, и как по ним создать срабатывание?
Картинок будет мало, рассуждений много. Выключайте внешние раздражители, сосредоточьтесь на чтении и понимании.
Триггер интервальный «на пальцах»
На самом деле, всё что дальше будет рассказано, вам уже наверняка известно. И в игре, скорее всего, вы уже это использовали. Может сами делали, а может брали чужие готовые чертежи. Например, это включение/выключение электростанции, которая работает параллельно массиву аккумуляторных блоков. Пока есть заряд в аккумуляторах (или работают солнечные панели), электростанция выключается и простаивает. Как только заряд аккумуляторов проседает до разрешённого минимума, электростанция включается и запитывает всю базу, возможно, она же и заряжает аккумуляторы.
Я когда-то написал статью о том, как в Factorio включать/выключать электростанцию. Вот ссылка на неё. Тогда в игре ещё не существовало возможности использовать 1 сравнивающий комбинатор для задания нескольких условий. Поэтому принцип работы был описан для 3 комбинаторов.
В той статье на картинке 6 довольно понятная иллюстрация работы электростанции через RS-триггер. А на картинке 18 в той статье очень точно изображён принцип работы RS-триггера. В той же статье, на картинке 19 уже разобран сам принцип интервального RS-триггера, который использует не сигнал, а интервал значений между минимальным сигналом и максимальным сигналом при ожидании разряда и заряда аккумулятора до установленных значений. При желании, перейдите по указанной ссылке и рассмотрите картинки со схемами внимательно. А мы продолжаем.
В различных схемах интервальным триггером могут называться устройства, срабатывающие через определённый интервал, или проверяющие условие через определённый интервал, или выдающие ключевой сигнал через определённый интервал, если условие выполнено. Так же, вне пределов игры Factorio существуют различные версии интервального RS-триггера в электронике и механике, это и триггеры Шмитта и другие триггеры, работающие на основе гистерезиса. В них, в зависимости от схемы, могут быть различные варианты срабатывания на граничных значениях, замыкания контактов, передачи сигнала. Нас интересует только интервальный триггер на основе RS-триггера в игре Factorio.
Интервальный триггер — это устройство, срабатывающее по сигналам или заданным условиям на границах определённого интервала — минимуму и максимуму. То есть, в нашем случае интервальный триггер будет срабатывать при достижении каким-то значением минимума или максимума, а в соответствии с настроенными условиями выполнять определённые действия.
В чате моего Телеграм-канала среди прочих, лежит мой чертёж «Сборщик манипуляторов», который я опубликовал наряду с другими своими подобными чертежами сразу после выхода второй версии Factorio. К чему я заговорил об этом? Я хочу выдернуть из того сборщика манипуляторов один сравнивающий комбинатор для примера и разобрать его работу в статье. Если вас не интересует сам чертёж, можете не искать его, я сейчас просто обозначу главные принципы работы и связь комбинатора с чертежом и темой интервального триггера.
Теория
Например, у нас на фабрике уже есть производство обычных жёлтых манипуляторов, они собираются для создания зелёного логистического исследовательского пакета (ИП). А нам, например, нужно создавать дополнительно красные длинные манипуляторы, синие быстрые манипуляторы, зелёные массовые манипуляторы. Не будем же мы забирать из производства часть жёлтых манипуляторов и нарушать цепочку создания логистических ИП чтобы создавать более продвинутые манипуляторы. Поэтому забирать оттуда не вариант. Вариант — сделать отдельное производство. И, либо делать конкретное большое производство в промышленных масштабах, либо сделать эдакий «сборщик всего», но в манипуляторной версии — «Сборщик всех манипуляторов». Для статьи мы выбираем второе.
Более продвинутые манипуляторы создаются путём использования предыдущих манипуляторов с добавлением новых ресурсов. Значит, можно создавать жёлтые, из них красные и синие, из синих зелёные (кто посетил планету Глеба, тот из зелёных массовых будет создавать белые пакетные). Цепочка идёт по возрастающей. Таким образом, всё будет работать на одном сборочном автомате со сменой рецептов. После накопления нужных манипуляторов, они будут перерабатываться в более продвинутые. Но затем снова будут создаваться чтобы восстановить израсходованный объём манипуляторов. Необходимо определить некий «баланс», при котором сборщик будет считать, что манипуляторов определённого типа стало меньше нормы и пора их собирать, а при достижении определённого количества решит, что достиг нормы и можно переключиться на другой тип манипуляторов. То есть, нужно 50-75 штук, где при уменьшении меньше 50 сработает «минимум» и начнётся производство, а при достижении 75 сработает «максимум» и производство остановится. Но из этих 75 штук можно будет забирать для другого производства пока снова не опустится ниже 50 штук.
Интервальный триггер здесь будет очень кстати. К тому же, в этой статье он будет собран всего лишь на одном сравнивающем комбинаторе. Но для начала опять теория. На рисунке ниже показаны этапы входа в комбинатор любого сигнала, тут конкретно выбран сигнал S, и обработка условий, настроенных в комбинаторе. Схематично показаны переходы сигнала на выход и на красный сигнальный провод для зацикливания.
На всякий случай, давайте пройдёмся по рисунку вместе.
🔸Допустим, что сигнал S был пустой и комбинатор не выполнял условий и не выдавал S на выход. Но вот сигнал S поступил на вход и выполнил первое условие, где он меньше минимума (закрашено зелёным). Там же он выполнил первую часть второго условия (которое через оператор ИЛИ), но оно не сработало, так как вторая часть этого условия не выполнена (не закрашено). Раз первое условие выполнено — сигнал S прошёл на выход. Он же сразу пошёл по зацикленному красному сигнальному проводу обратно на вход.
🔸В следующем, втором этапе, вернувшийся по красному проводу сигнал S снова пришёл на вход. Теперь выполняется и первое условие (закрашено зелёным), где S меньше минимума, и второе условие (закрашено зелёным и красным), где S меньше максимума И сигнал S больше нуля. Из-за любого из двух условий сигнал S проходит на выход.
🔸На третьем этапе произошло наполнение минимума и первое условие больше не срабатывает (не закрашено), так как S уже не меньше минимума. А вот второе условие продолжает работать, так как S всё ещё меньше максимума (закрашено зелёным), и зацикленный S по красному проводу продолжает поступать на вход (закрашено красным). Поэтому на выход по-прежнему идёт сигнал S.
🔸В конечном этапе сигнал S наполняется и превышает и минимум, и максимум. Первое условие не срабатывает (не закрашено). Первая часть второго условия тоже не срабатывает (не закрашено). А пришедший по красному проводу сигнал S ничего не даст во второй части второго условия. Поэтому второе условие тоже не выполняется (не закрашено). Сигнал S больше не идёт на выход.
🔸На рисунке 1 не показан процесс уменьшения сигнала S. По сути, это выглядит очень просто: хоть S и становится меньше максимума, но для срабатывания условия не хватает сигнала S из зацикленного с выхода на вход комбинатора красного провода. Значит на выход S не проходит. Пока S не опустится ниже минимума, ничего срабатывать не будет, на выход сигнал S не поступит.
Такой диапазон работы — включение только при снижении до минимума и выключение при достижении максимума — это и есть тот самый принцип работы внутри интервала значений по граничным условиям. Обычно в механике такие устройства не дают контактам бесконечно включаться/выключаться при минимальных колебаниях значений. В нашем случае это не даёт устройствам срабатывать/отключаться при колебаниях значения S каждый игровой тик.
Практика
Переходим к практическому исполнению интервального триггера. Для всех, кто внимательно посмотрел и прочитал сказанное выше, но всё равно ничего не понял, или сомневается: понял или нет — на живом примере всё это закрепим.
Поставили сборочный автомат. К нему подвели все ресурсы для жёлтых, красных, синих, зелёных манипуляторов. Осталась задача: создавать из всего этого сначала жёлтые, затем из них остальные манипуляторы по очереди.
Понятно, что готовую продукцию будем выкладывать в сундуки. Например, в красные пассивного снабжения. Понятно, что рецепты будут меняться автоматически после изготовления определённого количества манипуляторов. Понятно, что в сундуках необходимо накапливать определённое количество манипуляторов с запасом. Это нужно чтобы дроны могли прилетать и брать манипуляторы нужного типа, когда требуется для строительства.
Теперь важно: дроны будут забирать манипуляторы, например жёлтые, и они будут заканчиваться. А ещё дроны будут забирать красные манипуляторы, и они тоже будут заканчиваться, и сборщик будет делать их из жёлтых, которые тоже будет забирать. Жёлтых манипуляторов станет меньше указанного нами минимума. И вот тут начнётся волшебство: сработает интервальный триггер. Сборочный автомат получит сигнал, что не хватает жёлтых манипуляторов и поставит этот рецепт. Начнётся изготовление и пополнение в сундуке. Пока не будет создано установленное нами максимальное количество манипуляторов, автомат будет работать. Он превысит минимум и наполнит сундук до установленного максимума. Затем рецепт отключится.
И, о, чудо! Интервальный триггер не даст бесконечно срываться сборочному автомату с изготовления красных манипуляторов на изготовление жёлтых манипуляторов, до тех пор, пока жёлтых манипуляторов не станет меньше установленного нами минимума.
То есть, красные манипуляторы будут изготавливаться из жёлтых, жёлтые будут уменьшаться, но ничего не будет происходить. Как красные создавались, так и будут создаваться. Рецепт сменится на жёлтые, как мы уже поняли, только при уменьшении их количества ниже минимума.
Точно таким же образом создадутся синие манипуляторы из жёлтых. Иногда рецепт будет меняться и жёлтые будут пополняться до установленного максимума. Затем снова смена рецепта и продолжение работы над синими манипуляторами. Когда они будут изготовлены до установленного максимума, сменится рецепт на зелёные манипуляторы. Сначала они истощат запасы синих манипуляторов, запустится их изготовление. Затем истощится запас жёлтых, и запустится их изготовление. Затем снова создание синих, и опять изготовление зелёных манипуляторов.
При этом, дроны могут использовать накопленные в сундуках манипуляторы для строительства. Кстати, не забудьте рядом с красными сундуками пассивного снабжения, предназначенными под каждый вид манипуляторов, поставить жёлтые сундуки хранения с установленным фильтром нужного манипулятора. Все манипуляторы, снесённые или заменённые дронами на фабрике, будут укладываться в эти сундуки, и затем, манипуляторами перемещаться в основные красные сундуки, пополняя или даже превышая запас манипуляторов этого типа. Почему жёлтые сундуки хранения, спросите вы? Потому что в начале игры они доступны. А потом и нет смысла ставить синие сундуки запроса, дроны всё равно будут приносить отработанные манипуляторы в соответствии с фильтром жёлтых сундуков.
❗️ Для тех, кто не понял, как автоматически будут меняться рецепты, и почему из жёлтых будут делаться красные и синие манипуляторы, а затем зелёные из синих манипуляторов, делаю пояснение. В Factorio все сущности имеют свой ID. Таблица предметов располагает их от первых до последних по порядку. Если вы когда-нибудь открывали окно предметов через клавишу «E», то наверняка видели, как последовательно в игре расположены все ресурсы и предметы от левого верхнего угла слева направо, и сверху вниз по строчкам. Сначала первые, в конце последние. Вот такую последовательность и соблюдает сборочный автомат, когда выбирает первоочередной рецепт. Из манипуляторов всех типов, он сначала выберет жёлтый. Когда жёлтый будет обеспечен выше установленного нами максимального значения, жёлтый манипулятор должен пропасть из списка манипуляторов (зависит от вашей логики в схеме). Логика уберёт жёлтый манипулятор из списка, поэтому следующий по списку окажется красный манипулятор, он же и будет создаваться, затем придёт очередь синего манипулятора.
Ну, вы поняли, они идут друг за другом. При всём при этом, они же изготавливаются по принципу более сложных манипуляторов из более простых, уже изготовленных ранее. Например, по похожему принципу мы можем изготавливать модули сначала 1 типа, затем 2 типа, затем 3 типа. Ну, или конвейеры, или что-то ещё, на что хватит вашей фантазии и возможностей игры.
Итак, сигнал S из предыдущего примера заменим реальным сигналом. Это будет сигнал обычного жёлтого манипулятора. Вот как в работающем сравнивающем комбинаторе должно всё выглядеть:
Как видно из картинки 2, все сигналы в условиях работают или по зелёному проводу, или по красному. И эти сигналы не должны смешиваться. То есть, входящий в комбинатор сигнал идёт по зелёному, значит по зелёному проверяется в условии. Зацикленный сигнал выходит в красный и возвращается по красному, поэтому и проверяться в условии должен по красному проводу.
Теперь снова разжуём информацию о работе интервального триггера в сборщике всех манипуляторов по порядку:
🔸Мы задали количество разных манипуляторов, которое необходимо собирать на сборщике путём смены рецептов. Обязательно указали необходимое минимальное количество манипуляторов и максимальное количество для некоторого запаса.
🔸Мы подвели все необходимые ресурсы.
🔸Мы сделали так, чтобы готовые манипуляторы выкладывались в отдельные сундуки, но при необходимости могли обратно закладываться в сборочный автомат.
🔸Наша схема подаёт на сборочный автомат список манипуляторов, которые необходимо сделать. Список формируется из отдельных сравнивающих комбинаторов, каждый из которых работает для «своего» типа манипуляторов по принципу интервального триггера. Сборочный автомат выбирает первый по списку (жёлтый) и ставит рецепт.
🔸Сборочный автомат изготавливает жёлтые манипуляторы до тех пор, пока в сундуке их не окажется больше установленного нами максимума. Интервальный триггер жёлтых манипуляторов перестаёт подавать сигнал жёлтого манипулятора в общий список.
🔸Жёлтых манипуляторов стало больше максимума, они исчезают из списка, красные манипуляторы занимают их место в списке и становятся первыми, сборочный автомат теперь их устанавливает в рецепт.
🔸Сборочный автомат берёт необходимые ресурсы и уже изготовленные жёлтые манипуляторы, и из этого создаёт красные манипуляторы, на которые сейчас установлен рецепт.
🔸Жёлтых манипуляторов в сундуке становится меньше минимума. Интервальный триггер в сравнивающем комбинаторе включает сигнал жёлтого манипулятора и передаёт в очередь на изготовление.
🔸Сборочный автомат видит предыдущий рецепт снова в списке на первом месте, меняет рецепт на жёлтые манипуляторы и начинает изготовлять их, пока они снова не превысят максимум в интервальном триггере и он не выключит этот сигнал.
🔸Сборочный автомат снова видит первыми в списке красные манипуляторы и начинает изготавливать их дальше. Красных манипуляторов становится больше максимума в интервальном триггере сравнивающего комбинатора, отвечающего за красные манипуляторы, и он отключает этот сигнал.
🔸Сборочный автомат видит, что теперь на первое место в списке переместился синий манипулятор. Устанавливает рецепт, и начинает изготавливать по нему.
🔸Жёлтых манипуляторов становится меньше установленного нами минимума и интервальный триггер включает сигнал жёлтого манипулятора.
🔸Дальше всё идёт по уже описанному выше сценарию, где сборочный автомат сначала создаёт жёлтые манипуляторы чтобы пополнить их запас, затем снова продолжает делать синие манипуляторы и так далее...
В итоге, все манипуляторы делаются друг за другом, используя манипуляторы предыдущего типа для сборки, но периодически пополняя их, если количество тех опускается ниже минимума. Точно также, во время работы сборщика может сработать интервальный триггер любого манипулятора, который унесли дроны. Тогда сменится рецепт и запас этих манипуляторов сначала будет пополнен, а уже затем продолжится сборка других манипуляторов. Соответственно, на каждый отдельный рецепт манипулятора необходимо установить свой сравнивающий комбинатор с интервальным триггером. Если в нашем примере изготавливаются 4 вида манипуляторов, то на каждый из них нужно установить по отдельному комбинатору с соответствующим сигналом манипулятора, итого: 4 комбинатора.
Итог
Визуально более простой вариант RS-триггера из трёх комбинаторов, используемый ранее для контроля электрического заряда аккумулятора, описанный в начале статьи, далее превратился с нашей помощью в более сложный по настройкам, но более простой, по сути, интервальный триггер на одном комбинаторе. Теперь, с помощью этого интервального триггера на 1 сравнивающем комбинаторе можно построить контроль заряда аккумулятора, сэкономив место в плотной постройке электростанции.
Этот же интервальный триггер можно использовать для изготовления предметов с запасом, не позволяя схеме включаться без надобности лишний раз. Например, как в сборщике манипуляторов из примера в этой статье. Этим же интервальным триггером можно регулировать слив лишней жидкости или её наполнение в резервуаре. Пополнение сундуков ресурсами. И так далее, везде, где вам требуется интервальный баланс в пределах «от» и «до».
Чертежи
К этой статье нет чертежей, но при желании читатель может перейти в мой Telegram-канал, там открыть ссылку на группу чатов, и в чате с чертежами по поиску отыскать тот самый мой «сборщик манипуляторов» из которого я брал сравнивающий комбинатор для примера.
-----------------------------------------
Ссылка на мой канал в Telegram: https://t.me/format_aa
☕️ Если вы хотите угостить меня кофе или вкусняшкой за старания, сделать это можно с помощью доната: https://boosty.to/format_aa/donate
-----------------------------------------
Подпишись на канал «Формат АА» и узнавай больше +
#Формат_АА
#Factorio
#схема
#чертежи
#логика
#автоматизация
#сравнивающий
#комбинатор
#RS
#триггер
#интервальный