Fix wolf cub not working

The dead player is already removed from var.ROLES by the time the event
fires. Also, tweak del_player event to make it much easier to support
arbitrary roles as not being the player's main role by changing nicktpls
to allroles (which is a set that includes mainrole). The assassinate
event is similarly tweaked.
This commit is contained in:
skizzerz 2017-07-20 14:19:04 -05:00
parent c0aa797342
commit c4282bd237
13 changed files with 25 additions and 24 deletions

View File

@ -79,7 +79,7 @@ def on_rename(evt, cli, var, prefix, nick):
PASSED.add(nick) PASSED.add(nick)
@event_listener("del_player") @event_listener("del_player")
def on_del_player(evt, cli, var, nick, nickrole, nicktpls, death_triggers): def on_del_player(evt, cli, var, nick, mainrole, allroles, death_triggers):
if var.PHASE == "night" and nick in GUARDED: if var.PHASE == "night" and nick in GUARDED:
pm(cli, GUARDED[nick], messages["protector_disappeared"]) pm(cli, GUARDED[nick], messages["protector_disappeared"])
for dictvar in (GUARDED, LASTGUARDED): for dictvar in (GUARDED, LASTGUARDED):

View File

@ -61,7 +61,7 @@ def on_rename(evt, cli, var, prefix, nick):
INVESTIGATED.add(nick) INVESTIGATED.add(nick)
@event_listener("del_player") @event_listener("del_player")
def on_del_player(evt, cli, var, nick, nickrole, nicktpls, death_triggers): def on_del_player(evt, cli, var, nick, mainrole, allroles, death_triggers):
INVESTIGATED.discard(nick) INVESTIGATED.discard(nick)
@event_listener("get_special") @event_listener("get_special")

View File

@ -86,7 +86,7 @@ def on_exchange(evt, cli, var, actor, nick, actor_role, nick_role):
mapping.pop(nick, None) mapping.pop(nick, None)
@event_listener("del_player") @event_listener("del_player")
def on_del_player(evt, cli, var, nick, nickrole, nicktpls, death_triggers): def on_del_player(evt, cli, var, nick, mainrole, allroles, death_triggers):
SEEN.discard(nick) SEEN.discard(nick)
for name, dictvar in _mappings: for name, dictvar in _mappings:
for k, v in list(dictvar.items()): for k, v in list(dictvar.items()):

View File

@ -59,14 +59,14 @@ def on_player_win(evt, var, user, role, winner, survived):
evt.data["iwon"] = True evt.data["iwon"] = True
@event_listener("del_player") @event_listener("del_player")
def on_del_player(evt, cli, var, nick, nickrole, nicktpls, death_triggers): def on_del_player(evt, cli, var, nick, mainrole, allroles, death_triggers):
for h, v in list(KILLS.items()): for h, v in list(KILLS.items()):
if v.nick == nick: if v.nick == nick:
h.send(messages["hunter_discard"]) h.send(messages["hunter_discard"])
del KILLS[h] del KILLS[h]
elif h.nick == nick: elif h.nick == nick:
del KILLS[h] del KILLS[h]
if death_triggers and nickrole == "dullahan": if death_triggers and "dullahan" in allroles:
pl = evt.data["pl"] pl = evt.data["pl"]
targets = TARGETS[users._get(nick)].intersection(users._get(x) for x in pl) # FIXME targets = TARGETS[users._get(nick)].intersection(users._get(x) for x in pl) # FIXME
if targets: if targets:
@ -78,8 +78,8 @@ def on_del_player(evt, cli, var, nick, nickrole, nicktpls, death_triggers):
original=evt.params.original, original=evt.params.original,
refresh_pl=evt.params.refresh_pl, refresh_pl=evt.params.refresh_pl,
message_prefix="dullahan_die_", message_prefix="dullahan_die_",
nickrole=nickrole, killer_mainrole=mainrole,
nicktpls=nicktpls, killer_allroles=allroles,
prots=prots) prots=prots)
while len(prots) > 0: while len(prots) > 0:
# an event can read the current active protection and cancel the totem # an event can read the current active protection and cancel the totem
@ -95,8 +95,8 @@ def on_del_player(evt, cli, var, nick, nickrole, nicktpls, death_triggers):
cli.msg(botconfig.CHANNEL, messages["dullahan_die_success"].format(nick, target, an, role)) cli.msg(botconfig.CHANNEL, messages["dullahan_die_success"].format(nick, target, an, role))
else: else:
cli.msg(botconfig.CHANNEL, messages["dullahan_die_success_noreveal"].format(nick, target)) cli.msg(botconfig.CHANNEL, messages["dullahan_die_success_noreveal"].format(nick, target))
debuglog("{0} ({1}) DULLAHAN ASSASSINATE: {2} ({3})".format(nick, nickrole, target, get_role(target))) debuglog("{0} (dullahan) DULLAHAN ASSASSINATE: {1} ({2})".format(nick, target, get_role(target)))
evt.params.del_player(cli, target, True, end_game=False, killer_role=nickrole, deadlist=evt.params.deadlist, original=evt.params.original, ismain=False) evt.params.del_player(cli, target, True, end_game=False, killer_role="dullahan", deadlist=evt.params.deadlist, original=evt.params.original, ismain=False)
evt.data["pl"] = evt.params.refresh_pl(pl) evt.data["pl"] = evt.params.refresh_pl(pl)
@event_listener("night_acted") @event_listener("night_acted")

View File

@ -141,8 +141,8 @@ def on_get_special(evt, cli, var):
evt.data["special"].update(var.ROLES["harlot"]) evt.data["special"].update(var.ROLES["harlot"])
@event_listener("del_player") @event_listener("del_player")
def on_del_player(evt, cli, var, nick, nickrole, nicktpls, death_triggers): def on_del_player(evt, cli, var, nick, mainrole, allroles, death_triggers):
if nickrole != "harlot": if "harlot" not in allroles:
return return
if nick in VISITED: if nick in VISITED:
del VISITED[nick] del VISITED[nick]

View File

@ -70,7 +70,7 @@ def hunter_pass(cli, nick, chan, rest):
chk_nightdone(cli) chk_nightdone(cli)
@event_listener("del_player") @event_listener("del_player")
def on_del_player(evt, cli, var, nick, nickrole, nicktpls, death_triggers): def on_del_player(evt, cli, var, nick, mainrole, allroles, death_triggers):
HUNTERS.discard(nick) HUNTERS.discard(nick)
PASSED.discard(nick) PASSED.discard(nick)
if nick in KILLS: if nick in KILLS:

View File

@ -81,7 +81,7 @@ def on_rename(evt, cli, var, prefix, nick):
SEEN.add(nick) SEEN.add(nick)
@event_listener("del_player") @event_listener("del_player")
def on_del_player(evt, cli, var, nick, nickrole, nicktpls, death_triggers): def on_del_player(evt, cli, var, nick, mainrole, allroles, death_triggers):
SEEN.discard(nick) SEEN.discard(nick)
@event_listener("night_acted") @event_listener("night_acted")

View File

@ -135,7 +135,7 @@ def on_see(evt, cli, var, nick, victim):
evt.data["role"] = "wolf" evt.data["role"] = "wolf"
@event_listener("del_player") @event_listener("del_player")
def on_del_player(evt, cli, var, nick, nickrole, nicktpls, death_triggers): def on_del_player(evt, cli, var, nick, mainrole, allroles, death_triggers):
for a,(b,c) in list(SHAMANS.items()): for a,(b,c) in list(SHAMANS.items()):
if nick in (a, b, c): if nick in (a, b, c):
del SHAMANS[a] del SHAMANS[a]

View File

@ -163,9 +163,9 @@ def on_can_exchange(evt, var, actor, nick):
evt.stop_processing = True evt.stop_processing = True
@event_listener("del_player") @event_listener("del_player")
def on_del_player(evt, cli, var, nick, nickrole, nicktpls, death_triggers): def on_del_player(evt, cli, var, nick, mainrole, allroles, death_triggers):
global ALL_SUCC_IDLE global ALL_SUCC_IDLE
if nickrole != "succubus": if "succubus" not in allroles:
return return
if nick in VISITED: if nick in VISITED:
# if it's night, also unentrance the person they visited # if it's night, also unentrance the person they visited

View File

@ -61,7 +61,7 @@ def vigilante_pass(cli, nick, chan, rest):
chk_nightdone(cli) chk_nightdone(cli)
@event_listener("del_player") @event_listener("del_player")
def on_del_player(evt, cli, var, nick, nickrole, nicktpls, death_triggers): def on_del_player(evt, cli, var, nick, mainrole, allroles, death_triggers):
PASSED.discard(nick) PASSED.discard(nick)
if nick in KILLS: if nick in KILLS:
del KILLS[nick] del KILLS[nick]

View File

@ -81,7 +81,7 @@ def on_myrole(evt, cli, var, nick):
evt.data["messages"].append(messages["wild_child_idol"].format(IDOLS[nick])) evt.data["messages"].append(messages["wild_child_idol"].format(IDOLS[nick]))
@event_listener("del_player") @event_listener("del_player")
def on_del_player(evt, cli, var, nick, nickrole, nicktpls, death_triggers): def on_del_player(evt, cli, var, nick, mainrole, allroles, death_triggers):
if var.PHASE not in var.GAME_PHASES: if var.PHASE not in var.GAME_PHASES:
return return

View File

@ -96,13 +96,13 @@ def wolf_retract(cli, nick, chan, rest):
relay_wolfchat_command(cli, nick, messages["wolfchat_no_bite"].format(nick), ("alpha wolf",), is_wolf_command=True) relay_wolfchat_command(cli, nick, messages["wolfchat_no_bite"].format(nick), ("alpha wolf",), is_wolf_command=True)
@event_listener("del_player") @event_listener("del_player")
def on_del_player(evt, cli, var, nick, nickrole, nicktpls, death_triggers): def on_del_player(evt, cli, var, nick, mainrole, allroles, death_triggers):
if death_triggers: if death_triggers:
# TODO: split into cub # TODO: split into cub
if nick in var.ROLES["wolf cub"]: if "wolf cub" in allroles:
var.ANGRY_WOLVES = True var.ANGRY_WOLVES = True
# TODO: split into alpha # TODO: split into alpha
if nickrole in var.WOLF_ROLES: if allroles & var.WOLF_ROLES:
var.ALPHA_ENABLED = True var.ALPHA_ENABLED = True
for a,b in list(KILLS.items()): for a,b in list(KILLS.items()):

View File

@ -2393,6 +2393,7 @@ def del_player(cli, nick, forced_death=False, devoice=True, end_game=True, death
nickrole = get_role(nick) nickrole = get_role(nick)
nickreveal = get_reveal_role(nick) nickreveal = get_reveal_role(nick)
nicktpls = get_templates(nick) nicktpls = get_templates(nick)
allroles = {nickrole} | set(nicktpls)
del var.MAIN_ROLES[users._get(nick)] # FIXME del var.MAIN_ROLES[users._get(nick)] # FIXME
var.ROLES[nickrole].remove(nick) var.ROLES[nickrole].remove(nick)
for t in nicktpls: for t in nicktpls:
@ -2493,8 +2494,8 @@ def del_player(cli, nick, forced_death=False, devoice=True, end_game=True, death
original=original, original=original,
refresh_pl=refresh_pl, refresh_pl=refresh_pl,
message_prefix="assassin_fail_", message_prefix="assassin_fail_",
nickrole=nickrole, killer_mainrole=nickrole,
nicktpls=nicktpls, killer_allroles=allroles,
prots=prots) prots=prots)
while len(prots) > 0: while len(prots) > 0:
# an event can read the current active protection and cancel the assassination # an event can read the current active protection and cancel the assassination
@ -2653,7 +2654,7 @@ def del_player(cli, nick, forced_death=False, devoice=True, end_game=True, death
forced_death=forced_death, end_game=end_game, forced_death=forced_death, end_game=end_game,
deadlist=deadlist, original=original, killer_role=killer_role, deadlist=deadlist, original=original, killer_role=killer_role,
ismain=ismain, refresh_pl=refresh_pl, del_player=del_player) ismain=ismain, refresh_pl=refresh_pl, del_player=del_player)
event.dispatch(cli, var, nick, nickrole, nicktpls, evt_death_triggers) event.dispatch(cli, var, nick, nickrole, allroles, evt_death_triggers)
# update var.ROLE_STATS # update var.ROLE_STATS
# Event priorities: # Event priorities: