13dice/dicelib.py

158 lines
4.1 KiB
Python

from random import randint, choice, seed
from input_assist import ichoiced_input, iyes_or_no
class Die:
def __init__(self, ai):
self.ai = ai
self.die_id = "Die"
self.spec = False
def roll(self):
return (self.die_id, choice(self.possible_values))
@classmethod
def multiple(cls, count):
return [cls() for _ in range(count)]
class Deck:
def __init__(self, *dice, **kwargs):
try:
self.dice = [d for d in dice[0]]
except TypeError:
self.dice = dice
if "ai" in kwargs:
for die in self.dice:
die.ai = kwargs["ai"]
def roll(self, print_func=print, ai=False):
dice_list = []
for die in self.dice:
r = die.roll()
if die.spec and (r[1] in die.spec_results):
if ai:
r = (die.die_id, die.handle_ai(r, dice_list))
else:
print_func(dice_list)
r = (die.die_id, die.handle_input(r[1]))
dice_list.append(r)
return dice_list
@staticmethod
def sum(roll_result):
return sum([x[1] for x in roll_result])
@staticmethod
def as_str(roll_result):
paren_result = ', '.join([str(x[1]) for x in roll_result])
return f"{Deck.sum(roll_result)} ({paren_result})"
class QueueDeck(Deck):
def __init__(self, *dice, **kwargs):
super().__init__(*dice, **kwargs)
def roll(self, prompt, print_func=print, exit_check=None):
q = self.dice.copy()
dice_list = []
while die := q.pop():
r = die.roll()
if die.spec and (r[1] in die.spec_results):
r = (die.die_id, die.handle_input(r[1]))
dice_list.append(r)
if len(q) < 1:
break
# else:
# print_func(dice_list)
if exit_check is not None:
if exit_check(dice_list):
break
print_func(dice_list)
c = iyes_or_no(prompt, default_pos=True)
if c is None:
return None
if not c:
break
return dice_list
class AceDie(Die):
def __init__(self, ai=None):
if ai:
super().__init__(ai)
self.die_id = "AceDie"
self.possible_values = [1]
self.spec = True
self.spec_results = [1]
def handle_input(self, r):
r = int(ichoiced_input(
"Ace!",
("1", "6"))
)
if r is None:
exit()
return r
class AdvancedDie(Die):
def __init__(self, ai=None):
if ai:
super().__init__(ai)
self.die_id = "AdvancedDie"
self.possible_values = [1, 2, 3, 4, 5, 6]
self.spec = True
self.spec_results = [6]
def roll(self):
return (self.die_id, choice(self.possible_values))
def handle_input(self, r):
if r == 6:
r = int(ichoiced_input(
"Advanced die just rolled a 6! What would you like?",
("1", "6"))
)
if r is None:
exit()
return r
def handle_ai(self, r, dice_list):
print(f"REACHED AI: {r}, {dice_list}")
return self.ai(r, dice_list)
class BasicDie(Die):
def __init__(self, ai=None):
if ai:
super().__init__(ai)
self.die_id = "BasicDie"
self.possible_values = [1, 2, 3, 4, 5, 6]
self.spec = False
self.spec_results = []
class BlankDie(Die):
def __init__(self, ai=None):
if ai:
super().__init__(ai)
self.die_id = "BlankDie"
self.possible_values = [1, 2, 3, 4, 0, 0]
self.spec = True
self.spec_results = [0]
def handle_input(self, r):
if r in self.spec_results:
r = ichoiced_input(
"Blank die rolled a blank side! What would you like?",
("5", "6"))
if r is not None:
r = int(r)
else:
exit()
return r