diff --git a/area_reader/__init__.py b/area_reader/__init__.py index 4b2f3c3..4af9922 100644 --- a/area_reader/__init__.py +++ b/area_reader/__init__.py @@ -761,9 +761,15 @@ def read(cls, reader, **kwargs): return cls(number=number, sides=sides, bonus=bonus, **kwargs) def roll(self): + # ROM's dice() (src/db.c) returns 0 for size 0, and its + # number_range() clamps a degenerate range to the low bound, + # so negative sides roll 1 per die. + if self.sides == 0: + return self.bonus score = 0 + sides = max(self.sides, 1) for roll in range(self.number): - score += random.randrange(1, self.sides + 1) + score += random.randrange(1, sides + 1) score += self.bonus return score diff --git a/test_area_reader.py b/test_area_reader.py index 44b9b31..679394f 100644 --- a/test_area_reader.py +++ b/test_area_reader.py @@ -29,6 +29,16 @@ def test_dice_roll_includes_the_maximum_face(monkeypatch): assert area_reader.Dice(number=2, sides=1, bonus=3).roll() == 5 +def test_dice_roll_zero_sides_contributes_zero(): + assert area_reader.Dice(number=2, sides=0, bonus=0).roll() == 0 + assert area_reader.Dice(number=5, sides=0, bonus=7).roll() == 7 + assert area_reader.Dice().roll() == 0 + + +def test_dice_roll_negative_sides_rolls_one_per_die(): + assert area_reader.Dice(number=3, sides=-4, bonus=2).roll() == 5 + + reset_command = st.sampled_from(["M", "O", "P", "G", "E", "D", "R"]) small_int = st.integers(min_value=0, max_value=9999) rom_source_dir = Path(r"C:\Users\Q\src\Rom24b6\area")