Rolling Dice
At the core of most tabletop games is the requirement to roll dice. This page details the concepts and syntax used to execute dice rolls with Foundry VTT's specific roll formula syntax.
Roll Modes and Chat Commands
There are four different roll modes in Foundry Virtual Tabletop. Each roll mode implies a different level of visibility for the resulting roll. Every dice roll becomes a message in the chat log but the visibility of that message and the details of the roll vary for each mode. For every roll mode, all players will be able to see that a roll was performed  just as players at a physical tabletop can hear the audible sound of rolled dice  but depending on the roll mode they may not see the results. The available modes are:
 Normal Roll

A "normal roll" is a public dice roll which is visible to all players. To perform a normal roll, use
/roll
or/r
as the command prefix.  GM Roll

A "GM roll" is a private dice roll where the result is only visible to the player that rolled and any Game Master users. To perform a GM roll, use
/gmroll
or/gmr
as the command prefix.  Blind Roll

A "blind roll" is a private dice roll which where the result and details of the roll are only visible to Game Master users. The rolling player will not see the result of their own roll. This is similar to using a dice tower or other device at a physical tabletop where the roller may not get to see the outcome. To perform a blind roll, use
/blindroll
,/broll
, or/br
as the command prefix.  Self Roll

A "self roll" is a private dice roll which is only visible to the player who rolled it. To perform a self roll, use
/selfroll
or/sr
as the command prefix.
Roll Formula Syntax
Each dice term in a rolled share the same basic structure which chooses to roll a certain number of dice, each with a number of faces, and then apply optional modifiers to the rolled set.
/roll {number}d{faces}{modifiers}
Each rolled formula can contain multiple terms combined using arithmetic operations, and formulae can also include numeric terms. For example, the following formula will roll two 20sided dice keeping the highest of the two, a separate 4sided die, and add 4 to the total result.
/roll 2d20kh + 1d4 + 4
You may also include variable terms in your rolled expressions. These variable terms use the syntax @{data.path}
which are evaluated using attributes from the data of your currently controlled Actor. The composition of this data depends on the game system you are using, but as an example, the following roll would add the "Strength modifier" in the D&D5E system.
/roll 1d6 + @abilities.str.mod
Available Roll Modifiers
Each dice term can have "modifiers" applied to it. Each modifier is a set of additional characters which defines a type of operation to apply to the roll that it modifies. Modifiers are applied in order from left to right, so a roll with multiple modifiers will perform those in a predictable order where subsequent modifiers operate on the previously modified result. This section defines the roll modifiers which are currently supported:
Keep or Drop Results
A desired number of high or low rolls may be kept or dropped using the following roll modifiers.

kh{N}
 Keep the highestN
dice out of the group that were rolled. 
kl{N}
 Keep the lowestN
dice out of the group that were rolled. 
dh{N}
 Drop the highestN
dice out of the group that were rolled. 
dl{N}
 Drop the lowestN
dice out of the group that were rolled.
Reroll Certain Results
Specific results may be rerolled by specifying a reroll target or range.

r{y}
 Reroll any dice where the result wasy
. 
r>{y}
 Reroll any dice where the result was greater thany
. 
r>={y}
 Reroll any dice where the result was greater than or equal toy
. 
r<{y}
 Reroll any dice where the result was less thany
. 
r<={y}
 Reroll any dice where the result was less than or equal toy
.
Explode Certain Results
"Exploding" dice are supported where further dice of the same type are rolled until no more results of a certain value have been rolled.

x{y}
 Roll an additional dice each time a die rollsy
. 
x>{y}
 Roll an additional dice if any dice rolls greater thany
. 
x>={y}
 Roll an additional dice if any dice rolls greater than or equal toy
. 
x<{y}
 Roll an additional dice if any dice rolls less than or equal toy
. 
x<={y}
 Roll an additional dice if any dice rolls less than or equal toy
.
Count Successes
You can roll a set of dice and count the number of times a certain result or range of results was achieved.

cs={y}
 Count the number of dice which resulted exactly iny
. 
cs>{y}
 Count the number of dice which rolled greater thany
. 
cs>={y}
 Count the number of dice which rolled greater than or equal toy
. 
cs<{y}
 Count the number of dice which rolled less than or equal toy
. 
cs<={y}
 Count the number of dice which rolled less than or equal toy
.
Margin of Success
Roll a set of dice and compare the total against some target, keeping the difference as the result.

ms={y}
 Subtracty
from the rolled total and return the difference. 
ms>{y}
 Same as above. 
ms>={y}
 Same as above. 
ms<{y}
 Subtract the rolled total from y and return the difference. 
ms<={y}
 Same as above.
Parenthetical Expressions
A parenthetical expression allows you to evaluate some inner component of a roll formula before evaluating the outer portion. This allows for options where the number, faces, or modifiers of a dice roll are themselves dynamic in some way. Parenthetical expressions are defined by enclosing the inner expression in parentheses. Using parenthetical expressions can allow you to roll a variable number of dice based on a data attribute or an inner dice roll, for example:
/roll (@abilities.dex.mod)d6
/roll (2d4)d8
/roll (1d6)d(@attributes.proficiency)
Furthermore, parenthetical expressions can allow you to evaluate roll modifiers relative to a dynamically shifting target  for example to count the number of successes relative to some target attribute or opposed dice roll:
/roll 3d12cs<=(@attributes.power)
/roll 3d12ms>(4d6)
Dice Pools
A dice pool allows you to evaluate a set of dice roll expressions and combine or choose certain results from the pool as the final total. This allows you to keep, combine, or count results across multiple rolled formulae. Dice pools are defined using comma separated roll terms within brackets. Dice pools can be used to choose the better result between two or more alternative rolled formulae, for example:
/roll {4d6 + 4, 3d8 + 3, 2d10 + 2}kh
/roll {1d20, 10}kh
Dice pools can also be used to count the number of inner results which exceeded some threshold, for example:
/roll {6d6, 5d8, 4d10, 3d12}cs>15
API References
For module and system developers who want to go deeper with dice mechanics  there is a robust JavaScript API which can do even more with dice rolls. See the Roll Class API documentation for details.