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&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 Macros that I use to improve my D&D games *. They simultaneously roll a whole bunch of dice (as opposed to querying for a skill/stat) to produce output like: and With 3-D dice turned on, the macros generate a significant number 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 &{template:default} {{name= @{selected|character_name} Skills}} {{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 &{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}]]}} 4. Then I defined the Macros as bar macros, with labels that use the Shh emoji 狼 (thanks Keith for 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 & 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: &#37;&#123;@{character_name}&#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 / < > = [ ] ( ) [[ ]] {{ }} { , } @ % 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 &#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 &#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 &{template:default} ), since you'll always be using the same initial command, assuming you use /em it would read: [Button](! /em &{template:default} {{name=***@{selected|token_name}'s Damage Output:***}} {{Fire Bolt=[[1d10]]}}) which reads out before running through a Parser buffer as: [Button](! &#47;em &&#123;template&#58;default&#125; &#123;&#123;name&#61;&#42;&#42;&#42;&#64;&#123;selected&#124;token_name&#125;&#39;s Damage Output&#58;&#42;&#42;&#42;&#125;&#125; &#123;&#123;Fire Bolt&#61;&#91;&#91;1d10&#93;&#93;&#125;&#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&#61;&#91;&#91;1d10&#93;&#93;&#125;&#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.