The generated initiative will usually be for the players. Buuut GM custom turns would be great for ennemies if you have the script available. (Something like !actnpc) Right now I have slightly modified the code using my javascript "skills" so that when an item already exists, it updates the item rather than create a new one with the same name on('ready',() => { const checkFormulaOnTurn = () => { let to=JSON.parse(Campaign().get('turnorder')||'[]'); if(to.length && to[0].id==='-1'){ sendChat('',`[[${to[0].pr}+(${to[0].formula||0})]]`,(r)=>{ to[0].pr=r[0].inlinerolls[0].results.total; Campaign().set('turnorder',JSON.stringify(to)); }); } }; on('chat:message',(msg) => { if('api' === msg.type) { if(msg.content.match(/^!act\b/) ){ let who=(getObj('player',msg.playerid)||{get:()=>'API'}).get('_displayname'); if(_.has(msg,'inlinerolls')){ msg.content = _.chain(msg.inlinerolls) .reduce((m,v,k) => { let ti=_.reduce(v.results.rolls,(m2,v2) => { if(_.has(v2,'table')){ m2.push(_.reduce(v2.results,(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((m,v,k) => { return m.replace(k,v); },msg.content) .value(); } let args = msg.content .replace(/<br\/>\n/g, ' ') .replace(/(\{\{(.*?)\}\})/g," $2 ") .split(/\s+--/); let cmds=args.shift().split(/\s+/); let change=parseFloat(cmds[1]); change = Number.isNaN(change) ? '+1' : change; change = `${/^[+-]\d/.test(change)?'':'+'}${change}`; let initial = parseFloat(cmds[2])||0; let myvar = parseFloat(cmds[3])||0; let entry = args.join(' '); let replace_index = -1; let old_val = 0; let i1 = parseInt(initial, 10); let new_val = i1; if(entry.length){ let to=JSON.parse(Campaign().get('turnorder')||'[]'); to.forEach(function (item, index) { log(item); if (item["custom"]===entry) { replace_index=index; } if (item["custom"]==="") { //matchingTokens = filterObjs(function(obj) { // return ((obj.get("id")===item["id"]) && (obj.get("_subtype")==="token")); //}); //log(matchingTokens); matchingTokens = findObjs({ _id: item["id"], _type: "graphic", _subtype: "token", }); if (matchingTokens.length) { replace_index=index; } } }); if (replace_index == -1) { to.unshift({ id: "-1", pr: initial, custom: entry, formula: change }); } else { var i2 = parseInt(to[replace_index]["pr"],10); old_val = i2; new_item = to[replace_index]; if (myvar != 0) { new_val = i1+i2; } new_item["pr"] = new_val; to[replace_index] = new_item } Campaign().set('turnorder',JSON.stringify(to)); if(!playerIsGM(msg.playerid)){ sendChat('ACT',`/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> sur <b>${entry}</b> : <b>${old_val}</b> devient <b>${new_val}</b>.</div></div>`); } } else { sendChat('ACT',`/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>!act [formula] [starting value] --[description]</pre></b></div></div>`); } } else if(msg.content.match(/^!eot/i)){ _.defer(checkFormulaOnTurn); } } }); }); Small edit : I glanced at the AICT script, but the token generation doesn't seem to work ? Second edit : Updated my script to match what I currently use. Now it also updates if a tracker was created using a token.