|
const _ = require('lodash'); |
|
|
|
const features = [ |
|
'Astrological Botany', |
|
'Astrological Chemistry', |
|
'Biochemical Sorcery', |
|
'Civil Alchemy', |
|
'Consecrated Biochemistry', |
|
'Demonic Anthropology', |
|
'Divinatory Mineralogy', |
|
'Genetic Banishing', |
|
'Hermetic Geography', |
|
'Immunological Incantations', |
|
'Nuclear Illusionism', |
|
'Ritual Astronomy', |
|
'Seismological Divination', |
|
'Spiritual Biochemistry', |
|
'Statistical Occultism', |
|
'Police Necromancer', |
|
'Sixgun Poisoner', |
|
'Pharmaceutical Gunslinger', |
|
'Infernal Banker', |
|
'Spell Analyst', |
|
'Gunslinger Corruptor', |
|
'Torque Interfacer', |
|
'Exo Interfacer', |
|
'Gunpowder Torturer', |
|
'Orbital Gravedigger', |
|
'Phased Linguist', |
|
'Mathematical Pharmacist', |
|
'Plasma Outlaw', |
|
'Malefic Chemist', |
|
'Police Cultist' |
|
]; |
|
|
|
const classnames = ['Archivist', 'Fancyman', 'Linguist', 'Fletcher', |
|
'Notary', 'Berserker-Typist', 'Fishmongerer', 'Manicurist', 'Haberdasher', 'Concierge']; |
|
|
|
const levels = ['1st', '2nd', '3rd', '4th', '5th', '6th', '7th', '8th', '9th', '10th', '11th', '12th', '13th', '14th', '15th', '16th', '17th', '18th', '19th', '20th']; |
|
|
|
const profBonus = [2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6]; |
|
|
|
const getFeature = (level)=>{ |
|
let res = []; |
|
if(_.includes([4, 6, 8, 12, 14, 16, 19], level+1)){ |
|
res = ['Ability Score Improvement']; |
|
} |
|
res = _.union(res, _.sampleSize(features, _.sample([0, 1, 1, 1, 1, 1]))); |
|
if(!res.length) return 'β'; |
|
return res.join(', '); |
|
}; |
|
|
|
module.exports = { |
|
full : function(){ |
|
const classname = _.sample(classnames); |
|
|
|
const maxes = [4, 3, 3, 3, 3, 2, 2, 1, 1]; |
|
const drawSlots = function(Slots){ |
|
let slots = Number(Slots); |
|
return _.times(9, function(i){ |
|
const max = maxes[i]; |
|
if(slots < 1) return 'β'; |
|
const res = _.min([max, slots]); |
|
slots -= res; |
|
return res; |
|
}).join(' | '); |
|
}; |
|
|
|
|
|
let cantrips = 3; |
|
let spells = 1; |
|
let slots = 2; |
|
return `<div class='classTable wide'>\n##### The ${classname}\n` + |
|
`| Level | Proficiency Bonus | Features | Cantrips Known | Spells Known | 1st | 2nd | 3rd | 4th | 5th | 6th | 7th | 8th | 9th |\n`+ |
|
`|:---:|:---:|:---|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|\n${ |
|
_.map(levels, function(levelName, level){ |
|
const res = [ |
|
levelName, |
|
`+${profBonus[level]}`, |
|
getFeature(level), |
|
cantrips, |
|
spells, |
|
drawSlots(slots) |
|
].join(' | '); |
|
|
|
cantrips += _.random(0, 1); |
|
spells += _.random(0, 1); |
|
slots += _.random(0, 2); |
|
|
|
return `| ${res} |`; |
|
}).join('\n')}\n</div>\n\n`; |
|
}, |
|
|
|
half : function(){ |
|
const classname = _.sample(classnames); |
|
|
|
let featureScore = 1; |
|
return `<div class='classTable'>\n##### The ${classname}\n` + |
|
`| Level | Proficiency Bonus | Features | ${_.sample(features)}|\n` + |
|
`|:---:|:---:|:---|:---:|\n${ |
|
_.map(levels, function(levelName, level){ |
|
const res = [ |
|
levelName, |
|
`+${profBonus[level]}`, |
|
getFeature(level), |
|
`+${featureScore}` |
|
].join(' | '); |
|
|
|
featureScore += _.random(0, 1); |
|
|
|
return `| ${res} |`; |
|
}).join('\n')}\n</div>\n\n`; |
|
} |
|
}; |
|
|