Finish up most new totems except for exchange and retribution, completely untested code so probably breaks horribly

This commit is contained in:
Skizzerz 2014-08-04 01:22:29 -05:00
parent 21ef130f21
commit 79a72aa33e

View File

@ -1177,7 +1177,7 @@ def stop_game(cli, winner = ""):
elif splr in var.VENGEFUL_GHOSTS and var.VENGEFUL_GHOSTS[splr] == "wolves" and winner == "villagers": elif splr in var.VENGEFUL_GHOSTS and var.VENGEFUL_GHOSTS[splr] == "wolves" and winner == "villagers":
won = True won = True
iwon = True iwon = True
elif rol == "lycan": elif rol == "lycan" or splr in var.LYCANS:
if splr in var.LYCANS and winner == "wolves": if splr in var.LYCANS and winner == "wolves":
won = True won = True
elif splr not in var.LYCANS and winner == "villagers": elif splr not in var.LYCANS and winner == "villagers":
@ -1984,6 +1984,7 @@ def begin_day(cli):
# Reset nighttime variables # Reset nighttime variables
var.ANGRY_WOLVES = False var.ANGRY_WOLVES = False
var.DISEASED_WOLVES = False
var.GAMEPHASE = "day" var.GAMEPHASE = "day"
var.KILLS = {} # nicknames of kill victims (wolves only) var.KILLS = {} # nicknames of kill victims (wolves only)
var.OTHER_KILLS = {} # other kill victims (hunter/vengeful ghost/death totem) var.OTHER_KILLS = {} # other kill victims (hunter/vengeful ghost/death totem)
@ -2153,10 +2154,20 @@ def transition_day(cli, gameid=0):
victim = random.choice(dups) victim = random.choice(dups)
victims.append(victim) victims.append(victim)
bywolves.add(victim) bywolves.add(victim)
onlybywolves.add(victim)
for monster in var.ROLES["monster"]: for monster in var.ROLES["monster"]:
if monster in victims: if monster in victims:
victims.remove(monster) victims.remove(monster)
bywolves.discard(monster)
onlybywolves.discard(monster)
wolfghostvictims = []
for ghost, target in var.VENGEFUL_GHOSTS.items():
if target == "villagers":
victim = var.OTHER_KILLS[ghost]
if victim not in var.DYING: # wolf ghost killing ghost will take precedence over everything except death totem and elder
wolfghostvictims.append(victim)
for d in list(var.OTHER_KILLS.values()) + var.DYING: for d in list(var.OTHER_KILLS.values()) + var.DYING:
victims.append(d) victims.append(d)
@ -2252,10 +2263,11 @@ def transition_day(cli, gameid=0):
novictmsg = False novictmsg = False
bywolves.discard(victim) bywolves.discard(victim)
onlybywolves.discard(victim) onlybywolves.discard(victim)
elif victim in var.ROLES["lycan"] and victim in onlybywolves: elif (victim in var.ROLES["lycan"] or victim in var.LYCANTHROPES) and victim in onlybywolves:
message.append("A chilling howl was heard last night, it appears there is another werewolf in our midst!") message.append("A chilling howl was heard last night, it appears there is another werewolf in our midst!")
pm(cli, victim, 'HOOOOOOOOOWL. You have become... a wolf!') pm(cli, victim, 'HOOOOOOOOOWL. You have become... a wolf!')
var.ROLES["lycan"].remove(victim) vrole = var.get_role(victim)
var.ROLES[vrole].remove(victim)
var.ROLES["wolf"].append(victim) var.ROLES["wolf"].append(victim)
var.LYCANS.append(victim) var.LYCANS.append(victim)
wolves = var.list_players(var.WOLFCHAT_ROLES) wolves = var.list_players(var.WOLFCHAT_ROLES)
@ -2346,7 +2358,7 @@ def transition_day(cli, gameid=0):
var.LOGGER.logBare(gangel, "KILLEDWHENGUARDINGWOLF") var.LOGGER.logBare(gangel, "KILLEDWHENGUARDINGWOLF")
dead.append(gangel) dead.append(gangel)
for victim in copy.copy(dead): for victim in list(dead):
if victim in var.GUNNERS.keys() and var.GUNNERS[victim] > 0 and victim in bywolves: if victim in var.GUNNERS.keys() and var.GUNNERS[victim] > 0 and victim in bywolves:
if random.random() < var.GUNNER_KILLS_WOLF_AT_NIGHT_CHANCE: if random.random() < var.GUNNER_KILLS_WOLF_AT_NIGHT_CHANCE:
wc = var.ROLES["werecrow"][:] wc = var.ROLES["werecrow"][:]
@ -2367,6 +2379,9 @@ def transition_day(cli, gameid=0):
var.GUNNERS[victim] -= 1 # deduct the used bullet var.GUNNERS[victim] -= 1 # deduct the used bullet
for victim in dead: for victim in dead:
if victim in bywolves and victim in var.DISEASED:
var.DISEASED_WOLVES = True
if var.WOLF_STEALS_GUN and victim in bywolves and victim in var.GUNNERS.keys() and var.GUNNERS[victim] > 0: if var.WOLF_STEALS_GUN and victim in bywolves and victim in var.GUNNERS.keys() and var.GUNNERS[victim] > 0:
# victim has bullets # victim has bullets
while True: while True:
@ -2394,7 +2409,7 @@ def transition_day(cli, gameid=0):
for deadperson in dead: # kill each player, but don't end the game if one group outnumbers another for deadperson in dead: # kill each player, but don't end the game if one group outnumbers another
# take a shortcut for killer_role here since vengeful ghost only cares about team and not particular roles # take a shortcut for killer_role here since vengeful ghost only cares about team and not particular roles
# this will have to be modified to track the actual killer if that behavior changes # this will have to be modified to track the actual killer if that behavior changes
del_player(cli, deadperson, end_game = False, killer_role = "wolf" if deadperson in onlybywolves else "villager") del_player(cli, deadperson, end_game = False, killer_role = "wolf" if deadperson in onlybywolves or deadperson in wolfghostvictims else "villager")
if chk_win(cli): # if after the last person is killed, one side wins, then actually end the game here if chk_win(cli): # if after the last person is killed, one side wins, then actually end the game here
return return
@ -2415,6 +2430,9 @@ def chk_nightdone(cli):
actedcount += len(var.MATCHMAKERS + list(var.CLONED.keys())) actedcount += len(var.MATCHMAKERS + list(var.CLONED.keys()))
nightroles += var.ROLES["matchmaker"] + var.ROLES["clone"] nightroles += var.ROLES["matchmaker"] + var.ROLES["clone"]
if var.DISEASED_WOLVES:
nightroles = [p for p in nightroles if p not in var.ROLES["wolf"]]
for p in var.HUNTERS: for p in var.HUNTERS:
# only remove one instance of their name if they have used hunter ability, in case they have templates # only remove one instance of their name if they have used hunter ability, in case they have templates
# the OTHER_KILLS check ensures we only remove them if they acted in a *previous* night # the OTHER_KILLS check ensures we only remove them if they acted in a *previous* night
@ -2427,21 +2445,22 @@ def chk_nightdone(cli):
playercount = len(nightroles) playercount = len(nightroles)
if var.PHASE == "night" and actedcount >= playercount: if var.PHASE == "night" and actedcount >= playercount:
# flatten var.KILLS if not var.DISEASED_WOLVES:
kills = set() # flatten var.KILLS
for ls in var.KILLS.values(): kills = set()
if not isinstance(ls, str): for ls in var.KILLS.values():
for v in ls: if not isinstance(ls, str):
kills.add(v) for v in ls:
else: kills.add(v)
kills.add(ls) else:
# check if wolves are actually agreeing kills.add(ls)
# allow len(kills) == 0 through as that means that crow was dumb and observed instead # check if wolves are actually agreeing
# of killing or something, or weird cases where there are no wolves at night # allow len(kills) == 0 through as that means that crow was dumb and observed instead
if not var.ANGRY_WOLVES and len(kills) > 1: # of killing or something, or weird cases where there are no wolves at night
return if not var.ANGRY_WOLVES and len(kills) > 1:
elif var.ANGRY_WOLVES and (len(kills) == 1 or len(kills) > 2): return
return elif var.ANGRY_WOLVES and (len(kills) == 1 or len(kills) > 2):
return
for x, t in var.TIMERS.items(): for x, t in var.TIMERS.items():
t[0].cancel() t[0].cancel()
@ -2526,6 +2545,53 @@ def vote(cli, nick, chann_, rest):
chk_decision(cli) chk_decision(cli)
# chooses a target given nick, taking luck totem/misdirection totem into effect
# returns the actual target
def choose_target(actor, nick):
pl = var.list_players()
if actor in var.MISDIRECTED:
i = var.ALL_PLAYERS.index(nick)
if random.randint(0, 1) == 0:
# going left
while True:
i -= 1
if i < 0:
i = len(var.ALL_PLAYERS) - 1
if var.ALL_PLAYERS[i] in pl:
nick = var.ALL_PLAYERS[i]
break
else:
# going right
while True:
i += 1
if i >= len(var.ALL_PLAYERS):
i = 0
if var.ALL_PLAYERS[i] in pl:
nick = var.ALL_PLAYERS[i]
break
if nick in var.LUCKY:
i = var.ALL_PLAYERS.index(nick)
if random.randint(0, 1) == 0:
# going left
while True:
i -= 1
if i < 0:
i = len(var.ALL_PLAYERS) - 1
if var.ALL_PLAYERS[i] in pl:
nick = var.ALL_PLAYERS[i]
break
else:
# going right
while True:
i += 1
if i >= len(var.ALL_PLAYERS):
i = 0
if var.ALL_PLAYERS[i] in pl:
nick = var.ALL_PLAYERS[i]
break
return nick
@cmd("retract") @cmd("retract")
def retract(cli, nick, chann_, rest): def retract(cli, nick, chann_, rest):
"""Takes back your vote during the day (for whom to lynch)""" """Takes back your vote during the day (for whom to lynch)"""
@ -2636,6 +2702,9 @@ def shoot(cli, nick, chann_, rest):
cli.notice(nick, "You are holding it the wrong way.") cli.notice(nick, "You are holding it the wrong way.")
return return
# get actual victim
victim = choose_target(nick, victim)
wolfshooter = nick in var.list_players(var.WOLFCHAT_ROLES) wolfshooter = nick in var.list_players(var.WOLFCHAT_ROLES)
if wolfshooter and nick in var.WOLF_GUNNERS: if wolfshooter and nick in var.WOLF_GUNNERS:
@ -2745,7 +2814,10 @@ def kill(cli, nick, rest):
pm(cli, nick, "You have already killed someone this game.") pm(cli, nick, "You have already killed someone this game.")
return return
if nick in var.SILENCED: if nick in var.SILENCED:
pm(cli, nick, "You have been silenced, and are unable to use any special powers") pm(cli, nick, "You have been silenced, and are unable to use any special powers.")
return
if role in ("wolf", "werecrow") and var.DISEASED_WOLVES:
pm(cli, nick, "You are feeling ill, and are unable to kill anyone tonight.")
return return
pieces = [p.strip().lower() for p in re.split(" +",rest)] pieces = [p.strip().lower() for p in re.split(" +",rest)]
victim = pieces[0] victim = pieces[0]
@ -2828,13 +2900,18 @@ def kill(cli, nick, rest):
pm(cli, nick, "You should select two different players.") pm(cli, nick, "You should select two different players.")
return return
else: else:
var.KILLS[nick] = [victim, victim2] rv = choose_target(nick, victim)
rv2 = choose_target(nick, victim2)
var.KILLS[nick] = [rv, rv2]
else: else:
var.KILLS[nick] = [victim] rv = choose_target(nick, victim)
var.KILLS[nick] = [rv]
else: else:
var.KILLS[nick] = victim rv = choose_target(nick, victim)
var.KILLS[nick] = rv
else: else:
var.OTHER_KILLS[nick] = victim rv = choose_target(nick, victim)
var.OTHER_KILLS[nick] = rv
if role == "hunter": if role == "hunter":
var.HUNTERS.append(nick) var.HUNTERS.append(nick)
if nick in var.PASSED: if nick in var.PASSED:
@ -2874,8 +2951,7 @@ def guard(cli, nick, rest):
pm(cli, nick, "Not enough parameters") pm(cli, nick, "Not enough parameters")
return return
if var.GUARDED.get(nick): if var.GUARDED.get(nick):
pm(cli, nick, ("You are already protecting "+ pm(cli, nick, "You are already protecting someone tonight.")
"\u0002{0}\u0002.").format(var.GUARDED[nick]))
return return
if role == "guardian angel" and var.LASTGUARDED.get(nick) == victim: if role == "guardian angel" and var.LASTGUARDED.get(nick) == victim:
pm(cli, nick, ("You protected \u0002{0}\u0002 last night. " + pm(cli, nick, ("You protected \u0002{0}\u0002 last night. " +
@ -2902,11 +2978,12 @@ def guard(cli, nick, rest):
if nick in var.LASTGUARDED: if nick in var.LASTGUARDED:
del var.LASTGUARDED[nick] del var.LASTGUARDED[nick]
pm(cli, nick, "You have chosen not to guard anyone tonight.") pm(cli, nick, "You have chosen not to guard anyone tonight.")
elif role == "guardian angel": elif role == "guardian angel": # choosing to guard self bypasses lucky/misdirection
var.GUARDED[nick] = nick var.GUARDED[nick] = nick
var.LASTGUARDED[nick] = nick var.LASTGUARDED[nick] = nick
pm(cli, nick, "You have decided to guard yourself tonight.") pm(cli, nick, "You have decided to guard yourself tonight.")
else: else:
victim = choose_target(nick, victim)
var.GUARDED[nick] = victim var.GUARDED[nick] = victim
var.LASTGUARDED[nick] = victim var.LASTGUARDED[nick] = victim
pm(cli, nick, "You are protecting \u0002{0}\u0002 tonight. Farewell!".format(var.GUARDED[nick])) pm(cli, nick, "You are protecting \u0002{0}\u0002 tonight. Farewell!".format(var.GUARDED[nick]))
@ -2974,6 +3051,7 @@ def observe(cli, nick, rest):
else: else:
pm(cli, nick, "Observing another wolf is a waste of time.") pm(cli, nick, "Observing another wolf is a waste of time.")
return return
victim = choose_target(nick, victim)
var.OBSERVED[nick] = victim var.OBSERVED[nick] = victim
if nick in var.KILLS.keys(): if nick in var.KILLS.keys():
del var.KILLS[nick] del var.KILLS[nick]
@ -2985,7 +3063,7 @@ def observe(cli, nick, rest):
vrole = var.get_role(victim) vrole = var.get_role(victim)
if vrole == "amnesiac": if vrole == "amnesiac":
vrole = var.FINAL_ROLES[victim] vrole = var.FINAL_ROLES[victim]
if vrole in ("seer", "oracle", "augur"): if vrole in ("seer", "oracle", "augur", "sorcerer"):
an = "n" if vrole[0] in ("a", "e", "i", "o", "u") else "" an = "n" if vrole[0] in ("a", "e", "i", "o", "u") else ""
pm(cli, nick, ("After casting your ritual, you determine that \u0002{0}\u0002 " + pm(cli, nick, ("After casting your ritual, you determine that \u0002{0}\u0002 " +
"is a{1} \u0002{2}\u0002!").format(victim, an, vrole)) "is a{1} \u0002{2}\u0002!").format(victim, an, vrole))
@ -3038,6 +3116,7 @@ def investigate(cli, nick, rest):
pm(cli, nick, "Investigating yourself would be a waste.") pm(cli, nick, "Investigating yourself would be a waste.")
return return
victim = choose_target(nick, victim)
var.INVESTIGATED.append(nick) var.INVESTIGATED.append(nick)
vrole = var.get_role(victim) vrole = var.get_role(victim)
if vrole == "amnesiac": if vrole == "amnesiac":
@ -3095,6 +3174,7 @@ def hvisit(cli, nick, rest):
var.HVISITED[nick] = None var.HVISITED[nick] = None
pm(cli, nick, "You have chosen to stay home for the night.") pm(cli, nick, "You have chosen to stay home for the night.")
else: else:
victim = choose_target(nick, victim)
var.HVISITED[nick] = victim var.HVISITED[nick] = victim
pm(cli, nick, ("You are spending the night with \u0002{0}\u0002. "+ pm(cli, nick, ("You are spending the night with \u0002{0}\u0002. "+
"Have a good time!").format(var.HVISITED[nick])) "Have a good time!").format(var.HVISITED[nick]))
@ -3149,6 +3229,7 @@ def see(cli, nick, rest):
if victim == nick: if victim == nick:
pm(cli, nick, "Seeing yourself would be a waste.") pm(cli, nick, "Seeing yourself would be a waste.")
return return
victim = choose_target(nick, victim)
victimrole = var.get_role(victim) victimrole = var.get_role(victim)
if victimrole == "amnesiac": if victimrole == "amnesiac":
victimrole = var.FINAL_ROLES[victim] victimrole = var.FINAL_ROLES[victim]
@ -3221,6 +3302,7 @@ def give(cli, nick, rest):
type = "" type = ""
if role == "shaman": if role == "shaman":
type = " of " + var.TOTEMS[nick] type = " of " + var.TOTEMS[nick]
victim = choose_target(nick, victim)
pm(cli, nick, ("You have given a totem{0} to \u0002{1}\u0002.").format(type, victim)) pm(cli, nick, ("You have given a totem{0} to \u0002{1}\u0002.").format(type, victim))
totem = var.TOTEMS[nick] totem = var.TOTEMS[nick]
if totem == "death" and victim not in var.DYING: if totem == "death" and victim not in var.DYING:
@ -3443,6 +3525,7 @@ def target(cli, nick, rest):
pm(cli, nick, "You may not target yourself.") pm(cli, nick, "You may not target yourself.")
return return
victim = choose_target(nick, victim)
var.TARGETED[nick] = victim var.TARGETED[nick] = victim
pm(cli, nick, "You have selected \u0002{0}\u0002 as your target.".format(victim)) pm(cli, nick, "You have selected \u0002{0}\u0002 as your target.".format(victim))
@ -3497,6 +3580,7 @@ def hex(cli, nick, rest):
pm(cli, nick, "You may not target yourself.") pm(cli, nick, "You may not target yourself.")
return return
victim = choose_target(nick, victim)
vrole = var.get_role(victim) vrole = var.get_role(victim)
if vrole in var.WOLFCHAT_ROLES: if vrole in var.WOLFCHAT_ROLES:
pm(cli, nick, "Hexing another wolf would be a waste.") pm(cli, nick, "Hexing another wolf would be a waste.")
@ -3777,7 +3861,9 @@ def transition_night(cli):
pm(cli, wolf, "Players: " + ", ".join(pl)) pm(cli, wolf, "Players: " + ", ".join(pl))
if wolf in var.WOLF_GUNNERS.keys() and var.WOLF_GUNNERS[wolf] > 0: if wolf in var.WOLF_GUNNERS.keys() and var.WOLF_GUNNERS[wolf] > 0:
pm(cli, wolf, "You have a \u0002gun\u0002 with {0} bullet{1}.".format(var.WOLF_GUNNERS[wolf], "s" if var.WOLF_GUNNERS[wolf] > 1 else "")) pm(cli, wolf, "You have a \u0002gun\u0002 with {0} bullet{1}.".format(var.WOLF_GUNNERS[wolf], "s" if var.WOLF_GUNNERS[wolf] > 1 else ""))
if var.ANGRY_WOLVES and role in ("wolf", "werecrow"): if var.DISEASED_WOLVES:
pm(cli, wolf, 'You are feeling ill tonight, and are unable to kill anyone.')
elif var.ANGRY_WOLVES and role in ("wolf", "werecrow"):
pm(cli, wolf, 'You are \u0002angry\u0002 tonight, and may kill two targets by using "kill <nick1> and <nick2>"') pm(cli, wolf, 'You are \u0002angry\u0002 tonight, and may kill two targets by using "kill <nick1> and <nick2>"')
for seer in var.list_players(["seer", "oracle", "augur"]): for seer in var.list_players(["seer", "oracle", "augur"]):
@ -4257,6 +4343,7 @@ def start(cli, nick, chann_, rest):
var.NIGHT_COUNT = 0 var.NIGHT_COUNT = 0
var.DAY_COUNT = 0 var.DAY_COUNT = 0
var.ANGRY_WOLVES = False var.ANGRY_WOLVES = False
var.DISEASED_WOLVES = False
var.FINAL_ROLES = {} var.FINAL_ROLES = {}
var.ORIGINAL_LOVERS = {} var.ORIGINAL_LOVERS = {}
var.IMPATIENT = [] var.IMPATIENT = []