
I have modified the fodderator API to generate NPCs for The Silence of Hollowind (5e setting). I have debugged as far as I can see, but I keep getting a SyntaxError: Unexpected token ';' message. Can anybody see where the problem is? /**
* Generates NPCs for The Silence of Hollowind 5E.
*
* Syntax: !fodder option
*
* option determines which set of rollable tables will be used for Background,
* equipment, and options such as Heritage or physical makeup
*/
var Fodder = Fodder || {
defaultAvatar: "<a href="https://s3.amazonaws.com/files.d20.io/images/7165064/VtQt1TimmSc8rxdHH4daxg/med.jpg?1421350799" rel="nofollow">https://s3.amazonaws.com/files.d20.io/images/7165064/VtQt1TimmSc8rxdHH4daxg/med.jpg?1421350799</a>",
output: [],
listen: function () {
on('chat:message', function (msg) {
// Exit if not an api command
if (msg.type != "api") {
return;
}
if (msg.content.indexOf("!fodder ") != -1) {
var input = msg.content.split(" ");
if (input[1] == "help") {
Fodder.showHelp();
} else {
Fodder.setTables(input[1]);
sendChat('API', "/direct <h6>Generating character</h6>");
Fodder.generate(msg, Fodder.printSheet, Fodder.save);
}
} else if (msg.content.indexOf("!fodder") != -1) {
Fodder.showHelp();
}
});
},
setTables: function (ruleset) {
var defaultTable = {
Background: "Backgrounds",
Heritage: "Heritage",
equipment: "Equipment"
};
switch (ruleset) {
case "brokenmoon":
Fodder.HeritageTable = 'Heritages-CUaBM';
Fodder.BackgroundTable = 'Backgrounds-CUaBM';
Fodder.HeritageTable = defaultTable.Heritage;
Fodder.EquipmentTable = 'Equipment-CUaBM';
break;
case "crawl":
Fodder.BackgroundTable = 'Backgrounds-Crawl';
Fodder.HeritageTable = defaultTable.Heritage;
Fodder.EquipmentTable = defaultTable.equipment;
break;
case "nowhere":
Fodder.BackgroundTable = 'Backgrounds-NCN';
Fodder.HeritageTable = defaultTable.Heritage;
Fodder.EquipmentTable = 'Equipment-NCN';
break;
case "core":
default:
Fodder.BackgroundTable = defaultTable.Background;
Fodder.HeritageTable = defaultTable.Heritage;
Fodder.EquipmentTable = defaultTable.equipment;
}
},
showHelp: function () {
sendChat("API", "/direct <table style='background: #DCD9D5; border-radius: 20px; font-size: 10px;'>" +
"<thead><tr><th>Help</th></tr></thead>" +
"<tbody>" +
"<tr><td><strong>!fodder</strong><br><strong>!fodder help</strong><br>Show this help screen.</td></tr>" +
"<tr><td><strong>!fodder core</strong><br>Use default core DCC tables.</td></tr>" +
"<tr><td><strong>!fodder brokenmoon</strong><br>Use Crawling Under A Broken Moon tables, including mutants and robots.</td></tr>" +
"<tr><td><strong>!fodder crawl</strong><br>Use Crawl! tables for zero-level character generation, including gnomes and physical characteristics.</td></tr>" +
"<tr><td> </td></tr>" +
"</td></tr></tbody></table>");
},
generate: function (msg, outputCallback, saveCallback) {
Fodder.id = msg.playerid;
Fodder.player = msg.who;
Fodder.name = msg.who + " #" + (findObjs({_type: "character", controlledby: msg.playerid}).length + 1)
Fodder.gender = Fodder.rollGender();
Fodder.strength = Fodder.rollAbility();
Fodder.strengthMod = Fodder.calcMod(Fodder.strength);
Fodder.Dexterity = Fodder.rollAbility();
Fodder.DexterityMod = Fodder.calcMod(Fodder.Dexterity);
Fodder.Constitution = Fodder.rollAbility();
Fodder.ConstitutionMod = Fodder.calcMod(Fodder.Constitution);
Fodder.Wisdom = Fodder.rollAbility();
Fodder.WisdomMod = Fodder.calcMod(Fodder.Wisdom);
Fodder.Intelligence = Fodder.rollAbility();
Fodder.IntelligenceMod = Fodder.calcMod(Fodder.Intelligence);
Fodder.Charisma = Fodder.rollAbility();
Fodder.CharismaMod = Fodder.calcMod(Fodder.Charisma);
Fodder.hp = Fodder.rollHP(Fodder.ConstitutionMod);
if (typeof Fodder.HeritageTable != 'undefined') {
Fodder.rollHeritage();
}
if (typeof Fodder.BackgroundTable != 'undefined') {
Fodder.rollBackground();
}
if (typeof Fodder.EquipmentTable != 'undefined') {
Fodder.rollEquipment();
}
if (typeof outputCallback === "function") {
setTimeout(outputCallback, 2500, msg, saveCallback);
}
},
/* Should account for more than male and female? */
rollGender: function () {
var coinFlip = randomInteger(100);
if (coinFlip <= 50) {
return "Male";
} else {
return "Female";
}
},
rollAbility: function () {
return randomInteger(6) + randomInteger(6) + 6;
},
calcMod: function (ability) {
return Math.floor((0.0009 * ability * ability * ability) + (-0.029 * ability * ability) + (0.6 * ability) + 0.41) - 4;
},
rollHeritageRoll: function () {
Fodder.HeritageRoll = {};
sendChat("API", "/roll 1t[" + Fodder.HeritageTable + "]", function (result) {
var content = JSON.parse(result[0].content);
var values = content.rolls[0].results[0].tableItem.name.split(':');
Fodder.HeritageRoll.Heritage = values[0];
Fodder.HeritageRoll.detail = values[1];
});
},
rollHP: function (ConstitutionMod) {
var hp = randomInteger(4) + ConstitutionMod;
if (hp <= 0) {
hp = 1;
}
return hp;
},
rollHeritage: function () {
Fodder.Heritage = '';
sendChat("API", "/roll 1t[" + Fodder.HeritageTable + "]", function (result) {
var content = JSON.parse(result[0].content);
Fodder.Heritage = content.rolls[0].results[0].tableItem.name;
});
},
rollBackground: function () {
var Background = "";
sendChat("API", "/roll 1t[" + Fodder.BackgroundTable + "]", function (result, Background) {
var content = JSON.parse(result[0].content);
var values = content.rolls[0].results[0].tableItem.name.split(':');
Fodder.Background = values[0];
Background = values[0];
var weapon = values[1].split('|');
var handedness = 1;
if (weapon[4] == 2) {
handedness = 1.1;
}
Fodder.weapon = {
name: weapon[1],
damage: weapon[2],
damageType: weapon[3],
attackType: weapon[0],
handedness: handedness
};
if (weapon[0] === 'Ranged') {
Fodder.weapon.ammo = randomInteger(6);
Fodder.weapon.rangedType = '@{DEX}';
if (weapon[5] == 'Thrown') {
Fodder.weapon.rangedType = '@{STR}';
}
Fodder.weapon.rangedDistance = weapon[4]
}
Fodder.trade = values[2];
});
},
rollEquipment: function () {
sendChat("API", "/roll 1t[" + Fodder.EquipmentTable + "]", function (result) {
var content = JSON.parse(result[0].content);
Fodder.equipment = content.rolls[0].results[0].tableItem.name;
});
},
printSheet: function (msg, saveCallback) {
var styleLabel = "style='font-weight: bold; padding: 5px;'";
var styleVal = "style='padding: 5px;'";
Fodder.output['name'] = "<thead><tr><th colspan='2' style='background: #8C8173; padding: 5px;'>" + Fodder.name + "</th></tr></thead>";
Fodder.output['gender'] = "<tr><td " + styleLabel + ">Gender</td><td " + styleVal + ">" + Fodder.gender + "</td></tr>";
if (Fodder.Heritage != undefined) {
Fodder.output['Heritage'] = "<tr><td " + styleLabel + ">Heritage</td><td " + styleVal + ">" + Fodder.Heritage + "</td></tr>";
} else {
Fodder.output['Heritage'] = "";
}
if (Fodder.Background != undefined) {
Fodder.output['Background'] = "<tr><td " + styleLabel + ">Background</td><td " + styleVal + ">" + Fodder.Background + "</td></tr>";
} else {
Fodder.output['Background'] = "";
}
Fodder.output['abilities'] = "<tr><td " + styleLabel + ">Strength</td><td " + styleVal + ">" + Fodder.strength + ' (' + Fodder.strengthMod + ')' +
"</td></tr><tr><td " + styleLabel + ">Dexterity</td><td " + styleVal + ">" + Fodder.Dexterity + ' (' + Fodder.DexterityMod + ')' +
"</td></tr><tr><td " + styleLabel + ">Constitution</td><td " + styleVal + ">" + Fodder.Constitution + ' (' + Fodder.ConstitutionMod + ')' +
"</td></tr><tr><td " + styleLabel + ">Wisdom</td><td " + styleVal + ">" + Fodder.Wisdom + ' (' + Fodder.WisdomMod + ')' +
"</td></tr><tr><td " + styleLabel + ">Intelligence</td><td " + styleVal + ">" + Fodder.Intelligence + ' (' + Fodder.IntelligenceMod + ')' +
"</td></tr><tr><td " + styleLabel + ">Charisma</td><td " + styleVal + ">" + Fodder.Charisma + ' (' + Fodder.CharismaMod + ')' +
"</td></tr>";
Fodder.output['hitpoints'] = "<tr><td " + styleLabel + ">Hit Points</td><td " + styleVal + ">" + Fodder.hp + "</td></tr>";
if (Fodder.weapon != undefined) {
Fodder.output['weapon'] = "<tr><td style='font-weight: bold; padding: 5px;'>Weapon</td><td style='padding: 5px;'>" + Fodder.weapon.name + " (" + Fodder.weapon.damage + ")</td></tr>";
} else {
Fodder.output['weapon'] = "";
}
if (Fodder.equipment != undefined) {
Fodder.output['equipment'] = "<tr><td style='font-weight: bold; padding: 5px;'>Equipment</td><td style='padding: 5px;'>" + Fodder.equipment + "</td></tr>";
} else {
Fodder.output['equipment'] = "";
}
sendChat(msg.who, "/direct <table style='background: #DCD9D5; border-radius: 20px; font-size: 10px;'>" + Fodder.output['name'] +
"<tbody>" +
Fodder.output['gender'] +
Fodder.output['Heritage'] +
Fodder.output['Background'] +
Fodder.output['abilities'] +
Fodder.output['hitpoints'] +
Fodder.output['Charisma'] +
Fodder.output['weapon'] +
Fodder.output['trade'] +
Fodder.output['equipment'] +
Fodder.output['copper'] +
"</tbody></table>");
if (typeof saveCallback === "function") {
saveCallback();
}
},
save: function() {
var character = createObj("character", {
avatar: Fodder.defaultAvatar,
name: Fodder.name,
bio: "",
gmnotes: "",
archived: false,
inplayerjournals: "all",
controlledby: Fodder.id
});
createObj('attribute', {
name: 'player_name',
current: Fodder.player,
_characterid: character.id
});
createObj('attribute', {
name: 'Name',
current: Fodder.name,
_characterid: character.id
});
createObj('attribute', {
name: 'gender',
current: Fodder.gender,
_characterid: character.id
});
createObj('attribute', {
name: 'Level',
current: '0',
max: '10',
_characterid: character.id
});
createObj('attribute', {
name: 'XP',
current: 0,
max: 10,
_characterid: character.id
});
createObj('attribute', {
name: 'Strength',
current: Fodder.strength,
max: Fodder.strength,
_characterid: character.id
});
createObj('attribute', {
name: 'Dexterity',
current: Fodder.Dexterity,
max: Fodder.Dexterity,
_characterid: character.id
});
createObj('attribute', {
name: 'Constitution',
current: Fodder.Constitution,
max: Fodder.Constitution,
_characterid: character.id
});
createObj('attribute', {
name: 'Wisdom',
current: Fodder.Wisdom,
max: Fodder.Wisdom,
_characterid: character.id
});
createObj('attribute', {
name: 'Intelligence',
current: Fodder.Intelligence,
max: Fodder.Intelligence,
_characterid: character.id
});
createObj('attribute', {
name: 'Charisma',
current: Fodder.Charisma,
max: Fodder.Charisma,
_characterid: character.id
});
createObj('attribute', {
name: 'Charisma_Starting',
current: Fodder.Charisma,
max: Fodder.Charisma,
_characterid: character.id
});
if (typeof Fodder.Heritage != "undefined") {
createObj('attribute', {
name: 'Heritage',
current: Fodder.Heritage,
_characterid: character.id
});
createObj('attribute', {
name: 'Background',
current: Fodder.Background,
_characterid: character.id
});
if (Fodder.weapon.attackType === 'Melee') {
createObj('attribute', {
name: 'MeleeWeaponName1',
current: Fodder.weapon.name,
_characterid: character.id
});
createObj('attribute', {
name: 'MeleeDmg1',
current: Fodder.weapon.damage,
_characterid: character.id
});
createObj('attribute', {
name: 'MeleeDmgType1',
current: Fodder.weapon.damageType,
_characterid: character.id
});
createObj('attribute', {
name: 'MeleeAttackWielded1_Zero',
current: Fodder.weapon.handedness,
_characterid: character.id
});
} else {
createObj('attribute', {
name: "RangedAmmo1",
current: Fodder.weapon.ammo,
_characterid: character.id
});
createObj('attribute', {
name: 'RangedWeaponName1',
current: Fodder.weapon.name,
_characterid: character.id
});
createObj('attribute', {
name: 'RangedDistance1',
current: Fodder.weapon.rangedDistance,
_characterid: character.id
});
createObj('attribute', {
name: 'RangedType1',
current: Fodder.weapon.rangedType,
_characterid: character.id
});
createObj('attribute', {
name: 'RangedDmg1',
current: Fodder.weapon.damage,
_characterid: character.id
});
}
createObj('attribute', {
name: 'Equipment',
current: Fodder.trade + "\n" + Fodder.equipment,
_characterid: character.id
});
}
};
on("ready", function () {
Fodder.listen();
});