Merge pull request #308 from lykoss/convert_vigilante

Convert vigilante
This commit is contained in:
Ryan Schmidt 2017-12-12 09:31:51 -07:00 committed by GitHub
commit b8b48627ab
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -5,91 +5,80 @@ from collections import defaultdict
import src.settings as var import src.settings as var
from src.utilities import * from src.utilities import *
from src import users, channels, debuglog, errlog, plog from src import users, channels, debuglog, errlog, plog
from src.functions import get_players, get_all_players, get_main_role from src.functions import get_players, get_all_players, get_main_role, get_target
from src.decorators import cmd, event_listener from src.decorators import command, event_listener
from src.messages import messages from src.messages import messages
from src.events import Event from src.events import Event
KILLS = {} # type: Dict[str, str] KILLS = {} # type: Dict[users.User, users.User]
PASSED = set() PASSED = set() # type: Set[users.User]
@cmd("kill", chan=False, pm=True, playing=True, silenced=True, phases=("night",), roles=("vigilante",)) @command("kill", chan=False, pm=True, playing=True, silenced=True, phases=("night",), roles=("vigilante",))
def vigilante_kill(cli, nick, chan, rest): def vigilante_kill(var, wrapper, message):
"""Kill someone at night, but you die too if they aren't a wolf or win stealer!""" """Kill someone at night, but you die too if they aren't a wolf or win stealer!"""
victim = get_victim(cli, nick, re.split(" +",rest)[0], False)
if not victim:
return
if victim == nick: target = get_target(var, wrapper, re.split(" +", message)[0], not_self_message="no_suicide")
pm(cli, nick, messages["no_suicide"])
return
orig = victim orig = target
evt = Event("targeted_command", {"target": victim, "misdirection": True, "exchange": True}) evt = Event("targeted_command", {"target": target.nick, "misdirection": True, "exchange": True})
evt.dispatch(cli, var, "kill", nick, victim, frozenset({"detrimental"})) evt.dispatch(wrapper.client, var, "kill", wrapper.source.nick, target.nick, frozenset({"detrimental"}))
if evt.prevent_default: if evt.prevent_default:
return return
victim = evt.data["target"] target = users._get(evt.data["target"]) # FIXME
KILLS[nick] = victim KILLS[wrapper.source] = target
PASSED.discard(nick) PASSED.discard(wrapper.source)
pm(cli, nick, messages["player_kill"].format(orig)) wrapper.send(messages["player_kill"].format(orig))
debuglog("{0} ({1}) KILL: {2} ({3})".format(nick, get_role(nick), victim, get_role(victim))) debuglog("{0} (vigilante) KILL: {1} ({2})".format(wrapper.source, target, get_main_role(target)))
chk_nightdone(cli) chk_nightdone(wrapper.client)
@cmd("retract", "r", chan=False, pm=True, playing=True, phases=("night",), roles=("vigilante",)) @command("retract", "r", chan=False, pm=True, playing=True, phases=("night",), roles=("vigilante",))
def vigilante_retract(cli, nick, chan, rest): def vigilante_retract(var, wrapper, message):
"""Removes a vigilante's kill selection.""" """Removes a vigilante's kill selection."""
if nick not in KILLS and nick not in PASSED: if wrapper.source not in KILLS and wrapper.source not in PASSED:
return return
if nick in KILLS:
del KILLS[nick]
PASSED.discard(nick)
pm(cli, nick, messages["retracted_kill"])
@cmd("pass", chan=False, pm=True, playing=True, silenced=True, phases=("night",), roles=("vigilante",)) KILLS.pop(wrapper.source, None)
def vigilante_pass(cli, nick, chan, rest): PASSED.discard(wrapper.source)
wrapper.send(messages["retracted_kill"])
@command("pass", chan=False, pm=True, playing=True, silenced=True, phases=("night",), roles=("vigilante",))
def vigilante_pass(var, wrapper, message):
"""Do not kill anyone tonight as a vigilante.""" """Do not kill anyone tonight as a vigilante."""
if nick in KILLS: KILLS.pop(wrapper.source, None)
del KILLS[nick] PASSED.add(wrapper.source)
PASSED.add(nick) wrapper.send(messages["hunter_pass"])
pm(cli, nick, messages["hunter_pass"])
debuglog("{0} ({1}) PASS".format(nick, get_role(nick))) debuglog("{0} (vigilante) PASS".format(wrapper.source))
chk_nightdone(cli) chk_nightdone(wrapper.client)
@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):
PASSED.discard(user.nick) PASSED.discard(user)
if user.nick in KILLS: KILLS.pop(user, None)
del KILLS[user.nick] for vigilante, target in list(KILLS.items()):
for h,v in list(KILLS.items()): if target is user:
if v == user.nick: vigilante.send(messages["hunter_discard"])
pm(user.client, h, messages["hunter_discard"]) del KILLS[vigilante]
del KILLS[h]
@event_listener("rename_player") @event_listener("swap_player")
def on_rename(evt, cli, var, prefix, nick): def on_swap(evt, var, old_user, user):
kvp = [] for vigilante, target in set(KILLS.items()):
for a,b in KILLS.items(): if vigilante is old_user:
if a == prefix: KILLS[user] = KILLS.pop(vigilante)
a = nick if target is old_user:
if b == prefix: KILLS[vigilante] = user
b = nick
kvp.append((a,b)) if old_user in PASSED:
KILLS.update(kvp) PASSED.remove(old_user)
if prefix in KILLS: PASSED.add(user)
del KILLS[prefix]
if prefix in PASSED:
PASSED.discard(prefix)
PASSED.add(nick)
@event_listener("night_acted") @event_listener("night_acted")
def on_acted(evt, var, user, actor): def on_acted(evt, var, target, spy):
if user.nick in KILLS: if target in KILLS:
evt.data["acted"] = True evt.data["acted"] = True
@event_listener("get_special") @event_listener("get_special")
@ -98,26 +87,22 @@ def on_get_special(evt, var):
@event_listener("transition_day", priority=2) @event_listener("transition_day", priority=2)
def on_transition_day(evt, var): def on_transition_day(evt, var):
for k, v in list(KILLS.items()): for vigilante, target in list(KILLS.items()):
killer = users._get(k) # FIXME evt.data["victims"].append(target)
victim = users._get(v) # FIXME evt.data["onlybywolves"].discard(target)
evt.data["victims"].append(victim) evt.data["killers"][target].append(vigilante)
evt.data["onlybywolves"].discard(victim)
evt.data["killers"][victim].append(killer)
# important, otherwise our del_player listener lets hunter kill again # important, otherwise our del_player listener lets hunter kill again
del KILLS[k] del KILLS[vigilante]
if get_main_role(victim) not in var.WOLF_ROLES | var.WIN_STEALER_ROLES: if get_main_role(target) not in var.WOLF_ROLES | var.WIN_STEALER_ROLES:
var.DYING.add(killer) var.DYING.add(vigilante)
@event_listener("exchange_roles") @event_listener("exchange_roles")
def on_exchange(evt, var, actor, target, actor_role, target_role): def on_exchange(evt, var, actor, target, actor_role, target_role):
if actor.nick in KILLS: KILLS.pop(actor, None)
del KILLS[actor.nick] KILLS.pop(target, None)
if target.nick in KILLS: PASSED.discard(actor)
del KILLS[target.nick] PASSED.discard(target)
PASSED.discard(actor.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):
@ -138,9 +123,11 @@ def on_transition_night_end(evt, var):
@event_listener("succubus_visit") @event_listener("succubus_visit")
def on_succubus_visit(evt, cli, var, nick, victim): def on_succubus_visit(evt, cli, var, nick, victim):
if KILLS.get(victim) in var.ROLES["succubus"]: for vigilante, target in set(KILLS.items()):
pm(cli, victim, messages["no_kill_succubus"].format(KILLS[victim])) if vigilante.nick == victim:
del KILLS[victim] if target.nick in var.ROLES["succubus"]:
vigilante.send(messages["no_kill_succubus"].format(target))
del KILLS[vigilante]
@event_listener("begin_day") @event_listener("begin_day")
def on_begin_day(evt, var): def on_begin_day(evt, var):