Roll20 uses cookies to improve your experience on our site. Cookies enable you to enjoy certain features, social sharing functionality, and tailor message and display ads to your interests on our site and others. They also help us understand how our site is being used. By continuing to use our site, you consent to our use of cookies. Update your cookie preferences .
×
Create a free account

Sheet Worker for Custom Character Sheet - Efficiency Question

So I'm going to be setting some bonuses depending on what race you're playing in our game. Is it safe to just directly assign to the variable, or should I create temp variables, do the math/logic there and then just assign the value through the temp variable? Safe to do? <!-- WORKERS --> <script type="text/worker"> // Draevi Racial Talent Values on("sheet:opened", function() { getAttrs(["draevi_slicing_bonus_mdr", "draevi_spirit_lore_bonus_mdr", "draevi_survival_bonus_mdr", "draevi_navigate_bonus_mdr"], function(values) { setAttrs ({ draevi_navigate_bonus_mdr: parseInt(values.draevi_navigate_bonus_mdr) || 5, draevi_slicing_bonus_mdr: parseInt(values.draevi_slicing_bonus_mdr) || 5, draevi_spirit_lore_bonus_mdr: parseInt(values.draevi_spirit_lore_bonus_mdr) || 5, draevi_survival_bonus_mdr: parseInt(values.draevi_survival_bonus_mdr) || 5 }); }); }); vs. on("sheet:opened", function() { getAttrs(["draevi_slicing_bonus_mdr", "draevi_spirit_lore_bonus_mdr", "draevi_survival_bonus_mdr", "draevi_navigate_bonus_mdr"], function(values) { var idraevi_navigate_bonus_mdr = parseInt(values.draevi_navigate_bonus_mdr) || 5; var idraevi_slicing_bonus_mdr = parseInt(values.draevi_slicing_bonus_mdr) || 5; var idraevi_spirit_lore_bonus_mdr = parseInt(values.draevi_spirit_lore_bonus_mdr) || 5; var idraevi_survival_bonus_mdr = parseInt(values.draevi_survival_bonus_mdr) || 5; setAttrs ({ draevi_navigate_bonus_mdr: idraevi_navigate_bonus_mdr, draevi_slicing_bonus_mdr: idraevi_slicing_bonus_mdr, draevi_spirit_lore_bonus_mdr: idraevi_spirit_lore_bonus_mdr, draevi_survival_bonus_mdr: idraevi_survival_bonus_mdr }); }); });
1744419000

Edited 1744419136
Scott C.
Forum Champion
Sheet Author
API Scripter
Compendium Curator
That's fine. They're practically identical. The creation of variables is probably less efficient technically, but that difference is so small that on the scale of a character sheet it's irrelevant. One thing though, I would recommend creating an empty object, assigning the values to keys on that and then passing that object to setAttrs. This just makes it easier to debug if an issue arises: on("sheet:opened", function() { getAttrs(["draevi_slicing_bonus_mdr", "draevi_spirit_lore_bonus_mdr", "draevi_survival_bonus_mdr", "draevi_navigate_bonus_mdr"], function(values) { const setObj = { draevi_navigate_bonus_mdr: parseInt(values.draevi_navigate_bonus_mdr) || 5, draevi_slicing_bonus_mdr: parseInt(values.draevi_slicing_bonus_mdr) || 5, draevi_spirit_lore_bonus_mdr: parseInt(values.draevi_spirit_lore_bonus_mdr) || 5, draevi_survival_bonus_mdr: parseInt(values.draevi_survival_bonus_mdr) || 5 }; setAttrs(setObj); }); }); But, this is an extremely minor thing and has absolutely no effect on program efficiency, at least not in this instance. This method is also useful if you are going to be conditionally setting attribute values based on some sort of logic.
1744419912

Edited 1744421922
So I could take this // Background - Spritbound Techshaper on("sheet:opened add:slicing_skill_mdr change:slicing_skill_mdr add:spirit_lore_skill_mdr change:spirit_lore_skill_mdr change:draevi_mdr_checkbox", function() { getAttrs(["slicing_mdr", "spirit_lore_mdr", "slicing_skill_mdr", "draevi_slicing_bonus_mdr", "spirit_lore_skill_mdr", "draevi_spirit_lore_bonus_mdr", "draevi_mdr_checkbox"], function(values) {     var islicing_mdr_total = values.draevi_mdr_checkbox == "slicing" ? ( ( parseInt(values.slicing_skill_mdr) || 5 ) + ( parseInt(values.draevi_slicing_bonus_mdr) || 5 ) ) : parseInt(values.slicing_skill_mdr) || 5; var ispirit_lore_mdr_total = values.draevi_mdr_checkbox == "spirit_lore" ? ( ( parseInt(values.spirit_lore_skill_mdr) || 5 ) + ( parseInt(values.draevi_spirit_lore_bonus_mdr) || 5 ) ) : parseInt(values.spirit_lore_skill_mdr) || 5; setAttrs ({ slicing_mdr: islicing_mdr_total, spirit_lore_mdr: ispirit_lore_mdr_total }); }); }); and change it to on("sheet:opened add:slicing_skill_mdr change:slicing_skill_mdr add:spirit_lore_skill_mdr change:spirit_lore_skill_mdr change:draevi_mdr_checkbox", function() { getAttrs(["slicing_mdr", "spirit_lore_mdr", "slicing_skill_mdr", "draevi_slicing_bonus_mdr", "spirit_lore_skill_mdr", "draevi_spirit_lore_bonus_mdr", "draevi_mdr_checkbox"], function(values) { const setObj = { slicing_mdr: values.draevi_mdr_checkbox == "slicing" ? ( ( parseInt(values.slicing_skill_mdr) || 5 ) + ( parseInt(values.draevi_slicing_bonus_mdr) || 5 ) ) : parseInt(values.slicing_skill_mdr) || 5, spirit_lore_mdr: values.draevi_mdr_checkbox == "spirit_lore" ? ( ( parseInt(values.spirit_lore_skill_mdr) || 5 ) + ( parseInt(values.draevi_spirit_lore_bonus_mdr) || 5 ) ) : parseInt(values.spirit_lore_skill_mdr) || 5 }; setAttrs (setObj); }); });
Tested this, and it's working great.  Thank you for the great tip.
1744427721
GiGs
Pro
Sheet Author
API Scripter
One advantage tovariables is that you can debug them. Setting values directly in setAttrs is something that you can do, and it is marginally more efficient (it is marginal though), but you lose a lot of debugging ability when testing new features on a sheet. Scott's suggestion of creating an object preserves the ability to debug, among other things.
GiGs said: One advantage tovariables is that you can debug them. Setting values directly in setAttrs is something that you can do, and it is marginally more efficient (it is marginal though), but you lose a lot of debugging ability when testing new features on a sheet. Scott's suggestion of creating an object preserves the ability to debug, among other things. Thank you again, really nice to be in a helpful community.