class Role: def __init__(self, game): self.game = game self.copy = self def setPlayer(self, player): self.player = player async def phase1(self): # query stuff + doppelganger simulation pass async def phase2(self): # werewolf stuff + seer info pass async def phase3(self): # robber simulation & info pass async def phase4(self): # troublemaker simulation pass async def phase5(self): # mostly sending info + drunk simulation pass @staticmethod def match(message, game): for role_class in Role.role_set: if message.casefold() == role_class.name(): return role_class(game) @classmethod def name(cls): return cls.__name__.casefold() def __str__(self): return self.name() class Doppelganger(Role): order = 1 class Werewolf(Role): order = 2 def setPlayer(self, player): super().setPlayer(player) self.game.werewolf_list.append(player) async def phase2(self): if len(self.game.werewolf_list) >= 2: await self.player.send("Werewolves: " + str(self.game.werewolf_list)) else: await self.player.send("You are the only werewolf") await self.player.send("Which card in the middle do you want to look at?") self.choice = await self.player.get_choice(["left", "middle", "right"]) await self.player.send("A card in the middle is: " + self.game.middle_card[self.choice].name()) class Minion(Role): order = 3 async def phase2(self): if len(self.game.werewolf_list) == 0: await self.player.send("There were no werewolves so you became one") else: await self.player.send("Werewolves: " + str(self.game.werewolf_list)) class Mason(Role): order = 4 def setPlayer(self, player): super().setPlayer(player) self.game.mason_list.append(player) async def phase2(self): await self.player.send("Mason " + str(self.game.mason_list)) class Seer(Role): order = 5 async def phase1(self): await self.player.send("Which 1 player card or 2 middle cards do you want to look at?") self.choice = await self.player.get_choice(self.player.other() + ["left & middle", "middle & right", "left & right"]) async def phase2(self): if self.choice < len(self.player.other()): await self.player.send(self.player.other()[self.choice].night_role) else: self.choice -= len(self.player.other()) if self.choice == 0: a, b = 0, 1 elif self.choice == 1: a, b = 1, 2 else: a, b = 0, 2 await self.player.send(str(self.game.middle_card[a]) + " " + str(self.game.middle_card[b])) class Robber(Role): order = 6 async def phase1(self): await self.player.send("Which player do you want to rob?") self.choice = await self.player.get_choice(self.player.other()) async def phase3(self): Player.swap(self.player, self.player.other()[self.choice]) await self.player.send("You robbed: " + str(self.player.day_role)) class Troublemaker(Role): order = 7 async def phase1(self): await self.player.send("Who do you want to exchange? (send two separate numbers)") self.A = await self.player.get_choice(self.player.other()) self.B = await self.player.get_choice(self.player.other()) async def phase4(self): Player.swap(self.player.other()[self.A], self.player.other()[self.B]) # receive conformation await self.player.send("Received " + str(self.A) + " " + str(self.B)) class Drunk(Role): order = 8 async def phase1(self): await self.player.send("Which card from the middle do you want to take?") self.choice = await self.player.get_choice(["left", "middle", "right"]) async def phase5(self): self.player.day_role, self.game.middle_card[self.choice] = self.game.middle_card[self.choice], self.player.day_role #receive conformation await self.player.send("Received " + str(self.choice)) class Insomniac(Role): order = 9 async def phase5(self): await self.player.send("You are now: " + str(self.player.day_role)) class Villiager(Role): order = 10 class Tanner(Role): order = 11 class Hunter(Role): order = 12 class No_role(Role): order = 1000 Role.role_set = [Doppelganger, Werewolf, Minion, Mason, Seer, Robber, Troublemaker, Drunk, Insomniac, Villiager, Tanner, Hunter]