Created
June 30, 2018 01:06
-
-
Save fresh4/db2e718c1452fa5e0dfc927080d0a252 to your computer and use it in GitHub Desktop.
dicebot main code
This file contains hidden or 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
const discord = require('discord.js'); | |
const bot = new discord.Client(); | |
var fs = require('fs'), xml2js = require('xml2js'); | |
bot.on('ready', () => { | |
bot.user.setGame('try !monster'); | |
//bot.user.setStatus("dnd"); | |
readNames(); | |
readTables(); | |
readTavern(); | |
readFeat(); | |
readSpell(); | |
readRace(); | |
readClass(); | |
readBackstory(); | |
readConditions(); | |
readMonsters(); | |
readHelp(); | |
}); | |
var classData, raceData, conditionsData, spellData, backstoryData, helpData, monsterData; | |
var tavernPrefix, tavernSuffix, Feats = []; | |
var homebrew = ["looking for","feed","anyone have","criticism","assistance","?", "help"]; | |
var operands = ["+", "-", "*", "/", "^", "!", "sqrt", "%"]; | |
var basicOperands = ["+", "-", "*", "/"]; | |
var classes = ["Barbarian", "Bard", "Cleric", "Druid", "Fighter", "Monk", "Paladin", "Ranger", "Rogue", "Sorcerer", "Warlock", "Wizard"]; | |
var races = ["Dwarf", "Elf", "Halfling", "Human", "Dragonborn", "Gnome", "Half-Elf", "Half-Orc", "Tiefling", "Aasimar", "Tabaxi", "Triton", "Firbolg","Kenku"]; | |
var baseRaces = ["Dwarf", "Elf", "Halfling", "Human", "Dragonborn", "Gnome", "Half-Elf", "Half-Orc", "Tiefling"]; | |
var cards = ["♠1", "♠2", "♠3", "♠4", "♠5", "♠6", "♠7", "♠8", "♠9", "♠10", "♠K", "♠Q", "♠J", "♣1", "♣2", "♣3", "♣4", "♣5", "♣6", "♣7", "♣8", "♣9", "♣10", "♣K", "♣Q", "♣J", "♥1", "♥2", "♥3", "♥4", "♥5", "♥6", "♥7", "♥8", "♥9", "♥10", "♥K", "♥Q", "♥J", "♦1", "♦2", "♦3", "♦4", "♦5", "♦6", "♦7", "♦8", "♦9", "♦10", "♦K", "♦Q", "♦J"]; | |
var suits = ["♠", "♣", "♥", "♦"]; | |
var DragonbornFemale, DragonbornMale, DragonbornClan, DwarfFemale, DwarfMale, DwarfClan, ElfChild, ElfMale, ElfFemale, ElfFamily, GnomeFemale, GnomeMale, GnomeClan, HalflingMale, HalflingFemale, HalflingFamily, HOrcFemale, HOrcMale, HumanMale, TieflingMale, TieflingFemale, TieflingVirtue; | |
var MagicTables, tableA, tableB, tableC, tableD, tableE, tableF, tableG, tableH, tableI; | |
var featName = [], featDesc = []; | |
var Spell = [], spellName = [], spellLevel = [], spellSchool = [], spellRitual = [], spellTime = [], spellRange = [], spellComp = [], spellDuration = [], spellClasses = [], spellDesc = []; | |
var cardMap = new Map(); | |
var localCards = new Array; | |
var globalTempCards = cards.slice(); | |
bot.on("message", msg=>{ | |
var message = msg.content.toLowerCase(); //lowercases the input for simpler parsing | |
let prefix = "!"; //set your prefix | |
let botName = bot.user; | |
if(msg.author.bot) return; //prevents bot from responding to itself | |
if(msg.channel.id == "316969268145160200"){ | |
for(i = 0; i < homebrew.length; i++){ | |
if(message.includes(homebrew[i])){ | |
msg.reply("This is a friendly reminder that this channel is for completed submissions only. If you would like feedback on your content, please post it in " + bot.channels.find("name","dming_questions") + " or one of the dojos. Thank you!"); | |
return; | |
} | |
} | |
} | |
if(message.includes("omae wa mou shindeiru")){ | |
msg.reply("NANI?!?"); | |
} | |
if(message.match(/\bbot\b|\bdicebot\b/) && message.match(/\bthank(s?)\b/)){ | |
msg.reply(":thumbsup:"); | |
} | |
if(message.match(/\bbot\b|\bdicebot\b/) && message.match(/\bhi\b|\bhey\b/)){ | |
msg.reply("hey bb"); | |
} | |
if(message.includes("love") && message.includes("bot")){ | |
msg.reply(":heart:"); | |
} | |
if(msg.content.startsWith(prefix) || message.includes(botName)){} //is the prefix or the bot mentioned? | |
else return; //if not, gtfo | |
/*Help: Stores command list for easy access */ | |
if(msg.content.includes("apologize")){ | |
msg.reply("I'm sorry for my behavior previously. I wasn't feeling myself. :cry:. Pls forgive."); | |
} | |
if(message == prefix + "help"){ | |
var helpMessage = {embed: { | |
color: 3447003, | |
title: "__Command List__", | |
description: | |
"The following is a list of commands with a brief description. Note that they are relatively short due to both readability and a discord post length limit. For many of these, you can type `!help` followed by the specific command you want to look at for more detailed information. (ie `!help spell` or `!help name`)" + | |
"\n\n**!ndx+y** will roll a die where 'n' is the number of dice, 'x' is the number of sides on the die, and 'y' is the modifier. You can use a + or a - operand too. (example: 2d6+5). You can also now CHAIN dice eg: `!4d6+2d6+5`." | |
+ "\n**!deal x** will deal a number of cards and auto-shuffles (`!help deal` for more info)" | |
+ "\n**!sdeal x** will deal a number of cards and doesn't auto-shuffle(`!help sdeal` for more info)" | |
+ "\n**!shuffle** manually shuffles the `sdeal` deck." | |
+ "\n**!rollstats** will create a random array of stats for you and display some useful information (`!help rollstats` for more info)" | |
+ "\n**!rollcharacter** will create a random character with a random set of stats, race and class. (`!help rollcharacter` for more info)" | |
+ "\n**!hoard x** will generate a hoard (`!help hoard` for more info)." | |
+ "\n**`+ - * / % ! ^n sqrt`** Does math. (`!help math` for more info)." | |
+ "\n **!name [race]** will generate a random name based on the race provided. (`!help name` for more info)." | |
+ "\n**!feat x** will display feat info. (`!help feat` for more info)." | |
+ "\n**!condition x** will display condition info. (`!help condition` for more info)." | |
+ "\n**!spell x** will display spell info. (`!help spell` for more info)." | |
+ "\n**!monster x** will display monster info. (`!help monster` for more info)." | |
+ "\n**!backstory** will generate a basic backstory. (`!help backstory` for more info)." | |
+ "\n**!flip** Flips a coin" | |
}}; | |
msg.channel.send(helpMessage); | |
} | |
else if(message.startsWith(prefix + "help ")){ | |
var requestedHelp = message.split(" ")[1].toLowerCase(); | |
var helpMessage, helpTitle; | |
for(i = 0; i < helpData.help.command.length; i++){ | |
if(helpData.help.command[i] == requestedHelp){ | |
console.log(requestedHelp) | |
helpTitle = helpData.help.command[i]; | |
helpMessage = helpData.help.entry[i]; | |
msg.channel.send({embed:{ | |
title: cap(helpTitle), | |
description: helpMessage | |
}}); | |
return; | |
} | |
} | |
msg.channel.send("Command not found."); | |
} | |
if(message == prefix + "new"){ | |
var helpMessage = {embed: { | |
color: 3447003, | |
title: "**New Features**", | |
description: "Dicebot is officially at v2.0! Here are some of my new features:" + | |
"\n__**Dice Rolling**__: \nI can now chain dice commands! Meaning there's no limit [citation needed] to how many dice I can roll at once. Try it out, eg: !2d6+2d4+3d6+5" + | |
"\n__**New Command**__: \n\t__!hoard x__: I can now generate loot hoards for coins and magic item rewards instantly! Type `!help` for more info." + | |
"\n\t__!deal x & !sdeal x__: I can now deal out cards from a standard deck of 52! Type `!help` for more details."+ | |
"\n\t__!feat x__: I can now read out feats for you! `!help` for more details"+ | |
"\n__**Fixes/Updates**__: \nYou can now generate a list of Tavern names. Also the Tavern name list has been updated from 21 suffixes and 21 prefixes to 121 suffixes and 121 prefixes. Your tavern names should be much more varied and interesting." | |
}}; | |
msg.channel.send(helpMessage); | |
} | |
if(message.startsWith(prefix + "backstory")){ | |
var character = rollRaceCharacter(baseRaces[rand(0,baseRaces.length)]); | |
var charClass, charName, charRace, chaMod, knewParents = true; | |
var strM, conM, dexM, wisM, intM; | |
console.log("rolled " + character) | |
var requestedBackstory = message.split(prefix+"backstory ")[1]; | |
var race = requestedBackstory; | |
if(race == undefined){ | |
race = character.split("**Race:** ")[1].split("\n")[0].toLocaleLowerCase(); | |
charRace = character.split("**Race:** ")[1].split("\n")[0]; | |
charClass = character.split("**Class:** ")[1].split("\n")[0].toLocaleLowerCase(); | |
chaMod = parseInt(character.split("Cha: ")[1].split("| (")[1].split(")")[0]); | |
strM = parseInt(character.split("Str: ")[1].split("|")[0]); | |
conM = parseInt(character.split("Con: ")[1].split("|")[0]); | |
dexM = parseInt(character.split("Dex: ")[1].split("|")[0]); | |
wisM = parseInt(character.split("Wis: ")[1].split("|")[0]); | |
intM = parseInt(character.split("Int: ")[1].split("|")[0]); | |
chaM = parseInt(character.split("Cha: ")[1].split("|")[0]); | |
charName = generateName(charRace, null, 1); | |
//race = baseRaces[rand(0, baseRaces.length)].toLocaleLowerCase(); | |
console.log(charName + " " + charRace + " " + charClass + " charisma " + chaMod); | |
} | |
var parents = rand(1,100), parentStatus; | |
for(i = 0; i < backstoryData.parents.roll.length; i++){ | |
if(backstoryData.parents.roll[i] >= parents){ | |
parentStatus = backstoryData.parents.result[i]; | |
if(!backstoryData.parents.knewParents[i]){ | |
knewParents = false; | |
} | |
console.log(parents + " " + backstoryData.parents.result[i]); | |
break; | |
} | |
} | |
switch(race){ | |
case("tiefling"): | |
var d8 = rand(1,8); | |
for(i = 0; i < backstoryData.parents.nonhumanParents.tiefling.roll.length; i++){ | |
if(backstoryData.parents.nonhumanParents.tiefling.roll[i] >= d8){ | |
parentStatus += "\n" + backstoryData.parents.nonhumanParents.tiefling.result[i]; | |
break; | |
} | |
} | |
break; | |
case("half-orc"): | |
var d8 = rand(1,8); | |
for(i = 0; i < backstoryData.parents.nonhumanParents.halforc.roll.length; i++){ | |
if(backstoryData.parents.nonhumanParents.halforc.roll[i] >= d8){ | |
parentStatus += "\n" + backstoryData.parents.nonhumanParents.halforc.result[i]; | |
break; | |
} | |
} | |
break; | |
case("half-elf"): | |
var d8 = rand(1,8); | |
for(i = 0; i < backstoryData.parents.nonhumanParents.halfelf.roll.length; i++){ | |
if(backstoryData.parents.nonhumanParents.halfelf.roll[i] >= d8){ | |
parentStatus += "\n" + backstoryData.parents.nonhumanParents.halfelf.result[i]; | |
break; | |
} | |
} | |
break; | |
default: | |
console.log(race); | |
break; | |
} | |
var birthplace = rand(1,100), birthStatus; | |
for(i = 0; i < backstoryData.birthplace.roll.length; i++){ | |
if(backstoryData.birthplace.roll[i] >= birthplace){ | |
birthStatus = backstoryData.birthplace.result[i]; | |
break; | |
} | |
} | |
var familyRoll = rand(1,100), familyStatus; | |
for(i = 0; i < backstoryData.family.roll.rolled.length; i++){ | |
if(backstoryData.family.roll.rolled[i] >= familyRoll){ | |
familyStatus = backstoryData.family.roll.result[i]; | |
if(knewParents){ | |
var d4 = rand(1,4); | |
if(backstoryData.family.roll.fatherAbsent[i]){ | |
for(j = 0; j < backstoryData.absent.roll.length; j++){ | |
if(backstoryData.absent.roll[j] >= d4){ | |
familyStatus += "\nYour father " + backstoryData.absent.result[j]; | |
if(backstoryData.absent.dead[j]){ | |
for(k = 0; k < backstoryData.causeOfDeath.roll.length; k++){ | |
if(backstoryData.causeOfDeath.roll[k] >= rand(1,12)){ | |
familyStatus += "(" + backstoryData.causeOfDeath.result[k] + ")"; | |
break; | |
} | |
} | |
} | |
break; | |
} | |
} | |
} | |
if(backstoryData.family.roll.motherAbsent[i]){ | |
for(j = 0; j < backstoryData.absent.roll.length; j++){ | |
console.log("heeere" + d4) | |
if(backstoryData.absent.roll[j] >= d4){ | |
familyStatus += "\nYour mother " + backstoryData.absent.result[j]; | |
if(backstoryData.absent.dead[j]){ | |
for(k = 0; k < backstoryData.causeOfDeath.roll.length; k++){ | |
if(backstoryData.causeOfDeath.roll[k] >= rand(1,12)){ | |
familyStatus += "(" + backstoryData.causeOfDeath.result[k] + ")"; | |
break; | |
} | |
} | |
} | |
break; | |
} | |
} | |
} | |
} | |
break; | |
} | |
} | |
var home; | |
for(i = 0; i < backstoryData.lifestyle.roll.length; i++){ | |
if(backstoryData.lifestyle.roll[i] >= RollRAW(3,6,0)){ | |
var wealth = backstoryData.lifestyle.results[i]; | |
for(j = 0; j < backstoryData.home.roll.length; j++){ | |
if(backstoryData.home.roll[j] >= (rand(1,100)+wealth)){ | |
home = backstoryData.home.results[j]; | |
break; | |
} | |
} | |
break; | |
} | |
} | |
var childhood, mod = RollRAW(3,6,0) + chaMod; | |
console.log("MOD " + mod); | |
for(i = 0; i < backstoryData.childhood.roll.length; i++){ | |
if(backstoryData.childhood.roll[i] >= mod){ | |
childhood = backstoryData.childhood.results[i]; | |
break; | |
} | |
} | |
msg.channel.send({embed:{ | |
title: "Backstory", | |
description: charName + " is a " + charRace + " " + cap(charClass), | |
fields: [{ | |
name: "Parents", | |
value: parentStatus | |
}, | |
{ | |
name: "Birthplace", | |
value: "You were born " + birthStatus | |
}, | |
{ | |
name: "Family", | |
value: "You grew up " + familyStatus | |
}, | |
{ | |
name: "Home", | |
value: "You grew up " + home | |
}, | |
{ | |
name: "Childhood", | |
value: childhood | |
} | |
], | |
footer:{ | |
text: "Stats: Str: " + strM + " | Con: " + conM + " | Dex: " + dexM + " | Cha: " + chaMod + " | Wis: " + wisM + " | Int: " + intM | |
} | |
}}); | |
} | |
if(message.startsWith(prefix + "class")){ | |
var requestedClass = message.split(prefix+"class ")[1]; | |
for(i = 0; i < classData.class.length; i++){ | |
if(requestedClass == classData.class[i].name.toLowerCase()){ | |
var armorProf = "", weapProf = "", skillProf = ""; | |
for(j = 0; j < classData.class[i].startingProficiencies.armor.length; j++){ | |
if(j != classData.class[i].startingProficiencies.armor.length-1) | |
armorProf += classData.class[i].startingProficiencies.armor[j] + ", "; | |
else | |
armorProf += classData.class[i].startingProficiencies.armor[j]; | |
} | |
for(j = 0; j < classData.class[i].startingProficiencies.weapons.length; j++){ | |
if(j != classData.class[i].startingProficiencies.weapons.length-1) | |
weapProf += classData.class[i].startingProficiencies.weapons[j] + ", "; | |
else | |
weapProf += classData.class[i].startingProficiencies.weapons[j]; | |
} | |
for(j = 0; j < classData.class[i].startingProficiencies.skills.from.length; j++){ | |
if(j != classData.class[i].startingProficiencies.skills.from.length-1) | |
skillProf += cap(classData.class[i].startingProficiencies.skills.from[j] + ", "); | |
else | |
skillProf += cap(classData.class[i].startingProficiencies.skills.from[j]); | |
} | |
msg.channel.sendMessage({embed: { | |
title: classData.class[i].name, | |
color: 0x51DB28, | |
//description: "**Proficiencies** \n", | |
fields: [ | |
{ | |
name: "**Hit die**", | |
value: classData.class[i].hd.number + "d" + classData.class[i].hd.faces | |
}, | |
{ | |
name: "**Saving throws**", | |
value: cap(classData.class[i].proficiency[0])+ ", " + cap(classData.class[i].proficiency[1]), | |
inline: true | |
}, | |
{ | |
name: "**Armor**", | |
value: armorProf, | |
inline: true | |
}, | |
{ | |
name: "**Weapons**", | |
value: weapProf, | |
inline: true | |
}, | |
{ | |
name: "**Skills**", | |
value: "Choose " + classData.class[i].startingProficiencies.skills.choose + " from:\n" + skillProf | |
} | |
] | |
}}); | |
} | |
} | |
} | |
if(message.startsWith(prefix + "condition")){ | |
var requestedCondition = message.split(prefix+"condition ")[1]; | |
var requestedDescription = ""; | |
for(i = 0; i < conditionsData.condition.length; i++){ | |
if(requestedCondition == conditionsData.condition[i].name.toLowerCase()){ | |
console.log(conditionsData.condition[i].entries[0]); | |
if(conditionsData.condition[i].entries[0].type == "list"){ | |
for(j = 0; j < conditionsData.condition[i].entries[0].items.length; j++){ | |
requestedDescription += conditionsData.condition[i].entries[0].items[j] + "\n"; | |
} | |
} | |
else{ | |
for(j = 0; j < conditionsData.condition[i].entries.length; j++){ | |
requestedDescription += conditionsData.condition[i].entries[j] + "\n"; | |
} | |
} | |
msg.channel.send({embed:{ | |
title: conditionsData.condition[i].name, | |
description: requestedDescription | |
}}); | |
} | |
} | |
} | |
if(message.startsWith(prefix + "feature")){ | |
var requestedFeature = message.split(prefix+"feature ")[1]; | |
var abilityEntry = ""; | |
var subEntries = ""; | |
//console.log(classData.class[0].classFeatures[0][0].name); | |
for(i = 0; i < classData.class.length; i++){//layer 1: name of the class | |
for(j = 0; j < classData.class[i].classFeatures.length; j++){//layer 2: the array of the whole list of class features for that class | |
for(k = 0; k < classData.class[i].classFeatures[j].length; k++){//layer 2.5: The specific level of the class ability | |
if(requestedFeature == classData.class[i].classFeatures[j][k].name.toLowerCase()){//now we're parsing for a name | |
for(m = 0; m < classData.class[i].classFeatures[j][k].entries.length; m++){//layer 3: the name of the ability | |
if(classData.class[i].classFeatures[j][k].entries[m].type != undefined){ | |
if(classData.class[i].classFeatures[j][k].entries[m].type == "abilityDc"){ | |
abilityEntry += "\t8 + Proficiency Bonus + " + classData.class[i].classFeatures[j][k].entries[m].attributes[0] + " modifier\n" | |
} | |
if(classData.class[i].classFeatures[j][k].entries[m].type == "entries"){ | |
for(n = 0; n < classData.class[i].classFeatures[j][k].entries[m].entries.length; n++){//layer 4: lists within a single entry | |
abilityEntry += "**" + classData.class[i].classFeatures[j][k].entries[m].name + "**" + "\n" + classData.class[i].classFeatures[j][k].entries[m].entries[n]+"\n"; | |
console.log(classData.class[i].classFeatures[j][k].entries[m].entries[n]); | |
} | |
} | |
if(classData.class[i].classFeatures[j][k].entries[m].items != undefined){ | |
if(classData.class[i].classFeatures[j][k].entries[m].type == "list"){ | |
for(n = 0; n < classData.class[i].classFeatures[j][k].entries[m].items.length; n++){ | |
abilityEntry += "`" + classData.class[i].classFeatures[j][k].entries[m].items[n] + "`\n\n"; | |
} | |
console.log("exiiists"); | |
} | |
} | |
} | |
else | |
abilityEntry+= classData.class[i].classFeatures[j][k].entries[m] + "\n\n"; | |
} | |
msg.channel.send({embed:{ | |
title: classData.class[i].classFeatures[j][k].name, | |
description: abilityEntry | |
}}); | |
return; | |
} | |
} | |
} | |
} | |
} | |
if(message.startsWith(prefix + "feat ")){ | |
var mes = message.split(prefix + "feat "); | |
mes.shift(); | |
//console.log(featName); | |
for(i = 0; i < Feats.length; i++){ | |
//console.log(featName[i].toLowerCase()); | |
if(("\r\n" + mes[0]) == featName[i].toLowerCase()){ | |
var helpMessage = {embed: { | |
color: 3447003, | |
title: "**"+ featName[i] +"**", | |
description: featDesc[i] | |
}}; | |
msg.channel.send(helpMessage); | |
return; | |
} | |
} | |
msg.channel.send("Feat not found."); | |
} | |
if(message.startsWith(prefix + "spell")){ | |
var mes = message.split(prefix + "spell "); | |
mes.shift(); | |
var similarities = "", count = 0; | |
for(i = 0; i < spellData.spell.length; i++){ | |
if((mes[0]) == spellData.spell[i].name.toLowerCase()){ | |
var range; | |
var comps = ""; | |
var duration; | |
var spellDesc = "", higherLevels = ""; | |
var classTemp = "", classArr = []; | |
const helpMessage = new discord.RichEmbed() | |
.setColor(3447003); | |
for(m = 0; m < spellData.spell[i].classes.fromClassList.length; m++){ | |
classArr[m] = spellData.spell[i].classes.fromClassList[m].name; | |
if(m != spellData.spell[i].classes.fromClassList.length-1) | |
classTemp += classArr[m] + ", " | |
else | |
classTemp += classArr[m] | |
} | |
switch(spellData.spell[i].range.distance.type){ | |
case("self"): | |
range = "self"; | |
break; | |
case("point"): | |
range = "point"; | |
break; | |
case("touch"): | |
range = "touch"; | |
break; | |
default: | |
range = spellData.spell[i].range.distance.amount + " feet"; | |
break; | |
} | |
if(spellData.spell[i].components.v != undefined){ | |
comps += "V"; | |
} | |
if(spellData.spell[i].components.s != undefined){ | |
comps += " S"; | |
} | |
if(spellData.spell[i].components.m != undefined){ | |
if(spellData.spell[i].components.m.cost != undefined) | |
comps += " M (" + spellData.spell[i].components.m.text + ")"; | |
else | |
comps += " M (" + spellData.spell[i].components.m + ")"; | |
} | |
switch(spellData.spell[i].duration[0].type){ | |
case("timed"): | |
duration = spellData.spell[i].duration[0].duration.amount + " " + spellData.spell[i].duration[0].duration.type | |
if(spellData.spell[i].duration[0].duration.upTo != undefined) | |
duration = "Up to " + duration; | |
if(spellData.spell[i].duration[0].concentration != undefined) | |
duration += " (Concentration)"; | |
break; | |
case("instant"): | |
duration = "instant"; | |
break; | |
case("permanent"): | |
duration = "permanent or until dispelled"; | |
break; | |
} | |
helpMessage | |
.setTitle("**"+ spellData.spell[i].name +"**") | |
.setDescription("*level-" + spellData.spell[i].level + " " + spellData.spell[i].school + "*\n" + | |
"**Casting Time**: " + spellData.spell[i].time[0].number + " " + spellData.spell[i].time[0].unit + "\n" + | |
"**Range**: " + range + "\n" + | |
"**Components**: " + comps + "\n" + | |
"**Duration**: " + duration + "\n\n"); | |
for(j = 0; j < spellData.spell[i].entries.length; j++){ | |
helpMessage.addField("` `", spellData.spell[i].entries[j]); | |
} | |
if(spellData.spell[i].entriesHigherLevel != undefined){ | |
//for(k = 0; k < spellData.spell[i].entriesHigherLevel.entries.length; k++){ | |
spellDesc += spellData.spell[i].entriesHigherLevel[0].entries[0] += "\n"; | |
//} | |
} | |
helpMessage.setFooter("Classes: " + classTemp + " | " + spellData.spell[i].source + " pg. " + spellData.spell[i].page); | |
msg.channel.send(helpMessage); | |
return; | |
} | |
else if(similarity(mes[0], spellData.spell[i].name.toLowerCase()) > 0.5){ | |
similarities += ++count + ". " + spellData.spell[i].name + "\n"; | |
} | |
} | |
if(similarities.length > 1) | |
msg.channel.send("Couldn't find that spell; perhaps you meant one of these: \n" + similarities); | |
else | |
msg.channel.send("Spell not found."); | |
} | |
/*if(message.startsWith(prefix + "test")){ | |
const EmbedMessage = new discord.RichEmbed().setTitle("test"); | |
for(i = 0; i < rand(1,4); i++){ | |
EmbedMessage.addField("Num: " + i, i); | |
} | |
msg.channel.send(EmbedMessage); | |
}*/ | |
if(message.startsWith(prefix + "monster ")){ | |
var mes = message.split(prefix + "monster ")[1].toLowerCase(); | |
var similarities = "", count = 0; | |
for(i = 0; i < monsterData.monster.length; i++){ | |
if(mes == monsterData.monster[i].name.toLowerCase()){ | |
var alignment = "", type = "", speed = "", statText = "", traitText = "", actionText = ""; | |
const EmbedMessage = new discord.RichEmbed().setColor("#f44242"); | |
for(j = 0; j < monsterData.monster[i].alignment.length; j++){ | |
if(j == monsterData.monster[i].alignment.length-1) | |
alignment += monsterData.monster[i].alignment[j]; | |
else | |
alignment += monsterData.monster[i].alignment[j] + " "; | |
} | |
if(monsterData.monster[i].type.type != undefined){ | |
type = monsterData.monster[i].type.type | |
}else{ | |
type = monsterData.monster[i].type; | |
} | |
if(monsterData.monster[i].speed != undefined){ | |
if(monsterData.monster[i].speed.walk != undefined){ | |
if(monsterData.monster[i].speed.walk.number != undefined) | |
speed += monsterData.monster[i].speed.walk.number + " ft." + monsterData.monster[i].speed.walk.condition +"\n"; | |
else | |
speed += monsterData.monster[i].speed.walk + " ft.\n"; | |
} | |
if(monsterData.monster[i].speed.fly != undefined){ | |
if(monsterData.monster[i].speed.fly.number != undefined) | |
speed += monsterData.monster[i].speed.fly.number + " ft." + monsterData.monster[i].speed.fly.condition +"\n"; | |
else | |
speed += "fly " + monsterData.monster[i].speed.fly + " ft.\n"; | |
} | |
if(monsterData.monster[i].speed.climb != undefined){ | |
if(monsterData.monster[i].speed.climb.number != undefined) | |
speed += monsterData.monster[i].speed.climb.number + " ft." + monsterData.monster[i].speed.climb.condition +"\n"; | |
else | |
speed += "climb " + monsterData.monster[i].speed.climb + " ft.\n" | |
} | |
if(monsterData.monster[i].speed.swim != undefined){ | |
if(monsterData.monster[i].speed.swim.number != undefined) | |
speed += monsterData.monster[i].speed.swim.number + " ft." + monsterData.monster[i].speed.swim.condition +"\n"; | |
else | |
speed += "swim " + monsterData.monster[i].speed.swim + " ft.\n" | |
} | |
if(monsterData.monster[i].speed.burrow != undefined){ | |
if(monsterData.monster[i].speed.burrow.number != undefined) | |
speed += monsterData.monster[i].speed.burrow.number + " ft." + monsterData.monster[i].speed.burrow.condition +"\n"; | |
else | |
speed += "burrow " + monsterData.monster[i].speed.burrow + " ft.\n" | |
} | |
} | |
EmbedMessage | |
.setTitle(monsterData.monster[i].name) | |
.setDescription("*" + monsterData.monster[i].size + " " + type + ", " + alignment + "*.") | |
.addField("AC", monsterData.monster[i].ac, true) | |
.addField("HP",monsterData.monster[i].hp.average + " (" + monsterData.monster[i].hp.formula + ")",true) | |
.addField("Speed", speed, true) | |
.addField("Stats", "**STR\t\t\tDEX\t\t\tCON\t\t\tINT\t\t\tWIS\t\t\tCHA**\n" + | |
monsterData.monster[i].str + " (" + Math.floor((monsterData.monster[i].str-10)/2) + ")" + "\t\t" + | |
monsterData.monster[i].dex + " (" + Math.floor((monsterData.monster[i].dex-10)/2) + ")"+ "\t\t" + | |
monsterData.monster[i].con + " (" + Math.floor((monsterData.monster[i].con-10)/2) + ")"+ "\t\t" + | |
monsterData.monster[i].int + " (" + Math.floor((monsterData.monster[i].int-10)/2) + ")"+ "\t\t" + | |
monsterData.monster[i].wis + " (" + Math.floor((monsterData.monster[i].wis-10)/2) + ")"+ "\t\t" + | |
monsterData.monster[i].cha + " (" + Math.floor((monsterData.monster[i].cha-10)/2) + ")\n", true); | |
if(monsterData.monster[i].save != undefined){ | |
statText += "**Saving Throws:** "; | |
if(monsterData.monster[i].save.str != undefined) | |
statText += "Str " + monsterData.monster[i].save.str + " "; | |
if(monsterData.monster[i].save.dex != undefined) | |
statText += "Dex " + monsterData.monster[i].save.dex + " "; | |
if(monsterData.monster[i].save.con != undefined) | |
statText += "Con " + monsterData.monster[i].save.con + " "; | |
if(monsterData.monster[i].save.wis != undefined) | |
statText += "Wis " + monsterData.monster[i].save.wis + " "; | |
if(monsterData.monster[i].save.int != undefined) | |
statText += "Int " + monsterData.monster[i].save.int + " "; | |
if(monsterData.monster[i].save.cha != undefined) | |
statText += "Cha " + monsterData.monster[i].save.cha + " "; | |
} | |
if(monsterData.monster[i].skill != undefined){ | |
statText += "\n**Skills:** " | |
//console.log(Object.keys(monsterData.monster[i].skill).length); | |
if(monsterData.monster[i].skill.athletics != undefined) | |
statText += "Athletics " + monsterData.monster[i].skill.athletics + " "; | |
if(monsterData.monster[i].skill.acrobatics != undefined) | |
statText += "Acrobatics " + monsterData.monster[i].skill.acrobatics + " "; | |
if(monsterData.monster[i].skill['sleight of hand'] != undefined) | |
statText += "Sleight of hand " + monsterData.monster[i].skill['sleight of hand'] + " "; | |
if(monsterData.monster[i].skill['animal handling'] != undefined) | |
statText += "Animal handling " + monsterData.monster[i].skill['animal handling'] + " "; | |
if(monsterData.monster[i].skill.stealth != undefined) | |
statText += "Stealth " + monsterData.monster[i].skill.stealth + " "; | |
if(monsterData.monster[i].skill.arcana != undefined) | |
statText += "Arcana " + monsterData.monster[i].skill.arcana + " "; | |
if(monsterData.monster[i].skill.history != undefined) | |
statText += "History " + monsterData.monster[i].skill.history + " "; | |
if(monsterData.monster[i].skill.investigation != undefined) | |
statText += "Investigation " + monsterData.monster[i].skill.investigation + " "; | |
if(monsterData.monster[i].skill.nature != undefined) | |
statText += "Nature " + monsterData.monster[i].skill.nature + " "; | |
if(monsterData.monster[i].skill.religion != undefined) | |
statText += "Religion " + monsterData.monster[i].skill.religion + " "; | |
if(monsterData.monster[i].skill.insight != undefined) | |
statText += "Insight " + monsterData.monster[i].skill.insight + " "; | |
if(monsterData.monster[i].skill.medicine != undefined) | |
statText += "Medicine " + monsterData.monster[i].skill.medicine + " "; | |
if(monsterData.monster[i].skill.perception != undefined) | |
statText += "Perception " + monsterData.monster[i].skill.perception + " "; | |
if(monsterData.monster[i].skill.survival != undefined) | |
statText += "Survival " + monsterData.monster[i].skill.survival + " "; | |
if(monsterData.monster[i].skill.deception != undefined) | |
statText += "Deception " + monsterData.monster[i].skill.deception + " "; | |
if(monsterData.monster[i].skill.intimidation != undefined) | |
statText += "Intimidation " + monsterData.monster[i].skill.intimidation + " "; | |
if(monsterData.monster[i].skill.performance != undefined) | |
statText += "Performance " + monsterData.monster[i].skill.performance + " "; | |
if(monsterData.monster[i].skill.persuasion != undefined) | |
statText += "Persuasion " + monsterData.monster[i].skill.persuasion + " "; | |
} | |
if(monsterData.monster[i].resist != undefined){ | |
statText += "\n**Damage Resistance:** "; | |
for(j = 0; j < monsterData.monster[i].resist.length; j++){ | |
if(monsterData.monster[i].resist[j].resist != undefined){ | |
for(k = 0; k < monsterData.monster[i].resist[j].resist.length; k++){ | |
if(monsterData.monster[i].resist[j].resist.length - 1 == k){ | |
statText += monsterData.monster[i].resist[j].resist[k]; | |
if(monsterData.monster[i].resist[j].note != undefined){ | |
if(monsterData.monster[i].resist.length - 1 == j) | |
statText += " " + monsterData.monster[i].resist[j].note; | |
else | |
statText += " " + monsterData.monster[i].resist[j].note + "; "; | |
} | |
} | |
else | |
statText += monsterData.monster[i].resist[j].resist[k] + ", "; | |
} | |
} | |
if(!(monsterData.monster[i].resist[j] instanceof Object)){ | |
if(monsterData.monster[i].resist.length - 1 == j) | |
statText += monsterData.monster[i].resist[j]; | |
else | |
statText += monsterData.monster[i].resist[j] + ", "; | |
} | |
} | |
} | |
if(monsterData.monster[i].vulnerable != undefined){ | |
statText += "\n**Damage Vulnerabilities:** "; | |
for(j = 0; j < monsterData.monster[i].vulnerable.length; j++){ | |
if(monsterData.monster[i].vulnerable.length - 1 == j) | |
statText += " " + monsterData.monster[i].vulnerable[j]; | |
else | |
statText += " " + monsterData.monster[i].vulnerable[j] + ", "; | |
} | |
} | |
if(monsterData.monster[i].immune != undefined){ | |
statText += "\n**Damage Immunities:** "; | |
for(j = 0; j < monsterData.monster[i].immune.length; j++){ | |
if(monsterData.monster[i].immune[j].immune != undefined){ | |
for(k = 0; k < monsterData.monster[i].immune[j].immune.length; k++){ | |
if(monsterData.monster[i].immune[j].immune.length - 1 == k){ | |
statText += monsterData.monster[i].immune[j].immune[k]; | |
if(monsterData.monster[i].immune[j].note != undefined){ | |
if(monsterData.monster[i].immune.length - 1 == j) | |
statText += " " + monsterData.monster[i].immune[j].note; | |
else | |
statText += " " + monsterData.monster[i].immune[j].note + "; "; | |
} | |
} | |
else | |
statText += monsterData.monster[i].immune[j].immune[k] + ", "; | |
} | |
} | |
if(!(monsterData.monster[i].immune[j] instanceof Object)){ | |
if(monsterData.monster[i].immune.length - 1 == j) | |
statText += monsterData.monster[i].immune[j]; | |
else | |
statText += monsterData.monster[i].immune[j] + ", "; | |
} | |
} | |
} | |
if(monsterData.monster[i].conditionImmune != undefined){ | |
statText += "\n**Condition Immunities:** "; | |
for(j = 0; j < monsterData.monster[i].conditionImmune.length; j++){ | |
if(monsterData.monster[i].conditionImmune.length - 1 == j) | |
statText += " " + monsterData.monster[i].conditionImmune[j]; | |
else | |
statText += " " + monsterData.monster[i].conditionImmune[j] + ", "; | |
} | |
} | |
if(monsterData.monster[i].senses != undefined){ | |
statText += "\n**Senses:** " + monsterData.monster[i].senses + ", passive Perception " + monsterData.monster[i].passive; | |
}else if(monsterData.monster[i].passive != undefined){ | |
statText += "\n**Senses:** " + "Passive Perception " + monsterData.monster[i].passive; | |
} | |
if(monsterData.monster[i].languages != undefined){ | |
statText += "\n**Languages:** " + monsterData.monster[i].languages; | |
} | |
else{ | |
statText += "\n**Languages:** -"; | |
} | |
if(monsterData.monster[i].cr != undefined){ | |
var cr; | |
switch(monsterData.monster[i].cr){ | |
case("0"): | |
cr = "0"; | |
break; | |
case("1/8"): | |
cr = "25"; | |
break; | |
case("1/4"): | |
cr = "50"; | |
break; | |
case("1/2"): | |
cr = "100"; | |
break; | |
case("1"): | |
cr = "200"; | |
break; | |
case("2"): | |
cr = "450"; | |
break; | |
case("3"): | |
cr = "700"; | |
break; | |
case("4"): | |
cr = "1,100"; | |
break; | |
case("5"): | |
cr = "1,800"; | |
break; | |
case("6"): | |
cr = "2,300"; | |
break; | |
case("7"): | |
cr = "2,900"; | |
break; | |
case("8"): | |
cr = "3,900"; | |
break; | |
case("9"): | |
cr = "5,000"; | |
break; | |
case("10"): | |
cr = "5,900"; | |
break; | |
case("11"): | |
cr = "7,200"; | |
break; | |
case("12"): | |
cr = "8,400"; | |
break; | |
case("13"): | |
cr = "10,000"; | |
break; | |
case("14"): | |
cr = "11,500"; | |
break; | |
case("15"): | |
cr = "13,000"; | |
break; | |
case("16"): | |
cr = "15,000"; | |
break; | |
case("17"): | |
cr = "18,000"; | |
break; | |
case("18"): | |
cr = "20,000"; | |
break; | |
case("19"): | |
cr = "22,000"; | |
break; | |
case("20"): | |
cr = "25,000"; | |
break; | |
case("21"): | |
cr = "33,000"; | |
break; | |
case("22"): | |
cr = "41,000"; | |
break; | |
case("23"): | |
cr = "50,000"; | |
break; | |
case("24"): | |
cr = "62,000"; | |
break; | |
case("25"): | |
cr = "75,000"; | |
break; | |
case("26"): | |
cr = "90,000"; | |
break; | |
case("27"): | |
cr = "105,000"; | |
break; | |
case("28"): | |
cr = "120,000"; | |
break; | |
case("29"): | |
cr = "135,000"; | |
break; | |
case("30"): | |
cr = "155,000"; | |
break; | |
} | |
statText += "\n**Challenge:** " + monsterData.monster[i].cr + " (" + cr + " XP)"; | |
} | |
EmbedMessage.addField("`_________________________________`", statText); | |
if(monsterData.monster[i].trait != undefined){ | |
if(monsterData.monster[i].spellcasting != undefined){ | |
for(j = 0; j < monsterData.monster[i].spellcasting.length; j++){ | |
var spellList = ""; | |
spellList += monsterData.monster[i].spellcasting[j].headerEntries + "\n"; | |
if(monsterData.monster[i].spellcasting[j].will != undefined || monsterData.monster[i].spellcasting[j].daily != undefined){ | |
if(monsterData.monster[i].spellcasting[j].will != undefined){ | |
spellList += "At will: "; | |
for(k = 0; k < monsterData.monster[i].spellcasting[j].will.length; k++){ | |
if(k == monsterData.monster[i].spellcasting[j].will.length - 1) | |
spellList += "*" + monsterData.monster[i].spellcasting[j].will[k] + "*\n"; | |
else | |
spellList += "*" + monsterData.monster[i].spellcasting[j].will[k] + "*, "; | |
} | |
} | |
if(monsterData.monster[i].spellcasting[j].daily != undefined){ | |
if(monsterData.monster[i].spellcasting[j].daily['1e'] != undefined){ | |
spellList += "1/day each: "; | |
for(k = 0; k < monsterData.monster[i].spellcasting[j].daily['1e'].length; k++){ | |
if(k == monsterData.monster[i].spellcasting[j].daily['1e'].length - 1) | |
spellList += "*" + monsterData.monster[i].spellcasting[j].daily['1e'][k] + "*\n"; | |
else | |
spellList += "*" + monsterData.monster[i].spellcasting[j].daily['1e'][k] + "*, "; | |
} | |
} | |
if(monsterData.monster[i].spellcasting[j].daily['2e'] != undefined){ | |
spellList += "2/day each: "; | |
for(k = 0; k < monsterData.monster[i].spellcasting[j].daily['2e'].length; k++){ | |
if(k == monsterData.monster[i].spellcasting[j].daily['2e'].length - 1) | |
spellList += "*" + monsterData.monster[i].spellcasting[j].daily['2e'][k] + "*\n"; | |
else | |
spellList += "*" + monsterData.monster[i].spellcasting[j].daily['2e'][k] + "*, "; | |
} | |
} | |
if(monsterData.monster[i].spellcasting[j].daily['3e'] != undefined){ | |
spellList += "3/day each: "; | |
for(k = 0; k < monsterData.monster[i].spellcasting[j].daily['3e'].length; k++){ | |
if(k == monsterData.monster[i].spellcasting[j].daily['3e'].length - 1) | |
spellList += "*" + monsterData.monster[i].spellcasting[j].daily['3e'][k] + "*\n"; | |
else | |
spellList += "*" + monsterData.monster[i].spellcasting[j].daily['3e'][k] + "*, "; | |
} | |
} | |
if(monsterData.monster[i].spellcasting[j].daily['4e'] != undefined){ | |
spellList += "4/day each: "; | |
for(k = 0; k < monsterData.monster[i].spellcasting[j].daily['4e'].length; k++){ | |
if(k == monsterData.monster[i].spellcasting[j].daily['4e'].length - 1) | |
spellList += "*" + monsterData.monster[i].spellcasting[j].daily['4e'][k] + "*\n"; | |
else | |
spellList += "*" + monsterData.monster[i].spellcasting[j].daily['4e'][k] + "*, "; | |
} | |
} | |
if(monsterData.monster[i].spellcasting[j].daily['5e'] != undefined){ | |
spellList += "5/day each: "; | |
for(k = 0; k < monsterData.monster[i].spellcasting[j].daily['5e'].length; k++){ | |
if(k == monsterData.monster[i].spellcasting[j].daily['5e'].length - 1) | |
spellList += "*" + monsterData.monster[i].spellcasting[j].daily['5e'][k] + "*\n"; | |
else | |
spellList += "*" + monsterData.monster[i].spellcasting[j].daily['5e'][k] + "*, "; | |
} | |
} | |
} | |
EmbedMessage.addField("Innate Spellcasting", spellList); | |
}else{ | |
if(monsterData.monster[i].spellcasting[j].spells['0'] != undefined){ | |
spellList += "Cantrips (at will): "; | |
for(k = 0; k < monsterData.monster[i].spellcasting[j].spells['0'].spells.length; k++){ | |
if(k == monsterData.monster[i].spellcasting[j].spells['0'].spells.length - 1) | |
spellList += "*" + monsterData.monster[i].spellcasting[j].spells['0'].spells[k] + "*\n"; | |
else | |
spellList += "*" + monsterData.monster[i].spellcasting[j].spells['0'].spells[k] + "*, "; | |
} | |
} | |
if(monsterData.monster[i].spellcasting[j].spells['1'] != undefined){ | |
spellList += "1st level (" + monsterData.monster[i].spellcasting[j].spells['1'].slots + " slot): "; | |
for(k = 0; k < monsterData.monster[i].spellcasting[j].spells['1'].spells.length; k++){ | |
if(k == monsterData.monster[i].spellcasting[j].spells['1'].spells.length - 1) | |
spellList += "*" + monsterData.monster[i].spellcasting[j].spells['1'].spells[k] + "*\n"; | |
else | |
spellList += "*" + monsterData.monster[i].spellcasting[j].spells['1'].spells[k] + "*, "; | |
} | |
} | |
if(monsterData.monster[i].spellcasting[j].spells['2'] != undefined){ | |
spellList += "2nd level (" + monsterData.monster[i].spellcasting[j].spells['2'].slots + " slot): "; | |
for(k = 0; k < monsterData.monster[i].spellcasting[j].spells['2'].spells.length; k++){ | |
if(k == monsterData.monster[i].spellcasting[j].spells['2'].spells.length - 1) | |
spellList += "*" + monsterData.monster[i].spellcasting[j].spells['2'].spells[k] + "*\n"; | |
else | |
spellList += "*" + monsterData.monster[i].spellcasting[j].spells['2'].spells[k] + "*, "; | |
} | |
} | |
if(monsterData.monster[i].spellcasting[j].spells['3'] != undefined){ | |
spellList += "3rd level (" + monsterData.monster[i].spellcasting[j].spells['3'].slots + " slot): "; | |
for(k = 0; k < monsterData.monster[i].spellcasting[j].spells['3'].spells.length; k++){ | |
if(k == monsterData.monster[i].spellcasting[j].spells['3'].spells.length - 1) | |
spellList += "*" + monsterData.monster[i].spellcasting[j].spells['3'].spells[k] + "*\n"; | |
else | |
spellList += "*" + monsterData.monster[i].spellcasting[j].spells['3'].spells[k] + "*, "; | |
} | |
} | |
if(monsterData.monster[i].spellcasting[j].spells['4'] != undefined){ | |
spellList += "4th level (" + monsterData.monster[i].spellcasting[j].spells['4'].slots + " slot): "; | |
for(k = 0; k < monsterData.monster[i].spellcasting[j].spells['4'].spells.length; k++){ | |
if(k == monsterData.monster[i].spellcasting[j].spells['4'].spells.length - 1) | |
spellList += "*" + monsterData.monster[i].spellcasting[j].spells['4'].spells[k] + "*\n"; | |
else | |
spellList += "*" + monsterData.monster[i].spellcasting[j].spells['4'].spells[k] + "*, "; | |
} | |
} | |
if(monsterData.monster[i].spellcasting[j].spells['5'] != undefined){ | |
spellList += "5th level (" + monsterData.monster[i].spellcasting[j].spells['5'].slots + " slot): "; | |
for(k = 0; k < monsterData.monster[i].spellcasting[j].spells['5'].spells.length; k++){ | |
if(k == monsterData.monster[i].spellcasting[j].spells['5'].spells.length - 1) | |
spellList += "*" + monsterData.monster[i].spellcasting[j].spells['5'].spells[k] + "*\n"; | |
else | |
spellList += "*" + monsterData.monster[i].spellcasting[j].spells['5'].spells[k] + "*, "; | |
} | |
} | |
if(monsterData.monster[i].spellcasting[j].spells['6'] != undefined){ | |
spellList += "6th level (" + monsterData.monster[i].spellcasting[j].spells['6'].slots + " slot): "; | |
for(k = 0; k < monsterData.monster[i].spellcasting[j].spells['6'].spells.length; k++){ | |
if(k == monsterData.monster[i].spellcasting[j].spells['6'].spells.length - 1) | |
spellList += "*" + monsterData.monster[i].spellcasting[j].spells['6'].spells[k] + "*\n"; | |
else | |
spellList += "*" + monsterData.monster[i].spellcasting[j].spells['6'].spells[k] + "*, "; | |
} | |
} | |
if(monsterData.monster[i].spellcasting[j].spells['7'] != undefined){ | |
spellList += "6th level (" + monsterData.monster[i].spellcasting[j].spells['7'].slots + " slot): "; | |
for(k = 0; k < monsterData.monster[i].spellcasting[j].spells['7'].spells.length; k++){ | |
if(k == monsterData.monster[i].spellcasting[j].spells['7'].spells.length - 1) | |
spellList += "*" + monsterData.monster[i].spellcasting[j].spells['7'].spells[k] + "*\n"; | |
else | |
spellList += "*" + monsterData.monster[i].spellcasting[j].spells['7'].spells[k] + "*, "; | |
} | |
} | |
if(monsterData.monster[i].spellcasting[j].spells['8'] != undefined){ | |
spellList += "8th level (" + monsterData.monster[i].spellcasting[j].spells['8'].slots + " slot): "; | |
for(k = 0; k < monsterData.monster[i].spellcasting[j].spells['8'].spells.length; k++){ | |
if(k == monsterData.monster[i].spellcasting[j].spells['8'].spells.length - 1) | |
spellList += "*" + monsterData.monster[i].spellcasting[j].spells['8'].spells[k] + "*\n"; | |
else | |
spellList += "*" + monsterData.monster[i].spellcasting[j].spells['8'].spells[k] + "*, "; | |
} | |
} | |
if(monsterData.monster[i].spellcasting[j].spells['9'] != undefined){ | |
spellList += "9th level (" + monsterData.monster[i].spellcasting[j].spells['9'].slots + " slot): "; | |
for(k = 0; k < monsterData.monster[i].spellcasting[j].spells['9'].spells.length; k++){ | |
if(k == monsterData.monster[i].spellcasting[j].spells['9'].spells.length - 1) | |
spellList += "*" + monsterData.monster[i].spellcasting[j].spells['9'].spells[k] + "*\n"; | |
else | |
spellList += "*" + monsterData.monster[i].spellcasting[j].spells['9'].spells[k] + "*, "; | |
} | |
} | |
EmbedMessage.addField("Spellcasting", spellList); | |
//spellList += monsterData.monster[i].spellcasting[j].spells + "\n"; | |
} | |
} | |
//EmbedMessage.addField("`_________________________________`", "**Spellcasting:**\n" + spellList); | |
} | |
for(j = 0; j < monsterData.monster[i].trait.length; j++){ | |
console.log(monsterData.monster[i].trait[j].name) | |
try{ | |
EmbedMessage.addField(monsterData.monster[i].trait[j].name, monsterData.monster[i].trait[j].entries); | |
}catch(RangeError){ | |
EmbedMessage.addField(monsterData.monster[i].trait[j].name, "` `"); | |
for(k = 0; k < monsterData.monster[i].trait[j].entries.length; k++) | |
EmbedMessage.addField("` `", monsterData.monster[i].trait[j].entries[k]); | |
} | |
} | |
} | |
EmbedMessage.addField("`_________________________________`", "**Actions:**"); | |
if(monsterData.monster[i].action != undefined){ | |
for(j = 0; j < monsterData.monster[i].action.length; j++){ | |
try{ | |
EmbedMessage.addField(monsterData.monster[i].action[j].name, monsterData.monster[i].action[j].entries); | |
}catch(RangeError){ | |
EmbedMessage.addField(monsterData.monster[i].action[j].name, "` `"); | |
for(k = 0; k < monsterData.monster[i].action[j].entries.length; k++) | |
EmbedMessage.addField("` `", monsterData.monster[i].action[j].entries[k]); | |
} | |
} | |
} | |
if(monsterData.monster[i].reaction != undefined){ | |
EmbedMessage.addField("`_________________________________`", "**Reactions:**"); | |
for(j = 0; j < monsterData.monster[i].reaction.length; j++) | |
EmbedMessage.addField(monsterData.monster[i].reaction[j].name, monsterData.monster[i].reaction[j].entries); | |
} | |
if(monsterData.monster[i].legendary != undefined){ | |
EmbedMessage.addField("`_________________________________`", "**Legendary Actions:**"); | |
for(j = 0; j < monsterData.monster[i].legendary.length; j++){ | |
try{ | |
EmbedMessage.addField(monsterData.monster[i].legendary[j].name, monsterData.monster[i].legendary[j].entries); | |
}catch(RangeError){ | |
EmbedMessage.addField(monsterData.monster[i].legendary[j].name, "` `"); | |
for(k = 0; k < monsterData.monster[i].legendary[j].length; k++) | |
EmbedMessage.addField("` `", monsterData.monster[i].legendary[j].entries[k]); | |
} | |
} | |
} | |
/*if(monsterData.monster[i].spellcasting != undefined){ | |
var spellList = ""; | |
for(j = 0; j < monsterData.monster[i].spellcasting.length; j++){ | |
spellList += "__" + monsterData.monster[i].spellcasting[j].name + "__" + "\n" + monsterData.monster[i].spellcasting[j].headerEntries + "\n"; | |
if(monsterData.monster[i].spellcasting[j].will != undefined || monsterData.monster[i].spellcasting[j].daily != undefined){ | |
if(monsterData.monster[i].spellcasting[j].will != undefined){ | |
spellList += "At will: "; | |
for(k = 0; k < monsterData.monster[i].spellcasting[j].will.length; k++){ | |
if(k == monsterData.monster[i].spellcasting[j].will.length - 1) | |
spellList += "*" + monsterData.monster[i].spellcasting[j].will[k] + "*\n"; | |
else | |
spellList += "*" + monsterData.monster[i].spellcasting[j].will[k] + "*, "; | |
} | |
} | |
if(monsterData.monster[i].spellcasting[j].daily != undefined){ | |
if(monsterData.monster[i].spellcasting[j].daily['1e'] != undefined){ | |
spellList += "1/day each: "; | |
for(k = 0; k < monsterData.monster[i].spellcasting[j].daily['1e'].length; k++){ | |
if(k == monsterData.monster[i].spellcasting[j].daily['1e'].length - 1) | |
spellList += "*" + monsterData.monster[i].spellcasting[j].daily['1e'][k] + "*\n"; | |
else | |
spellList += "*" + monsterData.monster[i].spellcasting[j].daily['1e'][k] + "*, "; | |
} | |
} | |
if(monsterData.monster[i].spellcasting[j].daily['2e'] != undefined){ | |
spellList += "2/day each: "; | |
for(k = 0; k < monsterData.monster[i].spellcasting[j].daily['2e'].length; k++){ | |
if(k == monsterData.monster[i].spellcasting[j].daily['2e'].length - 1) | |
spellList += "*" + monsterData.monster[i].spellcasting[j].daily['2e'][k] + "*\n"; | |
else | |
spellList += "*" + monsterData.monster[i].spellcasting[j].daily['2e'][k] + "*, "; | |
} | |
} | |
if(monsterData.monster[i].spellcasting[j].daily['3e'] != undefined){ | |
spellList += "3/day each: "; | |
for(k = 0; k < monsterData.monster[i].spellcasting[j].daily['3e'].length; k++){ | |
if(k == monsterData.monster[i].spellcasting[j].daily['3e'].length - 1) | |
spellList += "*" + monsterData.monster[i].spellcasting[j].daily['3e'][k] + "*\n"; | |
else | |
spellList += "*" + monsterData.monster[i].spellcasting[j].daily['3e'][k] + "*, "; | |
} | |
} | |
if(monsterData.monster[i].spellcasting[j].daily['4e'] != undefined){ | |
spellList += "4/day each: "; | |
for(k = 0; k < monsterData.monster[i].spellcasting[j].daily['4e'].length; k++){ | |
if(k == monsterData.monster[i].spellcasting[j].daily['4e'].length - 1) | |
spellList += "*" + monsterData.monster[i].spellcasting[j].daily['4e'][k] + "*\n"; | |
else | |
spellList += "*" + monsterData.monster[i].spellcasting[j].daily['4e'][k] + "*, "; | |
} | |
} | |
if(monsterData.monster[i].spellcasting[j].daily['5e'] != undefined){ | |
spellList += "5/day each: "; | |
for(k = 0; k < monsterData.monster[i].spellcasting[j].daily['5e'].length; k++){ | |
if(k == monsterData.monster[i].spellcasting[j].daily['5e'].length - 1) | |
spellList += "*" + monsterData.monster[i].spellcasting[j].daily['5e'][k] + "*\n"; | |
else | |
spellList += "*" + monsterData.monster[i].spellcasting[j].daily['5e'][k] + "*, "; | |
} | |
} | |
} | |
}else{ | |
if(monsterData.monster[i].spellcasting[j].spells['0'] != undefined){ | |
spellList += "Cantrips (at will): "; | |
for(k = 0; k < monsterData.monster[i].spellcasting[j].spells['0'].spells.length; k++){ | |
if(k == monsterData.monster[i].spellcasting[j].spells['0'].spells.length - 1) | |
spellList += "*" + monsterData.monster[i].spellcasting[j].spells['0'].spells[k] + "*\n"; | |
else | |
spellList += "*" + monsterData.monster[i].spellcasting[j].spells['0'].spells[k] + "*, "; | |
} | |
} | |
if(monsterData.monster[i].spellcasting[j].spells['1'] != undefined){ | |
spellList += "1st level (" + monsterData.monster[i].spellcasting[j].spells['1'].slots + " slot): "; | |
for(k = 0; k < monsterData.monster[i].spellcasting[j].spells['1'].spells.length; k++){ | |
if(k == monsterData.monster[i].spellcasting[j].spells['1'].spells.length - 1) | |
spellList += "*" + monsterData.monster[i].spellcasting[j].spells['1'].spells[k] + "*\n"; | |
else | |
spellList += "*" + monsterData.monster[i].spellcasting[j].spells['1'].spells[k] + "*, "; | |
} | |
} | |
if(monsterData.monster[i].spellcasting[j].spells['2'] != undefined){ | |
spellList += "2nd level (" + monsterData.monster[i].spellcasting[j].spells['2'].slots + " slot): "; | |
for(k = 0; k < monsterData.monster[i].spellcasting[j].spells['2'].spells.length; k++){ | |
if(k == monsterData.monster[i].spellcasting[j].spells['2'].spells.length - 1) | |
spellList += "*" + monsterData.monster[i].spellcasting[j].spells['2'].spells[k] + "*\n"; | |
else | |
spellList += "*" + monsterData.monster[i].spellcasting[j].spells['2'].spells[k] + "*, "; | |
} | |
} | |
if(monsterData.monster[i].spellcasting[j].spells['3'] != undefined){ | |
spellList += "3rd level (" + monsterData.monster[i].spellcasting[j].spells['3'].slots + " slot): "; | |
for(k = 0; k < monsterData.monster[i].spellcasting[j].spells['3'].spells.length; k++){ | |
if(k == monsterData.monster[i].spellcasting[j].spells['3'].spells.length - 1) | |
spellList += "*" + monsterData.monster[i].spellcasting[j].spells['3'].spells[k] + "*\n"; | |
else | |
spellList += "*" + monsterData.monster[i].spellcasting[j].spells['3'].spells[k] + "*, "; | |
} | |
} | |
if(monsterData.monster[i].spellcasting[j].spells['4'] != undefined){ | |
spellList += "4th level (" + monsterData.monster[i].spellcasting[j].spells['4'].slots + " slot): "; | |
for(k = 0; k < monsterData.monster[i].spellcasting[j].spells['4'].spells.length; k++){ | |
if(k == monsterData.monster[i].spellcasting[j].spells['4'].spells.length - 1) | |
spellList += "*" + monsterData.monster[i].spellcasting[j].spells['4'].spells[k] + "*\n"; | |
else | |
spellList += "*" + monsterData.monster[i].spellcasting[j].spells['4'].spells[k] + "*, "; | |
} | |
} | |
if(monsterData.monster[i].spellcasting[j].spells['5'] != undefined){ | |
spellList += "5th level (" + monsterData.monster[i].spellcasting[j].spells['5'].slots + " slot): "; | |
for(k = 0; k < monsterData.monster[i].spellcasting[j].spells['5'].spells.length; k++){ | |
if(k == monsterData.monster[i].spellcasting[j].spells['5'].spells.length - 1) | |
spellList += "*" + monsterData.monster[i].spellcasting[j].spells['5'].spells[k] + "*\n"; | |
else | |
spellList += "*" + monsterData.monster[i].spellcasting[j].spells['5'].spells[k] + "*, "; | |
} | |
} | |
if(monsterData.monster[i].spellcasting[j].spells['6'] != undefined){ | |
spellList += "6th level (" + monsterData.monster[i].spellcasting[j].spells['6'].slots + " slot): "; | |
for(k = 0; k < monsterData.monster[i].spellcasting[j].spells['6'].spells.length; k++){ | |
if(k == monsterData.monster[i].spellcasting[j].spells['6'].spells.length - 1) | |
spellList += "*" + monsterData.monster[i].spellcasting[j].spells['6'].spells[k] + "*\n"; | |
else | |
spellList += "*" + monsterData.monster[i].spellcasting[j].spells['6'].spells[k] + "*, "; | |
} | |
} | |
if(monsterData.monster[i].spellcasting[j].spells['7'] != undefined){ | |
spellList += "6th level (" + monsterData.monster[i].spellcasting[j].spells['7'].slots + " slot): "; | |
for(k = 0; k < monsterData.monster[i].spellcasting[j].spells['7'].spells.length; k++){ | |
if(k == monsterData.monster[i].spellcasting[j].spells['7'].spells.length - 1) | |
spellList += "*" + monsterData.monster[i].spellcasting[j].spells['7'].spells[k] + "*\n"; | |
else | |
spellList += "*" + monsterData.monster[i].spellcasting[j].spells['7'].spells[k] + "*, "; | |
} | |
} | |
if(monsterData.monster[i].spellcasting[j].spells['8'] != undefined){ | |
spellList += "8th level (" + monsterData.monster[i].spellcasting[j].spells['8'].slots + " slot): "; | |
for(k = 0; k < monsterData.monster[i].spellcasting[j].spells['8'].spells.length; k++){ | |
if(k == monsterData.monster[i].spellcasting[j].spells['8'].spells.length - 1) | |
spellList += "*" + monsterData.monster[i].spellcasting[j].spells['8'].spells[k] + "*\n"; | |
else | |
spellList += "*" + monsterData.monster[i].spellcasting[j].spells['8'].spells[k] + "*, "; | |
} | |
} | |
if(monsterData.monster[i].spellcasting[j].spells['9'] != undefined){ | |
spellList += "9th level (" + monsterData.monster[i].spellcasting[j].spells['9'].slots + " slot): "; | |
for(k = 0; k < monsterData.monster[i].spellcasting[j].spells['9'].spells.length; k++){ | |
if(k == monsterData.monster[i].spellcasting[j].spells['9'].spells.length - 1) | |
spellList += "*" + monsterData.monster[i].spellcasting[j].spells['9'].spells[k] + "*\n"; | |
else | |
spellList += "*" + monsterData.monster[i].spellcasting[j].spells['9'].spells[k] + "*, "; | |
} | |
} | |
//spellList += monsterData.monster[i].spellcasting[j].spells + "\n"; | |
} | |
} | |
EmbedMessage.addField("`_________________________________`", "**Spellcasting:**\n" + spellList); | |
}*/ | |
msg.channel.send(EmbedMessage); | |
return; | |
} | |
else if(similarity(mes, monsterData.monster[i].name.toLowerCase()) > 0.45){ | |
if(count < 10) | |
similarities += ++count + ". " + monsterData.monster[i].name.toLowerCase() + "\n"; | |
} | |
} | |
if(similarities.length > 1) | |
msg.channel.send("Couldn't find that monster; perhaps you meant one of these: \n" + similarities); | |
else | |
msg.channel.send("Sorry, couldn't find that monster."); | |
} | |
if(message.startsWith(prefix + "name")){ | |
for(i = 0; i < baseRaces.length; i++){ | |
if(message == prefix + "name " + baseRaces[i].toLowerCase() + " list"){ | |
msg.channel.send(generateName(baseRaces[i], "null", 10)); | |
return | |
} | |
else if(message == prefix + "name " + baseRaces[i].toLowerCase()){//message.startsWith(prefix + "name " + baseRaces[i].toLowerCase()) | |
msg.channel.send(generateName(baseRaces[i], "null", 1)); | |
return | |
} | |
else if(message == prefix + "name " + baseRaces[i].toLowerCase() + " male"){ | |
msg.channel.send(generateName(baseRaces[i], "male", 1)); | |
return | |
} | |
else if(message == prefix + "name " + baseRaces[i].toLowerCase() + " male" + " list"){ | |
msg.channel.send(generateName(baseRaces[i], "male", 10)); | |
return | |
} | |
else if(message == prefix + "name " + baseRaces[i].toLowerCase() + " female"){ | |
msg.channel.send(generateName(baseRaces[i], "female", 1)); | |
return | |
} | |
else if(message == prefix + "name " + baseRaces[i].toLowerCase() + " female" + " list"){ | |
msg.channel.send(generateName(baseRaces[i], "female", 10)); | |
return | |
} | |
else if(message == prefix + "name " + baseRaces[i].toLowerCase() + " child"){ | |
msg.channel.send(generateName(baseRaces[i], "child", 1)); | |
return | |
} | |
else if(message == prefix + "name " + baseRaces[i].toLowerCase() + " child" + " list"){ | |
msg.channel.send(generateName(baseRaces[i], "child", 10)); | |
return | |
} | |
} | |
if(message == prefix + "name " + "tavern"){ | |
msg.channel.send(generateName("Tavern", "Tavern", 1)); | |
return | |
} | |
if(message == prefix + "name " + "tavern" + " list"){ | |
msg.channel.send(generateName("Tavern", "Tavern", 10)); | |
return | |
} | |
} | |
if(message.startsWith(prefix + "deal")){ | |
var temp = ""; | |
var tempCardsArray = cards.slice(); | |
var temp2 = message.split(" "); | |
if(temp2.length == 1){ | |
msg.reply("Please specify a number of cards to be dealt."); | |
return; | |
} | |
var numDealt = parseInt(temp2[1]); | |
if(numDealt > tempCardsArray.length){ | |
msg.reply("Not enough cards in the deck. Pick a smaller number"); | |
return; | |
} | |
else if(numDealt <= 0){ | |
msg.reply("Pick a number above 0 silly. (between 1 and 52 inclusive)"); | |
return; | |
} | |
for(i = 0; i < numDealt; i++){ | |
var randIndex = rand(0,tempCardsArray.length); | |
temp += "\n" + tempCardsArray[randIndex]; | |
tempCardsArray.splice(randIndex, 1); | |
} | |
msg.reply(temp); | |
} | |
if(message.startsWith(prefix + "sdeal")){ | |
var temp = ""; | |
if(cardMap.get(msg.guild.id) == undefined){ | |
cardMap.set(msg.guild.id, globalTempCards.slice()); | |
} | |
//console.log(cardMap.get(msg.guild.id)); | |
localCards = cardMap.get(msg.guild.id); | |
//console.log(localCards.length); | |
var temp2 = message.split(" "); | |
if(temp2.length == 1){ | |
msg.reply("Please specify a number of cards to be dealt."); | |
return; | |
} | |
var numDealt = parseInt(temp2[1]); | |
if(numDealt > localCards.length){ | |
msg.reply("Not enough cards in the deck. Pick a smaller number or shuffle the deck."); | |
return; | |
} | |
else if(numDealt <= 0){ | |
msg.reply("Pick a number above 0 silly. (between 1 and 52 inclusive)"); | |
return; | |
} | |
for(i = 0; i < numDealt; i++){ | |
//localCards = localCards.slice(); | |
var randIndex = rand(0,localCards.length); | |
temp += "\n" + localCards[randIndex]; | |
localCards.splice(randIndex, 1); | |
} | |
msg.reply(temp); | |
} | |
if(message.startsWith(prefix + "shuffle")){ | |
cardMap.set(msg.guild.id, globalTempCards.slice()); | |
msg.reply("Cards shuffled back into deck."); | |
return; | |
} | |
if(msg.content.startsWith(prefix + "hoard")){ | |
var temp = ""; | |
var temp2 = message.split(" "); | |
if(temp2.length == 1){ | |
msg.reply("Please specify a challenge rating."); | |
return; | |
} | |
msg.reply(generateHoard(temp2[1])); | |
} | |
/*rollstats: initiates the rollstats command which creates a random array of stats (based on 4d6 drop the lowest) and suggests rerolls */ | |
if(message.startsWith(prefix + "rollstats")){ | |
var stat = rollStats(); | |
var total = totalMod(CalModifier(stat)); | |
msg.channel.sendMessage("Here's your generated statblock: " + stat + "\nHere are your modifiers: " + CalModifier(stat) + "\n" + total); | |
} | |
/*rollcharacter: similar to rollstats, however also comes up with a race and class combo and sorts stats based on the class */ | |
if(message.startsWith(prefix + "rollcharacter")){ | |
if(message == prefix + "rollcharacter"){ | |
msg.channel.sendMessage(rollCharacter()); | |
} | |
else if(message.startsWith(prefix + "rollcharacter ")){ | |
console.log(classes[1]) | |
for(i = 0; i < classes.length; i++){ | |
if(message.startsWith(prefix + "rollcharacter " + classes[i].toLowerCase())){ | |
msg.channel.send(rollClassCharacter(classes[i])); | |
return | |
} | |
} | |
for(i = 0; i < races.length; i++){ | |
if(message.startsWith(prefix + "rollcharacter " + races[i].toLowerCase())){ | |
msg.channel.send(rollRaceCharacter(races[i])); | |
return | |
} | |
} | |
} | |
} | |
//flips a coin | |
if(msg.content.startsWith(prefix + "flip")){ | |
var result = Math.floor(Math.random() * 2) + 1; | |
if(result == 1) | |
msg.channel.sendMessage("Heads"); | |
else | |
msg.channel.sendMessage("Tails"); | |
} | |
if(msg.content.startsWith(prefix + "lenny")){ | |
msg.channel.send("( ͡͡ ° ͜ ʖ ͡ °)"); | |
} | |
}); | |
//the below bit does...math? It's pretty shitty to begin with so... might depreciate later... | |
bot.on("message", msg=>{ | |
var message = msg.content.toLowerCase(); | |
let prefix = "!"; | |
if(msg.author.bot) return; | |
for(i = 0; i < operands.length; i++){ | |
var variable; | |
var v1, v2; | |
if(message.includes(operands[i])){ | |
variables = message.split(operands[i]); | |
v1 = parseFloat(variables[0]); | |
v2 = parseFloat(variables[1]); | |
if(operands[i] == "!" && !isNaN(v1)){ | |
var res = 1; | |
for(n = v1; n > 1; n--){ | |
res = res*n; | |
} | |
msg.reply(res); | |
} | |
if(operands[i] == "sqrt" && !isNaN(v2)){ | |
msg.reply(Math.sqrt(v2)); | |
} | |
if((isNaN(v1) || isNaN(v2))) | |
break; | |
else if(operands[i] == "+") | |
msg.reply(v1 + v2); | |
else if(operands[i] == "-") | |
msg.reply(v1 - v2); | |
else if(operands[i] == "*") | |
msg.reply(v1 * v2); | |
else if(operands[i] == "/") | |
msg.reply(v1 / v2); | |
else if(operands[i] == "%") | |
msg.reply(v1 % v2); | |
else if(operands[i] == "^"){ | |
var res = 1; | |
for(n = 0; n < v2; n++){ | |
res = res*v1; | |
} | |
msg.reply(res); | |
} | |
} | |
} | |
}); | |
//all dis shit handles dice rolling. I should *really* make this a single function but... naaah | |
bot.on("message", msg=>{ | |
var message = msg.content.toLowerCase(); | |
var splitMessage = message; | |
let prefix = "!"; | |
let testPrefix = "@"; | |
let botName = bot.user; | |
var fullDice = ""; | |
if(message.startsWith(prefix) && message.match(/(\d|)[d]\d/)){ | |
splitMessage = splitMessage.split(prefix); | |
splitMessage = splitMessage[1].split(/\+/); | |
console.log(splitMessage + " " + splitMessage.length); | |
var total = 0; | |
for(i = 0; i < splitMessage.length; i++){ | |
console.log(i + " " + splitMessage.length); | |
var fullDie = "("; | |
var tempDie; | |
var pre, suff, dieTotal; | |
if(splitMessage[i].match(/[d]/)){ | |
tempDie = splitMessage[i].split("d"); | |
if(tempDie[0] == ''){pre = 1;} | |
else{pre = parseInt(tempDie[0])} | |
suff = parseInt(tempDie[1]); | |
for(j = 0; j < pre; j++){ | |
dieTotal = RollSingle(suff); | |
total += dieTotal; | |
if(j != pre-1) | |
fullDie += dieTotal + " + "; | |
else | |
fullDie += dieTotal; | |
} | |
fullDie += ")"; | |
} | |
else{ | |
fullDie = parseInt(splitMessage[i]); | |
total += fullDie; | |
} | |
if(i != splitMessage.length-1) | |
fullDice += fullDie + " + "; | |
else | |
fullDice += fullDie; | |
//console.log(total); | |
} | |
console.log(total + " = " + fullDice); | |
msg.reply("**" + total + "**" + " = " + fullDice); | |
} | |
}); | |
function generateMagicItem(table, num){ | |
var temp = ""; | |
console.log("num: " + num); | |
//num-=1; | |
for(i = 0; i < num; i++){ | |
temp += "\n\t" + table[rand(1,table.length-1)]; | |
} | |
return temp; | |
} | |
function generateHoard(CR){ | |
var temp = "\n"; | |
var coins = "__**Coins in hoard:**__ "; | |
var cp, sp, ep, gp, pp, magicItemsIndex, magicItem, gemart; | |
magicItem = "__**Magic Items in Hoard:**__ "; | |
gemart = "__**Gems/Art in Hoard:**__ "; | |
magicItemsIndex = rand(1,100); | |
if(CR <= 4 && CR >= 0){ | |
//RollRAW(1,6,0); | |
//console.log("magic" + magicItemsIndex); | |
switch(true){ | |
case (magicItemsIndex <= 36): | |
magicItem += "None." | |
switch(true){ | |
case (magicItemsIndex <= 6): | |
gemart += "None."; | |
break; | |
case (magicItemsIndex <= 16): | |
gemart += RollRAW(2,6,0) + " Gems worth 10 GP each."; | |
break; | |
case (magicItemsIndex <= 26): | |
gemart += RollRAW(2,4,0) + " Art Objects worth 25 GP each."; | |
break; | |
case (magicItemsIndex <= 36): | |
gemart += RollRAW(2,6,0) + " Gems worth 50 GP each."; | |
break; | |
} | |
break; | |
case (magicItemsIndex <= 60): | |
switch(true){ | |
case (magicItemsIndex <= 44): | |
gemart += RollRAW(2,6,0) + " Gems worth 10 GP each."; | |
break; | |
case (magicItemsIndex <= 52): | |
gemart += RollRAW(2,4,0) + " Art Objects worth 25 GP each."; | |
break; | |
case (magicItemsIndex <= 60): | |
gemart += RollRAW(2,6,0) + " Gems worth 50 GP each."; | |
break; | |
} | |
magicItem += generateMagicItem(tableA, rand(1,6)); | |
break; | |
case (magicItemsIndex <= 75): | |
switch(true){ | |
case (magicItemsIndex <= 65): | |
gemart += RollRAW(2,6,0) + " Gems worth 10 GP each."; | |
break; | |
case (magicItemsIndex <= 70): | |
gemart += RollRAW(2,4,0) + " Art Objects worth 25 GP each."; | |
break; | |
case (magicItemsIndex <= 75): | |
gemart += RollRAW(2,6,0) + " Gems worth 50 GP each."; | |
break; | |
} | |
magicItem += generateMagicItem(tableB, rand(1,4)); | |
break; | |
case (magicItemsIndex <= 85): | |
switch(true){ | |
case (magicItemsIndex <= 78): | |
gemart += RollRAW(2,6,0) + " Gems worth 10 GP each."; | |
break; | |
case (magicItemsIndex <= 80): | |
gemart += RollRAW(2,4,0) + " Art Objects worth 25 GP each."; | |
break; | |
case (magicItemsIndex <= 85): | |
gemart += RollRAW(2,6,0) + " Gems worth 50 GP each."; | |
break; | |
} | |
magicItem += generateMagicItem(tableC, rand(1,4)); | |
break; | |
case (magicItemsIndex < 97): | |
switch(true){ | |
case (magicItemsIndex <= 92): | |
gemart += RollRAW(2,4,0) + " Art Objects worth 25 GP each."; | |
break; | |
case (magicItemsIndex <= 92): | |
gemart += RollRAW(2,6,0) + " Gems worth 50 GP each."; | |
break; | |
} | |
magicItem += generateMagicItem(tableF, rand(1,4)); | |
break; | |
case (magicItemsIndex <= 100): | |
switch(true){ | |
case (magicItemsIndex <= 99): | |
gemart += RollRAW(2,4,0) + " Art Objects worth 25 GP each."; | |
break; | |
case (magicItemsIndex <= 100): | |
gemart += RollRAW(2,6,0) + " Gems worth 50 GP each."; | |
break; | |
} | |
magicItem += generateMagicItem(tableG, 1); | |
break; | |
} | |
cp = RollRAW(6,6,0)*100; | |
sp = RollRAW(3,6,0)*100; | |
ep = 0; | |
gp = RollRAW(2,6,0)*10; | |
pp = 0; | |
coins += cp + " CP"; coins += "\t" + sp + " SP"; coins += "\t" + gp + " GP"; | |
} | |
else if(CR <= 10 && CR >= 5){ | |
//magicItemsIndex = rand(1,8); | |
switch(true){ | |
case (magicItemsIndex <= 28): | |
switch(true){ | |
case (magicItemsIndex <= 4): | |
gemart += "None."; | |
break; | |
case (magicItemsIndex <= 10): | |
gemart += RollRAW(2,4,0) + " Art Objects worth 25 GP each."; | |
break; | |
case (magicItemsIndex <= 16): | |
gemart += RollRAW(3,6,0) + " Gems worth 50 GP each."; | |
break; | |
case (magicItemsIndex <= 22): | |
gemart += RollRAW(3,6,0) + " Gems worth 100 GP each."; | |
break; | |
case (magicItemsIndex <= 28): | |
gemart += RollRAW(2,4,0) + " Art Objects worth 250 GP each."; | |
break; | |
} | |
magicItem += "None." | |
break; | |
case (magicItemsIndex <= 44): | |
switch(true){ | |
case (magicItemsIndex <= 32): | |
gemart += RollRAW(2,4,0) + " Art Objects worth 25 GP each."; | |
break; | |
case (magicItemsIndex <= 36): | |
gemart += RollRAW(3,6,0) + " Gems worth 50 GP each."; | |
break; | |
case (magicItemsIndex <= 40): | |
gemart += RollRAW(3,6,0) + " Gems worth 100 GP each."; | |
break; | |
case (magicItemsIndex <= 44): | |
gemart += RollRAW(2,4,0) + " Art Objects worth 250 GP each."; | |
break; | |
} | |
magicItem += generateMagicItem(tableA, rand(1,6)); | |
break; | |
case (magicItemsIndex <= 63): | |
switch(true){ | |
case (magicItemsIndex <= 49): | |
gemart += RollRAW(2,4,0) + " Art Objects worth 25 GP each."; | |
break; | |
case (magicItemsIndex <= 54): | |
gemart += RollRAW(3,6,0) + " Gems worth 50 GP each."; | |
break; | |
case (magicItemsIndex <= 59): | |
gemart += RollRAW(3,6,0) + " Gems worth 100 GP each."; | |
break; | |
case (magicItemsIndex <= 63): | |
gemart += RollRAW(2,4,0) + " Art Objects worth 250 GP each."; | |
break; | |
} | |
magicItem += generateMagicItem(tableB, rand(1,4)); | |
break; | |
case (magicItemsIndex <= 74): | |
switch(true){ | |
case (magicItemsIndex <= 66): | |
gemart += RollRAW(2,4,0) + " Art Objects worth 25 GP each."; | |
break; | |
case (magicItemsIndex <= 69): | |
gemart += RollRAW(3,6,0) + " Gems worth 50 GP each."; | |
break; | |
case (magicItemsIndex <= 72): | |
gemart += RollRAW(3,6,0) + " Gems worth 100 GP each."; | |
break; | |
case (magicItemsIndex <= 74): | |
gemart += RollRAW(2,4,0) + " Art Objects worth 250 GP each."; | |
break; | |
} | |
magicItem += generateMagicItem(tableC, rand(1,4)); | |
break; | |
case (magicItemsIndex <= 80): | |
switch(true){ | |
case (magicItemsIndex <= 76): | |
gemart += RollRAW(2,4,0) + " Art Objects worth 25 GP each."; | |
break; | |
case (magicItemsIndex <= 78): | |
gemart += RollRAW(3,6,0) + " Gems worth 50 GP each."; | |
break; | |
case (magicItemsIndex <= 79): | |
gemart += RollRAW(3,6,0) + " Gems worth 100 GP each."; | |
break; | |
case (magicItemsIndex <= 80): | |
gemart += RollRAW(2,4,0) + " Art Objects worth 250 GP each."; | |
break; | |
} | |
magicItem += generateMagicItem(tableD, 1); | |
break; | |
case (magicItemsIndex <= 94): | |
switch(true){ | |
case (magicItemsIndex <= 84): | |
gemart += RollRAW(2,4,0) + " Art Objects worth 25 GP each."; | |
break; | |
case (magicItemsIndex <= 88): | |
gemart += RollRAW(3,6,0) + " Gems worth 50 GP each."; | |
break; | |
case (magicItemsIndex <= 91): | |
gemart += RollRAW(3,6,0) + " Gems worth 100 GP each."; | |
break; | |
case (magicItemsIndex <= 94): | |
gemart += RollRAW(2,4,0) + " Art Objects worth 250 GP each."; | |
break; | |
} | |
magicItem += generateMagicItem(tableF, rand(1,4)); | |
break; | |
case (magicItemsIndex <= 98): | |
switch(true){ | |
case (magicItemsIndex <= 96): | |
gemart += RollRAW(3,6,0) + " Gems worth 100 GP each."; | |
break; | |
case (magicItemsIndex <= 98): | |
gemart += RollRAW(2,4,0) + " Art Objects worth 250 GP each."; | |
break; | |
} | |
magicItem += generateMagicItem(tableG, rand(1,4)); | |
break; | |
case (magicItemsIndex <= 100): | |
switch(true){ | |
case (magicItemsIndex <= 99): | |
gemart += RollRAW(3,6,0) + " Gems worth 100 GP each."; | |
break; | |
case (magicItemsIndex <= 100): | |
gemart += RollRAW(2,4,0) + " Art Objects worth 250 GP each."; | |
break; | |
} | |
magicItem += generateMagicItem(tableH, 1); | |
break; | |
} | |
cp = RollRAW(2,6,0)*100; | |
sp = RollRAW(2,6,0)*1000; | |
ep = 0; | |
gp = RollRAW(6,6,0)*100; | |
pp = RollRAW(3,6,0)*10; | |
coins += cp + "CP"; coins += "\t" + sp + " SP"; coins += "\t" + gp + " GP"; coins += "\t" + pp + " PP"; | |
} | |
else if(CR <= 16 && CR >= 11){ | |
//magicItemsIndex = rand(1,8); | |
switch(true){ | |
case (magicItemsIndex <= 15): | |
switch(true){ | |
case (magicItemsIndex <= 3): | |
gemart += "None."; | |
break; | |
case (magicItemsIndex <= 6): | |
gemart += RollRAW(2,4,0) + " Art Objects worth 250 GP each."; | |
break; | |
case (magicItemsIndex <= 9): | |
gemart += RollRAW(2,4,0) + " Art Objects worth 750 GP each."; | |
break; | |
case (magicItemsIndex <= 12): | |
gemart += RollRAW(3,6,0) + " Gems worth 500 GP each."; | |
break; | |
case (magicItemsIndex <= 15): | |
gemart += RollRAW(3,6,0) + " Gems worth 1000 GP each."; | |
break; | |
} | |
magicItem += "None." | |
break; | |
case (magicItemsIndex <= 29): | |
switch(true){ | |
case (magicItemsIndex <= 19): | |
gemart += RollRAW(2,4,0) + " Art Objects worth 250 GP each."; | |
break; | |
case (magicItemsIndex <= 23): | |
gemart += RollRAW(2,4,0) + " Art Objects worth 750 GP each."; | |
break; | |
case (magicItemsIndex <= 26): | |
gemart += RollRAW(3,6,0) + " Gems worth 500 GP each."; | |
break; | |
case (magicItemsIndex <= 29): | |
gemart += RollRAW(3,6,0) + " Gems worth 1000 GP each."; | |
break; | |
} | |
magicItem += generateMagicItem(tableA, rand(1,4)); | |
magicItem += generateMagicItem(tableB, rand(1,6)); | |
break; | |
case (magicItemsIndex <= 50): | |
switch(true){ | |
case (magicItemsIndex <= 35): | |
gemart += RollRAW(2,4,0) + " Art Objects worth 250 GP each."; | |
break; | |
case (magicItemsIndex <= 40): | |
gemart += RollRAW(2,4,0) + " Art Objects worth 750 GP each."; | |
break; | |
case (magicItemsIndex <= 45): | |
gemart += RollRAW(3,6,0) + " Gems worth 500 GP each."; | |
break; | |
case (magicItemsIndex <= 50): | |
gemart += RollRAW(3,6,0) + " Gems worth 1000 GP each."; | |
break; | |
} | |
magicItem += generateMagicItem(tableC, rand(1,6)); | |
break; | |
case (magicItemsIndex <= 66): | |
switch(true){ | |
case (magicItemsIndex <= 54): | |
gemart += RollRAW(2,4,0) + " Art Objects worth 250 GP each."; | |
break; | |
case (magicItemsIndex <= 58): | |
gemart += RollRAW(2,4,0) + " Art Objects worth 750 GP each."; | |
break; | |
case (magicItemsIndex <= 62): | |
gemart += RollRAW(3,6,0) + " Gems worth 500 GP each."; | |
break; | |
case (magicItemsIndex <= 66): | |
gemart += RollRAW(3,6,0) + " Gems worth 1000 GP each."; | |
break; | |
} | |
magicItem += generateMagicItem(tableD, rand(1,4)); | |
break; | |
case (magicItemsIndex <= 74): | |
switch(true){ | |
case (magicItemsIndex <= 68): | |
gemart += RollRAW(2,4,0) + " Art Objects worth 250 GP each."; | |
break; | |
case (magicItemsIndex <= 70): | |
gemart += RollRAW(2,4,0) + " Art Objects worth 750 GP each."; | |
break; | |
case (magicItemsIndex <= 72): | |
gemart += RollRAW(3,6,0) + " Gems worth 500 GP each."; | |
break; | |
case (magicItemsIndex <= 74): | |
gemart += RollRAW(3,6,0) + " Gems worth 1000 GP each."; | |
break; | |
} | |
magicItem += generateMagicItem(tableE, 1); | |
break; | |
case (magicItemsIndex <= 82): | |
switch(true){ | |
case (magicItemsIndex <= 76): | |
gemart += RollRAW(2,4,0) + " Art Objects worth 250 GP each."; | |
break; | |
case (magicItemsIndex <= 78): | |
gemart += RollRAW(2,4,0) + " Art Objects worth 750 GP each."; | |
break; | |
case (magicItemsIndex <= 80): | |
gemart += RollRAW(3,6,0) + " Gems worth 500 GP each."; | |
break; | |
case (magicItemsIndex <= 82): | |
gemart += RollRAW(2,4,0) + " Gems worth 1000 GP each."; | |
break; | |
} | |
magicItem += generateMagicItem(tableF, 1); | |
magicItem += generateMagicItem(tableG, rand(1,4)); | |
break; | |
case (magicItemsIndex <= 92): | |
switch(true){ | |
case (magicItemsIndex <= 85): | |
gemart += RollRAW(2,4,0) + " Art Objects worth 250 GP each."; | |
break; | |
case (magicItemsIndex <= 88): | |
gemart += RollRAW(2,4,0) + " Art Objects worth 750 GP each."; | |
break; | |
case (magicItemsIndex <= 90): | |
gemart += RollRAW(3,6,0) + " Gems worth 500 GP each."; | |
break; | |
case (magicItemsIndex <= 92): | |
gemart += RollRAW(3,6,0) + " Gems worth 1000 GP each."; | |
break; | |
} | |
magicItem += generateMagicItem(tableH, rand(1,4)); | |
break; | |
case (magicItemsIndex <= 100): | |
switch(true){ | |
case (magicItemsIndex <= 94): | |
gemart += RollRAW(2,4,0) + " Art Objects worth 250 GP each."; | |
break; | |
case (magicItemsIndex <= 26): | |
gemart += RollRAW(2,4,0) + " Art Objects worth 750 GP each."; | |
break; | |
case (magicItemsIndex <= 98): | |
gemart += RollRAW(3,6,0) + " Gems worth 500 GP each."; | |
break; | |
case (magicItemsIndex <= 100): | |
gemart += RollRAW(3,6,0) + " Gems worth 1000 GP each."; | |
break; | |
} | |
magicItem += generateMagicItem(tableI, 1); | |
break; | |
} | |
cp = 0; | |
sp = 0; | |
ep = 0; | |
gp = RollRAW(4,6,0)*1000; | |
pp = RollRAW(5,6,0)*100; | |
coins += "\t" + gp + " GP"; coins += "\t" + pp + " PP"; | |
} | |
else if(CR >= 17){ | |
switch(true){ | |
case (magicItemsIndex <= 2): | |
switch(true){ | |
case (magicItemsIndex <= 2): | |
gemart += " None."; | |
break; | |
} | |
magicItem += "None." | |
break; | |
case (magicItemsIndex <= 14): | |
switch(true){ | |
case (magicItemsIndex <= 5): | |
gemart += RollRAW(3,6,0) + " Gems worth 1000 GP each."; | |
break; | |
case (magicItemsIndex <= 8): | |
gemart += RollRAW(1,10,0) + " Art Objects worth 2500 GP each."; | |
break; | |
case (magicItemsIndex <= 11): | |
gemart += RollRAW(1,4,0) + " Art Objects worth 7500 GP each."; | |
break; | |
case (magicItemsIndex <= 14): | |
gemart += RollRAW(1,8,0) + " Gems worth 5000 GP each."; | |
break; | |
} | |
magicItem += generateMagicItem(tableC, rand(1,8)); | |
break; | |
case (magicItemsIndex <= 46): | |
switch(true){ | |
case (magicItemsIndex <= 22): | |
gemart += RollRAW(3,6,0) + " Gems worth 1000 GP each."; | |
break; | |
case (magicItemsIndex <= 30): | |
gemart += RollRAW(1,10,0) + " Art Objects worth 2500 GP each."; | |
break; | |
case (magicItemsIndex <= 38): | |
gemart += RollRAW(1,4,0) + " Art Objects worth 7500 GP each."; | |
break; | |
case (magicItemsIndex <= 46): | |
gemart += RollRAW(1,8,0) + " Gems worth 5000 GP each."; | |
break; | |
} | |
magicItem += generateMagicItem(tableD, rand(1,6)); | |
break; | |
case (magicItemsIndex <= 68): | |
switch(true){ | |
case (magicItemsIndex <= 52): | |
gemart += RollRAW(3,6,0) + " Gems worth 1000 GP each."; | |
break; | |
case (magicItemsIndex <= 58): | |
gemart += RollRAW(1,10,0) + " Art Objects worth 2500 GP each."; | |
break; | |
case (magicItemsIndex <= 63): | |
gemart += RollRAW(1,4,0) + " Art Objects worth 7500 GP each."; | |
break; | |
case (magicItemsIndex <= 68): | |
gemart += RollRAW(1,8,0) + " Gems worth 5000 GP each."; | |
break; | |
} | |
magicItem += generateMagicItem(tableE, rand(1,6)); | |
break; | |
case (magicItemsIndex <= 72): | |
switch(true){ | |
case (magicItemsIndex <= 69): | |
gemart += RollRAW(3,6,0) + " Gems worth 1000 GP each."; | |
break; | |
case (magicItemsIndex <= 70): | |
gemart += RollRAW(1,10,0) + " Art Objects worth 2500 GP each."; | |
break; | |
case (magicItemsIndex <= 71): | |
gemart += RollRAW(1,4,0) + " Art Objects worth 7500 GP each."; | |
break; | |
case (magicItemsIndex <= 72): | |
gemart += RollRAW(1,8,0) + " Gems worth 5000 GP each."; | |
break; | |
} | |
magicItem += generateMagicItem(tableG, rand(1,4)); | |
break; | |
case (magicItemsIndex <= 80): | |
switch(true){ | |
case (magicItemsIndex <= 74): | |
gemart += RollRAW(3,6,0) + " Gems worth 1000 GP each."; | |
break; | |
case (magicItemsIndex <= 76): | |
gemart += RollRAW(1,10,0) + " Art Objects worth 2500 GP each."; | |
break; | |
case (magicItemsIndex <= 78): | |
gemart += RollRAW(1,4,0) + " Art Objects worth 7500 GP each."; | |
break; | |
case (magicItemsIndex <= 80): | |
gemart += RollRAW(1,8,0) + " Gems worth 5000 GP each."; | |
break; | |
} | |
magicItem += generateMagicItem(tableH, rand(1,4)); | |
break; | |
case (magicItemsIndex <= 100): | |
switch(true){ | |
case (magicItemsIndex <= 85): | |
gemart += RollRAW(3,6,0) + " Gems worth 1000 GP each."; | |
break; | |
case (magicItemsIndex <= 90): | |
gemart += RollRAW(1,10,0) + " Art Objects worth 2500 GP each."; | |
break; | |
case (magicItemsIndex <= 95): | |
gemart += RollRAW(1,4,0) + " Art Objects worth 7500 GP each."; | |
break; | |
case (magicItemsIndex <= 100): | |
gemart += RollRAW(1,8,0) + " Gems worth 5000 GP each."; | |
break; | |
} | |
magicItem += generateMagicItem(tableI, rand(1,4)); | |
break; | |
} | |
cp = 0; | |
sp = 0; | |
ep = 0; | |
gp = RollRAW(12,6,0)*1000; | |
pp = RollRAW(8,6,0)*1000; | |
coins += "\t" + gp + " GP"; coins += "\t" + pp + " PP"; | |
} | |
temp += coins; | |
temp += "\n" + gemart; | |
temp += "\n" + magicItem; | |
return temp; | |
} | |
function choose(){ | |
var choice = RollSingle(2); | |
if(choice == 1) | |
return "yes"; | |
else | |
return "no"; | |
} | |
function rollCharacter(){ | |
var stats = rollStats(); | |
console.log(stats); | |
stats = String(stats); | |
console.log(stats); | |
stats = stats.split(","); | |
console.log(stats[0]); | |
var race = races[generateRace()]; | |
var dClass = classes[generateClass()]; | |
var statsToSort = stats; | |
return assignPoints(dClass, stats, race); | |
} | |
function rollClassCharacter(xClass){ | |
var stats = rollStats(); | |
console.log(stats); | |
stats = String(stats); | |
console.log(stats); | |
stats = stats.split(","); | |
console.log(stats[0]); | |
var race = races[generateRace()]; | |
//var dClass = xClass; | |
var statsToSort = stats; | |
return assignPoints(xClass, stats, race); | |
} | |
function rollRaceCharacter(xRace){ | |
var stats = rollStats(); | |
console.log(stats); | |
stats = String(stats); | |
console.log(stats); | |
stats = stats.split(","); | |
console.log(stats[0]); | |
//var race = races[generateRace()]; | |
var dClass = classes[generateClass()]; | |
var statsToSort = stats; | |
return assignPoints(dClass, stats, xRace); | |
} | |
function raceASI(race, str, con, dex, cha, wis, int){ | |
if(race == "Human"){ | |
console.log("UNMODIFIED" + str + " " + dex); | |
var newMods = new Array(str+1, con+1, dex+1, cha+1, wis+1, int+1); | |
return newMods; | |
} | |
if(race == "Elf"){ | |
console.log("UNMODIFIED" + str + " " + dex); | |
var newMods = new Array(str+1, con+1, dex+1, cha+1, wis+1, int+1); | |
return newMods; | |
} | |
if(race == "Half-Elf"){ | |
console.log("UNMODIFIED" + str + " " + dex); | |
var newMods = new Array(str+1, con+1, dex+1, cha+1, wis+1, int+1); | |
return newMods; | |
} | |
if(race == "Dragonborn"){ | |
console.log("UNMODIFIED" + str + " " + dex); | |
var newMods = new Array(str+1, con+1, dex+1, cha+1, wis+1, int+1); | |
return newMods; | |
} | |
if(race == "Halfling"){ | |
console.log("UNMODIFIED" + str + " " + dex); | |
var newMods = new Array(str+1, con+1, dex+1, cha+1, wis+1, int+1); | |
return newMods; | |
} | |
if(race == "Tiefling"){ | |
console.log("UNMODIFIED" + str + " " + dex); | |
var newMods = new Array(str+1, con+1, dex+1, cha+1, wis+1, int+1); | |
return newMods; | |
} | |
if(race == "Gnome"){ | |
console.log("UNMODIFIED" + str + " " + dex); | |
var newMods = new Array(str+1, con+1, dex+1, cha+1, wis+1, int+1); | |
return newMods; | |
} | |
if(race == "Dwarf"){ | |
console.log("UNMODIFIED" + str + " " + dex); | |
var newMods = new Array(str+1, con+1, dex+1, cha+1, wis+1, int+1); | |
return newMods; | |
} | |
if(race == "Half-Orc"){ | |
console.log("UNMODIFIED" + str + " " + dex); | |
var newMods = new Array(str+1, con+1, dex+1, cha+1, wis+1, int+1); | |
return newMods; | |
} | |
if(race == "Aasimar"){ | |
console.log("UNMODIFIED" + str + " " + dex); | |
var newMods = new Array(str+1, con+1, dex+1, cha+1, wis+1, int+1); | |
return newMods; | |
} | |
if(race == "Khajit"){ | |
console.log("UNMODIFIED" + str + " " + dex); | |
var newMods = new Array(str+1, con+1, dex+1, cha+1, wis+1, int+1); | |
return newMods; | |
} | |
if(race == "Triton"){ | |
console.log("UNMODIFIED" + str + " " + dex); | |
var newMods = new Array(str+1, con+1, dex+1, cha+1, wis+1, int+1); | |
return newMods; | |
} | |
if(race == "Firebolg"){ | |
console.log("UNMODIFIED" + str + " " + dex); | |
var newMods = new Array(str+1, con+1, dex+1, cha+1, wis+1, int+1); | |
return newMods; | |
} | |
if(race == "Kenku"){ | |
console.log("UNMODIFIED" + str + " " + dex); | |
var newMods = new Array(str+1, con+1, dex+1, cha+1, wis+1, int+1); | |
return newMods; | |
} | |
} | |
function assignPoints(classes, stats, race){ | |
//stats = parseInt(stats); | |
stats = stats.map(Number); | |
stats = numSort(stats); | |
console.log("Shuffled stats! " + shuffle(stats)); | |
console.log(stats); | |
var str = stats[0]; | |
var con = stats[1]; | |
var dex = stats[2]; | |
var cha = stats[3]; | |
var wis = stats[4]; | |
var int = stats[5]; | |
if(classes == "Rogue"){ | |
var temp1 = dex; | |
dex = str; | |
str = temp1; | |
var temp2 = int; | |
int = con; | |
con = temp2; | |
} | |
if(classes == "Barbarian"){ | |
//good as is | |
} | |
if(classes == "Bard"){ | |
var temp1 = cha; | |
cha = str; | |
str = temp1; | |
var temp2 = dex; | |
dex = con; | |
con = temp2; | |
} | |
if(classes == "Cleric"){ | |
var temp1 = wis; | |
wis = str; | |
str = temp1; | |
var temp2 = cha; | |
cha = con; | |
con = temp2; | |
} | |
if(classes == "Druid"){ | |
var temp1 = wis; | |
wis = str; | |
str = temp1; | |
var temp2 = int; | |
int = con; | |
con = temp2; | |
} | |
if(classes == "Fighter"){ | |
var build = RollSingle(2); | |
if(build == 1){} | |
else if(build == 2){ | |
var temp1 = dex; | |
dex = str; | |
str = temp1; | |
} | |
} | |
if(classes == "Monk"){ | |
var temp1 = dex; | |
dex = str; | |
str = temp1; | |
var temp2 = str; | |
str = con; | |
con = temp2; | |
} | |
if(classes == "Paladin"){ | |
var temp1 = wis; | |
wis = str; | |
str = temp1; | |
var temp2 = cha; | |
cha = con; | |
con = temp2; | |
} | |
if(classes == "Ranger"){ | |
var temp1 = dex; | |
dex = str; | |
str = temp1; | |
var temp2 = str; | |
str = con; | |
con = temp2; | |
} | |
if(classes == "Sorcerer"){ | |
var temp1 = cha; | |
cha = str; | |
str = temp1; | |
var temp2 = con; | |
con = con; | |
con = temp2; | |
} | |
if(classes == "Warlock"){ | |
var temp1 = cha; | |
cha = str; | |
str = temp1; | |
var temp2 = wis; | |
wis = con; | |
con = temp2; | |
} | |
if(classes == "Wizard"){ | |
var temp1 = int; | |
int = str; | |
str = temp1; | |
var temp2 = wis; | |
wis = con; | |
con = temp2; | |
} | |
var unmodified = new Array(str, con, dex, cha, wis, int); | |
//var raciallyModified = raceASI(race, str, con, dex, cha, wis, int); | |
//console.log(raciallyModified); | |
//var stats = racialReassign(unmodified, raciallyModified); | |
//console.log("MODIFIED" + str + " " + dex); | |
var modified = appendPlus(CalModifier(unmodified)); | |
console.log("mods" + modified) | |
var final = /*"**NOTE**: Final results include racial bonuses \n" + //not really*/ | |
"**Race:** " + race + "\n" + | |
"**Class:** " + classes + "\n" + | |
"Str: " + str/*stats[0]*/ + " | (" + modified[0] + ")\n" + | |
"Con: " + con/*stats[1]*/ + " | (" + modified[1] + ")\n" + | |
"Dex: " + dex/*stats[2]*/ + " | (" + modified[2] + ")\n" + | |
"Cha: " + cha/* stats[3] */+ " | (" + modified[3] + ")\n" + | |
"Wis: " + wis/*stats[4] */+ " | (" + modified[4] + ")\n" + | |
"Int: " + int/*stats[5] */+ " | (" + modified[5] + ")\n"; | |
//console.log(stats); | |
//console.log(statsToSort); | |
return final; | |
} | |
function racialReassign(oldArray, newArray){ | |
for(i = 0; i < oldArray.length; i++){ | |
oldArray[i] = newArray[i]; | |
} | |
return oldArray; | |
} | |
function appendPlus(x){ | |
for(i = 0; i < x.length; i++){ | |
if(x[i] >= 0){ | |
x[i] = "+" + x[i]; | |
} | |
} | |
return x; | |
} | |
function shuffle(a) { | |
var j, x, i; | |
for (i = a.length; i > 2; i--){ | |
j = Math.floor(Math.random() * 4) + 2; | |
x = a[i - 1]; | |
a[i - 1] = a[j]; | |
a[j] = x; | |
} | |
return a; | |
} | |
function numSort(a){ | |
for(i = 0; i < a.length; i++){ | |
a[i] = parseInt(a[i]); | |
} | |
var temp; | |
for(i=0; i<6; i++){ | |
for(j=0; j<6-i-1; j++){ | |
if( a[j] < a[j+1]){ | |
temp = a[j]; | |
a[j] = a[j+1]; | |
a[j+1] = temp; | |
} | |
} | |
} | |
return a; | |
} | |
function generateRace(){ | |
return rand(0,races.length); | |
} | |
function generateClass(){ | |
return rand(0,classes.length); | |
} | |
function rollStats(){ | |
var score = new Array(0, 0, 0, 0, 0, 0); | |
var stat = []; | |
for(j = 0; j < 6; j++){ | |
for(i = 0; i <4; i++){ | |
stat[i] = RollSingle(6); | |
} | |
stat.sort(); | |
stat.shift(); | |
for(x = 0; x < 3; x++){ | |
score[j] = score[j] + stat[x]; | |
} | |
//console.log(stat); | |
//console.log(score); | |
} | |
var total = ModInt(CalModifier(score)); | |
console.log(stat); | |
console.log(score); | |
console.log(total); | |
if(total < 0){ | |
console.log("Im here"); | |
score = rollStats(); | |
} | |
return score; | |
} | |
function CalModifier(score){ | |
var mods = new Array(0,0,0,0,0,0); | |
for(i = 0; i <6; i++){ | |
mods[i] = Math.floor((score[i])/2-5); | |
} | |
return mods; | |
} | |
function ModInt(mods){ | |
var total = 0; | |
for(i = 0; i < 6; i++){ | |
total = total + mods[i]; | |
} | |
return total; | |
} | |
function totalMod(mods){ | |
var total = 0; | |
for(i = 0; i < 6; i++){ | |
total = total + mods[i]; | |
} | |
if(total < 4) | |
return "Your total modifier is " + total + "; you may be too weak, consider rerolling."; | |
else if(total >7) | |
return "Your total modifier is " + total + "; you may be too strong, consider rerolling."; | |
else | |
return "Your total modifier is " + total; | |
} | |
function add(x1,x2){ | |
x1 = parseInt(x1); | |
x2 = parseInt(x2); | |
return x1 + x2; | |
} | |
function sub(x1,x2){ | |
x1 = parseInt(x1); | |
x2 = parseInt(x2); | |
return x1 - x2; | |
} | |
function reverseString(str) { | |
var newString = ""; | |
for (var i = str.length - 1; i >= 0; i--) { | |
newString += str[i]; | |
} | |
return newString; | |
} | |
function rand(from, to){ | |
var roll = Math.floor(Math.random() * to) + from; | |
return roll; | |
} | |
function RollSingle(dieSide){ | |
var final; | |
var roll = Math.floor(Math.random() * dieSide) + 1; | |
final = roll; | |
//console.log("ROLLIN SINGLE"); | |
return final; | |
} | |
function Roll(dieNum, dieSide, mod){ | |
var total = 0; | |
var result; | |
var die = []; | |
var rolls = ""; | |
for(i = 0; i < dieNum; i++){ | |
result = RollSingle(dieSide); | |
total = total + result; | |
die[i] = result; | |
if(i == dieNum-1){ | |
rolls = rolls + result; | |
} | |
else{ | |
rolls = rolls + result + " + "; | |
} | |
//console.log(result); | |
} | |
total = parseInt(total) + parseInt(mod); | |
console.log(total); | |
if(mod < 0){ | |
mod = mod*-1; | |
return total + " = (" + rolls + ")" + " - " + mod; | |
} | |
else {return total + " = (" + rolls + ")" + " + " + mod;} | |
} | |
function RollRAW(dieNum, dieSide, mod){ | |
var total = 0; | |
var result; | |
var die = []; | |
var rolls = ""; | |
for(i = 0; i < dieNum; i++){ | |
result = RollSingle(dieSide); | |
total = total + result; | |
die[i] = result; | |
if(i == dieNum-1){ | |
rolls = rolls + result; | |
} | |
else{ | |
rolls = rolls + result + " + "; | |
} | |
//console.log(result); | |
} | |
total = parseInt(total) + parseInt(mod); | |
console.log(total); | |
if(mod < 0){ | |
mod = mod*-1; | |
return total; | |
} | |
else {return total;} | |
} | |
function readTables(){ | |
MagicTables = fs.readFileSync("./MagicTables.txt", {"encoding": "utf-8"}); | |
var tempTable = MagicTables.split("@"); | |
tableA = tempTable[0].split("\n"); | |
tableB = tempTable[1].split("\n"); | |
tableC = tempTable[2].split("\n"); | |
tableD = tempTable[3].split("\n"); | |
tableE = tempTable[4].split("\n"); | |
tableF = tempTable[5].split("\n"); | |
tableG = tempTable[6].split("\n"); | |
tableH = tempTable[7].split("\n"); | |
tableI = tempTable[8].split("\n"); | |
} | |
function readNames(){ | |
HumanMale = fs.readFileSync("./HuM.txt", {"encoding": "utf-8"}); | |
HumanFemale = fs.readFileSync("./HuF.txt", {"encoding": "utf-8"}); | |
DragonbornFemale = fs.readFileSync("./DBF.txt", {"encoding": "utf-8"}); | |
DragonbornMale = fs.readFileSync("./DBM.txt", {"encoding": "utf-8"}); | |
DragonbornClan = fs.readFileSync("./DBC.txt", {"encoding": "utf-8"}); | |
DwarfFemale = fs.readFileSync("./DF.txt", {"encoding": "utf-8"}); | |
DwarfMale = fs.readFileSync("./DM.txt", {"encoding": "utf-8"}); | |
DwarfClan = fs.readFileSync("./DC.txt", {"encoding": "utf-8"}); | |
ElfChild = fs.readFileSync("./EC.txt", {"encoding": "utf-8"}); | |
ElfMale = fs.readFileSync("./EM.txt", {"encoding": "utf-8"}); | |
ElfFemale = fs.readFileSync("./EF.txt", {"encoding": "utf-8"}); | |
ElfFamily = fs.readFileSync("./EFa.txt", {"encoding": "utf-8"}); | |
GnomeClan = fs.readFileSync("./GC.txt", {"encoding": "utf-8"}); | |
GnomeFemale = fs.readFileSync("./GF.txt", {"encoding": "utf-8"}); | |
GnomeMale = fs.readFileSync("./GM.txt", {"encoding": "utf-8"}); | |
HalflingFamily = fs.readFileSync("./HaFa.txt", {"encoding": "utf-8"}); | |
HalflingFemale = fs.readFileSync("./HaF.txt", {"encoding": "utf-8"}); | |
HalflingMale = fs.readFileSync("./HaM.txt", {"encoding": "utf-8"}); | |
HOrcFemale = fs.readFileSync("./HOF.txt", {"encoding": "utf-8"}); | |
HOrcMale = fs.readFileSync("./HOM.txt", {"encoding": "utf-8"}); | |
TieflingFemale = fs.readFileSync("./TF.txt", {"encoding": "utf-8"}); | |
TieflingMale = fs.readFileSync("./TM.txt", {"encoding": "utf-8"}); | |
TieflingVirtue = fs.readFileSync("./TV.txt", {"encoding": "utf-8"}); | |
} | |
function readTavern(){ | |
tavernPrefix = fs.readFileSync("./tavern_prefix.txt", {"encoding": "utf-8"}).split(","); | |
tavernSuffix = fs.readFileSync("./tavern_suffix.txt", {"encoding": "utf-8"}).split(","); | |
} | |
function readFeat(){ | |
var fileData = fs.readFileSync("./Feats.txt", {"encoding": "utf-8"}); | |
var featData = fileData.split("<feat>"); | |
featData.shift(); | |
//console.log(featData[0]); | |
for(i = 0; i < featData.length; i++){ | |
var newFeatData = featData[i].split("</name>"); | |
featName[i] = newFeatData[0]; | |
featDesc[i] = newFeatData[1]; | |
Feats[i] = featName[i] + featDesc[i]; | |
} | |
//console.log(featName[0] + featDesc[0]); | |
} | |
function readSpell(){ | |
//var fileData = fs.readFileSync("./Spells.txt", {"encoding": "utf-8"}); | |
//var spellData = fileData.split("<spell>"); | |
var fileData = fs.readFileSync("./5eTools/data/spells/spellsAll.json", "utf-8"); | |
spellData = JSON.parse(fileData); | |
//spellData.shift(); | |
//console.log(featData[0]); | |
/*for(i = 0; i < spellData.length; i++){ | |
var newSpellData = spellData[i].split(/<name>|<level>|<school>|<ritual>|<time>|<range>|<components>|<duration>|<classes>|<desc>/); | |
spellName[i] = newSpellData[1]; | |
spellLevel[i] = newSpellData[2]; | |
spellSchool[i] = newSpellData[3]; | |
spellRitual[i] = newSpellData[4]; | |
spellTime[i] = newSpellData[5]; | |
spellRange[i] = newSpellData[6]; | |
spellComp[i] = newSpellData[7]; | |
spellDuration[i] = newSpellData[8]; | |
spellClasses[i] = newSpellData[9]; | |
spellDesc[i] = newSpellData[10]; | |
Spell[i] = spellName[i] + spellLevel[i] + spellSchool[i] + spellRitual[i] + spellTime[i] + spellRange[i] + spellComp[i] + spellDuration[i] + spellClasses[i] + spellDesc[i]; | |
//console.log(newSpellData); | |
}*/ | |
} | |
function readRace(){ | |
var fileData = fs.readFileSync('./5eTools/data/races.json', 'utf8'); | |
var invocationData = JSON.parse(fileData); | |
//for(i = 0; i < invocationData.race.length; i++) | |
//console.log(invocationData.race[i].name); | |
} | |
function readClass(){ | |
var fileData = fs.readFileSync('./5eTools/data/classes.json'); | |
var fileString = JSON.stringify(fileData); | |
classData = JSON.parse(fileData); | |
//console.log(classData.class); | |
} | |
function readBackstory(){ | |
var fileData = fs.readFileSync('./5eTools/data/backstory.json'); | |
backstoryData = JSON.parse(fileData); | |
} | |
function readConditions(){ | |
var fileData = fs.readFileSync('./5eTools/data/conditions.json'); | |
conditionsData = JSON.parse(fileData); | |
} | |
function readHelp(){ | |
var fileData = fs.readFileSync('./help.json'); | |
helpData = JSON.parse(fileData); | |
} | |
function readMonsters(){ | |
var fileData = fs.readFileSync('./5eTools/data/bestiary/bestiary-full.json'); | |
monsterData = JSON.parse(fileData); | |
} | |
function generateName(race, gender, num){ | |
var nameGenerated = ""; | |
for(i = 0; i < num; i++){ | |
if(race == "Human"){ | |
if(gender == "male"){ | |
nameGenerated += "\n" + randoName(HumanMale.split(",")); | |
} | |
else if(gender == "female") | |
nameGenerated += "\n" + randoName(HumanFemale.split(",")); | |
else{ | |
var result = Math.floor(Math.random() * 2) + 1; | |
if(result == 1) | |
nameGenerated += "\n" + randoName(HumanMale.split(",")); | |
else | |
nameGenerated += "\n" + randoName(HumanFemale.split(",")); | |
} | |
} | |
if(race == "Elf"){ | |
if(gender == "male"){ | |
nameGenerated += "\n" + randoName(ElfMale.split(",")); | |
} | |
else if(gender == "female") | |
nameGenerated += "\n" + randoName(ElfFemale.split(",")); | |
else if(gender == "child") | |
nameGenerated += "\n" + randoName(ElfChild.split(",")); | |
else{ | |
var result = Math.floor(Math.random() * 2) + 1; | |
if(result == 1) | |
nameGenerated += "\n" + randoName(ElfMale.split(",")); | |
else | |
nameGenerated += "\n" + randoName(ElfFemale.split(",")); | |
} | |
} | |
if(race == "Half-Elf"){ | |
if(gender == "male"){ | |
nameGenerated += "\n" + randoName(ElfMale.split(",")); | |
} | |
else if(gender == "female") | |
nameGenerated += "\n" + randoName(ElfFemale.split(",")); | |
else{ | |
var result = Math.floor(Math.random() * 2) + 1; | |
if(result == 1) | |
nameGenerated += "\n" + randoName(ElfMale.split(",")); | |
else | |
nameGenerated += "\n" + randoName(ElfFemale.split(",")); | |
} | |
} | |
if(race == "Dragonborn"){ | |
if(gender == "male"){ | |
nameGenerated += "\n" + randoName(DragonbornMale.split(",")); | |
} | |
else if(gender == "female") | |
nameGenerated += "\n" + randoName(DragonbornFemale.split(",")); | |
else{ | |
var result = Math.floor(Math.random() * 2) + 1; | |
if(result == 1) | |
nameGenerated += "\n" + randoName(DragonbornMale.split(",")); | |
else | |
nameGenerated += "\n" + randoName(DragonbornFemale.split(",")); | |
} | |
} | |
if(race == "Halfling"){ | |
if(gender == "male"){ | |
nameGenerated += "\n" + randoName(HalflingMale.split(",")); | |
} | |
else if(gender == "female") | |
nameGenerated += "\n" + randoName(HalflingFemale.split(",")); | |
else{ | |
var result = Math.floor(Math.random() * 2) + 1; | |
if(result == 1) | |
nameGenerated += "\n" + randoName(HalflingMale.split(",")); | |
else | |
nameGenerated += "\n" + randoName(HalflingFemale.split(",")); | |
} | |
} | |
if(race == "Tiefling"){ | |
if(gender == "male"){ | |
nameGenerated += "\n" + randoName(TieflingMale.split(",")); | |
} | |
else if(gender == "female") | |
nameGenerated += "\n" + randoName(TieflingFemale.split(",")); | |
else{ | |
var result = Math.floor(Math.random() * 2) + 1; | |
if(result == 1) | |
nameGenerated += "\n" + randoName(TieflingMale.split(",")); | |
else | |
nameGenerated += "\n" + randoName(TieflingFemale.split(",")); | |
} | |
} | |
if(race == "Gnome"){ | |
if(gender == "male"){ | |
nameGenerated += "\n" + randoName(GnomeMale.split(",")); | |
} | |
else if(gender == "female") | |
nameGenerated += "\n" + randoName(GnomeFemale.split(",")); | |
else{ | |
var result = Math.floor(Math.random() * 2) + 1; | |
if(result == 1) | |
nameGenerated += "\n" + randoName(GnomeMale.split(",")); | |
else | |
nameGenerated += "\n" + randoName(GnomeFemale.split(",")); | |
} | |
} | |
if(race == "Dwarf"){ | |
if(gender == "male"){ | |
nameGenerated += "\n" + randoName(DwarfMale.split(",")); | |
} | |
else if(gender == "female") | |
nameGenerated += "\n" + randoName(DwarfFemale.split(",")); | |
else{ | |
var result = Math.floor(Math.random() * 2) + 1; | |
if(result == 1) | |
nameGenerated += "\n" + randoName(DwarfMale.split(",")); | |
else | |
nameGenerated += "\n" + randoName(DwarfFemale.split(",")); | |
} | |
} | |
if(race == "Half-Orc"){ | |
if(gender == "male"){ | |
nameGenerated += "\n" + randoName(HOrcMale.split(",")); | |
} | |
else if(gender == "female") | |
nameGenerated += "\n" + randoName(HOrcFemale.split(",")); | |
else{ | |
var result = Math.floor(Math.random() * 2) + 1; | |
if(result == 1) | |
nameGenerated += "\n" + randoName(HOrcMale.split(",")); | |
else | |
nameGenerated += "\n" + randoName(HOrcFemale.split(",")); | |
} | |
} | |
if(race == "Tavern"){ | |
if(gender == "Tavern"){ | |
nameGenerated += randoName(tavernPrefix) + " "; | |
nameGenerated += randoName(tavernSuffix) + "\n"; | |
} | |
} | |
} | |
return nameGenerated; | |
} | |
function randoName(race){ | |
var name = Math.floor(Math.random() * race.length); | |
return race[name]; | |
} | |
function cap(string){ | |
return string.charAt(0).toUpperCase() + string.slice(1); | |
} | |
function similarity(s1, s2) { | |
var longer = s1; | |
var shorter = s2; | |
if (s1.length < s2.length) { | |
longer = s2; | |
shorter = s1; | |
} | |
var longerLength = longer.length; | |
if (longerLength == 0) { | |
return 1.0; | |
} | |
return (longerLength - editDistance(longer, shorter)) / parseFloat(longerLength); | |
} | |
function editDistance(s1, s2) { | |
s1 = s1.toLowerCase(); | |
s2 = s2.toLowerCase(); | |
var costs = new Array(); | |
for (var i = 0; i <= s1.length; i++) { | |
var lastValue = i; | |
for (var j = 0; j <= s2.length; j++) { | |
if (i == 0) | |
costs[j] = j; | |
else { | |
if (j > 0) { | |
var newValue = costs[j - 1]; | |
if (s1.charAt(i - 1) != s2.charAt(j - 1)) | |
newValue = Math.min(Math.min(newValue, lastValue), | |
costs[j]) + 1; | |
costs[j - 1] = lastValue; | |
lastValue = newValue; | |
} | |
} | |
} | |
if (i > 0) | |
costs[s2.length] = lastValue; | |
} | |
return costs[s2.length]; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment