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:
parent
c0aa797342
commit
c4282bd237
@ -79,7 +79,7 @@ def on_rename(evt, cli, var, prefix, nick):
|
||||
PASSED.add(nick)
|
||||
|
||||
@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:
|
||||
pm(cli, GUARDED[nick], messages["protector_disappeared"])
|
||||
for dictvar in (GUARDED, LASTGUARDED):
|
||||
|
@ -61,7 +61,7 @@ def on_rename(evt, cli, var, prefix, nick):
|
||||
INVESTIGATED.add(nick)
|
||||
|
||||
@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)
|
||||
|
||||
@event_listener("get_special")
|
||||
|
@ -86,7 +86,7 @@ def on_exchange(evt, cli, var, actor, nick, actor_role, nick_role):
|
||||
mapping.pop(nick, None)
|
||||
|
||||
@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)
|
||||
for name, dictvar in _mappings:
|
||||
for k, v in list(dictvar.items()):
|
||||
|
@ -59,14 +59,14 @@ def on_player_win(evt, var, user, role, winner, survived):
|
||||
evt.data["iwon"] = True
|
||||
|
||||
@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()):
|
||||
if v.nick == nick:
|
||||
h.send(messages["hunter_discard"])
|
||||
del KILLS[h]
|
||||
elif h.nick == nick:
|
||||
del KILLS[h]
|
||||
if death_triggers and nickrole == "dullahan":
|
||||
if death_triggers and "dullahan" in allroles:
|
||||
pl = evt.data["pl"]
|
||||
targets = TARGETS[users._get(nick)].intersection(users._get(x) for x in pl) # FIXME
|
||||
if targets:
|
||||
@ -78,8 +78,8 @@ def on_del_player(evt, cli, var, nick, nickrole, nicktpls, death_triggers):
|
||||
original=evt.params.original,
|
||||
refresh_pl=evt.params.refresh_pl,
|
||||
message_prefix="dullahan_die_",
|
||||
nickrole=nickrole,
|
||||
nicktpls=nicktpls,
|
||||
killer_mainrole=mainrole,
|
||||
killer_allroles=allroles,
|
||||
prots=prots)
|
||||
while len(prots) > 0:
|
||||
# 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))
|
||||
else:
|
||||
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)))
|
||||
evt.params.del_player(cli, target, True, end_game=False, killer_role=nickrole, deadlist=evt.params.deadlist, original=evt.params.original, ismain=False)
|
||||
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="dullahan", deadlist=evt.params.deadlist, original=evt.params.original, ismain=False)
|
||||
evt.data["pl"] = evt.params.refresh_pl(pl)
|
||||
|
||||
@event_listener("night_acted")
|
||||
|
@ -141,8 +141,8 @@ def on_get_special(evt, cli, var):
|
||||
evt.data["special"].update(var.ROLES["harlot"])
|
||||
|
||||
@event_listener("del_player")
|
||||
def on_del_player(evt, cli, var, nick, nickrole, nicktpls, death_triggers):
|
||||
if nickrole != "harlot":
|
||||
def on_del_player(evt, cli, var, nick, mainrole, allroles, death_triggers):
|
||||
if "harlot" not in allroles:
|
||||
return
|
||||
if nick in VISITED:
|
||||
del VISITED[nick]
|
||||
|
@ -70,7 +70,7 @@ def hunter_pass(cli, nick, chan, rest):
|
||||
chk_nightdone(cli)
|
||||
|
||||
@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)
|
||||
PASSED.discard(nick)
|
||||
if nick in KILLS:
|
||||
|
@ -81,7 +81,7 @@ def on_rename(evt, cli, var, prefix, nick):
|
||||
SEEN.add(nick)
|
||||
|
||||
@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)
|
||||
|
||||
@event_listener("night_acted")
|
||||
|
@ -135,7 +135,7 @@ def on_see(evt, cli, var, nick, victim):
|
||||
evt.data["role"] = "wolf"
|
||||
|
||||
@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()):
|
||||
if nick in (a, b, c):
|
||||
del SHAMANS[a]
|
||||
|
@ -163,9 +163,9 @@ def on_can_exchange(evt, var, actor, nick):
|
||||
evt.stop_processing = True
|
||||
|
||||
@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
|
||||
if nickrole != "succubus":
|
||||
if "succubus" not in allroles:
|
||||
return
|
||||
if nick in VISITED:
|
||||
# if it's night, also unentrance the person they visited
|
||||
|
@ -61,7 +61,7 @@ def vigilante_pass(cli, nick, chan, rest):
|
||||
chk_nightdone(cli)
|
||||
|
||||
@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)
|
||||
if nick in KILLS:
|
||||
del KILLS[nick]
|
||||
|
@ -81,7 +81,7 @@ def on_myrole(evt, cli, var, nick):
|
||||
evt.data["messages"].append(messages["wild_child_idol"].format(IDOLS[nick]))
|
||||
|
||||
@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:
|
||||
return
|
||||
|
||||
|
@ -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)
|
||||
|
||||
@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:
|
||||
# TODO: split into cub
|
||||
if nick in var.ROLES["wolf cub"]:
|
||||
if "wolf cub" in allroles:
|
||||
var.ANGRY_WOLVES = True
|
||||
# TODO: split into alpha
|
||||
if nickrole in var.WOLF_ROLES:
|
||||
if allroles & var.WOLF_ROLES:
|
||||
var.ALPHA_ENABLED = True
|
||||
|
||||
for a,b in list(KILLS.items()):
|
||||
|
@ -2393,6 +2393,7 @@ def del_player(cli, nick, forced_death=False, devoice=True, end_game=True, death
|
||||
nickrole = get_role(nick)
|
||||
nickreveal = get_reveal_role(nick)
|
||||
nicktpls = get_templates(nick)
|
||||
allroles = {nickrole} | set(nicktpls)
|
||||
del var.MAIN_ROLES[users._get(nick)] # FIXME
|
||||
var.ROLES[nickrole].remove(nick)
|
||||
for t in nicktpls:
|
||||
@ -2493,8 +2494,8 @@ def del_player(cli, nick, forced_death=False, devoice=True, end_game=True, death
|
||||
original=original,
|
||||
refresh_pl=refresh_pl,
|
||||
message_prefix="assassin_fail_",
|
||||
nickrole=nickrole,
|
||||
nicktpls=nicktpls,
|
||||
killer_mainrole=nickrole,
|
||||
killer_allroles=allroles,
|
||||
prots=prots)
|
||||
while len(prots) > 0:
|
||||
# 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,
|
||||
deadlist=deadlist, original=original, killer_role=killer_role,
|
||||
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
|
||||
# Event priorities:
|
||||
|
Loading…
Reference in New Issue
Block a user