From 60078447700f346d98b7e05abeaa5ce555585b5f Mon Sep 17 00:00:00 2001 From: Flancian <0@flancia.org> Date: Thu, 30 Jul 2026 01:32:54 +0200 Subject: [PATCH] autopushed --- bin/dice.py | 39 +++++++++++++++++++++++++-------------- 1 file changed, 25 insertions(+), 14 deletions(-) diff --git a/bin/dice.py b/bin/dice.py index cabe8c217..d9617385e 100755 --- a/bin/dice.py +++ b/bin/dice.py @@ -1,20 +1,17 @@ #!/usr/bin/env python3 -# # https://click.palletsprojects.com/en/8.1.x/arguments/ # https://click.palletsprojects.com/en/8.1.x/options/ -# -# boilerplate shamelessly cloned from prime.py :). import click -import math import random import sys + class AgoraCmd(click.Command): def format_help(self, ctx, formatter): click.echo("""Usage: - Visit anagora.org/dice to execute this file in the Agora of Flancia. - - Visit e.g. anagora.org/dice/17 to throw a 17-sided die, and others :) + - Visit e.g. anagora.org/dice/20 to roll a d20 (and see rolls for all smaller dice!). - In general visit anagora.org/foo, anagora.org/foo/bar to execute e.g. from your garden. """) @@ -31,23 +28,37 @@ class AgoraCmd(click.Command): except SystemExit: sys.exit(exc.exit_code) -def rand(n): + +def roll_tower(n): proof = [] - for i in range(2, n+1): + for i in range(2, n + 1): r = random.randint(1, i) if i == 2: - proof.append(f"You throw a fair coin and it lands [[{bool(r-1) and 'heads' or 'tails'}]].") + coin = "heads" if r == 2 else "tails" + proof.append(f"Coin flip (d2): [[{coin}]].") else: - proof.append(f"You throw a die of [[{i}]] sides and it comes up [[{r}]].") - - return "\n".join(reversed(proof)) + proof.append(f"d[[{i}]] roll: [[{r}]].") + return list(reversed(proof)) + @click.command(cls=AgoraCmd) @click.argument('n', type=click.INT) def dice(n): - """A simple randomness generator, imitating those we know and love from R^4 :).""" - proof = rand(n) - click.echo(proof) + """Simulates rolling a d[[n]] die along with a polyhedral dice tower.""" + if n < 1: + click.echo("Please provide a die size of at least 1.") + return + + main_roll = random.randint(1, n) + click.echo(f"🎲 Rolling a d[[{n}]]: result is [[{main_roll}]]!\n") + + if n > 1: + click.echo(f"Dice tower rolls from d[[2]] up to d[[{n}]]:") + tower = roll_tower(n) + for line in tower: + click.echo(f" • {line}") + if __name__ == '__main__': dice() +