After chatting with Jack via PM, I added inline roll capability for the script input. Putting it here publicly in case anyone wants to use part of this as a template or starting point for their own custom die rolling scripts. Examples !2dX 6 [[1d4]] !2dX 6 [[1d6 + @{Charname|AttributeName}]] Updated script: const dExplode = (() => {
const version = '0.1.0';
const scriptName = '2dX';
const checkInstall = () => {
log('-=> ' + scriptName + ' v' + version);
};
function processInlinerolls(msg) {
if(_.has(msg,'inlinerolls')){
return _.chain(msg.inlinerolls)
.reduce(function(m,v,k){
var ti=_.reduce(v.results.rolls,function(m2,v2){
if(_.has(v2,'table')){
m2.push(_.reduce(v2.results,function(m3,v3){
m3.push(v3.tableItem.name);
return m3;
},[]).join(', '));
}
return m2;
},[]).join(', ');
m['$[['+k+']]']= (ti.length && ti) || v.results.total || 0;
return m;
},{})
.reduce(function(m,v,k){
return m.replace(k,v);
},msg.content)
.value();
} else {
return msg.content;
}
}
const handleInput = (msg) => {
let rolls = [];
let rollMod = 0;
let result;
let displayRolls = '';
if (msg.type=="api" && msg.content.indexOf("!2dX") === 0 ) {
try {
who = getObj('player',msg.playerid).get('_displayname');
//Check for inline rolls in script input
let inlineContent = processInlinerolls(msg);
let args = inlineContent.split(/\s+/);
let dieType = parseInt(args[1]);
if (args.length > 2) {
rollMod = parseInt(args[2]);
}
//Initial rolls (2 dice of size dieType)
rolls.push(randomInteger(dieType));
rolls.push(randomInteger(dieType));
displayRolls = `${rolls[0]}, ${rolls[1]}`;
//check for double max rolls. Start exploding
if (rolls[0] === dieType && rolls[1] === dieType) {
let done = false;
do {
rolls.push(randomInteger(dieType));
displayRolls = displayRolls + `, ${rolls[rolls.length-1]}`;
if (rolls[rolls.length-1] !== dieType) {
done = true;
}
} while (done === false);
}
//calculate total roll
result = rolls.reduce((a, b) => a + b, 0) + rollMod;
//output
displayRolls = '**' + displayRolls + '**'; //bold all the rolls
//using default template
let output = `&{template:default} {{name=2d${dieType}!}} {{Rolls=${displayRolls}}} {{Roll Mod=**${rollMod}**}} {{Result=[[${result}]]}}`;
sendChat('', output);
}
catch(err) {
sendChat('',`/w "${who}" `+ 'Error: ' + err.message);
}
};
};
const registerEventHandlers = () => {
on('chat:message', handleInput);
};
on('ready', () => {
checkInstall();
registerEventHandlers();
});
})();