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