diff --git a/messages/en.json b/messages/en.json index 2c4ecc9..ee3d747 100644 --- a/messages/en.json +++ b/messages/en.json @@ -683,6 +683,7 @@ "invalid_stats": "Did not recognize value \u0002{0}\u0002 for stats type. Allowed values: default, accurate, team, disabled", "invalid_abstain": "Did not recognize value \u0002{0}\u0002 for abstain. Allowed values: enabled, restricted, disabled", "lovers_win": "Game over! The remaining villagers through their inseparable love for each other have agreed to stop all of this senseless violence and coexist in peace forever more. All remaining players win.", + "everyone_died_won": "Game over! Everyone is dead, and it is in death that they realize this is what they wanted all along. They remain in the village as joyful spirits ever since. Everyone wins.", "role_disabled": "The role \u0002{0}\u0002 has been disabled.", "invalid_mode_roles": "Invalid syntax for mode roles. arg={0}", "bad_role_value": "A bad value was used in mode roles.", diff --git a/src/gamemodes.py b/src/gamemodes.py index bee4f23..c951a0f 100644 --- a/src/gamemodes.py +++ b/src/gamemodes.py @@ -114,6 +114,11 @@ class GameMode: evt.data["additional_winners"] = list(lovers) evt.data["message"] = messages["lovers_win"] + def all_dead_chk_win(self, evt, var, lpl, lwolves, lrealwolves): + if evt.data["winner"] == "no_team_wins": + evt.data["winner"] = "everyone" + evt.data["message"] = messages["everyone_died_won"] + @game_mode("roles", minp = 4, maxp = 35) class ChangedRolesMode(GameMode): """Example: !fgame roles=wolf:1,seer:0,guardian angel:1""" @@ -408,6 +413,12 @@ class RapidFireMode(GameMode): "sharpshooter" : ( 0 , 0 , 1 , 1 , 1 , 1 , 1 ), }) + def startup(self): + events.add_listener("chk_win", self.all_dead_chk_win) + + def teardown(self): + events.remove_listener("chk_win", self.all_dead_chk_win) + @game_mode("drunkfire", minp = 8, maxp = 17, likelihood = 0) class DrunkFireMode(GameMode): """Most players get a gun, quickly shoot all the wolves!""" @@ -440,6 +451,12 @@ class DrunkFireMode(GameMode): "sharpshooter" : ( 2 , 2 , 3 , 3 , 4 ), }) + def startup(self): + events.add_listener("chk_win", self.all_dead_chk_win) + + def teardown(self): + events.remove_listener("chk_win", self.all_dead_chk_win) + @game_mode("noreveal", minp = 4, maxp = 21, likelihood = 2) class NoRevealMode(GameMode): """Roles are not revealed when players die.""" diff --git a/src/wolfgame.py b/src/wolfgame.py index 59d2d9c..4edda78 100644 --- a/src/wolfgame.py +++ b/src/wolfgame.py @@ -2630,6 +2630,8 @@ def stop_game(cli, winner="", abort=False, additional_winners=None, log=True): iwon = True elif winner == "succubi" and splr in var.ENTRANCED | var.ROLES["succubus"]: iwon = True + elif winner == "everyone" and not survived: + iwon = True # nobody survived but an event made everyone win elif not iwon: iwon = won and splr in survived # survived, team won = individual win