I've rejiggified the way the macro is put together, just for testing - it's now in a looped template literal so it's extremely easy to make future changes. It's just the player macros, and currently just outputs to Console so you can copy paste into chat. It has inline labels for everything and the global field is working. Let me know what you think and I can do the NPC ones and see if Keith is keen to update the script. Reliable Talent is the only thing not working. I've got a slightly broken version working (there's an extra 3d die roll for single rolls), and think I'm going to have to admit defeat on that one - happy to throw it in here if anyone wants to test it though. It would be a separate macro (very easy to do with the looped template literal) so it would only affect rogues. Added bonus of the global field applying to straight-up Ability Checks, which the official sheet doesn't do. I've probably whined about that enough though. Anyway, just uncomment one of the bottom 2 lines to generate the macro to console (regular console.... remove the "console." as well for API console, obviously): let skillLabels = ['Acrobatics','Animal Handling','Arcana','Athletics','Deception','History','Insight','Intimidation','Investigation','Medicine','Nature','Perception','Performance','Persuasion','Religion','Sleight Of Hand','Stealth','Survival']; let skillArray = skillLabels.map(a => a.replace(/\s/g,'_')) let abilityArray = ['Strength','Dexterity','Constitution','Intelligence','Wisdom','Charisma']; let skillMacroArray = []; let abilityMacroArray = []; let saveMacroArray = []; // player ability checks for (i=0; i < skillArray.length; i++) { skillMacroArray.push(`|${skillLabels[i]}, +@{selected|${skillArray[i]}_bonus}@{selected|pbd_safe}[${(skillLabels[i]+' ').slice(0,skillLabels[i].indexOf(' '))}]]]&#125;&#125; {{rname=${skillLabels[i]}&#125;&#125; {{mod=@{selected|${skillArray[i]}_bonus}&#125;&#125; {{r1=[[ @{selected|d20} + @{selected|${skillArray[i]}_bonus}@{selected|pbd_safe}[${(skillLabels[i]+' ').slice(0,skillLabels[i].indexOf(' '))}]]]`) } for (i=0; i < abilityArray.length; i++) { abilityMacroArray.push(`|${abilityArray[i]}, +@{selected|${abilityArray[i]}_mod}@{selected|jack_attr}[${abilityArray[i].slice(0,3).toUpperCase()}]]]&#125;&#125; {{rname=${abilityArray[i]}&#125;&#125; {{mod=@{selected|${abilityArray[i]}_mod}@{selected|jack_bonus}&#125;&#125; {{r1=[[ @{selected|d20} + @{selected|${abilityArray[i]}_mod}@{selected|jack_attr}[${abilityArray[i].slice(0,3).toUpperCase()}]]]`); } let pcAbilityMacro = `@{selected|wtype}&{template:simple} @{selected|rtype}?{Ability${skillMacroArray.join('')}${abilityMacroArray.join('')}}}} {{global=@{selected|global_skill_mod}}} @{selected|charname_output}` // player saves for (i=0; i < abilityArray.length; i++) { saveMacroArray.push(`|${abilityArray[i]}, +@{selected|${abilityArray[i]}_save_bonus}@{selected|pbd_safe}[${abilityArray[i].slice(0,3).toUpperCase()} SAVE]]]&#125;&#125; {{rname=${abilityArray[i]} Save&#125;&#125 {{mod=@{selected|${abilityArray[i]}_save_bonus}&#125;&#125; {{r1=[[@{selected|d20}+@{selected|${abilityArray[i]}_save_bonus}@{selected|pbd_safe}[${abilityArray[i].slice(0,3).toUpperCase()} SAVE]]]`); } let pcSaveMacro = `@{selected|wtype}&{template:simple} @{selected|rtype}?{Saving Throw${saveMacroArray.join('')}}}} {{global=@{selected|global_save_mod}}} @{selected|charname_output}` //console.log(pcAbilityMacro); //console.log(pcSaveMacro); Anyways, if anyone feels like making sure I didn't break anything, that would be handy!