From d6f89adbd0b4ccc11d4c85daaa2e9ffa0a929f1d Mon Sep 17 00:00:00 2001 From: skizzerz Date: Sat, 9 May 2015 20:58:23 -0500 Subject: [PATCH] Fix error with roles by doing default game mode properly, also make game modes inherit GameMode --- src/settings.py | 40 ++++++++++++++++++++++++---------------- src/wolfgame.py | 12 ++++-------- 2 files changed, 28 insertions(+), 24 deletions(-) diff --git a/src/settings.py b/src/settings.py index c0a6fc6..a750a78 100644 --- a/src/settings.py +++ b/src/settings.py @@ -401,6 +401,7 @@ def break_long_message(phrases, joinstr = " "): class InvalidModeException(Exception): pass def game_mode(name, minp, maxp, likelihood = 0, conceal_roles = False): def decor(c): + c.name = name GAME_MODES[name] = (c, minp, maxp, likelihood, conceal_roles) return c return decor @@ -411,9 +412,16 @@ def reset_roles(index): newguide[role] = tuple([0 for i in index]) return newguide -# TODO: implement more game modes +# TODO: move this to src/gamemodes.py +class GameMode: + def startup(self): + pass + + def teardown(self): + pass + @game_mode("roles", minp = 4, maxp = 35) -class ChangedRolesMode(object): +class ChangedRolesMode(GameMode): """Example: !fgame roles=wolf:1,seer:0,guardian angel:1""" def __init__(self, arg = ""): @@ -456,14 +464,14 @@ class ChangedRolesMode(object): raise InvalidModeException("A bad value was used in mode roles.") @game_mode("default", minp = 4, maxp = 24, likelihood = 20) -class DefaultMode(object): +class DefaultMode(GameMode): """Default game mode.""" def __init__(self): # No extra settings, just an explicit way to revert to default settings pass @game_mode("foolish", minp = 8,maxp = 24, likelihood = 8) -class FoolishMode(object): +class FoolishMode(GameMode): """Contains the fool, be careful not to lynch them!""" def __init__(self): self.ROLE_INDEX = ( 8 , 9 , 10 , 11 , 12 , 15 , 17 , 20 , 21 , 22 , 24 ) @@ -491,7 +499,7 @@ class FoolishMode(object): }) @game_mode("mad", minp = 7, maxp = 22, likelihood = 8) -class MadMode(object): +class MadMode(GameMode): """This game mode has mad scientist and many things that may kill you.""" def __init__(self): self.SHOTS_MULTIPLIER = 0.0001 # gunner and sharpshooter always get 0 bullets @@ -523,7 +531,7 @@ class MadMode(object): }) @game_mode("evilvillage", minp = 6, maxp = 18, likelihood = 1) -class EvilVillageMode(object): +class EvilVillageMode(GameMode): """Majority of the village is wolf aligned, safes must secretly try to kill the wolves.""" def __init__(self): self.DEFAULT_ROLE = "cultist" @@ -575,7 +583,7 @@ class EvilVillageMode(object): @game_mode("classic", minp = 7, maxp = 21, likelihood = 4) -class ClassicMode(object): +class ClassicMode(GameMode): """Classic game mode from before all the changes.""" def __init__(self): self.ABSTAIN_ENABLED = False @@ -597,7 +605,7 @@ class ClassicMode(object): }) @game_mode("rapidfire", minp = 6, maxp = 24, likelihood = 0) -class RapidFireMode(object): +class RapidFireMode(GameMode): """Many roles that lead to multiple chain deaths.""" def __init__(self): self.SHARPSHOOTER_CHANCE = 1 @@ -629,7 +637,7 @@ class RapidFireMode(object): }) @game_mode("drunkfire", minp = 8, maxp = 17, likelihood = 0) -class DrunkFireMode(object): +class DrunkFireMode(GameMode): """Most players get a gun, quickly shoot all the wolves!""" def __init__(self): self.SHARPSHOOTER_CHANCE = 1 @@ -660,7 +668,7 @@ class DrunkFireMode(object): }) @game_mode("noreveal", minp = 4, maxp = 21, likelihood = 2) -class NoRevealMode(object): +class NoRevealMode(GameMode): """Roles are not revealed when players die.""" def __init__(self): self.ROLE_REVEAL = False @@ -687,7 +695,7 @@ class NoRevealMode(object): }) @game_mode("lycan", minp = 7, maxp = 21, likelihood = 6) -class LycanMode(object): +class LycanMode(GameMode): """Many lycans will turn into wolves. Hunt them down before the wolves overpower the village.""" def __init__(self): self.ROLE_INDEX = ( 7 , 8 , 9 , 10 , 11 , 12 , 15 , 17 , 20 ) @@ -712,7 +720,7 @@ class LycanMode(object): }) @game_mode("amnesia", minp = 10, maxp = 24, likelihood = 0) -class AmnesiaMode(object): +class AmnesiaMode(GameMode): """Everyone gets assigned a random role on night 3.""" def __init__(self): self.DEFAULT_ROLE = "cultist" @@ -725,7 +733,7 @@ class AmnesiaMode(object): }) @game_mode("valentines", minp = 8, maxp = 24, likelihood = 0) -class MatchmakerMode(object): +class MatchmakerMode(GameMode): """Love is in the air!""" def __init__(self): self.ROLE_INDEX = range(8, 25) @@ -738,7 +746,7 @@ class MatchmakerMode(object): }) @game_mode("random", minp = 8, maxp = 24, likelihood = 0, conceal_roles = True) -class RandomMode(object): +class RandomMode(GameMode): """Completely random and hidden roles.""" def __init__(self): self.AMNESIAC_NIGHTS = 1 @@ -778,7 +786,7 @@ class RandomMode(object): # Credits to Metacity for designing and current name # Blame arkiwitect for the original name of KrabbyPatty @game_mode("aleatoire", minp = 8, maxp = 24, likelihood = 4) -class AleatoireMode(object): +class AleatoireMode(GameMode): """Game mode created by Metacity and balanced by woffle.""" def __init__(self): self.SHARPSHOOTER_CHANCE = 1 @@ -829,7 +837,7 @@ class AleatoireMode(object): }) @game_mode("alpha", minp = 7, maxp = 24, likelihood = 5) -class AlphaMode(object): +class AlphaMode(GameMode): """Features the alpha wolf who can turn other people into wolves, be careful whom you trust!""" def __init__(self): self.ROLE_INDEX = ( 7 , 8 , 10 , 11 , 12 , 14 , 15 , 17 , 18 , 20 , 21 , 24 ) diff --git a/src/wolfgame.py b/src/wolfgame.py index 3c48706..64d73f1 100644 --- a/src/wolfgame.py +++ b/src/wolfgame.py @@ -84,7 +84,7 @@ var.PINGING_IFS = False var.TIMERS = {} var.ORIGINAL_SETTINGS = {} -var.CURRENT_GAMEMODE = {"name": "default"} +var.CURRENT_GAMEMODE = var.GAME_MODES["default"][0]() var.LAST_SAID_TIME = {} @@ -376,10 +376,8 @@ def pm(cli, target, message): # message either privmsg or notice, depending on cli.msg(target, message) def reset_settings(): - if hasattr(var.CURRENT_GAMEMODE, "teardown") and callable(var.CURRENT_GAMEMODE.teardown): - var.CURRENT_GAMEMODE.teardown() - - var.CURRENT_GAMEMODE = {"name": "default"} + var.CURRENT_GAMEMODE.teardown() + var.CURRENT_GAMEMODE = var.GAME_MODES["default"][0]() for attr in list(var.ORIGINAL_SETTINGS.keys()): setattr(var, attr, var.ORIGINAL_SETTINGS[attr]) dict.clear(var.ORIGINAL_SETTINGS) @@ -5881,15 +5879,13 @@ def cgamemode(cli, arg): md = modeargs.pop(0) try: gm = var.GAME_MODES[md][0](*modeargs) - if hasattr(gm, "startup") and callable(gm.startup): - gm.startup() + gm.startup() for attr in dir(gm): val = getattr(gm, attr) if (hasattr(var, attr) and not callable(val) and not attr.startswith("_")): var.ORIGINAL_SETTINGS[attr] = getattr(var, attr) setattr(var, attr, val) - gm.name = md var.CURRENT_GAMEMODE = gm return True except var.InvalidModeException as e: