I've changed a WoDroller script (I don't remember who made it) that was in this forum for use for V20 - 10s don't explode, they count as 2. 1. Make two macros. !r ?{Amount of Dice|0} ?{Difficulty|6} ?{Specialty|0} ?{Willpower|0} 0 !r ?{Amount of Dice|0} ?{Difficulty|6} ?{Specialty|0} ?{Willpower|0} 1 2. Let players use them and add to their bars. The first one is a public roll. Everybody will see who is rolling and what he set. The degree of success is based on the rules, so Marginal, Partial, Complete, Exceptional and Phenomenal. There's also Failure and Botch. The second was made, because there's something I like in story-focused games - don't know the result of the roll, just the narration. This gives not only the GM to roll hidden rolls, but also the player to roll for something, so only the GM can see (the player who rolled, can't see the result). P.S. Yeah, I know the code looks bad. It was done quick and I didn't care about formatting. // Make two macros: // 1. !r ?{Amount of Dice|0} ?{Difficulty|6} ?{Specialty|0} ?{Willpower|0} 0 // This one is for the public eye. Everybody will see the roll. // The user will be able to set the amount of dice (max is set to 20), // The difficulty - which has the minimum of 2 and maximum of 10 // Specialty and Willpower the user sets to 0, if he doesn't have/use, and 1 otherwise. // 2. !r ?{Amount of Dice|0} ?{Difficulty|6} ?{Specialty|0} ?{Willpower|0} 1 // This is the same thing, but the user doesn't see the roll, only the GM does. function WODdice(char, player, num, diff, spec, willpower, hidden){ var suc = 0; var one = 0; var wp = willpower; var rolls = new Array(); var rr = false; if (num &gt; 0) { if( diff == null ){diff = 6} if( diff &gt; 10 ){diff = 10} if( diff &lt; 2 ){diff = 2} if( num &gt; 20 ){num = 20} if( spec != 1 && spec != 0 ){spec = 0} if( wp != 1 && wp != 0 ){wp = 0} var s1 = '&lt;img src="<a href="http://i.imgur.com/ytXjID6.png" rel="nofollow">http://i.imgur.com/ytXjID6.png</a>" title="BOTCH" height="200" width="10"/&gt; '; //sendChat("Roll", s1); var text = ""; if(hidden == 1) text = text + "/w gm "; text = text + "&lt;br&gt;&lt;b&gt;Rolling " + num + " dice. Difficulty of " + diff + "&lt;/b&gt;"; if( spec == 1) text = text + "&lt;br&gt;Has speciality. 10 counts as two successes."; ten = 0; var strrolls = ""; var checked = false; for( var i=0; i&lt;num; i++){ var roll = Math.floor((Math.random()*10)+1); rolls[i] = roll; checked = false; if( roll&gt;=diff ) { checked = true; suc = suc+1; strrolls = strrolls + '&lt;span style="color:green"&gt;&lt;b&gt;'+ roll + '&lt;/b&gt;&lt;/span&gt; '; } if( roll==1 && rr == false ) { checked = true; one = one+1; strrolls = strrolls + s1; } if( roll==10 && spec==1) { suc=suc+1; } if (checked == false) { strrolls = strrolls + roll + ' '; } } if (wp == 1) { suc=suc+1; text = text + "&lt;br&gt;Willpower Used! At least 1 success guaranteed."; } text = text + "&lt;br&gt;&lt;b&gt;Roll:&lt;/b&gt; " + strrolls; rolls = new Array(); // Display results if( diff == 0 || diff == 1){ text = text + "&lt;br&gt;" + one +" Ones"; }else{ var temp = suc-one; text = text + "&lt;br&gt;" + suc + " Successes - " + one +" Ones. &lt;br&gt;&lt;b&gt;Total: "+temp +"&lt;/b&gt;" ; if( (suc&gt;one && suc &gt;0) || wp == 1 ) { if (temp == 1 || (wp == 1 && temp &lt; 1)) { text = text + '&lt;br&gt;&lt;span style="color:green"&gt;&lt;b&gt;MARGINAL SUCCESS&lt;/b&gt;&lt;/span&gt;'; } if (temp == 2) { text = text + '&lt;br&gt;&lt;span style="color:green"&gt;&lt;b&gt;MODERATE SUCCESS&lt;/b&gt;&lt;/span&gt;'; } if (temp == 3) { text = text + '&lt;br&gt;&lt;span style="color:green"&gt;&lt;b&gt;COMPLETE SUCCESS&lt;/b&gt;&lt;/span&gt;'; } if (temp == 4) { text = text + '&lt;br&gt;&lt;span style="color:green"&gt;&lt;b&gt;EXCEPTIONAL SUCCESS&lt;/b&gt;&lt;/span&gt;'; } if (temp &gt; 4) { text = text + '&lt;br&gt;&lt;span style="color:green"&gt;&lt;b&gt;PHENOMENAL SUCCESS&lt;/b&gt;&lt;/span&gt;'; } } else if( suc&lt;one && suc==0 && wp == 0) { text = text + "&lt;br&gt;" + s1+ '&lt;span style="color:red"&gt;&lt;b&gt;BOTCH!!!&lt;/b&gt;&lt;/span&gt;' + s1; } else { text = text + '&lt;br&gt;&lt;span style="color:red"&gt;&lt;b&gt;FAILURE&lt;/b&gt;&lt;/span&gt;' } } if(player==1) sendChat("player|"+char, text); else sendChat("character|"+char, text); } }; on("chat:message", function(msg) { if( msg.type != 'api' ) return; var cmd = msg.content.toLowerCase().split(' '); if( cmd[0] == "!r" ) { var inputName = msg.who; var list = findObjs({ _type: "character", name: inputName }); if (list.length == 0) { WODdice( msg.playerid, 1, cmd[1], cmd[2], cmd[3], cmd[4], cmd[5] ); } else { WODdice( list[0].id, 0, cmd[1], cmd[2], cmd[3], cmd[4], cmd[5] ); } } });