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

Материал из Space Station 14 Вики
мНет описания правки
Метка: отменено
Нет описания правки
 
(не показано 13 промежуточных версий 2 участников)
Строка 1: Строка 1:
<!---------------------------  Командование  --------------------------->
{{docpage}}{{TOC hidden}}
{{таблица ролей
{{OnLua|Сущность|module1=Сущность|module2=Сущность/поля|module3=GetField}}
|цвет        = blue
|ссылка      = Командование
|иконка      = cmd_dep.png
|заголовок    = Командование
|руководитель = Капитан
|канал        = к
|сотрудник    = Да
|руководства  = [[Стандартные рабочие процедуры (Командование)]] • [[Задачи станции]]
|содержание  =


{{таблица ролей/содержание
Модульный набор {{tl|Модуль:Сущность}} + {{tl|Модуль:Сущность/поля}} + {{tl|Модуль:GetField}} предназначен для:
|цвет      = blue
* автоматической сборки карточек сущностей (компонентов и прототипов) по их ID;
|ссылка    = Капитан
* описания полей в шаблонах компонентов (какие поля идут в карточку, как подписаны);
|заголовок = Капитан
* удобного доступа к данным из JSON (как простыми значениями, так и готовыми вызовами шаблонов).
|иконка    = Капитан.png
}}
 
{{таблица ролей/содержание
|цвет      = blue
|ссылка    = Глава персонала
|заголовок = Глава персонала
|иконка    = Глава персонала.png
}}
 
{{таблица ролей/содержание
|цвет      = blue
|ссылка    = Глава службы безопасности
|заголовок = Глава СБ
|иконка    = Глава службы безопасности.png
}}
 
{{таблица ролей/содержание
|цвет      = blue
|ссылка    = Старший инженер
|заголовок = Старший инженер
|иконка    = Старший инженер.png
}}
 
{{таблица ролей/содержание
|цвет      = blue
|ссылка    = Научный руководитель
|заголовок = Научный руководитель
|иконка    = Научный руководитель.png
}}
 
{{таблица ролей/содержание
|цвет      = blue
|ссылка    = Главный врач
|заголовок = Главный врач
|иконка    = Главный врач.png
}}
 
{{таблица ролей/содержание
|цвет      = blue
|ссылка    = Квартирмейстер
|заголовок = Квартирмейстер
|иконка    = Квартирмейстер.png
}}
 
}}
<!---------------------------  Юридический департамент  --------------------------->
{{таблица ролей
|цвет        = turquoise
|ссылка      = Юридический департамент
|иконка      = law_dep.png
|заголовок    = Юридический департамент
|руководитель = Магистрат
|канал        = о
|сотрудник    = Да
|руководства  = [[Корпоративный Закон]] • [[Стандартные рабочие процедуры (Юридический департамент)]] • [[СРП|Стандартные рабочие процедуры]]
|содержание  =
 
{{таблица ролей/содержание
|цвет      = turquoise
|ссылка    = Магистрат
|заголовок = Магистрат
|иконка    = Магистрат.png
}}
 
{{таблица ролей/содержание
|цвет      = turquoise
|ссылка    = Агент внутренних дел
|заголовок = Агент внутренних дел
|иконка    = Агент внутренних дел.png
}}
 
}}
<!---------------------------  Служба безопасности  --------------------------->
{{таблица ролей
|цвет        = red
|ссылка      = Служба безопасности
|иконка      = sec_dep.png
|заголовок    = Служба безопасности
|руководитель = Глава службы безопасности
|канал        = о
|сотрудник    = Да
|руководства  = [[Корпоративный Закон]] • [[Стандартные рабочие процедуры (Служба безопасности)]] • [[Контрабанда | Контрабанда]] • [[Инвентарь службы безопасности]]
|содержание  =
 
{{таблица ролей/содержание
|цвет      = red
|ссылка    = Глава службы безопасности
|заголовок = Глава СБ
|иконка    = Глава Службы Безопасности.png
}}
 
{{таблица ролей/содержание
|цвет      = red
|ссылка    = Смотритель
|заголовок = Смотритель
|иконка    = Смотритель.png
}}
 
{{таблица ролей/содержание
|цвет      = red
|ссылка    = Офицер СБ
|заголовок = Офицер СБ
|иконка    = Офицер службы безопасности.png
}}
 
{{таблица ролей/содержание
|цвет      = red
|ссылка    = Детектив
|заголовок = Детектив
|иконка    = Детектив.png
}}
 
{{таблица ролей/содержание
|цвет      = red
|ссылка    = Пилот
|заголовок = Пилот
|иконка    = Пилот службы безопасности.png
}}
 
{{таблица ролей/содержание
|цвет      = red
|ссылка    = Кадет СБ
|заголовок = Кадет СБ
|иконка    = Кадет службы безопасности.png
}}
 
}}
<!---------------------------  Медицинский отдел  --------------------------->
{{таблица ролей
|цвет        = skyblue
|ссылка      = Медицинский отдел
|иконка      = med_dep.png
|заголовок    = Медицинский отдел
|руководитель = Главный врач
|канал        = м
|сотрудник    = Да
|руководства  = [[Медицина]] • [[Химия]] • [[Стандартные рабочие процедуры (Медицинский отдел)]] • [[Медицинский инвентарь]] • [[Таблица психических заболеваний]]
|содержание  =
 
{{таблица ролей/содержание
|цвет      = skyblue
|ссылка    = Главный врач
|заголовок = Главный врач
|иконка    = Главный врач.png
}}
 
{{таблица ролей/содержание
|цвет      = skyblue
|ссылка    = Химик
|заголовок = Химик
|иконка    = Химик.png
}}
 
{{таблица ролей/содержание
|цвет      = skyblue
|ссылка    = Врач
|заголовок = Врач
|иконка    = Врач.png
}}
 
{{таблица ролей/содержание
|цвет      = skyblue
|ссылка    = Парамедик
|заголовок = Парамедик
|иконка    = Парамедик.png
}}


{{таблица ролей/содержание
Ниже описан общий принцип работы и отдельные режимы.
|цвет      = skyblue
|ссылка    = Психолог
|заголовок = Психолог
|иконка    = Психолог.png
}}
 
{{таблица ролей/содержание
|цвет      = skyblue
|ссылка    = Интерн
|заголовок = Интерн
|иконка    = Интерн.png
}}
 
}}
<!---------------------------  Научный отдел  --------------------------->
{{таблица ролей
|цвет        = purple
|ссылка      = Научный отдел
|иконка      = sci_dep.png
|заголовок    = Научный отдел
|руководитель = Научный руководитель
|канал        = н
|сотрудник    = Да
|руководства  = [[Стандартные рабочие процедуры (Научный отдел)]] • [[Руководство по исследованию и разработке]] • [[Постройка компьютеров и машинерии]] • [[Робототехника|Руководство по робототехнике]] • [[Руководство по ксеноархеологии]] • [[Аномалистика|Руководство по аномалиям]]
|содержание  =
 
{{таблица ролей/содержание
|цвет      = purple
|ссылка    = Научный руководитель
|заголовок = Научный руководитель
|иконка    = Научный руководитель.png
}}
 
{{таблица ролей/содержание
|цвет      = purple
|ссылка    = Учёный
|заголовок = Учёный
|иконка    = Учёный.png
}}


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


}}
== Модуль: Сущность/поля ==
<!---------------------------  Инженерный отдел  --------------------------->
Шаблоны компонентов используют модуль <code>Сущность/поля</code> для объявления полей, которые будут собираться в карточку.
{{таблица ролей
|цвет        = yellow
|ссылка      = Инженерный отдел
|иконка      = eng_dep.png
|заголовок    = Инженерный отдел
|руководитель = Старший инженер
|канал        = и
|сотрудник    = Да
|руководства  = [[Стандартные рабочие процедуры (Инженерный отдел)|СРП Инженерии]] • [[Электроэнергия]] • [[Строительство]] • [[Руководство по взлому]] • [[Инженерный инвентарь]] • [[Руководство по атмосфере]] • [[Настройка камеры смешивания]] • [[Смешивание газов]]
|содержание  =


{{таблица ролей/содержание
Пример шаблона компонента:
|цвет      = yellow
|ссылка    = Старший инженер
|заголовок = Старший инженер
|иконка    = Старший инженер.png
}}


{{таблица ролей/содержание
<pre>
|цвет      = yellow
{{#invoke:Сущность/поля|main
|ссылка    = Атмосферный техник
|cardLabel_Стоимость  = [[Стоимость]]
|заголовок = Атмосферный техник
|cardContent_Стоимость = '''{{{price}}}'''
|иконка    = Атмосферный техник.png
}}
}}
</pre>


{{таблица ролей/содержание
Другой компонент может добавлять тот же ключ:
|цвет      = yellow
|ссылка    = Инженер
|заголовок = Инженер
|иконка    = Инженер.png
}}


{{таблица ролей/содержание
<pre>
|цвет      = yellow
{{#invoke:Сущность/поля|main
|ссылка    = Технический ассистент
|cardContent_Стоимость  = '''{{{superPrice}}}'''
|заголовок = Технический ассистент
|иконка    = Технический ассистент.png
}}
}}
</pre>


}}
Особенности:
<!---------------------------  Отдел снабжения  --------------------------->
* Пара <code>cardLabel_<Ключ></code> / <code>cardContent_<Ключ></code> описывает одну строку карточки (лейбл и содержимое).
{{таблица ролей
* Если несколько шаблонов дают один и тот же <code>cardContent_Ключ</code>, содержимое '''объединяется''', а лейбл берётся первый непустой.
|цвет        = brown
* То же относится к другим режимам, перечисленным в мета‑JSON шаблона (разделы <code>card</code>, <code>title</code> и т. п.), которые читает {{tl|Модуль:Сущность}}.
|ссылка      = Отдел снабжения
|иконка      = cargo_dep.png
|заголовок    = Отдел снабжения
|руководитель = Квартирмейстер
|канал        = п
|сотрудник    = Да
|руководства  = [[Стандартные рабочие процедуры (Отдел снабжения)]]
|содержание  =


{{таблица ролей/содержание
== Модуль: Сущность ==
|цвет      = brown
|ссылка    = Квартирмейстер
|заголовок = Квартирмейстер
|иконка    = Квартирмейстер.png
}}


{{таблица ролей/содержание
=== p.get: основная сборка карточки ===
|цвет      = brown
Вызов:
|ссылка    = Утилизатор
|заголовок = Утилизатор
|иконка    = Утилизатор.png
}}


{{таблица ролей/содержание
<pre>
|цвет      = brown
{{#invoke:Сущность|get
|ссылка    = Грузчик
| <ID или список ID>
|заголовок = Грузчик
| blacklist=...
|иконка    = Грузчик.png
| whitelist=...
| ignoreComponents=...
| ignorePrototypes=...
}}
}}
</pre>


}}
* '''1‑й параметр''' — <code>id</code> или список <code>id</code> через запятую.
<!---------------------------  Сервисный отдел  --------------------------->
* По этому ID модуль находит:
{{таблица ролей
** '''компоненты''' из <code>component.json</code>;
|цвет        = green
** '''прототипы''' из <code>prototype.json</code>;
|ссылка      = Сервисный отдел
и для каждого — соответствующие шаблоны <code>Template:component/...</code> / <code>Template:prototype/...</code>.
|иконка      = serv_dep.png
* Шаблоны описывают свои поля через <code>Сущность/поля</code>.
|заголовок    = Сервисный отдел
|руководитель = Глава персонала
|канал        = с
|сотрудник    = Да
|руководства  = [[Стандартные рабочие процедуры (Сервисный отдел)]] • [[Инвентарь сервисного отдела]] • [[Гидропоника]] • [[Напитки]] • [[Готовка]]
|содержание  =


{{таблица ролей/содержание
После сборки модуль:
|цвет      = green
* формирует один вызов <code><nowiki>{{карточка/сущность|...}}</nowiki></code> со всеми разделами и полями;
|ссылка    = Глава персонала
* дополняет выход при необходимости (блоки title и т. п.);
|заголовок = Глава персонала
* прогоняет результат через <code>frame:preprocess</code>, чтобы отрендерить разметку.
|иконка    = Глава Персонала.png
}}


{{таблица ролей/содержание
Параметры фильтрации:
|цвет      = green
* {{пм|blacklist}} — список <code>режим_Ключ</code> через запятую, чтобы исключить поле:
|ссылка    = Шеф-повар
** пример: <code>blacklist=card_Наносит повреждения,title_Что‑то</code>;
|заголовок = Шеф-повар
* {{пм|whitelist}} — наоборот, список разрешённых <code>режим_Ключ</code>, остальные игнорируются;
|иконка    = Шеф-повар.png
* {{пм|ignoreComponents}} / {{пм|ignoreComponent}} — список имён компонентов через запятую, которые полностью игнорируются для этого вызова;
}}
* {{пм|ignorePrototypes}} / {{пм|ignorePrototype}} — аналогично для прототипов.


{{таблица ролей/содержание
Пример простой сборки (через шаблон‑обёртку):
|цвет      = green
|ссылка    = Ботаник
|заголовок = Ботаник
|иконка    = Ботаник.png
}}


{{таблица ролей/содержание
<pre>
|цвет      = green
{{Сущность/карточка|MyEntityId}}
|ссылка    = Бармен
</pre>
|заголовок = Бармен
|иконка    = Бармен.png
}}


{{таблица ролей/содержание
где в шаблоне <code>Сущность/карточка</code> внутри:
|цвет      = green
|ссылка    = Сервисный работник
|заголовок = Сервисный работник
|иконка    = Сервисный работник.png
}}


{{таблица ролей/содержание
<pre>
|цвет      = green
{{#invoke:Сущность|get|{{{1}}}}}
|ссылка    = Боксер
</pre>
|заголовок = Боксер
|иконка    = Боксер.png
}}


{{таблица ролей/содержание
=== p.preview: предпросмотр полей конкретного шаблона ===
|цвет      = green
Используется для проверки, что компонент/прототип правильно описал свои поля.
|ссылка    = Уборщик
|заголовок = Уборщик
|иконка    = Уборщик.png
}}


{{таблица ролей/содержание
<pre>
|цвет      = green
{{#invoke:Сущность|preview
|ссылка    = Библиотекарь
| Component/meleeWeapon
|заголовок = Библиотекарь
|иконка    = Библиотекарь.png
}}
}}
</pre>


{{таблица ролей/содержание
* Показывает, какие <code>card</code> / <code>title</code>‑поля объявлены в <code>Template:Component/meleeWeapon</code>.
|цвет      = green
* Удобно при разработке шаблонов компонентов.
|ссылка    = Священник
|заголовок = Священник
|иконка    = Священник.png
}}


{{таблица ролей/содержание
=== p.jsonList: вывод JSON в виде списка ===
|цвет      = green
Режим похож на стандартный <code>arraymap</code>, но работает с JSON.
|ссылка    = Зоотехник
|заголовок = Зоотехник
|иконка    = Зоотехник.png
}}


{{таблица ролей/содержание
<pre>
|цвет      = green
{{#invoke:Сущность|jsonList
|ссылка    = Репортёр
| <json или {{{...}}}>
|заголовок = Репортёр
| type = list / enum
|иконка    = Репортёр.png
| prefix = *
| sep = :
| key_pattern = (.*)
| key_replace = \1
| value_pattern = (.*)
| value_replace = \1
}}
}}
</pre>


{{таблица ролей/содержание
Примеры JSON:
|цвет      = green
|ссылка    = Музыкант
|заголовок = Музыкант
|иконка    = Музыкант.png
}}


{{таблица ролей/содержание
<pre> <!-- <syntaxhighlight lang=json> -->
|цвет      = green
{
|ссылка    = Пассажир
  "Blunt": 10,
|заголовок = Пассажир
  "Slash": 5
|иконка    = Пассажир.png
}
}}
</pre> <!-- </syntaxhighlight> -->


{{таблица ролей/содержание
или
|цвет      = green
|ссылка    = Мим
|заголовок = Мим
|иконка    = Мим.png
}}


{{таблица ролей/содержание
<pre> <!-- <syntaxhighlight lang=json> -->
|цвет      = green
["Knife", "Sword", "Bat"]
|ссылка    = Клоун
</pre> <!-- </syntaxhighlight> -->
|заголовок = Клоун
|иконка    = Клоун.png
}}


}}
Основные опции:
<!---------------------------  Антагонисты  --------------------------->
* {{пм|type}}:
{{таблица ролей
** <code>list</code> — список строк (с префиксом, например <code>* </code>);
|цвет        = pastel-red
** <code>enum</code> — перечисление через запятую (<code>A, B, C</code> без префикса).
|ссылка      = Антагонисты
* {{пм|prefix}} — префикс строки списка (по умолчанию <code>* </code>).
|иконка      = Antag_dep.png
* {{пм|sep}} — разделитель для <code>ключ: значение</code> (по умолчанию <code>: </code>).
|заголовок    = Антагонисты
* {{пм|key_pattern}} / {{пм|key_replace}} — regex и замена для ключей.
|руководитель =
* {{пм|value_pattern}} / {{пм|value_replace}} — regex и замена для значений.
|канал        =
|сотрудник    = Нет
|руководства  = [[Контрабанда]] • [[Руководство по взлому]] • [[Взламываемые криптографическим секвенсором предметы|Емаг]] • [[Аплинк]]
|содержание  =


{{таблица ролей/содержание
Дополнительно:
|цвет      = pastel-red
* в шаблоне замены поддерживаются:
|ссылка    = Предатель
** <code>\1</code> — собственное значение (ключ или значение);
|заголовок = Предатели
** <code>\2</code> в <code>value_replace</code> — '''сырой ключ''' (после <code>key_pattern</code>, но до <code>key_replace</code>);
|иконка    = Предатель Адольф.png
** <code>\2</code> в <code>key_replace</code> — итоговое отформатированное значение (после <code>value_replace</code>).
}}


{{таблица ролей/содержание
Пример, где сначала форматируем тип урона, а затем подставляем его в описание:
|цвет      = pastel-red
|ссылка    = Ядерный оперативник
|заголовок = Ядерные оперативники
|иконка    = Ядерный оперативник.png
}}


{{таблица ролей/содержание
<pre>
|цвет      = pastel-red
{{#invoke:Сущность|jsonList
|ссылка    = Революционер
| {{{damage.types}}}
|заголовок = Революционеры
| type = enum
|иконка    = Revhead.png
| key_replace = <nowiki>\1</nowiki>              <!-- "Blunt" -->
| value_replace = <nowiki>'''\1''' \2</nowiki>  <!-- "'''10''' Blunt" -->
}}
}}
</pre>


{{таблица ролей/содержание
=== p.json: превращение JSON в вызовы шаблонов ===
|цвет      = pastel-red
Режим для случаев, когда в JSON лежит список эффектов/объектов, и нужно по каждому вызвать отдельный шаблон.
|ссылка    = Нулевой пациент
|заголовок = Нулевые пациенты
|иконка    = Zombie-turnFullHD.png
}}


{{таблица ролей/содержание
<pre>
|цвет      = pastel-red
{{#invoke:Сущность|json
|ссылка    = Вор
| <json или {{{...}}}>
|заголовок = Воры
| <путь_к_шаблону>
|иконка    = Вор.png
}}
}}
</pre>


{{таблица ролей/содержание
* '''1‑й параметр / <code>json=</code>''' — строка JSON.
|цвет      = pastel-red
* '''2‑й параметр / <code>template=</code>''' — путь к шаблону, например <code>Component/adjustPlant</code>.
|ссылка    = Пираты
|заголовок = Пираты
|иконка    = Pirate.gif
}}


{{таблица ролей/содержание
Ожидаемый формат JSON‑массива:
|цвет      = pastel-red
|ссылка    = Маг
|заголовок = Маг
|иконка    = mag.png
}}


}}
<pre> <!-- <syntaxhighlight lang=json> -->
<!---------------------------  Антагонисты NEXT  --------------------------->
[
{{таблица ролей
  {
|цвет        = pastel-red
    "!type:PlantAdjustNutrition": {
|ссылка       = Антагонисты
      "amount": 0.1
|иконка      = Antag Next dep.png
    }
|заголовок    = Антагонисты NEXT
  },
|руководитель =
  {
|канал        =
    "!type:PlantAdjustWeeds": {
|сотрудник    = Нет
       "amount": 2
|руководства  = [[Блоб (NEXT)]] • [[Еретик (NEXT)]] • [[Воксы рейдеры (NEXT)]]
    }
|содержание  =
  },
  {
    "!type:PlantAdjustPests": {
      "amount": 2
    }
  }
]
</pre> <!-- </syntaxhighlight> -->


{{таблица ролей/содержание
Для каждого элемента создаётся вызов:
|цвет      = pastel-red
|ссылка    = Блоб (NEXT)
|заголовок = Блоб
|иконка    = CoreBlobTile.png
}}


{{таблица ролей/содержание
<pre>
|цвет      = pastel-red
{{Component/adjustPlant
|ссылка    = Еретик (NEXT)
|id=!type:PlantAdjustNutrition
|заголовок = Еретик
|amount=0.1
|иконка    = Heretic.png
}}
}}
 
{{Component/adjustPlant
{{таблица ролей/содержание
|id=!type:PlantAdjustWeeds
|цвет      = pastel-red
|amount=2
|ссылка    = Воксы рейдеры (NEXT)
|заголовок = Воксы рейдеры
|иконка    = VoxRaider.png
}}
}}
 
{{Component/adjustPlant
|id=!type:PlantAdjustPests
|amount=2
}}
}}
<!---------------------------  Центральное командование  --------------------------->
</pre>
{{таблица ролей
|цвет        = emerald
|ссылка      = Центральное командование
|иконка      = centcom_dep.png
|заголовок    = Центральное командование
|руководитель =
|канал        = ц
|сотрудник    = Да
|руководства  = [[Специальные Рабочие Процедуры Эскадрона смерти]] • [[Руководство для начинающих ОЦК]]
|содержание  =


{{таблица ролей/содержание
Особенности:
|цвет      = emerald
* Если JSON — объект вида <code>{ "id1": {...}, "id2": {...} }</code>, происходит аналогичный проход по парам <code>ключ → объект</code>.
|ссылка    = Представитель ЦК
* Все вызовы склеиваются через перевод строки и прогоняются через <code>frame:preprocess</code>, поэтому внутри шаблона можно использовать любую вики‑разметку.
|заголовок = Представитель ЦК
|иконка    = Пцк.png
}}


{{таблица ролей/содержание
== Модуль: GetField ==
|цвет      = emerald
Модуль <code>GetField</code> используется для доступа к тем же JSON‑данным <code>.../data</code>, но на более низком уровне.
|ссылка    = Оператор ЦК
|заголовок = Оператор ЦК
|иконка    = Operator.png
}}


{{таблица ролей/содержание
=== p.flattenField: расплющивание записи в параметры ===
|цвет      = emerald
<pre>
|ссылка    = РХБЗЗ
{{#invoke:GetField|flattenField
|заголовок = РХБЗЗ
| <id>
|иконка    = CQO-commander.png
| <путь_к_json_странице>
}}
}}
</pre>


{{таблица ролей/содержание
Например:
|цвет      = emerald
|ссылка    = ОБР
|заголовок = ОБР
|иконка    = obr-leader.png
}}


{{таблица ролей/содержание
<pre>
|цвет      = emerald
{{#invoke:GetField|flattenField
|ссылка    = Эскадрон смерти
| MyEntityId
|заголовок = Эскадрон смерти
| component/item.json
|иконка    = CCdeath.png
}}
}}
</pre>


}}
Возвращает строку вида:
<!---------------------------  Призрачные роли. Антагонисты  --------------------------->
{{таблица ролей
|цвет        = red
|ссылка      = Антагонисты
|иконка      = Antagghost.png
|заголовок    = Призрачные роли антагонистов
|руководитель =
|канал        =
|сотрудник    = Нет
|руководства  =
|содержание  =


{{таблица ролей/содержание
<pre>
|цвет      = red
damage.types={"Blunt":10}|wieldSound=someSound|...
|ссылка    = Ядерный оперативник
</pre>
|заголовок = Одинокий ядерный оперативник
|иконка    = Ядерный оперативник.png
}}


{{таблица ролей/содержание
Особенности:
|цвет      = red
* Вложенные объекты кодируются в JSON и заворачиваются в <code><nowiki><nowiki></nowiki></code>, чтобы их можно было безопасно передавать как параметр.
|ссылка    = Агент подкрепления
* Массивы кодируются в JSON без <code><nowiki><nowiki></nowiki></code>, чтобы удобно обрабатывать их модулями вроде <code>Сущность.jsonList</code>.
|заголовок = Агент подкрепления
|иконка    = Reinforcementsyn.png
}}


{{таблица ролей/содержание
Этот режим используется внутри <code>GetField.getTpl</code> и других обёрток.
|цвет      = red
|ссылка    = Агент подкрепления#Обезьяна подкрепления
|заголовок = Обезьяна подкрепления
|иконка    = Syndiemonkeyagent.png
}}


{{таблица ролей/содержание
=== p.get: получение значения по пути ===
|цвет      = red
<pre>
|ссылка    = Скелет из шкафа
{{#invoke:GetField|get
|заголовок = Скелет из шкафа
| <id или пусто для "default">
|иконка    = Skelet.png
| <путь_к_json_странице>
| <ключ.с.точками>
}}
}}
</pre>


{{таблица ролей/содержание
Примеры:
|цвет      = red
|ссылка    = Голопаразит
|заголовок = Голопаразит
|иконка    = Holoparasite.png
}}


{{таблица ролей/содержание
<pre>
|цвет      = red
{{#invoke:GetField|get
|ссылка    = Синтетики
| MyEntityId
|заголовок = Синтетики
| component/item.json
|иконка    = Spai.png
| damage.types
}}
}}
</pre>


{{таблица ролей/содержание
Если в JSON:
|цвет      = red
|ссылка    = Крысиный король
|заголовок = Крысы
|иконка    = Regalrat.png
}}


{{таблица ролей/содержание
<pre> <!-- <syntaxhighlight lang=json> -->
|цвет      = red
"damage": {
|ссылка    = Ревенант
  "types": {
|заголовок = Ревенант
    "Blunt": 10
|иконка    = MobRevenant.png
  }
}}
}
</pre> <!-- </syntaxhighlight> -->


{{таблица ролей/содержание
то результатом будет:
|цвет      = red
|ссылка    = Космический дракон
|заголовок = Космический дракон
|иконка    = MobDragon.png
}}


{{таблица ролей/содержание
<pre>
|цвет      = red
{"Blunt":10}
|ссылка    = Тарантул
</pre>
|заголовок = Тарантулы
|иконка    = Tarantula anim.gif
}}


{{таблица ролей/содержание
то есть:
|цвет      = red
* для таблиц модуль пытается сделать <code>mw.text.jsonEncode(v)</code> и вернуть JSON‑строку;
|ссылка    = Клоун-Паук
* для простых значений возвращается строка <code>tostring(v)</code>.
|заголовок = Тарантулы-клоуны
|иконка    = Clown_spider.png
}}


{{таблица ролей/содержание
Если <code>keyPath</code> пуст, возвращается весь объект (как JSON).
|цвет      = red
|ссылка    = Животные#Слаймы
|заголовок = Слаймы
|иконка    = Yellow_adult_slime.png
}}


{{таблица ролей/содержание
=== p.getTpl: вызов шаблона по данным JSON ===
|цвет      = red
<pre>
|ссылка    = Животные#Обитатели обломков
{{#invoke:GetField|getTpl
|заголовок = Обитатели обломков
| <id>
|иконка    = Space Carp.gif
| <путь_к_json_странице>
| <путь_к_шаблону>
}}
}}
</pre>


{{таблица ролей/содержание
Пример:
|цвет      = red
|ссылка    = Космический ниндзя
|заголовок = Космический ниндзя
|иконка    = Space ninja.png
}}


{{таблица ролей/содержание
<pre>
|цвет      = red
{{#invoke:GetField|getTpl
|ссылка    = Ксеносы
| MyEntityId
|заголовок = Ксеносы
| component/item.json
|иконка    = Queen.png
| Component/meleeWeapon
}}
}}
</pre>


{{таблица ролей/содержание
Работа:
|цвет      = red
* внутри вызывает <code>flattenField</code>, получая строку <code>key=value|...</code>;
|ссылка    = Блоб
* формирует строку вида:
|заголовок = Блоб {{пометка проекта|next}}
|иконка    = CoreBlobTile.png
}}


<pre>
{{Component/meleeWeapon
|id=MyEntityId
|damage.types=...
|...
}}
}}
<!---------------------------  Призрачные роли  --------------------------->
</pre>
{{таблица ролей
|цвет        = pastel-grey
|ссылка      = Призрачные роли
|иконка      = Призраки.png
|заголовок    = Призрачные роли
|руководитель =
|канал        =
|сотрудник    = Нет
|руководства  =
|содержание  =


{{таблица ролей/содержание
* и прогоняет её через <code>frame:preprocess</code>, возвращая итоговый рендер.
|цвет      = pastel-grey
|ссылка    = Животные
|заголовок = Животные
|иконка    = MobCorgiIan.png
}}


{{таблица ролей/содержание
Это удобный способ «подключить» шаблон компонента к данным из JSON без ручного перечисления параметров.
|цвет      = pastel-grey
|ссылка    = Призрак
|заголовок = Призрак
|иконка    = Призрак.png
}}


{{таблица ролей/содержание
=== p.getTplProto: вызов шаблона по прототипам ===
|цвет      = pastel-grey
<pre>
|ссылка    = Синтетики
{{#invoke:GetField|getTplProto
|заголовок = Синтетики
| <searchId>
|иконка    = PersonalAI.png
| <protoId>
| <путь_к_шаблону>
}}
}}
</pre>


{{таблица ролей/содержание
* Ищет в <code>prototype.json</code> все записи, где <code>protoId</code> встречается у <code>searchId</code>.
|цвет      = pastel-grey
* Для каждого найденного ID вызывает <code>getTpl</code> и возвращает все вызовы, склеенные через перевод строки и отрендеренные.
|ссылка    = Киборг
|заголовок = Киборг
|иконка    = Robots.gif
}}


{{таблица ролей/содержание
Используется для случаев, когда сущность использует '''несколько''' прототипов одного типа, и нужно вывести по одному шаблону на каждый прототип.
|цвет      = pastel-grey
|ссылка    = Неизвестный шаттл
|заголовок = Неизвестный шаттл
|иконка    = Doppelganger.png
}}


}}
== Типичный рабочий поток ==
# В 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 автоматически.