PING_WAIT = 300 # Seconds MINIMUM_WAIT = 0 # debug, change to 60 for normal EXTRA_WAIT = 20 MAXIMUM_WAITED = 2 # limit for amount of !wait's MAX_SHOTS = 2 DRUNK_SHOTS_MULTIPLIER = 3 NIGHT_TIME_LIMIT = 0 DAY_TIME_LIMIT = 0 # HIT MISS SUICIDE GUN_CHANCES = ( 5/7 , 1/7 , 1/7 ) DRUNK_GUN_CHANCES = ( 4/7 , 2/7 , 1/7 ) MANSLAUGHTER_CHANCE = 1/5 GAME_MODES = {} ############################################################################################ # ROLE INDEX: PLAYERS SEER WOLF CURSED DRUNK HARLOT TRAITOR GUNNER CROW # ROLES_GUIDE = { 4 : ( 0 , 1 , 0 , 0 , 0 , 0 , 2 , 0), # 6 : ( 0 , 1 , 0 , 0 , 0 , 0 , 4 , 0), # 8 : ( 1 , 2 , 1 , 1 , 1 , 0 , 0 , 0), # 10 : ( 1 , 2 , 1 , 1 , 1 , 1 , 1 , 0)} # ############################################################################################ ROLE_INDICES = {0 : "seer", 1 : "wolf", 2 : "cursed", 3 : "village drunk", 4 : "harlot", 5 : "traitor", 6 : "gunner", 7 : "werecrow"} NO_VICTIMS_MESSAGES = ("The body of a young penguin pet is found.", "A pool of blood and wolf paw prints are found.", "Traces of wolf fur are found.") LYNCH_MESSAGES = ("The villagers, after much debate, finally decide on lynching \u0002{0}\u0002, who turned out to be... a \u0002{1}\u0002.", "Under a lot of noise, the pitchfork-bearing villagers lynch \u0002{0}\u0002, who turned out to be... a \u0002{1}\u0002.", "The mob drags a protesting \u0002{0}\u0002 to the hanging tree. S/He succumbs to the will of the horde, and is hanged. It is discovered (s)he was a \u0002{1}\u0002.", "Resigned to his/her fate, \u0002{0}\u0002 is led to the gallows. After death, it is discovered (s)he was a \u0002{1}\u0002.") is_role = lambda plyr, rol: rol in ROLES and plyr in ROLES[rol] def plural(role): if role == "wolf": return "wolves" elif role == "person": return "people" else: return role + "s" def list_players(): pl = [] for x in ROLES.values(): pl.extend(x) return pl def list_players_and_roles(): plr = {} for x in ROLES.keys(): for p in ROLES[x]: plr[p] = x return plr get_role = lambda plyr: list_players_and_roles()[plyr] def del_player(pname): prole = get_role(pname) ROLES[prole].remove(pname) class InvalidModeException(object): pass def game_mode(name): def decor(c): GAME_MODES[name] = c return c return decor CHANGEABLE_ROLES = { "seer" : 0, "wolf" : 1, "drunk" : 3, "harlot" : 4, "traitor" : 5, "gunner" : 6, "werecrow" : 7 } # !game roles wolves:1 seers:0 # TODO: implement game modes @game_mode("roles") class ChangedRolesMode(object): ROLES_GUIDE = ROLES_GUIDE.copy() def __init__(self, arg): pairs = arg.split(" ") if len(parts) == 1: raise InvalidModeException("Invalid syntax for !game roles.") for pair in pairs: change = pair.split(":") if len(change) != 2: raise InvalidModeException("Invalid syntax for !game roles.") role, num = change try: num = int(num) except ValueError: raise InvalidModeException("A bad value was used in !game roles.") for x in self.ROLES_GUIDE.keys(): lx = list(x) try: lx[CHANGEABLE_ROLES[role.lower()]] = num except KeyError: raise InvalidModeException('"{0}" is not a changeable role.'.format(role)) self.ROLES_GUIDE[x] = tuple(lx) pl = list_players() if len(pl) < sum(self.ROLES_GUIDE[4]): raise InvalidModeException("Too few players for such these custom roles.")