Update mystics and the get_special event to be more fine-grained

This commit is contained in:
Vgr E. Barry 2018-04-25 22:48:48 -04:00
parent 1a459eebf4
commit 1d2ab6a2cc
19 changed files with 118 additions and 75 deletions

View File

@ -309,9 +309,19 @@
"role_swap": "You have exchanged roles with someone! You are now a \u0002{0}\u0002.",
"clone_target": "You are cloning \u0002{0}\u0002.",
"shaman_totem": "You have a \u0002{0}\u0002 totem.",
"mystic_info": "There {0} \u0002{1}\u0002 evil villager{2} still alive.",
"players_exchanged_roles": "\u0002{0}\u0002 and \u0002{1}\u0002 have exchanged roles!",
"wolf_mystic_info": "There {0} \u0002{1}\u0002 special villager{2} still alive.",
"mystic_info_singular": "There is \u00021\u0002 evil villager still alive.",
"mystic_info_plural": "There are \u0002{0}\u0002 evil villagers still alive.",
"mystic_info_night_singular": "There was \u00021\u0002 evil villager alive at the beginning of the night.",
"mystic_info_night_plural": "There were \u0002{0}\u0002 evil villagers alive at the beginning of the night.",
"mystic_info_day_singular": "There was \u00021\u0002 evil villager alive at the beginning of last night.",
"mystic_info_day_plural": "There were \u0002{0}\u0002 evil villagers alive at the beginning of last night.",
"wolf_mystic_info_singular": "There is \u00021\u0002 special villager still alive.",
"wolf_mystic_info_plural": "There are \u0002{0}\u0002 special villagers still alive.",
"wolf_mystic_info_night_singular": "There was \u00021\u0002 special villager alive at the beginning of the night.",
"wolf_mystic_info_night_plural": "There were \u0002{0}\u0002 special villagers alive at the beginning of the night.",
"wolf_mystic_info_day_singular": "There was \u00021\u0002 special villager alive at the beginning of last night.",
"wolf_mystic_info_day_plural": "There were \u0002{0}\u0002 special villagers alive at the beginning of last night.",
"ill_wolves": "You are feeling ill tonight, and are unable to kill anyone.",
"angry_wolves": "You are \u0002angry\u0002 tonight, and may kill two targets by using \"kill <nick1> and <nick2>\".",
"wolf_bite": "You may use \"bite <nick>\" tonight in order to turn that person into a wolf.",

View File

@ -0,0 +1,66 @@
import re
import random
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
def setup_variables(rolename, *, send_role, types):
LAST_COUNT = UserDict() # type: Dict[users.User, int]
role = rolename.replace(" ", "_")
@event_listener("transition_night_end")
def on_transition_night_end(evt, var):
villagers = set(get_players(("priest", "prophet", "matchmaker", "doctor")))
win_stealers = set(get_players(("fool", "monster", "demoniac")))
neutrals = set(get_players(("turncoat", "clone", "jester")))
special_evt = Event("get_special", {"villagers": villagers, "wolves": set(), "win_stealers": win_stealers, "neutrals": neutrals})
special_evt.dispatch(var)
targets = set()
for name in types:
targets.update(special_evt.data[name])
count = len(targets)
key = "{0}_info_{1}".format(role, ("singular" if count == 1 else "plural"))
for mystic in get_all_players((rolename,)):
LAST_COUNT[mystic] = count
if send_role:
to_send = "{0}_{1}".format(role, ("simple" if mystic.prefers_simple() else "notify"))
mystic.send(messages[to_send])
mystic.send(messages[key].format(count))
@event_listener("exchange_roles")
def on_exchange_roles(evt, var, actor, target, actor_role, target_role):
if actor_role == rolename and target_role != rolename:
count = LAST_COUNT.pop(actor)
LAST_COUNT[target] = count
key = "{0}_info_{1}_{2}".format(role, var.PHASE, ("singular" if count == 1 else "plural"))
evt.data["target_messages"].append(messages[key].format(count))
if target_role == rolename and actor_role != rolename:
count = LAST_COUNT.pop(target)
LAST_COUNT[actor] = count
key = "{0}_info_{1}_{2}".format(role, var.PHASE, ("singular" if count == 1 else "plural"))
evt.data["actor_messages"].append(messages[key].format(count))
@event_listener("reset")
def on_reset(evt, var):
LAST_COUNT.clear()
@event_listener("myrole")
def on_myrole(evt, var, user):
if user in get_all_players((rolename,)):
key = "{0}_info_{1}_{2}".format(role, var.PHASE, ("singular" if LAST_COUNT[user] == 1 else "plural"))
evt.data["messages"].append(messages[key].format(LAST_COUNT[user]))
return LAST_COUNT
# vim: set sw=4 expandtab:

View File

@ -24,7 +24,7 @@ def setup_variables(rolename):
@event_listener("get_special")
def on_get_special(evt, var):
evt.data["special"].update(get_players((rolename,)))
evt.data["villagers"].update(get_players((rolename,)))
@event_listener("exchange_roles")
def on_exchange(evt, var, actor, target, actor_role, target_role):

View File

@ -133,10 +133,6 @@ def setup_variables(rolename, *, knows_totem, get_tags):
if user in SHAMANS:
evt.data["acted"] = True
@event_listener("get_special")
def on_get_special(evt, var):
evt.data["special"].update(get_players((rolename,)))
@event_listener("chk_nightdone")
def on_chk_nightdone(evt, var):
evt.data["actedcount"] += len(SHAMANS)

View File

@ -99,7 +99,7 @@ def on_acted(evt, var, user, actor):
@event_listener("get_special")
def on_get_special(evt, var):
evt.data["special"].update(get_players(("guardian angel", "bodyguard")))
evt.data["villagers"].update(get_players(("guardian angel", "bodyguard")))
@event_listener("exchange_roles")
def on_exchange(evt, var, actor, target, actor_role, target_role):

View File

@ -95,4 +95,8 @@ def on_transition_night_end(evt, var):
shaman.send(messages["shaman_notify"].format("crazed shaman", "random "))
shaman.send("Players: " + ", ".join(p.nick for p in pl))
@event_listener("get_special")
def on_get_special(evt, var):
evt.data["neutrals"].update(get_players(("crazed shaman",)))
# vim: set sw=4 expandtab:

View File

@ -62,7 +62,7 @@ def on_del_player(evt, var, user, mainrole, allroles, death_triggers):
@event_listener("get_special")
def on_get_special(evt, var):
evt.data["special"].update(get_players(("detective",)))
evt.data["villagers"].update(get_players(("detective",)))
@event_listener("exchange_roles")
def on_exchange(evt, var, actor, target, actor_role, target_role):

View File

@ -82,10 +82,6 @@ def on_doctor_immunize(evt, var, doctor, target):
del SICK[n]
evt.data["message"] = "not_sick"
@event_listener("get_special")
def on_get_special(evt, var):
evt.data["special"].update(get_players(("doomsayer",)))
@event_listener("chk_nightdone")
def on_chk_nightdone(evt, var):
evt.data["actedcount"] += len(SEEN)

View File

@ -109,7 +109,7 @@ def on_acted(evt, var, user, actor):
@event_listener("get_special")
def on_get_special(evt, var):
evt.data["special"].update(get_players(("dullahan",)))
evt.data["neutrals"].update(get_players(("dullahan",)))
@event_listener("transition_day", priority=2)
def on_transition_day(evt, var):

View File

@ -136,7 +136,7 @@ def on_begin_day(evt, var):
@event_listener("get_special")
def on_get_special(evt, var):
evt.data["special"].update(get_players(("harlot",)))
evt.data["villagers"].update(get_players(("harlot",)))
@event_listener("del_player")
def on_del_player(evt, var, user, mainrole, allroles, death_triggers):

View File

@ -81,7 +81,7 @@ def on_acted(evt, var, user, actor):
@event_listener("get_special")
def on_get_special(evt, var):
evt.data["special"].update(get_players(("hunter",)))
evt.data["villagers"].update(get_players(("hunter",)))
@event_listener("transition_day", priority=2)
def on_transition_day(evt, var):

View File

@ -98,7 +98,7 @@ def on_del_player(evt, var, user, mainrole, allroles, death_triggers):
@event_listener("get_special")
def on_get_special(evt, var):
evt.data["special"].update(get_players(("investigator",)))
evt.data["villagers"].update(get_players(("investigator",)))
@event_listener("exchange_roles")
def on_exchange(evt, var, actor, target, actor_role, target_role):

View File

@ -9,64 +9,13 @@ from src.containers import UserList, UserSet, UserDict, DefaultUserDict
from src.messages import messages
from src.events import Event
@event_listener("exchange_roles")
def on_exchange(evt, var, actor, target, actor_role, target_role):
if actor_role not in ("mystic", "wolf mystic") and target_role not in ("mystic", "wolf mystic"):
return
from src.roles._mystic_helper import setup_variables
special = set(get_players(("harlot", "priest", "prophet", "matchmaker",
"doctor", "hag", "sorcerer", "turncoat", "clone")))
evt2 = Event("get_special", {"special": special})
evt2.dispatch(var)
pl = set(get_players())
wolves = set(get_players(var.WOLFTEAM_ROLES))
neutral = set(get_players(var.TRUE_NEUTRAL_ROLES))
special = evt2.data["special"]
if target_role == "wolf mystic" and actor_role != "wolf mystic":
# # of special villagers = # of players - # of villagers - # of wolves - # of neutrals
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 ""))
elif target_role == "mystic" and actor_role != "mystic":
numevil = len(wolves)
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 target_role != "wolf mystic":
# # of special villagers = # of players - # of villagers - # of wolves - # of neutrals
numvills = len(special & (pl - wolves - neutral))
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 target_role != "mystic":
numevil = len(wolves)
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)
def on_transition_night_end(evt, var):
# init with all roles that haven't been split yet
special = set(get_players(("harlot", "priest", "prophet", "matchmaker",
"doctor", "hag", "sorcerer", "turncoat", "clone")))
evt2 = Event("get_special", {"special": special})
evt2.dispatch(var)
pl = set(get_players())
wolves = set(get_players(var.WOLFTEAM_ROLES))
neutral = set(get_players(var.TRUE_NEUTRAL_ROLES))
special = evt2.data["special"]
for wolf in get_all_players(("wolf mystic",)):
# if adding this info to !myrole, you will need to save off this count so that they can't get updated info until the next night
# # of special villagers = # of players - # of villagers - # of wolves - # of neutrals
numvills = len(special & (pl - wolves - neutral))
wolf.send(messages["wolf_mystic_info"].format("are" if numvills != 1 else "is", numvills, "s" if numvills != 1 else ""))
for mystic in get_all_players(("mystic",)):
to_send = "mystic_notify"
if mystic.prefers_simple():
to_send = "mystic_simple"
# if adding this info to !myrole, you will need to save off this count so that they can't get updated info until the next night
numevil = len(wolves)
mystic.send(messages[to_send], messages["mystic_info"].format("are" if numevil != 1 else "is", numevil, "s" if numevil != 1 else ""), sep="\n")
LAST_COUNT = setup_variables("mystic", send_role=True, types=("wolves",))
@event_listener("get_special")
def on_get_special(evt, var):
# mystics count as special even though they don't have any commands
evt.data["special"].update(get_players(("mystic",)))
evt.data["villagers"].update(get_players(("mystic",)))
# vim: set sw=4 expandtab:

View File

@ -185,7 +185,7 @@ def on_exchange(evt, var, actor, target, actor_role, target_role):
@event_listener("get_special")
def on_get_special(evt, var):
evt.data["special"].update(get_players(("piper",)))
evt.data["win_stealers"].update(get_players(("piper",)))
@event_listener("night_acted")
def on_acted(evt, var, target, spy):

View File

@ -98,4 +98,8 @@ def on_transition_night_end(evt, var):
shaman.send(tmsg)
shaman.send("Players: " + ", ".join(p.nick for p in pl))
@event_listener("get_special")
def on_get_special(evt, var):
evt.data["villagers"].update(get_players(("shaman",)))
# vim: set sw=4 expandtab:

View File

@ -300,7 +300,7 @@ def on_transition_day(evt, var):
@event_listener("get_special")
def on_get_special(evt, var):
evt.data["special"].update(get_players(("succubus",)))
evt.data["win_stealers"].update(get_players(("succubus",)))
@event_listener("vg_kill")
def on_vg_kill(evt, var, ghost, target):

View File

@ -68,7 +68,7 @@ def on_acted(evt, var, target, spy):
@event_listener("get_special")
def on_get_special(evt, var):
evt.data["special"].update(get_players(("vigilante",)))
evt.data["villagers"].update(get_players(("vigilante",)))
@event_listener("transition_day", priority=2)
def on_transition_day(evt, var):

View File

@ -150,7 +150,7 @@ def on_acted(evt, var, user, actor):
@event_listener("get_special")
def on_get_special(evt, var):
evt.data["special"].update(get_players(CAN_KILL))
evt.data["wolves"].update(get_players(var.WOLFCHAT_ROLES))
@event_listener("transition_day", priority=1)
def on_transition_day(evt, var):

18
src/roles/wolfmystic.py Normal file
View File

@ -0,0 +1,18 @@
import re
import random
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
from src.roles._mystic_helper import setup_variables
LAST_COUNT = setup_variables("wolf mystic", send_role=False, types=("villagers", "win_stealers"))
# No need for get_special, as wolf.py does it for us (for now)
# vim: set sw=4 expandtab: