Skip to main content

A simple python DSL for dice.

Project description

dicebox

A simple dsl for dice.

>>> import pandas as pd
>>> from dicebox import d
>>> d(100) + 5
<DiceExpr(1d100 + 5)>
>>> str(d(6) + d(6)) == str(d({6: 2})) == str(d(6, 6)) == "(2d6)"
True
>>> d(8, 6, 6, 6) // 2
<DiceExpr((1d8 + 3d6) // 2)>
>>> d({8: 1, 6: 3})
<Dice(1d8 + 3d6)>
>>> d(10) + 5 + (d(20) + d(8))
<DiceExpr(1d10 + 5 + 1d8 + 1d20)>
>>> d(20).adv.roll(2)
array([17, 17])
>>> n = 100000
>>> adv = (pd.Series(d(20).adv.roll(n)).value_counts().sort_index() / n)
>>> disadv = (pd.Series(d(20).disadv.roll(n)).value_counts().sort_index() / n)
>>> norm = (pd.Series(d(20).roll(n)).value_counts().sort_index() / n)
>>> (d(20).adv - d(20).disadv) * 2
<DiceExpr((adv(1d20) - disadv(1d20)) * 2)>

todo:

  • better batching
  • pdist (incl composability)
  • thresholding
  • roll logging
  • right-operations (e.g. 2 * d(6))
  • better expr collapse
  • DiceExpr.parse
  • visual output (w/ scavegr)
  • DnD numeric output (& batching)

>>> from dicebox.dnd import attack_roll_factory, critical_roll
>>> rapier_attack = attack_roll_factory("Rapier", d(8) + 4, 3)
>>> rapier_sneak_attack = attack_roll_factory("Rapier", d(8, 6, 6, 6) + 4, 3)
>>> rapier_assassinate_attack = attack_roll_factory("Rapier", critical_roll(d(8, 6, 6, 6) + 4), 3, critical_hits=False)
>>> for i in range(20):
>>>    print(rapier_assassinate_attack(adv=True))
Rapier: 17 to hit (adv(1d20) + 3); 39 damage (2d8 + 6d6 + 4)
Rapier: 17 to hit (adv(1d20) + 3); 36 damage (2d8 + 6d6 + 4)
Rapier: 12 to hit (adv(1d20) + 3); 25 damage (2d8 + 6d6 + 4)
Rapier: 21 to hit (adv(1d20) + 3); 37 damage (2d8 + 6d6 + 4)
Rapier: 10 to hit (adv(1d20) + 3); 32 damage (2d8 + 6d6 + 4)
Rapier: 22 to hit (adv(1d20) + 3); 36 damage (2d8 + 6d6 + 4)
Rapier: 17 to hit (adv(1d20) + 3); 37 damage (2d8 + 6d6 + 4)
Rapier: 14 to hit (adv(1d20) + 3); 29 damage (2d8 + 6d6 + 4)
Rapier: 10 to hit (adv(1d20) + 3); 39 damage (2d8 + 6d6 + 4)
Rapier: 15 to hit (adv(1d20) + 3); 37 damage (2d8 + 6d6 + 4)
Rapier: 23 to hit (adv(1d20) + 3); 27 damage (2d8 + 6d6 + 4)
Rapier: 8 to hit (adv(1d20) + 3); 36 damage (2d8 + 6d6 + 4)
Rapier: 15 to hit (adv(1d20) + 3); 31 damage (2d8 + 6d6 + 4)
Rapier: 20 to hit (adv(1d20) + 3); 38 damage (2d8 + 6d6 + 4)
Rapier: 12 to hit (adv(1d20) + 3); 34 damage (2d8 + 6d6 + 4)
Rapier: 15 to hit (adv(1d20) + 3); 31 damage (2d8 + 6d6 + 4)
Rapier: 18 to hit (adv(1d20) + 3); 35 damage (2d8 + 6d6 + 4)
Rapier: 14 to hit (adv(1d20) + 3); 41 damage (2d8 + 6d6 + 4)
Rapier: 21 to hit (adv(1d20) + 3); 38 damage (2d8 + 6d6 + 4)
Rapier: 19 to hit (adv(1d20) + 3); 34 damage (2d8 + 6d6 + 4)
>>> turn = [rapier_sneak_attack(), rapier_attack()]
>>> print("\n".join(turn))
Rapier: 19 to hit (1d20 + 3); 9 damage (1d8 + 3d6 + 4)
Rapier: 9 to hit (1d20 + 3); 5 damage (1d8 + 4)

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

dicebox-0.1.0.tar.gz (4.5 kB view details)

Uploaded Source

File details

Details for the file dicebox-0.1.0.tar.gz.

File metadata

  • Download URL: dicebox-0.1.0.tar.gz
  • Upload date:
  • Size: 4.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.22.0 setuptools/45.2.0.post20200210 requests-toolbelt/0.9.1 tqdm/4.36.1 CPython/3.7.3

File hashes

Hashes for dicebox-0.1.0.tar.gz
Algorithm Hash digest
SHA256 9dbdb93336cf0692c733b9e3bbee21a90e3557fac77c9696b7360524d4ada4ac
MD5 50c0dd107fd0d80be5a3a5d2c8a37b44
BLAKE2b-256 8473fd4a8170ee487ea3ff0ae08b569eae47f384e0f46da6bdb92ef971b51354

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page