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:

  • pdist (incl composability)
  • roll logging
  • better expr collapse (sympy?)
  • better DiceExpr str rendering
  • DiceExpr.parse
  • visual output (w/ scavegr)

>>> 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.2.0.tar.gz (4.7 kB view details)

Uploaded Source

File details

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

File metadata

  • Download URL: dicebox-0.2.0.tar.gz
  • Upload date:
  • Size: 4.7 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.2.0.tar.gz
Algorithm Hash digest
SHA256 626ddd17c8108d01c1bd5da801cbec178c5f4f4f036f60dab9c7e730596762cb
MD5 d4bf380f5329c118bf508f17f02e5c67
BLAKE2b-256 601478da15e2ac611dad91917de7bb44709396a27ef5e1aab8e4891cec33c9d0

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