I have some helper functions you might like: // eslint-disable no-unused-vars
const getActivePages = () => [...new Set([
Campaign().get('playerpageid'),
...Object.values(Campaign().get('playerspecificpages')),
...findObjs({
type: 'player',
online: true
})
.filter((p)=>playerIsGM(p.id))
.map((p)=>p.get('lastpage'))
])
];
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 getPlayersOnPage = (pageid) => {
let pages = {};
let ribbonPage = Campaign().get('playerpageid');
let psp = Campaign().get('playerspecificpages');
findObjs({type:'player'})
.forEach(p=>{
if(playerIsGM(p.id)){
const lp = p.get('lastpage') || Campaign().get('playerpageid');
pages[lp]=pages[lp]||[];
pages[lp].push(p.id);
} else if(psp.hasOwnProperty(p.id)){
pages[psp[p.id]]=pages[psp[p.id]]||[];
pages[psp[p.id]].push(p.id);
} else {
pages[ribbonPage]=pages[ribbonPage]||[];
pages[ribbonPage].push(p.id);
}
});
if(pageid){
return pages[pageid]||[];
}
return pages;
};
const getGMPlayers = (pageid) => findObjs({type:'player'})
.filter((p)=>playerIsGM(p.id))
.filter((p)=>undefined === pageid || p.get('lastpage') === pageid)
.map(p=>p.id)
;
The GM's page is actually on the player object for them. It's a bit strange, but it make some sense based on how GMs are handled, and where the data is being collected. I agree with you about the initiativepage property having changed at some point. In practice, it kind of doesn't matter as you can have multiple pages's tokens in the turn order simultaneously, so the page id for the turn order is really the subset of pages for all the tokens in the turn order.