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

мНет описания правки
Нет описания правки
 
(не показано 311 промежуточных версий 4 участников)
Строка 1: Строка 1:
<div class="grid-box">
{{docpage}}{{TOC hidden}}
<div class="grid-container">
{{OnLua|Сущность|module1=Сущность|module2=Сущность/поля|module3=GetField}}
{{ModernTitle|Кальбр .25|width=40%|margin=6px 0|background-color=#711212}}
{|ID="aSEC" class="wikitable mobilefont sortable grid-item-1" style="width:100%;text-align:center;"
!style="width:20%;" class="unsortable"|Снаряд
!style="width:60%;" class="unsortable"|Наносит
!style="width:20%;"|Итоговый урон
|-
!{{Anchor|.25}}{{#invoke:Entity Lookup|createimagetooltip|Файл:MagazineBoxCaselessRifle.png|MagazineBoxCaselessRifle|Мета=64x64px,link=}}<br>Безгильзовые
|
* <span style="color:darksalmon">'''19'''</span> Уколы
* Не оставляет '''гильз'''
|style="color:Yellow"|'''19'''
|-
!{{Anchor|.25 учебные}}{{#invoke:Entity Lookup|createimagetooltip|Файл:MagazineBoxCaselessRiflePractice.png|MagazineBoxCaselessRiflePractice|Мета=64x64px,link=}}<br>Учебные
|
* <span style="color:crimson">'''2'''</span> Ушибы
* Не оставляет '''гильз'''
|style="color:Yellow"|'''2'''
|-
|}
</div>


<div class="grid-container">
Модульный набор {{tl|Модуль:Сущность}} + {{tl|Модуль:Сущность/поля}} + {{tl|Модуль:GetField}} предназначен для:
{{ModernTitle|Кальбр .60|width=40%|margin=6px 0|background-color=#711212}}
* автоматической сборки карточек сущностей (компонентов и прототипов) по их ID;
{|ID="aSEC" class="wikitable mobilefont sortable grid-item-1" style="width:100%;text-align:center;"
* описания полей в шаблонах компонентов (какие поля идут в карточку, как подписаны);
!style="width:20%;" class="unsortable"|Снаряд
* удобного доступа к данным из JSON (как простыми значениями, так и готовыми вызовами шаблонов).
!style="width:60%;" class="unsortable"|Наносит
!style="width:20%;"|Итоговый урон
|-
!{{Anchor|.60}}{{#invoke:Entity Lookup|createimagetooltip|Файл:MagazineBoxAntiMateriel.png|CartridgeAntiMateriel|Мета=64x64px,link=}}<br>Крупнокалиберные
|
* <span style="color:darksalmon">'''40'''</span> Уколы
* <span style="color:DarkGray">'''30'''</span> Структурные
|style="color:Yellow"|'''40'''
|-
|}
</div>


<div class="grid-container">
Ниже описан общий принцип работы и отдельные режимы.
{{ModernTitle|Кальбр .10|width=40%|margin=6px 0|background-color=#711212}}
{|ID="aSEC" class="wikitable mobilefont sortable grid-item-1" style="width:100%;text-align:center;"
!style="width:20%;" class="unsortable"|Снаряд
!style="width:60%;" class="unsortable"|Наносит
!style="width:20%;"|Итоговый урон
|-
!{{Anchor|Винтовочные}}{{#invoke:Entity Lookup|createimagetooltip|Файл:PistolCartridge.png|CartridgeMinigun|Мета=64x64px,link=}}<br>Винтовочные
|
* <span style="color:darksalmon">'''5'''</span> Уколы
|style="color:Yellow"|'''5'''
|-
|}
</div>


<div class="grid-container">
== Общий принцип работы ==
{{ModernTitle|Кальбр .30|width=40%|margin=6px 0|background-color=#711212}}
* В шаблонах компонентов/прототипов (<code>Template:Component/...</code>, <code>Template:prototype/...</code>) через {{tl|Модуль:Сущность/поля}} описываются поля:
{|ID="aSEC" class="wikitable mobilefont sortable grid-item-2" style="width:100%;text-align:center;"
** '''лейблы''' (<code>cardLabel_*</code>) и '''содержимое''' (<code>cardContent_*</code>), заголовки (<code>title_*</code>) и т. п.;
!style="width:20%;" class="unsortable"|Снаряд
** '''мета‑информация''' о том, какие ключи доступны для <code>card</code> / <code>title</code> и в каком порядке.
!style="width:60%;" class="unsortable"|Наносит
* {{tl|Модуль:Сущность}} по ID сущности:
!style="width:20%;"|Итоговый урон
** находит связанные с ней компоненты и прототипы по JSON‑данным;
|-
** для каждого компонента/прототипа читает шаблоны и метаданные;
!{{Anchor|.30}}{{#invoke:Entity Lookup|createimagetooltip|Файл:MagazineBoxLightRifle.png|MagazineBoxLightRifle|Мета=64x64px,link=}}<br>Винтовочные
** собирает все поля в единую структуру;
|
** формирует один вызов карточки <code><nowiki>{{карточка/сущность|...}}</nowiki></code> (и блоки заголовков).
* <span style="color:darksalmon">'''19'''</span> Уколы
* Внутри полей можно писать вики‑параметры <code>{{{...}}}</code> и вызывать дополнительные модули.
|style="color:Yellow"|'''19'''
* {{tl|Модуль:GetField}} даёт доступ к JSON‑данным на низком уровне:
|-
** как «расплющенный» набор параметров (<code>flattenField</code>);
!{{Anchor|.30 зажигательные}}{{#invoke:Entity Lookup|createimagetooltip|Файл:MagazineBoxLightRifleIncendiary.png|MagazineBoxLightRifleIncendiary|Мета=64x64px,link=}}<br>Зажигательные
** как отдельные значения (<code>get</code>);
|
** как готовые вызовы шаблонов с нужными параметрами (<code>getTpl</code>, <code>getTplProto</code>).
* <span style="color:crimson">'''3'''</span> Ушибы
* <span style="color:orange">'''16'''</span> Термические
* Немного <span style="color:orange">поджигает</span>
|style="color:Yellow"|'''19'''
|-
!{{Anchor|.30 урановые}}{{#invoke:Entity Lookup|createimagetooltip|Файл:MagazineBoxLightRifleUranium.png|MagazineBoxLightRifleUranium|Мета=64x64px,link=}}<br>Урановые
|
* <span style="color:limegreen">'''9'''</span> Радиация
* <span style="color:darksalmon">'''10'''</span> Уколы
|style="color:Yellow"|'''19'''
|-
!{{Anchor|.30 учебный}}{{#invoke:Entity Lookup|createimagetooltip|Файл:MagazineBoxLightRiflePractice.png|MagazineBoxLightRiflePractice|Мета=64x64px,link=}}<br>Учебные
|
* <span style="color:crimson">'''2'''</span> Ушибы
|style="color:Yellow"|'''2'''
|-
|}
</div>


<div class="grid-container">
== Модуль: Сущность/поля ==
{{ModernTitle|Кальбр .35|width=40%|margin=6px 0|background-color=#711212}}
Шаблоны компонентов используют модуль <code>Сущность/поля</code> для объявления полей, которые будут собираться в карточку.
{|ID="aSEC" class="wikitable mobilefont sortable grid-item-2" style="width:100%;text-align:center;"
!style="width:20%;" class="unsortable"|Снаряд
!style="width:60%;" class="unsortable"|Наносит
!style="width:20%;"|Итоговый урон
|-
!{{Anchor|.35}}{{#invoke:Entity Lookup|createimagetooltip|Файл:MagazineBoxPistol.png|MagazineBoxPistol|Мета=64x64px,link=}}<br>Стандартные
|
* <span style="color:darksalmon">'''16'''</span> Уколы
|style="color:Yellow"|'''16'''
|-
!{{Anchor|.35 зажигательные}}{{#invoke:Entity Lookup|createimagetooltip|Файл:MagazineBoxPistolIncendiary.png|MagazineBoxPistolIncendiary|Мета=64x64px,link=}}<br>Зажигательные
|
* <span style="color:crimson">'''2'''</span> Ушибы
* <span style="color:orange">'''14'''</span> Термические
* Немного <span style="color:orange">поджигает</span>
|style="color:Yellow"|'''16'''
|-
!{{Anchor|.35 урановые}}{{#invoke:Entity Lookup|createimagetooltip|Файл:MagazineBoxPistolUranium.png|MagazineBoxPistolUranium|Мета=64x64px,link=}}<br>Урановые
|
* <span style="color:limegreen">'''6'''</span> Радиация
* <span style="color:darksalmon">'''10'''</span> Уколы
|style="color:Yellow"|'''16'''
|-
!{{Anchor|.35 учебные}}{{#invoke:Entity Lookup|createimagetooltip|Файл:MagazineBoxPistolPractice.png|MagazineBoxPistolPractice|Мета=64x64px,link=}}<br>Учебные
|
* <span style="color:crimson">'''2'''</span> Ушибы
|style="color:Yellow"|'''2'''
|-
|}
</div>


<div class="grid-container">
Пример шаблона компонента:
{{ModernTitle|Кальбр .20|width=40%|margin=6px 0|background-color=#711212}}
{|ID="aSEC" class="wikitable mobilefont sortable grid-item-2" style="width:100%;text-align:center;"
!style="width:20%;" class="unsortable"|Снаряд
!style="width:60%;" class="unsortable"|Наносит
!style="width:20%;"|Итоговый урон
|-
!{{Anchor|.20}}{{#invoke:Entity Lookup|createimagetooltip|Файл:MagazineBoxRifle.png|MagazineBoxRifle|Мета=64x64px,link=}}<br>Винтовочные
|
* <span style="color:darksalmon">'''17'''</span> Уколы
|style="color:Yellow"|'''17'''
|-
!{{Anchor|.20 зажигательные}}{{#invoke:Entity Lookup|createimagetooltip|Файл:MagazineBoxRifleIncendiary.png|MagazineBoxRifleIncendiary|Мета=64x64px,link=}}<br>Зажигательные
|
* <span style="color:crimson">'''2'''</span> Ушибы
* <span style="color:orange">'''15'''</span> Термические
* Немного <span style="color:orange">поджигает</span>
|style="color:Yellow"|'''17'''
|-
!{{Anchor|.20 урановые}}{{#invoke:Entity Lookup|createimagetooltip|Файл:MagazineBoxRifleUranium.png|MagazineBoxRifleUranium|Мета=64x64px,link=}}<br>Урановые
|
* <span style="color:limegreen">'''7'''</span> Радиация
* <span style="color:darksalmon">'''8'''</span> Уколы
|style="color:Yellow"|'''15'''
|-
!{{Anchor|.20 учебные}}{{#invoke:Entity Lookup|createimagetooltip|Файл:MagazineBoxRiflePractice.png|MagazineBoxRiflePractice|Мета=64x64px,link=}}<br>Учебные
|
* <span style="color:crimson">'''2'''</span> Ушибы
|style="color:Yellow"|'''2'''
|-
|}
</div>


<div class="grid-container">
<pre>
{{ModernTitle|Кальбр .50|width=40%|margin=6px 0|background-color=#711212}}
{{#invoke:Сущность/поля|main
{|ID="aSEC" class="wikitable mobilefont sortable grid-item-3" style="width:100%;text-align:center;"
|cardLabel_Стоимость  = [[Стоимость]]
!style="width:20%;" class="unsortable"|Снаряд
|cardContent_Стоимость = '''{{{price}}}'''
!style="width:60%;" class="unsortable"|Наносит
}}
!style="width:20%;"|Итоговый урон
</pre>
|-
!{{Anchor|.50 дробь}}{{#invoke:Entity Lookup|createimagetooltip|Файл:ShellShotgun.png|ShellShotgun|Мета=64x64px,link=}}<br>Дробь
|
* <span style="color:darksalmon">'''10'''</span> Уколы
* '''x6''' пуль
|style="color:Yellow"|'''60'''
|-
!{{Anchor|.50 зажигательные}}{{#invoke:Entity Lookup|createimagetooltip|Файл:ShellShotgunIncendiary.png|ShellShotgunIncendiary|Мета=64x64px,link=}}<br>Зажигательные
|
* <span style="color:crimson">'''3'''</span> Ушибы
* <span style="color:orange">'''7'''</span> Термические
* '''x6''' пуль
* Немного <span style="color:orange">поджигает</span>
|style="color:Yellow"|'''60'''
|-
!{{Anchor|.50 травматические}}{{#invoke:Entity Lookup|createimagetooltip|Файл:ShellShotgunBeanbag.png|ShellShotgunBeanbag|Мета=64x64px,link=}}<br>Травматические
|
* <span style="color:crimson">'''10'''</span> Ушибы
* <span style="color:DodgerBlue">'''40'''</span> Выносливость
|style="color:Yellow"|'''10'''
|-
!{{Anchor|.50 транквилизатор}}{{#invoke:Entity Lookup|createimagetooltip|Файл:ShellTranquilizer.png|ShellTranquilizer|Мета=64x64px,link=}}<br>Транквилизатор
|
* <span style="color:crimson">'''1'''</span> Ушибы
* Вливает '''7''' [[Химия#Хлоральгидрат|хлоральгидрата]]
|style="color:Yellow"|'''1'''
|-
!{{Anchor|.50 урановые}}{{#invoke:Entity Lookup|createimagetooltip|Файл:ShellShotgunUranium.png|ShellShotgunUranium|Мета=64x64px,link=}}<br>Урановые
|
* <span style="color:limegreen">'''5'''</span> Радиация
* <span style="color:darksalmon">'''10'''</span> Уколы
* '''x5''' пуль
|style="color:Yellow"|'''15'''
|-
!{{Anchor|.50 учебные}}{{#invoke:Entity Lookup|createimagetooltip|Файл:ShellShotgunPractice.png|ShellShotgunPractice|Мета=64x64px,link=}}<br>Учебные
|
* <span style="color:crimson">'''1'''</span> Ушибы
|style="color:Yellow"|'''1'''
|-
!{{Anchor|.50 фальшфейер}}{{#invoke:Entity Lookup|createimagetooltip|Файл:ShellShotgunFlare.png|ShellShotgunFlare|Мета=64x64px,link=}}<br>Фальшфейер
|
* <span style="color:orange">'''5'''</span> Термические
* Немного <span style="color:orange">поджигает</span>
|style="color:Yellow"|'''5'''
|-
!{{Anchor|.50 пуля)}}{{#invoke:Entity Lookup|createimagetooltip|Файл:ShellShotgunSlug.png|ShellShotgunSlug|Мета=64x64px,link=}}<br>Патрон пуля
|
* <span style="color:darksalmon">'''28'''</span> Уколы
|style="color:Yellow"|'''28'''
|-
!{{Anchor|Самодельный ружейный патрон}}{{#invoke:Entity Lookup|createimagetooltip|Файл:ShellShotgunImprovised.png|ShellShotgunImprovised|Мета=64x64px,link=}}<br>Самодельный ружейный патрон
|
* <span style="color:darksalmon">'''10'''</span> Уколы
* '''x6''' пуль
|style="color:Yellow"|'''60'''
|-
|}
</div>


<div class="grid-container">
Другой компонент может добавлять тот же ключ:
{{ModernTitle|Разрывные|width=40%|margin=6px 0|background-color=#711212}}
{|ID="aSEC" class="wikitable mobilefont sortable grid-item-3" style="width:100%;text-align:center;"
!style="width:20%;" class="unsortable"|Снаряд
!style="width:60%;" class="unsortable"|Наносит
!style="width:20%;"|Итоговый урон
|-
!{{Anchor|Выстрел ПГ-7ВЛ}}{{#invoke:Entity Lookup|createimagetooltip|Файл:CartridgeRocket.png|CartridgeRocket|Мета=64x64px,link=}}<br>{{#invoke:Entity Lookup|getname|CartridgeRocket}}
|
* <span style="color:crimson">'''105'''</span> Ушибы
* <span style="color:darksalmon">'''105'''</span> Уколы
* <span style="color:orange">'''105'''</span> Термические
* Радиус взрыва '''~4''' тайл.
|style="color:Yellow"|'''315'''
|-
!{{Anchor|Осколочная граната}}{{#invoke:Entity Lookup|createimagetooltip|Файл:FragmentationShell.png|GrenadeFrag|Мета=64x64px,link=}}<br>{{#invoke:Entity Lookup|getname|GrenadeFrag}}
|
* <span style="color:crimson">'''25'''</span> Ушибы
* <span style="color:darksalmon">'''25'''</span> Уколы
* <span style="color:orange">'''25'''</span> Термические
* Радиус взрыва '''~6''' тайл.
|style="color:Yellow"|'''75'''
|-
!{{Anchor|Фугасная граната}}{{#invoke:Entity Lookup|createimagetooltip|Файл:HighExplosiveProjectile.png|GrenadeBlast|Мета=64x64px,link=}}<br>{{#invoke:Entity Lookup|getname|GrenadeBlast}}
|
* <span style="color:crimson">'''50'''</span> Ушибы
* <span style="color:darksalmon">'''50'''</span> Уколы
* <span style="color:orange">'''50'''</span> Термические
* Радиус взрыва '''~4''' тайл.
|style="color:Yellow"|'''150'''
|-
!{{Anchor|Светошумовая граната}}{{#invoke:Entity Lookup|createimagetooltip|Файл:GrenadeFlash.png|GrenadeFlash|Мета=64x64px,link=}}<br>{{#invoke:Entity Lookup|getname|GrenadeFlash}}
|
* Обладает свойствами [[Взрывные устройства#Светошумовая граната|светошумовой гранаты]]
|style="color:Yellow"|'''-'''
|-
!{{Anchor|ЭМИ граната}}{{#invoke:Entity Lookup|createimagetooltip|Файл:GrenadeEMP.png|GrenadeEMP|Мета=64x64px,link=}}<br>{{#invoke:Entity Lookup|getname|GrenadeEMP}}
|
* Обладает свойства [[Взрывные устройства#ЭМИ граната|ЭМИ гранаты]]
|style="color:Yellow"|'''-'''
|-
!{{Anchor|Пушечное ядро}}{{#invoke:Entity Lookup|createimagetooltip|Файл:CannonBall.png|CannonBall|Мета=64x64px,link=}}<br>{{#invoke:Entity Lookup|getname|CannonBall}}
|
* <span style="color:crimson">'''27'''</span> Ушибы
* <span style="color:darksalmon">'''27'''</span> Уколы
* <span style="color:orange">'''27'''</span> Термические
* Радиус взрыва '''3''' тайл.
|style="color:Yellow"|'''81'''
|-
|}
</div>


<div class="grid-container">
<pre>
{{ModernTitle|Кальбр .45|width=40%|margin=6px 0|background-color=#711212}}
{{#invoke:Сущность/поля|main
{|ID="aSEC" class="wikitable mobilefont sortable grid-item-3" style="width:100%;text-align:center;"
|cardContent_Стоимость  = '''{{{superPrice}}}'''
!style="width:20%;" class="unsortable"|Снаряд
}}
!style="width:60%;" class="unsortable"|Наносит
</pre>
!style="width:20%;"|Итоговый урон
|-
!{{Anchor|.45}}{{#invoke:Entity Lookup|createimagetooltip|Файл:MagazineBoxMagnum.png|MagazineBoxMagnum|Мета=64x64px,link=}}<br>Магнум
|
* <span style="color:darksalmon">'''35'''</span> Уколы
|style="color:Yellow"|'''35'''
|-
!{{Anchor|.45 бронебойные}}{{#invoke:Entity Lookup|createimagetooltip|Файл:MagazineBoxMagnumAP.png|MagazineBoxMagnumAP|Мета=64x64px,link=}}<br>Бронебойные
|
* <span style="color:darksalmon">'''26'''</span> Уколы
|style="color:Yellow"|'''26'''
|-
!{{Anchor|.45 зажигательные)}}{{#invoke:Entity Lookup|createimagetooltip|Файл:MagazineBoxMagnumIncendiary.png|MagazineBoxMagnumIncendiary|Мета=64x64px,link=}}<br>Зажигательные
|
* <span style="color:crimson">'''3'''</span> Ушибы
* <span style="color:orange">'''32'''</span> Термические
* Немного <span style="color:orange">поджигает</span>
|style="color:Yellow"|'''35'''
|-
!{{Anchor|.45 урановые)}}{{#invoke:Entity Lookup|createimagetooltip|Файл:MagazineBoxMagnumUranium.png|MagazineBoxMagnumUranium|Мета=64x64px,link=}}<br>Урановые
|
* <span style="color:limegreen">'''15'''</span> Радиация
* <span style="color:darksalmon">'''20'''</span> Уколы
|style="color:Yellow"|'''35'''
|-
!{{Anchor|.45 учебные}}{{#invoke:Entity Lookup|createimagetooltip|Файл:MagazineBoxMagnumPractice.png|MagazineBoxMagnumPractice|Мета=64x64px,link=}}<br>Учебные
|
* <span style="color:crimson">'''1'''</span> Ушибы
|style="color:Yellow"|'''1'''
|-
|}
</div>


<div class="grid-container">
Особенности:
{{ModernTitle|Другое|width=40%|margin=6px 0|background-color=#711212}}
* Пара <code>cardLabel_<Ключ></code> / <code>cardContent_<Ключ></code> описывает одну строку карточки (лейбл и содержимое).
{|ID="aSEC" class="wikitable mobilefont sortable" style="width:100%;text-align:center;"
* Если несколько шаблонов дают один и тот же <code>cardContent_Ключ</code>, содержимое '''объединяется''', а лейбл берётся первый непустой.
!style="width:20%;" class="unsortable"|Снаряд
* То же относится к другим режимам, перечисленным в мета‑JSON шаблона (разделы <code>card</code>, <code>title</code> и т. п.), которые читает {{tl|Модуль:Сущность}}.
!style="width:60%;" class="unsortable"|Наносит
!style="width:20%;"|Итоговый урон
|-
!{{Anchor|Стрела}}{{#invoke:Entity Lookup|createimagetooltip|Файл:ArrowRegular.png|ArrowRegular|Мета=64x64px,link=}}<br>{{#invoke:Entity Lookup|getname|ArrowRegular}}
|
* <span style="color:darksalmon">'''35'''</span> Уколы
|style="color:Yellow"|'''35'''
|-
!{{Anchor|Стрела из осколка стекла}}{{#invoke:Entity Lookup|createimagetooltip|Файл:ArrowImprovised.png|ArrowImprovised|Мета=64x64px,link=}}<br>{{#invoke:Entity Lookup|getname|ArrowImprovised}}
|
* <span style="color:darksalmon">'''25'''</span> Уколы
|style="color:Yellow"|'''25'''
|-
|}
</div>


</div>
== Модуль: Сущность ==
<!-- CSS -->
 
<div class="customCSS" style="display:none">
=== p.get: основная сборка карточки ===
.grid-box {
Вызов:
display: grid;
 
gap: 5px;
<pre>
grid-template-columns: repeat(3, 1fr);
{{#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
}
}
.grid-container {
</pre> <!-- </syntaxhighlight> -->
background: #6363630f;
 
padding: 10px 15px;
или
border-radius: 5px;
 
transition: background-color 0.2s;
<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>).
 
Пример, где сначала форматируем тип урона, а затем подставляем его в описание:
 
<pre>
{{#invoke:Сущность|jsonList
| {{{damage.types}}}
| type = enum
| key_replace = <nowiki>\1</nowiki>              <!-- "Blunt" -->
| value_replace = <nowiki>'''\1''' \2</nowiki>  <!-- "'''10''' Blunt" -->
}}
</pre>
 
=== p.json: превращение JSON в вызовы шаблонов ===
Режим для случаев, когда в JSON лежит список эффектов/объектов, и нужно по каждому вызвать отдельный шаблон.
 
<pre>
{{#invoke:Сущность|json
| <json или {{{...}}}>
| <путь_к_шаблону>
}}
</pre>
 
* '''1‑й параметр / <code>json=</code>''' — строка JSON.
* '''2‑й параметр / <code>template=</code>''' — путь к шаблону, например <code>Component/adjustPlant</code>.
 
Ожидаемый формат JSON‑массива:
 
<pre> <!-- <syntaxhighlight lang=json> -->
[
  {
    "!type:PlantAdjustNutrition": {
      "amount": 0.1
    }
  },
  {
    "!type:PlantAdjustWeeds": {
      "amount": 2
    }
  },
  {
    "!type:PlantAdjustPests": {
      "amount": 2
    }
  }
]
</pre> <!-- </syntaxhighlight> -->
 
Для каждого элемента создаётся вызов:
 
<pre>
{{Component/adjustPlant
|id=!type:PlantAdjustNutrition
|amount=0.1
}}
{{Component/adjustPlant
|id=!type:PlantAdjustWeeds
|amount=2
}}
{{Component/adjustPlant
|id=!type:PlantAdjustPests
|amount=2
}}
</pre>
 
Особенности:
* Если JSON — объект вида <code>{ "id1": {...}, "id2": {...} }</code>, происходит аналогичный проход по парам <code>ключ → объект</code>.
* Все вызовы склеиваются через перевод строки и прогоняются через <code>frame:preprocess</code>, поэтому внутри шаблона можно использовать любую вики‑разметку.
 
== Модуль: GetField ==
Модуль <code>GetField</code> используется для доступа к тем же JSON‑данным <code>.../data</code>, но на более низком уровне.
 
=== p.flattenField: расплющивание записи в параметры ===
<pre>
{{#invoke:GetField|flattenField
| <id>
| <путь_к_json_странице>
}}
</pre>
 
Например:
 
<pre>
{{#invoke:GetField|flattenField
| MyEntityId
| component/item.json
}}
</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>
 
Примеры:
 
<pre>
{{#invoke:GetField|get
| MyEntityId
| component/item.json
| damage.types
}}
</pre>
 
Если в JSON:
 
<pre> <!-- <syntaxhighlight lang=json> -->
"damage": {
  "types": {
    "Blunt": 10
  }
}
}
.grid-container:hover {
</pre> <!-- </syntaxhighlight> -->
background: #65656524;
 
}
то результатом будет:
.modern-title span {
 
transition: background-color 0.2s;
<pre>
}
{"Blunt":10}
.grid-container:hover .modern-title span {
</pre>
background: #851414;
 
}
то есть:
.grid-item-1 {
* для таблиц модуль пытается сделать <code>mw.text.jsonEncode(v)</code> и вернуть JSON‑строку;
height: 286px;
* для простых значений возвращается строка <code>tostring(v)</code>.
}
 
.grid-item-2 {
Если <code>keyPath</code> пуст, возвращается весь объект (как JSON).
 
=== p.getTpl: вызов шаблона по данным JSON ===
<pre>
{{#invoke:GetField|getTpl
| <id>
| <путь_к_json_странице>
| <путь_к_шаблону>
}}
</pre>
 
Пример:
 
<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> и возвращает все вызовы, склеенные через перевод строки и отрендеренные.


}
Используется для случаев, когда сущность использует '''несколько''' прототипов одного типа, и нужно вывести по одному шаблону на каждый прототип.
.grid-item-3 {
height: 1040px;
}
@media (max-width: 1400px) {
.grid-box {
grid-template-columns:repeat(2, 1fr);
}
}
@media (max-width: 800px) {
.grid-box {
grid-template-columns:repeat(1, 1fr);
}
.grid-item-3, .grid-item-1, .grid-item-2  {
height: 100%;
}
.grid-container {
background: none;
padding: 0;
border-radius: 0;
}
.grid-container:hover {
background: none;
}
.grid-container:hover .modern-title span {
background: #711212;
}
}


.wikitable {
== Типичный рабочий поток ==
border-radius: 10px !important;
# В JSON‑файлах (<code>component.json</code>, <code>prototype.json</code> и др.) описываются сущности и связи компонент/прототипов.
}
# Для каждого компонента/прототипа создаются шаблоны <code>Template:Component/...</code>, <code>Template:prototype/...</code>, которые:
.headerSort {
#* вызывают <code><nowiki>{{#invoke:Сущность/поля|main ...}}</nowiki></code> для описания полей карточки;
white-space: wrap;
#* при необходимости используют <code>GetField</code> / <code>Сущность.jsonList</code> / <code>Сущность.json</code> для форматирования сложных JSON‑полей.
}
# Для вывода карточки на странице сущности используется:
</div>
#* либо прямой <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 автоматически.