|
@@ -181,8 +181,11 @@ class Dices:
|
|
|
if self.result:
|
|
|
buffer = ""
|
|
|
|
|
|
- for count, sides, roll in self._rolls:
|
|
|
- buffer += f"{'' if count == 1 else count}d{sides}: {roll}\n"
|
|
|
+ for count, sides, roll, is_range in self._rolls:
|
|
|
+ if is_range:
|
|
|
+ buffer += f"{count}..{sides}: {roll}\n"
|
|
|
+ else:
|
|
|
+ buffer += f"{'' if count == 1 else count}d{sides}: {roll}\n"
|
|
|
|
|
|
for roll, result in zip(self.rolls, self.result):
|
|
|
count, sides, roll = roll
|
|
@@ -261,7 +264,7 @@ class Dices:
|
|
|
|
|
|
roll = Value(await _roll(left, right))
|
|
|
|
|
|
- self._rolls.append((left, right, roll))
|
|
|
+ self._rolls.append((left, right, roll, False))
|
|
|
|
|
|
return roll
|
|
|
|
|
@@ -310,11 +313,26 @@ class Dices:
|
|
|
left = await self._parse_atom()
|
|
|
|
|
|
if op := self._match(T_OP):
|
|
|
+ is_range = op[0] == ".."
|
|
|
op = OPS[op[0]]
|
|
|
right = await self._parse_expr()
|
|
|
|
|
|
- if inspect.iscoroutinefunction(op):
|
|
|
- left = Value(await op(int(left), int(right)))
|
|
|
+ if is_range or inspect.iscoroutinefunction(op):
|
|
|
+ left = int(left)
|
|
|
+ right = int(right)
|
|
|
+
|
|
|
+ try:
|
|
|
+ r = await op(left, right)
|
|
|
+ except Exception:
|
|
|
+ r = 0
|
|
|
+
|
|
|
+ if not isinstance(r, Value):
|
|
|
+ r = Value(r)
|
|
|
+
|
|
|
+ if is_range:
|
|
|
+ self._rolls.append((left, right, r, True))
|
|
|
+
|
|
|
+ left = r
|
|
|
else:
|
|
|
left = left.apply(op, right)
|
|
|
elif self._match(T_COLON):
|