OK, this turned out pretty cool... I had to render up my own dice images, but a google search showed me roughly what they were supposed to look like. This solution will work with any images, of course. Mine were uploaded at a size of 32px by 32px. First, the eye candy of what it looks like... I rolled 16d6 (trying to get enough to where every line would populate): But the way it's built, it will only populate the lines that actually have returns. In this example, I rolled 15d6, and no 6s (what I called "Events") were rolled, so that line isn't included: A couple of caveats about my approach... (1) I have no idea what each of these faces are actually called, but you can rename them in the macro so that they would actually match what they're called in system. The horned one was either going to be Bill the Cat, Side-Eye Bull, or Winking Droid. I went with Droid. The last one (the circle) was either going to be Pokemon or Event Horizon. I went with Event. (2) I have no idea what order these faces actually come on a die, but I doubt that it matters. For me, I associated 1-6 with each image as matches the first image, above (1=bullets, 2 = hearts, etc.). And a couple of points about my approach... (1) I included the "Plugger" line in the template just so you could easily see what was rolled. It's not necessary for you to include this for the macro to function, so once you're satisfied that this command is producing good rolls, you can remove this template element. (2) As mentioned, the template will only show lines for what was actually rolled. If you don't roll any "Hearts", that line won't show. Here is a smaller roll (6d6) to show that 2 faces weren't rolled, and both were left off: Command Line Here is the command line I am using for this: !&{template:default}{{name=Outgunned Roll}} [[?{Number of Dice}d6sa]] {\&global ([AllDice]{&eval}getDiceByVal($[[0]] 1-6 all list||){&/eval}) } {{Plugger 1={&eval}getDiceByVal($[[0]] 1-6 all list|-){&/eval} }} {\&if {\&eval}filter(--AllDice --1 --count){\&/eval} > 0} {{Bullets={\&eval}replace(--source|{\&eval}filter(--AllDice --1 --list){\&/eval} --find|1|'@\\(table.outgunned-dice.1.img) '){\&/eval} }} {\&end} {\&if {\&eval}filter(--AllDice --2 --count){\&/eval} > 0} {{Hearts={\&eval}replace(--source|{\&eval}filter(--AllDice --2 --list){\&/eval} --find|2|'@\\(table.outgunned-dice.2.img) '){\&/eval} }} {\&end} {\&if {\&eval}filter(--AllDice --3 --count){\&/eval} > 0} {{Spades={\&eval}replace(--source|{\&eval}filter(--AllDice --3 --list){\&/eval} --find|3|'@\\(table.outgunned-dice.3.img) '){\&/eval} }} {\&end} {\&if {\&eval}filter(--AllDice --4 --count){\&/eval} > 0} {{Skulls={\&eval}replace(--source|{\&eval}filter(--AllDice --4 --list){\&/eval} --find|4|'@\\(table.outgunned-dice.4.img) '){\&/eval} }} {\&end} {\&if {\&eval}filter(--AllDice --5 --count){\&/eval} > 0} {{Droids={\&eval}replace(--source|{\&eval}filter(--AllDice --5 --list){\&/eval} --find|5|'@\\(table.outgunned-dice.5.img) '){\&/eval} }} {\&end} {\&if {\&eval}filter(--AllDice --6 --count){\&/eval} > 0} {{Events={\&eval}replace(--source|{\&eval}filter(--AllDice --6 --list){\&/eval} --find|6|'@\\(table.outgunned-dice.6.img) '){\&/eval} }} {\&end} {&simple} Required Scripts This requires the MetaScript Toolbox, and specifically the new release that is currently pending (as of April 10) in the one-click. You can read about the updates here . These updates should be merged in early next week, at which point this will work for anyone.