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

Roll20 Tips and Tricks (Innovative Solutions to Common Problems)

you are correct, he did indeed have it inverted. you want it to return 0 if => 6 but 1 if <= 5 [[ [[1]] * (2d6)]] vs [[ [[0]] * (2d6)]] 1d6<5 = (result(1,2,3,4,5)=1)
1572801266
Mike deBoston
Compendium Curator
Thanks for the corrections and extensions. My actual macro, like all useful Roll20 macros, is too damn long with templates, text, variable die types and variable numbers of dice to be a good example. I screwed up recreating and streamlining it here.
1572886335
keithcurtis
Forum Champion
Marketplace Creator
API Scripter
Where to Find Scripts There is no good searchable central repository of scripts for Roll20. New Pro-level users are often flummoxed about where to find them. Here are some places to look. The easiest place is the drop down menu in the One-Click install feature of the API page of your game. This isn't actually well-presented on the wiki (i.e. mentioned at all), but the API page drop down scripts have all been vetted by Roll20 to ensure that they meet some minimum coding standards and won't break your game by their mere presence. Next is the official Roll20 Repository on Github . This is the source of the one-click scripts, but there are many on this page that are not available through one-click. Being included in the drop-down is usually a request made by the author of the script and agreement from Roll20. These are also vetted by Roll20. There is also&nbsp; this long out-of-date page &nbsp;in the wiki, which lists some scripts that are in neither place. You can search github with a keyword of Roll20 to find other public repositories: <a href="https://github.com/search?q=roll20" rel="nofollow">https://github.com/search?q=roll20</a> Some of our most prolific script writers have a good number of scripts which for one reason or another they have decided not to submit to the official repository. Most of these scripts will have enough documentation in the Readme to help you figure out what they do, and you can always contact the author through their github link. Finally, you can do a site-limited google search and find some forum-only scripts: site:app.roll20.net "[Script]" Some folks just like to share what they've done with more public feedback, or the script is just a short snippet that does one very specific task. I'm sure there are other ways to find scripts out there, so if someone wants to post a source, or PM it to me, I'll edit it in.
Nice catch Kieth! I was actually curious how you always found so many wonderful scripts myself, and this answers a majority of such questions, however you missed the Jarvis query (you'd probably need to refractor it via Whitelisted Google Search), as I know a certain local Code Whiz we all know and love uses Jarvis hosting if I'm not mistaken. PasteBin &amp; other similar sites might also be good places to check, as not everyone likes GitHub (for some reason).
1573250495
keithcurtis
Forum Champion
Marketplace Creator
API Scripter
Pastebin is a little too dynamic and volatile. No proper readme or versioning possible as far as I know. And... Jarvis?
I honestly haven't messed with Jarvis since I was playing Modded MineCraft 1.7.10 but I do remember that it is a good resource for testing Code Stability once it is set up, which helped a lot of Mod Builders with their Bugs. perhaps other users can fill in the blanks, as it's been roughly 3+ Years since I've actually visited a Jarvis Repository.
1573334922

Edited 1575905392
keithcurtis
Forum Champion
Marketplace Creator
API Scripter
Use Compendium Links for Magic Item Descriptions This Stupid Trick can be used in any game that has an associated Compendium access. I'm going to use D&amp;D 5e for this example. Let's say you want to give a Crystal Ball or a Staff of Charming to an NPC. There isn't really a space on the NPC sheet, and in any case (PC or NPC) maybe you just don't want to load the sheet down with long item descriptions. This trick uses the fact that compendium URLs will open up as pop-in windows in a Roll20 game. Let's use those two magic item examples above. You want to give them to the NPC Archmage. First: You will need the URLs. The very easiest place to get these is by going to the out-of-game compendium page and looking up, say, "Crystal Ball". The URL is&nbsp; <a href="https://roll20.net/compendium/dnd5e/Crystal%20Ball#h-Crystal%20Ball" rel="nofollow">https://roll20.net/compendium/dnd5e/Crystal%20Ball#h-Crystal%20Ball</a> You can shorten that to: <a href="https://roll20.net/compendium/dnd5e/Crystal%20Ball" rel="nofollow">https://roll20.net/compendium/dnd5e/Crystal%20Ball</a> Do the same for Staff of Charming: <a href="https://roll20.net/compendium/dnd5e/Staff%20of%20Charming" rel="nofollow">https://roll20.net/compendium/dnd5e/Staff%20of%20Charming</a> Second: Create a new Action. Don't click "Attack", so that all you have is a description field. You want to be able to click on that and be given a list of his magic items. In this field, put in the two Ability command buttons: [Staff of Charming](<a href="https://roll20.net/compendium/dnd5e/Staff%20of%20Charming" rel="nofollow">https://roll20.net/compendium/dnd5e/Staff%20of%20Charming</a>) [Crystal Ball](<a href="https://roll20.net/compendium/dnd5e/Crystal%20Ball" rel="nofollow">https://roll20.net/compendium/dnd5e/Crystal%20Ball</a>) Like so: Now when you click on that Action, you will see this appear in the chat window (you may have big pink buttons depending on your sheet or if you are not using one of these Stylus tricks [ 1 ] [ 2 ]): Clicking on Staff of Charming will yield this in its own window: And as icing on the cake, all of the spell names in the window are likewise clickable (not castable, that's part of a characer sheet), but clicking on them will call up the complete spell description. Variations: This trick can be used on any part of a character sheet that produces chat output, or even as part of a&nbsp; Chat Menu . Do you have Mordenkainen's Tome and are playing an elf cleric? You can put in a button that calls up the Compendium entry on the gods of the Seldarine. Do you want to create a DM's Screen menu of commonly referenced rules, like conditions? Put the URLs into Ability Command Buttons on a chat menu.
1576013915

Edited 1576013962
Mike deBoston
Compendium Curator
How to speak Elvish in front of lessor races ...In a way that makes sure they know you're talking about them I prefer to use a macro for private messages because it avoids accidentally sending them into the public chat window. This works when only two players know the same language. It's a simple macro with whisper. speak-kraken /w @{target|token_name} ``[in kraken]`` ?{Message} In Kraken: [[1t[kraken-words] ]] [[1t[kraken-words] ]] [[1t[kraken-words] ]] Then I created a table with some randomish words: But the output is pretty nice. The two players use a macro to speak, so they don't accidentally type it into the chat window, the person they're talking to gets a message, and other players get mysterious words. You could create more than one Kraken table, kind of a noun, verb, adjective pattern. And there's more! Ziechael extended the macro to allow selection of different languages: speak-language /w @{target|token_name} ``[in ?{Language|dwarven|elvish|draconic|abyssal}]`` ?{Message} In ?{Language}: [[1t[?{Language}] ]] [[1t[?{Language}] ]] Then create tables with the same name as the languages: dwarven, elvish, draconic, etc. You want more? We'll give you more! Scott C. added this suggestion. Instead of whispering to one person, you can send the private message to everyone who speaks that language (and still send mysterious words to everyone else so they're slightly perturbed). Create a character sheet for each language, named after the language. If a player's character knows that language, assign that character sheet to that player. Now, whispers sent to the language character sheet will go to all players who know that language. speak-language-to-all /w "?{Language|dwarven|elvish|draconic|abyssal}" ``[in ?{Language}]`` ?{Message} In ?{Language}: [[1t[?{Language}] ]] [[1t[?{Language}] ]] As they like to say among the Kraken: Lenesu fulfills as told!
1576016790
GiGs
Pro
Sheet Author
API Scripter
Mike deBoston said: Scott C. added this suggestion. Instead of whispering to one person, you can send the private message to everyone who speaks that language (and still send mysterious words to everyone else so they're slightly perturbed). Create a character sheet for each language, named after the language. If a player's character knows that language, assign that character sheet to that player.&nbsp; To add to this suggestion: assign each player as able to Edit the sheet, but do not assign them in the Visible box. This way the language character sheets wont appear in the players' journals (reducing clutter), but they can still use them for this trick.&nbsp;
1576022011

Edited 1576022047
Mike deBoston
Compendium Curator
Four people cooperate on one "stupid" trick and turn it into something clever! The Roll20 community is terrific!
1577185029

Edited 1577185067
Hey, in addition to the suggestion about language above.... if you have a&nbsp; Pro membership, you can combine it with the DELAY script, the 'roll table' results are done in the API script instead of directly in roll20. What this means is.... NO YELLOW BLOCKS :)
1578086619

Edited 1578165326
Kraynic
Pro
Sheet Author
This is a follow up or addon to the chat menu trick.&nbsp; I have recently been setting up a pathfinder game and decided to incorporate buttons into attack rolls to players to use Ammo to subtract arrows, charges from wands, daily uses of class abilities, etc.&nbsp; I started out doing the normal example of: [Display Button Name](Ammo macro to use on button press) The problem was that this resulted in a big pink button.&nbsp; This is a problem, because I know the Pathfinder by Roll20 sheet has styling for buttons.&nbsp; It already uses it for an already built in concentration button on spell templates, for example.&nbsp;&nbsp; I have no idea why it should make a difference, but if the macro is made as an ability on the character sheet, then you do the button like this: [Display Button Name](~character name|ability name for the ammo macro) In that case, the button uses the styling that the template uses for other buttons like concentration.&nbsp; Why it works that way, I don't know, but it does.&nbsp; Obviously this can be used for any chat menu buttons, and isn't specific to api commands, that is just what I was doing when I discovered it.&nbsp; I am assuming this will work with any sheet that already has some button styling built in (Roll20 sheets at least), but those that play other systems should test this to check it out for sure.&nbsp; Anyway, this may cut down on some uses of browser extensions to redo chat menu buttons. Edit: Thought maybe I should edit in a couple screenshots for illustration. Button setup in the notes section of an attack with both ways shown: How they display in chat:
1578089581
keithcurtis
Forum Champion
Marketplace Creator
API Scripter
That styling is built into the roll template. Some use the big pink buttons for everything, some (like the OGL) use different styles on different templates. The attack template uses inline instead of buttons. Obviously the PF template makes a distinction when it formulates buttons, which is a good data point, but it’s not universal to my knowledge. It does warrant some investigation though.&nbsp;
1578667616

Edited 1578669051
keithcurtis
Forum Champion
Marketplace Creator
API Scripter
Make Large Monsters Look More Threatening I honestly thought this one was in here, but a search didn't turn anything up. I didn't invent this trick, at any rate. Many times, a huge creature such as a dragon just doesn't look as threatening as it should, given its size. Top down tokens include space for wingspread, tail, neck and so forth, leaving the actual dragon rather small. This trick works best with the top down style of token, Make the token 1-2 squares larger in all dimensions, so that it overhangs its space. Then use&nbsp; a negative aura to indicate the actual space taken up by the creature. It makes them look huge (and tall, if you use a black aura, which looks like a shadow). In the example below, the players should have a good feeling of how dangerous a dragon's reach is and how close they need to get to attack. Dragon image was an in-game art search and came from a user named heruca on dundjiinni. The map background is from Gabriel Pickard, available on the Marketplace, and the two PC tokens are mine.
1578668583

Edited 1578668623
Joe
Pro
Thanks Keith, that’s a fantastic trick! &nbsp;I’ve definitely run into that “underwhelming” problem before myself when using the built-in monster tokens. Where did you get that dragon? :D
1578669090
keithcurtis
Forum Champion
Marketplace Creator
API Scripter
Thanks for reminding me. I usually try to add attribution. The post has been edited.
1578689105
DMS Creations
Pro
Marketplace Creator
This is awesome, thank you for the tip!
1578945808
Gen Kitty
Forum Champion
I was asked elsewhere to put this into Stupid Tricks.&nbsp; This is over five years old at this point and Keith claims it belongs in a museum.&nbsp; :P :)&nbsp; I was playing Pathfinder very heavily at the time, hence using PF1E for my example. (FREE ACCOUNT) Variable numbers of targets in an AoE attack Here's an example from a Pathfinder Gunslinger, using Pellet Ammo: /me fires his dragon pistol, spraying a 15' cone of sticky pellets which engulfs ?{Number of targets?|1} target(s), potentially dealing [[floor((d6 + 3 + ?{MiscBonusDamage|1})/2 )]] damage each, [[floor(3d6 + (3*3 + ?{MiscBonusDamage}))/2 ) ]] additional on a crit. Additionally, the attack forces a Reflex save DC 15 to avoid being ENTANGLED for [[2d4]] rounds. (B/P damage, misfires if ALL ATTACK DICE roll a 1 to ?{MaxMisfire|4}). // @{target|target1|token_name}: AC [[1d20r20 +10 -2 + ?{MiscToHitBonus?|1} ]] // ?{target2|!} @{target|target2|token_name}: AC [[1d20r20 +10 -2 + ?{MiscToHitBonus?} ]] // ?{target3|!} @{target|target3|token_name}: AC [[1d20r20 +10 -2 + ?{MiscToHitBonus?} ]] // ?{target4|!} @{target|target4|token_name}: AC [[1d20r20 +10 -2 + ?{MiscToHitBonus?} ]] // ?{target5|!} @{target|target5|token_name}: AC [[1d20r20 +10 -2 + ?{MiscToHitBonus?} ]] // ?{target6|!} @{target|target6|token_name}: AC [[1d20r20 +10 -2 + ?{MiscToHitBonus?} ]] // ?{target7|!} @{target|target7|token_name}: AC [[1d20r20 +10 -2 + ?{MiscToHitBonus?} ]] // (I stripped out all @attribute calls and replaced with numbers so you can easily copy &amp; paste and test this) How it works When you use this macro, it will ask you to click on targets.&nbsp; You must click on 7 tokens, starting with your real targets and then clicking on fake targets -- I suggest using your own token for reasons I will make clear in a moment. Once you are done filling out the target list, you will then be given 6 prompts; for each target you want to shoot, delete the ! that appears in the query window.&nbsp;&nbsp; For each fake target, leave the ! that appears in the query window. Once you have finished filling in all of the data entry (roll queries), you will get something that looks like this: In this example, the NUL token is one I use for the purpose of padding out multi-target attacks at my table.&nbsp; If you use your own token for your padding it will be likewise clear you aren't intending that attack to be real if you slip up and do not remove the ! from fake targets.&nbsp; Here's another example with only 3 real targets: Now, for what makes this a Stupid Trick! ! is a call to API and if the first line of a macro starts with ! Roll20 will look for an api command to run.&nbsp; Not finding any, Roll20 simply tosses that line and moves on to the next line in the macro.&nbsp; This is why this works for FREE ACCOUNTS despite technically involving API. Play around with it, see how it works for you, adjust as desired.&nbsp; Original thread is here: <a href="https://app.roll20.net/forum/post/1204738/undocumented-feature-everyone-should-know-about/" rel="nofollow">https://app.roll20.net/forum/post/1204738/undocumented-feature-everyone-should-know-about/</a>
1578946597
vÍnce
Pro
Sheet Author
Old tricks never die.
1578952691

Edited 1578953278
Kraynic's post above reminded me, I've been using a similar trick that I meant to share, so I'd like to add on to what they shared! Using Buttons for Spell Slots and Consumables (uses API) I use buttons not only for ammo in ranged attacks, but also with spells, abilities with daily uses, and consumables. Some examples using the Pathfinder by Roll20 sheet: For most things, including spells for a prepared caster, I use TheAaron's script Ammo v0.3.9 (not yet in One-Click) and a button like this (can be placed either at the beginning of the spell description or in the notes, whichever you prefer) [**Spend Spell Slot**](!wammo @{selected|character_id} repeating_spell-1_$2_spellprepared -1 prepared instance of @{selected|repeating_spell-1_$2_spellname}) I use an attribute for the spells name at the end of the command so I can easily paste it into any spell and only need to adjust the spell level and row number in that attribute. The chat announcement prints like this I specify Ammo v0.3.9 because older versions didn't adjust both the slots for the single spell and the total slots for that level. As Kraynic pointed out, this type of button gives you a big pink rectangle A simple workaround is adding a ` before the ! like [**Spend Spell Slot**](`!wammo @{selected|character_id} repeating_spell-1_$2_spellprepared -1 prepared instance of @{selected|repeating_spell-1_$2_spellname}) I also use Keith's trick for with the Stylus extension and making buttons as text-only and pink to keep them more visible. This has the same result whether or not you use the ` in the button For a spontaneous caster I use the !modbattr function of ChatSetAttr since I usually increase the prepared mark to keep track of how many times I've cast a certain spell. Only downside to this is the PF sheet maxes out the prepared slots at 4, so even if you have 6 slots total, this wouldn't let you track casting the same spell more than 4 times. [**Spend Spell Slot**](!modbattr --sel --repeating_spell-1_$0_spellprepared|+1) \\or [**Spend Spell Slot**](`!modbattr --sel --repeating_spell-1_$0_spellprepared|+1) And here, casting your first spell of the day looks like this For Consumables, I usually use the row id in the command rather than the row number since I rearrange my items often, but you can easily substitute in the row number [**Use One**](!wammo @{selected|character_id} repeating_gear_-Lh9hY3twJVabT2CXQa6_quantity -1 @{selected|repeating_gear_-Lh9hY3twJVabT2CXQa6_name}) \\or [**Use One**](!wammo @{selected|character_id} repeating_gear_$13_quantity -1 @{selected|repeating_gear_$13_name}) More Options Class Ability [**Spend Daily Use**](!wammo @{selected|character_id} repeating_abilities_$10_perday -1 daily use of @{selected|repeating_abilities_$10_name}) Spell-Like Ability [**Spend Daily Use**](!wammo @{selected|character_id} repeating_spell-like_$0_perday -1 daily use of @{selected|repeating_spell-like_$0_spellname})
Why is this not a sticky...Fixed.
1579125968

Edited 1579815472
Use ChatSetAttr to Include Queries in Attributes (uses API) 1/17/20—Edited to specify API dependency (thank you for catching that, Blue64!) 1/16/20—Edited for typos and clarification 1/15/20—Edited to include screenshots and expand on uses This is something I've been trying to find a workaround for pretty much since I started writing my own macros. Let's say you want to make a drop-down query for skill checks for a selected token. Normally that would look something like this: /r 1d20 + ?{Skill|Acrobatics,@{selected|acrobatics}|Arcana,@{selected|arcana}|Athletics,@{selected|athletics}|&lt;...etc...&gt;} If it's an especially long list, it may seem more convenient to write it like /r 1d20 + @{selected|?{Skill|acrobatics|arcana|athletics|&lt;...etc...&gt;}} but the order of operations doesn't let you do that. It tries to parse the @{selected} attribute first, and the end curly bracket in the query interferes with that. So here's the workaround you can use with ChatSetAttr . You'll want to have a character sheet where you can store an attribute sent through ChatSetAttr in a custom attribute. In the example below, I'll use a character called ' macro ' and give it an attribute called ' skillsquery '. Next, you'll need two macros. The first will use the --replace function. This replaces the characters &lt; , &gt; , ~ , ; , and ` by the characters [ , ] &nbsp; , - , ? , and @ in attribute values. Be sure to also escape any vertical bars outside of the query by putting a backslash in front of it, like \| !setattr {{ --name macro --replace --skillsquery|`{selected\|?{Skill|acrobatics|arcana|athletics|&lt;...etc...&gt;}} }} This will give you the drop down query, and if you choose athletics for example, will fill the ability @{macro|skillsquery} with the text @{selected|athletics} and the second macro /r 1d20 + @{macro|skillsquery} will pull @{macro|skillsquery} , which then in turn pulls @{selected|athletics} , essentially treating it as /r 1d20 + @{selected|athletics} This is even more useful for longer lists or things like repeating attributes. In this example, I'm going to use a character called ' compendium ' to store the attributes from the first macro in the matching fields of the row 0 item in the abilities repeating section. It will give me a query asking for the Row Number of the item, and I'll choose row 2. Initial sheet setup The first macro !setattr {{ --name compendium --replace --repeating_abilities_$0_name|`{compendium\|repeating_abilities_$?{Row Number}_name} --repeating_abilities_$0_perday_qty|`{compendium\|repeating_abilities_$?{Row Number}_perday_qty} --repeating_abilities_$0_type|`{compendium\|repeating_abilities_$?{Row Number}_type} --repeating_abilities_$0_descshort|`{compendium\|repeating_abilities_$?{Row Number}_descshort} --repeating_abilities_$0_description|`{compendium\|repeating_abilities_$?{Row Number}_description} --repeating_abilities_$0_notes|`{compendium\|repeating_abilities_$?{Row Number}_notes} }} After running the first macro It fills each field of the item in row 0 with the matching attribute for the row I specified in the query, row 2. Now I can run the second macro to make a new ability in a selected character (the ' macro ' character in this case) with the same info as the ability in row 2 of the ' compendium ' character, using --repeating_abilities_-create_ in the script command The second macro !setattr {{ --sel --replace --repeating_abilities_-create_name|@{compendium|repeating_abilities_$0_name} --repeating_abilities_-create_perday_qty|@{compendium|repeating_abilities_$0_perday_qty} --repeating_abilities_-create_type|@{compendium|repeating_abilities_$0_type} --repeating_abilities_-create_descshort|@{compendium|repeating_abilities_$0_descshort} --repeating_abilities_-create_description|@{compendium|repeating_abilities_$0_description} --repeating_abilities_-create_notes|@{compendium|repeating_abilities_$0_notes} }} Idk if anyone else will find this as useful as I did, but if you do then enjoy a little extra convenience! I'll make another post soon about how to use this to create a custom compendium that quick-fills items, feats, class features, etc. using the method above in the absence of drag-and-drop =D (Maybe someone can find a way to get both macros into one using the !delay script. I've had no such luck, though. Delay doesn't seem to like ChatSetAttr very much.) Please let me know if anything needs to be explained more clearly.
you forgot to mention if that was API or not in the Header, but from what I've seen, it looks very useful. If I ever get Pro Membership, I'll be sure to look that one up!
1579635072

Edited 1579891254
Apparently I never posted this here. Whoops. Fake Crits Using Math Instead of Dice Here's a way to make crit/ fail highlighting happen without having to worry about dice. Basically you can have any number, calculation, or diceroll and then add crit highlighting after. Great for nested inlines or guaranteed crits or faking/ changing rolls if you have API trickery going on. /w gm [[26 + 1d0cs@{crit}cf1 [Crit] + 1d0cs1cf@{fail} [Fail]]] Where 26 is whatever you want it to be and @{crit}/@{fail} are either 1 or 0 for false or true, respectively. Yes. They are backwards. Syntactically &nbsp;?{crit|Yes crit,0|No crit,1}&nbsp; ?{fail|Yes fail,0|No fail,1} Essentially you're adding 1d0 which always evaluates to 0 to whatever your numbers are. Set custom crit/ fail ranges to either be 0 or 1 if you want each particular highlight. Depending on your situation you can separate them out like that to give them labels (above) or put them both together: /w gm [[26 + 1d0cs@{crit}cf@{fail}]] As a bonus trick, in case you need to swap the logical meaning of 1 = true, 0 = false: oppositeValue = 1 - value Where value is 1 or 0, and oppositeValue is 0 or 1, respectively. Example: You want to auto-crit when you have more than 1 auto-crit arrow remaining. [[69 + 1d0cs[[1 - {1, ?{critArrows}}kl1]]cf1]] edit: tl;dr&nbsp;
1579642964

Edited 1579643004
Joyous day. I remembered another Caveman Math (debugging API errors) (uses API) Caveman debugging is... necessary. It's fine. I guess. Log all the things. Or whatever. But sometimes that isn't enough when you're trying to read '1' of null and the API just can't even. Which '1'? I have a lot of those. What do you mean line 12k? This doesn't help me. I've narrowed down the script but there's still 600 lines here. Math to the rescue. Just crash the API on purpose and figure out the difference. Format is apiscript.js:[ErrorLineNumber]:[ErrorCharNumber] For instance, let's say you have this error Add a line like this to the beginning of the offending API script on("chat:message", function(msg) {if(msg.type == "api" &amp;&amp; msg.content.indexOf('!killAPI') == 0)null.f();}); Call !killAPI from within the game Since you added a line to the API script you know your null[1] is now on line 1 + 11499 - 11468. Time to go to line 32: var charid = /{{character_id=([^}]*)}}/.exec(msg.content)[1]; Yup. I could see how that would be a problem. Let's fix that. var charid = (/{{character_id=([^}]*)}}/.exec(msg.content) || {})[1]; Oof. But at least it won't crash as much.
That's the stupidest thing I've ever heard! But it's just so stupid, it just might work! That's what whoever first tested that last one must have said to themselves, because that's such a stupid idea, but in its stupidity; it's a stroke of genius!
1579725763
GiGs
Pro
Sheet Author
API Scripter
That last one is amazingly useful Noon for us scripters. Thanks.
1579808461

Edited 1579823062
This is a variation of the really handy&nbsp; Trap and Room Markers sans character sheet or API &nbsp; by Scott C. I've recently started running the official Tomb of Annihilation module and I quickly realized that the info breakdown for certain parts of the module could be made way more accessible by using Scott C.'s hack. You know how all the official modules have that handy GM layer set of room/location markers to designate rooms in a dungeon, or point of interest on a map? Those are tokens, and you can use Scott C.'s trick with those! NOTE: this also works with your own homemade notes/campaigns! How to: Switch to the GM layer and select a marker (or add your custom marker if you are not using an official module): Right Click &gt; select "Is Drawing". This will remove all the unecessary interface clutter and make things nicer: Double-click the token to open the Edit window. With the Macro I am using, Bar1 &nbsp;is reserved for the read-aloud text and Bar2 &nbsp;is reserved for the room description. The Name &nbsp;field is self explanatory. The idea is to Copy/Paste what's relevant to that location to the various Marker bars, and store it there for quick access whenever you need a refresher: Click "Save Changes".&nbsp; Open your Macro editor and create a new macro with this content: /w gm &amp;{template:spell}{{name=@{selected|token_name}}} {{level=@{selected|bar1}}}{{description=@{selected|bar2}}} Add the Macro to your quickbar. Select the marker token and click the Macro! This should be what your output looks like: You'll notice that the description has a line break. This is cause most HTML code you have added to your text will get parsed by the chat! In this case, the linebreak is created by simply adding this where the space would be: &lt;br&gt;&lt;br&gt; With the same trick you can also add visually distinctive hyperlinks to other handouts with this format (more on text formatting over here&nbsp; <a href="https://wiki.roll20.net/Text_Chat#Basic_Formatting" rel="nofollow">https://wiki.roll20.net/Text_Chat#Basic_Formatting</a> ): ``[TEXT](URL)`` You can actually add anything you want, including keithcurtis's Chat Menus!
1579808908

Edited 1579808991
Scott C.
Forum Champion
Sheet Author
API Scripter
Compendium Curator
Nice use of those tricks Barakka! Also, that's a really nice use of the 5e spell cards template to give some styling to the text. EDIT: Also, nice find on the line break fix! That opens a whole new world of text contents for the technique. I'm going to update my original trick to reference that.
1579811000
keithcurtis
Forum Champion
Marketplace Creator
API Scripter
As a further refinement, you could do all of your editing in the gm notes field (where you can see everything), then copy and paste to the bar when you have it the way you want it.
1579821594

Edited 1579863055
keithcurtis said: As a further refinement, you could do all of your editing in the gm notes field (where you can see everything), then copy and paste to the bar when you have it the way you want it. Ah nice idea! I was using a text editor to do that, but this is probably easier/quicker. I am also using a spreadsheet to do some quick and dirty "hyperlink" formatted text for the template: = CONCATENATE ( "``[" , A1 , "](" , B1 , ")``" ) In this case I would copy&amp;paste the text I want the Hyperlink to display in Cell A1, and the link itself in Cell B1. C1 has the output: EDIT: also, I've just realized this would work really well with&nbsp; Tooltip Hack in Chat Display &nbsp; - Aranador to hide unecessary text until it becomes relevant (or may be used as an quicker version to include extra text istead of hyperlinking short handouts).
@Noon, sorry but english isn't my first language. From what I understand, your trick is to force the result to display as a crit even if there is none? (well, manipulating crit display as a GM) Am I understanding it right?
Yes. Doesn't require GM. Just math.
1579905659

Edited 1579905727
I've just noticed that&nbsp; Use Compendium Links for Magic Item Descriptions &nbsp;by &nbsp;keithcurtis&nbsp; could be used to solve a common issues I run into most of the time, aka Shared Loot . Either someone is carrying a Bag of Holding (or something similar); or the party has someone strong enough to be able to comfortably carry a lot of small misc treasure that has not yet been assigned. The issue is that, normally, only one person has access to the common loot, and there is no fast way to share that info, especially with long lists. Well, now there is :) You can use URLs for the items that need actual description, or just list whatever else you may want to as plain text.
I've personally been mixing the Macro Mule trick with the Customized Templates for things such as Poisons &amp; Magic Items, mixing in the Clickable Chat Buttons trick for anything that needs to be rolled, including things like Spells on Scrolls &amp; Poison Damage. I could go into more Detail if you'd like, but I;m simply making use of the 5e Template that the Bag of Holding in the previous Post was using from the 5e Character Sheet. It's currently almost 6 AM though, and it's the morning after my big Friday Evening D&amp;D 5e Session that I GM, so I should get some sleep.
1580064224

Edited 1580313397
Dynamic Multitarget Roll without API EDIT: check the end of the post for an even better system &nbsp;as per Blue64's suggestions. This method uses Chat Menus and nested macros instead of tokens. This is the best way to build a variety of quick&amp;dirty dynamic (IE: variable number of targets) multitarget rolls that doesn't require API access that I was able to figure out. This requires a bit of setup, but it should be flexible enough to satisfy everyone's need. In this example we are setting up a Dynamic Mass Dex Save, but the same trick can be used for a multitude of different rolls &nbsp;(more on this later). Set up a series of numerical tokens. I use&nbsp; Easy Area Markers / Room Numbering &nbsp;by The Aaron&nbsp; and keep them hidden in a Fog of War enabled strip that runs on one side of each combat map. Double click token n.2 and paste this code in Bar1: &amp;{template:simple}{{rname=Mass Dex Save&lt;br&gt;}} {{charname= ---&lt;br&gt;&nbsp; @{target|target1|token_name}: [[1d20+@{target|target1|dexterity_save_bonus}]]&lt;br&gt;&nbsp; @{target|target2|token_name}: [[1d20+@{target|target2|dexterity_save_bonus}]]&lt;br&gt; ---&lt;br&gt;}} Do the same for each token you think you'll need. In this example, we have set up tokens 2 to 6. The code is the same, just add more targets/lines; this is the code for Token n.6 for example (NOTE: use an external text editor to prevent the breaklines to be removed on save!): &amp;{template:simple}{{rname=Mass Dex Save&lt;br&gt;}} {{charname= ---&lt;br&gt;&nbsp; @{target|target1|token_name}: [[1d20+@{target|target1|dexterity_save_bonus}]]&lt;br&gt;&nbsp; @{target|target2|token_name}: [[1d20+@{target|target2|dexterity_save_bonus}]]&lt;br&gt; @{target|target3|token_name}: [[1d20+@{target|target3|dexterity_save_bonus}]]&lt;br&gt; @{target|target4|token_name}: [[1d20+@{target|target4|dexterity_save_bonus}]]&lt;br&gt; @{target|target5|token_name}: [[1d20+@{target|target5|dexterity_save_bonus}]]&lt;br&gt; @{target|target6|token_name}: [[1d20+@{target|target6|dexterity_save_bonus}]]&lt;br&gt; ---&lt;br&gt;}} Then, create a simple Ability on your Macro Mule as per&nbsp; Macro Character Sheet &nbsp;by keithcurtis&nbsp; to activate these values: @{selected|bar1} Add it to your quickbar. When you want to roll a Mass Dex Save for the correct amount of targets, simply select the corresponding token &nbsp;(IE: n.4 for four targets) and click the macro in your quickbar . This is what it'll look like (let's say our Sorcerer has just cast a Fireball at the undead in front of him): Now what's real interesting is: you can use the same set of numerical tokens and use the other bars for a different kind of roll . You just need to use a different macro that has&nbsp; @{selected|barN} &nbsp;or&nbsp; @{selected|barN|max}&nbsp; instead of @{selected|bar1}. This means that with a bit of copy/paste you can create all kind of dynamic rolls using only a few reused tokens and a single macro per roll. EXAMPLE: using&nbsp; Storing and Reading Values for Macros using the Turn Tracker &nbsp;by Pat&nbsp; I have created two Variable characters that I can assign values in the tracker manually to and that are invisible to players. I have set up a&nbsp; Dynamic Aoe Damage &nbsp;macro that goes well with that Mass Dex Save by assigning to the two MrVariables the values 6 &nbsp;and 8 (for 6d8 Fireball damage): This is the code for token n.6/six targets: &amp;{template:simple}{{rname=AoeDmg&lt;br&gt;}} {{charname= ---&lt;br&gt;&nbsp; @{target|target1|token_name}: [[@{tracker|MrVariable}d@{tracker|MrVariable2}]] *damage!*&lt;br&gt; @{target|target2|token_name}: [[@{tracker|MrVariable}d@{tracker|MrVariable2}]] *damage!*&lt;br&gt; @{target|target3|token_name}: [[@{tracker|MrVariable}d@{tracker|MrVariable2}]] *damage!*&lt;br&gt; @{target|target4|token_name}: [[@{tracker|MrVariable}d@{tracker|MrVariable2}]] *damage!*&lt;br&gt; @{target|target5|token_name}: [[@{tracker|MrVariable}d@{tracker|MrVariable2}]] *damage!*&lt;br&gt; @{target|target6|token_name}: [[@{tracker|MrVariable}d@{tracker|MrVariable2}]] *damage!*&lt;br&gt; ---&lt;br&gt;}} NOTE: &nbsp;if you want to give these tokens persistency and have access to more than 6 Bar fields, simply create a series of characters and assign a token as the default one for each. This way you can also easily export the tokens between campaigns. Even better method using Chat Menus (thanks Blue64 for the help!) If you want to let your player use these multirolls, you won't be able to use hidden tokens to set this up...but you can do an even better job by using Chat Menus!&nbsp; We're going to use&nbsp; Example of Structured Abilities: The XP Macro &nbsp;by Ed S. &nbsp;to set up several Abilities on a Macro Mule that has been set as "Can be edited and controlled by: all players".&nbsp; We are going to use the same example as above, and create a Chat Menu that allows the GM and &nbsp;the players to target multiple tokens for a damage roll or a DEX/WIS saving throw (since these are the most commons one that affect multiple targets). Of course you can use this method to add other buttons with different effects. On your PC accessible Macro Mule (mine is called MacroPg &nbsp;in this example code), create&nbsp;a parent Ability&nbsp; like this one: &amp;{template:npcaction} {{rname=Targeted Effects}} {{description=Targets for damage: [1](~MacroPG|AoE-1) [2](~MacroPG|AoE-2) [3](~MacroPG|AoE-3) [4](~MacroPG|AoE-4) [5](~MacroPG|AoE-5) Targets for saves: [1](~MacroPG|Saves-1) [2](~MacroPG|Saves-2) [3](~MacroPG|Saves-3) [4](~MacroPG|Saves-4) [5](~MacroPG|Saves-5) }} This is what gets printed in the chat when you launch this Ability: These buttons don't do anything at the moment. To correct that, we'll have to create all the various Abilities that are called when each button is pressed. On your PC accessible Macro Mule, create&nbsp;all the&nbsp; child Abilities&nbsp; like these: Aoe-1 &amp;{template:npcaction} {{rname=Targeted Damage}} {{description=**@{target|token_name}**: [[@{tracker|MrVariable}]] *damage!* }} Aoe-2 &amp;{template:npcaction} {{rname=AoE Damage}} {{description=**@{target|target1|token_name}**: [[@{tracker|MrVariable}]] *damage!* **@{target|target2|token_name}**: [[@{tracker|MrVariable}]] *damage!* }} Saves-1 &amp;{template:npcaction} {{rname=Mass Saves (DC ?{DC|13}):}} {{description= **@{target|target1|token_name}**: DEX[[1d20+@{target|target1|dexterity_save_bonus}]] WIS[[1d20+@{target|target1|wisdom_save_bonus}]] }} Saves-2 &amp;{template:npcaction} {{rname=Mass Saves (DC ?{DC|13}):}} {{description= **@{target|target1|token_name}**: DEX[[1d20+@{target|target1|dexterity_save_bonus}]] WIS[[1d20+@{target|target1|wisdom_save_bonus}]] **@{target|target2|token_name}**: DEX[[1d20+@{target|target2|dexterity_save_bonus}]] WIS[[1d20+@{target|target2|wisdom_save_bonus}]] }} And so on (up to AoE-5 and Saves-5 in this example). When invked (by pressing the corresponding chat menu button), these Abilities will ask you to select X targets (and ented a DC value, for the Saves-N ones), then print out a template in the chat. MrVariable &nbsp;is the name of the token I've added to the Initiative tracker to insert the value for the damage roll (let's say its value is 4d6+4 atm. The token is hidden in the FoW band, but its also set on the Token layer, to allow the players to edit this value themselves). This is an example output: NOTE: &nbsp;you don't need to add HTML code when writing in the Ability field; if you want your text to be formatted in a different way (IE: you want a linebreak or something), simply arrange the content of the Ability itself in a more pleasant way! NOTE2: &nbsp;you can add (or remove) as many buttons you want from the parent Ability!
That is a very Long &amp; involved process, yes, &amp; I applaud your Ingenuity. However I've found that it's easier for myself to make use of the Chat Buttons Trick mixed with the Macro/Ability Mule (in this Case, PC accessible, so I use my MacroPC Sheet), in order to assign a variable Targeting Array. This way you only need to Set it up once, &amp; with some quick Navigation through your Chat Menus, you can call up exactly the correct number of the appropriate Rolls by selecting the Type of Roll via the Chat Menu, with the Quantity in a Sub-menu. Both of these options are simply Branch Programming, where you Prepare for 01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 11, 12, 13, 14, 15, (etc) Targets, however, the easy way to build it is to Start with the 1st Target, &amp; simply Copy/Paste the Code into the 2 Target sections, then update it to Target 2, then repeat for 3, &amp; again for 4, &amp; so on, &amp; so forth. The reason why you'll want the PCs to be able to Access the Targeting Array is because you want 2 things from it: 1. You want it separate from the Group Rolls Type, so it doesn't Roll the stuff on its own, only Target. 2. Thanks to the Modular Nature of this method, you can repurpose the Targeting Array for the different Spells &amp; Abilities. Barbarian used Whirlwind Attack whilst Surrounded? No Problem! Lv 17+ Warlock cast Eldritch Blast? Done! Sorcerer cast Fireball? Easy! Wizard cast Lv 9 Magic Missile? You got it covered! 3. Another Side Effect of this method is that you don't need multiple Character Sheets, cutting down on the ever present Lag in those Higher End game Types that use lots of Imported Image Assets, Dynamic Lighting, Advanced Fog of War, &amp; the tons of Lag you can clear out if you have a Spell Macro Mule (specifically 1 for each Stat), as the text in the Description adds up to a lot of Lag surprisingly quickly. I personally have 3 (Intelligence, Wisdom, &amp; Charisma) per Spell Level.
1580085059

Edited 1580090854
That is a very good point! The funny thing is: I'm already using yours (I think?) 15 part XP multiplier Branch Macro, so it would make sense to use the same system for this too. Also, I've just realized you can include anything &nbsp;as a value for a token in the tracker, so it's more or less a way to store variables values that can be called...so you can store a full dice roll in there (IE: 6d8+10) or even a formula! Now, if only I could find a way to use @{tracker|variable_name} inside something like this: &amp;{template:simple} {{rname=Multiroll&lt;br&gt;}} {{charname= ---&lt;br&gt;&nbsp; @{target|target1|token_name}: [[1d20+@{target|target1|@{tracker|variable_name}}]]&lt;br&gt;&nbsp; @{target|target2|token_name}: [[1d20+@{target|target2|@{tracker|variable_name}}]]&lt;br&gt; ---&lt;br&gt;}} Without the parser failing with a&nbsp; No attribute was found for @{TARGET:target1|@{tracker} &nbsp;then that formula could be used for every 1d20+mod roll (you would just need to swap the value in the tracker, IE: dexterity_save_mod &nbsp;or persuasion_bonus), instead of having to use multiple formulas. You could even add a step at the beginning of your chat button chain where you push a value to the tracker by clicking a button.&nbsp; EDIT: I guess a solution would be to have X tokens with an invisible turn tracker and change those values, so that you can do any numbers of 1d20+mod rolls using the same branching macro. It's less than ideal though: &amp;{template:simple} {{rname=Multiroll&lt;br&gt;}} {{charname= ---&lt;br&gt;&nbsp; @{target|target1|token_name}: [[1d20+@{tracker|MrVariable}]]&lt;br&gt; @{target|target2|token_name}:[[1d20+@{tracker|MrVariable2}]]&lt;br&gt; &nbsp;---&lt;br&gt;}} And in this case the value for MrVariable would be&nbsp; @{target|target1|dexterity_save_bonus} &nbsp;and the value for MrVariable2 would be&nbsp; @{target|target2|dexterity_save_bonus} &nbsp;and so on. Not really useful without the ability to change a single variable value instead of 5 every time you want to multiroll. If only it would have been possible to send multiple values to the tracker with a single macro, it could be easily automated :( EDIT: so far the hack solution has been the following...the MrVariable token is still hidden in the FoW but it's now on the Token layer and &nbsp;it has been marked as "Controllable by all players". This means that with a Chat Menu to select the number of targets and MrVariable's tracker field to determine the value for the attack, everyone can roll multi-target damage from a single macro (well 1+4). I've realized I &nbsp;am going to be rolling mass saves, while the AoE damage macro should be useful for both sides. Still trying t find a way to use value substitution on the attribute strings to be able to quickly roll variable 1d20+mod throws...
1580178218

Edited 1580354282
for something like that, you'll need to use the same trick as the Chat Buttons, where you run it through a Parser Buffer, I use the same trick for my Spells (so I don't need to worry about changed Names for the Sheets, just which of the Sheets I'm using), for example, whenever I have a Macro (such as the Chat Menu Buttons trick) look up Cure Wounds, I have it call up @{ChaLv1|Cure Wounds} which returns the following result: &amp;#37;&amp;#123;@{character_name}&amp;#124;Cure-Wounds&amp;#125; as you can see, there's a lot of HTML replacement going on, however, when it gets sent to Chat, it will parse into: %{ChaLv1|Cure-Wounds} for the Clickable Chat Button's Destination, the Button, when clicked, will send that to chat, causing the Chat to then call up the Spell I have prepared, which reads as follows: !@{CastAt} /ooc &amp;{template:spell} {{name=**Cure Wounds**}} {{innate= [*Basic Rules*](<a href="https://www.dndbeyond.com/spells/cure-wounds" rel="nofollow">https://www.dndbeyond.com/spells/cure-wounds</a>)}} {{level=***Level @{CastAt}** Evocation Spell*}} {{castingtime=*1 Action*}} {{range=*Touch*}} {{target=[*1 Creature*](! @{MacroPC|Target1})}} {{v=1}} {{s=1}} {{duration=*Instantaneous*}} {{description=**Classes:** *Artificer* *Bard* *Cleric* *Cleric (Life Domain)* *Druid* *Paladin* *Ranger* *Warlock (The Celestial)* *Sorcerer (Divine Soul: Good)* A Living Creature which @{You} Touches regains [[@{CastAt}]]d8 +@{spellcasting_ability} [Hit Points](! %{MacroPC|DmgCalc}Healing:=**&amp;#91;&amp;#91;@{CastAt}d8 +@{spellcasting_ability}&amp;#93;&amp;#93;**&amp;#125;&amp;#125;).}}{ as you can see, I have a lot of info there, and I'm using the 5e OGL Sheet's Spell Template for those curious. This also will not work out of the Box currently without some tweaks, as I'm referencing my MacroPC Sheet and a few custom Attributes in the ChaLv1 Sheet., including @{You} @{CastAt} @{spellcasting_ability} @{MacroPC|Target1} %{MacroPC|DmgCalc} I will Edit those out when I have time to make it more publicly usable. When the Command is sent via Chat, it will retrieve all of that content, however when it is sent via a Character Sheet, it changes slightly; as you can see. You'll also notice that the person looking up the Spell will need to select a Token in my example, otherwise they'll get the following Error: in this case I used a Paladin from my Campaign named Darchaos. The most noticeable thing is the lack of the innate field, this is overridden by the 5e OGL Character Sheet when sent from the Spells Sub-Menu, this can be useful for things such as Archetype Spells, or Scrolls. Now, if I wanted, I could combine the Target segment with the Healing segment, but I decided against that and instead opted for the Modular approach. Alternatively: You could just have 1 Token for all 6 Stats, making full use of their 6 slots where you can type @{selected|Bar1} @{selected|Bar2} @{selected|Bar3} @{selected|Bar1|max} @{selected|Bar2|max} @{selected|Bar3|max} then you can just have the Ability Query what Skill Check you're rolling. Edit: For anyone who wants to follow along and debug it themselves, we'll be using the following reference links in our PMs discussion: Macro Character Sheet - keithcurtis More info - gui8312 Chat Menus - keithcurtis (See below for list of Chat Menu generators) 2 column API buttons in Default Roll Template - Bryan P Use Modular Macros to Simplify Parsing - Aranador Prefix Trick to Variably Call Attributes - Kyle G. Storing and Reading Values for Macros using the Turn Tracker - Pat Links provided courtesy of KeithCurtis' post at the start of Page 1.
1580302897

Edited 1580311848
I see, I was missing this part I guess: &amp;#37;&amp;#123; That is parsed to %{ &nbsp;(for some reason the wiki reference only lists },| as symbols instead of everything). Nice, I'll give it a spin then! EDIT: mmm looks like I am missing something here cause I can't figure out where &nbsp;I should put the various parts of the puzzle. This is what my setup looks like now: Could you please explain how I should set this up for it to work? In the chat you can see the errors I am getting (and the value that gets printed out when I roll the "subs" ability. If I had one working setup I should be able to replicate it, even if it's a bit different. vvvvv gotcha! Blue64, feel free to shot me a PM about this if you want to :) In the meantime, I've edited the original post to include the superior Chat Menu method.
1580308024
keithcurtis
Forum Champion
Marketplace Creator
API Scripter
Blue64, Barakka, If you think it's going to take a lot of back and forth, it would be appreciated if you could hammer it out in PMs and then post final results here (or even edit the original trick post). We try to keep this thread on the lean side to make the tricks easier to find and understand.
1580484353

Edited 1580484560
"Concatenate" tracker values to build complex dynamic Abilities After chatting a bit with Blue64 &nbsp;I've realized almost by chance that a way to "Buffer parse" your formulas is to assign values to invisibile tokens and use those as if they were cells in a spreadsheet, using the Roll20 equivalent of Excel/Google Sheets&nbsp; CONCATENATE=() . This is a GM only trick &nbsp;- I normally roll multi saves for the enemies; my players roll individual saves against AoE threats, so they don't really need it. The main trick is simple: you can store strings in the tracker and use @{tracker| token_name } to call those values to avoid parsing issues when the Ability is resolved. In this example we're going to build a dynamic multitarget Save Thrower &nbsp;that with a couple of clicks can accomodate any Saving Throw with any DC value, and returns a list of successes and failures.&nbsp; This example takes advantage of the same Chat Menu system I've used in&nbsp; Dynamic Multitarget Roll without API , &nbsp; the only difference is the formula we're going to use for the Abilities. As pe r&nbsp; Custom Success/Failure Outcome Messages &nbsp;by Ziechael,&nbsp; create a rollable table called 0 &nbsp;with a single entry with the value of Failure . Set up a rollable table called 1 &nbsp;with a single entry with the value of SUCCESS! &nbsp;(use whatever message you prefer...this is what is going to be printed out in the template). Create three tokens &nbsp;on the GM layer and add them to the turn tracker (right click &gt; add turn). I named them var_1 , var_2 &nbsp;and var_3 &nbsp;cause I'm boring :P On the Initiative tracker, click on the value of each var token and assign them these values: var_1 &nbsp;is going to have a static value of&nbsp; @{target| &nbsp;(this is actually the main trick I'm describing: if you tried to write the same formula by using plain text, it would break the Ability; and if you used HTML substituiton instead, you would only get a plain text output in the chat. Using the value of var_1 &nbsp;instead makes everything work!). var_2 's dynamic value should be set to the D&amp;D 5e Attribute the save is using &nbsp;(so in this case the value for var_2 &nbsp;is Dexterity ). var_3 's dynamic value should be set to the CD of the Spell/Effect you are mass saving against (in this case it's set to 13 ). After you've set up your Parent Ability , set up your Child Abilities &nbsp;like this one: &amp;{template:npcaction} {{rname=@{tracker|var_2} Multisave (DC @{tracker|var_3})}} {{description=@{target|1|token_name}=[[ 1t[[[{1d20+@{tracker|var_1}1|@{tracker|var_2}_save_bonus}}&gt;@{tracker|var_3}]]] ]] @{target|2|token_name}=[[ 1t[[[{1d20+@{tracker|var_1}2|@{tracker|var_2}_save_bonus}}&gt;@{tracker|var_3}]]] ]] }} Set up all the Child Abilities &nbsp;you want (I usually set up to 5 targets, cause I can always launch the Ability twice if I need more than 5).&nbsp; When you roll the Ability, you'll be asked to click on each target. This is a sample output: NOTE: &nbsp;by changing the Tracker values for var_2 and var_3 , you can roll any Saving Throw with any DC: NOTE2: &nbsp;by removing _save_bonus &nbsp;from the formula and using var_2 &nbsp;to store a different sheet @attribute, you can use this system to roll any kind of 1d20+bonus roll in the game.
1580485615

Edited 1580486886
keithcurtis
Forum Champion
Marketplace Creator
API Scripter
Thanks Barakka That's a clever way to do something normally reserved for API territory. Nice job cross-referencing other tricks in the thread. Since the GM will likely have a lot more data on their tracker, you might want to consider using this Stylus style to make it more compact.
That's super creative use of the tracker!
1580491523

Edited 1580494458
Thanks! The main issue I've realized this system has is that "turn orders" are unique for instance of the token/character (so that you can have multiple Goblins sharing copies of the same sheet/tokens, of course). This means that if you use a lot of different battle maps, when you switch to a different you will have to add a turn order for these tokens (and populate their values) if you want to use them. Otherwise you'll get a&nbsp; No turn order item was found by the name var_1 &nbsp;(or 2, 3, etc) error message. I presume that these turn order items &nbsp;have unique IDs that could somehow be invoked, but not sure if there is a way to even see those values without a Pro subscription. EDIT: those are some nice stylus styles, thanks! That&nbsp;Tighter Sidebar Lists style is a game changer...just to show you the difference, this is a direct after/before:
How do you get the Tighter Sidebar Lists
1580873371
Scott C.
Forum Champion
Sheet Author
API Scripter
Compendium Curator
You can find the details in this thread
1580923451

Edited 1580983419
Battle Maps rollable table This is a quick one, but it goes well with my previous trick (since it allows you to use multiple battle maps in a single Roll20 Page, thus avoiding the "unique ID" for the turn order used in&nbsp; "Concatenate" Tracker Values to Build Complex Dynamic Abilities . This trick works best with Battle Maps that require minimal or no Dynamic Light layer interaction (IE: outdoor maps - for example&nbsp; I'm running a Tomb of Annihilation game and I'm using this trick to set up a few generic "Jungle" Battlemaps that I can use for Random Encounters and so on ).&nbsp; You can use it with maps that require you to draw Dynamic Light layer obstructions, but it's not well suited to it (see the bottom of this trick for more). Page Setup Create a new Roll20 Page that is large enough to host the largest of your Battle Maps (IE: 50x50). Enable Dynamic Lightning - switch Global Illumination on for daylight encounters or turn it off for nigh time. I normally also add a&nbsp; Black Aura Token for Night &nbsp;by lordmage for that. (Note: if you are a base user, you can use Basic Fog of War instead for a similar result). Rollable Table Setup Create a new Rollable table. Move it to either the top or the bottom of your list for ease of access. Add a new item. Make sure to include the size (in units/cells) in the name . Load one of your battle maps into the Icon field: Wait for the image to load, then Save Changes. Repeat for all your Battle Maps: Switch to the Map layer and click on the "Token" button for the Rollable Table. This will spawn a 1x1 cells Battle Map. On the Dynamic Light Layer, draw 2 lines (one horizontal and one vertical). It doesn't matter how big they are, we are going to move and resize them later: Trick Usage (should take less than 1 minute) When your players run into a random Encounter, switch to the Page you've set up. Right click the Map token, and select Multi-sided &gt; Choose Side (or roll a random one if you have no preferences!) Right click the Map token, select Advanced &gt; Set Dimensions and select "Units". Reference the name of the item in the Rollable Table and set the appropriate size. Move the map on the upper left corner. On Dynamic Light Layer, resize the lines so that they match the map: That's it! NOTE : if you Advanced Fog of War, don't forget to reset it before placing the PC tokens on the map! Otherwise each token will have access to the revealed FoW that it had the last time you used the Page (with a different Battle Map). Dynamic Light layer integration As noted this system doesn't really work with maps that require a lot of obstacles on the Dynamic Light layer; that said, you can use this trick if a few of your maps have some small, defined obstacles (like the walls of a cabin or a large statue or something like that): Switch to the Dynamic Light layer. Draw your obstacle; try to do a single continuos line if possible. In any case, make sure to group &nbsp;the obstacles that belong to the same map together so that you can quickly select them all with a click. Move the obstacle to outside the borders of the map. When you load a map that requires some an obstacle, move it back to the original position.
That is really neat trick with the maps, Barakka.&nbsp; Have you played with this trick?&nbsp; Does it reduce lag and load on maps?&nbsp; I have done multi-map pages before, where I just had 2-4 maps on one page, separated by Dynamic light barriers, but the size of some began to affect playability, so if this reduces that, it might be better.&nbsp; On a related note, it has always seemed to me that campaigns with a lot of pages often get bogged down, even if pages are archived.&nbsp; (So much so that I started doing development in a separate campaign and only moved map pages over with the transmogrifier as needed).&nbsp; Can you say whether this trick would/could potentially reduce that bogged down feel of a long-running campaign?&nbsp;
1580956754

Edited 1580956943
Hard to say. A lot of the longterm slowdown is variable bloat. There's just a lot of high level structures with the way data is formatted here. Archived pages are completely loaded still (last I checked. Try moving a token on an archived page with the API). It just doesn't display them in the navigator at the top. All their variables are loaded in case something on the tabletop references them. The only things that are loaded on demand are notes, gmnotes, and bio for characters/ handouts. (The ones requiring async in the API). They cache their results after though so they contribute to memory consumption after opening. That specific trick is much better than a large page however because graphics rendering is really tough on larger maps. Each map is 4+ canvases redrawing over each other. If you make your map 1 unit larger, consider that as 4 units larger. It'll add up quick. If you want to unbog your campaign, consider moving unused pages, characters, etc to another game like "cold storage". You can keep multiple for different chapters of your campaign for organization. Helps keep your main game as light as possible. I tend to stick with a "1 area behind, 1 area they're on, 3 ahead" format. Because it cuts down on the pages significantly and lets me be ready for when they bypass things I prepped. Quick battle mats can be loaded with Barakka's trick or pulled out of the freezer if things go really off the rails. Additionally, a quick little API script I wrote at some point is on("chat:message", function(msg) { if (msg.type == "api" &amp;&amp; msg.content.indexOf('!flushAttr ') == 0) { msg.content = msg.content.replace('!flushAttr ', ''); var charId = findObjs({_type: 'character', name: msg.content})[0].get('id'); _.each(findObjs({_type: 'attribute', _characterid: charId}), ob =&gt; {if (ob.get('max') != 'k') ob.remove()}); } }); There's no error checking or anything like that so buyer beware but if you issue !flushAttr&nbsp;Jeff's macro-mule into chat, it'll remove every attribute from "Jeff's macro-mule" that doesn't have a max value of "k" (for keep of course). This is a decent clearing of memory for some sheets like Pathfinder Community 1E which creates 235 attributes on generation (About 20% the attributes of a level 5 barbarian). As long as you don't open the character sheet again, they won't come back. If you need to to edit those important macros or things you can just flush the attributes again after you've opened it.