Update mystics and the get_special event to be more fine-grained
This commit is contained in:
parent
1a459eebf4
commit
1d2ab6a2cc
@ -309,9 +309,19 @@
|
|||||||
"role_swap": "You have exchanged roles with someone! You are now a \u0002{0}\u0002.",
|
"role_swap": "You have exchanged roles with someone! You are now a \u0002{0}\u0002.",
|
||||||
"clone_target": "You are cloning \u0002{0}\u0002.",
|
"clone_target": "You are cloning \u0002{0}\u0002.",
|
||||||
"shaman_totem": "You have a \u0002{0}\u0002 totem.",
|
"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!",
|
"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.",
|
"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>\".",
|
"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.",
|
"wolf_bite": "You may use \"bite <nick>\" tonight in order to turn that person into a wolf.",
|
||||||
|
66
src/roles/_mystic_helper.py
Normal file
66
src/roles/_mystic_helper.py
Normal 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:
|
@ -24,7 +24,7 @@ def setup_variables(rolename):
|
|||||||
|
|
||||||
@event_listener("get_special")
|
@event_listener("get_special")
|
||||||
def on_get_special(evt, var):
|
def on_get_special(evt, var):
|
||||||
evt.data["special"].update(get_players((rolename,)))
|
evt.data["villagers"].update(get_players((rolename,)))
|
||||||
|
|
||||||
@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):
|
||||||
|
@ -133,10 +133,6 @@ def setup_variables(rolename, *, knows_totem, get_tags):
|
|||||||
if user in SHAMANS:
|
if user in SHAMANS:
|
||||||
evt.data["acted"] = True
|
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")
|
@event_listener("chk_nightdone")
|
||||||
def on_chk_nightdone(evt, var):
|
def on_chk_nightdone(evt, var):
|
||||||
evt.data["actedcount"] += len(SHAMANS)
|
evt.data["actedcount"] += len(SHAMANS)
|
||||||
|
@ -99,7 +99,7 @@ def on_acted(evt, var, user, actor):
|
|||||||
|
|
||||||
@event_listener("get_special")
|
@event_listener("get_special")
|
||||||
def on_get_special(evt, var):
|
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")
|
@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):
|
||||||
|
@ -95,4 +95,8 @@ def on_transition_night_end(evt, var):
|
|||||||
shaman.send(messages["shaman_notify"].format("crazed shaman", "random "))
|
shaman.send(messages["shaman_notify"].format("crazed shaman", "random "))
|
||||||
shaman.send("Players: " + ", ".join(p.nick for p in pl))
|
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:
|
# vim: set sw=4 expandtab:
|
||||||
|
@ -62,7 +62,7 @@ def on_del_player(evt, var, user, mainrole, allroles, death_triggers):
|
|||||||
|
|
||||||
@event_listener("get_special")
|
@event_listener("get_special")
|
||||||
def on_get_special(evt, var):
|
def on_get_special(evt, var):
|
||||||
evt.data["special"].update(get_players(("detective",)))
|
evt.data["villagers"].update(get_players(("detective",)))
|
||||||
|
|
||||||
@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):
|
||||||
|
@ -82,10 +82,6 @@ def on_doctor_immunize(evt, var, doctor, target):
|
|||||||
del SICK[n]
|
del SICK[n]
|
||||||
evt.data["message"] = "not_sick"
|
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")
|
@event_listener("chk_nightdone")
|
||||||
def on_chk_nightdone(evt, var):
|
def on_chk_nightdone(evt, var):
|
||||||
evt.data["actedcount"] += len(SEEN)
|
evt.data["actedcount"] += len(SEEN)
|
||||||
|
@ -109,7 +109,7 @@ def on_acted(evt, var, user, actor):
|
|||||||
|
|
||||||
@event_listener("get_special")
|
@event_listener("get_special")
|
||||||
def on_get_special(evt, var):
|
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)
|
@event_listener("transition_day", priority=2)
|
||||||
def on_transition_day(evt, var):
|
def on_transition_day(evt, var):
|
||||||
|
@ -136,7 +136,7 @@ def on_begin_day(evt, var):
|
|||||||
|
|
||||||
@event_listener("get_special")
|
@event_listener("get_special")
|
||||||
def on_get_special(evt, var):
|
def on_get_special(evt, var):
|
||||||
evt.data["special"].update(get_players(("harlot",)))
|
evt.data["villagers"].update(get_players(("harlot",)))
|
||||||
|
|
||||||
@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):
|
||||||
|
@ -81,7 +81,7 @@ def on_acted(evt, var, user, actor):
|
|||||||
|
|
||||||
@event_listener("get_special")
|
@event_listener("get_special")
|
||||||
def on_get_special(evt, var):
|
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)
|
@event_listener("transition_day", priority=2)
|
||||||
def on_transition_day(evt, var):
|
def on_transition_day(evt, var):
|
||||||
|
@ -98,7 +98,7 @@ def on_del_player(evt, var, user, mainrole, allroles, death_triggers):
|
|||||||
|
|
||||||
@event_listener("get_special")
|
@event_listener("get_special")
|
||||||
def on_get_special(evt, var):
|
def on_get_special(evt, var):
|
||||||
evt.data["special"].update(get_players(("investigator",)))
|
evt.data["villagers"].update(get_players(("investigator",)))
|
||||||
|
|
||||||
@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):
|
||||||
|
@ -9,64 +9,13 @@ from src.containers import UserList, UserSet, UserDict, DefaultUserDict
|
|||||||
from src.messages import messages
|
from src.messages import messages
|
||||||
from src.events import Event
|
from src.events import Event
|
||||||
|
|
||||||
@event_listener("exchange_roles")
|
from src.roles._mystic_helper import setup_variables
|
||||||
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
|
|
||||||
|
|
||||||
special = set(get_players(("harlot", "priest", "prophet", "matchmaker",
|
LAST_COUNT = setup_variables("mystic", send_role=True, types=("wolves",))
|
||||||
"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")
|
|
||||||
|
|
||||||
@event_listener("get_special")
|
@event_listener("get_special")
|
||||||
def on_get_special(evt, var):
|
def on_get_special(evt, var):
|
||||||
# mystics count as special even though they don't have any commands
|
# 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:
|
# vim: set sw=4 expandtab:
|
||||||
|
@ -185,7 +185,7 @@ def on_exchange(evt, var, actor, target, actor_role, target_role):
|
|||||||
|
|
||||||
@event_listener("get_special")
|
@event_listener("get_special")
|
||||||
def on_get_special(evt, var):
|
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")
|
@event_listener("night_acted")
|
||||||
def on_acted(evt, var, target, spy):
|
def on_acted(evt, var, target, spy):
|
||||||
|
@ -98,4 +98,8 @@ def on_transition_night_end(evt, var):
|
|||||||
shaman.send(tmsg)
|
shaman.send(tmsg)
|
||||||
shaman.send("Players: " + ", ".join(p.nick for p in pl))
|
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:
|
# vim: set sw=4 expandtab:
|
||||||
|
@ -300,7 +300,7 @@ def on_transition_day(evt, var):
|
|||||||
|
|
||||||
@event_listener("get_special")
|
@event_listener("get_special")
|
||||||
def on_get_special(evt, var):
|
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")
|
@event_listener("vg_kill")
|
||||||
def on_vg_kill(evt, var, ghost, target):
|
def on_vg_kill(evt, var, ghost, target):
|
||||||
|
@ -68,7 +68,7 @@ def on_acted(evt, var, target, spy):
|
|||||||
|
|
||||||
@event_listener("get_special")
|
@event_listener("get_special")
|
||||||
def on_get_special(evt, var):
|
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)
|
@event_listener("transition_day", priority=2)
|
||||||
def on_transition_day(evt, var):
|
def on_transition_day(evt, var):
|
||||||
|
@ -150,7 +150,7 @@ def on_acted(evt, var, user, actor):
|
|||||||
|
|
||||||
@event_listener("get_special")
|
@event_listener("get_special")
|
||||||
def on_get_special(evt, var):
|
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)
|
@event_listener("transition_day", priority=1)
|
||||||
def on_transition_day(evt, var):
|
def on_transition_day(evt, var):
|
||||||
|
18
src/roles/wolfmystic.py
Normal file
18
src/roles/wolfmystic.py
Normal 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:
|
Loading…
Reference in New Issue
Block a user