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)
Project details
Release history Release notifications | RSS feed
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)
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
Algorithm | Hash digest | |
---|---|---|
SHA256 | 9dbdb93336cf0692c733b9e3bbee21a90e3557fac77c9696b7360524d4ada4ac |
|
MD5 | 50c0dd107fd0d80be5a3a5d2c8a37b44 |
|
BLAKE2b-256 | 8473fd4a8170ee487ea3ff0ae08b569eae47f384e0f46da6bdb92ef971b51354 |