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