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

Fireball damage and saves

HI everyone, What's the best way when playing 5E D&D to apply damage for spells like fireball where lots of creatures are hit and take different damage based on a saving throw? I am currently using the D&D 5E by Roll20 sheet and  groupcheck to roll the saves and autobuttons to apply damage after the group check, but i have to click on each token to apply the damage. I wondered if there was a way to do them all at once? Thanks for any help!     
GroupCheck and ApplyDamage should work together to apply the damage to all the tokens at the same time without selecting each token individually. If you select the whole group, run the ApplyDamage macro (which works in conjunction with GroupCheck) then you’ll get a button at the bottom of the GroupCheck output that will apply the damage to all of the tokens based on saving or not.  The part that ApplyDamage can’t do separately is any resistance/vulnerability/immunity. You’ll have to roll groups separately if they have any of those.  
Thank you so much that has worked a charm!
I am also using bloodydeath API to mark the tokens at half health and with a cross when they are dead but it isn't working when applying damage through Applydamage. Any one have any idea why and how to fix it? Here is bloody death as it is not one click  /* global TokenMod */ on('ready',()=>{     // CONFIGURE     const bar  = 3;     const bloodied = "red";     const dead = "dead";     // no edit below here //     const unpackSM = (stats) => stats.split(/,/).reduce((m,v) => {         let p = v.split(/@/);         p[0]=p[0].toLowerCase();         let n = parseInt(p[1] || '0', 10);         if(p[0].length) {             m[p[0]] = Math.max(n, m[p[0]] || 0);         }         return m;     },{});     const packSM = (o) =>  Object.keys(o)         .map(k => ('dead' === k || true === o[k] || o[k]<1 || o[k]>9) ? k : `${k}@${parseInt(o[k])}` ).join(',');     const handleBarChange = (obj) => {         const  bv = parseFloat(obj.get(`bar${bar}_value`));         const  bm = parseFloat(obj.get(`bar${bar}_max`));         if(Number.isNaN(bm)){             return;         }         let sm = unpackSM(obj.get('statusmarkers'));                 if(bv <= (bm / 2) && bv > 0) {             sm[bloodied] = true;         }         else{             delete sm[bloodied];         }         if(bv <= 0) {             sm[dead] = true;         }         else {             delete sm[dead];         }         obj.set({             statusmarkers: packSM(sm)         });     };     on(`change:graphic:bar${bar}_value`, handleBarChange);     if('undefined' !== typeof TokenMod && TokenMod.ObserveTokenChange){         TokenMod.ObserveTokenChange(handleBarChange);     } });