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

SyntaxError: Unexpected identifier

December 22 (2 years ago)
Joab
Pro

I'm trying to populate repeating sections on the Mork Borg character sheet. I've just inserted the repeating section code, but I'm getting a SyntaxError: Unexpected identifier message when I save it. JSLint does not report this. Suggestions?

/**
 * Generates Mork Borg Characters
 *
 * Syntax: !SCVMBuild option
 *
 */

let SCVMBuild = SCVMBuild || {
    version: "0.0.5",
    output: [],

    listen: function () {

        on('chat:message', function (msg) {
            // Exit if not an api command
            if (msg.type != "api") {
                return;
            }
            if (isGM(msg.playerid)) {
                sendto = "/w gm ";
            } else {
                sendto = "/direct ";
            }
            switch (msg.content) {
            case '!GenClass':
                SCVMBuild.GenClass(msg);
                break;
            case '!GenWeapon':
                SCVMBuild.GenWeapon(msg);
                break;
            case '!GenArmor':
                SCVMBuild.GenArmor(msg);
                break;
            case '!GenEquipment':
                SCVMBuild.GenEquipment(msg);
                break;
            case '!GenAbilities':
                SCVMBuild.GenAbilities(msg);
                break;
            case '!GenHP':
                SCVMBuild.GenHP(msg);
                break;
            case '!GenPower':
                SCVMBuild.GenPower(msg);
                break;
            case '!GenOmen':
                SCVMBuild.GenOmen(msg);
                break;
            case '!GenTraits':
                SCVMBuild.GenTraits(msg);
                break;
            case '!GenBody':
                SCVMBuild.GenBody(msg);
                break;
            case '!GenHabit':
                SCVMBuild.GenHabit(msg);
                break;
            case '!GenStory':
                SCVMBuild.GenStory(msg);
                break;
            case '!GenName':
                SCVMBuild.GenName(msg);
                break;
            case '!CharView':
                SCVMBuild.printSheet(msg);
                break;
            case '!SaveChar':
                SCVMBuild.save(msg);
                break;
            default:
                return;
            }
        });
    },

    GenClass: function (msg) {
        sendChat("API", "/roll 1t[Class]", function (result) {
            let content = JSON.parse(result[0].content);
            let values1 = content.rolls[0].results[0].tableItem.name.split(':');
            SCVMBuild.Class = values1[0];
            SCVMBuild.output['Class'] = "<tr><td style='font-weight: bold; padding: 5px;'>Class</td></tr><tr><td style='padding: 5px;'>" + SCVMBuild.Class + "</td></tr>";
            SCVMTextA = "<table font-size: 10px;'> <tbody>" + SCVMBuild.output['Class'] + "</tbody></table>";
            sendChat(msg.who, "/direct " + SCVMTextA);
        });
    },

    GenWeapon: function (msg) {
        generateRowID = function () {
            "use strict";
            return generateUUID().replace(/_/g, "Z");
        };
        sendChat("API", "/roll 1t[Weapon]", function (result) {
            let content = JSON.parse(result[0].content);
            let values2 = content.rolls[0].results[0].tableItem.name.split(':');
           SCVMBuild.Weapon = values2[0];
            SCVMBuild.output['Weapon'] = "<tr><td style='font-weight: bold; padding: 5px;'>Weapon</td></tr><tr><td style='padding: 5px;'>" + SCVMBuild.Weapon + "</td></tr>";
            SCVMTextB = "<table font-size: 10px;'> <tbody>" + SCVMBuild.output['Weapon'] + "</tbody></table>";
            sendChat(msg.who, "/direct " + SCVMTextB);
            repeating_weapons_ROWID_weaponname = SCVMBuild.weaponname;
            repeating_weapons_ROWID_attacktype = SCVMBuild.attacktype;
            repeating_weapons_ROWID_weapondamage = SCVMBuild.weapondamage;
        });
    },

    GenArmor: function (msg) {
        sendChat("API", "/roll 1t[Armor]", function (result) {
            let content = JSON.parse(result[0].content);
            let values3 = content.rolls[0].results[0].tableItem.name.split(':');
            SCVMBuild.Armor = values3[0];
            SCVMBuild.output['Armor'] = "<tr><td style='font-weight: bold; padding: 5px;'>Armor</td></tr><tr><td style='padding: 5px;'>" + SCVMBuild.Armor + "</td></tr>";
            SCVMTextC = "<table font-size: 10px;'> <tbody>" + SCVMBuild.output['Armor'] + "</tbody></table>";
            sendChat(msg.who, "/direct " + SCVMTextC);
        });
    },

    GenEquipment: function (msg) {
        sendChat("API", "/roll 1t[Equipment1]", function (result) {
            let content = JSON.parse(result[0].content);
            let values4 = content.rolls[0].results[0].tableItem.name.split(':');
            SCVMBuild.Equipment1 = values4[0];
            SCVMBuild.output['Equipment1'] = "<tr><td style='font-weight: bold; padding: 5px;'>Equipment1</td></tr><tr><td style='padding: 5px;'>" + SCVMBuild.Equipment1 + "</td></tr>";
            SCVMTextD1 = "<table font-size: 10px;'> <tbody>" + SCVMBuild.output['Equipment1'] + "</tbody></table>";
            sendChat(msg.who, "/direct " + SCVMTextD1);
        });
        sendChat("API", "/roll 1t[Equipment2]", function (result) {
            let content = JSON.parse(result[0].content);
            let values5 = content.rolls[0].results[0].tableItem.name.split(':');
            SCVMBuild.Equipment2 = values5[0];
            SCVMBuild.output['Equipment2'] = "<tr><td style='font-weight: bold; padding: 5px;'>Equipment2</td></tr><tr><td style='padding: 5px;'>" + SCVMBuild.Equipment2 + "</td></tr>";
            SCVMTextD2 = "<table font-size: 10px;'> <tbody>" + SCVMBuild.output['Equipment2'] + "</tbody></table>";
            sendChat(msg.who, "/direct " + SCVMTextD2);
        });
        sendChat("API", "/roll 1t[Equipment3]", function (result) {
            let content = JSON.parse(result[0].content);
            let values6 = content.rolls[0].results[0].tableItem.name.split(':');
            SCVMBuild.Equipment3 = values6[0];
            SCVMBuild.output['Equipment3'] = "<tr><td style='font-weight: bold; padding: 5px;'>Equipment3</td></tr><tr><td style='padding: 5px;'>" + SCVMBuild.Equipment3 + "</td></tr>";
            SCVMTextD3 = "<table font-size: 10px;'> <tbody>" + SCVMBuild.output['Equipment3'] + "</tbody></table>";
            sendChat(msg.who, "/direct " + SCVMTextD3);
        });
    },

    GenAbilities: function (msg) {
        SCVMBuild.Agility = randomInteger(7) - 4;
        SCVMBuild.output['Agility'] = "<tr><td style='font-weight: bold; padding: 5px;'>Agility</td></tr><tr><td style='padding: 5px;'>" + SCVMBuild.Agility + "</td></tr>";
        SCVMTextE = "<table font-size: 10px;'> <tbody>" + SCVMBuild.output['Agility'] + "</tbody></table>";
        sendChat(msg.who, "/direct " + SCVMTextE);

        SCVMBuild.Presence = randomInteger(7) - 4;
        SCVMBuild.output['Presence'] = "<tr><td style='font-weight: bold; padding: 5px;'>Presence</td></tr><tr><td style='padding: 5px;'>" + SCVMBuild.Presence + "</td></tr>";
        SCVMTextF = "<table font-size: 10px;'> <tbody>" + SCVMBuild.output['Presence'] + "</tbody></table>";
        sendChat(msg.who, "/direct " + SCVMTextF);

        SCVMBuild.Strength = randomInteger(7) - 4;
        SCVMBuild.output['Strength'] = "<tr><td style='font-weight: bold; padding: 5px;'>Strength</td></tr><tr><td style='padding: 5px;'>" + SCVMBuild.Strength + "</td></tr>";
        SCVMTextG = "<table font-size: 10px;'> <tbody>" + SCVMBuild.output['Strength'] + "</tbody></table>";
        sendChat(msg.who, "/direct " + SCVMTextG);

        SCVMBuild.Toughness = randomInteger(7) - 4;
        SCVMBuild.output['Toughness'] = "<tr><td style='font-weight: bold; padding: 5px;'>Toughness</td></tr><tr><td style='padding: 5px;'>" + SCVMBuild.Toughness + "</td></tr>";
        SCVMTextH = "<table font-size: 10px;'> <tbody>" + SCVMBuild.output['Toughness'] + "</tbody></table>";
        sendChat(msg.who, "/direct " + SCVMTextH);

    },

    GenHP: function (msg) {
        SCVMBuild.HP = SCVMBuild.Toughness + randomInteger(8);
        if (SCVMBuild.HP < 1) {
            SCVMBuild.HP = "1";
        }
        SCVMBuild.output['HP'] = "<tr><td style='font-weight: bold; padding: 5px;'>HP</td></tr><tr><td style='padding: 5px;'>" + SCVMBuild.HP + "</td></tr>";
        SCVMTextI = "<table font-size: 10px;'> <tbody>" + SCVMBuild.output['HP'] + "</tbody></table>";
        sendChat(msg.who, "/direct " + SCVMTextI);
    },

    GenPower: function (msg) {
        sendChat("API", "/roll 1t[Power]", function (result) {
            let content = JSON.parse(result[0].content);
            let valuesB = content.rolls[0].results[0].tableItem.name.split(':');
            SCVMBuild.Power = valuesB[0];
            SCVMBuild.output['Power'] = "<tr><td style='font-weight: bold; padding: 5px;'>Power</td></tr><tr><td style='padding: 5px;'>" + SCVMBuild.Power + "</td></tr>";
            SCVMTextJ = "<table font-size: 10px;'> <tbody>" + SCVMBuild.output['Power'] + "</tbody></table>";
            sendChat(msg.who, "/direct " + SCVMTextJ);
        });
    },

    GenOmen: function (msg) {
        sendChat("API", "/roll 1t[Omens]", function (result) {
            let content = JSON.parse(result[0].content);
            let valuesC = content.rolls[0].results[0].tableItem.name.split(':');
            SCVMBuild.Omen = valuesC[0];
            SCVMBuild.output['Omen'] = "<tr><td style='font-weight: bold; padding: 5px;'>Omen</td></tr><tr><td style='padding: 5px;'>" + SCVMBuild.Omen + "</td></tr>";
            SCVMTextK = "<table font-size: 10px;'> <tbody>" + SCVMBuild.output['Omen'] + "</tbody></table>";
            sendChat(msg.who, "/direct " + SCVMTextK);
        });
    },

    GenTraits: function (msg) {
        sendChat("API", "/roll 1t[Trait]", function (result) {
            let content = JSON.parse(result[0].content);
            let valuesC = content.rolls[0].results[0].tableItem.name.split(':');
            SCVMBuild.Trait1 = valuesC[0];
            SCVMBuild.output['Trait1'] = "<tr><td style='font-weight: bold; padding: 5px;'>Trait1</td></tr><tr><td style='padding: 5px;'>" + SCVMBuild.Trait1 + "</td></tr>";
            SCVMTextL1 = "<table font-size: 10px;'> <tbody>" + SCVMBuild.output['Trait1'] + "</tbody></table>";
            sendChat(msg.who, "/direct " + SCVMTextL1);
        });
        sendChat("API", "/roll 1t[Trait]", function (result) {
            let content = JSON.parse(result[0].content);
            let valuesD = content.rolls[0].results[0].tableItem.name.split(':');
            SCVMBuild.Trait2 = valuesD[0];
            SCVMBuild.output['Trait2'] = "<tr><td style='font-weight: bold; padding: 5px;'>Trait2</td></tr><tr><td style='padding: 5px;'>" + SCVMBuild.Trait2 + "</td></tr>";
            SCVMTextL2 = "<table font-size: 10px;'> <tbody>" + SCVMBuild.output['Trait2'] + "</tbody></table>";
            sendChat(msg.who, "/direct " + SCVMTextL2);
        });
    },

    GenBody: function (msg) {
        sendChat("API", "/roll 1t[Body]", function (result) {
            let content = JSON.parse(result[0].content);
            let valuesE = content.rolls[0].results[0].tableItem.name.split(':');
            SCVMBuild.Body = valuesE[0];
            SCVMBuild.output['Body'] = "<tr><td style='font-weight: bold; padding: 5px;'>Broken Body</td></tr><tr><td style='padding: 5px;'>" + SCVMBuild.Body + "</td></tr>";
            SCVMTextM = "<table font-size: 10px;'> <tbody>" + SCVMBuild.output['Body'] + "</tbody></table>";
            sendChat(msg.who, "/direct " + SCVMTextM);
        });
    },

    GenHabit: function (msg) {
        sendChat("API", "/roll 1t[Habit]", function (result) {
            let content = JSON.parse(result[0].content);
            let valuesF = content.rolls[0].results[0].tableItem.name.split(':');
            SCVMBuild.Habit = valuesF[0];
            SCVMBuild.output['Habit'] = "<tr><td style='font-weight: bold; padding: 5px;'>Bad Habit</td></tr><tr><td style='padding: 5px;'>" + SCVMBuild.Habit + "</td></tr>";
            SCVMTextN = "<table font-size: 10px;'> <tbody>" + SCVMBuild.output['Habit'] + "</tbody></table>";
            sendChat(msg.who, "/direct " + SCVMTextN);
        });
    },

    GenStory: function (msg) {
        sendChat("API", "/roll 1t[Story]", function (result) {
            let content = JSON.parse(result[0].content);
            let valuesG = content.rolls[0].results[0].tableItem.name.split(':');
            SCVMBuild.Story = valuesG[0];
            SCVMBuild.output['Story'] = "<tr><td style='font-weight: bold; padding: 5px;'>Troubling Tale</td></tr><tr><td style='padding: 5px;'>" + SCVMBuild.Story + "</td></tr>";
            SCVMTextO = "<table font-size: 10px;'> <tbody>" + SCVMBuild.output['Story'] + "</tbody></table>";
            sendChat(msg.who, "/direct " + SCVMTextO);
        });
    },

    GenName: function (msg) {
        sendChat("API", "/roll 1t[MaleName]", function (result) {
            let content = JSON.parse(result[0].content);
            let valuesH = content.rolls[0].results[0].tableItem.name.split(':');
            SCVMBuild.Name = valuesH[0];
            SCVMBuild.output['Name'] = "<tr><td style='font-weight: bold; padding: 5px;'>Name</td></tr><tr><td style='padding: 5px;'>" + SCVMBuild.Name + "</td></tr>";
            SCVMTextH = "<table font-size: 10px;'> <tbody>" + SCVMBuild.output['Name'] + "</tbody></table>";
            sendChat(msg.who, "/direct " + SCVMTextH);
        });
    },
    printSheet: function (msg) {
        let styleLabel = "style='font-weight: bold; padding: 5px;'";
        let styleVal = "style='padding: 5px;'";

        SCVMBuild.output['Class'] = "<tr><td style='font-weight: bold; padding: 5px;'>Class</td><td style='padding: 5px;'>" + SCVMBuild.Class + "</td></tr>";
        SCVMBuild.output['Weapon'] = "<tr><td style='font-weight: bold; padding: 5px;'>Weapon</td><td style='padding: 5px;'>" + SCVMBuild.Weapon + "</td></tr>";
        SCVMBuild.output['Armor'] = "<tr><td style='font-weight: bold; padding: 5px;'>Armor</td><td style='padding: 5px;'>" + SCVMBuild.Armor + "</td></tr>";
        SCVMBuild.output['Equipment1'] = "<tr><td style='font-weight: bold; padding: 5px;'>Equipment1</td><td style='padding: 5px;'>" + SCVMBuild.Equipment1 + "</td></tr>";
        SCVMBuild.output['Equipment2'] = "<tr><td style='font-weight: bold; padding: 5px;'>Equipment2</td><td style='padding: 5px;'>" + SCVMBuild.Equipment2 + "</td></tr>";
        SCVMBuild.output['Equipment3'] = "<tr><td style='font-weight: bold; padding: 5px;'>Equipment3</td><td style='padding: 5px;'>" + SCVMBuild.Equipment3 + "</td></tr>";
        SCVMBuild.output['Agility'] = "<tr><td style='font-weight: bold; padding: 5px;'>Agility</td><td style='padding: 5px;'>" + SCVMBuild.Agility + "</td></tr>";
        SCVMBuild.output['Presence'] = "<tr><td style='font-weight: bold; padding: 5px;'>Presence</td><td style='padding: 5px;'>" + SCVMBuild.Presence + "</td></tr>";
        SCVMBuild.output['Strength'] = "<tr><td style='font-weight: bold; padding: 5px;'>Strength</td><td style='padding: 5px;'>" + SCVMBuild.Strength + "</td></tr>";
        SCVMBuild.output['Toughness'] = "<tr><td style='font-weight: bold; padding: 5px;'>Toughness</td><td style='padding: 5px;'>" + SCVMBuild.Toughness + "</td></tr>";
        SCVMBuild.output['HP'] = "<tr><td style='font-weight: bold; padding: 5px;'>HP</td><td style='padding: 5px;'>" + SCVMBuild.HP + "</td></tr>";
        SCVMBuild.output['Power'] = "<tr><td style='font-weight: bold; padding: 5px;'>Power</td><td style='padding: 5px;'>" + SCVMBuild.Power + "</td></tr>";
        SCVMBuild.output['Omen'] = "<tr><td style='font-weight: bold; padding: 5px;'>Omen</td><td style='padding: 5px;'>" + SCVMBuild.Omen + "</td></tr>";
        SCVMBuild.output['Trait1'] = "<tr><td style='font-weight: bold; padding: 5px;'>Trait1</td><td style='padding: 5px;'>" + SCVMBuild.Trait1 + "</td></tr>";
        SCVMBuild.output['Trait2'] = "<tr><td style='font-weight: bold; padding: 5px;'>Trait2</td><td style='padding: 5px;'>" + SCVMBuild.Trait2 + "</td></tr>";
        SCVMBuild.output['Body'] = "<tr><td style='font-weight: bold; padding: 5px;'>Broken Body</td><td style='padding: 5px;'>" + SCVMBuild.Body + "</td></tr>";
        SCVMBuild.output['Habit'] = "<tr><td style='font-weight: bold; padding: 5px;'>Bad Habit</td><td style='padding: 5px;'>" + SCVMBuild.Habit + "</td></tr>";
        SCVMBuild.output['Story'] = "<tr><td style='font-weight: bold; padding: 5px;'>Troubling Tale</td><td style='padding: 5px;'>" + SCVMBuild.Story + "</td></tr>";
        SCVMBuild.output['Name'] = "<tr><td style='font-weight: bold; padding: 5px;'>Name</td><td style='padding: 5px;'>" + SCVMBuild.Name + "</td></tr>";

        SCVMText1 = "<table font-size: 10px;'> <tbody>" +
            SCVMBuild.output['Class`'] +
            SCVMBuild.output['Weapon'] +
            SCVMBuild.output['Armor'] +
            SCVMBuild.output['Equipment1'] +
            SCVMBuild.output['Equipment2'] +
            SCVMBuild.output['Equipment3'] +
            SCVMBuild.output['Strength'] +
            SCVMBuild.output['Agility'] +
            SCVMBuild.output['Presence'] +
            SCVMBuild.output['Toughness'] +
            SCVMBuild.output['HP'] +
            SCVMBuild.output['Power'] +
            SCVMBuild.output['Omen'] +
            SCVMBuild.output['Trait1'] +
            SCVMBuild.output['Trait2'] +
            SCVMBuild.output['Body'] +
            SCVMBuild.output['Habit'] +
            SCVMBuild.output['Story'] +
            SCVMBuild.output['Name'] + "</tbody></table>";

        SCVMText = SCVMText1 + "<p><p>";
        sendChat(msg.who, "/direct " + SCVMText);

        SCVMBuild.Description = SCVMBuild.Trait1 + "\n" + SCVMBuild.Trait2 + "\n" + SCVMBuild.Body + "\n" + SCVMBuild.Habit + "\n" + SCVMBuild.Story;

        if (typeof saveCallback === "function") {
            saveCallback();
        }
    },

    save: function (msg, saveCallback) {
        sendChat(msg.who, "/direct saving character");
        let handout = createObj('handout', {
            name: SCVMBuild.Name + ' Instructions',
            inplayerjournals: "all",
            archived: false
        });
        let character = createObj("character", {
            name: SCVMBuild.Name,
            archived: false,
            inplayerjournals: "all",
            controlledby: "all"
        });

        handout.set('notes', SCVMText);
        sendChat('', 'Created instructions for completing <a href="http://journal.roll20.net/handout/' + handout.id + '" style="color:blue;text-decoration:underline;">SCVMBUILDER ' + SCVMBuild.Name + '</a>');

        createObj('attribute', {
            name: 'class',
            current: SCVMBuild.Class,
            _characterid: character.id
        });
        // createObj('attribute', {
            // name: 'weapon',
            // current: SCVMBuild.Weapon,
            // _characterid: character.id
        // });
        createObj('attribute', {
            name: 'armor',
            current: SCVMBuild.Armor,
            _characterid: character.id
        });
        createObj('attribute', {
            name: 'strength',
            current: SCVMBuild.Strength,
            _characterid: character.id
        });
        createObj('attribute', {
            name: 'agility',
            current: SCVMBuild.Agility,
            _characterid: character.id
        });
        createObj('attribute', {
            name: 'presence',
            current: SCVMBuild.Presence,
            _characterid: character.id
        });
        createObj('attribute', {
            name: 'toughness',
            current: SCVMBuild.Toughness,
            _characterid: character.id
        });
        createObj('attribute', {
            name: 'hp_curr',
            current: SCVMBuild.HP,
            _characterid: character.id
        });
        createObj('attribute', {
            name: 'hp',
            current: SCVMBuild.HP,
            _characterid: character.id
        });
        createObj('attribute', {
            name: 'power',
            current: SCVMBuild.Power,
            _characterid: character.id
        });
        createObj('attribute', {
            name: 'omen',
            current: SCVMBuild.Omen,
            _characterid: character.id
        });
        createObj('attribute', {
            name: 'description',
            current: SCVMBuild.Description,
            _characterid: character.id
        });
        createObj('attribute', {
            name: 'char_name',
            current: SCVMBuild.Name,
            _characterid: character.id
        });
        sendChat('', 'Created <a href="http://journal.roll20.net/character/' + character.id + '" style="color:blue;text-decoration:underline;">SCVM ' + SCVMBuild.Name + '</a>');
    }
};

let generateUUID = (function () {

    let a = 0,
    b = [];
    return function () {
        let c = (new Date()).getTime() + 0,
        d = c === a;
        a = c;
        for (let e = new Array(8), f = 7; 0 <= f; f--) {
            e[f] = "-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz".charAt(c % 64);
            c = Math.floor(c / 64);
        }
        c = e.join("");
        if (d) {
            for (f = 11; 0 <= f && 63 === b[f]; f--) {
                b[f] = 0;
            }
            b[f]++;
        } else {
            for (f = 0; 12 > f; f++) {
                b[f] = Math.floor(64 * Math.random());
            }
        }
        for (f = 0; 12 > f; f++) {
            c += "-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz".charAt(b[f]);
        }
		log c;
        return c;
    };
}
    ),

on("ready", function () {
    SCVMBuild.listen();
});



December 22 (2 years ago)
The Aaron
Roll20 Production Team
API Scripter

I run things like this though the Google Closure Compiler.

JSC_PARSE_ERROR: Parse error. Semi-colon expected at line 427 character 6
log c;
^

That error message doesn't really help too much, but it does point to the right general area.  The 4th to last non-blank line has:

    ),

That should have a ; instead of a , and then it will be functional code.  You'll also need to either change this line:

let SCVMBuild = SCVMBuild || {
to (preferred)
const SCVMBuild = {
or (outdated but functional)
var SCVMBuild = SCVMBuild || {
Variables declared with let or const cannot be referenced before they are declared.  They are not declared until after being assigned, so using them as part of the assigning expression is an error.  Variables declared with var are hoisted to the top of the scope, so can be used before the line that declares them.  

let and const variable declarations will be an error if they attempt to declare the same variable more than once, but var allows you to declare the same variable multiple times.  Before let and const existed, I used that var construct of assigning the same object or creating the object after the || so that I could avoid issues with having the same script installed but not knowing it.  Using const will let you know immediately if it already exists and so is a superior method of creating global scope objects.

I've only found one case where the multiple declaration behavior of var is useful, and that is for the API_Meta stuff.


December 22 (2 years ago)
The Aaron
Roll20 Production Team
API Scripter

Really, generateUUID should be inside the SCVMBuild closure to avoid collisions in the global namespace.  Technically, the ( ) around it are meaningless and can be removed.

December 22 (2 years ago)
Joab
Pro

OK. I modified the code as you suggested, I think. I now get

SyntaxError: Unexpected token '}'

in the Mod Output Console, and

JSC_PARSE_ERROR: Parse error. primary expression expected at line 425 character 1
};
 ^
from the Google Closure Compiler.

Here is the current code:
// ==ClosureCompiler==
// @output_file_name default.js
// @compilation_level SIMPLE_OPTIMIZATIONS
// ==/ClosureCompiler==

/**
 * Generates Mork Borg Characters
 *
 * Syntax: !SCVMBuild option
 *
 */

const SCVMBuild = SCVMBuild || {
    version: "0.0.5",
    output: [],

    listen: function () {

        on('chat:message', function (msg) {
            // Exit if not an api command
            if (msg.type != "api") {
                return;
            }
            if (isGM(msg.playerid)) {
                sendto = "/w gm ";
            } else {
                sendto = "/direct ";
            }
            switch (msg.content) {
            case '!GenClass':
                SCVMBuild.GenClass(msg);
                break;
            case '!GenWeapon':
                SCVMBuild.GenWeapon(msg);
                break;
            case '!GenArmor':
                SCVMBuild.GenArmor(msg);
                break;
            case '!GenEquipment':
                SCVMBuild.GenEquipment(msg);
                break;
            case '!GenAbilities':
                SCVMBuild.GenAbilities(msg);
                break;
            case '!GenHP':
                SCVMBuild.GenHP(msg);
                break;
            case '!GenPower':
                SCVMBuild.GenPower(msg);
                break;
            case '!GenOmen':
                SCVMBuild.GenOmen(msg);
                break;
            case '!GenTraits':
                SCVMBuild.GenTraits(msg);
                break;
            case '!GenBody':
                SCVMBuild.GenBody(msg);
                break;
            case '!GenHabit':
                SCVMBuild.GenHabit(msg);
                break;
            case '!GenStory':
                SCVMBuild.GenStory(msg);
                break;
            case '!GenName':
                SCVMBuild.GenName(msg);
                break;
            case '!CharView':
                SCVMBuild.printSheet(msg);
                break;
            case '!SaveChar':
                SCVMBuild.save(msg);
                break;
            default:
                return;
            }
        });
    },

    GenClass: function (msg) {
        sendChat("API", "/roll 1t[Class]", function (result) {
            let content = JSON.parse(result[0].content);
            let values1 = content.rolls[0].results[0].tableItem.name.split(':');
            SCVMBuild.Class = values1[0];
            SCVMBuild.output['Class'] = "<tr><td style='font-weight: bold; padding: 5px;'>Class</td></tr><tr><td style='padding: 5px;'>" + SCVMBuild.Class + "</td></tr>";
            SCVMTextA = "<table font-size: 10px;'> <tbody>" + SCVMBuild.output['Class'] + "</tbody></table>";
            sendChat(msg.who, "/direct " + SCVMTextA);
        });
    },

    GenWeapon: function (msg) {
        sendChat("API", "/roll 1t[Weapon]", function (result) {
            let content = JSON.parse(result[0].content);
            let values2 = content.rolls[0].results[0].tableItem.name.split(':');
            SCVMBuild.Weapon = values2[0];
            SCVMBuild.output['Weapon'] = "<tr><td style='font-weight: bold; padding: 5px;'>Weapon</td></tr><tr><td style='padding: 5px;'>" + SCVMBuild.Weapon + "</td></tr>";
            SCVMTextB = "<table font-size: 10px;'> <tbody>" + SCVMBuild.output['Weapon'] + "</tbody></table>";
            sendChat(msg.who, "/direct " + SCVMTextB);
            repeating_weapons_ROWID_weaponname = SCVMBuild.weaponname;
            repeating_weapons_ROWID_attacktype = SCVMBuild.attacktype;
            repeating_weapons_ROWID_weapondamage = SCVMBuild.weapondamage;
        });
    },

    GenArmor: function (msg) {
        sendChat("API", "/roll 1t[Armor]", function (result) {
            let content = JSON.parse(result[0].content);
            let values3 = content.rolls[0].results[0].tableItem.name.split(':');
            SCVMBuild.Armor = values3[0];
            SCVMBuild.output['Armor'] = "<tr><td style='font-weight: bold; padding: 5px;'>Armor</td></tr><tr><td style='padding: 5px;'>" + SCVMBuild.Armor + "</td></tr>";
            SCVMTextC = "<table font-size: 10px;'> <tbody>" + SCVMBuild.output['Armor'] + "</tbody></table>";
            sendChat(msg.who, "/direct " + SCVMTextC);
        });
    },

    GenEquipment: function (msg) {
        sendChat("API", "/roll 1t[Equipment1]", function (result) {
            let content = JSON.parse(result[0].content);
            let values4 = content.rolls[0].results[0].tableItem.name.split(':');
            SCVMBuild.Equipment1 = values4[0];
            SCVMBuild.output['Equipment1'] = "<tr><td style='font-weight: bold; padding: 5px;'>Equipment1</td></tr><tr><td style='padding: 5px;'>" + SCVMBuild.Equipment1 + "</td></tr>";
            SCVMTextD1 = "<table font-size: 10px;'> <tbody>" + SCVMBuild.output['Equipment1'] + "</tbody></table>";
            sendChat(msg.who, "/direct " + SCVMTextD1);
        });
        sendChat("API", "/roll 1t[Equipment2]", function (result) {
            let content = JSON.parse(result[0].content);
            let values5 = content.rolls[0].results[0].tableItem.name.split(':');
            SCVMBuild.Equipment2 = values5[0];
            SCVMBuild.output['Equipment2'] = "<tr><td style='font-weight: bold; padding: 5px;'>Equipment2</td></tr><tr><td style='padding: 5px;'>" + SCVMBuild.Equipment2 + "</td></tr>";
            SCVMTextD2 = "<table font-size: 10px;'> <tbody>" + SCVMBuild.output['Equipment2'] + "</tbody></table>";
            sendChat(msg.who, "/direct " + SCVMTextD2);
        });
        sendChat("API", "/roll 1t[Equipment3]", function (result) {
            let content = JSON.parse(result[0].content);
            let values6 = content.rolls[0].results[0].tableItem.name.split(':');
            SCVMBuild.Equipment3 = values6[0];
            SCVMBuild.output['Equipment3'] = "<tr><td style='font-weight: bold; padding: 5px;'>Equipment3</td></tr><tr><td style='padding: 5px;'>" + SCVMBuild.Equipment3 + "</td></tr>";
            SCVMTextD3 = "<table font-size: 10px;'> <tbody>" + SCVMBuild.output['Equipment3'] + "</tbody></table>";
            sendChat(msg.who, "/direct " + SCVMTextD3);
        });
    },

    GenAbilities: function (msg) {
        SCVMBuild.Agility = randomInteger(7) - 4;
        SCVMBuild.output['Agility'] = "<tr><td style='font-weight: bold; padding: 5px;'>Agility</td></tr><tr><td style='padding: 5px;'>" + SCVMBuild.Agility + "</td></tr>";
        SCVMTextE = "<table font-size: 10px;'> <tbody>" + SCVMBuild.output['Agility'] + "</tbody></table>";
        sendChat(msg.who, "/direct " + SCVMTextE);

        SCVMBuild.Presence = randomInteger(7) - 4;
        SCVMBuild.output['Presence'] = "<tr><td style='font-weight: bold; padding: 5px;'>Presence</td></tr><tr><td style='padding: 5px;'>" + SCVMBuild.Presence + "</td></tr>";
        SCVMTextF = "<table font-size: 10px;'> <tbody>" + SCVMBuild.output['Presence'] + "</tbody></table>";
        sendChat(msg.who, "/direct " + SCVMTextF);

        SCVMBuild.Strength = randomInteger(7) - 4;
        SCVMBuild.output['Strength'] = "<tr><td style='font-weight: bold; padding: 5px;'>Strength</td></tr><tr><td style='padding: 5px;'>" + SCVMBuild.Strength + "</td></tr>";
        SCVMTextG = "<table font-size: 10px;'> <tbody>" + SCVMBuild.output['Strength'] + "</tbody></table>";
        sendChat(msg.who, "/direct " + SCVMTextG);

        SCVMBuild.Toughness = randomInteger(7) - 4;
        SCVMBuild.output['Toughness'] = "<tr><td style='font-weight: bold; padding: 5px;'>Toughness</td></tr><tr><td style='padding: 5px;'>" + SCVMBuild.Toughness + "</td></tr>";
        SCVMTextH = "<table font-size: 10px;'> <tbody>" + SCVMBuild.output['Toughness'] + "</tbody></table>";
        sendChat(msg.who, "/direct " + SCVMTextH);

    },

    GenHP: function (msg) {
        SCVMBuild.HP = SCVMBuild.Toughness + randomInteger(8);
        if (SCVMBuild.HP < 1) {
            SCVMBuild.HP = "1";
        }
        SCVMBuild.output['HP'] = "<tr><td style='font-weight: bold; padding: 5px;'>HP</td></tr><tr><td style='padding: 5px;'>" + SCVMBuild.HP + "</td></tr>";
        SCVMTextI = "<table font-size: 10px;'> <tbody>" + SCVMBuild.output['HP'] + "</tbody></table>";
        sendChat(msg.who, "/direct " + SCVMTextI);
    },

    GenPower: function (msg) {
        sendChat("API", "/roll 1t[Power]", function (result) {
            let content = JSON.parse(result[0].content);
            let valuesB = content.rolls[0].results[0].tableItem.name.split(':');
            SCVMBuild.Power = valuesB[0];
            SCVMBuild.output['Power'] = "<tr><td style='font-weight: bold; padding: 5px;'>Power</td></tr><tr><td style='padding: 5px;'>" + SCVMBuild.Power + "</td></tr>";
            SCVMTextJ = "<table font-size: 10px;'> <tbody>" + SCVMBuild.output['Power'] + "</tbody></table>";
            sendChat(msg.who, "/direct " + SCVMTextJ);
        });
    },

    GenOmen: function (msg) {
        sendChat("API", "/roll 1t[Omens]", function (result) {
            let content = JSON.parse(result[0].content);
            let valuesC = content.rolls[0].results[0].tableItem.name.split(':');
            SCVMBuild.Omen = valuesC[0];
            SCVMBuild.output['Omen'] = "<tr><td style='font-weight: bold; padding: 5px;'>Omen</td></tr><tr><td style='padding: 5px;'>" + SCVMBuild.Omen + "</td></tr>";
            SCVMTextK = "<table font-size: 10px;'> <tbody>" + SCVMBuild.output['Omen'] + "</tbody></table>";
            sendChat(msg.who, "/direct " + SCVMTextK);
        });
    },

    GenTraits: function (msg) {
        sendChat("API", "/roll 1t[Trait]", function (result) {
            let content = JSON.parse(result[0].content);
            let valuesC = content.rolls[0].results[0].tableItem.name.split(':');
            SCVMBuild.Trait1 = valuesC[0];
            SCVMBuild.output['Trait1'] = "<tr><td style='font-weight: bold; padding: 5px;'>Trait1</td></tr><tr><td style='padding: 5px;'>" + SCVMBuild.Trait1 + "</td></tr>";
            SCVMTextL1 = "<table font-size: 10px;'> <tbody>" + SCVMBuild.output['Trait1'] + "</tbody></table>";
            sendChat(msg.who, "/direct " + SCVMTextL1);
        });
        sendChat("API", "/roll 1t[Trait]", function (result) {
            let content = JSON.parse(result[0].content);
            let valuesD = content.rolls[0].results[0].tableItem.name.split(':');
            SCVMBuild.Trait2 = valuesD[0];
            SCVMBuild.output['Trait2'] = "<tr><td style='font-weight: bold; padding: 5px;'>Trait2</td></tr><tr><td style='padding: 5px;'>" + SCVMBuild.Trait2 + "</td></tr>";
            SCVMTextL2 = "<table font-size: 10px;'> <tbody>" + SCVMBuild.output['Trait2'] + "</tbody></table>";
            sendChat(msg.who, "/direct " + SCVMTextL2);
        });
    },

    GenBody: function (msg) {
        sendChat("API", "/roll 1t[Body]", function (result) {
            let content = JSON.parse(result[0].content);
            let valuesE = content.rolls[0].results[0].tableItem.name.split(':');
            SCVMBuild.Body = valuesE[0];
            SCVMBuild.output['Body'] = "<tr><td style='font-weight: bold; padding: 5px;'>Broken Body</td></tr><tr><td style='padding: 5px;'>" + SCVMBuild.Body + "</td></tr>";
            SCVMTextM = "<table font-size: 10px;'> <tbody>" + SCVMBuild.output['Body'] + "</tbody></table>";
            sendChat(msg.who, "/direct " + SCVMTextM);
        });
    },

    GenHabit: function (msg) {
        sendChat("API", "/roll 1t[Habit]", function (result) {
            let content = JSON.parse(result[0].content);
            let valuesF = content.rolls[0].results[0].tableItem.name.split(':');
            SCVMBuild.Habit = valuesF[0];
            SCVMBuild.output['Habit'] = "<tr><td style='font-weight: bold; padding: 5px;'>Bad Habit</td></tr><tr><td style='padding: 5px;'>" + SCVMBuild.Habit + "</td></tr>";
            SCVMTextN = "<table font-size: 10px;'> <tbody>" + SCVMBuild.output['Habit'] + "</tbody></table>";
            sendChat(msg.who, "/direct " + SCVMTextN);
        });
    },

    GenStory: function (msg) {
        sendChat("API", "/roll 1t[Story]", function (result) {
            let content = JSON.parse(result[0].content);
            let valuesG = content.rolls[0].results[0].tableItem.name.split(':');
            SCVMBuild.Story = valuesG[0];
            SCVMBuild.output['Story'] = "<tr><td style='font-weight: bold; padding: 5px;'>Troubling Tale</td></tr><tr><td style='padding: 5px;'>" + SCVMBuild.Story + "</td></tr>";
            SCVMTextO = "<table font-size: 10px;'> <tbody>" + SCVMBuild.output['Story'] + "</tbody></table>";
            sendChat(msg.who, "/direct " + SCVMTextO);
        });
    },

    GenName: function (msg) {
        sendChat("API", "/roll 1t[MaleName]", function (result) {
            let content = JSON.parse(result[0].content);
            let valuesH = content.rolls[0].results[0].tableItem.name.split(':');
            SCVMBuild.Name = valuesH[0];
            SCVMBuild.output['Name'] = "<tr><td style='font-weight: bold; padding: 5px;'>Name</td></tr><tr><td style='padding: 5px;'>" + SCVMBuild.Name + "</td></tr>";
            SCVMTextH = "<table font-size: 10px;'> <tbody>" + SCVMBuild.output['Name'] + "</tbody></table>";
            sendChat(msg.who, "/direct " + SCVMTextH);
        });
    },
    printSheet: function (msg) {
        let styleLabel = "style='font-weight: bold; padding: 5px;'";
        let styleVal = "style='padding: 5px;'";

        SCVMBuild.output['Class'] = "<tr><td style='font-weight: bold; padding: 5px;'>Class</td><td style='padding: 5px;'>" + SCVMBuild.Class + "</td></tr>";
        SCVMBuild.output['Weapon'] = "<tr><td style='font-weight: bold; padding: 5px;'>Weapon</td><td style='padding: 5px;'>" + SCVMBuild.Weapon + "</td></tr>";
        SCVMBuild.output['Armor'] = "<tr><td style='font-weight: bold; padding: 5px;'>Armor</td><td style='padding: 5px;'>" + SCVMBuild.Armor + "</td></tr>";
        SCVMBuild.output['Equipment1'] = "<tr><td style='font-weight: bold; padding: 5px;'>Equipment1</td><td style='padding: 5px;'>" + SCVMBuild.Equipment1 + "</td></tr>";
        SCVMBuild.output['Equipment2'] = "<tr><td style='font-weight: bold; padding: 5px;'>Equipment2</td><td style='padding: 5px;'>" + SCVMBuild.Equipment2 + "</td></tr>";
        SCVMBuild.output['Equipment3'] = "<tr><td style='font-weight: bold; padding: 5px;'>Equipment3</td><td style='padding: 5px;'>" + SCVMBuild.Equipment3 + "</td></tr>";
        SCVMBuild.output['Agility'] = "<tr><td style='font-weight: bold; padding: 5px;'>Agility</td><td style='padding: 5px;'>" + SCVMBuild.Agility + "</td></tr>";
        SCVMBuild.output['Presence'] = "<tr><td style='font-weight: bold; padding: 5px;'>Presence</td><td style='padding: 5px;'>" + SCVMBuild.Presence + "</td></tr>";
        SCVMBuild.output['Strength'] = "<tr><td style='font-weight: bold; padding: 5px;'>Strength</td><td style='padding: 5px;'>" + SCVMBuild.Strength + "</td></tr>";
        SCVMBuild.output['Toughness'] = "<tr><td style='font-weight: bold; padding: 5px;'>Toughness</td><td style='padding: 5px;'>" + SCVMBuild.Toughness + "</td></tr>";
        SCVMBuild.output['HP'] = "<tr><td style='font-weight: bold; padding: 5px;'>HP</td><td style='padding: 5px;'>" + SCVMBuild.HP + "</td></tr>";
        SCVMBuild.output['Power'] = "<tr><td style='font-weight: bold; padding: 5px;'>Power</td><td style='padding: 5px;'>" + SCVMBuild.Power + "</td></tr>";
        SCVMBuild.output['Omen'] = "<tr><td style='font-weight: bold; padding: 5px;'>Omen</td><td style='padding: 5px;'>" + SCVMBuild.Omen + "</td></tr>";
        SCVMBuild.output['Trait1'] = "<tr><td style='font-weight: bold; padding: 5px;'>Trait1</td><td style='padding: 5px;'>" + SCVMBuild.Trait1 + "</td></tr>";
        SCVMBuild.output['Trait2'] = "<tr><td style='font-weight: bold; padding: 5px;'>Trait2</td><td style='padding: 5px;'>" + SCVMBuild.Trait2 + "</td></tr>";
        SCVMBuild.output['Body'] = "<tr><td style='font-weight: bold; padding: 5px;'>Broken Body</td><td style='padding: 5px;'>" + SCVMBuild.Body + "</td></tr>";
        SCVMBuild.output['Habit'] = "<tr><td style='font-weight: bold; padding: 5px;'>Bad Habit</td><td style='padding: 5px;'>" + SCVMBuild.Habit + "</td></tr>";
        SCVMBuild.output['Story'] = "<tr><td style='font-weight: bold; padding: 5px;'>Troubling Tale</td><td style='padding: 5px;'>" + SCVMBuild.Story + "</td></tr>";
        SCVMBuild.output['Name'] = "<tr><td style='font-weight: bold; padding: 5px;'>Name</td><td style='padding: 5px;'>" + SCVMBuild.Name + "</td></tr>";

        SCVMText1 = "<table font-size: 10px;'> <tbody>" +
            SCVMBuild.output['Class`'] +
            SCVMBuild.output['Weapon'] +
            SCVMBuild.output['Armor'] +
            SCVMBuild.output['Equipment1'] +
            SCVMBuild.output['Equipment2'] +
            SCVMBuild.output['Equipment3'] +
            SCVMBuild.output['Strength'] +
            SCVMBuild.output['Agility'] +
            SCVMBuild.output['Presence'] +
            SCVMBuild.output['Toughness'] +
            SCVMBuild.output['HP'] +
            SCVMBuild.output['Power'] +
            SCVMBuild.output['Omen'] +
            SCVMBuild.output['Trait1'] +
            SCVMBuild.output['Trait2'] +
            SCVMBuild.output['Body'] +
            SCVMBuild.output['Habit'] +
            SCVMBuild.output['Story'] +
            SCVMBuild.output['Name'] + "</tbody></table>";

        SCVMText = SCVMText1 + "<p><p>";
        sendChat(msg.who, "/direct " + SCVMText);

        SCVMBuild.Description = SCVMBuild.Trait1 + "\n" + SCVMBuild.Trait2 + "\n" + SCVMBuild.Body + "\n" + SCVMBuild.Habit + "\n" + SCVMBuild.Story;

        if (typeof saveCallback === "function") {
            saveCallback();
        }
    },

    save: function (msg, saveCallback) {
        sendChat(msg.who, "/direct saving character");
        let handout = createObj('handout', {
            name: SCVMBuild.Name + ' Instructions',
            inplayerjournals: "all",
            archived: false
        });
        let character = createObj("character", {
            name: SCVMBuild.Name,
            archived: false,
            inplayerjournals: "all",
            controlledby: "all"
        });

        handout.set('notes', SCVMText);
        sendChat('', 'Created instructions for completing <a href="http://journal.roll20.net/handout/' + handout.id + '" style="color:blue;text-decoration:underline;">SCVMBUILDER ' + SCVMBuild.Name + '</a>');

        createObj('attribute', {
            name: 'class',
            current: SCVMBuild.Class,
            _characterid: character.id
        });
        // createObj('attribute', {
        // name: 'weapon',
        // current: SCVMBuild.Weapon,
        // _characterid: character.id
        // });
        createObj('attribute', {
            name: 'armor',
            current: SCVMBuild.Armor,
            _characterid: character.id
        });
        createObj('attribute', {
            name: 'strength',
            current: SCVMBuild.Strength,
            _characterid: character.id
        });
        createObj('attribute', {
            name: 'agility',
            current: SCVMBuild.Agility,
            _characterid: character.id
        });
        createObj('attribute', {
            name: 'presence',
            current: SCVMBuild.Presence,
            _characterid: character.id
        });
        createObj('attribute', {
            name: 'toughness',
            current: SCVMBuild.Toughness,
            _characterid: character.id
        });
        createObj('attribute', {
            name: 'hp_curr',
            current: SCVMBuild.HP,
            _characterid: character.id
        });
        createObj('attribute', {
            name: 'hp',
            current: SCVMBuild.HP,
            _characterid: character.id
        });
        createObj('attribute', {
            name: 'power',
            current: SCVMBuild.Power,
            _characterid: character.id
        });
        createObj('attribute', {
            name: 'omen',
            current: SCVMBuild.Omen,
            _characterid: character.id
        });
        createObj('attribute', {
            name: 'description',
            current: SCVMBuild.Description,
            _characterid: character.id
        });
        createObj('attribute', {
            name: 'char_name',
            current: SCVMBuild.Name,
            _characterid: character.id
        });
        sendChat('', 'Created <a href="http://journal.roll20.net/character/' + character.id + '" style="color:blue;text-decoration:underline;">SCVM ' + SCVMBuild.Name + '</a>');
    }};

    let generateUUID = (function () {

        let a = 0,
        b = [];
        return function () {
            let c = (new Date()).getTime() + 0,
            d = c === a;
            a = c;
            for (let e = new Array(8), f = 7; 0 <= f; f--) {
                e[f] = "-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz".charAt(c % 64);
                c = Math.floor(c / 64);
            }
            c = e.join("");
            if (d) {
                for (f = 11; 0 <= f && 63 === b[f]; f--) {
                    b[f] = 0;
                }
                b[f]++;
            } else {
                for (f = 0; 12 > f; f++) {
                    b[f] = Math.floor(64 * Math.random());
                }
            }
            for (f = 0; 12 > f; f++) {
                c += "-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz".charAt(b[f]);
            }
            return c;
        };
    });
};
on("ready", function () {
    SCVMBuild.listen();
});




December 22 (2 years ago)
The Aaron
Roll20 Production Team
API Scripter

This:

const SCVMBuild = SCVMBuild || {

Should be:

const SCVMBuild = {


This:

    }};

    let generateUUID = (function () {

should be:

    },

    generateUUID: (function () {