/dicebag

Primary LanguagePerl

dicebag virtual dice rolling system

Dicebag is designed as a customisable dice simulation program. Rules for rolling
dice can be expressed uing two expressions: a roll expression (saying how many
of what type of dice to roll) and an output expression (saying what to do with
the dice that have been rolled).

The expressions are basically algebraic expressions. Roll expressions can use
the following special operators:

	XdY :		dicebag rolls X Y-sided dice. rolls are stored as an
			array of individual dice within the evaluator.

	XhY :		returns the highest X dice in Y, where Y is the result
			of a roll. X is optional, defaulting to 1.

	XlY :		as XhY, but returning the lowest dice.

	X>Y :		returns the number of dice in X greater than Y when X is
			a roll. If Y is a number, returns 1 if true, 0 if false.
			other comparison operators can be used in the same way:
			(<, >=, <=, ==)

	Zr{X>Y} :	for each die in roll X greater than Y, another die is
			rolled and added to the total dice pool of X. This
			process is repeated with the new rerolled dice, up to a
			total of Z times. Z is optional, and if not given, dice
			will be rerolled indefinitely until none of the rerolled
			dice are greater than Y. As with the above operator,
			other comparison operators are also allowed:
			(<, >=, <=, ==)

	Zc{X>Y} :	as for Zr{X>y}, but instead of rerolled dice being added
			to the pool, they are added to the particular die that
			triggered the reroll. take for instance the difference
			between 1r{2d6>5} and 1c{2d6>5}. Suppose the 2d6 returns
			(2, 6), and the reroll returns 4. the 'r' operator will
			return (2, 6, 4), while the 'c' operator will return
			(2, 10). This distinction is very important when
			combined with other operators, particularly 'h', 'l'
			and comparison operators.

	(X) :		Parentheses can be used to group expressions to change
			priority. e.g. 1+2*3 = 7, but (1+2)*3 = 9.

	[X] :		Square brackets act like parentheses, but with one
			important difference: any batches of dice inside square
			brackets will be converted to an integer equal to the
			total of the dice in the batch. for example, (2d6) might
			be equal to (2, 5), but [2d7], with the same rolls,
			would be equal to 7.

	X+Y :		Basic mathematical operators are permitted and act as
			you might expect them to. However: arithemetic is
			performed on each die in a batch individually. Use
			square brackets if you need to do maths with the sum
			total of a roll. For example, 3d6+1 would give the same
			sum total as [3d6]+3.

Expressions can make use of three special variables, %X, %Y and %Z, to represent
user input, with %X, %Y and %Z interpreted as the 1st, 2nd and 3rd arguments
repectively.

Output expressions can also use all of these expressions, except for XdY,
Zr{X>Y} and Zc{X>Y}. In other words, you can't roll dice in the output
expression. However, the result of the roll expression can be accessed by using
the special variable %D. You can also include text (placed between double
quotes, e.g. "text") and perform simple actions with this text:

	%D		This will print the result of the roll expression. If
			it is a batch of dice, they will be separated by commas.

	"text".X	This will print "text" X times. This is useful for
			printing messages like "hit" or "success" by using the
			comparison operators. e.g. "hit".%D>=10 will print "hit"
			if the value of the roll expression is equal to or
			greater than 10.

	%D;"text"	Blocks of text or other output must be delimited with
			semicolons. Avoid spaces before and/or after semcolons.

The module Simple.pm allows for a simplified syntax, with only the 'd' operator
and the standard mathematical operators (+, -, * and /).