158 lines
4.1 KiB
Python
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
|