Role-Playing Game Dice-Rolling
Pyth, 48 bytes

-jdm?td(.*dhdJ.bmOSYNmm.xsk100cd\dcz))\,jdsMJssJ


Test Suite

Tricks / golfs in this code:


Everything that's not a number will be treated as 100, not just %.
To get the parentheses, I make the list into a tuple, then subtract out the commas.
This is the first time I've used .b, the binary map, which was added 3 days ago.
The code contains 6 different map functions.