Split off doomsayer's sickness too

This commit is contained in:
skizzerz 2016-08-17 12:46:16 -05:00
parent f66a1502dc
commit 457feb92de
2 changed files with 86 additions and 55 deletions

View File

@ -112,6 +112,27 @@ def on_chk_nightdone(evt, cli, var):
evt.data["actedcount"] += len(SEEN)
evt.data["nightroles"].extend(get_roles("doomsayer"))
@event_listener("abstain")
def on_abstain(evt, cli, var, nick):
if nick in SICK.values():
pm(cli, nick, messages["illness_no_vote"])
evt.prevent_default = True
@event_listener("lynch")
def on_lynch(evt, cli, var, nick):
if nick in SICK.values():
pm(cli, nick, messages["illness_no_vote"])
evt.prevent_default = True
@event_listener("get_voters")
def on_get_voters(evt, cli, var):
evt.data["voters"].difference_update(SICK.values())
@event_listener("transition_day_begin")
def on_transition_day_begin(evt, cli, var):
for victim in SICK.values():
pm(cli, victim, messages["player_sick"])
@event_listener("transition_day", priority=2)
def on_transition_day(evt, cli, var):
for k, d in list(KILLS.items()):
@ -131,9 +152,12 @@ def on_begin_day(evt, cli, var):
SEEN.clear()
KILLS.clear()
SICK.clear()
LYCANS.clear()
@event_listener("transition_night_begin")
def on_transition_night_begin(evt, cli, var):
SICK.clear()
@event_listener("reset")
def on_reset(evt, var):
SEEN.clear()

View File

@ -1986,11 +1986,14 @@ def hurry_up(cli, gameid, change):
cli.msg(chan, messages["daylight_warning"])
return
var.DAY_ID = 0
pl = list_players()
avail = len(pl) - len(var.WOUNDED | var.ASLEEP | var.CONSECRATING | var.SICK)
pl = set(list_players()) - (var.WOUNDED | var.ASLEEP | var.CONSECRATING)
evt = Event("get_voters", {"voters": pl})
evt.dispatch(cli, var)
pl = evt.data["voters"]
avail = len(pl)
votesneeded = avail // 2 + 1
not_lynching = len(var.NO_LYNCH)
@ -2025,9 +2028,6 @@ def hurry_up(cli, gameid, change):
cli.msg(chan, messages["sunset"])
transition_night(cli)
@cmd("fnight", flag="d")
def fnight(cli, nick, chan, rest):
"""Forces the day to end and night to begin."""
@ -2052,14 +2052,18 @@ def chk_decision(cli, force = ""):
if var.PHASE != "day":
return
chan = botconfig.CHANNEL
pl = list_players()
avail = len(pl) - len(var.WOUNDED | var.ASLEEP | var.CONSECRATING | var.SICK)
pl = set(list_players()) - (var.WOUNDED | var.ASLEEP | var.CONSECRATING)
evt = Event("get_voters", {"voters": pl})
evt.dispatch(cli, var)
pl = evt.data["voters"]
avail = len(pl)
votesneeded = avail // 2 + 1
not_lynching = list(var.NO_LYNCH)
deadlist = []
votelist = copy.deepcopy(var.VOTES)
for p in var.PACIFISTS:
if p in pl and p not in (var.WOUNDED | var.ASLEEP | var.CONSECRATING | var.SICK):
if p in pl:
not_lynching.append(p)
# .remove() will only remove the first instance, which means this plays nicely with pacifism countering this
@ -2072,15 +2076,11 @@ def chk_decision(cli, force = ""):
# fire off an event (right now if people want to mess with votes, they need to reimplement all the impatience/pacifism stuff)
event = Event("chk_decision", {
"avail": avail,
"votesneeded": votesneeded,
"not_lynching": not_lynching,
"votelist": votelist,
"transition_night": transition_night
})
event.dispatch(cli, var, force)
avail = event.data["avail"]
votesneeded = event.data["votesneeded"]
not_lynching = event.data["not_lynching"]
votelist = event.data["votelist"]
@ -2124,7 +2124,7 @@ def chk_decision(cli, force = ""):
numvotes = 0
random.shuffle(var.IMPATIENT)
for v in var.IMPATIENT:
if v in pl and v not in voters and v != votee and v not in (var.WOUNDED | var.ASLEEP | var.CONSECRATING | var.SICK):
if v in pl and v not in voters and v != votee:
# don't add them in if they have the same number or more of pacifism totems
# this matters for desperation totem on the votee
imp_count = var.IMPATIENT.count(v)
@ -2299,15 +2299,19 @@ def show_votes(cli, nick, chan, rest):
reply(cli, nick, chan, msg)
pl = list_players()
avail = len(pl) - len(var.WOUNDED | var.ASLEEP | var.CONSECRATING | var.SICK)
pl = set(list_players()) - (var.WOUNDED | var.ASLEEP | var.CONSECRATING)
evt = Event("get_voters", {"voters": pl})
evt.dispatch(cli, var)
pl = evt.data["voters"]
avail = len(pl)
votesneeded = avail // 2 + 1
not_voting = len(var.NO_LYNCH)
if not_voting == 1:
plural = " has"
else:
plural = "s have"
the_message = messages["vote_stats"].format(_nick, len(pl), votesneeded, avail)
the_message = messages["vote_stats"].format(_nick, len(list_players()), votesneeded, avail)
if var.ABSTAIN_ENABLED:
the_message += messages["vote_stats_abstain"].format(not_voting, plural)
@ -2665,7 +2669,8 @@ def chk_win(cli, end_game=True, winner=None):
wcroles = var.WOLF_ROLES | {"traitor"}
else:
wcroles = var.WOLFCHAT_ROLES
lwolves = len(list_players(wcroles))
wolves = set(list_players(wcroles))
lwolves = len(wolves)
lcubs = len(var.ROLES.get("wolf cub", ()))
lrealwolves = len(list_players(var.WOLF_ROLES - {"wolf cub"}))
lmonsters = len(var.ROLES.get("monster", ()))
@ -2674,16 +2679,15 @@ def chk_win(cli, end_game=True, winner=None):
lpipers = len(var.ROLES.get("piper", ()))
lsuccubi = len(var.ROLES.get("succubus", ()))
lentranced = len(var.ENTRANCED - var.DEAD)
if var.PHASE == "day":
for p in var.WOUNDED | var.ASLEEP | var.CONSECRATING | var.SICK:
try:
role = get_role(p)
if role in var.WOLFCHAT_ROLES:
lwolves -= 1
else:
lpl -= 1
except KeyError:
pass
pl = set(list_players()) - (var.WOUNDED | var.ASLEEP | var.CONSECRATING)
evt = Event("get_voters", {"voters": pl})
evt.dispatch(cli, var)
pl = evt.data["voters"]
lpl = len(pl)
lwolves = len(wolves & pl)
return chk_win_conditions(lpl, lwolves, lcubs, lrealwolves, lmonsters, ldemoniacs, ltraitors, lpipers, lsuccubi, lentranced, cli, end_game, winner)
@ -2743,10 +2747,19 @@ def chk_win_conditions(lpl, lwolves, lcubs, lrealwolves, lmonsters, ldemoniacs,
wcroles = var.WOLF_ROLES | {"traitor"}
else:
wcroles = var.WOLFCHAT_ROLES
lwolves = len(list_players(wcroles))
wolves = set(list_players(wcroles))
lwolves = len(wolves)
lcubs = len(var.ROLES.get("wolf cub", ()))
lrealwolves = len(list_players(var.WOLF_ROLES - {"wolf cub"}))
ltraitors = len(var.ROLES.get("traitor", ()))
if var.PHASE == "day":
pl = set(list_players()) - (var.WOUNDED | var.ASLEEP | var.CONSECRATING)
evt = Event("get_voters", {"voters": pl})
evt.dispatch(cli, var)
pl = evt.data["voters"]
lpl = len(pl)
lwolves = len(wolves & pl)
return chk_win_conditions(lpl, lwolves, lcubs, lrealwolves, lmonsters, ldemoniacs, ltraitors, lpipers, lsuccubi, lentranced, cli, end_game)
event = Event("chk_win", {"winner": winner, "message": message, "additional_winners": None})
@ -3162,7 +3175,6 @@ def del_player(cli, nick, forced_death=False, devoice=True, end_game=True, death
var.WOUNDED.discard(nick)
var.ASLEEP.discard(nick)
var.CONSECRATING.discard(nick)
var.SICK.discard(nick)
# note: PHASE = "day" and GAMEPHASE = "night" during transition_day;
# we only want to induce a lynch if it's actually day
if var.GAMEPHASE == "day":
@ -3526,7 +3538,7 @@ def rename_player(cli, prefix, nick):
var.EXCHANGED_ROLES[idx] = (a, b)
for setvar in (var.HEXED, var.ASLEEP, var.DESPERATE, var.REVEALED, var.SILENCED, var.TOBESILENCED,
var.REVEALED_MAYORS, var.MATCHMAKERS, var.PASSED, var.JESTERS, var.AMNESIACS,
var.INFLUENTIAL, var.LYCANTHROPES, var.TOBELYCANTHROPES, var.LUCKY, var.TOBELUCKY, var.SICK,
var.INFLUENTIAL, var.LYCANTHROPES, var.TOBELYCANTHROPES, var.LUCKY, var.TOBELUCKY,
var.DISEASED, var.TOBEDISEASED, var.RETRIBUTION, var.MISDIRECTED, var.TOBEMISDIRECTED,
var.EXCHANGED, var.IMMUNIZED, var.CURED_LYCANS, var.ALPHA_WOLVES, var.CURSED, var.CHARMERS,
var.CHARMED, var.TOBECHARMED, var.PRIESTS, var.CONSECRATING, var.ENTRANCED_DYING, var.DYING,
@ -3987,10 +3999,6 @@ def transition_day(cli, gameid=0):
var.CHARMED.update(var.TOBECHARMED)
var.TOBECHARMED.clear()
# send PMs to sick players
for victim in var.SICK:
pm(cli, victim, messages["player_sick"])
for crow, target in iter(var.OBSERVED.items()):
if crow not in var.ROLES["werecrow"]:
continue
@ -4631,6 +4639,7 @@ def chk_nightdone(cli):
def no_lynch(cli, nick, chan, rest):
"""Allows you to abstain from voting for the day."""
if chan == botconfig.CHANNEL:
evt = Event("abstain", {})
if not var.ABSTAIN_ENABLED:
cli.notice(nick, messages["command_disabled"])
return
@ -4640,6 +4649,8 @@ def no_lynch(cli, nick, chan, rest):
elif var.LIMIT_ABSTAIN and var.FIRST_DAY:
cli.notice(nick, messages["no_abstain_day_one"])
return
elif not evt.dispatch(cli, var, nick):
return
elif nick in var.WOUNDED:
cli.msg(chan, messages["wounded_no_vote"].format(nick))
return
@ -4649,9 +4660,6 @@ def no_lynch(cli, nick, chan, rest):
elif nick in var.CONSECRATING:
pm(cli, nick, messages["consecrating_no_vote"])
return
elif nick in var.SICK:
pm(cli, nick, messages["illness_no_vote"])
return
candidates = var.VOTES.keys()
for voter in list(candidates):
if nick in var.VOTES[voter]:
@ -4675,21 +4683,6 @@ def lynch(cli, nick, chan, rest):
rest = re.split(" +",rest)[0].strip()
if nick in var.WOUNDED:
cli.msg(chan, (messages["wounded_no_vote"]).format(nick))
return
if nick in var.ASLEEP:
pm(cli, nick, messages["totem_narcolepsy"])
return
if nick in var.CONSECRATING:
pm(cli, nick, messages["consecrating_no_vote"])
return
if nick in var.SICK:
pm(cli, nick, messages["illness_no_vote"])
return
var.NO_LYNCH.discard(nick)
troll = False
if ((var.CURRENT_GAMEMODE.name == "default" or var.CURRENT_GAMEMODE.name == "villagergame")
and var.VILLAGERGAME_CHANCE > 0 and len(var.ALL_PLAYERS) <= 9):
@ -4699,6 +4692,11 @@ def lynch(cli, nick, chan, rest):
if not voted:
return
evt = Event("lynch", {"target": voted})
if not evt.dispatch(cli, var, nick):
return
voted = evt.data["target"]
if not var.SELF_LYNCH_ALLOWED:
if nick == voted:
if nick in var.ROLES["fool"] | var.ROLES["jester"]:
@ -4706,6 +4704,17 @@ def lynch(cli, nick, chan, rest):
else:
cli.notice(nick, messages["save_self"])
return
if nick in var.WOUNDED:
cli.msg(chan, (messages["wounded_no_vote"]).format(nick))
return
if nick in var.ASLEEP:
pm(cli, nick, messages["totem_narcolepsy"])
return
if nick in var.CONSECRATING:
pm(cli, nick, messages["consecrating_no_vote"])
return
var.NO_LYNCH.discard(nick)
lcandidates = list(var.VOTES.keys())
for voters in lcandidates: # remove previous vote
@ -6197,7 +6206,6 @@ def transition_night(cli):
var.TOBEMISDIRECTED = set()
var.TOTEMS = {}
var.CONSECRATING = set()
var.SICK = set()
for nick in var.PRAYED:
var.PRAYED[nick][0] = 0
var.PRAYED[nick][1] = None
@ -6879,7 +6887,6 @@ def start(cli, nick, chan, forced = False, restart = ""):
var.ENTRANCED_DYING = set()
var.DYING = set()
var.PRAYED = {}
var.SICK = set()
var.DECEIVED = set()
var.DEADCHAT_PLAYERS = set()