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

TypeError: Cannot read properties of undefined (reading 'who')

September 24 (1 year ago)
Joab
Pro

I am reusing code I have used multiple times, but this time I am getting

TypeError: Cannot read properties of undefined (reading 'who')

I don't know what's different between this script and the others I have created.

/**
 * 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 <h6>Generating character</h6>");
                    RPG.Generate(msg, RPG.printSheet, RPG.save);
                }
            } else if (msg.content.indexOf("!RPGen") != -1) {
                RPG.showHelp();
            }
        });
    },

    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) {
        RPG.id = msg.playerid;
        RPG.player = msg.who;
        RPG.name = msg.who + " #" + (findObjs({_type: "character", controlledby: msg.playerid}).length + 1)
        RPG.GenAbilities();
        RPG.GenHistory();
        RPG.GenSuit();
        RPG.GenSkills();
        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'] = "<tr><td style='font-weight: bold; padding: 5px;'>Strength</td></tr><tr><td style='padding: 5px;'>" + RPG.Strength + "</td></tr>";
            RPG.output['Speed'] = "<tr><td style='font-weight: bold; padding: 5px;'>Speed</td></tr><tr><td style='padding: 5px;'>" + RPG.Speed + "</td></tr>";
            RPG.output['Intellect'] = "<tr><td style='font-weight: bold; padding: 5px;'>Intellect</td></tr><tr><td style='padding: 5px;'>" + RPG.Intellect + "</td></tr>";
            RPG.output['Combat'] = "<tr><td style='font-weight: bold; padding: 5px;'>Combat</td></tr><tr><td style='padding: 5px;'>" + RPG.Combat + "</td></tr>";
            RPG.output['Health'] = "<tr><td style='font-weight: bold; padding: 5px;'>Health</td></tr><tr><td style='padding: 5px;'>" + RPG.Health + "</td></tr>";
            RPG.output['Stress'] = "<tr><td style='font-weight: bold; padding: 5px;'>Stress</td></tr><tr><td style='padding: 5px;'>" + RPG.Stress + "</td></tr>";
            RPG.output['Sanity'] = "<tr><td style='font-weight: bold; padding: 5px;'>Sanity Save</td></tr><tr><td style='padding: 5px;'>" + RPG.Sanity + "</td></tr>";
            RPG.output['Fear'] = "<tr><td style='font-weight: bold; padding: 5px;'>Fear Save</td></tr><tr><td style='padding: 5px;'>" + RPG.Fear + "</td></tr>";
            RPG.output['Body'] = "<tr><td style='font-weight: bold; padding: 5px;'>Body Save</td></tr><tr><td style='padding: 5px;'>" + RPG.Body + "</td></tr>";
            RPG.output['Armor'] = "<tr><td style='font-weight: bold; padding: 5px;'>Armor Save</td></tr><tr><td style='padding: 5px;'>" + RPG.Armor + "</td></tr>";
            RPGText1 = "<table font-size: 10px;'> <tbody>" + RPG.output['Strength'] + "</tbody></table>";
            RPGText2 = "<table font-size: 10px;'> <tbody>" + RPG.output['Speed'] + "</tbody></table>";
            RPGText3 = "<table font-size: 10px;'> <tbody>" + RPG.output['Intellect'] + "</tbody></table>";
            RPGText4 = "<table font-size: 10px;'> <tbody>" + RPG.output['Combat'] + "</tbody></table>";
            RPGText5 = "<table font-size: 10px;'> <tbody>" + RPG.output['Health'] + "</tbody></table>";
            RPGText6 = "<table font-size: 10px;'> <tbody>" + RPG.output['Stress'] + "</tbody></table>";
            RPGText7 = "<table font-size: 10px;'> <tbody>" + RPG.output['Sanity'] + "</tbody></table>";
            RPGText8 = "<table font-size: 10px;'> <tbody>" + RPG.output['Fear'] + "</tbody></table>";
            RPGText9 = "<table font-size: 10px;'> <tbody>" + RPG.output['Body'] + "</tbody></table>";
            RPGText10 = "<table font-size: 10px;'> <tbody>" + RPG.output['Armor'] + "</tbody></table>";
            sendChat(msg.who, sendto + RPGText1 + RPGText2 + RPGText3 + RPGText4 + RPGText5 + RPGText6 + RPGText7 + RPGText8 + RPGText9 + RPGText10);
        });
    },

    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'] = "<tr><td style='font-weight: bold; padding: 5px;'>Study</td></tr><tr><td style='padding: 5px;'>" + RPG.Study + "</td></tr>";
            RPG.output['Effect'] = "<tr><td style='font-weight: bold; padding: 5px;'>Side Effect</td></tr><tr><td style='padding: 5px;'>" + RPG.Effect + "</td></tr>";
            RPGText11 = "<table font-size: 10px;'> <tbody>" + RPG.output['Study'] + "</tbody></table>";
            RPGText12 = "<table font-size: 10px;'> <tbody>" + RPG.output['Effect'] + "</tbody></table>";
            sendChat(msg.who, sendto + RPGText11);
            sendChat(msg.who, sendto + RPGText12);
        });
    },

    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'] = "<tr><td style='font-weight: bold; padding: 5px;'>Doll Suit Expression</td></tr><tr><td style='padding: 5px;'>" + RPG.Expression + "</td></tr>";
            RPGText13 = "<table font-size: 10px;'> <tbody>" + RPG.output['Expression'] + "</tbody></table>";
            sendChat("API", "/roll 1t[RP-Quirk]", function (result) {
                let content = JSON.parse(result[0].content);
                let values = content.rolls[0].results[0].tableItem.name.split(':');
                RPG.Quirk = values[0];
                RPG.output['Quirk'] = "<tr><td style='font-weight: bold; padding: 5px;'>Doll Suit Quirk</td></tr><tr><td style='padding: 5px;'>" + RPG.Quirk + "</td></tr>";
                RPGText14 = "<table font-size: 10px;'> <tbody>" + RPG.output['Quirk'] + "</tbody></table>";
                sendChat(msg.who, sendto + RPGText13);
                sendChat(msg.who, sendto + RPGText14);
            });
        });
    },
    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'] = "<tr><td style='font-weight: bold; padding: 5px;'>Skill</td></tr><tr><td style='padding: 5px;'>" + RPG.Skill + "</td></tr>";
            RPGText15 = "<table font-size: 10px;'> <tbody>" + RPG.output['Skill'] + "</tbody></table>";
            sendChat(msg.who, sendto + RPGText15);
        });
    },

    printSheet: function (msg, saveCallback) {
        let styleLabel = "style='font-weight: bold; padding: 5px;'";
        let styleVal = "style='padding: 5px;'";

        RPG.output['Instructions'] = "<tr><td style='font-weight: bold; padding: 5px;'>Instructions</td><td style='padding: 5px;'>Follow these instructions to complete the character according to the options selected." + "</td></tr>";
        RPG.output['Strength'] = "<tr><td style='font-weight: bold; padding: 5px;'>Strength</td><td style='padding: 5px;'>" + RPG.Strength + "</td></tr>";
        RPG.output['Speed'] = "<tr><td style='font-weight: bold; padding: 5px;'>Speed</td><td style='padding: 5px;'>" + RPG.Speed + "</td></tr>";
        RPG.output['Intellect'] = "<tr><td style='font-weight: bold; padding: 5px;'>Intellect</td><td style='padding: 5px;'>" + RPG.Intellect + "</td></tr>";
        RPG.output['Combat'] = "<tr><td style='font-weight: bold; padding: 5px;'>Combat</td><td style='padding: 5px;'>" + RPG.Combat + "</td></tr>";
        RPG.output['Health'] = "<tr><td style='font-weight: bold; padding: 5px;'>Health</td><td style='padding: 5px;'>" + RPG.Health + "</td></tr>";
        RPG.output['Stress'] = "<tr><td style='font-weight: bold; padding: 5px;'>Stress</td><td style='padding: 5px;'>" + RPG.Stress + "</td></tr>";
        RPG.output['Sanity'] = "<tr><td style='font-weight: bold; padding: 5px;'>Sanity Save</td><td style='padding: 5px;'>" + RPG.Sanity + "</td></tr>";
        RPG.output['Fear'] = "<tr><td style='font-weight: bold; padding: 5px;'>Fear Save</td><td style='padding: 5px;'>" + RPG.Fear + "</td></tr>";
        RPG.output['Body'] = "<tr><td style='font-weight: bold; padding: 5px;'>Body Save</td><td style='padding: 5px;'>" + RPG.Body + "</td></tr>";
        RPG.output['Armor'] = "<tr><td style='font-weight: bold; padding: 5px;'>Armor Save</td><td style='padding: 5px;'>" + RPG.Armor + "</td></tr>";
        RPG.output['Study'] = "<tr><td style='font-weight: bold; padding: 5px;'>Study</td><td style='padding: 5px;'>" + RPG.Study + "</td></tr>";
        RPG.output['Effect'] = "<tr><td style='font-weight: bold; padding: 5px;'>Side Effect</td><td style='padding: 5px;'>" + RPG.Effect + "</td></tr>";
        RPG.output['Quirk'] = "<tr><td style='font-weight: bold; padding: 5px;'>Doll Suit Quirk</td><td style='padding: 5px;'>" + RPG.Quirk + "</td></tr>";
        RPG.output['Skill'] = "<tr><td style='font-weight: bold; padding: 5px;'>Skill</td><td style='padding: 5px;'>" + RPG.Skill + "</td></tr>";
        RPG.output['Expression'] = "<tr><td style='font-weight: bold; padding: 5px;'>Doll Suit Expression</td><td style='padding: 5px;'>" + RPG.Expression + "</td></tr>";
        "function" === typeof saveCallback && saveCallback();

        RPGText1 = "<table font-size: 10px;'> <tbody>" +
            RPG.output['Study'] +
            RPG.output['Effect'] +
            RPG.output['Quirk'] +
            RPG.output['Expression'] +
            RPG.output['Skill'] + "</tbody></table>";

        RPGText = RPGText1 + "<p><p>";

        sendChat(msg.who, "/direct " + RPGText);

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

    save: function (msg) {
        let character = createObj("character", {
            name: RPG.name,
            archived: false,
            inplayerjournals: "all",
            controlledby: "all"
        });
        character.set('bio', RPGText);
        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
        });
        createObj('attribute', {
            name: 'omen',
            current: RPG.Omen,
            _characterid: character.id
        });
        createObj('attribute', {
            name: 'trait1',
            current: RPG.Trait1,
            _characterid: character.id
        });
        createObj('attribute', {
            name: 'trait2',
            current: RPG.Trait2,
            _characterid: character.id
        });
        createObj('attribute', {
            name: 'body',
            current: RPG.Body,
            _characterid: character.id
        });
        createObj('attribute', {
            name: 'habit',
            current: RPG.Habit,
            _characterid: character.id
        });
        createObj('attribute', {
            name: 'story',
            current: RPG.Story,
            _characterid: character.id
        });
        sendChat('', 'Created instructions for completing <a href="http:journal.roll20.net/handout/' + handout.id + '" style="color:blue;text-decoration:underline;">RPG ' + RPG.name + '</a>');
    }
};

on("ready", function () {
    RPG.listen();
});
The game uses the official Mothership by Tuesday Knight Games character sheet.
September 24 (1 year ago)
The Aaron
Roll20 Production Team
API Scripter

In the function Generate(), you call GenAbilities(), GenHistory(), GenSuit(), GenSkills(), each of which takes msg as a parameter, but you aren't passing it to them.  In the functions themselves then, msg comes in as undefined, and so you get a defererence of the property who on undefined when it tries to sendChat() with it.

September 24 (1 year ago)
Joab
Pro

I fixed the msg call, but nothing happens after the printsheet function.

/**
 * Generates DarkShip Characters
 *
 * Syntax: !DSGen option
 *
 */

var DSBUILD = DSBUILD || {
    version: "0.0.4",
    output: [],

    listen: function () {
        on('chat:message', function (msg) {
            // Exit if not an api command
            if (msg.type != "api") {
                return;
            }
            if (msg.content.indexOf("!DSGen ") != -1) {
                var input = msg.content.split(" ");
                if (input[1] == "help") {
                    DSBUILD.showHelp();
                } else {
                    sendChat('API', "/direct <h6>Generating character</h6>");
                    DSBUILD.Generate(msg, DSBUILD.printSheet, DSBUILD.save);
                }
            } else if (msg.content.indexOf("!DSGen") != -1) {
                DSBUILD.showHelp();
            }
        });
    },

    showHelp: function () {
        sendChat("API", "/w gm <table style='background: #DCD9D5; border-radius: 20px; font-size: 10px;'>" +
            "<thead><tr><th>Help</th></tr></thead>" +
            "<tbody>" +
            "<tr><td><strong>!DSBUILD</strong><br><strong>!fodder help</strong><br>Show this help screen.</td></tr>" +
            "<tr><td><strong>!DSBUILD core</strong><br>Runs the script.</td></tr>" +
            "<tr><td> </td></tr>" +
            "</td></tr></tbody></table>");
    },

    Generate: function (msg, outputCallback, saveCallback) {
        DSBUILD.id = msg.playerid;
        DSBUILD.player = msg.who;
        DSBUILD.name = msg.who + " #" + (findObjs({
                    _type: "character",
                    controlledby: msg.playerid
                }).length + 1)
        DSBUILD.NPCClass(msg);
        DSBUILD.NPCSkills(msg);
        DSBUILD.NPCLoadout(msg);
        if (typeof outputCallback === "function") {
            setTimeout(outputCallback, 2500, msg, saveCallback);
        }
    },

    NPCClass: function (msg) {
        DSBUILD.id = msg.playerid;
        DSBUILD.name = msg.who + " #" + (findObjs({
                    _type: "character",
                    controlledby: "all"
                }).length + 1);
        DSBUILD.player = msg.who;
        sendChat("API", "/roll 1t[DS-Skills]", function (result) {
            let content = JSON.parse(result[0].content);
            let values = content.rolls[0].results[0].tableItem.name.split(':');
            DSBUILD.Class = values[0];
            DSBUILD.Skill1 = content.rolls[0].results[0].tableItem.name;
            DSBUILD.output['Class'] = "<tr><td style='font-weight: bold; padding: 5px;'>Class</td></tr><tr><td style='padding: 5px;'>" + DSBUILD.Class + "</td></tr>";
            DSText1 = "<table font-size: 10px;'> <tbody>" + DSBUILD.output['Class'] + "</tbody></table>";
            sendChat(msg.who, "/w gm " + DSText1);
        });

    },

    NPCSkills: function (msg) {
        sendChat("API", "/roll 1t[DS-Skills]", function (result) {
            let content = JSON.parse(result[0].content);
            let values = content.rolls[0].results[0].tableItem.name.split(':');
            DSBUILD.Class1 = values[0];
            DSBUILD.Skill1 = values[1];
            DSBUILD.output['Skill1'] = "<tr><td style='font-weight: bold; padding: 5px;'>Skill1</td></tr><tr><td style='padding: 5px;'>" + DSBUILD.Skill1 + "</td></tr>";
            DSText3 = "<table font-size: 10px;'> <tbody>" + DSBUILD.output['Skill1'] + "</tbody></table>";
            sendChat(msg.who, "/w gm " + DSText3);
        });

        sendChat("API", "/roll 1t[DS-Skills]", function (result) {
            let content = JSON.parse(result[0].content);
            let values = content.rolls[0].results[0].tableItem.name.split(':');
            DSBUILD.trash = values[0];
            DSBUILD.Skill2 = values[1];
            DSBUILD.output['Skill2'] = "<tr><td style='font-weight: bold; padding: 5px;'>Skill2</td></tr><tr><td style='padding: 5px;'>" + DSBUILD.Skill2 + "</td></tr>";
            DSText4 = "<table font-size: 10px;'> <tbody>" + DSBUILD.output['Skill2'] + "</tbody></table>";
            sendChat(msg.who, "/w gm " + DSText4);
        });
        sendChat("API", "/roll 1t[DS-Skills]", function (result) {
            let content = JSON.parse(result[0].content);
            let values = content.rolls[0].results[0].tableItem.name.split(':');
            DSBUILD.trash = values[0];
            DSBUILD.Skill3 = values[1];
            DSBUILD.output['Skill3'] = "<tr><td style='font-weight: bold; padding: 5px;'>Skill3</td></tr><tr><td style='padding: 5px;'>" + DSBUILD.Skill3 + "</td></tr>";
            DSText5 = "<table font-size: 10px;'> <tbody>" + DSBUILD.output['Skill3'] + "</tbody></table>";
            sendChat(msg.who, "/w gm " + DSText5);
        });
        sendChat("API", "/roll 1t[DS-Skills]", function (result) {
            let content = JSON.parse(result[0].content);
            let values = content.rolls[0].results[0].tableItem.name.split(':');
            DSBUILD.trash = values[0];
            DSBUILD.Skill4 = values[1];
            DSBUILD.output['Skill4'] = "<tr><td style='font-weight: bold; padding: 5px;'>Skill4</td></tr><tr><td style='padding: 5px;'>" + DSBUILD.Skill4 + "</td></tr>";
            DSText6 = "<table font-size: 10px;'> <tbody>" + DSBUILD.output['Skill4'] + "</tbody></table>";
            sendChat(msg.who, "/w gm " + DSText6);
        });
    },

    NPCLoadout: function (msg) {
        sendChat("API", "/roll 1t[DS-Loadout]", function (result) {
            let content = JSON.parse(result[0].content);
            let values = content.rolls[0].results[0].tableItem.name.split('-');
            DSBUILD.Loadout = values[0];
            DSBUILD.output['Loadout'] = "<tr><td style='font-weight: bold; padding: 5px;'>Personality</td></tr><tr><td style='padding: 5px;'>" + DSBUILD.Loadout + "</td></tr>";
            DSText7 = "<table font-size: 10px;'> <tbody>" + DSBUILD.output['Loadout'] + "</tbody></table>";
            sendChat(msg.who, "/w gm " + DSText7);
        });

    },

    printSheet: function (msg) {
        let styleLabel = "style='font-weight: bold; padding: 5px;'";
        let styleVal = "style='padding: 5px;'";

        DSBUILD.output['Instructions'] = "<tr><td style='font-weight: bold; padding: 5px;'>Instructions</td></tr><tr><td style='padding: 5px;'>Follow these instructions to complete the character according to the options selected.</td></tr>";

        DSText = "<p><p>CURRENT CHARACTER PARAMETERS<p><p>" +
            "<table font-size: 10px;'> <tbody>" +
            DSBUILD.output['Class'] +
            DSBUILD.output['Skill1'] +
            DSBUILD.output['Skill2'] +
            DSBUILD.output['Skill3'] +
            DSBUILD.output['Skill4'] +
            DSBUILD.output['Loadout'] + "</tbody></table>";

        sendChat(msg.who, "/w gm <p><p>" + DSText + "<p><p>");

    },

    save: function (msg) {
        sendChat(msg.who, "/w gm saving character");
        let character = createObj("character", {
            name: DSBUILD.name,
            archived: false,
            inplayerjournals: "all",
            controlledby: "all"
        });
        createObj('attribute', {
            name: 'character_player_name',
            current: DSBUILD.player,
            _characterid: character.id
        });
        createObj('attribute', {
            name: 'character_class',
            current: DSBUILD.Class,
            _characterid: character.id
        });
        switch (DSBUILD.Skill1) {
            // Teamster
        case 'Scavenging':
            createObj('attribute', {
                name: 'character_Scavenging',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Melee Combat':
            createObj('attribute', {
                name: 'character_Melee',
                current: 'on',
                _characterid: character.id
            });
        case 'Vehicular Driving':
            createObj('attribute', {
                name: 'character_Driving',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Heavy Machinery':
            createObj('attribute', {
                name: 'character_Heavy',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Rinwise':
            createObj('attribute', {
                name: 'character_Rinwise',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Zero-G':
            createObj('attribute', {
                name: 'character_Zero-G',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Mechanical Repair':
            createObj('attribute', {
                name: 'character_Mechanical',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Engineering':
            createObj('attribute', {
                name: 'character_Engineering',
                current: 'on',
                _characterid: character.id
            });
            // Marine
		break;
        case 'Athletics':
            createObj('attribute', {
                name: 'character_Athletics',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Firearms':
            createObj('attribute', {
                name: 'character_Firearms',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Piloting Ships':
            createObj('attribute', {
                name: 'character_Piloting',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Gunnery':
            createObj('attribute', {
                name: 'character_Gunnery',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Field Tactics':
            createObj('attribute', {
                name: 'character_Field',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Command':
            createObj('attribute', {
                name: 'character_Command',
                current: 'on',
                _characterid: character.id
            });
        case 'Infiltration':
            createObj('attribute', {
                name: 'character_Infiltration',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Explosives':
            createObj('attribute', {
                name: 'character_Explosives',
                current: 'on',
                _characterid: character.id
            });
            // Scientist
		break;
        case 'Medicine':
            createObj('attribute', {
                name: 'character_Medicine',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Psychology':
            createObj('attribute', {
                name: 'character_Psychology',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Theology':
            createObj('attribute', {
                name: 'character_Theology',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Archaeology':
            createObj('attribute', {
                name: 'character_Archaeology',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Geology':
            createObj('attribute', {
                name: 'character_Geology',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Astronomy':
            createObj('attribute', {
                name: 'character_Astronomy',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Chemistry':
            createObj('attribute', {
                name: 'character_Chemistry',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Biology':
            createObj('attribute', {
                name: 'character_Biology',
                current: 'on',
                _characterid: character.id
            });
            // Android
		break;
        case 'Linguistics':
            createObj('attribute', {
                name: 'character_Linguistics',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Sophontology':
            createObj('attribute', {
                name: 'character_Sophontology',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Informatics':
            createObj('attribute', {
                name: 'character_Informatics',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Cybernetics':
            createObj('attribute', {
                name: 'character_Cybernetics',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Sensors':
            createObj('attribute', {
                name: 'character_Sensors',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Astrogation':
            createObj('attribute', {
                name: 'character_Astrogation',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Hyperspace':
            createObj('attribute', {
                name: 'character_Hyperspace',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Cryogenics':
            createObj('attribute', {
                name: 'character_Cryogenics',
                current: 'on',
                _characterid: character.id
            });
        default:
            return;
        }
        switch (DSBUILD.Skill2) {
            // Teamster
        case 'Scavenging':
            createObj('attribute', {
                name: 'character_Scavenging',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Melee Combat':
            createObj('attribute', {
                name: 'character_Melee',
                current: 'on',
                _characterid: character.id
            });
        case 'Vehicular Driving':
            createObj('attribute', {
                name: 'character_Driving',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Heavy Machinery':
            createObj('attribute', {
                name: 'character_Heavy',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Rinwise':
            createObj('attribute', {
                name: 'character_Rinwise',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Zero-G':
            createObj('attribute', {
                name: 'character_Zero-G',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Mechanical Repair':
            createObj('attribute', {
                name: 'character_Mechanical',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Engineering':
            createObj('attribute', {
                name: 'character_Engineering',
                current: 'on',
                _characterid: character.id
            });
            // Marine
		break;
        case 'Athletics':
            createObj('attribute', {
                name: 'character_Athletics',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Firearms':
            createObj('attribute', {
                name: 'character_Firearms',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Piloting Ships':
            createObj('attribute', {
                name: 'character_Piloting',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Gunnery':
            createObj('attribute', {
                name: 'character_Gunnery',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Field Tactics':
            createObj('attribute', {
                name: 'character_Field',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Command':
            createObj('attribute', {
                name: 'character_Command',
                current: 'on',
                _characterid: character.id
            });
        case 'Infiltration':
            createObj('attribute', {
                name: 'character_Infiltration',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Explosives':
            createObj('attribute', {
                name: 'character_Explosives',
                current: 'on',
                _characterid: character.id
            });
            // Scientist
		break;
        case 'Medicine':
            createObj('attribute', {
                name: 'character_Medicine',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Psychology':
            createObj('attribute', {
                name: 'character_Psychology',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Theology':
            createObj('attribute', {
                name: 'character_Theology',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Archaeology':
            createObj('attribute', {
                name: 'character_Archaeology',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Geology':
            createObj('attribute', {
                name: 'character_Geology',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Astronomy':
            createObj('attribute', {
                name: 'character_Astronomy',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Chemistry':
            createObj('attribute', {
                name: 'character_Chemistry',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Biology':
            createObj('attribute', {
                name: 'character_Biology',
                current: 'on',
                _characterid: character.id
            });
            // Android
		break;
        case 'Linguistics':
            createObj('attribute', {
                name: 'character_Linguistics',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Sophontology':
            createObj('attribute', {
                name: 'character_Sophontology',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Informatics':
            createObj('attribute', {
                name: 'character_Informatics',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Cybernetics':
            createObj('attribute', {
                name: 'character_Cybernetics',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Sensors':
            createObj('attribute', {
                name: 'character_Sensors',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Astrogation':
            createObj('attribute', {
                name: 'character_Astrogation',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Hyperspace':
            createObj('attribute', {
                name: 'character_Hyperspace',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Cryogenics':
            createObj('attribute', {
                name: 'character_Cryogenics',
                current: 'on',
                _characterid: character.id
            });
        default:
            return;
        }
        switch (DSBUILD.Skill3) {
            // Teamster
        case 'Scavenging':
            createObj('attribute', {
                name: 'character_Scavenging',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Melee Combat':
            createObj('attribute', {
                name: 'character_Melee',
                current: 'on',
                _characterid: character.id
            });
        case 'Vehicular Driving':
            createObj('attribute', {
                name: 'character_Driving',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Heavy Machinery':
            createObj('attribute', {
                name: 'character_Heavy',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Rinwise':
            createObj('attribute', {
                name: 'character_Rinwise',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Zero-G':
            createObj('attribute', {
                name: 'character_Zero-G',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Mechanical Repair':
            createObj('attribute', {
                name: 'character_Mechanical',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Engineering':
            createObj('attribute', {
                name: 'character_Engineering',
                current: 'on',
                _characterid: character.id
            });
            // Marine
		break;
        case 'Athletics':
            createObj('attribute', {
                name: 'character_Athletics',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Firearms':
            createObj('attribute', {
                name: 'character_Firearms',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Piloting Ships':
            createObj('attribute', {
                name: 'character_Piloting',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Gunnery':
            createObj('attribute', {
                name: 'character_Gunnery',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Field Tactics':
            createObj('attribute', {
                name: 'character_Field',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Command':
            createObj('attribute', {
                name: 'character_Command',
                current: 'on',
                _characterid: character.id
            });
        case 'Infiltration':
            createObj('attribute', {
                name: 'character_Infiltration',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Explosives':
            createObj('attribute', {
                name: 'character_Explosives',
                current: 'on',
                _characterid: character.id
            });
            // Scientist
		break;
        case 'Medicine':
            createObj('attribute', {
                name: 'character_Medicine',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Psychology':
            createObj('attribute', {
                name: 'character_Psychology',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Theology':
            createObj('attribute', {
                name: 'character_Theology',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Archaeology':
            createObj('attribute', {
                name: 'character_Archaeology',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Geology':
            createObj('attribute', {
                name: 'character_Geology',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Astronomy':
            createObj('attribute', {
                name: 'character_Astronomy',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Chemistry':
            createObj('attribute', {
                name: 'character_Chemistry',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Biology':
            createObj('attribute', {
                name: 'character_Biology',
                current: 'on',
                _characterid: character.id
            });
            // Android
		break;
        case 'Linguistics':
            createObj('attribute', {
                name: 'character_Linguistics',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Sophontology':
            createObj('attribute', {
                name: 'character_Sophontology',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Informatics':
            createObj('attribute', {
                name: 'character_Informatics',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Cybernetics':
            createObj('attribute', {
                name: 'character_Cybernetics',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Sensors':
            createObj('attribute', {
                name: 'character_Sensors',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Astrogation':
            createObj('attribute', {
                name: 'character_Astrogation',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Hyperspace':
            createObj('attribute', {
                name: 'character_Hyperspace',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Cryogenics':
            createObj('attribute', {
                name: 'character_Cryogenics',
                current: 'on',
                _characterid: character.id
            });
        default:
            return;
        }
        switch (DSBUILD.Skill4) {
            // Teamster
        case 'Scavenging':
            createObj('attribute', {
                name: 'character_Scavenging',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Melee Combat':
            createObj('attribute', {
                name: 'character_Melee',
                current: 'on',
                _characterid: character.id
            });
        case 'Vehicular Driving':
            createObj('attribute', {
                name: 'character_Driving',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Heavy Machinery':
            createObj('attribute', {
                name: 'character_Heavy',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Rinwise':
            createObj('attribute', {
                name: 'character_Rinwise',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Zero-G':
            createObj('attribute', {
                name: 'character_Zero-G',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Mechanical Repair':
            createObj('attribute', {
                name: 'character_Mechanical',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Engineering':
            createObj('attribute', {
                name: 'character_Engineering',
                current: 'on',
                _characterid: character.id
            });
            // Marine
		break;
        case 'Athletics':
            createObj('attribute', {
                name: 'character_Athletics',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Firearms':
            createObj('attribute', {
                name: 'character_Firearms',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Piloting Ships':
            createObj('attribute', {
                name: 'character_Piloting',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Gunnery':
            createObj('attribute', {
                name: 'character_Gunnery',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Field Tactics':
            createObj('attribute', {
                name: 'character_Field',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Command':
            createObj('attribute', {
                name: 'character_Command',
                current: 'on',
                _characterid: character.id
            });
        case 'Infiltration':
            createObj('attribute', {
                name: 'character_Infiltration',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Explosives':
            createObj('attribute', {
                name: 'character_Explosives',
                current: 'on',
                _characterid: character.id
            });
            // Scientist
		break;
        case 'Medicine':
            createObj('attribute', {
                name: 'character_Medicine',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Psychology':
            createObj('attribute', {
                name: 'character_Psychology',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Theology':
            createObj('attribute', {
                name: 'character_Theology',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Archaeology':
            createObj('attribute', {
                name: 'character_Archaeology',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Geology':
            createObj('attribute', {
                name: 'character_Geology',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Astronomy':
            createObj('attribute', {
                name: 'character_Astronomy',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Chemistry':
            createObj('attribute', {
                name: 'character_Chemistry',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Biology':
            createObj('attribute', {
                name: 'character_Biology',
                current: 'on',
                _characterid: character.id
            });
            // Android
		break;
        case 'Linguistics':
            createObj('attribute', {
                name: 'character_Linguistics',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Sophontology':
            createObj('attribute', {
                name: 'character_Sophontology',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Informatics':
            createObj('attribute', {
                name: 'character_Informatics',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Cybernetics':
            createObj('attribute', {
                name: 'character_Cybernetics',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Sensors':
            createObj('attribute', {
                name: 'character_Sensors',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Astrogation':
            createObj('attribute', {
                name: 'character_Astrogation',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Hyperspace':
            createObj('attribute', {
                name: 'character_Hyperspace',
                current: 'on',
                _characterid: character.id
            });
		break;
        case 'Cryogenics':
            createObj('attribute', {
                name: 'character_Cryogenics',
                current: 'on',
                _characterid: character.id
            });
        default:
            return;
            }
        createObj('attribute', {
            name: 'character_Loadout',
            current: DSBUILD.Loadout,
            _characterid: character.id
        });
    }
};
on("ready", function () {
    DSBUILD.listen();
});