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

Материал из Space Station 14 Вики
мНет описания правки
Нет описания правки
 
(не показано 160 промежуточных версий 4 участников)
Строка 1: Строка 1:
__NOTOC__{{Cargo Guides}}
{{docpage}}{{TOC hidden}}
'''Грузы''' — это товары и материалы, доступные для покупки через консоль заказа грузов за соответствующую каждому товару стоимость. Они могут включать оборудование, инструменты, ресурсы и другие предметы, необходимые для работы и развития станции.
{{OnLua|Сущность|module1=Сущность|module2=Сущность/поля|module3=GetField}}


{{ModernTitle|Механика|h3}}
Модульный набор {{tl|Модуль:Сущность}} + {{tl|Модуль:Сущность/поля}} + {{tl|Модуль:GetField}} предназначен для:
* Заказ товаров осуществляется через консоль заказа грузов [[Файл:Консоль заказа грузов.png|32px|link=]], после чего они доставляются на торговом шаттле отдела снабжения.
* автоматической сборки карточек сущностей (компонентов и прототипов) по их ID;
* Купленные товары размещаются на специальных поддонах жёлтого цвета [[Файл:Cargo pallet buy.png|32px|link=]], которые находятся на Автоматическом Торговом Посту (Automated Trade Station).
* описания полей в шаблонах компонентов (какие поля идут в карточку, как подписаны);
* Для продажи снаряжения используются поддоны зелёного цвета [[Файл:Cargo pallet sell.png|32px|link=]], также расположенные на Автоматическом Торговом Посту.
* удобного доступа к данным из JSON (как простыми значениями, так и готовыми вызовами шаблонов).


{{ModernTitle|Список грузов снабжения|h1}}
Ниже описан общий принцип работы и отдельные режимы.
<tabs class="tabs-no-background">


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


<div class="cargo-group">
== Модуль: Сущность/поля ==
{{Шаблон:Prototypes/Механика/Груз|ArmorySmg|CrateArmorySMG.png}}
Шаблоны компонентов используют модуль <code>Сущность/поля</code> для объявления полей, которые будут собираться в карточку.
{{Шаблон:Prototypes/Механика/Груз|ArmoryShotgun|WeaponShotgunEnforcer.png}}
{{Шаблон:Prototypes/Механика/Груз|SecurityRiot|ClothingOuterArmorRiot.png}}
{{Шаблон:Prototypes/Механика/Груз|TrackingImplant|Implanter.png}}
{{Шаблон:Prototypes/Механика/Груз|TrainingBombs|TrainingBomb.png}}
{{Шаблон:Prototypes/Механика/Груз|ArmoryLaser|WeaponLaserCarbine.png}}
{{Шаблон:Prototypes/Механика/Груз|ArmoryPistol|WeaponPistolMk58.png}}
</div>  


</tab>
Пример шаблона компонента:


<tab name="Атмосфера" id="Atmospherics" style="width:100%">
<pre>
{{#invoke:Сущность/поля|main
|cardLabel_Стоимость  = [[Стоимость]]
|cardContent_Стоимость = '''{{{price}}}'''
}}
</pre>


<div class="cargo-group">
Другой компонент может добавлять тот же ключ:
{{Шаблон:Prototypes/Механика/Груз|AtmosphericsAir|AirCanister.png}}
{{Шаблон:Prototypes/Механика/Груз|AtmosphericsOxygen|OxygenCanister.png}}
{{Шаблон:Prototypes/Механика/Груз|AtmosphericsLiquidOxygen|OxygenCanister.png}}
{{Шаблон:Prototypes/Механика/Груз|AtmosphericsNitrogen|NitrogenCanister.png}}
{{Шаблон:Prototypes/Механика/Груз|AtmosphericsLiquidNitrogen|NitrogenCanister.png}}
{{Шаблон:Prototypes/Механика/Груз|AtmosphericsCarbonDioxide|LiquidCarbonDioxideCanister.png}}
{{Шаблон:Prototypes/Механика/Груз|AtmosphericsLiquidCarbonDioxide|LiquidCarbonDioxideCanister.png}}
{{Шаблон:Prototypes/Механика/Груз|AtmosphericsStorage|StorageCanister.png}}
{{Шаблон:Prototypes/Механика/Груз|AtmosphericsPlasma|PlasmaCanister.png}}
</div>


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


<tab name="Снабжение" id="Cargo" style="width:100%">
Особенности:
* Пара <code>cardLabel_<Ключ></code> / <code>cardContent_<Ключ></code> описывает одну строку карточки (лейбл и содержимое).
* Если несколько шаблонов дают один и тот же <code>cardContent_Ключ</code>, содержимое '''объединяется''', а лейбл берётся первый непустой.
* То же относится к другим режимам, перечисленным в мета‑JSON шаблона (разделы <code>card</code>, <code>title</code> и т. п.), которые читает {{tl|Модуль:Сущность}}.


<div class="cargo-group">
== Модуль: Сущность ==
{{Шаблон:Prototypes/Механика/Груз|CargoOreBox|OreBox.png}}
{{Шаблон:Prototypes/Механика/Груз|CargoLuxuryHardsuit|CrateCargoLuxuryHardsuit.png}}
</div>


</tab>
=== p.get: основная сборка карточки ===
Вызов:


<tab name="Экстренные" id="Emergency" style="width:100%">
<pre>
{{#invoke:Сущность|get
| <ID или список ID>
| blacklist=...
| whitelist=...
| ignoreComponents=...
| ignorePrototypes=...
}}
</pre>


<div class="cargo-group">
* '''1‑й параметр''' — <code>id</code> или список <code>id</code> через запятую.
{{Шаблон:Prototypes/Механика/Груз|EmergencyExplosive|ClothingHeadHelmetBombSuit.png}}
* По этому ID модуль находит:
{{Шаблон:Prototypes/Механика/Груз|EmergencyFire|FireExtinguisher.png}}
** '''компоненты''' из <code>component.json</code>;
{{Шаблон:Prototypes/Механика/Груз|EmergencyInternals|ClothingMaskBreath.png}}
** '''прототипы''' из <code>prototype.json</code>;
{{Шаблон:Prototypes/Механика/Груз|EmergencyInternalsLarge|ClothingMaskBreath.png}}
и для каждого — соответствующие шаблоны <code>Template:component/...</code> / <code>Template:prototype/...</code>.
{{Шаблон:Prototypes/Механика/Груз|EmergencyRadiation|CrateEmergencyRadiation.png}}
* Шаблоны описывают свои поля через <code>Сущность/поля</code>.
{{Шаблон:Prototypes/Механика/Груз|EmergencyInflatablewall|InflatableWallStack.png}}
{{Шаблон:Prototypes/Механика/Груз|EmergencyNitrogenTanks|NitrogenTank.png}}
{{Шаблон:Prototypes/Механика/Груз|EmergencyBiosuit|ClothingHeadHatHoodBioGeneral.png}}
</div>  


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


<tab name="Инженерия" id="Engineering" style="width:100%">
Параметры фильтрации:
* {{пм|blacklist}} — список <code>режим_Ключ</code> через запятую, чтобы исключить поле:
** пример: <code>blacklist=card_Наносит повреждения,title_Что‑то</code>;
* {{пм|whitelist}} — наоборот, список разрешённых <code>режим_Ключ</code>, остальные игнорируются;
* {{пм|ignoreComponents}} / {{пм|ignoreComponent}} — список имён компонентов через запятую, которые полностью игнорируются для этого вызова;
* {{пм|ignorePrototypes}} / {{пм|ignorePrototype}} — аналогично для прототипов.


<div class="cargo-group">
Пример простой сборки (через шаблон‑обёртку):
{{Шаблон:Prototypes/Механика/Груз|EngineeringCableLv|CableApcStack.png}}
{{Шаблон:Prototypes/Механика/Груз|EngineeringCableMv|CableMVStack.png}}
{{Шаблон:Prototypes/Механика/Груз|EngineeringCableHv|CableHVStack.png}}
{{Шаблон:Prototypes/Механика/Груз|EngineeringFoamGrenade|MetalFoamGrenade.png}}
{{Шаблон:Prototypes/Механика/Груз|EngineeringCableBulk|Coilall-30.png}}
{{Шаблон:Prototypes/Механика/Груз|EngineeringElectricalSupplies|ToolboxElectrical.png}}
{{Шаблон:Prototypes/Механика/Груз|StationBeaconBundle|DefaultStationBeaconUnanchored.png}}
{{Шаблон:Prototypes/Механика/Груз|EngineeringJetpack|JetpackBlue.png}}
{{Шаблон:Prototypes/Механика/Груз|EngineeringMiniJetpack|JetpackMini.png}}
{{Шаблон:Prototypes/Механика/Груз|AirlockKit|ToolboxElectrical.png}}
{{Шаблон:Prototypes/Механика/Груз|EvaKit|ClothingHeadHelmetEVA.png}}
{{Шаблон:Prototypes/Механика/Груз|EngineeringRCDAmmo|RCD.png}}
{{Шаблон:Prototypes/Механика/Груз|EngineeringRCD|RCD.png}}
{{Шаблон:Prototypes/Механика/Груз|EngineeringParticleDecelerators|WeaponParticleDecelerator.png}}
{{Шаблон:Prototypes/Механика/Груз|EngineeringSpaceHeater|SpaceHeater.png}}
{{Шаблон:Prototypes/Механика/Груз|EngineAmeJar|AmeJar.png}}
{{Шаблон:Prototypes/Механика/Груз|EngineSingularityGenerator|SingularityGenerator.png}}
{{Шаблон:Prototypes/Механика/Груз|EngineSingularityContainment|ContainmentFieldGenerator.png}}
{{Шаблон:Prototypes/Механика/Груз|EngineSingularityEmitter|Emitter.png}}
{{Шаблон:Prototypes/Механика/Груз|EngineSingularityCollector|RadiationCollector.png}}
{{Шаблон:Prototypes/Механика/Груз|EngineParticleAccelerator|ParticleAcceleratorControlBox.png}}
{{Шаблон:Prototypes/Механика/Груз|EngineSolar|SolarAssemblyFlatpack.png}}
{{Шаблон:Prototypes/Механика/Груз|EngineTeslaGenerator|TeslaGenerator.png}}
{{Шаблон:Prototypes/Механика/Груз|EngineTeslaCoil|TeslaCoil.png}}
{{Шаблон:Prototypes/Механика/Груз|EngineTeslaGroundingRod|TeslaGroundingRod.png}}
{{Шаблон:Prototypes/Механика/Груз|CrateVendingMachineRestockEngineering|BaseVendingMachineRestock.png}}
{{Шаблон:Prototypes/Механика/Груз|CrateVendingMachineRestockGames|VendingMachineRestockGames.png}}
{{Шаблон:Prototypes/Механика/Груз|CrateVendingMachineRestockSalvageEquipment|BaseVendingMachineRestock.png}}
</div>


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


<tab name="Еда" id="Food" style="width:100%">
где в шаблоне <code>Сущность/карточка</code> внутри:


<div class="cargo-group">
<pre>
{{Шаблон:Prototypes/Механика/Груз|FoodPizza|FoodPizzaMargheritaSlice.png}}
{{#invoke:Сущность|get|{{{1}}}}}
{{Шаблон:Prototypes/Механика/Груз|FoodPizzaLarge|FoodPizzaMargherita.png}}
</pre>
{{Шаблон:Prototypes/Механика/Груз|FoodMRE|FoodSnackNutribrick.png}}
{{Шаблон:Prototypes/Механика/Груз|FoodCook|ReagentContainerFlour.png}}
{{Шаблон:Prototypes/Механика/Груз|FoodDinnerware|FoodPlateTin.png}}
{{Шаблон:Prototypes/Механика/Груз|FoodBarSupply|RandomDrinkGlass.png}}
{{Шаблон:Prototypes/Механика/Груз|FoodSoftdrinks|DrinkColaCan.png}}
{{Шаблон:Prototypes/Механика/Груз|FoodSoftdrinksLarge|DrinkColaBottleFull.png}}
{{Шаблон:Prototypes/Механика/Груз|FoodCrateKvassTank|KvassTank.png}}
</div>  


</tab>
=== p.preview: предпросмотр полей конкретного шаблона ===
Используется для проверки, что компонент/прототип правильно описал свои поля.


<tab name="Развлечения" id="Fun" style="width:100%">
<pre>
{{#invoke:Сущность|preview
| Component/meleeWeapon
}}
</pre>


<div class="cargo-group">
* Показывает, какие <code>card</code> / <code>title</code>‑поля объявлены в <code>Template:Component/meleeWeapon</code>.
{{Шаблон:Prototypes/Механика/Груз|FunInstrumentsVariety|AccordionInstrument.png}}
* Удобно при разработке шаблонов компонентов.
{{Шаблон:Prototypes/Механика/Груз|FunInstrumentsBrass|TubaInstrument.png}}
{{Шаблон:Prototypes/Механика/Груз|FunInstrumentsString|BassGuitarInstrument.png}}
{{Шаблон:Prototypes/Механика/Груз|FunInstrumentsWoodwind|HarmonicaInstrument.png}}
{{Шаблон:Prototypes/Механика/Груз|FunInstrumentsKeyedPercussion|SynthesizerInstrument.png}}
{{Шаблон:Prototypes/Механика/Груз|FunInstrumentsSpecial|GunpetInstrument.png}}
{{Шаблон:Prototypes/Механика/Груз|FunArtSupplies|CrayonBox.png}}
{{Шаблон:Prototypes/Механика/Груз|FunParty|FoodCakeBirthday.png}}
{{Шаблон:Prototypes/Механика/Груз|CrateFunWaterGuns|WeaponWaterPistol.png}}
{{Шаблон:Prototypes/Механика/Груз|FunPlushies|PlushieBee.png}}
{{Шаблон:Prototypes/Механика/Груз|FunLizardPlushies|PlushieLizard.png}}
{{Шаблон:Prototypes/Механика/Груз|FunBoardGames|d6Dice.png}}
{{Шаблон:Prototypes/Механика/Груз|FunSadTromboneImplants|Implanter.png}}
{{Шаблон:Prototypes/Механика/Груз|FunLightImplants|Implanter.png}}
{{Шаблон:Prototypes/Механика/Груз|FunBoxing|ClothingHandsGlovesBoxingRed.png}}
{{Шаблон:Prototypes/Механика/Груз|FunPirate|CratePirateChestCaptain.png}}
{{Шаблон:Prototypes/Механика/Груз|FunToyBox|CrateFunToyBox.png}}
{{Шаблон:Prototypes/Механика/Груз|FunBikeHornImplants|Implanter.png}}
{{Шаблон:Prototypes/Механика/Груз|FunMysteryFigurines|MysteryFigureBox.png}}
{{Шаблон:Prototypes/Механика/Груз|FunDartsSet|Dart.png}}
{{Шаблон:Prototypes/Механика/Груз|FunCrateGambling|SpaceCash1000000.png}}
{{Шаблон:Prototypes/Механика/Груз|ChurchOrganInstrument|ChurchOrganInstrument.png}}
{{Шаблон:Prototypes/Механика/Груз|PianoInstrument|PianoInstrument.png}}
{{Шаблон:Prototypes/Механика/Груз|UprightPianoInstrument|UprightPianoInstrument.png}}
{{Шаблон:Prototypes/Механика/Груз|VibraphoneInstrument|VibraphoneInstrument.png}}
{{Шаблон:Prototypes/Механика/Груз|MarimbaInstrument|MarimbaInstrument.png}}
{{Шаблон:Prototypes/Механика/Груз|TubaInstrument|TubaInstrument.png}}
{{Шаблон:Prototypes/Механика/Груз|HarpInstrument|HarpInstrument.png}}
{{Шаблон:Prototypes/Механика/Груз|TimpaniInstrument|TimpaniInstrument.png}}
{{Шаблон:Prototypes/Механика/Груз|TaikoInstrument|TaikoInstrument.png}}
{{Шаблон:Prototypes/Механика/Груз|ContrabassInstrument|ContrabassInstrument.png}}
{{Шаблон:Prototypes/Механика/Груз|MinimoogInstrument|MinimoogInstrument.png}}
{{Шаблон:Prototypes/Механика/Груз|TomDrumsInstrument|TomDrumsInstrument.png}}
</div>


</tab>
=== p.jsonList: вывод JSON в виде списка ===
Режим похож на стандартный <code>arraymap</code>, но работает с JSON.


<tab name="Гидропоника" id="Hydroponics" style="width:100%">
<pre>
{{#invoke:Сущность|jsonList
| <json или {{{...}}}>
| type = list / enum
| prefix = *
| sep = :  
| key_pattern = (.*)
| key_replace = \1
| value_pattern = (.*)
| value_replace = \1
}}
</pre>


<div class="cargo-group">
Примеры JSON:
{{Шаблон:Prototypes/Механика/Груз|HydroponicsSeedsExotic|BananaSeeds.png}}
{{Шаблон:Prototypes/Механика/Груз|HydroponicsSeedsMedicinal|GalaxythistleSeeds.png}}
{{Шаблон:Prototypes/Механика/Груз|HydroponicsTools|HydroponicsToolMiniHoe.png}}
{{Шаблон:Prototypes/Механика/Груз|HydroponicsSeeds|AppleSeeds.png}}
{{Шаблон:Prototypes/Механика/Груз|BulkPlantBGone|Jug.png}}
{{Шаблон:Prototypes/Механика/Груз|CrateVendingMachineRestockNutriMax|BaseVendingMachineRestock.png}}
{{Шаблон:Prototypes/Механика/Груз|CrateVendingMachineRestockSeeds|BaseVendingMachineRestock.png}}
</div>


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


<tab name="Животные" id="Livestock" style="width:100%">
или


<div class="cargo-group">
<pre> <!-- <syntaxhighlight lang=json> -->
{{Шаблон:Prototypes/Механика/Груз|LivestockBee|MobBee.png}}
["Knife", "Sword", "Bat"]
{{Шаблон:Prototypes/Механика/Груз|LivestockButterfly|MobButterfly.png}}
</pre> <!-- </syntaxhighlight> -->
{{Шаблон:Prototypes/Механика/Груз|LivestockCat|MobCat.png}}
{{Шаблон:Prototypes/Механика/Груз|LivestockChicken|MobChicken.png}}
{{Шаблон:Prototypes/Механика/Груз|LivestockCrab|MobCrab.png}}
{{Шаблон:Prototypes/Механика/Груз|LivestockDuck|MobDuckMallard.png}}
{{Шаблон:Prototypes/Механика/Груз|LivestockCorgi|MobCorgi.png}}
{{Шаблон:Prototypes/Механика/Груз|LivestockPupCorgi|MobCorgiPuppy.png}}
{{Шаблон:Prototypes/Механика/Груз|LivestockCow|MobCow.png}}
{{Шаблон:Prototypes/Механика/Груз|LivestockGoat|MobGoat.png}}
{{Шаблон:Prototypes/Механика/Груз|LivestockGoose|MobGoose.png}}
{{Шаблон:Prototypes/Механика/Груз|LivestockGorilla|MobGorilla.png}}
{{Шаблон:Prototypes/Механика/Груз|LivestockMonkeyCube|MonkeyCubeBox.png}}
{{Шаблон:Prototypes/Механика/Груз|LivestockKoboldCube|KoboldCubeBox.png}}
{{Шаблон:Prototypes/Механика/Груз|LivestockMouse|MobMouse.png}}
{{Шаблон:Prototypes/Механика/Груз|LivestockParrot|MobParrot.png}}
{{Шаблон:Prototypes/Механика/Груз|LivestockPenguin|MobPenguin.png}}
{{Шаблон:Prototypes/Механика/Груз|LivestockPig|MobPig.png}}
{{Шаблон:Prototypes/Механика/Груз|LivestockSnake|MobSnake.png}}
{{Шаблон:Prototypes/Механика/Груз|LivestockHamster|MobHamster.png}}
{{Шаблон:Prototypes/Механика/Груз|LivestockLizard|MobLizard.png}}
{{Шаблон:Prototypes/Механика/Груз|LivestockKangaroo|MobKangaroo.png}}
{{Шаблон:Prototypes/Механика/Груз|LivestockMothroach|MobMothroach.png}}
</div>  


</tab>
Основные опции:
* {{пм|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 и замена для значений.


<tab name="Материалы" id="Materials" style="width:100%">
Дополнительно:
* в шаблоне замены поддерживаются:
** <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>).


<div class="cargo-group">
Пример, где сначала форматируем тип урона, а затем подставляем его в описание:
{{Шаблон:Prototypes/Механика/Груз|MaterialGlass|SheetGlass.png}}
{{Шаблон:Prototypes/Механика/Груз|MaterialSteel|SheetSteel.png}}
{{Шаблон:Prototypes/Механика/Груз|MaterialPlastic|SheetPlastic.png}}
{{Шаблон:Prototypes/Механика/Груз|MaterialBrass|SheetBrass.png}}
{{Шаблон:Prototypes/Механика/Груз|MaterialPlasteel|SheetPlasteel.png}}
{{Шаблон:Prototypes/Механика/Груз|MaterialTextiles|MaterialCloth.png}}
{{Шаблон:Prototypes/Механика/Груз|MaterialPlasma|SheetPlasma.png}}
{{Шаблон:Prototypes/Механика/Груз|CardboardMaterial|MaterialCardboard.png}}
{{Шаблон:Prototypes/Механика/Груз|PaperMaterial|SheetPaper.png}}
{{Шаблон:Prototypes/Механика/Груз|MaterialFuelTank|WeldingFuelTank.png}}
{{Шаблон:Prototypes/Механика/Груз|MaterialWaterTank|WaterTank.png}}
</div>


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


<tab name="Медицина" id="Medical" style="width:100%">
=== p.json: превращение JSON в вызовы шаблонов ===
Режим для случаев, когда в JSON лежит список эффектов/объектов, и нужно по каждому вызвать отдельный шаблон.


<div class="cargo-group">
<pre>
{{Шаблон:Prototypes/Механика/Груз|MedicalSupplies|Medkit.png}}
{{#invoke:Сущность|json
{{Шаблон:Prototypes/Механика/Груз|MedicalChemistrySupplies|Beaker.png}}
| <json или {{{...}}}>
{{Шаблон:Prototypes/Механика/Груз|MedicalChemistryVials|BaseChemistryEmptyVial.png}}
| <путь_к_шаблону>
{{Шаблон:Prototypes/Механика/Груз|EmergencyBurnKit|MedkitBurn.png}}
}}
{{Шаблон:Prototypes/Механика/Груз|EmergencyToxinKit|MedkitToxin.png}}
</pre>
{{Шаблон:Prototypes/Механика/Груз|EmergencyO2Kit|MedkitO2.png}}
{{Шаблон:Prototypes/Механика/Груз|EmergencyBruteKit|MedkitBrute.png}}
{{Шаблон:Prototypes/Механика/Груз|EmergencyAdvancedKit|MedkitAdvanced.png}}
{{Шаблон:Prototypes/Механика/Груз|EmergencyRadiationKit|MedkitRadiation.png}}
{{Шаблон:Prototypes/Механика/Груз|MedicalBodybags|BodyBag.png}}
{{Шаблон:Prototypes/Механика/Груз|MedicalBiosuit|ClothingHeadHatHoodBioGeneral.png}}
{{Шаблон:Prototypes/Механика/Груз|MedicalMindShieldImplants|Implanter.png}}
{{Шаблон:Prototypes/Механика/Груз|ChemistryP|CrateChemistrySecure.png}}
{{Шаблон:Prototypes/Механика/Груз|ChemistryS|CrateChemistrySecure.png}}
{{Шаблон:Prototypes/Механика/Груз|CrateChemistryD|CrateChemistrySecure.png}}
{{Шаблон:Prototypes/Механика/Груз|CrateVendingMachineRestockMedical|BaseVendingMachineRestock.png}}
{{Шаблон:Prototypes/Механика/Груз|CrateVendingMachineRestockChemVend|BaseVendingMachineRestock.png}}
</div>  


</tab>
* '''1‑й параметр / <code>json=</code>''' — строка JSON.
* '''2‑й параметр / <code>template=</code>''' — путь к шаблону, например <code>Component/adjustPlant</code>.


<tab name="Наука" id="Science" style="width:100%">
Ожидаемый формат JSON‑массива:


<div class="cargo-group">
<pre> <!-- <syntaxhighlight lang=json> -->
{{Шаблон:Prototypes/Механика/Груз|ArtifactContainer|CrateArtifactContainer.png}}
[
{{Шаблон:Prototypes/Механика/Груз|RandomArtifact|RandomArtifactSpawner.png}}
  {
{{Шаблон:Prototypes/Механика/Груз|ScienceBiosuit|ClothingHeadHatHoodBioScientist.png}}
    "!type:PlantAdjustNutrition": {
{{Шаблон:Prototypes/Механика/Груз|CrewMonitoring|CrewMonitoringServer.png}}
      "amount": 0.1
{{Шаблон:Prototypes/Механика/Груз|CrateVendingMachineRestockRobotics|BaseVendingMachineRestock.png}}
    }
</div>  
  },
  {
    "!type:PlantAdjustWeeds": {
      "amount": 2
    }
  },
  {
    "!type:PlantAdjustPests": {
      "amount": 2
    }
  }
]
</pre> <!-- </syntaxhighlight> -->


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


<tab name="Служба безопасности" id="Security" style="width:100%">
<pre>
{{Component/adjustPlant
|id=!type:PlantAdjustNutrition
|amount=0.1
}}
{{Component/adjustPlant
|id=!type:PlantAdjustWeeds
|amount=2
}}
{{Component/adjustPlant
|id=!type:PlantAdjustPests
|amount=2
}}
</pre>


<div class="cargo-group">
Особенности:
{{Шаблон:Prototypes/Механика/Груз|SecurityArmor|ClothingOuterArmorBulletproof.png}}
* Если JSON — объект вида <code>{ "id1": {...}, "id2": {...} }</code>, происходит аналогичный проход по парам <code>ключ → объект</code>.
{{Шаблон:Prototypes/Механика/Груз|SecurityHelmet|ClothingHeadHelmetBasic.png}}
* Все вызовы склеиваются через перевод строки и прогоняются через <code>frame:preprocess</code>, поэтому внутри шаблона можно использовать любую вики‑разметку.
{{Шаблон:Prototypes/Механика/Груз|SecurityNonLethal|WeaponDisabler.png}}
{{Шаблон:Prototypes/Механика/Груз|SecuritySupplies|BoxMagazine.png}}
{{Шаблон:Prototypes/Механика/Груз|SecurityRestraints|Handcuffs.png}}
{{Шаблон:Prototypes/Механика/Груз|SecurityBiosuit|ClothingHeadHatHoodBioSecurity.png}}
{{Шаблон:Prototypes/Механика/Груз|SecurityBarrier|DeployableBarrier.png}}
{{Шаблон:Prototypes/Механика/Груз|CrateVendingMachineRestockSecTech|BaseVendingMachineRestock.png}}
</div>  


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


<tab name="Сервис" id="Service" style="width:100%">
=== p.flattenField: расплющивание записи в параметры ===
<pre>
{{#invoke:GetField|flattenField
| <id>
| <путь_к_json_странице>
}}
</pre>


<div class="cargo-group">
Например:
{{Шаблон:Prototypes/Механика/Груз|ServiceJanitorial|SprayBottle.png}}
{{Шаблон:Prototypes/Механика/Груз|ServiceLightsReplacement|LightBulb.png}}
{{Шаблон:Prototypes/Механика/Груз|ServiceLightsHoliday|LightBulb.png}}
{{Шаблон:Prototypes/Механика/Груз|MousetrapBoxes|Mousetrap.png}}
{{Шаблон:Prototypes/Механика/Груз|ServiceTheatre|ClothingMaskMime.png}}
{{Шаблон:Prototypes/Механика/Груз|ServiceSmokeables|CigCartonGreen.png}}
{{Шаблон:Prototypes/Механика/Груз|ServiceCustomSmokable|CigCartonGreen.png}}
{{Шаблон:Prototypes/Механика/Груз|ServiceBureaucracy|Pen.png}}
{{Шаблон:Prototypes/Механика/Груз|ServiceFaxMachine|FaxMachineBase.png}}
{{Шаблон:Prototypes/Механика/Груз|ServicePersonnel|PilotIDCard.png}}
{{Шаблон:Prototypes/Механика/Груз|ServiceBooks|CrateServiceBooks.png}}
{{Шаблон:Prototypes/Механика/Груз|ServiceGuidebooks|CrateServiceBooks.png}}
{{Шаблон:Prototypes/Механика/Груз|ServiceSodaDispenser|DrinkSugarJug.png}}
{{Шаблон:Prototypes/Механика/Груз|ServiceBoozeDispenser|DrinkSugarJug.png}}
{{Шаблон:Prototypes/Механика/Груз|ServiceBoxes|CrateServiceBox.png}}
{{Шаблон:Prototypes/Механика/Груз|ServiceJanitorBiosuit|ClothingHeadHatHoodBioJanitor.png}}
{{Шаблон:Prototypes/Механика/Груз|ServiceFoodCartHot|FoodCartHot.png}}
{{Шаблон:Prototypes/Механика/Груз|ServiceFoodCartCold|FoodCartCold.png}}
{{Шаблон:Prototypes/Механика/Груз|ServiceAnimalCarrier|PetCarrier.png}}
{{Шаблон:Prototypes/Механика/Груз|JanitorExplosive|ClothingHeadHelmetJanitorBombSuit.png}}
{{Шаблон:Prototypes/Механика/Груз|ServiceJanitorTrolley|JanitorialTrolley.png}}
{{Шаблон:Prototypes/Механика/Груз|ServiceCandles|Candle.png}}
{{Шаблон:Prototypes/Механика/Груз|CrateVendingMachineRestockBooze|BaseVendingMachineRestock.png}}
{{Шаблон:Prototypes/Механика/Груз|CrateVendingMachineRestockChefvend|BaseVendingMachineRestock.png}}
{{Шаблон:Prototypes/Механика/Груз|CrateVendingMachineRestockClothes|BaseVendingMachineRestock.png}}
{{Шаблон:Prototypes/Механика/Груз|CrateVendingMachineRestockAutoDrobe|BaseVendingMachineRestock.png}}
{{Шаблон:Prototypes/Механика/Груз|CrateVendingMachineRestockDinnerware|BaseVendingMachineRestock.png}}
{{Шаблон:Prototypes/Механика/Груз|CrateVendingMachineRestockCondimentStation|BaseVendingMachineRestock.png}}
{{Шаблон:Prototypes/Механика/Груз|CrateVendingMachineRestockGames|BaseVendingMachineRestock.png}}
{{Шаблон:Prototypes/Механика/Груз|CrateVendingMachineRestockHotDrinks|BaseVendingMachineRestock.png}}
{{Шаблон:Prototypes/Механика/Груз|CrateVendingMachineRestockPTech|BaseVendingMachineRestock.png}}
{{Шаблон:Prototypes/Механика/Груз|CrateVendingMachineRestockRobustSoftdrinks|BaseVendingMachineRestock.png}}
{{Шаблон:Prototypes/Механика/Груз|CrateVendingMachineRestockSmokes|BaseVendingMachineRestock.png}}
{{Шаблон:Prototypes/Механика/Груз|CrateVendingMachineRestockVendomat|BaseVendingMachineRestock.png}}
{{Шаблон:Prototypes/Механика/Груз|CrateVendingMachineRestockHappyHonk|BaseVendingMachineRestock.png}}
{{Шаблон:Prototypes/Механика/Груз|CrateVendingMachineRestockGetmoreChocolateCorp|BaseVendingMachineRestock.png}}
{{Шаблон:Prototypes/Механика/Груз|CrateVendingMachineRestockChang|BaseVendingMachineRestock.png}}
{{Шаблон:Prototypes/Механика/Груз|CrateVendingMachineRestockDiscountDans|BaseVendingMachineRestock.png}}
{{Шаблон:Prototypes/Механика/Груз|CrateVendingMachineRestockDonut|BaseVendingMachineRestock.png}}
{{Шаблон:Prototypes/Механика/Груз|ServiceLoreBooks|BookGrav.png}}
</div>


</tab>
<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>


<tab name="Шаттл" id="Shuttle" style="width:100%">
Примеры:


<div class="cargo-group">
<pre>
{{Шаблон:Prototypes/Механика/Груз|ShuttleThruster|Thruster.png}}
{{#invoke:GetField|get
{{Шаблон:Prototypes/Механика/Груз|ShuttleGyroscope|Gyroscope.png}}
| MyEntityId
</div>  
| component/item.json
| damage.types
}}
</pre>


</tab>
Если в JSON:


</tabs><!--
<pre> <!-- <syntaxhighlight lang=json> -->
-->{{#css:
"damage": {
#Armory .груз__header, #Security .груз__header {
  "types": {
--color: #ab2121;
    "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>


#Engineering .груз__header, #Atmospherics .груз__header, #Shuttle .груз__header {
Пример:
--color: #b4a327;
 
}
<pre>
{{#invoke:GetField|getTpl
| MyEntityId
| component/item.json
| Component/meleeWeapon
}}
</pre>


#Cargo .груз__header, #Materials .груз__header {
Работа:
--color: #c56c20;
* внутри вызывает <code>flattenField</code>, получая строку <code>key=value|...</code>;
}
* формирует строку вида:


#Emergency .груз__header, #Livestock .груз__header {
<pre>
--color: #8a999c;
{{Component/meleeWeapon
}
|id=MyEntityId
|damage.types=...
|...
}}
</pre>


#Service .груз__header, #Hydroponics .груз__header, #Fun .груз__header, #Food .груз__header {
* и прогоняет её через <code>frame:preprocess</code>, возвращая итоговый рендер.
--color: #418934;
}


#Medical .груз__header {
Это удобный способ «подключить» шаблон компонента к данным из JSON без ручного перечисления параметров.
--color: #4c75b7;
}


#Science .груз__header {
=== p.getTplProto: вызов шаблона по прототипам ===
--color: #7535a5;
<pre>
}
{{#invoke:GetField|getTplProto
| <searchId>
| <protoId>
| <путь_к_шаблону>
}}
}}
</pre>
* Ищет в <code>prototype.json</code> все записи, где <code>protoId</code> встречается у <code>searchId</code>.
* Для каждого найденного ID вызывает <code>getTpl</code> и возвращает все вызовы, склеенные через перевод строки и отрендеренные.
Используется для случаев, когда сущность использует '''несколько''' прототипов одного типа, и нужно вывести по одному шаблону на каждый прототип.
== Типичный рабочий поток ==
# В 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 автоматически.