Fix bug where game might end early when multiple people are killed at night

This commit is contained in:
jacob1 2014-01-02 19:18:16 -05:00
parent 113064ac45
commit 4c213e077b

View File

@ -832,7 +832,7 @@ def stop_game(cli, winner = ""):
return True
def chk_win(cli):
def chk_win(cli, end_game = True):
""" Returns True if someone won """
chan = botconfig.CHANNEL
@ -855,28 +855,19 @@ def chk_win(cli):
lwolves -= len([x for x in var.WOUNDED if x in var.ROLES["traitor"]])
if lwolves == lpl / 2:
cli.msg(chan, ("Game over! There are the same number of wolves as " +
"uninjured villagers. The wolves overpower the villagers and win."))
var.LOGGER.logMessage(("Game over! There are the same number of wolves as "+
"uninjured villagers. The wolves overpower the villagers and win."))
message = ("Game over! There are the same number of wolves as " +
"uninjured villagers. The wolves overpower the villagers and win.")
village_win = False
var.LOGGER.logBare("WOLVES", "WIN")
elif lwolves > lpl / 2:
cli.msg(chan, ("Game over! There are more wolves than "+
"uninjured villagers. The wolves overpower the villagers and win."))
var.LOGGER.logMessage(("Game over! There are more wolves than "+
"uninjured villagers. The wolves overpower the villagers and win."))
message = ("Game over! There are more wolves than "+
"uninjured villagers. The wolves overpower the villagers and win.")
village_win = False
var.LOGGER.logBare("WOLVES", "WIN")
elif (not var.ROLES["wolf"] and
not var.ROLES["traitor"] and
not var.ROLES["werecrow"]):
cli.msg(chan, ("Game over! All the wolves are dead! The villagers "+
"chop them up, BBQ them, and have a hearty meal."))
var.LOGGER.logMessage(("Game over! All the wolves are dead! The villagers "+
"chop them up, BBQ them, and have a hearty meal."))
message = ("Game over! All the wolves are dead! The villagers " +
"chop them up, BBQ them, and have a hearty meal.")
village_win = True
var.LOGGER.logBare("VILLAGERS", "WIN")
elif (not var.ROLES["wolf"] and not
var.ROLES["werecrow"] and var.ROLES["traitor"]):
for t in var.ROLES["traitor"]:
@ -888,9 +879,13 @@ def chk_win(cli):
var.LOGGER.logMessage(('The villagers, during their celebrations, are '+
'frightened as they hear a loud howl. The wolves are '+
'not gone!'))
return chk_win(cli)
return chk_win(cli, end_game)
else:
return False
if end_game:
cli.msg(chan, message)
var.LOGGER.logMessage(message)
var.LOGGER.logBare("VILLAGERS" if village_win else "WOLVES", "WIN")
stop_game(cli, "villagers" if village_win else "wolves")
return True
@ -898,7 +893,7 @@ def chk_win(cli):
def del_player(cli, nick, forced_death = False, devoice = True):
def del_player(cli, nick, forced_death = False, devoice = True, end_game = True):
"""
Returns: False if one side won.
arg: forced_death = True when lynched or when the seer/wolf both don't act
@ -921,14 +916,14 @@ def del_player(cli, nick, forced_death = False, devoice = True):
# Died during the joining process as a person
mass_mode(cli, cmode)
return not chk_win(cli)
if var.PHASE != "join" and ret:
if var.PHASE != "join":
# Died during the game, so quiet!
if not is_fake_nick(nick):
cmode.append(("+q", nick+"!*@*"))
mass_mode(cli, cmode)
if nick not in var.DEAD:
var.DEAD.append(nick)
ret = not chk_win(cli)
ret = not chk_win(cli, end_game)
if var.PHASE in ("night", "day") and ret:
# remove the player from variables if they're in there
for a,b in list(var.KILLS.items()):
@ -1441,8 +1436,10 @@ def transition_day(cli, gameid=0):
cli.msg(chan, "\n".join(message))
for msg in message:
var.LOGGER.logMessage(msg.replace("\02", ""))
for deadperson in dead:
if not del_player(cli, deadperson):
for deadperson in dead: # kill each player, but don't end the game if one group outnumbers another
del_player(cli, deadperson, end_game = False)
if chk_win(cli): # if after the last person is killed, one side wins, then actually end the game here
return
if (var.WOLF_STEALS_GUN and victim in dead and