Релиз v1.2.9
Build release archive / release (push) Failing after 28s

Изменено:
 - Поддержка новых типов товаров: "Механические приспособления" и "Религиозные товары".
 - Добавлена возможность случайной генерации уровня торговца.
 - Улучшена производительность при загрузке предметов из компендиумов.
 - Обновлены тексты описаний для категорий товаров.
 - Исправлена ошибка при добавлении предметов к торговцу (см. `module/data.mjs`, строки 2436-2446).
 - Исправлена проблема с отображением характеристик торговца в интерфейсе.
This commit is contained in:
2026-07-15 19:42:45 +03:00
parent 34782dc3b0
commit e21d8c5198
5611 changed files with 163869 additions and 0 deletions
@@ -0,0 +1,143 @@
{
"name": "Динамит (шашка) / Dynamite (stick)",
"type": "weapon",
"system": {
"description": {
"value": "<p><span style=\"font-family:'Noto Sans', Arial, sans-serif\">В качестве действия существо может поджечь фитиль динамитной шашки и метнуть её в точку на расстоянии до 60 футов. Каждое существо в пределах 5 футов от этой точки должно пройти испытание Ловкости со СЛ 12, получая [[/r 3d6]] дробящего урона при провале или половину этого урона при успехе. Персонаж может связать вместе несколько дина­митных шашек, чтобы они взорвались одновременно. Каждая дополнительная шашка повышает урон на [[/r 1d6]] (максимум до [[/r 10d6]]) и радиус взрыва на 5 футов (максимум до 20 футов).</span></p><p><span style=\"font-family:'Noto Sans', Arial, sans-serif\">Динамит можно снабдить удлинённым фитилём, чтобы он взорвался через заданное время, обычно от 1 до 6 ра­ундов. Сделайте бросок инициативы за динамит. После заданного количества раундов динамит взорвётся при своём значении инициативы.</span></p>",
"chat": ""
},
"source": {
"custom": "DMG"
},
"quantity": 1,
"weight": {
"value": 1,
"units": "lb"
},
"price": {
"value": 200,
"denomination": "gp"
},
"attunement": "",
"equipped": true,
"rarity": "",
"identified": true,
"activation": {
"type": "action",
"cost": 1,
"condition": ""
},
"duration": {
"value": "",
"units": ""
},
"cover": null,
"crewed": false,
"target": {
"value": "5",
"width": null,
"units": "ft",
"type": "sphere",
"prompt": true
},
"range": {
"value": 60,
"long": null,
"units": "ft"
},
"uses": {
"value": null,
"max": "",
"per": null,
"recovery": "",
"prompt": true
},
"consume": {
"type": "",
"target": "",
"amount": null,
"scale": false
},
"ability": "",
"actionType": "save",
"chatFlavor": "",
"critical": {
"threshold": null,
"damage": ""
},
"damage": {
"parts": [
[
"3d6",
"bludgeoning"
]
],
"versatile": ""
},
"formula": "",
"save": {
"ability": "dex",
"dc": 12,
"scaling": "flat"
},
"armor": {
"value": 10
},
"hp": {
"value": 0,
"max": 0,
"dt": null,
"conditions": ""
},
"properties": [
"thr"
],
"proficient": 1,
"unidentified": {
"description": ""
},
"type": {
"value": "simpleR",
"baseItem": ""
},
"attack": {
"bonus": "",
"flat": false
},
"container": null,
"attuned": false,
"enchantment": null,
"summons": null,
"magicalBonus": null
},
"img": "icons/weapons/thrown/dynamite-black.webp",
"flags": {
"midi-qol": {
"fumbleThreshold": null,
"effectActivation": false
},
"midiProperties": {
"nodam": false,
"fulldam": false,
"halfdam": false,
"autoFailFriendly": false,
"rollOther": false,
"critOther": false,
"offHandWeapon": false,
"magicdam": false,
"magiceffect": false,
"concentration": false,
"toggleEffect": false,
"ignoreTotalCover": false,
"autoSaveFriendly": false
},
"test_tube_merchant": {
"quantity": "1d3 * 4 + 1d4"
},
"babele": {
"hasTranslation": true,
"originalName": "Dynamite (stick)",
"translated": true
}
}
}
@@ -0,0 +1,91 @@
{
"name": "Инструменты механика / Tinker's Tools",
"type": "tool",
"img": "icons/commodities/tech/cog-bronze.webp",
"effects": [],
"flags": {
"babele": {
"translated": true,
"hasTranslation": true,
"originalName": "Tinker's Tools"
},
"test_tube_merchant": {
"quantity": "1d4 + 1"
},
"midi-qol": {
"onUseMacroName": ""
}
},
"system": {
"description": {
"value": "<p>Эти специальные инструменты включают предметы, необходимые для работы с механизмами. Умение в обращении с этими инструментами позволяет вам добавить ваш бонус умения к любой проверке характеристики, связанной с их использованием.</p>\n<p>Предназначен для того, чтобы чинить множество обычных предметов. И хотя вы не можете создать большинство из них инструментами механика, вы можете починить порвавшуюся одежду, наточить затупившийся меч и подлатать истрепавшуюся кольчугу.</p>\n<p><em><strong>Компоненты.</strong></em> Инструменты механика включают в себя различные ручные инструменты, нитки, иголки, точильный камень, куски ткани и кожи, небольшую банку клея.</p>\n<p><em><strong>История.</strong></em> Вы можете определить возраст и происхождение предмета, даже если у вас в наличии всего несколько частей, оставшихся от оригинала.</p>\n<p><em><strong>Расследование.</strong></em> Когда вы осматриваете повреждённый предмет, вы узнаёте, как и насколько давно он был повреждён.</p>\n<p><em><strong>Починка.</strong></em> Вы можете восстанавливать по 10 ПЗ повреждённого предмета за каждый час работы. Для починки любого предмета вам необходим доступ к материалам, необходимым для ремонта. Для металлических предметов вам нужен доступ к открытому огню, жара которого достаточно, чтобы сделать металл пластичным.</p>\n<table class=\"rd__table stripe-odd-table\">\n<thead>\n<tr>\n<th class=\"col-10\" data-rd-isroller=\"false\">Возможное действие</th>\n<th class=\"col-2 text-center\" data-rd-isroller=\"false\">СЛ</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td class=\"col-10\">Временно починить повреждённый механизм</td>\n<td class=\"col-2 text-center\">10</td>\n</tr>\n<tr>\n<td class=\"col-10\">Починить предмет вдвое быстрее</td>\n<td class=\"col-2 text-center\">15</td>\n</tr>\n<tr>\n<td class=\"col-10\">Смастерить из хлама временный предмет</td>\n<td class=\"col-2 text-center\">20</td>\n</tr>\n</tbody>\n</table>",
"chat": ""
},
"source": {
"custom": "PHB"
},
"quantity": 1,
"weight": {
"value": 10,
"units": "lb"
},
"price": {
"value": 50,
"denomination": "gp"
},
"attunement": "",
"equipped": false,
"rarity": "common",
"identified": true,
"ability": "int",
"chatFlavor": "",
"proficient": 0,
"bonus": "",
"unidentified": {
"description": ""
},
"type": {
"value": "art",
"baseItem": "tinker"
},
"container": null,
"attuned": false,
"activation": {
"type": "",
"cost": null,
"condition": ""
},
"duration": {
"value": "",
"units": ""
},
"cover": null,
"crewed": false,
"target": {
"value": "",
"width": null,
"units": "",
"type": "",
"prompt": true
},
"range": {
"value": null,
"long": null,
"units": ""
},
"uses": {
"value": null,
"max": "",
"per": null,
"recovery": "",
"prompt": true
},
"consume": {
"type": "",
"target": null,
"amount": null,
"scale": false
},
"properties": []
}
}
+83
View File
@@ -0,0 +1,83 @@
{
"name": "Карманные часы",
"type": "tool",
"img": "icons/commodities/tech/stopwatch.webp",
"system": {
"description": {
"value": "Заведенные карманные часы, достоверно сообщают время дня.",
"chat": ""
},
"source": {
"custom": ""
},
"quantity": 1,
"weight": {
"value": 0.2,
"units": "lb"
},
"price": {
"value": 10,
"denomination": "gp"
},
"rarity": "",
"identified": true,
"unidentified": {
"description": ""
},
"container": null,
"properties": [],
"type": {
"value": "",
"baseItem": ""
},
"attunement": "",
"attuned": false,
"equipped": false,
"activation": {
"type": "",
"cost": null,
"condition": ""
},
"duration": {
"value": "",
"units": ""
},
"cover": null,
"crewed": false,
"target": {
"value": "",
"width": null,
"units": "",
"type": "",
"prompt": true
},
"range": {
"value": null,
"long": null,
"units": ""
},
"uses": {
"value": null,
"max": "",
"per": null,
"recovery": "",
"prompt": true
},
"consume": {
"type": "",
"target": null,
"amount": null,
"scale": false
},
"ability": "",
"chatFlavor": "",
"proficient": null,
"bonus": ""
},
"effects": [],
"flags": {
"test_tube_merchant": {
"quantity": "1d3 * 2 + 1d2"
}
}
}
+40
View File
@@ -0,0 +1,40 @@
{
"name": "Механическая птица",
"type": "loot",
"img": "modules/test_tube_merchant/assets/icon/items/mechanicalBird.png",
"system": {
"description": {
"value": "<p>Механическая птица, поёт 1 из 3 песен по команде, не летает.</p>",
"chat": ""
},
"source": {
"custom": ""
},
"quantity": 1,
"weight": {
"value": 1,
"units": "lb"
},
"price": {
"value": 12,
"denomination": "gp"
},
"rarity": "",
"identified": true,
"unidentified": {
"description": ""
},
"container": null,
"properties": [],
"type": {
"value": "",
"subtype": ""
}
},
"effects": [],
"flags": {
"test_tube_merchant": {
"quantity": "1d4"
}
}
}
+40
View File
@@ -0,0 +1,40 @@
{
"name": "Механический дракон",
"type": "loot",
"img": "modules/test_tube_merchant/assets/icon/items/mechanicalDragon.png",
"system": {
"description": {
"value": "<p>Механический дракон, дышит огнём и может поджигать объекты.</p>",
"chat": ""
},
"source": {
"custom": ""
},
"quantity": 1,
"weight": {
"value": 2,
"units": "lb"
},
"price": {
"value": 25,
"denomination": "gp"
},
"rarity": "",
"identified": true,
"unidentified": {
"description": ""
},
"container": null,
"properties": [],
"type": {
"value": "",
"subtype": ""
}
},
"effects": [],
"flags": {
"test_tube_merchant": {
"quantity": "1d4"
}
}
}
+40
View File
@@ -0,0 +1,40 @@
{
"name": "Механический конь",
"type": "loot",
"img": "modules/test_tube_merchant/assets/icon/items/mechanicalHorse.png",
"system": {
"description": {
"value": "<p>Механический конь, имеет те же параметры, что и ездовой конь.</p>",
"chat": ""
},
"source": {
"custom": "ММ 336"
},
"quantity": 1,
"weight": {
"value": 0,
"units": "lb"
},
"price": {
"value": 250,
"denomination": "gp"
},
"rarity": "",
"identified": true,
"unidentified": {
"description": ""
},
"container": null,
"properties": [],
"type": {
"value": "",
"subtype": ""
}
},
"effects": [],
"flags": {
"test_tube_merchant": {
"quantity": "1d4 - 1"
}
}
}
+172
View File
@@ -0,0 +1,172 @@
{
"name": "Ночные очки / Goggles of Night",
"type": "equipment",
"img": "modules/laaru-dnd5-hw/assets/images/pic/Goggles%20of%20Night.webp",
"effects": [
{
"_id": "FR1ayX97qzN49D5m",
"changes": [
{
"key": "system.attributes.senses.darkvision",
"mode": 2,
"value": "+60",
"priority": 7
}
],
"disabled": true,
"duration": {
"startTime": null,
"seconds": null,
"combat": null,
"rounds": null,
"turns": null,
"startRound": null,
"startTurn": null
},
"origin": "Item.dYkyr33IwTatdWJs",
"transfer": true,
"flags": {},
"tint": "#ffffff",
"name": "Ночное зрение +60 футов",
"description": "",
"statuses": [],
"_stats": {
"compendiumSource": null,
"duplicateSource": null,
"coreVersion": "12.327",
"systemId": "dnd5e",
"systemVersion": "3.3.1",
"createdTime": null,
"modifiedTime": null,
"lastModifiedBy": null
},
"img": "icons/magic/control/hypnosis-mesmerism-eye-tan.webp",
"type": "base",
"system": {},
"sort": 0
}
],
"flags": {
"srd5e": {
"page": "",
"source": "DMG",
"hash": "goggles%20of%20night_dmg"
},
"test_tube_merchant": {
"quantity": "1"
},
"babele": {
"hasTranslation": true,
"originalName": "Goggles of Night",
"translated": true
}
},
"system": {
"description": {
"value": "<p><em>Чудесный предмет</em></p><p>Пока вы носите эти тёмные линзы, у вас &amp;reference[darkvision]{ночное зрение} на расстоянии до <strong>60 футов</strong>. Если у вас уже было ночное зрение, ношение этих очков увеличивает его дистанцию на <strong>60 футов</strong>.</p>",
"chat": ""
},
"source": {
"custom": "DMG"
},
"quantity": 1,
"weight": {
"value": 0,
"units": "lb"
},
"price": {
"value": 500,
"denomination": "gp"
},
"attunement": "",
"equipped": true,
"rarity": "uncommon",
"identified": true,
"activation": {
"type": "",
"cost": 0,
"condition": ""
},
"duration": {
"value": "",
"units": ""
},
"cover": null,
"target": {
"value": "0",
"width": null,
"units": "",
"type": "",
"prompt": true
},
"range": {
"value": 5,
"long": 0,
"units": "ft"
},
"uses": {
"value": null,
"max": "",
"per": null,
"recovery": "",
"prompt": true
},
"consume": {
"type": "",
"target": "",
"amount": null,
"scale": false
},
"ability": "",
"actionType": "",
"chatFlavor": "",
"critical": {
"threshold": null,
"damage": ""
},
"damage": {
"parts": [],
"versatile": ""
},
"formula": "",
"save": {
"ability": "",
"dc": null,
"scaling": "spell"
},
"armor": {
"value": null,
"dex": null,
"magicalBonus": null
},
"hp": {
"value": 0,
"max": 0,
"dt": null,
"conditions": ""
},
"speed": {
"value": null,
"conditions": ""
},
"strength": 0,
"proficient": 1,
"crewed": false,
"unidentified": {
"description": ""
},
"type": {
"value": "trinket",
"baseItem": ""
},
"attack": {
"bonus": "",
"flat": false
},
"container": null,
"attuned": false,
"enchantment": null,
"summons": null,
"properties": []
}
}
@@ -0,0 +1,114 @@
{
"name": "Порох (бочонок) / Gunpowder (keg)",
"type": "consumable",
"img": "icons/containers/barrels/barrel-reinforced-cherry-red.webp",
"system": {
"description": {
"value": "<p><span style=\"font-family:'Noto Sans', Arial, sans-serif\">Порох в основном используется для стрельбы пулями из стволов пистолетов и винтовок или создания бомб. Порох продают небольшими деревянными бочонками и водостойкими пороховыми рожками. Если поджечь контейнер, наполненный порохом, он взорвётся, нанеся урон огнём существам в пределах 10 футов от себя — [[/r 7d6]]. Успешное испытание Ловкости со СЛ 12 уменьшает урон вдвое. Если поджечь унцию пороха, она будет ярко гореть 1 раунд, испуская @UUID[Compendium.laaru-dnd5-hw.conditions.EvGCMCVp1VpUtCbI]{яркий свет} в радиусе 30 футов и @UUID[Compendium.laaru-dnd5-hw.conditions.BbWvc4m610EHv070]{тус­клый} ещё на 30 футов.</span></p>",
"chat": ""
},
"source": {
"custom": "DMG"
},
"quantity": 1,
"weight": {
"value": 20,
"units": "lb"
},
"price": {
"value": 250,
"denomination": "gp"
},
"attunement": "",
"equipped": false,
"rarity": "",
"identified": true,
"activation": {
"type": "action",
"cost": 1,
"condition": ""
},
"duration": {
"value": "",
"units": ""
},
"cover": null,
"target": {
"value": "10",
"width": null,
"units": "ft",
"type": "sphere",
"prompt": true
},
"range": {
"value": null,
"long": null,
"units": ""
},
"uses": {
"value": null,
"max": "",
"per": null,
"recovery": "",
"autoDestroy": false,
"prompt": true
},
"consume": {
"type": "",
"target": "",
"amount": null,
"scale": false
},
"ability": "",
"actionType": "save",
"chatFlavor": "",
"critical": {
"threshold": null,
"damage": ""
},
"damage": {
"parts": [
[
"7d6",
"fire"
]
],
"versatile": ""
},
"formula": "",
"save": {
"ability": "dex",
"dc": 12,
"scaling": "flat"
},
"crewed": false,
"unidentified": {
"description": ""
},
"type": {
"value": "ammo",
"subtype": ""
},
"attack": {
"bonus": "",
"flat": false
},
"container": null,
"attuned": false,
"enchantment": null,
"summons": null,
"magicalBonus": null,
"properties": []
},
"effects": [],
"flags": {
"test_tube_merchant": {
"quantity": "1d4 - 1"
},
"babele": {
"hasTranslation": true,
"originalName": "Gunpowder (keg)",
"translated": true
}
}
}