The full-calc version of the RMSS sheet has sheet workers which do its version of that. Github for it is https://github.com/Roll20/roll20-character-sheets/tree/master/Rolemaster-Standard-System use the charsheet_RMSS_fullcalcs_RollTemplates.html file (along with the translation.json and charsheet_RMSS.css files) if you want to see it in action, but part of the relevant code is in the sheet worker section and looks like:
// <!-- Race Fixed Info (Stat, RR bonuses + Soul Departure/Recovery Multiplier) Setup -->
function RaceFixedInfoSetup(racialindex, index, currentval) {
mod = 0;
// console.log('/* ----------inside RaceFixedInfoSetup rank:'+racialindex+'------------ */');
if (racialindex == 10) { //-------Common Man-------
if (index == 1) {mod = 0;} //Ag
else if (index == 2) {mod = 0;} //Co
else if (index == 3) {mod = 0;} //Me
else if (index == 4) {mod = 0;} //Re
else if (index == 5) {mod = 2;} //SD
else if (index == 6) {mod = 0;} //Em
else if (index == 7) {mod = 0;} //In
else if (index == 8) {mod = 0;} //Pr
else if (index == 9) {mod = 0;} //Qu
else if (index == 10) {mod = 2;} //St
else if (index == 11) {mod = 0;} //Ess
else if (index == 12) {mod = 0;} //Chan
else if (index == 13) {mod = 0;} //Ment
else if (index == 14) {mod = 0;} //Poison
else if (index == 15) {mod = 0;} //Disease
else if (index == 16) {mod = 12;} //Soul Departure
else if (index == 17) {mod = 1;} //Recovery Multiplier
else if (index == 18) {mod = 2;} //Race Type for Stat Loss
else if (index == 19) {mod = 0;} //Bonus Exhaustion Points
} else if (racialindex == 11) { //-------Mixed Man-------
if (index == 1) {mod = 0;} //Ag
else if (index == 2) {mod = 2;} //Co
else if (index == 3) {mod = 0;} //Me
else if (index == 4) {mod = 0;} //Re
else if (index == 5) {mod = 2;} //SD
else if (index == 6) {mod = 2;} //Em
else if (index == 7) {mod = 0;} //In
else if (index == 8) {mod = 2;} //Pr
else if (index == 9) {mod = 0;} //Qu
else if (index == 10) {mod = 2;} //St
else if (index == 11) {mod = 0;} //Ess
else if (index == 12) {mod = 0;} //Chan
else if (index == 13) {mod = 0;} //Ment
else if (index == 14) {mod = 0;} //Poison
else if (index == 15) {mod = 0;} //Disease
else if (index == 16) {mod = 11;} //Soul Departure
else if (index == 17) {mod = 0.9;} //Recovery Multiplier
else if (index == 18) {mod = 2;} //Race Type for Stat Loss
else if (index == 19) {mod = 0;} //Bonus Exhaustion Points
} else if (racialindex == 12) { //-------High Man-------
if (index == 1) {mod = -2;} //Ag
else if (index == 2) {mod = 4;} //Co
else if (index == 3) {mod = 0;} //Me
else if (index == 4) {mod = 0;} //Re
else if (index == 5) {mod = 0;} //SD
else if (index == 6) {mod = 0;} //Em
else if (index == 7) {mod = 0;} //In
else if (index == 8) {mod = 4;} //Pr
else if (index == 9) {mod = -2;} //Qu
else if (index == 10) {mod = 4;} //St
else if (index == 11) {mod = -5;} //Ess
else if (index == 12) {mod = -5;} //Chan
else if (index == 13) {mod = -5;} //Ment
else if (index == 14) {mod = 0;} //Poison
else if (index == 15) {mod = 0;} //Disease
else if (index == 16) {mod = 10;} //Soul Departure
else if (index == 17) {mod = 0.75;} //Recovery Multiplier
else if (index == 18) {mod = 2;} //Race Type for Stat Loss
else if (index == 19) {mod = 0;} //Bonus Exhaustion Points
// ******* additional Code Snipped for length.... ********
} else if (racialindex == 52) { //-------None; Reset to zero-------
if (index == 1) {mod = 0;} //Ag
else if (index == 2) {mod = 0;} //Co
else if (index == 3) {mod = 0;} //Me
else if (index == 4) {mod = 0;} //Re
else if (index == 5) {mod = 0;} //SD
else if (index == 6) {mod = 0;} //Em
else if (index == 7) {mod = 0;} //In
else if (index == 8) {mod = 0;} //Pr
else if (index == 9) {mod = 0;} //Qu
else if (index == 10) {mod = 0;} //St
else if (index == 11) {mod = 0;} //Ess
else if (index == 12) {mod = 0;} //Chan
else if (index == 13) {mod = 0;} //Ment
else if (index == 14) {mod = 0;} //Poison
else if (index == 15) {mod = 0;} //Disease
else if (index == 16) {mod = 0;} //Soul Departure
else if (index == 17) {mod = 0;} //Recovery Multiplier
else if (index == 18) {mod = 0;} //Race Type for Stat Loss
else if (index == 19) {mod = 0;} //Bonus Exhaustion Points
} else if (racialindex == 1) {mod = currentval;} //------Custom------
// console.log('/* ----------leaving RaceFixedInfoSetup mod:'+mod+'------------ */');
return mod;
}
it is called further down by:
// <!---- Update Body Dev progression,Racial bonuses for RR's and Stats etc when racialindex changes.---->
on("change:racialindex change:racialcalc", function() {
getAttrs(["racialindex", "bodydevprog0", "bodydevprog10", "bodydevprog20", "bodydevprog30", "bodydevprog31", "agracial", "coracial", "meracial", "reracial", "sdracial", "emracial", "inracial", "prracial", "quracial", "stracial", "esssaverace", "chansaverace", "mentsaverace", "poisonsaverace", "diseasesaverace", "souldepart", "recoverymult", "racialnotes", "racialcalc", "racetypeforstatloss", "exhaustmiscbonus"], function(values) {
// console.log('/* ---------- can we set up racial bonuses?------------ */');
if (parseInt(values.racialcalc) == 1){
// console.log('/* ---------- racial calc is 1; setup racialbonuses etc!------------ */');
setAttrs({
bodydevprog0: BodyDevProgMod(parseInt(values.racialindex,10), 0, parseInt(values.bodydevprog0,10)),
bodydevprog10: BodyDevProgMod(parseInt(values.racialindex,10), 10, parseInt(values.bodydevprog10,10)),
bodydevprog20: BodyDevProgMod(parseInt(values.racialindex,10), 20, parseInt(values.bodydevprog20,10)),
bodydevprog30: BodyDevProgMod(parseInt(values.racialindex,10), 30, parseInt(values.bodydevprog30,10)),
bodydevprog31: BodyDevProgMod(parseInt(values.racialindex,10), 31, parseInt(values.bodydevprog31,10)),
agracial: RaceFixedInfoSetup(parseInt(values.racialindex,10), 1, parseInt(values.agracial,10)),
coracial: RaceFixedInfoSetup(parseInt(values.racialindex,10), 2, parseInt(values.coracial,10)),
meracial: RaceFixedInfoSetup(parseInt(values.racialindex,10), 3, parseInt(values.meracial,10)),
reracial: RaceFixedInfoSetup(parseInt(values.racialindex,10), 4, parseInt(values.reracial,10)),
sdracial: RaceFixedInfoSetup(parseInt(values.racialindex,10), 5, parseInt(values.sdracial,10)),
emracial: RaceFixedInfoSetup(parseInt(values.racialindex,10), 6, parseInt(values.emracial,10)),
inracial: RaceFixedInfoSetup(parseInt(values.racialindex,10), 7, parseInt(values.inracial,10)),
prracial: RaceFixedInfoSetup(parseInt(values.racialindex,10), 8, parseInt(values.prracial,10)),
quracial: RaceFixedInfoSetup(parseInt(values.racialindex,10), 9, parseInt(values.quracial,10)),
stracial: RaceFixedInfoSetup(parseInt(values.racialindex,10), 10, parseInt(values.stracial,10)),
esssaverace: RaceFixedInfoSetup(parseInt(values.racialindex,10), 11, parseInt(values.esssaverace,10)),
chansaverace: RaceFixedInfoSetup(parseInt(values.racialindex,10), 12, parseInt(values.chansaverace,10)),
mentsaverace: RaceFixedInfoSetup(parseInt(values.racialindex,10), 13, parseInt(values.mentsaverace,10)),
poisonsaverace: RaceFixedInfoSetup(parseInt(values.racialindex,10), 14, parseInt(values.poisonsaverace,10)),
diseasesaverace: RaceFixedInfoSetup(parseInt(values.racialindex,10), 15, parseInt(values.diseasesaverace,10)),
souldepart: RaceFixedInfoSetup(parseInt(values.racialindex,10), 16, parseInt(values.souldepart,10)),
recoverymult: RaceFixedInfoSetup(parseInt(values.racialindex,10), 17, parseInt(values.recoverymult,10)),
racetypeforstatloss: RaceFixedInfoSetup(parseInt(values.racialindex,10), 18, parseInt(values.racetypeforstatloss,10)),
exhaustmiscbonus: RaceFixedInfoSetup(parseInt(values.racialindex,10), 19, parseInt(values.exhaustmiscbonus,10))
});
}
});
// console.log('/* ---------- exiting set up racial bonuses call------------ */');
});
There may be more efficient ways of doing this (I am not the best programmer) but it does work.
Basically in this I am changing which racial bonuses are applied to a variety of sections when the race changes.
edit: some wording.