Javascript-roll20api脚本

Javascript-roll20api脚本,javascript,Javascript,我在roll20上玩了一个游戏,我正在编写一个脚本,将宏添加到“角色”,我制作了一个脚本,可以添加所有技能,但我不知道如何编写逻辑,让它检查角色表上是否存在属性,然后编写宏 这是我的代码,一些建议会很好!我对这一切一无所知,我正在努力学习这门语言,但我可以用一个例子来学习 var bigmike = bigmike || {}; bigmike.dicetype = "1d20"; bigmike.charClasses = [

我在roll20上玩了一个游戏,我正在编写一个脚本,将宏添加到“角色”,我制作了一个脚本,可以添加所有技能,但我不知道如何编写逻辑,让它检查角色表上是否存在属性,然后编写宏

这是我的代码,一些建议会很好!我对这一切一无所知,我正在努力学习这门语言,但我可以用一个例子来学习

        var bigmike = bigmike || {};

        bigmike.dicetype = "1d20";

        bigmike.charClasses = [
                'Monster'
        ];

        bigmike.attribute = [];
            bigmike.attribute["AC"] = { name: "AC", current: "", max:"" };
            bigmike.attribute["Init"] = { name: "Init", current: "", max:"" };
            bigmike.attribute["fort"] = { name: "Fort", current: "", max:"" };
            bigmike.attribute["ref"] = { name: "Ref", current: "", max:"" };
            bigmike.attribute["will"] = { name: "Will", current: "", max:"" };
            bigmike.attribute["str"] = { name: "Str", current: "", max:"" };      
            bigmike.attribute["dex"] = { name: "Dex", current: "", max:"" };
            bigmike.attribute["con"] = { name: "Con", current: "", max:"" };
            bigmike.attribute["int"] = { name: "Int", current: "", max:"" };
            bigmike.attribute["wis"] = { name: "Wis", current: "", max:"" };
            bigmike.attribute["cha"] = { name: "Cha", current: "", max:"" };
            bigmike.attribute["Size"] = { name: "Size", current: "", max:"" };
            bigmike.attribute["CR"] = { name: "CR", current: "", max:"" };
            bigmike.attribute["HP"] = { name: "HP", current: "", max:"" };
            bigmike.attribute["BaseAtk"] = { name: "BaseAtk", current: "", max:"" };
            bigmike.attribute["CMB"] = { name: "CMB", current: "", max:"" };
            bigmike.attribute["CMD"] = { name: "CMD", current: "", max:"" };


        bigmike.stats = [
            { name: bigmike.attribute["str"].name },
            { name: bigmike.attribute["dex"].name },
            { name: bigmike.attribute["con"].name },
            { name: bigmike.attribute["int"].name },
            { name: bigmike.attribute["wis"].name },
            { name: bigmike.attribute["cha"].name }
        ]; 

        bigmike.saves = [
            { name: bigmike.attribute["fort"].name },
            { name: bigmike.attribute["ref"].name },
            { name: bigmike.attribute["will"].name }
        ];

        /** Skills
        Skills are represented as an object, which consists of one value, since Monsters have static skill settings.
         */
        bigmike.skill = [
            { name: "Acrobatics", start: 0 },
            { name: "Appraise", start: 0 },
            { name: "Bluff", start: 0 },
            { name: "Climb", start: 0 },
            { name: "Diplomacy", start: 0 },
            { name: "Disable-Device", start: 0 },
            { name: "Disguise", start: 0 },
            { name: "Escape-Artist", start: 0 },
            { name: "Fly", start: 0 },
            { name: "Handle-Animal", start: 0 },
            { name: "Heal", start: 0 },
            { name: "Intimidate", start: 0 },
            { name: "Linguistics", start: 0 },
            { name: "Perception", start: 0 },
            { name: "Perform", start: 0 },
            { name: "Ride", start: 0 },
            { name: "Sense-Motive", start: 0 },
            { name: "Sleight-of-Hand", start: 0 },
            { name: "Spellcraft", start: 0 },
            { name: "Stealth", start: 0 },
            { name: "Survival", start: 0 },
            { name: "Swim", start: 0 },
            { name: "Use-Magic-Device", start: 0 }
        ];

        bigmike.knowledge = [
            { name: "Knowledge-Arcana", start: 0 },
            { name: "Knowledge-Dungeoneering", start: 0 },
            { name: "Knowledge-Engineering", start: 0 },
            { name: "Knowledge-Geography", start: 0 },
            { name: "Knowledge-History", start: 0 },
            { name: "Knowledge-Local", start: 0 },
            { name: "Knowledge-Nature", start: 0 },
            { name: "Knowledge-Nobility", start: 0 },
            { name: "Knowledge-Planes", start: 0 },
            { name: "Knowledge-Religion", start: 0 }
        ];

        bigmike.craft = [
            { name: "Craft-Any", start: 0 },
            { name: "Craft-Alchemy", start: 0 },
            { name: "Craft-Armorer", start: 0 },
            { name: "Craft-Basketweaving", start: 0 },
            { name: "Craft-Bookbinding", start: 0 },
            { name: "Craft-Bowyer", start: 0 },
            { name: "Craft-Blacksmith", start: 0 },
            { name: "Craft-Brewing", start: 0 },
            { name: "Craft-Calligraphy", start: 0 },
            { name: "Craft-Carpentry", start: 0 },
            { name: "Craft-Cobbling", start: 0 },
            { name: "Craft-Cooking", start: 0 },
            { name: "Craft-Crystal-Carving", start: 0 },
            { name: "Craft-Gemcutting", start: 0 },
            { name: "Craft-Glassblowing", start: 0 },
            { name: "Craft-Goldsmith", start: 0 },
            { name: "Craft-Leatherworking", start: 0 },
            { name: "Craft-Locksmithing", start: 0 },
            { name: "Craft-Jewelry", start: 0 },
            { name: "Craft-Painting", start: 0 },
            { name: "Craft-Pottery", start: 0 },
            { name: "Craft-Sculpting", start: 0 },
            { name: "Craft-Stonemasonry", start: 0 },
            { name: "Craft-Tailoring", start: 0 },
            { name: "Craft-Traps", start: 0 },
            { name: "Craft-Weaponsmith", start: 0 },
            { name: "Craft-Weaving", start: 0 }
        ];

        bigmike.parseCommand = function parseCommand(msg) {
            if (msg.type == "api" && msg.who.indexOf("(GM)") == -1) {
                sendChat("System", "Only the GM is allowed to switch classes.");
                return;
            }
            if(msg.type == "api" && msg.content.indexOf("!skill ") !== -1) {
                var cmdParts = msg.content.replace("!skill ", "").split(" ");
                var charClass;

                _.each(cmdParts, function(part) {
                    var indexOfClass = _.indexOf(bigmike.charClasses, part);
                    if (indexOfClass > -1) {
                        charClass = bigmike.charClasses[indexOfClass];
                        cmdParts = _.without(cmdParts, part);
                    }
                });

                if (typeof charClass === undefined) {
                    sendChat('System', 'Usage: !skill charName charClass');
                    sendChat('System', 'Value for charClass: ' + bigmike.charClasses);
                    return;
                }

                var result = {};
                result.charName = cmdParts.join(" ");
                log("Charname: " + result.charName);
                result.charType = charClass;
                log("CharType: " + result.charType);
                return result;
            }
        }

        on("ready", function() {
            sendChat("system", "/w GM API is ready and running");
            on("add:character", function(character) {
        //        insertAttributes(character);
        //        insertStatRolls(character);
                insertSaves(character);
        //        insertAttacks(character);
                insertSkills(character);
                insertKnowledges(character);
                insertCrafts(character);
            });
        });

        on("chat:message", function(msg) {
                var chatCmd = bigmike.parseCommand(msg);
                if (typeof chatCmd === 'undefined') {
                    return;
                }

                sendChat('System', 'Setting class ' + chatCmd.charType + ' for ' + chatCmd.charName);

                var characters = findObjs({
                    _type: "character",
                    archived: false,
                    name: chatCmd.charName
                }, {caseInsensitive: true});
                _.each(characters, function(character) {
                    log("Name: " + character.get("name"));
                    log("Bio: " + character.get("bio"));
                    log("GM-Notes: " + character.get("gmnotes"));
                    log("Archived: " + character.get("archived"));
                    log("In player journals: " + character.get("inplayerjournals"));
                    log("Controlled By: " + character.get("controlledby"));
                    insertSaves(character, chatCmd.charType);
                    insertSkills(character, chatCmd.charType);
                    insertKnowledges(character, chatCmd.charType);
                    insertCrafts(character, chatCmd.charType);
                });
            });

        /** Functions
            list of functions: (planned or in place) 
                insertAttribute
                insertAbilities
                insertSkills
                rollStats
        */

        function insertAttributes(character) {
            for (var index in bigmike.attribute) {
                createObj("attribute", {
                    name: bigmike.attribute[index].name,
                    current: bigmike.attribute[index].start,
                    max: bigmike.attribute[index].max,
                    characterid: character.id
                });
            };
            for(var index in bigmike.skill) {
                createObj("attribute", {
                    name: bigmike.skill[index].name,
                    current: bigmike.skill[index].start,
                    max: "",
                    characterid: character.id,
                });
            };
            for(var index = 0; index < bigmike.knowledge.length; index++) {
                createObj(".attribute", {
                    name: bigmike.knowledge[index].name,
                    current: bigmike.knowledge[index].start,
                    max: "",
                    characterid: character.id,
                });
            };
        };

        function insertAttacks(character) {
            for (var index = 0; index < bigmike.attack.length; index++) {
                createObj("ability", {
                    name: bigmike.attack[index].name,
                    description: "",   
                    action: bigmike.attack[index].macro,   
                    characterid: character.id,
                });
            };
        }

        function insertSkills(character) {
            for (var index = 0; index < bigmike.skill.length; index++) {
                var macro =  "/emas @{selected|token_name} makes a check vs " + bigmike.skill[index].name + " ( [[" + bigmike.dicetype + " + @{" + bigmike.skill[index].name + "} ]] )";
                createObj("ability", {
                    name: bigmike.skill[index].name,
                    description: "",   
                    action: macro,   
                    characterid: character.id
                });
            };
        }

        function insertKnowledges(character) {
            for (var index = 0; index < bigmike.knowledge.length; index++) {
                var macro =  "/emas @{selected|token_name} makes a check vs " + bigmike.knowledge[index].name + ": ( [[" + bigmike.dicetype + "+@{" + bigmike.knowledge[index].name + "} ]] )";
                createObj("ability", {
                    name: bigmike.knowledge[index].name,
                    description: "",   
                    action: macro,   
                    characterid: character.id
                });
            };
        }

        function insertCrafts(character) {
            for (var index = 0; index < bigmike.craft.length; index++) {
                var macro =  "/emas @{selected|token_name} makes a check vs " + bigmike.craft[index].name + ": ( [[" + bigmike.dicetype + "+@{" + bigmike.craft[index].name + "} ]] )";
                createObj("ability", {
                    name: bigmike.craft[index].name,
                    description: "",   
                    action: macro,   
                    characterid: character.id
                });
            };
        }

        function insertStatRolls(character) {
            for (var index = 0; index < bigmike.stats.length; index++) {
                var macro =  "/emas @{selected|token_name} rolls a [[" + bigmike.dicetype + "+@{" + bigmike.stats[index].name + "} ]] for his " + bigmike.stats[index].name + " check.";
                createObj("ability", {
                    name: bigmike.stats[index].name,
                    description: "",   
                    action: macro,   
                    characterid: character.id
                });
            };
        }

        function insertSaves(character) {
            for (var index = 0; index < bigmike.saves.length; index++) {
                var macro =  "/emas @{selected|token_name} rolls a [[" + bigmike.dicetype + "+@{" + bigmike.saves[index].name + "} ]] save VS " + bigmike.saves[index].name + ".";
                createObj("ability", {
                    name: bigmike.saves[index].name,
                    description: "",   
                    action: macro,   
                    characterid: character.id
                });
            };
        }
var bigmike=bigmike | |{};
bigmike.dicetype=“1d20”;
bigmike.charClasses=[
“怪物”
];
bigmike.attribute=[];
bigmike.attribute[“AC”]={name:“AC”,current:,max::};
属性[“Init”]={name:“Init”,当前:,最大:};
bigmike.attribute[“fort”]={name:“fort”,current:,max::};
bigmike.attribute[“ref”]={name:“ref”,current:,max::};
bigmike.attribute[“will”]={name:“will”,current:,max::};
属性[“str”]={name:“str”,当前:,最大:};
属性[“dex”]={name:“dex”,当前:,最大:};
bigmike.attribute[“con”]={name:“con”,current:,max::};
属性[“int”]={name:“int”,当前:,最大:};
属性[“wis”]={name:“wis”,当前:,最大:};
bigmike.attribute[“cha”]={name:“cha”,current:,max::};
属性[“大小”]={name:“大小”,当前:,最大:};
bigmike.attribute[“CR”]={name:“CR”,current:,max::};
bigmike.attribute[“HP”]={name:“HP”,current:,max::};
属性[“BaseAtk”]={name:“BaseAtk”,当前:,最大:};
属性[“CMB”]={name:“CMB”,当前:,最大:};
属性[“CMD”]={name:“CMD”,当前:,最大:};
bigmike.stats=[
{name:bigmike.attribute[“str”].name},
{name:bigmike.attribute[“dex”].name},
{name:bigmike.attribute[“con”].name},
{name:bigmike.attribute[“int”].name},
{name:bigmike.attribute[“wis”].name},
{name:bigmike.attribute[“cha”].name}
]; 
bigmike.saves=[
{name:bigmike.attribute[“fort”].name},
{name:bigmike.attribute[“ref”].name},
{name:bigmike.attribute[“will”].name}
];
/**技巧
技能被表示为一个对象,由一个值组成,因为怪物有静态技能设置。
*/
bigmike.skill=[
{name:“Acrobatics”,开始:0},
{name:“评估”,开始:0},
{name:“Bluff”,开始:0},
{name:“爬升”,开始:0},
{名称:“外交”,开始:0},
{name:“禁用设备”,开始:0},
{name:“伪装”,开始:0},
{name:“转义艺术家”,开始:0},
{name:“Fly”,开始:0},
{name:“处理动物”,开始:0},
{name:“治疗”,开始:0},
{name:“恐吓”,开始:0},
{name:“语言学”,开始:0},
{name:“Perception”,开始:0},
{name:“Perform”,开始:0},
{name:“骑行”,开始:0},
{name:“感知动机”,开始:0},
{name:“花招”,开始:0},
{name:“法术术”,开始:0},
{name:“隐身”,开始:0},
{name:“生存”,开始:0},
{名称:“游泳”,开始:0},
{name:“使用魔法设备”,开始:0}
];
bigmike.knowledge=[
{name:“知识奥秘”,开始:0},
{名称:“知识地下城”,开始时间:0},
{name:“知识工程”,开始:0},
{name:“知识地理”,开始:0},
{name:“知识历史”,开始:0},
{name:“知识本地”,开始:0},
{name:“知识性质”,开始:0},
{name:“知识贵族”,开始:0},
{name:“知识平面”,开始:0},
{名称:“知识宗教”,开始:0}
];
bigmike.craft=[
{name:“手工制作任何”,开始:0},
{name:“工艺炼金术”,开始:0},
{name:“工艺装备商”,开始时间:0},
{名称:“工艺编织篮”,开始时间:0},
{name:“手工装订”,开始:0},
{name:“Craft Bowyer”,开始时间:0},
{name:“工艺铁匠”,开始时间:0},
{name:“工艺酿造”,开始时间:0},
{名称:“工艺书法”,开始:0},
{name:“手工木工”,开始:0},
{name:“手工鹅卵石”,开始:0},
{name:“手工烹饪”,开始时间:0},
{名称:“工艺水晶雕刻”,开始时间:0},
{name:“工艺切割”,开始:0},
{name:“工艺玻璃吹制”,开始时间:0},
{name:“工艺金匠”,开始:0},
{名称:“工艺皮革加工”,开始时间:0},
{名称:“工艺锁匠”,开始时间:0},
{名称:“工艺珠宝”,开始:0},
{名称:“工艺画”,开始:0},
{名称:“工艺陶器”,开始:0},
{名称:“工艺雕刻”,开始:0},
{名称:“工艺石砌体”,开始时间:0},
{name:“手工裁剪”,开始:0},
{name:“工艺陷阱”,开始:0},
{name:“工艺武器匠”,开始:0},
{名称:“手工编织”,开始时间:0}
];
bigmike.parseCommand=函数parseCommand(msg){
如果(msg.type==“api”&&msg.who.indexOf(“(GM)”)==-1){
sendChat(“系统”,“仅允许GM切换类别”);
返回;
}
function insertAttributes(character) {
    var characterAttrs = findObjs({
        _type: 'attribute',
        //name: 'MyAttrName',
        _characterid: character.id
    });
    // `characterAttrs` is now an array of all attributes owned by `character`
    // If you uncomment the name line and `character` has one or more attributes
    // named "MyAttrName", `characterAttrs` will be an array of all of the
    // attributes named "MyAttrName" owned by `character`

    ...
}