1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
use crateequation;
use crate;
use crateInvalidExpressionError;
use Rng;
pub
/// Rolls the given dice equation.
///
/// The `input` parameter should be a string representing a valid mathematical equation that can include
/// dice notation. Dice notation should be in the format "NdM" where N is the number of dice to roll,
/// and M is the number of sides on each die. For example, "2d6" would roll two six-sided dice.
/// Dice notation can also be combined with standard mathematical operators, such as addition (+),
/// subtraction (-), multiplication (*), division (/), and exponent (^). Parentheses can also be used to group
/// sub-expressions together. For example, "10+(3+2d6*2)+3(2d20)+d2" is a valid equation that includes
/// dice notation.
///
/// # Examples
///
/// Rolling 1d4:
/// ```
/// use dice_forge::roll;
///
/// let result = roll::roll("1d4").unwrap();
/// println!("Result: {}", result);
/// ```
///
/// Rolling 2d6 a modifier:
/// ```
/// use dice_forge::roll;
///
/// let result = roll::roll("2d6+4").unwrap();
/// println!("Result: {}", result);
/// ```
///
/// Rolling a more complex equation:
/// ```
/// use dice_forge::roll;
///
/// let result = roll::roll("10+(3+2d6*2)+3(2d20)+d2").unwrap();
/// println!("Result: {}", result);
/// ```
/// Rolls the given dice equation with advantage.
///
/// The `input` parameter should be a string representing a valid mathematical equation that can include
/// dice notation. Dice notation should be in the format "NdM" where N is the number of dice to roll,
/// and M is the number of sides on each die. For example, "2d6" would roll two six-sided dice.
/// Dice notation can also be combined with standard mathematical operators, such as addition (+),
/// subtraction (-), multiplication (*), division (/), and exponent (^). Parentheses can also be used to group
/// sub-expressions together. For example, "10+(3+2d6*2)+3(2d20)+d2" is a valid equation that includes
/// dice notation.
///
/// The function rolls the given equation twice and returns the higher of the two results. This
/// emulates the "advantage" mechanic in some games, where a player can roll two dice and take the higher result.
///
/// # Examples
///
/// Rolling 1d4 with advantage:
/// ```
/// use dice_forge::roll;
///
/// let result = roll::advantage("1d4").unwrap();
/// println!("Result: {}", result);
/// ```
///
/// Rolling 2d6 with advantage and a constant modifier:
/// ```
/// use dice_forge::roll;
///
/// let result = roll::advantage("2d6+4").unwrap();
/// println!("Result: {}", result);
/// ```
///
/// Rolling a more complex equation with advantage:
/// ```
/// use dice_forge::roll;
///
/// let result = roll::advantage("10+(3+2d6*2)+3(2d20)+d2").unwrap();
/// println!("Result: {}", result);
/// ```
/// Rolls the given dice equation with disadvantage.
///
/// The `input` parameter should be a string representing a valid mathematical equation that can include
/// dice notation. Dice notation should be in the format "NdM" where N is the number of dice to roll,
/// and M is the number of sides on each die. For example, "2d6" would roll two six-sided dice.
/// Dice notation can also be combined with standard mathematical operators, such as addition (+),
/// subtraction (-), multiplication (*), division (/), and exponent (^). Parentheses can also be used to group
/// sub-expressions together. For example, "10+(3+2d6*2)+3(2d20)+d2" is a valid equation that includes
/// dice notation.
///
/// The function rolls the given equation twice and returns the lesser of the two results. This
/// emulates the "disadvantage" mechanic in some games, where a player can roll two dice and take the lesser result.
///
/// # Examples
///
/// Rolling 1d4 with disadvantage:
/// ```
/// use dice_forge::roll;
///
/// let result = roll::disadvantage("1d4").unwrap();
/// println!("Result: {}", result);
/// ```
///
/// Rolling 2d6 with disadvantage and a constant modifier:
/// ```
/// use dice_forge::roll;
///
/// let result = roll::disadvantage("2d6+4").unwrap();
/// println!("Result: {}", result);
/// ```
///
/// Rolling a more complex equation with disadvantage:
/// ```
/// use dice_forge::roll;
///
/// let result = roll::disadvantage("10+(3+2d6*2)+3(2d20)+d2").unwrap();
/// println!("Result: {}", result);
/// ```
/// Rolls the given dice equation with emphasis.
///
/// Emphasis is the idea of taking 2 rolls and using the one fartheset from the center. This can be used to create situations
/// where things can go either very right or very wrong but unlikely neutral.
///
/// # Examples
///
/// Rolling 1d4 with emphasis:
/// ```
/// use dice_forge::roll;
///
/// let result = roll::emphasis("1d4").unwrap();
/// println!("Result: {}", result);
/// ```
///
/// Rolling 2d6 with emphasis and a constant modifier:
/// ```
/// use dice_forge::roll;
///
/// let result = roll::emphasis("2d6+4").unwrap();
/// println!("Result: {}", result);
/// ```
///
/// Rolling a more complex equation with disadvantage:
/// ```
/// use dice_forge::roll;
///
/// let result = roll::emphasis("10+(3+2d6*2)+3(2d20)+d2").unwrap();
/// println!("Result: {}", result);
/// ```