Difference between revisions of "Sheet Worker Snippets"
From Roll20 Wiki
(→Helper Functions) |
Andreas J. (Talk | contribs) m (Add NavSheetDoc template) |
||
Line 1: | Line 1: | ||
− | ''Main Article:'' '''[[Sheet Worker Scripts]]''' | + | ''Main Article:'' '''[[Sheet Worker Scripts]]''' {{NavSheetDoc}} |
− | + | <br> | |
+ | =Examples= | ||
== Auto-calculating Attributes== | == Auto-calculating Attributes== | ||
===Example 1=== | ===Example 1=== | ||
Line 94: | Line 95: | ||
__FORCETOC__ | __FORCETOC__ | ||
− | + | =Related Pages= | |
* '''[[:Category:Sheetworker|List of all Sheetworker-articles]]''' | * '''[[:Category:Sheetworker|List of all Sheetworker-articles]]''' | ||
* [[Sheetworker_examples_for_Non-programmers|Sheetworker Examples for Non-programmers]] | * [[Sheetworker_examples_for_Non-programmers|Sheetworker Examples for Non-programmers]] | ||
Line 100: | Line 101: | ||
* [[repeatingSum|The RepeatingSum Function]] - How to add up the weight of all items in a repeating section | * [[repeatingSum|The RepeatingSum Function]] - How to add up the weight of all items in a repeating section | ||
− | + | =See Also= | |
* [https://app.roll20.net/forum/post/8033979/advice-api-sheet-workers-and-performance/?pageforid=8034567#post-8034567 Sheet Worker Optimization] by Scott C. | * [https://app.roll20.net/forum/post/8033979/advice-api-sheet-workers-and-performance/?pageforid=8034567#post-8034567 Sheet Worker Optimization] by Scott C. | ||
* [https://app.roll20.net/forum/post/6963354/build-lookup-table-into-a-character-sheet/?pageforid=6964447#post-6964447 How to integrate table of stats into a sheet] | * [https://app.roll20.net/forum/post/6963354/build-lookup-table-into-a-character-sheet/?pageforid=6964447#post-6964447 How to integrate table of stats into a sheet] |
Revision as of 19:42, 13 November 2020
Main Article: Sheet Worker ScriptsCharacter Sheet Development
Getting Started
- Using Custom Sheets
- Building Sheets
(Main Page) - Glossary
- Code Restrictions
- Best Practice
- Common Mistakes
- Tutorials
- Examples, Templates
- Pattern Libraries
- HTML & storing data
- CSS & Styling
General
- Updates & Changelog
- Known Bugs
- Character Sheet Enhancement(CSE)
- Custom Roll Parsing
- Legacy Sheet(LCS)
- Beacon SDK
Reference
- Buttons
- Repeating Sections
- Sheetworkers
- Roll Templates
- sheet.json
- Translation
- Auto-Calc
- Advanced
- All SheetDev Pages
Tools & Tips
Other
Contents |
Examples
Auto-calculating Attributes
Example 1
(credit: Rabulias)
Your best bet would be to avoid the autocalc fields entirely if you can. Monitor the two other fields and when they change, have a sheetworker that adds them up to the new value. Then you can refer to the new value in other calculations much easier.
on("sheet:opened change:stat_a change:stat_b", function() { getAttrs(["stat_a", "stat_b"], function(values) { setAttrs({ "foo_modchars": parseInt(values["stat_a"]) || 0 + parseInt(values["stat_b"]) || 0 }); }); });
Example 2
(credit: GiGs)
I remember seeing a script someone wrote to allow you to use autocalc fields within sheet workers, but it's just simpler to use Rabulias's approach(see example 1 above).
Add the relevant stats to the on(change:) line, and duplicate the calculation within the sheet worker.
I generally don't put my working in the setattrs call, but before it so i can more easily check it. Something like
on("sheet:opened change:stat_a change:stat_b", function() { getAttrs(["stat_a", "stat_b"], function(values) { var stat_a = parseInt(values["stat_a"])||0; var stat_b = parseInt(values["stat_b"])||0; var output = stat_a + stat_b; setAttrs({ "foo_modchars": output }); }); });
Helper Functions
This section is for useful functions that aren't complete sheet workers, but are useful to use in sheet workers.
Function: parseValues
(credit: GiGs) Many sheet workers have a bunch of lines like this:
var stat_a = parseInt(values["stat_a"])||0; var stat_b = parseInt(values["stat_b"])||0;
You might also have lines like this:
setAttrs({ "foo_modchars": parseInt(values["stat_a"],10) || 0 + parseInt(values["stat_b"],10) || 0 });
It gets tedious typing out all that. With the function below, you would instead write them as:
var stat_a = parseValues(values,"stat_a"); var stat_b = parseValues(values,"stat_b"); setAttrs({ "foo_modchars": parseValues(values,"stat_a") + parseValues(values,"stat_b") });
I think that's a lot easier to read. Here's the function:
parseValues
Place this at the start of your script block, and you'll be able to use it in all your sheet workers.
const parseValues = (values, stat, type='int') => { if(type === 'int') return parseInt(values[stat])||0; else if(type === 'float') return parseFloat(values[stat])||0; else if(type === 'str') return values[stat]; };
By default, it returns an integer. If you call it with a second parameter, it will return either a float or a string:
-
parseValues(values, stat)
orparseValues(values, stat, 'int')
- returns an integer. -
parseValues(values, stat,'float')
- returns a Float (a number that is not an integer) -
parseValues(values, stat, 'str')
- returns the value as text. (Not really needed!)
This function does handle variable attribute names. If you were in a loop and creating attributes like, "stat" + i it will work fine.
Reuse of fields for listeners
(credit: Marco G.)
In order to prevent typing the same thing over and over again you can store the fields that you want to use in an array and reuse it for event listeners and getAttrs.
It will looks like this:
let fields = ["str", "dex", "con"]; on(fields.map(field => "change:" + field).join(" "), () => { getAttrs(fields, (values ) => { .... }); });
Related Pages
- List of all Sheetworker-articles
- Sheetworker Examples for Non-programmers
- Universal Sheet Workers - How to create one function that can handle a bunch of similar sheet workers
- The RepeatingSum Function - How to add up the weight of all items in a repeating section
See Also
- Sheet Worker Optimization by Scott C.
- How to integrate table of stats into a sheet
- Introduction to JavaScript - MDN web docs
- JavaScript Best Practices - MDN web docs