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)

Nice one! Do you happen to know how to do it on Firefox? Brian M. said: I've found a hacky way to find large files in your library for cleanup. In chrome you can hit F12 to open the developers console and execute arbitrary javascript. I opened my library and looked at my recent uploads and just kept scrolling down till my entire library was loaded into the list.  This list has each HTML element tagged with a specific class "recentupload".  The developers were so kind as to add an attribute to these elements saying the size of the file right in the html element.  Almost like they were going to add it to the list but didn't for some nefarious reason.  Executing the following code will print to the console the file names and file sizes. You can then copy it out into a spreadsheet, sort and finally pick the files that are too big. Copy their file names and go back to roll20 and use Ctrl + f to find that file and delete it. $('.recentupload').each(function(index) {console.log(this.textContent + ": " + $(this).attr('data-filesize'))}) Note that the textContent prefixes each entry with Drag, but it is easy enough to manually drop it.  You then enter the file name in the library search and delete away. 
1592101655

Edited 1592102050
Brian M. said: I've found a hacky way to find large files in your library for cleanup. In chrome you can hit F12 to open the developers console and execute arbitrary javascript. I opened my library and looked at my recent uploads and just kept scrolling down till my entire library was loaded into the list.&nbsp; This list has each HTML element tagged with a specific class "recentupload".&nbsp; The developers were so kind as to add an attribute to these elements saying the size of the file right in the html element.&nbsp; Almost like they were going to add it to the list but didn't for some nefarious reason.&nbsp; Executing the following code will print to the console the file names and file sizes. You can then copy it out into a spreadsheet, sort and finally pick the files that are too big. Copy their file names and go back to roll20 and use Ctrl + f to find that file and delete it. $('.recentupload').each(function(index) {console.log(this.textContent + ": " + $(this).attr('data-filesize'))}) Note that the textContent prefixes each entry with Drag, but it is easy enough to manually drop it.&nbsp; You then enter the file name in the library search and delete away.&nbsp; Thanks for pointing out this data attribute exists! You could also use: $('.recentupload').each(function(index, item) {console.log(item.querySelector('.namecontainer').textContent + ": " + $(this).attr('data-filesize'))}); To get the name and size without the preceding "Drag" text. I have also written a user style to expose the sizes: Full details of the user style are here: <a href="https://app.roll20.net/forum/permalink/8824230/" rel="nofollow">https://app.roll20.net/forum/permalink/8824230/</a>
Rincevent said: Nice one! Do you happen to know how to do it on Firefox? Brian M. said: [...] You should be able to hit F12 to open the Developer Tools and then click on the Console tab at the top. You can also reach this by pressing CTRL + SHIFT + K or from Firefox's main "hamburger" menu -&gt; Web Developer -&gt; Web Console. Once in the console, the instructions should be the same: paste in a copy of the code and click the "Run" button.
Is it possible through macros to whisper to more than one character with one post?
1592623466
The Aaron
Roll20 Production Team
API Scripter
Not directly, but you can create a character and put more than one player controlling it, then whisper to that character.&nbsp; All controlling players will receive whispers sent to that character.&nbsp; This is commonly used as a way to implement character languages.
1592629834
keithcurtis
Forum Champion
Marketplace Creator
API Scripter
That would be this stupid trick, if you want more detail: Use a "Placeholder" Character(s) to Handle In-Game Languages &nbsp;- Vince
Inline Rolls in Rollable Tables I've found a workaround to enable inline rolls within rollable table items. You create the table, using normal [[1d20]] syntax for inline rolls, i.e.: [[2d6+2]] Stirges swoop down attracted to the night campfire or the smell of blood. Then, in your macro or the chat, use hyperlink syntax to create a hyperlink that looks something like this: [Combat Encounters])(`[[1t[combat-encounters]]]) The backtick (`) allows you to basically tell the system to call the table roll. Weirdly, though, it posts the roll as normal chat text, rather than as the yellow-highlighted table text or as an image. Because of this quirk, inline rolls function normally. But... it also does this weird thing in the output: <span class="inlinerollresult showtip tipsy-n-right" original-title=" Rolling 2d6+2 = ( 2 + 5 )+2" style="box-sizing: content-box; background-color: rgb(254, 246, 142); border: 2px solid rgb(254, 246, 142); padding: 0px 3px; font-weight: bold; cursor: help; font-size: 1.1em; color: rgb(64, 64, 64); font-family: &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif; white-space: normal;">9 &nbsp;Stirges swoop down attracted to the night campfire or the smell of blood)'&gt; <span class="inlinerollresult showtip tipsy-n-right fullfail" original-title=" Rolling 2d6+2 = ( 2 + 1 )+2" style="box-sizing: content-box; background-color: rgb(254, 246, 142); border: 2px solid rgb(179, 21, 21); padding: 0px 3px; font-weight: bold; cursor: help; font-size: 1.1em; color: rgb(64, 64, 64); font-family: &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif; white-space: normal;">5 &nbsp;Stirges swoop down attracted to the night campfire or the smell of blood Any ideas on how to get rid of that weird second result?
Also, there's a stupid trick behind that stupid trick. I found this rather helpful bit of homebrewery &nbsp;from sachagoat on this subreddit &nbsp;that basically modifies DMG rules for travel to accomodate more non-combat encounters by creating a "dynamic travel" table that determines whether you roll on a combat table, simply describe the environment, or roll on a non-combat table. I wanted to incorporate this into my sessions with as little looking-stuff-up as possible, so I built the following tables: dynamic-travel combat-encounters-day combat-encounters-night road-travel off-road-travel I then created a macro called dynamic-travel: /w gm &amp;{template:default}{{Dynamic Travel=[[1t[dynamic-travel]]]}}{{Combat=**[Day](`/w gm [[1t[combat-encounters-day]]]})** | **[Night](`/w gm [[1t[combat-encounters-night]]])**}}{{Events=**[Road Travel](`/w gm [[1t[road-travel]]])** | **[Off-Road Travel](`[[1t[off-road-travel]]])**}} This sends the menu shown above to the chat. At the top of the menu is a message telling you the result of the dynamic-travel roll and, thus, which other table to roll on. The rest of the menu offers links that, when clicked, whisper roll on the other tables using the syntax in my previous post, in an effort to get the inline dice rolls.
I draw circles on the GM layer to indicated the radii in which sounds can be heard (growling, hammering, water dripping etc). These act as a visual cue to me to describe to the players what they can hear as they enter that area, or to play a sound file if you have one.
1592880325

Edited 1592883979
Oosh
Sheet Author
API Scripter
Eric B. said: Inline Rolls in Rollable Tables 9 &nbsp;Stirges swoop down attracted to the night campfire or the smell of blood)'&gt; 5 &nbsp;Stirges swoop down attracted to the night campfire or the smell of blood Any ideas on how to get rid of that weird second result? I've had a bit of a play around, and the only way I've found to get rid of the second result is hiding it outside the fields of a template. So instead of this: [[2d6+2]] Stirges swoop down attracted to the night campfire or the smell of blood. Put the inline roll outside the curlies: &amp;{template:default} [[2d6+2]] {{$[[0]] Stirges swoop down attracted to the night campfire}} It still rolls twice (you can chuck a $[[1]] in if you want the second roll for any reason). I can't seem to get the inline roll to function at all without using a button... but I'll keep playing around with it. It also seems to generate the table roll at the time when it creates the button - clicking the button repeatedly will always bring up the same table result (although it will roll the table entry's inline rolls each time). It will also ignore any changes made to the Table entry. Perhaps it would be worth labeling the button "Show Result" or similar, as a reminder that it isn't making a fresh roll on the table when you click on it. Maybe this is why it works, it's not actually rolling on the table once it's created the button? The chat button now directly runs the Table entry's code at the time it was created, rather than rolling on the actual Table. Also worth noting that you can call another working chat button from a Rollable Table using this trick. Nice one, Eric!
Oosh said: I've had a bit of a play around, and the only way I've found to get rid of the second result is hiding it outside the fields of a template. So instead of this: [[2d6+2]] Stirges swoop down attracted to the night campfire or the smell of blood. Put the inline roll outside the curlies: &amp;{template:default} [[2d6+2]] {{$[[0]] Stirges swoop down attracted to the night campfire}} It still rolls twice (you can chuck a $[[1]] in if you want the second roll for any reason). I can't seem to get the inline roll to function at all without using a button... but I'll keep playing around with it. It also seems to generate the table roll at the time when it creates the button - clicking the button repeatedly will always bring up the same table result (although it will roll the table entry's inline rolls each time). It will also ignore any changes made to the Table entry. Perhaps it would be worth labeling the button "Show Result" or similar, as a reminder that it isn't making a fresh roll on the table when you click on it. Maybe this is why it works, it's not actually rolling on the table once it's created the button? The chat button now directly runs the Table entry's code at the time it was created, rather than rolling on the actual Table. Also worth noting that you can call another working chat button from a Rollable Table using this trick. Nice one, Eric! Well would ya look at that! Thanks, Oosh!
Made some modifications to Greg S's macro to run in my own macros instead of from the character sheet since I prefer token macros.&nbsp; Greg graciously helped me figure out the syntax with some further explanation of the dl1 and dh1 (modifiers??&nbsp; not sure what you call them). /em &lt;&lt;&lt;CharacterNameHere&gt;&gt;&gt; prays and heals [[?{slot level?|2}d8+{2+?{slot level|2}}+@{&lt;&lt;&lt;CharacterNameHere&gt;&gt;&gt;|wisdom_mod}]] hit points; self heals for [[{[[{6, @{level}}dh1 -6 +1]], 0}dl1 * (?{slot level?}+ 2)]] This still requires you to select slot level twice, once for the first healing spell, once for the self healing.&nbsp;&nbsp; Results look like this in the chat window (if you're under 6th level) : &lt;&lt;&lt;CharacterNameHere&gt;&gt;&gt; prays and heals&nbsp; <span class="userscript-inlinerollresult showtip tipsy-n-right fullcrit" title=" Rolling 2d8+{2+2}+3 = ( 7 + 8 )+{2+2}+3" style="background-color: rgb(254, 246, 142); border: 2px solid rgb(63, 179, 21); padding: 0px 3px; cursor: help; font-size: 1.1em; color: rgb(101, 62, 16); font-family: &quot;helvetica neue&quot;, helvetica, arial, sans-serif; font-style: italic; text-align: center;">22 &nbsp;hit points; self heals for&nbsp; 0 Results look like this in the chat window (if you're above 6th level): &lt;&lt;&lt;CharacterNameHere&gt;&gt;&gt;&nbsp; prays and heals&nbsp; <span class="userscript-inlinerollresult showtip tipsy-n-right" title=" Rolling 2d8+{2+2}+3 = ( 4 + 3 )+{2+2}+3" style="background-color: rgb(254, 246, 142); border: 2px solid rgb(254, 246, 142); padding: 0px 3px; cursor: help; font-size: 1.1em; color: rgb(101, 62, 16); font-family: &quot;helvetica neue&quot;, helvetica, arial, sans-serif; font-style: italic; text-align: center;">14 &nbsp;hit points; self heals for&nbsp; 4 FP Greg S. &nbsp;said: Auto calculating level specific buffs.&nbsp; (Basic IF/THEN statement, no API) I'm very new to Roll20 so I appologise if someone has posted a similar solution before, I couldn't find anything when I was looking. So I wanted a way for the Cleric's Blessed Healer buff to apply when they reach level 6 without having to edit the spells again. I came up with this macro that functions as a basic IF/THEN statement that outputs 1 for true and 0 for false.&nbsp; Replace "#" for the desired level, they must be the same value. {[[{#, @{level}}dh1 -# +1]], 0}dl1 * (Value to display if true) This example checks if the character is of level 6 or greater, then returns the amount they self healed for using Blessed Healer. {[[{6, @{level}}dh1 -6 +1]], 0}dl1 * ([[?{Cast at what level?}]][spell level] + 2[flat]) Let's assume they are level 6 and are casting a healing spell at 3rd level. It would resolve as such. {[[{6, 6}dh1 -6 +1]], 0}dl1 * (3[spell level] + 2[flat]) {[[6 -6 +1]], 0}dl1 * (3 + 2) {1, 0}dl1 * (3 + 2) 1 * (3 + 2) 5 This time they are level 5 and are casting a healing spell at 3rd level. It would now resolve as such. {[[{6, 5}dh1 -6 +1]], 0}dl1 * (3[spell level] + 2[flat]) {[[5 -6 +1]], 0}dl1 * (3 + 2) {0, 0}dl1 * (3 + 2) 0 * (3 + 2) 0 The bit you want to know. How do I add it to my character? This macro replaces the default "Cast at what level?" query and also applies the Desciple of Life buff to the spell. Replace the "Healing" value with this macro, and change the "Higher lvl cast dmg" to 0 d 0.&nbsp; Remember to replace the "d#" in the macro with the spells dice. Example: Healing Word would be "d4". [[?{Cast at what level?|Level 1,1|Level 2,2|Level 3,3|Level 4,4|Level 5,5|Level 6,6|Level 7,7|Level 8,8|Level 9,9}]]d# + [[?{Cast at what level?}]][spell level] + 2[flat] If you have a spell like Mass Healing Word that is cast from level 3 minimum you use the same macro but delete the queries entries not required. [[?{Cast at what level?|Level 3,3|Level 4,4|Level 5,5|Level 6,6|Level 7,7|Level 8,8|Level 9,9}]]d4 + [[?{Cast at what level?}]][spell level] + 2[flat] Paste this macro in the "Damage2" box and give it the damge type of "Self Healing".&nbsp; Remember to replace both "#" in the macro with the desired level. Make sure they are the same number. {[[{#, @{level}}dh1 -# +1]], 0}dl1 * ([[?{Cast at what level?}]][spell level] + 2[flat]) Your spell entry should look like this. Now when you cast a healing spell to result will look like this if you are atleast level 6. And like this if you are below level 6. It might not be all that necessary, but this allows me to add two macros to the Cleric's healing spells when they unlock and never have to think about it again. I'll try to answer any question and clarify anything that might not make scence. Any feedback is also welcomed.
1593450115
keithcurtis
Forum Champion
Marketplace Creator
API Scripter
Hi Mark, This is a problem that should be in its own thread. Preferably with a subject line like "Need help with token-mod solution for wild shape macro". This thread is specifically for the posting of "solutions to common problems or activities by clever or innovative use of the interface" (from the index post). Users post finished techniques and tricks here. If you post your issue here, it will not be seen by folks who read the subject lines in the forums, and will make this thread harder to find tricks in.
When is a GM screen not a GM screen? Howdy, I'm fairly new to Roll20, and still in hunter-gatherer mode for good ideas. My D&amp;D group really likes the feature of 3D dice, and likes to see the the GM (me) use them as well, even (especially?) for secret rolls. One of the tool styles that I like I found on the "Roll Skills (All)" and "Roll Saving Throws (all)" shown on the page&nbsp; Macros that I use to improve my D&amp;D games &nbsp;*. They simultaneously roll a whole bunch of dice (as opposed to querying for a skill/stat) to produce output like: &nbsp; &nbsp;and&nbsp; With 3-D dice turned on, the macros generate a significant number&nbsp;of screen pixels, even if I whisper them just to myself. So, I modified those macros as follows: 1. Created a rollable table with entries 1,2,3, ... 20 named "d20" 2. Modified the macros to whisper the results to me and use the rollable table for the rolls - I substituted " t[d20] " for " @{selected|d20} ". Thus producing: /em GM Rolls... /w gm &amp;{template:default} {{name= @{selected|character_name} Skills}}&nbsp; {{Acrobatics=[[t[d20]+(@{selected|acrobatics_bonus}@{selected|pbd_safe}*(1-ceil((@{selected|npc})*0.1)))+(@{selected|npc_acrobatics}*@{selected|npc})]] | [[t[d20]+(@{selected|acrobatics_bonus}@{selected|pbd_safe}*(1-ceil((@{selected|npc})*0.1)))+(@{selected|npc_acrobatics}*@{selected|npc})]]}} {{Animal Handling=[[t[d20]+(@{selected|animal_handling_bonus}@{selected|pbd_safe}*(1-ceil((@{selected|npc})*0.1)))+(@{selected|npc_animal_handling}*@{selected|npc})]] | [[t[d20]+(@{selected|animal_handling_bonus}@{selected|pbd_safe}*(1-ceil((@{selected|npc})*0.1)))+(@{selected|npc_animal_handling}*@{selected|npc})]]}} {{Arcana=[[t[d20]+(@{selected|arcana_bonus}@{selected|pbd_safe}*(1-ceil((@{selected|npc})*0.1)))+(@{selected|npc_arcana}*@{selected|npc})]] | [[t[d20]+(@{selected|arcana_bonus}@{selected|pbd_safe}*(1-ceil((@{selected|npc})*0.1)))+(@{selected|npc_arcana}*@{selected|npc})]]}} {{Athletics=[[t[d20]+(@{selected|athletics_bonus}@{selected|pbd_safe}*(1-ceil((@{selected|npc})*0.1)))+(@{selected|npc_athletics}*@{selected|npc})]] | [[t[d20]+(@{selected|athletics_bonus}@{selected|pbd_safe}*(1-ceil((@{selected|npc})*0.1)))+(@{selected|npc_athletics}*@{selected|npc})]]}} {{Deception=[[t[d20]+(@{selected|deception_bonus}@{selected|pbd_safe}*(1-ceil((@{selected|npc})*0.1)))+(@{selected|npc_deception}*@{selected|npc})]] | [[t[d20]+(@{selected|deception_bonus}@{selected|pbd_safe}*(1-ceil((@{selected|npc})*0.1)))+(@{selected|npc_deception}*@{selected|npc})]]}} {{History=[[t[d20]+(@{selected|history_bonus}@{selected|pbd_safe}*(1-ceil((@{selected|npc})*0.1)))+(@{selected|npc_history}*@{selected|npc})]] | [[t[d20]+(@{selected|history_bonus}@{selected|pbd_safe}*(1-ceil((@{selected|npc})*0.1)))+(@{selected|npc_history}*@{selected|npc})]]}} {{Insight=[[t[d20]+(@{selected|insight_bonus}@{selected|pbd_safe}*(1-ceil((@{selected|npc})*0.1)))+(@{selected|npc_insight}*@{selected|npc})]] | [[t[d20]+(@{selected|insight_bonus}@{selected|pbd_safe}*(1-ceil((@{selected|npc})*0.1)))+(@{selected|npc_insight}*@{selected|npc})]]}} {{Intimidation=[[t[d20]+(@{selected|intimidation_bonus}@{selected|pbd_safe}*(1-ceil((@{selected|npc})*0.1)))+(@{selected|npc_intimidation}*@{selected|npc})]] | [[t[d20]+(@{selected|intimidation_bonus}@{selected|pbd_safe}*(1-ceil((@{selected|npc})*0.1)))+(@{selected|npc_intimidation}*@{selected|npc})]]}} {{Investigation=[[t[d20]+(@{selected|investigation_bonus}@{selected|pbd_safe}*(1-ceil((@{selected|npc})*0.1)))+(@{selected|npc_investigation}*@{selected|npc})]] | [[t[d20]+(@{selected|investigation_bonus}@{selected|pbd_safe}*(1-ceil((@{selected|npc})*0.1)))+(@{selected|npc_investigation}*@{selected|npc})]]}} {{Medicine=[[t[d20]+(@{selected|medicine_bonus}@{selected|pbd_safe}*(1-ceil((@{selected|npc})*0.1)))+(@{selected|npc_medicine}*@{selected|npc})]] | [[t[d20]+(@{selected|medicine_bonus}@{selected|pbd_safe}*(1-ceil((@{selected|npc})*0.1)))+(@{selected|npc_medicine}*@{selected|npc})]]}} {{Nature=[[t[d20]+(@{selected|nature_bonus}@{selected|pbd_safe}*(1-ceil((@{selected|npc})*0.1)))+(@{selected|npc_nature}*@{selected|npc})]] | [[t[d20]+(@{selected|nature_bonus}@{selected|pbd_safe}*(1-ceil((@{selected|npc})*0.1)))+(@{selected|npc_nature}*@{selected|npc})]]}} {{Perception=[[t[d20]+(@{selected|perception_bonus}@{selected|pbd_safe}*(1-ceil((@{selected|npc})*0.1)))+(@{selected|npc_perception}*@{selected|npc})]] | [[t[d20]+(@{selected|perception_bonus}@{selected|pbd_safe}*(1-ceil((@{selected|npc})*0.1)))+(@{selected|npc_perception}*@{selected|npc})]]}} {{Performance=[[t[d20]+(@{selected|performance_bonus}@{selected|pbd_safe}*(1-ceil((@{selected|npc})*0.1)))+(@{selected|npc_performance}*@{selected|npc})]] | [[t[d20]+(@{selected|performance_bonus}@{selected|pbd_safe}*(1-ceil((@{selected|npc})*0.1)))+(@{selected|npc_performance}*@{selected|npc})]]}} {{Persuasion=[[t[d20]+(@{selected|persuasion_bonus}@{selected|pbd_safe}*(1-ceil((@{selected|npc})*0.1)))+(@{selected|npc_persuasion}*@{selected|npc})]] | [[t[d20]+(@{selected|persuasion_bonus}@{selected|pbd_safe}*(1-ceil((@{selected|npc})*0.1)))+(@{selected|npc_persuasion}*@{selected|npc})]]}} {{Religion=[[t[d20]+(@{selected|religion_bonus}@{selected|pbd_safe}*(1-ceil((@{selected|npc})*0.1)))+(@{selected|npc_religion}*@{selected|npc})]] | [[t[d20]+(@{selected|religion_bonus}@{selected|pbd_safe}*(1-ceil((@{selected|npc})*0.1)))+(@{selected|npc_religion}*@{selected|npc})]]}} {{Sleight of Hand=[[t[d20]+(@{selected|sleight_of_hand_bonus}@{selected|pbd_safe}*(1-ceil((@{selected|npc})*0.1)))+(@{selected|npc_sleight_of_hand}*@{selected|npc})]] | [[t[d20]+(@{selected|sleight_of_hand_bonus}@{selected|pbd_safe}*(1-ceil((@{selected|npc})*0.1)))+(@{selected|npc_sleight_of_hand}*@{selected|npc})]]}} {{Stealth=[[t[d20]+(@{selected|stealth_bonus}@{selected|pbd_safe}*(1-ceil((@{selected|npc})*0.1)))+(@{selected|npc_stealth}*@{selected|npc})]] | [[t[d20]+(@{selected|stealth_bonus}@{selected|pbd_safe}*(1-ceil((@{selected|npc})*0.1)))+(@{selected|npc_stealth}*@{selected|npc})]]}} {{Survival=[[t[d20]+(@{selected|survival_bonus}@{selected|pbd_safe}*(1-ceil((@{selected|npc})*0.1)))+(@{selected|npc_survival}*@{selected|npc})]] | [[t[d20]+(@{selected|survival_bonus}@{selected|pbd_safe}*(1-ceil((@{selected|npc})*0.1)))+(@{selected|npc_survival}*@{selected|npc})]]}} and /em GM Rolls... /w gm &amp;{template:default} {{name= @{selected|character_name} Saves}} {{STR= [[t[d20]+@{selected|strength_mod}]] | [[t[d20]+@{selected|strength_mod}]]}} {{DEX= [[t[d20]+@{selected|dexterity_mod}]] | [[t[d20]+@{selected|dexterity_mod}]]}} {{CON= [[t[d20]+@{selected|constitution_mod}]] | [[t[d20]+@{selected|constitution_mod}]]}} {{INT= [[t[d20]+@{selected|intelligence_mod}]] | [[t[d20]+@{selected|intelligence_mod}]]}} {{WIS= [[t[d20]+@{selected|wisdom_mod}]] | [[t[d20]+@{selected|wisdom_mod}]]}} {{CHA= [[t[d20]+@{selected|charisma_mod}]] | [[t[d20]+@{selected|charisma_mod}]]}} &nbsp; 4. Then I defined the Macros as bar macros, with labels that use the Shh emoji&nbsp; 🤫 (thanks Keith for&nbsp; Use Emojis in Macro Buttons ) I also use a query-type selection macro when the players know an NPC is making a save or check in response to something they did, or see. Now, I can keep 3D dice turned on, and still roll "behind the screen". -- jcii * My apologies if this is not attributed correctly. I'm still trying to understand the site's etiquette.
To-do list macro Howdy also, As I'm still drinking from the firehose of Macros, API, and ideas, I created a Macro in my collection that has a title of "-to-do", and contents understandable to me (the content isn't the point) thus: /w gm {{ chatmenu css borders around centered macro bar to use vh not px shield on/off macro/script with feedback/token marker 2 digit stealth !token-mod --set statusmarkers|stealth-green:9|stealth-green[]:8 investigate API Areas of Effect setup descriptions for import auto setup attacks, skills, spellbooks investigate MonsterHitDice inves. libTokenMarker incves. resizer inv. UniversalVTTImporter inv. WildShapeResizer automate poisoning weapons automate bardic inspiration, Angel abilities automate import/export/dump/display/tonote/fromnote for attributes, abilities, etc. TokenActions: set description in !ta and add flag to delete all or delete some, and add dump descriptions and dump all }} Now, I use that Macro as a scratchpad, and click the assigned button when I finish some other task and am looking for the next shiny object to play with. Someday, actual adventure ideas may also get added to the list. -- jcii
As a player,&nbsp; I often have characters that get increasingly complex as the game progresses.&nbsp; I dislike spamming the chat with all my special abilities, especially when they don't count for a particular save or attack, etc.&nbsp; So, I put together a small multi-part trick from stuff I have learned from this thread.&nbsp; By doing so, I can post a button into the chat for any sheet call that has something like a notes field.&nbsp; And I can hide behind that button effects that do not always apply.&nbsp; Like if certain effects happen only on a crit, or only on a save vs fear, etc., but I don't want to have a long list post every time I attack or save.&nbsp; These shots are taken from a Pathfinder 2 game, but the trick should be pretty universal, and I would wager lots of people are already using it.&nbsp; So, here is what it looks like: The essential part here is that bit of code in the notes field of the attack, which when posted to chat, makes the blue button below the attack damage.&nbsp; Then, if it is not a Crit, I don't need to click it, and can conserve chat space.&nbsp; If it is, I click it and it spits out the special crit effect.&nbsp; (or save effect, or skill power, etc)&nbsp; Here is what the code on the back page appeared as: I used a roll template to make it look more "official"&nbsp; but it could easily be done with just plain text.&nbsp; If you do use a rolltemplate, make sure it is all one line without carriage returns, or it won't post right.&nbsp; So, below are generic macro bits to copy/modify.&nbsp; Note that your AbilityTitle must be the same in the button call and in the title of the Ability on the back page. The Button Title can be anything, and the subheader can be anything. [Button Title](~charactername|AbilityTitle) &amp;{template:rolls}{{subheader=Chat Title}}{{roll01=Text line 1 can include inline rolls, attribute calls, math, and more! }} {{roll02=text line 2, 3 etc }} Enjoy!
Darkness Spell Orb IDK if this has been done before but I created a 20ft radius orb in the dynamic lighting layer with cross sections vertically and horizontally at 5ft intervals inside it. The cool result is that from the outside of the darkness there is an orb of black obscuring what's inside and blocking vision from beyond while from the inside the player can see but only their own square and nothing else (mimicking how they can feel around them but not see past their immediate surroundings.) This way players can walk inside and outside the orb, you as the GM can see everything and the spell can even be moved or dropped. Essentially I drew a circle drawing then traced it with the dynamic lighting polygon line tool (because the lighting was glitchy for a true circle. Then I set vertical and horizontal lines aligned to the grid then I deleted the circle drawing in the gm layer and I grouped all the elements so the whole thing moves around at once.
1593749509
keithcurtis
Forum Champion
Marketplace Creator
API Scripter
That is pretty clever.
Nice!
1593905833
David M.
Pro
API Scripter
That's neat, Avi! This inspired me to write my first API script (first javascript code of any kind, actually), using your magical darkness concept. You can find it here: <a href="https://app.roll20.net/forum/post/8908015/magical-darkness-script-via-dynamic-lighting-layer/?pageforid=8908015#post-8908015" rel="nofollow">https://app.roll20.net/forum/post/8908015/magical-darkness-script-via-dynamic-lighting-layer/?pageforid=8908015#post-8908015</a> &nbsp; Thanks for the inspiration!
1594080630
GiGs
Pro
Sheet Author
API Scripter
Posting Code to Roll20 Forums This trick is credited to Himitsu Y. and Oosh.&nbsp; You know when you post code long examples to the forums, something like this: bla bla bla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla bla and roll20 does this: bla bla bla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla bla When you want the code to stand out and be readable, thats not very helpful at all. But over in this thread , Himitsu posted a code black with wrapped text. When you copy text from a place with html-compatible formating, and paste into roll20, that formatting is retained. I use this trick all the time when making handouts: write something up in Word, get it formatted how i want, and then paste it into a handout. It's so much easier than mesisng with roll20's native editor. It never occurred to use the trick on posts to the forums. Oosh suggested using the w3schools editor , and it works really well. Just paste the text you want in the left pane, and copy the right pane. Then in the roll20 editor, create a code block first , and paste the text into the block&nbsp;to get something like this: bla bla bla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla bla Now we can have readable code blocks. Its a bit of a hassle, but might be worth it for those longer one-line macros.
1594097691
keithcurtis
Forum Champion
Marketplace Creator
API Scripter
Interesting. If you are going to go with that interim step, it might be a good idea to assign it a monospace font like Monaco or Courier New while you have it in the rtf editor.
1594100156
GiGs
Pro
Sheet Author
API Scripter
The W3schools editor doesnt have the capability (that I could see), without using CSS commands. There's likely a better site to use.
Original post moved because this thread was the wrong one for posting this question: <a href="https://app.roll20.net/forum/post/8924176/macro-challenge/?pageforid=8924176#post-8924176" rel="nofollow">https://app.roll20.net/forum/post/8924176/macro-challenge/?pageforid=8924176#post-8924176</a>
1594243581
GiGs
Pro
Sheet Author
API Scripter
This isnt a thread for general discussion or solving problems. I suggest to you start a new thread with that question.
1594256883
keithcurtis
Forum Champion
Marketplace Creator
API Scripter
This is correct. The top post in the thread gives guidelines on posting. This thread is for posting complete finished tricks.
1594411967

Edited 1594412070
I'm late to the party here, but had a question pertaining to the Invisible Tokens ; specifically the part about the hidden traps. Keith, you directly reference the graphic by it's ID in the macro. How did you get the graphic ID? Is there a better way of handling that? Would like to be able to hide/show it by the link only and not selecting it. Thanks!
1594412400
keithcurtis
Forum Champion
Marketplace Creator
API Scripter
Select any graphic object and send @{selected|token_id} to chat. the id will appear. When selecting, make sure you get the hyphen at the beginning. If for any reason you ever need a character id, select a token that represents a character and use @{selected|character_id} And yeah, using the token id is a little more setup, but really pays off in speed of execution during play.
Thank you so much!
1594607551

Edited 1594607572
Kraynic
Pro
Sheet Author
I was told to post a couple things here.&nbsp; I thought there was something similar to this first one already here.&nbsp; I know I have seen it somewhere on the forums, so thanks to whoever originally had the idea. Elevator Music Map Let's say you have a lot of maps, your players are near the beginning, and the map they need to go to is somewhere about 47 map tiles (hopefuly an exaggeration) to the right.&nbsp; You can attempt to grab the player ribbon and shift scroll your way there without dropping the ribbon somewhere along the way.&nbsp; You can drag the destination map closer.&nbsp; Unless you want to keep your maps in a certain order, then that is out.&nbsp; Cue the elevator music! Create a map that is just a holding cell for the player ribbon.&nbsp; Make it as bland or as ornate as you want.&nbsp; You could even upload some elevator music to play while they are on that map!&nbsp; Now you just drop the ribbon on that map page and drag that page next to the destination, and when they leave that map for the one only 39 map pages to the left, they go back in the "elevator" for the trip.&nbsp;&nbsp; This will keep you from dropping the ribbon accidentally on that crucial map with lots of spoilers that doesn't have dynamic lighting turned on, meaning that they just saw everything when they landed there....
1594608100

Edited 1634672141
Kraynic
Pro
Sheet Author
Map Library for Free Accounts I have often given advice and seen other people recommend pro subscribers keep their active game map load lean.&nbsp; Create a game to hold maps that aren't needed "right now" to help lower load times.&nbsp; Well, you can do the same thing at the free account level. Any image can be saved as a default token.&nbsp; If you assemble your maps outside Roll20 and upload them as single images, you can assign them to a sheet.&nbsp; This will preserve their size.&nbsp; You may wish to store notes about map page size and anything else special about the map on the Bio &amp; Info tab of the sheet.&nbsp; You can then store them in your character vault for use later.&nbsp; If the vault gets cluttered, you can create a map library game and store your "map characters" there.&nbsp; Then when you need one of those maps, a quick trip through the character vault will get it into your active game.&nbsp; This would also allow you to save and use maps from modules in homebrew games. This method will not preserve dynamic lighting lines, but dynamic lighting doesn't work for a free account anyway.&nbsp; This should also work just fine for plus account holders for any maps where dynamic lighting is easy to redraw, or isn't that big of a deal for that specific map. Edit: &nbsp; At some point this behavior changed and I didn't think to return to update this.&nbsp; Free accounts can no longer export from the vault to a game created by that account.&nbsp; This will still work, but only if you start with a game that was created using a module that enables vault access.
Delete this ahhhh, don't let them know we know this.
1594662462

Edited 1594662494
Scott C.
Forum Champion
Sheet Author
API Scripter
Compendium Curator
Kraynic, just want to point out something about the map library trick. It won't work for Free accounts as they don't have access to the all access vault. It will work for plus accounts and for anyone that is using a paid module for the base of their game that the characters are going to be ported into.
1594664808

Edited 1594664985
Kraynic
Pro
Sheet Author
Scott C. said: Kraynic, just want to point out something about the map library trick. It won't work for Free accounts as they don't have access to the all access vault. It will work for plus accounts and for anyone that is using a paid module for the base of their game that the characters are going to be ported into. My understanding is that it works for any game you have created yourself (it has been quite a while since I have had a free account, so I could be wrong on this).&nbsp; Which means that someone running games can move characters they control freely among games in which they are the creator regardless of vault access.&nbsp; My understanding is that the lack of vault access bars players from importing their characters. Edit: If I am not correct in this, the Help Desk article needs some editing: Exporting Characters When you are ready to use a Character from your Vault in a new game, click the "Export to Game" link next to the Character on the main Vault page. You'll be presented with a list of eligible Games to export the Character to. Note that you can only export Characters to Games where: 1. You are the GM of the Game, or 2. You are a player of the Game and the GM has expressly turned on the "Allow Players to Import Characters" setting on the Game Settings page for that Game. Number 1 should cover what I was describing.
1594670156
Scott C.
Forum Champion
Sheet Author
API Scripter
Compendium Curator
Ah! gotcha. It's been a while since I was a free member as well.
I don't know if this is common practice already with other folks, but when I was setting up some rollable tokens recently, I realized that I could do the same thing with maps, so long as they're the same resolution. So, you make a rollable table for a set of maps, same as you would for other tokens, make your rollable token, put it on the map layer, resize as needed, and you have yourself a rollable map. tried using it at first for a convoluted chase system that I've since abandoned, but I have other uses in mind. You can use it for catch-all encounter maps that don't need dynamic lighting or a lot of extra tokens. For instance, you could make a set of five wilderness maps for a particular type of environment. When you're rolling for random encounters, roll for the encounter map too. Or you could just choose a map that would work well for the encounter you're about to run. You can use it to show major changes to an environment. If you know the disgruntled postal worker burns down the village partway through the session, create a rollable map in which one map is the not-burned village, another is the burning village, and another is the destroyed village. Same goes for weather/season. You can create a bunch of maps to represent different times of year and weather conditions. I often don't use maps at all, but I like having something for players to look at. I'm planning to start making rollable splash screens for some of the unmapped portions of my games so I can have a bunch of them ready without taking up valuable horizontal real estate in the page scroller. That's all I can think of at the moment, but I just figured this out, so I'm sure there's a ton of other ways to use rollable maps. Let me know if you think of any.
1595102490

Edited 1595103673
Fluffy5789 said: When is a GM screen not a GM screen? Howdy, I'm fairly new to Roll20, and still in hunter-gatherer mode for good ideas. My D&amp;D group really likes the feature of 3D dice, and likes to see the the GM (me) use them as well, even (especially?) for secret rolls. One of the tool styles that I like I found on the "Roll Skills (All)" and "Roll Saving Throws (all)" shown on the page&nbsp; Macros that I use to improve my D&amp;D games &nbsp;*. They simultaneously roll a whole bunch of dice (as opposed to querying for a skill/stat) to produce output like: &nbsp; &nbsp;and&nbsp; With 3-D dice turned on, the macros generate a significant number&nbsp;of screen pixels, even if I whisper them just to myself. So, I modified those macros as follows: 1. Created a rollable table with entries 1,2,3, ... 20 named "d20" 2. Modified the macros to whisper the results to me and use the rollable table for the rolls - I substituted " t[d20] " for " @{selected|d20} ". Thus producing: /em GM Rolls... /w gm &amp;{template:default} {{name= @{selected|character_name} Skills}}&nbsp; {{Acrobatics=[[t[d20]+(@{selected|acrobatics_bonus}@{selected|pbd_safe}*(1-ceil((@{selected|npc})*0.1)))+(@{selected|npc_acrobatics}*@{selected|npc})]] | [[t[d20]+(@{selected|acrobatics_bonus}@{selected|pbd_safe}*(1-ceil((@{selected|npc})*0.1)))+(@{selected|npc_acrobatics}*@{selected|npc})]]}} {{Animal Handling=[[t[d20]+(@{selected|animal_handling_bonus}@{selected|pbd_safe}*(1-ceil((@{selected|npc})*0.1)))+(@{selected|npc_animal_handling}*@{selected|npc})]] | [[t[d20]+(@{selected|animal_handling_bonus}@{selected|pbd_safe}*(1-ceil((@{selected|npc})*0.1)))+(@{selected|npc_animal_handling}*@{selected|npc})]]}} {{Arcana=[[t[d20]+(@{selected|arcana_bonus}@{selected|pbd_safe}*(1-ceil((@{selected|npc})*0.1)))+(@{selected|npc_arcana}*@{selected|npc})]] | [[t[d20]+(@{selected|arcana_bonus}@{selected|pbd_safe}*(1-ceil((@{selected|npc})*0.1)))+(@{selected|npc_arcana}*@{selected|npc})]]}} {{Athletics=[[t[d20]+(@{selected|athletics_bonus}@{selected|pbd_safe}*(1-ceil((@{selected|npc})*0.1)))+(@{selected|npc_athletics}*@{selected|npc})]] | [[t[d20]+(@{selected|athletics_bonus}@{selected|pbd_safe}*(1-ceil((@{selected|npc})*0.1)))+(@{selected|npc_athletics}*@{selected|npc})]]}} {{Deception=[[t[d20]+(@{selected|deception_bonus}@{selected|pbd_safe}*(1-ceil((@{selected|npc})*0.1)))+(@{selected|npc_deception}*@{selected|npc})]] | [[t[d20]+(@{selected|deception_bonus}@{selected|pbd_safe}*(1-ceil((@{selected|npc})*0.1)))+(@{selected|npc_deception}*@{selected|npc})]]}} {{History=[[t[d20]+(@{selected|history_bonus}@{selected|pbd_safe}*(1-ceil((@{selected|npc})*0.1)))+(@{selected|npc_history}*@{selected|npc})]] | [[t[d20]+(@{selected|history_bonus}@{selected|pbd_safe}*(1-ceil((@{selected|npc})*0.1)))+(@{selected|npc_history}*@{selected|npc})]]}} {{Insight=[[t[d20]+(@{selected|insight_bonus}@{selected|pbd_safe}*(1-ceil((@{selected|npc})*0.1)))+(@{selected|npc_insight}*@{selected|npc})]] | [[t[d20]+(@{selected|insight_bonus}@{selected|pbd_safe}*(1-ceil((@{selected|npc})*0.1)))+(@{selected|npc_insight}*@{selected|npc})]]}} {{Intimidation=[[t[d20]+(@{selected|intimidation_bonus}@{selected|pbd_safe}*(1-ceil((@{selected|npc})*0.1)))+(@{selected|npc_intimidation}*@{selected|npc})]] | [[t[d20]+(@{selected|intimidation_bonus}@{selected|pbd_safe}*(1-ceil((@{selected|npc})*0.1)))+(@{selected|npc_intimidation}*@{selected|npc})]]}} {{Investigation=[[t[d20]+(@{selected|investigation_bonus}@{selected|pbd_safe}*(1-ceil((@{selected|npc})*0.1)))+(@{selected|npc_investigation}*@{selected|npc})]] | [[t[d20]+(@{selected|investigation_bonus}@{selected|pbd_safe}*(1-ceil((@{selected|npc})*0.1)))+(@{selected|npc_investigation}*@{selected|npc})]]}} {{Medicine=[[t[d20]+(@{selected|medicine_bonus}@{selected|pbd_safe}*(1-ceil((@{selected|npc})*0.1)))+(@{selected|npc_medicine}*@{selected|npc})]] | [[t[d20]+(@{selected|medicine_bonus}@{selected|pbd_safe}*(1-ceil((@{selected|npc})*0.1)))+(@{selected|npc_medicine}*@{selected|npc})]]}} {{Nature=[[t[d20]+(@{selected|nature_bonus}@{selected|pbd_safe}*(1-ceil((@{selected|npc})*0.1)))+(@{selected|npc_nature}*@{selected|npc})]] | [[t[d20]+(@{selected|nature_bonus}@{selected|pbd_safe}*(1-ceil((@{selected|npc})*0.1)))+(@{selected|npc_nature}*@{selected|npc})]]}} {{Perception=[[t[d20]+(@{selected|perception_bonus}@{selected|pbd_safe}*(1-ceil((@{selected|npc})*0.1)))+(@{selected|npc_perception}*@{selected|npc})]] | [[t[d20]+(@{selected|perception_bonus}@{selected|pbd_safe}*(1-ceil((@{selected|npc})*0.1)))+(@{selected|npc_perception}*@{selected|npc})]]}} {{Performance=[[t[d20]+(@{selected|performance_bonus}@{selected|pbd_safe}*(1-ceil((@{selected|npc})*0.1)))+(@{selected|npc_performance}*@{selected|npc})]] | [[t[d20]+(@{selected|performance_bonus}@{selected|pbd_safe}*(1-ceil((@{selected|npc})*0.1)))+(@{selected|npc_performance}*@{selected|npc})]]}} {{Persuasion=[[t[d20]+(@{selected|persuasion_bonus}@{selected|pbd_safe}*(1-ceil((@{selected|npc})*0.1)))+(@{selected|npc_persuasion}*@{selected|npc})]] | [[t[d20]+(@{selected|persuasion_bonus}@{selected|pbd_safe}*(1-ceil((@{selected|npc})*0.1)))+(@{selected|npc_persuasion}*@{selected|npc})]]}} {{Religion=[[t[d20]+(@{selected|religion_bonus}@{selected|pbd_safe}*(1-ceil((@{selected|npc})*0.1)))+(@{selected|npc_religion}*@{selected|npc})]] | [[t[d20]+(@{selected|religion_bonus}@{selected|pbd_safe}*(1-ceil((@{selected|npc})*0.1)))+(@{selected|npc_religion}*@{selected|npc})]]}} {{Sleight of Hand=[[t[d20]+(@{selected|sleight_of_hand_bonus}@{selected|pbd_safe}*(1-ceil((@{selected|npc})*0.1)))+(@{selected|npc_sleight_of_hand}*@{selected|npc})]] | [[t[d20]+(@{selected|sleight_of_hand_bonus}@{selected|pbd_safe}*(1-ceil((@{selected|npc})*0.1)))+(@{selected|npc_sleight_of_hand}*@{selected|npc})]]}} {{Stealth=[[t[d20]+(@{selected|stealth_bonus}@{selected|pbd_safe}*(1-ceil((@{selected|npc})*0.1)))+(@{selected|npc_stealth}*@{selected|npc})]] | [[t[d20]+(@{selected|stealth_bonus}@{selected|pbd_safe}*(1-ceil((@{selected|npc})*0.1)))+(@{selected|npc_stealth}*@{selected|npc})]]}} {{Survival=[[t[d20]+(@{selected|survival_bonus}@{selected|pbd_safe}*(1-ceil((@{selected|npc})*0.1)))+(@{selected|npc_survival}*@{selected|npc})]] | [[t[d20]+(@{selected|survival_bonus}@{selected|pbd_safe}*(1-ceil((@{selected|npc})*0.1)))+(@{selected|npc_survival}*@{selected|npc})]]}} and /em GM Rolls... /w gm &amp;{template:default} {{name= @{selected|character_name} Saves}} {{STR= [[t[d20]+@{selected|strength_mod}]] | [[t[d20]+@{selected|strength_mod}]]}} {{DEX= [[t[d20]+@{selected|dexterity_mod}]] | [[t[d20]+@{selected|dexterity_mod}]]}} {{CON= [[t[d20]+@{selected|constitution_mod}]] | [[t[d20]+@{selected|constitution_mod}]]}} {{INT= [[t[d20]+@{selected|intelligence_mod}]] | [[t[d20]+@{selected|intelligence_mod}]]}} {{WIS= [[t[d20]+@{selected|wisdom_mod}]] | [[t[d20]+@{selected|wisdom_mod}]]}} {{CHA= [[t[d20]+@{selected|charisma_mod}]] | [[t[d20]+@{selected|charisma_mod}]]}} &nbsp; 4. Then I defined the Macros as bar macros, with labels that use the Shh emoji&nbsp; 狼 (thanks Keith for&nbsp; Use Emojis in Macro Buttons ) I also use a query-type selection macro when the players know an NPC is making a save or check in response to something they did, or see. Now, I can keep 3D dice turned on, and still roll "behind the screen". -- jcii * My apologies if this is not attributed correctly. I'm still trying to understand the site's etiquette. this is actually the perfect example of this trick: Variable Calls that won't break your Macro So, anyone who has worked on Macros long enough knows how much of a pain it is when you are working on Macros that have Variable Attribute Calls that *might* not exist on the Target Sheet. It's actually super simple: [[10 +(floor(((0 +@{selected|constitution}) -10) /2))]] | [[10 +(0 +@{selected|constitution_mod})]] | [[10 +(0 +@{selected|supercalifragilisticexpialidocious})]] all 3 of those calls work, even when there is no Constitution Mod Attribute, or a Supercalifragilisticexpialidocious Attribute (to help the medicine go down). You'll still get the Error, because we didn't disable those, but you'll see the Macro still executed the Math, and just ignored the ones that it couldn't find, writing them off as 0 each time. This kind of information can help with some common issues I've seen in this thread lately, so here's some stupid tricks thrown in to help out (most of which I got from this thread): For starters, there's a Parser Buffer hidden in the Button trick, look into using a MacroPC / MacroGM Sheet to work around that. Control of the Sheet has Edit &amp; Ability (Macros) Access. Secondly, You'll want to use the Macro Sheet's Attributes (Left Column) to create the Parser Buffer Filter (the HTML converted Symbols [Useful Link] which get sent to chat to call the Ability, along with the required text) third: MacroPC Prefix Ability, You're gonna repeat this line 200+ times, easily, so this will affect Load Times, especially if you create your own Spell Card Macros: &amp;#37;&amp;#123;@{character_name}&amp;#124; which the Chat Parser translates to %{@{character_name}| except it translates the @{character_name} into the name of the Sheet that sent the @{MacroPC|Prefix} call, which forces it to look at the first sheet it finds with that name (an important clarification for mechanical reasons, don't have identical Sheet Names, it breaks things) and use the Attributes and Abilities there. this is useful if you don't unify your Spells into 3-6 Sheets (per Level) like I did, as it allows you to set the Spellcasting Ability on the Target's Sheet. You'd lose a little flexibility, and load times would eventually surpass the 3-6 sheet style, but it is far easier to set up (to clarify, the 3-6 Sheet Style has one for each Spellcasting Ability, eg. Intelligence, Wisdom, Charisma, or 6 if you include Strength, Dexterity, and Constitution sheets, of which, I have found a desire for the Con Sheet more often than not when dealing with Poisons, perhaps an overlay of Saving Throws would be useful to mix in, but that's a separate thought). The reason for the Parser Buffer is so you can enter symbols such as / &lt; &gt; = [ ] ( ) [[ ]] {{ }} { , } @ % without it activating right away, and you can further delay the activation by running it through a second Parser Buffer, preserving the Variable status (because the problem is permanence). If you need to convert a Line Return for example it is &amp;#13; which is useful in the Player Macros because they treat Line Returns as a new Line in Chat, which breaks the Chat API Button functionality, and the same goes for [Shift] + [Enter] in the Chat, so you use &amp;#13; in those instances, and it behaves the way you desire it to. On the Topic of Prefix Macros, I would suggest a Damage Macro as well, as you can use it wherever you wish to use custom Damage Rolls (some of us like &amp;{template:default} ), since you'll always be using the same initial command, assuming you use /em it would read: [Button](! /em &amp;{template:default} {{name=***@{selected|token_name}'s Damage Output:***}} {{Fire Bolt=[[1d10]]}}) which reads out before running through a Parser buffer as: [Button](! &amp;#47;em &amp;&amp;#123;template&amp;#58;default&amp;#125; &amp;#123;&amp;#123;name&amp;#61;&amp;#42;&amp;#42;&amp;#42;&amp;#64;&amp;#123;selected&amp;#124;token_name&amp;#125;&amp;#39;s Damage Output&amp;#58;&amp;#42;&amp;#42;&amp;#42;&amp;#125;&amp;#125; &amp;#123;&amp;#123;Fire Bolt&amp;#61;&amp;#91;&amp;#91;1d10&amp;#93;&amp;#93;&amp;#125;&amp;#125;) Assuming you convert all non-alpha-numeric or whitespace characters, just to be sure. Yes, it's overkill, but it works reliably. A much shorter call whenever you need to create such a Button would be [Button](! %{MacroPC|Damage1}Fire Bolt&amp;#61;&amp;#91;&amp;#91;1d10&amp;#93;&amp;#93;&amp;#125;&amp;#125;) where the MacroPC Sheet (so players have access too) has the Damage1 Ability handling everything before "Fire Bolt", so the Send Method, Template, and Name would be handled with a single command, which is everything you need for the setup of pretty much any Damage Readout you want, and the space saved is sizable enough that even 2 uses of this trick will begin to improve load times. This entire third bit makes use of the Prefix trick listed elsewhere in this thread, which you can find a link to on the very first post in this thread, Kieth keeps that thing up to date after all. It has lots of great tricks, and the whole thread is well worth a reading. It is very well curated.
keithcurtis said: Select any graphic object and send @{selected|token_id} to chat. the id will appear. When selecting, make sure you get the hyphen at the beginning. If for any reason you ever need a character id, select a token that represents a character and use @{selected|character_id} And yeah, using the token id is a little more setup, but really pays off in speed of execution during play. This same trick also applies to getting Item Resource IDs for Ammunition, assuming you are capable of referencing the correct repeatable row (which you are if you know how, but I didn't memorize that part, yet)
1595434952

Edited 1710159693
Upgraded Conditional Statement (pure math) I've gotten a lot of cases where the standard mathematical conditional statement could not work for me. For exemple, what if my condition is a negative number ? {{6,-10}&gt;-4} It does not work, even if I put parentheses around the "minus 4" part. I wont expand on all the cases, but I would only recommend using this standard statement for simple cases, or if you sometime need the result of your condition to be higher than one. As for example, for a Magician in a D&amp;D game, you could do : Highest Spell Level : [[ {{1,3,5,7,9,11,13,15,17}&lt;@{Character_Level} ]] Well, there are better formulas to give you the same result, but it's a good example of how you might use the standard comparison statement. Now, back on topic, I was speaking about an "upgrade" of this "standard" statement. Quite simple, if you want, let's say, use the highest of your STR or DEX mod for you Climb tests, given the mods might be negatives or equals, here is how you would do it : [[ ceil( ( ( @{DEX} ) - ( @{STR} ) ) / 100 ) * ( @{DEX} ) + ceil( ( ( @{STR} ) - ( @{DEX} - 1) ) / 100 ) * ( @{STR} ) ]] The aim is to have a value between -0.99 and 1, as the function ceil() will bring it to 0 or 1 (making it equivalent to a boolean value false/true). The first ceil() check if DEX is strictly superior to STR, and the second one will check if STR is superior or equal to DEX (hence the minus 1, else if your DEX and STR where equal, you would have a result of 0, as if you were using neither of them). The parentheses everywhere are to handle the cases where one or both are negatives. The division by 100 is arbitrary, you just need to divide by a positive value that cannot be reached by what you are testing. Otherwise, you could end up with a result superior to 1 (which is not really boolean-like). One of the other strong points of this method, is that it's "nested query friendly"; you won't have to replace end-brackets and comas by their HTML code equivalents, as you would have in the standard comparison statement. Here is the recap : [[ ceil( ( ( X ) - ( Y ) ) / Z ) * ( X - Y ) + ( Y ) ]] Is equivalent to : IF X is strictly superior to Y THEN X ELSE Y Predicate : Z is a positive value which verify the equation [ ( X )-( Y )&lt; Z ] Hope it can help some of you. Rolistically, Gib'.
keithcurtis said: Managing Equipment Weight and Containers This trick definitely works on the D&amp;D 5th Edition by Roll20 sheet, etc. Interesting discussion. Is there a more elegant way of doing it? Organise your items under the relevant container (e.g. pony or bag of holding) unamended.&nbsp; But reduce the container's weight by the weigth of items within. So your Bag of Hiolding weighs 15lb.&nbsp; You stuff your bagpipes (6lb) in there.&nbsp; Simply reduce the Bag of Holding's weight by 6lbs.&nbsp; Keep going into the negatives... Take something out?&nbsp; Move it up the inventory, and add its weight back ontot he running total for the Bag of Holding.&nbsp; Would that work? &nbsp;
Add Attributes to PCs to create universal Stat Macros [Disclaimer – using the 5e by Roll20 Character Sheet, but this should work for any game/sheet] &nbsp; I like having as few macros as possible, and making them universal whenever possible so that I can create just one macro and have it work everywhere – A single button to pull stats on either a PC or NPC.&nbsp; &nbsp; Unfortunately, PC stats are listed in attributes with different names than NPCs, so you’d need a separate macro for PCs instead of NPCs, or use an API to detect if the token is controlled by a player, or a query, etc.&nbsp; But there’s an easy solution! &nbsp; For each PC, create an attribute for the related NPC stat, and reference the PC stat. E.g.: npc_name = @{selected|token_name} or&nbsp; @{character_name} npc_ac = @{ac} npc_type = @{race} @{class} @{alignment} npc_hpformula = @{selected|hp|max} npc_speed = @{speed} npc_languages = [languages spoken - filled in manually; can copy from other_proficiencies_and_languages] npc_senses - [vision abilities - filled in manually; can copy from features_and_traits] npc_resistances = [resistances - filled in manually; can copy from features_and_traits] npc_vulnerabilities = [resistances - filled in manually; can copy from features_and_traits] npc_immunities = [resistances - filled in manually; can copy from features_and_traits] npc_condition_immunities = [resistances - filled in manually; can copy from features_and_traits] Here’s the 📋 macro I use for stats: /w gm &amp;{template:npcaction} &amp;{noerror}{{rname=@{selected|npc_name}}}{{name=@{selected|npc_type} }}{{description=[**HP:** @{selected|bar1} / @{selected|bar1|max}](! #NPCRolledHP) | ** AC: ** @{selected|npc_ac} | **Spd: ** @{selected|npc_speed} **Languages: **@{selected|npc_languages} &nbsp;**Senses: **@{selected|npc_senses} &nbsp;**Dmg. Res.:** @{selected|npc_resistances} **Dmg. Vuln.:** @{selected|npc_vulnerabilities} **Dmg. Imm.:** @{selected|npc_immunities} **Cond. Imm.:** @{selected|npc_condition_immunities}}} &nbsp; And the NPCRolledHP referenced above: &nbsp; /w gm &amp;{template:npcaction} &amp;{noerror}{{rname=@{selected|npc_name}}}{{name=Rolled HP}}&nbsp; {{description=**Rolled HP:** *[[@{selected|npc_hpformula}]]*}} &nbsp; If you are a Pro subscriber, you can speed up that process a little more using the ChatSetAttr script.
1595564728

Edited 1595652102
GiGs
Pro
Sheet Author
API Scripter
I'm honestly not sure if this is a Stupid Trick or not, but I only discovered it yesterday, so I'm posting it in case its new for others. Using Success Operator with Multiple Dice You often want to roll multiple dice, and check whether its a success or failure. Like /roll 3d6&lt;10 The problem is the success operator is designed to treat every die in the roll is a separate dice, so the above will always give 3 successes. If you're playing GURPS of Champions or whatever, that's no good. You cant do this /roll [[3d6]]&lt;10&nbsp; because the inline roll breaks the operator - it just reports the result of the 3d6 roll. What you can do, is use the group operator. That's where you do something like /roll {3d6, 3d6, 3d6}kh1 That will roll each set of dice, and report the highest one. You can combined a group operator with a success operator, like /roll {3d6, 3d6, 3d6}kh1&gt;11 That will tell you how many of those 3d6 rolls get equal or over 11. Unfortunately you cant do this: /roll {3d6}kh1&gt;11 as it reverts to treating each die in the roll as a separate die. It would be perfect if you could do this: /roll {3d6,0}kh1&gt;11 But you hit the classic error of not being able to combine dice and numbers in the same group. But fortunately there is a trick to make roll20 treat numbers as dice. So to cut a long story short, here's the solution The Solution /roll {3d6, 0d0}kh1&gt;11 /roll {3d6, {0}}kh1&gt;11 Either of those will work fine if you are rolling over &nbsp;a target. But if you want to roll under a target you have two options: Move the target to the other side of the operator: (this doesn't work) /roll 11&lt;{3d6, {0}}kh1 Or set the static number to so high that you will never roll it on the dice /roll {3d6, {20}}kh1&gt;11 Refinement:&nbsp; As pointed out by Scott in the next post, you dont need to use kh1 - one of the features of group success rolls, is they already support multiple checks, so by setting one to automatically fail, you get the desired result. So /roll {3d6, 0d0}&gt;11 /roll {3d6, {0}}&gt;11 But for roll under, it's a good idea to keep it. You can either set a high total and avoid using hk1, like so: /roll {3d6, {20}}&lt;11 I chose the number 20 there for convenience - it just has to be any number large enough that it cannot be rolled on the dice. Or you can use kh1: /roll {3d6, {0}}kh1&lt;11 /roll {3d6, 0d0}kh1&lt;11 This looks better IMO when looking at dice rolls, because the 0 vanishes. Seeing a high number could be confusing.
1595600215
Scott C.
Forum Champion
Sheet Author
API Scripter
Compendium Curator
GiGs said: /roll {3d6, {20}}kh1&gt;11 Nice find GiGs. I think you've got a typo in your demo of rolling under a target though. I don't think your first option works (at least doesn't for me), and I think your second roll under demo should be: /roll {3d6, {20}}kh1&lt;11 Something else to keep in mind is that you don't need the kh/kl either. These works just fine: /roll {3d6, {20}}&lt;11 OR /roll {3d6,{0}}&gt;11
1595651505
GiGs
Pro
Sheet Author
API Scripter
You're right about the roll under, Scott. I could have sworn I'd tested the 11&lt; method, but it doesnt seem to be working. I'll update the trick with your suggestions, for clarity.
1595651980
GiGs
Pro
Sheet Author
API Scripter
Ah now that I've woken up a bit more, I remember why I used kh1 - it was specifically for roll unders. This: /roll {3d6, {0}}kh1&lt;11 means you always keep the highest dice, which will not be the zero. So it works for rolling under without having to put a high total as one of the options - which looks weird when you are looking at the dice result.
I found a way to link websites that have parenthesis ")" on the address, for example:&nbsp;<a href="https://www.dandwiki.com/wiki/Fiendish_Hawk_(3.5e_Creature)" rel="nofollow">https://www.dandwiki.com/wiki/Fiendish_Hawk_(3.5e_Creature)</a>. If you just type [link](<a href="https://www.dandwiki.com/wiki/Fiendish_Hawk_(3.5e_Creature)" rel="nofollow">https://www.dandwiki.com/wiki/Fiendish_Hawk_(3.5e_Creature)</a>) it will use the first ")" it encounters to close the []() and will not link to the correct address. But if you replace "(" for "%28" and ")" for "%29", in the link address, it will correctly link to the website: [link](<a href="https://www.dandwiki.com/wiki/Fiendish_Hawk_%283.5e_Creature%29" rel="nofollow">https://www.dandwiki.com/wiki/Fiendish_Hawk_%283.5e_Creature%29</a>).
Gawd, I wish there was&nbsp; shortcut (like a right click drop down, or shift click) for duplicating an NPC.&nbsp; Has this been suggested, or implemented at all?
1595803079
keithcurtis
Forum Champion
Marketplace Creator
API Scripter
Hi Cory, This thread is for posting of tips and tricks that people have discovered. The top post explains the purpose. If you have a general question, you should post it in its own thread, or if you want to suggest a feature that does not exist, you should post it in the Suggestions forum. Thanks for helping to keep this thread lean. :)