I am pretty ignorant of scripts in general. Everything that follows has come from direct suggestions from the forums, or copying something I have seen from the wiki or forum and tinkering until it works. <script type="text/worker"> on("change:ps sheet:opened", function () { getAttrs(['ps'], function (values) { const ps = parseInt(values['ps'])||0; const modifier = ps*20; setAttrs({ lift: modifier }); }); }); on("change:ps sheet:opened", function () { getAttrs(['ps'], function (values) { const ps = parseInt(values['ps'])||0; const modifier = ps*10; setAttrs({ carry: modifier }); }); }); on("change:pe sheet:opened", function () { getAttrs(['pe'], function (values) { const pe = parseInt(values['pe'])||0; const modifier = pe; setAttrs({ carry_max: modifier }); }); }); on("change:pe sheet:opened", function () { getAttrs(['pe'], function (values) { const pe = parseInt(values['pe'])||0; const modifier = pe; setAttrs({ run_max: modifier }); }); }); on("change:spd sheet:opened", function () { getAttrs(['spd'], function (values) { const spd = parseInt(values['spd'])||0; const modifier = spd*15; setAttrs({ run_melee: modifier }); }); }); on("change:spd sheet:opened", function () { getAttrs(['spd'], function (values) { const spd = parseInt(values['spd'])||0; const modifier = Math.round(spd*.68); setAttrs({ run_mph: modifier }); }); }); on("change:spd change:hth_numberattacks sheet:opened", function () { getAttrs(['spd','hth_numberattacks'], function (values) { const spd = parseInt(values['spd'])||0; const hth_numberattacks = parseInt(values['hth_numberattacks'])||0; const modifier = Math.round((spd/hth_numberattacks)*15); setAttrs({ run_attack: modifier }); }); }); function maMod(score) { let bonus = 0; if (score >= 30) bonus = 97; else if (score >= 29) bonus = 96; else if (score >= 28) bonus = 94; else if (score >= 27) bonus = 92; else if (score >= 26) bonus = 88; else if (score >= 25) bonus = 84; else if (score >= 16) bonus = Math.floor(score-8)*5; return bonus; }; on("change:ma sheet:opened", function () { getAttrs(['ma'], function (values) { let ma = parseInt(values['ma'])||0; let invoke_trust = maMod(ma); setAttrs({ invoke_trust: invoke_trust }); }); }); function psMod(score) { let bonus = 0; if (score >= 16) bonus = Math.round(score-15)*1; return bonus; }; on("change:ps sheet:opened", function () { getAttrs(['ps'], function (values) { let ps = parseInt(values['ps'])||0; let ps_bonus = psMod(ps); setAttrs({ ps_bonus: ps_bonus }); }); }); function ppMod(score) { let bonus = 0; if (score >= 16) bonus = Math.round((score-15)*.5); return bonus; }; on("change:pp sheet:opened", function () { getAttrs(['pp'], function (values) { let pp = parseInt(values['pp'])||0; let pp_bonus = ppMod(pp); setAttrs({ pp_bonus: pp_bonus }); }); }); function pbMod(score) { let bonus = 0; if (score >= 30) bonus = 92; else if (score >= 29) bonus = 90; else if (score >= 28) bonus = 87; else if (score >= 27) bonus = 84; else if (score >= 16) bonus = Math.floor(score-10)*5; return bonus; }; on("change:pb sheet:opened", function () { getAttrs(['pb'], function (values) { let pb = parseInt(values['pb'])||0; let charm_impress = pbMod(pb); setAttrs({ charm_impress: charm_impress }); }); }); </script> This all works, but when I read suggestions in the wiki that the sheet workers should only acquire values from the sheet once and all calculations should work from that one pull, I get thinking this probably isn't the best setup. Anyone have some suggestions for making this more streamlined? Or should I just leave it as it is since it works?