Контроллер реактора
alaindustrial:reactor_controller
Сводка
Контроллер реактора — единственный «умный» блок оболочки и единственная машина комнаты. Пока комната строится, он находит её вокруг себя, проверяет и сообщает, что не так и где. Когда комната закрыта, он же становится реактором: собирает реакторные колонны, считает выработку и нагрев, кипятит воду, пересобирает жидкости внутри каждой стопки колонн, изнашивает стержни и отдаёт EU/FE.
Контроллер ставится вместо одного блока обшивки в вертикальной стене, лицом наружу: на лицевой грани экран, который игрок читает, и туда же подводят редстоун. Кабель идёт на любую другую грань. Комната с двумя контроллерами не формируется — у комнаты ровно один мозг.
Контроллеру не нужна комната, чтобы работать. Без неё он переходит в голый режим: находит стойки вокруг себя сканом радиуса, выдаёт заметно урезанную мощность и платит за это тем, что вокруг самих стоек регулярно плавятся блоки. Это сознательный выбор игрока, а не поломка — подробности в разделе «Голый режим».
Чем кончается перегрев. За отметкой комната начинает плавить собственную начинку, а шкала, дошедшая до 100 %, запускает обратный отсчёт — от двух до трёх минут до взрыва, если шкалу не опустить. Излучение вокруг работающей зоны живёт отдельно и от расплава, и от аварии.
Где он должен стоять
| Требование | Почему |
|---|---|
| В вертикальной стене (не в полу и не в потолке) | лицевая грань — панель, которую читают и к которой на этапе 2 подводят провод; в потолке её не видно |
| Не в ребре и не в углу оболочки | у клетки на ребре нет внутренней стороны, в которую смотреть |
| Лицом наружу | внутренность комнаты лежит за контроллером; развернув его, игрок получает «Контроллер не в стене» |
| Ровно один на комнату | второй контроллер в той же оболочке даёт статус «Второй контроллер» с его координатами |
Все четыре условия проверяются одним и тем же сканированием и дают один и тот же класс ответа — статус плюс место. Отдельного «режима настройки» нет: поставил, посмотрел на экран, поправил.
Сканирование
Сканер работает в два прохода, и это не деталь реализации, а причина, по которой сообщения полезны.
- Шесть стен — по ±X, ±Y, ±Z от клетки перед контроллером. Каждую стену ищет не один луч, а до
девяти параллельных: луч самой клетки и лучи восьми клеток вокруг неё в плоскости поперёк направления. Стена стоит там, где остановилось большинство лучей; при равенстве голосов побеждает луч самой клетки, затем более близкая стена. Соседняя клетка, которая сама блок оболочки (стена контроллера, пол под клеткой), не голосует. Если ни один луч не нашёл оболочку, комната «не ограничена в этом направлении» — либо она слишком велика, либо у неё выбита сторона.
- Обход всего периметра, заданного шестью стенами. Именно этот проход находит недостающую
клетку где угодно в оболочке 14³ и называет её координаты. Найдя первую дыру, обход не прерывается, а считает все остальные: первые 12 он запоминает по координатам, дальше только считает. Пока дыр нет, тем же обходом считаются контроллеры, запоминаются клетки двери и подсчитывается доля стекла.
Почему голосование, а не один луч (игровой тест,. Один луч на направление упирался в то, что стояло на его единственном столбце. Две дыры посреди потолка, одна из которых над клеткой перед контроллером, выпускали луч в небо, и комната с дырявым потолком объявлялась комнатой без потолка — «стены не найдены» вместо «брешь». Лишний блок обшивки внутри комнаты на том же столбце, наоборот, останавливал луч под настоящим потолком, и комната «сжималась». Соседние лучи перевешивают и то, и другое.
Почему все дыры, а не первая (тот же тест). Обход останавливался на первой не-оболочечной клетке, и игрок, выломавший две клетки справа и четыре слева, видел одну метку справа. Он чинил её, ждал скана и только тогда узнавал о следующей.
Дальность луча — + 1 шаг, а не ровно предел. Лишний шаг тут не запас прочности, а условие того, чтобы статус «слишком большая» вообще существовал: луч, обрезанный ровно на пределе, никогда не увидит дальнюю стену комнаты, которая на один блок шире нормы, и любая такая комната сообщала бы «не ограничена». С лишним шагом «ты построил на один блок шире» и «стены там нет» остаются разными ответами.
Почему не простая заливка: заливка не умеет отличить «комната слишком большая» от «комната протекает» — в обоих случаях она просто работает до упора. Два прохода дают разные ответы на два разных вопроса.
Порядок проверок — тоже решение об удобстве, а не о коде:
- положение контроллера (есть ли перед его лицом открытая клетка);
- границы — шесть лучей;
- размеры (
TOO_SMALL, затемTOO_LARGE); - герметичность — не-оболочечные клетки обхода (
BREACH; сообщается первая, считаются все); - сам контроллер найден как клетка стены, а не ребра;
- второй контроллер;
- проём;
- доля стекла.
Каждый ответ можно исправить сам по себе, и игрок чинит по одной вещи за раз, а не получает список. Лимит стекла стоит последним намеренно: это единственная «мягкая» проблема — постройка при ней герметична и правильна, просто не считается защитной, и сообщать о ней раньше настоящей дыры было бы неверной расстановкой приоритетов.
| Когда пересканирует | Условие |
|---|---|
| Периодически | каждые (по умолчанию 40 тиков = 2 с) |
| По изменению соседа | сразу: сломали стену рядом, поставили порт, взорвалась дверь |
Периодический проход обязателен: срабатывает только для шести блоков, касающихся контроллера, а комната бывает 14 блоков в поперечнике. Блок, выломанный на дальней стене, для контроллера не сосед, и без своего таймера он бы этого не заметил. По той же причине контроллер никогда не «засыпает».
Состояния
Девять состояний. Восемь из них — задача, которую надо решить; девятое — «готово».
| Состояние | Что означает | Показывает место | Показывает размер |
|---|---|---|---|
FORMED | комната герметична и в пределах размеров | — | да |
CONTROLLER_NOT_IN_WALL | контроллер в полу/потолке, в ребре, замурован или развёрнут наружу не той гранью | да | если лучи дошли |
ROOM_UNBOUNDED | луч ушёл дальше предела и не нашёл стены | — | — |
TOO_SMALL | внутренний размер меньше по какой-то оси | — | да |
TOO_LARGE | внутренний размер больше по какой-то оси | — | да |
BREACH | клетка периметра — не блок оболочки | да, все дыры | да |
NO_DOORWAY | дверь есть, а проёма нет (нет двух клеток двери одна над другой на уровне пола) | — | да |
SECOND_CONTROLLER | в той же оболочке стоит ещё один контроллер | да | да |
TOO_MUCH_GLASS | стекла больше (30 %) клеток оболочки | да | да |
TOO_MUCH_GLASS дописан в конец перечисления, а не вставлен по смыслу рядом с BREACH, и это не небрежность: порядок состояний и есть формат передачи на клиент — на экран едет порядковый номер. Вставка в середину переименовала бы все состояния после неё.
Место у TOO_MUCH_GLASS — не «виноватая» клетка (виновата доля, а не блок), а первая стеклянная клетка в порядке обхода. Она нужна, чтобы дым привёл игрока к стеклянной части оболочки: комната 14×14 большая, и «слишком много стекла» без указания стороны — сообщение без действия.
Как он ведёт реактор
Собранная комната — это одна машина, и весь её тик выполняет контроллер. Своего тика у топливных сборок нет вовсе: зал с тридцатью стойками стоит серверу столько же, сколько один блок с сущностью.
Сбор колонн
Тем же обходом, что и проверку оболочки (раз в = 40 тиков), контроллер проходит внутренность комнаты и записывает каждую реакторную колонну — заряженную и пустую. Тут же он суммирует стержни с ураном и считает пары соседства.
Пустые колонны попадают в список намеренно. Фильтр по топливу выглядел безобидно и не был им: пустая стойка выпадала из водяного контура и из пересборки стопки, из-за чего вода, поданная в низ колонны, не поднималась выше первой заправленной сборки. Колонна — часть машины потому, что она стоит в комнате, а не потому, что её успели заправить.
Соседство при этом считается по топливу: две пустые стойки рядом ничего не разгоняют, иначе бонус платили бы за строительные леса.
Обход внутренности 12³ — это 1728 чтений блока: шестьдесят раз в секунду абсурдно, раз в две секунды дёшево. Плата — задержка: стержень, вставленный рукой, попадает в расчёт со следующего обхода, то есть не позже чем через две секунды. Рядом со стержнем, который горит минутами, это незаметно.
Пары соседства считаются по +X, +Y, +Z — каждая пара ровно один раз, — но бонус получают обе стойки пары, отсюда ×2 в формуле выработки.
Выработка, топливо и нагрев
| Величина | Как считается |
|---|---|
| Потенциал (при 100 %) | стержни × 6 EU/FE × Mэ, где Mэ = 1 + 0,5 × пары |
| Отдача | × глубина‰ / 1000`, но не больше свободного места в буфере |
| Нагрев | полный нагрев × отдача / потенциал, где полный нагрев стержни × 4 × Mт, Mт = 1 + 0,8 × пары |
| Расход топлива | ровно отдача EU/FE за тик, разделённая между колоннами пропорционально их стержням |
| Тепло | тепло + нагрев − снято водой − сток, зажатое в 0…10 000 (полная шкала); сток оболочки — только у остановленной реакции |
Потолок применяется до ползунка, а не после. Сначала потенциал зажимается в 512 EU/FE/т, и только потом от него берётся глубина. Обратный порядок выглядел эквивалентным и не был: на любой зоне, чей потенциал уже перевалил за 512, каждая ступень ползунка давала одни и те же 512 EU/FE/т, то есть управление не делало ровно ничего именно на том масштабе, ради которого его строили.
Топливо считается в EU/FE, а не во времени. Контроллер списывает с колонн ровно ту энергию, которую выдал, а колонна переводит её в деления прочности стержней (144 EU/FE за деление, подробности — в спеке стержня). Отсюда главное свойство модели: стержень везде стоит 144 000 EU/FE, и никакая раскладка не делает уран дешевле.
Так было не всегда. До этапа 4 расход считался «эффективной глубиной» — долей потенциала, которую комната реально отдала, — и на большой комнате эта доля обрезалась целочисленным делением до своего пола в 1 ‰. Из одной строки следовали две нелепости: стержень жил около тысячи реальных суток, а нагрев превращался в полный нагрев / 1000 и рос без предела вместе с комнатой (зал 12×12×12 давал около 105 000 единиц тепла в такт — больше, чем оболочка физически способна впустить теплоносителя).
У нагрева свой коэффициент соседства, и он больше энергетического — = 40 % против = 25 %. Это главное число этапа 3: плотная зона греется быстрее, чем усиливается, поэтому раскладка, которая поднимает мощность, поднимает и цену охлаждения. Отношение «нагрев = отдача / 3», верное на этапе 2, больше не действует: у одиночной колонны это ⅔, у двух смежных — 0,79, а на очень плотной зоне стремится к 1,07 — то есть на потолке HV единиц тепла рождается больше, чем EU/FE.
Это же деление и ограничивает нагрев сверху. Оба слагаемых несут одни и те же стержни и те же пары, поэтому отношение «тепла на EU/FE» с ростом комнаты сходится, а не расходится:
нагрев на потолке HV → 512 × (4 × 0,8) / (6 × 0,5 = 546 ед./т
Плотная комната на потолке греется 500…546 единиц в такт (шесть колонн блоком 2×3 — 500, зал 12×12×12 — 546), и выше 546 не поднимается ни одна: чем реже стоят колонны, тем меньше тепла на тот же потолок.
Большая комната даёт не мощность, а автономность. Всё, что переросло 512 EU/FE/т, отдаёт одинаковые 512 EU/FE/т; растёт только время между заправками — тот же поток делится на большее число стержней. Аппетит комнаты при этом одинаков на любой раскладке, достигшей потолка: 256 стержней = 128 урановой руды в час. Числа по раскладкам — в
Тепло сводится каждый тик, даже когда реактор остановлен: остывание обязано работать, иначе «заглушить и подождать» не было бы способом спастись. Полная шкала остановленного реактора стекает в ноль за 395 тиков (19,8 с). За отметкой комната начинает плавить собственную начинку (см. «Расплав»), а шкала, дошедшая до 100 %, запускает обратный отсчёт аварии.
Управление: редстоун и глубина
| Орган | Что делает |
|---|---|
| Редстоун-сигнал на контроллере | есть — реактор работает, снят — аварийный стоп. Рубильник у двери глушит зону, ничего не разбирая |
| Ползунок глубины | пять ступеней 0 / 25 / 50 / 75 / 100 %; 0 % — тот же стоп, но изнутри экрана |
Больше органов управления нет намеренно: два — это ровно столько, сколько помещается в голову игрока, стоящего в дымящемся зале.
Ползунок едет по ванильному каналу кнопок контейнера, как переключатель купола у отпугивателя: номер кнопки и есть запрошенная глубина в процентах, своего пакета не нужно. Значение зажимается на сервере, а не в экране.
Ползунок работает на любом масштабе: он режет уже зажатую потолком величину, поэтому 50 % на слое 3×3 дают 256 EU/FE/т — и ровно вдвое меньше тепла, воды и урана в час. На этапе 2 это было не так (потолок применялся последним, и выше него все ступени были одинаковы); расхождение закрыто на этапе 3.
Охлаждение: вода — единственное, что остужает работающую комнату
Пока реакция идёт, оболочка не сбрасывает тепло вовсе. Всё, что не унесла вода, остаётся на шкале, поэтому реактор без воды греется до самого верха — и там запускает обратный отсчёт. Выработка от воды не зависит: сухой реактор отдаёт те же EU/FE и тратит то же топливо, просто идёт к аварии. Как быстро — решает только мощность:
| Активная зона | Нагрев, ед./т | Без воды до 70 % | Без воды до 100 % | Вода, мБ/т |
|---|---|---|---|---|
| 1 колонна (4 стержня) | 16 | 438 т (22 с) | 625 т (31 с) | 8 |
| 2 колонны рядом | 57 | 123 т (6 с) | 176 т (9 с) | 29 |
| 3 в ряд (12 стержней) | 124 | 57 т (3 с) | 81 т (4 с) | 62 |
| 6 блоком 2×3 и плотнее | 500…546 | 13…14 т | 19…20 т (1 с) | 250…273 |
Так было не всегда. До оболочка сбрасывала 4 + тепло × 8 / 1000 — до 84 ед./т — в любой момент, и любая зона слабее этого садилась на своё равновесие: одна колонна на 15 %, две смежные на 66 %, восемь стержней на 65 % глубины на 40 %. Воду можно было не подводить вовсе, прикрыв стержни, и первый же плейтест вкладки «Пульт» это показал.
Остановленная комната остывает сама — по той же кривой 4 + тепло × 8 / 1000: снятый рычаг, глубина 0 %, кончившееся топливо. Иначе «заглушить и подождать» перестало бы быть способом спастись.
Вода каждый такт уносит всё тепло реакции и сверх того — двадцатую часть уже накопленного:
тепло реакции = запрошено > 0 ?: 0
вода, мБ = ceil((тепло реакции + ceil(тепло / 20)) / 2) (округление ВВЕРХ)
снято = вскипело × 2
сток оболочки = реакция идёт ? 0: 4 + тепло × 8 / 1000
тепло(t+1 = clamp(тепло + тепло реакции − снято − сток, 0, 10 000)
Первое слагаемое держит шкалу, второе опускает её после засухи: пять плотных колонн, получившие воду на 100 %, возвращаются к 84 % за четыре такта и к нулю — за четыре секунды. Порога нет ни у одного слагаемого, и это лечит пилу, найденную плейтестом: прежний контур включался только с 60 % шкалы и снимал тепло шагами по две единицы, поэтому ядро, стоящее на линии, пересекало её каждые несколько тактов, и шкала мигала 59/60 %.
не мелочь: на самой малой глубине реакция запрашивает целый EU/FE, а её нагрев округляется до нуля, и без единицы такой реактор работал бы без воды вечно. Округление воды вверх — по той же причине: усечение возвращало 0 для любого тепла ниже обменного курса.
Реактору, которому хватает воды, шкала показывает ноль, и полоса пустая. Жёлтая зона означает, что вода не справляется, а плашка «ВНИМАНИЕ» зажигается ещё раньше — как только вода уносит меньше 95 % тепла реакции.
Кипятит контроллер, а не колонна: он проходит по своему списку колонн и просит у каждой столько, сколько ещё не набрал. Чего не удалось вскипятить — остаётся теплом и уходит на шкалу. В этом и весь отказ голодного контура: не сообщение об ошибке, а растущая полоса.
Пересборка стопок
Каждый тик контроллер приводит в порядок жидкости внутри каждой непрерывной вертикальной стопки колонн: вся вода собирается снизу, весь пар — сверху. Стопка тем самым ведёт себя как один сосуд, и труба, воткнутая в любой её блок, наполняет её целиком.
Без этого стопка попросту не наполнялась: вода оседает вниз, нижний блок первым доходит до потолка, и труба, спросившая «есть ли место?», получала «нет» от вдвое пустого сосуда.
⚠️ Колонны, стоящие бок о бок, не связаны. Раньше контроллер выравнивал баки по всей комнате, и одна труба поила весь зал. Это было удобно и неправдиво: теплоноситель, появляющийся внутри стойки, к которой ничего не подведено, читается как баг, как бы ни был полезен. Обвязывать нужно те колонны, которые охлаждают, — проще всего строить их стопками.
Голый режим: реактор без комнаты
Контроллер, у которого комната не сложилась, не бездействует. Если к нему физически примыкают заряженные стойки, он берётся вести их напрямую. Это второй полноценный режим работы, а не аварийное состояние.
Связь обязана быть физической. Контроллер шагает наружу от себя по соприкасающимся стойкам и блокам из экранирующего сплава — то есть по недостроенной оболочке тоже. Открытая земля реакцию не проводит: колонна, стоящая в трёх блоках через пустоту, не считается частью реактора, сколько бы её ни было. — предел длины обхода, а не радиус поиска.
Это правило появилось после плейтеста: раньше поиск шёл радиусом, и контроллер на голой земле зажигался от колонны через промежуток. Выглядело как передача энергии по воздуху. Вплотную — работает, и это ровно то ощущение, которое нужно.
Опасность не выключается полным буфером. Топливо тратится только когда энергия востребована (и это правильно), но реакция идёт независимо от того, покупает ли кто-то ток. Поэтому порча блоков завязана на «реактор не заглушен и в нём есть топливо», а не на выработку текущего тика — иначе её можно было бы выключить, просто отключив потребителей. Радиация ведёт себя так же и всегда вела.
| Запечатанная комната | Голый режим | |
|---|---|---|
| Как находит стойки | обход по стенам, границы задаёт комната | обход по соприкасающимся стойкам и блокам из экранирующего сплава |
| Мощность | полная, растёт с размером комнаты | от той же расстановки и не выше |
| Нагрев и вода | полная тепловая модель, контур охлаждения | нет: голому реактору нечего охлаждать, и шкал нагрева/воды на панели у него нет |
| Ползунок глубины | работает | игнорируется — стержни всегда опущены |
| Куда уходит EU/FE | через розетки reactor_outlet в стене | прямо из граней контроллера — розетка в голом режиме мертва |
| Опасность | расплав начинки за отметкой перегрева | плавит округу, пока работает |
| Излучение | держат стены | бьёт по округе беспрепятственно |
Единственное управление, которое голый реактор слушает, — редстоун. Снятый сигнал глушит его полностью, и это рабочая тактика: чтобы спокойно достроить оболочку вокруг живого ядра, достаточно дёрнуть рычаг.
Ползунок глубины намеренно не показан и не действует. Скрыто работающий ползунок был бы ловушкой: комната с выведенными стержнями, у которой выбили стену, молчала бы, ничего об этом не сообщая.
Мощность урезана дважды — долей и потолком, — и оба ограничения нужны. Доля делает голый реактор слабее построенного; потолок не даёт ответить на это, просто навалив больше стержней. Без потолка достаточно большая куча переиграла бы комнату, и оболочка с контуром охлаждения превратились бы в украшение.
Кто чьи стойки жжёт
Два контроллера рядом с одной кучей стоек посчитали бы её каждый целиком — это энергия из воздуха. Правил два, и оба решаются одним сканом, без всякого учёта на диске:
Стойки внутри чужой запечатанной комнаты не видны никому снаружи. Голый контроллер, поставленный у чужого работающего реактора, не сможет с него кормиться. Между двумя голыми контроллерами стойка достаётся ближнему. Ничья разрешается по координатам, а не по одной лишь дистанции: правило, которое каждая сторона считает по-своему, отдало бы стойку обеим.
Известная щель: контроллер в невыгруженном чанке не виден, поэтому стойка на дальнем краю границы чанков может недолго считаться дважды. Это несколько EU/FE в тик до подгрузки соседа; закрывать её принудительной загрузкой чанков — лекарство хуже болезни.
Расплав: цена перегрева
За отметкой запечатанная комната начинает плавить собственную начинку: пол, обычные трубы и всё, что игрок занёс внутрь. Первой всегда гибнет обычная жидкостная труба, где бы она ни стояла: это та часть, которую собирают из уже имеющегося под рукой, и потому именно она лучше всего объясняет, что пошло не так.
Оболочка при этом цела. Обшивка, стекло, дверь, ввод, вывод и сам контроллер стоят на кольце снаружи внутренности и в выборку не попадают вовсе. Ровно ради этого комнату и строили: авария остаётся внутри.
Стойки с топливом тоже целы. Они собраны на экранирующей пластине, и деталь, скрафченная чтобы пережить реактор, переживает и его аварию. Уран внутри не теряется — расплав отнимает у игрока обвязку и время, а не запас топлива.
Каждый расплавленный блок уносит тепла, поэтому расплав сам себя ограничивает — комната съедает свои внутренности и по ходу остывает. Игрок теряет начинку и топливо в ней, но получает оболочку, которую можно переоснастить, а не воронку.
Пока это происходит, заголовок панели показывает «Расплав» вместо геометрического вердикта: совершенно целая оболочка в этот момент говорит правду, и это наименее полезная правда из возможных.
Порча блоков: как это выглядит
Оба режима портят блоки одинаково и всегда предупреждают заранее — точечно, у самого блока.
- Блок выбран. У него вспыхивают пламя и дым, слышится шипение.
- Проходит (две секунды). Успеть отойти или снять то, что на нём стоит, —
ровно та разница между опасностью и наказанием.
- Блок становится источником лавы. Выбор предпочитает клетки, над которыми воздух: шар вокруг
стойки наполовину уходит под землю, и без этого правила большая часть порчи выгрызала камень под ногами невидимо, а видимый след выглядел вдвое уже заявленного радиуса. Если игрок за это время его выломал, ничего не происходит: выбор перепроверяется, а не выполняется вслепую.
Что не плавится ни в одном режиме: воздух, всё с жидкостью внутри (в том числе затопленные блоки — вода останавливает лаву везде, и затопить помещение это честная тактика), и всё неразрушимое — проверяется по свойству блока, а не по списку имён, поэтому чужой мод со своим бедроком уважается сам собой.
Что не плавится нигде и никогда: всё, что собрано из экранирующего сплава. Это блоки реактора — обшивка, стекло, дверь, ввод, вывод, лампа, кнопка, стойки и контроллер — и экранирующий сундук. Правило именно такое: «сделано из экранирующего сплава — не плавится», а не «принадлежит реактору». Список живёт тегом блоков, и датапак может его дополнить. Без этого «голая станция как долгосрочная стратегия» была бы не выбором, а бикфордовым шнуром. Всё остальное в радиусе — кабели игрока, его трубы, сундуки и земля под ногами — цель законная, и это и есть цена срезанного угла.
Радиус в голом режиме считается от каждой заряженной стойки, а не от контроллера. Контроллер — это мозг, опасно топливо; радиация уже считает так же, поэтому обе механики отвечают на вопрос «как далеко опасно» одинаково. Считать от контроллера было ошибкой, которую видно с обратной стороны реактора: он стоит в стене, половину шара занимает собственный неуязвимый корпус, и вся порча ложилась с той стороны, куда он смотрит.
⚠️ Лава течёт. Расплавленный блок становится источником лавы, а она растекается по ванильным правилам — до трёх блоков вбок и вниз без предела. Один расплавленный блок это не одна потеря, а лужа; через дыры в недостроенной оболочке лава затекает внутрь. Это сознательная суровость, но строить голую станцию вплотную к тому, что жалко, не стоит.
⚠️ Блок под игроком или мобом не защищён. Суровость сознательная: погибнуть по невнимательности посреди уже идущей аварии можно, и пропусков позиций ради безопасности нет.
Полностью выключается ключом. Выключенный оставляет все предупреждения на месте — звук, частицы, статус, — но не меняет ни одного блока: ключ защищает мир, а не прячет состояние реактора.
Авария на ста процентах
Шкала нагрева, дошедшая до верха, больше ничем не заканчивается — она запускает обратный отсчёт. Заголовок панели меняется на «АВАРИЯ», под ним появляется убывающая красная полоса, и сирена звучит до самого конца.
Полоса без цифр намеренно. Длительность выпадает случайно, от двух до трёх минут на каждую аварию: фиксированный срок игроки выучили бы наизусть за неделю и перестали бы читать панель. Полоса честно говорит «времени всё меньше» и не говорит, сколько именно.
Отменить можно до последнего тика — точки невозврата нет. Два способа, и оба сводятся к одному: шкала должна сойти с сотни и продержаться внизу пять секунд.
- подать воду в контур;
- дёрнуть рычаг (скрам).
Пробить стену — не способ, хотя раньше панель его советовала. Комната упадёт в голый режим, а у голого реактора своя шкала: от 14 стержней нестабильность разгоняется до сотни примерно за 20 секунд и запускает новый отсчёт — уже без контура, который мог бы помочь.
Пять секунд — не придирка, а защита от очевидного обхода. Тепло прижато к потолку шкалы, поэтому одного тика без сигнала хватает, чтобы прибор прочитал 99 %. Пока отсчёт снимался по мгновенному значению, редстоун-таймер с одним выключенным тиком из двадцати давал реактору 95 % мощности и полную неуязвимость. Теперь отсчёт на время «просадки» замирает, а отменяется только если ядро продержалось внизу всё окно целиком; вернулось к сотне хоть на тик — накопленное сгорает. Любой честный способ укладывается с большим запасом, мигание сигналом не даёт ничего.
Полный буфер к этому списку не относится. Реактор, которому некуда девать энергию, не останавливается: реакция идёт, шкала растёт, и без охлаждения он дойдёт до взрыва ровно так же. Меняется только одно — уран при этом не тратится, потому что топливо списывается за отданную энергию. Реактор, забытый включённым с полным буфером, греется бесплатно и взрывается даром.
Сила взрыва растёт от числа стержней и упирается в потолок. Числа — в удерживает целиком (внутри всё выжжено, снаружи не тронут ни один блок), большую станцию — уже нет. Ради этого стены и стоят столько, сколько стоят.
После взрыва остаётся воронка, лава в эпицентре, разбросанный из стоек уран и заражённая земля — но только там, куда взрыв реально дотянулся. Выключатель убирает аварию целиком, оставляя отсчёт, звук и надпись на панели.
Нестабильность голого реактора
У реактора без комнаты нет ни нагрева, ни воды — зато есть нестабильность, и она видна на панели отдельной строкой. Растёт она от числа стержней в куче и сама же спадает, поэтому у каждого размера
| Стоек в куче | Где встанет | Что это значит |
|---|---|---|
| 1 | ~29 % | стоит вечно |
| 2 | ~59 % | стоит вечно |
| 3 | ~89 % | предел: работает вечно, но панель в красном |
| 4 и больше | равновесия нет | разгон до ста и тот же отсчёт |
Отсюда и правило лавовой фермы: три стойки — максимум, который можно оставить работать без присмотра. Четвёртая превращает ферму в бомбу, и панель показывает это заранее.
Интерфейс
Тип: экран без единого слота и без инвентаря игрока — контроллер читают, а не загружают. Слотов нет намеренно: пустые слоты приглашали бы к нему воронки. Ряды инвентаря игрока занимали бы нижнюю половину панели, и щелчок по ним ничего не делал бы. Панели улучшений нет: контроллер не машина-переработчик, и четыре скрытых слота под апгрейды были бы обещанием того, чего он не умеет. Стрелки прогресса нет: у реактора нет операции, которая «идёт».
Экран с вкладками. Панель 236×184, вдоль её левого края — вкладки на спрайтах экрана достижений самой игры: у каждой иконка-предмет и подсказка с названием. Вкладки появляются по одной, и пустых вкладок «на будущее» нет. Сейчас вкладок четыре — «Пульт», «Комната», «Активная зона» и «Контур». На закрытой вкладке может гореть метка: красная означает тревогу, жёлтая — внимание. Последняя открытая вкладка запоминается до перезапуска игры.
Шапка одинакова на всех вкладках: название вкладки, плашка состояния справа и полоса отсчёта аварии без цифр под ней. Плашка выбирается по порядку — первое подходящее состояние побеждает:
| Плашка | Когда |
|---|---|
| АВАРИЯ | идёт обратный отсчёт |
| РАСПЛАВ | комната плавит свою начинку |
| БЕЗ ОБОЛОЧКИ | комната не собрана, но скан нашёл стойки |
| СТРОЙКА | комната не собрана, стоек нет |
| ВНИМАНИЕ | тепло на линии предупреждения или выше, выхлоп пара забит, или вода уносит меньше 95 % тепла реакции |
| СТОИТ | комната собрана, выработка ноль |
| РАБОТАЕТ | всё остальное |
Отсчёт стоит выше расплава, потому что только у него есть срок. «Внимание» стоит выше «стоит»: пока реакция идёт, оболочка тепло не сбрасывает, и реактор, которому не хватает воды, идёт к аварии, продаёт он энергию или нет. Раньше полный буфер показывал такой реактор серым «СТОИТ». Остановленная комната воды не расходует и недоохлаждённой не считается.
Вкладка «Пульт»
Вкладка показывает реактор в одной из трёх форм — никогда в двух сразу.
| Форма | Когда | Что на ней |
|---|---|---|
| Работа | FORMED | шкала тепла с метками; «Выработка» (EU/FE/т или причина простоя красным) и «Буфер»; «Вода» с расходом и «Пар»; «Стержни»; ползунок глубины и кнопка СТОП; совет |
| Без оболочки | не FORMED, скан нашёл стойки | шкала нестабильности; «Выработка», «Буфер», «Стержни»; вместо ползунка — пояснение, что такой реактор глушится только редстоун-сигналом; совет |
| Стройка | не FORMED, стоек нет | вердикт сканера красным; кнопка «Открыть «Комнату»» — карта, чек-лист и место проблемы на той вкладке; «Буфер»; совет с тем, что исправить |
Метки на шкале тепла — предупреждение (70 %) и начало расплава (85 %), с числами под ними. Метки цели контура (60 %) больше нет: реактор с водой стоит у нуля шкалы, и линия, у которой он раньше держался, перестала что-то описывать. Её канал теперь несёт долю тепла, которую унесла вода. Числа приходят каналами с сервера, а не читаются из конфига клиента. Конфиг на клиент не синхронизируется, поэтому на сервере с изменённым балансом метки иначе стояли бы не там, где реактор действует. Первая редакция экрана так и ошибалась: жёлтый цвет шкалы брался из конфига клиента. Цвет полосы — зелёный до предупреждения, жёлтый до расплава, красный выше.
Рядом с подписью тепла — стрелка тренда: вверх, если за последние две секунды тепло выросло на 2 % и больше, вниз — если на столько же упало. Реактор, стоящий на своём равновесии, колеблется на процент в обе стороны, и стрелка, мигающая вместе с ним, перестала бы что-то значить. Первые две секунды после открытия экрана стрелки нет: сравнивать ещё не с чем.
Пар — своя шкала. С 90 % подпись меняется на «выхлоп забит», а шкала желтеет. С забитым выхлопом полоса воды стоит успокоительно полной, пока тепло растёт: вода на месте, а кипеть некуда. Раньше об этом говорил только жёлтый цвет полосы воды, и нигде не было сказано, что он значит.
Глубина стержней — ванильный ползунок с шагом 5 % и кнопка СТОП, которая ставит глубину 0 %. Значение уходит на сервер одним запросом: когда ползунок отпускают или когда нажимают стрелку на клавиатуре. Канал — ванильные кнопки контейнера, номер кнопки и есть глубина в процентах. Запрошенное значение держится на экране до ответа сервера, но не дольше двух секунд. Без этого число отскакивало бы назад при перетаскивании, а без предела отклонённый сервером запрос остался бы на экране навсегда.
Ползунок и СТОП показаны только у собранной комнаты. Голый реактор глубину игнорирует, а орган управления, который выглядит живым и ничего не делает, — ровно та ловушка, от которой отказались при введении голого режима. Щелчок мимо ползунка в других формах ничего не двигает — ползунка там просто нет.
Совет — тёмное поле внизу вкладки: заголовок в цвете состояния и что сделать. Если перевод длинный, текст уменьшается целиком, а не обрезается посреди фразы.
| Состояние | Что говорит совет |
|---|---|
| отсчёт | уйти с вершины шкалы и продержаться внизу несколько секунд; способы по номерам — вода и рычаг (у голого реактора — рычаг и разбор стойки: воды у него нет) |
| расплав | уменьшить глубину или подать воду; называет порог расплава |
| без оболочки | блоки вокруг стоек плавятся; с 80 % нестабильности — тревога «предел» |
| стройка | что исправить для этого вердикта сканера; где — на вкладке «Комната» |
| выхлоп забит | проверить паровую насадку |
| нет воды | без воды реактор ничем не охлаждается и дойдёт до аварии; подвести воду через реакторный ввод |
| перегрев | вода не уносит всё тепло; добавить нитку воды или уменьшить глубину |
| не хватает воды | называет долю тепла, которую уносит вода: остальное греет реактор |
| стоит | как исправить именно эту причину простоя |
| норма | вода уносит всё тепло |
«Нет воды» — предупреждение при любой температуре. Пока работают стержни, ничто, кроме воды, реактор не остужает, поэтому сухая комната идёт к аварии с первого такта. Вода, уносящая 95 % тепла и больше, считается достаточной: подача, опаздывающая на миллибакет в отдельные такты, не должна мигать плашкой.
Подсказки при наведении есть у шкалы тепла (что значит каждая метка, в её цвете), выработки, буфера (точный заряд в EU/FE), воды, пара, нестабильности, ползунка и кнопки СТОП.
Строка «Выработка» никогда не показывает прочерк. Собранный, заправленный и молчащий реактор — худшее состояние этой машины, и у каждой его причины свой способ починки, поэтому вместо нуля там печатается причина простоя красным: не загерметизирован, нет топлива, стержни подняты, нет редстоуна, буфер полон. Прочерк оставлял игрока гадать между пятью разными неисправностями.
Каждая строка — метка и значение, измеренные по отдельности. Значение сохраняет размер: ради него строку и читают. Метка уменьшается в оставшееся место. Это прямое следствие первой редакции экрана: там метка и значение были одной строкой, и русский текст наезжал на пиктограмму.
Вкладка «Комната»
Вкладка для стройки: оболочка сверху, проверки сканера по порядку и что исправить.
Несобранная комната открывает экран сразу на «Комнате». Решение принимается на первом такте после прихода каналов с сервера, а не при открытии экрана: свежее меню читает нули, а ноль — порядковый номер собранной комнаты. Признак прихода — канал наибольшей комнаты: сервер шлёт его всегда, и нулём он не бывает. Если игрок уже сам выбрал вкладку, выбор не трогается, и «Комната» не становится вкладкой, на которую он вернётся в следующий раз. Метка на ярлыке вкладки — красная, пока оболочка строится, жёлтая в голом режиме.
Карта сверху. Клетка — столбец блоков, север вверху, восток справа. На карте кольцо оболочки, внутренний объём, контроллер (оранжевый) и мигающие клетки проблем — у бреши все дыры, до 12 по координатам. В клетке подписана высота дыры относительно контроллера («+2»): сверху пол от потолка не отличить. Если в одном столбце несколько дыр, клетка подписана «×2», а подсказка при наведении перечисляет каждую. Поле под картой у бреши с несколькими дырами называет их число вместо направления до первой; если дыр больше 12 — ещё и сколько из них на карте. Ориентация по сторонам света, а не «от лица контроллера»: направления в тексте — «4 на восток, 2 вверх» — тоже по сторонам света, а карта, поворачивающаяся вместе с контроллером, у половины комнат рисовала бы восток слева. Размер клетки подбирается под комнату: 5×5 не рисуется марочкой, а оболочка 15×15 — комната на блок больше предела — влезает целиком. При наведении клетка проблемы называет направление до каждой своей дыры, клетка контроллера — что это контроллер.
Пока лучи сканера не нашли все шесть стен, оболочки на карте нет: только контроллер и клетка проблемы, а у ROOM_UNBOUNDED под картой написано «Стены не найдены».
Чек-лист — проверки сканера в том порядке, в котором он их выполняет:
| # | Строка | Статус, который её валит |
|---|---|---|
| 1 | Контроллер смотрит в комнату | CONTROLLER_NOT_IN_WALL, комната не измерена |
| 2 | Все шесть стен найдены | ROOM_UNBOUNDED |
| 3 | Внутри от 3 до 12 | TOO_SMALL, TOO_LARGE |
| 4 | В оболочке нет дыр | BREACH |
| 5 | Контроллер в стене, не в ребре | CONTROLLER_NOT_IN_WALL, комната измерена |
| 6 | Один контроллер | SECOND_CONTROLLER |
| 7 | Дверь, если есть, стоит на полу | NO_DOORWAY |
| 8 | Стекла не больше 30 % | TOO_MUCH_GLASS |
Строки до проваленной отмечены ✓, проваленная — ✗ на подсвеченном фоне, строки после неё — «·»: до них сканер не дошёл. Чек-лист отвечает и на «что уже пройдено»: игрок, чинящий комнату по блоку, видит, как красная строка уходит вниз, а одиночный красный вердикт не показывал, что размер был в порядке с самого начала.
Почему «контроллер не в стене» — две строки. Сканер выдаёт этот статус из двух разных мест. До лучей — клетка перед лицом контроллера занята: ничего не измерено, это первая проверка. Во время и после обхода периметра — контроллер стоит в полу, потолке или ребре: к этому моменту лучи уже измерили комнату, стены и размер пройдены. Различает случаи то, измерена ли комната. Одна строка с ✗ наверху над двумя строками, про которые известно, что они пройдены, говорила бы неправду. Одно исключение из «всё до провала пройдено»: контроллер в полу или потолке находится посреди обхода периметра, поэтому строка «нет дыр» у этого случая остаётся «·», а не ✓.
Порядок строк сверяется с настоящим сканером: L1-тест строит комнаты сразу с двумя дефектами и требует, чтобы сканер назвал дефект более ранней строки.
Пределы в строках приходят каналами с сервера, как метки тепла: конфиг на клиент не синхронизируется, и чек-лист с локальными 3…12 на сервере с другими пределами показывал бы не те числа.
Откуда карта знает стены. Каналы несут размер внутреннего объёма и смещение его западного и северного края от контроллера, а у бреши — число дыр и смещения первых 12, по три канала на дыру. Не упакованные в один канал: у предела размера комнаты в конфиге нет потолка, и упакованное смещение на большой комнате перевернулось бы. Раньше неудачный скан выбрасывал измеренную комнату, и у бреши размер приходил нулём. Теперь каждый вердикт, найденный после лучей, — размер, дыра, неверно поставленный контроллер или дверь, стекло — несёт комнату, в которой найден.
Поле под картой — такое же тёмное поле, как совет на «Пульте»: вердикт в цвете состояния, что исправить и где. У собранной комнаты — «Комната герметична» и отсылка к «Пульту», где реактором управляют.
Прочерк вместо нулей. Пока комната не измерена, в строке размера стоит «не измерено», а не «0 × 0 × 0». Ноль — это тоже измерение, и показывать его там, где измерения не было, значит врать; прочерк честно говорит «нечего показать». То же с местом проблемы: направление печатается только у тех состояний, которые действительно указывают на блок (BREACH, SECOND_CONTROLLER, CONTROLLER_NOT_IN_WALL, TOO_MUCH_GLASS); у NO_DOORWAY «место» — это сам контроллер, и смещение было бы шумом.
ROOM_UNBOUNDED направления не показывает, хотя техническая позиция у него есть. Это правка после игрового теста: «место» такого статуса — точка, где сдался луч, до 13 блоков в чистом поле, и одинокий контроллер, дымящий в склон холма, оказался хуже молчания. Он указывал туда, где чинить нечего.
Место — это направление, а не координаты. Смещение считается от самого контроллера и звучит как «4 на восток, 2 вверх»: игрок, который читает экран, стоит у контроллера, и такая фраза приводит его к нужному блоку быстрее, чем три числа. Оси с нулевым смещением опускаются — брешь прямо над головой читается как «2 вверх», а не «0 на восток, 2 вверх, 0 на юг». Технически это ещё и единственный возможный вариант: канал синхронизации меню передаёт 16-битное знаковое число, абсолютная координата мира в него не влезает, а смещение по построению не превышает ±14.
Снаружи состояние тоже видно: у сформированной комнаты лицевая грань контроллера светится (блокстейт formed), у несформированной — тёмная. Проверить постройку можно, не открывая экран.
Вкладка «Активная зона»
Вкладка показывает активную зону сверху: одна клетка — одна вертикальная стопка колонн. Стопка — один сосуд для воды и пара, поэтому и читается она как одно целое. Сетка ориентирована как карта «Комнаты»: север вверху, восток справа.
Клетка — как ячейка инвентаря. Стержни нарисованы столбиками по средней колонне стопки: яркие — заряженные, тёмные — пустые оболочки. Под ними — полоска износа в стиле прочности предмета: зелёная у свежих стержней, через жёлтую к красной у выгоревших, по среднему износу стопки. Если в стопке больше одной колонны, в углу клетки подписано их число — если клетка не мельче 9 пикселей, то есть в зонах до 9×9. Размер клетки подбирается под зону: зал 12×12 помещается целиком, а две стопки не раздуваются во всю сетку. В зонах от 9×9 клетка слишком мала для четырёх столбиков, и она рисуется одной заливкой: зелёной, если в стопке есть топливо, тёмной, если только пустые оболочки, — с линией износа внизу.
Самая плотная стопка помечена красным квадратом в углу клетки. Тепла по колоннам в моде нет — оно одно на всю комнату, — поэтому пометка стоит не на «самой горячей», а на стопке, у колонн которой больше всего заправленных соседей по шести направлениям. Бонус соседства считается на всю комнату: каждая пара поднимает выработку и нагрев всего реактора, а выработка делится между всеми стержнями поровну. Пометка поэтому показывает, где этот бонус набирается, а не стопку, которая греется сильнее. Стойка с одними пустыми оболочками соседом не считается. При равенстве побеждает первая по порядку: самая северная, а среди них — самая западная.
Панель справа — подробности выбранной стопки: колонн, ТВЭЛ (заряжено из мест), пустых оболочек (жёлтым, если есть), износ — средний и худший, остаток энергии, заправленных соседей, вода и пар стопки. Щелчок по клетке выбирает стопку. Пока ничего не выбрано, показывается стопка, которую менять первой, а если менять нечего — самая плотная. Выбор привязан к месту стопки относительно контроллера, а не к углу зоны: когда голый реактор теряет самую западную стойку и угол зоны сдвигается, выбранной остаётся та же стопка.
Под сеткой — сводка по зоне (стопок, заряженных ТВЭЛ, средний износ) и строка «Менять первой»: стопка с самым изношенным стержнем, причём пустая оболочка считается изношенной полностью; при равенстве — самая северная, затем самая западная. Пока ни один стержень не изношен, строка говорит, что менять нечего. Метка на ярлыке вкладки — жёлтая, пока хотя бы в одной стойке лежат пустые оболочки.
| Состояние | Что на вкладке |
|---|---|
| Комната собрана | сетка по внутреннему объёму комнаты |
| Голый режим | сетка по габариту всех стоек, до которых дошёл обход, — и заправленных, и с одними пустыми оболочками |
| Комната собрана, колонн нет | сетка пустых ячеек и «В комнате нет колонн» |
| Комната не собрана, стоек нет | «Соберите комнату, чтобы увидеть зону» |
Данные — своим пакетом, а не каналами меню. Канал меню — 16-битное число, а зона — до нескольких сотен стопок по полтора десятка чисел. Пакет reactor_zone уходит только игроку с открытым экраном этого контроллера: отправка висит на меню, а его ваниль зовёт лишь для открытого экрана. Не чаще раза в секунду и только если снимок изменился; первый снимок уходит сразу при открытии. Колонна, поставленная или сломанная, появляется в снимке после ближайшего скана комнаты. Стопки складывает сервер, поэтому в пакете не больше одной записи на клетку зоны — до 289, это площадь 17×17, дальше которой голый реактор в радиусе поиска 8 не расходится. Комната шире 17 клеток (предел размера в конфиге не ограничен) показывается своим северо-западным углом 17×17; соседи через край среза при этом считаются. Координаты в пакете — смещения: стопок — от угла зоны, угла — от контроллера. Абсолютные позиции мира сервер не отдаёт.
Остаток энергии считается той же арифметикой, которой стержни тратятся: оставшиеся деления прочности, умноженные на EU/FE за деление. Второй формулы на экране нет, поэтому вкладка не пообещает энергию, которую стойка не отдаст.
Вкладка «Контур»
Вкладка показывает водяной контур сверху той же сеткой, что и «Активная зона»: одна клетка — одна вертикальная стопка колонн. Стопка, выбранная на одной из этих двух вкладок, выбрана и на другой.
В клетке два столбика бок о бок: слева вода, справа пар, оба растут от дна клетки. Это два разных бака, и в один столбик они не складываются: полный бак пара, спрятанный за полным баком воды, — ровно та неисправность, ради которой вкладка сделана. Пар желтеет, когда выхлоп стопки считается забитым; под столбиком воды сухой стопки — красное дно. В клетках от 12 пикселей неисправная стопка ещё и помечена квадратом в углу: жёлтым — забитый выхлоп, красным — нет воды; в клетках мельче квадрат закрыл бы сами столбики, и неисправность там видна по их цвету.
Сухая стопка — хотя бы в одном её сосуде нет ни миллибакета воды и за последнюю секунду он не отдал реакции ни капли. Струйка — уже не сухая: она кипит, и отправлять игрока её чинить незачем. Не сухая и стопка, которую реакция каждый такт выкипает досуха, а труба снова доливает: контроллер выкипает колонны по порядку своего списка, труба доливает на своём такте, и в момент снимка такая стопка может держать 0 мБ — но она работает. Выхлоп забит — пар в сосуде занял 90 % места и больше: вода есть, но кипеть ей почти некуда. Это та же черта, на которой желтеет шкала пара на «Пульте». Сосуд — непрерывный по высоте участок стопки, так их пересобирает контроллер; клетка с разрывом по высоте — два сосуда, и каждый оценивается сам: полный нижний не спрячет пустой или забитый верхний.
Панель справа — выбранная стопка: колонн, вода и пар в миллибакетах от ёмкости с полосками и состояние — «В порядке», «Сухая» или «Выхлоп забит». Пока ничего не выбрано, показывается первая стопка с забитым выхлопом, а если таких нет — первая сухая, а если нет и сухих — первая стопка зоны.
Под сеткой — сводка: сколько стопок сухих, у скольких забит выхлоп и сколько воды реактор выкипел за последний такт. Ниже — совет, первый подходящий по порядку:
| Что в контуре | Совет |
|---|---|
| Голый режим | «В голом режиме контура нет»: стойки без комнаты воду не греют и в ней не нуждаются |
| Комната не собрана | «Комната не собрана»: что исправить, подскажет вкладка «Комната» |
| Комната собрана, колонн нет | «В комнате нет колонн» |
| Забит выхлоп хотя бы у одной стопки | «Пару некуда уходить»: названа стопка, проверить паровую насадку над ней — перед раструбом нужен воздух |
| Воды нет ни в одной стопке | «В контуре нет воды»: подвести воду через реакторный ввод |
| Есть сухая стопка | «В стопке нет воды»: названа стопка; колонны, стоящие рядом, водой не делятся |
| Вода уносит меньше 95 % тепла | «Контур не справляется», с долей тепла |
| Всё в порядке | «Контур в порядке» |
Забитый выхлоп стоит первым: пар, которому некуда уйти, останавливает кипение даже в стопке, куда труба доливает воду, и подводить воду раньше бесполезно. Сухая стопка рядом с мокрыми — почти всегда та самая ошибка обвязки, поэтому совет называет стопку, а не комнату. Вторая причина — нитка, которая не успевает: контроллер выкипает воду из колонн по порядку своего списка, и стопка, чья труба отстаёт, в конце концов пересыхает, — поэтому совет предлагает проверить и нитку. Зона шире 17 клеток (предел размера комнаты в конфиге поднят выше заводского) оценивается по показанному северо-западному углу: стопки за краем среза в сводку и совет не попадают.
Метка на ярлыке — красная, когда есть сухая стопка или забитый выхлоп и вода уже уносит меньше 95 % тепла реакции: тепло копится. Жёлтая — неисправность есть, но тепло пока уходит. Короткий контур без сухих и забитых стопок отмечает «Пульт».
Данные — тот же пакет reactor_zone. К каждой стопке добавлены вода и пар в миллибакетах с ёмкостями и два флага; неисправности оценивает сервер по бакам колонн, клиент ничего не пересчитывает. Расход воды — канал меню, который и так показывает «Пульт». Числа из конфига на вкладку не выводятся: конфиг на клиент не синхронизируется.
Обратная связь в мире
Одного текста мало на комнате из тысячи блоков, поэтому контроллер отвечает ещё и звуком с частицами. Мультиблок, который молча начинает работать, оставляет игрока в сомнении, начал ли он.
| Событие | Что происходит |
|---|---|
| Комната собралась (не была собрана → собралась) | звук ANVIL_LAND (0.6, тон 1.6) у контроллера + 12 частиц END_ROD над ним |
| Комната развалилась (была собрана → перестала) | звук BEACON_DEACTIVATE (0.5, тон 1.4) в месте бреши, ровно один раз |
| Пока проблема не исправлена | 16 частиц дыма в проблемной клетке при каждом сканировании; у бреши — над каждой из первых 12 дыр |
Звук поломки играет только на переходе, а не в цикле — это принципиально. Сканирование идёт раз в две секунды; сигнал тревоги, повторяющийся раз в две секунды до тех пор, пока игрок не найдёт блок, из подсказки превращается в наказание. Один раз он нужен потому, что стену обычно вскрывает крипер, и в этот момент игрок смотрит в другую сторону. Дальше работают частицы: они не мешают, но видны с той секунды, как игрок повернулся.
Дым — теперь единственная частица бреши. К нему прилагались сердитые «облачка» ANGRY_VILLAGER, и игровой тест их забраковал: над стеной они читаются как мультяшные тучки, а не как отметка неисправности.
Звук сборки — тот же ANVIL_LAND, что у дистилляционной колонны при сборке башни. Это сделано намеренно: «мультиблок собрался» в моде должно звучать одинаково, независимо от того, какой именно мультиблок собрался.
Заливка флага formed
Контроллер — единственный, кто ставит блокстейты formed и edge, и ставит он их всей оболочке, а не себе одному. Он же зажигает свет в комнате (подробности — в разделе «Бесшовный вид» и в спеке лампы).
| Поле | Значение |
|---|---|
| Что обходится | клетки периметра явно заданной коробки |
| Какая коробка при успехе | измеренная этим сканом; она же запоминается |
| Какая коробка при провале | последняя запомненная — та, которую контроллер когда-то засчитал |
| Что пишется | только клетки, у которых значение изменилось |
edge | ставится в formed && клетка вне коробки более чем по одной оси |
| Свет | в каждой внутренней клетке напротив лампы появляется minecraft:light уровня 15 (и убирается при разборке) |
| Флаг | 2 |
Почему коробка передаётся явно, а не берётся из результата скана. Провалившийся скан коробки не измеряет — у него maxX < minX. Заливка, идущая от результата, поэтому физически умела только включать флаг: пробитая стена оставляла комнату бесшовной и освещённой, будто ничего не случилось. Первый игровой тест нашёл ровно это. Контроллер теперь помнит последнюю засчитанную коробку и при провале гасит её. Коробка пишется в NBT (BoxMinX…BoxMaxZ): чанк может выгрузиться целым, а загрузиться уже с дырой, и контроллер, забывший коробку, оставил бы оболочку навсегда «собранной».
Экономия здесь не микрооптимизация: заливка идёт при каждом сканировании, то есть раз в две секунды у каждого контроллера в мире. Прочитать тысячу блокстейтов дёшево, переписать тысячу — нет, и лишний вдобавок дёргал бы обновления соседей на каждом проходе. Флаг 2 без флага 1 выбран по той же причине: свойства косметические, клиенту знать надо, соседям — незачем.
Энергия
| Поле | Значение |
|---|---|
| Роль | производитель, тир HV |
| Буфер (EU/FE) | = 200 000 |
| Макс. вход (EU/FE/такт) | 0 — реактор снаружи не заряжают |
| Макс. выход (EU/FE/такт) | 512 = потолок HV |
| Грани | все, кроме лицевой, отдают (→ OUT); у лицевой — NONE |
Лицевая грань энергетически инертна по правилу R-NRG-03: на ней панель, которую читает игрок, и кабель, вылезающий из середины интерфейса, испортил бы и вид, и понимание.
Буфер в 200 000 EU/FE — не накопитель, а демпфер: сеть, которая не может забрать энергию сию секунду, не должна останавливать активную зону посреди тика. На потолке это 391 тик (19,5 с) отдачи, и ровно столько же он набирается с нуля. Один электрумный кабель несёт 192 EU/FE/т на сегмент, поэтому реактор, работающий на потолке, выпивается тремя независимыми нитками — или машинами, приставленными к граням вплотную.
Свойства блока
| Поле | Значение |
|---|---|
| Форма | полный куб 16³ (окклюдер) |
| Прочность | 5.0 |
| Взрывоустойчивость | 30.0 |
| Инструмент | кирка (обязательна для дропа) |
| Звук | металл |
| Блокстейты | facing (горизонтальный), formed |
| BlockEntity | да (сканер, реактор и канал синхронизации) |
Вердикт контроллер на диск не пишет: комната и есть сохранение. После загрузки мира первое же сканирование выведет состояние заново из того, что стоит вокруг. Записанный вердикт мог бы пережить редактирование мира, у которого унесли стены, и врать.
В NBT хранится только то, что из мира не выводится: границы последней засчитанной коробки (BoxMinX…BoxMaxZ), накопленное тепло и положение ползунка. Коробка — не вердикт, а адрес: он нужен, чтобы при следующем провале скана было что гасить (см. «Заливка флагов»); ошибиться он не может — если коробка устарела, заливка просто снимет флаги там, где их и так нет. Тепло и глубина — состояние машины: реактор, забывший их при выгрузке чанка, остывал бы даром и самовольно возвращался на полную мощность.
Звук
Когда шкала, по которой судят реактор, переваливает за порог предупреждения, контроллер один раз включает сирену. У запечатанной комнаты это нагрев, у голого реактора — нестабильность. Раньше сирена читала только нагрев, и голый реактор, у которого нагрева нет, проходил весь отсчёт аварии молча. Её не приглушают ни стены, ни закрытый шлюз: она слышна далеко за пределами комнаты, потому что предназначена тому, кого в комнате нет. Повторно она сработает только после того, как шкала опустится ниже (60 %) — тревога, звучащая на каждом колебании шкалы, перестаёт быть тревогой. Лавовая ферма из трёх стоек стоит около 90 % нестабильности и поэтому подаёт сигнал один раз, при запуске.
Но у шкалы, упёршейся в потолок, разговор другой. Пока нагрев держится на ста процентах, сирена не умолкает: она повторяется каждые три-пять секунд, вразнобой, и прекращается только когда температура пошла вниз. Одиночный сигнал там был бы худшим из решений — реактор в самом опасном своём состоянии оказался бы тише реактора, который просто нагрелся.
Гул колонн держится, пока идёт реакция, а не пока реактор продаёт энергию: полный буфер его не глушит. Раньше гул висел на выработке, и реактор с полным буфером играл звук остановки, продолжая греться. Остановка самой реакции — снятый редстоун, кончившееся топливо, поднятые стержни — отзывается своим падающим звуком. Короткий сигнал собравшейся комнаты и звук её разгерметизации описаны выше, в разделе «Обратная связь в мире».
Рецепты
Крафт — ×1 за раз.
S C S S = экранирующая пластина ×4
R A R R = укреплённая экранирующая пластина ×2
S D S C = схема управления реактором ×1
A = продвинутый машинный корпус ×1
D = привод управляющих стержней ×1
Схема управления — отдельный предмет: 4 палладиевые пластины, резонансная катушка, 2 продвинутые схемы, электронная схема и редстоун
Катушка встала на место нестабильного изотопа, который стоял здесь в первой редакции. Изотоп — продукт инкубатора, а инкубаторную ветку из требований реактора убрали: она вела игрока в биологический раздел мода ради одного предмета и делала ядерку заложницей чужой цепочки. Резонансная катушка на эту роль подходит лучше — она уже стоит на ступени «эндгеймовая электроника», к ней ведёт термоцентрифуга, и по требуемому уровню развития она изотопу равна.
Прогрессия
Тир: HV — производитель до 512 EU/FE/такт. Требует: экранирующие и укреплённые экранирующие пластины (цепочка описана в обшивке), продвинутый машинный корпус, продвинутые схемы, палладиевые пластины, резонансную катушку. Открывает: собственно реакторную комнату — без контроллера набор блоков остаётся набором блоков.
Связанное
Реакторная обшивка — из чего он сканирует комнату, геометрия и цепочка крафта. Шлюзовая дверь — штатный вход в комнату; если она стоит в оболочке, то обязана образовать проём. Реакторное стекло, лампа и реакторный ввод — остальные блоки, которые сканер засчитывает как стену. Реакторная колонна — что он жжёт, кипятит и пересобирает. ТВЭЛ и оболочка ТВЭЛ — топливо, которое он изнашивает, и оболочка, которая остаётся. Пар — рабочее тело контура. Паровая насадка — конец контура; пока она не работает, шкала пара желтеет, а нагрев растёт. Реакторная кнопка — единственный блок набора, который сканер как стену не засчитывает. Резонансная цепочка — откуда берётся катушка для схемы управления. Дистилляционная колонна и инкубатор — два предыдущих мультиблока мода; оба проверяют фиксированную форму, объёмный сканер написан здесь впервые.
Крафт
Крафт на верстаке
▶
Контроллер реактора