Hi, I developed the script a while ago and thought about refreshing it as it no longer seemed to work. It's working alright again, but something that I absolutely cannot do anymore is pull the attributes from a character to include the attribute in the hidden roll. Anyway, the script is here if it may be of use to you, and if anyone had an idea how to get the right attribute in the macro or the script, it would be great. Bonus point if someone knows how to pull the attribute from D&D Beyond as I am using Beyond20 to make the link, although I understand that this is very probably not possible. The header contains all the description, hopefully it will be enough to understand. // Github: BlindRoll.js // By: Philippe K., Great Old One // Contact: <a href="https://app.roll20.net/users/321064" rel="nofollow">https://app.roll20.net/users/321064</a> // This script is for the DM to call for dices to be rolled "Blind" by the // players, i.e. they initate the roll but only the DM sees the result. // This is useful for "Detection" checks when you don't want the player to know // how well he rolled so that he cannot metagame what he saw. // It is also very useful for Stealth and again when you don't want the result // of a check to influence the characters' behaviour. // // It is very easy to use, just add the script in the API scripts of the // DM (only) in Roll20, for example under the name of "BlindRolls.js". // After that, the script is invoked by the DM using the following options: // - "!brr *" This will make a button appear in the chat box of every player, // requiring anyone in the party to roll a d20, only the first one rolled // will be sent back to the DM. Can be used for random encounters or just // globally to test the party's luck. // - "!brr [Character]" This will make a button appear in the chat box of only // that player, allowing him to send the roll only to the DM. This is all // purpose and useful if you want to leave the player if that was a skill // check, a saving throw, or just his luck. // - "!brr [Character] [skill]" This will make a button appear in the chat box // of only one player. The only difference with the previous option is that // the player will know what the roll is about. Note that the "skill" can be // anything, not necessarily an official/core skill, and no verification is // done about this. // - "!brr [Character] [skill] [value]" This will make a button appear in the // chat box of only one player, it will mention the bonus to the roll, show // it to the player and integrate that value in the roll sent back to the DM. // Note that, as above, no verification is made about the validity of the // skill or of the value. It is however possible to replace the value by an // attribute like "[[@{Arun Siktar|stealth_roll}]]" // // The script is best used from a macro, of course, where you can set up all the // rolls that the party and its members are likely to make, something like: // /w gm [Global](!brr *) // /w gm [Arun](!brr Arun) [Arun Perception](!brr Arun Perception 3) // /w gm [Chasse](!brr Chasse-le-singe) [Chasse Perception](!brr Chasse Perception 3) // /w gm [Eldoran](!brr Eldoran) [Eldoran Perception](!brr Eldoran Perception 3) // /w gm [Hasira](!brr Hasira,) [Hasira Perception](!brr Hasira, Perception 3) // /w gm [Joyver](!brr Joyver) [Joyver Perception](!brr Joyver Perception 3) // /w gm [Xykis](!brr Xykis) [Xykis Perception](!brr Xykis Perception 3) // /w gm [Shallan](!brr Shallan) [Shallan Stealth](!brr Shallan Stealth 3) // Install that macro in the Macro Bar, and when clicked, it will bring up a // series of buttons that you can just click to ask a Blind Roll from one of // your PCs. var BlindRoll = BlindRoll || (function() { 'use strict'; var version = '0.0.1', lastUpdate = 150995981, roller, rollN = 0, skill = "", bonus = 0, checkInstall = function() { log('-=> BlindRoll v' + version + ' <=- [' + (new Date(lastUpdate * 1000)) + ']'); }, handleInput = function(msg_orig) { var msg = _.clone(msg_orig); if (msg.type !== "api") { return; } // brr - Blind Roll Request, sent by the GM, Format is !brr (Target|*) [Skill [Bonus]] if (msg.content.indexOf("!brr ") !== -1) { log ("") log (msg.content) var params = msg.content.replace("!brr ", "").split(" ", 3) roller = params[0]; log ("Roller:|"+roller+"|") rollN = Date.now(); var chatCommand = (roller == '*' ? "/em" : "/w " + roller); switch (params.length) { case 3: skill = params[1]; bonus = params[2]; sendChat("GM", chatCommand + " [Blind " + skill + " Roll - Modifier " + (bonus < 0 ? '' : '+') + bonus + " ](!bra " + rollN + ") ", null, { noarchive: true }); sendChat("Blind Roller", "/w GM Blind " + skill + " (" + (bonus < 0 ? '' : '+') + bonus + ")"+ " Roll requested from " + roller + "."); break; case 2: skill = params[1]; bonus = 0; sendChat("GM", chatCommand + " [Blind " + skill + " Roll](!bra " + rollN + ") ", null, { noarchive: true }); sendChat("Blind Roller", "/w GM Blind " + skill + " Roll requested from " + roller); break; default: skill = ""; bonus = 0; sendChat("GM", chatCommand + " [" + (roller == '*' ? "Party " : "") + "Blind Roll](!bra " + rollN + ") ", null, { noarchive: true }); sendChat("Blind Roller", "/w GM Blind d20 Roll requested from " + (roller == '*' ? "the Party" : roller) + "."); } } // bra - Blind Roll Answer, send back by the button in the chat of the target if (msg.content.indexOf("!bra ") !== -1) { if (rollN == 0 || msg.content.replace("!bra ", "") != rollN) { sendChat("GM", "/w " + (roller == '*' ? msg.who : "\"" + roller + "\"") + " Only one roll, please..."); } else { sendChat("GM", "/w " + (roller == '*' ? msg.who : roller) + " Thanks for the " + (skill == '' ? '' : skill + ' ') + "roll!"); sendChat((roller == '*' ? msg.who : roller), "/w GM " + (roller == '*' ? "Party " : "") + "Blind " + (skill == '' ? '' : skill + ' ') + "Roll [[d20" + (bonus < 0 ? bonus : '') + (bonus > 0 ? '+' + bonus : '') + "]]"); rollN = 0; } } }, registerEventHandlers = function() { on('chat:message', handleInput); }; return { CheckInstall: checkInstall, RegisterEventHandlers: registerEventHandlers }; }()); on('ready', function() { 'use strict'; BlindRoll.CheckInstall(); BlindRoll.RegisterEventHandlers(); });