fixed some bugs, and finished implementing the game over stuff
This commit is contained in:
parent
b4bac69218
commit
21db485932
79
wolfgame.py
79
wolfgame.py
@ -60,7 +60,7 @@ def reset(cli):
|
|||||||
@pmcmd("!bye", admin_only=True)
|
@pmcmd("!bye", admin_only=True)
|
||||||
@cmd("!bye", admin_only=True)
|
@cmd("!bye", admin_only=True)
|
||||||
def forced_exit(cli, nick, *rest): # Admin Only
|
def forced_exit(cli, nick, *rest): # Admin Only
|
||||||
reset_game(cli, nick, botconfig.CHANNEL, None)
|
reset(cli)
|
||||||
cli.quit("Forced quit from admin")
|
cli.quit("Forced quit from admin")
|
||||||
raise SystemExit
|
raise SystemExit
|
||||||
|
|
||||||
@ -109,7 +109,7 @@ def pinger(cli, nick, chan, rest):
|
|||||||
if user in (botconfig.NICK, nick): return # Don't ping self.
|
if user in (botconfig.NICK, nick): return # Don't ping self.
|
||||||
|
|
||||||
if vars.PINGING and 'G' not in status and '+' not in status:
|
if vars.PINGING and 'G' not in status and '+' not in status:
|
||||||
# TODO: check if the user has AWAY'D himself
|
# TODO: check if the user has !AWAY'D himself
|
||||||
TO_PING.append(user)
|
TO_PING.append(user)
|
||||||
|
|
||||||
|
|
||||||
@ -180,7 +180,7 @@ def stats(cli, nick, chan, rest):
|
|||||||
message.append("\u0002(0}\u0002 {1}".format(count, vars.plural(role)))
|
message.append("\u0002(0}\u0002 {1}".format(count, vars.plural(role)))
|
||||||
else:
|
else:
|
||||||
message.append("\u0002{0}\u0002 {1}".format(count, role))
|
message.append("\u0002{0}\u0002 {1}".format(count, role))
|
||||||
if len(vars.ROLES["wolf"]) > 1 or not vars.ROLES["wolf"]):
|
if len(vars.ROLES["wolf"]) > 1 or not vars.ROLES["wolf"]:
|
||||||
vb = "are"
|
vb = "are"
|
||||||
else:
|
else:
|
||||||
vb = "is"
|
vb = "is"
|
||||||
@ -208,6 +208,7 @@ def hurry_up(cli):
|
|||||||
elif len(voters) == max[0]:
|
elif len(voters) == max[0]:
|
||||||
found_dup = True
|
found_dup = True
|
||||||
if max[0] > 0 and not found_dup:
|
if max[0] > 0 and not found_dup:
|
||||||
|
cli.msg(chan, "The sun sets.")
|
||||||
vars.VOTES[max[1]] = [None] * votesneeded
|
vars.VOTES[max[1]] = [None] * votesneeded
|
||||||
chk_decision(cli) # Induce a lynch
|
chk_decision(cli) # Induce a lynch
|
||||||
else:
|
else:
|
||||||
@ -247,7 +248,7 @@ def show_votes(cli, nick, chan, rest):
|
|||||||
votelist = ["{0}: {1} ({2})".format(votee,
|
votelist = ["{0}: {1} ({2})".format(votee,
|
||||||
len(vars.VOTES[votee]),
|
len(vars.VOTES[votee]),
|
||||||
" ".join(vars.VOTES[votee]))
|
" ".join(vars.VOTES[votee]))
|
||||||
for votee in votes_copy.keys()]
|
for votee in vars.VOTES.keys()]
|
||||||
cli.msg(chan, "{0}: {1}".format(nick, ", ".join(votelist)))
|
cli.msg(chan, "{0}: {1}".format(nick, ", ".join(votelist)))
|
||||||
|
|
||||||
pl = vars.list_players()
|
pl = vars.list_players()
|
||||||
@ -263,7 +264,12 @@ def chk_win(cli):
|
|||||||
""" Returns True if someone won """
|
""" Returns True if someone won """
|
||||||
|
|
||||||
chan = botconfig.CHANNEL
|
chan = botconfig.CHANNEL
|
||||||
if len(vars.ROLES["wolf"]) >= len(vars.list_players()) / 2:
|
lpl = len(vars.list_players())
|
||||||
|
if lpl == 0:
|
||||||
|
cli.msg(chan, "No more players remaining. Game ended.")
|
||||||
|
reset(cli)
|
||||||
|
return True
|
||||||
|
if len(vars.ROLES["wolf"]) >= lpl / 2:
|
||||||
cli.msg(chan, ("Game over! There are the same number of wolves as "+
|
cli.msg(chan, ("Game over! There are the same number of wolves as "+
|
||||||
"villagers. The wolves eat everyone, and win."))
|
"villagers. The wolves eat everyone, and win."))
|
||||||
elif not len(vars.ROLES["wolf"]) and not vars.ROLES.get("traitor", 0):
|
elif not len(vars.ROLES["wolf"]) and not vars.ROLES.get("traitor", 0):
|
||||||
@ -275,7 +281,37 @@ def chk_win(cli):
|
|||||||
return False
|
return False
|
||||||
else:
|
else:
|
||||||
return False
|
return False
|
||||||
# TODO: Print the game time stats here
|
|
||||||
|
daymin, daysec = vars.DAY_TIMEDELTA.seconds // 60, vars.DAY_TIMEDELTA.seconds % 60
|
||||||
|
nitemin, nitesec = vars.NIGHT_TIMEDELTA.seconds // 60, vars.NIGHT_TIMEDELTA.seconds % 60
|
||||||
|
total = vars.DAY_TIMEDELTA + vars.NIGHT_TIMEDELTA
|
||||||
|
tmin, tsec = total.seconds // 60, total.seconds % 60
|
||||||
|
cli.msg(chan, ("Game lasted \u0002{0:0<2}:{1:0<2}\u0002. " +
|
||||||
|
"\u0002{2:0<2}:{3:0<2}\u0002 was day. " +
|
||||||
|
"\u0002{4:0<2}:{5:0<2}\u0002 was night. ").format(tmin, tsec,
|
||||||
|
daymin, daysec,
|
||||||
|
nitemin, nitesec))
|
||||||
|
|
||||||
|
roles_msg = []
|
||||||
|
for role in ("wolf", "seer", "harlot", "village drunk", "traitor"):
|
||||||
|
if len(vars.ORIGINAL_ROLES[role]) == 0:
|
||||||
|
continue
|
||||||
|
elif len(vars.ORIGINAL_ROLES[role]) == 2:
|
||||||
|
msg = "The {1} were \u0002{0[0]}\u0002 and \u0002{0[1]}\u0002."
|
||||||
|
roles_msg.append(msg.format(vars.ORIGINAL_ROLES[role], vars.plural(role)))
|
||||||
|
elif len(vars.ORIGINAL_ROLES[role]) == 1:
|
||||||
|
roles_msg.append("The {1} was \u0002{0[0]}\u0002.".format(vars.ORIGINAL_ROLES[role],
|
||||||
|
role))
|
||||||
|
else:
|
||||||
|
msg = "The {2} were \u0002{0}\u0002, and \u0002{1}\u0002."
|
||||||
|
nickslist = ["\u0002"+x+"\u0002" for x in vars.ORIGINAL_ROLES[role][0:-1]]
|
||||||
|
roles_msg.append(msg.format(", ".join(nickslist,
|
||||||
|
vars.ORIGINAL_ROLES[role][-1],
|
||||||
|
vars.plural(role))))
|
||||||
|
if vars.CURSED:
|
||||||
|
roles_msg.append("The cursed villager was \u0002{0}\u0002.".format(vars.CURSED))
|
||||||
|
cli.msg(chan, " ".join(roles_msg))
|
||||||
|
|
||||||
reset(cli)
|
reset(cli)
|
||||||
# TODO: Reveal roles here
|
# TODO: Reveal roles here
|
||||||
return True
|
return True
|
||||||
@ -287,19 +323,21 @@ def del_player(cli, nick, forced_death):
|
|||||||
|
|
||||||
cli.mode(botconfig.CHANNEL, "-v", "{0} {0}!*@*".format(nick))
|
cli.mode(botconfig.CHANNEL, "-v", "{0} {0}!*@*".format(nick))
|
||||||
vars.del_player(nick)
|
vars.del_player(nick)
|
||||||
if vars.PHASE != "join": # Died during the game
|
ret = True
|
||||||
|
if vars.PHASE == "join":
|
||||||
|
ret = not chk_win(cli)
|
||||||
|
if vars.PHASE != "join" and ret: # Died during the game
|
||||||
cli.mode(botconfig.CHANNEL, "+q", "{0} {0}!*@*".format(nick))
|
cli.mode(botconfig.CHANNEL, "+q", "{0} {0}!*@*".format(nick))
|
||||||
vars.DEAD.append(nick)
|
vars.DEAD.append(nick)
|
||||||
if chk_win(cli):
|
ret = not chk_win(cli)
|
||||||
return False
|
if vars.PHASE == "night" and ret:
|
||||||
if vars.PHASE == "night":
|
|
||||||
if vars.VICTIM == nick:
|
if vars.VICTIM == nick:
|
||||||
vars.VICTIM = ""
|
vars.VICTIM = ""
|
||||||
if vars.PHASE == "day" and not forced_death: # didn't die from lynching
|
if vars.PHASE == "day" and not forced_death and ret: # didn't die from lynching
|
||||||
if nick in vars.VOTES.keys():
|
if nick in vars.VOTES.keys():
|
||||||
del vars.VOTES[nick] # Delete his votes
|
del vars.VOTES[nick] # Delete his votes
|
||||||
chk_decision(cli)
|
chk_decision(cli)
|
||||||
return True
|
return ret
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -460,7 +498,7 @@ def see(cli, nick, rest):
|
|||||||
return
|
return
|
||||||
if vars.CURSED == nick:
|
if vars.CURSED == nick:
|
||||||
role = "wolf"
|
role = "wolf"
|
||||||
if vars.get_role(victim) == "traitor":
|
elif vars.get_role(victim) == "traitor":
|
||||||
role = "villager"
|
role = "villager"
|
||||||
else:
|
else:
|
||||||
role = vars.get_role(victim)
|
role = vars.get_role(victim)
|
||||||
@ -497,9 +535,16 @@ def transition_night(cli):
|
|||||||
vars.VICTIM = "" # nickname of kill victim
|
vars.VICTIM = "" # nickname of kill victim
|
||||||
vars.SEEN = [] # list of seers that have had visions
|
vars.SEEN = [] # list of seers that have had visions
|
||||||
vars.NIGHT_START_TIME = datetime.now()
|
vars.NIGHT_START_TIME = datetime.now()
|
||||||
|
|
||||||
|
daydur_msg = ""
|
||||||
|
if vars.NIGHT_TIMEDELTA: # transition from day
|
||||||
|
td = vars.NIGHT_START_TIME - vars.DAY_START_TIME
|
||||||
|
vars.DAY_TIMEDELTA += td
|
||||||
|
min, sec = td.seconds // 60, td.seconds % 60
|
||||||
|
daydur_msg = "Day lasted \u0002{0:0>2}:{1:0>2}. ".format(min,sec)
|
||||||
|
|
||||||
chan = botconfig.CHANNEL
|
chan = botconfig.CHANNEL
|
||||||
cli.msg(chan, ("It is now nighttime. All players "+
|
cli.msg(chan, (daydur_msg + "It is now nighttime. All players "+
|
||||||
"check for PMs from me for instructions. "+
|
"check for PMs from me for instructions. "+
|
||||||
"If you did not receive one, simply sit back, "+
|
"If you did not receive one, simply sit back, "+
|
||||||
"relax, and wait patiently for morning."))
|
"relax, and wait patiently for morning."))
|
||||||
@ -534,7 +579,7 @@ def transition_night(cli):
|
|||||||
cli.msg(seer, "Players: "+", ".join(pl))
|
cli.msg(seer, "Players: "+", ".join(pl))
|
||||||
|
|
||||||
for d in vars.ROLES["village drunk"]:
|
for d in vars.ROLES["village drunk"]:
|
||||||
cli.msg(d, 'You have been drinking too much! You are the village drunk.')
|
cli.msg(d, 'You have been drinking too much! You are the \u0002village drunk\u0002.')
|
||||||
|
|
||||||
@cmd("!start")
|
@cmd("!start")
|
||||||
def start(cli, nick, chan, rest):
|
def start(cli, nick, chan, rest):
|
||||||
@ -602,11 +647,9 @@ def start(cli, nick, chan, rest):
|
|||||||
"game (a theme of Mafia).").format(", ".join(vars.list_players())))
|
"game (a theme of Mafia).").format(", ".join(vars.list_players())))
|
||||||
cli.mode(chan, "+m")
|
cli.mode(chan, "+m")
|
||||||
|
|
||||||
vars.ORIGINAL_ROLES = dict(vars.ROLES) # Make a copy
|
vars.ORIGINAL_ROLES = vars.ROLES.copy() # Make a copy
|
||||||
vars.DAY_TIMEDELTA = timedelta(0)
|
vars.DAY_TIMEDELTA = timedelta(0)
|
||||||
vars.NIGHT_TIMEDELTA = timedelta(0)
|
vars.NIGHT_TIMEDELTA = timedelta(0)
|
||||||
vars.DEAD = []
|
|
||||||
vars.TIMERS = [None, None] # nightlimit, daylimit
|
|
||||||
transition_night(cli)
|
transition_night(cli)
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user