If the above would work, here is a scriptlet to do that. Activate it to "fix" your turns by running the command: !fixto ...when you're ready. If you need to return the... um... turns... to their default state, you can run this command: !unfixto It's hot off the presses, so let me know if something isn't working correctly. If you want to change the names of the 2 teams, change lines 66 and 67. /* ========================================================= Name : TurnFixer GitHub : Roll20 Contact : timmaugh Version : 1.0.0 Last Update : 9/22/2023 ========================================================= */ var API_Meta = API_Meta || {}; API_Meta.TurnFixer = { offset: Number.MAX_SAFE_INTEGER, lineCount: -1 }; { try { throw new Error(''); } catch (e) { API_Meta.TurnFixer.offset = (parseInt(e.stack.split(/\n/)[1].replace(/^.*:(\d+):.*$/, '$1'), 10) - (12)); } } on('ready', () => { const getPageForPlayer = (playerid) => { let player = getObj('player', playerid); if (playerIsGM(playerid)) { return player.get('lastpage') || Campaign().get('playerpageid'); } let psp = Campaign().get('playerspecificpages'); if (psp[playerid]) { return psp[playerid]; } return Campaign().get('playerpageid'); }; const getToken = (info) => { return findObjs({ type: 'graphic', id: info })[0]; }; const isPlayerToken = (obj, pc = false) => { let players; if (!pc) { players = obj.get('controlledby') .split(/,/) .filter(s => s.length); if (players.includes('all') || players.filter((p) => !playerIsGM(p)).length) { return true; } } if ('' !== obj.get('represents')) { players = (getObj('character', obj.get('represents')) || { get: function () { return ''; } }) .get('controlledby') .split(/,/) .filter(s => s.length); return !!(players.includes('all') || players.filter((p) => !playerIsGM(p)).length); } return false; }; const isNPC = (obj) => { let players = ( obj.get('represents') && obj.get('represents').length ? getObj('character', obj.get('represents') || { get: function () { return ''; } }) : obj ) .get('controlledby').split(/,/) .filter(s => s.length && !playerIsGM(s)); return !players.length; }; on('chat:message', (msg) => { if ('api' !== msg.type) { return; } if (!/^!(fixto|unfixto)/i.test(msg.content)) { return; } let teamname = 'Good Guys'; let oppname = 'Opposition'; let to = JSON.parse(Campaign().get('turnorder') || '[]'); if (/^!fixto/i.test(msg.content)) { to.forEach(t => { if (t.id !== '-1') { t.origId = t.id; t.origCustom = t.custom; t.id = '-1'; let token = getToken(t.origId); if (token && isNPC(token)) { t.custom = oppname; } else if (token && isPlayerToken(token)) { t.custom = teamname; } } }); } else { to.forEach(t => { if (t.id === '-1') { t.id = t.origId || t.id; t.custom = t.origCustom || t.custom; let token = getToken(t.origId); } }); } Campaign().set('turnorder', JSON.stringify(to)); }); }); { try { throw new Error(''); } catch (e) { API_Meta.TurnFixer.lineCount = (parseInt(e.stack.split(/\n/)[1].replace(/^.*:(\d+):.*$/, '$1'), 10) - API_Meta.TurnFixer.offset); } }