Релиз 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
+44
View File
@@ -0,0 +1,44 @@
{
"name": "Бант или бабочка",
"type": "loot",
"img": "modules/test_tube_merchant/assets/icon/items/bow_tie.png",
"system": {
"description": {
"value": "Бант или бабочка из шёлка, гладкий или с праздничным узором.",
"chat": ""
},
"source": {
"custom": ""
},
"quantity": 1,
"weight": {
"value": 0,
"units": "lb"
},
"price": {
"value": 12,
"denomination": "gp"
},
"rarity": "",
"identified": true,
"unidentified": {
"description": ""
},
"container": null,
"properties": [],
"type": {
"value": "",
"subtype": ""
}
},
"effects": [],
"flags": {
"test_tube_merchant": {
"quantity": "1d3 * 3 + 1d3"
},
"scene-packer": {
"hash": "a6d4619ec76f679a4264066608ac35e5d6ce4985",
"sourceId": ""
}
}
}
+40
View File
@@ -0,0 +1,40 @@
{
"name": "Бархатная маска",
"type": "loot",
"img": "icons/commodities/treasure/trinket-wing-white.webp",
"system": {
"description": {
"value": "<p>Чёрная бархатная маска с серебряным шитьём, предмет искусства стоимостью не меньше 25 зм.</p>",
"chat": ""
},
"source": {
"custom": "DMG"
},
"quantity": 1,
"weight": {
"value": 0,
"units": "lb"
},
"price": {
"value": 25,
"denomination": "gp"
},
"rarity": "",
"identified": true,
"unidentified": {
"description": ""
},
"container": null,
"properties": [],
"type": {
"value": "",
"subtype": ""
}
},
"effects": [],
"flags": {
"test_tube_merchant": {
"quantity": "1d3 * 2 + 1d2"
}
}
}
+40
View File
@@ -0,0 +1,40 @@
{
"name": "Алебастровая маска",
"type": "loot",
"img": "icons/commodities/treasure/mask-bone-white.webp",
"system": {
"description": {
"value": "<p>Алебастровая маска.</p>",
"chat": ""
},
"source": {
"custom": "PHB"
},
"quantity": 1,
"weight": {
"value": 0,
"units": "lb"
},
"price": {
"value": 5,
"denomination": "gp"
},
"rarity": "common",
"identified": true,
"unidentified": {
"description": ""
},
"container": null,
"properties": [],
"type": {
"value": "",
"subtype": ""
}
},
"effects": [],
"flags": {
"test_tube_merchant": {
"quantity": "1d3 * 2 + 1d2"
}
}
}
+43
View File
@@ -0,0 +1,43 @@
{
"name": "Бандитская маска",
"type": "loot",
"img": "icons/commodities/cloth/ribbon-bow-red.webp",
"system": {
"description": {
"value": "<p>Слегка поношенная алая бандитская маска.</p>",
"chat": ""
},
"source": {
"book": "",
"page": "",
"custom": "AI",
"license": ""
},
"quantity": 1,
"weight": {
"value": 0,
"units": "lb"
},
"price": {
"value": 5,
"denomination": "gp"
},
"rarity": "",
"identified": true,
"type": {
"value": "",
"subtype": ""
},
"unidentified": {
"description": ""
},
"container": null,
"properties": []
},
"effects": [],
"flags": {
"test_tube_merchant": {
"quantity": "1d3 * 2 + 1d2"
}
}
}
+40
View File
@@ -0,0 +1,40 @@
{
"name": "Безделушка: Маскарадная маска",
"type": "loot",
"img": "icons/equipment/head/mask-horned-brown.webp",
"system": {
"description": {
"value": "<p>Пустая маскарадная маска.</p>",
"chat": ""
},
"source": {
"custom": "VRGR"
},
"quantity": 1,
"weight": {
"value": 0,
"units": "lb"
},
"price": {
"value": 5,
"denomination": "gp"
},
"rarity": "",
"identified": true,
"unidentified": {
"description": ""
},
"container": null,
"properties": [],
"type": {
"value": "",
"subtype": ""
}
},
"effects": [],
"flags": {
"test_tube_merchant": {
"quantity": "1d3 * 2 + 1d2"
}
}
}
+129
View File
@@ -0,0 +1,129 @@
{
"name": "Очки",
"type": "consumable",
"img": "icons/tools/scribal/spectacles-glasses.webp",
"system": {
"description": {
"value": "Очки из кожи и стекла, защищающие глаза.",
"chat": ""
},
"source": {
"custom": ""
},
"quantity": 1,
"weight": {
"value": 0,
"units": "lb"
},
"price": {
"value": 10,
"denomination": "gp"
},
"rarity": "",
"identified": true,
"unidentified": {
"description": ""
},
"container": null,
"properties": [],
"type": {
"value": "trinket",
"subtype": ""
},
"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,
"autoDestroy": false
},
"consume": {
"type": "",
"target": null,
"amount": null,
"scale": false
},
"ability": null,
"actionType": "",
"attack": {
"bonus": "",
"flat": false
},
"chatFlavor": "",
"critical": {
"threshold": null,
"damage": ""
},
"damage": {
"parts": [],
"versatile": ""
},
"enchantment": null,
"formula": "",
"save": {
"ability": "",
"dc": null,
"scaling": "spell"
},
"summons": null,
"magicalBonus": null
},
"effects": [],
"flags": {
"test_tube_merchant": {
"quantity": "1d4"
},
"scene-packer": {
"hash": "46053142b1824427cdcceaeffbb1fd7fcdb7796a",
"sourceId": ""
},
"midiProperties": {
"confirmTargets": "default",
"autoFailFriendly": false,
"autoSaveFriendly": false,
"critOther": false,
"offHandWeapon": false,
"magicdam": false,
"magiceffect": false,
"noConcentrationCheck": false,
"toggleEffect": false,
"ignoreTotalCover": false,
"idr": false,
"idi": false,
"idv": false,
"ida": false
},
"midi-qol": {
"rollAttackPerTarget": "default",
"itemCondition": "",
"effectCondition": ""
}
}
}
+144
View File
@@ -0,0 +1,144 @@
{
"name": "Одежда, аристократичная",
"type": "equipment",
"img": "modules/test_tube_merchant/assets/icon/items/aristocratic_clothes.png",
"system": {
"description": {
"value": "Аристократичная одежда, последний писк современной моды.",
"chat": ""
},
"source": {
"custom": ""
},
"quantity": 1,
"weight": {
"value": 0,
"units": "lb"
},
"price": {
"value": 50,
"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": null,
"actionType": "",
"attack": {
"bonus": "",
"flat": false
},
"chatFlavor": "",
"critical": {
"threshold": null,
"damage": ""
},
"damage": {
"parts": [],
"versatile": ""
},
"enchantment": null,
"formula": "",
"save": {
"ability": "",
"dc": null,
"scaling": "spell"
},
"summons": null,
"armor": {
"value": null,
"magicalBonus": null,
"dex": null
},
"hp": {
"value": null,
"max": null,
"dt": null,
"conditions": ""
},
"speed": {
"value": null,
"conditions": ""
},
"strength": null,
"proficient": null
},
"effects": [],
"flags": {
"test_tube_merchant": {
"quantity": "1d3 * 5 + 1d5"
},
"scene-packer": {
"hash": "a65e4f083ffbc8e6bd7ff5ac936b74e17653b375",
"sourceId": ""
},
"midiProperties": {
"confirmTargets": "default",
"autoFailFriendly": false,
"autoSaveFriendly": false,
"critOther": false,
"offHandWeapon": false,
"magicdam": false,
"magiceffect": false,
"noConcentrationCheck": false,
"toggleEffect": false,
"ignoreTotalCover": false,
"idr": false,
"idi": false,
"idv": false,
"ida": false
},
"midi-qol": {
"rollAttackPerTarget": "default",
"itemCondition": "",
"effectCondition": ""
}
}
}
+121
View File
@@ -0,0 +1,121 @@
{
"name": "Парадная одежда / Fine Clothes",
"type": "equipment",
"img": "icons/equipment/back/cloak-heavy-fur-blue.webp",
"effects": [],
"flags": {
"babele": {
"translated": true,
"hasTranslation": true,
"originalName": "Fine Clothes"
},
"test_tube_merchant": {
"quantity": "1d3 * 5 + 1d5"
}
},
"system": {
"description": {
"value": "<p>Набор одежды, специально разработанный, чтобы выглядеть дорого и богато.</p>",
"chat": ""
},
"quantity": 1,
"weight": {
"value": 6,
"units": "lb"
},
"price": {
"value": 15,
"denomination": "gp"
},
"attunement": "",
"equipped": false,
"rarity": "common",
"identified": true,
"activation": {
"type": "",
"cost": 0,
"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": "",
"amount": null,
"scale": false
},
"ability": null,
"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": 0,
"unidentified": {
"description": ""
},
"type": {
"value": "clothing",
"baseItem": ""
},
"attack": {
"bonus": "",
"flat": false
},
"container": null,
"attuned": false,
"enchantment": null,
"summons": null,
"properties": []
}
}
+144
View File
@@ -0,0 +1,144 @@
{
"name": "Шляпа, авантюриста",
"type": "equipment",
"img": "modules/test_tube_merchant/assets/icon/items/adventure_hat.png",
"system": {
"description": {
"value": "Широкополая кожаная шляпа для странствий.",
"chat": ""
},
"source": {
"custom": ""
},
"quantity": 1,
"weight": {
"value": 0,
"units": "lb"
},
"price": {
"value": 15,
"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": null,
"actionType": "",
"attack": {
"bonus": "",
"flat": false
},
"chatFlavor": "",
"critical": {
"threshold": null,
"damage": ""
},
"damage": {
"parts": [],
"versatile": ""
},
"enchantment": null,
"formula": "",
"save": {
"ability": "",
"dc": null,
"scaling": "spell"
},
"summons": null,
"armor": {
"value": null,
"magicalBonus": null,
"dex": null
},
"hp": {
"value": null,
"max": null,
"dt": null,
"conditions": ""
},
"speed": {
"value": null,
"conditions": ""
},
"strength": null,
"proficient": null
},
"effects": [],
"flags": {
"test_tube_merchant": {
"quantity": "1d4"
},
"scene-packer": {
"hash": "ec44f64854620bc47d58332368fc0e9ed57a44c2",
"sourceId": ""
},
"midiProperties": {
"confirmTargets": "default",
"autoFailFriendly": false,
"autoSaveFriendly": false,
"critOther": false,
"offHandWeapon": false,
"magicdam": false,
"magiceffect": false,
"noConcentrationCheck": false,
"toggleEffect": false,
"ignoreTotalCover": false,
"idr": false,
"idi": false,
"idv": false,
"ida": false
},
"midi-qol": {
"rollAttackPerTarget": "default",
"itemCondition": "",
"effectCondition": ""
}
}
}
+129
View File
@@ -0,0 +1,129 @@
{
"name": "Тёмные очки",
"type": "consumable",
"img": "icons/tools/scribal/spectacles-glasses.webp",
"system": {
"description": {
"value": "Тёмные очки, убирающие помеху при чувствительности к солнцу.",
"chat": ""
},
"source": {
"custom": ""
},
"quantity": 1,
"weight": {
"value": 0,
"units": "lb"
},
"price": {
"value": 350,
"denomination": "gp"
},
"rarity": "",
"identified": true,
"unidentified": {
"description": ""
},
"container": null,
"properties": [],
"type": {
"value": "trinket",
"subtype": ""
},
"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,
"autoDestroy": false
},
"consume": {
"type": "",
"target": null,
"amount": null,
"scale": false
},
"ability": null,
"actionType": "",
"attack": {
"bonus": "",
"flat": false
},
"chatFlavor": "",
"critical": {
"threshold": null,
"damage": ""
},
"damage": {
"parts": [],
"versatile": ""
},
"enchantment": null,
"formula": "",
"save": {
"ability": "",
"dc": null,
"scaling": "spell"
},
"summons": null,
"magicalBonus": null
},
"effects": [],
"flags": {
"test_tube_merchant": {
"quantity": "1d4"
},
"scene-packer": {
"hash": "7b00cdd0a61cbc33da6620b3925a26751cf7b637",
"sourceId": ""
},
"midiProperties": {
"confirmTargets": "default",
"autoFailFriendly": false,
"autoSaveFriendly": false,
"critOther": false,
"offHandWeapon": false,
"magicdam": false,
"magiceffect": false,
"noConcentrationCheck": false,
"toggleEffect": false,
"ignoreTotalCover": false,
"idr": false,
"idi": false,
"idv": false,
"ida": false
},
"midi-qol": {
"rollAttackPerTarget": "default",
"itemCondition": "",
"effectCondition": ""
}
}
}
+39
View File
@@ -0,0 +1,39 @@
{
"name": "Тёплая одежда",
"type": "loot",
"system": {
"description": {
"value": "<p>Эта экипировка состоит из тяжёлой подбитой мхом шубы или плаща поверх нескольких предметов одежды из шерсти, а также шапки или капюшона с меховой подкладкой, защитных очков, кожаных сапог и перчаток на меху. До тех пор, пока тёплая одежда остается сухой, её владелец автоматически преуспевает в испытаниях от воздействия чрезвычайного холода (см. @UUID[Compendium.laaru-dnd5-hw.intro.vD7YbJP9a9EsmZRU.JournalEntryPage.yrEvoLmiYw1m6XwR#silьnyj-holod]{Сильный холод})</p>",
"chat": ""
},
"source": {
"custom": "IDRotF"
},
"quantity": 1,
"weight": {
"value": 5,
"units": "lb"
},
"price": {
"value": 10,
"denomination": "gp"
},
"rarity": "common",
"identified": true,
"unidentified": {
"description": ""
},
"container": null,
"properties": [],
"type": {
"value": "",
"subtype": ""
}
},
"img": "modules/laaru-dnd5-hw/assets/images/pic/outfit.webp",
"flags": {
"test_tube_merchant": {
"quantity": "1d3 * 2 + 1d2"
}
}
}