Roll20 uses cookies to improve your experience on our site. Cookies enable you to enjoy certain features, social sharing functionality, and tailor message and display ads to your interests on our site and others. They also help us understand how our site is being used. By continuing to use our site, you consent to our use of cookies. Update your cookie preferences .
×
Create a free account

[Script] SlyDice - Help Creating a Dice API

Are there any coders out there who could help me create a dice API?  My  Game system has a three step process to determining checks: Part I: Players roll a dice pool of 4 Dice + Dice equal to a PC's skill Players can use any type of dice (d20, d6, d2, d8, etc.) anything with even sides. Even faces are counted as successes Odd faces are counted as failures.  Part II: The player tallies the number of " successes " (even faces) they rolled on their dice pool The number of " successes " they roll must match a target number in order to be successful.  For example: A player must roll a total number of 3 successes (3 even faces) in order to accomplish a Difficulty 3 check. Part III:  Lastly, separate from normal success and failure, a dice pool can determine added results A player then cancels out the successes they rolled with what failures they rolled on their dice pool. If only successes remain ( Boons ) , the player may spend them to add bonuses to their roll. If only failures remain ( Despairs ) the GM may spend them to add additional obstacles against the PCs  I would love to get in touch with someone who can make an API script that both count the number of successes a player rolls and what Despairs/Boons  they rolled, if any. I would also like to import some symbols to represent success/failure. For anyone who is willing, I would love to run a game for you :]
1500380430
The Aaron
Pro
API Scripter
I can probably help you with that script.  Do the players know the number of successes up front?  So, you might call for a Difficulty 3 check, and they'd issue the roll. Are these valid interpretations of the roll rules: Diff 3: 1 1 2 2 2 -- success, 1 boon Diff 3: 1 1 1 1 1 -- failure, 5 despairs Diff 3: 2 2 2 2 2 -- success, 2 boons Diff 3: 1 1 1 1 1 2 2 2 -- success, 2 despairs Diff 3: 2 2 2 -- success, nothing extra
Hey Aaron! Thanks for the response! It looks like you are getting a hang of the rules. As for examples 3 and 5, the only correction is that the player would come out with 5 Boons (Example 3) and 3 Boons (Example 5) respectively. 
1500385767
The Aaron
Pro
API Scripter
Ah, right.  =D
1500475453
The Aaron
Pro
API Scripter
See how this tickles your fancy... Commands: !sly &lt;difficulty&gt; &lt;[[some roll]]&gt; [optional content] &lt;difficulty&gt; is an integer to check against the number of even results &lt;[[some roll]]&gt; is an inline roll of dice which will be consulted for odd/even results. &nbsp;Only the first set of dice is considered, so use [[6d6]], not [[3d6+3d6]]. [optional content] is some collection of text to show along with the result, possibly to describe the action attempted, or things used, etc. &nbsp;Inline rolls are expanded, so "Attempts to swim with the aid of [[1d8]] ducks..." would result in something like "Attempts to swim with the aid of 3 ducks...". !wsly -- just like above, but whispers the output to the issuing player and the gm. !bsly -- just like above, but only whispers the results to the GM and notifies the player it was sent, along with the optional content. Examples: !sly 3 [[6d6]] Failure case (with despairs) Success case (with boons) Success case (balanced) !sly 3 [[5d10]] Attempts to swim with the aid of [[1d8]] ducks... !bsly 3 [[5d10]] Attempts to swim with the aid of [[1d8]] ducks... For the Boon and Despair images, I just grabbed some images off the internet that felt good. &nbsp;The URLs are near the top of the script, so should be easy enough to replace. &nbsp;The styles used are near the top as well, and should be easily adjusted as desired. Code: on('ready',function(){ &nbsp; &nbsp; 'use strict'; &nbsp; &nbsp; const &nbsp; &nbsp; &nbsp; &nbsp; image = { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; boon: '<a href="http://www.realmoneyslotsonline.com/wp-content/uploads/2016/09/2000px-Clover_symbol.svg_.png" rel="nofollow">http://www.realmoneyslotsonline.com/wp-content/uploads/2016/09/2000px-Clover_symbol.svg_.png</a>', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; dispair: '<a href="http://1.bp.blogspot.com/-NM95GPF2tTU/Tb34jIV6xgI/AAAAAAAAABk/HdC83ZSqGjU/s1600/gyen_lg.gif" rel="nofollow">http://1.bp.blogspot.com/-NM95GPF2tTU/Tb34jIV6xgI/AAAAAAAAABk/HdC83ZSqGjU/s1600/gyen_lg.gif</a>' &nbsp; &nbsp; &nbsp; &nbsp; }, &nbsp; &nbsp; &nbsp; &nbsp; styles = { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; body: { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'background-image': "url('<a href="http://static1.squarespace.com/static/538b5343e4b06b1e5375769c/t/5717e58bab48de61b52f9096/1461183887470/F71ddls.jpg" rel="nofollow">http://static1.squarespace.com/static/538b5343e4b06b1e5375769c/t/5717e58bab48de61b52f9096/1461183887470/F71ddls.jpg</a>')", &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'background-repeat-y': 'no-repeat', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'background-position': 'top', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'background-size': 'auto 100%', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'background-color': '#DFBC98', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'border': '0', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'border-top-left-radius': '2em', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'border-top-right-radius': '2em', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'padding': '0' &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; result: { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'text-align': 'center', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'background-color': '#212122', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'border': '3px double white', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'border-top-left-radius': '1em', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'border-top-right-radius': '1em', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'font-size': '2em', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'line-height': '2em', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'font-weight': 'bold' &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; resultSuccess: { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'color': '#008000' &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; resultFailure: { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'color': '#8b0000' &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; content: { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'font-weight': 'bold', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'font-size': '1.2em', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'padding': '1em .5em .5em .5em', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'color': 'black', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'text-shadow': '1px 1px #666' &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; dice: { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'background-color': '#fffff0', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'border': '1px solid #333', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'border-radius': '.5em', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'max-width': '1.2em', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'max-height': '1.2em', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'height': '1.2em', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'width': '1.2em', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'text-align': 'center', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'margin': '.1em', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'font-weight': 'bold', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'display': 'inline-block' &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; diceOdd: { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'color': '#B22222' &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; diceEven: { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'color': '#228B22' &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bdImage: { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'max-width': '2em', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'max-height': '2em' &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bdDice: { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'border-width': '1px', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'border-style': 'solid', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'border-radius': '.75em', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'margin': '.2em', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'text-align': 'center', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'padding': '.5em', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'max-width': '2em', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'max-height': '2em', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'height': '2em', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'width': '2em', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'display': 'inline-block' &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; boon: { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'background-color': '#fffff0', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'border-color': &nbsp;'#daa520' &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; despair: { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'background-color': '#a52a2a', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'border-color': &nbsp;'#800000', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; &nbsp; &nbsp; }, &nbsp; &nbsp; &nbsp; &nbsp; s = (o)=&gt;_.map(o,(v,k)=&gt;`${k}:${v};`).join(''), &nbsp; &nbsp; &nbsp; &nbsp; cmdregex=/^(!([bw])?sly)\s*/, &nbsp; &nbsp; &nbsp; &nbsp; getResults = function (roll,difficulty){ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; let res = { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; rolls: _.pluck(roll.results.rolls[0].results,'v') &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; res.counts = _.countBy(res.rolls,(n)=&gt; (n%2===0 ? 'even' : 'odd')); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; res.counts.odd=(res.counts.odd||0); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; res.counts.even=(res.counts.even||0); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; res.success = res.counts.even &gt;= difficulty; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; res.boon = (res.counts.even &gt; res.counts.odd ? res.counts.even - res.counts.odd : 0); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; res.dispair = (res.counts.odd &gt; res.counts.even ? res.counts.odd - res.counts.even : 0); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return res; &nbsp; &nbsp; &nbsp; &nbsp; }, &nbsp; &nbsp; &nbsp; &nbsp; formatBDDice = function(res){ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return _.times(res.boon,()=&gt;`&lt;div style="${s(styles.bdDice)}${s(styles.boon)}"&gt;&lt;img style="${s(styles.bdImage)}" src="${image.boon}"&gt;&lt;/div&gt;`).join('')+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _.times(res.dispair,()=&gt;`&lt;div style="${s(styles.bdDice)}${s(styles.despair)}"&gt;&lt;img style="${s(styles.bdImage)}" src="${image.dispair}"&gt;&lt;/div&gt;`).join(''); &nbsp; &nbsp; &nbsp; &nbsp; }, &nbsp; &nbsp; &nbsp; &nbsp; formatDice = function(res){ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; let odd =(n)=&gt;n%2!==0; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return _.map(res.rolls, (r)=&gt;`&lt;div style="${s(styles.dice)}${odd(r) ? s(styles.diceOdd) : s(styles.diceEven) }"&gt;${r}&lt;/div&gt;`).join(''); &nbsp; &nbsp; &nbsp; &nbsp; }; &nbsp; &nbsp; on('chat:message',function(msg){ &nbsp; &nbsp; &nbsp; &nbsp; if('api' === msg.type) { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; let match=msg.content.match(cmdregex); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if(match){ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; let who=(getObj('player',msg.playerid)||{get:()=&gt;'API'}).get('_displayname'), &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; valid = (msg.content.split(/\s+/).length&gt;2); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if(valid && _.has(msg,'inlinerolls')){ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; let rollIndex=msg.content.match(/\$\[\[(\d+)\]\]/)[1], &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; difficulty = msg.content.match(/(?:\s)\b(\d+)\b(?:\s|$)/)[1], &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; content = _.chain(msg.inlinerolls) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .reduce(function(m,v,k){ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; m['$[['+k+']]']=v.results.total || 0; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return m; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; },{}) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .reduce(function(m,v,k){ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return m.replace(k,v); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; },msg.content) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .value() &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .replace(cmdregex,'') &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .replace(/^\s*\d+\s+\d+\s*/,''), &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; results = getResults(msg.inlinerolls[rollIndex],difficulty), &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; output = `&lt;div style="${s(styles.body)}"&gt;`+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `&lt;div style="${s(styles.result)}${results.success ? s(styles.resultSuccess) : s(styles.resultFailure)}"&gt;`+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (results.success ? 'Success' : 'Failure') + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `&lt;/div&gt;`+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `&lt;div&gt;${formatBDDice(results)}&lt;/div&gt;`+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `&lt;div&gt;${formatDice(results)}&lt;/div&gt;`+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (content.length ? `&lt;div style="${s(styles.content)}"&gt;${content}&lt;/div&gt;` : '') + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `&lt;/div&gt;`; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; switch(match[2]){ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case 'b': &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sendChat(msg.who, `/w gm `+ output ); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sendChat('',`/w "${who}" `+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `&lt;div style="${s(styles.body)}"&gt;`+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `&lt;div style="${s(styles.result)}"&gt;`+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `Blind to GM`+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `&lt;/div&gt;`+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (content.length ? `&lt;div style="${s(styles.content)}"&gt;${content}&lt;/div&gt;` : '') + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `&lt;/div&gt;` &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case 'w': &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sendChat(msg.who, `/w gm `+ output ); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sendChat('', `/w "${who}" `+ output ); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; default: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sendChat(msg.who, output ); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } else { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sendChat('',`/w "${who}" &lt;div&gt;`+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `&lt;div&gt;Use &lt;code&gt;!sly [Difficulty Number] [Inline Roll] [Optional Content]&lt;/code&gt;&lt;/div&gt;`+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `&lt;div&gt;Use &lt;code&gt;!wsly&lt;/code&gt; to have output whispered to player and gm. (secret roll)&lt;/div&gt;`+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `&lt;div&gt;Use &lt;code&gt;!bsly&lt;/code&gt; to have output whispered to gm. (blind roll)&lt;/div&gt;` &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; }); });
Oh man!&nbsp; Your'e so fast man! This is better than I could have dreamed :D Is there anyway to have the script roll a dice pool without having a set Dice pool? For example:&nbsp;!sly [[6d6]]. That way a series of macros can be made where the player just roll their dice pool without being given hints towards an NPC's abilities?&nbsp; Also can you PM me your email address, I'd love to send you a PDF copy so I can run a game for you?
1500508247
The Aaron
Pro
API Scripter
Hunter Fox said: Is there anyway to have the script roll a dice pool without having a set Dice pool? For example:&nbsp;!sly [[6d6]]. That way a series of macros can be made where the player just roll their dice pool without being given hints towards an NPC's abilities?&nbsp; I'm not completely clear on what you mean, can you walk me through how you see that working? &nbsp;Do you mean a set Difficulty? &nbsp;So, they'd roll !sly [[6d6]] and it would give just the results, with no success or failure, and you'd just interpret the results for them. &nbsp;So they might roll [1, 1, 2, 2, 2], netting them a result of 3 and 1 boon, but they don't know if success is a 2 or a 4 difficulty?
1500511069
The Aaron
Pro
API Scripter
Ok, here it is with the ability to specify - if you don't know the target difficulty. &nbsp; !sly - [[8d8]] test a bunch of things I also added better help. Code: on('ready',function(){ &nbsp; &nbsp; 'use strict'; &nbsp; &nbsp; const &nbsp; &nbsp; &nbsp; &nbsp; image = { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; boon: '<a href="http://www.realmoneyslotsonline.com/wp-content/uploads/2016/09/2000px-Clover_symbol.svg_.png" rel="nofollow">http://www.realmoneyslotsonline.com/wp-content/uploads/2016/09/2000px-Clover_symbol.svg_.png</a>', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; dispair: '<a href="http://1.bp.blogspot.com/-NM95GPF2tTU/Tb34jIV6xgI/AAAAAAAAABk/HdC83ZSqGjU/s1600/gyen_lg.gif" rel="nofollow">http://1.bp.blogspot.com/-NM95GPF2tTU/Tb34jIV6xgI/AAAAAAAAABk/HdC83ZSqGjU/s1600/gyen_lg.gif</a>' &nbsp; &nbsp; &nbsp; &nbsp; }, &nbsp; &nbsp; &nbsp; &nbsp; styles = { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; body: { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'background-image': "url('<a href="http://static1.squarespace.com/static/538b5343e4b06b1e5375769c/t/5717e58bab48de61b52f9096/1461183887470/F71ddls.jpg" rel="nofollow">http://static1.squarespace.com/static/538b5343e4b06b1e5375769c/t/5717e58bab48de61b52f9096/1461183887470/F71ddls.jpg</a>')", &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'background-repeat-y': 'no-repeat', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'background-position': 'top', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'background-size': 'auto 100%', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'background-color': '#DFBC98', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'border': '0', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'border-top-left-radius': '2em', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'border-top-right-radius': '2em', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'padding': '0' &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; result: { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'text-align': 'center', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'background-color': '#212122', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'border': '3px double white', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'border-top-left-radius': '1em', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'border-top-right-radius': '1em', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'font-size': '2em', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'line-height': '2em', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'font-weight': 'bold' &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; resultSuccess: { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'color': '#008000' &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; resultFailure: { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'color': '#8b0000' &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; resultUnknown: { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'color': 'white' &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; content: { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'font-weight': 'bold', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'font-size': '1.2em', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'padding': '1em .5em .5em .5em', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'color': 'black', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'text-shadow': '1px 1px #666' &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; dice: { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'background-color': '#fffff0', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'border': '1px solid #333', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'border-radius': '.5em', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'max-width': '1.2em', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'max-height': '1.2em', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'height': '1.2em', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'width': '1.2em', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'text-align': 'center', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'margin': '.1em', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'font-weight': 'bold', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'display': 'inline-block' &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; diceOdd: { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'color': '#B22222' &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; diceEven: { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'color': '#228B22' &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bdImage: { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'max-width': '2em', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'max-height': '2em' &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bdDice: { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'border-width': '1px', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'border-style': 'solid', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'border-radius': '.75em', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'margin': '.2em', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'text-align': 'center', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'padding': '.5em', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'max-width': '2em', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'max-height': '2em', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'height': '2em', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'width': '2em', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'display': 'inline-block' &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; boon: { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'background-color': '#fffff0', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'border-color': &nbsp;'#daa520' &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; despair: { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'background-color': '#a52a2a', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'border-color': &nbsp;'#800000', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; &nbsp; &nbsp; }, &nbsp; &nbsp; &nbsp; &nbsp; s = (o)=&gt;_.map(o,(v,k)=&gt;`${k}:${v};`).join(''), &nbsp; &nbsp; &nbsp; &nbsp; cmdregex=/^(!([bw])?sly)\s*/, &nbsp; &nbsp; &nbsp; &nbsp; getResults = function (roll,difficulty){ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; let res = { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; rolls: _.pluck(roll.results.rolls[0].results,'v') &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; res.counts = _.countBy(res.rolls,(n)=&gt; (n%2===0 ? 'even' : 'odd')); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; res.counts.odd=(res.counts.odd||0); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; res.counts.even=(res.counts.even||0); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; res.success = (/\d+/.test(difficulty) ? (res.counts.even &gt;= difficulty) : res.counts.even); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; res.boon = (res.counts.even &gt; res.counts.odd ? res.counts.even - res.counts.odd : 0); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; res.dispair = (res.counts.odd &gt; res.counts.even ? res.counts.odd - res.counts.even : 0); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return res; &nbsp; &nbsp; &nbsp; &nbsp; }, &nbsp; &nbsp; &nbsp; &nbsp; formatBDDice = function(res){ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return _.times(res.boon,()=&gt;`&lt;div style="${s(styles.bdDice)}${s(styles.boon)}"&gt;&lt;img style="${s(styles.bdImage)}" src="${image.boon}"&gt;&lt;/div&gt;`).join('')+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _.times(res.dispair,()=&gt;`&lt;div style="${s(styles.bdDice)}${s(styles.despair)}"&gt;&lt;img style="${s(styles.bdImage)}" src="${image.dispair}"&gt;&lt;/div&gt;`).join(''); &nbsp; &nbsp; &nbsp; &nbsp; }, &nbsp; &nbsp; &nbsp; &nbsp; formatDice = function(res){ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; let odd =(n)=&gt;n%2!==0; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return _.map(res.rolls, (r)=&gt;`&lt;div style="${s(styles.dice)}${odd(r) ? s(styles.diceOdd) : s(styles.diceEven) }"&gt;${r}&lt;/div&gt;`).join(''); &nbsp; &nbsp; &nbsp; &nbsp; }, &nbsp; &nbsp; &nbsp; &nbsp; replaceInlines = function(text,rolls){ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return _.chain(rolls) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .reduce(function(m,v,k){ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; m['$[['+k+']]']=v.results.total || 0; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return m; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; },{}) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .reduce(function(m,v,k){ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return m.replace(k,v); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; },text) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .value() &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; &nbsp; &nbsp; &nbsp; &nbsp; }; &nbsp; &nbsp; on('chat:message',function(msg){ &nbsp; &nbsp; &nbsp; &nbsp; if('api' === msg.type) { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; let match=msg.content.match(cmdregex); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if(match){ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; let who=(getObj('player',msg.playerid)||{get:()=&gt;'API'}).get('_displayname'), &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; cmds = msg.content.split(/\s+/), &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; difficulty = replaceInlines((cmds[1]||''),msg.inlinerolls), &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; rollIndex = ((cmds[2]||'').match(/\$\[\[(\d+)\]\]/)||[])[1], &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; content = replaceInlines(_.rest(cmds,3).join(' '),msg.inlinerolls), &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; valid = /-|\d+/.test(difficulty) && _.isNumber(parseInt(rollIndex)); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if(valid && _.has(msg,'inlinerolls')){ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; let results = getResults(msg.inlinerolls[rollIndex],difficulty), &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; output = `&lt;div style="${s(styles.body)}"&gt;`+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `&lt;div style="${s(styles.result)}${_.isBoolean(results.success) ? (results.success ? s(styles.resultSuccess) : s(styles.resultFailure)) : s(styles.resultUnknown) }"&gt;`+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (_.isBoolean(results.success) ? (results.success ? 'Success' : 'Failure') : results.counts.even ) + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `&lt;/div&gt;`+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `&lt;div&gt;${formatBDDice(results)}&lt;/div&gt;`+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `&lt;div&gt;${formatDice(results)}&lt;/div&gt;`+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (content.length ? `&lt;div style="${s(styles.content)}"&gt;${content}&lt;/div&gt;` : '') + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `&lt;/div&gt;`; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; switch(match[2]){ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case 'b': &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sendChat(msg.who, `/w gm `+ output ); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sendChat('',`/w "${who}" `+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `&lt;div style="${s(styles.body)}"&gt;`+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `&lt;div style="${s(styles.result)}"&gt;`+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `Blind to GM`+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `&lt;/div&gt;`+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (content.length ? `&lt;div style="${s(styles.content)}"&gt;${content}&lt;/div&gt;` : '') + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `&lt;/div&gt;` &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case 'w': &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sendChat(msg.who, `/w gm `+ output ); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sendChat('', `/w "${who}" `+ output ); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; default: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sendChat(msg.who, output ); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } else { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sendChat('',`/w "${who}" `+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `&lt;div style="${s(styles.body)}"&gt;`+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `&lt;div style="${s(styles.result)}${s(styles.resultUnknown)}"&gt;`+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `Help`+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `&lt;/div&gt;`+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `&lt;div style="${s(styles.content)}"&gt;`+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `&lt;div&gt;&lt;code&gt;!sly [Number or -] [Inline Roll] [Optional Content]&lt;/code&gt;&lt;/div&gt;`+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `&lt;div&gt;&lt;ul&gt;`+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `&lt;li&gt;&lt;code&gt;[Number or -]&lt;/code&gt; -- Use the difficulty number if you know it, or &lt;code&gt;-&lt;/code&gt; if you don't.&lt;/li&gt;`+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `&lt;li&gt;&lt;code&gt;[Inline Roll]&lt;/code&gt; -- Be sure to use dice with an even number of sides, and no addition (though nested inline rolls to determine the number of dice are fine.).&lt;/li&gt;`+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `&lt;li&gt;&lt;code&gt;[Optional Content]&lt;/code&gt; -- Anything after the first inline roll will be displayed below the results. You can use this to describe what action you are attempting, or add flavor text.&lt;/li&gt;`+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `&lt;/ul&gt;&lt;/div&gt;`+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `You can use &lt;code&gt;!wsly&lt;/code&gt; if you want only the GM and yourself to see the results, or &lt;code&gt;!bsly&lt;/code&gt; if your gm wants to be the only one who knows how you did.`+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `&lt;/div&gt;`+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `&lt;/div&gt;` &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; }); });
On point good sir! That is exactly what I meant! Everything looks beautiful, thank you thank you thank you!
1500514264
The Aaron
Pro
API Scripter
Cool. :). Enjoy!
Ty!&nbsp; Make sure to send me your email address, I'd love to send you a PDF copy to ya and run a game for you!
Say I wanted to insert a line break or 40 in the Optional Content. &nbsp;How would I do that?
1502390601
The Aaron
Pro
API Scripter
Make all checks payable to "The Aaron"... Probably I'd need to add some sort of marker like %%BR%% which would be replaced by the script with &lt;br&gt;.
1502392460
The Aaron
Pro
API Scripter
if you replace: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; content = replaceInlines(_.rest(cmds,3).join(' '),msg.inlinerolls), with &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; content = replaceInlines(_.rest(cmds,3).join(' '),msg.inlinerolls).replace(/%%BR%%/g,'&lt;BR&gt;'), it will swap out %%BR%% for &lt;BR&gt;
Works very well. Thanks!
1502398388
The Aaron
Pro
API Scripter
np! =D