Convert chk_decision, chk_nightdone, transition_day, transition_night, doomsayer, mayor, and convert+split shamans in three files with a shared helper. Fixes and updates for the User containers, and some other tweaks and fixes.
108 lines
3.7 KiB
Python
108 lines
3.7 KiB
Python
import math
|
|
import re
|
|
import random
|
|
|
|
import src.settings as var
|
|
from src.utilities import *
|
|
from src import users, channels, debuglog, errlog, plog
|
|
from src.functions import get_players, get_all_players
|
|
from src.decorators import cmd, event_listener
|
|
from src.containers import UserList, UserSet, UserDict, DefaultUserDict
|
|
from src.messages import messages
|
|
from src.events import Event
|
|
|
|
INVESTIGATED = set()
|
|
|
|
@cmd("id", chan=False, pm=True, playing=True, silenced=True, phases=("day",), roles=("detective",))
|
|
def investigate(cli, nick, chan, rest):
|
|
"""Investigate a player to determine their exact role."""
|
|
if nick in INVESTIGATED:
|
|
pm(cli, nick, messages["already_investigated"])
|
|
return
|
|
victim = get_victim(cli, nick, re.split(" +",rest)[0], False)
|
|
if not victim:
|
|
return
|
|
|
|
if victim == nick:
|
|
pm(cli, nick, messages["no_investigate_self"])
|
|
return
|
|
|
|
det = users._get(nick) # FIXME
|
|
target = users._get(victim) # FIXME
|
|
|
|
evt = Event("targeted_command", {"target": target, "misdirection": True, "exchange": True})
|
|
evt.dispatch(var, "identify", det, target, frozenset({"info", "immediate"}))
|
|
if evt.prevent_default:
|
|
return
|
|
victim = evt.data["target"].nick
|
|
vrole = get_role(victim)
|
|
if vrole == "amnesiac":
|
|
vrole = var.AMNESIAC_ROLES[victim]
|
|
|
|
evt = Event("investigate", {"role": vrole})
|
|
evt.dispatch(cli, var, nick, victim)
|
|
vrole = evt.data["role"]
|
|
|
|
INVESTIGATED.add(nick)
|
|
pm(cli, nick, (messages["investigate_success"]).format(victim, vrole))
|
|
debuglog("{0} ({1}) ID: {2} ({3})".format(nick, get_role(nick), victim, vrole))
|
|
|
|
if random.random() < var.DETECTIVE_REVEALED_CHANCE: # a 2/5 chance (should be changeable in settings)
|
|
# The detective's identity is compromised!
|
|
wcroles = var.WOLFCHAT_ROLES
|
|
if var.RESTRICT_WOLFCHAT & var.RW_REM_NON_WOLVES:
|
|
if var.RESTRICT_WOLFCHAT & var.RW_TRAITOR_NON_WOLF:
|
|
wcroles = var.WOLF_ROLES
|
|
else:
|
|
wcroles = var.WOLF_ROLES | {"traitor"}
|
|
|
|
mass_privmsg(cli, list_players(wcroles), messages["detective_reveal"].format(nick))
|
|
debuglog("{0} ({1}) PAPER DROP".format(nick, get_role(nick)))
|
|
|
|
@event_listener("rename_player")
|
|
def on_rename(evt, var, prefix, nick):
|
|
if prefix in INVESTIGATED:
|
|
INVESTIGATED.remove(prefix)
|
|
INVESTIGATED.add(nick)
|
|
|
|
@event_listener("del_player")
|
|
def on_del_player(evt, var, user, mainrole, allroles, death_triggers):
|
|
INVESTIGATED.discard(user.nick)
|
|
|
|
@event_listener("get_special")
|
|
def on_get_special(evt, var):
|
|
evt.data["special"].update(get_players(("detective",)))
|
|
|
|
@event_listener("exchange_roles")
|
|
def on_exchange(evt, var, actor, target, actor_role, target_role):
|
|
if actor_role == "detective" and target_role != "detective":
|
|
INVESTIGATED.discard(actor.nick)
|
|
elif target_role == "detective" and actor_role != "detective":
|
|
INVESTIGATED.discard(target.nick)
|
|
|
|
@event_listener("transition_night_end", priority=2)
|
|
def on_transition_night_end(evt, var):
|
|
ps = get_players()
|
|
for dttv in var.ROLES["detective"]:
|
|
pl = ps[:]
|
|
random.shuffle(pl)
|
|
pl.remove(dttv)
|
|
chance = math.floor(var.DETECTIVE_REVEALED_CHANCE * 100)
|
|
warning = ""
|
|
if chance > 0:
|
|
warning = messages["detective_chance"].format(chance)
|
|
to_send = "detective_notify"
|
|
if dttv.prefers_simple():
|
|
to_send = "detective_simple"
|
|
dttv.send(messages[to_send].format(warning), "Players: " + ", ".join(p.nick for p in pl), sep="\n")
|
|
|
|
@event_listener("transition_night_begin")
|
|
def on_transition_night_begin(evt, var):
|
|
INVESTIGATED.clear()
|
|
|
|
@event_listener("reset")
|
|
def on_reset(evt, var):
|
|
INVESTIGATED.clear()
|
|
|
|
# vim: set sw=4 expandtab:
|