Files
test_tube_merchant/module/data.mjs
T
shiranui e21d8c5198
Build release archive / release (push) Failing after 28s
Релиз v1.2.9
Изменено:
 - Поддержка новых типов товаров: "Механические приспособления" и "Религиозные товары".
 - Добавлена возможность случайной генерации уровня торговца.
 - Улучшена производительность при загрузке предметов из компендиумов.
 - Обновлены тексты описаний для категорий товаров.
 - Исправлена ошибка при добавлении предметов к торговцу (см. `module/data.mjs`, строки 2436-2446).
 - Исправлена проблема с отображением характеристик торговца в интерфейсе.
2026-07-15 19:42:45 +03:00

2579 lines
130 KiB
JavaScript
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
export class ViewData{
itemsTypes = {
"bars": "Алкоголь и напитки",
// "animals": "Животные (ездовые и домашние)",
"books": "Книги и карты",
"flowers": "Цветы и семена",
"food": "Еда и части животных",
// "furniture": "Мебель и предметы интерьера",
"fashion": "Высокая мода",
"jewelry": "Ювелирные изделия",
"trinkets": "Безделушки",
"skin": "Изделия из кожи",
"mechanical": "Механические приспособления",
"armor": "Средние и тяжелые доспехи (щиты)",
"potions": "Зелья, яды и травы",
"religious": "Религиозные товары",
// "songs": "Песни и инструменты",
"scrolls": "Книги заклинаний и свитки",
"thieves": "Воровские приспособления",
"tools": "Инструменты",
// "transport": "Транспортные средства и перевозки",
"weapon": "Оружие"
// "curse": "Проклятые товары"
}
categories = {
"horrible": "Ужасный",
"bad": "Плохой",
"medium": "Средний",
"good": "Хороший",
"beautiful": "Прекрасный"
}
}
export class MerchantData {
names = [
{
"name": "human",
"title": "Люди",
"list": [
{
"name": "damaran",
"title": "Человек",
"schemes": [
"male surname",
"female surname"
],
"src": [
{
"name": "male",
"l": "Айвор, Бор, Глэр, Григор, Иган, Козеф, Миваль, Орел, Павел, Сергор, Фодель"
},
{
"name": "female",
"l": "Алетра, Зора, Кара, Катернин, Мара, Натали, Ольма, Тана"
},
{
"name": "surname",
"l": "Берск, Дотск, Куленов, Марск, Немецк, Стараг, Чернин, Шемов"
}
]
},
{
"name": "illuskan",
"title": "Человек",
"schemes": [
"male surname",
"female surname"
],
"src": [
{
"name": "male",
"l": "Валек, Ленхерроу, Криз, Мирли, Джор, Донлин, Алеб, Мирул, Брен, Эльтид, Витглен, Бессир, Грефдон, Брентор, Мартеган, Дрантен, Пронлак, Мэнни, Урик, Делин, Блас, Бран, Гет, Ландер, Лют, Малсер, Стор, Таман, Урт, Фрат, Эндер"
},
{
"name": "female",
"l": "Алиана, Кисани, Шая, Петриви, Эльтез, Джува, Нана, Мири, Сасс, Мико, Элисия, Стаси, Гвин, Шилли, Пенересил, Мирн, Малонни, Элли, Дрея, Фарила, Амафрея, Бетха, Вестра, Кетра, Мара, Ольга, Силифрей, Цефрея"
},
{
"name": "surname",
"l": "Хетингтон, Нубингнор, Ортегана, Рунтроп, Белдок, Алгой, Граш, Нарарис, Велниб, Гридж, Хилден, Греткин, МакРафрик, Тебрил, Калмин, Ренфолд, Кенисвиль, МакАндрик, райтвуд, Виндривер, Лакмэн, Хелдер, Хорнрейвен, Штормвинд"
}
]
},
{
"name": "tethyrian",
"title": "Человек",
"schemes": [
"male surname",
"female surname"
],
"src": [
{
"name": "male",
"l": "Асеир, Бардеид, Зашеир, Кхемед, Мехмен, Судейман, Хасеид"
},
{
"name": "female",
"l": "Атала, Джасмаль, Зашеида, Мейлиль, Сейдиль, Сейпора, Хама, Яшеира"
},
{
"name": "surname",
"l": "Баша, Джассан, Думеин, Кхалид, Мостана, Пашар, Рейн"
}
]
},
{
"name": "mulan",
"title": "Человек",
"schemes": [
"male surname",
"female surname"
],
"src": [
{
"name": "male",
"l": "Аот, Барерис, Кетот, Мумед, Рамас, Со-Кехур, Тхазар-Де, Урхур, Эхпут-Ки"
},
{
"name": "female",
"l": "Аризима, Золис, Мурити, Нефис, Нулара, Сефрис, Тола, Умара, Чатхи"
},
{
"name": "surname",
"l": "Анкхалаб, Анскульд, Натандем, Серпет, Уутракт, Фезим, Хахпет"
}
]
},
{
"name": "rushemi",
"title": "Человек",
"schemes": [
"male surname",
"female surname"
],
"src": [
{
"name": "male",
"l": "Боривик, Владислак, Джандар, Канитар, Мадислак, Ральмевик, Фаургар, Шаумар"
},
{
"name": "female",
"l": "Имзель, Иммит, Наварра, Таммит, Файварра, Хульмарра, Шеварра, Юльдра"
},
{
"name": "surname",
"l": "Дайрнина, Илтазяра, Мурнитара, Стаянога, Улмокина, Чергоба"
}
]
},
{
"name": "terami",
"title": "Человек",
"schemes": [
"male surname",
"female surname"
],
"src": [
{
"name": "male",
"l": "Антон, Диеро, Маркон, Пьерон, Римардо, Ромеро, Салазар, Умберо"
},
{
"name": "female",
"l": "Балама, Вонда, Джалана, Дона, Куара, Луиза, Марта, Селизе, Фаила"
},
{
"name": "surname",
"l": "Агосто, Асторио, Домине, Калабра, Маривальди, Писакар, Рамондо, Фалоне"
}
]
},
{
"name": "chondathan",
"title": "Человек",
"schemes": [
"male surname",
"female surname"
],
"src": [
{
"name": "male",
"l": "Горстаг, Грим, Дарвин, Дорн, Маларк, Морн, Рэндал, Стедд, Хельм, Эвендур"
},
{
"name": "female",
"l": "Арвин, Джессаиль, Керри, Лурин, Мири, Рован, Тесселе, Шандри, Эсвель"
},
{
"name": "surname",
"l": "Бакмэн, Грэйкасл, Дандрэгон, Толстаг, Эвенвуд, Эмблкроун"
}
]
}
]
},
{
"name": "elf",
"title": "Эльфы",
"list": [
{
"name": "wood",
"title": "Эльф лесной",
"schemes": [
"mchild surname",
"male surname",
"female surname",
"mchild surname2",
"male surname2",
"female surname2"
],
"src": [
{
"name": "male",
"l": "Рэйвен, Дельтор, Нунель, Маррдрин, Нелор, Олорион, Венолен, Нерепар, Леневелон, Васарен, Нетерин, Релеан, Талон, Тинарис, Хиранель, Варрик, Буренус, Кинсалор, Гутрин, Хильсадар, Адран, Арамиль, Араннис, Ауст, Аэлар, Бейро, Берриан, Варис, Галинндан, Ивеллиос, Иммераль, Каррик, Куарион, Лаусиан, Миндартис, Паэлиас, Перен, Риардон, Ролен, Совелисс, Тамиорн, Таривол, Терен, Хадарай, Химо, Хэйян, Эниалис, Эрдан, Эреван, Адран, Аэлар, Аэрдэт, Аваин, Арамил, Аранис, Ост, Ауст, Азаки, Бэйро, Берриан, Каэлдрим, Каррик, Дайэрэт, Дреали, Эфферил, Эиравель, Эниалис, Эрдан, Эверан, Фивин, Галинндан, Геннал, Хадараи, Халимат, Хэиан, Химо, Иммерал, Ивеллмос, Корфел, Ламлис, Лоциан, Миндартис, Наал, Нутаэ, Паэлиас, Перен, Куарион, Риардон, Ролен, Совелисс, Сухнаэ, Тамиор, Таривол, Тэрен, Тэриатис, Тэрван, Утемар, Вануат, Варис"
},
{
"name": "female",
"l": "Трелорин, Лафар, Хиарус, Айла, Аннун, Леайри, Лотус, Тиа, Калатиана, Пасарин, Джулна, Раник, Вашара, Эридиун, Осери, Лоринея, Розен, Фералия, Фокси, Юлия, Адрие, Альтеа, Анастрианна, Андрасте, Антинуа, Бетринна, Бирель, Вадания, Валанте, Джеленетт, Друсилиа, Йелениа, Каэлинн, Квеленна, Квиласи, Кейлет, Ксанафия, Лешанна, Лиа, Миали, Мэриэль, Найвара, Сариэль, Силакви, Теирастра, Тиа, Фелосиаль, Шава, Шанайра, Энна, Адриэ, Ахина, Алтэя, Анастриана, Андрастэ, Антинуа, Арара, Баэлитаэ, Бетринна, Бирель, Каэлинн, Каэди, Клаира, Дара, Друсилиа, Элама, Энна, Фараль, Фелосиэль, Хатаэ, Иэления, Иланис, Иранн, Иарсали, Иеленет, Кейлет, Лешана, Лиа, Маиата, Малкуиш, Мериэль, Миали, Миатетил, Наивара, Куэленна, Куэлаттэ, Ридаро, Сариэль, Шанаирла, Шава, Силакуи, Самнес, Тэирастра, Тиала, Тиааткуэ, Траулам, Вадания, Валантэ, Вална, Занафия"
},
{
"name": "mchild",
"l": "Ара, Брин, Валь, Дель, Иннил, Лаэль, Мелла, Наиль, Наэрис, Раэль, Ринн, Сай, Силлин, Тиа, Фанн, Фаэн, Эрин, Аэл, Анг, Ара, Ари, Арн, Аим, Броэ, Брин, Каэл, Кай, Даэ, Дел, Эли, Эрин, Фаэн, Фера, Гаэл, Гар, Иннил, Йар, Кан, Коэт, Лаэл, Луэ, Маи, Мара, Мелла, Миа, Наэрис, Наилл, Ним, Фанн, Пай, Раэл, Раэр, Рэн, Ринн, Руа, Sael, Саи, Суми, Сайлин, Силин, Тэй, Тиа, Траки, Валл, Вон, Вил, Зэй"
},
{
"name": "surname",
"type": "array",
"l": "Тёмная Тень, Речной Туман, Буревая Птица, Закатный Шёпот, Быстрая Стрела, Сверкающая Луна, Рождённый Облаком, Зовущий Волка, Песнь Ястреба, Ветер Духов, Начало Утра, Золотое Дерево, Мерцающее Солнце, Упавшая Звезда, Говорящий Ручей, Лунный Блеск, Красные Листья, Далёкий Выстрел, Мерцающая Заря, Поющая Ива, Амакиир (Сверкающий Цветок), Амастасия (Звёздный Цветок), Галанодель (Лунный Шёпот), Ильфелкиир (Сверкающий Бутон), Ксилосент (Золотой Лепесток), Лиадон (Серебряный Лист), Найло (Ночной Бриз), Сианодель (Лунный Ручей), Холимион (Алмазная Роса)"
},
{
"name": "surname2",
"l": "Алоро, Амакиир, Амастасиа, Ариессус, Арнуанна, Береван, Каэрдонэл, Кафаксат, Кассилтенирра, Китрет, Далантан, Италена, Эренаэт, Этанасат, Фашараш, Фирахель, Флошем, Галанодэль, Голтора, Эналаи, Холимион, Хоринет, Латрана, Илфекриир, Иранафа, Коэлана, Латалас, Лиадон, Мэлиамнэ, Мэллерелель, Мистралат, Наило, Нэтиоив, Офандрус, Осторот, Отронус, Куалантри, Раэтран, Ротенель, Селеваран, Сианодел, Суитразас, Сильварант, Тэинитра, Тилататна, Васанти, Витретин, Зилосьен, Зистсрит, Яэлдрин"
}
]
},
{
"name": "high_moon",
"title": "Эльф морской",
"schemes": [
"male surname",
"female surname"
],
"src": [
{
"name": "male",
"l": "Чиаркот, Вишроут, Шубм, Шлорх, Фурлу, Пефраук, Чекуан, Цефлай, Плуан, Рарррш"
},
{
"name": "female",
"l": " Силусс, Цалиш, Тикаэла, Линзеюн, Зеннина, Джлкин, Улл, Диньзее, Алуа, Виарти"
},
{
"name": "surname",
"l": " Литоари, Халио, Итуоа, Вулу, Зиалео, Фаолал, Бнеу, Уалошот"
}
]
},
{
"name": "drow",
"title": "Эльф тёмный (дроу)",
"schemes": [
"female prefix postfix",
"female surname",
"male prefix postfix",
"male surname"
],
"src": [
{
"name": "male",
"l": "Аркилун, Кеддикай, Иеруша, Корза, Галик,Окари, Ахнир, Урхний, Кордук"
},
{
"name": "female",
"l": "Аркилун, Кеддикай, Иеруша, Корза, Галик,Окари, Ахнир, Урхний, Кордук"
},
{
"name": "prefix",
"type": "array",
"postfix": "'",
"l": "Ко, Хен, Цек,Лар, Грен, Хун, Кель,"
},
{
"name": "postfix",
"type": "array",
"l": "рарати, дадик, тат, карум, ула, урнин, халик"
},
{
"name": "surname",
"l": "Зольэксил, Ксогоголь, Талаф"
}
]
},
]
},
{
"name": "gnome",
"title": "Гномы",
"list": [
{
"name": "Forest",
"title": "Гном лесной",
"schemes": [
"male surname nic",
"female surname nic",
"male male surname nic",
"female female surname nic"
],
"src": [
{
"name": "male",
"l": "Алвин, Алстон, Боддинок, Брок, Бюргел, Варрин, Вренн, Гербо, Гимбл, Глим, Джебеддо, Димбл, Зук, Келлен, Намфудл, Оррин, Рундар, Сибо, Синдри, Фонкин, Фрюг, Элдон, Эрки, Алстон, Алвин, Анверт, Арумаванн, Билброн, Боддинок, Брокк, Бургелл, коккаби, Кранпернап, Даддлодоб, Делебин, Димбл, Эбердеб, Элдон, Эрки, Фаблен, Фибблстиб, Фонкин, Фраус, Фруг, Фраг, Гербо, Гимбл, Глим, Bulty, Джаббл, Джебеддо, Келлен, Киппер, Намфудл, Опплбай, Оррин, Пагген, Паллабар, Пог, Куален, Рибблс, Рундар, Сапплай, Сибо, Сентек, Синдри, Ампен, Варрин, Виггенс, Вобблс, Вренн, Заффраб, Зук"
},
{
"name": "female",
"l": "Бимпноттин, Брина, Вейуокет, Донелла, Дувамил, Занна, Карамип, Карлин, Лилли, Лорилла, Лупмоттин, Маднаб, Никс, Нисса, Ода, Орла, Ройвин, Тана, Шамил, Эливик, Элиджобелл, Элла, Абалаба, Бимпноттин, Бреена, Бувви, Каллибон, Карамип, Карлин, Кампен, Далаба, Донелла, Дувамил, Элла, Эллиджойбелл, Элливик, Энидда, Лилли, Лупмоттин, Лорилла, Лутра, Марднаб, Мина, мэнни, Мампена, Ниссса, Нумба, Никс, Ода, Оппа, Орла, Панана, Пинтл, Куилла, Ранала, Реддлпоп, Ройвин, Саланоп, Шамил, Сиффресс, Симма, Тана, Тенена, Тервараунд, Типлто, Уила, Анвера, Велоптима, Вирра, Вайвоккет, Йебе, Занна"
},
{
"name": "klan",
"l": "Берен, Гаррик, Даергел, Мёрниг, Накл, Нингел, Раулнор, Тимберс, Турен, Фолькор, Шеппен, Албаратай, Баффлстоун, Берен, Бундигглс, Коббллоб, Даэргел, Данбен, Фабблстаббл, Фапплстап, Фиддлфен, Фолкор, гаррик, Гимлен, Глиттергем, Гобблфирн, Гаммен, Хоркуспоркус, Хамплбампл, Айронхайд, леффери, Лингелхолл, Луфолу, Маеккелфекс, Мигглдай, Манген, Мунген, Мурнинг, Мусграбен, Наккл, Нингел, Нопенсталлен, Наклстамп, Оффунд, Умптроул, Пилвикен, Пинган, Куиллшарпенер, Ролнор, Риз, Роффертон, Шеппен, Шэдоуклоак, Силвертред, Симпони, Таркелбай, Тимберс, Турен, Амбодобен, Вагглтоп, Велбер, Вайлдвандер"
},
{
"name": "nic",
"type": "array",
"random": "3",
"l": "Барсук, Босоног, Двазамок, Колотушка, Ку, Ним, Пеплосерд, Пивохлёб, Плащ, Пок, Самоцвет, Стамблдак, Фниппер"
}
]
},
]
},
{
"name": "tiefling",
"title": "Тифлинги",
"list": [
{
"name": "normal",
"title": "Тифлинг Фаэруна",
"schemes": [
"male nic",
"female nic",
"male surname",
"female surname"
],
"src": [
{
"name": "male",
"l": "Зул, Делатос, Камадос, Кверинакс, Менос, Хортос, Слутис, Эмокесс, Терат, Саракха, Динусин, Сиадисс, Москиз, Анмен, Талусс, Кутреш, Рулеф, Эделандросс, Малих, Ксанрос, Акменос, Амнон, Баракас, Дамакос, Йадос, Кайрон, Люцис, Мелех, Мордай, Мортос, Пелайос, Скамос, Терай, Экемон, Абад, Арим, Акмен, Амнон, Андрам, Астар, Балам, Баракас, Батин, Каим, Чем, Каймер, Крессел, Дамакос, Экемон, Еврон, Ерон, Фенриз, форкас, Хабор, Иадос, Каирон, Леуцис, Мамнен, Мантус, Марбас, Мелек, Мериим, Модин, Мордаи, Мормо, мортос, Никор, Ниргел, Ориакс, Пэймон, Пелаиос, Пурсон, Кемуэл, Раам, Риммон, Саммал, Скамос, Тетрен, Тамуз, Тераи, Валафар, Вассаго, Заппан, Зепар, Зефан"
},
{
"name": "female",
"l": "Трейни, Дельзидиае, Зоа, Дересияй, Лиселис, Тизерия, Морианна, Теринна, Фобития, Тактра, Скрайя, Равертиа, Вашери, Пелуна, Думенсель, Валлистра, Ируведи, Гедонастрая, Ламита, Терсели, Акта, Анакис, Брисеис, Дамая, Каллиста, Криелла, Лерисса, Макария, Немея, Орианна, Риета, Фелая, Эа, Акта, Анакис, Армара, Астаро, Аим, Азза, Белет, Брисеис, Бун, Криелла, Дамая, Декарабия, Эа, Гадрил, Гомори, Гекат, Иштэ, Джезебет, Кали, Каллиста, Касдея, Лерисса, Лилит, макария, Мани, Манея, Маркосиан, Мастема, Наама, Немея, Ния, Ниджа, Орианна, Оса, Фелая, Просперина, Пура, Пира, Риета, Роноб, Ронвэ, Седдит, Сирэ, Сехмет, Семияза, Шава, Шакс, Сорат, Узза, Вапула, Вепар, Верин"
},
{
"name": "nic",
"random": 2,
"type": "array",
"l": "Безрассудство, Вера, Идеал, Искусство, Музыка, Мука, Надежда, Напев, Нигде, Открытость, Отчаяние, Падаль, Поиск, Почтение, Поэзия, Превосходство, Скорбь, Слава, Случайность, Страх, Усталость, Амбиция, Искусство, Падаль, Песнопение, Вероучение, Смерть, Разврат, Отчаяние, Рок, Судьба, Сомнение, Паника, Экстаз, Скука, Энтропия, Превосходство, Страх, Слава, Прожорливость, Огорчение, Ненавидеть, Надежда, Ужас, Идеал, Бесчестье, Смех, Любовь, Похоть, Жестокость, Насмешка, убийство, Муза, Музыка, Тайна, Нигде, Открытость, Боль, Страсть, Поэзия, поиск, Случай, Благоговение, Отвращение, Печаль, Безрассудство, Мучение, Трагедия, Недостаток, Добродетель, Остроумие"
},
{
"name": "surname",
"random": 2,
"l": "Лафиан, Хлещехвост, Мрачнохмл, Желчебой, Цезбулан, Джеферлох, Дозмордин, Курелех, Темнопламень, Рельздехун, Грашт, Пуледиз, Армансусс, Черногонь, Вревиликус, Керевон, Офензул, Тетенбри, Чеммидон, Проклярость"
}
]
}
]
},
{
"name": "dwarf",
"title": "Дварфы",
"list": [
{
"name": "mountain",
"title": "Дварф горный",
"schemes": [
"male klan",
"female klan"
],
"src": [
{
"name": "male",
"l": "Терин, Конитир, Гунтраз, Фуганор, Хитдрен, Окино, Бадрик, Кордрек, Реберн, Грантрим, Торелин, Карракис, Донвел, Тромфир, Деребен, Вавек, Мабергор, Скирилат, Дуттрок, Зорлгрум, Адрик, Альберих, Баренд, Баэрн, Броттор, Бруенор, Вондал, Вэйт, Гардаин, Даин, Даррак, Делг, Килдрак, Моргран, Орсик, Оскар, Рангрим, Рюрик, Таклинн, Торадин, Тордек, Торин, Травок, Траубон, Ульфгар, Фаргрим, Флинт, Харбек, Эберк, Эйнкиль, Адрик, Алберик, Баэрн, Барендд, Белорил, Броттор, Даин, Далгал, Даррак, Делг, Дуэргат, Дворик, Эберк, Эинкил, Элаим, Эриас, Фаллонд, Фаргрим, Гардаим, Гилтур, Гимген, Гимурт, Харбек, Килдрак, Килвар, Моргран, Моркрал, Налрал, Нордак, Нуравал, Олорик, Олунт, Орсик, Оскар, Рангрим, Рейрак, Рурик, Таклинн, Торадин, Торин, Традал, Тордек, Траубон, Травок, Ульфгар, Ураим, Вейт, Вонбин, Вондал, Вурбин"
},
{
"name": "female",
"l": "Ортиния, Уиннтри, Диесина, Гортрисс, Листра, Ладрейн, Тристрид, Трейка, Пинзла, Делдит, Нориан, Яртрея, Артена, Торера, Хелини, Селтенн, Рунефисс, Геселен, Доа, Нилн, Артин, Бардрин, Вистра, Гуннлода, Гурдис, Дагнал, Диеза, Илде, Катра, Кристид, Лифтраса, Мардред, Одхильд, Рисвин, Саннл, Торбера, Торгга, Фалкрунн, Финеллен, Хельджа, Хлин, Эльдет, Эмбер, Андреа, Артин, Одхилд, Балифра, Барбена, Бардрин, Болхилд, Гагнал, Дарифф, Делре, Диеса, Элдет, Эридред, Фалкрунн, Фаллтра, Финеллен, Гиллидд, Гуннлода, Гурдис, Хелдрет, Хелджа, Хлин, Илде, Йарана, Катра, Килиа, Кристрид, Лифтраса, Марастир, Мардред, Морана, Налаед, Нора, Нуркара, Нюркара, Орифф, Овина, Рисвинн, Саннл, Терлин, Тодрис, торбера, Тордрид, Торгга, Уршар, Валида, Вистра, Вонана, Веридд, Вурдред, Юргунн"
},
{
"name": "klan",
"type": "array",
"random": 3,
"prefix": "из клана ",
"l": "Жестокобород, Темнокамень, Пьянокровь, Рудобой, Камнеждун, Кузнедух, Камнежуй, Рудолорд, Среброшлем, Руднеглот, Рунощерб, Огнебров, Сталеглот, Кровобород, Камнещит, Пивоног, Песнь Молота, Ковосерд, Камнешлем, Холмодав, Балдерк, Боевой Молот, Горунн, Данкил, Железный Кулак, Крепкая Наковальня, Ледяная Борода, Лодерр, Лютгер, Огненная Кузня, Рамнахейм, Стракелн, Торунн, Унгарт, Холдерхек, Боевой молот, Кровавое братство, Стойкой наковальни, Кровавый кулак, Найденной щахты, Глубинного рудника, Вечной заточки, Огненной кузни, Пенной кружки, Морозной бороды, Грозы гоблинов, Золотоискателей, Серой бороды, Молотокамня, Железного кулака, Убийц орков, Рубиноглаза, Серебряного топора, Стального кулака, Сильного сердца, Истинной наковальни, Истинной крови, "
}
]
}
]
},
{
"name": "halfling",
"title": "Полурослики",
"list": [
{
"name": "Lightfoot",
"title": "Полурослик легконогий",
"schemes": [
"male surname",
"female surname"
],
"src": [
{
"name": "male",
"l": "Альтон, Андер, Гаррет, Кейд, Коррин, Лайл, Линдал, Майло, Меррик, Осборн, Перрин, Рид, Роско, Уэллби, Финнан, Элдон, Эррих, Алтон, Андер, Берни, Боббин, Кэйд, Каллус, Коррин, Даннад, Данниэл, Дэнниэл, Эдди, Эгарт, Элдон, Эррик, Филдо, Файннан, Финнан, Франклин, Гаррет, Гарт, Гилберт, Гоб, Гарод, Гэрол, Айгор, Джаспер, Кэйт, Кевин, Лазам, Лэрри, Линдал, Лайл, Лаэл, Меррик, Микан, Майло, Моррин, Небин, Невил, Озборн, Освальд, Перрин, Поппи, Рид, Роско, Сэм, Шардон, Тай, Улмо, Веллби, Вендел, Веннер, Вес"
},
{
"name": "female",
"l": "Бри, Вани, Верна, Джиллиан, Китри, Кора, Кэлли, Лавиния, Лидда, Мерла, Недда, Паэла, Портия, Серафина, Трим, Шаэна, Эндри, Юфемия, Алаин, Эндри, Андри, Аннэ, Бэлла, Блоссом, Бри, Колли, Чена, Кора, Ди, Делл, Эйда, Эран, Ефемия, Георгина, Джинни, Хариет, Джасмин, Джиллиан, Джо, Китри, Лавиниа, Лидда, Мегпн, Мэриголд, Мила, Мирия, Недда, Никки, Нора, Оливия, Паэла, Перл, Пенни, Филомена, Портиа, Робби, Роуз, Сара, Серафина, Шаэна, Стэйси, Тавна, Тея, Трим, Вани, Верна, Веллта, Виллоу"
},
{
"name": "surname",
"l": "Эпплблосом, Бигхарт, Брайтмун, Брашгатер, Черричикс, Копперкеттл, Дипхолоу, Элдерберри, Фастфут, Фэтреббит, Голдфаунд, Гудбаррел, Гудерт, Гринботтл, Гринлиф, Хайхилл, Хиллтоппл, Хогколлар, Ханипот, Джемджар, Кеттлвисл, Лигэллоу, Литтлфут, Нимблфингерс, Порриджпот, Квикстеп, Ридфеллоу, Шэдуквик, Силверайс, Смусхэндс, Стоунбридж, Стаутбридж, Стаутмэн, Стронгбоунс, Санмедоу, Свифтвисл, Толлфеллоу, Тилиф, Тенпенни, Тистлтоп, Торнгэйдж, Тосскоббл, Андербот, Андерфут, Вормвотер, Виспермаус, Вайлбклоак, Вайлдхарт, Вайзакр"
},
{
"name": "surname2",
"type": "array",
"l": "Вверхтормашкин, Высокохолм, Галькоброс, Добробочка, Зеленофляг, Кустосбор, Лугодуг, Подветкин, Репейник, Чайнолист, Яблонецвет, Ярколун, Вишнещек, Быстроног, Добробочка, Высокохолм, Горшкомёд, Холмоверх, Мелконог, Шустрпалец, Быстроход, Тенескор, Среброглаз, Мягкорук, Камнемост, пивномост, Сильнокост, Солнцедол, Быстросвист, Дылдорост, Чайнолист, Галькоброс, Подног, Тепловод, Шептомышь, Дикочас"
}
]
}
]
},
{
"name": "aaracocra",
"title": "Ааракокры",
"list": [
{
"name": "normal",
"title": "Ааракокра",
"schemes": [
"uni"
],
"src": [
{
"name": "uni",
"l": "Айял, Аур, Аэра, Дикек, Зид, Икки, Ирк, Кваф, Квирк, Клик, Оор, Оус, Салик, Уррик, Хик"
}
]
}
]
}
]
goods2 = {
beverages: {
horrible:[
{
name: "Чашка воды",
type: "consumable",
img: "/modules/test_tube_merchant/assets/icon/goods/beverages/horrible/waterCup.png",
system: {
quantity: getRandomInt(200) + 10,
price:{
value: 1,
denomination: 'cp'
},
weight: {
value: 0.22,
units: "kg"
},
description: {
value: "Чистая и безупречная"
}
}
},
{
name: "Кружка дешёвой бурды",
type: "consumable",
img: "/modules/test_tube_merchant/assets/icon/goods/beverages/horrible/burda.png",
system: {
quantity: getRandomInt(150) + 15,
price:{
value: 2,
denomination: 'cp'
},
weight: {
value: 0.25,
units: "kg"
},
description: {
value: "Запах перегара не пройдёт до следующего короткого отдыха"
}
}
},
{
name: "«Эль Бездны»",
type: "consumable",
img: "/modules/test_tube_merchant/assets/icon/goods/beverages/horrible/burda.png",
system: {
quantity: getRandomInt(150) + 15,
price:{
value: 2,
denomination: 'cp'
},
weight: {
value: 0.25,
units: "kg"
},
description: {
value: "В брагу набросали всё, что было под рукой. Пахнет серой."
}
}
},
{
name: "Реповое вино",
type: "consumable",
img: "/modules/test_tube_merchant/assets/icon/goods/beverages/horrible/burda.png",
system: {
quantity: getRandomInt(150) + 15,
price:{
value: 2,
denomination: 'cp'
},
weight: {
value: 0.25,
units: "kg"
},
description: {
value: 'Более подходящее название, "забродивший реповый суп".'
}
}
},
{
name: "«Почти эль»",
type: "consumable",
img: "/modules/test_tube_merchant/assets/icon/goods/beverages/horrible/burda.png",
system: {
quantity: getRandomInt(150) + 15,
price:{
value: 2,
denomination: 'cp'
},
weight: {
value: 0.25,
units: "kg"
},
description: {
value: "Вы можете легко перепутать его с настоящим. Если никогда не пили ничего, кроме воды."
}
}
},
{
name: "Сальное пиво",
type: "consumable",
img: "/modules/test_tube_merchant/assets/icon/goods/beverages/horrible/burda.png",
system: {
quantity: getRandomInt(150) + 15,
price:{
value: 2,
denomination: 'cp'
},
weight: {
value: 0.25,
units: "kg"
},
description: {
value: "Настолько нефильтровано, что на дне остался подгнивший солод."
}
}
},
{
name: "Разбавленная медовуха",
type: "consumable",
img: "/modules/test_tube_merchant/assets/icon/goods/beverages/horrible/burda.png",
system: {
quantity: getRandomInt(150) + 15,
price:{
value: 2,
denomination: 'cp'
},
weight: {
value: 0.25,
units: "kg"
},
description: {
value: "Если сосредоточится, можно ещё почувствовать запах."
}
}
},
{
name: "Недодержанная брага",
type: "consumable",
img: "/modules/test_tube_merchant/assets/icon/goods/beverages/horrible/burda.png",
system: {
quantity: getRandomInt(150) + 15,
price:{
value: 2,
denomination: 'cp'
},
weight: {
value: 0.25,
units: "kg"
},
description: {
value: "Вонь уже есть, а градус еще не поднялся."
}
}
},
{
name: "Орочья настойка",
type: "consumable",
img: "/modules/test_tube_merchant/assets/icon/goods/beverages/horrible/burda.png",
system: {
quantity: getRandomInt(150) + 15,
price:{
value: 2,
denomination: 'cp'
},
weight: {
value: 0.25,
units: "kg"
},
description: {
value: "Выдержана на немытых сапогах."
}
}
},
{
name: "Эль «Плевок ангела»",
type: "consumable",
img: "/modules/test_tube_merchant/assets/icon/goods/beverages/horrible/burda.png",
system: {
quantity: getRandomInt(150) + 15,
price:{
value: 2,
denomination: 'cp'
},
weight: {
value: 0.25,
units: "kg"
},
description: {
value: "Там плавает муха и ещё что-то, что заставляет вас сомневаться в существовании Бога."
}
}
},
{
name: '"Тайный микс"',
type: "consumable",
img: "/modules/test_tube_merchant/assets/icon/goods/beverages/horrible/secret_mix.png",
system: {
quantity: getRandomInt(150) + 15,
price:{
value: 3,
denomination: 'cp'
},
weight: {
value: 0.27,
units: "kg"
},
description: {
value: "Перемешанные остатки недопитого пойла"
}
}
},
{
name: "Эконом-грог",
type: "consumable",
img: "/modules/test_tube_merchant/assets/icon/goods/beverages/horrible/burda.png",
system: {
quantity: getRandomInt(50) + 5,
price:{
value: 3,
denomination: 'cp'
},
weight: {
value: 0.23,
units: "kg"
},
description: {
value: "Сильно разбавленный ром на лимонной кожуре"
}
}
}
]
}
}
description = {
сharacter : [
'Я готов каждого заключить в теплые объятия.',
'Я гораздо умнее чем большинство людей.',
'Я часто готов обменять свой товар на что-то ценное вместо монет.',
'Я категорически не доверяю авантюристам.',
'Для ведения бизнеса не обязательно быть приветливым.',
'Постоянные клиенты – мои лучшие друзья.',
'Я могу торговаться весь день, пока у тебя уши не отвалятся.',
'Я убежден, что мое природное обаяние привлекает клиентов.',
'Я сноб, свысока смотрящий на тех, кто не может оценить изящное искусство.',
'У меня много остроумных афоризмов и есть пословицы на любой случай.',
'О своей профессии я могу говорить часами.',
'Благодаря работе я прославился, и хочу, чтобы все это ценили. Меня всегда потрясает, когда другие говорят, что не слышали обо мне.',
'Мне не нравятся споры о цене. Скажи сразу, за сколько ты готов купить.',
'Я часто шучу, чтобы разрядить атмосферу.',
'Я любую тему разговора перевожу в рекламу товара.',
'Я всегда пытаюсь найти новое прибыльное дело. Я не вылезаю из книг и журналов учёта.',
'Я люблю золото, но ещё больше я люблю людей.',
'Я всегда оцениваю в уме встреченные предметы. И людей тоже.',
"Обмен идеями с умными людьми для меня важнее, чем простая торговля.",
"Я всегда стараюсь найти уникальные способы продвижения своих товаров и услуг.",
"Я ценю время, свое и других, и не терплю задержек или некомпетентности.",
],
ideal : [
'Торговля. Свободный обмен – величайший мировой балансир. (Закон)',
'Монополия. Подмывание репутации соперников и взвинчивание цен – единственный способ вырваться вперед. (Зло)',
'Продажи. Я могу продать абсолютно все. Моя лошадь, моя мать – все имеет цену. (Хаос)',
'Благотворительность. Я стараюсь делать скидки и бесплатные образцы тем, кто действительно нуждается. (Добро)',
'Завершённость. Возвраты не принимаются. Никогда. (Любое)',
'Наслаждение. Покупка и продажа – интересная игра, в которую я обожаю играть. (Любое)',
'Община. Я занимаюсь делом ради тех, кто живёт рядом. Я лишь хочу создать уютный дом для всех (Добро)',
'Приключение. Поиски выгодных товаров — это лишь повод отправиться в очередное путешествие, каким бы опасным оно ни было (Хаос)',
'Порядок. В продажах важно то, как ты себя подашь. Клиенты уважают стиль, качество и педантичность. (Закон)',
'Традиция. Я делаю это, чтобы продолжить долгую традицию нашей семьи торговцев (Любое)',
'Честность. Всегда соблюдаю слово и гарантирую, что клиенты получают то, за что платят. (Закон)',
'Уважение к культуре. Стремлюсь поддерживать традиции и обычаи каждого народа, откуда поступают товары. (Закон)',
'Справедливость. Я продаю по разумным ценам, невзирая на расовые и социальные предрассудки. (Добро)',
'Новаторство. Я Ищу уникальные товары и дополнения, чтобы удивлять клиентов и развивать свой бизнес. (Любое)',
'Сообщество. Помогаю местным жителям, поддерживаю малых производителей и развиваю экономику своего региона. (Добро)',
'Авантаж. Все действия направлены на максимизацию личной выгоды, даже если это вредит другим. (Зло)',
'Манипуляция. Использую обман и хитрость, чтобы заставить клиентов платить больше или брать ненужные товары. (Зло)',
'Отношение к власти. Стремлюсь к власти и влиянию через торговлю, готов прибегнуть к запугиванию или шантажу. (Зло)',
], ///
flaw : [
'Большая часть моих денег тратится еженощно в таверне.',
'Я не уверен, что у моего товара действительно Хорошее качество.',
'Если кто-то сделает цену ниже моей, я перережу ему горло.',
'Я подделываю деньги, смешивая их с реальными, и отдаю на сдачу клиентам.',
'Я никогда не знаю когда нужно отступить, и я отказываюсь терять клиентов.',
'Мне трудно уважать того, кто ничего не знает о том, что я продаю.',
'Я всегда соглашаюсь на предложение, которое слишком выгодно, чтобы быть правдой. Я верю, что в любом случае окажусь в выйгрыше.',
'Я терпеть не могу безкорыстную щедрость. Я презираю и тех, кто её проявляет, и тех, кто ею пользуется.',
'Если что-то потеряет для меня ценность, я без сожалений тут же расстанусь с ним.',
],
store_features : [
'К каждой покупке прилагается бесплатная кружка эля! Пьяный покупатель — счастливый покупатель!',
'МНЕ ТАК НРАВЯТСЯ МОИ ТОВАРЫ, ЧТО Я МОГУ ВЫРАЗИТЬ ЭНТУЗИАЗМ ТОЛЬКО КРИКОМ!',
'Я говорю так быстро, что у вас не будет времени возвразить.',
'Плакаты! Яркие цвета! Местный бард! В моём магазине есть всё.',
'Я сам разработал и сшил костюм маскота для магазина, чтобы привлекать покупателей или отпугивать детей. Может быть и то, и другое.',
'Я исполняю фокусы (неволшебные), чтобы привлечь внимание покупателей.',
'Похоже, что моя лавка принадлежит совершенно другому биому или части мира.',
'Я пытаюсь привлечь местных исполнителей, чтобы мой магазинчик был популярным и модным местом.',
'Я пытаюсь сделать так, чтобы мой магазин и я казались очень таинственными, хотя это не так.',
'У меня есть абсурдная фирменная фраза, которую я повторяю как можно чаще.',
],
Willingness_to_bargain : [
'"Мои цены неизменны". Откажется торговаться.',
'"Только если ты мне очень понравишься". СЛ 25 Скидка: 10%',
'"Я могу снизить цены, если понадобится". СЛ 18 Скидка: 15%',
'"Я известен за свои выгодные предложения!" СЛ 15 Скидка: 20%',
'"Предложение такое хорошее, что даже подозрительно". СЛ 13 Скидка: 25%',
'"Просто забирайте и не спрашивайте!" СЛ 11 Скидка: 30%',
],
// ----------------
introduction : [
'Вы встретили',
'Вы увидели',
'Вы повстречали',
'Вы приметили',
],
age_gender : {
'male': {
'kid': [
'мальчика',
'мальчика-подростка',
],
'adult': [
'молодого парня',
'взрослого мужчину',
],
'old': [
'пожилого мужчину',
'престарелого мужчину'
]
},
'female': {
'kid': [
'девочку',
'девочку-подростка',
],
'adult': [
'молодую девушку',
'взрослую женщину',
],
'old': [
'пожилую женщину',
'престарелую женщину'
]
},
'complicated': {
'kid': [
'ребёнка',
'подростка',
],
'adult': [
'молодого путника',
'взрослого путника',
],
'old': [
'пожилого путника',
'престарелого путника'
]
}
},
pronoun_gender : {
'male': 'Он',
'female': 'Она',
'complicated': 'Он'
},
// ----------------
pronoun_gender_genitive : {
'male': 'его',
'female': 'её',
'complicated': 'его'
},
habits : [
'Насвистывает что-то',
'Что-то мычит',
'Говорит рифмами',
'Говорит белым стихом',
'Избегает зрительного контакта',
'говорит с акцентом',
'Часто использует выдуманные слова',
'Любит произносить громкие клятвы',
'Обожает каламбуры и игру слов',
'Часто предрекает неудачи',
'Вспоминает богов через каждое слово',
'Нервно дёргается и оглядывается',
'Регулярно чихает',
'Отстранённо глядит вдаль',
'Постоянно что-то жуёт',
'Ходит из угла в угол',
'Раскачивается на месте',
'Барабанит пальцами',
'Покусывает ногти',
'Накручивает на палец волосы',
'Часто кашляет',
'Использует слова-паразиты',
'Жутко сквернословит',
'Комментирует каждую фразу собеседника',
'Игриво подмигивает',
'Компульсивно моргает и жмурится',
'Перебивает',
'Делает пометки в книжке о каждом слове',
'Говорит о себе от третьего лица',
'Постоянно почесывается',
'Осматривает и оправляет свою одежду',
'Хрустит суставами',
'Поглаживает руки',
'Ковыряется в зубах',
'Постоянно упоминает родственников',
'Часто сплевывает',
'имеет нервный тик',
'Активно жестикулирует',
'Покусывает губы',
'Любит пошутить',
'Причмокивает перед каждой фразой',
'Повторяет каждую мысль по два раза',
'Оценивает одежду и снаряжение собеседника',
'Постоянно забывает конец предложения',
'Минимум слов',
'Любит поддакивать и соглашаться',
'Любит заключать пари',
'Любит поправлять и уточнять',
'Часто повторяет имя собеседника',
'Показательно вежлив ',
'Постоянно извиняется и просит прощения',
'Чрезвычайно расслаблен',
'Игнорирует имена, использует прозвища',
'Часто цитирует правила и обычаи',
'Говорит заумными большими словами',
'Легко отвлекается',
'Любит упоминать статистику',
'Нюхает почти всё, что находится в руках',
'Пробует на вкус почти всё, что находится в руках',
'Навязчиво вытирает и прочищает вещи',
'Озвучивает свои эмоции',
'Имеет фирменную фразу',
'Бессознательно повторяет последнее слово, произнесённое собеседником',
'Упоминает встреченных знаменитостей',
'Объясняет очевидные вещи.',
'Избегает любого физического контакта',
'Настороженно следит за собеседниками',
'Пользуется долгими предложениями',
'Прикладывается к фляжке',
'Отвечает на любой вопрос вопросом',
'Ведёт себя надменно и презрительно',
'Ведёт себя улыбчиво и добродушно',
'Говорит восторженно',
'Использует метафоры и сравнения',
'…Отвечает только после паузы',
'Стучит зубами каждый раз, когда думает',
'Держит голову на боку',
'Зловеще улыбается',
'Прикрывает рот',
'использует в порядке непривычном слова',
'Не проявляет эмоции',
'Ухмыляется, но только половиной лица',
'Слушает с закрытыми глазами',
'Имеет подвижные и выразительные брови',
'Приглаживает волосы',
'Цокает языком',
'Причмокивает',
'Осматривает ногти',
'Не отпускает оружие',
'Постоянно осматривается',
'Издает сухие смешки',
'Крутит кольцо',
'Крутит браслет',
'Поправляет очки',
'Шмыгает носом',
'Шаркает ногой',
'Не может стоять ровно',
'Не знает язык. Общается жестами',
'Не знает язык. Общается через помощника',
],
habits_fmale : [
'Немая. Общается жестами',
'Немая. Общается через помощника',
],
habits_male : [
'Дёргает бороду',
'Держит руку на промежности',
'Немой. Общается жестами',
'Немой. Общается через помощника',
],
type_features : [
'Украшение',
'Пирсинг',
'Одежда',
'Осанка',
'Кожа',
'Нос',
'Пальцы',
'Руки',
'Глаза',
'Тату',
'Зубы',
'Ногти',
'Причёска',
'Макияж',
'Брови',
'Калека',
'Уши',
'Шрамы',
'Рот',
'Рост',
'Потоотделение',
'Внешность',
'Запах',
],
type_features_male : [
'Борода',
],
features : {
"Украшение": [
"Необычные серьги",
"Необычное ожерелье",
"Необычный кулон",
"Необычный браслет",
"Необычные браслеты",
"Необычное кольцо",
"Необычные {запонки|пуговицы}",
"Необычное ожерелье",
"Необычный венец",
"необычная заколка",
"необычная цепь",
],
"Пирсинг": [
"Пирсинг в ухе",
"Пирсинг в обоих ушах",
"Пирсинг в носу",
"Пирсинг в губе",
"Пирсинг в брови",
"Пирсинг в подбородке",
],
"Одежда": [
'Идеально чистая ухоженная одежда',
'Грязная порванная одежда',
'Официальная одежда',
'Официальная форма',
'Одежда одного яркого цвета',
'Одежда с сочетанием двух ярких цветов',
'Одежда из мешанины множества цветов',
],
"Осанка": [
'Дворянская осанка',
'Военная выправка',
'Неправильная осанка',
'Ссутулившаяся фигура',
'Горбатая фигура',
],
'Кожа': [
'Бородавки',
'Прыщи',
'Фурункулы',
'Следы ужасной болезни на лице',
'Шелушащаяся кожа',
'Слезающая кожа',
'Покрытая следами оспы кожа',
'Необычный цвет кожи',
'Приметная родинка',
'Родимые пятна',
],
"Нос": [
'Большой нос',
'Курносый нос',
'Неправильно сросшийся после перелома нос',
'Горбатый орлиный нос',
'Крючковатый нос',
'Крохотный нос',
],
"Пальцы": [
'Длинные тонкие пальцы',
'Короткие пухлые пальцы',
'Шестой палец на руке',
'Парализованные пальцы',
'Перепонки на руках',
'Неправильно сросшиеся после перелома пальцы',
],
"Руки": [
'Грязные руки',
'Мозолистые руки',
'Мягкие холеные руки',
'Длинные руки',
'Огромные ладони',
'Влажные ладони',
'Волосатые руки',
],
"Глаза": [
'Повязка на глаз',
'Стеклянный глаз',
'Очки',
'Монокль',
'Нет одного лаза',
'Косоглазие',
'Глаза разного цвета',
'Большие выразительные глаза',
'Глаза необычного цвета',
'Впалые глаза',
'Выпученные глаза',
],
"Тату": [
'Татуировка на видном месте',
'Несколько татуировок',
'Татуировки по всему телу',
'Светящаяся татуировка',
'Анимированная татуировка',
'Татуировка-надпись',
],
"Зубы" : [
'Идеально белые зубы',
'Желтые зубы',
'Гнилые зубы',
'Отсутствие зубов',
'Искусственные зубы',
'Отсутствие переднего зуба',
'Деревянные зубы',
'Кривые зубы',
'Лошадиные зубы',
'Крохотные зубы',
'Острые зубы',
],
"Ногти": [
'Грязные ногти',
'Начищенные ногти',
'Длинные ногти',
'Длинные когти',
'Отсутствующие ногти',
'Накрашенные ногти',
'Болезненные ногти',
'Накращенные ногти',
],
"Причёска": [
'Чёлка, закрывающая половину лица,',
'Очень длинные волосы',
'Очевидно крашенные волосы',
'Неестественный цвет волос',
'Дреды',
'Лысая голова',
'Бритая голова',
'Проплешина',
'Вьющиеся волнистые волосы',
'Забавные кудряшки',
'У головы обриты бока',
'Растрепанные волосы',
'Волосы собраны в изысканную прическу ',
'Короткие волосы под горшок',
'Зализанные волосы',
'Жидкие волосы',
'Пышные волосы',
'Крашенные волосы',
],
"Борода": [
'Огромные бакенбарды',
'Примечательная борода',
'Крашенная борода',
'Заплетённые в косы волосы',
'Заметные усы',
'Крашенные усы',
'Неравномерная щетина',
'Двойной подбородок',
'Тройной подбородок',
],
"Макияж": [
'Необычный макияж',
'Разукрашенное лицо',
],
"Брови": [
'Очень густые брови',
'На удвиление тонкие брови',
'Сросшиеся брови',
'Отсутствие бровей',
'Перья на месте бровей',
'Тонкий шрам поперек брови',
],
"Калека": [
'Отсутствующий палец',
'Повреждённый палец',
'Искусственный палец',
'Отсутствующие пальцы',
'Повреждённые пальцы',
'Искусственные пальцы',
'Отсутствующая кисть',
'Повреждённая кисть',
'Искусственная кисть',
'Отсутствующая нога',
'Повреждённая нога',
'Искусственная нога',
'Отсутствующая рука',
'Повреждённая рука',
'Искусственная рука',
'Отсутствующие ноги',
'Повреждённые ноги',
'Искусственные ноги',
'Серьезные телесные деформации',
'Серьезные телесные мутации',
],
"Уши": [
'Маленькие уши',
'Большие уши',
'Отсутствует одно ухо',
'Длинные свисающие мочки ушей',
'Оттопыренные уши',
'Вялые уши',
],
"Шрамы": [
'Большой шрам на лице',
'Лицо в шрамах',
'Шрам на шее',
'Все тело в шрамах',
'Шрам-метка на предплечье',
'Руки в шрамах',
],
"Рот": [
'Заячья губа',
'Тонкие губы',
'Широкий рот',
'Пухлые губы',
'Безгубый рот',
'постоянно открытый рот',
'Парализованная половина лица',
],
'Рост': [
'Очень высокий рост',
'Очень низкий рост',
],
"Потоотделение": [
'Обильное потоотделение',
'Плохое дыхание',
],
"Внешность": [
'Красота',
'Уродство',
],
"Запах": [
'Приятный аромат',
'Чарующий аромат',
'Странный аромат',
'Жуткая вонь',
'Слабая вонь',
'Подозрительная вонь',
'Странная вонь',
]
}
}
goods = {
horrible: {
bars: {
beers: [
{
name: 'Эконом-грог',
price: 3,
denomination: 'cp',
weight: 0.23,
quantity: '1d3 * 100 + 1d100',
description: 'Сильно разбавленный ром на лимонной кожуре'
},
{
name: '"Тайный микс"',
price: 3,
denomination: 'cp',
weight: 0.23,
quantity: '1d3 * 100 + 1d100',
description: 'Перемешанные остатки недопитого пойла.'
},
{
name: 'Эль «Плевок ангела»',
price: 3,
denomination: 'cp',
weight: 0.23,
quantity: '1d3 * 100 + 1d100',
description: 'Там плавает муха и ещё что-то, что заставляет вас сомневаться в существовании Бога.'
},
{
name: 'Орочья настойка',
price: 3,
denomination: 'cp',
weight: 0.23,
quantity: '1d3 * 100 + 1d100',
description: 'Выдержана на немытых сапогах.'
},
{
name: 'Недодержанная брага',
price: 3,
denomination: 'cp',
weight: 0.23,
quantity: '1d3 * 100 + 1d100',
description: 'Вонь уже есть, а градус еще не поднялся.'
},
{
name: 'Разбавленная медовуха',
price: 3,
denomination: 'cp',
weight: 0.23,
quantity: '1d3 * 100 + 1d100',
description: 'Если сосредоточится, можно ещё почувствовать запах.'
},
{
name: 'Сальное пиво',
price: 3,
denomination: 'cp',
weight: 0.23,
quantity: '1d3 * 100 + 1d100',
description: 'Настолько нефильтровано, что на дне остался подгнивший солод.'
},
{
name: '«Почти эль»',
price: 3,
denomination: 'cp',
weight: 0.23,
quantity: '1d3 * 100 + 1d100',
description: 'Вы можете легко перепутать его с настоящим. Если никогда не пили ничего, кроме воды.'
},
{
name: 'Реповое вино',
price: 3,
denomination: 'cp',
weight: 0.23,
quantity: '1d3 * 100 + 1d100',
description: 'Более подходящее название, "забродивший реповый суп".'
},
{
name: '«Эль Бездны»',
price: 3,
denomination: 'cp',
weight: 0.23,
quantity: '1d3 * 100 + 1d100',
description: 'В брагу набросали всё, что было под рукой. Пахнет серой.'
},
{
name: 'Кружка дешёвой бурды',
price: 3,
denomination: 'cp',
weight: 0.23,
quantity: '1d3 * 100 + 1d100',
description: 'Запах перегара не пройдёт до следующего короткого отдыха.'
}
]
},
animals: {
},
books: {
},
flowers: {
},
food: {
},
furniture: {
},
fashion: {
},
jewelry: {
},
trinkets: {
},
skin: {
},
mechanical: {
},
armor: {
},
potions: {
},
religious: {
},
songs: {
},
scrolls: {
},
thieves: {
},
tools: {
},
transport: {
},
weapon: {
}
},
bad: {
bars: {
tea: [
{
name: 'Песочная ягода',
price: 3,
denomination: 'cp',
weight: 0.23,
quantity: '1d3 * 10 + 1d10',
description: 'Сильный запах, горький и кислотный, но пить больше не хочется.'
},
{
name: 'Талкут',
price: 3,
denomination: 'cp',
weight: 0.23,
quantity: '1d3 * 10 + 1d10',
description: 'Металлический привкус и сероватый свет; на любителя.'
},
{
name: 'Полыневый чай',
price: 3,
denomination: 'cp',
weight: 0.23,
quantity: '1d3 * 10 + 1d10',
description: 'Очень горький зелёный чай, вызывает аппетит'
},
{
name: 'Скидр',
price: 3,
denomination: 'cp',
weight: 0.23,
quantity: '1d3 * 10 + 1d10',
description: 'Слабый угольный вкус, оставляет тёмный осадок на зубах, но полезен для живота.'
},
{
name: 'Морской бриз',
price: 3,
denomination: 'cp',
weight: 0.23,
quantity: '1d3 * 10 + 1d10',
description: 'Холодный солёный чай с долькой лимона.'
},
{
name: 'Красный дух',
price: 3,
denomination: 'cp',
weight: 0.23,
quantity: '1d3 * 10 + 1d10',
description: 'Ярко бордовый цвет, с остринкой. Подаётся очень горячим.'
},
{
name: 'Лесной намёк',
price: 3,
denomination: 'cp',
weight: 0.23,
quantity: '1d3 * 10 + 1d10',
description: 'Листья дикорастующих ягод, залитые кипятком.'
},
{
name: 'Воуг',
price: 3,
denomination: 'cp',
weight: 0.23,
quantity: '1d3 * 10 + 1d10',
description: 'Травянистый и немного солёный чай, обладающий слабым, но приятным вкусом'
}
]
},
animals: {
},
books: {
},
flowers: {
},
food: {
},
furniture: {
},
fashion: {
},
jewelry: {
},
trinkets: {
},
skin: {
},
mechanical: {
},
armor: {
},
potions: {
},
religious: {
},
songs: {
},
scrolls: {
},
thieves: {
},
tools: {
},
transport: {
},
weapon: {
}
},
medium: {
bars: {
beers: [
{
name: 'Сидр, "Ноголом"',
price: 8,
denomination: 'cp',
weight: 0.23,
quantity: '1d3 * 100 + 1d100',
description: 'Крепкий яблочный сидр; немного мутный, с сильным кисло-сладким вкусом.'
}
],
tea: [
{
name: 'Авлат',
price: 1,
denomination: 'sp',
weight: 0.23,
quantity: '1d3 * 10 + 1d10',
description: 'Травяной чай медного цвета с добавлением перца.'
},
{
name: 'Черношип',
price: 1,
denomination: 'sp',
weight: 0.23,
quantity: '1d3 * 10 + 1d10',
description: 'Травяной час с ярким земляным ароматом, который может успокоить разошедшийся желудок.'
},
{
name: "Гаэт'ад",
price: 1,
denomination: 'sp',
weight: 0.23,
quantity: '1d3 * 10 + 1d10',
description: 'Густой и солоноватый, может быть отчасти психоактивным.'
},
{
name: 'Желтолист',
price: 1,
denomination: 'sp',
weight: 0.23,
quantity: '1d3 * 10 + 1d10',
description: 'Очень крепкий чай бледно жёлтого цвета, способный выводить пятна с одежды.'
},
{
name: 'Чернокорень таль',
price: 1,
denomination: 'sp',
weight: 0.23,
quantity: '1d3 * 10 + 1d10',
description: 'Горьковатый вкус корицы, подаётся с горячим мёдом.'
},
{
name: 'Милиан таль',
price: 1,
denomination: 'sp',
weight: 0.23,
quantity: '1d3 * 10 + 1d10',
description: 'Пурпурный час со вкусом лакрицы, подаётся холодным.'
},
{
name: 'Дикий имбирь',
price: 1,
denomination: 'sp',
weight: 0.23,
quantity: '1d3 * 10 + 1d10',
description: 'Пряный и сладкий; успокаивает желудок.'
}
],
wine: [
{
name: 'Кровавое вино',
price: getRandomInt(3) + 7,
denomination: 'sp',
weight: 0.23,
quantity: '1d3 * 5 + 1d5',
description: 'Красное; яркий вкус с медным привкусом; излюбленный напиток некромантов.'
},
{
name: 'Огненное вино',
price: getRandomInt(3) + 7,
denomination: 'sp',
weight: 0.23,
quantity: '1d3 * 5 + 1d5',
description: 'Красное; очень крепкое и пряное, простолюдины его обожают.'
}
]
},
animals: {
},
books: {
},
flowers: {
},
food: {
},
furniture: {
},
fashion: {
},
jewelry: {
},
trinkets: {
},
skin: {
},
mechanical: {
},
armor: {
},
potions: {
},
religious: {
},
songs: {
},
scrolls: {
},
thieves: {
},
tools: {
},
transport: {
},
weapon: {
}
},
good: {
bars: {
beers: [
{
name: 'Медовуха',
price: 1,
denomination: 'sp',
weight: 0.23,
quantity: '1d3 * 100 + 1d100',
description: 'Популярное пряное медовое вино.'
},
{
name: 'Медовуха, тейская',
price: 3,
denomination: 'sp',
weight: 0.23,
quantity: '1d3 * 100 + 1d100',
description: 'Привезённая издалека медовуха с пряностями джунглей.'
},
{
name: 'Настойка, десмоду',
price: 1,
denomination: 'sp',
weight: 0.23,
quantity: '1d3 * 100 + 1d100',
description: 'Излюбленный напиток Подземья.'
},
{
name: 'Ром',
price: 8,
denomination: 'gp',
weight: 0.23,
quantity: '1d3 * 2 + 1d2',
description: ''
}
],
tea: [
{
name: 'Чалторн',
price: getRandomInt(4) + 3,
denomination: 'gp',
weight: 0.23,
quantity: '1d3 * 10 + 1d10',
description: 'Суховатый, с привкусом мела, позволяет не чувствовать острые блюда.'
},
{
name: 'Земное око',
price: getRandomInt(4) + 3,
denomination: 'gp',
weight: 0.23,
quantity: '1d3 * 10 + 1d10',
description: 'Чёрный чай; увеличивает скорость на 5 футов на 1 час.'
},
{
name: "Жетур",
price: getRandomInt(4) + 3,
denomination: 'gp',
weight: 0.23,
quantity: '1d3 * 10 + 1d10',
description: 'Пурпурный цвет, пикантный вкус; избавляет от опьянения на 2 часа.'
},
{
name: 'Долгозвон',
price: getRandomInt(4) + 3,
denomination: 'gp',
weight: 0.23,
quantity: '1d3 * 10 + 1d10',
description: 'Зелёный чай; даёт сопротивление к урону ядом на 1 час.'
},
{
name: 'Мейрат',
price: getRandomInt(4) + 3,
denomination: 'gp',
weight: 0.23,
quantity: '1d3 * 10 + 1d10',
description: 'Вкус цитрусовых и манго; популярен среди богачей.'
},
{
name: 'Бледный нефрит',
price: getRandomInt(4) + 3,
denomination: 'gp',
weight: 0.23,
quantity: '1d3 * 10 + 1d10',
description: 'Белый чай; лёгкий и воздушный.'
}
],
wine: [
{
name: 'Арабельское сухое',
price: getRandomInt(7) + 9,
denomination: 'gp',
weight: 0.23,
quantity: '1d3 * 5 + 1d5',
description: 'Красное; очень сухое, с древесными и ягодными нотками.'
},
{
name: 'Бердусканское тёмное',
price: getRandomInt(7) + 9,
denomination: 'gp',
weight: 0.23,
quantity: '1d3 * 5 + 1d5',
description: 'Красное; почти чёрное, со сладким вкусом, душистое и очень крепкое.'
},
{
name: 'Светопламя',
price: getRandomInt(7) + 9,
denomination: 'gp',
weight: 0.23,
quantity: '1d3 * 5 + 1d5',
description: 'Чартеузское; слегка светится и пахнет летними грушами.'
},
{
name: 'Саэрлунское особое',
price: getRandomInt(7) + 9,
denomination: 'gp',
weight: 0.23,
quantity: '1d3 * 5 + 1d5',
description: 'Красное; сложная палитра, с ароматами малины и клубники.'
},
{
name: 'Саэрлунский топаз',
price: getRandomInt(7) + 9,
denomination: 'gp',
weight: 0.23,
quantity: '1d3 * 5 + 1d5',
description: 'Белое; сухое с неожиданными нотами ореха и фруктовыми тонами.'
},
{
name: 'Зимнее вино',
price: getRandomInt(7) + 9,
denomination: 'gp',
weight: 0.23,
quantity: '1d3 * 5 + 1d5',
description: 'Красное дессертное вино сине-пурпурного цвета, сладкое и пряное.'
},
],
whiskey: [
{
name: 'Бренди',
price: 5,
denomination: 'gp',
weight: 0.23,
quantity: '1d3 * 4 + 1d4',
description: ''
},
{
name: 'Виски',
price: 5,
denomination: 'sp',
weight: 0.23,
quantity: '1d3 * 4 + 1d4',
description: ''
},
{
name: 'Водка',
price: 8,
denomination: 'gp',
weight: 0.23,
quantity: '1d3 * 4 + 1d4',
description: ''
},
{
name: 'Самогон',
price: 3,
denomination: 'gp',
weight: 0.23,
quantity: '1d3 * 4 + 1d4',
description: 'Помеха на спасбросок против интоксикации.'
}
],
cofee: [
{
name: 'Горячий шоколад',
price: 5,
denomination: 'gp',
weight: 0.23,
quantity: '1d3 * 5 + 1d5',
description: ''
},
{
name: 'Кофе',
price: 2,
denomination: 'gp',
weight: 0.23,
quantity: '1d3 * 5 + 1d5',
description: ''
},
]
},
animals: {
},
books: {
},
flowers: {
},
food: {
},
furniture: {
},
fashion: {
},
jewelry: {
},
trinkets: {
},
skin: {
},
mechanical: {
},
armor: {
},
potions: {
},
religious: {
},
songs: {
},
scrolls: {
},
thieves: {
},
tools: {
},
transport: {
},
weapon: {
}
},
beautiful: {
bars: {
whiskey: [
{
name: "Текила",
price: 8,
denomination: 'gp',
weight: 0.23,
quantity: '1d3 * 4 + 1d4',
description: ''
},
],
cofee: [
{
name: 'Кофе, дварфский',
price: 15,
denomination: 'gp',
weight: 0.23,
quantity: '1d3 * 2 + 1d2',
description: 'Выпитая чашка: иммунитет ко сну на 8 часов.'
}
],
tea:[
{
name: 'Чай, пророческий',
price: 20,
denomination: 'gp',
weight: 0.23,
quantity: '1d3 * 2 + 1d2',
description: 'Листья на дне чашки предрекают будущее.'
}
]
},
animals: {
},
books: {
},
flowers: {
},
food: {
},
furniture: {
},
fashion: {
},
jewelry: {
},
trinkets: {
},
skin: {
},
mechanical: {
},
armor: {
},
potions: {
},
religious: {
},
songs: {
},
scrolls: {
},
thieves: {
},
tools: {
},
transport: {
},
weapon: {
}
}
}
async newMerchant(tokens, merchantItemsTypes, categoriesTypes){
let compendiumsNames = [];
const compendiums = game.packs.map(pack => {
return {
name: pack.metadata.label,
collection: pack.collection,
entities: pack.index.size
};
});
for (const compendium of compendiums) {
const pack = game.packs.get(compendium.collection);
if (pack.metadata.type === "Item") {
compendiumsNames.push(compendium.collection)
}
}
for ( let token of tokens ){
await this.makeMerchantActor(token, compendiumsNames, [merchantItemsTypes, categoriesTypes])
}
}
async editMerchant(tokens, merchantItemsTypes, categoriesTypes){
for ( let token of tokens ){
if (token.actor.type != "npc") {
ui.notifications.error('Выберите персонажа мастера')
return
}
token.actor.deleteEmbeddedDocuments("Item", token.actor.items.map(item => item.id));
await this.makeItem(token.actor, categoriesTypes.value, merchantItemsTypes.value, 7);
ItemPiles.API.turnTokensIntoItemPiles(token, { pileSettings: {
"enabled": true,
"infiniteCurrencies": false,
"type": "merchant"
}
});
}
}
async randomMerchant(tokens, merchantItemsTypes, categoriesTypes, itemsTypes){
let compendiumsNames = await this.setCompendiumNames();
for ( let token of tokens ){
let categories = this.randomLevel();
let types = this.randomTypes(itemsTypes);
categoriesTypes.value = categories;
merchantItemsTypes.value = types;
await this.makeMerchantActor(token, compendiumsNames, [merchantItemsTypes, categoriesTypes]);
}
}
diceCategories(dice){
if (dice === 1){
return "horrible";
}else if (dice > 1 && dice < 5){
return "bad";
}else if (dice > 4 && dice < 8){
return "medium";
}else if (dice > 7 && dice < 11){
return "good";
}else{
return "beautiful";
}
}
async randomLevelWithDice(){
let categories = {
"horrible": "Ужасный",
"bad": "Плохой",
"medium": "Средний",
"good": "Хороший",
"beautiful": "Прекрасный"
}
let roll = new Roll(`1d12`);
let result = await roll.roll();
let dice = roll.total;
let category = this.diceCategories(dice);
await result.toMessage({
speaker: game.users.find(user => user.isGM).id,
whisper: [game.users.find(user => user.isGM).id],
flavor: `Выпало ${dice}, а значит ваша категория ${categories[category]}`
}, {rollMode: "BLIND"});
return category;
}
randomLevel(){
let dice = getRandomInt(12) + 1;
let category = this.diceCategories(dice);
return category;
}
async randomTypesWithDice(types){
let roll = new Roll(`1d100`);
let result = await roll.roll();
let dice = roll.total;
let typesKeys = Object.keys(types);
let tempDice = 100 / (typesKeys.length - 1);
let resultDice = Math.round(dice / tempDice);
let type = typesKeys[resultDice];
await result.toMessage({
speaker: game.users.find(user => user.isGM).id,
whisper: [game.users.find(user => user.isGM).id],
flavor: `Выпало ${dice}, а значит ваш тип ${types[type]}`
}, {rollMode: "BLIND"});
return type;
}
randomTypes(types){
let dice = getRandomInt(100) + 1;
let typesKeys = Object.keys(types);
let tempDice = (typesKeys.length - 1);
let resultDice = Math.round(dice / tempDice);
let type = typesKeys[resultDice];
return type;
}
makeMerchant(token, name, imgToken, imgPortrait, description, details){
token.document.update({
name: name,
texture: {
src: imgToken
}
});
let actor = game.actors.get(token.actor.id)
actor.update({
prototypeToken:{
name: name,
texture: {
src: imgToken
}
},
name: name,
img: imgPortrait,
system: {
details: details,
attributes:{
encumbrance:{
max : 9000
}
}
},
flags: {
"item-piles":{
data:{
enabled: true,
infiniteCurrencies: false,
merchantImage: imgPortrait,
type: "merchant",
description: description
}
}
},
});
ItemPiles.API.turnTokensIntoItemPiles(token, { pileSettings: {
"enabled": true,
"infiniteCurrencies": false,
"merchantImage": imgPortrait,
"type": "merchant",
"description": description
}
});
}
async setCompendiumNames(){
let compendiumsNames = [];
const compendiums = game.packs.map(pack => {
return {
name: pack.metadata.label,
collection: pack.collection,
entities: pack.index.size
};
});
for (const compendium of compendiums) {
const pack = game.packs.get(compendium.collection);
if (pack.metadata.type === "Item") {
compendiumsNames.push(compendium.collection)
}
}
return compendiumsNames;
}
async makeMerchantActor(token, compendiumsNames, categoriesData){
const [merchantItemsTypesData, categoriesTypesData] = categoriesData;
if (token.actor.type != "npc") {
ui.notifications.error('Выберите персонажа мастера')
return
}
token.document.actorLink = true;
await token.actor.deleteEmbeddedDocuments("Item", token.actor.items.map(item => item.id));
let name = '';
let raceNum = getRandomInt(this.names.length);
let subRaceNum = getRandomInt(this.names[raceNum].list.length);
let names = this.names[raceNum].list[subRaceNum];
let raceName = this.names[raceNum].list[subRaceNum].title;
let age = ['kid', 'adult', 'old'][getRandomInt(3)]
let done = false;
for ( let raceCompendium of compendiumsNames){
for (let race of game.packs.get(raceCompendium).index){
if (race.type == "race" && race.name == raceName){
race.flags = {'item-piles':{item: {hidden: true}}};
await token.actor.createEmbeddedDocuments("Item", [race]);
done = true;
break;
}
}
if (done) break;
}
let merchantItemsTypes = merchantItemsTypesData.value;
let categoriesTypes = categoriesTypesData.value;
let merchantItemsText = merchantItemsTypesData.querySelector('option:checked').text;
let categoriesText = categoriesTypesData.querySelector('option:checked').text;
await this.makeItem(token.actor, categoriesTypes, merchantItemsTypes, 7);
let scheme = this.names[raceNum].list[subRaceNum].schemes[getRandomInt(this.names[raceNum].list[subRaceNum].schemes.length)].split(' ');
for (let i of scheme){
for (let j of names.src){
if (i === j.name){
let tempNames = j.l.split(', ');
name += tempNames[getRandomInt(tempNames.length)] + ' ';
}
}
}
token.document.actorLink = false;
name = name.trim()
let dirPath = `/modules/test_tube_merchant/assets/traider/token/${this.names[raceNum].name}/${this.names[raceNum].list[subRaceNum].name}/${age}/${scheme[0][0]}/`;
let tokensPics = await listAssets(dirPath);
let tokenPic = tokensPics[getRandomInt(tokensPics.length)];
let portraitPic = tokenPic.replace('/token/', '/portrait/');
let habits = this.makeHabits(scheme[0]);
let character = this.description.сharacter[getRandomInt(this.description.сharacter.length)];
let ideal = this.description.ideal[getRandomInt(this.description.ideal.length)];
let flaw = this.description.flaw[getRandomInt(this.description.flaw.length)];
let store_features = this.description.store_features[getRandomInt(this.description.store_features.length)];
let ready = this.description.Willingness_to_bargain[getRandomInt(this.description.Willingness_to_bargain.length)];
let description =this.makeDiscription(scheme[0], raceName, age);
// const files = fs.readdirSync(dirPath).map(fileName => `${dirPath}\\${fileName}`);
// console.log(files.join('\n'));
await this.makeMerchant(
token,
name,
tokenPic,
portraitPic,
`
<section class="secret">
<p><strong>Тип: ${categoriesText} - ${merchantItemsText} |</p>
</section>
<section class="secret">
<p><strong>Привычка:</strong> ${habits}</p>
</b>
<p><strong>Характер:</strong> ${character}</p>
</b>
<p><strong>Идеал:</strong> ${ideal}</p>
</b>
<p><strong>Недостаток:</strong> ${flaw}</p>
</b>
<p><strong>Особенности магазина:</strong> ${store_features}</p>
</b>
<p><strong>Готовность торговаться:</strong> ${ready}</p>
</section>
<p>${description}</p>
`,
{
biography:{
value: `<p>${habits}</p><p></p><p>${store_features}</p><p></p><p>${ready}<p>`,
public: description
},
bond: character,
flaw: flaw,
ideal: ideal
}
)
}
makeDiscription(gender, raceName, age){
if (gender === 'male' || gender === 'female'){
} else {
gender ='complicated';
}
let result = `${this.description.introduction[getRandomInt(this.description.introduction.length)]} ${this.description.age_gender[gender][age][getRandomInt(this.description.age_gender[gender][age].length)]}. ${this.description.pronoun_gender[gender]}${raceName.toLowerCase()}. ${this.appearanceDescription(gender)}`;
return result;
}
makeHabits(gender){
let using = [];
let result = '';
if (gender === 'male'){
this.description.habits.concat(this.description.habits_male)
}else if (gender === 'female'){
this.description.habits.concat(this.description.habits_fmale)
}
let type;
for (let i = 0; i < getRandomInt(4) + 1; i++) {
type = this.description.habits[getRandomInt(this.description.habits.length)];
while (using.includes(type)) {
type = this.description.habits[getRandomInt(this.description.habits.length)];
}
using.push(type);
if (i === 0){
result = `${type}`
}
else if (i === 1){
result = result + ' и ' + `${type}`
}
else {
result = `${type}` + ', ' + result
}
}
return result
}
appearanceDescription(gender) {
//features type_features type_features_male
let using = [];
let transition_appearance = [
`Вы замечаете особенность ${this.description.pronoun_gender_genitive[gender]} внешности —`,
`Вас сразу привлекает необычная особенность ${this.description.pronoun_gender_genitive[gender]} внешности —`,
`Кое-что бросается в глаза — это ${this.description.pronoun_gender_genitive[gender]}`,
`Вас удивляет кое-что: ${this.description.pronoun_gender_genitive[gender]}`,
`Кое-что отличает ${this.description.pronoun_gender_genitive[gender]} от прочих, и это`,
`${this.description.pronoun_gender_genitive[gender]} внешность странная, в особенности ${this.description.pronoun_gender_genitive[gender]}`,
]
let transition_appearance_next = [
`то что помогает вам ${this.description.pronoun_gender_genitive[gender]} запомнить, это:`,
`то что выделяет ${this.description.pronoun_gender_genitive[gender]} в толпе это:`,
]
let result;
let temp_type_features;
if (gender === "male") {
temp_type_features = this.description.type_features.concat(this.description.type_features_male)
}else if (gender === "female"){
temp_type_features = this.description.type_features
}else{
temp_type_features = this.description.type_features.concat(this.description.type_features_male)
}
let type = '';
for (let i = 0; i < getRandomInt(5) + 1; i++) {
type = temp_type_features[getRandomInt(temp_type_features.length)];
while (using.includes(type) && temp_type_features.includes(type)) {
type = temp_type_features[getRandomInt(temp_type_features.length)];
}
using.push(type);
let discr = `${this.description.features[type][getRandomInt(this.description.features[type].length)]}`
if (i === 0){
result = discr
}else if (i === 1){
result = result + ' и ' + discr
}else if (i === 3){
result = result + `, ${transition_appearance_next[getRandomInt(transition_appearance_next.length)]} ` + discr
}else{
result = discr + ', ' + result
}
}
return `${transition_appearance[getRandomInt(transition_appearance.length)]} ` + result;
}
async makeItem(actor, category, itemsTypes, count){
let itemsListNames = [];
let money = {
"horrible": 20,
"bad": 50,
"medium": 100,
"good": 250,
"beautiful": 500
}
let categories = {
"horrible": 1,
"bad": 2,
"medium": 3,
"good": 4,
"beautiful": 5
}
let numCategories = {
1: "horrible",
2: "bad",
3: "medium",
4: "good",
5: "beautiful"
}
for (let j = 1; j < categories[category] + 1; j++) {
let itemList = this.goods[numCategories[j]][itemsTypes]
let itemPath = `./modules/test_tube_merchant/items/${numCategories[j]}/${itemsTypes}/`;
let items = await loadItemsFromFolder(itemPath);
for (let i = 0; i < count; i++) {
for (let type in itemList) {
let dirPath = `/modules/test_tube_merchant/assets/icon/goods/${itemsTypes}/${type}/`;
let itemsPics = await this.listAssets(dirPath);
let itemPic = itemsPics[getRandomInt(itemsPics.length)];
for (let itemListData of itemList[type]){
let item_data = {
name: itemListData.name,
type: "consumable",
img: itemPic,
system: {
quantity: await parseQuantityFormula(itemListData.quantity),
price:{
value: itemListData.price,
denomination: itemListData.denomination
},
weight: {
value: itemListData.weight,
units: "kg"
},
description: {
value: itemListData.description
}
}
}
items.push(item_data);
}
}
let doIt = true;
let timeOut = 5;
while (doIt){
let item_cursor = getRandomInt(items.length);
let item_data = items[item_cursor];
if (!itemsListNames.includes(item_data.name)){
itemsListNames.push(item_data.name);
doIt = false;
try{
if (parseInt(game.system.version.split(".")[1])<2 && parseInt(game.system.version.split(".")[0])===3){
item_data.system.weight = item_data.system.weight?.value || 0;
if (item_data.system.attunement){
item_data.system.attunement = 1;
}else{
item_data.system.attunement = 0;
}
}
addItemsJsonToToken(actor, item_data);
}catch (e) {
console.error(`
Торговец из пробирки / Test Tube Merchant
Ошибка добаления предмета актёру ${item_data.name}
Ошибка: ${e}
Отправьте пожалуйста ошибку мне на дискорд:
https://discord.gg/CwxwDHZAGy
`);
}
}
timeOut --;
if (timeOut < 0){
console.log("Таймаут! Не удалось найти подходящее предмет для торговца.");
break;
}
}
}
}
actor.update({
"system.currency.gp": money[category] * (getRandomInt(11)+ 1 ) + (getRandomInt(money[category])),
"system.currency.sp": money[category] * (getRandomInt(3)+ 1 ) + (getRandomInt(money[category])),
"system.currency.cp": money[category] * (getRandomInt(5)+ 1 ) + (getRandomInt(money[category]))
});
await makeWagon(actor);
ui.notifications.info(`Предметы добавлены.`);
}
async listAssets(assetsPath) {
const files = await FilePicker.browse("data", assetsPath);
return files.files
}
};
async function addItemsJsonToToken(actor, itemData){
try {
await actor.createEmbeddedDocuments("Item", [itemData]);
} catch (e) {
console.error(`
Торговец из пробирки / Test Tube Merchant
Ошибка предмета ${itemData.name}
Ошибка: ${e}
Отправьте пожалуйста ошибку мне на дискорд:
https://discord.gg/CwxwDHZAGy
`);
}
}
async function loadItemsFromFolder(path) {
const items = [];
const fileList = await FilePicker.browse('data', path);
for (let file of fileList.files) {
const response = await fetch(file);
try {
const itemData = await response.json();
itemData.quantity = itemData.flags["test_tube_merchant"].quantity;
itemData.system.quantity = await parseQuantityFormula(itemData.quantity);
itemData.quantity = await parseQuantityFormula(itemData.quantity);
if (itemData.flags["test_tube_merchant"].price){
itemData.system.price.value = await parseQuantityFormula(itemData.flags["test_tube_merchant"].price);
}
items.push(itemData);
} catch (e) {
console.error(`
Торговец из пробирки / Test Tube Merchant
Ошибка загрузки файла ${file}
Ошибка: ${e}
Отправьте пожалуйста ошибку мне на дискорд:
https://discord.gg/CwxwDHZAGy
`);
}
}
return items;
}
export function getRandomInt(max) {
return Math.floor(Math.random() * max);
}
async function listAssets(assetsPath) {
const files = await FilePicker.browse("data", assetsPath);
return files.files
}
/** Огромное спасибо Elfrey !
* Функция для обработки формулы количества.
* @param {string} formula - Формула количества.
* @returns {number} - Вычисленное количество.
*/
async function parseQuantityFormula(formula) {
let evaluatedFormula;
const diceRegex = /(\d+)d(\d+)/g;
function rollDice(match, numDice, dieSides) {
let total = 0;
for (let i = 0; i < parseInt(numDice); i++) {
total += Math.floor(Math.random() * parseInt(dieSides)) + 1;
}
return total;
}
let typeFormula = typeof formula;
evaluatedFormula = formula;
if (typeFormula === 'string'){
evaluatedFormula = formula.replace(diceRegex, rollDice);
}
return eval(evaluatedFormula);
}
async function makeWagon(actor){
const effectName = "Торговая телега";
let existingEffect = actor.effects.find(effect => effect.label === effectName);
if (!existingEffect) {
await actor.createEmbeddedDocuments("ActiveEffect", [{
name: effectName,
img: "./modules/test_tube_merchant/assets/icon/effects/wagon.png",
changes: [
{ key: "system.attributes.encumbrance.bonuses.maximum", value: `70000`, mode: CONST.ACTIVE_EFFECT_MODES.ADD},
]
}]);
} else {
await existingEffect.update({
changes: [
{ key: "system.attributes.encumbrance.bonuses.maximum", value: `70000`, mode: CONST.ACTIVE_EFFECT_MODES.ADD},
]
});
}
}