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