Update event listeners for del_player

This commit is contained in:
Vgr E. Barry 2017-09-18 16:35:09 -04:00
parent 39dfd2095f
commit 89cabd933b
10 changed files with 43 additions and 44 deletions

View File

@ -1143,9 +1143,9 @@ class SleepyMode(GameMode):
if mainrole == "priest":
pl = evt.data["pl"]
turn_chance = 3/4
seers = [p for p in get_all_players(("seer",)) if p.nick in pl and random.random() < turn_chance]
harlots = [p for p in get_all_players(("harlot",)) if p.nick in pl and random.random() < turn_chance]
cultists = [p for p in get_all_players(("cultist",)) if p.nick in pl and random.random() < turn_chance]
seers = [p for p in get_all_players(("seer",)) if p in pl and random.random() < turn_chance]
harlots = [p for p in get_all_players(("harlot",)) if p in pl and random.random() < turn_chance]
cultists = [p for p in get_all_players(("cultist",)) if p in pl and random.random() < turn_chance]
channels.Main.send(messages["sleepy_priest_death"])
for seer in seers:
change_role(seer, "seer", "doomsayer")

View File

@ -266,19 +266,19 @@ def on_transition_night_end(evt, var):
gangel.send(messages[to_send].format(warning, gself), "Players: " + ", ".join(p.nick for p in pl), sep="\n")
@event_listener("assassinate")
def on_assassinate(evt, cli, var, nick, target, prot):
def on_assassinate(evt, var, killer, target, prot):
if prot == "angel" and var.GAMEPHASE == "night":
var.ACTIVE_PROTECTIONS[target].remove("angel")
var.ACTIVE_PROTECTIONS[target.nick].remove("angel")
evt.prevent_default = True
evt.stop_processing = True
cli.msg(botconfig.CHANNEL, messages[evt.params.message_prefix + "angel"].format(nick, target))
channels.Main.send(messages[evt.params.message_prefix + "angel"].format(killer, target))
elif prot == "bodyguard":
var.ACTIVE_PROTECTIONS[target].remove("bodyguard")
var.ACTIVE_PROTECTIONS[target.nick].remove("bodyguard")
evt.prevent_default = True
evt.stop_processing = True
for bg in var.ROLES["bodyguard"]:
if GUARDED.get(bg) == target:
cli.msg(botconfig.CHANNEL, messages[evt.params.message_prefix + "bodyguard"].format(nick, target, bg))
if GUARDED.get(bg) == target.nick:
channels.Main.send(messages[evt.params.message_prefix + "bodyguard"].format(killer, target, bg))
# redirect the assassination to the bodyguard
evt.data["target"] = users._get(bg) # FIXME
break

View File

@ -65,13 +65,13 @@ def on_retribution(evt, var, victim, target, prot):
evt.stop_processing = True
@event_listener("assassinate")
def on_assassinate(evt, cli, var, nick, target, prot):
def on_assassinate(evt, var, killer, target, prot):
if prot == "blessing":
var.ACTIVE_PROTECTIONS[target].remove("blessing")
var.ACTIVE_PROTECTIONS[target.nick].remove("blessing")
evt.prevent_default = True
evt.stop_processing = True
# don't message the channel whenever a blessing blocks a kill, but *do* let the killer know so they don't try to report it as a bug
pm(cli, nick, messages["assassin_fail_blessed"].format(target))
killer.send(messages["assassin_fail_blessed"].format(target))
@event_listener("myrole")
def on_myrole(evt, var, user):

View File

@ -68,7 +68,7 @@ def on_del_player(evt, var, user, mainrole, allroles, death_triggers):
del KILLS[h]
if death_triggers and "dullahan" in allroles:
pl = evt.data["pl"]
targets = TARGETS[user].intersection(users._get(x) for x in pl) # FIXME
targets = TARGETS[user].intersection(pl)
if targets:
target = random.choice(list(targets))
prots = deque(var.ACTIVE_PROTECTIONS[target.nick])
@ -79,7 +79,7 @@ def on_del_player(evt, var, user, mainrole, allroles, death_triggers):
refresh_pl=evt.params.refresh_pl,
message_prefix="dullahan_die_",
source="dullahan",
killer=user.nick,
killer=user,
killer_mainrole=mainrole,
killer_allroles=allroles,
prots=prots)
@ -87,7 +87,7 @@ def on_del_player(evt, var, user, mainrole, allroles, death_triggers):
# an event can read the current active protection and cancel or redirect the assassination
# if it cancels, it is responsible for removing the protection from var.ACTIVE_PROTECTIONS
# so that it cannot be used again (if the protection is meant to be usable once-only)
if not aevt.dispatch(user.client, var, user.nick, target.nick, prots[0]):
if not aevt.dispatch(var, user, target, prots[0]):
evt.data["pl"] = aevt.data["pl"]
if target is not aevt.data["target"]:
target = aevt.data["target"]
@ -97,15 +97,14 @@ def on_del_player(evt, var, user, mainrole, allroles, death_triggers):
return
prots.popleft()
target = target.nick # FIXME
if var.ROLE_REVEAL in ("on", "team"):
role = get_reveal_role(target)
role = get_reveal_role(target.nick)
an = "n" if role.startswith(("a", "e", "i", "o", "u")) else ""
channels.Main.send(messages["dullahan_die_success"].format(user, target, an, role))
else:
channels.Main.send(messages["dullahan_die_success_noreveal"].format(user, target))
debuglog("{0} (dullahan) DULLAHAN ASSASSINATE: {1} ({2})".format(user, target, get_role(target)))
evt.params.del_player(user.client, target, True, end_game=False, killer_role="dullahan", deadlist=evt.params.deadlist, original=evt.params.original, ismain=False)
debuglog("{0} (dullahan) DULLAHAN ASSASSINATE: {1} ({2})".format(user, target, get_role(target.nick)))
evt.params.del_player(target, forced_death=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")

View File

@ -42,7 +42,7 @@ def on_transition_day(evt, var):
evt.data["killers"][p].append(killer)
@event_listener("assassinate", priority=1)
def on_assassinate(evt, cli, var, nick, target, prot):
def on_assassinate(evt, var, killer, target, prot):
# bypass all protection if FA is doing the killing
# we do this by stopping propagation, meaning future events won't fire
if "fallen angel" in evt.params.killer_allroles:

View File

@ -13,7 +13,7 @@ from src.decorators import command, event_listener
from src.messages import messages
from src.events import Event
def _get_targets(var, pl, nick):
def _get_targets(var, pl, user):
"""Gets the mad scientist's targets.
var - settings module
@ -21,8 +21,8 @@ def _get_targets(var, pl, nick):
nick - nick of the mad scientist
"""
for index, user in enumerate(var.ALL_PLAYERS):
if user.nick == nick: # FIXME
for index, player in enumerate(var.ALL_PLAYERS):
if player is user: # FIXME
break
num_players = len(var.ALL_PLAYERS)
@ -33,14 +33,14 @@ def _get_targets(var, pl, nick):
i = index
while True:
i = (i - 1) % num_players
if var.ALL_PLAYERS[i].nick in pl or var.ALL_PLAYERS[i].nick == nick:
if var.ALL_PLAYERS[i] in pl or var.ALL_PLAYERS[i] is user:
target1 = var.ALL_PLAYERS[i]
break
# determine right player
i = index
while True:
i = (i + 1) % num_players
if var.ALL_PLAYERS[i].nick in pl or var.ALL_PLAYERS[i].nick == nick:
if var.ALL_PLAYERS[i] in pl or var.ALL_PLAYERS[i] is user:
target2 = var.ALL_PLAYERS[i]
break
@ -53,7 +53,7 @@ def on_del_player(evt, var, user, mainrole, allroles, death_triggers):
return
pl = evt.data["pl"]
target1, target2 = _get_targets(var, pl, user.nick)
target1, target2 = _get_targets(var, pl, user)
# apply protections (if applicable)
prots1 = deque(var.ACTIVE_PROTECTIONS[target1.nick])
@ -68,13 +68,13 @@ def on_del_player(evt, var, user, mainrole, allroles, death_triggers):
refresh_pl=evt.params.refresh_pl,
message_prefix="mad_scientist_fail_",
source="mad scientist",
killer=user.nick,
killer=user,
killer_mainrole=mainrole,
killer_allroles=allroles,
prots=prots1)
while len(prots1) > 0:
# events may be able to cancel this kill
if not aevt.dispatch(user.client, var, user.nick, target1.nick, prots1[0]):
if not aevt.dispatch(var, user, target1, prots1[0]):
pl = aevt.data["pl"]
if target1 is not aevt.data["target"]:
target1 = aevt.data["target"]
@ -87,7 +87,7 @@ def on_del_player(evt, var, user, mainrole, allroles, death_triggers):
aevt.params.prots = prots2
while len(prots2) > 0:
# events may be able to cancel this kill
if not aevt.dispatch(user.client, var, user.nick, target2.nick, prots2[0]):
if not aevt.dispatch(var, user, target2, prots2[0]):
pl = aevt.data["pl"]
if target2 is not aevt.data["target"]:
target2 = aevt.data["target"]
@ -97,8 +97,8 @@ def on_del_player(evt, var, user, mainrole, allroles, death_triggers):
break
prots2.popleft()
kill1 = target1.nick in pl and len(prots1) == 0
kill2 = target2.nick in pl and len(prots2) == 0 and target1 is not target2
kill1 = target1 in pl and len(prots1) == 0
kill2 = target2 in pl and len(prots2) == 0 and target1 is not target2
if kill1:
if kill2:
@ -117,8 +117,8 @@ def on_del_player(evt, var, user, mainrole, allroles, death_triggers):
deadlist1.append(target2.nick)
deadlist2 = evt.params.deadlist[:]
deadlist2.append(target1.nick)
evt.params.del_player(user.client, target1.nick, True, end_game=False, killer_role="mad scientist", deadlist=deadlist1, original=evt.params.original, ismain=False)
evt.params.del_player(user.client, target2.nick, True, end_game=False, killer_role="mad scientist", deadlist=deadlist2, original=evt.params.original, ismain=False)
evt.params.del_player(target1, forced_death=True, end_game=False, killer_role="mad scientist", deadlist=deadlist1, original=evt.params.original, ismain=False)
evt.params.del_player(target2, forced_death=True, end_game=False, killer_role="mad scientist", deadlist=deadlist2, original=evt.params.original, ismain=False)
pl = evt.params.refresh_pl(pl)
else:
if var.ROLE_REVEAL in ("on", "team"):
@ -129,7 +129,7 @@ def on_del_player(evt, var, user, mainrole, allroles, death_triggers):
tmsg = messages["mad_scientist_kill_single_no_reveal"].format(user, target1)
channels.Main.send(tmsg)
debuglog(user.nick, "(mad scientist) KILL: {0} ({1})".format(target1, get_role(target1.nick)))
evt.params.del_player(user.client, target1.nick, True, end_game=False, killer_role="mad scientist", deadlist=evt.params.deadlist, original=evt.params.original, ismain=False)
evt.params.del_player(target1, forced_death=True, end_game=False, killer_role="mad scientist", deadlist=evt.params.deadlist, original=evt.params.original, ismain=False)
pl = evt.params.refresh_pl(pl)
else:
if kill2:
@ -141,7 +141,7 @@ def on_del_player(evt, var, user, mainrole, allroles, death_triggers):
tmsg = messages["mad_scientist_kill_single_no_reveal"].format(user, target2)
channels.Main.send(tmsg)
debuglog(user.nick, "(mad scientist) KILL: {0} ({1})".format(target2, get_role(target2.nick)))
evt.params.del_player(user.client, target2.nick, True, end_game=False, killer_role="mad scientist", deadlist=evt.params.deadlist, original=evt.params.original, ismain=False)
evt.params.del_player(target2, forced_death=True, end_game=False, killer_role="mad scientist", deadlist=evt.params.deadlist, original=evt.params.original, ismain=False)
pl = evt.params.refresh_pl(pl)
else:
tmsg = messages["mad_scientist_fail"].format(user)

View File

@ -576,12 +576,12 @@ def on_lynch(evt, cli, var, nick):
evt.prevent_default = True
@event_listener("assassinate")
def on_assassinate(evt, cli, var, nick, target, prot):
def on_assassinate(evt, var, killer, target, prot):
if prot == "totem":
var.ACTIVE_PROTECTIONS[target].remove("totem")
var.ACTIVE_PROTECTIONS[target.nick].remove("totem")
evt.prevent_default = True
evt.stop_processing = True
cli.msg(botconfig.CHANNEL, messages[evt.params.message_prefix + "totem"].format(nick, target))
channels.Main.send(messages[evt.params.message_prefix + "totem"].format(killer, target))
@event_listener("succubus_visit")
def on_succubus_visit(evt, cli, var, nick, victim):

View File

@ -184,7 +184,7 @@ def on_del_player(evt, var, user, mainrole, allroles, death_triggers):
if death_triggers:
ALL_SUCC_IDLE = False
if len(var.ROLES["succubus"]) == 0:
entranced_alive = ENTRANCED - set(evt.params.deadlist)
entranced_alive = {users._get(x) for x in ENTRANCED}.difference(evt.params.deadlist) # FIXME
if ALL_SUCC_IDLE:
while ENTRANCED:
e = ENTRANCED.pop()
@ -198,7 +198,7 @@ def on_del_player(evt, var, user, mainrole, allroles, death_triggers):
comma = ","
for e in entranced_alive:
if var.ROLE_REVEAL in ("on", "team"):
role = get_reveal_role(e)
role = get_reveal_role(e.nick)
an = "n" if role.startswith(("a", "e", "i", "o", "u")) else ""
msg.append("\u0002{0}\u0002, a{1} \u0002{2}\u0002".format(e, an, role))
else:
@ -215,7 +215,7 @@ def on_del_player(evt, var, user, mainrole, allroles, death_triggers):
dlc = list(evt.params.deadlist)
dlc.extend(entranced_alive - {e})
debuglog("{0} (succubus) SUCCUBUS DEATH KILL: {1} ({2})".format(user, e, get_role(e)))
evt.params.del_player(user.client, e, end_game=False, killer_role="succubus",
evt.params.del_player(e, end_game=False, killer_role="succubus",
deadlist=dlc, original=evt.params.original, ismain=False)
evt.data["pl"] = evt.params.refresh_pl(evt.data["pl"])
ENTRANCED_DYING.clear()

View File

@ -89,7 +89,7 @@ def on_player_win(evt, var, user, role, winner, survived):
evt.data["iwon"] = False
@event_listener("del_player", priority=6)
def on_del_player(evt, var, user, nickrole, nicktpls, death_triggers):
def on_del_player(evt, var, user, mainrole, allroles, death_triggers):
for h, v in list(KILLS.items()):
if user is v:
h.send(messages["hunter_discard"])
@ -97,7 +97,7 @@ def on_del_player(evt, var, user, nickrole, nicktpls, death_triggers):
# extending VG to work with new teams can be done by registering a listener
# at priority < 6, importing src.roles.vengefulghost, and setting
# GHOSTS[user] to something; if that is done then this logic is not run.
if death_triggers and nickrole == "vengeful ghost" and user not in GHOSTS:
if death_triggers and mainrole == "vengeful ghost" and user not in GHOSTS:
if evt.params.killer_role in var.WOLFTEAM_ROLES:
GHOSTS[user] = "wolves"
else:

View File

@ -85,7 +85,7 @@ def on_del_player(evt, var, user, mainrole, allroles, death_triggers):
return
for child in get_all_players(("wild child",)):
if child.nick not in IDOLS or child.nick in evt.params.deadlist or IDOLS[child.nick] not in evt.params.deadlist:
if child.nick not in IDOLS or child in evt.params.deadlist or users._get(IDOLS[child.nick]) not in evt.params.deadlist: # FIXME
continue
# change their main role to wolf, even if wild child was a template