Advertisement Create a free account

Stupid Roll20 Tricks (and some clever ones)

1528734556

Edited 1528734758
keithcurtis
Forum Champion
API Scripter
Walrus said: Holy Crap, Keith! This is awesome. It's a question that people often ask about. I was going to link someone to this thread and realized that no one had written this tip yet. I really don't make this stuff up, but sort of synthesize it from a lot of tools left lying around. I was telling The Aaron the other day, I feel like the cargo cultist of scripters.
1528735693
Scott C.
Forum Champion
Sheet Author
API Scripter
keithcurtis said: cargo cultist of scripters. Damn, there's an anthropology term I haven't heard in a while :)
1528736113
The Aaron
Forum Champion
API Scripter
=D&nbsp; <a href="https://en.wikipedia.org/wiki/Cargo_cult_programmi" rel="nofollow">https://en.wikipedia.org/wiki/Cargo_cult_programmi</a>... I think Keith's a bit better than that. =D
1528736340
Scott C.
Forum Champion
Sheet Author
API Scripter
Heh, that describes me I think ;)
1528740394
Keithcurtis the Tricksomancer. Whose thread is pinned by the Mods/Devs. And thanks very much for the invisible token and detailed steps.
1528747513
keithcurtis
Forum Champion
API Scripter
Doug E. said: Keithcurtis the Tricksomancer.&nbsp; Ooh, I like that. I'll take it.
1528790281

Edited 1528790811
keithcurtis
Forum Champion
API Scripter
Invisible Tokens - The Notes Token (API version) There is not a terrible lot of difference in the basic concept between the basic notes token and the API version. The API version uses a modified version of the GM Notes script by the Aaron, shown here, but see below for my modified version. This is partly modified from the original to cause the whisper to appear in a Shaped Sheet roll template. To modify it for your game's sheet's template you only need change one line: sendChat(o.get('name'),'/w gm &{template:5e-shaped} {{title=GM Notes for '+o.get('name')+' }} {{text='+ decodeURIComponent(o.get('gmnotes'))+'}}') I can't list all the possible templates, but this would match the default template I used in the previous tip: sendChat(o.get('name'),'/w gm &{template:default}{{name=' + o.get('name') +'}} {{'+ decodeURIComponent(decodeUnicode(o.get('gmnotes')))+'\n[Bio to GM](!cbio) | [to Players](!pcbio) | [Character Notes](!cnote)'+'}}'); If you are using the OGL sheet, use this line: sendChat(o.get('name'),'/w gm &{template:desc}{{desc='+ decodeURIComponent(decodeUnicode(o.get('gmnotes')))+'\n[Bio to GM](!cbio) | [to Players](!pcbio) | [Character Notes](!cnote)'+'}}') Any of these will give you equivalent function. Why put the notes into the GM Notes field? What is the advantage of this method over the previous? Mainly in that all the code you put into the bubbles in the free version can be placed in the GM Notes of the Token Field. It is much easier to read, format and edit. Paragraphs will also separate properly and the overall experience will be more pleasing. Also, since you are dealing with the API now, you can put script calls into your token. This allows a great deal more to be done. OPTIONAL FOOTER My personal Info tokens always have a footer at the bottom which gives me more options by calling a few more scripts. The footer is added by my own version of the GMNotes script.&nbsp; Script locations GMNotes is the basic script and operates as described above CharNotes calls the Bio Tab of an associated character and whispers it to the GM PCNotes calls the Bio Tab of an associated character and displays it openly to the players All of these will need the line I showed above to be modified to use the Roll template you want to use. Mine are coded to the Shaped Sheet, since that's what I use. These were all modified from scripts originally created by The Aaron, Scriptomancer. They could probably easily be folded into one script, but I am not up to that level of tinkering. What do the extra scripts do? The upshot of adding these three scripts is that when you call the notes token, you will get this: Those buttons (which appear as in-text links on the Shaped Roll Template) don't do much yet, but that's because the modified GM Notes script has further utility beyond the&nbsp; Info token. The Info character sheet the token refers to is a blank sheet, but if you have made your !GMNotes call a universal token macro (on the collections tab), the button will appear for all tokens you select, even character tokens. Thus is I select the NPC Siofra from my own campaign, I get this: Clicking the "Bio to GM" link sends this (abbreviated for length in the screen shot): Clicking the "To players" button sends the same info to the players instead. Clicking the "Character Notes" button... doesn't do anything yet, because I have yet to get around to making that script, but it will call up the Character GM Notes, instead of the Token GM Notes. I will edit this when I get around to building that script. :) What if I don't need the optional footer? If you don't need the functionality of this footer, just use the basic modified GMNotes script found&nbsp; here . and modify the template line to fit your sheet. Remember that the same rules apply to the API Info Token as the free version. Anything you put in that GM Notes field on the token will be whispered to Chat. That includes API Buttons, Ability Buttons, Image links, macro code and so forth. More on that later, with a specialized version of the Notes Token, I call the Control Token .
1528790291

Edited 1528814184
keithcurtis
Forum Champion
API Scripter
Invisible Tokens - The Control Token The Control Token is simply a specialized use of the Notes Token. It really requires the API, since it is used to control scenario specific events. In the previous tip, I showed how to place and retrieve info from the GMNotes field of a token. That info can be used with other scripts to play sounds, change graphics, create mood lighting, control doors and much more. Useful scripts for the control token are: Token-mod Roll20 Audio Master SimpleDoorControls The first two are available as One-Click installation. How does this work? Here is an example of a control token. This is for an acid trap in a kobold lair. It contains notes for how the trap is activated, rolls damage and finally, contains two control buttons at the bottom. I have a graphic indicating the acid pool they can encounter. The two buttons reveal or hide the acid pool. When the PCs get close to the trap and the nearby control token, I call up the notes on the Control Token which reminds me of the details, rolls damage in case I need it, and gives me buttons to hide or reveal the trap without mucking about with moving graphics from layer to layer manually. If I were ambitious, I would find a good acid splash sound effect and add a Roll20AM call to play it when the trap is revealed. Here is the code: Description The ceiling of this chamber is filled with numerous holes through which the goblins can rapidly empty a cistern of acid into the room below. Detection The holes are cunningly disguised and require a specific DC 15 Investigation roll to be discovered. Any character proceeding more than ten feet into the room will trigger the trap and have gallons of acid poured upon them, covering the floor with several feet of the substance. Damage Once the trap is triggered, any character in the area can take half damage with a DC15 Dexterity saving throw. Failure deals [[6d6]] acid damage. Any character who ends their turn in the resulting pool of acid will need to make a DC15 Con save or also take [[6d6]] points of acid damage. In either case, success indicates half damage. [REVEAL ACID PIT](!token-mod --ids -LC7WuFLtQAzi5Y3R6_B --ignore-selected --set layer|map) [HIDE ACID PIT](!token-mod --ids -LC7WuFLtQAzi5Y3R6_B --ignore-selected --set layer|gmlayer) And here is the resulting GM note as it appears in chat: I couldn't possibly list all of the possible uses here, but here is a short list of possibilities: Canned text for an encounter Just a list of API buttons with responses an NPC might give in a certain area Special Mood Lighting Turn on or off a huge aura to give a color cast to an area Rotate a specific graphic Such as a door or room on a map. Move an entire group of tokens from the GM layer to the token layer Ambush! Lock a selected token Used with the map lock script, this could entangle or immobilize any token. Click on your notes token to call up the command button, then select the token you want to stick in a web or vines or what have you and click the button to lock them. Tiny soundboard Haunted mansion adventure? Put a bunch of spooky sound buttons that make Roll20AM calls. Bonus—tie one to a mood lighting token so the lights go out and they hear a high pitched scream. Or put a Combat Soundtrack player of your choice in each fight area, so that the music matches the opponent, creepy for the spider fight, epic for the boss battle. Just remember, anything you can do with a script call, you can put into a control token.
1528817510
keithcurtis
Forum Champion
API Scripter
For the benefit of anyone who follows the thread but doesn't often check back at the&nbsp; directory , I have added a list of&nbsp; Chat Menu generators.
1529020136

Edited 1529020462
Any idea how to fix the formatting on this "!gmnote"?
1529022304
The Aaron
Forum Champion
API Scripter
It's probably that ' breaking things.&nbsp; I think I have a fixed version of that...
1529023096
keithcurtis
Forum Champion
API Scripter
Let me know, Aaron, and I'll update the links and scripts in my post. I thought I was using your fixed version. The ' always used to cause an API crash. Now it only crashes when I do something stupid like write [[d6d]]. ...not that I'd do something like that. :/
1529023451
keithcurtis
Forum Champion
API Scripter
Anthony, is that the OGL template? I'm not familiar enough with it to know what the formatting is supposed to look like. One of the problems looks like hard line breaks. I'm assuming this was written in another editor and pasted into Roll20? PM me your edited code for GM note and the text for the token, and I'll pop into my test OGL game tonight and check them out.
keithcurtis said: Anthony, is that the OGL template? I'm not familiar enough with it to know what the formatting is supposed to look like. One of the problems looks like hard line breaks. I'm assuming this was written in another editor and pasted into Roll20? PM me your edited code for GM note and the text for the token, and I'll pop into my test OGL game tonight and check them out. Yes OGL Template sent you the link
1529046419
keithcurtis
Forum Champion
API Scripter
I've looked it over and done some tests with just a bare description template. Everything looks in order. The OGL description template appears to center all text and spread inline rolls across the box on their own line.&nbsp;
1529172933
Pantoufle
Pro
Sheet Author
Hello, I tried to use what seems to be great : API method for token notes But I get this error message : (got the script from your links Keith :( ) URIError: URI malformed at decodeURIComponent (&lt;anonymous&gt;) at _.chain.map.reject.reject.each.o (apiscript.js:8190:79) at Function._.each._.forEach (/home/node/d20-api-server/node_modules/underscore/underscore.js:182:9) at _.(anonymous function) [as each] (/home/node/d20-api-server/node_modules/underscore/underscore.js:1635:39) at apiscript.js:8185:24 at eval (eval at &lt;anonymous&gt; (/home/node/d20-api-server/api.js:151:1), &lt;anonymous&gt;:65:16) at Object.publish (eval at &lt;anonymous&gt; (/home/node/d20-api-server/api.js:151:1), &lt;anonymous&gt;:70:8) at /home/node/d20-api-server/api.js:1634:12 at /home/node/d20-api-server/node_modules/firebase/lib/firebase-node.js:93:560 at hc (/home/node/d20-api-server/node_modules/firebase/lib/firebase-node.js:39:147)
1529174534
keithcurtis
Forum Champion
API Scripter
Are you copying from RAW? Copying from the previous screen can sometimes put in spurious characters. Also, the script is Actually the Aaron's. I merely did some minor tweaking to the output. He might be able to make sense of your error log, which is mind flayer gobbledy gook to me. :) To be clear, which of the three scripts did you copy, and did you copy from my github links, or the previous one linked to another forum thread?&nbsp;
1529175962

Edited 1529397542
Pantoufle
Pro
Sheet Author
Only gm notes, from both links. Raw from your github (replacing for ogl but don't think this is the issue) Edit: Here is a fix for the script from Aaron! I decided to use the spell template (juste a minor inconvenience imo with the components field always displayed) because of the problem Anthony reported foe the description template. (Npcaction works well also) on('ready',()=&gt;{ &nbsp; &nbsp; const blockElements = [ &nbsp; &nbsp; &nbsp; &nbsp; 'p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ol', 'ul', 'pre', 'address', &nbsp; &nbsp; &nbsp; &nbsp; 'blockquote', 'dl', 'div', 'fieldset', 'form', 'hr', 'noscript', 'table','br' &nbsp; &nbsp; ]; &nbsp; &nbsp; const rStart=new RegExp(`&lt;\\s*(?:${blockElements.join('|')})\\b[^&gt;]*&gt;`,'ig'); &nbsp; &nbsp; const rEnd=new RegExp(`&lt;\\s*\\/\\s*(?:${blockElements.join('|')})\\b[^&gt;]*&gt;`,'ig'); &nbsp; &nbsp; const getLines = (str) =&gt;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (rStart.test(str) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ? str &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .replace(/[\n\r]+/g,' ') &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .replace(rStart,"\r$&") &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .replace(rEnd,"$&\r") &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .split(/[\n\r]+/) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : str &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .split(/(?:[\n\r]+|&lt;br\/?&gt;)/) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .map((s)=&gt;s.trim()) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .filter((s)=&gt;s.length) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; &nbsp; &nbsp; const cmdRegex = /^!(w?)gmnote(?:-(.*))?$/i; &nbsp; &nbsp; on('chat:message',(msg) =&gt; { &nbsp; &nbsp; &nbsp; &nbsp; if('api' === msg.type && cmdRegex.test(msg.content) && playerIsGM(msg.playerid) ){ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; let match=msg.content.match(cmdRegex), &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; output = match[1].length ? '/w gm ' : '', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; regex; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if(match[2]){ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; regex = new RegExp(`^${match[2]}`,'i'); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _.chain(msg.selected) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .map( s =&gt; getObj('graphic',s._id)) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .reject(_.isUndefined) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .reject((o)=&gt;o.get('gmnotes').length===0) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .each( o =&gt; { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if(regex){ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; let lines = _.filter( &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; getLines(unescape(o.get('gmnotes'))), &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (l) =&gt; regex.test(l.replace(/&lt;[^&gt;]*&gt;/g,'')) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ).join('&lt;br&gt;'); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sendChat(o.get('name'), `${output}${lines}`); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } else { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sendChat(o.get('name'), `${output} &{template:spell}}{{name=${unescape(o.get('gmnotes')).replace(/(?:[\n\r]+|&lt;br\/?&gt;)/g,'&lt;br&gt;')} }}`); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }); &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; }); });
1529182092
keithcurtis
Forum Champion
API Scripter
PM sent, to avoid derailing the thread.
1529251488

Edited 1529251854
keithcurtis
Forum Champion
API Scripter
Inivisible Tokens — The Door Control This is another use that requires an API script, but it will work with either&nbsp; SimpleDoorControls , written by Three of Swords, or&nbsp; Matt's Door Script , written by... Matt, but I prefer the former for its simplicity. Most Door scripts have the same basic approach. You link a door open image, a door closed image, and a bit of Dynamic Lighting line. The script shuffle them around between layers to swap the opened and closed door images from the Map Layer to the GM Layer, and doing similar with the DL line. The problem is, many maps&nbsp; come with baked-in door images. You can add and remove Dynamic Lighting Lines, but the door is there and you don't want to spend hours altering the map. I frequently use an Invisible Token for the door images. I give one a red GM-only aura to indicate a closed door and a green one to to the other indicate an open door. I know at a glance whether any given door is opened or closed by the color of the token aura, but the players only see that they can or cannot see through the map's door image. I have told them that if they can see what's beyond, then it's open, regardless of what shows on the map. Actually, the red-green switch is not vital, since the DL line is faintly visible on the GM layer, giving you another clue that the door is open. Door Closed - GM View — (Door token selected for clarity) Door Open - GM View Door Closed - Player View Door Open - Player View ____________________________ Map is from Lost Halls of Hightamrish, by Heroic Games, used for demo purposes only. Tokens are my own.
1529680323
keithcurtis
Forum Champion
API Scripter
Invisible Tokens - Invisible Creatures Sometimes creatures are on the battlefield but can't be seen. Maybe they are tunneling, or ethereal, or just plain invisible. The Aaron has a good script for that call Bump, but here's a method that can be used without the API (but with the API, still much easier). For a creature that has this capability, create a Rollable Token , with the invisible face as one of the sides. Create a GM-only aura around it, preferably taking up its exact space. Set up your token in whatever fashion you do normally, and save it as the default token. Now whenever you drag that token to the battlefield, it will have the capability of turning invisible. There are two methods, the Manual (Free) method, and the API (Pro) method. (There is also the quick and dirty Fog of War method I mention here , but this is easier to use with multiple creatures.) Manual Method (Free) The manual method is two step. First right click the token and call up the toekn menu. Choose "Multi-Sided &gt;&gt; Chose Side". If it is visible, choose the other side, and vice versa. This will toggle the token between the creature and the invisible state. The GM Aura us placed on it comes into play here, because YOU need to see where it is. The second step is the name plate. Most GMs in my experience, make the name plate visible to all players. You'll need to open the token interface and set the nameplate to invisible to players. This helps the players say "I want to attack Ankheg #4". They could ping it for the GM, but words are faster. Of course, you'll need to turn that back on when making the token visible again. For a battlefield with more than one invisible token creature, it might be easier to just leave the nameplate invisible and ping targets for the GM. API Method (Pro) The API method is much easier. You write a token macro that uses token-mod to set the face and the nameplate. You could name one macro "visible", the other "invisible". Here is sample code: !token-mod --set currentside| 1 !token-mod --set showplayers_name| yes The bold parts are what you need to change from macro to macro.&nbsp; The number in the first line sets the face, the "yes" in the second line should be changed to "no" when setting the face to invisible. Note that token-mod will only change images that are in your user library; you may have to download and re-upload any purchased assets you wish to use this trick on. In the example images below, I have actually used three states. The Ankheg is a burrowing creature, and I happily had an erupting state for the image. So I have three buttons, "Buried", "Half', and "Surface". This is one advantage of this method over The Aaron's excellent Bump script. I use a very subtle GM aura, since the nameplate remains visible to me. Surface, showing Token Macro Buttons: Halfway state, useful for a partial reveal in a hit and run maneuver. Buried, GM View Buried, Player View __________________________________________ Map provided as free benefit for Pro Players, Ankheg tokens are Pro-level free assets, originally by Devin Night, but slightly re-colored. Paladin Token is my own. All used for demonstration purposes.
1529682404
Scott C.
Forum Champion
Sheet Author
API Scripter
Heh, I made great use of that with a ghost encounter for my players. If you trust your players you can also accommodate abilities like see invisibility by giving them control of the token. They will then see the Aura and be able to actually "see" the invisible creature.
1529685969
keithcurtis
Forum Champion
API Scripter
Good point! I hadn't thought of that.
1529711341

Edited 1558267956
Anthony V. said: What I do in such situations is I place manual Dividers surrounded by Line Breaks, such as 5 Dashes. Also, note, that the Code Block Style on the Forums &amp; in PM both will auto-parse your HTML, making it appear broken (for example &amp;#13; will turn into whereas &amp;#38;#13; will turn into &amp;#13; and it will even get parsed again on a Copypasta, so you gotta be careful what you "save" in the Text Field because of that ) (&amp;)#38; is &amp; (&amp;)#13; is Line Return --- so --- (&amp;)#38;#13; will turn into (&amp;)#13; on Paste , just remove the ()
1530242414

Edited 1530243065
Scott C.
Forum Champion
Sheet Author
API Scripter
Random Images (AKA special Dice Images) I realized today while responding to another thread that this trick, originally by Silvyre I believe, hasn't made it into the thread yet (at least I don't think it has). This trick takes a little prep work, but it allows you to display images corresponding to a dice roll in chat. You could replicate this with a straight table roll: /r 1t[table-with-images] but this requires you to use the slash command syntax for the image to display, which is not very stylish in my opinion; and requires setup of a rollable table which requires you to be a GM. This method displays much nicer than doing it via rollable table would. Additionally, rollable tables can't display images when rolled inline. Upload your images somewhere that the image can be accessed via a direct link.&nbsp; The Roll20 Library &nbsp;(although difficult to work with), imgur, giphy, using rawgit to access github hosted images, or something similar. Next we need a link shortening site that allows custom names.&nbsp; Tinyurl &nbsp;or&nbsp; bit.do &nbsp;as examples I'm going to use these four images:&nbsp; 1 &nbsp; 2 &nbsp; 3 &nbsp; 4 . The short url for which is&nbsp; <a href="http://tiny.cc/image_swap_demo_#" rel="nofollow">http://tiny.cc/image_swap_demo_#</a> Then make your macro: [Image[[](<a href="http://tiny.cc/image_swap_demo_[[1d4]]#.gif" rel="nofollow">http://tiny.cc/image_swap_demo_[[1d4]]#.gif</a>) The double open brackets in the image title (i.e. [image [[ ]) are there to force the dice roll to display as plain text so that the link works correctly. This will give you an image based on your die roll: *Images are from Paizo's Starfinder rule books (Alien Archive and Pact Worlds). Used for demonstration purposes only. Paizo retains all rights I've done it with .png's here, but it works with .gifs as well (and in fact, you can see that is what I used as the file type extension in the link (i.e. #.gif). As an added bonus, this method means that you just need to copy your macro between games instead of having to deal with recreating a rollable table in the new game, or having to ask your GM to setup a rollable table for you.
1530250593
keithcurtis
Forum Champion
API Scripter
Very clever. What do you use this for in play? I can see that it might be a way to roll custom dice faces in chat, or randomly display weather graphics.
1530250998
Scott C.
Forum Champion
Sheet Author
API Scripter
Weather and setting images for random maps is what I've typically used it for. The thread that reminded me I needed to add this was looking for a way to show a random gif for spell effects (e.g. fireball 1, fireball 2, etc).
1530271427
Pretty cool Scott! :D
1530298604
Scott C.
Forum Champion
Sheet Author
API Scripter
Access the Old Library Management Tool After the Art Library Rework Update in July 2016, the external access to our libraries disappeared from the main site. The update did make in game library management much better, but sometimes you just need to access your library or do some bulk management. In these cases, I was always wishing that the external management tool was still available. The secret is that it is still available, although no longer officially supported. You can access the external view of your art library at this link: <a href="https://marketplace.roll20.net/library/" rel="nofollow">https://marketplace.roll20.net/library/</a> There are some caveats, which are also blatantly noted when you access the external view: The external view is deprecated and no longer supported - It is possible that some future update will cause this to no longer interact properly with your actual in game library Roll20 has already officially said that the external view is no longer available, so this may disappear without notice
1530551810

Edited 1530551954
It appears the trick for the line breaks has been removed from the Map Names, although I have yet to try turning the Map&lt;br&gt;Name into a Map&lt;br /&gt;Name
1530559132
keithcurtis
Forum Champion
API Scripter
Blue64 said: It appears the trick for the line breaks has been removed from the Map Names, although I have yet to try turning the Map&lt;br&gt;Name into a Map&lt;br /&gt;Name When you've got something concrete (and the editor dust has settled, maybe shoot a PM at OldSchoolChris so they can edit their post.
1530821292

Edited 1530978818
Poltergeisha's Roll20 Like A Boss I've spent way too many hours tweaking and perfecting my Roll20 setup to flow like a symphony during my D&amp;D 5e games. I hope that the documentation here will help you also become a Master of Roll20, so the inordinant amount of time I've spent on this isn't a complete waste. Here you can learn how to organize your macros and how best to distribute them to players, as well as all of the scripts and macros I use and how I use them. Forum Link
1530824798
keithcurtis
Forum Champion
API Scripter
Thanks Poltergeisha. I put it in with the other "sources of tips and tricks", like the Aaron's Roll20 Enhancement Pack.
1530890864

Edited 1530891519
Poltergeisha said: Poltergeisha's Roll20 Like A Boss I've spent way too many hours tweaking and perfecting my Roll20 setup to flow like a symphony during my D&amp;D 5e games. I hope that the documentation here will help you also become a Master of Roll20, so the inordinate amount of time I've spent on this isn't a complete waste. Here you can learn how to organize your macros and how best to distribute them to players, as well as all of the scripts and macros I use and how I use them. Click Here I would like to point out that Standard 5e Rule Set says that you only recover " up to half of your Hit Dice " so the math for that would actually be something along the lines of [[ (floor( @{target|Long Rest|hd|max} /2) ) + @{target|Long Rest|hd} ]] Might wanna double check your Macros Page and make sure that the Hit Dice is working correctly Also, you forgot to disclaimer before your Link that most of those use the API Scripts, which is not a Free User perk. Also, /emas is a GM/DM Tier Command, any Player using it will receive the same error as /desc you should look into changing it to /em which is available to Players.
1530891702
keithcurtis
Forum Champion
API Scripter
Hmm. Poltergeisha, since your tip is actually a very complex set of interlocking ideas that already has a dedicated forum page, could you change your post to have the link go to that thread rather than directly to the GIthub page? It will keep all of your feedback in one place and preserve the focus of the Stupid Tricks thread.
Quick Play: Room Specific Music Using a couple of already available API scripts and a simple Macro, I am able to play room specific songs from links directly on the map. For example if I use a pre-built module many of the rooms have numbered tokens sitting on the GM Layer of the map. I am able to click the token number for the room and play a specific song/track quickly.&nbsp; Requires : Roll20 AudioMaster API and Bump API . Both are available in the scrip library.&nbsp; 1. Create a macro that uses Roll20 AudioMaster to play a track. The very basic macro might look like this:" !roll20AM --play|@{selected|token_name}"&nbsp; Note I use an"@selected|token_name" in place of the "AUDIO TRACK" to be played. Be sure to select Show as Token Action on the macro. Roll20 AudioMaster script allows control of the jukebox via the chat interface and expands upon the standard jukebox functionality with some additional commands. 2. Drop a new token or use an existing token that has No Name onto the GM Layer. Enter the name of the Audio Track from your JukeBox as the name of the Token. For example:&nbsp;Roll20 - Chase&nbsp; by Kruggly 3. Use BUMP API script&nbsp; to make the Token interactive for the GM from the Token Layer. The token will still be invisible to players&nbsp; even though it sits on the GM Layer. There are a lot of other uses for BUMP so if you haven't check it out for sure. THANKS to @The Aaron for all his work.&nbsp; Bump provides a way to invisibly manipulate tokens on the GM Layer from the Objects Layer, and vice versa. When a token is added to Bump a slave token is created that mimics everything about to master token. The slave token is only visible to the GM and has a color on it to show if the master token is on the GM Layer or the Objects layer. Moving the slave token will move the master token and vice versa. The slave token represents the same character as the master token and changes on the slave token will be reflected on the master token 4. When you are playing all you have to do is select the token and hit the PlayRooomMusic Token Action Button. The script reads the name of the Toke and the Song/Track to play.&nbsp; I also use other Macros to stop,change, or do other controls on music so be sure to check out the Roll20 AudioMaster API for sure.&nbsp;
1530907789

Edited 1530911554
here's one that would be useful with the previous Trick: Pre-Linked Tokens Sometimes you'll want a Token that is re-usable, that has a specific set of abilities, or access to a specific set of Macros, such as the Ability to change the Music Track, or perhaps the Circle of Shepherd Druid's Spirit Totem's Aura, or even something as simple as a Torch. You are capable of setting up a Token, linking it to a Character Sheet as a Default Token, and then simply Dragging it out to the Map whenever you need it. In the case of the Room Specific Music mentioned in the previous Tip, you'd leave the Name Blank (or something that is easy to load/stop) and set it up when you place the Token, but the Character Sheet would have the "Ability" Macro for changing the Music, this allows you to generate the desired effect for only the Tokens you want it to appear for, without clogging up the GUI for the other Tokens that would have no use for it, as well as streamlining the process. in the case of the Circle of the Shepherd Druid's Spirit Totem Token, it affects a specific Radius, for a specific amount of Time, and can be moved, so, you simply need to assign a Token (I use a Rollable Table Token to represent the Type of Totem used) the appropriate Radius Aura, and you can set it's respective "HP Bar" (I use Bar 3) to 10/10, this allows the Players to track the length of Time which the Totem lasts. Note: I didn't say I linked it's HP Bar to it's HP Stat on the Character Sheet, I purposefully leave this unlinked! This reasoning becomes more apparent when you are using it for things such as Torches which can be difficult to track individually, with this method, you simply set the Torch's HP Bar at 600/600 and subtract 1 each Round. I combine this trick with Control flames to track how fast it burns through the Torch (Homebrew ruling on the Spell affecting the Flame Source) You can also Set the Current Token "Health" with 1 less for these Tokens depending on how you measure the timing of the Effects. For example, a Torch might get placed with 599/600 instead of 600/600 because you might want to count the ignition round against it's Hour, whereas the Spirit Totem would start at 9/10 allowing you to streamline the whole process. P. S. It should be noted that doing this too much has the potential to generate Lag, as it does actually generate a Character Sheet for each one of these that you do, so, just a heads up, in excess you might cause lag, even when you Archive it, it's still loaded. (this was mentioned elsewhere in this same thread) also, this trick was briefly discussed earlier in this thread, although not quite as in depth: Link . Also, the previous Tip had an alternative mention earlier in this thread in a different format &amp; context, but generally the same tip: Link .
1530914742

Edited 1530914807
keithcurtis
Forum Champion
API Scripter
Thanks Ye'Olde DM&nbsp; and Blue64. Good additions. For anyone trying Roll20AM, be aware that the latest version soon to be released to One-Click has a slightly changed syntax. The command from two posts above will become:&nbsp; !roll20AM -- audio, play|@{selected|token_name}
Blue64 said: I would like to point out that Standard 5e Rule Set says that you only recover " up to half of your Hit Dice " so the math for that would actually be something along the lines of [[ (floor( @{target|Long Rest|hd|max} /2) ) + @{target|Long Rest|hd} ]] Might wanna double check your Macros Page and make sure that the Hit Dice is working correctly Also, you forgot to disclaimer before your Link that most of those use the API Scripts, which is not a Free User perk. Also, /emas is a GM/DM Tier Command, any Player using it will receive the same error as /desc you should look into changing it to /em which is available to Players. I'm actually a bit confused about which macro you're talking about with the hit dice! As for the second thing, thanks for catching that! I'll take a look and make changes.
1530995409
Poltergeisha said: Blue64 said: I would like to point out that Standard 5e Rule Set says that you only recover " up to half of your Hit Dice " so the math for that would actually be something along the lines of [[ (floor( @{target|Long Rest|hd|max} /2) ) + @{target|Long Rest|hd} ]] Might wanna double check your Macros Page and make sure that the Hit Dice is working correctly Also, you forgot to disclaimer before your Link that most of those use the API Scripts, which is not a Free User perk. Also, /emas is a GM/DM Tier Command, any Player using it will receive the same error as /desc you should look into changing it to /em which is available to Players. I'm actually a bit confused about which macro you're talking about with the hit dice! As for the second thing, thanks for catching that! I'll take a look and make changes. I posted an Issue Tracker on your GitHub about it, but it was specifically the Long Rest section, I'm not sure how the API Script handles it, but your descriptive Text, from what I can tell, implies that it's restoring all of the Hit Dice, when it's supposed to be half rounded down.
1531077579
Kastion
API Scripter
Simple Way to have a "Handout" without a Journal Entry or Actually Making a Handout I've been using this method a lot recently to show handouts based on what they see in a room or somewhere on the map. I've done this a lot for books, journals, mystic scripts and alchemy recipe books among other things. Step 1: Use photoshop or GIMP to create an image with as much text as you want to display (In my instances I've used a high-res images of aged parchment and aged open books showing text on both pages.) Step 2: Upload the image to your Roll20 Library. I have a folder for things like this: Step 3: Place the image on the map somewhere as a token at a location you want the party to find and read the content of the book/scroll/etc. It will show up filling a full unit (Default 70 x 70 pixels) and look a too large or out of place so right click on the token and select "Advanced --&gt; is Drawing" then shrink it down to an appropriate level and possibly rotate it to make it look more organic. Mine looks like this: Step 4: Once they are in the room and say "I want to read the Journal" or "I want to see what the scroll says", etc etc. select the journal token then press SHIFT+Z this will show it to all players. You see how small that journal looks on the table? This is what the players see after pressing SHIFT-Z Doing all this lets you add readable books, scrolls, mystic script, notes, alchemy recipes, tactics or fighting treatise / instructions among many other things without having to create a Handout and having it as a "single use handout". Having these littered around your dungeon or cave or any area with intelligent / semi-intelligent creatures helps with world building and makes for a nice change of pace to just "Walk in room, see 4 orcs, kill orcs, take treasure, move on to next room." I have a long list of things like this I do to break the monotony of just combat encounters when in some stronghold or dungeon scenario.
Kastion said: Simple Way to have a "Handout" without a Journal Entry or Actually Making a Handout I've been using this method a lot recently to show handouts based on what they see in a room or somewhere on the map. I've done this a lot for books, journals, mystic scripts and alchemy recipe books among other things. Step 1: Use photoshop or GIMP to create an image with as much text as you want to display (In my instances I've used a high-res images of aged parchment and aged open books showing text on both pages.) Step 2: Upload the image to your Roll20 Library. I have a folder for things like this: Step 3: Place the image on the map somewhere as a token at a location you want the party to find and read the content of the book/scroll/etc. It will show up filling a full unit (Default 70 x 70 pixels) and look a too large or out of place so right click on the token and select "Advanced --&gt; is Drawing" then shrink it down to an appropriate level and possibly rotate it to make it look more organic. Mine looks like this: Step 4: Once they are in the room and say "I want to read the Journal" or "I want to see what the scroll says", etc etc. select the journal token then press SHIFT+Z this will show it to all players. You see how small that journal looks on the table? This is what the players see after pressing SHIFT-Z Doing all this lets you add readable books, scrolls, mystic script, notes, alchemy recipes, tactics or fighting treatise / instructions among many other things without having to create a Handout and having it as a "single use handout". Having these littered around your dungeon or cave or any area with intelligent / semi-intelligent creatures helps with world building and makes for a nice change of pace to just "Walk in room, see 4 orcs, kill orcs, take treasure, move on to next room." I have a long list of things like this I do to break the monotony of just combat encounters when in some stronghold or dungeon scenario. Very Cool!
1531082017
keithcurtis
Forum Champion
API Scripter
Cool indeed, Kastion. There are a lot of uses for this.
1531082915

Edited 1531083019
Vince
Pro
Sheet Author
@Kastion&nbsp; I've used this method on larger maps to show an exploded view of the map, notes and info placed on tabletops, and GM-only(gm-layer) for notes/room description for dungeons/maps. Sometimes I'll place "thumbnails" in the vtt's margins and use as a "gallery" to show player's as the story develops.
1531091653
keithcurtis
Forum Champion
API Scripter
Vince said: @Kastion&nbsp; I've used this method on larger maps to show an exploded view of the map, notes and info placed on tabletops, and GM-only(gm-layer) for notes/room description for dungeons/maps. Sometimes I'll place "thumbnails" in the vtt's margins and use as a "gallery" to show player's as the story develops. If you don't want the players to see the thumbnail, that part of the VTT can be obscured by basic fog of war, as in this trick . Before I developed my NPC gallery macro , I did this all the time, or hid them behind already existing walls of dynamic lighting.
1531253856
Kastion said: Simple Way to have a "Handout" without a Journal Entry or Actually Making a Handout I've been using this method a lot recently to show handouts based on what they see in a room or somewhere on the map. I've done this a lot for books, journals, mystic scripts and alchemy recipe books among other things. Step 1: Use photoshop or GIMP to create an image with as much text as you want to display (In my instances I've used a high-res images of aged parchment and aged open books showing text on both pages.) Step 2: Upload the image to your Roll20 Library. I have a folder for things like this: *snip* Step 3: Place the image on the map somewhere as a token at a location you want the party to find and read the content of the book/scroll/etc. It will show up filling a full unit (Default 70 x 70 pixels) and look a too large or out of place so right click on the token and select "Advanced --&gt; is Drawing" then shrink it down to an appropriate level and possibly rotate it to make it look more organic. Mine looks like this: *snip* Step 4: Once they are in the room and say "I want to read the Journal" or "I want to see what the scroll says", etc etc. select the journal token then press SHIFT+Z this will show it to all players. You see how small that journal looks on the table? This is what the players see after pressing SHIFT-Z *snip * Doing all this lets you add readable books, scrolls, mystic script, notes, alchemy recipes, tactics or fighting treatise / instructions among many other things without having to create a Handout and having it as a "single use handout". Having these littered around your dungeon or cave or any area with intelligent / semi-intelligent creatures helps with world building and makes for a nice change of pace to just "Walk in room, see 4 orcs, kill orcs, take treasure, move on to next room." I have a long list of things like this I do to break the monotony of just combat encounters when in some stronghold or dungeon scenario. Do you by chance have a Template which we'd be able to use for a Scroll/Book in case we desire to create our own versions? this actually reminds me of a Tip that has yet to be mentioned here! This is actually a Double Tip! Resizing Images to Scale: Quick &amp; Easy! Smoother Resized Images! When you go to upload a desired Image, it can be a pain to get everything scaled properly, especially a Raw (unscaled, unsquared, unedited) image, &amp; when you edit it, sometimes it comes out Choppy, Blurry, Fuzzy, or just plain Odd; But, fret not! For there are a few simple &amp; easy methods for fixing this: 1: if you are familiar with the classic Excel Spreadsheets, you likely know that they had a command for figuring out when 2 numbers would eventually meet if you kept adding the original number. Nowadays though, Microsoft holds that Program &amp; asks for money, although there is a Freeware variant known as "OpenOffice Calc" as a part of the OpenOffice package of Text Editors (Link: Their Download Page ) For example: Key: $x "Do not Change x in Copy/Paste" = "Formula" Roll20 Sizes Raw Picture Size Formula for Result 70 512 =SUM(A2*B2) =SUM(A2;A$2) =SUM(B2;B$2) =LCM(A2;B2) =SUM(A3;A$2) =SUM(B3;B$2) =SUM(A4;A$2) =SUM(B4;B$2) =SUM(A5;A$2) =SUM(B5;B$2) 2: if you are unable/unwilling to use the above formula (only needs the 3x1 area on Row 2, the rest is explanatory &amp; entirely optional), you can still do it using 1 or 2 Calculators. You can spend time adding it all together, finding the lowest possible combination, or, you can take a shortcut: (A*B) = (C) = (B*A) (C/A) = (B) (C/B) = (A) 3: This can be used to figure out how Small you want to make something as well! in the Table above, you will notice I have a formula called " LCM() ", this can be used with up to 30 numbers to find out their " L east C ommon M ultiple", for example: =LCM(70;140;512) shows they all share the number 17,920 so you know what you want to resize the image to in order to create a smooth picture, This is useful for Maps which do not follow the standard Grid Size (I have not yet figured out how it works it's math tho). A lot of Resizing Methods use "Blending" or "Anti-aliasing" to force the Square Peg into the Round Hole, this way you can smoothly make the entire image Fit, without needing to lose out on quality, although, fair warning, you are going to want to have a good amount of RAM to make an image that large, as even a 7,000 x 7,000 Pixel Image can easily need half a Gig (512 MB) of RAM, and you'll still need to Shrink it afterwards to a more reasonable size (3,500 x 3,500 = 50 x 50 Units)
1531257041
keithcurtis
Forum Champion
API Scripter
Not sure what the gist of the post is. Are you giving a formula for proportional scaling vs. anamorphic? If the difference is slight, you shouldn't see a big difference in final quality. Also, at what point are you scaling your graphic? If you are doing it in Roll20, you aren't gaining anything, since the graphic is already in the library—Roll20 makes it's own scaled images internally as needed. If it's in an image editor, most (all as far as I know) of them have controls to force a proportional scale.
I've had to do this in the past with Maptool. It's just also a lot easier to bring the images in at 70 pix per square too. I've always used this spreadsheet .
1531297453

Edited 1531297552
It Scales the image, yes, but I'm sure you are aware of the horrible Scaling Issues that it suffers from, as well as the blurring that can occur. My tip was a method to get a crisp image without taking too much time to tweak the Image every time you use it, it requires beefy hardware since it can easily reach half a gig of RAM dedicated to just the Image, but, it bypasses ALL of the potential blur that might occur, it's actually a very old school method, however, it's not the optimal approach, as I'm fully aware that there is a viable combination around the 7k Pixel Range for 512 to 70, but I'm not very familiar with the Spreadsheet functions, however the LCM function is pretty good considering it's beyond my comprehension off hand of how it came to the answer of 17,920. The optimal approach involves lots of Cross Referencing between Columns A &amp; B as the numbers climb (although I used a Calculator, not a Spreadsheet), or a Spreadsheet function I'm unawares of. Manually increasing then decreasing the size ensures quality, requires zero blending of any sort, since it's a Pixel for Pixel expansion, if you want to really make sure, you want something along the lines of (B*(4*X)) B being the starting number, and the same Equation for A, the Target Number, and X being how many times to multiply the Base Number out by (times 4 for ultra pristine quality). The Blending Method was invented to lower the Hardware Requirements for image Resizing, it was truly a revolutionary invention, many were flabbergasted by the efficacy. Edit: apparently some Error occurred when I was posting this, error code:&nbsp; 908197796e8d4ecbb2ab22e712e66653