How about this: Script: on('ready',()=>{
const sread = (o,p) => {
let v = o;
while(undefined !== v && p.length) {
v = v[p.shift()];
}
return v;
};
const css = (o)=>Object.keys(o).reduce((m,k)=>`${m}${k}:${o[k]};`,'');
const s = {
box: css({
["line-height"] : "1em",
["display"] : "inline",
["background-color"] : "#4973CB",
["color"] : "#99B3EB",
["font-weight"] : "bold",
["border-bottom"] : "2px solid #0F3DA0",
["border-top"] : "4px solid #0F3DA0",
["font-variant"] : "small-caps",
["left"] : "0em",
["position"] : "absolute",
["padding-left"] : "5em",
["width"] : "100%",
["z-index"] : "100000"
}),
die: css({
["display"] : "inline-block",
["border"] : "1px solid #999",
["background-color"] : "white",
["padding"] : ".2em",
["border-radius"] : "1em",
["min-width"] : "1.2em",
["text-align"] : "center"
}),
highlight: css({
["color"] : "#0F3DA0"
}),
subdued: css({
["color"] : "#99B3EB",
["background-color"] : "#6B8FDB"
})
};
const f = {
box: (t) => `<div style="${s.box}">${t}</div>`,
die: (n,is) => `<span style="${s.die}${is?s.highlight:s.subdued}">${n}</span>`
};
on('chat:message',msg=>{
if(['general','whisper'].includes( msg.type) && ['npcatk','atk'].includes(msg.rolltemplate)){
if(msg.inlinerolls){
let rtf = msg.content
.replace(/^.*?{{/,'')
.split(/{{/)
.map(t=>t.replace(/}}.*$/,''))
.reduce((m,t)=>({...m,[t.replace(/=.*$/,'')]:t.replace(/^[^=]*=/,'')}),{});
let r1i = parseInt(rtf.r1.replace(/[^0-9]/g,''));
let r2i = parseInt(rtf.r2.replace(/[^0-9]/g,''));
let r1 = sread(msg.inlinerolls,[r1i,'results','rolls',0,'results',0,'v'])||0;
let r2 = sread(msg.inlinerolls,[r2i,'results','rolls',0,'results',0,'v'])||0;
if([18,19].includes(r1) ||[18,19].includes(r2)){
let w='';
if('whisper'===msg.type){
w =`/w "${msg.target_name}" `;
}
sendChat('',`${w}${f.box(`Possible Critical (${f.die(r1,[18,19].includes(r1))},${f.die(r2,[18,19].includes(r2))})`)}`);
}
}
}
});
});