Convert check_exchange (#298)

Add an optional extended description...
This commit is contained in:
Em Barry 2017-09-18 14:08:17 -04:00 committed by Ryan Schmidt
parent 95fd796953
commit bcedbd4c65
15 changed files with 163 additions and 149 deletions

View File

@ -99,17 +99,19 @@ def on_get_special(evt, var):
evt.data["special"].update(get_players(("guardian angel", "bodyguard"))) evt.data["special"].update(get_players(("guardian angel", "bodyguard")))
@event_listener("exchange_roles") @event_listener("exchange_roles")
def on_exchange(evt, cli, var, actor, nick, actor_role, nick_role): def on_exchange(evt, var, actor, target, actor_role, target_role):
if actor_role in ("bodyguard", "guardian angel"): if actor_role in ("bodyguard", "guardian angel"):
if actor in GUARDED: if actor.nick in GUARDED:
pm(cli, GUARDED.pop(actor), messages["protector disappeared"]) guarded = users._get(GUARDED.pop(actor.nick)) # FIXME
if actor in LASTGUARDED: guarded.send(messages["protector disappeared"])
del LASTGUARDED[actor] if actor.nick in LASTGUARDED:
if nick_role in ("bodyguard", "guardian angel"): del LASTGUARDED[actor.nick]
if nick in GUARDED: if target_role in ("bodyguard", "guardian angel"):
pm(cli, GUARDED.pop(nick), messages["protector disappeared"]) if target.nick in GUARDED:
if nick in LASTGUARDED: guarded = users._get(GUARDED.pop(target.nick)) # FIXME
del LASTGUARDED[nick] guarded.send(messages["protector disappeared"])
if target.nick in LASTGUARDED:
del LASTGUARDED[target.nick]
@event_listener("chk_nightdone") @event_listener("chk_nightdone")
def on_chk_nightdone(evt, var): def on_chk_nightdone(evt, var):

View File

@ -70,11 +70,11 @@ def on_get_special(evt, var):
evt.data["special"].update(get_players(("detective",))) evt.data["special"].update(get_players(("detective",)))
@event_listener("exchange_roles") @event_listener("exchange_roles")
def on_exchange(evt, cli, var, actor, nick, actor_role, nick_role): def on_exchange(evt, var, actor, target, actor_role, target_role):
if actor_role == "detective" and nick_role != "detective": if actor_role == "detective" and target_role != "detective":
INVESTIGATED.discard(actor) INVESTIGATED.discard(actor.nick)
elif nick_role == "detective" and actor_role != "detective": elif target_role == "detective" and actor_role != "detective":
INVESTIGATED.discard(nick) INVESTIGATED.discard(target.nick)
@event_listener("transition_night_end", priority=2) @event_listener("transition_night_end", priority=2)
def on_transition_night_end(evt, var): def on_transition_night_end(evt, var):

View File

@ -75,16 +75,16 @@ def on_acted(evt, var, user, actor):
evt.data["acted"] = True evt.data["acted"] = True
@event_listener("exchange_roles") @event_listener("exchange_roles")
def on_exchange(evt, cli, var, actor, nick, actor_role, nick_role): def on_exchange(evt, var, actor, target, actor_role, target_role):
if actor_role == "doomsayer" and nick_role != "doomsayer": if actor_role == "doomsayer" and target_role != "doomsayer":
SEEN.discard(actor) SEEN.discard(actor.nick)
for name, mapping in _mappings: for name, mapping in _mappings:
mapping.pop(actor, None) mapping.pop(actor.nick, None)
elif nick_role == "doomsayer" and actor_role != "doomsayer": elif target_role == "doomsayer" and actor_role != "doomsayer":
SEEN.discard(nick) SEEN.discard(target.nick)
for name, mapping in _mappings: for name, mapping in _mappings:
mapping.pop(nick, None) mapping.pop(target.nick, None)
@event_listener("del_player") @event_listener("del_player")
def on_del_player(evt, var, user, mainrole, allroles, death_triggers): def on_del_player(evt, var, user, mainrole, allroles, death_triggers):

View File

@ -142,16 +142,16 @@ def on_transition_day(evt, var):
evt.data["killers"][d].append(k) evt.data["killers"][d].append(k)
@event_listener("exchange_roles") @event_listener("exchange_roles")
def on_exchange(evt, cli, var, actor, nick, actor_role, nick_role): def on_exchange(evt, var, actor, target, actor_role, target_role):
for k in set(KILLS): for k in set(KILLS):
if k.nick == actor or k.nick == nick: if k is actor or k is target:
del KILLS[k] del KILLS[k]
for k in set(TARGETS): for k in set(TARGETS):
if actor_role == "dullahan" and nick_role != "dullahan" and k.nick == actor: if actor_role == "dullahan" and target_role != "dullahan" and k is actor:
TARGETS[users._get(nick)] = TARGETS.pop(k) - {users._get(nick)} # FIXME TARGETS[target] = TARGETS.pop(k) - {target}
elif nick_role == "dullahan" and actor_role != "dullahan" and k.nick == nick: elif target_role == "dullahan" and actor_role != "dullahan" and k is target:
TARGET[users._get(actor)] = TARGETS.pop(k) - {users._get(actor)} # FIXME TARGET[actor] = TARGETS.pop(k) - {actor}
@event_listener("chk_nightdone") @event_listener("chk_nightdone")
def on_chk_nightdone(evt, var): def on_chk_nightdone(evt, var):

View File

@ -112,17 +112,19 @@ def on_chk_nightdone(evt, var):
evt.data["nightroles"].extend(get_all_players(("harlot",))) evt.data["nightroles"].extend(get_all_players(("harlot",)))
@event_listener("exchange_roles") @event_listener("exchange_roles")
def on_exchange_roles(evt, cli, var, actor, nick, actor_role, nick_role): def on_exchange_roles(evt, var, actor, target, actor_role, target_role):
if actor_role == "harlot": if actor_role == "harlot":
if actor in VISITED: if actor.nick in VISITED:
if VISITED[actor] is not None: if VISITED[actor.nick] is not None:
pm(cli, VISITED[actor], messages["harlot_disappeared"].format(actor)) visited = users._get(VISITED[actor.nick]) # FIXME
del VISITED[actor] visited.send(messages["harlot_disappeared"].format(actor))
if nick_role == "harlot": del VISITED[actor.nick]
if nick in VISITED: if target_role == "harlot":
if VISITED[nick] is not None: if target.nick in VISITED:
pm(cli, VISITED[nick], messages["harlot_disappeared"].format(nick)) if VISITED[target.nick] is not None:
del VISITED[nick] visited = users._get(VISITED[target.nick]) # FIXME
visited.send(messages["harlot_disappeared"].format(target))
del VISITED[target.nick]
@event_listener("transition_night_end", priority=2) @event_listener("transition_night_end", priority=2)
def on_transition_night_end(evt, var): def on_transition_night_end(evt, var):

View File

@ -113,14 +113,12 @@ def on_transition_day(evt, var):
del KILLS[k] del KILLS[k]
@event_listener("exchange_roles") @event_listener("exchange_roles")
def on_exchange(evt, cli, var, actor, nick, actor_role, nick_role): def on_exchange(evt, var, actor, target, actor_role, target_role):
user = users._get(actor) # FIXME KILLS.pop(actor, None)
target = users._get(nick) # FIXME
KILLS.pop(user, None)
KILLS.pop(target, None) KILLS.pop(target, None)
HUNTERS.discard(user) HUNTERS.discard(actor)
HUNTERS.discard(target) HUNTERS.discard(target)
PASSED.discard(user) PASSED.discard(actor)
PASSED.discard(target) PASSED.discard(target)
@event_listener("chk_nightdone") @event_listener("chk_nightdone")

View File

@ -10,8 +10,8 @@ from src.messages import messages
from src.events import Event from src.events import Event
@event_listener("exchange_roles") @event_listener("exchange_roles")
def on_exchange(evt, cli, var, actor, nick, actor_role, nick_role): def on_exchange(evt, var, actor, target, actor_role, target_role):
if nick_role not in ("mystic", "wolf mystic") and actor_role not in ("mystic", "wolf mystic"): if actor_role not in ("mystic", "wolf mystic") and target_role not in ("mystic", "wolf mystic"):
return return
special = set(get_players(("harlot", "priest", "prophet", "matchmaker", special = set(get_players(("harlot", "priest", "prophet", "matchmaker",
@ -23,21 +23,21 @@ def on_exchange(evt, cli, var, actor, nick, actor_role, nick_role):
neutral = set(get_players(var.TRUE_NEUTRAL_ROLES)) neutral = set(get_players(var.TRUE_NEUTRAL_ROLES))
special = evt2.data["special"] special = evt2.data["special"]
if nick_role == "wolf mystic" and actor_role != "wolf mystic": if target_role == "wolf mystic" and actor_role != "wolf mystic":
# # of special villagers = # of players - # of villagers - # of wolves - # of neutrals # # of special villagers = # of players - # of villagers - # of wolves - # of neutrals
numvills = len(special & (pl - wolves - neutral)) numvills = len(special & (pl - wolves - neutral))
evt.data["actor_messages"].append(messages["wolf_mystic_info"].format("are" if numvills != 1 else "is", numvills, "s" if numvills != 1 else "")) evt.data["actor_messages"].append(messages["wolf_mystic_info"].format("are" if numvills != 1 else "is", numvills, "s" if numvills != 1 else ""))
elif nick_role == "mystic" and actor_role != "mystic": elif target_role == "mystic" and actor_role != "mystic":
numevil = len(wolves) numevil = len(wolves)
evt.data["actor_messages"].append(messages["mystic_info"].format("are" if numevil != 1 else "is", numevil, "s" if numevil != 1 else "")) evt.data["actor_messages"].append(messages["mystic_info"].format("are" if numevil != 1 else "is", numevil, "s" if numevil != 1 else ""))
if actor_role == "wolf mystic" and nick_role != "wolf mystic": if actor_role == "wolf mystic" and target_role != "wolf mystic":
# # of special villagers = # of players - # of villagers - # of wolves - # of neutrals # # of special villagers = # of players - # of villagers - # of wolves - # of neutrals
numvills = len(special & (pl - wolves - neutral)) numvills = len(special & (pl - wolves - neutral))
evt.data["nick_messages"].append(messages["wolf_mystic_info"].format("are" if numvills != 1 else "is", numvills, "s" if numvills != 1 else "")) evt.data["target_messages"].append(messages["wolf_mystic_info"].format("are" if numvills != 1 else "is", numvills, "s" if numvills != 1 else ""))
elif actor_role == "mystic" and nick_role != "mystic": elif actor_role == "mystic" and target_role != "mystic":
numevil = len(wolves) numevil = len(wolves)
evt.data["nick_messages"].append(messages["mystic_info"].format("are" if numevil != 1 else "is", numevil, "s" if numevil != 1 else "")) evt.data["target_messages"].append(messages["mystic_info"].format("are" if numevil != 1 else "is", numevil, "s" if numevil != 1 else ""))
@event_listener("transition_night_end", priority=2.01) @event_listener("transition_night_end", priority=2.01)
def on_transition_night_end(evt, var): def on_transition_night_end(evt, var):

View File

@ -95,9 +95,9 @@ def on_get_special(evt, var):
evt.data["special"].update(get_players(("seer", "oracle", "augur"))) evt.data["special"].update(get_players(("seer", "oracle", "augur")))
@event_listener("exchange_roles") @event_listener("exchange_roles")
def on_exchange(evt, cli, var, actor, nick, actor_role, nick_role): def on_exchange(evt, var, actor, target, actor_role, target_role):
if actor_role in ("seer", "oracle", "augur"): if actor_role in ("seer", "oracle", "augur"):
SEEN.discard(actor) SEEN.discard(actor.nick)
@event_listener("chk_nightdone") @event_listener("chk_nightdone")
def on_chk_nightdone(evt, var): def on_chk_nightdone(evt, var):

View File

@ -151,29 +151,29 @@ def on_get_special(evt, var):
evt.data["special"].update(get_players(("shaman", "crazed shaman", "wolf shaman"))) evt.data["special"].update(get_players(("shaman", "crazed shaman", "wolf shaman")))
@event_listener("exchange_roles") @event_listener("exchange_roles")
def on_exchange(evt, cli, var, actor, nick, actor_role, nick_role): def on_exchange(evt, var, actor, target, actor_role, target_role):
actor_totem = None actor_totem = None
nick_totem = None target_totem = None
if actor_role in var.TOTEM_ORDER: if actor_role in var.TOTEM_ORDER:
actor_totem = TOTEMS.pop(actor) actor_totem = TOTEMS.pop(actor.nick)
if actor in SHAMANS: if actor.nick in SHAMANS:
del SHAMANS[actor] del SHAMANS[actor.nick]
if actor in LASTGIVEN: if actor.nick in LASTGIVEN:
del LASTGIVEN[actor] del LASTGIVEN[actor.nick]
if nick_role in var.TOTEM_ORDER: if target_role in var.TOTEM_ORDER:
nick_totem = TOTEMS.pop(nick) target_totem = TOTEMS.pop(target.nick)
if nick in SHAMANS: if target.nick in SHAMANS:
del SHAMANS[nick] del SHAMANS[target.nick]
if nick in LASTGIVEN: if target.nick in LASTGIVEN:
del LASTGIVEN[nick] del LASTGIVEN[target.nick]
if nick_totem: if target_totem:
if nick_role != "crazed shaman": if target_role != "crazed shaman":
evt.data["actor_messages"].append(messages["shaman_totem"].format(nick_totem)) evt.data["actor_messages"].append(messages["shaman_totem"].format(target_totem))
TOTEMS[actor] = nick_totem TOTEMS[actor.nick] = target_totem
if actor_totem: if actor_totem:
if actor_role != "crazed shaman": if actor_role != "crazed shaman":
evt.data["nick_messages"].append(messages["shaman_totem"].format(actor_totem)) evt.data["target_messages"].append(messages["shaman_totem"].format(actor_totem))
TOTEMS[nick] = actor_totem TOTEMS[target.nick] = actor_totem
@event_listener("chk_nightdone") @event_listener("chk_nightdone")
def on_chk_nightdone(evt, var): def on_chk_nightdone(evt, var):

View File

@ -158,8 +158,8 @@ def on_chk_win(evt, cli, var, rolemap, mainroles, lpl, lwolves, lrealwolves):
evt.data["message"] = messages["succubus_win"].format(plural("succubus", lsuccubi), plural("has", lsuccubi), plural("master's", lsuccubi)) evt.data["message"] = messages["succubus_win"].format(plural("succubus", lsuccubi), plural("has", lsuccubi), plural("master's", lsuccubi))
@event_listener("can_exchange") @event_listener("can_exchange")
def on_can_exchange(evt, var, actor, nick): def on_can_exchange(evt, var, user, target):
if actor in var.ROLES["succubus"] or nick in var.ROLES["succubus"]: if user.nick in var.ROLES["succubus"] or target.nick in var.ROLES["succubus"]:
evt.prevent_default = True evt.prevent_default = True
evt.stop_processing = True evt.stop_processing = True

View File

@ -111,13 +111,13 @@ def on_transition_day(evt, var):
var.DYING.add(killer) var.DYING.add(killer)
@event_listener("exchange_roles") @event_listener("exchange_roles")
def on_exchange(evt, cli, var, actor, nick, actor_role, nick_role): def on_exchange(evt, var, actor, target, actor_role, target_role):
if actor in KILLS: if actor.nick in KILLS:
del KILLS[actor] del KILLS[actor.nick]
if nick in KILLS: if target.nick in KILLS:
del KILLS[nick] del KILLS[target.nick]
PASSED.discard(actor) PASSED.discard(actor.nick)
PASSED.discard(nick) PASSED.discard(target.nick)
@event_listener("chk_nightdone") @event_listener("chk_nightdone")
def on_chk_nightdone(evt, var): def on_chk_nightdone(evt, var):

View File

@ -54,27 +54,25 @@ def on_rename(evt, cli, var, prefix, nick):
IDOLS[wildchild] = nick IDOLS[wildchild] = nick
@event_listener("exchange_roles") @event_listener("exchange_roles")
def on_exchange(evt, cli, var, actor, nick, actor_role, nick_role): def on_exchange(evt, var, actor, target, actor_role, target_role):
if actor_role == "wolf" and actor in WILD_CHILDREN and nick not in WILD_CHILDREN: if actor_role == "wolf" and actor.nick in WILD_CHILDREN and target.nick not in WILD_CHILDREN:
WILD_CHILDREN.discard(actor) WILD_CHILDREN.discard(actor.nick)
WILD_CHILDREN.add(nick) WILD_CHILDREN.add(target.nick)
elif actor_role == "wild child": elif actor_role == "wild child":
if nick_role == "wild child": if target_role == "wild child":
temp = IDOLS[nick] IDOLS[actor.nick], IDOLS[target.nick] = IDOLS[target.nick], IDOLS[actor.nick]
IDOLS[nick] = IDOLS[actor] evt.data["actor_messages"].append(messages["wild_child_idol"].format(IDOLS[actor.nick]))
IDOLS[actor] = temp evt.data["target_messages"].append(messages["wild_child_idol"].format(IDOLS[target.nick]))
evt.data["actor_messages"].append(messages["wild_child_idol"].format(IDOLS[actor]))
evt.data["nick_messages"].append(messages["wild_child_idol"].format(IDOLS[nick]))
else: else:
IDOLS[nick] = IDOLS.pop(actor) IDOLS[target.nick] = IDOLS.pop(actor.nick)
evt.data["nick_messages"].append(messages["wild_child_idol"].format(IDOLS[nick])) evt.data["target_messages"].append(messages["wild_child_idol"].format(IDOLS[target.nick]))
if nick_role == "wolf" and nick in WILD_CHILDREN and actor not in WILD_CHILDREN: if target_role == "wolf" and target.nick in WILD_CHILDREN and actor.nick not in WILD_CHILDREN:
WILD_CHILDREN.discard(nick) WILD_CHILDREN.discard(target.nick)
WILD_CHILDREN.add(actor) WILD_CHILDREN.add(actor.nick)
elif nick_role == "wild child" and actor_role != "wild child": elif target_role == "wild child" and actor_role != "wild child":
# if they're both wild children, already swapped idols above # if they're both wild children, already swapped idols above
IDOLS[actor] = IDOLS.pop(nick) IDOLS[actor.nick] = IDOLS.pop(target.nick)
evt.data["actor_messages"].append(messages["wild_child_idol"].format(IDOLS[actor])) evt.data["actor_messages"].append(messages["wild_child_idol"].format(IDOLS[actor.nick]))
@event_listener("myrole") @event_listener("myrole")
def on_myrole(evt, var, user): def on_myrole(evt, var, user):

View File

@ -222,7 +222,7 @@ def on_retribution_kill(evt, var, victim, orig_target):
evt.data["target"] = random.choice(wolves) evt.data["target"] = random.choice(wolves)
@event_listener("exchange_roles", priority=2) @event_listener("exchange_roles", priority=2)
def on_exchange(evt, cli, var, actor, nick, actor_role, nick_role): def on_exchange(evt, var, actor, target, actor_role, target_role):
wcroles = var.WOLFCHAT_ROLES wcroles = var.WOLFCHAT_ROLES
if var.RESTRICT_WOLFCHAT & var.RW_REM_NON_WOLVES: if var.RESTRICT_WOLFCHAT & var.RW_REM_NON_WOLVES:
if var.RESTRICT_WOLFCHAT & var.RW_TRAITOR_NON_WOLF: if var.RESTRICT_WOLFCHAT & var.RW_TRAITOR_NON_WOLF:
@ -230,63 +230,77 @@ def on_exchange(evt, cli, var, actor, nick, actor_role, nick_role):
else: else:
wcroles = var.WOLF_ROLES | {"traitor"} wcroles = var.WOLF_ROLES | {"traitor"}
if nick_role in wcroles and actor_role not in wcroles: if target_role in wcroles and actor_role not in wcroles:
pl = list_players() pl = get_players()
random.shuffle(pl) random.shuffle(pl)
pl.remove(actor) # remove self from list pl.remove(actor) # remove self from list
notify = [] notify = []
for i, player in enumerate(pl): to_send = []
prole = get_role(player) for player in pl:
if player == nick: prole = get_main_role(player)
if player is target:
prole = actor_role prole = actor_role
wevt = Event("wolflist", {"tags": set()}) wevt = Event("wolflist", {"tags": set()})
wevt.dispatch(cli, var, player, actor) wevt.dispatch(actor.client, var, player.nick, actor.nick)
tags = " ".join(wevt.data["tags"]) tags = " ".join(wevt.data["tags"])
if prole in wcroles: if prole in wcroles:
if tags: if tags:
tags += " " tags += " "
pl[i] = "\u0002{0}\u0002 ({1}{2})".format(player, tags, prole) to_send.append("\u0002{0}\u0002 ({1}{2})".format(player, tags, prole))
notify.append(player) notify.append(player)
elif tags: elif tags:
pl[i] = "{0} ({1})".format(player, tags) to_send.append("{0} ({1})".format(player, tags))
else:
to_send.append(player.nick)
mass_privmsg(cli, notify, messages["players_exchanged_roles"].format(nick, actor)) for player in notify:
evt.data["actor_messages"].append("Players: " + ", ".join(pl)) player.queue_message(messages["players_exchanged_roles"].format(target, actor))
if nick_role in CAN_KILL and var.DISEASED_WOLVES: if notify:
player.send_messages()
evt.data["actor_messages"].append("Players: " + ", ".join(to_send))
if target_role in CAN_KILL and var.DISEASED_WOLVES:
evt.data["actor_messages"].append(messages["ill_wolves"]) evt.data["actor_messages"].append(messages["ill_wolves"])
if var.ALPHA_ENABLED and nick_role == "alpha wolf" and actor not in var.ALPHA_WOLVES: if var.ALPHA_ENABLED and target_role == "alpha wolf" and actor.nick not in var.ALPHA_WOLVES:
evt.data["actor_messages"].append(messages["wolf_bite"]) evt.data["actor_messages"].append(messages["wolf_bite"])
elif actor_role in wcroles and nick_role not in wcroles: elif actor_role in wcroles and target_role not in wcroles:
pl = list_players() pl = get_players()
random.shuffle(pl) random.shuffle(pl)
pl.remove(nick) # remove self from list pl.remove(target) # remove self from list
notify = [] notify = []
for i, player in enumerate(pl): to_send = []
prole = get_role(player) for player in pl:
if player == actor: prole = get_main_role(player)
prole = nick_role if player is actor:
prole = target_role
wevt = Event("wolflist", {"tags": set()}) wevt = Event("wolflist", {"tags": set()})
wevt.dispatch(cli, var, player, nick) wevt.dispatch(actor.client, var, player.nick, target.nick)
tags = " ".join(wevt.data["tags"]) tags = " ".join(wevt.data["tags"])
if prole in wcroles: if prole in wcroles:
if tags: if tags:
tags += " " tags += " "
pl[i] = "\u0002{0}\u0002 ({1}{2})".format(player, tags, prole) to_send.append("\u0002{0}\u0002 ({1}{2})".format(player, tags, prole))
notify.append(player) notify.append(player)
elif tags: elif tags:
pl[i] = "{0} ({1})".format(player, tags) to_send.append("{0} ({1})".format(player, tags))
else:
to_send.append(player.nick)
mass_privmsg(cli, notify, messages["players_exchanged_roles"].format(actor, nick)) for player in notify:
evt.data["nick_messages"].append("Players: " + ", ".join(pl)) player.queue_message(messages["players_exchanged_roles"].format(actor, target))
if notify:
player.send_messages()
evt.data["target_messages"].append("Players: " + ", ".join(to_send))
if actor_role in CAN_KILL and var.DISEASED_WOLVES: if actor_role in CAN_KILL and var.DISEASED_WOLVES:
evt.data["nick_messages"].append(messages["ill_wolves"]) evt.data["target_messages"].append(messages["ill_wolves"])
if var.ALPHA_ENABLED and actor_role == "alpha wolf" and nick not in var.ALPHA_WOLVES: if var.ALPHA_ENABLED and actor_role == "alpha wolf" and target.nick not in var.ALPHA_WOLVES:
evt.data["nick_messages"].append(messages["wolf_bite"]) evt.data["target_messages"].append(messages["wolf_bite"])
if actor in KILLS: if actor.nick in KILLS:
del KILLS[actor] del KILLS[actor.nick]
if nick in KILLS: if target.nick in KILLS:
del KILLS[nick] del KILLS[target.nick]
@event_listener("chk_nightdone", priority=3) @event_listener("chk_nightdone", priority=3)
def on_chk_nightdone(evt, var): def on_chk_nightdone(evt, var):

View File

@ -27,7 +27,7 @@ def on_del_player(evt, var, user, mainrole, allroles, death_triggers):
# wolf fires on priority 2, so we can add our extra messages now (at default priority 5) # wolf fires on priority 2, so we can add our extra messages now (at default priority 5)
@event_listener("exchange_roles") @event_listener("exchange_roles")
def on_exchange(evt, cli, var, actor, nick, actor_role, nick_role): def on_exchange(evt, var, actor, target, actor_role, target_role):
if not ANGRY_WOLVES: if not ANGRY_WOLVES:
return return
@ -38,11 +38,10 @@ def on_exchange(evt, cli, var, actor, nick, actor_role, nick_role):
else: else:
wcroles = var.WOLF_ROLES | {"traitor"} wcroles = var.WOLF_ROLES | {"traitor"}
# FIXME: once nick and actor are users themselves, change the below calls to wolf_can_kill() if target_role in wcroles and actor_role not in wcroles and wolf.wolf_can_kill(var, target):
if nick_role in wcroles and actor_role not in wcroles and wolf.wolf_can_kill(var, users._get(nick)):
evt.data["actor_messages"].append(messages["angry_wolves"]) evt.data["actor_messages"].append(messages["angry_wolves"])
elif actor_role in wcroles and nick_role not in wcroles and wolf.wolf_can_kill(var, users._get(actor)): elif actor_role in wcroles and target_role not in wcroles and wolf.wolf_can_kill(var, actor):
evt.data["nick_messages"].append(messages["angry_wolves"]) evt.data["target_messages"].append(messages["angry_wolves"])
@event_listener("transition_night_end", priority=3) @event_listener("transition_night_end", priority=3)
def on_transition_night_end(evt, var): def on_transition_night_end(evt, var):

View File

@ -4058,8 +4058,12 @@ def check_exchange(cli, actor, nick):
#some roles can act on themselves, ignore this #some roles can act on themselves, ignore this
if actor == nick: if actor == nick:
return False return False
user = users._get(actor) # FIXME
target = users._get(nick) # FIXME
event = Event("can_exchange", {}) event = Event("can_exchange", {})
if not event.dispatch(var, actor, nick): if not event.dispatch(var, user, target):
return False # some roles such as succubus cannot be affected by exchange totem return False # some roles such as succubus cannot be affected by exchange totem
if nick in var.EXCHANGED: if nick in var.EXCHANGED:
var.EXCHANGED.remove(nick) var.EXCHANGED.remove(nick)
@ -4135,11 +4139,11 @@ def check_exchange(cli, actor, nick):
elif nick_role == "turncoat": elif nick_role == "turncoat":
del var.TURNCOATS[nick] del var.TURNCOATS[nick]
evt = Event("exchange_roles", {"actor_messages": [], "nick_messages": []}) evt = Event("exchange_roles", {"actor_messages": [], "target_messages": []})
evt.dispatch(cli, var, actor, nick, actor_role, nick_role) evt.dispatch(var, user, target, actor_role, nick_role)
change_role(users._get(actor), actor_role, nick_role) # FIXME change_role(user, actor_role, nick_role)
change_role(users._get(nick), nick_role, actor_role) # FIXME change_role(target, nick_role, actor_role)
if actor in var.BITTEN_ROLES.keys(): if actor in var.BITTEN_ROLES.keys():
if nick in var.BITTEN_ROLES.keys(): if nick in var.BITTEN_ROLES.keys():
var.BITTEN_ROLES[actor], var.BITTEN_ROLES[nick] = var.BITTEN_ROLES[nick], var.BITTEN_ROLES[actor] var.BITTEN_ROLES[actor], var.BITTEN_ROLES[nick] = var.BITTEN_ROLES[nick], var.BITTEN_ROLES[actor]
@ -4174,13 +4178,10 @@ def check_exchange(cli, actor, nick):
# don't say who, since misdirection/luck totem may have switched it # don't say who, since misdirection/luck totem may have switched it
# and this makes life far more interesting # and this makes life far more interesting
pm(cli, actor, messages["role_swap"].format(nick_rev_role)) user.send(messages["role_swap"].format(nick_rev_role))
pm(cli, nick, messages["role_swap"].format(actor_rev_role)) target.send(messages["role_swap"].format(actor_rev_role))
user.send(*evt.data["actor_messages"])
for msg in evt.data["actor_messages"]: target.send(*evt.data["target_messages"])
pm(cli, actor, msg)
for msg in evt.data["nick_messages"]:
pm(cli, nick, msg)
wcroles = var.WOLFCHAT_ROLES wcroles = var.WOLFCHAT_ROLES
if var.RESTRICT_WOLFCHAT & var.RW_REM_NON_WOLVES: if var.RESTRICT_WOLFCHAT & var.RW_REM_NON_WOLVES: