Prison Architect

Prison Architect

79 ratings
Схемы. Память, счётчик, хитрый шлюз. Для продвинутых архитекторов.
By LongBowDwarf
Год с лишним назад некто noflew написал небольшой гайд по электронике в игре и предложил другим последовать его примеру.
Чтож, noflew... наверное, лучше поздно, чем никогда.

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

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

Я надеюсь, что вместе мы придумаем больше применений для таких замечательных инструментов.
   
Award
Favorite
Favorited
Unfavorite
Освежаем в памяти
Как работают гейты в целом.
Если Вы уже знаете, не задерживаясь переходите к следующему разделу.
А для начинающих, я напомню.

Предмет, который нам нужен в игре называется "логическая схема". Он стоит 100$, не нуждается в энергии от кабелей, зато к нему можно подсоединять провода (так же как к камерам от пульта наблюдения, например). Если Вы, соединяя провода, сначала щёлкаете на логическую схему 1, затем на схему 2, то выходной сигнал первой схемы станет входным второй.

У схем много режимов работы, которые переключаются нажатием правой кнопки мыши по схеме (для этого стоит выйти из режима подключения проводов).

Схемы в игре принимают неограниченное количество входов, проводят над ними логическую операцию и посылают сигнал во все свои выходы. Один и тот же сигнал, конечно. Какой именно сигнал посылает в данный момент схема можно понять по цвету лампочки на ней.

Красный - 0 или false, ложь.
Зелёный - 1 или true, истина.

Далее я перечисляю, в каких случаях схема посылает сигнал 1, зелёный:
  • AND - все входящие сигналы истинны
  • OR - хотя бы один из входящих сигналов true
  • NOT - ни один из входящих не true. Все false.
  • NAND - and после которого not. Если все входящие true, то false, а во всех иных случая - true.
  • NOR - в данной игре - синоним not. Или, точнее, not здесь синоним nor.
  • XOR - если один из входов true, а остальные false.
  • = принимает сигнал от логического моста и повторяет его.

Если не понятно, рекомендую поискать другое руководство, где именно на этом будет весь акцент.
Теперь, наконец, можно перейти к основной части.
Бит памяти
Мне даже странно, почему о такой простой и такой важной вещи больше никто не написал. Или я плохо ищу?

Оговорюсь сразу, это новая версия памяти, есть шанс, что что-то работает не идеально. Раньше я использовал другую, гораздо более медленную. в случае архитектора - чем медленнее, тем надёжнее.

две логические схемы подключены друг к другу, как показано голубыми стрелками,
рубильник справа - вход,
рубильник сверху - сброс.


схемы продолжают подавать сигнал true даже после того, как входной сингал погас. Это будет продолжаться до тех пор, пока по каналу сброса не поступит сигнал false. Конечно, во всё остальное время он должен оставаться true.
Вот пример работы

Подаём входной сигнал, память теперь выдаёт TRUE

Отключаем входной сигнал, память всё ещё передаёт TRUE, в чём её суть и есть.

Память сохраняется до тех пор, пока сброс не станет false. Выключаем верхний рубильник:

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

Считывать содержимое памяти можно с равным успехом с AND или с OR. Разница есть, но о ней позже.

Честно признаться, в отличие от всех остальных схем, о которых я буду говорить сегодня, не думаю, что память можно упростить дальше.
2 логические схемы содержат один бит данных, рубильники мы, конечно, на самом деле использовать не будем.
Простейший таймер
Через каждый элемент в игре сигнал проходит с некоторой задержкой, причём, если в случае с логическими схемами эта задержка невелика (условно будем считать её равной одному тику игры), то вот индикаторы загораются и тухнут гораздо дольше. Особенно тухнут.

По какой-то причине разработчики посчитали, что терять сигнал индикаторы должны в полтора-два раза медленнее, чем они его получают. С этим связаны некоторые хитрости в игре, но пока о другом.

Простейший таймер задержки, как всем и понятно, представляет из себя несколько последовательно соединённых индикаторов.

Не буду останавливаться на этом надолго, тут и так всё понятно.

Я собрал квадратик из индикаторов и добавил схему NOT, чтобы хоть какое-то действие происходило.



Соединил их все, начиная с логической схемы. Как-то уж слишком удачно я нажал паузу - последняя лампочка индикатора уже горит, но ещё не успела изменить состояние NOT. через мгновение NOT потушит первый индикатор.



И постепенно волна пойдёт дальше.

Когда погаснет последний, NOT снова загорится зелёным и запустит противоположную волну.

Циклический процесс.

Задержку можно увеличивать или уменьшать, изменяя количество индикаторов, вовлечённых в процесс.

Конструкций подобного рода таймеров вообще очень много и представленная здесь ничем не лучше других.
Я ужасен в форматировании руководств
Особенно, когда это касается картинок.

Просто решил уточнить, вдруг кто-то не заметил.
Короткий импульс
Идеально было бы, если бы он длился 1 игровой тик, но в этом я не уверен.

Опять таки, стоит оговориться - импульсы в игре работают странновато. То всё нормально, а то вдруг - нет. Несколько раз убеждался, что одна и та же схема может работать или не работать в зависимости от того, где именно расположены её элементы. Чертовщина какая-то, конечно, но я проверял по несколько раз, разбирал всё и собирал вновь, убеждался что порядок везде одинаков, но двумя клетками правее схема работает, а эта - нет.

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

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

Вообще, думаю, это как-то связано с тем, в каком порядке логика игры обрабатывает логические схемы. Хотя чего я лезу в то, чего совсем не знаю? Возвращаясь к теме - короткие импульсы.

Сигнал идёт из рубильника наверх оба NOT, каждый из них передаёт сигнал в схемы по сторонам.

Так выглядит наш генератор импульса. Конечно, чаще всего достаточно одной его половины, левой или правой. Сейчас объясню.

  • Рубильник снова эмулирует вход.
  • В момент (!) когда его положение меняется с выкл на вкл существует коротенькое мгновение, когда первый NOT уже изменил зелёный цвет на красный, а следующий за ним - ещё не успел сделать обратного.
  • Логично предположить, что NOR расположенный слева, только этого мгновения и ждал. Он успевает мигнуть зелёным, пока оба NOTа красные.
  • Когда же рубильник выключается, происходит обратное. Нижний NOT ещё не успел передать скверную новость верхнему,
  • а этого момента ждал AND справа. Он успевает коротенько мигнуть зелёным, пока оба NOTа выдают зелёный true.

Для разных случаев может пригождаться разное, мне пока хватало сигнала на включение.
3 схемы и у нас есть генератор очень короткого импульса. Если есть варианты проще, был бы очень рад услышать.
Счётчик
Вот мы и пришли к тому, ради чего я тут рассказываю о памяти, коротких импульсах и прочем.

Честно сказать, достойного применения счётчику я пока не нашёл. Да, я применяю его для своего хитрого шлюза, который отрезает процентов 95 засекаемой контрабанды, но при большом желании тоже самое можно было бы сделать просто огромной вереницей гаснущих индикаторов. То есть просто раздув до безобразия таймер, который я выше назвал примитивным.

Но согласитесь, это же веселее, когда ты научил какие-то лампочки в игре считать до 15!)

Больше 15 мне пока не пригождалось, но, конечно, всё это легко масштабируется, добавлять регистры - идеально просто, когда есть первые 2.
чтобы записать число 15 нужны 4 бита памяти.



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

Вот смотрю я на эту схему и думаю, проста она как лапоть. Только это мне так кажется потому, что я уже потратил на неё уйму времени и драгоценных (ввиду своей дефицитности) мозгов.

Вам, по-крайней мере, многим из Вас, наверняка так не кажется.

Чтобы не сливалось цветом проводов, пришлось использовать совсем уж странные краски, вон розовенький даже.

жёлтым показан наш примитивный таймер, сокращённый донельзя. путём нехитрых рассчётов я узнал, что NOT загорается примерно 1 раз в 1,34 игровых минуты. Может на ваших компьютерах будет чуть иначе.

Зеленый - опять таки старый знакомец. Генератор короткого импульса. Он попросту рубит сигнал от таймера, превращая его в очень короткую вспышку.

Розовым цветом помечен первый бит памяти. Он содержит единицы. Как видите, от ячейки памяти (от OR) отходит провод, который должен зажигать лампочку, когда память содержит законсервированный сигнал.

Сигнал в память приходит, естественно, от генератора импульса (зелёный), от его NORа.

а вот левее нашей первой ячейки памяти расположены вспомогательные элементы.

Если память уже содержит единицу (самый правый индикатор горит), а генератор импульса решил добавить ещё одну, то ответ должен быть 2, что в двоичной системе записывается как 10.
(чёрт, надеюсь ни для кого не стало новостью, что тут всё будет двоичным, я как-то забыл упомянуть раньше)
10 обозначает, что в следующий регистр должна пойти единица, а регистр единиц должен обнулиться.

За это условие у нас отвечает AND который в красной рамке. В него идёт сигнал от лампочки и генератора. Если оба TRUE значит в правом регистре 1, а генератор добавляет ещё 1.

В таком случае он подаёт сигнал в следующую ячейку памяти (в нашем случае - второй регистр справа), а свой (через NOT, который чуть выше) очищает.
NOT служит тем самым рубильником сверху, который отключает память.

Знаю ли я, что можно использовать XOR вместо AND в ячейке памяти и таким образом избавиться от излишнего NOT? в целом, знаю, но на практике мне это не очень то удалось. почему-то, когда я пробовал собрать такую цепь, она капризначала. Вела себя то как подобает, а то - совсем иначе. Похоже это как-то связано с задержками в подаче сигналов, приходится для одних случаев использовать именно чётное количество логических схем в цепи, а для других - именно нечётное.
Я даже понимаю, что такая цепь примерно на четверть дешевле и компактнее.


Мне хотелось бы упростить цепь, но пока я не нашёл способа, как это сделать.

Возвращаясь к теме - дальше всё совершенно одинаково. Если сигнал, который заполняет этот регистр приходит тогда, когда регистр уже полон - его нужно очистить и попрообвать заполнить следущий. каждый новый регистр удваивает вместимость счётчика. С помощью 10 уже можно будет считать до 1024.

Только кому это нужно? а это уже следующий, не менее интересный вопрос. Ответ на него мне придётся писать завтра.
Небольшое отступление
Думаю, всем прекрасно понятно, что большого желания писать дальше руководство в пустоту нет.
Раз уж взялся рассказать про свой чуть-чуть хитроватый шлюз, про него расскажу, а все более сложные вещи - вроде улучшеной тоннельной сигнализации и значительно более сложного, но гораздо более эффективного шлюза - оставлю на потом.

Если хоть кто-то заинтересуется, напишет комментарий - это одно дело, а вещать на мёртвом форуме - другое.

Шлюз для отсечения контрабанды.
Можно найти немало информации о шлюзах в игре и их исключительной полезности.

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

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

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

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


Логичным (как по мне) решением стало желание сделать шлюз на временных интервалах.

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

Остались две проблемы - шумящие круглые сутки двери и незакрывающиеся из-за препятствий двери.
Первая решается установкой нажимных плит, все они подключены к OR, OR подключен к AND, и только оттуда идёт провод к той или иной двери.
Таким образом, двери начинают свою работу только если хотя бы одна из нажимных плит активирована.
Вторая решается ещё проще - вместо одной двери на входе и одной на выходе мы ставим "пакет" из трёх вплотную друг к другу там и там. Даже если две из них останутся открытыми из-за вовремя пробегающих персонажей, третья преградит путь. До сих пор я ни разу не видел, чтобы путь через шлюз был хоть на секунду открыт. Имею ввиду через оба пакета дверей.

Досмотр обязателен.

Таймер двери может работать от длинной очереди гаснущих фонариков или от счётчика с памятью.

Более умной версии, конечно, одних фонариков уже не хватает, там логика иная.
Зачем я это пишу
Повторю мысль упомянутого выше noflew: господа, давайте думать вместе, делиться инструментами и придумывать нечто действительно интересное.

Быть может удастся создать тюрьму, которая реагирует на действия игрока в режиме побега?
Или дополнить логику наказаний своими правилами?

Быть может однажды мы сумеем, используя 10 разных хаков (но не отходя от ванильной версии) заставить охранников обыскивать всех, кто идёт из мастерской (сейчас совершенно нечего противопоставить деревянной кирке - долго и муторно, но сбежать можно из любой тюрьмы) или комнаты свиданий (зажигалка невероятно опасна).

Хотелось бы надеяться, что не только мне это кажется забавным.

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

Прошу прощения за возможные ошибки, я не электронщик, едва-едва знаком со схемами подобного рода.

Пишите комментарии! Могу добавить скриншотов или выложить карту.

И да, вот, напоследок, счётчик, который считает в обе стороны:
29 Comments
Anxwi 19 Nov, 2021 @ 7:16am 
Эх, жаль. Такую схему думал сделать. Но спасибо за ответ :sad_pebble:
LongBowDwarf  [author] 19 Nov, 2021 @ 3:16am 
нет.

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

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

думаю, по этой же логике, дальше развивать это всё они не собирались.
Anxwi 5 Nov, 2021 @ 1:38pm 
С шлюзом понятно, а есть ли в игре возможность подключить всё это к металлодетектору? Мол, если срабатывает пикалка на детекторе - шлюз захлопывается для осмотра и изъятия.
woa 24 Jul, 2021 @ 12:38am 
Все очень хорошо, все очень спасибо, не волнуйся по поводу 4-ой главы, its not a real!
Yennefer of Vengerberg 12 Aug, 2020 @ 6:20am 
Еще хотелось бы скриншот этого шлюза, то есть где и как провода просоединить.
Тогда руководство было бы прекрасным :steamhappy:
LongBowDwarf  [author] 2 Jul, 2020 @ 5:19am 
Евгений, можешь спорить, но я проводил эксперименты - количество контрабанды на 100 человек сократилось до 4х предметов (которые возможно обнаружить собаками или металлоискателями) за неделю. Если не путаю, конечно, давно это было.
Всё остальное было поймано в шлюзе.
LongBowDwarf  [author] 2 Jul, 2020 @ 5:17am 
Евгений, из-за шлюза зэк вынужден несколько секунд простоять между двух закрытых дверей - в узком месте, забитом охраной. Прямо перед этим он проходит металлоискатель, поэтому если он прозвенел - охранники его проверят.

Возможности убежать и спрятаться будет минимум - попробуй побегай кругами от охраны на таком пятачке.

Плюс, там стоят несколько охранников с собаками, пронести пахучую контрабанду также будет очень тяжело.
Евгений 2 Jul, 2020 @ 12:01am 
💯💀GameMan_Real💀💯, а как связана контрабанда с лампочками, счетчиками и битами памяти? Автоматика, как-то умеет понимать, что зэк в кармане отвертку имеет? Не понятно. Или, когда за зэком гонится охрана... Как таймер или нажимная плита должны понять, что зэка не надо пропускать? Зэк будет стоять перед дверью, если не вовремя подбежал. А если вовремя, то уже охрана будет стоять и курить бамбук, пока там таймер шлюза не откроет им проход. Бред какой-то, имхо.
Yennefer of Vengerberg 29 Jun, 2020 @ 3:21am 
Спасибо, конечно, за ответ через год :Р. но теперь понятнее
LongBowDwarf  [author] 28 Jun, 2020 @ 8:33pm 
С помощью шлюзов мне тогда удалось сократить количество контрабанды, которую зеки смогли пронести в жилые блоки до 4х предметов на 100 человек за неделю.
Может сейчас будет ещё получше.

Гайд писался 3 года назад, наверное много что изменилось с тех пор. Может попробую поиграть снова и что-то дополнить.