Allow everyone dying in {rapid,drunk}fire to make them all win
I could have avoided the two-liner in src/wolfgame.py, but it's much more cleaner that way, even if it's not in src/gamemodes.py To have the code in src/gamemodes.py means we'd have duplicated code (and thus increased the chance of random bugs, as well as maintenance burden). And practicality beats purity.
This commit is contained in:
parent
b76b214374
commit
f38735d5a1
@ -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.",
|
||||
|
@ -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."""
|
||||
|
@ -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
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user