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

LF Help with Macro - Horn of Valhalla - Multiple attacks

July 13 (4 years ago)

hey guys,

I would like to use something like this: (This is a Macro, used for the Spell: Animated Objects)

&{template:default} {{name=Animate Objects}} {{=*?{Size|Tiny, [Tiny](-2)|Small, [Small](0)|Medium, [Medium](1)|Large, [Large](2)|Huge, [Huge](4)} objects attack!*
}} {{[1](#).=[[ ?{Roll|Normal, 1d20|Advantage, 2d20kh1|Disadvantage, 2d20kl1} + [[abs(?{Size} - 1) + 5]] + {0} ]] atk, [[ [[1 + ceil(?{Size} / 4)]]d[[floor((?{Size} - 2 * {0, 3}=[[2 + ?{Size}]]) / 2) * 2 + 8]] + [[abs(?{Size} - 1) + 1]] ]] bld. (crit? +[[ [[1 + ceil(?{Size} / 4)]]d[[floor((?{Size} - 2 * {0, 3}=[[2 + ?{Size}]]) / 2) * 2 + 8]] ]])
}} {{[[[{?{Number of attacks|1|2|3|4|5|6|7|8|9|10}, 2}kl1]]](#).=[[ ?{Roll} + [[abs(?{Size} - 1) + 5]] + {0} ]] atk, [[ [[1 + ceil(?{Size} / 4)]]d[[floor((?{Size} - 2 * {0, 3}=[[2 + ?{Size}]]) / 2) * 2 + 8]] + [[abs(?{Size} - 1) + 1]] ]] bld. (crit? +[[ [[1 + ceil(?{Size} / 4)]]d[[floor((?{Size} - 2 * {0, 3}=[[2 + ?{Size}]]) / 2) * 2 + 8]] ]])
}} {{[[[{?{Number of attacks}, 3}kl1]]](#).=[[ ?{Roll} + [[abs(?{Size} - 1) + 5]] + {0} ]] atk, [[ [[1 + ceil(?{Size} / 4)]]d[[floor((?{Size} - 2 * {0, 3}=[[2 + ?{Size}]]) / 2) * 2 + 8]] + [[abs(?{Size} - 1) + 1]] ]] bld. (crit? +[[ [[1 + ceil(?{Size} / 4)]]d[[floor((?{Size} - 2 * {0, 3}=[[2 + ?{Size}]]) / 2) * 2 + 8]] ]])
}} {{[[[{?{Number of attacks}, 4}kl1]]](#).=[[ ?{Roll} + [[abs(?{Size} - 1) + 5]] + {0} ]] atk, [[ [[1 + ceil(?{Size} / 4)]]d[[floor((?{Size} - 2 * {0, 3}=[[2 + ?{Size}]]) / 2) * 2 + 8]] + [[abs(?{Size} - 1) + 1]] ]] bld. (crit? +[[ [[1 + ceil(?{Size} / 4)]]d[[floor((?{Size} - 2 * {0, 3}=[[2 + ?{Size}]]) / 2) * 2 + 8]] ]])
}} {{[[[{?{Number of attacks}, 5}kl1]]](#).=[[ ?{Roll} + [[abs(?{Size} - 1) + 5]] + {0} ]] atk, [[ [[1 + ceil(?{Size} / 4)]]d[[floor((?{Size} - 2 * {0, 3}=[[2 + ?{Size}]]) / 2) * 2 + 8]] + [[abs(?{Size} - 1) + 1]] ]] bld. (crit? +[[ [[1 + ceil(?{Size} / 4)]]d[[floor((?{Size} - 2 * {0, 3}=[[2 + ?{Size}]]) / 2) * 2 + 8]] ]])
}} {{[[[{?{Number of attacks}, 6}kl1]]](#).=[[ ?{Roll} + [[abs(?{Size} - 1) + 5]] + {0} ]] atk, [[ [[1 + ceil(?{Size} / 4)]]d[[floor((?{Size} - 2 * {0, 3}=[[2 + ?{Size}]]) / 2) * 2 + 8]] + [[abs(?{Size} - 1) + 1]] ]] bld. (crit? +[[ [[1 + ceil(?{Size} / 4)]]d[[floor((?{Size} - 2 * {0, 3}=[[2 + ?{Size}]]) / 2) * 2 + 8]] ]])
}} {{[[[{?{Number of attacks}, 7}kl1]]](#).=[[ ?{Roll} + [[abs(?{Size} - 1) + 5]] + {0} ]] atk, [[ [[1 + ceil(?{Size} / 4)]]d[[floor((?{Size} - 2 * {0, 3}=[[2 + ?{Size}]]) / 2) * 2 + 8]] + [[abs(?{Size} - 1) + 1]] ]] bld. (crit? +[[ [[1 + ceil(?{Size} / 4)]]d[[floor((?{Size} - 2 * {0, 3}=[[2 + ?{Size}]]) / 2) * 2 + 8]] ]])
}} {{[[[{?{Number of attacks}, 8}kl1]]](#).=[[ ?{Roll} + [[abs(?{Size} - 1) + 5]] + {0} ]] atk, [[ [[1 + ceil(?{Size} / 4)]]d[[floor((?{Size} - 2 * {0, 3}=[[2 + ?{Size}]]) / 2) * 2 + 8]] + [[abs(?{Size} - 1) + 1]] ]] bld. (crit? +[[ [[1 + ceil(?{Size} / 4)]]d[[floor((?{Size} - 2 * {0, 3}=[[2 + ?{Size}]]) / 2) * 2 + 8]] ]])
}} {{[[[{?{Number of attacks}, 9}kl1]]](#).=[[ ?{Roll} + [[abs(?{Size} - 1) + 5]] + {0} ]] atk, [[ [[1 + ceil(?{Size} / 4)]]d[[floor((?{Size} - 2 * {0, 3}=[[2 + ?{Size}]]) / 2) * 2 + 8]] + [[abs(?{Size} - 1) + 1]] ]] bld. (crit? +[[ [[1 + ceil(?{Size} / 4)]]d[[floor((?{Size} - 2 * {0, 3}=[[2 + ?{Size}]]) / 2) * 2 + 8]] ]])
}} {{[[[{?{Number of attacks}, 10}kl1]]](#).=[[ ?{Roll} + [[abs(?{Size} - 1) + 5]] + {0} ]] atk, [[ [[1 + ceil(?{Size} / 4)]]d[[floor((?{Size} - 2 * {0, 3}=[[2 + ?{Size}]]) / 2) * 2 + 8]] + [[abs(?{Size} - 1) + 1]] ]] bld. (crit? +[[ [[1 + ceil(?{Size} / 4)]]d[[floor((?{Size} - 2 * {0, 3}=[[2 + ?{Size}]]) / 2) * 2 + 8]] ]])
}}


What i Try to create, is something that asks me in the same way:

Input Value:    Roll? -> Normal/Advantage/Disadvantage

Input Value:    Number of attacks? -> Numbers 4-25


The Attack modifier is +5 to hit and 1d12+3 slashing damage. 

Like in the "Animate Objects" Macro above, should there be a alternate crit damage count to adjust, if there´s a critical hit in it.


Thanks for your support, i hope someone can help me to figure this out. And hopefully its a help for others in advance.


Greetings.






July 13 (4 years ago)

Edited July 13 (4 years ago)

I try to update my Progress in here: Status: In Progress | It Works

13th July, 2020 - 3pm CEST

Pro: The macro works like it should. Great display of dmg, crit, dis-/advantage

Con: there is only 1 dmg outcome at the moment

&{template:default} {{name=Horn of Valhalla - Berserkers}} [[(1d12+3)[DMG]+[[floor([[?{Roll|Normal, 1d20|Advantage, 2d20kh1|Disadvantage, 2d20kl1}]]/20)]]d12[CRIT]]] {{Atk [[[{?{Number of attacks|4},1}kl1]]](#)=$[[0]] atk, $[[2]] dmg}}

Top -> Works like it should for one attack
Bottom - > First try to apply some other attacks to work with the "input Value"

{{Atk [[[{?{Number of attacks}, 4}kl1]]](#)=$[[0]] atk, [[1d12+3]]+$[[2]] dmg
{{Atk [[[{?{Number of attacks}, 5}kl1]]](#)=$[[0]] atk, [[1d12+3]]+$[[2]] dmg.............

6}kl1]]](#)=$[[0]] atk, [[1d12+3]]+$[[2]] dmg
7}kl1]]](#)=$[[0]] atk, [[1d12+3]]+$[[2]] dmg
8}kl1]]](#)=$[[0]] atk, [[1d12+3]]+$[[2]] dmg
9}kl1]]](#)=$[[0]] atk, [[1d12+3]]+$[[2]] dmg
10}kl1]]](#)=$[[0]] atk, [[1d12+3]]+$[[2]] dmg
11}kl1]]](#)=$[[0]] atk, [[1d12+3]]+$[[2]] dmg
12}kl1]]](#)=$[[0]] atk, [[1d12+3]]+$[[2]] dmg
13}kl1]]](#)=$[[0]] atk, [[1d12+3]]+$[[2]] dmg
14}kl1]]](#)=$[[0]] atk, [[1d12+3]]+$[[2]] dmg
15}kl1]]](#)=$[[0]] atk, [[1d12+3]]+$[[2]] dmg
16}kl1]]](#)=$[[0]] atk, [[1d12+3]]+$[[2]] dmg
17}kl1]]](#)=$[[0]] atk, [[1d12+3]]+$[[2]] dmg
18}kl1]]](#)=$[[0]] atk, [[1d12+3]]+$[[2]] dmg
19}kl1]]](#)=$[[0]] atk, [[1d12+3]]+$[[2]] dmg
20}kl1]]](#)=$[[0]] atk, [[1d12+3]]+$[[2]] dmg
}}
July 13 (4 years ago)

Edited July 13 (4 years ago)
Oosh
Sheet Author
API Scripter

The Attack modifier is +5 to hit and 1d12+3 slashing damage.

They're static modifiers which will never change? Or did you want a Query for them in there?


Also, did you want the crit separate like the Animated Objects macro, or already added in (you can still mouseover for detail). So, like this:

&{template:default} {{name=Attack Macro}} [[(1d12+3)[DMG]+[[floor([[?{Roll|Normal, 1d20|Advantage, 2d20kh1|Disadvantage, 2d20kl1}]]/20)]]d12[CRIT]]] {{Atk [[[{?{Number of attacks|4},1}kl1]]](#)=$[[0]] atk, $[[2]] dmg}}


Or like this:

&{template:default} {{name=Attack Macro}} [[[[floor([[?{Roll|Normal, 1d20|Advantage, 2d20kh1|Disadvantage, 2d20kl1}]]/20)]]d12[CRIT]]] {{Atk [[[{?{Number of attacks|4},1}kl1]]](#)=$[[0]] atk, [[1d12+3]]+$[[2]] dmg}}


Both versions roll 0 crit damage if the attack is not a crit, it's just a different display.

July 13 (4 years ago)

Edited July 13 (4 years ago)


Oosh said:

The Attack modifier is +5 to hit and 1d12+3 slashing damage.

They're static modifiers which will never change? Or did you want a Query for them in there?


The Statistics never Change, its always the common Berserker dmg


Also, did you want the crit separate like the Animated Objects macro, or already added in (you can still mouseover for detail). So, like this:
&{template:default} {{name=Attack Macro}} [[(1d12+3)[DMG]+[[floor([[?{Roll|Normal, 1d20|Advantage, 2d20kh1|Disadvantage, 2d20kl1}]]/20)]]d12[CRIT]]] {{Atk [[[{?{Number of attacks|4},1}kl1]]](#)=$[[0]] atk, $[[2]] dmg}}
Or like this:
&{template:default} {{name=Attack Macro}} [[[[floor([[?{Roll|Normal, 1d20|Advantage, 2d20kh1|Disadvantage, 2d20kl1}]]/20)]]d12[CRIT]]] {{Atk [[[{?{Number of attacks|4},1}kl1]]](#)=$[[0]] atk, [[1d12+3]]+$[[2]] dmg}}
Both versions roll 0 crit damage if the attack is not a crit, it's just a different display.


That lightened something up!

I think i just need a macro for

@selected Token - Number of attacks (4-25) - set DC to hit - show hits/dmg

Is that possible without the Groupcheck API?

btw, we´re talking about D&D 5E.


Thanks Oosh, you´re always a big help :)


Edit:

I am working on it. Your suggestions are great for a Player used macro.

The Idea about "set DC to hit" and "apply Damage", would be great for a DM used macro - depends on the role. Both ways are way easier then click 20 times

Updated Progression above!

July 13 (4 years ago)

Edited July 13 (4 years ago)
David M.
Pro
API Scripter

Klaus K. said:

I think i just need a macro for

@selected Token - Number of attacks (4-25) - set DC to hit - show hits/dmg


Will something like this work? See Ed S.'s solution to this problem:

https://app.roll20.net/forum/post/4608575/trying-to-get-a-macro-to-properly-work-one-that-rolls-for-multiple-hits-and-then-for-multiple-instances-of-damage


July 13 (4 years ago)


David M. said:

Klaus K. said:

I think i just need a macro for

@selected Token - Number of attacks (4-25) - set DC to hit - show hits/dmg


Will something like this work? See Ed S.'s solution to this problem:

https://app.roll20.net/forum/post/4608575/trying-to-get-a-macro-to-properly-work-one-that-rolls-for-multiple-hits-and-then-for-multiple-instances-of-damage



Thats great - except the Advantage/Disadvantage is missing. Try to implement that, but its harder then it looks like^^



July 13 (4 years ago)

Edited July 13 (4 years ago)

How can i add the Value of the Roll (Normal, Advantage, Disadvantage) - because the berserker attack Reckless

[[?{Roll|Normal, 1d20|Advantage, 2d20kh1|Disadvantage, 2d20kl1}]]

to the macro David M. Suggested:

[[{?{Number of Attackers|4}d20 + ?{To hit modifiers +|8}}>[[?{Target AC|15}]] ]] hits vs **AC**[[?{Target AC}d1]]

July 13 (4 years ago)

Edited July 13 (4 years ago)
David M.
Pro
API Scripter

OK, thinking outside of the box a bit (EDIT - Forgot to give credit to TheAaron for a forum posting from a few years ago,here): how about using rollable tables for the die roll instead of normal die roll syntax?

You could set up three rollable tables for norm/adv/disadv. Call them d20Norm, d20Adv, and d20DisAdv. There would be 20 items in each, with weights set to the probabilities of rolling each based on the roll type. Can't use decimal weights, so would multiply probabilities by 10,000 1,000.

So, instead of referring to advantage with [[ 1d20kh1 ]], it would instead be [[ t[d20Adv] ]]

Ading a query for the roll type would become:

 t[?{RollType|Normal,d20Norm|Advantage,d20Adv|Disadvantage,d20DisAdv}]


So, the final macro to find the number of hits would become this:

[[{?{Number of Attackers|4}t[?{RollType|Normal,d20Norm|Advantage,d20Adv|Disadvantage,d20DisAdv}] + ?{To hit modifiers +|8}}>[[?{Target AC|15}]] ]] hits vs **AC**[[?{Target AC}d1]]


Notes regarding the probabilities/weights for the rollable tables. Obviously, the d20Norm table would have all numbers equally weighted (=1)

Use the following to determine the weights for the d20Adv table:

Roll Num occurrences (w/Adv) Prob Weight
1 1 0.25% 25
2 3 0.75% 75
3 5 1.25% 125
4 7 1.75% 175
5 9 2.25% 225
6 11 2.75% 275
7 13 3.25% 325
8 15 3.75% 375
9 17 4.25% 425
10 19 4.75% 475
11 21 5.25% 525
12 23 5.75% 575
13 25 6.25% 625
14 27 6.75% 675
15 29 7.25% 725
16 31 7.75% 775
17 33 8.25% 825
18 35 8.75% 875
19 37 9.25% 925
20 39 9.75% 975

  

And the following for Disadvantage:

Roll Num occurrences (w/DisAdv) Prob Weight
1 39 9.75% 975
2 37 9.25% 925
3 35 8.75% 875
4 33 8.25% 825
5 31 7.75% 775
6 29 7.25% 725
7 27 6.75% 675
8 25 6.25% 625
9 23 5.75% 575
10 21 5.25% 525
11 19 4.75% 475
12 17 4.25% 425
13 15 3.75% 375
14 13 3.25% 325
15 11 2.75% 275
16 9 2.25% 225
17 7 1.75% 175
18 5 1.25% 125
19 3 0.75% 75
20 1 0.25% 25

A little initial setup time, but I think it would ultimately work for you!

July 13 (4 years ago)

Wow, thats a lot of stuff to work in.

I just wanted to make stuff easier :)

What about:

&{template:default} {{name=Horn of Valhalla - Berserkers}} 
[[?{Roll|Normal, 1d20|Advantage, 2d20kh1|Disadvantage, 2d20kl1}]]*[[{?{Number of Attackers|10}d20]]}

something like that.

In fact, i just need the following macro, inspired by the try above:

Roll Adv,Disadv,normal? - > How many attacks 

GM can hover and count the hits -> use:

[[ (?{Number of hits|1}?{Damage die|1d12} + (?{Damage bonus|3}*?{Number of hits}) ]] ?{damage type|bludgeoning}


Would be one macro to count the hits

and another for the dmg.


July 13 (4 years ago)

Edited July 13 (4 years ago)
David M.
Pro
API Scripter

I gave a long explanation, but it really just comes down to making three rollable tables with the given weights. The Macro part is already figured out, is pretty simple to use, and doesn't require any manual comparisons after the fact. The only thing is this approach doesn't work great as a player macro unless you tell them the AC, which I can see kind of ruining the mystery.   

So if you don't want to go that route, no worries! I had fun working it out. It's like Sudoko, for RPG nerds :)

I have to step away for a bit, but could look at it again later (probably tomorrow) to see if we could come up with a more universal solution. 

Btw, what character sheet are you using? D&D 5th Edition by Roll20? I made a macro that added a bunch of richochet longbow attacks in the description field of a template for somebody a couple weeks ago. Maybe could use a similar approach, possibly merging with some of Oosh's formatting? Here is how we approached that problem, if you wanted to start thinking about it or playing around with it. 

July 14 (4 years ago)

Edited July 14 (4 years ago)
Oosh
Sheet Author
API Scripter

Had to do some sleeping. If you're still trying to get the macro going... here is a version that only goes up to 10 attacks:

&{template:default} [[(1d12+3)[DMG]+[[floor([[?{Roll|Normal, 1d20+5|Advantage, 2d20kh1+5|Disadvantage, 2d20kl1+5}]]/25)]]d12[CRIT]]] [[(1d12+3)[DMG]+[[floor([[?{Roll}]]/25)]]d12[CRIT]]] [[(1d12+3)[DMG]+[[floor([[?{Roll}]]/25)]]d12[CRIT]]] [[(1d12+3)[DMG]+[[floor([[?{Roll}]]/25)]]d12[CRIT]]] [[(1d12+3)[DMG]+[[floor([[?{Roll}]]/25)]]d12[CRIT]]] [[(1d12+3)[DMG]+[[floor([[?{Roll}]]/25)]]d12[CRIT]]] [[(1d12+3)[DMG]+[[floor([[?{Roll}]]/25)]]d12[CRIT]]] [[(1d12+3)[DMG]+[[floor([[?{Roll}]]/25)]]d12[CRIT]]] [[(1d12+3)[DMG]+[[floor([[?{Roll}]]/25)]]d12[CRIT]]] [[(1d12+3)[DMG]+[[floor([[?{Roll}]]/25)]]d12[CRIT]]] {{name=Attack Macro}} {{Atk [[[{?{Number of attacks|4},1}kl1]]](#)=$[[0]] atk, $[[2]] dmg}} {{Atk [[[{?{Number of attacks},2}kl1]]](#)=$[[3]] atk, $[[6]] dmg}} {{Atk [[[{?{Number of attacks},3}kl1]]](#)=$[[4]] atk, $[[11]] dmg}} {{Atk [[[{?{Number of attacks},4}kl1]]](#)=$[[7]] atk, $[[13]] dmg}} {{Atk [[[{?{Number of attacks},5}kl1]]](#)=$[[9]] atk, $[[20]] dmg}} {{Atk [[[{?{Number of attacks},6}kl1]]](#)=$[[12]] atk, $[[22]] dmg}} {{Atk [[[{?{Number of attacks},7}kl1]]](#)=$[[14]] atk, $[[24]] dmg}} {{Atk [[[{?{Number of attacks},8}kl1]]](#)=$[[16]] atk, $[[37]] dmg}} {{Atk [[[{?{Number of attacks},9}kl1]]](#)=$[[18]] atk, $[[38]] dmg}} {{Atk [[[{?{Number of attacks},10}kl1]]](#)=$[[21]] atk, $[[39]] dmg}} 

I'd forgotten about the problem with the $[[0]] calls getting out of order with groups of nested rolls, so it all needs to be manually done, and breaks if you add any more rolls.


There is an alternative as you've described above, a macro for rolling hits and another one to roll damage. The big advantage of this method is that you can display TOTAL damage, no manual adding up required. You can also display it in a 5e template, where as the clever trick for displaying the number of attacks in the Animate Objects macro only works in the default template.


I'll dig up that other one that does damage separately, see what you think of it.



@David M.

I like the idea of using the tables! I'm sure I'll find a use for that.

July 14 (4 years ago)
David M.
Pro
API Scripter

Yeah Oosh, that's where I was afraid it was going to go, haha! But I suppose with up to 10 attacks possible, you'd only be calling it a max of 3 times. Probably the most complete solution you can get without writing some one-off custom api script, since it will work for both player and GM. 

I still am a little unclear on how the nested $[[n]] references get [dis]ordered. I wasn't aware of that "feature". Also wasn't aware that the num attacks trick only worked in the default template. Thanks for the tip!


July 14 (4 years ago)
Oosh
Sheet Author
API Scripter

Yeah I was trying to find a pattern in there until I went cross-eyed. I tried shifting them around to different bits of the macro, putting them in actual fields... I couldn't make any sense of it. I'm definitely not going up to 25 attacks! :)

July 14 (4 years ago)

Edited July 14 (4 years ago)
Oosh
Sheet Author
API Scripter

Ok this is probably a bit simpler. It's pretty much what you had up above. You have the choice of inputting the AC and counting up the successes (like David has in his Tables macro) or of displaying the dice rolls and counting the successes manually - you can't show both using a $[[0]] call unfortunately, as the successes operator won't work if the die roll is wrapped in [[ ]] its own safe space. Anyway, this is 2 macros, I'd recommend saving them as Ability macros on a character sheet (called Macros in this example).

First macro is ValhallaAttack:

&{template:default} {{Atk [[[{?{Number of attacks|4},1}kl1]]](#)= [[?{Roll|Normal,1d20|Advantage,2d20kh1|Disadvantage,2d20kl1}+5]] }} {{Atk [[[{?{Number of attacks|4},1}kl1]]](#)= [[?{Roll|Normal,1d20|Advantage,2d20kh1|Disadvantage,2d20kl1}+5]] }} {{Atk [[[{?{Number of attacks|4},2}kl1]]](#)= [[?{Roll|Normal,1d20|Advantage,2d20kh1|Disadvantage,2d20kl1}+5]] }}{{Atk [[[{?{Number of attacks|4},3}kl1]]](#)= [[?{Roll|Normal,1d20|Advantage,2d20kh1|Disadvantage,2d20kl1}+5]] }}{{Atk [[[{?{Number of attacks|4},4}kl1]]](#)= [[?{Roll|Normal,1d20|Advantage,2d20kh1|Disadvantage,2d20kl1}+5]] }}{{Atk [[[{?{Number of attacks|4},5}kl1]]](#)= [[?{Roll|Normal,1d20|Advantage,2d20kh1|Disadvantage,2d20kl1}+5]] }}{{Atk [[[{?{Number of attacks|4},6}kl1]]](#)= [[?{Roll|Normal,1d20|Advantage,2d20kh1|Disadvantage,2d20kl1}+5]] }}{{Atk [[[{?{Number of attacks|4},7}kl1]]](#)= [[?{Roll|Normal,1d20|Advantage,2d20kh1|Disadvantage,2d20kl1}+5]] }}{{Atk [[[{?{Number of attacks|4},8}kl1]]](#)= [[?{Roll|Normal,1d20|Advantage,2d20kh1|Disadvantage,2d20kl1}+5]] }}{{Atk [[[{?{Number of attacks|4},9}kl1]]](#)= [[?{Roll|Normal,1d20|Advantage,2d20kh1|Disadvantage,2d20kl1}+5]] }}{{Atk [[[{?{Number of attacks|4},10}kl1]]](#)= [[?{Roll|Normal,1d20|Advantage,2d20kh1|Disadvantage,2d20kl1}+5]] }}{{Atk [[[{?{Number of attacks|4},11}kl1]]](#)= [[?{Roll|Normal,1d20|Advantage,2d20kh1|Disadvantage,2d20kl1}+5]] }}{{Atk [[[{?{Number of attacks|4},12}kl1]]](#)= [[?{Roll|Normal,1d20|Advantage,2d20kh1|Disadvantage,2d20kl1}+5]] }}{{Atk [[[{?{Number of attacks|4},13}kl1]]](#)= [[?{Roll|Normal,1d20|Advantage,2d20kh1|Disadvantage,2d20kl1}+5]] }}{{Atk [[[{?{Number of attacks|4},14}kl1]]](#)= [[?{Roll|Normal,1d20|Advantage,2d20kh1|Disadvantage,2d20kl1}+5]] }}{{Atk [[[{?{Number of attacks|4},15}kl1]]](#)= [[?{Roll|Normal,1d20|Advantage,2d20kh1|Disadvantage,2d20kl1}+5]] }}{{Atk [[[{?{Number of attacks|4},16}kl1]]](#)= [[?{Roll|Normal,1d20|Advantage,2d20kh1|Disadvantage,2d20kl1}+5]] }}{{Atk [[[{?{Number of attacks|4},17}kl1]]](#)= [[?{Roll|Normal,1d20|Advantage,2d20kh1|Disadvantage,2d20kl1}+5]] }}{{Atk [[[{?{Number of attacks|4},18}kl1]]](#)= [[?{Roll|Normal,1d20|Advantage,2d20kh1|Disadvantage,2d20kl1}+5]] }}{{Atk [[[{?{Number of attacks|4},19}kl1]]](#)= [[?{Roll|Normal,1d20|Advantage,2d20kh1|Disadvantage,2d20kl1}+5]] }}{{Atk [[[{?{Number of attacks|4},20}kl1]]](#)= [[?{Roll|Normal,1d20|Advantage,2d20kh1|Disadvantage,2d20kl1}+5]] }}{{Atk [[[{?{Number of attacks|4},21}kl1]]](#)= [[?{Roll|Normal,1d20|Advantage,2d20kh1|Disadvantage,2d20kl1}+5]] }}{{Atk [[[{?{Number of attacks|4},22}kl1]]](#)= [[?{Roll|Normal,1d20|Advantage,2d20kh1|Disadvantage,2d20kl1}+5]] }}{{Atk [[[{?{Number of attacks|4},23}kl1]]](#)= [[?{Roll|Normal,1d20|Advantage,2d20kh1|Disadvantage,2d20kl1}+5]] }}{{Atk [[[{?{Number of attacks|4},24}kl1]]](#)= [[?{Roll|Normal,1d20|Advantage,2d20kh1|Disadvantage,2d20kl1}+5]] }}{{Atk [[[{?{Number of attacks|4},25}kl1]]](#)= [[?{Roll|Normal,1d20|Advantage,2d20kh1|Disadvantage,2d20kl1}+5]] }}{{[Roll Damage](~Macros|ValhallaDamage)}} {{name=Valhalla Attack}}

There's a button at the end to link straight ot the damage macro.


The second macro is called ValhallaDamage

&{template:default}{{name=Valhalla Damage}}{{**Valhalla** hits for a total of** [[ [[ ([[?{How many attacks hit?|1}]] + [[?{How many attacks critically hit?|0}]])]]d12 + ?{How many attacks hit?}*3]] slashing damage**.
$[[0]] attacks hit the target and $[[1]]of those critically hit!}}



July 14 (4 years ago)

Edited July 15 (4 years ago)
David M.
Pro
API Scripter

Cool, Oosh, that got me thinking a bit. The npcattack template from the 5E sheet , while unable to use the number of attackers trick, displays in a much more compact format. How about just always making the 25 attacks and only using the ones you want? Doesn't spam the chat window too bad with that template, and it's one less query to input since we're always making 25 attacks. Then, in order to avoid having to figure out the $[[0]] calls to auto proc the crit damage, just put an ability button on each line to click if there is a crit (easy to pick out the green text for the crit attack).

See the output below. Attack 02 was a crit, so I then clicked the button (the text "Crit?") at the far right of that line, which generated the line in the output using the npcdamage template. It all fits in a single chat window, with room to spare.


Taking another queue from Oosh, this was done with two ability macros, ValhallaAttack and ValhallaCrit, which obviously can be added as token actions for the selected token or put in the macro bar.

ValhallaAttack

&{template:npcatk} {{name=The Horde Attacks!!!}} {{description=Atk01: [[?{Roll|Normal,1d20|Advantage,2d20kh1|Disadvantage,2d20kl1}+5]] Dam:[[1d12+3]] [Crit?](~ValhallaCrit)
Atk02: [[?{Roll|Normal,2d20|Advantage,2d20kh1|Disadvantage,2d20kl1}+5]]  Dam:[[1d12+3]]  [Crit?](~ValhallaCrit)
Atk03: [[?{Roll|Normal,2d20|Advantage,2d20kh1|Disadvantage,2d20kl1}+5]]  Dam:[[1d12+3]]  [Crit?](~ValhallaCrit)
Atk04: [[?{Roll|Normal,2d20|Advantage,2d20kh1|Disadvantage,2d20kl1}+5]]  Dam:[[1d12+3]]  [Crit?](~ValhallaCrit)
Atk05: [[?{Roll|Normal,2d20|Advantage,2d20kh1|Disadvantage,2d20kl1}+5]]  Dam:[[1d12+3]]  [Crit?](~ValhallaCrit)
Atk06: [[?{Roll|Normal,2d20|Advantage,2d20kh1|Disadvantage,2d20kl1}+5]]  Dam:[[1d12+3]]  [Crit?](~ValhallaCrit)
Atk07: [[?{Roll|Normal,2d20|Advantage,2d20kh1|Disadvantage,2d20kl1}+5]]  Dam:[[1d12+3]]  [Crit?](~ValhallaCrit)
Atk08: [[?{Roll|Normal,2d20|Advantage,2d20kh1|Disadvantage,2d20kl1}+5]]  Dam:[[1d12+3]]  [Crit?](~ValhallaCrit)
Atk09: [[?{Roll|Normal,2d20|Advantage,2d20kh1|Disadvantage,2d20kl1}+5]]  Dam:[[1d12+3]]  [Crit?](~ValhallaCrit)
Atk10: [[?{Roll|Normal,2d20|Advantage,2d20kh1|Disadvantage,2d20kl1}+5]]  Dam:[[1d12+3]]  [Crit?](~ValhallaCrit)
Atk11: [[?{Roll|Normal,2d20|Advantage,2d20kh1|Disadvantage,2d20kl1}+5]]  Dam:[[1d12+3]]  [Crit?](~ValhallaCrit)
Atk12: [[?{Roll|Normal,2d20|Advantage,2d20kh1|Disadvantage,2d20kl1}+5]]  Dam:[[1d12+3]]  [Crit?](~ValhallaCrit)
Atk13: [[?{Roll|Normal,2d20|Advantage,2d20kh1|Disadvantage,2d20kl1}+5]]  Dam:[[1d12+3]]  [Crit?](~ValhallaCrit)
Atk14: [[?{Roll|Normal,2d20|Advantage,2d20kh1|Disadvantage,2d20kl1}+5]]  Dam:[[1d12+3]]  [Crit?](~ValhallaCrit)
Atk15: [[?{Roll|Normal,2d20|Advantage,2d20kh1|Disadvantage,2d20kl1}+5]]  Dam:[[1d12+3]]  [Crit?](~ValhallaCrit)
Atk16: [[?{Roll|Normal,2d20|Advantage,2d20kh1|Disadvantage,2d20kl1}+5]]  Dam:[[1d12+3]]  [Crit?](~ValhallaCrit)
Atk17: [[?{Roll|Normal,2d20|Advantage,2d20kh1|Disadvantage,2d20kl1}+5]]  Dam:[[1d12+3]]  [Crit?](~ValhallaCrit)
Atk18: [[?{Roll|Normal,2d20|Advantage,2d20kh1|Disadvantage,2d20kl1}+5]]  Dam:[[1d12+3]]  [Crit?](~ValhallaCrit)
Atk19: [[?{Roll|Normal,2d20|Advantage,2d20kh1|Disadvantage,2d20kl1}+5]]  Dam:[[1d12+3]]  [Crit?](~ValhallaCrit)
Atk20: [[?{Roll|Normal,2d20|Advantage,2d20kh1|Disadvantage,2d20kl1}+5]]  Dam:[[1d12+3]]  [Crit?](~ValhallaCrit)
Atk21: [[?{Roll|Normal,2d20|Advantage,2d20kh1|Disadvantage,2d20kl1}+5]]  Dam:[[1d12+3]]  [Crit?](~ValhallaCrit)
Atk22: [[?{Roll|Normal,2d20|Advantage,2d20kh1|Disadvantage,2d20kl1}+5]]  Dam:[[1d12+3]]  [Crit?](~ValhallaCrit)
Atk23: [[?{Roll|Normal,2d20|Advantage,2d20kh1|Disadvantage,2d20kl1}+5]]  Dam:[[1d12+3]]  [Crit?](~ValhallaCrit)
Atk24: [[?{Roll|Normal,2d20|Advantage,2d20kh1|Disadvantage,2d20kl1}+5]]  Dam:[[1d12+3]]  [Crit?](~ValhallaCrit)
Atk25: [[?{Roll|Normal,2d20|Advantage,2d20kh1|Disadvantage,2d20kl1}+5]]  Dam:[[1d12+3]]  [Crit?](~ValhallaCrit)
}}

ValhallaCrit

&{template:npcdmg} {{damage=}} {{dmg1flag=1}} {{dmg1= [[1d12]] Crit Damage}}

Klaus, if you haven't made ability macros with the 5E sheet before, just go to the Attributes & Abilities tab of the character sheet, then click +Add on the upper right. Click the pencil icon to edit, then paste the ability macro text and name them appropriately. Apologies if you already knew all of this, just including for completeness or for anyone else following this thread :)


Still have to manually add the total damage, but if the berserker horde is attacking multiple enemies, their normal and crit damage can be distributed as needed (e.g. 15 attacks: berserkers 1-8 attack the Death Knight, 9-15 attack the Dracolich, and 16-25 are ignored). Think that's the best I can do. 

Klaus, you could even keep both methods handy depending on the situation. Oosh's total damage solution is nice if most/all are attacking the BBEG, or you could use the above if they are more distributed.



July 15 (4 years ago)
Oosh
Sheet Author
API Scripter

So many options! Almost as many as there are attacks!


I do like that feature of the npcdmg template, that it'll happily attach to the bottom of the previous one. It looks good for this kind of use.


Also, minor tweak: the crit damage shouldn't add the +3 modifier, just roll the d12.

July 15 (4 years ago)
David M.
Pro
API Scripter

Haha, good catch Oosh! A little trigger happy with my cut and paste. I edited the post with your correction, thanks!

July 16 (4 years ago)



Oosh said:

So many options! Almost as many as there are attacks!


I am sorry, i guess you two had a lot of time invested to this macro.


David M. said:

I gave a long explanation, but it really just comes down to making three rollable tables with the given weights. The Macro part is already figured out, is pretty simple to use, and doesn't require any manual comparisons after the fact. The only thing is this approach doesn't work great as a player macro unless you tell them the AC, which I can see kind of ruining the mystery.   

Absolutly Stunning Idea with the table. I tried it a bit for other stuff i use for my own campaigns/Games. Its amazing as a GM.


At the very end:

You guys are unbelivable. Thank you very much! I hope there is a way to support you in some way. I´ll check your wishlists out :)

I can use all of those macros in different situations as a Player and also as  GM.

You´d done a very good job, and i hope there will be others find a use in this breaking stuff you guys did :D





July 16 (4 years ago)
David M.
Pro
API Scripter

No worries, Klaus, happy that you are finding uses for them. It's fun to think about problems and add to the bag of tools. You never know what can be applied elsewhere down the road!

July 19 (4 years ago)
David M.
Pro
API Scripter

Ok, so I know this topic pretty much beaten to death, but I've been playing around with the Powercards API script a bit lately and was reminded of your multi-attack problem. Lo and behold, I come back here and see that you have a Pro subscription and could therefore install scripts!

The Powercards script is pretty flexible, allowing for limited conditional syntax and [even more limited] re-use of rolls. Using Powercards can allow you to roll attacks and damage for exactly the right number of berserkers summoned by the Horn of Valhalla, and also automatically roll the crit damage for only the rolls that actually critted (so you don't have to scan the output and click the api buttons separately anymore). It all happens with one command and two queries (#Attacks & Norm/Adv/DisAdv). Powercards is available for 1-click install, and commands can be run from either Collections macros or Character abilities. 

There are a couple ways to do it: the easier way (gets almost perfect but is a bit faster adn requires less code) and the more complex way (which has superior formatting but is a little bit slower and a lot more code). Note that neither of these methods can perform a sum of total damage rolls, due to the annoying way inline rolls are processed in Roll20. So, if you want the math done for you, you still gotta use something like we already discussed.

Here is the Powercards Wiki, which explains the bazillion commands available. Get your Ctrl-F find text skills handy if you want to dig deeper into what I've included below :). 

The easier way

This method takes advantage of the "Repeat" modifier (<Name>#<number of times to repeat>) to perform an arbitrary number of attacks. How many are possible? I have no idea, but I accidentally repeated damage 900 times once (!) and it didn't break anything, so there's that. As you can see, the syntax is pretty compact. That is, until we start testing for the crits. We are using conditionals based on the repeated RollIDs , but have to explicitly check up to how many attacks you want to allow. Any attack RollIDs beyond what we actually have are just ignored.

As you can see from the sample output, we're almost there. The only problem is that when using the repeat modifier, the row titles do not give the index of the attack roll. So no "Attack 1, Attack 2...etc". The example below is for 25 attacks with advantage, resulting in 4 crits (again, with no extra clicks).


Here's the Input. 

!power {{
  --name|The Horde Attacks!!!
  --leftsub|Horn of Valhalla
  --rightsub|Melee Range
 --Attack#?{Number of attacks|1}|[[ [$Atk] ?{Roll|Normal,1d20|Advantage,2d20kh1|Disadvantage,2d20kl1}+5 ]] Damage = [[ 1d12 + 3 ]]

  --?? ?{Roll} == 1d20 ?? ^3Roll Mode:| Normal
  --?? ?{Roll} == 2d20kh1 ?? ^3Roll Mode:| Advantage
  --?? ?{Roll} == 2d20kl1 ?? ^3Roll Mode:| Disadvantage

  --?? $Atk_1.base == 20 ?? Crit dam (Attack 1):| [[1d12]] 
  --?? $Atk_2.base == 20 ?? Crit dam (Attack 2):| [[1d12]] 
  --?? $Atk_3.base == 20 ?? Crit dam (Attack 3):| [[1d12]] 
  --?? $Atk_4.base == 20 ?? Crit dam (Attack 4):| [[1d12]] 
  --?? $Atk_5.base == 20 ?? Crit dam (Attack 5):| [[1d12]] 
  --?? $Atk_6.base == 20 ?? Crit dam (Attack 6):| [[1d12]] 
  --?? $Atk_7.base == 20 ?? Crit dam (Attack 7):| [[1d12]] 
  --?? $Atk_8.base == 20 ?? Crit dam (Attack 8):| [[1d12]] 
  --?? $Atk_9.base == 20 ?? Crit dam (Attack 9):| [[1d12]] 
  --?? $Atk_10.base == 20 ?? Crit dam (Attack 10):| [[1d12]] 
  --?? $Atk_11.base == 20 ?? Crit dam (Attack 11):| [[1d12]] 
  --?? $Atk_12.base == 20 ?? Crit dam (Attack 12):| [[1d12]] 
  --?? $Atk_13.base == 20 ?? Crit dam (Attack 13):| [[1d12]] 
  --?? $Atk_14.base == 20 ?? Crit dam (Attack 14):| [[1d12]] 
  --?? $Atk_15.base == 20 ?? Crit dam (Attack 15):| [[1d12]] 
  --?? $Atk_16.base == 20 ?? Crit dam (Attack 16):| [[1d12]] 
  --?? $Atk_17.base == 20 ?? Crit dam (Attack 17):| [[1d12]] 
  --?? $Atk_18.base == 20 ?? Crit dam (Attack 18):| [[1d12]] 
  --?? $Atk_19.base == 20 ?? Crit dam (Attack 19):| [[1d12]] 
  --?? $Atk_20.base == 20 ?? Crit dam (Attack 20):| [[1d12]] 
  --?? $Atk_21.base == 20 ?? Crit dam (Attack 21):| [[1d12]] 
  --?? $Atk_22.base == 20 ?? Crit dam (Attack 22):| [[1d12]] 
  --?? $Atk_23.base == 20 ?? Crit dam (Attack 23):| [[1d12]] 
  --?? $Atk_24.base == 20 ?? Crit dam (Attack 24):| [[1d12]] 
  --?? $Atk_25.base == 20 ?? Crit dam (Attack 25):| [[1d12]] 

}}

The more complex way

This method is very similar to the above, except here we are able to add the Attack number identifier to the row captions in the resulting chat window. This requires us to ask for the number of rolls, then use a combination of conditional logic and brute force hardcoding to perform up to 25 attacks. You may also note that the conditional expressions for the critical damage entries need an extra qualifier, since this method is always making all 25 attacks, but only displaying the relevant ones. Without the additional critical damage conditional, it may output crit damage for attack 24 even though only 10 attacks were made, for example.

Example output for 15 attacks, "Normal" single d20 rolls, resulting in one crit (attack 14).


Here's the input. Note that, since we always make ALL the attacks, and then ALWAYS apply conditional modifiers to each to only display relevant ones, this method take a little longer to execute, especially for Adv/DisAdv rolls. Maybe around 4 seconds on my laptop on a Sunday around 2PM EST. Not sure if it would be faster on a less busy gaming day/time. You'd have to decide if the proper formatting is worth those couple seconds extra.

!power {{
  --name|The Horde Attacks!!!
  --leftsub|Horn of Valhalla
  --rightsub|Melee Range

  --hroll| [[ [$NumAttacks] 1d0 + ?{Number of attacks|1} ]] 

  --?? $NumAttacks.total >= 1 ?? Attack 1:| [[ [$Atk1] ?{Roll|Normal,1d20|Advantage,2d20kh1|Disadvantage,2d20kl1}+5 ]] / Damage = [[ 1d12 + 3 ]]
  --?? $NumAttacks.total >= 1 ?? Attack 1:| [[ [$Atk1] ?{Roll|Normal,1d20|Advantage,2d20kh1|Disadvantage,2d20kl1}+5 ]] / Damage = [[ 1d12 + 3 ]]
  --?? $NumAttacks.total >= 2 ?? Attack 2:| [[ [$Atk2] ?{Roll|Normal,1d20|Advantage,2d20kh1|Disadvantage,2d20kl1}+5 ]] / Damage = [[ 1d12 + 3 ]]
  --?? $NumAttacks.total >= 3 ?? Attack 3:| [[ [$Atk3] ?{Roll|Normal,1d20|Advantage,2d20kh1|Disadvantage,2d20kl1}+5 ]] / Damage = [[ 1d12 + 3 ]]
  --?? $NumAttacks.total >= 4 ?? Attack 4:| [[ [$Atk4] ?{Roll|Normal,1d20|Advantage,2d20kh1|Disadvantage,2d20kl1}+5 ]] / Damage = [[ 1d12 + 3 ]]
  --?? $NumAttacks.total >= 5 ?? Attack 5:| [[ [$Atk5] ?{Roll|Normal,1d20|Advantage,2d20kh1|Disadvantage,2d20kl1}+5 ]] / Damage = [[ 1d12 + 3 ]]
  --?? $NumAttacks.total >= 6 ?? Attack 6:| [[ [$Atk6] ?{Roll|Normal,1d20|Advantage,2d20kh1|Disadvantage,2d20kl1}+5 ]] / Damage = [[ 1d12 + 3 ]]
  --?? $NumAttacks.total >= 7 ?? Attack 7:| [[ [$Atk7] ?{Roll|Normal,1d20|Advantage,2d20kh1|Disadvantage,2d20kl1}+5 ]] / Damage = [[ 1d12 + 3 ]]
  --?? $NumAttacks.total >= 8 ?? Attack 8:| [[ [$Atk8] ?{Roll|Normal,1d20|Advantage,2d20kh1|Disadvantage,2d20kl1}+5 ]] / Damage = [[ 1d12 + 3 ]]
  --?? $NumAttacks.total >= 9 ?? Attack 9:| [[ [$Atk9] ?{Roll|Normal,1d20|Advantage,2d20kh1|Disadvantage,2d20kl1}+5 ]] / Damage = [[ 1d12 + 3 ]]
  --?? $NumAttacks.total >= 10 ?? Attack 10:| [[ [$Atk10] ?{Roll|Normal,1d20|Advantage,2d20kh1|Disadvantage,2d20kl1}+5 ]] / Damage = [[ 1d12 + 3 ]]
  --?? $NumAttacks.total >= 11 ?? Attack 11:| [[ [$Atk11] ?{Roll|Normal,1d20|Advantage,2d20kh1|Disadvantage,2d20kl1}+5 ]] / Damage = [[ 1d12 + 3 ]]
  --?? $NumAttacks.total >= 12 ?? Attack 12:| [[ [$Atk12] ?{Roll|Normal,1d20|Advantage,2d20kh1|Disadvantage,2d20kl1}+5 ]] / Damage = [[ 1d12 + 3 ]]
  --?? $NumAttacks.total >= 13 ?? Attack 13:| [[ [$Atk13] ?{Roll|Normal,1d20|Advantage,2d20kh1|Disadvantage,2d20kl1}+5 ]] / Damage = [[ 1d12 + 3 ]]
  --?? $NumAttacks.total >= 14 ?? Attack 14:| [[ [$Atk14] ?{Roll|Normal,1d20|Advantage,2d20kh1|Disadvantage,2d20kl1}+5 ]] / Damage = [[ 1d12 + 3 ]]
  --?? $NumAttacks.total >= 15 ?? Attack 15:| [[ [$Atk15] ?{Roll|Normal,1d20|Advantage,2d20kh1|Disadvantage,2d20kl1}+5 ]] / Damage = [[ 1d12 + 3 ]]
  --?? $NumAttacks.total >= 16 ?? Attack 16:| [[ [$Atk16] ?{Roll|Normal,1d20|Advantage,2d20kh1|Disadvantage,2d20kl1}+5 ]] / Damage = [[ 1d12 + 3 ]]
  --?? $NumAttacks.total >= 17 ?? Attack 17:| [[ [$Atk17] ?{Roll|Normal,1d20|Advantage,2d20kh1|Disadvantage,2d20kl1}+5 ]] / Damage = [[ 1d12 + 3 ]]
  --?? $NumAttacks.total >= 18 ?? Attack 18:| [[ [$Atk18] ?{Roll|Normal,1d20|Advantage,2d20kh1|Disadvantage,2d20kl1}+5 ]] / Damage = [[ 1d12 + 3 ]]
  --?? $NumAttacks.total >= 19 ?? Attack 19:| [[ [$Atk19] ?{Roll|Normal,1d20|Advantage,2d20kh1|Disadvantage,2d20kl1}+5 ]] / Damage = [[ 1d12 + 3 ]]
  --?? $NumAttacks.total >= 20 ?? Attack 20:| [[ [$Atk20] ?{Roll|Normal,1d20|Advantage,2d20kh1|Disadvantage,2d20kl1}+5 ]] / Damage = [[ 1d12 + 3 ]]
  --?? $NumAttacks.total >= 21 ?? Attack 21:| [[ [$Atk21] ?{Roll|Normal,1d20|Advantage,2d20kh1|Disadvantage,2d20kl1}+5 ]] / Damage = [[ 1d12 + 3 ]]
  --?? $NumAttacks.total >= 22 ?? Attack 22:| [[ [$Atk22] ?{Roll|Normal,1d20|Advantage,2d20kh1|Disadvantage,2d20kl1}+5 ]] / Damage = [[ 1d12 + 3 ]]
  --?? $NumAttacks.total >= 23 ?? Attack 23:| [[ [$Atk23] ?{Roll|Normal,1d20|Advantage,2d20kh1|Disadvantage,2d20kl1}+5 ]] / Damage = [[ 1d12 + 3 ]]
  --?? $NumAttacks.total >= 24 ?? Attack 24:| [[ [$Atk24] ?{Roll|Normal,1d20|Advantage,2d20kh1|Disadvantage,2d20kl1}+5 ]] / Damage = [[ 1d12 + 3 ]]
  --?? $NumAttacks.total >= 25 ?? Attack 25:| [[ [$Atk25] ?{Roll|Normal,1d20|Advantage,2d20kh1|Disadvantage,2d20kl1}+5 ]] / Damage = [[ 1d12 + 3 ]]

  --?? ?{Roll} == 1d20 ?? ^3Roll Mode:| Normal
  --?? ?{Roll} == 2d20kh1 ?? ^3Roll Mode:| Advantage
  --?? ?{Roll} == 2d20kl1 ?? ^3Roll Mode:| Disadvantage

  --?? $Atk1.base == 20 AND $NumAttacks.total >= 1 ?? Crit dam (Attack 1):| [[1d12]]
  --?? $Atk2.base == 20 AND $NumAttacks.total >= 2 ?? Crit dam (Attack 2):| [[1d12]]
  --?? $Atk3.base == 20 AND $NumAttacks.total >= 3 ?? Crit dam (Attack 3):| [[1d12]]
  --?? $Atk4.base == 20 AND $NumAttacks.total >= 4 ?? Crit dam (Attack 4):| [[1d12]]
  --?? $Atk5.base == 20 AND $NumAttacks.total >= 5 ?? Crit dam (Attack 5):| [[1d12]]
  --?? $Atk6.base == 20 AND $NumAttacks.total >= 6 ?? Crit dam (Attack 6):| [[1d12]]
  --?? $Atk7.base == 20 AND $NumAttacks.total >= 7 ?? Crit dam (Attack 7):| [[1d12]]
  --?? $Atk8.base == 20 AND $NumAttacks.total >= 8 ?? Crit dam (Attack 8):| [[1d12]]
  --?? $Atk9.base == 20 AND $NumAttacks.total >= 9 ?? Crit dam (Attack 9):| [[1d12]]
  --?? $Atk10.base == 20 AND $NumAttacks.total >= 10 ?? Crit dam (Attack 10):| [[1d12]]
  --?? $Atk11.base == 20 AND $NumAttacks.total >= 11 ?? Crit dam (Attack 11):| [[1d12]]
  --?? $Atk12.base == 20 AND $NumAttacks.total >= 12 ?? Crit dam (Attack 12):| [[1d12]]
  --?? $Atk13.base == 20 AND $NumAttacks.total >= 13 ?? Crit dam (Attack 13):| [[1d12]]
  --?? $Atk14.base == 20 AND $NumAttacks.total >= 14 ?? Crit dam (Attack 14):| [[1d12]]
  --?? $Atk15.base == 20 AND $NumAttacks.total >= 15 ?? Crit dam (Attack 15):| [[1d12]]
  --?? $Atk16.base == 20 AND $NumAttacks.total >= 16 ?? Crit dam (Attack 16):| [[1d12]]
  --?? $Atk17.base == 20 AND $NumAttacks.total >= 17 ?? Crit dam (Attack 17):| [[1d12]]
  --?? $Atk18.base == 20 AND $NumAttacks.total >= 18 ?? Crit dam (Attack 18):| [[1d12]]
  --?? $Atk19.base == 20 AND $NumAttacks.total >= 19 ?? Crit dam (Attack 19):| [[1d12]]
  --?? $Atk20.base == 20 AND $NumAttacks.total >= 20 ?? Crit dam (Attack 20):| [[1d12]]
  --?? $Atk21.base == 20 AND $NumAttacks.total >= 21 ?? Crit dam (Attack 21):| [[1d12]]
  --?? $Atk22.base == 20 AND $NumAttacks.total >= 22 ?? Crit dam (Attack 22):| [[1d12]]
  --?? $Atk23.base == 20 AND $NumAttacks.total >= 23 ?? Crit dam (Attack 23):| [[1d12]]
  --?? $Atk24.base == 20 AND $NumAttacks.total >= 24 ?? Crit dam (Attack 24):| [[1d12]]
  --?? $Atk25.base == 20 AND $NumAttacks.total >= 25 ?? Crit dam (Attack 25):| [[1d12]]

}}

Now if only Roll20 would allow a way to perform math on inline roll results, all of our lives would be so much easier!