Roll20 uses cookies to improve your experience on our site. Cookies enable you to enjoy certain features, social sharing functionality, and tailor message and display ads to your interests on our site and others. They also help us understand how our site is being used. By continuing to use our site, you consent to our use of cookies. Update your cookie preferences .
×
Create a free account

Variable Comes Up as Undefined

In the following code, RPGText1 comes up as undefined. What is missing? /* Generates Mothership Characters for the Residue Processing Scenario * * Syntax: !RPGen option * */ var RPG = RPG || { version: "0.0.1", output: [], listen: function () { on('chat:message', function (msg) { // Exit if not an api command if (msg.type != "api") { return; } if (msg.content.indexOf("!RPGen ") != -1) { var input = msg.content.split(" "); if (input[1] == "help") { RPG.showHelp(); } else { sendChat('API', "/direct &lt;h6&gt;Generating character&lt;/h6&gt;"); RPG.generate(msg, RPG.printSheet, RPG.save); } } else if (msg.content.indexOf("!RPGen") != -1) { RPG.showHelp(); } }); }, showHelp: function () { sendChat("API", "/direct &lt;table style='background: #DCD9D5; border-radius: 20px; font-size: 10px;'&gt;" + "&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Help&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;" + "&lt;tbody&gt;" + "&lt;tr&gt;&lt;td&gt;&lt;strong&gt;!fodder&lt;/strong&gt;&lt;br&gt;&lt;strong&gt;!fodder help&lt;/strong&gt;&lt;br&gt;Show this help screen.&lt;/td&gt;&lt;/tr&gt;" + "&lt;tr&gt;&lt;td&gt;&lt;strong&gt;!fodder core&lt;/strong&gt;&lt;br&gt;Use default core DCC tables.&lt;/td&gt;&lt;/tr&gt;" + "&lt;tr&gt;&lt;td&gt;&lt;strong&gt;!fodder brokenmoon&lt;/strong&gt;&lt;br&gt;Use Crawling Under A Broken Moon tables, including mutants and robots.&lt;/td&gt;&lt;/tr&gt;" + "&lt;tr&gt;&lt;td&gt;&lt;strong&gt;!fodder crawl&lt;/strong&gt;&lt;br&gt;Use Crawl! tables for zero-level character generation, including gnomes and physical characteristics.&lt;/td&gt;&lt;/tr&gt;" + "&lt;tr&gt;&lt;td&gt; &lt;/td&gt;&lt;/tr&gt;" + "&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;"); }, generate: function (msg, outputCallback, saveCallback) { RPG.id = msg.playerid; RPG.player = msg.who; RPG.name = msg.who + " #" + (findObjs({_type: "character", controlledby: msg.playerid}).length + 1) RPG.GenAbilities(msg); RPG.GenHistory(msg); RPG.GenSuit(msg); RPG.GenSkills(msg); RPG.printSheet(msg); RPG.save(msg); if (typeof outputCallback === "function") { setTimeout(outputCallback, 2500, msg, saveCallback); } }, GenAbilities: function (msg) { sendChat("API", "/roll 1t[RP-Stats]", function (result) { let content = JSON.parse(result[0].content); let values = content.rolls[0].results[0].tableItem.name.split(':'); RPG.Strength = values[0]; RPG.Speed = values[1]; RPG.Intellect = values[2]; RPG.Combat = values[3]; RPG.Health = 10; RPG.Stress = 5; RPG.Sanity = 20; RPG.Fear = 20; RPG.Body = 20; RPG.Armor = 20; RPG.output['Strength'] = "&lt;tr&gt;&lt;td style='font-weight: bold; padding: 5px;'&gt;Strength&lt;/td&gt;&lt;td style='padding: 5px;'&gt;" + RPG.Strength + "&lt;/td&gt;&lt;/tr&gt;"; RPG.output['Speed'] = "&lt;tr&gt;&lt;td style='font-weight: bold; padding: 5px;'&gt;Speed&lt;/td&gt;&lt;td style='padding: 5px;'&gt;" + RPG.Speed + "&lt;/td&gt;&lt;/tr&gt;"; RPG.output['Intellect'] = "&lt;tr&gt;&lt;td style='font-weight: bold; padding: 5px;'&gt;Intellect&lt;/td&gt;&lt;td style='padding: 5px;'&gt;" + RPG.Intellect + "&lt;/td&gt;&lt;/tr&gt;"; RPG.output['Combat'] = "&lt;tr&gt;&lt;td style='font-weight: bold; padding: 5px;'&gt;Combat&lt;/td&gt;&lt;td style='padding: 5px;'&gt;" + RPG.Combat + "&lt;/td&gt;&lt;/tr&gt;"; RPG.output['Health'] = "&lt;tr&gt;&lt;td style='font-weight: bold; padding: 5px;'&gt;Health&lt;/td&gt;&lt;td style='padding: 5px;'&gt;" + RPG.Health + "&lt;/td&gt;&lt;/tr&gt;"; RPG.output['Stress'] = "&lt;tr&gt;&lt;td style='font-weight: bold; padding: 5px;'&gt;Stress&lt;/td&gt;&lt;td style='padding: 5px;'&gt;" + RPG.Stress + "&lt;/td&gt;&lt;/tr&gt;"; RPG.output['Sanity'] = "&lt;tr&gt;&lt;td style='font-weight: bold; padding: 5px;'&gt;Sanity Save&lt;/td&gt;&lt;td style='padding: 5px;'&gt;" + RPG.Sanity + "&lt;/td&gt;&lt;/tr&gt;"; RPG.output['Fear'] = "&lt;tr&gt;&lt;td style='font-weight: bold; padding: 5px;'&gt;Fear Save&lt;/td&gt;&lt;td style='padding: 5px;'&gt;" + RPG.Fear + "&lt;/td&gt;&lt;/tr&gt;"; RPG.output['Body'] = "&lt;tr&gt;&lt;td style='font-weight: bold; padding: 5px;'&gt;Body Save&lt;/td&gt;&lt;td style='padding: 5px;'&gt;" + RPG.Body + "&lt;/td&gt;&lt;/tr&gt;"; RPG.output['Armor'] = "&lt;tr&gt;&lt;td style='font-weight: bold; padding: 5px;'&gt;Armor Save&lt;/td&gt;&lt;td style='padding: 5px;'&gt;" + RPG.Armor + "&lt;/td&gt;&lt;/tr&gt;"; RPGText1 = "&lt;table font-size: 10px;'&gt; &lt;tbody&gt;" + RPG.output['Strength'] + RPG.output['Speed'] + RPG.output['Intellect'] + RPG.output['Combat'] + RPG.output['Health'] + RPG.output['Stress'] + RPG.output['Sanity'] + RPG.output['Fear'] + RPG.output['Body'] + RPG.output['Armor'] + "&lt;/tbody&gt;&lt;/table&gt;"; sendChat(msg.who, "/direct " + RPGText1); }); }, GenHistory: function (msg) { sendChat("API", "/roll 1t[RP-History]", function (result) { let content = JSON.parse(result[0].content); let values = content.rolls[0].results[0].tableItem.name.split(':'); RPG.Study = values[0]; RPG.Effect = values[1]; if (RPG.Effect.includes('(A)')) { RPG.Fear = 50; } RPG.output['Study'] = "&lt;tr&gt;&lt;td style='font-weight: bold; padding: 5px;'&gt;Study&lt;/td&gt;&lt;td style='padding: 5px;'&gt;" + RPG.Study + "&lt;/td&gt;&lt;/tr&gt;"; RPG.output['Effect'] = "&lt;tr&gt;&lt;td style='font-weight: bold; padding: 5px;'&gt;Side Effect&lt;/td&gt;&lt;td style='padding: 5px;'&gt;" + RPG.Effect + "&lt;/td&gt;&lt;/tr&gt;"; RPGText2 = "&lt;table font-size: 10px;'&gt; &lt;tbody&gt;" + RPG.output['Study'] + RPG.output['Effect'] + "&lt;/tbody&gt;&lt;/table&gt;"; sendChat(msg.who, "/direct " + RPGText2); }); }, GenSuit: function (msg) { sendChat("API", "/roll 1t[RP-Expression]", function (result) { let content = JSON.parse(result[0].content); let values = content.rolls[0].results[0].tableItem.name.split(':'); RPG.Expression = values[0]; RPG.output['Expression'] = "&lt;tr&gt;&lt;td style='font-weight: bold; padding: 5px;'&gt;Doll Suit Expression&lt;/td&gt;&lt;td style='padding: 5px;'&gt;" + RPG.Expression + "&lt;/td&gt;&lt;/tr&gt;"; let content1 = JSON.parse(result[0].content); let values1 = content.rolls[0].results[0].tableItem.name.split(':'); RPG.Quirk = values[0]; RPG.output['Quirk'] = "&lt;tr&gt;&lt;td style='font-weight: bold; padding: 5px;'&gt;Doll Suit Quirk&lt;/td&gt;&lt;td style='padding: 5px;'&gt;" + RPG.Quirk + "&lt;/td&gt;&lt;/tr&gt;"; RPGText3 = "&lt;table font-size: 10px;'&gt; &lt;tbody&gt;" + RPG.output['Quirk'] + RPG.output['Expression'] + "&lt;/tbody&gt;&lt;/table&gt;"; sendChat(msg.who, "/direct " + RPGText3); }); }, GenSkills: function (msg) { sendChat("API", "/roll 1t[RP-Skills]", function (result) { let content = JSON.parse(result[0].content); let values = content.rolls[0].results[0].tableItem.name.split(':'); RPG.Skill = values[0]; RPG.output['Skill'] = "&lt;tr&gt;&lt;td style='font-weight: bold; padding: 5px;'&gt;Skill&lt;/td&gt;&lt;td style='padding: 5px;'&gt;" + RPG.Skill + "&lt;/td&gt;&lt;/tr&gt;"; RPGText4 = "&lt;table font-size: 10px;'&gt; &lt;tbody&gt;" + RPG.output['Skill'] + "&lt;/tbody&gt;&lt;/table&gt;"; sendChat(msg.who, "/direct " + RPGText4); }); }, printSheet: function (msg, saveCallback) { let styleLabel = "style='font-weight: bold; padding: 5px;'"; let styleVal = "style='padding: 5px;'"; /* RPG.output['Strength'] = "&lt;tr&gt;&lt;td style='font-weight: bold; padding: 5px;'&gt;Strength&lt;/td&gt;&lt;td style='padding: 5px;'&gt;" + RPG.Strength + "&lt;/td&gt;&lt;/tr&gt;"; RPG.output['Speed'] = "&lt;tr&gt;&lt;td style='font-weight: bold; padding: 5px;'&gt;Speed&lt;/td&gt;&lt;td style='padding: 5px;'&gt;" + RPG.Speed + "&lt;/td&gt;&lt;/tr&gt;"; RPG.output['Intellect'] = "&lt;tr&gt;&lt;td style='font-weight: bold; padding: 5px;'&gt;Intellect&lt;/td&gt;&lt;td style='padding: 5px;'&gt;" + RPG.Intellect + "&lt;/td&gt;&lt;/tr&gt;"; RPG.output['Combat'] = "&lt;tr&gt;&lt;td style='font-weight: bold; padding: 5px;'&gt;Combat&lt;/td&gt;&lt;td style='padding: 5px;'&gt;" + RPG.Combat + "&lt;/td&gt;&lt;/tr&gt;"; RPG.output['Health'] = "&lt;tr&gt;&lt;td style='font-weight: bold; padding: 5px;'&gt;Health&lt;/td&gt;&lt;td style='padding: 5px;'&gt;" + RPG.Health + "&lt;/td&gt;&lt;/tr&gt;"; RPG.output['Stress'] = "&lt;tr&gt;&lt;td style='font-weight: bold; padding: 5px;'&gt;Stress&lt;/td&gt;&lt;td style='padding: 5px;'&gt;" + RPG.Stress + "&lt;/td&gt;&lt;/tr&gt;"; RPG.output['Sanity'] = "&lt;tr&gt;&lt;td style='font-weight: bold; padding: 5px;'&gt;Sanity Save&lt;/td&gt;&lt;td style='padding: 5px;'&gt;" + RPG.Sanity + "&lt;/td&gt;&lt;/tr&gt;"; RPG.output['Fear'] = "&lt;tr&gt;&lt;td style='font-weight: bold; padding: 5px;'&gt;Fear Save&lt;/td&gt;&lt;td style='padding: 5px;'&gt;" + RPG.Fear + "&lt;/td&gt;&lt;/tr&gt;"; RPG.output['Body'] = "&lt;tr&gt;&lt;td style='font-weight: bold; padding: 5px;'&gt;Body Save&lt;/td&gt;&lt;td style='padding: 5px;'&gt;" + RPG.Body + "&lt;/td&gt;&lt;/tr&gt;"; RPG.output['Armor'] = "&lt;tr&gt;&lt;td style='font-weight: bold; padding: 5px;'&gt;Armor Save&lt;/td&gt;&lt;td style='padding: 5px;'&gt;" + RPG.Armor + "&lt;/td&gt;&lt;/tr&gt;"; RPG.output['Study'] = "&lt;tr&gt;&lt;td style='font-weight: bold; padding: 5px;'&gt;Study&lt;/td&gt;&lt;td style='padding: 5px;'&gt;" + RPG.Study + "&lt;/td&gt;&lt;/tr&gt;"; RPG.output['Effect'] = "&lt;tr&gt;&lt;td style='font-weight: bold; padding: 5px;'&gt;Side Effect&lt;/td&gt;&lt;td style='padding: 5px;'&gt;" + RPG.Effect + "&lt;/td&gt;&lt;/tr&gt;"; RPG.output['Quirk'] = "&lt;tr&gt;&lt;td style='font-weight: bold; padding: 5px;'&gt;Doll Suit Quirk&lt;/td&gt;&lt;td style='padding: 5px;'&gt;" + RPG.Quirk + "&lt;/td&gt;&lt;/tr&gt;"; RPG.output['Expression'] = "&lt;tr&gt;&lt;td style='font-weight: bold; padding: 5px;'&gt;Doll Suit Expression&lt;/td&gt;&lt;td style='padding: 5px;'&gt;" + RPG.Expression + "&lt;/td&gt;&lt;/tr&gt;"; RPG.output['Skill'] = "&lt;tr&gt;&lt;td style='font-weight: bold; padding: 5px;'&gt;Skill&lt;/td&gt;&lt;td style='padding: 5px;'&gt;" + RPG.Skill + "&lt;/td&gt;&lt;/tr&gt;"; */ RPGTextAll = "&lt;p&gt;&lt;p&gt;CURRENT CHARACTER PARAMETERS&lt;p&gt;&lt;p&gt;" + RPGText1 + RPGText2 + RPGText3 + RPGText4; sendChat(msg.who, "/direct " + RPGTextAll); if (typeof saveCallback === "function") { saveCallback(); } }, save: function () { let character = createObj("character", { name: RPG.name, archived: false, inplayerjournals: "all", controlledby: "all" }); character.set('bio', RPGTextAll); createObj('attribute', { name: 'strength', current: RPG.Strength, _characterid: character.id }); createObj('attribute', { name: 'speed', current: RPG.Speed, _characterid: character.id }); createObj('attribute', { name: 'intellect', current: RPG.Intellect, _characterid: character.id }); createObj('attribute', { name: 'combat', current: RPG.Combat, _characterid: character.id }); createObj('attribute', { name: 'health', current: RPG.Health, _characterid: character.id }); createObj('attribute', { name: 'stress', current: RPG.Stress, _characterid: character.id }); createObj('attribute', { name: 'sanity', current: RPG.Sanity, _characterid: character.id }); createObj('attribute', { name: 'fear', current: RPG.Fear, _characterid: character.id }); createObj('attribute', { name: 'body', current: RPG.Body, _characterid: character.id }); createObj('attribute', { name: 'armor', current: RPG.Armor, _characterid: character.id }); sendChat('', 'Created &lt;a href="<a href="http://journal.roll20.net/character/" rel="nofollow">http://journal.roll20.net/character/</a>' + character.id + '" style="color:blue;text-decoration:underline;"&gt;NPCBUILD ' + NPCBUILD.name + '&lt;/a&gt;'); } }; on("ready", function () { RPG.listen(); });
1695657115
timmaugh
Pro
API Scripter
Because it is only instantiated in the GenAbilities property, which is a function. You are implicitly using a "var" declaration, so it is function scoped. That means it will appear as undefined when you want to use it in the printSheet function. You will need to reconfigure things so that you can re-reference variables like this in other functions (keeping them in such a way that you won't immediately step on them if you run the script again), and/or modifying the way functions call each other and what they return, so that you could pass along component variables you build along the way until your final output.
1695658695

Edited 1695658830
Scott C.
Forum Champion
Sheet Author
API Scripter
Compendium Curator
Also, a slightly more readable scaffold is to use an&nbsp;Immediately Invoked Function Expression (IIFE). This allows you to return specific functions to make them public, but maintain other functions as private. It also allows you to create script scoped variables that you can use throughout. Also note that the same error is going to crop up for all of the RPGText#'s (e.g.&nbsp;RPGText1 + RPGText2 + RPGText3 + RPGText4), it's just that the code errored out at RPGText1, and couldn't go further. /* Generates Mothership Characters for the Residue Processing Scenario * * Syntax: !RPGen option * */ var RPG = RPG || (()=&gt; { const version = "0.0.1"; const output = []; // You can define script scoped variables here, although for the usecase you asked about, you should probably just pass RPGText1 as an argument to the second function const listen = function () { on('chat:message', function (msg) { // Exit if not an api command if (msg.type != "api") { return; } if (msg.content.indexOf("!RPGen ") != -1) { var input = msg.content.split(" "); if (input[1] == "help") { showHelp(); } else { sendChat('API', "/direct &lt;h6&gt;Generating character&lt;/h6&gt;"); generate(msg, printSheet, save); } } else if (msg.content.indexOf("!RPGen") != -1) { showHelp(); } }); }; const showHelp = function () { sendChat("API", "/direct &lt;table style='background: #DCD9D5; border-radius: 20px; font-size: 10px;'&gt;" + "&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Help&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;" + "&lt;tbody&gt;" + "&lt;tr&gt;&lt;td&gt;&lt;strong&gt;!fodder&lt;/strong&gt;&lt;br&gt;&lt;strong&gt;!fodder help&lt;/strong&gt;&lt;br&gt;Show this help screen.&lt;/td&gt;&lt;/tr&gt;" + "&lt;tr&gt;&lt;td&gt;&lt;strong&gt;!fodder core&lt;/strong&gt;&lt;br&gt;Use default core DCC tables.&lt;/td&gt;&lt;/tr&gt;" + "&lt;tr&gt;&lt;td&gt;&lt;strong&gt;!fodder brokenmoon&lt;/strong&gt;&lt;br&gt;Use Crawling Under A Broken Moon tables, including mutants and robots.&lt;/td&gt;&lt;/tr&gt;" + "&lt;tr&gt;&lt;td&gt;&lt;strong&gt;!fodder crawl&lt;/strong&gt;&lt;br&gt;Use Crawl! tables for zero-level character generation, including gnomes and physical characteristics.&lt;/td&gt;&lt;/tr&gt;" + "&lt;tr&gt;&lt;td&gt; &lt;/td&gt;&lt;/tr&gt;" + "&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;"); }; const generate = function (msg, outputCallback, saveCallback) { id = msg.playerid; player = msg.who; name = msg.who + " #" + (findObjs({_type: "character", controlledby: msg.playerid}).length + 1) GenAbilities(msg); GenHistory(msg); GenSuit(msg); GenSkills(msg); printSheet(msg); save(msg); if (typeof outputCallback === "function") { setTimeout(outputCallback, 2500, msg, saveCallback); } }; const GenAbilities = function (msg) { sendChat("API", "/roll 1t[RP-Stats]", function (result) { let content = JSON.parse(result[0].content); let values = content.rolls[0].results[0].tableItem.name.split(':'); Strength = values[0]; Speed = values[1]; Intellect = values[2]; Combat = values[3]; Health = 10; Stress = 5; Sanity = 20; Fear = 20; Body = 20; Armor = 20; output['Strength'] = "&lt;tr&gt;&lt;td style='font-weight: bold; padding: 5px;'&gt;Strength&lt;/td&gt;&lt;td style='padding: 5px;'&gt;" + Strength + "&lt;/td&gt;&lt;/tr&gt;"; output['Speed'] = "&lt;tr&gt;&lt;td style='font-weight: bold; padding: 5px;'&gt;Speed&lt;/td&gt;&lt;td style='padding: 5px;'&gt;" + Speed + "&lt;/td&gt;&lt;/tr&gt;"; output['Intellect'] = "&lt;tr&gt;&lt;td style='font-weight: bold; padding: 5px;'&gt;Intellect&lt;/td&gt;&lt;td style='padding: 5px;'&gt;" + Intellect + "&lt;/td&gt;&lt;/tr&gt;"; output['Combat'] = "&lt;tr&gt;&lt;td style='font-weight: bold; padding: 5px;'&gt;Combat&lt;/td&gt;&lt;td style='padding: 5px;'&gt;" + Combat + "&lt;/td&gt;&lt;/tr&gt;"; output['Health'] = "&lt;tr&gt;&lt;td style='font-weight: bold; padding: 5px;'&gt;Health&lt;/td&gt;&lt;td style='padding: 5px;'&gt;" + Health + "&lt;/td&gt;&lt;/tr&gt;"; output['Stress'] = "&lt;tr&gt;&lt;td style='font-weight: bold; padding: 5px;'&gt;Stress&lt;/td&gt;&lt;td style='padding: 5px;'&gt;" + Stress + "&lt;/td&gt;&lt;/tr&gt;"; output['Sanity'] = "&lt;tr&gt;&lt;td style='font-weight: bold; padding: 5px;'&gt;Sanity Save&lt;/td&gt;&lt;td style='padding: 5px;'&gt;" + Sanity + "&lt;/td&gt;&lt;/tr&gt;"; output['Fear'] = "&lt;tr&gt;&lt;td style='font-weight: bold; padding: 5px;'&gt;Fear Save&lt;/td&gt;&lt;td style='padding: 5px;'&gt;" + Fear + "&lt;/td&gt;&lt;/tr&gt;"; output['Body'] = "&lt;tr&gt;&lt;td style='font-weight: bold; padding: 5px;'&gt;Body Save&lt;/td&gt;&lt;td style='padding: 5px;'&gt;" + Body + "&lt;/td&gt;&lt;/tr&gt;"; output['Armor'] = "&lt;tr&gt;&lt;td style='font-weight: bold; padding: 5px;'&gt;Armor Save&lt;/td&gt;&lt;td style='padding: 5px;'&gt;" + Armor + "&lt;/td&gt;&lt;/tr&gt;"; RPGText1 = "&lt;table font-size: 10px;'&gt; &lt;tbody&gt;" + output['Strength'] + output['Speed'] + output['Intellect'] + output['Combat'] + output['Health'] + output['Stress'] + output['Sanity'] + output['Fear'] + output['Body'] + output['Armor'] + "&lt;/tbody&gt;&lt;/table&gt;"; sendChat(msg.who, "/direct " + RPGText1); }); }; const GenHistory = function (msg) { sendChat("API", "/roll 1t[RP-History]", function (result) { let content = JSON.parse(result[0].content); let values = content.rolls[0].results[0].tableItem.name.split(':'); Study = values[0]; Effect = values[1]; if (Effect.includes('(A)')) { Fear = 50; } output['Study'] = "&lt;tr&gt;&lt;td style='font-weight: bold; padding: 5px;'&gt;Study&lt;/td&gt;&lt;td style='padding: 5px;'&gt;" + Study + "&lt;/td&gt;&lt;/tr&gt;"; output['Effect'] = "&lt;tr&gt;&lt;td style='font-weight: bold; padding: 5px;'&gt;Side Effect&lt;/td&gt;&lt;td style='padding: 5px;'&gt;" + Effect + "&lt;/td&gt;&lt;/tr&gt;"; RPGText2 = "&lt;table font-size: 10px;'&gt; &lt;tbody&gt;" + output['Study'] + output['Effect'] + "&lt;/tbody&gt;&lt;/table&gt;"; sendChat(msg.who, "/direct " + RPGText2); }); }; const GenSuit = function (msg) { sendChat("API", "/roll 1t[RP-Expression]", function (result) { let content = JSON.parse(result[0].content); let values = content.rolls[0].results[0].tableItem.name.split(':'); Expression = values[0]; output['Expression'] = "&lt;tr&gt;&lt;td style='font-weight: bold; padding: 5px;'&gt;Doll Suit Expression&lt;/td&gt;&lt;td style='padding: 5px;'&gt;" + Expression + "&lt;/td&gt;&lt;/tr&gt;"; let content1 = JSON.parse(result[0].content); let values1 = content.rolls[0].results[0].tableItem.name.split(':'); Quirk = values[0]; output['Quirk'] = "&lt;tr&gt;&lt;td style='font-weight: bold; padding: 5px;'&gt;Doll Suit Quirk&lt;/td&gt;&lt;td style='padding: 5px;'&gt;" + Quirk + "&lt;/td&gt;&lt;/tr&gt;"; RPGText3 = "&lt;table font-size: 10px;'&gt; &lt;tbody&gt;" + output['Quirk'] + output['Expression'] + "&lt;/tbody&gt;&lt;/table&gt;"; sendChat(msg.who, "/direct " + RPGText3); }); }; const GenSkills = function (msg) { sendChat("API", "/roll 1t[RP-Skills]", function (result) { let content = JSON.parse(result[0].content); let values = content.rolls[0].results[0].tableItem.name.split(':'); Skill = values[0]; output['Skill'] = "&lt;tr&gt;&lt;td style='font-weight: bold; padding: 5px;'&gt;Skill&lt;/td&gt;&lt;td style='padding: 5px;'&gt;" + Skill + "&lt;/td&gt;&lt;/tr&gt;"; RPGText4 = "&lt;table font-size: 10px;'&gt; &lt;tbody&gt;" + output['Skill'] + "&lt;/tbody&gt;&lt;/table&gt;"; sendChat(msg.who, "/direct " + RPGText4); }); }; const printSheet = function (msg, saveCallback) { let styleLabel = "style='font-weight: bold; padding: 5px;'"; let styleVal = "style='padding: 5px;'"; /* output['Strength'] = "&lt;tr&gt;&lt;td style='font-weight: bold; padding: 5px;'&gt;Strength&lt;/td&gt;&lt;td style='padding: 5px;'&gt;" + Strength + "&lt;/td&gt;&lt;/tr&gt;"; output['Speed'] = "&lt;tr&gt;&lt;td style='font-weight: bold; padding: 5px;'&gt;Speed&lt;/td&gt;&lt;td style='padding: 5px;'&gt;" + Speed + "&lt;/td&gt;&lt;/tr&gt;"; output['Intellect'] = "&lt;tr&gt;&lt;td style='font-weight: bold; padding: 5px;'&gt;Intellect&lt;/td&gt;&lt;td style='padding: 5px;'&gt;" + Intellect + "&lt;/td&gt;&lt;/tr&gt;"; output['Combat'] = "&lt;tr&gt;&lt;td style='font-weight: bold; padding: 5px;'&gt;Combat&lt;/td&gt;&lt;td style='padding: 5px;'&gt;" + Combat + "&lt;/td&gt;&lt;/tr&gt;"; output['Health'] = "&lt;tr&gt;&lt;td style='font-weight: bold; padding: 5px;'&gt;Health&lt;/td&gt;&lt;td style='padding: 5px;'&gt;" + Health + "&lt;/td&gt;&lt;/tr&gt;"; output['Stress'] = "&lt;tr&gt;&lt;td style='font-weight: bold; padding: 5px;'&gt;Stress&lt;/td&gt;&lt;td style='padding: 5px;'&gt;" + Stress + "&lt;/td&gt;&lt;/tr&gt;"; output['Sanity'] = "&lt;tr&gt;&lt;td style='font-weight: bold; padding: 5px;'&gt;Sanity Save&lt;/td&gt;&lt;td style='padding: 5px;'&gt;" + Sanity + "&lt;/td&gt;&lt;/tr&gt;"; output['Fear'] = "&lt;tr&gt;&lt;td style='font-weight: bold; padding: 5px;'&gt;Fear Save&lt;/td&gt;&lt;td style='padding: 5px;'&gt;" + Fear + "&lt;/td&gt;&lt;/tr&gt;"; output['Body'] = "&lt;tr&gt;&lt;td style='font-weight: bold; padding: 5px;'&gt;Body Save&lt;/td&gt;&lt;td style='padding: 5px;'&gt;" + Body + "&lt;/td&gt;&lt;/tr&gt;"; output['Armor'] = "&lt;tr&gt;&lt;td style='font-weight: bold; padding: 5px;'&gt;Armor Save&lt;/td&gt;&lt;td style='padding: 5px;'&gt;" + Armor + "&lt;/td&gt;&lt;/tr&gt;"; output['Study'] = "&lt;tr&gt;&lt;td style='font-weight: bold; padding: 5px;'&gt;Study&lt;/td&gt;&lt;td style='padding: 5px;'&gt;" + Study + "&lt;/td&gt;&lt;/tr&gt;"; output['Effect'] = "&lt;tr&gt;&lt;td style='font-weight: bold; padding: 5px;'&gt;Side Effect&lt;/td&gt;&lt;td style='padding: 5px;'&gt;" + Effect + "&lt;/td&gt;&lt;/tr&gt;"; output['Quirk'] = "&lt;tr&gt;&lt;td style='font-weight: bold; padding: 5px;'&gt;Doll Suit Quirk&lt;/td&gt;&lt;td style='padding: 5px;'&gt;" + Quirk + "&lt;/td&gt;&lt;/tr&gt;"; output['Expression'] = "&lt;tr&gt;&lt;td style='font-weight: bold; padding: 5px;'&gt;Doll Suit Expression&lt;/td&gt;&lt;td style='padding: 5px;'&gt;" + Expression + "&lt;/td&gt;&lt;/tr&gt;"; output['Skill'] = "&lt;tr&gt;&lt;td style='font-weight: bold; padding: 5px;'&gt;Skill&lt;/td&gt;&lt;td style='padding: 5px;'&gt;" + Skill + "&lt;/td&gt;&lt;/tr&gt;"; */ RPGTextAll = "&lt;p&gt;&lt;p&gt;CURRENT CHARACTER PARAMETERS&lt;p&gt;&lt;p&gt;" + RPGText1 + RPGText2 + RPGText3 + RPGText4; sendChat(msg.who, "/direct " + RPGTextAll); if (typeof saveCallback === "function") { saveCallback(); } }; const save = function () { let character = createObj("character", { name: name, archived: false, inplayerjournals: "all", controlledby: "all" }); character.set('bio', RPGTextAll); createObj('attribute', { name: 'strength', current: Strength, _characterid: character.id }); createObj('attribute', { name: 'speed', current: Speed, _characterid: character.id }); createObj('attribute', { name: 'intellect', current: Intellect, _characterid: character.id }); createObj('attribute', { name: 'combat', current: Combat, _characterid: character.id }); createObj('attribute', { name: 'health', current: Health, _characterid: character.id }); createObj('attribute', { name: 'stress', current: Stress, _characterid: character.id }); createObj('attribute', { name: 'sanity', current: Sanity, _characterid: character.id }); createObj('attribute', { name: 'fear', current: Fear, _characterid: character.id }); createObj('attribute', { name: 'body', current: Body, _characterid: character.id }); createObj('attribute', { name: 'armor', current: Armor, _characterid: character.id }); sendChat('', 'Created &lt;a href="<a href="http://journal.roll20.net/character/" rel="nofollow">http://journal.roll20.net/character/</a>' + character.id + '" style="color:blue;text-decoration:underline;"&gt;NPCBUILD ' + NPCBUILD.name + '&lt;/a&gt;'); } return { listen } })(); on("ready", function () { RPG.listen(); });