Character Vault
Any Concept / Any System
Compendium
Your System Come To Life
Roll20 for Android
Streamlined for your Tablet
Roll20 for iPad
Streamlined for your Tablet

Personal tools

Order of Operations

From Roll20 Wiki

Jump to: navigation, search

Main Page: Complete Guide to Macros & Rolls

Order of Operations here refers to the order in which Roll20's dice engine processes the different dice syntax and macros, which is useful to know when creating more complex macros. Normal Math Order of Operations is processed towards the end of the process.

While the Roll20 dice engine does support basic math and math functions such as floor() and ceil(), it is first and foremost a dice engine, and so it has its own order of operations. This means that putting parentheses inside of your dice formula will not always affect the outcome of the roll (for example, you can't force a variable to be interpreted before a macro). Here is the Roll20 Order of Operations:

1. Abilities are expanded (meaning the definition of the ability is placed in the formula anywhere that ability appears; e.g. %{character name|ability_name} becomes /r 1d4).
2. Macros are expanded (e.g. #macro-name becomes /r 1d4).
3. Attribute calls are resolved. (e.g. @{attribute_name} becomes 4)
4. Steps 1-3 are repeated up to 99 levels deep, or there are no longer any expansions required.
5. Roll queries are executed up to 99 levels deep (the player making the roll is asked to provide a value for each query, and that value is substituted in where the roll query appears in the formula).
5b. HTML Entities within roll queries are parsed once after each roll query (e.g. } becomes }, but } becomes })
6. Inline rolls are executed, starting with the most deeply nested inline roll working upward. The overall result of the inline roll is substituted in place where it appeared in the formula.
7. The remaining roll is executed: first, dice are rolled for any dice (e.g. 2d6 is rolled; including any special dice such as dropped or exploding), then the result of that roll is substituted into the formula.
8. Mathematical functions like floor() and ceil() are executed.
9. The entire remaining formula is evaluated, including observing proper Math Order of Operations (parentheses first, then multiplication/division, then addition/subtraction).
10. Custom Roll Parsing happens.
11. HTML Entities are processed once.
12. The message is sent to q Text Chat as well as the API sandbox.


Thanks goes to Scott C. & Lockbox313 for additional testing in this matter!

Test confirming order of CRP and last HTML Entity processing (Step 10 & 11)
Have the input be 1d6&, and run the following sheet. Output having two ! means CRP happens before the last processing of HTML Entities.
<input type="text" name="attr_test2">
<button type="action" name="act_test">test</button>
<rolltemplate class="sheet-rolltemplate-test">
    <div class="sheet-template-container">
        <h1>{{name}}</h1>
        <div class="sheet-results">
            <h4>Custom Result = {{computed::roll1}}</h4>
        </div>
    </div>
</rolltemplate>
<script type="text/worker">
   on(`clicked:test`, function() {
    console.log("button pressed");
           getAttrs(["test2"], function(values) {
               console.log(`values ${JSON.stringify(values)}`);    
               let test_str = values.test2;
            startRoll("&{template:test} {{name=Test}} {{roll1=[[0]]}}", (results) => {
               test_str  =  test_str.replace(/!/g,"!!");
               console.log("test_str: "+test_str);
                finishRoll(
                    results.rollId,
                    {
                        roll1: test_str ,
                    }
                );
            })                     
           });
    });
</script>
<pre>|}

==Examples==
(todo)

* [https://app.roll20.net/forum/permalink/10915703/ Different order of operation in character sheet's ability.] explanation by RainbowEncoder

[[Category:Macros]]
[[Category:Character Sheet Creation]]
</noinclude>