Песочница/Pok/3: различия между версиями

Материал из Space Station 14 Вики
мНет описания правки
Нет описания правки
 
(не показано 237 промежуточных версий 4 участников)
Строка 1: Строка 1:
__NOTOC__{{verify}}
{{docpage}}{{TOC hidden}}
{{СРП/CO/Info/Main}}
{{OnLua|Сущность|module1=Сущность|module2=Сущность/поля|module3=GetField}}
'''Стандартные Рабочие Процедуры (СРП)''' представляют собой набор руководящих принципов, которым необходимо следовать в соответствующих им обстоятельствах. Нарушение СРП без уважительной причины может являться основанием для понижения в должности, увольнения или даже заключения под стражу, в зависимости от тяжести нарушения и мнения главы соответствующего отдела.


{{GradientHeaderFrame/Sub
Модульный набор {{tl|Модуль:Сущность}} + {{tl|Модуль:Сущность/поля}} + {{tl|Модуль:GetField}} предназначен для:
|title  = Ведомственные СРП
* автоматической сборки карточек сущностей (компонентов и прототипов) по их ID;
|content =
* описания полей в шаблонах компонентов (какие поля идут в карточку, как подписаны);
<div style="
* удобного доступа к данным из JSON (как простыми значениями, так и готовыми вызовами шаблонов).
display: grid;
grid-template-columns: 1fr 1fr;
gap: 10px;
margin: 4px;
">
    {{ModernButton
    |link      = Стандартные рабочие процедуры (Командование)
    |img        = Cmd dep.png
    |text      = Командование станции
    |subtext    = Слава NanoTrasen!
    }}


    {{ModernButton
Ниже описан общий принцип работы и отдельные режимы.
    |link      = Стандартные рабочие процедуры (Служба безопасности)
    |img        = sec_dep.png
    |text      = Отдел службы безопасности
    |subtext    = Лишь стражи порядка представляют из себя преграду на пути вездесущей жестокости и кровопролития.
    }}


    {{ModernButton
== Общий принцип работы ==
    |link      = Стандартные рабочие процедуры (Научный отдел)
* В шаблонах компонентов/прототипов (<code>Template:Component/...</code>, <code>Template:prototype/...</code>) через {{tl|Модуль:Сущность/поля}} описываются поля:
    |img        = Sci dep.png
** '''лейблы''' (<code>cardLabel_*</code>) и '''содержимое''' (<code>cardContent_*</code>), заголовки (<code>title_*</code>) и т. п.;
    |text      = Научный отдел
** '''мета‑информация''' о том, какие ключи доступны для <code>card</code> / <code>title</code> и в каком порядке.
    |subtext    = Придет время, когда наука опередит фантазию.
* {{tl|Модуль:Сущность}} по ID сущности:
    }}
** находит связанные с ней компоненты и прототипы по JSON‑данным;
** для каждого компонента/прототипа читает шаблоны и метаданные;
** собирает все поля в единую структуру;
** формирует один вызов карточки <code><nowiki>{{карточка/сущность|...}}</nowiki></code> (и блоки заголовков).
* Внутри полей можно писать вики‑параметры <code>{{{...}}}</code> и вызывать дополнительные модули.
* {{tl|Модуль:GetField}} даёт доступ к JSON‑данным на низком уровне:
** как «расплющенный» набор параметров (<code>flattenField</code>);
** как отдельные значения (<code>get</code>);
** как готовые вызовы шаблонов с нужными параметрами (<code>getTpl</code>, <code>getTplProto</code>).


    {{ModernButton
== Модуль: Сущность/поля ==
    |link      = Стандартные рабочие процедуры (Медицинский отдел)
Шаблоны компонентов используют модуль <code>Сущность/поля</code> для объявления полей, которые будут собираться в карточку.
    |img        = Med dep.png
    |text      = Медицинский отдел
    |subtext    = Защитники жизни, вооруженные орудием сострадания.
    }}


    {{ModernButton
Пример шаблона компонента:
    |link      = Стандартные рабочие процедуры (Отдел снабжения)
    |img        = Cargo dep.png
    |text      = Отдел снабжения
    |subtext    = Логистика - основа корпорации.
    }}


    {{ModernButton
<pre>
    |link      = Стандартные рабочие процедуры (Инженерный отдел)
{{#invoke:Сущность/поля|main
    |img        = Eng dep.png
|cardLabel_Стоимость  = [[Стоимость]]
    |text      = Инженерный отдел
|cardContent_Стоимость = '''{{{price}}}'''
    |subtext    = Симфония металла, ума и духа.
}}
    }}
</pre>
 
Другой компонент может добавлять тот же ключ:
 
<pre>
{{#invoke:Сущность/поля|main
|cardContent_Стоимость  = '''{{{superPrice}}}'''
}}
</pre>
 
Особенности:
* Пара <code>cardLabel_<Ключ></code> / <code>cardContent_<Ключ></code> описывает одну строку карточки (лейбл и содержимое).
* Если несколько шаблонов дают один и тот же <code>cardContent_Ключ</code>, содержимое '''объединяется''', а лейбл берётся первый непустой.
* То же относится к другим режимам, перечисленным в мета‑JSON шаблона (разделы <code>card</code>, <code>title</code> и т. п.), которые читает {{tl|Модуль:Сущность}}.
 
== Модуль: Сущность ==
 
=== p.get: основная сборка карточки ===
Вызов:
 
<pre>
{{#invoke:Сущность|get
| <ID или список ID>
| blacklist=...
| whitelist=...
| ignoreComponents=...
| ignorePrototypes=...
}}
</pre>
 
* '''1‑й параметр''' — <code>id</code> или список <code>id</code> через запятую.
* По этому ID модуль находит:
** '''компоненты''' из <code>component.json</code>;
** '''прототипы''' из <code>prototype.json</code>;
и для каждого — соответствующие шаблоны <code>Template:component/...</code> / <code>Template:prototype/...</code>.
* Шаблоны описывают свои поля через <code>Сущность/поля</code>.
 
После сборки модуль:
* формирует один вызов <code><nowiki>{{карточка/сущность|...}}</nowiki></code> со всеми разделами и полями;
* дополняет выход при необходимости (блоки title и т. п.);
* прогоняет результат через <code>frame:preprocess</code>, чтобы отрендерить разметку.
 
Параметры фильтрации:
* {{пм|blacklist}} — список <code>режим_Ключ</code> через запятую, чтобы исключить поле:
** пример: <code>blacklist=card_Наносит повреждения,title_Что‑то</code>;
* {{пм|whitelist}} — наоборот, список разрешённых <code>режим_Ключ</code>, остальные игнорируются;
* {{пм|ignoreComponents}} / {{пм|ignoreComponent}} — список имён компонентов через запятую, которые полностью игнорируются для этого вызова;
* {{пм|ignorePrototypes}} / {{пм|ignorePrototype}} — аналогично для прототипов.
 
Пример простой сборки (через шаблон‑обёртку):
 
<pre>
{{Сущность/карточка|MyEntityId}}
</pre>
 
где в шаблоне <code>Сущность/карточка</code> внутри:
 
<pre>
{{#invoke:Сущность|get|{{{1}}}}}
</pre>
 
=== p.preview: предпросмотр полей конкретного шаблона ===
Используется для проверки, что компонент/прототип правильно описал свои поля.
 
<pre>
{{#invoke:Сущность|preview
| Component/meleeWeapon
}}
</pre>
 
* Показывает, какие <code>card</code> / <code>title</code>‑поля объявлены в <code>Template:Component/meleeWeapon</code>.
* Удобно при разработке шаблонов компонентов.
 
=== p.jsonList: вывод JSON в виде списка ===
Режим похож на стандартный <code>arraymap</code>, но работает с JSON.
 
<pre>
{{#invoke:Сущность|jsonList
| <json или {{{...}}}>
| type = list / enum
| prefix = *
| sep = :
| key_pattern = (.*)
| key_replace = \1
| value_pattern = (.*)
| value_replace = \1
}}
</pre>
 
Примеры JSON:
 
<pre> <!-- <syntaxhighlight lang=json> -->
{
  "Blunt": 10,
  "Slash": 5
}
</pre> <!-- </syntaxhighlight> -->
 
или
 
<pre> <!-- <syntaxhighlight lang=json> -->
["Knife", "Sword", "Bat"]
</pre> <!-- </syntaxhighlight> -->
 
Основные опции:
* {{пм|type}}:
** <code>list</code> — список строк (с префиксом, например <code>* </code>);
** <code>enum</code> — перечисление через запятую (<code>A, B, C</code> без префикса).
* {{пм|prefix}} — префикс строки списка (по умолчанию <code>* </code>).
* {{пм|sep}} — разделитель для <code>ключ: значение</code> (по умолчанию <code>: </code>).
* {{пм|key_pattern}} / {{пм|key_replace}} — regex и замена для ключей.
* {{пм|value_pattern}} / {{пм|value_replace}} — regex и замена для значений.
 
Дополнительно:
* в шаблоне замены поддерживаются:
** <code>\1</code> — собственное значение (ключ или значение);
** <code>\2</code> в <code>value_replace</code> — '''сырой ключ''' (после <code>key_pattern</code>, но до <code>key_replace</code>);
** <code>\2</code> в <code>key_replace</code> — итоговое отформатированное значение (после <code>value_replace</code>).
 
Пример, где сначала форматируем тип урона, а затем подставляем его в описание:


    {{ModernButton
<pre>
    |link      = Стандартные рабочие процедуры (Сервисный отдел)
{{#invoke:Сущность|jsonList
    |img        = Serv dep.png
| {{{damage.types}}}
    |text      = Сервисный отдел
| type = enum
    |subtext    = Душа космической станции.
| key_replace = <nowiki>\1</nowiki>              <!-- "Blunt" -->
    }}
| value_replace = <nowiki>'''\1''' \2</nowiki>  <!-- "'''10''' Blunt" -->
</div>
}}
}}
</pre>


{{GradientHeaderFrame/Sub
=== p.json: превращение JSON в вызовы шаблонов ===
|title  = СРП Департаментов
Режим для случаев, когда в JSON лежит список эффектов/объектов, и нужно по каждому вызвать отдельный шаблон.
|content =
<div style="
display: grid;
grid-template-columns: 1fr 1fr;
gap: 10px;
margin: 4px;
">
    {{ModernButton
    |link      = Стандартные рабочие процедуры (ДСО)
    |img        = DarkCentcom_dep.png
    |text      = Департамент Специальных Операций
    |subtext    = Semper fidelis!
    }}


    {{ModernButton
<pre>
    |link      = Стандартные рабочие процедуры (Юридический департамент)
{{#invoke:Сущность|json
    |img        = Law dep.png
| <json или {{{...}}}>
    |text      = Юридический департамент NT
| <путь_к_шаблону>
    |subtext    = Да свершится справедливость, даже если мир погибнет.
    }}
</div>
}}
}}
</pre>


{{GradientHeaderFrame
* '''1‑й параметр / <code>json=</code>''' — строка JSON.
|title  = Уровни угроз
* '''2‑й параметр / <code>template=</code>''' — путь к шаблону, например <code>Component/adjustPlant</code>.
|content =


{{infobox|1|info=Весь персонал станции, вне зависимости от должности, обязан следовать нормам экипажа в зависимости от кода угрозы.<br> Нарушение норм экипажа соответствующего кода является нарушением статьи [[Корпоративный Закон#112|'''Сопротивление представителям власти''']] Корпоративного Закона. Код угрозы распространяется на: станцию, космическое пространство станции, объекты, находящиеся в собственности станции, а также на торговый пост станции. На эвакуационный шаттл и шаттл прибытия установленный на станции уровень угрозы не распространяется, при условии, что те покинули космическое пространство станции.}}
Ожидаемый формат JSON‑массива:


{{ModernFrame/Сollapsible
<pre> <!-- <syntaxhighlight lang=json> -->
| title            = Уровень угрозы Зеленый — Статус: Все чисто; нет угроз на борту/возле станции
[
| background-color  = #215f21
  {
| border-color      = #277127
    "!type:PlantAdjustNutrition": {
| sub-title        = ''«Внимание! Уровень угрозы станции теперь зелёный! Можно безопасно возвращаться на свои рабочие места.»''
      "amount": 0.1
| content          = '''Устанавливается: [[Командование | Капитаном]].'''
    }
==Условия==
  },
* Начальный уровень тревоги на станции.
  {
* Прошло 15 минут с последней опасной активности при '''<span style="color: blue">Синем коде</span>'''.
    "!type:PlantAdjustWeeds": {
==Нормы экипажа==
      "amount": 2
* Экипаж может свободно передвигаться по станции в зависимости от доступа.<br><br>
    }
*Хранилище может быть открыто если:  
  },
**Требуется его ремонт.
  {
**Требуется золото для Научного Отдела.
    "!type:PlantAdjustPests": {
**Чрезвычайно важный предмет должен быть спрятан в сейфе.<br><br>
      "amount": 2
* [[Бумажная работа|Бюрократия]] должна иметь приоритет при работе отделов.<br><br>
    }
}}<!--
  }
]
</pre> <!-- </syntaxhighlight> -->


-->
Для каждого элемента создаётся вызов:
{{ModernFrame/Сollapsible
| title            = Уровень угрозы Синий — Статус: Есть подозрение на угрозу внутри/снаружи станции
| background-color  = #273689
| border-color      = #2c3d9b
| sub-title        = ''«Внимание! Уровень угрозы станции теперь синий! На станции присутствует неизвестная угроза. Службе безопасности разрешено проводить выборочные обыски. Членам экипажа рекомендуется выполнять указания, отдаваемые действующей властью. Для ускорения процедур, просим сотрудников проверить наличие ID-карт в своих КПК.»''
| content          = '''Устанавливается: [[Капитан | Капитаном]] или [[Глава Службы Безопасности|Главой Службы Безопасности]]'''.
==Условия==
* Есть подозрение на угрозу на борту станции, или в ближнем космосе. Это включает в себя любые признаки враждебной деятельности, которые не причинили никакого ущерба станции или экипажу, но, тем не менее, кажутся действительной угрозой.
* Прошло 15 минут с последней опасной активности при '''<span style="color: darkred">Красном коде</span>'''.
==Нормы экипажа==
* Экипаж может свободно передвигаться по станции в зависимости от доступа.<br><br>
* Весь персонал обязан носить свои ID-карты в своих КПК.<br><br>
* Экипаж должен докладывать о любой подозрительной активности [[Отдел Службы Безопасности | Службе Безопасности]] лично, или, в крайнем случае, в общий голосовой канал.<br><br>
*[[Бумажная работа|Бюрократия]] должна иметь приоритет при работе отделов.<br><br>
}}<!--


-->
<pre>
{{ModernFrame/Сollapsible
{{Component/adjustPlant
| title            = Уровень угрозы Красный — Статус: Наличие угрозы на станции/около станции подтверждено
|id=!type:PlantAdjustNutrition
| background-color  = #630a0a
|amount=0.1
| border-color      = #750c0c
}}
| sub-title        = ''«Внимание! Уровень угрозы станции теперь красный! На станции присутствует известная угроза. Служба безопасности имеет право применять летальную силу по необходимости. Все члены экипажа, за исключением должностных лиц, обязаны проследовать в свои отделы и ожидать дальнейших инструкций до отмены кода. Нарушители подлежат наказанию.»''
{{Component/adjustPlant
| content          = '''Устанавливается:''' [[Командование | Капитаном]] или [[Глава Службы Безопасности|Главой Службы Безопасности]].
|id=!type:PlantAdjustWeeds
==Условия==
|amount=2
* На станции или поблизости от станции существует подтвержденная открыто враждебная угроза. Эта угроза представляет очевидную опасность для станции и/или экипажа в целом.<br><br>
}}
==Нормы экипажа==
{{Component/adjustPlant
* Весь экипаж, за исключением должностных лиц, обязан находиться в своих отделах на протяжении действия '''<span style="color: darkred">Красного кода</span>''', если не получены иные указания от [[Отдел Службы Безопасности | Службы Безопасности]] и/или [[Командование | Командования]].<br><br>
|id=!type:PlantAdjustPests
* Посетители и гости станции обязаны находиться в баре, библиотеке или жилых отсеках.<br><br>
|amount=2
* Экипаж обязан подчиняться правомерным приказам[[Отдел Службы Безопасности | сотрудников Службы Безопасности]].<br><br>
}}
* Весь экипаж обязан переключить датчики костюмов в режим координат.<br><br>
</pre>
* Весь экипаж обязан носить свои ID-карты в своих КПК.<br><br>
*Скорость работы должна иметь приоритет над [[Бумажная работа|бюрократией]].<br><br>
}}<!--


-->
Особенности:
{{ModernFrame/Сollapsible
* Если JSON — объект вида <code>{ "id1": {...}, "id2": {...} }</code>, происходит аналогичный проход по парам <code>ключ → объект</code>.
| title            = Уровень угрозы Гамма — Статус: Существует огромная угроза безопасности станции и экипажа.
* Все вызовы склеиваются через перевод строки и прогоняются через <code>frame:preprocess</code>, поэтому внутри шаблона можно использовать любую вики‑разметку.
| background-color  = #756203
| border-color      = #877104
| sub-title        = ''«Центральное Командование объявило на станции уровень угрозы "Гамма". Центральное командование объявило на станции уровень угрозы "Гамма". Служба безопасности должна постоянно иметь при себе оружие, гражданский персонал обязан немедленно обратиться к главам отделов для получения указаний к эвакуации. Службе Безопасности разрешено применение летальной силы в случае неповиновения.»''
| content          = '''Устанавливается:''' [[Центральное Командование | Центральным Командованием]].
==Условия==
* Существует огромная угроза для станции и экипажа, под угрозой само существование станции.<br><br>
==Нормы экипажа==
* '''Установлено военное положение.''' Служба Безопасности уполномочена принудить сотрудника к соблюдению закона и норм экипажа '''<span style="color:#C6A500">Гамма Кода</span>''' любыми способами, '''вплоть до применения летального оружия.<br><br>
* Весь экипаж, за исключением должностных лиц, обязан находиться в своих отделах на протяжении действия '''<span style="color:#C6A500">Гамма Кода</span>''', если не получены иные указания от [[Отдел Службы Безопасности | Службы Безопасности]] и/или [[Командование | Командования]].<br><br>
* Посетители и гости станции (любой с гражданским уровнем доступа) обязаны находиться в баре, библиотеке или жилом отсеке.<br><br>
* Экипаж обязан подчиняться правомерным приказам[[Отдел Службы Безопасности | сотрудников Службы Безопасности]].<br><br>
* Весь экипаж обязан переключить датчики костюмов в режим координат.<br><br>
* Весь экипаж обязан носить свои ID-карты в своих КПК.<br><br>
* Скорость работы должна иметь приоритет над [[Бумажная работа|бюрократией]].<br><br>
}}<!--


-->
== Модуль: GetField ==
==Дополнительные коды==
Модуль <code>GetField</code> используется для доступа к тем же JSON‑данным <code>.../data</code>, но на более низком уровне.
{{ModernFrame/Сollapsible
| title            = Уровень угрозы Желтый — Статус: Наличие атмосферной/структурной угрозы на станции
| background-color  = #5c5c00
| border-color      = #6e6e00
| sub-title        = ''«Внимание! Уровень угрозы станции теперь желтый! На станции присутствует структурная или атмосферная угроза. Инженерно-техническому персоналу требуется немедленно предпринять меры по устранению угрозы. Всем остальным сотрудникам запрещено находиться в опасном участке. Сотрудники Службы Безопасности продолжают выполнение своих обязанностей по предыдущему коду.»''
| content          = '''Устанавливается: [[Капитан|Капитаном]] или [[Старший Инженер|Старшим Инженером]]'''
==Условия==
* На станции присутствуют серьезные структурные или атмосферные повреждения.<br><br>
==Нормы работы Инженерного Отдела:==
* Сотрудникам инженерного отдела следует незамедлительно обратиться к [[Старший Инженер|Старшему Инженеру]] за получением приказов.<br><br>
* [[Инженер|Инженеры]] и [[Атмосферный Техник|Атмосферные Техники]] должны проследовать к зоне и вернуть её в рабочее и безопасное для здоровья экипажа состояние.<br><br>
* Экипаж должен быть проинформирован о местонахождении структурных и/или атмосферных повреждений в отсеках станции.<br><br>
==Нормы экипажа==
* Всему экипажу следует подчиняться правомерным требованиям сотрудников инженерного отдела.<br><br>
* Экипажу '''запрещено''' находиться в местах, где ведутся технические работы по восстановлению станции.<br><br>
* За Сотрудниками Службы Безопасности закреплены все привилегии предыдущего кода.<br><br>
}}<!--


-->
=== p.flattenField: расплющивание записи в параметры ===
{{ModernFrame/Сollapsible
<pre>
| title            = Уровень угрозы Фиолетовый — Статус: Наличие угрозы вируса на станции
{{#invoke:GetField|flattenField
| background-color  = #501b6b
| <id>
| border-color      = #602081
| <путь_к_json_странице>
| sub-title        = ''«Внимание! Уровень угрозы станции теперь фиолетовый! На станции присутствует угроза вируса. Медицинскому персоналу необходимо изолировать членов экипажа с любыми симптомами. Членам экипажа рекомендуется дистанцироваться друг от друга и соблюдать меры безопасности по предотвращению дальнейшего распространения вируса, следовать иным указаниям Главного Врача смены. На время действия Фиолетового Кода любые стыковки станции с другими объектами категорически запрещены. Сотрудники Службы Безопасности продолжают выполнение своих обязанностей по предыдущему коду.»''
}}
| content          = '''Устанавливается: [[Капитан | Капитаном]] или [[Главный врач| Главврачом]].'''
</pre>
==Условия==
* На станции существует подтвержденная опасная вспышка вируса, которая требует введения карантинных мер.<br><br>
==Нормы работы Медицинского Отдела==
* Сотрудникам Медицинского отдела следует незамедлительно обратиться к [[Главный врач| Главврачу]] за получением приказов.<br><br>
* Весь медицинский персонал обязан работать над устранением вспышки вируса, если нет пациентов в критическом состоянии, нуждающихся в помощи.<br><br>
* Экипаж станции должен быть проинформирован об известных симптомах.<br><br>
* Весь инфицированный экипаж должен быть помещен в изолятор.<br><br>
==Нормы экипажа==
* Весь экипаж обязан переключить датчики костюмов в режим координат.<br><br>
* При возникновении симптомов вируса, персонал обязан незамедлительно пройти в медицинский отдел.<br><br>
* Немедицинский персонал обязан подчиняться инструкциям медицинского персонала, в том числе просьбам покинуть зону, оставаться в карантине, или оказать помощь в спасении больных/раненых.<br><br>
* Стыковка всех кораблей и шаттлов должна быть приостановлена.<br><br>
* За Сотрудниками Службы Безопасности закреплены все привилегии предыдущего кода.<br><br>
}}<!--


-->
Например:
{{ModernFrame/Сollapsible
| title            = Уровень угрозы Дельта — Статус: Станция находится под угрозой неминуемого уничтожения.
| background-color  = #570809
| border-color      = #690a0b
| sub-title        = ''«Внимание! Уровень угрозы станции теперь Дельта! Станция находится под угрозой неминуемого уничтожения. Членам экипажа рекомендуется слушать глав отделов для получения дополнительной информации. Службе Безопасности приказано работать по протоколу Дельта.»''
| content          = '''Устанавливается: [[Центральное Командование | Центральным Командованием]].'''
==Условия:==
* Механизм Самоуничтожения Станции был запущен [[Центральное Командование | Центральным Командованием]], либо саботирован врагами NanoTrasen.
* Существует подтвержденная неминуемая ситуация полного уничтожения станции.
==Нормы работы Отдела Службы Безопасности==
*Процедуры не имеют значения.<br><br>
*В случае, если МСС '''не''' был запущен [[Центральное Командование | Центральным Командованием]]:
**Обезвреживание бомбы не рекомендуется. Служба Безопасности должна обеспечить эвакуацию экипажа.
**При невозможности эвакуации, всеми силами обезвредить ядерную боеголовку.<br><br>
*В случае запуска МСС [[Центральное Командование | Центральным Командованием]]:
**Служба Безопасности обязана сохранять порядок и не допускать распространение угрозы со станции.
**Служба Безопасности имеет право применить летальное оружие в отношении любого, кто попытается обезвредить ядерную боеголовку.<br><br>
*В случае иных ситуаций неминуемого уничтожения станции:
**Служба Безопасности обязана обеспечить эвакуацию экипажа.<br><br>
==Нормы Экипажа:==
* В случае, если МСС '''не''' был запущен [[Центральное Командование | Центральным Командованием]]:
**Обезвреживание бомбы не рекомендуется. Первоочередной задачей стоит эвакуация с объекта.
**При невозможности эвакуации, рекомендуется всеми силами обезвредить ядерную боеголовку.<br><br>
* В случае запуска МСС [[Центральное Командование | Центральным Командованием]]:
**Экипаж должен сохранять спокойствие и следовать указаниям Центрального Командования.<br><br>
*В случае иных ситуаций неминуемого уничтожения станции:
**Первоочередной задачей стоит эвакуация с объекта.
**Командованию разрешается запустить досрочную эвакуацию шаттла с объекта.<br><br>
}}<!--


-->
<pre>
{{ModernFrame/Сollapsible
{{#invoke:GetField|flattenField
| title            = Уровень угрозы ЗАСЕКРЕЧЕНО
  | MyEntityId
| background-color = #2d2d37
| component/item.json
| border-color      = #3c3c49
| sub-title        = ''Никому на станции не известно о других уровнях угрозы.''
| content          =
}}
}}
</pre>
Возвращает строку вида:
<pre>
damage.types={"Blunt":10}|wieldSound=someSound|...
</pre>
Особенности:
* Вложенные объекты кодируются в JSON и заворачиваются в <code><nowiki><nowiki></nowiki></code>, чтобы их можно было безопасно передавать как параметр.
* Массивы кодируются в JSON без <code><nowiki><nowiki></nowiki></code>, чтобы удобно обрабатывать их модулями вроде <code>Сущность.jsonList</code>.


Этот режим используется внутри <code>GetField.getTpl</code> и других обёрток.
=== p.get: получение значения по пути ===
<pre>
{{#invoke:GetField|get
| <id или пусто для "default">
| <путь_к_json_странице>
| <ключ.с.точками>
}}
}}
</pre>


{{RulesBox
Примеры:
|title  = Чрезвычайные Ситуации
 
|content = <p></p>
<pre>
'''Список Чрезвычайных Ситуаций включает в себя:'''
{{#invoke:GetField|get
*Введение '''<span style="color:#C6A500">Гамма кода</span>'''.
| MyEntityId
*Введение '''<span style="color:purple">Дельта кода</span>''', если ядерная боеголовка не была запущена Центральным Командованием.
| component/item.json
*Критические повреждения станции.
| damage.types
*Нападение космического дракона, создавшего второй активный разлом.
*Пребывание ревенанта на объекте, которое продолжается больше 15-ти минут.
*Вспышка зомби вируса, поразившая более 10% экипажа.
*Выход сингулярности.
*Нападение Ядерных Оперативников Синдиката.
*Попытка насильственного свержения власти на территории объекта корпорации NanoTrasen, крупномасштабные бунты.
}}
}}
</pre>


{{RulesBox
Если в JSON:
|title   = СРП при нарушении условий содержания Сингулярности
 
|content = <p></p>
<pre> <!-- <syntaxhighlight lang=json> -->
*Гравитационную Сингулярность должна отслеживаться любой ценой.  
"damage": {
**Если Гравитационная Сингулярность направляется к станции, то должен быть вызван шаттл.  
  "types": {
**Если Гравитационная Сингулярность движется в сторону от станции, следует учесть ущерб, нанесенный станции.
    "Blunt": 10
*В случае серьезного повреждения станции вызвать шаттл эвакуации.
   }
*В зависимости от степени небольших повреждений, следует вызвать ОБР или восстановить повреждения своими силами.
}
</pre> <!-- </syntaxhighlight> -->
 
то результатом будет:
 
<pre>
{"Blunt":10}
</pre>
 
то есть:
* для таблиц модуль пытается сделать <code>mw.text.jsonEncode(v)</code> и вернуть JSON‑строку;
* для простых значений возвращается строка <code>tostring(v)</code>.
 
Если <code>keyPath</code> пуст, возвращается весь объект (как JSON).
 
=== p.getTpl: вызов шаблона по данным JSON ===
<pre>
{{#invoke:GetField|getTpl
| <id>
| <путь_к_json_странице>
| <путь_к_шаблону>
}}
}}
</pre>


{{RulesBox
Пример:
|title  = СРП при объявлении войны Синдикатом
 
|content = <p></p>
<pre>
*Все ограничения на вооружение сняты.
{{#invoke:GetField|getTpl
*[[Отдел Снабжения]] должен начать заказ как можно большего количества оружия.
| MyEntityId
**[[Отдел Службы Безопасности]] является приоритетом при распределении вооружения среди экипажа.
| component/item.json
*Возведение баррикад в критически важных местах рекомендуется.
| Component/meleeWeapon
*Диск ядерной аутентификации '''запрещено''' выносить за пределы станции.
}}
}}
</pre>
Работа:
* внутри вызывает <code>flattenField</code>, получая строку <code>key=value|...</code>;
* формирует строку вида:
<pre>
{{Component/meleeWeapon
|id=MyEntityId
|damage.types=...
|...
}}
</pre>
* и прогоняет её через <code>frame:preprocess</code>, возвращая итоговый рендер.
Это удобный способ «подключить» шаблон компонента к данным из JSON без ручного перечисления параметров.
=== p.getTplProto: вызов шаблона по прототипам ===
<pre>
{{#invoke:GetField|getTplProto
| <searchId>
| <protoId>
| <путь_к_шаблону>
}}
</pre>
* Ищет в <code>prototype.json</code> все записи, где <code>protoId</code> встречается у <code>searchId</code>.
* Для каждого найденного ID вызывает <code>getTpl</code> и возвращает все вызовы, склеенные через перевод строки и отрендеренные.


{{NavBox/CO/СРП}}
Используется для случаев, когда сущность использует '''несколько''' прототипов одного типа, и нужно вывести по одному шаблону на каждый прототип.


[[Категория:Стандартные рабочие процедуры (Corvax)]]
== Типичный рабочий поток ==
# В JSON‑файлах (<code>component.json</code>, <code>prototype.json</code> и др.) описываются сущности и связи компонент/прототипов.
# Для каждого компонента/прототипа создаются шаблоны <code>Template:Component/...</code>, <code>Template:prototype/...</code>, которые:
#* вызывают <code><nowiki>{{#invoke:Сущность/поля|main ...}}</nowiki></code> для описания полей карточки;
#* при необходимости используют <code>GetField</code> / <code>Сущность.jsonList</code> / <code>Сущность.json</code> для форматирования сложных JSON‑полей.
# Для вывода карточки на странице сущности используется:
#* либо прямой <code><nowiki>{{#invoke:Сущность|get|MyEntityId}}</nowiki></code>,
#* либо шаблон‑обёртка <code><nowiki>{{Сущность/карточка|MyEntityId}}</nowiki></code>.
# Для специализированных списков/таблиц:
#* <code>Сущность.jsonList</code> — если нужно красиво показать массив/словарь из JSON;
#* <code>Сущность.json</code> — если нужно превратить список эффектов в набор вызовов шаблона;
#* <code>GetField.get</code> — если нужно точечно вытащить одно поле;
#* <code>GetField.getTpl</code> / <code>getTplProto</code> — если нужно строить шаблоны по данным JSON автоматически.

Текущая версия от 16:00, 5 марта 2026

Модульный набор {{#invoke:Сущность}} + {{#invoke:Сущность/поля}} + {{#invoke:GetField}} предназначен для:

  • автоматической сборки карточек сущностей (компонентов и прототипов) по их ID;
  • описания полей в шаблонах компонентов (какие поля идут в карточку, как подписаны);
  • удобного доступа к данным из JSON (как простыми значениями, так и готовыми вызовами шаблонов).

Ниже описан общий принцип работы и отдельные режимы.

Общий принцип работы

  • В шаблонах компонентов/прототипов (Template:Component/..., Template:prototype/...) через {{#invoke:Сущность/поля}} описываются поля:
    • лейблы (cardLabel_*) и содержимое (cardContent_*), заголовки (title_*) и т. п.;
    • мета‑информация о том, какие ключи доступны для card / title и в каком порядке.
  • {{#invoke:Сущность}} по ID сущности:
    • находит связанные с ней компоненты и прототипы по JSON‑данным;
    • для каждого компонента/прототипа читает шаблоны и метаданные;
    • собирает все поля в единую структуру;
    • формирует один вызов карточки {{карточка/сущность|...}} (и блоки заголовков).
  • Внутри полей можно писать вики‑параметры {{{...}}} и вызывать дополнительные модули.
  • {{#invoke:GetField}} даёт доступ к JSON‑данным на низком уровне:
    • как «расплющенный» набор параметров (flattenField);
    • как отдельные значения (get);
    • как готовые вызовы шаблонов с нужными параметрами (getTpl, getTplProto).

Модуль: Сущность/поля

Шаблоны компонентов используют модуль Сущность/поля для объявления полей, которые будут собираться в карточку.

Пример шаблона компонента:

{{#invoke:Сущность/поля|main
 |cardLabel_Стоимость   = [[Стоимость]]
 |cardContent_Стоимость = '''{{{price}}}'''
}}

Другой компонент может добавлять тот же ключ:

{{#invoke:Сущность/поля|main
 |cardContent_Стоимость  = '''{{{superPrice}}}'''
}}

Особенности:

  • Пара cardLabel_<Ключ> / cardContent_<Ключ> описывает одну строку карточки (лейбл и содержимое).
  • Если несколько шаблонов дают один и тот же cardContent_Ключ, содержимое объединяется, а лейбл берётся первый непустой.
  • То же относится к другим режимам, перечисленным в мета‑JSON шаблона (разделы card, title и т. п.), которые читает {{#invoke:Сущность}}.

Модуль: Сущность

p.get: основная сборка карточки

Вызов:

{{#invoke:Сущность|get
 | <ID или список ID>
 | blacklist=...
 | whitelist=...
 | ignoreComponents=...
 | ignorePrototypes=...
}}
  • 1‑й параметр — id или список id через запятую.
  • По этому ID модуль находит:
    • компоненты из component.json;
    • прототипы из prototype.json;

и для каждого — соответствующие шаблоны Template:component/... / Template:prototype/....

  • Шаблоны описывают свои поля через Сущность/поля.

После сборки модуль:

  • формирует один вызов {{карточка/сущность|...}} со всеми разделами и полями;
  • дополняет выход при необходимости (блоки title и т. п.);
  • прогоняет результат через frame:preprocess, чтобы отрендерить разметку.

Параметры фильтрации:

  • |blacklist = — список режим_Ключ через запятую, чтобы исключить поле:
    • пример: blacklist=card_Наносит повреждения,title_Что‑то;
  • |whitelist = — наоборот, список разрешённых режим_Ключ, остальные игнорируются;
  • |ignoreComponents = / |ignoreComponent = — список имён компонентов через запятую, которые полностью игнорируются для этого вызова;
  • |ignorePrototypes = / |ignorePrototype = — аналогично для прототипов.

Пример простой сборки (через шаблон‑обёртку):

{{Сущность/карточка|MyEntityId}}

где в шаблоне Сущность/карточка внутри:

{{#invoke:Сущность|get|{{{1}}}}}

p.preview: предпросмотр полей конкретного шаблона

Используется для проверки, что компонент/прототип правильно описал свои поля.

{{#invoke:Сущность|preview
 | Component/meleeWeapon
}}
  • Показывает, какие card / title‑поля объявлены в Template:Component/meleeWeapon.
  • Удобно при разработке шаблонов компонентов.

p.jsonList: вывод JSON в виде списка

Режим похож на стандартный arraymap, но работает с JSON.

{{#invoke:Сущность|jsonList
 | <json или {{{...}}}>
 | type = list / enum
 | prefix = * 
 | sep = : 
 | key_pattern = (.*)
 | key_replace = \1
 | value_pattern = (.*)
 | value_replace = \1
}}

Примеры JSON:

 <!-- <syntaxhighlight lang=json> -->
{
  "Blunt": 10,
  "Slash": 5
}

или

 <!-- <syntaxhighlight lang=json> -->
["Knife", "Sword", "Bat"]

Основные опции:

  • |type =:
    • list — список строк (с префиксом, например * );
    • enum — перечисление через запятую (A, B, C без префикса).
  • |prefix = — префикс строки списка (по умолчанию * ).
  • |sep = — разделитель для ключ: значение (по умолчанию : ).
  • |key_pattern = / |key_replace = — regex и замена для ключей.
  • |value_pattern = / |value_replace = — regex и замена для значений.

Дополнительно:

  • в шаблоне замены поддерживаются:
    • \1 — собственное значение (ключ или значение);
    • \2 в value_replace — сырой ключ (после key_pattern, но до key_replace);
    • \2 в key_replace — итоговое отформатированное значение (после value_replace).

Пример, где сначала форматируем тип урона, а затем подставляем его в описание:

{{#invoke:Сущность|jsonList
 | {{{damage.types}}}
 | type = enum
 | key_replace = \1              <!-- "Blunt" -->
 | value_replace = '''\1''' \2   <!-- "'''10''' Blunt" -->
}}

p.json: превращение JSON в вызовы шаблонов

Режим для случаев, когда в JSON лежит список эффектов/объектов, и нужно по каждому вызвать отдельный шаблон.

{{#invoke:Сущность|json
 | <json или {{{...}}}>
 | <путь_к_шаблону>
}}
  • 1‑й параметр / json= — строка JSON.
  • 2‑й параметр / template= — путь к шаблону, например Component/adjustPlant.

Ожидаемый формат JSON‑массива:

 <!-- <syntaxhighlight lang=json> -->
[
  {
    "!type:PlantAdjustNutrition": {
      "amount": 0.1
    }
  },
  {
    "!type:PlantAdjustWeeds": {
      "amount": 2
    }
  },
  {
    "!type:PlantAdjustPests": {
      "amount": 2
    }
  }
]

Для каждого элемента создаётся вызов:

{{Component/adjustPlant
 |id=!type:PlantAdjustNutrition
 |amount=0.1
}}
{{Component/adjustPlant
 |id=!type:PlantAdjustWeeds
 |amount=2
}}
{{Component/adjustPlant
 |id=!type:PlantAdjustPests
 |amount=2
}}

Особенности:

  • Если JSON — объект вида { "id1": {...}, "id2": {...} }, происходит аналогичный проход по парам ключ → объект.
  • Все вызовы склеиваются через перевод строки и прогоняются через frame:preprocess, поэтому внутри шаблона можно использовать любую вики‑разметку.

Модуль: GetField

Модуль GetField используется для доступа к тем же JSON‑данным .../data, но на более низком уровне.

p.flattenField: расплющивание записи в параметры

{{#invoke:GetField|flattenField
 | <id>
 | <путь_к_json_странице>
}}

Например:

{{#invoke:GetField|flattenField
 | MyEntityId
 | component/item.json
}}

Возвращает строку вида:

damage.types={"Blunt":10}|wieldSound=someSound|...

Особенности:

  • Вложенные объекты кодируются в JSON и заворачиваются в <nowiki>, чтобы их можно было безопасно передавать как параметр.
  • Массивы кодируются в JSON без <nowiki>, чтобы удобно обрабатывать их модулями вроде Сущность.jsonList.

Этот режим используется внутри GetField.getTpl и других обёрток.

p.get: получение значения по пути

{{#invoke:GetField|get
 | <id или пусто для "default">
 | <путь_к_json_странице>
 | <ключ.с.точками>
}}

Примеры:

{{#invoke:GetField|get
 | MyEntityId
 | component/item.json
 | damage.types
}}

Если в JSON:

 <!-- <syntaxhighlight lang=json> -->
"damage": {
  "types": {
    "Blunt": 10
  }
}

то результатом будет:

{"Blunt":10}

то есть:

  • для таблиц модуль пытается сделать mw.text.jsonEncode(v) и вернуть JSON‑строку;
  • для простых значений возвращается строка tostring(v).

Если keyPath пуст, возвращается весь объект (как JSON).

p.getTpl: вызов шаблона по данным JSON

{{#invoke:GetField|getTpl
 | <id>
 | <путь_к_json_странице>
 | <путь_к_шаблону>
}}

Пример:

{{#invoke:GetField|getTpl
 | MyEntityId
 | component/item.json
 | Component/meleeWeapon
}}

Работа:

  • внутри вызывает flattenField, получая строку key=value|...;
  • формирует строку вида:
{{Component/meleeWeapon
 |id=MyEntityId
 |damage.types=...
 |...
}}
  • и прогоняет её через frame:preprocess, возвращая итоговый рендер.

Это удобный способ «подключить» шаблон компонента к данным из JSON без ручного перечисления параметров.

p.getTplProto: вызов шаблона по прототипам

{{#invoke:GetField|getTplProto
 | <searchId>
 | <protoId>
 | <путь_к_шаблону>
}}
  • Ищет в prototype.json все записи, где protoId встречается у searchId.
  • Для каждого найденного ID вызывает getTpl и возвращает все вызовы, склеенные через перевод строки и отрендеренные.

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

Типичный рабочий поток

  1. В JSON‑файлах (component.json, prototype.json и др.) описываются сущности и связи компонент/прототипов.
  2. Для каждого компонента/прототипа создаются шаблоны Template:Component/..., Template:prototype/..., которые:
    • вызывают {{#invoke:Сущность/поля|main ...}} для описания полей карточки;
    • при необходимости используют GetField / Сущность.jsonList / Сущность.json для форматирования сложных JSON‑полей.
  3. Для вывода карточки на странице сущности используется:
    • либо прямой {{#invoke:Сущность|get|MyEntityId}},
    • либо шаблон‑обёртка {{Сущность/карточка|MyEntityId}}.
  4. Для специализированных списков/таблиц:
    • Сущность.jsonList — если нужно красиво показать массив/словарь из JSON;
    • Сущность.json — если нужно превратить список эффектов в набор вызовов шаблона;
    • GetField.get — если нужно точечно вытащить одно поле;
    • GetField.getTpl / getTplProto — если нужно строить шаблоны по данным JSON автоматически.