banned/src/roles/wildchild.py
2018-05-01 15:35:57 -07:00

169 lines
6.3 KiB
Python

import random
import re
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, get_main_role
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
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)))
@event_listener("see")
def on_see(evt, var, seer, target):
if target.nick in WILD_CHILDREN:
evt.data["role"] = "wild child"
@event_listener("rename_player")
def on_rename(evt, 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, var, actor, target, actor_role, target_role):
if actor_role == "wolf" and actor.nick in WILD_CHILDREN and target.nick not in WILD_CHILDREN:
WILD_CHILDREN.discard(actor.nick)
WILD_CHILDREN.add(target.nick)
elif actor_role == "wild child":
if target_role == "wild child":
IDOLS[actor.nick], IDOLS[target.nick] = IDOLS[target.nick], IDOLS[actor.nick]
evt.data["actor_messages"].append(messages["wild_child_idol"].format(IDOLS[actor.nick]))
evt.data["target_messages"].append(messages["wild_child_idol"].format(IDOLS[target.nick]))
else:
IDOLS[target.nick] = IDOLS.pop(actor.nick)
evt.data["target_messages"].append(messages["wild_child_idol"].format(IDOLS[target.nick]))
if target_role == "wolf" and target.nick in WILD_CHILDREN and actor.nick not in WILD_CHILDREN:
WILD_CHILDREN.discard(target.nick)
WILD_CHILDREN.add(actor.nick)
elif target_role == "wild child" and actor_role != "wild child":
# if they're both wild children, already swapped idols above
IDOLS[actor.nick] = IDOLS.pop(target.nick)
evt.data["actor_messages"].append(messages["wild_child_idol"].format(IDOLS[actor.nick]))
@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 in evt.params.deadlist or users._get(IDOLS[child.nick]) not in evt.params.deadlist: # FIXME
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)
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(messages["wolves_list"].format(", ".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, user, role):
if role == "wild child":
if user.nick in IDOLS:
evt.data["special_case"].append("picked {0} as idol".format(IDOLS[user.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: