Barotrauma

Barotrauma

143 ratings
Логика в деталях
By star
Подробно разберём каждый компонент, как он работает.
Заодно сами научимся изучать работу компонентов.
3
4
2
   
Award
Favorite
Favorited
Unfavorite
Введение
Гайд на стадии разработки...
Пока рассмотрим только некоторые особо интересные компоненты.
По большей части пишу для себя, как напоминание базовых знаний.

Типы разъёмов
Все компоненты принимают логические сигналы и/или отправляют их. Компонент "Реле" также в виде исключения пропускает ток, но это отдельная история. Когда вы откроете компонент с помощью отвёртки, то увидите разъёмы для подключения проводов.

Слева, обычно - это принимающие сигнал разъёмы. И называются они обычно "СИГНАЛ_В" (вместо слово "сигнал" может быть какое-то смысловое название).
Справа же - отправляющие разъёмы, то есть выход информации из компонента. И называются соответственно "СИГНАЛ_ИЗ".

Даже если провод тянется справа, но инфа должна идти внутрь компонента, подключать нужно к левому разъёму.

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

Типы сигналов

Сигнал может быть:
  • Пустым (т.е. отсутствовать совсем)
  • Быть числом
  • Быть строкой

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

Типичные сигналы - это "1" и "0", которые соответствуют ИСТИНЕ и ЛЖИ.
(Но полнота соответствия зависит от компонента, так пустой сигнал обычно тоже ЛОЖЬ)

Так называемый цветовой сигнал (несущий информацию о цвете) - не более, чем строка из четырёх целых чисел от 0 до 255, которые склеены воедино с запятой в качестве разделителя.
Формат RGBA (Reg, Green, Blue, Alpha-канал)
Примеры:
"255,0,0,255" - ярко-красный
"0,255,0,255" - ярко-зелёный
Поэтому информацию о цвете может выдавать практически любой компонент.
== КОМПОНЕНТЫ ==
Соглашения
Многие компоненты в своей основе устроены одинаково. Поэтому я введу ряд обозначений, чтобы излагать можно было более стандартизировано.

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

"Успех"
Во многих компонентах можно указать точное значение исходящего сигнала. Этот параметр обычно называется "Выход", а иногда - "Мощность". Так как выходом мы называем и сам провод, то подобное значение я буду называть "Успех" в кавычках. Или просто "Да". Это может быть число или строка.

"Провал"
Соответственно, "Неверный выход" я буду называть "Провал" в кавычках. Или просто "Нет".

"(Провал)"
Иногда пустая строка в качестве значения параметра означает пустой сигнал. Это зависит от вида компонента. Обычно это явно указано во всплывающей подсказке. Такую возможность я буду обозначать скобками.
Компонент - Равно
Сравнивает два сигнала. Если они равны, то выдаёт "Успех", иначе выдает "(Провал)".

Фокусы начинаются, когда появляются пустые сигналы. Когда на один вход подаётся сигнал, а на второй - отсутствие сигнала, то первый сигнал сравнивается с последним сигналом, который был на втором входе.

5 = 5? --> Да.
5 = Пусто? --> Снова да, потому что до этого сравнивали "5" и "5".
6 = Пусто? --> Нет, потому что до этого было "5" на втором входе.
Пусто = 6? Да, потому что только что на первом входе было "6".

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

Пусто = Пусто? --> Пусто по-любому.
Компоненты - "И" (AND), "ИЛИ" (OR)


Компонент "И" выдаёт "Успех", когда оба входа истинны, но выдаёт "(Провал)", когда хотя бы один сигнал ложный.

Ложные сигналы - это "0" и пустой сигнал.
Истинные сигналы - все остальные сигналы, например "1", "5", "hello", а также пустая строка "".

Так что два пустых сигнала на вход выдают "(Провал)", в отличие от компонента "Равно".

Примеры:
1 и 1? --> Да.
1 и 2? --> Да.
1 и "hello"? --> Да.
1 и 0? --> Нет.
0 и "hello"? --> Нет.
0 и 0? --> Нет.
1 и Пусто? --> Нет.
Пусто и Пусто? --> Нет.

Компонент "ИЛИ" (OR)
Действует аналогично, и имеет те же настройки.
1 и 1? ---> Да.
1 и 0? ---> Да.
1 и Пусто? --> Да.
0 и 0? ---> Нет.

Единственное, здесь стоит оговориться, что у компонента всего лишь два входа, это серьёзное ограничение. Зачастую, когда нужно "объединить" много сигналов, можно просто свести в одном разъёме несколько проводов, которые могут принимать значение "1" или Пусто (но не "0", иначе неизвестно, какой сигнал "победит"). По 5 проводов на каждом входе - всего до 10 проводов получается:

Компонент "Память"
СИГНАЛ_ИЗ
Компонент имеет внутреннее значение, которое всегда выдаёт на выходе. Это значение можно установить вручную в живой игре с помощью отвёртки.

Внимание! Пустая строка - это именно пустая строка, то есть строка нулевой длины, а не пустой сигнал. Большинством компонентов она воспринимается, как не числовая строка.

Внутреннее значение не может быть пустым.
По умолчанию после крафта или покупки внутреннее значение - это пустая строка.

СИГНАЛ_В
На вход принимается сигнал для того, чтобы поменять внутреннее значение, но это не обязательно. Если вам нужна константа, то можно её указать и пользоваться только выходом.

Примеры
Здесь каждый новый пример соответствует изменению предыдущего.
Первый пример - сразу после покупки или крафта:

Пусто ---> "" (пустая строка, по умолчанию такое значение)
Устанавливаем вручную "123"
Пусто ---> "123"
"234" ---> "234" (внутреннее значение поменялось)
Пусто ---> "234" (сигнал на вход исчез, но внутреннее значение осталось)

Как видите, пустой сигнал не меняет внутреннее значение компонента. Любой другой не пустой сигнал записывается в память и затем транслируется на выход. И так как внутреннее значение не может быть пустым, этот компонент ВСЕГДА что-то транслирует на выходе.

ЗАКРЕПИТЬ_СОСТОЯНИЕ
Это не часто используется. По сути это ещё одно внутреннее значение, которое говорит о том, игнорировать ли СИГНАЛ_В.
  • "1" - принимать сигналы на входе.
  • Любые другие сигналы - игнорировать сигналы на входе.
  • Пусто - не менять этот параметр. Если до этого было "1", то сигналы на входе по-прежнему будут приниматься, если же другой сигнал (например, "0" или "hello"), то будут по-прежнему игнорироваться.

Выше были примеры для принятия сигналов на СИГНАЛ_В. Предположим, что мы отправили "0" на ЗАКРЕПИТЬ_СОСТОЯНИЕ и тем самым запретили менять сигнал:

Пусто ---> "" (пустая строка, по умолчанию такое значение)
Устанавливаем вручную "123"
Пусто ---> "123" (потому что мы напрямую редактировали компонент, а не сигналом)
"234" ---> "123"
Пусто ---> "123"
"hello" ---> "123"

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

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

Например, если поставить свежий (купленный) экран на стену и подключить проводом к импульсной кнопке, то сначала на экране будет пусто (пустая строка), а после нажатия на кнопку будет "1". Но кнопка при этом больше не выдаёт никакой сигнал:


Аналогичный эксперимент можно проделать с компонентом "Память". Меняйте значения в компоненте (в в живой игре) - и они будут меняться на текстовом экране. Потом отсоедините провод. Значение на экране осталось. Дальнейшие изменения "памяти", естественно, без провода не сработают:


Из этого можно заключить, что текстовый экран имеет внутреннее значение, как и компонент "Память", которое также не меняется, когда входящего сигнала нет.
Компонент "Не"
Имеет всего два разъёма: СИГНАЛ_В и СИГНАЛ_ИЗ.
Очевидно, компонент пропускает сигнал через себя и инвертирует его.

ИСТИНУ превращает в ЛОЖЬ
ЛОЖM превращает в ИСТИНУ

Имеет два режима, которые задаются галкой "Тип сигнала" (можно менять в живой игре).

Когда галка выключена (по умолчанию)
ЛОЖЬ соответствует "0" и пустой строке.
ИСТИНА соответствует любому другому сигналу.
Пусто на входу приводит к Пусто на выходе.

"0" ---> "1"
"1" ---> "0"
"2" ---> "0"
"hello" ---> "0"
"" ---> "1"
Пусто ---> Пусто

Когда галка включена
ЛОЖЬ соответствует "0", пустой строке и пустому сигналу.
ИСТИНА соответствует любому другому сигналу.

"0" ---> "1"
"1" ---> "0"
"2" ---> "0"
"hello" ---> "0"
"" ---> "1"
Пусто ---> "1"
Компонент - Задержка
Работает очень просто - на какое-то время (N секунд) откладывает всё, что подаётся на вход, и передаёт на выход в той же последовательности и длительности.

Пример (задержка N = 5 секунд):
Подаём на вход "1," потом "2", потом "3", каждый сигнал длится 1 секунду, затем Пусто.
Всё это время на выходе будет Пусто, затем ещё 2 секунды Пусто, а потом выдаст "1", "2", и "3" с той же длительностью.


Сброс при получении сигнала
Эффект этой галки накладывается на работу компонента в целом. На выход всё время подаётся пустой сигнал, пока на входе есть сигнал, а также N секунд после него.

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

Пример (задержка N = 5 секунд):
Подаём на вход "1", потом "2", потом "3", каждый сигнал длится 1 секунду, затем Пусто.
Всё это время будет Пусто, после этого на выходе будет Пусто ещё 5 секунд, после чего сигнал "3" длительностью 1 тик (примерно 0.017 секунд), затем снова Пусто.


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

Сброс при получении другого сигнала
Эффект этой галки накладывается на работу компонента в целом. На выход всё время подаётся пустой сигнал в течение N секунд после начала получения другого сигнала.

Пример (задержка N = 5 секунд):
Подаём на вход "1," потом "2", потом "3", каждый сигнал длится 1 секунду, затем Пусто.
Всё это время будет Пусто, потом ещё 4 секунды Пусто, затем выдаст "3" в течение 1 секунды, ну и дальше снова Пусто.


Ещё пример:


Это нужно, чтобы сгладить "скачки" сигналов. Например, если сигналы часто меняются, то компонент будет какое-то время их игнорировать (и выдавать Пусто), а когда всё устаканится, немного подождёт и выдаст последний сигнал.

Обе галки можно совмещать, но очевидно, что первая галка сильнее. Так что если указать первую, вторая уже не важна.
Компонент - WiFi
По умолчанию компонент принимает беспроводной сигнал на том же канале.

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

Как передатчик, компонент рассылает сигнал всем аналогичным компонентам на том же канале. Но только тем, что в радиусе действия WiFi, очевидно.

Диапазон (только в редакторе)
Расстояние указывается в сантиметрах! Чтобы примерно понимать, рост персонажа - 175 см. Если в редакторе подлодки включить сетку (Shift + правый клик), то рост персонажа будет 11 клеток, т.к. каждая клетка = 16 см. Также в редакторе можно зажать Alt - и потянуть левый клик мыши, чтобы измерить расстояние линейкой.

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

Сонар
Если по WiFi передавать сигнал сонара, то на мониторе при превышении определённого порога будет высвечиваться надпись "слабый сигнал", но данные всё ещё будут приходить. Ну и на большем расстоянии превратится в "нет сигнала", очевидно.
Компонент проверки сигнала
Принимает на вход сигнал и сравнивает его со внутренним значением "целевого сигнала", которое может быть и пустой строкой. Внутренне значение не может отсутствовать.

Если сигнал совпал со внутренним значением, то это "(Успех)", иначе "(Провал)".
Исключение: если на входе Пусто, то это тоже Пусто, даже если указан "неверный выход".

Пусто? ---> Пусто по-любому.

Внутреннее значение можно также менять и логикой, подавая его в "Назначить_ЦелевойСигнал". Пока туда ничего не подаётся, то есть Пусто, то будет использоваться старое значение (установленное вручную или по проводу).

Обратите внимание, что оба варианта: "(Успех)" и "(Провал)", - могут выдавать пустой сигнал, если в значении параметра указана пустая строка. Во всплывающей подсказке это вообще не указано, увы.

Примеры
В примерах будем использовать Целевой_сигнал=3 (это и есть внутреннее значение).

0? ---> Нет
1? ---> Нет
2? ---> Нет
3? ---> Да
4? ---> Нет
Пусто? ---> Пусто по-любому.
Компоненты: "+", "-" и т.д.
То есть арифметические операции с числами. Для выхода указываются ограничители: максимум и минимум. По умолчанию они 999999.0 и -999999.0, так и оставим пока что.
Особенности на примере разных компонентов:

Сложение ("+")
Пусто + Пусто ---> Пусто
"1" + Пусто ---> Пусто
"1" + "1" ---> "2"
"1" + "6" ---> "7"
"1" + "6.5" ---> "7.5"
"1" + "6.000001" ---> "7.000001"
"1" + "6.0000001" ---> "7" (выход за пределы точности вычислений)
"1" + "-6" ---> "-5" (отрицательные числа - вполне себе числа)
"1" + "hello" ---> "1" (не-числа воспринимаются как "0")
"1" + "" ---> "1" (пустая строка - также "0")
"1" + "7abc" ---> "1" (не полноценные числа воспринимаются как "0")
"1" + "7,7,7,7" ---> "1"
"1" + "7." ---> "8" (точку можно оставить в конце, это не ошибка)
"1" + ".7" ---> "1.7"
"0.1" + "0.2" ---> "0.3" (видимо, к результату применяется округление)

Умножение
"5" x "5" ---> "25"
"123456" x "123456" ---> "999999" (сработал ограничитель)
"123456" x "0.123456" ---> "15241.383" (а должно быть 15241.383936, предел точности)
"0.123456" x "0.123456" ---> "0.0152413845" (а должно быть 0.015241383936, предел точности)
Получается, что предел точности - 7 знаков.
Далее с умножением всё ясно, ибо проблемных мест больше нет.

Деление
"1" / "0" ---> Пусто
"1" / "0.00001" ---> Пусто
"1" / "0.0001" ---> "10000"
"1" / Пусто ---> Пусто
"1" / "3" ---> "0.33333334" (и снова предел точности)

Синус ("sin")
Пусто ---> Пусто
"0" ---> "0"
"90" ---> "1"
"270" ---> "-1"
"45" ---> "0.70710677"
"hello" ---> "0"

Другая арифметика должна работать также. То есть плохие строки превращаются в число "0". И при получении на любом входе сигнала Пусто, на выходе получается Пусто. Ошибки типа деления на ноль - тоже переводятся в Пусто.
Реле
Вот мы и добрались до одного из самых интересных компонентов. Он просто пропускает через себя ток и сигналы, но только в активном состоянии.
ЭНЕРГИЯ_В =====> ЭНЕРГИЯ_ИЗ
СИГНАЛ_В_1 -----> СИГНАЛ_ИЗ_1
СИГНАЛ_В_2 -----> СИГНАЛ_ИЗ_2


И вот это наличие состояния активности делает компонент похожим на устройства типа ламп, дверей и люков.

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

Несколько реле можно выстраивать в цепочку, точнее как бы в "дерево". Но очевидно, что самое первое реле будет задавать суммарное ограничение мощности (1000) для всех, кто от него питается, и для других реле тоже.

По логике - сигнал_2 идёт строго в выход_2, ничто ни с чем не путается и не складывается. То есть это как бы реле "2 в 1", но с общим управлением вкл/выкл.

ПЕРЕКЛЮЧИТЬ_СОСТОЯНИЕ
Принимает импульсный сигнал и меняет состояние активности на противоположное.
"0" и Пусто - ничего не происходит.
"1" и любая другая строка, в том числе пустая - переключает состояние.

Если подать постоянный сигнал (например, "1"), то реле будет колбасить. Каждый тик, то есть 60 раз в секунду реле будет включаться и выключаться. Не делайте так, это не красиво.

НАЗНАЧИТЬ_СОСТОЯНИЕ
Пусто - ничего не делает.
"0" - выключает реле.
"1" и любая другая строка - включает реле.
Это может быть постоянный сигнал.
И даже если менять сигнал: "1", Пусто, "1", "2", ... Это ничего не изменит. Реле будет включено. Лишь "0" его выключает на этом разъёме.

СОСТОЯНИЕ_ИЗ
"1", когда включено, иначе "0".

ЗНАЧЕНИЕ_ЗАГРУЗКИ_ИЗ
Показывает суммарную потребность в мощности всех приборов, подключённых к реле. Например, если подключить двигатель мощностью 2500 и на мостике выбрать направление плыть максимально вправо, то это значение будет равно 2500, хотя реально двигатель даже не будет работать из-за недостатка мощности. Ведь реле пропускает не более 1000, а двигателю для работы обычно нужно хотя бы половина необходимой мощности. Но если "полный вправо" поменять на "вправо наполовину", то этот показатель на выходе уже будет равен 1250, и хоть двигателю и не будет хватать, он всё же будет работать на мощности 1000.

ЗНАЧЕНИЕ_ЭНЕРГИИ_ИЗ
Этот показатель равен мощности, выдаваемой реле на выходе. Он не может быть больше 1000. В предыдущем примере он будет 1000 при условии, что на входе энергии достаточно. А вот если к двигателю мощностью 2500 подключить энергию сразу через три реле, и прожать на мостике "полный вперёд" (вправо или влево, не суть), то на каждом реле энергия на выходе будет примерно 833. Загрузка, как вы понимаете, будет такая же - 2500. Двигатель при этом не будет испытывать недостатка энергии, ведь три реле в сумме дают мощности до 3000.

Как и ЗНАЧЕНИЕ_ЗАГРУЗКИ_ИЗ, это логический сигнал, то есть число. Не путайте с разъёмами энергии, где красные названия.

Разбор подлодки
Когда вы снимаете этот компонент с подлодки в живой игре, он может быть в выключенном состоянии. Учтите, что это состояние сохраняется в инвентаре. Возможно, вы положите этот компонент в ящик, сохраните игру, и вспомните о нём гораздо позже. Потом захотите просто пустить через него ток, как через тройник, но он не будет работать. Чтобы включить его, нужен будет провод в сочетании с компонентом "память" или кнопкой. Либо можно внимательно следить, в каком состоянии вы скручиваете компоненты с подлодки. Созданные (только что на фабрикаторе) и магазинные (только что купленные) компоненты - по умолчанию в активном состоянии.
== МЕХАНИЗМЫ ==
Большинство механизмов имеют похожие входы и выходы, которые мы не будем разбирать повторно каждый раз:

ЭНЕРГИЯ_В
Если такой вход есть, то механизму (прибору) нужно питание, иначе он не будет работать.

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

Пример:
Данный прибор требует мощность 100
Все приборы требуют мощность 2000
Реактор (и плюс, возможно, батареи) выдаёт 700.
Это значит, что данный прибор не будет работать, потому что ему достанется лишь 35 мощности, но насосы на подлодке при этом работать будут.

СОСТОЯНИЕ_ИЗ
Целое число от 0 до 100, которое показывает исправность механизма.
0 - механизм сломан.
100 - механизм полностью починен.

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

Увеличенное потребление энергии
Практически для всех механизмов действует правило, что если состояние ниже 100%, то механизм работает хуже и потребляет больше энергии. "Штраф" составляет 5% за каждые 10% порчи, но не в рамках "безопасной" порчи. На примере двигателя:
Целостность
Потребление
Скорость
100%
100%
100%
90%
100%
100%
82%
100%
100%
80%
110% (+10%)
90%
78%
111%
89%
77%
111.5%
88.5%
70%
115%
85%
60%
120%
80%
50%
125%
75%
40%
130%
70%
30%
135%
65%
20%
140%
60%
10%
145%
55%
1%
149.5%
50.5%
0%
не работает
не работает

То есть если двигатель в норме потребляет 2000, то при состоянии 20% он будет потреблять 2800, и его максимальная скорость будет уменьшена на 40%.

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

Зависимость непрерывная. Это значит, что если СОСТОЯНИЕ_ИЗ возвращает 50, то реально это может быть 50.38465 или 49.72845, и именно это точное значение используется в формуле.
Поэтому макс. потребление для двигателя может расти, например, на 1W каждые 0.2 сек, когда он в воде.
Реактор
Характеристики реакторов ванильных подлодок
Название
Уровень
Мощность
Возгорание
Плавление
Расход
Барсук
1
4200
18
45
0.2
Дюгонь
1
3000
10
30
0.2
Косатка
1
3500
10
30
0.3
Верблюд
1
5200
20
120
0.2
Горбун
2
3100
10
30
0.2
Косатка-2
2
4000
10
30
0.3
Азимут
2
3500
10
30
0.2
Тифон
2
5000
10
30
0.25
Гейра
2
4800
20
120
0.2
R-29 "Фура"
2
5200
18
40
0.2
Бериллия
3
6500
7
20
0.3
Ремора
3
5000
8
20
0.3
Тифон-2
3
5200
15
90
0.2
Кастрюля
3
5000
15
90
0.3
Винтерхалтер
3
8500
20
120
0.3
"Уровень" - уровень подлодки (1, 2, или 3), влияет на то, где её можно купить и на лимит апгрейда.
"Мощность" - максимальная выработка энергии (больше этого значения никак не получится).
"Возгорание" - через сколько секунд начнётся возгорание после достижения 6482°C
"Плавление" - через сколько секунд начнётся плавление после достижения 7965°C
Плавление означает ядерный взрыв (это синонимы в данной игре).
"Расход" - как быстро тратятся стержни. Они тратятся со скоростью, которая зависит только от расщепления. Несколько стержней делят расход между собой, так что каждый из них тратится медленнее.

Выходы


ЭНЕРГИЯ_ИЗ
Когда есть стержень, реактор вырабатывает электричество. По этому проводу энергия выходит из реактора, очевидно. Есть тонкости, согласно которым, например, низкая температура устанавливает лимит. Но здесь не будем касаться этих тонкостей. Установка двух-трёх стержней быстро решает эту проблему.

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

ТЕМПЕРАТУРА_ИЗ
Целое число от 0 до 10000.
5000 - средняя температура, когда работает автоматика.
5400 - считается, что это опасный порог, до которого в идеале не должно повышаться.
6482 - после этого значение запускается таймер возгорания (см. таблицу).
7965 - после этого значения запускается таймер плавления (см. таблицу).

ПЛАВЛЕНИЕ_ПРЕДУПРЕЖДЕНИЕ
Постоянный сигнал, даже когда реактор выключен.
Равно 1, когда запущен таймер плавления, иначе - 0.

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

ЗНАЧЕНИЕ_ЭНЕРГИИ_ИЗ
Целое число от 0 до максимальной мощности.
Постоянный сигнал, даже когда реактор выключен.
Показывает, сколько энергии даёт реактор на выходе (по проводу).
См. компонент "Реле" для подробностей.

На макс. мощность влияют различные модификаторы! Обращайте на них внимание при навешивании своей логики на реактор.

ЗНАЧЕНИЕ_ЗАГРУЗКИ_ИЗ
Целое число от 0 до максимальной мощности.
Постоянный сигнал, даже когда реактор выключен.
Показывает, сколько энергии необходимо суммарно всем устройствам, подключённым по проводу (то есть через все кабельные коробки, реле и т.д.)
См. компонент "Реле" для подробностей, здесь всё аналогично.

ТОПЛИВО_ИЗ
Целое число от 0 до 600.
Постоянный сигнал, даже когда реактор выключен.
Показывает "тепловой потенциал" стержней (по сути их условную мощность).
Тепло
Прочность
Урановый стержень
80
100
Ториевый стержень
100
200
Грозовиевый стержень
150
150
Нестабильный грозовиевый
150
400
(также указал прочность - как долго работают)
Сумма не меняется в процессе "сгорания" стержней. Два б/у урановых покажут 160, а урановый плюс ториевый покажут 180 на этом проводе. Конечно, когда стержень кончился в ноль, то он уже не считается.

ПРОЦЕНТ_ОСТАТКА_ТОПЛИВА
Число от 0 до 400.
Это сумма процентов всех стержней. И не важно, какие именно стержни, проценты есть проценты. Однако здесь укажу, что чем больше прочность (см. таблицу), тем дольше "горит" стержень в реакторе.

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

Входы
ВЫКЛЮЧЕНИЕ
Гасит реактор при получении вообще любого сигнала (кроме Пусто, естественно), когда реактор находится в автоматическом режиме управления. В ручном же режиме все сигналы на этот провод игнорируются, на то он и ручной режим.

НАЗНАЧИТЬ_СКОРОСТЬ_РАСЩЕПЛЕНИЯ
Число от 0 до 100, может быть вещественным.
Устанавливает ползунок скорости расщепления на нужную позицию.

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

НАЗНАЧИТЬ_ВЫРАБОТКУ_ТУРБИНЫ
То же самое (число от 0 до 100), но для выработки турбины, то есть выходной мощности.

Это самое первое, что обычно автоматизируют при навешивании своей логики на реактор. Если энергии мало, то приборы плохо работают, а если много, то приборы и кабельные коробки быстро портятся. Очевидно, что выработка должна быть равна загрузке. Сколько приборы хотят кушать (белая линия на графике), столько реактор и должен выдавать (жёлтая линия на графике). Линии должны совпадать. Поэтому формула обычно такая:
Выработка = Загрузка * 100 / Макс. мощность
Для Дюгони, например, если приборы хотят 2000, а мы помним, что макс. мощность реактора - 3000, то нужно подать сюда число 66.6666

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

"Кислородник" вырабатывает кислород и посылает его во все (подключённые) вентиляционные выходы. У него есть внутреннее значение выработки кислорода, которое по умолчанию равно 400, но автор подлодки может его установить на своё усмотрение в редакторе. Потребление одним человеком равно примерно 7.

Уже поделили? Да, получается примерно 57 человек. Но не всё так просто, как кажется.

Кислород распределяется только в те комнаты, где есть вентиляционный выход, причём распределяется пропорционально объёму отсека (т.е. площади, ибо игра 2D). Достаток кислорода в отсеке не влияет на его распределение. Открытая дверь или люк между отсеками, естественно, приводит к быстрому усреднению кислорода между ними.

Пример:
- кислород подаётся ровно в 2 отсека;
- второй отсек больше первого в 10 раз;
- вся команда (8 человек) собралась в первом отсеке за закрытой дверью.
Выработка кислорода в первый отсек будет 1/11 от всего, то есть примерно 36 вместо 400.
Так как дверь закрыта, то кислород из второго отсека не будет поступать в первый. Не играет роли, что во втором отсеке 100% кислорода, который никто не использует (не дышит им). Поэтому в первом отсеке вырботки хватит на 36/7 - примерно на 5 человек. Так как команда из 8 человек, то вскоре они начнут задыхаться, если хотя бы 3 из них не наденут маски или скафандры.

Водоизмещение

Общее водоизмещение равно сумме площадей всех отсеков. Равновесное состояние подлодки достигается, когда вода составляет ровно 7% от всего водоизмещения. Это значит, что идеальный объём балластов должен быть 14%, тогда равновесный уровень будет 50% наполненности балластов (см. картинку). Иначе равновесный уровень будет отличаться. И если он отличается сильно, то автору подложки желательно это явно указать в свойствах терминала, чтобы тот посылал целевой уровень со смещением.

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

Также можно один из отсеков превратить в балластный, если в нём есть насос. Малый насос тоже подходит. К нему нужно будет подключить провода аналогично другим балластным насосам. Единственное отличие от балластных отсеков будет в том, что он не будет помечен "мокрым", эта опция не доступна в живой игре, поэтому NPC будут захаживать туда просто, чтобы прогуляться.

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

Есть нюансы в плане того, что насос может быть расположен сильно выше уровня пола, либо отсек вообще может быть неправильной формы (не прямоугольник), но это редкие случаи. "Кривой" отсек будет считаться единым, если "кусочки", из которых но состоит, связаны. Без этой связи насос будет заполнять лишь тот отсек, в котором находится. Именно поэтому, кстати, вода не выливается из балласта при его заполнении, когда открыт люк.

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

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

Логика управления у каждой лодки своя. Так что если вторая лодка поставлено на автопилот, то при попытке погружения она будет стараться опустошить свои балласты, то есть будет сопротивляться управлению основной подлодки. Чтобы избежать этого, нужно использовать на второй подлодке ручное управление и затопить балласты на 50%. Склейка из лодок хоть и будет очень инертной, но всё же сможет всплывать и погружаться.
Навигационный терминал


СКОРОСТЬ_X_ИЗ
В ручном управлении работает так:
1) Капитан кликает точку на сонаре, туда устанавливает красный квадрат. Этот квадрат задаёт целое целевое значение от -100 до 100.
-100 означает "полный назад"
100 означает "полный вперёд"
0 означает "полный стоп"
2) После этого довольно быстро некая стрелка ползёт к этому квадрату. Пока она ползёт, значение на выходе плавно меняется, и оно может быть не целым. Когда стрелка достигает квадрата, значение становится целым.

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

СКОРОСТЬ_Y_ИЗ
Аналогично, только означает смещение красного квадратика по вертикали, и тянется провод, соответственно, к балластным насосом в разъём "целевой уровень".

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

СИГНАЛ_ИЗ_1, а также 2 и 3
Если провод присоединён к разъёму, то у капитана появится соответствующая кнопка. Её можно будет нажимать, и она даёт импульсный сигнал "1", как и обычная кнопка.
К сожалению, названия кнопкам можно давать только в редакторе подлодки.

ВКЛЮЧИТЬ_СТЫКОВКУ
Когда провод присоединён сюда, справа на терминале будет появляться красная кнопка при приближении к месту, куда можно пристыковаться. Нажатие на кнопку пошлёт импульс "1".

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

Информационные разъёмы
Показывают скорость и позицию по вертикали и горизонтали. На выходе вещественное число, с не более 4-мя знаками после запятой.

ПРЕОБРАЗОВАТЕЛЬ_В
Обычно этот разъём не работает. При этом используется встроенный в терминал сонар со всеми вытекающими. Чтобы разъём заработал, в редакторе подлодки нужно установить галку "Использовать преобразователи":

По желанию можно поставить галку "центрировать на преобразователях". К сожалению, обе галки во время игры не доступны.

Как это работает? Появляются новые механики. Требуется подключить внешний сонар. Если он не подключён или обесточен, то на терминале будет "нет сигнала". Если сонар находится на челноке (подключение через WiFi), и челнок далеко, то будет "слабый сигнал", а потом и "нет сигнала".

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

СКОРОСТЬ_В
(???)
Устанавливает скорость рулевого управления на заданное значение. Сигнал должен содержать X-скорость и Y-скорость, разделенные запятой. Например, "-40,30".
Как вы помните, по каждому направлению на выходе скорость меняется от -100 до 100.
Монитор состояния
Когда обеспечен энергией, показывает карту подлодки с отсеками, состоянием механизмов и прочей информацией.

В редакторе подлодки можно указать, нужны ли детекторы для отображения информации, а также какая именно инфа показывается.

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

ДАННЫЕ_ВОДЫ_В
Подключите сюда все датчики воды, можно через реле. Достаточно, чтобы провод (напрямую или через реле) тянулся до этого разъёма. Правило, что логические сигналы перебивают друг друга, здесь не работает. Тупо соедините, и информация будет отображаться на карте.

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

ДАННЫХ_ВОЗДУХА_В
Аналогично сюда можно подключить датчики воздуха из нужных отсеков.

Хитрость
Маленькая хитрость для важных приборов малой мощности. Можно увеличить приоритет потребления ими энергии, через увеличение количества проводов к их разъёму питания.

Справа на скрине пример такой хитрости для навигационного терминала. К нему подключены сразу 5 проводов, что увеличивает его "важность" в 5 раз для системы распределения энергии. Тот факт, что соединение по сути через одно реле, не имеет значения. На скрине есть ещё 5 реле, которые не обязательны, ведь тянуть можно все провода из одного реле. Даже если реактор вырабатывает 500, а суммарное потребление 2000, терминал всё равно будет работать. Вот даже насосы не будут работать, потому что им нужно минимум 30%, а терминал - будет. Аналогично можно поступить с монитором состояния.

Хотя, насосы тоже можно улучшить таким образом, но тогда терминалу меньше достанется... Дилемма...
Двигатель
По сути имеет один важный логический разъём:

НАЗНАЧИТЬ_СИЛУ
Принимает число от -100 до 100, где -100 - это полный назад, а 100 - полный вперёд.
Максимальное потребление энергии жёстко забито в редакторе подлодки (для каждой подлодки оно своё).
Реальное потребление зависит от силы. Например, 40 или -40 означает, что двигатель работает на мощности в 40%, а значит и потребляет энергии 40% от максимума.

Также при этом уменьшается и необходимый порог для работы двигателя в принципе. Обычно порог - половина от требуемой мощности. Но если двигателю нужно 40% от максимума, то минимум нужно половина от этого, то есть 20% от максимума. А так как двигатель - это самый главный фактор перепадов потребления энергии, то опытный капитан должен понимать, что "полный вперёд" на сложных подложках будет означать "полны стоп", пока реактор не разгонится по выработке, при этом другие приборы на подлодке тоже погаснут, включая навигационный терминал.
Перископ и пушка
Эти два механизма имеют симметричные разъёмы.

ПОЗИЦИЯ_ИЗ
Перископ посылает вещественное число от 0 до 360, которое означает угол поворота пушки. Оно ни разу не целое. Число определяется тем, как игрок разместит курсор мыши на экране. То есть игрок может "послать" любой угол, независимо от ограничений пушки. Но если пушка не может повернуться на данный угол, она выберет максимально близкий из возможных с учётом её ограничений по направлениям. Поэтому не страшно сюда послать неправильное число, оно будет округлено, обрезано и т.п.

ВЫЗВАТЬ_ИЗ
Когда игрок на перископе нажимает левую кнопку мыши, то значение становится "1", и это постоянный сигнал до тех пор, пока игрок не отпустит кнопку мыши. Это не импульс! В отличие от кнопки, по которой игрок делает щелчок мышью, здесь сигнал хоть и короткий, но постоянный. Поэтому в переключаемые механизмы посылать нужно не сырой сигнал, а слегка обработать его математически. Например, через сигнал задержки с первой галкой "сбросить".

В отношении пушки, у которой есть симметричный разъём ВЫЗЫВАТЬ_В, сигнал работает как "стрелять, пока кнопка мыши не будет отпущена". То есть стрелять, пока сигнал "1".

Прожектор и камера
В прожекторе есть ПОЗИЦИЯ_В. По сути это та же пушка, только без возможности стрелять.
В камере есть УПРАВЛЕНИЕ_В, что по сути имеет то же назначение, что и ПОЗИЦИЯ_В.

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

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

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

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

Для наглядности я покрасил выходы из терминала в коричневый, а из стыковочного люка - в оранжевый. Также расположил входы во все компоненты слева, а выходы - справа.


При приближении к стыковке на терминале появляется кнопка для стыковки. Она не работает, пока не подплыть вплотную к другому люку, но появляется уже на большем расстоянии. При нажатии посылает импульс "1". Как видно, в зависимости от текущего состояния, импульс с помощью компонента "И" пойдёт либо по верхнему пути на схеме, либо по нижнему.

Отстыкованное состояние (нижний путь)
Во время "отстыкованности", люк посылает сигнал "0", поэтому сигнал может идти только по нижнему пути.

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

Пристыкованное состояния (верхний путь)
По аналогии с предыдущим, люк посылает постоянный сигнал "1" в этом состоянии. Так что сигнал от терминала идёт только по верхнему пути.

Импульсный сигнал "1" от кнопки проходит через верхний компонент "И", превращаясь в "0", и с задержкой в пол секунды назначает состояние "0" для стыковочного люка, что означает команду отстыковки.

Но это ещё не всё. Два провода выходят к обычному настраиваемому люку. Один из этих проводов просто идёт напрямую. Сигнал "0" означает "закрыть люк", что логично сделать сразу при отстыковке.

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

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

Превращение люка в шлюз
Расскажу простое решение, а сложное оставлю на ваше усмотрение. Нужно отсоединить все провода от настраиваемого люка и подключить кнопку к разъёму "переключения состояния". Вот и всё. Изи. Проблемы вы ощутите позже. Надеюсь, будет интересно их решать. Сразу скажу, что снаружи обычно есть место для внешней кнопки, хоть и сложно его нащупать.

Проблема соединения проводов со стыковочным люком в живой игре следующая:
  1. В состоянии пристыковки к чему бы то ни было, изменения заблокированы.
  2. В состоянии отстыковки изменения возможны, но требуется открыть обычный люк, иначе он блокирует доступ.
Решение - отстыковаться, открыть обычный люк (кнопкой, например), можно даже распилить часть корпуса, и дальше уже мудрить со своими улучшениями.
52 Comments
blank Jan 24 @ 6:35am 
Короче мне товарищ сказал, что как-бы кабельная коробка есть и не надо гандобить это всё на стене. В общем я переделал логику по иному принципу, но мне всё же не понятно почему: a) скорость Y не передаётся на вторую память, б) две логические цепочки одинаковые, но одна работала как надо, вторая отказывалась :\
star  [author] Jan 20 @ 11:31am 
@blank,
Именно. В гайде же чёткий пример:
"1" + Пусто ---> Пусто
blank Jan 20 @ 10:07am 
А у меня интересная ситуация вышла на подлодке Горбун. Цель была сделать два рубильника на каждый насос (на средний и малый), включающий откачку воды, сохраняя автоматизированость. Сделал нав. терминал[Скорость Y]>память>сложение[Вход1]>малый насос. Далее рубильник>реле>сложение[Вход2]. К реле плюсанул память на "-200".
blank Jan 20 @ 10:07am 
Оказалось что сложение не будет работать с 1/2 сигналов и сигнал с терминала не доходит до малого насоса. Поставил память"0">сложение[Вход2]. Заработало как надо, нажимаешь рубильник и вся вода откачивается только на малом насосе. Сделал идентичную логику со вторым рубильником для среднего насоса. Подключил второй провод с нав. терминала[Скорость Y] на память второй логики ии.. ничего.
blank Jan 20 @ 10:07am 
Память на первой логике работает и выдаёт значение [Скорость Y], а память на второй логике не хочет. Подумал фиг с ним. Вывел второй провод из памяти первой логики напрямую к сложению второй логики. Средний насос заработал как напрямую от терминала, но ему индифферентно на реле, которое должно давать "-200" на сложение. Вопрос: почему?
Archive(Архив) Nov 23, 2024 @ 2:32pm 
Спасибо автору!
star  [author] Nov 5, 2024 @ 11:37am 
@Палач Рока,
а ты присмотрись. Возможно, где-то в ямке лужа. Или это такой мелкий отсек, что не видно. Или там совсем на донышке, ну когда насос чуть выше и не всё выкачивает. Причин много.

Ради эксперимента просто отключи насос в любом отсеке (но не балласте) и притопи его, а потом попробуй удержание позиции.
Палач Рока Nov 5, 2024 @ 3:04am 
@star, ты имеешь ввиду отсек? Но они же на мониторе не затоплены и визуально там воды нет. Карман с водой ты подразумеваешь область не как Hull?
star  [author] Nov 5, 2024 @ 12:58am 
@Палач Рока, такое бывает, когда какой-то отсек постоянно затоплен и не откачивается. Это может быть и карман, который затопило при пробитии и который в принципе невозможно откачать - это зависит от дизайна подлодки. Очевидно, отсек не очень большой, меньше балласта, иначе бы лодка при "удержании позиции" пошла ко дну.
Палач Рока Nov 4, 2024 @ 8:35pm 
star, вопрос по балласту: у меня лодка в редакторе сбалансирована, но в игре, через пару локаций, начинается смещение балласта. Я хз как, но через две локи у меня стрелочка на терминале, при удержании позиции, стала не по центру, а поднялась вверх на сантиметр примерно. С чем такая фигня связана?