If you use delays it does kinda work. I just can't get the FX to work, but they barely work for GM's for some reason. !scriptcard {{
--/|**********Customizable Variables***************
--/|Formatting
--#overridetemplate|mydnd
--#dicefontsize|5.0em
--#rollHilightColorNormal|#d3b63b
--#rollHilightColorCrit|#3afc7a
--#rollHilightColorFumble|#ff5456
--#dicefontcolor|Black
--#Debug|0
--:DoSetup|
--#sourceToken|@{selected|token_id}
--&InitRoll|@{selected|init_roll}
--&SpellLevel|3
--&SpellName|Thunder Step
--&SpellRadius|2
--=SpellSaveDC|@{selected|spell_save_dc}
--&SpellSaveType|Constitution
--=FeatDamage|0
--&FeatDamageType|[FEAT]
--Rfind|@{selected|character_id};[&SpellName];repeating_spell-[&SpellLevel];spellname
--#emoteText|[*S:character_name] Casts [*R:spellname].
--#title|[*R:spellname] [*R:innate]
--#leftsub|@{selected|character_name} (@{selected|caster_level})
--?[*R:spelllevel] -eq cantrip|&spllvl;cantrip
--?[*R:spelllevel] -eq 1|&spllvl;1st-level
--?[*R:spelllevel] -eq 2|&spllvl;2nd-level
--?[*R:spelllevel] -eq 3|&spllvl;3rd-level
--?[*R:spelllevel] -eq 4|&spllvl;4th-level
--?[*R:spelllevel] -eq 5|&spllvl;5th-level
--?[*R:spelllevel] -eq 6|&spllvl;6th-level
--?[*R:spelllevel] -eq 7|&spllvl;7th-level
--?[*R:spelllevel] -eq 8|&spllvl;8th-level
--?[*R:spelllevel] -eq 9|&spllvl;9th-level
--#rightsub|[i][&spllvl] [*R:spellschool][/i]
--+Casting Time:|[*R:spellcastingtime]
--+Range:|[*R:spellrange]
--+Target:|[*R:spelltarget]
--&zSCV|V
--?"[*R:spellcomp_v]" -inc "v=1"|ENDSCV
--&zSCV|
--:ENDSCV|
--&zSCS|S
--?"[*R:spellcomp_s]" -inc "s=1"|ENDSCS
--&zSCS|
--:ENDSCS|
--&zSCM|M
--?"[*R:spellcomp_m]" -inc "m=1"|ENDSCM
--&zSCM|
--:ENDSCM|
--?"[*R:spellcomp_m]" -ninc "m=1"|&materials;|&materials;([*R:spellcomp_materials])
--+Components:|[&zSCV][&zSCS][&zSCM] [&materials]
--+Duration:|[*R:spellduration]
--+|[*R:spelldescription]
--~Len|string;length;[*R:spellathigherlevels]
--?[$Len] -le 5|END_HV_CHECK
--+|[b][i]At Higher Levels.[/i][/b][*R:spellathigherlevels]
--:END_HV_CHECK|
--&Horizontal|?{Horizontal displacement? (in squares)|
None,0|
Left 1,-1|
Left 2,-2|
Left 3,-3|
Left 4,-4|
Left 5,-5|
Left 6,-6|
Left 7,-7|
Left 8,-8|
Left 9,-9|
Left 10,-10|
Left 11,-11|
Left 12,-12|
Left 13,-13|
Left 14,-14|
Left 15,-15|
Left 16,-16|
Left 17,-17|
Left 18,-18|
Right 1,1|
Right 2,2|
Right 3,3|
Right 4,4|
Right 5,5|
Right 6,6|
Right 7,7|
Right 8,8|
Right 9,9|
Right 10,10|
Right 11,11|
Right 12,12|
Right 13,13|
Right 14,14|
Right 15,15|
Right 16,16|
Right 17,17|
Right 18,18}
--&Vertical|?{Vertical displacement? (in squares)|
None,0|
Up 1,-1|
Up 2,-2|
Up 3,-3|
Up 4,-4|
Up 5,-5|
Up 6,-6|
Up 7,-7|
Up 8,-8|
Up 9,-9|
Up 10,-10|
Up 11,-11|
Up 12,-12|
Up 13,-13|
Up 14,-14|
Up 15,-15|
Up 16,-16|
Up 17,-17|
Up 18,-18}
Down 1,1|
Down 2,2|
Down 3,3|
Down 4,4|
Down 5,5|
Down 6,6|
Down 7,7|
Down 8,8|
Down 9,9|
Down 10,10|
Down 11,11|
Down 12,12|
Down 13,13|
Down 14,14|
Down 15,15|
Down 16,16|
Down 17,17|
Down 18,18}
--/X|
--/|****************DO NOT CHANGE******************
--&CasterToken|@{selected|token_id}
--~|array;pagetokens;AllTokens;[&CasterToken]
--/|*******************Main************************
-->IsWarlock|
-->RollDamage|
-->OutputText|
--%CurrentToken|foreach;AllTokens
--?[&CurrentToken] -eq [&CasterToken]|%
--&CharName|[*[&CurrentToken]:character_name]
--?[&CharName(length)] -le 0|%
-->GetTargetDistance|[&CurrentToken]
-->GetTargetAngle|[&CurrentToken]
--?[$TargetDistance] -gt [&SpellRadius]|%
--?"[*[&CurrentToken]:t-statusmarkers]" -ninc advantage
-and "[*[&CurrentToken]:t-statusmarkers]" -ninc disadv|>MakeSavingThrow;[&CurrentToken];1d20;Normal
--?"[*[&CurrentToken]:t-statusmarkers]" -inc disadv|>MakeSavingThrow;[&CurrentToken];2d20kl1;Disadvantage
--?"[*[&CurrentToken]:t-statusmarkers]" -inc advantage|>MakeSavingThrow;[&CurrentToken];2d20kh1;Advantage
--?[$TargetSave] -ge [$SpellSaveDC]|>SetSaveBool;Succeeds
--?[$TargetSave] -lt [$SpellSaveDC]|>SetSaveBool;Fails
--C[&SaveBool]|Fails:>CaseSaveFails;[&CurrentToken]|Succeeds:>CaseSaveSucceeds;[&CurrentToken]
-->ReportDamage|
-->ApplyDamage|[&CurrentToken];1;-[$TotalDamage]
--*|[hr]
--%|
--&SquarePixels|70
--&leftDelta|[= [&Horizontal] * [&SquarePixels]]
--&topDelta|[= [&Vertical] * [&SquarePixels]]
--vtoken|[*S:t-id] nova-smoke
--!t:[*S:t-id]|layer:gmlayer
--w1:!t:[*S:t-id]|top:[=[*S:t-top] + [&topDelta]]|left:[=[*S:t-left] + [&leftDelta]]
--w2:!t:[*S:t-id]|layer:objects
--w2:vtoken|[*S:t-id] burn-smoke
--w2:vtoken|[*S:t-id] ping moveall
--X|
--:IsWarlock|
--?"[*S:level]" -le 2|=SlotLevel;1
--?"[*S:level]" -eq 3 -or "[*S:level]" -eq 4|=SlotLevel;2
--?"[*S:level]" -eq 5 -or "[*S:level]" -eq 6|=SlotLevel;3
--?"[*S:level]" -eq 7 -or "[*S:level]" -eq 8|=SlotLevel;4
--?"[*S:level]" -ge 9|=SlotLevel;5
--=DamageDice|[$SlotLevel]
--=SlotsTotal|0
--=SlotsExpended|[*S:lvl[$SlotLevel]_slots_expended]
--?[$SlotsExpended.Raw] -eq [$SlotsTotal.Raw]|[
-->NoSlotsLeft|
--]|[
--?[$SlotLevel] -eq 0|NoSlot
--=SlotsLeft|[$SlotsExpended] - 1
--!a:[*S:character_id]|lvl[$SlotLevel]_slots_expended:[$SlotsLeft]
--]|
--<|
--/|****************Subroutines********************
--:RollDamage|
--=DamageDice|[$SlotLevel]d10
--=Damage|[$DamageDice] + [$BonusDamage]
-->DieLoop|
--=DoubleDamage|[$Damage] * 2
--=HalfDamage|[$Damage] \ 2
--=QuarterDamage|[$Damage] \ 4
--<|
--:DieLoop|
--&DicePerRow|4
--&DieCounter|1
--&AllDice|[c][t width=100%][tr]
--%RollC|1;[$DamageDice.RollCount]
--&AllDice|+[td height=60px][d10][$DamageDice.RolledDice([&RollC])][/d10][/td]
--?[= [&DieCounter] % [&DicePerRow] ] -eq 0|&AllDice;+[/tr][tr]
-->IncrementCounter|DieCounter
--%|
--&AllDice|+[/tr][/t][/c]
--+|[c][b]DC [$SpellSaveDC.Text] [&SpellSaveType] Saving Throw[/b][/c]
--+|[&AllDice]
--<|
--:IncrementCounter|
--&[%1%]|[= [&[%1%]] + 1]
--<|
--:OutputText|
--+|[c][b]Total Damage[F:Contrail One:22][$DamageDice][/F][/b][/c]
--+|[c][b]Level [$SlotLevel] Slots Left: [$SlotsLeft][/b][/c]
--?[$BonusDamage] -ne 0|>OutputBonusDamage
--<|
--:OutputBonusDamage|
--=AdditionalDamage|[$BonusDamage] + [&BonusDamageType]
--+Bonus Damage|[$AdditionalDamage]
--<|
--:GetTargetDistance|
--~TargetDistance|distance;@{selected|token_id};[%1%]
--<|
--:GetTargetAngle|
--~TargetAngle|math;angle;@{selected|token_id};[%1%]
--~TargetAngleRounded|math;round;[&TargetAngle]
--<|
--:MakeSavingThrow|
--=TargetSave|[%2%] + [*[%1%]:constitution_save_bonus]
--*[*[%1%]:character_name]|[&SpellSaveType] Save [$TargetSave]
--*Roll|[%3%]
--<|
--:SetSaveBool|
--&SaveBool|[%1%]
--<|
--:CaseSaveFails|
--*|Save Fails!
--@token-mod|_ignore-selected _ids [%1%]
-->CalculateDamage|[$Damage];Normal
--?"[*[%1%]:npc_vulnerabilities]" -inc [&DamageType]|>CalculateDamage;[$DoubleDamage];Vulnerable!
--?"[*[%1%]:npc_resistances]" -inc [&DamageType]|>CalculateDamage;[$HalfDamage];Resistant!
--?"[*[%1%]:npc_immunities]" -inc [&DamageType]|>CalculateDamage;0;Immune!
--<|
--:CaseSaveSucceeds|
--*|Save Suceeds!
-->CalculateDamage|[$HalfDamage];Normal
--?"[*[%1%]:npc_vulnerabilities]" -inc [&DamageType]|>CalculateDamage;[$Damage];Vulnerable!
--?"[*[%1%]:npc_resistances]" -inc [&DamageType]|>CalculateDamage;[$QuarterDamage];Resistant!
--?"[*[%1%]:npc_immunities]" -inc [&DamageType]|>CalculateDamage;0;Immune!
--<|
--:CalculateDamage|
--=TotalDamage|[%1%]
--&CreatureResist|[%2%]
--<|
--:ReportDamage|
--*Resistance|[&CreatureResist]
--*|Creature takes [$TotalDamage] [&DamageType] Damage
--<|
--:ApplyDamage|
--@token-mod|_ignore-selected _ids [%1%] _set bar[%2%]_value|[%3%]
--<|
}}