I switched from Shaped to Roll20 sheet earlier this year because I felt that the sheet was headed toward future compatibility issues (like above), and my players preferred the simplicity and Charactermancer integration—I greatly prefer Shaped personally. I had to pretty much rebuild everything. I do have a script that the Aaron pieced together out of arcane bits that will at least go through and convert abilities to use the OGL roll templates instead of Shaped, at least for the simple stuff (mostly chat macros—the combat roll templates won't work.) Select the character token of the one you want to convert and enter !swap-templates into chat. Work with test characters first, of course. on('ready',()=>{
const regex = {
template: /{template:/,
shapedTemplate: /^5e-shaped}/,
title: /{{title=/g,
text: /{{(?:text|text_big)=/g
};
const translateTemplates = a => {
let text = a.get('action');
if( regex.template.test(text)){
let parts = text.split(regex.template);
text = parts.map(p=>{
if(regex.shapedTemplate.test(p)){
return (p
.replace(regex.shapedTemplate,'npcaction}')
.replace(regex.title,'{{rname=')
.replace(regex.text,'{{description=')
);
}
return p;
})
.join('{template:');
a.set({
action: text
});
}
};
const changeAbilities = c => findObjs({
type: 'ability',
characterid: c.id
}).forEach(translateTemplates);
on('chat:message', msg=>{
if('api' === msg.type && /^!swap-templates?\b/i.test(msg.content) && playerIsGM(msg.playerid)){
msg.selected
.map(o=>getObj('graphic',o._id))
.filter(g=>undefined !== g)
.map(t=>getObj('character',t.get('represents')))
.filter(c=>undefined !== c)
.map(c=>{
sendChat('',`/w gm Adjusting Abilities for: <code>${c.get('name')}</code>`);
return c;
})
.forEach(changeAbilities)
;
}
});
});