# polymorphism in action
import random
from typing import Callable, Literal
type RollDieFn = Callable[[], int]
type RollCheck = Literal["success", "failure"]
success, failure = "success", "failure"
def roll_and_check(
roll_die: RollDieFn,
*modifiers: RollDieFn,
difficulty: int
) -> RollCheck:
roll = roll_die()
print(f"main roll: {roll}")
for roll_modifier_die in modifiers:
roll_ = roll_modifier_die()
roll += roll_
print(f"modifier roll: {roll_}, total: {roll}")
if roll >= difficulty:
return success
return failure
def create_die(sides: int) -> RollDieFn:
def roll() -> int:
return random.randint(1, sides)
return roll
roll_d20 = create_die(sides=20)
roll_d4 = create_die(sides=4)
for dif in range(5, 21, 4):
print(f"difficulty: {dif}")
print(roll_and_check(
roll_d20,
roll_d4,
lambda: 6, # flat modifier
difficulty=dif
))
print()
IyBwb2x5bW9ycGhpc20gaW4gYWN0aW9uCmltcG9ydCByYW5kb20KZnJvbSB0eXBpbmcgaW1wb3J0IENhbGxhYmxlLCBMaXRlcmFsCgp0eXBlIFJvbGxEaWVGbiA9IENhbGxhYmxlW1tdLCBpbnRdCnR5cGUgUm9sbENoZWNrID0gTGl0ZXJhbFsic3VjY2VzcyIsICJmYWlsdXJlIl0Kc3VjY2VzcywgZmFpbHVyZSA9ICJzdWNjZXNzIiwgImZhaWx1cmUiCgpkZWYgcm9sbF9hbmRfY2hlY2soCiAgICAgICAgcm9sbF9kaWU6IFJvbGxEaWVGbiwKICAgICAgICAqbW9kaWZpZXJzOiBSb2xsRGllRm4sCiAgICAgICAgZGlmZmljdWx0eTogaW50CiAgICApIC0+IFJvbGxDaGVjazoKICAgIHJvbGwgPSByb2xsX2RpZSgpCiAgICBwcmludChmIm1haW4gcm9sbDoge3JvbGx9IikKICAgIAogICAgZm9yIHJvbGxfbW9kaWZpZXJfZGllIGluIG1vZGlmaWVyczoKICAgICAgICByb2xsXyA9IHJvbGxfbW9kaWZpZXJfZGllKCkKICAgICAgICByb2xsICs9IHJvbGxfCiAgICAgICAgcHJpbnQoZiJtb2RpZmllciByb2xsOiB7cm9sbF99LCB0b3RhbDoge3JvbGx9IikKICAgIAogICAgaWYgcm9sbCA+PSBkaWZmaWN1bHR5OgogICAgCXJldHVybiBzdWNjZXNzCiAgICAKICAgIHJldHVybiBmYWlsdXJlCgoKZGVmIGNyZWF0ZV9kaWUoc2lkZXM6IGludCkgLT4gUm9sbERpZUZuOgogICAgZGVmIHJvbGwoKSAtPiBpbnQ6CiAgICAgICAgcmV0dXJuIHJhbmRvbS5yYW5kaW50KDEsIHNpZGVzKQogICAgcmV0dXJuIHJvbGwKCnJvbGxfZDIwID0gY3JlYXRlX2RpZShzaWRlcz0yMCkKcm9sbF9kNCA9IGNyZWF0ZV9kaWUoc2lkZXM9NCkKCgpmb3IgZGlmIGluIHJhbmdlKDUsIDIxLCA0KToKICAgIHByaW50KGYiZGlmZmljdWx0eToge2RpZn0iKQogICAgcHJpbnQocm9sbF9hbmRfY2hlY2soCiAgICAgICAgcm9sbF9kMjAsCiAgICAgICAgcm9sbF9kNCwKICAgICAgICBsYW1iZGE6IDYsICAjIGZsYXQgbW9kaWZpZXIKICAgICAgICBkaWZmaWN1bHR5PWRpZgogICAgKSkKICAgIHByaW50KCk=
difficulty: 5
main roll: 13
modifier roll: 4, total: 17
modifier roll: 6, total: 23
success
difficulty: 9
main roll: 6
modifier roll: 4, total: 10
modifier roll: 6, total: 16
success
difficulty: 13
main roll: 1
modifier roll: 4, total: 5
modifier roll: 6, total: 11
failure
difficulty: 17
main roll: 2
modifier roll: 1, total: 3
modifier roll: 6, total: 9
failure