transition_day and relevant events have been converted to the users API. Additionally, VG was converted to the users API.
171 lines
6.1 KiB
Python
171 lines
6.1 KiB
Python
import random
|
|
import re
|
|
|
|
import src.settings as var
|
|
from src.utilities import *
|
|
from src import users, debuglog, errlog, plog
|
|
from src.functions import get_players, get_all_players, get_main_role
|
|
from src.decorators import cmd, event_listener
|
|
from src.messages import messages
|
|
from src.events import Event
|
|
|
|
WILD_CHILDREN = set()
|
|
IDOLS = {}
|
|
|
|
@cmd("choose", chan=False, pm=True, playing=True, phases=("night",), roles=("wild child",))
|
|
def choose_idol(cli, nick, chan, rest):
|
|
"""Pick your idol, if they die, you'll become a wolf!"""
|
|
if not var.FIRST_NIGHT:
|
|
return
|
|
if nick in IDOLS:
|
|
pm(cli, nick, messages["wild_child_already_picked"])
|
|
return
|
|
|
|
victim = get_victim(cli, nick, re.split(" +", rest)[0], False)
|
|
if not victim:
|
|
return
|
|
|
|
if nick == victim:
|
|
pm(cli, nick, messages["no_target_self"])
|
|
return
|
|
|
|
IDOLS[nick] = victim
|
|
pm(cli, nick, messages["wild_child_success"].format(victim))
|
|
|
|
debuglog("{0} (wild child) IDOLIZE: {1} ({2})".format(nick, victim, get_role(victim)))
|
|
chk_nightdone(cli)
|
|
|
|
@event_listener("see")
|
|
def on_see(evt, cli, var, seer, victim):
|
|
if victim in WILD_CHILDREN:
|
|
evt.data["role"] = "wild child"
|
|
|
|
@event_listener("rename_player")
|
|
def on_rename(evt, cli, var, prefix, nick):
|
|
if prefix in WILD_CHILDREN:
|
|
WILD_CHILDREN.remove(prefix)
|
|
WILD_CHILDREN.add(nick)
|
|
|
|
for (wildchild, idol) in IDOLS.items():
|
|
if wildchild == prefix:
|
|
IDOLS[nick] = IDOLS[wildchild]
|
|
del IDOLS[wildchild]
|
|
elif idol == prefix:
|
|
IDOLS[wildchild] = nick
|
|
|
|
@event_listener("exchange_roles")
|
|
def on_exchange(evt, cli, var, actor, nick, actor_role, nick_role):
|
|
if actor_role == "wolf" and actor in WILD_CHILDREN and nick not in WILD_CHILDREN:
|
|
WILD_CHILDREN.discard(actor)
|
|
WILD_CHILDREN.add(nick)
|
|
elif actor_role == "wild child":
|
|
if nick_role == "wild child":
|
|
temp = IDOLS[nick]
|
|
IDOLS[nick] = IDOLS[actor]
|
|
IDOLS[actor] = temp
|
|
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:
|
|
IDOLS[nick] = IDOLS.pop(actor)
|
|
evt.data["nick_messages"].append(messages["wild_child_idol"].format(IDOLS[nick]))
|
|
if nick_role == "wolf" and nick in WILD_CHILDREN and actor not in WILD_CHILDREN:
|
|
WILD_CHILDREN.discard(nick)
|
|
WILD_CHILDREN.add(actor)
|
|
elif nick_role == "wild child" and actor_role != "wild child":
|
|
# if they're both wild children, already swapped idols above
|
|
IDOLS[actor] = IDOLS.pop(nick)
|
|
evt.data["actor_messages"].append(messages["wild_child_idol"].format(IDOLS[actor]))
|
|
|
|
@event_listener("myrole")
|
|
def on_myrole(evt, var, user):
|
|
if user.nick in IDOLS:
|
|
evt.data["messages"].append(messages["wild_child_idol"].format(IDOLS[user.nick]))
|
|
|
|
@event_listener("del_player")
|
|
def on_del_player(evt, var, user, mainrole, allroles, death_triggers):
|
|
if var.PHASE not in var.GAME_PHASES:
|
|
return
|
|
|
|
for child in get_all_players(("wild child",)):
|
|
if child.nick not in IDOLS or child.nick in evt.params.deadlist or IDOLS[child.nick] not in evt.params.deadlist:
|
|
continue
|
|
|
|
# change their main role to wolf, even if wild child was a template
|
|
child.send(messages["idol_died"])
|
|
WILD_CHILDREN.add(child.nick)
|
|
change_role(child, get_main_role(child), "wolf")
|
|
var.ROLES["wild child"].discard(child.nick)
|
|
|
|
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"}
|
|
wolves = get_players(wcroles)
|
|
wolves.remove(child)
|
|
if wolves:
|
|
for wolf in wolves:
|
|
wolf.queue_message(messages["wild_child_as_wolf"].format(child))
|
|
wolf.send_messages()
|
|
if var.PHASE == "day":
|
|
random.shuffle(wolves)
|
|
new = []
|
|
for i, wolf in enumerate(wolves):
|
|
wolfroles = get_main_role(wolf)
|
|
cursed = ""
|
|
if wolf in get_all_players(("cursed villager",)):
|
|
cursed = "cursed "
|
|
new.append("\u0002{0}\u0002 ({1}{2})".format(wolf, cursed, wolfroles))
|
|
|
|
if new:
|
|
child.send("Wolves: " + ", ".join(new))
|
|
else:
|
|
child.send(messages["no_other_wolves"])
|
|
|
|
@event_listener("chk_nightdone")
|
|
def on_chk_nightdone(evt, var):
|
|
if var.FIRST_NIGHT:
|
|
evt.data["actedcount"] += len(IDOLS.keys())
|
|
evt.data["nightroles"].extend(get_all_players(("wild child",)))
|
|
|
|
@event_listener("transition_day_begin")
|
|
def on_transition_day_begin(evt, var):
|
|
if (not var.START_WITH_DAY or not var.FIRST_DAY) and var.FIRST_NIGHT:
|
|
for child in get_all_players(("wild child",)):
|
|
if child.nick not in IDOLS:
|
|
pl = get_players()
|
|
pl.remove(child)
|
|
if pl:
|
|
target = random.choice(pl)
|
|
IDOLS[child.nick] = target.nick
|
|
child.send(messages["wild_child_random_idol"].format(target))
|
|
|
|
@event_listener("transition_night_end", priority=2)
|
|
def on_transition_night_end(evt, var):
|
|
for child in get_all_players(("wild child",)):
|
|
to_send = "child_notify"
|
|
if child.prefers_simple():
|
|
to_send = "child_simple"
|
|
child.send(messages[to_send])
|
|
|
|
@event_listener("revealroles_role")
|
|
def on_revealroles_role(evt, var, wrapper, nick, role):
|
|
if role == "wild child":
|
|
if nick in IDOLS:
|
|
evt.data["special_case"].append("picked {0} as idol".format(IDOLS[nick]))
|
|
else:
|
|
evt.data["special_case"].append("no idol picked yet")
|
|
|
|
@event_listener("get_reveal_role")
|
|
def on_get_reveal_role(evt, var, user):
|
|
if user.nick in WILD_CHILDREN:
|
|
evt.data["role"] = "wild child"
|
|
|
|
@event_listener("reset")
|
|
def on_reset(evt, var):
|
|
WILD_CHILDREN.clear()
|
|
IDOLS.clear()
|
|
|
|
# vim: set sw=4 expandtab:
|