Created
October 30, 2013 05:45
-
-
Save goblinHordes/7227708 to your computer and use it in GitHub Desktop.
BFRpg.js - Basic Fantasy Role-Playing Game for Roll20 API
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Function.prototype.inheritsFrom = function( parentClassOrObject ){ | |
if ( parentClassOrObject.constructor == Function ) | |
{ | |
//Normal Inheritance | |
this.prototype = new parentClassOrObject; | |
this.prototype.constructor = this; | |
this.prototype.parent = parentClassOrObject.prototype; | |
if(this.prototype.parent.constructor.children) | |
this.prototype.parent.constructor.children.push(this); | |
else | |
this.prototype.parent.constructor.children = [ this ]; | |
} | |
else | |
{ | |
//Pure Virtual Inheritance | |
this.prototype = parentClassOrObject; | |
this.prototype.constructor = this; | |
this.prototype.parent = parentClassOrObject; | |
} | |
return this; | |
} | |
String.prototype.toProperCase = function () { | |
return this.replace(/([^\W_]+[^\s-]*) */g, | |
function(txt){ | |
return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase(); | |
}); | |
}; | |
var BFRpg = BFRpg || {}; | |
var bf = BFRpg; | |
bf.StatBlock = function (){ | |
function roll(){ | |
return randomInteger(6) + randomInteger(6) + randomInteger(6); | |
} | |
this.strength = roll(); | |
this.intelligence = roll(); | |
this.wisdom = roll(); | |
this.dexterity = roll(); | |
this.constitution = roll(); | |
this.charisma = roll(); | |
this.toString = function (){ | |
return( ["Str:" + this.strength + "(" + this.modifier('strength') + ")", | |
"Int:" + this.intelligence + "(" + this.modifier('intelligence') + ")", | |
"Wis:" + this.wisdom + "(" + this.modifier('wisdom') + ")", | |
"Dex:" + this.dexterity + "(" + this.modifier('dexterity') + ")", | |
"Con:" + this.constitution + "(" + this.modifier('constitution') + ")", | |
"Cha:" + this.charisma + "(" + this.modifier('charisma') + ")"].join(' ')); | |
} | |
this.modifier = function (stat){ | |
switch(this[stat]) { | |
case 3: | |
return(-3); | |
break; | |
case 4: | |
case 5: | |
return(-2); | |
break; | |
case 6: | |
case 7: | |
case 8: | |
return(-1); | |
break; | |
case 9: | |
case 10: | |
case 11: | |
case 12: | |
return(0); | |
break; | |
case 13: | |
case 14: | |
case 15: | |
return(1); | |
break; | |
case 16: | |
case 17: | |
return(2); | |
break; | |
case 18: | |
return(3); | |
break; | |
} | |
return(undefined); | |
} | |
} | |
bf.PlayerCharacter = function (){ | |
this.level = 0; | |
this.sex; | |
this.hitPoints; | |
this.maxHitPoints = 0; | |
this.class; | |
this.race; | |
this.statBlock; | |
this.toString = function (){ | |
pc = this.fullname() + ", " + [this.sex.toProperCase(), this.race.strings.adjective.toProperCase(), | |
this.class.strings.name.toProperCase()].join(' ') + "\n"; | |
pc += ["HP:" + this.maxHitPoints, this.statBlock.toString()].join(' ') + "\n\n"; | |
return pc | |
} | |
} | |
/* | |
BFRpg.PlayerCharacter.random( options ) | |
Create a random character within the constraints of options. | |
Permitted options: sex, race, class, level | |
*/ | |
bf.PlayerCharacter.random = function (options){ | |
var eClasses = {}; | |
var eRaces = {}; | |
options = typeof options !== 'undefined' ? options : {}; | |
pc = new BFRpg.PlayerCharacter; | |
//dbg.info('selected sex: ' + options.sex); | |
//dbg.info('selected race: ' + options.race); | |
//dbg.info('selected class: ' + options.class); | |
//dbg.info('selected level: ' + options.level); | |
pc.sex = options.sex || ['male', 'female'][(Math.floor(Math.random() * 2))]; | |
while(_.keys(eClasses).length == 0){ | |
matchedPreference = false; | |
while(!matchedPreference) { | |
pc.statBlock = new bf.StatBlock(); | |
eRaces = BFRpg.Race.eligibleRaces(pc.statBlock); | |
//dbg.info('eligible races:' + JSON.stringify(eRaces)); | |
if(options.race) | |
matchedPreference = (_(eRaces).keys().indexOf(options.race)) >= 0 | |
else | |
matchedPreference = true | |
} | |
if(options.race) | |
pc.race = BFRpg.Race.findByName(options.race); | |
else | |
pc.race = BFRpg.Race.selectBest(pc.statBlock); | |
eClasses = BFRpg.Class.eligibleClasses(pc.statBlock, pc.race); | |
//dbg.info('eligible classes:' + JSON.stringify(eClasses)); | |
if(options.class && ((_(eClasses).keys().indexOf(options.class)) < 0)){ eClasses = {} } | |
} | |
if(options.class) | |
pc.class = BFRpg.Class.findByName(options.class); | |
else | |
pc.class = BFRpg.Class.selectBest(pc.statBlock, pc.race); | |
pc.name = pc.race.generateName(pc.sex); | |
pc.hitPoints = pc.levelUp(options.level); | |
return( pc ); | |
} | |
bf.PlayerCharacter.prototype.levelUp = function (){ | |
this.level++; | |
hitDie = this.race.maxHitDie ? Math.min(this.class.hitDie, this.race.maxHitDie) : this.class.hitDie; | |
hitPointUpgrade = randomInteger(hitDie); | |
if(this.level >= 10) | |
hitDiePointUpgrade += ((this.level - 9) * this.class.hitDieBonusMultiplier); | |
else | |
hitPointUpgrade += this.statBlock.modifier('constitution'); | |
hitPointUpgrade = Math.max(1, hitPointUpgrade); | |
this.maxHitPoints += hitPointUpgrade; | |
return hitPointUpgrade; | |
} | |
bf.PlayerCharacter.prototype.fullname = function (){ | |
return(_(this.name).values().join(' ')); | |
} | |
bf.Class = function (){ /* bf.Class */ | |
this.constructor.classes.push(this); | |
} | |
bf.Class.classes = []; | |
bf.Class.prototype.eligible = function (stats){ | |
concordance = this.baseConcordance; | |
eligible = true; | |
_(this.reqs).each(function (req){ | |
if(req.stat){ | |
if(req.min) { | |
concordance += (stats[req.stat] - req.min); | |
if(stats[req.stat] < req.min) | |
eligible = false; | |
} | |
if(req.max) { | |
concordance += (req.max - stats[req.stat]); | |
if(stats[req.stat] > req.max) | |
eligible = false; | |
} | |
} | |
}) | |
//*/ | |
if(eligible) | |
return(concordance); | |
else | |
return(false); | |
}; | |
bf.Class.prototype.baseConcordance = 0; | |
bf.Class.prototype.hitDieBonusMultipler = 1; | |
bf.Class.prototype.bonuses = {} | |
bf.Class.prototype.reqs = {}; | |
bf.Class.prototype.strings = { name: 'undefined Class' }; | |
bf.Class.prototype.toString = function(){ return this.strings.name } | |
bf.Class.prototype.xpToLevel = []; | |
bf.Class.prototype.spellsAtLevel = []; | |
bf.Class.prototype.abilities = []; | |
/* | |
BFRpg.Class.findByName( raceName ) | |
Returns a defined BFRPG.Class by name | |
*/ | |
bf.Class.findByName = function (className){ | |
return _(this.classes).find(function (bfclass){return bfclass.strings.name == className}) | |
} | |
/* | |
BFRpg.Class.selectBest( statBlock, race ) | |
Return the best match class based on the statBlock, race, and concordance. | |
*/ | |
bf.Class.selectBest = function ( statBlock, race ){ | |
var eClasses; | |
var maxConcord; | |
var pClasses; | |
var selectedClass; | |
eClasses = this.eligibleClasses(statBlock, race); | |
maxConcord = _(eClasses).reduce( function(memo, concord){ return Math.max(memo, concord) }, 0); | |
pClasses = _.chain(eClasses) | |
.keys() | |
.filter( function(bfclass) { return eClasses[bfclass] == maxConcord } ) | |
.value(); | |
selectedClass = pClasses[Math.floor(Math.random() * pClasses.length)]; | |
selectedClass = this.findByName( selectedClass ); | |
return( selectedClass ); | |
} | |
/* | |
BFRpg.Class.eligibleClasses( statBlock ) | |
Check against each class to find if it is eligible with the given stats, and if so provide | |
the class concordance value. | |
*/ | |
bf.Class.eligibleClasses = function ( statBlock, race ){ | |
var classes = {}; | |
_.each(bf.Class.classes, function (bfclass){ | |
if((_(race.permittedClasses).indexOf(bfclass.strings.name)>-1) && (concord = bfclass.eligible(statBlock))) | |
classes[bfclass.strings.name] = concord; | |
}); | |
return(classes); | |
} | |
bf.Class.Fighter = new bf.Class; | |
bf.Class.Fighter.strings = { | |
name: 'fighter', | |
shortname: 'F', | |
} | |
bf.Class.Fighter.reqs = [ {stat: 'strength', min: 9 } ]; | |
bf.Class.Fighter.hitDie = 6; | |
bf.Class.Fighter.hitDieBonusMultiplier = 2; | |
bf.Class.MagicUser = new bf.Class; | |
bf.Class.MagicUser.strings = { | |
name: 'magic-user', | |
shortname: 'Mu', | |
} | |
bf.Class.MagicUser.reqs = [ {stat: 'intelligence', min: 9 } ]; | |
bf.Class.MagicUser.hitDie = 4; | |
bf.Class.MagicUser.hitDieBonusMultiplier = 1; | |
bf.Class.MagicUser.spellsPerLevel = [ | |
[1, 0, 0, 0, 0, 0], | |
[2, 0, 0, 0, 0, 0], | |
[2, 1, 0, 0, 0, 0], | |
[2, 2, 0, 0, 0, 0], | |
[2, 2, 1, 0, 0, 0], | |
[3, 2, 2, 0, 0, 0], | |
[3, 2, 2, 1, 0, 0], | |
[3, 3, 2, 2, 0, 0], | |
[3, 3, 2, 2, 1, 0], | |
[4, 3, 3, 2, 2, 0], | |
[4, 4, 3, 2, 2, 1], | |
[4, 4, 3, 3, 2, 2], | |
[4, 4, 4, 3, 2, 2], | |
[4, 4, 4, 3, 3, 2], | |
[5, 4, 4, 3, 3, 2], | |
[5, 5, 4, 3, 3, 2], | |
[5, 5, 4, 4, 3, 3], | |
[6, 5, 4, 4, 3, 3], | |
[6, 5, 5, 4, 3, 3], | |
[6, 5, 5, 4, 4, 3] | |
] | |
bf.Class.Thief = new bf.Class; | |
bf.Class.Thief.strings = { | |
name: 'thief', | |
shortname: 'T', | |
} | |
bf.Class.Thief.reqs = [ {stat: 'dexterity', min: 9 } ]; | |
bf.Class.Thief.hitDie = 4; | |
bf.Class.Thief.hitDieBonusMultiplier = 2; | |
bf.Class.xpToLevel = [ | |
0, 1250, 2500, 5000, 10000, 20000, 40000, 75000, 150000, 225000, 300000, | |
375000, 450000, 525000, 600000, 675000, 750000, 825000, 900000, 975000 | |
] | |
bf.Class.abilities={ | |
"openLocks": [ 25, 30, 35, 40, 45, 50, 55, 60, 65, 68, 71, 74, 77, 80, 83, 84, 85, 86, 87, 88 ], | |
"removeTraps": [ 20, 25, 30, 35, 40, 45, 50, 55, 60, 63, 66, 69, 72, 75, 78, 79, 80, 81, 82, 83 ], | |
"pickPockets": [ 30, 35, 40, 45, 50, 55, 60, 65, 70, 74, 78, 82, 86, 90, 94, 95, 96, 97, 98, 99 ], | |
"moveSilently": [ 25, 30, 35, 40, 45, 50, 55, 60, 65, 68, 71, 74, 77, 80, 83, 85, 87, 89, 91, 93 ], | |
"climbWalls": [ 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99 ], | |
"hide": [ 10, 15, 20, 25, 30, 35, 40, 45, 50, 53, 56, 59, 62, 65, 68, 69, 70, 71, 72, 73 ], | |
"listen": [ 30, 34, 38, 42, 46, 50, 54, 58, 62, 65, 68, 71, 74, 77, 80, 83, 86, 89, 92, 95 ] | |
} | |
bf.Class.Cleric = new bf.Class; | |
bf.Class.Cleric.strings = { | |
name: 'cleric', | |
shortname: 'C', | |
} | |
bf.Class.Cleric.reqs = [ {stat: 'wisdom', min: 9 } ]; | |
bf.Class.Cleric.hitDie = 4; | |
bf.Class.Cleric.hitDieBonusMultiplier = 1; | |
bf.Class.Cleric.spellsPerLevel=[ | |
[0, 0, 0, 0, 0, 0], | |
[1, 0, 0, 0, 0, 0], | |
[2, 0, 0, 0, 0, 0], | |
[2, 1, 0, 0, 0, 0], | |
[2, 2, 0, 0, 0, 0], | |
[2, 2, 1, 0, 0, 0], | |
[3, 2, 2, 0, 0, 0], | |
[3, 2, 2, 1, 0, 0], | |
[3, 3, 2, 2, 0, 0], | |
[3, 3, 2, 2, 1, 0], | |
[4, 3, 3, 2, 2, 0], | |
[4, 4, 3, 2, 2, 1], | |
[4, 4, 3, 3, 2, 2], | |
[4, 4, 4, 3, 2, 2], | |
[4, 4, 4, 3, 3, 2], | |
[5, 4, 4, 3, 3, 2], | |
[5, 5, 4, 3, 3, 2], | |
[5, 5, 4, 4, 3, 3], | |
[6, 5, 4, 4, 3, 3], | |
[6, 5, 5, 4, 3, 3] | |
] | |
bf.Class.Cleric.vsUndead = { | |
skeleton: [13,11,9,7,5,3,2,'T','T','T','D','D','D','D','D','D','D','D','D','D'], | |
zombie: [17,15,13,11,9,7,5,3,2,'T','T','T','D','D','D','D','D','D','D','D'], | |
ghoul: [19,18,17,15,13,11,9,7,5,3,2,'T','T','T','D','D','D','D','D','D'], | |
wight: ['No',20,19,18,17,15,13,11,9,7,5,3,2,'T','T','T','D','D','D','D'], | |
wraith: ['No','No','No',20,19,18,17,15,13,11,9,7,5,3,2,'T','T','T','D','D'], | |
mummy: ['No','No','No','No','No',20,19,18,17,15,13,11,9,7,5,3,2,'T','T','T'], | |
spectre: ['No','No','No','No','No','No','No',20,19,18,17,15,13,11,9,7,5,3,2,'T'], | |
vampire: ['No','No','No','No','No','No','No','No','No',20,19,18,17,15,13,11,9,7,5,3] | |
} | |
bf.Race = {} | |
bf.Race = function (){ /* bf.Race */ | |
this.constructor.races.push(this); | |
} | |
bf.Race.prototype.eligible = function (stats){ | |
concordance = this.baseConcordance; | |
eligible = true; | |
_(this.reqs).each(function (req){ | |
if(req.stat){ | |
if(req.min){ | |
concordance += (stats[req.stat] - req.min); | |
if(stats[req.stat] < req.min) | |
eligible = false; | |
} | |
if(req.max){ | |
concordance += (req.max - stats[req.stat]); | |
if(stats[req.stat] > req.max) | |
eligible = false; | |
} | |
} | |
}) | |
//*/ | |
if(eligible) | |
return(concordance); | |
else | |
return(false); | |
}; | |
/* | |
BFRpg.Race.prototype.generateName( sex='male' ) | |
Generates a random name using tables in the Race, based on provided sex | |
*/ | |
bf.Race.prototype.generateName = function (sex){ | |
sex = sex || 'male'; | |
names = this.names; | |
fullname = []; | |
nameParts = []; | |
_(names.forename[sex]).each( function (nameSet) { | |
while((nextPart = nameSet[(Math.floor(Math.random() * nameSet.length))]) == nameParts[nameParts.length]); | |
nameParts.push(nextPart); | |
}); | |
fullname['forename'] = nameParts.join(''); | |
nameParts = []; | |
_(names.surname).each( function (nameSet) { | |
while((nextPart = nameSet[(Math.floor(Math.random() * nameSet.length))]) == nameParts[nameParts.length]); | |
nameParts.push(nextPart); | |
}); | |
fullname['surname'] = nameParts.join(''); | |
return(fullname); | |
} | |
bf.Race.prototype.baseConcordance = 0; | |
bf.Race.prototype.maxHitDie = undefined; | |
bf.Race.prototype.permittedClasses = bf.Class.classes; | |
bf.Race.prototype.bonuses = []; | |
bf.Race.prototype.reqs = {} | |
bf.Race.prototype.strings = { name: 'undefined Race' } | |
bf.Race.prototype.toString = function(){ return this.strings.name } | |
bf.Race.prototype.names={ | |
forename: { | |
male: [ | |
["Joe", "John", "Jack"], | |
], | |
female: [ | |
["Mary", "Sue", "Jane"], | |
] | |
}, | |
surname: [ | |
['Smith', 'Doe', 'Wilson', 'Donner'], | |
], | |
} | |
bf.Race.races = []; | |
/* | |
BFRpg.Race.findByName( raceName ) | |
Returns a defined BFRPG.Race by name | |
*/ | |
bf.Race.findByName = function (raceName){ | |
return _(this.races).find(function (race){return race.strings.name == raceName}); | |
} | |
/* | |
BFRpg.Race.selectBest( statBlock ) | |
Return the best match race based on the statBlock and racial concordance. | |
*/ | |
bf.Race.selectBest = function (statBlock){ | |
var eRaces; | |
var maxConcord; | |
var pRaces; | |
var selectedRace; | |
// find all eligible races | |
eRaces = this.eligibleRaces(statBlock); | |
// sort by concordance and eliminate all but the top matches | |
maxConcord = _(eRaces).reduce( function (memo, concord){ return Math.max(memo, concord) }, 0); | |
pRaces = _.chain(eRaces) | |
.keys() | |
.filter( function(race) { return eRaces[race] == maxConcord } ) | |
.value(); | |
// if more than one race is eligible with equal concordance, select one randomly | |
selectedRace = pRaces[Math.floor(Math.random() * pRaces.length)]; | |
// convert that to an actual BFRpg.Race | |
selectedRace = this.findByName(selectedRace); | |
return( selectedRace ); | |
} | |
/* | |
BFRpg.Race.eligibleRaces( statBlock ) | |
Check against each race to find if it is eligible with the given stats, and if so provide | |
the racial concordance value. | |
*/ | |
bf.Race.eligibleRaces = function (statBlock){ | |
var races = {}; | |
var concord; | |
_(bf.Race.races).each(function (race){ | |
if(concord = race.eligible(statBlock)) | |
races[race.strings.name] = concord; | |
}) | |
return(races); | |
} | |
bf.Race.Dwarf = new bf.Race; | |
bf.Race.Dwarf.permittedClasses = [ | |
'cleric', 'fighter', 'thief' | |
] | |
bf.Race.Dwarf.reqs = [ | |
{ | |
stat: 'strength', | |
min: '9' | |
}, | |
{ | |
stat: 'charisma', | |
max: '17' | |
}, | |
] | |
bf.Race.Dwarf.bonuses = { | |
saveVs : { | |
deathRay: 4, | |
magicWands: 4, | |
paralysis: 4, | |
spells: 4, | |
dragonBreath: 3, | |
}, | |
} | |
bf.Race.Dwarf.strings = { | |
name: "dwarf", | |
plural: "dwarves", | |
adjective: "dwarven", | |
} | |
bf.Race.Dwarf.names={ | |
forename: { | |
male: [ | |
["B", "L", "D", "M", "F", "N", "G", "R", "G", "S", "H", "T", "K", "V"], | |
["a", "o", "e", "oi", "i", "u"], | |
["bur","mli","fur","nar","gan","nus","gnus","rin","gnar","ran","li","sin","lin","sil","lir","sur"] | |
], | |
female: [ | |
["Al","L","Br","M","C","Mer","Cl","N","D","R","El","S","Gw","Ys","J"], | |
["a","o","ae","u","e","y","ea","w","i"], | |
["brylla","ngwen","cla","niver","dda","noic","ll","ra","lla","rka","llyra","ryan","lonna","ssa","lyan","vyan","na"] | |
] | |
}, | |
surname: [ | |
['Iron', 'Copper', 'Bronze', 'Silver', 'Gold', 'Opal', 'Diamond', 'Hammer', 'Mine', 'Fire', 'Forge'], | |
['smith', 'hammer', 'beard', 'forge', 'brow', 'arm', 'fist', 'leg', 'nose'] | |
], | |
} | |
bf.Race.Elf = new bf.Race; | |
bf.Race.Elf.permittedClasses = [ | |
'cleric', 'figher', 'magic-user', 'thief' | |
] | |
bf.Race.Elf.maxHitDie = 6; | |
bf.Race.Elf.reqs = [ | |
{ | |
stat: 'intelligence', | |
min: '9' | |
}, | |
{ | |
stat: 'constitution', | |
max: '17' | |
}, | |
] | |
bf.Race.Elf.bonuses = { | |
saveVs: { | |
paralysis: 1, | |
magicWands: 2, | |
spells: 2, | |
} | |
} | |
bf.Race.Elf.strings = { | |
name: "elf", | |
plural: "elves", | |
adjective: "elven", | |
} | |
bf.Race.Elf.names={ | |
forename: { | |
male: [ | |
["Abadda", "Abarat", "Adamar", "Adorellan", "Adresin", "Aduce", "Aelrindel", "Aerendyl", "Aermhar", "Aesar", "Aeson", "Afamrail", "Agis", "Aglanthol", "Ainésilver", "Aithlin", "Ajaar", "Akhelbhen", "Akkar", "Alabyran", "Albondiel", "Alinar", "Allain", "Alok", "Alosrin", "Althidon", "Amrynn", "Anarallath", "Andaerean", "Andrathath", "Anfalen", "Anlyth", "Aolis", "Aquilan", "Araevin", "Arandron", "Aravilar", "Arbane", "Ardreth", "Ardryll", "Argus", "Arkhun", "Arkiem", "Arl", "Arlen", "Arun", "Ascal", "Athtar", "Aubric", "Aubron", "Aulathar", "Aulauthar", "Aumanas", "Aumrauth", "Avourel", "Baerdelcoam", "Baerithryn", "Belanor", "Beldroth", "Bellas", "Belstram", "Beluar", "Bhyrindaar", "Biafyndar", "Bialaer", "Braern", "Brindarry", "Buttorwyr", "Cameron", "Chaalmyth", "Chathanglas", "Cheyrth", "Chozzaster", "Chylnoth", "Cluhurach", "Cluym", "Cohnal", "Conall", "Connak", "Cornaith", "Corym", "Cymbiir", "Cystenn", "Dakath", "Dalyor", "Dannyd", "Daratrine", "Darcassan", "Darfin", "Darthoridan", "Deldrach", "Delmuth", "Delsaran", "Dhoelath", "Divisav", "Drannor", "Droth", "Druindar", "Durlan", "Durothil", "Dyffros", "Earynspieir", "Edansyr", "Edicûve", "Edwyrd", "Edyrm", "Ehlark", "Ehrendil", "Eilauver", "Elaethan", "Elaith", "Elandorr", "Elanjar", "Elashor", "Elbauthin", "Elbereth", "Eldaernth", "Eldar", "Eldrin", "Elenshaer", "Elephon", "Elhieardacil", "Elidyr", "Elion", "Elkhazel", "Ellisar", "Elorfindar", "Elorshin", "Elpaerae", "Eltaor", "Eltargrim", "Elénaril", "Emmyth", "Entrydal", "Erendriel", "Erglareo", "Eriladar", "Erlan", "Erlathan", "Eroan", "Erolith", "Eschallus", "Estelar", "Ethlando", "Ettrian", "Euchoé", "Evindal", "Eyrynnhv", "Faahresc", "Faelar", "Faelyn", "Faeranduil", "Falael", "Faoraar", "Felaern", "Fenian", "Fflar", "Fhaornik", "Fhociin", "Filarion", "Filvendor", "Filverel", "Finufaranell", "Flardryn", "Flinar", "Foxfire", "Fylson", "Gaeleath", "Gaelin", "Galaeron", "Galan", "Galather", "Ganamede", "Gantar", "Garrik", "Garynnon", "Giilvas", "Giullio", "Glarald", "Glorandal", "Goronyyv", "Grathgor", "Haalaari", "Hachaam", "Haemir", "Haladavar", "Halafarin", "Halamar", "Haldreithen", "Halflar", "Halgondas", "Halpaeril", "Halueth", "Halueve", "Haryk", "Hastos", "Hatharal", "Hiflanyl", "Hoccar", "Horith", "Hubyr", "Iefyr", "Ievos", "Ihimbraskar", "Ilbryn", "Ilimitar", "Iliphar", "Ilitharath", "Illianaro", "Illithor", "Illitran", "Ilphas", "Ilrune", "Ilthuryn", "Ilyndrathyl", "Inchel", "Inialos", "Injros", "Intevar", "Iolas", "Iolrath", "Itham", "Ithraides", "Ivlisar", "Ivran", "Ivósaar", "Iymbryl", "Iyrandrar", "Iyriklaunavan", "Jandar", "Jannalor", "Jaonos", "Jassin", "Jhaan", "Jhaartael", "Jhaeros", "Jharak", "Jharym", "Jhuvik", "Jonas", "Jonik", "Jorildyn", "Josidiah", "Juppar", "Kahvoerm", "Kalaerede", "Katar", "Katyr", "Keletheryl", "Kelvhan", "Kendel", "Kerym", "Keryth", "Kesefehon", "Khaalindaan", "Kharis", "Khatar", "Khidell", "Khiiral", "Khilseith", "Khuumal", "Khyrmn", "Khyssoun", "Kindroth", "Kivessin", "Kiyuigh", "Klaern", "Kolvar", "Korrigash", "Kroloth", "Kuornos", "Kuskyn", "Kuskyn", "Kymil", "Kyrtaar", "Laeroth", "Lafarallin", "Lamruil", "Laosx", "Larongar", "Larrel", "Lashul", "Lathai", "Lathlaeril", "Leayonadas", "Leojym", "Lhombaerth", "Lhoris", "Lianthorn", "Llarm", "Llewellenar", "Llombaerth", "Lorsan", "Luirlan", "Luthais", "Luvon", "Lyari", "Lyklor", "Lysanthir", "Maasli", "Maendellyn", "Maeraddyth", "Maeral", "Maiele", "Malgath", "Mardeiym", "Marikoth", "Marlevaur", "Melandrach", "Melisander", "Merellien", "Merith", "Methild", "Mhaenal", "Mihangyl", "Miilaethorn", "Miirphys", "Mirthal", "Mirthal", "Mi’tilarro", "Mlartlar", "Mlossae", "Molonym", "Molostroi", "Montagor", "Morgan", "Morthil", "Mothrys", "Mourn", "Myrddin", "Myriil", "Myrin", "Myronthilar", "Mythanthar", "Naertho", "Naeryndam", "Naeryndam", "Napraeleon", "Narbeth", "Nardual", "Nelaeryn", "Nelaeryn", "Neldor", "Neldor", "Nesterin", "Nevarth", "Nhamashal", "Nieven", "Nindrol", "Ninthalor", "Nlossae", "Nopos", "Norlorn", "Nremyn", "Nuvian", "Nyaalsir", "Nylian", "Nym", "Nyvorlas", "Oacenth", "Oenel", "Ohmbryn", "Olaurae", "Olinsivver", "Olithir", "Onas", "Oncith", "Ondabrar", "Ondroth", "Onvyr", "Orist", "Orlpar", "Orndacil", "Ornthalas", "Ornthalas", "Ortauré", "Orym", "Oslarelar", "Otaehryn", "Otaerhyn", "Othorion", "Paeral", "Paeris", "Passilorris", "Paulorin", "Phaendar", "Pharom", "Phraan", "Pirphal", "Pleufan", "Purtham", "Pyrder", "Pyrravym", "Pywaln", "Pyxaanthal,", "Qildor", "Quastarte", "Quynn", "Raeranthur", "Raibyr", "Ralikanthae", "Ralnor", "Rathal", "Raunaeril", "Rauthomyr", "Rauvelore", "Reluraun", "Reluvethel", "Rennyn", "Reptar", "Respen", "Rhaac'var", "Rhalyf", "Rhangyl", "Rhenalyrr", "Rhespen", "Rhistel", "Rhothomir", "Rhys", "Rilitar", "Riluaneth", "Rolim", "Rotheloe", "Rothilion", "Ruardh", "Ruehar", "Ruith", "Rumathil", "Ruvaen", "Ruven", "Ruvyn", "Rychell", "Ryfon", "Ryul", "Ryvvik,", "Sadalymn", "Saelethil", "Saevel", "Saevel", "Sakrattars", "Sakrattars", "Samblar", "Sandevv", "Seanchai", "Seith", "Seiveril", "Selanlar", "Selgauth", "Shael", "Shammath", "Sharian", "Sharian", "Sharlario", "Shaundyl", "Shevarash", "Shonassir", "Shyrrik", "Siirist", "Silvyr", "Simimar", "Sinaht", "Sinaht", "Skalanis", "Skalanis", "Sontar", "Srindin", "Strohm", "Sudryl", "Sudryl", "Sundamar", "Sylvar", "Symkalr", "Sythaeryn", "Sythaeryn", "Taanyth", "Taegen", "Taeglyn", "Taenaran", "Taeral", "Taerntym", "Taleisin", "Tammson", "Tamnaeuth", "Tamnaeuth", "Tamsin", "Tanithil", "Tannivh", "Tannivh", "Tannyll", "Tanseril", "Tanyl", "Tanyl", "Taranath", "Tarathiel", "Tarathiel", "Taredd", "Tarosspur", "Tarron", "Tasar", "Tassarion", "Tathaln", "Tehlmar", "Teirist", "Tenyajn", "Tethir", "Thalanil", "Thallan", "Thatoryl", "Thiilthan", "Thurdan", "Thurruvyn", "Tiarshus", "Tlannatar", "Tolthe", "Tolthe", "Tordynnar", "Toross", "Traeliorn", "Traeliorn", "Travaran", "Triandal", "Triktappic", "Tsaer", "Tsiilmas", "Tyvollus", "T’karon", "Ualair", "Uevareth", "Uldreiyn", "Uldreiyn", "Urddusk", "Usunaar", "Uthorim", "Vaalyun", "Vaeril", "Valmaxian", "Vander", "Vartan", "Velethuil", "Venali", "Vesperr", "Vesryn", "Vesstan", "Vhoadan", "Vhoorhin", "Vhoori", "Volodar", "Voron", "Waernas", "Wistari", "Wylchyr", "Wylym", "Wyn", "Wyndelleu", "Wyqhael", "Wyrran", "Xalph", "Xanotter", "Xhalh", "Xhalth", "Xharlion", "Yalathanil", "Yeschant", "Yhendorn", "Ylyndar", "Ynloeth", "Zabbas", "Zaltarish", "Zandro", "Zaor", "Zaos", "Zelphar", "Zhoron", "Zulae"] | |
], | |
female: [ | |
["Aelieyeeva", "Aelrue", "Aelynthi", "Aerilaya", "Ahrendaaria", "Ahrendue", "Ahskahala", "Ajhalanda", "Alaglossa", "Alais", "Alauthshaee", "Alavara", "Alea", "Alerathla", "Allannia", "Allisa", "Alloralla", "Allynna", "Almithara", "Aloevan", "Aluendalee", "Alvaerele", "Alyndra", "Amara", "Amaranthae", "Amkissra", "Amlaruil", "Amnestria", "Amra", "Anaharae", "Anarzee", "Aneirin", "Anhaern", "Anyllan", "Ara", "Araushnee", "Aravae", "Arcaena", "Arielimnda", "Arlayna", "Arnarra", "Artin", "Ashemmi", "Aubaudameira", "Auluua", "Aurae", "Ava", "Axilya", "Ayaeqlarune", "Azariah", "Bhuraelea", "Blythswana", "Bonnalurie", "Braerindra", "Caerthynna", "Calarel", "Cauladra", "Chaenath", "Chalsarda", "Chandrelle", "Chasianna", "Chichlandra", "Chin’nesstre", "Chomylla", "Cilivren", "Ciyradyl", "Claire", "Csharynn", "Daenalaia", "Daratrine", "Darshee", "Dasyra", "Dathlue", "Dathlue", "Dathlue", "Delimbiyra", "Delshandra", "Deularla", "Duilya", "Eallyrl", "Ecaeris", "Edraele", "Elanalue", "Elanil", "Elasha", "Eldratha", "Eletha", "Ellarian", "Ellifain", "Eloen", "Elora", "Elvandaruil", "Elénaril", "Embrae", "Emvorele", "Enajharas", "Eshenesra", "Essaerae", "Esta", "Ester", "Esyae", "Faranni", "Faunalyn", "Fhaertala", "Fieryat", "Filaurel", "Filauria", "Fildaerae", "Fox-at-Twilight", "Francessca", "Gaelira", "Gaerradh", "Gaylia", "Gemstarzah", "Ghilanna", "Glynnii", "Gweyr", "Gwynnestri", "Gylledha", "Haalija", "Hacathra", "Halaema", "Halaema", "Halama", "Halanaestra", "Hamalitia", "Haramara", "Helartha", "Hhora", "Holone", "Huquethae", "Hycis", "Iahalae", "Ialantha", "Ikeshia", "Ildilyntra", "Ilmadia", "Ilsevel", "Ilyrana", "Ilyrana", "Ilythyrra", "Imdalace", "Imizael", "Immianthe", "Immianthe", "Imra", "Imramarthree", "Imryll", "Innovindil", "Ioelena", "Irhaal", "Isciira", "Isilfarrel", "Ithrythra", "Itiireae", "Itylra", "Jastra", "Jeardra", "Jhaer", "Jhalass", "Jhanandra", "Jhaumrithe", "Jhiilsraa", "Kavrala", "Kaylessa", "Keerla", "Keishara", "Kethryllia", "Keya", "Khiipaera", "Kileontheal", "Kythaela", "Laamtora", "Laerdya", "Laerune", "Laurlaethee", "Lazziar", "Leilatha", "Liluth", "Llamryl", "Lorelei", "Lydi’aleera", "Lyraesel", "Maaleshiira", "Maelyrra", "Maeralya", "Maith", "Makaela", "Malruthiia", "Mariona", "Marissa", "Martainn", "Meira", "Melarue", "Merethyl", "Merialeth", "Meriel", "Merlara", "Mistale", "Mladris", "Mnuvae", "Morgwais", "Moryggan", "Muerlara", "Mylaela", "Mylaerla", "Myriani", "Naevys", "Nakiasha", "Nambra", "Namyriitha", "Nanalethalee", "Nanthee", "Nanthleene", "Naumys", "Nlaea", "Nuala", "Nueleth", "Nuovis", "Nushala", "Nylaathria", "Ochyllyss", "Oluevaera", "Phaerl", "Phantyni", "Phelorna", "Phuingara", "Phyrra", "Pollae", "Puorlaas", "Qemba", "Quamara", "Raejiisa", "Raerauntha", "Rathiain", "Renestrae", "Roanmara", "Ruavia", "Rubrae", "Ryllae", "Saelihn", "Saida", "Sakaala", "Sariandi", "Sarya", "Saélihn", "Schimae", "Seirye", "Seldanna", "Selussa", "Shadowmoon", "Shael", "Shalana", "Shalantha", "Shalendra", "Shalheira", "Shandalar", "Shanyrria", "Sharaera", "Sheedra", "Sheera", "Shialaevar", "Shialaevar", "Shi’larra", "Shoulree", "Shyael", "Shyael", "Shyllisyrr", "Sinnafain", "Soliania", "Soora", "Sorsasta", "Susklahava", "Sylmae", "Symrustar", "Syndra", "Synnorha", "Syrune", "Syviis", "Séonais", "Taenya", "Takari", "Talaedra", "Talanashta", "Talila", "Talindra", "Tamara", "Tarasynora", "Teharissa", "Teryani", "Thalaera", "Thalanil", "Thaola", "Thasitalia", "Throleatha", "Tiatha", "Tira’allara", "Tiriara", "Tisharu", "Tsarra", "Tyllaetha,", "Ulelesse", "Unae", "Urmicca", "Uschymna", "Vaervenshalice", "Valindra", "Vashti", "Velaethaunyl", "Velatha", "Veluthil", "Verrona", "Vestele", "Viansola", "Winterflower", "Xiiltharra", "Yaereene", "Yalanilue", "Yathlanae", "Yeshelné", "Yghiilra", "Ygrainne", "Ynshael", "Yrlissa", "Yrneha", "Yrthraethra", "Ysmyrlda", "Ytharra", "Yulmanda", "Zhuirentel", "Zoastria", "Z’Beryl"] | |
] | |
}, | |
surname: [ | |
["Aelasar", "Aelorothi", "Aendryr", "Aerasumé", "Aeravansel", "Agayous", "Agrivar", "Ahmaquissar", "Alaenree", "Alantar", "Alastrarra", "Alavara", "Alenuath", "Alerothi", "Alluth", "Aloevan", "Aluianti", "Aluviirsaan", "Amalith", "Amarallis", "Amaratharr", "Amarthen", "Ammath", "Amrallatha", "Anuaer", "Argentaamn", "Arren", "Ash", "Ashgrove", "Audark", "Auglamyr", "Auglathla", "Aunglor", "Autumnfire", "Bellas", "Berethryl", "Berilan", "Bharaclaiev", "Bhephel", "Blackhelm", "Braegen", "Briarbosk", "Brightcloak", "Brightsong", "Brightwing", "Caersaelk", "Calaudra", "Calauth", "Camusiil", "Cathdeiryn", "Ceretlan", "Chaadren", "Chamaranthe", "Clatharla", "Cormyth", "Coudoarluth", "Craulnober", "Crystalembers", "Dahast", "Dawnhorn", "Dhorinshyl", "Dlardrageth", "Doedance", "Donnathlascen", "Dracoseir", "Dree", "Duirsar", "Durothil", "Duskmere", "Duthjuth", "Ealoeth", "Echorn", "Elassidil", "Elaéyadar", "Elian", "Ellarian", "Elond", "Eluarshee", "Ereuvyn", "Erkowe", "Erladden", "Erlshade", "Eroth", "Estelda", "Evanara", "Eveningfall", "Everlove", "Evioro", "Eyriendor", "Faerondaerl", "Faerondarl", "Falanae", "Felinaun", "Fellmirr", "Fenmarel", "Fflannidan", "Floshin", "Fynnasla", "Gildenguard", "Goadulphyn", "Goldenleaf", "Gourael", "Greencloak", "Gwaelon", "Haell", "Haerlgent", "Haevaul", "Haladar", "Halavanthlarr", "Hawksong", "Hlarr", "Hyshaanth", "Iazymnal", "Ibryiil", "Ilbaereth", "Ilbenalu", "Ildacer", "Ildroun", "Iliathor", "Iliathor", "Iliathorr", "Ilnatar", "Immeril", "Ipyllasc", "Irian", "Irithyl", "Irithyl", "Ithruen", "Iydril", "Jaglene", "Kadelaryn", "Kelerandri", "Kelpor’ral", "Keove", "Kevanarial", "Korianthil", "Kraok", "Laelithar", "Laralytha", "Larenthanil", "Larethian", "Laughingwater", "Leafbower", "Leafsigil", "Le’Quella", "Lharithlyn", "Lhoril", "Lightshiver", "Llundlar", "Loceath", "M'Haaren", "Maendellyn", "Maerdrym", "Meirityn", "Melruth", "Miritar", "Mistrivvin", "Mistwinter", "Mithalvarin", "Moonbow", "Moondown", "Moonflower", "Moonglade", "Moonglamaer", "Moonsnow", "Moonweather", "Morningdove", "Mornmist", "Mrhulaedir", "Nacnar", "Naelgrath", "Narlbeth", "Narlbeth", "Neirdre", "Nelnueve", "Never", "Nhachashaal", "Nharimlur", "Nhaéslal", "Nierde", "Nightmeadow", "Nightstar", "Nightwing", "Nihmedu", "Nimesin", "Ni’Tessine", "Nlossae", "Nlossae", "Nolbrae", "Nyamtharsar", "Nyntynel", "Oakstaff", "Oakwood", "Olortynnal", "Olyrnn", "Omberdawn", "Ongluth", "Orama", "Orbryn", "Orbryn", "Ortauré", "Oumryn", "Phenthae", "Pholont", "Presrae", "Q'Naepp,", "Rachiilstar", "Raedrimn", "Raryndur", "Reithel", "Revven", "Rhaevaern", "Rhothomir", "Rhuidhen", "Rhyllgallohyr", "Rivleam", "Rivvikyn", "Runemaster", "Sarsantyr", "Selakiir", "Selmer", "Selorn", "Shadowmantle", "Shadowwater", "Shaeremae", "Shaethe", "Shalandalan", "Sharrith", "Shaurlanglar", "Shraiee", "Shyr", "Sicafei", "Siltral", "Silverbow", "Silverhand", "Silveroak", "Silverspear", "Sinaran", "Slenderbow", "Soryn", "Spellstalker", "Srinshee", "Starbrow", "Starglance", "Starglow", "Starnar", "Starym", "Stillhawk", "Stilmyst", "Straeth", "Strongbow", "Suldusk", "Sultaasar", "Summerstars", "Sunweaver", "Swordstar", "Symbaern", "Talandren", "Talesspur", "Tamlyranth", "Tanagathor", "Tarnruth", "Tarsap", "Tarsis", "Tassarion", "Taurntyrith", "Tellynnan", "Teshurr", "Thea", "Tlanbourn", "Tohrthaal", "Toralynnsyr", "Tornglara", "Tornglara", "Torthtan", "Toryvhallen", "Trueshot", "Tsornyl", "Tyrneladhelu", "Uirthur", "Ulondarr", "Ulongyr", "Vandiir", "Veverell", "Vispasial", "Vyshaan", "Waelvor", "Whitethistle", "Windstar", "Windwalker", "Xantrani", "Yeschant", "Yhendorn", "Yraueme", "Yridnae", "Yundraer"] | |
], | |
} | |
bf.Race.Halfling = new bf.Race; | |
bf.Race.Halfling.permittedClasses = [ | |
'cleric', 'fighter', 'thief' | |
] | |
bf.Race.Halfling.maxHitDie = 6; | |
bf.Race.Halfling.reqs = [ | |
{ | |
stat: 'dexterity', | |
min: '9' | |
}, | |
{ | |
stat: 'strength', | |
max: '17' | |
}, | |
] | |
bf.Race.Halfling.bonuses = { | |
toHit: 1, | |
initiative: 1, | |
saveVs : { | |
deathRay: 4, | |
magicWands: 4, | |
paralysis: 4, | |
spells: 4, | |
dragonBreath: 3, | |
}, | |
} | |
bf.Race.Halfling.strings = { | |
name: "halfling", | |
plural: "halflings", | |
adjective: "halfling", | |
} | |
bf.Race.Halfling.names={ | |
forename: { | |
male: [ | |
["Adalgrim", "Adelard", "Andwise", "Balbo", "Bandobras", "Berilac", "Bilbo", "Bingo", "Bodo", "Bowman", "Bungo", "Deagol", "Dinodas", "Doderick", "Drogo", "Dudo", "Erling", "Everard", "Fastolph", "Fastred", "Ferdibrand", "Ferdinard", "Ferumbras", "Filibert", "Flambard", "Folco", "Fosco", "Fredegar", "Frodo", "Gerontius", "Gorbadoc", "Gorbulas", "Gorhendad", "Gormadoc", "Griffo", "Gundabald", "Halfred", "Hamfast", "Hamson", "Hending", "Hildibrand", "Hildifons", "Hildigrim", "Hobson", "Hugo", "Ilberic", "Isembold", "Isengar", "Isengrim", "Isumbras", "Largo", "Longo", "Lotho", "Madoc", "Marmadas", "Marmadoc", "Marroc", "Matta", "Meriadoc", "Merimac", "Merimas", "Milo", "Minto", "Moro", "Mosco", "Moto", "Mungo", "Odo", "Odovacar", "Olo", "Orgulas", "Otho", "Paladin", "Peregrin", "Pippin", "Polo", "Ponto", "Porto", "Posco", "Reginard", "Robin", "Rorimac", "Rudigar", "Rufus", "Sadoc", "Samwise", "Sancho", "Saradas", "Saradoc", "Seredic", "Sigismond", "Smeagol", "Togo", "Tolman", "Tomba", "Wilcome", "Wilibald", "Bebo", "Bedo", "Beffo", "Bibu", "Bidu", "Biffu", "Bebdu", "Bobdo", "Bodo", "Bodu", "Boffin", "Dedo", "Dedu", "Diffu", "Dudo", "Febo", "Febu", "Figo", "Figu", "Fiffu", "Frado", "Frago", "Fralo", "Fredo", "Frego", "Frelo", "Frido", "Frigo", "Frilo", "Frudi", "Frugo", "Frulo", "Fubo", "Fubdo", "Gebu", "Gedo", "Geffin", "Odo", "Odu", "Olo", "Olu", "Pedo", "Pidu", "Pudo", "Tedo", "Tedu", "Tibu", "Tidu", "Todo", "Togo"] | |
], | |
female: [ | |
["Adaldrida", "Amranth", "Amaryllis", "Angelica", "Aspodel", "Belba", "Belladonna", "Berylla", | |
"Camellia", "Carissa", "Celandine", "Charmaine", "Cora", "Crystal", "Daisy", "Diamond", | |
"Donamira", "Dora", "Eglantine", "Elanor", "Esmerelda", "Euphemia", "Gilly", "Gwiston", "Hilda", | |
"Jillian", "Lavinia", "Lily", "Lidda", "Lobelia", "Malva", "Marigold", "May", "Melindy", "Mentha", | |
"Merla", "Mimosa", "Mirabella", "Myrtle", "Pansy", "Pearl", "Pedderee", "Peony", "Petrilly", | |
"Poppy", "Portia", "Primula", "Prisca", "Rose", "Ruby", "Seraphina", "Susannah", "Verna", "Viloet"] | |
] | |
}, | |
surname: [ | |
["Apple", "Barn", "Boffin", "Brace", "Brandy", "Broad", "Brocks", "Brown", "Bun", "Bunce", "Burrow", "Bush", "Butter", "Chubb", "Cotton", "Crumble", "Darns", "Digger", "Digs", "Fallo", "Farrow", "Fine", "Fleam", "Furry", "Goat", "Gold", "Good", "Green", "Grubb", "Handy", "Har", "Hay", "Heather", "Hedge", "Hemp", "Hilly", "Hole", "Horn", "Jumps", "Leather", "Light", "Long", "Mangle", "Mill", "More", "Mud", "Mug", "Neer", "Ness", "New", "Odd", "Old", "Over", "Park", "Patch", "Pick", "Prim", "Proud", "Puddi", "Red", "Root", "Rope", "Rumble", "Rush", "Sack", "Sand", "Sandy", "Shuffle", "Small", "Spinner", "Stone", "Tea", "Thistle", "Top", "Two", "Under", "Whit", "Worry"], | |
["back", "bar", "beam", "belly", "belt", "berry", "body", "buck", "bucket", "buff", "bur", "burrow", "by", "child", "cleve", "closet", "corn", "dore", "down", "fettle", "foot", "gather", "girdle", "hand", "heaver", "hide", "hill", "holm", "house", "leaf", "light", "lock", "mould", "petal", "pie", "pond", "ruffin", "sack", "smith", "stone", "thistle", "thorn", "toes", "ville", "ward", "well", "wise", "wool", "wort", "worthy"] | |
], | |
} | |
bf.Race.Human = new bf.Race; | |
bf.Race.Human.permittedClasses = [ | |
'cleric', 'fighter', 'magic-user', 'thief' | |
] | |
bf.Race.Human.baseConcordance = 9; | |
bf.Race.Human.strings = { | |
name: "human", | |
plural: "humans", | |
adjective: "human", | |
} | |
bf.Race.Human.names={ | |
forename: { | |
male: [ | |
["Althalos", "Arthur", "Asher", "Barda", "Benedict", "Berinon", "Borin", "Brom", | |
"Bryce", "Carac", "Cassius", "Cedric", "Charles", "Clifton", "Dain", "Destrian", | |
"Donald", "Doran", "Edmund", "Favian", "Fendrel", "Forthwind", "Francis", | |
"Frederick", "Gavin", "Geoffrey", "Gregory", "Hadrian", "Henry", "Janshai", | |
"Jarin", "John", "Josef", "Joseph", "Leo", "Leofrick", "Letholdus", "Lief", | |
"Merek", "Oliver", "Peter", "Peyton", "Quinn", "Robin", "Roger", "Ronald", "Rowan", | |
"Rulf", "Sadon", "Simon", "Terrin", "Terrowin", "Terryn", "Thomas", "Tybalt", | |
"Ulric", "Walter", "William", "Xalvador", "Xavior", "Zane"] | |
], | |
female: [ | |
["Adelaide", "Aleida", "Alexia", "Alianor", "Alice", "Alys", "Amelia", "Anastas", | |
"Angmar", "Anne", "Arabella", "Ariana", "Atheena", "Ayleth", "Beatrix", "Brunhild", | |
"Catherine", "Catrain", "Cedany", "Cristiana", "Dimia", "Duraina", "Eleanor", "Elizabeth", | |
"Ellyn", "Emeline", "Enndolynn", "Esme", "Farfelee", "Gloriana", "Godiva", "Guinevere", | |
"Gussalen", "Gwendolynn", "Helena", "Helewys", "Hildegard", "Isabel", "Isolde", | |
"Jacquelyn", "Janet", "Jasmine", "Josselyn", "Juliana", "Katelyn", "Katrina", "Kaylein", | |
"Krea", "Loreena", "Luanda", "Maerwynn", "Malkyn", "Margaret", "Maria", "Mary", "Matilda", | |
"Millicent", "Mirabelle", "Muriel", "Peronell", "Phrowenia", "Rainydayas", "Rose", "Ryia", | |
"Seraphina", "Sybbyl", "Thea", "Victoria", "Winifred", "Ysmay"] | |
] | |
}, | |
surname: [ | |
["Achard", "Addinell", "Adeney", "Aguilon", "Albelin", "Alevi", "Alis", "Altard", "Ansgot", "Anzeray", "Arundel", "Aschuill", "Asselin", "Auber", "Aubert", "Auffrye", "Aungier", "Auvray", "Azor", "Bachiler", "Baignard", "Bailleul", "Bainard", "Baliol", "Ballard", "Barkentin", "Basnage", "Basset", "Baudry", "Baujot", "Bauldry", "Bauquemare", "Bavent", "Beaumanoir", "Beaumarchais", "Beaumont", "Beauvallet", "Becdelièvre", "Bele", "Belet", "Bellecote", "Belmis", "Benoist", "Beringar", "Berners", "Bernières", "Bertran", "Bigot", "Blancbaston", "Blangi", "Blosbeville", "Blouet", "Bohon", "Boisivon", "Boislevesque", "Boissel", "Boivin", "Bolam", "Bolbec", "Bondeville", "Bonel", "Bonenffant", "Boneth", "Bonvalet", "Bordel", "Bosanquet", "Bosc", "Bosiet", "Bossard", "Bostel", "Boteler", "Boterel", "Botin", "Bouchard", "Bourchier", "Bourdekin", "Bourdet", "Bourneville", "Bradwardine", "Brai", "Braund", "Brebeuf", "Brereton", "Bretel", "Breteuil", "Bretteville", "Brèvedent", "Brimou", "Brinon", "Briouse", "Briqueville", "Brix", "Buci", "Budi", "Bulli", "Burci", "Burguet", "Buron", "Bursigni", "Busnois", "Busquent", "Caen", "Cailli", "Caillot", "Cairon", "Calmette", "Cambrai", "Campion", "Canaigres", "Canouville", "Caradas", "Carbonnel", "Cardon", "Cardonell", "Carnet", "Carteret", "Castillon", "Caunter", "Cavelier", "Ceauce", "Cely", "Challenge", "Chandos", "Chartres", "Chauncy", "Cheney", "Cherbourg", "Cioches", "Claville", "Clerinell", "Clinchamps", "Coliar", "Colleville", "Colombelles", "Colombieres", "Comyn", "Conteville", "Corbet", "Corbière", "Corbon", "Cormeilles", "Corneilles", "Corviser", "Cosin", "Couci", "Couer", "Courcelle", "Courcelles", "Courci", "Courcon", "Courcy", "Courseume", "Craon", "Crevecoeur", "Croc", "Cruel", "Cugey", "Cul de Louf", "Culai", "Cumin", "Curteys", "d'Ouilli", "d'Adreci", "d'Aguillon", "d'Albert", "d'Alencon", "Dalyngridge", "d'Amboise", "d'Ambray", "Damours", "d'Andeli", "d'Andre", "d'Angers", "d'Angerville", "d'Angleville", "Danneville", "d'Ansleville", "Danvers", "Darcy", "Darell", "d'Argentan", "D'Argouges", "d'Argues", "d'Armentieres", "d'Arques", "d'Athenous", "d'Aubernon", "d'Auberville", "d'Audrieu", "d'Aufai", "d'Aumale", "Daunger", "d'Aunon", "D'Auvay", "D'Auvrecher", "d'Avranches", "d'Avre", "de Bailleul", "de Balon", "de Bans", "de Bapaumes", "de Barbes", "de Beauchamp", "de Beaufou", "de Beaumais", "de Beaumont", "de Beauvais", "de Bellehache", "de Bellemare", "de Bellièvre", "de Belmeis", "De Berchelai", "de Bercheres", "de Bernai", "de Bernieres", "de Berranger", "de Berville", "de Bethencourt", "de Bienfaite", "de Biville", "de Blays", "de Blundville", "de Bouilon", "de Bourgueville", "de Breos", "de Cahaihnes", "de Calmesnil", "de Caulmont", "de Caux", "de Challon", "de Chefderue", "de Civille", "de Corbeil", "de Cormeilles", "de Coucy", "de Courseilles", "de Croismare", "de Faicterau", "De Felius", "De Fry", "de Genville", "de Gosbeck", "de Grieu", "de Hanivel", "de Hattes", "de Herle", "de Ireby", "de La Champagne", "de La Hay", "de La Mare", "de La Noue", "de La Place", "de La Porte", "de La Reue", "de La Roche", "de Lampérière", "de Lombelon", "de Lorraine", "de Malhortye", "de Maromme", "de Massard", "de Mesniel", "de Mesnildo", "de Monchy", "de Monluc", "de Montchrestien", "de Montfault", "de Montgomery", "de Moustiers", "de Moy", "de Munchesney", "de Pardieu", "de Perronet", "de Pinchemont", "de Recusson", "de Rely", "de Reymes", "de Roncherolles", "de Salynges", "de Saussay", "de Savage", "de Seguzzo", "de Servian", "de Seyssel", "de Tanie", "de Tocni", "de Toeni", "de Valles", "de Vandes", "de Vaux", "de Vesci", "de Villy", "de Viuepont", "de Vymont", "d'Ecouis", "d'Engagne", "d'Eresby", "des Moutiers", "des Vaux", "d'Escalles", "Deschamps", "Desmares", "d'Espagne", "Destain", "d'Eu", "d'Evreux", "d'Helion", "d'Hericy", "d'Houdetot", "Digby", "d'Incourt", "Ditton", "Dive Beugelin", "d'Ivri", "Dol Hugue", "d'Olgeanc", "d'Orbec", "d'Orglande", "d'Ornontville", "Douai", "Dreux", "Droullin", "Druel", "du Bec", "du Bois-Hebert", "du Bosc-Roard", "du Breuil", "Du Buisson", "Du Gouey", "du Merle", "Du Moucel", "du Perche", "Du Perron", "du Quesnai", "du Saussai", "du Theil", "du Tilleul", "Dubosc", "Dufay", "Dufour", "Duhamel", "Dumont", "d'Unepac", "Dupasquier", "Duquesne", "Durandal", "Durerie", "Durjardin", "Durville", "Duval", "Dyel", "Ecouland", "Elers", "Emory", "Engerrand", "Erquemboure", "Espec", "Esteney", "Evelyn", "Eveque", "Faceby", "Faintree", "Falaise", "Fantosme", "Faucon", "Fecamp", "Fergant", "Ferrieres", "Feu", "Fitzalan", "Fitzherbert", "Fitzhugh", "Fitzroy", "Flambard", "Folet", "Foliot", "Fonnereau", "Fontemai", "Fossard", "Fougeres", "Fourneaux", "Framan", "Fresle", "Fribois", "Froissart", "Fromentin", "Furnival", "Gael", "Gand", "Garin", "Gaveston", "Gibard", "Giffard", "Gillain", "Gilpin", "Giscard", "Glanville", "Godart", "Godefroy", "Gomboult", "Gouel", "Goulaffre", "Gournai", "Grai", "Grancourt", "Grentemesnil", "Grenteville", "Greslet", "Griffin", "Grimoult", "Grouchet", "Groulart", "Guéribout", "Guernon", "Gueron", "Guideville", "Guiffart", "Guildersleeve", "Guinand", "Gurney", "Guyot", "Hachet", "Halacre", "Hallé", "Hamage", "Harcourt", "Haute", "Hauville", "Hédiart", "Hendry", "Herbard", "Heriet", "Heuzé", "Hewse", "Hodenc", "Holland", "Hotot", "Hue", "Hugonin", "Hynde", "Ide", "Jolland", "Jubert", "la Berviere", "la Bruiere", "la Cleve", "la Foret", "la Guierche", "la Mare", "la Pommeraie", "la Riviere", "La Vache", "La Verrier", "Labbé", "Laci", "l'Adoube", "l'Aigle", "Lallement", "l'Ane", "Lanquetot", "l'Appeville", "l'Archer", "l'Aune", "Le Barge", "le Berruier", "Le Blanc", "le Blond", "le Bouguignon", "le Breton", "Le Chandelier", "Le Clerc", "Le Conte", "Le Cordier", "Le Cornu", "le Despensier", "Le Doulcet", "le Flamand", "le Gaucher", "Le Goix", "Le Grant", "Le Gras", "Le Jumel", "Le Lieur", "Le Maistre", "Le Marchant", "le Marechal", "Le Marinier", "Le Masson", "Le Paulmier", "Le Pelletier", "Le Pesant", "le Poitevin", "Le Prévost", "le Roux", "Le Roux", "Le Seigneur", "le Senechal", "Le Sueur", "Le Tellier", "le Vicomte", "Lefebre", "l'Estourmi", "Letre", "Levasseur", "Lhuillier", "Libourg", "Ligonier", "L'ile", "Linesi", "Lisieux", "Loges", "Lorz", "Loucelles", "Louet", "Louvet", "Lovet", "Lucy", "Ludel", "Lynom", "Machault", "Machel", "Maci", "Maignart", "Malet", "Mallebisse", "Malleville", "Mallilie", "Mallory", "Malvallet", "Malveisin", "Maminot", "Mandeville", "Manneilli", "Mansel", "Mantel", "Marchés", "Marchmain", "Marci", "Marescot", "Margas", "Mariage", "Marillac", "Marisco", "Martel", "Mathan", "Maubenc", "Maudit", "Mauduit", "Maunsell", "Maurouard", "Mautravers", "Maynet", "Medley", "Mercier", "Meri", "Merteberge", "Mesnage", "Meulan", "Meules", "Meverel", "Middleton", "Mobec", "Moion", "Monceaux", "Montacute", "Montaigu", "Montbrai", "Mont-Canisi", "Montfiquet", "Montfort", "Montgomery", "Montgommeri", "Moron", "Morphew", "Mortagne", "Mortain", "Mortemer", "Mortmain", "Moyaux", "Mucedent", "Munneville", "Murdac", "Musard", "Musart", "Mussegros", "Mustel", "Nelond", "Neot", "Nesdin", "Neufmarche", "Neuville", "Noyers", "Omand", "Orlebar", "Ormond", "Osmond", "Osmont", "Ouistreham", "Painel", "Paixdecouer", "Pancevolt", "Pantoul", "Papelion", "Papon", "Paris", "Parry", "Parthenai", "Paschal", "Pasquier", "Pastforeire", "Patris", "Paumera", "Peccoth", "Peche", "Peis", "Pennant", "Perci", "Péricard", "Perroy", "Petremol", "Peveril", "Pevrel", "Picard", "Picot", "Picvini", "Pierrepont", "Pinel", "Pipin", "Pippery", "Piquiri", "Pistres", "Pithou", "Plucknet", "Poer", "Poignant", "Poillei", "Pointel", "Pont", "Pont de l'Arche", "Pontchardon", "Port", "Postel", "Poussin", "Prestcote", "Puchot", "Quesnel", "Quièvremont", "Quincarnon", "Raimbeaucourt", "Rainecourt", "Raleigh", "Rames", "Raoullin", "Rassent", "Ravenot", "Rennes", "Renold", "Restault", "Reviers", "Riebou", "Rivière", "Roard", "Rocque", "Roger", "Romé", "Romenel", "Ros", "Rosai", "Rou", "Roussel", "Runeville", "Sacquerville", "Saint-Clair", "Sainte-d'Aignaux", "Saint-Germain", "Saint-Helene", "Saint-Leger", "Saint-Ouen", "Saint-Quentin", "Saint-Sanson", "Saint-Valeri", "Saint-Waleri", "Saisset", "Sauvigni", "Scolland", "Séguier", "Senarpont", "Senlis", "Sept-Meules", "Simnel", "Sollers", "Somneri", "Sourdeval", "Strivelyn", "Stukely", "Tabraham", "Taillebois", "Taillepied", "Talvace", "Tessel", "Thaon", "Theroulde", "Thibault", "Thiboust", "Thorel", "Tibon", "Tilly", "Tinel", "Tirel", "Toclive", "Torteval", "Touchet", "Tourlaville", "Tourmente", "Tournai", "Tournebulle", "Tournebut", "Tourneville", "Toustain", "Tranchant", "Trelli", "Tulles", "Urry", "Valance", "Valognes", "Vastel", "Vatteville", "Vaubadon", "Vauville", "Vaux", "Vavassour", "Veci", "Venois", "Ventris", "Ver", "Verdun", "Vernold", "Vernon", "Verrall", "Vesci", "Vesli", "Veteripont", "Vieuxpont", "Villehardain", "Villon", "Vipont", "Vis-de-Louf", "Vis-de-Loup", "Vitalis", "Vivers", "Viville", "Voisin", "Wadard", "Warci", "Watteau", "Werables", "Willoughby", "Wissant", "Ygou"] | |
], | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment