Just in time for an updated version from me. =D
Code:
// Add Invisible CustomTurn
// By: The Aaron, Arcane Scriptomancer
// Contact: https://app.roll20.net/users/104025/the-aaron
var API_Meta = API_Meta||{}; //eslint-disable-line no-var
API_Meta.AddInvisibleCustomTurn={offset:Number.MAX_SAFE_INTEGER,lineCount:-1};
{try{throw new Error('');}catch(e){API_Meta.AddInvisibleCustomTurn.offset=(parseInt(e.stack.split(/\n/)[1].replace(/^.*:(\d+):.*$/,'$1'),10)-6);}}
on('ready',() => {
const version = '0.1.2';
API_Meta.AddInvisibleCustomTurn.version = version;
const aictImgSrc = "https://s3.amazonaws.com/files.d20.io/images/58732795/pfn3AoNw630KlzHP0dGMWw/thumb.png?1532188342";
const activeAICTs =(()=>{
const aictRegex = new RegExp(`images/58732795/pfn3AoNw630KlzHP0dGMWw/`);
const toIds = JSON.parse(Campaign().get('turnorder')||'[]').map(to=>to.id);
return findObjs({type:'graphic',layer:'gmlayer'})
.filter((t)=>aictRegex.test(t.get('imgsrc')))
.filter((()=>{
return t => {
if( ! toIds.includes(t.id)){
t.remove();
return false;
}
return true;
};
})())
.reduce((m,t)=>({...m,[t.id]:t.get('bar1_value')}),{});
})();
const getPageForPlayer = (playerid) => {
let player = getObj('player',playerid);
if(playerIsGM(playerid)){
return player.get('lastpage');
}
let psp = Campaign().get('playerspecificpages');
if(psp[playerid]){
return psp[playerid];
}
return Campaign().get('playerpageid');
};
let lastTurnCache = '';
const checkFormulaOnTurn = _.debounce(() => {
let to=JSON.parse(Campaign().get('turnorder')||'[]');
if(to.length){
if(to[0].id!==lastTurnCache && activeAICTs.hasOwnProperty(to[0].id)) {
sendChat('',`[[${to[0].pr}+(${activeAICTs[to[0].id]||0})]]`,(r)=>{
to[0].pr=r[0].inlinerolls[0].results.total;
Campaign().set('turnorder',JSON.stringify(to));
});
}
lastTurnCache = to[0].id;
}
},10);
const processInlinerolls = (msg) => {
if(msg.hasOwnProperty('inlinerolls')){
return msg.inlinerolls
.reduce((m,v,k) => {
let ti=v.results.rolls.reduce((m2,v2) => {
if(v2.hasOwnProperty('table')){
m2.push(v2.results.reduce((m3,v3) => [...m3,(v3.tableItem||{}).name],[]).join(", "));
}
return m2;
},[]).join(', ');
return [...m,{k:`$[[${k}]]`, v:(ti.length && ti) || v.results.total || 0}];
},[])
.reduce((m,o) => m.replace(o.k,o.v), msg.content);
} else {
return msg.content;
}
};
on('chat:message',function(msg){
if('api' === msg.type) {
if(msg.content.match(/^!aict\b/) ){
let who=(getObj('player',msg.playerid)||{get:()=>'API'}).get('_displayname');
let content = processInlinerolls(msg);
let args = content
.replace(/<br\/>\n/g, ' ')
.replace(/(\{\{(.*?)\}\})/g," $2 ")
.split(/\s+--/);
let cmds = args.shift().split(/\s+/);
let change = parseFloat(cmds[1]);
change = ( isNaN(change) ? '+1': change );
change = `${/^[+-]\d/.test(change)?'':'+'}${change}`;
let initial = parseFloat(cmds[2])||0;
let entry = args.join(' ');
if(entry.length){
let to=JSON.parse(Campaign().get('turnorder')||'[]');
let pageid = getPageForPlayer(msg.playerid);
let token = createObj('graphic', {
subtype: 'token',
imgsrc: aictImgSrc,
pageid: pageid,
layer: 'gmlayer',
top: -100,
left: -100,
width: 70,
height: 70,
name: entry,
showname: true,
bar1_value: change
});
activeAICTs[token.id] = change;
to.unshift({
id: token.id,
pr: initial,
_pageid: pageid,
custom:''
});
Campaign().set('turnorder',JSON.stringify(to));
if(!playerIsGM(msg.playerid)){
sendChat('AICT',`/w gm <div style="padding:1px 3px;border: 1px solid #8B4513;background: #eeffee; color: #8B4513; font-size: 80%;"><div style="background-color: #ffeeee;"><b>${who}</b> added entry for <b>${entry}</b> starting at <b>${initial}</b> and changing by <b>${change}</b>.</div></div>`);
}
} else {
sendChat('AICT',`/w "${who}" <div style="padding:1px 3px;border: 1px solid #8B4513;background: #eeffee; color: #8B4513; font-size: 80%;"><div style="background-color: #ffeeee;">Use <b><pre>!aict [formula] [starting value] --[description]</pre></b></div></div>`);
}
} else if(msg.content.match(/^!eot/i)){
_.defer(checkFormulaOnTurn);
}
}
});
on('change:campaign:turnorder',()=>{
_.defer(checkFormulaOnTurn);
});
});
{try{throw new Error('');}catch(e){API_Meta.AddInvisibleCustomTurn.lineCount=(parseInt(e.stack.split(/\n/)[1].replace(/^.*:(\d+):.*$/,'$1'),10)-API_Meta.AddInvisibleCustomTurn.offset);}}