 
 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?  
 
				
			