fix dice parser allow adding dices
This commit is contained in:
parent
d0ee7a5e3e
commit
184cb23739
6 changed files with 45 additions and 13 deletions
|
@ -19,7 +19,7 @@ class DiceCog(commands.Cog):
|
||||||
for index, die in enumerate(die_result.dies):
|
for index, die in enumerate(die_result.dies):
|
||||||
roll_fields.append(
|
roll_fields.append(
|
||||||
(
|
(
|
||||||
f"- #{index+1} 🎲 ",
|
f"- #{index+1} 🎲 {die.type}{die.die_number}",
|
||||||
f"Res: {die.result}, Mod: {die.modifier}, Rolls: {die.rolls}",
|
f"Res: {die.result}, Mod: {die.modifier}, Rolls: {die.rolls}",
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
@ -47,7 +47,7 @@ class DiceCog(commands.Cog):
|
||||||
die_result: DieExpressionResult = DiceRoller.roll(dice_expression)
|
die_result: DieExpressionResult = DiceRoller.roll(dice_expression)
|
||||||
|
|
||||||
embed = disnake.Embed(
|
embed = disnake.Embed(
|
||||||
title="",
|
title=f"{die_result.total} !!",
|
||||||
description=f"{dice_expression} = {die_result.total}",
|
description=f"{dice_expression} = {die_result.total}",
|
||||||
timestamp=datetime.now(),
|
timestamp=datetime.now(),
|
||||||
)
|
)
|
||||||
|
|
|
@ -13,6 +13,7 @@ class DieRollResult:
|
||||||
result: int
|
result: int
|
||||||
modifier: int
|
modifier: int
|
||||||
rolls: typing.List[int]
|
rolls: typing.List[int]
|
||||||
|
die_number: int
|
||||||
type: str
|
type: str
|
||||||
|
|
||||||
|
|
||||||
|
@ -66,6 +67,7 @@ class DiceRoller:
|
||||||
result=die.get("result"),
|
result=die.get("result"),
|
||||||
rolls=die.get("rolls"),
|
rolls=die.get("rolls"),
|
||||||
type=die.get("type"),
|
type=die.get("type"),
|
||||||
|
die_number=die.get("die_number"),
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
return DieExpressionResult(total=result.get("total"), dies=dies)
|
return DieExpressionResult(total=result.get("total"), dies=dies)
|
||||||
|
|
|
@ -8,12 +8,14 @@ DIE_GRAMMAR = """
|
||||||
@@grammar::Die
|
@@grammar::Die
|
||||||
@@whitespace :: None
|
@@whitespace :: None
|
||||||
|
|
||||||
start = die:die ~ {op:operator die:die} $;
|
start = die:die {op:operator die:die} $;
|
||||||
|
|
||||||
die = [number_of_dies:number] die_type:die_type die_number:number [modifier:die_modifier];
|
die = [number_of_dies:number] die_type:die_type die_number:number [modifier:die_modifier];
|
||||||
die_modifier = op:operator modifier:number;
|
die_modifier = op:modifier_operator modifier:number;
|
||||||
|
|
||||||
operator = '+' | '-' | 'adv' | 'dis';
|
|
||||||
|
modifier_operator = '+' | '-';
|
||||||
|
operator = 'add' | 'sub' | 'adv' | 'dis';
|
||||||
|
|
||||||
die_type = 'd' | 'zd';
|
die_type = 'd' | 'zd';
|
||||||
|
|
||||||
|
|
|
@ -27,9 +27,9 @@ class DieSemantics:
|
||||||
right = die_results.popleft()
|
right = die_results.popleft()
|
||||||
operator = operators.popleft()
|
operator = operators.popleft()
|
||||||
total = 0
|
total = 0
|
||||||
if operator == "+":
|
if operator == "add":
|
||||||
total = left + right
|
total = left + right
|
||||||
if operator == "-":
|
if operator == "sub":
|
||||||
total = left - right
|
total = left - right
|
||||||
if operator == "adv":
|
if operator == "adv":
|
||||||
total = max(left, right)
|
total = max(left, right)
|
||||||
|
@ -64,6 +64,7 @@ class DieSemantics:
|
||||||
|
|
||||||
return {
|
return {
|
||||||
"result": max(sum(rolls) + die_modifier, minimum_value_for_die),
|
"result": max(sum(rolls) + die_modifier, minimum_value_for_die),
|
||||||
|
"die_number": die_number,
|
||||||
"type": die_type,
|
"type": die_type,
|
||||||
"rolls": rolls,
|
"rolls": rolls,
|
||||||
"modifier": die_modifier,
|
"modifier": die_modifier,
|
||||||
|
|
|
@ -7,12 +7,16 @@ def test_format_die_result_to_message():
|
||||||
DieExpressionResult(
|
DieExpressionResult(
|
||||||
total=25,
|
total=25,
|
||||||
dies=[
|
dies=[
|
||||||
DieRollResult(result=10, modifier=5, rolls=[10], type="d"),
|
DieRollResult(
|
||||||
DieRollResult(result=15, modifier=0, rolls=[10, 5], type="d"),
|
result=10, modifier=5, rolls=[10], type="d", die_number=20
|
||||||
|
),
|
||||||
|
DieRollResult(
|
||||||
|
result=15, modifier=0, rolls=[10, 5], type="d", die_number=20
|
||||||
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
assert message == [
|
assert message == [
|
||||||
("- #1 🎲 ", "Res: 10, Mod: 5, Rolls: [10]"),
|
("- #1 🎲 d20", "Res: 10, Mod: 5, Rolls: [10]"),
|
||||||
("- #2 🎲 ", "Res: 15, Mod: 0, Rolls: [10, 5]"),
|
("- #2 🎲 d20", "Res: 15, Mod: 0, Rolls: [10, 5]"),
|
||||||
]
|
]
|
||||||
|
|
|
@ -55,6 +55,29 @@ def test_die_roller_die_roll_simple(expression, range_min, range_max, dice_rolle
|
||||||
assert range_min <= result <= range_max
|
assert range_min <= result <= range_max
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize(
|
||||||
|
"expression, range_min, range_max",
|
||||||
|
[
|
||||||
|
# normal roll
|
||||||
|
("d20 add d20", 1, 40),
|
||||||
|
("d20+0 add d20", 1, 40),
|
||||||
|
("d20+0 adv d20", 1, 20),
|
||||||
|
("d20+0 adv 2d20", 1, 40),
|
||||||
|
("d20+0 adv 2zd20", 1, 40),
|
||||||
|
("d20+0 dis 2d12", 1, 20),
|
||||||
|
("d20+0 add 2d20+2", 1, 62),
|
||||||
|
("zd20+0 add 2d20+2", 1, 62),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
def test_die_roller_die_roll_compound_simple(
|
||||||
|
expression, range_min, range_max, dice_roller
|
||||||
|
):
|
||||||
|
# let the dies roll...
|
||||||
|
for i in range(100):
|
||||||
|
result = dice_roller.roll_simple(expression)
|
||||||
|
assert range_min <= result <= range_max
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize(
|
@pytest.mark.parametrize(
|
||||||
"expression, range_min, range_max",
|
"expression, range_min, range_max",
|
||||||
[
|
[
|
||||||
|
@ -124,6 +147,6 @@ def test_die_roller_die_parsing_fail(expression, dice_roller):
|
||||||
|
|
||||||
def test_die_roller_roll(dice_roller):
|
def test_die_roller_roll(dice_roller):
|
||||||
for i in range(100):
|
for i in range(100):
|
||||||
result = dice_roller.roll("d20 + d20 adv d20+5 dis d12+3")
|
result = dice_roller.roll("d20 add d20 adv d20+5 dis d12+3")
|
||||||
assert 1 <= result.total <= 15
|
assert 1 <= result.total <= 15
|
||||||
assert len(result.dies) == 4
|
assert len(result.dies) == 4
|
||||||
|
|
Loading…
Reference in a new issue