/* globals require */ // HELPERS const copyToCB = (str) => { require('child_process').spawn('clip').stdin.end(str); } const emproper = (input) => { return input.split(/[_\s]+/g).map(w=>`${w[0].toUpperCase()}${w.slice(1)}`).join(' '); } const warlockData = { careers: [ // CORE - BASIC { name: "agitator", type: "basic", skills: { small_blade: 10, intimidate: 10, persuasion: 12, streetwise: 12, }, }, { name: "beggar", type: "basic", skills: { appraise: 10, blunt: 10, spot: 12, streetwise: 12, }, }, { name: "boatman", type: "basic", skills: { navigation: 10, repair: 10, endurance: 12, swimming: 12, }, }, { name: "bodyguard", type: "basic", skills: { medicine: 10, thrown: 10, intimidate: 12, large_blade: 12, }, }, { name: "bounty_hunter", type: "basic", skills: { bargain: 10, crossbow: 10, spot: 12, streetwise: 12, }, }, { name: "entertainer", type: "basic", skills: { diplomacy: 10, history: 10, disguise: 12, persuasion: 12, }, }, { name: "footpad", type: "basic", skills: { stealth: 10, thrown: 10, intimidate: 12, streetwise: 12, }, }, { name: "gambler", type: "basic", skills: { bargain: 10, spot: 10, persuasion: 12, "sleight-of-hand": 12, }, }, { name: "grave_robber", type: "basic", skills: { intimidate: 10, ostler: 10, small_blade: 12, spot: 12, }, }, { name: "hunter", type: "basic", skills: { stealth: 10, swimming: 10, spot: 12, survival: 12, }, }, { name: "initiate", type: "basic", skills: { command: 10, ostler: 10, medicine: 12, persuasion: 12, }, }, { name: "mercenary", type: "basic", skills: { endurance: 10, streetwise: 10, dodge: 12, large_blade: 12, }, }, { name: "militiaman", type: "basic", skills: { command: 10, ostler: 10, "pole-arm": 12, thrown: 12, }, }, { name: "miner", type: "basic", skills: { survival: 10, swimming: 10, endurance: 12, navigation: 12, }, }, { name: "noble", type: "basic", skills: { language: 10, medicine: 10, diplomacy: 12, history: 12, }, }, { name: "outlaw", type: "basic", skills: { medicine: 10, "sleigh-of-hand": 10, large_blade: 12, thrown: 12, }, }, { name: "pedlar", type: "basic", skills: { ostler: 10, streetwise: 10, bargain: 12, repair: 12, }, }, { name: "raconteur", type: "basic", skills: { dodge: 10, history: 10, lie: 12, streetwise: 12, }, }, { name: "rat_catcher", type: "basic", skills: { athletics: 10, medicine: 10, stealth: 12, survival: 12, }, }, { name: "road_warden", type: "basic", skills: { crossbow: 10, dodge: 10, "pole-arm": 12, ostler: 12, }, }, { name: "soldier", type: "basic", skills: { command: 10, bow: 10, large_blade: 12, "pole-arm": 12, }, }, { name: "thief", type: "basic", skills: { lie: 10, streetwise: 10, small_blade: 12, spot: 12, }, }, { name: "tomb_robber", type: "basic", skills: { athletics: 10, intimidate: 10, blunt: 12, endurance: 12, }, }, { name: "wizard's_apprentice", type: "basic", skills: { command: 10, persuasion: 10, language: 12, incantation: 12, }, }, // CORE - ADVANCED { name: "assassin", type: "advanced", skills: { blunt: 14, dodge: 14, streetwise: 14, small_blade: 16, stealth: 16, }, }, { name: "bravo", type: "advanced", skills: { blunt: 14, bow: 14, command: 14, large_blade: 16, streetwise: 16, }, }, { name: "watch_captain", type: "advanced", skills: { crossbow: 14, endurance: 14, ostler: 14, pole_arm: 16, streetwise: 16, }, }, { name: "charlatan", type: "advanced", skills: { appraise: 14, ostler: 14, spot: 14, persuasion: 16, streetwise: 16, }, }, { name: "explorer", type: "advanced", skills: { athletics: 14, small_blade: 14, swimming: 14, navigation: 16, spot: 16, }, }, { name: "freelance", type: "advanced", skills: { diplomacy: 14, medicine: 14, thrown: 14, ostler: 16, pole_arm: 16, }, }, { name: "highwayman", type: "advanced", skills: { dodge: 14, intimidate: 14, large_blade: 14, disguise: 16, ostler: 16, }, }, { name: "mercenary_captain", type: "advanced", skills: { bargain: 14, medicine: 14, survival: 14, crossbow: 16, large_blade: 16, }, }, { name: "merchant", type: "advanced", skills: { lie: 14, persuasion: 14, sleight_of_hand: 14, appraise: 16, bargain: 16, ostler: 16, }, }, { name: "minstrel", type: "advanced", skills: { history: 14, lie: 14, repair: 14, persuasion: 16, sleight_of_hand: 16, }, }, { name: "outlaw_chief", type: "advanced", skills: { endurance: 14, ostler: 14, swimming: 14, intimidate: 16, large_blade: 16, }, }, { name: "priest", type: "advanced", skills: { diplomacy: 14, ostler: 14, thrown: 14, incantation: 16, language: 16, }, }, { name: "scholar", type: "advanced", skills: { appraise: 14, brawling: 14, repair: 14, language: 16, medicine: 16, }, }, { name: "scout", type: "advanced", skills: { athletics: 14, ostler: 14, survival: 14, spot: 16, stealth: 16, }, }, { name: "spy", type: "advanced", skills: { athletics: 14, dodge: 14, small_blade: 14, persuasion: 16, sleight_of_hand: 16, }, }, { name: "veteran_soldier", type: "advanced", skills: { dodge: 14, pole_arm: 14, survival: 14, endurance: 16, large_blade: 16, }, }, { name: "wizard", type: "advanced", skills: { brawling: 14, command: 14, medicine: 14, history: 16, incantation: 16, }, }, // COMPENDIUM BASIC { name: "dwarf_inventor", type: "basic, dwarf", skills: { brawling: 10, diplomacy: 10, repair: 12, sleight_of_hand: 12, }, }, { name: "dwarf_tunnel_fighter", type: "basic, dwarf", skills: { endurance: 10, intimidate: 10, stealth: 12, survival: 12, }, }, { name: "elf_astrologer", type: "basic, elf", skills: { appraise: 10, diplomacy: 10, navigation: 12, spot: 12, }, }, { name: "elf_kin_guard", type: "basic, elf", skills: { endurance: 10, large_blade: 10, navigation: 12, survival: 12, }, }, { name: "halfling_gong_farmer", type: "basic, halfling", skills: { bargain: 10, medicine: 10, small_blade: 12, streetwise: 12, }, }, { name: "halfling_pie_master", type: "basic, halfling", skills: { bargain: 10, small_blade: 10, persuasion: 12, streetwise: 12, }, }, // COMPENDIUM ADVANCED { name: "dwarf_battlesmith", type: "advanced, dwarf", skills: { appraise: 14, endurance: 14, history: 14, intimidate: 16, repair: 16, }, }, { name: "dwarf_slayer", type: "advanced, dwarf", skills: { athletics: 14, brawling: 14, medicine: 14, intimidate: 16, large_blade: 16, }, }, { name: "elf_agent", type: "advanced, elf", skills: { diplomacy: 16, language: 16, persuasion: 16, sleight_of_hand: 14, streetwise: 14, }, }, { name: "elf_champion", type: "advanced, elf", skills: { spot: 14, survival: 14, thrown: 14, intimidate: 16, large_blade: 16, }, }, { name: "halfling_burglar", type: "advanced, halfling", skills: { appraise: 14, athletics: 14, dodge: 14, spot: 16, stealth: 16, }, }, { name: "halfling_gaffer", type: "advanced, halfling", skills: { brawling: 14, lie: 14, intimidate: 14, command: 16, streetwise: 16, }, }, // COMPENDIUM ADVANCED SPELLCASTERS { name: "dwarf_runeforger", type: "advanced, dwarf", skills: { appraise: 14, command: 14, diplomacy: 14, incantation: 16, language: 16, }, }, { name: "halfling_conjurer", type: "advanced, halfling", skills: { disguise: 14, lie: 14, streetwise: 14, persuasion: 16, sleight_of_hand: 16, }, }, { name: "elf_druid", type: "advanced, elf", skills: { medicine: 14, small_blades: 14, spot: 14, navigation: 16, survival: 16, }, }, // KINGDOM BASIC { name: "docker", type: "basic", skills: { appraise: 10, brawling: 10, intimidate: 10, streetwise: 12, swimming: 12, }, }, { name: "fish_warden", type: "basic", skills: { blunt: 10, repair: 10, thrown: 10, navigation: 12, swimming: 12, }, }, { name: "mudlark", type: "basic", skills: { spot: 10, survival: 10, thrown: 10, endurance: 12, swimming: 12, }, }, { name: "night_watchman", type: "basic", skills: { blunt: 10, lie: 10, navigation: 10, stealth: 12, streetwise: 12, }, }, { name: "publican", type: "basic", skills: { bargain: 10, history: 10, spot: 10, blunt: 12, persuasion: 12, }, }, { name: "servant", type: "basic", skills: { bargain: 10, endurance: 10, history: 10, spot: 12, stealth: 12, }, }, // GOBLINS BASIC { name: "hedge_wizard", type: "basic, goblin", skills: { blunt: 10, navigation: 10, medicine: 12, survival: 12, }, }, { name: "goblin_pedlar", type: "basic, goblin", skills: { diplomacy: 10, sleight_of_hand: 10, blunt: 12, bargain: 12, }, }, { name: "guttersnipe", type: "basic, goblin", skills: { athletics: 10, blunt: 10, stealth: 12, sleight_of_hand: 12, }, }, { name: "mushroom_farmer", type: "basic, goblin", skills: { blunt: 10, brawling: 10, medicine: 12, navigation: 12, spot: 12, }, }, { name: "spider_rider", type: "basic, goblin", skills: { appraise: 10, bow: 10, small_blade: 12, ostler: 12, survival: 12, }, }, { name: "tinkerer", type: "basic, goblin", skills: { small_blades: 10, sleight_of_hand: 10, repair: 12, spot: 12, }, }, // GOBLINS ADVANCED { name: "emissary", type: "advanced, goblin", skills: { history: 14, languages: 14, appraise: 14, persuasion: 16, diplomacy: 16, }, }, { name: "spelunker", type: "advanced. goblin", skills: { spot: 14, swimming: 14, stealth: 14, navigation: 16, athletics: 16, }, }, { name: "sporceror", type: "advanced, goblin", skills: { stealth: 14, navigation: 14, medicine: 14, spot: 16, incantation: 16, }, }, ], } // CAREER PARSER const careerStr = `SPORCEROR Stealth 14, Navigation 14, Medicine 14 Survival 16, Spot 16, Incantation 16`; const processCareer = (inp) => { let skillObj = {}; const rxCareerName = /^[^A-Za-z]*([a-zA-Z'\s]+)\n/; let cName = inp.match(rxCareerName)?.[1]?.toLowerCase().trim().replace(/\s+/g, '_'); if (!cName) return console.error('No name found'); let skills = inp.replace(rxCareerName, '').split(/,/g).filter(v=>v); skills.map(sk => { let parts = sk.match(/([^\d]+)(\d+)/); if (!parts[2]) return console.error(`Bad skill format`); let skName = parts[1].toLowerCase().trim().replace(/(\s+|-)/g, '_'); skillObj[skName] = parseInt(parts[2]); }); let skillMax = Object.values(skillObj).reduce((a,v) => a = Math.max(a,v)); let racial = (cName.match(/(^|\s)(elf|dwarf|halfling|goblin)[\s_]+/i)||[])[2]; //console.log(racial); let tags = (skillMax > 12) ? 'advanced' : 'basic'; tags += (racial) ? `, ${racial}` : ``; return { name: cName, type: tags, skills: skillObj }; } //let aOutput = (processCareer(careerStr)); //console.log(aOutput); const skills = ['appraise', 'athletics', 'bargain', 'blunt', 'bow', 'brawling', 'command', 'crossbow', 'diplomacy', 'disguise', 'dodge', 'endurance', 'history', 'incantation', 'intimidate', 'language', 'large_blade', 'lie', 'medicine', 'navigation', 'ostler', 'persuasion', 'pole_arm', 'repair', 'sleight_of_hand', 'small_blade', 'spot', 'stealth', 'streetwise', 'survival', 'swimming', 'thrown']; const skillsMax = skills.map(sk => sk += '_max'); const rxRaces = /(\b|_)(elf|dwarf|halfling|goblin)(\b|_)/i; // ADVENTURING SKILLS HTML const generateSkillListHTML = (side='left', linebreaks) => { let reqSkills = /^l/.test(side) ? skills.slice(0, 16) : skills.slice(16); let output = ''; reqSkills.map(sk => { output += `