Hi Giovanni At Pro Level account you can gain access to API scripts which help with this. I have created a Macro for fireball, that uses a number of different scripts. Powercards (Gives Conditional Logic), AreaOfEffect (Takes a graphic asset from your library and spaws and scales it on the map), Roll20AM (triggers a custom audio when spell cast) . It works by asking the player to choose 8 targets, then confirm how many of these to be targetted by fireball, then rolls saves for all targets and rolls damage. You could use an additional script called TokenMod to give the functionality to automatiaclly update the HP of each target, but I haven't implemented that yet. !areasOfEffectApplyEffectAtToken @{target|token_id} 22.5 Fireball
!power {{
--name|@{selected|character_name}'s Fireball
--leftsub|Spell Cast
--rightsub|Ranged 150' 20ft Sphere
--tokenid|@{selected|token_id}
--emote| A bright streak flashes from @{selected|character_name}'s pointing finger then blossoms with a low roar into an explosion of flame
--!Spell:|~C**//Evocation Spell//**~C
--!Description:|~C**DC@{selected|spell_save_dc} ^^ //Dexterity save//**~C
-- soundfx|_audio,play,nomenu|HypnoticPattern
--target_list|@{target|t1|token_id} | @{target|t2|token_id} | @{target|t3|token_id} | @{target|t4|token_id} | @{target|t5|token_id} | @{target|t6|token_id} | @{target|t7|token_id} | @{target|t8|token_id}
--Saving Throw#?{Number of targets|1}|[[ [$Save] ?{DexSave|Normal, 1d20|w/Advantage, 2d20KH1|w/Disadvantage, 2d20KL1} + %%npc_dex_save%% Dexterity save %%token_name%% ]] from %%token_name%%
--Damage!|Your fireball damages for [[ [$dmg1] (5 + ?{Level|3})d6 ]] fire damage
-- ?? $Save_1.total >= @{selected|spell_save_dc} ?? !Hit1:|@{target|t1|token_name} Saves and takes [^dmg1.halftotal] damage
-- ?? $Save_2.total >= @{selected|spell_save_dc} ?? !Hit2:|@{target|t2|token_name} Saves and takes [^dmg1.halftotal] damage
-- ?? $Save_3.total >= @{selected|spell_save_dc} ?? !Hit3:|@{target|t3|token_name} Saves and takes [^dmg1.halftotal] damage
-- ?? $Save_4.total >= @{selected|spell_save_dc} ?? !Hit4:|@{target|t4|token_name} Saves and takes [^dmg1.halftotal] damage
-- ?? $Save_5.total >= @{selected|spell_save_dc} ?? !Hit5:|@{target|t5|token_name} Saves and takes [^dmg1.halftotal] damage
-- ?? $Save_6.total >= @{selected|spell_save_dc} ?? !Hit6:|@{target|t6|token_name} Saves and takes [^dmg1.halftotal] damage
-- ?? $Save_7.total >= @{selected|spell_save_dc} ?? !Hit7:|@{target|t7|token_name} Saves and takes [^dmg1.halftotal] damage
-- ?? $Save_8.total >= @{selected|spell_save_dc} ?? !Hit8:|@{target|t8|token_name} Saves and takes [^dmg1.halftotal] damage
-- ?? $Save_1.total < @{selected|spell_save_dc} ?? !Hit1:|@{target|t1|token_name} Fails and takes [^dmg1] Damage
-- ?? $Save_2.total < @{selected|spell_save_dc} ?? !Hit2:|@{target|t2|token_name} Fails and takes [^dmg1] Damage
-- ?? $Save_3.total < @{selected|spell_save_dc} ?? !Hit3:|@{target|t3|token_name} Fails and takes [^dmg1] Damage
-- ?? $Save_4.total < @{selected|spell_save_dc} ?? !Hit4:|@{target|t4|token_name} Fails and takes [^dmg1] Damage
-- ?? $Save_5.total < @{selected|spell_save_dc} ?? !Hit5:|@{target|t5|token_name} Fails and takes [^dmg1] Damage
-- ?? $Save_6.total < @{selected|spell_save_dc} ?? !Hit6:|@{target|t6|token_name} Fails and takes [^dmg1] Damage
-- ?? $Save_7.total < @{selected|spell_save_dc} ?? !Hit7:|@{target|t7|token_name} Fails and takes [^dmg1] Damage
-- ?? $Save_8.total < @{selected|spell_save_dc} ?? !Hit8:|@{target|t8|token_name}Fails and takes [^dmg1] Damage
}}