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

[Script] SmartAoE - graphical interface for implementing AoE's on gridded maps

November 07 (3 years ago)

Edited June 19 (1 year ago)
David M.
Pro
API Scripter

Concept

Have you ever overlayed a cone, line, or circle template on a map and wondered if that square that is just barely covered should count as "in"? Sure, there are pre-made grid templates out there, but you are usually limited to 90/45deg orientations. The idea behind this script is to provide flexibility in casting angles (to align just the right spot before triggering) and a means for consistent ruling of these cases. The script can be used with either just basic functionality to simply draw AoE regions, or can utilize a host of subcommands to define damage, saving throws, chat output, etc., detecting creatures within affected squares and either rolling saving throws and/or applying damage and condition markers automatically (ala GroupCheck or similar script), or as a deferred action by clicking buttons on the chat interface.

  • Available for one click install! one-click version: v0.25
  • Source code can be found here: GitHub repo - v0.29
  • Read this! No, really.  A full run-through of the script setup, capabilities, and limitations along with many example macros and animated gifs can be found on the wiki site here: https://wiki.roll20.net/SmartAoE
  • YouTube Video: Nick Olivo created a video on his channel that gives a great intro to the script and a walkthrough of simulating a specific 5e spell effect (Shatter). Check it out here!
  • Repo of several 5e spell macros can be found here

Teaser Animation (click to play)

Figure description. Example of 4 active AoE's: 1) a green 90deg cone (fixed radius, snapped to intersection), 2) a red 5e-style cone (variable radius), 3) a blue line effect, and 4) an aqua circle (using the "float" keyword described in the documentation, and a custom multi-sided controlToken). The circle AoE is triggered (a 5e SRD Ice Storm spell, defined when it was created), making saving throws for tokens in area, automatically deducting damage, and outputting the results to chat.

Notes

  • This script might seem intimidating to use at first read due to the large amount of optional commands and subcommands. I tired to make the wiki as user-friendly as possible, but there is still a lot. Please don't hesitate to ask questions, but try look through the wiki first. There are a bunch of examples at the end that can help you get started.
  • Under the hood, this script is very complicated. Between myself, the players in my gaming groups, and my Patreon supporters, it has gone through a fair amount of testing, but issues are sure to come up. If so, just post to this forum thread and I'll try to get it resolved as soon as possible. 
  • To this end, there is a list of Quirks, Recommendations, and Known Issues in the wiki.
  • If you are impatient, you can jump to the wiki examples here!

Ok, that's all for now. Hope you have fun playing around with it!

November 07 (3 years ago)

Edited April 12 (11 months ago)
David M.
Pro
API Scripter

Version history

v0.18 - initial public release

v0.19 - bug fix for fixed radius AoE's using --controlTokName|self when the caster token is larger than 1x1.

v0.20 - bug fix for non-unity grid settings, added --offset subcommand, added !smartclearcache primary api command, now triggering AoE updates only on token move events. See forum post for details

v0.21 - Added --saveFormula shorthand for PF1/2 by Roll20 and PF Community sheets, added new aoeTypes "PFcone" and "PFcircle", install now automatically creates the "AoEControlToken" character with several abilities and token actions, install also creates a collections macro "AoEGenerator" that spits out a chat menu for simple common AoE types. See forum post for details

v0.22 - Bug fix for grid snapping on pages with gridWidth other than 1; Allow script writers to register their token change event functions to SmartAoE. See forum post for details.

v0.22a - Bug fix allowing apostrophes and backticks to be used in character names when damage application is deferred using --autoApply|0

v0.23 - Allows multiple bar values to be declared for the --bar subcommand. Minor bug fix relating to small AoE's vs. very large tokens. See forum post for details

v0.24 - Added "Wall" aoeType. Added --width subcommand. Bug fixes for certain line effects and offset issues. See this forum post for details

v0.25 - Added resource Management via --resource subcommand. Added the --chatAvatarsEnabled subcommand. Bug fix for very small grid scales. See this forum post for details

v0.26 -  SoundFX, Whisper options, Turnorder, and controlTok Tooltips. See this forum post for details

v0.27 -  Now explicitly sets the controlTok to object layer prior to spawning, due to change in Roll20 default token JSON information.

v0.28 - Bug fix regarding map/grid alignment for certain AoE types

v0.29 - Added --affectsCaster and --casterCondition commands. Bug fixes to eliminate duplicating statusmarkers and certain saving throw conditions that crashed the sandbox.  See this forum post for details

v0.30 - Fixed typos in the names of two default abilities on the automatically-generated AoEControlToken character. This affected the use of the AoEGenerator macro. See this forum post for details.




November 07 (3 years ago)

Does your script account for spheres/circles where the casters size adjusts it?  AKA spheres where the origin is the caster?  This is primarily why I had to go make my own as nobody really realizes there are 2 different spheres in 5e.  

November 07 (3 years ago)

Edited November 07 (3 years ago)
vÍnce
Pro
Sheet Author

Awesome!  Can't wait to try this out David.  At first I thought this might only work with 5e, but after looking over the very helpful wiki page it looks like there shouldn't be any problems using this for Pathfinder 1e (I think 2e as well...).  Hopefully the PF community can contribute more PF-specific macro examples for the wiki as well.

November 07 (3 years ago)

Edited November 07 (3 years ago)
David M.
Pro
API Scripter

DM Eddie: yes, there are a couple of ways to do it. 

In the default way (using a control token in addition to the caster token), when you specify a fixed radius, the radius will be calculated based on the dimensions of the caster token. Note that using a control token means that you will have to grab the spawned token and move it away from the origin point to trigger the AOE generation. When you delete the control token, the AoE is deleted as well.

E.g.

!smartaoe {{

  --aoeType|circle

  --minGridArea|0.25

  --radius|30ft

}}

 

The second way to handle areas emanating from and moving with a caster token is a recent addition to the script which doesn't require a control token. In testing this recent update, I noticed that this method needed to be updated to account for caster token size. This fix is in v0.19 at the GitHub link in the original post

Here is a simple example for a 30ft circle emanating from a caster token. (note no control token in the picture)

 !smartaoe {{

  --aoeType|circle, float

  --radius|30ft

  --controlTokName|self

  --forceIntersection|0

}}


Since you'd never want to delete the caster token: in order to remove the AoE using this method, you would run the following command (likely as an ability macro on the caster as described in the wiki setup here).

!smartremove

A more complex macro (and animated gif) illustrating this second method plus a couple other features is provided in the wiki here (5e Spirit Guardians spell)

 

November 07 (3 years ago)
David M.
Pro
API Scripter

@Vince: I was trying to make it as system-agnostic as possible. Just note that PF cones are a bit weird. From what I could tell, it seems that the "standard" PF templates don't use a uniform calculation method (based on % of square covered). I got as close as I could in this example

November 08 (3 years ago)
Scott C.
Forum Champion
Sheet Author
API Scripter
Compendium Curator

David M. said:

@Vince: I was trying to make it as system-agnostic as possible. Just note that PF cones are a bit weird. From what I could tell, it seems that the "standard" PF templates don't use a uniform calculation method (based on % of square covered). I got as close as I could in this example

The PF cone (and circle for that matter) use the distance calculation of Pathfinder, which is alternating double movement for diagonals.


Beautiful job on this David. I had something sort of like it a bit ago, but it was ugly as sin. Your's is gorgeous.

November 08 (3 years ago)
David M.
Pro
API Scripter

Thanks, Scott!

Ok, that makes sense regarding PF areas. With the current script (taking into account % coverage area only), I think PF-style circular AoE's can be accurately represented using a --minGridArea|0.90 as shown below. PF cones will currently have extra squares counted (bottom image), as we are limited to a --minGridArea|0.50. Requiring anything more than that will cut off the two squares immediately adjacent to the caster token.

I'd have to play around with it, but I think I could add a "PFcone" aoeType that would take the purely area-based squares of the standard cone method and add another filter that counts diagonals to remove the extra corner cases. Pretty sure I already have some code in the Radar script that does these calculations.

 

November 08 (3 years ago)
keithcurtis
Forum Champion
Marketplace Creator
API Scripter

I am so looking forward to trying this out. This looks amazing!

November 09 (3 years ago)

Edited November 09 (3 years ago)

Just started playing with this, it has a lot of promise. 

Question: Is it possible to offset where the initial AoE Target Token spawns?  Even 1/2 or 1 grid over so that it's easier to see than when it spawns under the selected token?

November 09 (3 years ago)
David M.
Pro
API Scripter

Sure, I'll add an --offset|x,y command in the next rev (ala the Spawn script).

But just to clarify: the control token already is being told to spawn above the caster token***. I think what is happening is that Roll20's behavior as of a yr or two ago is to always give tokens-with-sight priority z-ordering over sightless tokens. If you give the default token sight, it should be immediately accessible directly above the caster without an offset. Regardless, I'll still add that option.

That "adding sight" step was an oversight in the setup instructions (I had set mine up months ago and honestly forgot about it). I will update the wiki accordingly.

(***exception to spawning above is when a custom AoE image token is used via --controlTokName/controlTokSize/controlTokSide if the size is greater than 1x1. Those control tokens are sent to back to ensure you can still access target tokens within the large AoE for non-instantaneous effects)


November 09 (3 years ago)

Edited November 09 (3 years ago)

Do you have an example of ScriptCards calling !smartaoe?  I'm thinking about making a "Super Generic AoE" Script that asks the user for things like "Shape", "Radius/Size", "Center On (self/target)", .... and then builds the appropriate smortaoe command dynamically.  

To set up a call correctly, without creating a ton of mini-smartaoe macros, I need access to conditional commands and string functions so I can build a dynamic superaoe command.  I'm just concerned with all the "{{, }}, --, |" special characters that historically have tripped up the scriptcards parcer.

BTW - "Add sight" step fixed my issue - no need for an offset.  


November 10 (3 years ago)
David M.
Pro
API Scripter

Will, I don't have one handy right now, and I am currently affected by the dead api sandbox bug that started today. But, when I have access to the api again I'll try to come up with something! My concern is that it would be a ton of queries since the primary design goal of flexibility unfortunately requires a lot of input. I wonder if using scriptcard libraries might be a potential solution, where you build up a "spellbook" library and use a simple query or chat menu to call them up? 

Glad to hear adding sight fixed your issue, though I will still likely add the --offset option to the script because a) it should be pretty easy and b) there might be others that would want that functionality.   

November 10 (3 years ago)
keithcurtis
Forum Champion
Marketplace Creator
API Scripter

David, are you by any chance on a Mac? I discovered that the API Output Console was black, but the API was actually running (sometimes). It would report in incognito mode. Same behavior on Firefox. I was able to restore by resetting Chrome. Pain in the neck, but seems to have worked.

November 10 (3 years ago)

Edited November 10 (3 years ago)
David M.
Pro
API Scripter

No, I'm on Win10/Chrome in incognito mode. I'll try completely closing all windows and starting from scratch just in case.

EDIT - derp. That worked. Closed all Chrome windows and logged back into Roll20 - all good now. Thanks!

November 10 (3 years ago)

Hi David, First I have to said Awesome API, is a master piece. Now I set it up in two campaigns in one it works perfectly and on the other is giving me this message:

(From SmartAoE): Error: tempAttrs[0].get(...).toLowerCase is not a function

Do you know what can cause this?

November 10 (3 years ago)

Also When I set the default token with Vision it does not even appear

November 10 (3 years ago)

Edited November 10 (3 years ago)
David M.
Pro
API Scripter

Warlord,

1) That error message is related to the section that finds resistances, vulnerabilities, and immunities. What character sheet are you using? Is your macro using any of the commands: --resistAttr, --vulnerableAttr, or --immunityAttr? 

2) When you say it does not appear, do you mean the control token does not spawn? If so, is it possible that it is just hiding behind the caster token? That could happen if the token was updated but the default token was not removed and re-set.

November 11 (3 years ago)

1) I'm using the 5e by roll20. I try on PC and work fine, when I tried on NPC is when I get the error. my macro is like this:

Breath Weapon

!smartaoe {{
  --title|Breath Weapon
  --leftsub|15 ft. Cone
  --rightsub|DC [[8+@{selected|constitution_mod}+@{selected|pb}]] DEX
  --aoeType|5econe
  --forceIntersection|0
  --radius|15ft
  --origin|nearest, face
  --minGridArea|0.25
  --minTokArea|0.25
  --fx|burn-fire
  --dc|[[8+@{selected|constitution_mod}+@{selected|pb}]]
  --saveFormula|5eDEX
  --damageFormula1|[[[[1+ceil(@{Heskan|Level}/5)]]d6]]
  --damageType1|Fire
  --ignore|SmartAOE_ignore,1 
  --instant|1
  --autoApply|1
  --bar|1
  --desc|You can use your action to exhale destructive energy. Your gold draconic ancestry means this exhalation is a 15 ft. cone dealing fire damage. When you use your breath weapon, each creature in the area of the exhalation must make a Dexterity saving throw. The DC for this saving throw equals 8 + your Constitution modifier + your proficiency bonus. A creature takes 2d6 damage on a failed save, and half as much on a successful one. The damage increases to 3d6 at 6th level, 4d6 at 11th level, and 5d6 at 16th level. After you use your breath weapon, you can't use it again until you complete a short or long rest.
}}


2) I think this was because I was also running !AMMO to automatically reduce the breath weapon resource and it was interfering with !smartAoE. I eliminate AMMO and is working. I try to give vision to the token but still does not appear on top of the character but on the bottom.

One of the NPC had vulnerability and immunities. took him out of the AoE but still the error appear. 




November 11 (3 years ago)

I have done test on both my campaign in one is working perfect, no matter if it is NPC or PC, on the other campaign it only works on PC. One of the differences between the two campaign is the quantity of API install. Do you think another API could be affecting SmartAoE?

November 11 (3 years ago)
David M.
Pro
API Scripter

When you said it was working when you removed !AMMO, which part started working? The attribute error, or the control token z-order (above/below) problem?

For the vision-related z-order problem, I just want to clarify the steps to update the default token:

1) open token menu and give token vision
2) With the token selected, open the character sheet, click "Edit"
3) Mouse-over the default token image. Click "remove"
4) Click "Use Selected Token" - this final step will save the current token settings (with vision) to the default token.

As far as the npc-related error, I can't say for sure what is going on with the given information. It's possible that there is an api conflict. SmartAoE watches for token changes and token deletion in addition to handling chat messages. Looks like I can/should narrow down the scope of my token change event to only trigger when position is changed rather than any change. I'll add that to the next revision.

If you want, I can take a look at this if you PM me a link to your game and temporarily promote me to GM. Just be sure to PM and not post the invite link to the forum. We can handle the rest of the troubleshooting over PM and/or Roll20 chat so we can free up the forum thread. I'll post back here when there is something to report.

November 11 (3 years ago)
David M.
Pro
API Scripter

Ok, so mystery solved. The module that Warlord was running had some renamed attributes that were different that standard compendium creatures. But more importantly, those resistance/vuln/immunity attributes had a numeric value "0" in them instead of blank, which I was not expecting and which threw the error when I tried to perform a .toLowerCase() on them. I will add some extra handling for these cases in the next revision.

November 11 (3 years ago)

Edited November 11 (3 years ago)
Sr. K
Pro
Sheet Author

Great script David! Now that I've been able to test it I need to add it to all of my current games, I was planning to use your spawning script to manage spell areas but now I've got this superpowerfull tool that does magical things :) Thanks!!!

I'm having some trouble generating circle areas in maps with 0,5 cell with (DotMM). The generated grid area is misaligned from the map grid, if I drag the control token to an intersection the token is inside a cell, if I drag it to a cell appears in an intersection. It seems to work as intended in 1 cell with maps.


November 11 (3 years ago)

Edited November 11 (3 years ago)
David M.
Pro
API Scripter

Sr. K, Thanks for the heads-up. This was working a month or two ago but it appears that I broke it some time before releasing! I think I found the culprit. I'll have a fix out soon.

EDIT - as an aside, your example macro was probably just for demonstration purposes, but just in case: you would likely want to add a --minGridArea to your macro. It defaults to 0.01 of the grid cell covered to count as "in" the AoE :)

November 11 (3 years ago)
David M.
Pro
API Scripter

Version Update v0.20 - found here

  • Fixed bug for pages with non-unity grid size that was causing a shift in the AoE alignment (thanks Sr. K!)
  • Added the --offset subcommand to spawn the control token a number of grid units away from the origin token. Examples:

    --offset|1, 0        //spawns one square to the right
    --offset|-1, -1      //spawns one square left and one square down  
    • Allow for multiple attributes to be checked for resistance/vulnerability/immunity (comma-delimited). For example, user Warlord reported that the 5e White Plume Mountain module has npcs with attributes named npcd_resistances instead of npc_resistances. You can now explicitly add optional attribute names so that your standard compendium npcs and the goofy module ones can both be checked for resistance/vulnerability/immunity. Examples:
    --resistAttr|npc_resistances, npcd_resistances
    --vulnerableAttr|npc_vulnerabilities, npcd_vulnerabilities
    --immunityAttr|npc_immunities, npcd_immunities
    • AoE updates are now limited to changes in token position. Previously, any changes to the token (e.g. bar values, etc.) would trigger an update. 
    • Added a primary api command to clear the cache (SmartAoE State object) of all AoE links in the campaign. Once or twice I have experienced some glitches when restarting my sandbox and trying to run SmartAoE commands too soon. If you suspect your SmartAoE State object has been corrupted in some way, just run the following command:
    !smartclearcache





      November 11 (3 years ago)

      This is magnificent! Thank you for the contribution - very much looking forward to blowing some stuff up with it.

      November 11 (3 years ago)
      .Hell
      Sheet Author

      In Shadowrun grenades lowers their dmg the further away the target is from the center. This is often put as a formular like -2/m. Could you add something like this? I would really like to use it :)


      Is it possible for each token affected to put out the dmg it would take?

      November 11 (3 years ago)
      David M.
      Pro
      API Scripter

      Hmm I could look into the damage-as-a-function of distance functionality (maybe something like --damageFallOff|<rate>), but might not get to it right away. Would have to clarify a few things first as well, like (a) if you'd want a smooth linear interpolation or have it broken up into discrete distance categories, and (b) if the distance calculation starts at the absolute center point or at the edge of a 1x1 square origin.

      As to your 2nd point, damage applied per token is already displayed in chat. If anything, I'd probably want an option to suppress those messages.

      November 11 (3 years ago)

      Edited November 12 (3 years ago)
      David M.
      Pro
      API Scripter

      Does anyone have a generic set of saving throw formulas for PF1 / PF2 (needs to work for both PCs & NPCs if there are any attribute naming differences like in 5e)? If so, I can add the same shorthand that I use for 5e saving throws (e.g. --saveFormula|5eDEX) for these other systems / sheets. Just trying to save people some macro prep time and help eliminate typos.

      For example, "5eDex" is auto-replaced in the script with the following formula:

      [[d20 + ([[d0 + @{dexterity_save_bonus}@{pbd_safe}]]*(1-@{npc})) [PC] + (@{npc_dex_save}*@{npc}) [NPC]]]

      While we're at it, if you want to share some generic formulas (and suggested shorthand name) for any other system that'd you'd like implemented, feel free!

      EDIT - Played around with the PF1/PF2 character sheets a bit. Question for any PF players out there: Do the following formulas look valid? 

              "PF1fort": {
                "name": "FORT Save",
                "formula": "[[1d20+@{fortitude}[MOD]+(@{saves_condition})[CONDITION]+@{rollmod_save}[QUERY]]]"
              },
              "PF1ref": {
                "name": "REF Save",
                "formula": "[[1d20+@{reflex}[MOD]+(@{saves_condition})[CONDITION]+@{rollmod_save}[QUERY]]]"
              },
              "PF1will": {
                "name": "WILL Save",
                "formula": "[[1d20+@{will}[MOD]+(@{saves_condition})[CONDITION]+@{rollmod_save}[QUERY]]]"
              },
              "PF2fort": {
                "name": "FORT Save",
                "formula": "[[1d20 + [@{saving_throws_fortitude_proficiency_display}] (@{saving_throws_fortitude})[@{text_modifier}] + (@{query_roll_bonus})[@{text_bonus}]]]"
              },
              "PF2ref": {
                "name": "REF Save",
                "formula": "[[1d20 + [@{saving_throws_reflex_proficiency_display}] (@{saving_throws_reflex})[@{text_modifier}] + (@{query_roll_bonus})[@{text_bonus}]]]"
              },
              "PF2will": {
                "name": "WILL Save",
                "formula": "[[1d20 + [@{saving_throws_will_proficiency_display}] (@{saving_throws_will})[@{text_modifier}] + (@{query_roll_bonus})[@{text_bonus}]]]"
              },
      November 12 (3 years ago)
      .Hell
      Sheet Author


      David M. said:

      Hmm I could look into the damage-as-a-function of distance functionality (maybe something like --damageFallOff|<rate>), but might not get to it right away. Would have to clarify a few things first as well, like (a) if you'd want a smooth linear interpolation or have it broken up into discrete distance categories, and (b) if the distance calculation starts at the absolute center point or at the edge of a 1x1 square origin.


      Discrete distance categories would be superb. I can imagine a lot of other games have something which is less linear and could use this too.

      I usually calculate from 0x0 Square but 1x1 is no problems. The rules are not clear on where to start the dropoff (first meter free or not)

      November 12 (3 years ago)
      vÍnce
      Pro
      Sheet Author


      David M. said:

      Does anyone have a generic set of saving throw formulas for PF1 / PF2 (needs to work for both PCs & NPCs if there are any attribute naming differences like in 5e)? If so, I can add the same shorthand that I use for 5e saving throws (e.g. --saveFormula|5eDEX) for these other systems / sheets. Just trying to save people some macro prep time and help eliminate typos.

      For example, "5eDex" is auto-replaced in the script with the following formula:

      [[d20 + ([[d0 + @{dexterity_save_bonus}@{pbd_safe}]]*(1-@{npc})) [PC] + (@{npc_dex_save}*@{npc}) [NPC]]]

      While we're at it, if you want to share some generic formulas (and suggested shorthand name) for any other system that'd you'd like implemented, feel free!

      EDIT - Played around with the PF1/PF2 character sheets a bit. Question for any PF players out there: Do the following formulas look valid?

      If you want something that will work with the PF Community sheet...

      "PFc1fort": {
      "name": "FORT Save",
      "formula": "[[1d20+@{total-Fort}[tot]+@{Fort-ability-mod}[mod]+@{Fort-trait}[trait]+@{Fort-resist}[res]+@{Fort-misc-mod}[misc]+@{saves-cond}[cond]+@{buff_Fort-total}[buff1]+@{buff_saves-total}[buff2]]]"
      },
      "PFc1ref": {
      "name": "REF Save",
      "formula": "[[1d20+@{total-Ref}[tot]+@{Ref-ability-mod}[mod]+@{Ref-trait}[trait]+@{Ref-resist}[res]+@{Ref-misc-mod}[misc]+@{saves-cond}[cond]+@{buff_Ref-total}[buff1]+@{buff_saves-total}[buff2]]]"
      },
      "PFc1will": {
      "name": "WILL Save",
      "formula": "[[1d20+@{total-Will}[tot]+@{Will-ability-mod}[mod]+@{Will-trait}[trait]+@{Will-resist}[res]+@{Will-misc-mod}[misc]+@{saves-cond}[cond]+@{buff_Will-total}[buff1]+@{buff_saves-total}[buff2]]]"
      },



      November 14 (3 years ago)

      Edited November 16 (3 years ago)
      David M.
      Pro
      API Scripter

      Version Update v0.21 - found here

      EDIT - wiki is updated! (Note: the wiki has not been updated yet. I hope to have it updated sometime tomorrow)

      • Added --saveFormula shorthand for PF1/PF2 by Roll20 sheets and the PF Community sheet. You can now use the new shorthand instead of writing custom inline rolls with deferral characters e.g. <<1d20 + a{attrName}>>.

      --saveFormula|PF1Fort
      --saveFormula|PF1Ref
      --saveFormula|PF1Will
      --saveFormula|PF2Fort
      --saveFormula|PF2Ref
      --saveFormula|PF2Will
      --saveFormula|PFCFort
      --saveFormula|PFCRef
      --saveFormula|PFCWill

      • Added PF-style AoE rules for circles & cones (where every other diagonal counts as 2 squares). Functions as normal, but applies an additional filter after grids are calculated to account for the diagonal calculations. From what I can tell, I would recommend using --forceIntersection|1 to replicate published templates more easily. However, I have read that there is some debate on how PF-style cones should be interpreted, with some published templates seemingly using inconsistent rulings (particularly for 15ft cones), so please play around with the various settings for "PFcone" and "cone, 90" aoeTypes until you find something that works best for your table. 
        --aoeType|PFcone
        --aoeType|PFcircle
        --aoeType|PFcircle, float

        Diagonal comparison: "PFcone" vs "cone, 90" (with minGridArea|0.50)

        Orthogonal comparison: "PFcone" vs "cone, 90" (with minGridArea|0.50)

        30ft sphere comparison: "PFcircle, float" vs "circle, float" (with minGridArea|0.50)


      • Upon install, if the character "AoEControlToken" doesn't exist, it creates it for you! Also, a few token action abilities are created as well (according to the recommended setup). Finally, a ton of non token action abilities are added, which are referred to in a collections macro ("AoEGenerator") that is also automatically installed. This collections macro creates a chat menu allowing easy generation of common AoE's. This macro includes all of the AOE types the script can generate, so feel free to edit it as you want depending on your system of preference. You don't need the PF-style AoE's if you're playing 5e for example. This is an "easy button", but it obviously doesn't exploit the full functionality of the script. If you have already set up your control token but want the auto-install version, just delete or rename it and re-boot your sandbox.

       


      November 15 (3 years ago)
      vÍnce
      Pro
      Sheet Author


      November 18 (3 years ago)
      David M.
      Pro
      API Scripter

      Version Update v0.22 - found here

      Two changes:

      1. Fixed a sneaky bug where grid-snapping was failing silently in certain regions of the map for maps with grid width other than 1. This affected float aoeTypes and other types where --forceIntersection|1 was explicitly set.
      2. Script writers can now register their token change events to SmartAoE!

      Regarding event registration:

      For example, the Aura/Tint HealthColor script looks for changes in token bar values to set the aura color. However, changes made by the api don't normally trigger this event, so it would remain idle when SmartAoE removed/added hp. By registering your token change event handler function, SmartAoE will notify your script to trigger your function after it changes any token properties.

      Add something like this line to your script where you would normally register your events:

                  if('undefined' !== typeof SmartAoE && SmartAoE.ObserveTokenChange){
                      SmartAoE.ObserveTokenChange(function(obj,prev){
                          myEventHandlerFunction(obj, prev);
                      });
                  };

      So, extending the example of Aura/Tint Health Colors, the new registerEventHandlers function in that script would read as follows:

          //REGISTER TRIGGERS------------
              registerEventHandlers = function () {
                  on('chat:message', handleInput);
                  on("change:token", handleToken);
                  on('add:token', function (t) {
                      _.delay(() => {
                          let token = getObj('graphic', t.id),
                          prev = JSON.parse(JSON.stringify(token));
                          handleToken(token, prev, "YES");
                      }, 400);
                  });
                  //register this script to SmartAoE to handle linked bar hp changes
                  if('undefined' !== typeof SmartAoE && SmartAoE.ObserveTokenChange){
                      SmartAoE.ObserveTokenChange(function(obj,prev){
                          handleToken(obj, prev, "NO");
                      });
                  };
              };

      This should look familiar to those that have done the same thing with Token-mod, as I blatantly ripped off Aaron's code. I apologize for nothing ;)

      November 18 (3 years ago)
      Sr. K
      Pro
      Sheet Author

      Thanks for your work, speciially the event registration explanation.

      I think I found a bug whit special characters in names and --autoApply|0, I get this on the chat after apllying from the AoE chat menu with a character named Truh B'saij:

        (From SmartAoE): Error: Cannot read property 'split' of undefined


      November 18 (3 years ago)
      David M.
      Pro
      API Scripter

      Sr. K, I just tested with a Truh B'saij character getting hit by an AoE with --autoApply|1 and it worked fine in my test game. Can you post your whole macro?

      November 18 (3 years ago)
      Sr. K
      Pro
      Sheet Author

      It was a testing macro using your Ice Storm example as a base:

      !smartaoe {{
        --title|Ice Storm
        --leftsub|Slot level ?{Cast at what level?|4,4|5,5|6,6|7,7|8,8|9,9}
        --rightsub|DC @{selected|spell_save_dc} DEX
        --titlecardbackground|linear-gradient(blue, cyan)
        --oddrowbackground|#00ccff
        --evenrowbackground|#edfcfc
        --oddrowfontcolor|#000000
        --tablebgcolor|#edfcfc
       
        --aoeColor|#00ccff50
        --aoeOutlineColor|#0099ff
        --aoeType|circle, float
        --radius|4u
        --fx|burn-frost
        --dc|@{selected|spell_save_dc}
        --saveFormula|5eDEX
        --damageFormula1|[[(?{Cast at what level?}-2)d8]]
        --damageType1|Bludgeon
        --damageFormula2|[[4d6]]
        --damageType2|Cold
        --ignore|SmartAoE_Ignore,1 
        --instant|1
      
        --autoApply|0
        --bar|1
        --zeroHPmarker|dead
        --desc|A hail of rock-hard ice pounds to the ground in a 20-foot-radius, 40-foot-high cylinder centered on a point within range. Each creature in the cylinder must make a Dexterity saving throw. A creature takes 2d8 bludgeoning damage and 4d6 cold damage on a failed save, or half as much damage on a successful one.%br%%br%Hailstones turn the storm's area of effect into difficult terrain until the end of your next turn.
      }}
      November 18 (3 years ago)
      David M.
      Pro
      API Scripter

      Ah, I misread. AutoApply is off. I was able to replicate this error. Looking into it... 

      November 18 (3 years ago)
      David M.
      Pro
      API Scripter

      Version Update v0.22a - found here

      • Accomodation for the special characters ' (apostrophe) and ` (backtick) to be used in character names. Previously, if --autoApply was set to false, these special characters would trigger an error when the user attempted to apply damage. (thanks Sr. K!)

      Single or multiple instances can be used in the character name, e.g.

      Truh B'saij
      Ki'noth D'sar
      Back`tick` the Apos'trophe
      November 18 (3 years ago)
      keithcurtis
      Forum Champion
      Marketplace Creator
      API Scripter

      Drizz't thanks you. Free panther ride for David next time you visit TenTowns.

      November 18 (3 years ago)
      David M.
      Pro
      API Scripter

      LOL!

      November 26 (3 years ago)

      Ok so you have caused more work by me going and transforming all my AOE macros to this, but oh man is it great. 

      So I notice that we can have a bar set to apply damage to and now I'm going to make it difficult. 

      In Starfinder, PCs have a stamina point pool that has damage applied to it before hit point damage is taken. Is there a way to do this with this script? To damage 1 bar to 0, then apply any subsequent damage to another bar?

      November 26 (3 years ago)

      is this in the script library, or do i have to add it manually

      November 26 (3 years ago)
      David M.
      Pro
      API Scripter

      @Daemon - Currently manual install. Working the kinks out before submitting to 1-click

      @Erik - I will look into this. It could potentially be useful for 5e and other systems that use temp hps that might be tracked in one of the bars. Good idea!

      November 26 (3 years ago)

      Edited November 26 (3 years ago)
      Sr. K
      Pro
      Sheet Author


      Erik M. said:

      Ok so you have caused more work by me going and transforming all my AOE macros to this, but oh man is it great. 

      So I notice that we can have a bar set to apply damage to and now I'm going to make it difficult. 

      In Starfinder, PCs have a stamina point pool that has damage applied to it before hit point damage is taken. Is there a way to do this with this script? To damage 1 bar to 0, then apply any subsequent damage to another bar?


      This snippet from The Aaron does what you are asking for: https://app.roll20.net/forum/permalink/6781493/ You will only need to acomodate the  configuration parameters to the Starfinder sheet needs.

      November 26 (3 years ago)
      David M.
      Pro
      API Scripter

      Good find, Sr. K! My thoughts were to add an option to list multiple #'s (up to 3) for the --bar| subcommand in order of priority. So for example --bar|3,1 would drain bar3, then spill over to bar1 for example. That would remain system agnostic, not require additional "listening" scripts, and also not break any existing macros. Was going to take a look at it on Sunday.

      November 28 (3 years ago)
      Surok
      Roll20 Production Team

      Love the script! Thanks for putting so much effort into this. 

      Instead of creating individual spell macros is there a way to make a more generic macro that combines the AoEGenerator chat list and the group check and apply damage APIs when clicking TriggerAll? I tried tacking on the group check macro but it only targets the AoeControltoken.

      !smarttrigger

      !group-check {{

      --?{Ability Save|Strength,Strength Save|Dexterity,Dexterity Save|Constitution,Constitution Save|Intelligence,Intelligence Save|Wisdom,Wisdom Save|Charisma,Charisma Save}

      --ro ?{Roll Type|Normal,roll1|Advantage,adv|Disadvantage,dis}

      --process

      --subheader vs DC ?{DC}

      --button ApplyDamage !apply-damage

      ~dmg [[?{Damage|0}]]

      ~type ?{Damage on Save|Half,half|None,none}

      ~DC ?{DC}

      ~saves RESULTS(,)

      ~ids IDS(,)

      ~status ?{Status|

      None, |

      Red,red|

      Blue,blue|

      Green,green|

      Orange,orange|

      Purple,purple|

      Pink,pink|

      Yellow,yellow|

      ―, |

      Concentrating,blue|

      Readying,stopwatch|

      ―, |

      Prone,back-pain|

      Restrained,fishing-net|

      Grappled,grab|

      ―, |

      Incapacitated,interdiction|

      Stunned,pummeled|

      Unconscious,sleepy|

      ―, |

      Charmed,chained-heart|

      Frightened,screaming|

      ―, |

      Poisoned,half-heart|

      Blinded,bleeding-eye|

      Deafened,lightning-helix|

      Paralyzed,padlock|

      Petrified,broken-skull|

      ―, |

      Dodging,bolt-shield|

      Cover (half),broken-shield:2|

      Cover (three-quarters),broken-shield:5|

      Cover (full),white-tower|

      Invisible,ninja-mask|

      ―, }

      }}

      November 28 (3 years ago)
      David M.
      Pro
      API Scripter

      @Surok, The issue is that the control token is the selected token when you trigger it, so GroupCheck tries to roll the save on that character sheet.

      If you want to continue to use GroupCheck, I would just use SmartAoE for determining which tokens to select before firing off GroupCheck as usual.

      You could optionally alter the abilities used by the AoEGenerator chat menu macro to include your GroupCheck queries.

      For example, the 10ft square at range ability could be changed to something like this (assuming 5e OGL sheet):

      !smartaoe {{
        --aoeType|square, float
        --radius|10ft
        --fx|burn-fire
        --DC|@{selected|spell_save_dc}
        --saveFormula|5e?{Save Type?|STR|DEX|CON|INT|WIS|CHA}
        --damageFormula1|[[?{Damage?|8d6}]]
        --autoApply|1
        --conditionFail|?{Status|None, |Red,red|Blue,blue|Green,green|Orange,orange|Purple,purple|Pink,pink|Yellow,yellow|―, |Concentrating,blue|Readying,stopwatch|―, |Prone,back-pain|Restrained,fishing-net|Grappled,grab|―, |Incapacitated,interdiction|Stunned,pummeled|Unconscious,sleepy|―, |Charmed,chained-heart|Frightened,screaming|―, |Poisoned,half-heart|Blinded,bleeding-eye|Deafened,lightning-helix|Paralyzed,padlock|Petrified,broken-skull|―, |Dodging,bolt-shield|Cover (half),broken-shield:2|Cover (three-quarters),broken-shield:5|Cover (full),white-tower|Invisible,ninja-mask|―, }
      }}

      Or, you could further generalize for AoE shape and radius and reduce the number of buttons in the chat menu, for example:

      !smartaoe {{
        --aoeType|?{AoE Shape?|square|circle}, float
        --radius|?{Radius?|10}ft
        --fx|burn-fire
        --DC|@{selected|spell_save_dc}
        --saveFormula|5e?{Save Type?|STR|DEX|CON|INT|WIS|CHA}
        --damageFormula1|[[?{Damage?|10}]]
        --autoApply|1
        --conditionFail|?{Status|None, |Red,red|Blue,blue|Green,green|Orange,orange|Purple,purple|Pink,pink|Yellow,yellow|―, |Concentrating,blue|Readying,stopwatch|―, |Prone,back-pain|Restrained,fishing-net|Grappled,grab|―, |Incapacitated,interdiction|Stunned,pummeled|Unconscious,sleepy|―, |Charmed,chained-heart|Frightened,screaming|―, |Poisoned,half-heart|Blinded,bleeding-eye|Deafened,lightning-helix|Paralyzed,padlock|Petrified,broken-skull|―, |Dodging,bolt-shield|Cover (half),broken-shield:2|Cover (three-quarters),broken-shield:5|Cover (full),white-tower|Invisible,ninja-mask|―, }
      }}

      ...extending as much as you wanted (for fx type, etc..) depending on how much clicking you wanted to do.

      November 29 (3 years ago)
      David M.
      Pro
      API Scripter

      Version Update v0.23 - found here

      • Minor bug fix that affected an edge case of a small AoE (e.g. 1x1) vs. a huge token (e.g. 3x3 or greater) where depending on AoE placement the target token may or may not have been filtered out of the valid targets array.
      • The --bar| subcommand now accepts multiple bar values! This is useful if the target has temporary hp (5e), or other ablative health pool (e.g. stamina in Starfinder). Thanks Erik M.!

      If multiple bar values are defined:

      • For damage, once the first bar value is reduced to 0, any excess damage will be applied to the subsequent bar number until all damage is accounted for or all denoted bar values are 0.
      • For healing (negative damage), bars will fill up until the max value is reached, then excess will be applied to the next bar value, etc. If the bar value has no max, there will be no limit to the amount of "healing" possible.

      Examples:

      --bar|1
      --bar|3,1
      --bar|3,1,2
      November 29 (3 years ago)
      Surok
      Roll20 Production Team


      David M. said:

      @Surok, The issue is that the control token is the selected token when you trigger it, so GroupCheck tries to roll the save on that character sheet.

      If you want to continue to use GroupCheck, I would just use SmartAoE for determining which tokens to select before firing off GroupCheck as usual.

      You could optionally alter the abilities used by the AoEGenerator chat menu macro to include your GroupCheck queries.

      For example, the 10ft square at range ability could be changed to something like this (assuming 5e OGL sheet):

      !smartaoe {{
        --aoeType|square, float
        --radius|10ft
        --fx|burn-fire
        --DC|@{selected|spell_save_dc}
        --saveFormula|5e?{Save Type?|STR|DEX|CON|INT|WIS|CHA}
        --damageFormula1|[[?{Damage?|8d6}]]
        --autoApply|1
        --conditionFail|?{Status|None, |Red,red|Blue,blue|Green,green|Orange,orange|Purple,purple|Pink,pink|Yellow,yellow|―, |Concentrating,blue|Readying,stopwatch|―, |Prone,back-pain|Restrained,fishing-net|Grappled,grab|―, |Incapacitated,interdiction|Stunned,pummeled|Unconscious,sleepy|―, |Charmed,chained-heart|Frightened,screaming|―, |Poisoned,half-heart|Blinded,bleeding-eye|Deafened,lightning-helix|Paralyzed,padlock|Petrified,broken-skull|―, |Dodging,bolt-shield|Cover (half),broken-shield:2|Cover (three-quarters),broken-shield:5|Cover (full),white-tower|Invisible,ninja-mask|―, }
      }}

      Or, you could further generalize for AoE shape and radius and reduce the number of buttons in the chat menu, for example:

      !smartaoe {{
        --aoeType|?{AoE Shape?|square|circle}, float
        --radius|?{Radius?|10}ft
        --fx|burn-fire
        --DC|@{selected|spell_save_dc}
        --saveFormula|5e?{Save Type?|STR|DEX|CON|INT|WIS|CHA}
        --damageFormula1|[[?{Damage?|10}]]
        --autoApply|1
        --conditionFail|?{Status|None, |Red,red|Blue,blue|Green,green|Orange,orange|Purple,purple|Pink,pink|Yellow,yellow|―, |Concentrating,blue|Readying,stopwatch|―, |Prone,back-pain|Restrained,fishing-net|Grappled,grab|―, |Incapacitated,interdiction|Stunned,pummeled|Unconscious,sleepy|―, |Charmed,chained-heart|Frightened,screaming|―, |Poisoned,half-heart|Blinded,bleeding-eye|Deafened,lightning-helix|Paralyzed,padlock|Petrified,broken-skull|―, |Dodging,bolt-shield|Cover (half),broken-shield:2|Cover (three-quarters),broken-shield:5|Cover (full),white-tower|Invisible,ninja-mask|―, }
      }}

      ...extending as much as you wanted (for fx type, etc..) depending on how much clicking you wanted to do.


      Thanks for the help. I expanded on the macro and added more queries. Here's what I got so far. I Had too delete some effects because not showed up.

      !smartaoe {{
       --rightsub|DC @{selected|spell_save_dc}
      --leftsub| @{selected|token_name}  
      --aoeType|?{AoE Shape?|square|circle|5econe|Line}, float
        --radius|?{Radius?|10}ft
         --fx|?{TypeFX|bomb|bubbling|burn|burst|explode|glow|missile|nova}-?{ColorFX|acid|blood|charm|death|fire|frost|holy|magic|slime|smoke|water}
        --DC|@{selected|spell_save_dc}
        --saveFormula|5e?{Save Type?|STR|DEX|CON|INT|WIS|CHA}
        --damageFormula1|[[?{Damage?|10}]]
       --damageType1|?{damageType|none|acid|bludgeoning|cold|fire|force|lightning|necrotic|piercing|poison|psychic|radiant|slashing|thunder}
        --autoApply|1
        --conditionFail|?{Status|None, |Red,red|Blue,blue|Green,green|Orange,orange|Purple,purple|Pink,pink|Yellow,yellow|―, |Concentrating,blue|Readying,stopwatch|―, |Prone,back-pain|Restrained,fishing-net|Grappled,grab|―, |Incapacitated,interdiction|Stunned,pummeled|Unconscious,sleepy|―, |Charmed,chained-heart|Frightened,screaming|―, |Poisoned,half-heart|Blinded,bleeding-eye|Deafened,lightning-helix|Paralyzed,padlock|Petrified,broken-skull|―, |Dodging,bolt-shield|Cover (half),broken-shield:2|Cover (three-quarters),broken-shield:5|Cover (full),white-tower|Invisible,ninja-mask|―, }
      }}

      One final query I would like to add is to see if it's half damage or none.

      November 29 (3 years ago)
      David M.
      Pro
      API Scripter

      Surok said:

      One final query I would like to add is to see if it's half damage or none.

      • You would just query for parameters to the --damagesaverule| subcommand, something like this:

      --damagesaverule|?{Save Damage Rule?|Save for half,*0.5|No damage on Save,*0}

      • Also, for this line ( --damageFormula1|[[?{Damage?|10}]] ), note that it will accept dice expressions like 8d6, etc. You may want to make your default expression use this format to remind players that they don't need to enter a fully evaluated damage value.