dnd5-scripts/generate_npc/backgrounds.js
2026-06-17 22:32:48 +03:00

1575 lines
47 KiB
JavaScript
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.

// https://chatgpt.com/g/g-qgcben3uu-faerun/c/66ef4e4f-d1c4-800b-b20e-3969cb619c25
// https://dzen.ru/a/ZGxhsBGbTjaBeUhc?ysclid=m1dne1zyr1205412782
// TODO: сделать на часть преступных бэкграундов ограничение по мировоззрению
// TODO: увязать расу и выбор дополнительного языка (сделать выбор соответствующего языка от бэкграунда намного вероятнее)
// По дорогам и рекам Королевств проезжают менестрели и ремесленники, купцы и охранники, солдаты и моряки
/*d20 Guild Business
1 Alchemists and apothecaries
2 Armorers, locksmiths, and finesmiths
3 Brewers, distillers, and vintners
4 Calligraphers, scribes, and scriveners
5 Carpenters, roofers, and plasterers
6 Cartographers, surveyors, and chart-makers
7 Cobblers and shoemakers
8 Cooks and bakers
9 Glassblowers and glaziers
10 Jewelers and gemcutters
11 Leatherworkers, skinners, and tanners
12 Masons and stonecutters
13 Painters, limners, and sign-makers
14 Potters and tile-makers
15 Shipwrights and sailmakers
16 Smiths and metal-forgers
17 Tinkers, pewterers, and casters
18 Wagon-makers and wheelwrights
19 Weavers and dyers
20 Woodcarvers, coopers, and bowyers*/
// Отдельные переменные для каждого инструмента
const alchemistsSupplies = "Alchemist's supplies";
const brewersSupplies = "Brewer's supplies";
const calligraphersSupplies = "Calligrapher's supplies";
const carpentersTools = "Carpenter's tools";
const cartographersTools = "Cartographer's tools";
const cobblersTools = "Cobbler's tools";
const cooksUtensils = "Cook's utensils";
const glassblowersTools = "Glassblower's tools";
const jewelersTools = "Jeweler's tools";
const leatherworkersTools = "Leatherworker's tools";
const masonsTools = "Mason's tools";
const paintersTools = "Painter's tools";
const pottersTools = "Potter's tools";
const smithsTools = "Smith's tools";
const tinkersTools = "Tinker's tools";
const weaversTools = "Weaver's tools";
const woodcarversTools = "Woodcarver's tools";
// Добавил (хоумбрю)
const barberTools = "Barber's Tools";
// Массив с объединёнными инструментами ремесленников
const artisansTools = [
alchemistsSupplies,
brewersSupplies,
calligraphersSupplies,
carpentersTools,
cartographersTools,
cobblersTools,
cooksUtensils,
glassblowersTools,
jewelersTools,
leatherworkersTools,
masonsTools,
paintersTools,
pottersTools,
smithsTools,
tinkersTools,
weaversTools,
woodcarversTools
];
// Наборы для игр
const diceSet = "Dice set";
const dragonchessSet = "Dragonchess set";
const playingCardSet = "Playing card set";
const threeDragonAnteSet = "Three-Dragon Ante set";
// Наборы для игр массив
const gamingSets = [
diceSet,
dragonchessSet,
playingCardSet,
threeDragonAnteSet
];
// Прочие наборы и инструменты
const disguiseKit = "Disguise kit";
const forgeryKit = "Forgery kit";
const herbalismKit = "Herbalism kit";
const navigatorsTools = "Navigator's tools";
const poisonersKit = "Poisoner's kit";
const thievesTools = "Thieves' tools";
// Транспорт
const vehiclesLand = "Vehicles (Land)";
const vehiclesWater = "Vehicles (Water)";
const otherTools = [
disguiseKit,
forgeryKit,
herbalismKit,
navigatorsTools,
poisonersKit,
thievesTools,
vehiclesLand,
vehiclesWater
];
// Музыкальные инструменты
const bagpipes = "Bagpipes";
const drum = "Drum";
const dulcimer = "Dulcimer";
const flute = "Flute";
const lute = "Lute";
const lyre = "Lyre";
const horn = "Horn";
const panFlute = "Pan flute";
const shawm = "Shawm";
const viol = "Viol";
// Массив музыкальных инструментов
const musicalInstruments = [
bagpipes,
drum,
dulcimer,
flute,
lute,
lyre,
horn,
panFlute,
shawm,
viol
];
const allTools = [...artisansTools, ...gamingSets, ...musicalInstruments, ...otherTools];
// +Морские профессии
let maritimeProfessions = {
"Моряк":
{
"skills": [dv.skills.athletics, dv.skills.perception],
"tools": [navigatorsTools],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 35
},
"Рыбак":
{
"skills": [dv.skills.survival, dv.skills.animalHandling],
"tools": ["Fishing tackle"],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 25
},
"Пират":
{
"skills": [dv.skills.athletics, dv.skills.perception],
"tools": [vehiclesWater, navigatorsTools],
"languages": [],
"chance": 10
},
"Гребец":
{
"skills": [dv.skills.athletics, dv.skills.survival],
"tools": [vehiclesWater],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 10
},
"Боцман":
{
"skills": [dv.skills.intimidation, dv.skills.athletics],
"tools": [vehiclesWater, navigatorsTools],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 5
},
"Штурман":
{
"skills": [dv.skills.arcana, dv.skills.perception],
"tools": [navigatorsTools, cartographersTools],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 3
},
"Канонир":
{
"skills": [dv.skills.athletics, dv.skills.investigation],
"tools": [smithsTools],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 3
},
"Кок корабля":
{
"skills": [dv.skills.insight, dv.skills.performance],
"tools": [cooksUtensils],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 3
},
"Кладовщик корабля":
{
"skills": [dv.skills.investigation, dv.skills.perception],
"tools": [vehiclesWater],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 2
},
"Лоцман":
{
"skills": [dv.skills.perception, dv.skills.survival],
"tools": [navigatorsTools],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 2
},
"Канатчик":
{
"skills": [dv.skills.athletics, dv.skills.sleightOfHand],
"tools": [weaversTools],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 1
},
"Оружейник корабля":
{
"skills": [dv.skills.athletics, dv.skills.investigation],
"tools": [smithsTools],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 1
}
};
// +Фермеры, пастухи и охотники
let agrarianProfessions = {
"Фермер":
{
"skills": [dv.skills.animalHandling, dv.skills.nature],
"tools": [brewersSupplies, carpentersTools, cobblersTools, cooksUtensils, leatherworkersTools, masonsTools],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 25
},
"Пастух":
{
"skills": [dv.skills.animalHandling, dv.skills.nature],
"tools": [musicalInstruments],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 15
},
"Земледелец":
{
"skills": [dv.skills.athletics, dv.skills.nature],
"tools": [],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 10
},
"Охотник":
{
"skills": [dv.skills.stealth, dv.skills.survival],
"tools": ["Animal traps"],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 10
},
"Овчар":
{
"skills": [dv.skills.animalHandling, dv.skills.survival],
"tools": [barberTools],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 5
},
"Скотник":
{
"skills": [dv.skills.animalHandling, dv.skills.survival],
"tools": [barberTools, leatherworkersTools],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 5
},
"Свинопас":
{
"skills": [dv.skills.animalHandling, dv.skills.nature],
"tools": [musicalInstruments],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 5
},
"Мельник":
{
"skills": [dv.skills.athletics, dv.skills.investigation],
"tools": [cooksUtensils], // *
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 4
},
"Птицевод":
{
"skills": [dv.skills.animalHandling, dv.skills.survival],
"tools": [woodcarversTools],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 3
},
"Заводчик лошадей":
{
"skills": [dv.skills.animalHandling, dv.skills.persuasion],
"tools": [musicalInstruments, calligraphersSupplies],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 3
},
"Садовник":
{
"skills": [dv.skills.nature, dv.skills.survival],
"tools": [herbalismKit],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 3
},
"Пчеловод":
{
"skills": [dv.skills.animalHandling, dv.skills.survival],
"tools": [woodcarversTools, cooksUtensils],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 2
},
"Сыровар":
{
"skills": [dv.skills.animalHandling, dv.skills.investigation],
"tools": [cooksUtensils],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 2
},
"Винодел":
{
"skills": [dv.skills.nature, dv.skills.persuasion],
"tools": [brewersSupplies],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 2
},
"Молочник":
{
"skills": [dv.skills.animalHandling, dv.skills.athletics],
"tools": [cooksUtensils],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 2
},
"Зверолов":
{
"skills": [dv.skills.stealth, dv.skills.survival],
"tools": ["Animal traps"],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 2
}
};
// +Ремесленники
let artisanProfessions = {
"Кузнец":
{
"skills": [dv.skills.athletics, dv.skills.insight],
"tools": [smithsTools],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 12
},
"Кожевенник":
{
"skills": [dv.skills.survival, dv.skills.investigation],
"tools": [leatherworkersTools],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 9
},
"Ткач":
{
"skills": [dv.skills.insight, dv.skills.investigation],
"tools": [weaversTools],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 9
},
"Пекарь":
{
"skills": [dv.skills.insight, dv.skills.investigation],
"tools": [cooksUtensils],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 8
},
"Мясник":
{
"skills": [dv.skills.athletics, dv.skills.survival],
"tools": [cooksUtensils], // *
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 8
},
"Сапожник":
{
"skills": [dv.skills.investigation, dv.skills.perception],
"tools": [cobblersTools],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 6
},
"Повар":
{
"skills": [dv.skills.insight, dv.skills.performance],
"tools": [cooksUtensils],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 7
},
"Столяр":
{
"skills": [dv.skills.athletics, dv.skills.perception],
"tools": [carpentersTools],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 5
},
"Резчик по дереву":
{
"skills": [dv.skills.athletics, dv.skills.perception],
"tools": [woodcarversTools],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 5
},
"Каменотес":
{
"skills": [dv.skills.athletics, dv.skills.investigation],
"tools": [masonsTools],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 5
},
"Гончар":
{
"skills": [dv.skills.investigation, dv.skills.performance],
"tools": [pottersTools],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 5
},
"Булочник":
{
"skills": [dv.skills.insight, dv.skills.performance],
"tools": [cooksUtensils],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 4
},
"Бондарь":
{
"skills": [dv.skills.athletics, dv.skills.investigation],
"tools": [woodcarversTools],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 4
},
"Пивовар":
{
"skills": [dv.skills.investigation, dv.skills.insight],
"tools": [brewersSupplies],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 4
},
"Кирпичник":
{
"skills": [dv.skills.athletics, dv.skills.investigation],
"tools": [masonsTools],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 3
},
"Кондитер":
{
"skills": [dv.skills.insight, dv.skills.investigation],
"tools": [cooksUtensils],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 2
},
"Изготовитель свечей":
{
"skills": [dv.skills.investigation, dv.skills.insight],
"tools": [cooksUtensils],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 2
},
"Механик":
{
"skills": [dv.skills.investigation, dv.skills.sleightOfHand],
"tools": [tinkersTools],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 2
},
"Стеклодув":
{
"skills": [dv.skills.investigation, dv.skills.perception],
"tools": [glassblowersTools],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 1
},
"Часовщик":
{
"skills": [dv.skills.investigation, dv.skills.perception],
"tools": [tinkersTools],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 1
},
"Ювелир":
{
"skills": [dv.skills.insight, dv.skills.investigation],
"tools": [jewelersTools],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 1
},
"Ткач ковров":
{
"skills": [dv.skills.insight, dv.skills.perception],
"tools": [weaversTools],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 1
},
"Лудильщик":
{
"skills": [dv.skills.survival, dv.skills.investigation],
"tools": [tinkersTools],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 1
}
};
// +Музыканты и артисты
let performingArtsProfessions = {
"Музыкант":
{
"skills": [dv.skills.performance, dv.skills.perception],
"tools": [musicalInstruments],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 21
},
"Актер театра":
{
"skills": [dv.skills.performance, dv.skills.deception],
"tools": [musicalInstruments, weaversTools],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 15
},
"Певец":
{
"skills": [dv.skills.performance, dv.skills.persuasion],
"tools": [], // * чтобы знал пару языков, на которых песни
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 15
},
"Танцор":
{
"skills": [dv.skills.acrobatics, dv.skills.performance],
"tools": [], // * чтобы знал пару языков, на которых песни
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 10
},
"Художник":
{
"skills": [dv.skills.performance, dv.skills.investigation],
"tools": [paintersTools],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 6
},
"Поэт":
{
"skills": [dv.skills.performance, dv.skills.persuasion],
"tools": [], // * чтобы знал пару языков, на которых песни
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 6
},
"Жонглер":
{
"skills": [dv.skills.sleightOfHand, dv.skills.performance],
"tools": [],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 4
},
"Фокусник":
{
"skills": [dv.skills.sleightOfHand, dv.skills.performance],
"tools": [woodcarversTools], // *
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 4
},
"Кукловод":
{
"skills": [dv.skills.performance, dv.skills.sleightOfHand],
"tools": [weaversTools],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 3
},
"Скульптор":
{
"skills": [dv.skills.perception, dv.skills.performance],
"tools": [paintersTools],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 3
},
"Бард":
{
"skills": [dv.skills.performance, dv.skills.history],
"tools": [musicalInstruments],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 3
},
"Оркестровый музыкант":
{
"skills": [dv.skills.performance, dv.skills.insight],
"tools": [musicalInstruments],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 2
},
"Трубач":
{
"skills": [dv.skills.performance, dv.skills.athletics],
"tools": [horn],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 2
},
"Лютнист":
{
"skills": [dv.skills.performance, dv.skills.perception],
"tools": [lute],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 2
},
"Гармонист":
{
"skills": [dv.skills.performance, dv.skills.sleightOfHand],
"tools": ["Harmonica"],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 2
},
"Писатель (драматург)":
{
"skills": [dv.skills.history, dv.skills.performance],
"tools": [calligraphersSupplies],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 2
}
};
// +Военные и стражники
let militaryProfessions = {
"Легкий пехотинец":
{
"skills": [dv.skills.athletics, dv.skills.perception],
"tools": [gamingSets],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 15
},
"Тяжелый пехотинец":
{
"skills": [dv.skills.athletics, dv.skills.intimidation],
"tools": [gamingSets],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 10
},
"Стражник":
{
"skills": [dv.skills.athletics, dv.skills.perception],
"tools": [gamingSets],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 10
},
"Ополченец":
{
"skills": [dv.skills.athletics, dv.skills.perception],
"tools": [],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 10
},
"Лучник":
{
"skills": [dv.skills.perception, dv.skills.survival],
"tools": [gamingSets],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 10
},
"Копейщик":
{
"skills": [dv.skills.athletics, dv.skills.survival],
"tools": [gamingSets],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 8
},
"Кавалерист":
{
"skills": [dv.skills.athletics, dv.skills.animalHandling],
"tools": [gamingSets],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 5
},
"Гарнизонный солдат":
{
"skills": [dv.skills.athletics, dv.skills.insight],
"tools": [gamingSets],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 5
},
"Наемник":
{
"skills": [dv.skills.athletics, dv.skills.survival],
"tools": [],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 5
},
"Рекрут":
{
"skills": [dv.skills.athletics, dv.skills.survival],
"tools": [gamingSets],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 4
},
"Телохранитель":
{
"skills": [dv.skills.athletics, dv.skills.insight],
"tools": [],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 3
},
"Разведчик":
{
"skills": [dv.skills.stealth, dv.skills.survival],
"tools": [cartographersTools],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 3
},
"Оруженосец":
{
"skills": [dv.skills.athletics, dv.skills.perception],
"tools": [smithsTools, leatherworkersTools, weaversTools, gamingSets], // *
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 3
},
"Баллистик":
{
"skills": [dv.skills.investigation, dv.skills.athletics],
"tools": [smithsTools],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 2
},
"Фортификатор":
{
"skills": [dv.skills.investigation, dv.skills.perception],
"tools": [masonsTools],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 2
},
"Гладиатор":
{
"skills": [dv.skills.athletics, dv.skills.intimidation],
"tools": [],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 2
},
"Осадный инженер":
{
"skills": [dv.skills.investigation, dv.skills.survival],
"tools": [carpentersTools],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 2
},
"Морской пехотинец":
{
"skills": [dv.skills.athletics, dv.skills.perception],
"tools": [navigatorsTools],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 2
},
"Катапультир":
{
"skills": [dv.skills.athletics, dv.skills.survival],
"tools": [masonsTools],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 2
},
"Шпион":
{
"skills": [dv.skills.stealth, dv.skills.deception],
"tools": [disguiseKit, thievesTools],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 1
}
};
// +Профессии воров и мошенников
let criminalProfessions = {
"Карманник":
{
"skills": [dv.skills.sleightOfHand, dv.skills.stealth],
"tools": [thievesTools],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 20
},
"Мошенник":
{
"skills": [dv.skills.deception, dv.skills.persuasion],
"tools": [gamingSets],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 15
},
"Домушник":
{
"skills": [dv.skills.stealth, dv.skills.perception],
"tools": [thievesTools],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 15
},
"Контрабандист":
{
"skills": [dv.skills.stealth, dv.skills.deception],
"tools": [vehiclesLand, vehiclesWater, thievesTools, disguiseKit, forgeryKit],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 10
},
"Карточный шулер":
{
"skills": [dv.skills.sleightOfHand, dv.skills.deception],
"tools": [playingCardSet],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 8
},
"Скупщик краденого":
{
"skills": [dv.skills.insight, dv.skills.persuasion],
"tools": [disguiseKit],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 7
},
"Медвежатник":
{
"skills": [dv.skills.sleightOfHand, dv.skills.stealth],
"tools": [thievesTools],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 5
},
"Скотокрад":
{
"skills": [dv.skills.stealth, dv.skills.survival],
"tools": [],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 5
},
"Грабитель повозок":
{
"skills": [dv.skills.athletics, dv.skills.stealth],
"tools": [],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 4
},
"Угонщик повозок":
{
"skills": [dv.skills.stealth, dv.skills.sleightOfHand],
"tools": [vehiclesLand],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 3
},
"Фальшивомонетчик":
{
"skills": [dv.skills.deception, dv.skills.investigation],
"tools": [forgeryKit],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 3
},
"Рекетир":
{
"skills": [dv.skills.intimidation, dv.skills.athletics],
"tools": [],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 2
},
"Подделыватель документов":
{
"skills": [dv.skills.investigation, dv.skills.sleightOfHand],
"tools": [forgeryKit],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 2
},
"Похититель скота":
{
"skills": [dv.skills.survival, dv.skills.stealth],
"tools": [],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 2
},
"Ассасин":
{
"skills": [dv.skills.stealth, dv.skills.deception],
"tools": [poisonersKit, disguiseKit, forgeryKit],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 1
},
"Наёмный убийца":
{
"skills": [dv.skills.stealth, dv.skills.intimidation],
"tools": [poisonersKit, disguiseKit, forgeryKit],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 1
},
"Поджигатель":
{
"skills": [dv.skills.stealth, dv.skills.intimidation],
"tools": [alchemistsSupplies],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 1
},
"Похититель":
{
"skills": [dv.skills.stealth, dv.skills.deception],
"tools": [disguiseKit, thievesTools, forgeryKit],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 1
}
};
// +Интеллектуалы и ученые
let academicProfessions = {
"Писарь":
{
"skills": [dv.skills.history, dv.skills.investigation],
"tools": [calligraphersSupplies],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 15
},
"Учитель":
{
"skills": [dv.skills.persuasion, dv.skills.insight],
"tools": [allTools],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 15
},
"Аколит":
{
"skills": [dv.skills.religion, dv.skills.insight],
"tools": [calligraphersSupplies],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 12
},
"Ученый":
{
"skills": [dv.skills.history, dv.skills.arcana],
"tools": [calligraphersSupplies, cartographersTools, alchemistsSupplies], // *
"languages": [dv.languages.livingLanguagesExceptCommon, dv.languages.deadLanguages],
"chance": 9
},
"Алхимик":
{
"skills": [dv.skills.arcana, dv.skills.investigation],
"tools": [alchemistsSupplies],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 8
},
"Инженер":
{
"skills": [dv.skills.investigation, dv.skills.perception],
"tools": [tinkersTools],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 8
},
"Профессор":
{
"skills": [dv.skills.history, dv.skills.persuasion],
"tools": [], // *
"languages": [dv.languages.livingLanguagesExceptCommon, dv.languages.deadLanguages],
"chance": 7
},
"Историк":
{
"skills": [dv.skills.history, dv.skills.insight],
"tools": [],
"languages": [dv.languages.livingLanguagesExceptCommon, dv.languages.deadLanguages],
"chance": 4
},
"Библиотекарь":
{
"skills": [dv.skills.history, dv.skills.investigation],
"tools": [],
"languages": [dv.languages.livingLanguagesExceptCommon, dv.languages.deadLanguages],
"chance": 4
},
"Картограф":
{
"skills": [dv.skills.investigation, dv.skills.perception],
"tools": [cartographersTools],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 3
},
"Археолог":
{
"skills": [dv.skills.history, dv.skills.investigation],
"tools": [cartographersTools],
"languages": [dv.languages.livingLanguagesExceptCommon, dv.languages.deadLanguages],
"chance": 3
},
"Лингвист":
{
"skills": [dv.skills.history, dv.skills.insight],
"tools": [],
"languages": [dv.languages.livingLanguagesExceptCommon, dv.languages.deadLanguages],
"chance": 2
},
"Математик":
{
"skills": [dv.skills.investigation, dv.skills.insight],
"tools": [],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 2
},
"Философ":
{
"skills": [dv.skills.religion, dv.skills.insight],
"tools": [],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 2
},
"Исследователь":
{
"skills": [dv.skills.nature, dv.skills.survival],
"tools": [herbalismKit],
"languages": [dv.languages.livingLanguagesExceptCommon, dv.languages.deadLanguages],
"chance": 2
},
"Географ":
{
"skills": [dv.skills.nature, dv.skills.history],
"tools": [cartographersTools],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 2
},
"Астроном":
{
"skills": [dv.skills.arcana, dv.skills.perception],
"tools": [navigatorsTools],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 2
}
};
// +Городские профессии
let urbanProfessions = {
"Извозчик":
{
"skills": [dv.skills.animalHandling, dv.skills.perception],
"tools": [vehiclesLand],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 20
},
"Грузчик":
{
"skills": [dv.skills.athletics, dv.skills.survival],
"tools": [],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 17
},
/*"Уборщик улиц (дворник)":
{
"skills": [dv.skills.athletics, dv.skills.survival],
"tools": [],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 15
},*/
"Цирюльник":
{
"skills": [dv.skills.medicine, dv.skills.performance],
"tools": [barberTools],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 10
},
"Трактирщик":
{
"skills": [dv.skills.persuasion, dv.skills.insight],
"tools": [brewersSupplies],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 10
},
"Гонец":
{
"skills": [dv.skills.acrobatics, dv.skills.athletics],
"tools": [],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 8
},
"Фонарщик":
{
"skills": [dv.skills.athletics, dv.skills.perception],
"tools": [],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 5
},
"Почтальон":
{
"skills": [dv.skills.athletics, dv.skills.perception],
"tools": [],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 5
},
"Пожарный":
{
"skills": [dv.skills.athletics, dv.skills.perception],
"tools": [],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 4
},
"Тюремщик":
{
"skills": [dv.skills.intimidation, dv.skills.insight],
"tools": [],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 3
},
"Садовник городской":
{
"skills": [dv.skills.nature, dv.skills.survival],
"tools": [herbalismKit],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 3
}
};
// +Торговые профессии
let mercantileProfessions = {
"Продавец фруктов и овощей":
{
"skills": [dv.skills.nature, dv.skills.persuasion],
"tools": [],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 15
},
"Продавец тканей":
{
"skills": [dv.skills.insight, dv.skills.performance],
"tools": [weaversTools],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 12
},
"Продавец лошадей":
{
"skills": [dv.skills.animalHandling, dv.skills.persuasion],
"tools": [],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 10
},
"Караванщик":
{
"skills": [dv.skills.animalHandling, dv.skills.perception],
"tools": [vehiclesLand],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 10
},
"Продавец оружия":
{
"skills": [dv.skills.persuasion, dv.skills.investigation],
"tools": [smithsTools],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 10
},
"Продавец ювелирных изделий":
{
"skills": [dv.skills.persuasion, dv.skills.insight],
"tools": [jewelersTools],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 8
},
"Продавец вина":
{
"skills": [dv.skills.persuasion, dv.skills.insight],
"tools": [brewersSupplies],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 8
},
"Продавец мебели":
{
"skills": [dv.skills.persuasion, dv.skills.investigation],
"tools": [carpentersTools],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 7
},
"Аптекарь":
{
"skills": [dv.skills.medicine, dv.skills.arcana],
"tools": [herbalismKit],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 6
},
"Продавец книг":
{
"skills": [dv.skills.history, dv.skills.investigation],
"tools": [],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 5
},
"Продавец рыбы":
{
"skills": [dv.skills.survival, dv.skills.athletics],
"tools": ["Fishing tackle"],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 5
},
"Торговец кожаными изделиями":
{
"skills": [dv.skills.investigation, dv.skills.insight],
"tools": [leatherworkersTools],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 4
},
"Торговец тканями":
{
"skills": [dv.skills.insight, dv.skills.persuasion],
"tools": [weaversTools],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 3
},
"Караванный охранник":
{
"skills": [dv.skills.athletics, dv.skills.perception],
"tools": [gamingSets],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 2
},
"Гильдейский казначей":
{
"skills": [dv.skills.investigation, dv.skills.insight],
"tools": [calligraphersSupplies],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 1
},
"Продавец пряностей":
{
"skills": [dv.skills.insight, dv.skills.persuasion],
"tools": [],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 1
},
};
// +Строители
let constructionProfessions = {
"Строитель":
{
"skills": [dv.skills.athletics, dv.skills.perception],
"tools": [carpentersTools],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 42
},
"Каменщик":
{
"skills": [dv.skills.athletics, dv.skills.investigation],
"tools": [masonsTools],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 25
},
"Архитектор":
{
"skills": [dv.skills.investigation, dv.skills.insight],
"tools": [masonsTools],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 12
},
"Маляр":
{
"skills": [dv.skills.investigation, dv.skills.performance],
"tools": [paintersTools],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 4
},
"Плотник":
{
"skills": [dv.skills.athletics, dv.skills.perception],
"tools": [carpentersTools],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 9
},
"Кровельщик":
{
"skills": [dv.skills.athletics, dv.skills.perception],
"tools": ["roofersTools"],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 2
},
"Реставратор":
{
"skills": [dv.skills.insight, dv.skills.investigation],
"tools": ["restorationTools"],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 6
}
};
// Медицинские профессии
let medicalProfessions = {
"Врач":
{
"skills": [dv.skills.medicine, dv.skills.perception],
"tools": ["Medical instruments"],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 52
},
"Травник":
{
"skills": [dv.skills.nature, dv.skills.medicine],
"tools": [herbalismKit],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 21
},
"Хирург":
{
"skills": [dv.skills.medicine, dv.skills.investigation],
"tools": ["Healer's kit"],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 14
},
"Акушер":
{
"skills": [dv.skills.medicine, dv.skills.insight],
"tools": ["Medical instruments"],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 8
},
"Корабельный врач":
{
"skills": [dv.skills.medicine, dv.skills.perception],
"tools": ["Medical instruments"],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 5
},
};
// +Религиозные профессии
let religiousProfessions = {
"Священник":
{
"skills": [dv.skills.religion, dv.skills.persuasion],
"tools": [calligraphersSupplies],
"languages": [dv.languages.livingLanguagesExceptCommon, dv.languages.deadLanguages],
"prerequisiteClasses": [dv.classes.cleric, dv.classes.paladin],
"chance": 30
},
"Аколит":
{
"skills": [dv.skills.religion, dv.skills.insight],
"tools": [],
"languages": [dv.languages.livingLanguagesExceptCommon, dv.languages.deadLanguages],
"prerequisiteClasses": [dv.classes.cleric, dv.classes.paladin],
"chance": 20
},
"Монах":
{
"skills": [dv.skills.religion, dv.skills.acrobatics],
"tools": [herbalismKit],
"languages": [dv.languages.livingLanguagesExceptCommon, dv.languages.deadLanguages],
"prerequisiteClasses": [dv.classes.cleric, dv.classes.paladin],
"chance": 15
},
"Храмовый целитель":
{
"skills": [dv.skills.medicine, dv.skills.religion],
"tools": ["Healer's kit"],
"languages": [dv.languages.livingLanguagesExceptCommon],
"prerequisiteClasses": [dv.classes.cleric, dv.classes.paladin],
"chance": 15
},
"Певчий в храме":
{
"skills": [dv.skills.performance, dv.skills.religion],
"tools": [musicalInstruments],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 9
},
"Церковный учитель":
{
"skills": [dv.skills.religion, dv.skills.persuasion],
"tools": [allTools],
"languages": [dv.languages.livingLanguagesExceptCommon],
"prerequisiteClasses": [dv.classes.cleric, dv.classes.paladin],
"chance": 7
},
"Церковный писарь":
{
"skills": [dv.skills.history, dv.skills.investigation],
"tools": [calligraphersSupplies],
"languages": [dv.languages.livingLanguagesExceptCommon],
"chance": 4
}
};
let backgrounds = {
agrarianProfessions:
{
list: agrarianProfessions,
chance: 30.00 // Большая часть населения Фаэруна занята в сельском хозяйстве (40), но уменьшим процент для авантюристов.
},
militaryProfessions:
{
list: militaryProfessions,
chance: 20.00 // Частые конфликты делают военные профессии значимыми.
},
maritimeProfessions:
{
list: maritimeProfessions,
chance: 6.00 // Побережье Мечей активно связано с морем, но не вся территория Фаэруна прибрежная.
},
artisanProfessions:
{
list: artisanProfessions,
chance: 10.00 // Ремесленники играют важную роль в городах и селах.
},
urbanProfessions:
{
list: urbanProfessions,
chance: 8.00 // Городские профессии распространены, но составляют меньшую часть населения.
},
criminalProfessions:
{
list: criminalProfessions,
chance: 6.00 // Преступные элементы присутствуют, но не доминируют в обществе (3), но среди авантюристов их будет больше.
},
mercantileProfessions:
{
list: mercantileProfessions,
chance: 5.00 // Торговля важна для экономики, особенно в городах и на торговых путях.
},
religiousProfessions:
{
list: religiousProfessions,
chance: 5.00 // Религия играет значимую роль, и многие служат в храмах и святилищах.
},
medicalProfessions:
{
list: medicalProfessions,
chance: 3.00 // Целители и лекари необходимы, но их число невелико (2), но среди авантюристов чуть больше.
},
constructionProfessions:
{
list: constructionProfessions,
chance: 3.00 // Строители и каменщики востребованы, но их число ограничено.
},
academicProfessions:
{
list: academicProfessions,
chance: 2.00 // Академики и учёные редки и сконцентрированы в определённых центрах знаний.
},
performingArtsProfessions:
{
list: performingArtsProfessions,
chance: 2.00 // Артисты и музыканты встречаются, но составляют небольшую часть населения.
}
};
// get random background
function getClassSkillsWithBackground(randomClass, background) {
// Берем скиллы из бекграунда
let backgroundSkills = background.skills;
// Получаем список скиллов для класса персонажа
let skillsChoice = dv.skills.characterClassesSkills[randomClass.toLowerCase()];
let skillsList = skillsChoice[0]; // список доступных скиллов класса
let skillsNr = skillsChoice[1]; // количество скиллов, которые нужно выбрать
// Убираем из списка скиллов класса те, что уже выбраны через бекграунд
let filteredSkillsList = removeBackgroundSkillsFromClassSkills(skillsList, backgroundSkills);
// Выбираем случайные скиллы для класса из оставшегося списка
let randomSkills = dv.skills.getRandomSkills(filteredSkillsList, skillsNr);
return randomSkills;
}
function removeBackgroundSkillsFromClassSkills(classSkills, backgroundSkills) {
// Клонируем список скиллов класса
let clonedClassSkills = [...classSkills];
// Удаляем скиллы, выбранные через бекграунд
backgroundSkills.forEach(skill => {
const index = clonedClassSkills.indexOf(skill);
if (index > -1) {
clonedClassSkills.splice(index, 1);
}
});
return clonedClassSkills;
}
function getBackground(characterClass, knownLanguagesFromRace) {
while (true) {
// Шаг 1: выбираем случайную группу бекграундов с учетом шанса
const backgroundGroups = Object.keys(backgrounds).map(key => ({
name: key,
list: backgrounds[key].list,
chance: backgrounds[key].chance
}));
const selectedGroup = getRandomItemWithChance(backgroundGroups);
// Шаг 2: выбираем случайную профессию внутри группы с учетом шанса
const professions = Object.keys(selectedGroup.list).map(key => ({
name: key,
...selectedGroup.list[key]
}));
const selectedProfession = getRandomItemWithChance(professions);
// Шаг 3: проверяем prerequisiteClasses, если есть
if (selectedProfession.prerequisiteClasses && selectedProfession.prerequisiteClasses.length > 0) {
if (!selectedProfession.prerequisiteClasses.includes(characterClass)) {
continue; // Класс не подходит, повторяем выбор
}
}
// Шаг 4: выбираем элементы для skills, tools, languages
let selectedSkills = selectRandomElements(selectedProfession.skills, 2);
let selectedToolsAndLanguages = selectFromTwoArrays(
selectedProfession.tools,
selectedProfession.languages,
knownLanguagesFromRace // Передаём известные языки для исключения
);
// Шаг 5: формируем итоговый блок и возвращаем его
return {
name: selectedProfession.name,
skills: selectedSkills,
tools: selectedToolsAndLanguages.tools,
languages: selectedToolsAndLanguages.languages
};
}
}
function getRandomItemWithChance(items) {
const totalChance = items.reduce((sum, item) => sum + item.chance, 0);
const randomValue = Math.random() * totalChance;
let cumulativeChance = 0;
for (const item of items) {
cumulativeChance += item.chance;
if (randomValue <= cumulativeChance) {
return item;
}
}
return null; // на случай если что-то пойдет не так
}
function selectRandomElements(array, count, excludeList = []) {
if (!array || array.length === 0) {
return [];
}
const flattenedArray = array.flat();
const uniqueElements = [...new Set(flattenedArray)];
// Убираем исключённые элементы
const availableElements = uniqueElements.filter(el => !excludeList.includes(el));
// Если после исключения элементов ничего не осталось, возвращаем пустой массив
if (availableElements.length === 0) {
return [];
}
return shuffleArray(availableElements).slice(0, Math.min(count, availableElements.length));
}
function selectFromTwoArrays(array1, array2, excludeLanguages = []) {
let selectedFromArray1 = [];
let selectedFromArray2 = [];
if (array1 && array1.length > 0 && array2 && array2.length > 0) {
selectedFromArray1 = selectRandomElements(array1, 1);
selectedFromArray2 = selectRandomElements(array2, 1, excludeLanguages);
} else if (array1 && array1.length > 0) {
selectedFromArray1 = selectRandomElements(array1, 2);
} else if (array2 && array2.length > 0) {
selectedFromArray2 = selectRandomElements(array2, 2, excludeLanguages);
}
return {
tools: selectedFromArray1,
languages: selectedFromArray2
};
}
function shuffleArray(array) {
for (let i = array.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[array[i], array[j]] = [array[j], array[i]];
}
return array;
}
dv.backgrounds = {
getClassSkillsWithBackground,
getBackground
}