166 lines
5.9 KiB
Python
166 lines
5.9 KiB
Python
import random
|
|
import re
|
|
|
|
import src.settings as var
|
|
from src.utilities import *
|
|
from src import debuglog, errlog, plog
|
|
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} ({1}) IDOLIZE: {2} ({3})".format(nick, get_role(nick), victim, get_role(victim)))
|
|
chk_nightdone(cli)
|
|
|
|
@event_listener("see")
|
|
def on_see(evt, cli, var, seer, victim):
|
|
if get_role(seer) != "augur" and 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, cli, var, nick):
|
|
if evt.data["role"] == "wild child" and nick in IDOLS:
|
|
evt.data["messages"].append(messages["wild_child_idol"].format(IDOLS[nick]))
|
|
|
|
@event_listener("del_player")
|
|
def on_del_player(evt, cli, var, nick, nickrole, nicktpls, death_triggers):
|
|
if var.PHASE not in var.GAME_PHASES:
|
|
return
|
|
|
|
for child in var.ROLES["wild child"].copy():
|
|
if child not in IDOLS or child in evt.params.deadlist or IDOLS[child] not in evt.params.deadlist:
|
|
continue
|
|
|
|
pm(cli, child, messages["idol_died"])
|
|
WILD_CHILDREN.add(child)
|
|
var.ROLES["wild child"].remove(child)
|
|
var.ROLES["wolf"].add(child)
|
|
var.FINAL_ROLES[child] = "wolf"
|
|
|
|
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 = list_players(wcroles)
|
|
wolves.remove(child)
|
|
mass_privmsg(cli, wolves, messages["wild_child_as_wolf"].format(child))
|
|
if var.PHASE == "day":
|
|
random.shuffle(wolves)
|
|
for i, wolf in enumerate(wolves):
|
|
wolfroles = get_role(wolf)
|
|
cursed = ""
|
|
if wolf in var.ROLES["cursed villager"]:
|
|
cursed = "cursed "
|
|
wolves[i] = "\u0002{0}\u0002 ({1}{2})".format(wolf, cursed, wolfroles)
|
|
|
|
if wolves:
|
|
pm(cli, child, "Wolves: " + ", ".join(wolves))
|
|
else:
|
|
pm(cli, child, messages["no_other_wolves"])
|
|
|
|
@event_listener("chk_nightdone")
|
|
def on_chk_nightdone(evt, cli, var):
|
|
if var.FIRST_NIGHT:
|
|
evt.data["actedcount"] += len(IDOLS.keys())
|
|
evt.data["nightroles"].extend(var.ROLES["wild child"])
|
|
|
|
@event_listener("transition_day_begin")
|
|
def on_transition_day_begin(evt, cli, var):
|
|
if (not var.START_WITH_DAY or not var.FIRST_DAY) and var.FIRST_NIGHT:
|
|
for child in var.ROLES["wild child"]:
|
|
if child not in IDOLS:
|
|
pl = list_players()
|
|
pl.remove(child)
|
|
if pl:
|
|
target = random.choice(pl)
|
|
IDOLS[child] = target
|
|
pm(cli, child, messages["wild_child_random_idol"].format(target))
|
|
|
|
@event_listener("transition_night_end", priority=2)
|
|
def on_transition_night_end(evt, cli, var):
|
|
for child in var.ROLES["wild child"]:
|
|
if child in var.PLAYERS and not is_user_simple(child):
|
|
pm(cli, child, messages["child_notify"])
|
|
else:
|
|
pm(cli, child, messages["child_simple"])
|
|
|
|
@event_listener("revealroles_role")
|
|
def on_revealroles_role(evt, cli, var, 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, nick):
|
|
if 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:
|