Esempio n. 1
0
from src.functions import get_all_roles
from src.decorators import event_listener
from src.roles.helper.wolves import register_wolf

register_wolf("werekitten")


@event_listener("gun_shoot")
def on_gun_shoot(evt, var, user, target, role):
    if "werekitten" in get_all_roles(target):
        evt.data["hit"] = False
        evt.data["kill"] = False


@event_listener("get_role_metadata")
def on_get_role_metadata(evt, var, kind):
    if kind == "role_categories":
        evt.data["werekitten"] = {
            "Wolf", "Wolfchat", "Wolfteam", "Innocent", "Killer", "Nocturnal",
            "Village Objective", "Wolf Objective"
        }
Esempio n. 2
0
import re
import random
import itertools
import math
from collections import defaultdict

from src.utilities import *
from src import users, channels, status, debuglog, errlog, plog
from src.decorators import command, event_listener
from src.containers import UserList, UserSet, UserDict, DefaultUserDict
from src.functions import get_players, get_all_players
from src.messages import messages
from src.status import try_misdirection, try_exchange
from src.cats import Wolf

from src.roles.helper.wolves import register_wolf

register_wolf("fallen angel")

@event_listener("try_protection")
def on_try_protection(evt, var, target, attacker, attacker_role, reason):
    if attacker_role == "wolf" and get_all_players(("fallen angel",)):
        status.remove_all_protections(var, target, attacker=None, attacker_role="fallen angel", reason="fallen_angel")
        evt.prevent_default = True

@event_listener("get_role_metadata")
def on_get_role_metadata(evt, var, kind):
    if kind == "role_categories":
        evt.data["fallen angel"] = {"Wolf", "Wolfchat", "Wolfteam", "Killer", "Nocturnal"}
Esempio n. 3
0
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, get_all_roles, get_target, get_main_role, change_role
from src.decorators import command, event_listener
from src.containers import UserList, UserSet, UserDict, DefaultUserDict
from src.messages import messages
from src.status import try_misdirection, try_exchange, add_lycanthropy, add_lycanthropy_scope
from src.cats import Wolf, All
from src.roles.helper.wolves import is_known_wolf_ally, send_wolfchat_message, register_wolf

register_wolf("alpha wolf")

ENABLED = False
ALPHAS = UserSet() # type: UserSet[users.User]
BITTEN = UserDict() # type: UserDict[users.User, users.User]

@command("bite", chan=False, pm=True, playing=True, silenced=True, phases=("night",), roles=("alpha wolf",))
def observe(var, wrapper, message):
    """Turn a player into a wolf!"""
    if not ENABLED:
        wrapper.pm(messages["alpha_no_bite"])
        return
    if wrapper.source in ALPHAS:
        wrapper.pm(messages["alpha_already_bit"])
        return
    target = get_target(var, wrapper, re.split(" +", message)[0])
    if not target:
        return
Esempio n. 4
0
import random
import itertools
import math
from collections import defaultdict

from src.utilities import *
from src import channels, users, debuglog, errlog, plog
from src.functions import get_players, get_all_players, get_main_role, get_reveal_role, get_target
from src.decorators import command, event_listener
from src.containers import UserList, UserSet, UserDict, DefaultUserDict
from src.messages import messages
from src.status import try_misdirection, try_exchange, add_silent

from src.roles.helper.wolves import is_known_wolf_ally, send_wolfchat_message, register_wolf

register_wolf("hag")

HEXED = UserDict()  # type: UserDict[users.User, users.User]
LASTHEXED = UserDict()  # type: UserDict[users.User, users.User]


@command("hex",
         chan=False,
         pm=True,
         playing=True,
         silenced=True,
         phases=("night", ),
         roles=("hag", ))
def hex_cmd(var, wrapper, message):
    """Hex someone, preventing them from acting the next day and night."""
    if wrapper.source in HEXED:
Esempio n. 5
0
import re
import random
import itertools
import math
from collections import defaultdict

from src import debuglog, errlog, plog, users, channels
from src.decorators import command, event_listener
from src.containers import UserList, UserSet, UserDict, DefaultUserDict
from src.messages import messages
from src.status import in_misdirection_scope
from src.events import Event
from src.roles.helper.wolves import register_wolf, get_wolfchat_roles
from src.cats import All, Wolf

register_wolf("traitor")

@event_listener("get_reveal_role")
def on_get_reveal_role(evt, var, user):
    # in team reveal, show traitor as wolfteam, otherwise team stats won't sync with how
    # they're revealed upon death. Team stats should show traitor as wolfteam or else
    # the stats are wrong in that they'll report one less wolf than actually exists,
    # which can confuse a lot of people
    if evt.data["role"] == "traitor" and var.HIDDEN_TRAITOR and var.ROLE_REVEAL != "team":
        evt.data["role"] = var.HIDDEN_ROLE

@event_listener("get_final_role")
def on_get_final_role(evt, var, user, role):
    # if a traitor turns we want to show them as traitor in the end game readout
    # instead of "wolf (was traitor)"
    if role == "traitor" and evt.data["role"] == "wolf":
Esempio n. 6
0
from src import debuglog, errlog, plog, users, channels
from src.functions import get_players, get_all_players, get_main_role, get_reveal_role, get_target
from src.decorators import command, event_listener
from src.containers import UserList, UserSet, UserDict, DefaultUserDict
from src.dispatcher import MessageDispatcher
from src.messages import messages
from src.events import Event
from src.status import try_misdirection, try_exchange, is_silent

from src.roles.helper.shamans import get_totem_target, give_totem, setup_variables, totem_message
from src.roles.helper.wolves import register_wolf, send_wolfchat_message

TOTEMS, LASTGIVEN, SHAMANS, RETARGET = setup_variables("wolf shaman",
                                                       knows_totem=True)

register_wolf("wolf shaman")


@command("totem",
         chan=False,
         pm=True,
         playing=True,
         silenced=True,
         phases=("night", ),
         roles=("wolf shaman", ))
def wolf_shaman_totem(var, wrapper, message):
    """Give a totem to a player."""

    totem_types = list(TOTEMS[wrapper.source].keys())
    totem, target = get_totem_target(var, wrapper, message, LASTGIVEN,
                                     totem_types)
Esempio n. 7
0
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, get_all_roles, get_target, get_main_role
from src.decorators import command, event_listener
from src.containers import UserList, UserSet, UserDict, DefaultUserDict
from src.messages import messages
from src.status import try_misdirection, try_exchange
from src.cats import Nocturnal
from src.roles.helper.wolves import is_known_wolf_ally, send_wolfchat_message, register_wolf

register_wolf("werecrow")

OBSERVED = UserDict()  # type: UserDict[users.User, users.User]


@command("observe",
         chan=False,
         pm=True,
         playing=True,
         silenced=True,
         phases=("night", ),
         roles=("werecrow", ))
def observe(var, wrapper, message):
    """Observe a player to see whether they are able to act at night."""
    if wrapper.source in OBSERVED:
        wrapper.pm(messages["werecrow_already_observing"].format(
            OBSERVED[wrapper.source]))
        return
Esempio n. 8
0
import math

from src.events import Event, find_listener
from src.functions import get_players, get_all_players
from src.decorators import event_listener
from src.messages import messages

from src.roles.helper.gunners import setup_variables
from src.roles.helper.wolves import register_wolf, is_known_wolf_ally

register_wolf("wolf gunner")
GUNNERS = setup_variables("wolf gunner")
# unregister the gunner night message and send the number of bullets a different way
find_listener("transition_night_end",
              "gunners.<wolf gunner>.on_transition_night_end").remove(
                  "transition_night_end")
# wolf gunners don't shoot other wolves at night nor get their gun stolen
find_listener("transition_day_resolve_end",
              "gunners.<wolf gunner>.on_transition_day_resolve_end").remove(
                  "transition_day_resolve_end")


@event_listener("transition_night_end")
def on_transition_night_end(evt, var):
    gunners = get_all_players(("wolf gunner", ))
    for gunner in gunners:
        if GUNNERS[gunner] or var.ALWAYS_PM_ROLE:
            gunner.send(messages["gunner_bullets"].format(GUNNERS[gunner]))


@event_listener("gun_shoot")
Esempio n. 9
0
from src.decorators import event_listener
from src.roles.helper.wolves import register_wolf

register_wolf("cult leader")


@event_listener("get_role_metadata")
def on_get_role_metadata(evt, var, kind):
    if kind == "role_categories":
        evt.data["cult leader"] = {"Wolfchat", "Wolfteam"}
Esempio n. 10
0
import re
import random

from src import users, channels, status, debuglog, errlog, plog
from src.functions import get_players, get_all_players, get_main_role, get_target
from src.decorators import command, event_listener
from src.containers import UserList, UserSet, UserDict, DefaultUserDict
from src.messages import messages
from src.status import try_misdirection, try_exchange
from src.cats import All

from src.roles.helper.wolves import is_known_wolf_ally, register_wolf, send_wolfchat_message

register_wolf("doomsayer")

SEEN = UserSet()
LASTSEEN = UserDict()  # type: UserDict[users.User, users.User]
KILLS = UserDict()
SICK = UserDict()
LYCANS = UserDict()

_mappings = ("death", KILLS), ("lycan", LYCANS), ("sick", SICK)


@command("see",
         chan=False,
         pm=True,
         playing=True,
         silenced=True,
         phases=("night", ),
         roles=("doomsayer", ))
Esempio n. 11
0
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 command, event_listener
from src.containers import UserList, UserSet, UserDict, DefaultUserDict
from src.messages import messages
from src.status import try_misdirection, try_exchange

from src.roles.helper.mystics import register_mystic
from src.roles.helper.wolves import register_wolf

register_mystic("wolf mystic", send_role=False, types=("Safe", "Win Stealer"))
register_wolf("wolf mystic")


@event_listener("get_role_metadata")
def on_get_role_metadata(evt, var, kind):
    if kind == "role_categories":
        evt.data["wolf mystic"] = {
            "Wolf", "Wolfchat", "Wolfteam", "Killer", "Nocturnal", "Intuitive"
        }
Esempio n. 12
0
from src.decorators import event_listener
from src.roles.helper.wolves import register_wolf

register_wolf("wolf")


@event_listener("get_role_metadata")
def on_get_role_metadata(evt, var, kind):
    if kind == "role_categories":
        evt.data["wolf"] = {
            "Wolf", "Wolfchat", "Wolfteam", "Killer", "Nocturnal"
        }
Esempio n. 13
0
import re
import random
from collections import defaultdict

from src.utilities import *
from src.functions import get_players
from src import debuglog, errlog, plog, users, channels
from src.decorators import command, event_listener
from src.containers import UserList, UserSet, UserDict, DefaultUserDict
from src.messages import messages
from src.status import try_misdirection, try_exchange
from src.cats import Wolf, Killer

from src.roles.helper.wolves import wolf_can_kill, register_wolf

register_wolf("wolf cub")
ANGRY_WOLVES = False

@event_listener("wolf_numkills")
def on_wolf_numkills(evt, var):
    if ANGRY_WOLVES:
        evt.data["numkills"] = max(evt.data["numkills"], 2)

@event_listener("del_player")
def on_del_player(evt, var, player, all_roles, death_triggers):
    if death_triggers and "wolf cub" in all_roles:
        global ANGRY_WOLVES
        ANGRY_WOLVES = True

@event_listener("new_role")
def on_new_role(evt, var, player, old_role):
Esempio n. 14
0
import re
import random
import itertools
import math
from collections import defaultdict

from src.utilities import *
from src import channels, users, debuglog, errlog, plog
from src.functions import get_players, get_all_players, get_main_role, get_reveal_role, get_target
from src.decorators import command, event_listener
from src.containers import UserList, UserSet, UserDict, DefaultUserDict
from src.messages import messages
from src.status import try_misdirection, try_exchange
from src.roles.helper.wolves import get_wolfchat_roles, is_known_wolf_ally, send_wolfchat_message, get_wolflist, register_wolf

register_wolf("warlock")

CURSED = UserDict() # type: UserDict[users.User, users.User]
PASSED = UserSet() # type: UserSet[users.Set]

@command("curse", chan=False, pm=True, playing=True, silenced=True, phases=("night",), roles=("warlock",))
def curse(var, wrapper, message):
    target = get_target(var, wrapper, re.split(" +", message)[0])
    if not target:
        return

    if target in get_all_players(("cursed villager",)):
        wrapper.pm(messages["target_already_cursed"].format(target))
        return

    # There may actually be valid strategy in cursing other wolfteam members,
Esempio n. 15
0
from src import channels
from src.messages import messages
from src.decorators import event_listener
from src.containers import UserSet
from src.functions import get_all_players, get_all_roles
from src.status import add_lynch_immunity
from src.roles.helper.wolves import register_wolf

ACTIVATED = UserSet()

register_wolf("tough wolf")


@event_listener("reset")
def on_reset(evt, var):
    ACTIVATED.clear()


@event_listener("transition_day_begin")
def on_transition_day_begin(evt, var):
    for player in get_all_players(("tough wolf", )):
        if player not in ACTIVATED:
            add_lynch_immunity(var, player, "tough_wolf")


@event_listener("lynch_immunity")
def on_lynch_immunity(evt, var, player, reason):
    if reason == "tough_wolf":
        channels.Main.send(messages["tough_wolf_reveal"].format(player))
        evt.data["immune"] = True
        ACTIVATED.add(player)
Esempio n. 16
0
import random
import itertools
import math
from collections import defaultdict

from src.utilities import *
from src import channels, users, debuglog, errlog, plog
from src.functions import get_players, get_all_players, get_main_role, get_reveal_role, get_target
from src.decorators import command, event_listener
from src.containers import UserList, UserSet, UserDict, DefaultUserDict
from src.messages import messages
from src.status import try_misdirection, try_exchange
from src.cats import Spy
from src.roles.helper.wolves import is_known_wolf_ally, send_wolfchat_message, register_wolf

register_wolf("sorcerer")

OBSERVED = UserSet()  # type: UserSet[users.User]


@command("observe",
         chan=False,
         pm=True,
         playing=True,
         silenced=True,
         phases=("night", ),
         roles=("sorcerer", ))
def observe(var, wrapper, message):
    """Observe a player to obtain various information."""
    target = get_target(var,
                        wrapper,