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