With a quick look at the sheet's code on roll20's repo , I'm thinking that this snippet of code (line 8468 and 8929) may handle the ability mod calcs. // line 8468 var update_mod = function(attr) { getAttrs([attr], function(v) { var attr_abr = attr.substring(0, 3); var finalattr = v[attr] && isNaN(v[attr]) === false ? Math.floor((parseInt(v[attr], 10) - 10) / 2) : 0; var update = {}; update[attr + "_mod"] = finalattr; update["npc_" + attr_abr + "_negative"] = v[attr] && !isNaN(v[attr]) && parseInt(v[attr], 10) < 10 ? 1 : 0; setAttrs(update); }); }; // line 8929 var parseValues = function(uses_string) { var attribs = ["strength", "dexterity", "constitution", "wisdom", "intelligence", "charisma"]; uses_string = uses_string ? uses_string.toLowerCase() : ""; _.each(attribs, function(attrib) { var attribMod = Math.floor((parseInt(currentData[attrib + "_base"]) - 10) / 2); if (attribMod < 0 || isNaN(attribMod)) attribMod = 0; uses_string = uses_string.replace(attrib, attribMod); }); uses_string = uses_string.replace(/half_level/g, Math.floor(classlevel / 2)); return uses_string.replace(/level/g, classlevel); }; That said, someone that is more familiar with the sheet and/or javascript will probably have to assist beyond this point. ;-)