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 .
×
Advertisement Create a free account

[Script] Reporter

1616718877

Edited 1619472304
keithcurtis
Forum Champion
Marketplace Creator
API Scripter
Reporter A script to poll the VTT and return info on Token/Character pairs, along with customized action tools This is a script I have been working on for a couple of months. I don't think it's quite polished enough to send to one-click yet—it's too easy to get garbage results if the syntax isn't just right. Reporter is a script that reads the tokens on the board that are associated with character sheets and builds a report of them in the chat, returning selected values from either the token settings or the character sheets they are associated with. You can either select a set of tokens to work with, or if you select no tokens, it will assume all tokens on the Object/Token layer. To run the script on other layers, you must specifically select tokens, though. The basic syntax is: !report --[queries] ---[buttonline] ----[keywords] Queries Queries are constructed using t|attribute  to poll a token attribute c|attribute  to poll a character sheet attribute Examples !report --t|name  would return a report of all selected token names !report  --c|strength  would return a report of all strength values on the character sheets of the selected tokens For character sheets, the script will try to pull a value from the character  journal  first, and if that does not exist, the installed character  sheet . At this point in time, Reporter cannot return information that requires a callback, such as the GMNotes field. Dividers You may not always want each attribute reported on its own line. You can add a code after the attribute name(not the alias) to use something either than a line return between attributes comma (,)  Adds three non-breaking spaces between this attribute and the next, keeping them on the same line when possible. period (.) Adds a vertical pipe between this attribute and the next, keeping them on the same line when possible. dash (-)  Adds a thin gray horizontal rule between this attribute and the next. Hashtag (#)  Adds a bit of horizontal space between this attribute and the next. Examples: !report --t|emits_bright_light,|Bright-Light t|bright_light_distance|Distance t|emits_low_light,|Low-Light t|low_light_distance|Distance ---light will return this: Aliases There are times in the report when you would not like 'has_bright_light_vision' in the report. You can substitute an alias for the attribute name that will display in chat. For this, just add another pipe after the query and type an alias. For example, if a token has 60 feet of Night Vision: t|night_vision_distance might produce: T : night_vision_distance = 60 but t|night_vision_distance|NV would yield: T : NV= 60 Buttonline The buttonline is a string containing text and Ability or API Command buttons. These are formed using the normal syntax for buttons:  [button name](command)  with a few exceptions. In order to keep the Roll20 parser from resolving queries and attribute calls before the script gets them, they need to be written slightly differently. Examples: @{token|name}  is written as  A{token|name} ?{question|default_answer}  is written as  Q{question|default_answer} Further, for a handful of scripts, the Reporter API will attempt to parse the code so that each buttonline refers to the specific token being reported on. Currently  Token Mod, ChatSetAttr  and  Supernotes  are supported. It does this by injection the token id into the script calls for those scripts. Because of this, do not use --ids in a token-mod call, ChatSetAttr call, or --id in a Supernotes call. Filters Filters have changed since v.0.x. Please check any previous macros. This was changed to make parsing possible for running multiple filters on the same report. You may wish to constrain a report to only tokens which match a specific set of criteria. For example, you might have 50 tokens on the table, but 10 of them are goblins, and you only want to work with the goblins. Or you want to find all the characters who are both PCs and have darkvision. You can add filters after the  !report  command. The filter is written using a similar syntax to a query, followed by the filter term. In essence, it is querying each token for a match. The syntax is: !report|| operator | source | attribute | value You can add more filters just by adding double pipes to the end of the first filter and typing another. There are four types of operator. +  only includes the token/character pairs that matches the query -  excludes any token/character pair that exactly matches the query ~  only includes any character that is a partial match for the query ^  excludes any character that is a partial match for the query thus: !report||-|c|name|Goblin  will return all tokens that are not represented by the Goblin character sheet. !report||~|c|name|Goblin  will return any tokens that are represented by the Goblin or Hobgoblin character sheet. !report||-|c|npc|1||+|t| has_night_vision|true will exclude all NPCs (leaving only PCs), and then only return those that have nightvision set. Filters do not support an alias, because they are never displayed in the final report. Filters are executed sequentially, with each filter working on the result from the last, so some logic is required for best results. Filters are case insensitive. There is as yet, no way to test for an empty, or undefined value. Special Codes Reporter contains a few special codes for common cases, to make macro writing easier. You can put these in place of normal commands: --vision  as the  Query  will replace any declared query line with one designed to report most vision situations. It will give values for whether the token has sight, night vision and what the distance of any night vision is. ---vision  as the  Buttonline  will replace any declared button line with a buttonline designed to handle most cases of vision and darkvision. --light  as the  Query  will replace any declared query line with one designed to report most lighting situations. It will give values for the amount of light, distance and what type. --- light  as the  Buttonline  will replace any declared button line with a buttonline designed to handle most cases of lighting. The buttonline codes require the installation of the Token-mod API. Keywords Keywords change the overall appearance or scope of the report. They are separated from the rest of the report by four dashes and must come at the end. layer|[gmlayer|objects|map|walls|tracker|all]  will constrain the report to a particular layer or all layers at once, so long as no tokens are selected. If any tokens are selected, Reporter will default to the layer the selected tokens are on. This makes it easier for instance to check the vision settings of tokens on the token layer and the gmlayer simultaneously, or to ping pull to note tokens on the gm layer without switching manually to that layer.  If the layer keyword  all  is used the report will be on all token/character pairs on all layers. In this case, a layer character will appear on each subhead line of the report to let you know which layer the token is on. If the layer keyword  tracker  is used the report will be on all token/character pairs on the Turn Tracker as if it were a layer. In this case, a layer character will appear on each subhead line of the report to let you know which layer the token is on. If you click on the layer token, it will switch the token from the GM/Notes layer to the  Token/Objects layer and back.  compact|[true|false]  (default=false) :   The compact mode shows the token image at half size, and eliminates the second line of the report subhead, since it is not always desired. You may have a very large report you want to see better, or you may be using a sheet that does not support the default values. Currently the second line of the subhead only references the D&D 5th Edition by Roll20 Sheet. showheader|[true|false]   (default=true) : This will control whether the header will display at the top of the report. showfooter|[true|false]   (default=true) : This will control whether the footer will display at the bottom of the report. source|[true|false]  (default=true) : if source is set to false, the C and T characters that show whether an attribute comes fromthe token or the sheet will not be displayed. Use this is they are a distraction. charactersheetlink|[true|false]   (default=true) : if this keyword is set to false, the link to open the token's corresponding character sheet will not display subtitle|[true|false]  (default=true) : if this keyword is set to false, the line directly below the character name will not display. (This is also the default in Compact mode). This may be desirable if not using the D&D 5th Edition by Roll20 Sheet. ignoreselected|[true|false]  (default=false) : if this keyword is set to true, the search will not be preset to whichever tokens are selected. The report will run as if no tokens were selected, following whatever layer criteria might have been specified. npcsubstitutions[true|false]  (default=true) : if this keyword is set to false, the script will not automatically substitute npc attributes for their PC counterparts (ex: npc_senses for passive_wisdom). This is good for sheets that are not the D&D 5th Edition by Roll20 Sheet. sort|attribute (default is the raw order): This keyword will sort the final list. Most of the sorts are confined to the token attributes, since they require internal code and if they refer to a sheet may return poor or no results if the sheet does not have the proper attributes. Currently the following values can be sorted on:          charName : character name. Sheet must have a "name" attribute.         charNameI : character name, inverse order. Sheet must have a "name" attribute.         tokenName : token name         tokenNameI : token name, inverse order.         bar1 : token bar1 value         bar1I : token bar1 value, inverse order.         bar2 : token bar2 value         bar2I : token bar2 value, inverse order.         bar3 : token bar3 value         bar3I : token bar3 value, inverse order.         cr - Challenge Rating. D&D 5th Edition by Roll20 Sheet only         crI - Challenge Rating, inverse order. D&D 5th Edition by Roll20 Sheet only title|Title|  If this is present in the keywords, the string in between pipes will be placed at the top of the report. If you only want the custom title to display, be sure turn off the header with showheader|false. The title must be placed between two pipes.  title|My Title|  will work.  title|My Title  will break. Examples: !report ---- layer|gmlayer compact|true will report on all the tokens on the gm layer in compact mode. !report  ---- layer|tracker compact|true title|Tracker Navigator| showheader|false showfooter|false will produce a compact report that will allow you to navigate around the tracker tokens on the board, with links to ping pull, switch layers, open character sheets and more. A more full featured Turn Tracker could include more info and macros: !report --c|strength,|Str c|strength,|Dex c|strength|Con c|strength,|Int c|strength,|Wis c|strength#|Cha t|bar1_value,|HP c|npc_ac|AC c|npc_senses|perception t|statusmarkers|Condition ---[Apply Damage](!token-mod --set bar1_value|Q{Enter damage amount. Use positive or negative to modify values|-0}) | [Apply Condition](!token-mod --set statusmarkers|Q{Choose Status|Dead,dead|Bloodied,red}) ----layer|tracker compact|true title|Tracker Display| showheader|false showfooter|false source|false How to Read a Report Header.  The header of the report will list the range of tokens being reported, by name, followed by the count. The second line is 5e-specific right now, but I'll probably put in some options in the next version. Report Line. T he report line of each item will show an image of the token, followed by its token name and the associated character sheet name. If the character sheet is a renamed NPC statblock. ex. If Captain Hero is using the Veteran sheet, it will note this. It will also not if any of the characters have the PC flag. The second line of the report will display the creature type for NPCs or the class and level for PCs. This is specific to the D&D 5th Edition by Roll20 Sheet and will probably return undefined on other sheets. This is a feature in development. Click on: Token image  - Ping pull all players to the token's location. Token Name  - Ping pull only GM to the token's location. Invisible to players. Character Name  - Opens the associated character sheet. Then follows a list of the attributes being requested. T indicates a token attribute. C indicates a character attribute. The display of the source character can be turned off with the keyword  source|false. Button Line.  This is the list of commands that can be performed on each token. If it is a token-mod command, or a Supernotes command, it will be specific to that token. Refer to Button Line documentation above for details. Special Buttons.  There are a few buttons that appear in the report, at various places on the right side. ☰ will call up the report script menu ⟲ will repeat the command that created the report, in case you want to confirm that changes were made. w  will echo to the chat whatever is on that line: Token name on a report line, or Page name on the page line of the header. "That's all great Keith, but what can I use this for?" I originally wrote this to be a tool to check lighting and vision for each token on each page in a module. And there are some built-in shortcuts that allow for quickly doing this.  !report --vision  and  !report --lighting  for queries will return the important values for tokens regarding what they can see and what light they cast. Similarly, there are built in button lines for setting vision and lighting.   !report --vision ---vision  and  !report --lighting ---lighting  will give you reports for each token, and the appropriate buttons to control those values. The graphic above shows the default vision macro. This is what the default lighting report line looks like: How about other uses? Well I made a  handy video  that shows some very specialized uses. By putting queries into the filter, for instance, you can use one macro to search for any number of criteria. The video shows me using specific macros to navigate my campaign city map, for instance. The Show Notes button makes a call to the Supernotes script, and if I like the note, I can send it on to the players. I can instantly pull their attention to any part of the city, or just pull myself there, silently. I can run a query that only returns PCs to find their tokens wherever they might be. Where's the code? Right here . Keep in mind, this is still a work in progress. It will give unexpected results if the syntax is garbled. I will eventually add in some state variables as well. For instance to turn off the welcome message. If you decide to install this and the message is annoying, comment it out on line 43: //     menu(); Special thanks to The Aaron, TImmaugh, and Scott C. for being very patient with my endless "how do I..." questions.
1616718889

Edited 1618685268
keithcurtis
Forum Champion
Marketplace Creator
API Scripter
Sample Macros Default !report Without any arguments, the base command will just display the token id for every token in the report. PCs !report+c|npc|0  --t|has_bright_light_vision|Sight t|night_vision_distance|NV  ---vision This will find all PCs on the page. (The filter finds all tokens with an npc attribute of zero). This uses fewer, custom vision report lines, but the default Vision buttonline. It could be written out completely as  !report+c|npc|0  --t|has_bright_light_vision|Sight t|night_vision_distance|NV  ---**Vision** [Off](!token-mod --set bright_vision|false has_night_vision|false) | [On](!token-mod --set bright_vision|true) **Night** [Off](!token-mod --set has_night_vision|true night_vision_distance|0 bright_vision|false) | [On](!token-mod --set night_vision|true) | [Distance](!token-mod --set has_night_vision|true night_vision_distance|Q{Set night vision distance|60} bright_vision|false has_night_vision|false) | **[SET DEFAULT TOKEN](!token-mod --set defaulttoken)** City Sites !report+t|bar3_max|?{Choose Type|Home,Home|Temple,Temple|Tavern,Tavern|Inn,Inn|Road,Road|Area,Area|Official,Official|Watchhouse,Watchhouse|Business,Business|Entertainment,Entertainment|Info,Info} --t|bar3_max|Group ---[Set Name](!token-mod --set name|"Q{name|Bob}") | [Set Inhabitant](!token-mod --set bar3_value|"Q{Who lives here|Bob}") | [Set Group](!token-mod --set bar3_max|Q{Choose Type|Home,Home|Temple,Temple|Tavern,Tavern|Inn,Inn|Road,Road|Area,Area|Official,Official|Watchhouse,Watchhouse|Business,Business|Entertainment,Entertainment|Info,Info}) | [Notes](!gmnote) This is the one I am running in the sample video. This looks for all tokens with a specific value in their bar3 Max bubble. All of the sites on my city map have a value in that bubble of Home, Temple, Tavern, Inn, Road, Area, Official, Watchhouse, Business, Entertainment, or Info. The query fills in one of those values and finds all corresponding tokens on the map. Note that the filter query is written as a normal query, with a question mark. This is because it needs to be interpreted when you run the macro. Only queries and attribute calls in the buttonline need to be escaped. Note that the bar3 value has a query for "Who lives here?". Because we only want that to be resolved when we run that particular buttonline macro for that specific token, it is escaped, so it doesn't ask you when you run the initial macro. Similarly, there is a button to change the assignment of what Group it is in (Home, temple, etc.), and a button to call up a Supernotes macro. Each site token has specific notes for that location. Also note, that you can put an API command button into one of the bar values. In the example below, the unfortunately named Cordinia Sandwich has her character sheet linked. Compact Tracker Navigator !report  ---- layer|tracker compact|true title|Tracker Navigator| showheader|false showfooter|false will produce a compact report that will allow you to navigate around the tracker tokens on the board, with links to ping pull, switch layers, open character sheets and more. Tracker Controller A more full featured Turn Tracker could include more info and macros. This one has a couple of very simple token-mod macros for applying damage and conditions !report --c|strength,|Str c|strength,|Dex c|strength|Con c|strength,|Int c|strength,|Wis c|strength#|Cha t|bar1_value,|HP c|npc_ac|AC c|npc_senses|perception t|statusmarkers|Condition ---[Apply Damage](!token-mod --set bar1_value|Q{Enter damage amount. Use positive or negative to modify values|-0}) | [Apply Condition](!token-mod --set statusmarkers|Q{Choose Status|Dead,dead|Bloodied,red}) ----layer|tracker compact|true title|Tracker Display| showheader|false showfooter|false source|false Passive Perception Need to know the passive perception of everyone on the board? !report --c|npc_senses|perception ---- layer|all compact|true title|Passive Perception| showheader|false showfooter|false source|false
1616718914

Edited 1618687492
keithcurtis
Forum Champion
Marketplace Creator
API Scripter
Issues Supernotes integration is pending. The latest version of Supernotes has not yet been merged with the Roll20 repo. Those needing the latest version which allows for calling a note from a token id can find it here , version 0.0.91 When passing a custom buttonline (not a built-in) upon using the repeat button, the buttons are passed as text, not links. Check out the Aaron's HE replacement function, see if this helps. Add PF2 Support. Needs to report traits on line 2 of each report for NPCs and class + level on PCs Currently there is an undocumented feature that substitutes a few attribute names where they differ between the PC and NPC versions of the D&D 5th Edition by Roll20 Sheet. Example AC (for PCs) and npc_AC (for NPCs). I need a  substitutions|false  keyword to turn that off for other sheets. Updates Reporter now respects ChatSetAttr macros and will route them to the corresponding character id. 0.0.5 Added Keywords 0.0.6 More Keywords, plus Dividers and Turn Tracker access Future Enhancements 1) Add an options keyword list. use ---- as the separator, to distinguish it from buttonline. Possible inclusions [layer]:   gmlayer, objects, map, walls, all — To specify a layer to search on. This would allow a user to find all note tokens on the GM layer without leaving the token layer, for example. "all" would allow all tokens on the page to be caught. Useful for auditing pages. compact —  Don't report the second reportline and halve the size of the token. 2) If the "all" keyword above works, use slight tinting on token header area to indicate layer? Or use existing layer indicator character? 2) Mass buttonline. At bottom of report. Like the buttonline, but does not add token id specification. Use to affect all tokens in report. May be problematical to integrate with some scripts.
1616720461
The Aaron
Forum Champion
API Scripter
WOW!  Amazing!!!  I can't wait to dig into this!
1616724710
David M.
Pro
API Scripter
This looks super-cool, Keith! Demo video with the map application was great! Is the link to the source code missing, or did I just miss it?
1616725229
keithcurtis
Forum Champion
Marketplace Creator
API Scripter
David M. said: This looks super-cool, Keith! Demo video with the map application was great! Is the link to the source code missing, or did I just miss it? Weird. I linked it, and then the link disappeared. So I linked it again, and it's gone again. Third time's the charm?
1616728476
David M.
Pro
API Scripter
Haha, got it, thx!
1616728998
*wild clapping* This looks super!
1616730176
timmaugh
Pro
API Scripter
This is fanTASTic! I saw this in various stages as you were developing it, and was always impressed with the ease of information collection and the quality of the finished presentation... so I'm not sure you're using those words correctly: "not quite polished." =D
1616731762
keithcurtis
Forum Champion
Marketplace Creator
API Scripter
"Polished on the outside", maybe? Internally, it could probably use better error catching and a way that passes the buttonline on the repeat that doesn't lose all the internal code (passes it as text).
1616736803
Scott C.
Forum Champion
Sheet Author
API Scripter
Compendium Curator
Very nice Keith! Glad to see this getting launched!
1616785720
keithcurtis
Forum Champion
Marketplace Creator
API Scripter
Reporter now respects ChatSetAttr macros and will route them to the corresponding character id. [Set Strength to 10](!settattr --strength|10) becomes [Set Strength to 10](!settattr --charid -123456789ABC --strength|10) in the report buttonline, and will affect the character associated with the token on that report. (This brings it up to par with token-mod and the coming update to supernotes)
1617894012

Edited 1617910273
hanks Keith, My first use is to report on detailed UDL settings and to locate those sometimes hard to find "light crumb" tokens, especially on those large and busy maps.   !report+c|npc|0 --t|has_bright_light_vision|Vision t|has_night_vision|NV t|night_vision_distance|NV-Dist t|emits_bright_light|Emits-BL t|bright_light_distance|BL-Dist t|emits_low_light|Emits-LL t|low_light_distance|LL-Dist t|has_limit_field_of_vision|Limited-FoV t|limit_field_of_vision_center|FOV-Center t|limit_field_of_vision_total|FOV-Total t|has_limit_field_of_night_vision|Limited-FoV-NV t|limit_field_of_night_vision_center|FoV-NV-Center t|limit_field_of_night_vision_total|FoV-NV-Total t|has_directional_bright_light|Dir-BL t|directional_bright_light_center|DL-BL-Center t|directional_bright_light_total|Dir-BL-Total !report+t|bar3_max|LC --t|bar3_value|Loc t|bright_light_distance|BL_Dist t|low_light_distance|LL_Dist ---vision I used the bar3_value to store a simple location name and set bar3_max equal to "LC" so I can filter for just the crumbs.  Clicking on the token image takes me right to where it is so I can then manage it.   This has also been useful for debugging some of my UDL issues. Thanks
1617921143
keithcurtis
Forum Champion
Marketplace Creator
API Scripter
Will M. said: This has also been useful for debugging some of my UDL issues. Thanks Ha! That was actually the inspiration for writing it: debugging UDL setups on modules.
1618138667
David M.
Pro
API Scripter
Good idea, Will! I often add "lights" to a map using a transparent png with a gm-only aura, but if I move them to the map layer the aura disappears and they are sometimes hard to find on busy maps as you mentioned. I may steal this :)
1618182537
keithcurtis
Forum Champion
Marketplace Creator
API Scripter
Update (info repeated in top post): Keywords Keywords change the overall appearance or scope of the report. They are separated from the rest of the report by four dashes and must come at the end. layer|[gmlayer|objects|map|walls|all]  will constrain the report to a particular layer or all layers at once, so long as no tokens are selected. If any tokens are selected, Reporter will default to the layer the selected tokens are on. This makes it easier for instance to check the vision settings of tokens on the token layer and the gm layer simultaneously, or to ping pull to note tokens on the gm layer without switching manually to that layer If the layer keyword  all  is used the report will be on all token/character pairs on all layers. In this case, a layer character will appear on each subhead line of the report to let you know which layer the token is on. compact|[true|false]  The compact mode shows the token image at half size, and eliminates the second line of the report subhead, since it is not always desired. You may have a very large report you want to see better, or you may be using a sheet that does not support the default values. Currently the second line of the subhead only references the D&D 5th Edition by Roll20 Sheet. Example: !report ---- layer|gmlayer compact|true will report on all the tokens on the gm layer in compact mode.
1618188682
Funny - I was going to ask about filtering by layer, or at least adding a layer indicator.
1618192260
keithcurtis
Forum Champion
Marketplace Creator
API Scripter
I think the biggest use will be assigning all the room numbers on the gm layer to their corresponding handouts in a module. If they are all tied to a character called "Room" or something, you could put: [1A]( handoutURL ) in each bar1 for instance. Then the macro !report+c|Room --t|bar1_value|Notes ----layer|gmlayer would give you a way to quickly navigate to any room in a dungeon, pulling either yourself or yourself and players to the location and have a button that opens up the corresponding handout. Or since most modules have multiple rooms in a single handout (I wish we had anchor text), cut and paste the room description into the GMnotes of the token and use Supernotes on the buttonline to call them up.
1618685606
keithcurtis
Forum Champion
Marketplace Creator
API Scripter
Added more keywords: showheader|[true|false]   (default=true) : This will control whether the header will display at the top of the report. showfooter|[true|false]   (default=true) : This will control whether the footer will display at the bottom of the report. source|[true|false]  (default=true) : if source is set to false, the C and T characters that show whether an attribute comes from the token or the sheet will not be displayed. Use this is they are a distraction. title|Title|  If this is present in the keywords, the string in between pipes will be placed at the top of the report. If you only want the custom title to display, be sure turn off the header with showheader|false. The title must be placed between two pipes.  title|My Title|  will work.  title|My Title  will break. Also added tracker  to the list of layers: If the layer keyword  tracker  is used the report will be on all token/character pairs on the Turn Tracker as if it were a layer. In this case, a layer character will appear on each subhead line of the report to let you know which layer the token is on. If you click on the layer token, it will switch the token from the GM/Notes layer to the  Token/Objects layer and back.  New feature: Dividers You may not always want each attribute reported on its own line. You can add a code after the attribute name(not the alias) to use something either than a line return between attributes comma (,)  Adds three non-breaking spaces between this attribute and the next, keeping them on the same line when possible. dash (-)  Adds a thin gray horizontal rule between this attribute and the next. Hashtag (#)  Adds a bit of horizontal space between this attribute and the next. Examples: !report --t|emits_bright_light,|Bright-Light t|bright_light_distance|Distance t|emits_low_light,|Low-Light t|low_light_distance|Distance ---light will return this: I also added these new example macros to the second post: Compact Tracker Navigator !report  ---- layer|tracker compact|true title|Tracker Navigator| showheader|false showfooter|false will produce a compact report that will allow you to navigate around the tracker tokens on the board, with links to ping pull, switch layers, open character sheets and more. Tracker Controller A more full featured Turn Tracker could include more info and macros. This one has a couple of very simple token-mod macros for applying damage and conditions !report --c|strength,|Str c|strength,|Dex c|strength|Con c|strength,|Int c|strength,|Wis c|strength#|Cha t|bar1_value,|HP c|npc_ac|AC c|npc_senses|perception t|statusmarkers|Condition ---[Apply Damage](!token-mod --set bar1_value|Q{Enter damage amount. Use positive or negative to modify values|-0}) | [Apply Condition](!token-mod --set statusmarkers|Q{Choose Status|Dead,dead|Bloodied,red}) ----layer|tracker compact|true title|Tracker Display| showheader|false showfooter|false source|false Passive Perception Need to know the passive perception of everyone on the board? !report --c|npc_senses|perception ---- layer|all compact|true title|Passive Perception| showheader|false showfooter|false source|false
1618686537
Andreas J.
Forum Champion
Sheet Author
Translator
I really like the Tracker Controller and Passive Perception examples, especially as the API is shown to be sheet-agnostic, so those macros could easily be adapted for other sheets than 5E.
1618687462
keithcurtis
Forum Champion
Marketplace Creator
API Scripter
That makes me think of another keyword I need. Currently there is an undocumented feature that substitutes a few attribute names where they differ between the PC and NPC versions of the D&D 5th Edition by Roll20 Sheet. Example AC (for PCs) and npc_AC (for NPCs). I need a substitutions|false keyword to turn that off for other sheets.