And a third solution, in addition to the excellent options David and RainbowEncoder have already provided. Before I present it, though, I would say that even if you don't roll with this metascript solution, you should steal some of the ideas for set up that can reduce the number of queries you have to answer... ...every... .......time...... .........you......... ............run............ ...............the............... ..................command .................. Here's what I mean: your sheet may be outdated for running the attacks the way you want, but you can always add a new attribute or ability to the sheet. Just go to the Attributes & Abilities tab of the character sheet, then hit +Add for the left hand column (the attributes). For my setup, I gave my characters an attribute for their various weapons, with the range of damage in the Current and Max. For each of those weapons, I also gave them an attribute that represented the Penetration value of that weapon. Whatever the weapon attribute was named, I named the penetration version the same name plus "_penetration". Here is an imagined Pistol setup on a character, with a damage range of 30-50, and a penetration value of 10: I also gave every character an attribute named equipped_weapon that would house the name of the weapon they were currently wielding: Now, you can't do "extended names" (like what I'm about to show) with native Roll20 constructions -- you can't nest attribute names within attribute names, but you *can* do it with Fetch: @{selected|equipped_weapon} => Pistol @(selected.@{selected|equipped_weapon}) => 30 @(selected.@{selected|equipped_weapon}.max) => 50 @(selected.@{selected|equipped_weapon}_penetration) => 10 Doing that reduced the number of queries I had to answer by 3. All I had to do was manage what weapon a character had equipped (for instance, if she wanted to change from a pistol to a flamethrower I would have to change the equipped_weapon to the name of the attribute representing the flamethrower)... and that can even be managed with a ChatSetAttr command if you don't want to have to open your sheet. (The Fetch constructions will work in the ScriptCards command David shared -- that's what metascripts do -- but they won't work in RainbowEncoder's solution because RE never engages the script engine.) MetaScript Solution Here's the metascript solution, including the setup. On a character named MuleCharacter , I created 2 abilities. I named them AttackParts and RepeatingAttack . The RepeatingAttack ability could be named anything; if you rename the AttackParts ability, you will need to chase that name change through the text of the RepeatingAttack ability. In my AttackParts ability, I entered the text: TemplateLine={{Attack # get.MuleCharacter.AttackParts.Counter/get = [\\][\\](([\\][\\] 1d[\\][\\] abs([\\][\\]mindmg - maxdmg \\]\\]) + 1 \\]\\] - 1 \\]\\] + mindmg) * dmgmod - (dmgthresh) * ((100 - (atkpen))/100))\\]\\]}} set\.MuleCharacter.AttackParts.Counter = {\& math get.MuleCharacter.AttackParts.Counter/get + 1}/set {\&if get.MuleCharacter.AttackParts.Counter/get < get.MuleCharacter.AttackParts.Attacks/get}get.MuleCharacter.AttackParts.TemplateLine/get{\&end} Attacks=1 Counter=1 And in RepeatingAttack I entered: !&{template:default} {\&global ([mindmg] @(selected.@{selected|equipped_weapon})) ([maxdmg] @(selected.@{selected|equipped_weapon}.max)) ([dmgmod] ?{Damage Modifier|1}) ([dmgthresh] ?{Damage Threshold|0})([atkpen] @(selected.@{selected|equipped_weapon}_penetration[0]))} {{name=@{selected|token_name} Attacks!}}{{Min/Max (Mod)=mindmg / maxdmg (dmgmod)}} {{Threshold/Penetration=dmgthresh / atkpen}}{{---------- ATTACKS =**----------**}}{&simple} get\.MuleCharacter.AttackParts.TemplateLine/get set.MuleCharacter.AttackParts.Counter = 1/set set.MuleCharacter.AttackParts.Attacks=?{Number of Attacks?|1|2|3|4|5|6|7|8}/set REQUIRED SCRIPTS ZeroFrame, Fetch, MathOps, APILogic, Muler EXAMPLE OUTPUTS Running RepeatingAttack yields the following output: EXPLANATION We use ZeroFrame to set a few global variables (for min damage, max damage, threshold, and penetration). As mentioned, some of those values come from Fetch constructions going to get the weapon numbers for the selected character's currently equipped weapon. Initially, RepeatingAttack has a Muler construction to set values in the AttackParts mule ability. We set the Attacks variable to the number of attacks we'll need, and we set the Counter to 1. Then Muler also goes to get the TemplateLine from the AttackParts mule. The TemplateLine variable has a single line of the final template we are going to want to output, along with some meta operations. First, the attack roll for this line will be fed the global variables from ZeroFrame, so we defer the roll until we can replace those. Also in the line, we bring in the code to increment the Counter variable by 1, and we bring logic that says "if the counter is less than the number of attacks we need, go get the TemplateLine variable again." In other words, until the Counter matches the total number of attacks we need, we get another line, with all of the same meta operations. When all of the meta-work is settled, the ZeroFrame {&simple} tag in the RepeatingAttack ability triggers ZeroFrame to output the finalized template to chat. Or, as we sometimes say... "Hoocha hoocha hoocha... lobster."