87 lines
2.2 KiB
Python
Executable File
87 lines
2.2 KiB
Python
Executable File
#!/usr/bin/env python3
|
||
"""
|
||
roll_dice.py — Roll dice for The Chaos TTRPG.
|
||
|
||
Usage:
|
||
python3 roll_dice.py <formula> [modifier]
|
||
|
||
Formulas:
|
||
1d6 Roll 1 six-sided die
|
||
2d6 Roll 2, sum them
|
||
3d6 Roll 3, sum them
|
||
2d6x10 Roll 2d6, multiply by 10
|
||
3d6*5 Roll 3d6, multiply by 5
|
||
odds Roll 1d6, show success (4+) or failure (3-)
|
||
trait N Roll 3d6 vs trait score N — success if under
|
||
|
||
Modifier: +/- number added to total
|
||
|
||
Examples:
|
||
python3 roll.py 1d6
|
||
python3 roll_dice.py 3d6
|
||
python3 roll_dice.py 2d6x10
|
||
python3 roll_dice.py odds
|
||
python3 roll_dice.py trait 9
|
||
python3 roll_dice.py 1d6 +1
|
||
"""
|
||
|
||
import sys
|
||
import random
|
||
import re
|
||
|
||
def roll_dice(count, sides=6):
|
||
return [random.randint(1, sides) for _ in range(count)]
|
||
|
||
def main():
|
||
if len(sys.argv) < 2:
|
||
print(__doc__.strip())
|
||
sys.exit(1)
|
||
|
||
formula = sys.argv[1].lower()
|
||
modifier = 0
|
||
if len(sys.argv) >= 3:
|
||
try:
|
||
modifier = int(sys.argv[2].replace('+', ''))
|
||
except ValueError:
|
||
pass
|
||
|
||
if formula == 'odds':
|
||
r = random.randint(1, 6)
|
||
outcome = 'SUCCESS (favours character)' if r >= 4 else 'FAILURE (favours trouble)'
|
||
print(f" [{r}] → {outcome}")
|
||
return
|
||
|
||
if formula == 'trait' and len(sys.argv) >= 3:
|
||
target = int(sys.argv[2])
|
||
rolls = roll_dice(3)
|
||
total = sum(rolls)
|
||
outcome = 'SUCCESS' if total < target else 'FAILURE'
|
||
print(f" [{', '.join(map(str, rolls))}] = {total} vs trait {target} → {outcome}")
|
||
return
|
||
|
||
m = re.match(r'(\d+)d6(?:\s*([xX*])\s*(\d+))?', formula)
|
||
if not m:
|
||
print(f"Unknown formula: {formula}")
|
||
sys.exit(1)
|
||
|
||
count = int(m.group(1))
|
||
rolls = roll_dice(count)
|
||
total = sum(rolls) + modifier
|
||
|
||
mult = m.group(2)
|
||
mult_val = int(m.group(3)) if m.group(3) else 1
|
||
|
||
if mult:
|
||
total = total * mult_val
|
||
|
||
label = f"×{mult_val}" if mult else ""
|
||
mod_str = f" {'+' if modifier >= 0 else ''}{modifier}" if modifier != 0 else ""
|
||
|
||
if count > 1:
|
||
print(f" [{', '.join(map(str, rolls))}] = {sum(rolls)}{mod_str}{label} → {total}")
|
||
else:
|
||
print(f" [{rolls[0]}]{mod_str}{label} → {total}")
|
||
|
||
if __name__ == '__main__':
|
||
main()
|