Ok. Format is: !x ROLLS TARGET SIZE --DESCRIPTION Where: ROLLS - The number of times to try rolling. Defaults to 10 if omitted. TARGET - The number to attempt to be equal to or less than. Defaults to 50 if omitted. SIZE - The die size to roll on each attempt. Defaults to 100 if omitted. DESCRIPTION -- A text description to be displayed with the roll. Not shown if omitted. Inline rolls are expanded, in case you calculate the number of rolls or the target based on attributes or adjudication. Examples: !x !x --A basic attempt !x 5 10 --Something hard !x 10 7 10 --Using d10s Let me know if you want any styling changes. Cheers! Code: on('ready',()=>{
on('chat:message',(msg) => {
let args;
let cmds;
let who;
if('api' === msg.type) {
if(msg.content.match(/^!x\b/) ){
who=(getObj('player',msg.playerid)||{get:()=>'API'}).get('_displayname');
if(_.has(msg,'inlinerolls')){
msg.content = _.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();
}
args = msg.content.split(/\s+--/);
cmds=args.shift().split(/\s+/).slice(1);
let rolls = parseInt(cmds[0]);
let target = parseInt(cmds[1]);
let size = parseInt(cmds[2]);
rolls = (!isNaN(rolls) ? rolls : 10);
target = (!isNaN(target) ? target : 50);
size = (!isNaN(size) ? size : 100);
let tries = 0;
let attempts = [];
if(rolls>0){
do {
attempts.push(randomInteger(size));
} while( (++tries < rolls) && (attempts[attempts.length-1]>target));
}
let success = (rolls && !(attempts[attempts.length-1]>target));
let fmtSuccess='';
if(success){
fmtSuccess = `<span style="color: #090;font-weight:bold;">Success!</span> <code>${attempts[attempts.length-1]}</code> <b>&lt;=</b> <code>${target}</code> after <code>${attempts.length}</code> attempts. (<code>d${size}</code>)`;
} else {
fmtSuccess = `<span style="color: #c43c35;font-weight:bold;">Failure!</span> <code>${attempts.length}</code> rolls without being <b>&lt;=</b> <code>${target}</code> attempts. (<code>d${size}</code>)`;
}
let fmtRolls=attempts.map(r=>`<div style="display:inline-block; font-size: .8em; line-height: .8em; padding: .1em; margin: .1em; border: 1px solid #999; border-radius: .1em; background-color: #ccc; font-weight:bold;">${r}</div>`).join('');
let fmtDesc = (args.length && args[0].length) ? `<div>${args[0]}</div>` : '';
sendChat('',`<div style="padding:1px 3px;border: 1px solid #8B4513;background: #eeffee; color: #8B4513; font-size: 80%;"><div style="background-color: #ffeeee;"><b>${who}</b>: ${fmtSuccess}</div><div>${fmtRolls}</div>${fmtDesc}</div>`);
}
}
});
});