Sorry, I should have pointed out the errant quote's location instead of being mysterious about it. 'co' is one of the const values, and it's the 'on change' trigger. There is another sheet worker that determines the co_norm value, and another that determines the co_race value. The co_back is value is manually provided by the user. So, with those determined, the goal is to make it so that when 'co' is changed, it triggers the script to update co_bonus. This has made me realize that the co_bonus value needs to be updated anytime co_norm, co_race or co_back are changed, rather than when co is changed, since not every step of change to a stat's raw value changes it's bonus. Here are my worker scripts. Can I just jam all these into one script section? I'm not really sure how the logic would work out trying to combine them. <script type="text/worker"> //Normal Stat Bonus Calculator
const int = score => parseInt(score, 10) || 0;
// Auto-calculates & updates 'Stat Bonus' based on changes to corresponding 'Base Stat',
// If the Base stat is less than 20, the sheet sets the bonus to "-2"
const stats = ["co", "ag", "sd", "me", "re", "st", "qu", "pr", "em", "in"];
stats.forEach(stat => {
on(`change:${stat}`, () => {
getAttrs([stat], values => {
const stat_base = int(values[stat]);
console.log(stat_base);
let stat_norm = 0;
if (stat_base >= 103) stat_bonus = "35";
else if (stat_base >= 102) stat_norm = "35";
else if (stat_base >= 101) stat_norm = "30";
else if (stat_base >= 100) stat_norm = "25";
else if (stat_base >= 98) stat_norm = "20";
else if (stat_base >= 96) stat_norm = "15";
else if (stat_base >= 90) stat_norm = "10";
else if (stat_base >= 75) stat_norm = "5";
else if (stat_base >= 20) stat_norm = "0";
else stat_norm = "-2";
setAttrs({
[`${stat}_norm`]: stat_norm
});
});
});
});
</script>
<script type="text/worker"> //Race stat bonus table
on("change:race sheet:opened", function () {
getAttrs(['race'], function(values) {
const races = {
'Human': {st_race: 5, qu_race: 0, pr_race: 0, in_race: 0, em_race: 0, co_race: 0, ag_race: 0, sd_race: 5, me_race: 0, re_race: 0, hitdietype: 'd8'},
'Neo-Human': {st_race: 5, qu_race: 5, pr_race: 5, in_race: 5, em_race: 5, co_race: 5, ag_race: 5, sd_race: 5, me_race: 5, re_race: 5, hitdietype: 'd8'},
'Humanoid I': {st_race: 10, qu_race: 0, pr_race: -10, in_race: 0, em_race: 0, co_race: 10, ag_race: -5, sd_race: -15, me_race: -5, re_race: -5, hitdietype: 'd10'},
'Humanoid II': {st_race: -10, qu_race: 10, pr_race: -5, in_race: 0, em_race: 0, co_race: 0, ag_race: 10, sd_race: -20, me_race: 0, re_race: 0, hitdietype: 'd10'},
'Humanoid III': {st_race: -10, qu_race: 0, pr_race: 0, in_race: 10, em_race: 10, co_race: -5, ag_race: 0, sd_race: -5, me_race: 5, re_race: 10, hitdietype: 'd8'},
'Transhuman I': {st_race: 20, qu_race: -5, pr_race: 10, in_race: 0, em_race: -10, co_race: 20, ag_race: -5, sd_race: -5, me_race: -5, re_race: -10, hitdietype: 'd10+1'},
'Transhuman II': {st_race: 0, qu_race: 15, pr_race: -5, in_race: 15, em_race: -5, co_race: -5, ag_race: 20, sd_race: -5, me_race: 10, re_race: 5, hitdietype: 'd10'},
'Transhuman III': {st_race: -5, qu_race: 0, pr_race: 0, in_race: 5, em_race: 0, co_race: -5, ag_race: 0, sd_race: -5, me_race: 15, re_race: 15, hitdietype: 'd8'},
'Transhuman IV': {st_race: -5, qu_race: -5, pr_race: 5, in_race: 5, em_race: 5, co_race: -5, ag_race: 0, sd_race: 30, me_race: 5, re_race: -10, hitdietype: 'd8'},
'Transhuman V': {st_race: 15, qu_race: 15, pr_race: 15, in_race: 10, em_race: 0, co_race: 20, ag_race: 15, sd_race: 5, me_race: 15, re_race: 10, hitdietype: 'd10+1'},
'Transhuman VI': {st_race: 10, qu_race: 10, pr_race: 10, in_race: 10, em_race: 5, co_race: 10, ag_race: 10, sd_race: 20, me_race: 10, re_race: 10, hitdietype: 'd10'},
'Transhuman VII': {st_race: 25, qu_race: 15, pr_race: 15, in_race: -5, em_race: 5, co_race: 25, ag_race: 15, sd_race: 10, me_race: 0, re_race: -5, hitdietype: 'd10+2'},
'Transhuman VIII': {st_race: 10, qu_race: 5, pr_race: 5, in_race: 10, em_race: 15, co_race: 0, ag_race: 10, sd_race: 15, me_race: 5, re_race: 10, hitdietype: 'd10'},
'Transhuman IX': {st_race: 5, qu_race: 0, pr_race: 10, in_race: 20, em_race: 20, co_race: 0, ag_race: 0, sd_race: 30, me_race: 30, re_race: 20, hitdietype: 'd8'},
'Transhuman X': {st_race: 5, qu_race: 10, pr_race: 5, in_race: 30, em_race: 0, co_race: 5, ag_race: 20, sd_race: 5, me_race: 15, re_race: 20, hitdietype: 'd8'},
'Transhuman XI': {st_race: 5, qu_race: 10, pr_race: 0, in_race: 20, em_race: 10, co_race: 5, ag_race: 5, sd_race: 10, me_race: 25, re_race: 15, hitdietype: 'd8'},
'Transhuman XII': {st_race: 15, qu_race: 10, pr_race: 15, in_race: 5, em_race: 10, co_race: 20, ag_race: 10, sd_race: 20, me_race: 15, re_race: 10, hitdietype: 'd10+1'},
'Replicant Type I': {st_race: 20, qu_race: 20, pr_race: 0, in_race: 0, em_race: 0, co_race: 10, ag_race: 20, sd_race: -10, me_race: 0, re_race: 0, hitdietype: 'd10+2'},
'Replicant Type II': {st_race: 0, qu_race: 0, pr_race: -10, in_race: -5, em_race: 20, co_race: 0, ag_race: 20, sd_race: -20, me_race: 0, re_race: 20, hitdietype: 'd10'},
'Replicant Type III': {st_race: 0, qu_race: 0, pr_race: 10, in_race: 5, em_race: 0, co_race: 0, ag_race: 0, sd_race: -10, me_race: 20, re_race: 10, hitdietype: 'd8'},
'Replicant Type IV': {st_race: 5, qu_race: 5, pr_race: 20, in_race: -10, em_race: 10, co_race: 5, ag_race: 5, sd_race: -20, me_race: -10, re_race: -10, hitdietype: 'd10'},
'Replicant Type V': {st_race: 0, qu_race: 0, pr_race: -10, in_race: -15, em_race: -20, co_race: 0, ag_race: 0, sd_race: -20, me_race: -20, re_race: -20, hitdietype: 'd8'},
'Altha': {st_race: 15, qu_race: 15, pr_race: 20, in_race: 5, em_race: 10, co_race: 20, ag_race: 15, sd_race: 20, me_race: 15, re_race: 15, hitdietype: 'd10'},
'Idorians': {st_race: -10, qu_race: 10, pr_race: -5, in_race: 0, em_race: 0, co_race: 0, ag_race: 10, sd_race: -20, me_race: 0, re_race: 0, hitdietype: 'd10'},
'Snee': {st_race: 30, qu_race: 20, pr_race: 20, in_race: 0, em_race: -20, co_race: 20, ag_race: 10, sd_race: 0, me_race: -5, re_race: 5, hitdietype: 'd20'},
'Aoemarans': {st_race: -90, qu_race: -60, pr_race: -50, in_race: 10, em_race: 30, co_race: 10, ag_race: -5, sd_race: 10, me_race: 15, re_race: 10, hitdietype: 'd4'},
'Trilopters': {st_race: 20, qu_race: 10, pr_race: -15, in_race: -10, em_race: 10, co_race: 5, ag_race: 10, sd_race: -5, me_race: 0, re_race: 5, hitdietype: 'd8'},
'Areed': {st_race: 10, qu_race: 5, pr_race: -10, in_race: -10, em_race: 10, co_race: 5, ag_race: 10, sd_race: -10, me_race: 0, re_race: -5, hitdietype: 'd10'},
}
let race = values.race;
if (!races.hasOwnProperty( race )) {
console.log("Error: The item " + race + " is not found within the race Object.");
return;
}
setAttrs({
"co_race": races[race].co_race,
"ag_race": races[race].ag_race,
"sd_race": races[race].sd_race,
"me_race": races[race].me_race,
"re_race": races[race].re_race,
"st_race": races[race].st_race,
"qu_race": races[race].qu_race,
"pr_race": races[race].pr_race,
"em_race": races[race].em_race,
"in_race": races[race].in_race,
"hitdietype": races[race].hitdietype
});
});
});
</script>
<script type="text/worker"> //Total stat bonus calculator
const stats = ['co', 'ag', 'sd', 'me', 're', 'st', 'qu', 'pr', 'em', 'in'];
stats.forEach(stat => {
on(`change:${stat} sheet:opened`, function () {
getAttrs([`${stat}_norm`, `${stat}_race`, `${stat}_back`], function (values) {
let stat_norm = parseInt(values[`${stat}_norm`]) || 0;
let stat_race = parseInt(values[`${stat}_race`]) || 0;
let stat_back = parseInt(values[`${stat}_back`]) || 0;
let stat_bonus = stat_norm + stat_race + stat_back;
setAttrs({
[`${stat}_bonus`]: stat_bonus
});
});
});
});
</script>