Merge pull request #299 from lykoss/convert_del_player
Convert del_player to Users
This commit is contained in:
commit
9c67f73f5b
@ -1143,9 +1143,9 @@ class SleepyMode(GameMode):
|
|||||||
if mainrole == "priest":
|
if mainrole == "priest":
|
||||||
pl = evt.data["pl"]
|
pl = evt.data["pl"]
|
||||||
turn_chance = 3/4
|
turn_chance = 3/4
|
||||||
seers = [p for p in get_all_players(("seer",)) if p.nick in pl and random.random() < turn_chance]
|
seers = [p for p in get_players(("seer",)) if p in pl and random.random() < turn_chance]
|
||||||
harlots = [p for p in get_all_players(("harlot",)) if p.nick in pl and random.random() < turn_chance]
|
harlots = [p for p in get_players(("harlot",)) if p in pl and random.random() < turn_chance]
|
||||||
cultists = [p for p in get_all_players(("cultist",)) if p.nick in pl and random.random() < turn_chance]
|
cultists = [p for p in get_players(("cultist",)) if p in pl and random.random() < turn_chance]
|
||||||
channels.Main.send(messages["sleepy_priest_death"])
|
channels.Main.send(messages["sleepy_priest_death"])
|
||||||
for seer in seers:
|
for seer in seers:
|
||||||
change_role(seer, "seer", "doomsayer")
|
change_role(seer, "seer", "doomsayer")
|
||||||
|
@ -13,7 +13,7 @@ import src.settings as var
|
|||||||
from src import decorators, wolfgame, events, channels, hooks, users, errlog as log, stream_handler as alog
|
from src import decorators, wolfgame, events, channels, hooks, users, errlog as log, stream_handler as alog
|
||||||
from src.messages import messages
|
from src.messages import messages
|
||||||
from src.utilities import reply, get_role, get_templates
|
from src.utilities import reply, get_role, get_templates
|
||||||
from src.functions import get_participants
|
from src.functions import get_participants, get_all_roles
|
||||||
from src.dispatcher import MessageDispatcher
|
from src.dispatcher import MessageDispatcher
|
||||||
from src.decorators import handle_error
|
from src.decorators import handle_error
|
||||||
|
|
||||||
@ -69,7 +69,7 @@ def on_privmsg(cli, rawnick, chan, msg, *, notice=False, force_role=None):
|
|||||||
cmds = []
|
cmds = []
|
||||||
phase = var.PHASE
|
phase = var.PHASE
|
||||||
if user in get_participants():
|
if user in get_participants():
|
||||||
roles = {get_role(user.nick)} | set(get_templates(user.nick))
|
roles = get_all_roles(user)
|
||||||
if force_role is not None:
|
if force_role is not None:
|
||||||
roles &= {force_role} # only fire off role commands for the forced role
|
roles &= {force_role} # only fire off role commands for the forced role
|
||||||
|
|
||||||
|
@ -7,7 +7,7 @@ from collections import defaultdict
|
|||||||
import botconfig
|
import botconfig
|
||||||
import src.settings as var
|
import src.settings as var
|
||||||
from src.utilities import *
|
from src.utilities import *
|
||||||
from src import users, debuglog, errlog, plog
|
from src import users, channels, debuglog, errlog, plog
|
||||||
from src.functions import get_players, get_all_players
|
from src.functions import get_players, get_all_players
|
||||||
from src.decorators import cmd, event_listener
|
from src.decorators import cmd, event_listener
|
||||||
from src.messages import messages
|
from src.messages import messages
|
||||||
@ -266,19 +266,19 @@ def on_transition_night_end(evt, var):
|
|||||||
gangel.send(messages[to_send].format(warning, gself), "Players: " + ", ".join(p.nick for p in pl), sep="\n")
|
gangel.send(messages[to_send].format(warning, gself), "Players: " + ", ".join(p.nick for p in pl), sep="\n")
|
||||||
|
|
||||||
@event_listener("assassinate")
|
@event_listener("assassinate")
|
||||||
def on_assassinate(evt, cli, var, nick, target, prot):
|
def on_assassinate(evt, var, killer, target, prot):
|
||||||
if prot == "angel" and var.GAMEPHASE == "night":
|
if prot == "angel" and var.GAMEPHASE == "night":
|
||||||
var.ACTIVE_PROTECTIONS[target].remove("angel")
|
var.ACTIVE_PROTECTIONS[target.nick].remove("angel")
|
||||||
evt.prevent_default = True
|
evt.prevent_default = True
|
||||||
evt.stop_processing = True
|
evt.stop_processing = True
|
||||||
cli.msg(botconfig.CHANNEL, messages[evt.params.message_prefix + "angel"].format(nick, target))
|
channels.Main.send(messages[evt.params.message_prefix + "angel"].format(killer, target))
|
||||||
elif prot == "bodyguard":
|
elif prot == "bodyguard":
|
||||||
var.ACTIVE_PROTECTIONS[target].remove("bodyguard")
|
var.ACTIVE_PROTECTIONS[target.nick].remove("bodyguard")
|
||||||
evt.prevent_default = True
|
evt.prevent_default = True
|
||||||
evt.stop_processing = True
|
evt.stop_processing = True
|
||||||
for bg in var.ROLES["bodyguard"]:
|
for bg in var.ROLES["bodyguard"]:
|
||||||
if GUARDED.get(bg) == target:
|
if GUARDED.get(bg) == target.nick:
|
||||||
cli.msg(botconfig.CHANNEL, messages[evt.params.message_prefix + "bodyguard"].format(nick, target, bg))
|
channels.Main.send(messages[evt.params.message_prefix + "bodyguard"].format(killer, target, bg))
|
||||||
# redirect the assassination to the bodyguard
|
# redirect the assassination to the bodyguard
|
||||||
evt.data["target"] = users._get(bg) # FIXME
|
evt.data["target"] = users._get(bg) # FIXME
|
||||||
break
|
break
|
||||||
|
@ -7,7 +7,7 @@ from collections import defaultdict
|
|||||||
import botconfig
|
import botconfig
|
||||||
import src.settings as var
|
import src.settings as var
|
||||||
from src.utilities import *
|
from src.utilities import *
|
||||||
from src import users, debuglog, errlog, plog
|
from src import users, channels, debuglog, errlog, plog
|
||||||
from src.functions import get_players, get_all_players
|
from src.functions import get_players, get_all_players
|
||||||
from src.decorators import cmd, event_listener
|
from src.decorators import cmd, event_listener
|
||||||
from src.messages import messages
|
from src.messages import messages
|
||||||
@ -65,13 +65,13 @@ def on_retribution(evt, var, victim, target, prot):
|
|||||||
evt.stop_processing = True
|
evt.stop_processing = True
|
||||||
|
|
||||||
@event_listener("assassinate")
|
@event_listener("assassinate")
|
||||||
def on_assassinate(evt, cli, var, nick, target, prot):
|
def on_assassinate(evt, var, killer, target, prot):
|
||||||
if prot == "blessing":
|
if prot == "blessing":
|
||||||
var.ACTIVE_PROTECTIONS[target].remove("blessing")
|
var.ACTIVE_PROTECTIONS[target.nick].remove("blessing")
|
||||||
evt.prevent_default = True
|
evt.prevent_default = True
|
||||||
evt.stop_processing = True
|
evt.stop_processing = True
|
||||||
# don't message the channel whenever a blessing blocks a kill, but *do* let the killer know so they don't try to report it as a bug
|
# don't message the channel whenever a blessing blocks a kill, but *do* let the killer know so they don't try to report it as a bug
|
||||||
pm(cli, nick, messages["assassin_fail_blessed"].format(target))
|
killer.send(messages["assassin_fail_blessed"].format(target))
|
||||||
|
|
||||||
@event_listener("myrole")
|
@event_listener("myrole")
|
||||||
def on_myrole(evt, var, user):
|
def on_myrole(evt, var, user):
|
||||||
|
@ -7,7 +7,7 @@ from collections import defaultdict
|
|||||||
import botconfig
|
import botconfig
|
||||||
import src.settings as var
|
import src.settings as var
|
||||||
from src.utilities import *
|
from src.utilities import *
|
||||||
from src import debuglog, errlog, plog
|
from src import users, channels, debuglog, errlog, plog
|
||||||
from src.decorators import cmd, event_listener
|
from src.decorators import cmd, event_listener
|
||||||
from src.messages import messages
|
from src.messages import messages
|
||||||
from src.events import Event
|
from src.events import Event
|
||||||
@ -18,8 +18,8 @@ def on_see(evt, cli, var, nick, victim):
|
|||||||
evt.data["role"] = "wolf"
|
evt.data["role"] = "wolf"
|
||||||
|
|
||||||
@event_listener("wolflist")
|
@event_listener("wolflist")
|
||||||
def on_wolflist(evt, cli, var, nick, wolf):
|
def on_wolflist(evt, var, player, wolf):
|
||||||
if nick in var.ROLES["cursed villager"]:
|
if player.nick in var.ROLES["cursed villager"]:
|
||||||
evt.data["tags"].add("cursed")
|
evt.data["tags"].add("cursed")
|
||||||
|
|
||||||
# vim: set sw=4 expandtab:
|
# vim: set sw=4 expandtab:
|
||||||
|
@ -4,7 +4,7 @@ import random
|
|||||||
|
|
||||||
import src.settings as var
|
import src.settings as var
|
||||||
from src.utilities import *
|
from src.utilities import *
|
||||||
from src import debuglog, errlog, plog
|
from src import users, channels, debuglog, errlog, plog
|
||||||
from src.functions import get_players, get_all_players
|
from src.functions import get_players, get_all_players
|
||||||
from src.decorators import cmd, event_listener
|
from src.decorators import cmd, event_listener
|
||||||
from src.messages import messages
|
from src.messages import messages
|
||||||
|
@ -3,7 +3,7 @@ import random
|
|||||||
|
|
||||||
import src.settings as var
|
import src.settings as var
|
||||||
from src.utilities import *
|
from src.utilities import *
|
||||||
from src import users, debuglog, errlog, plog
|
from src import users, channels, debuglog, errlog, plog
|
||||||
from src.functions import get_players, get_all_players
|
from src.functions import get_players, get_all_players
|
||||||
from src.decorators import cmd, event_listener
|
from src.decorators import cmd, event_listener
|
||||||
from src.messages import messages
|
from src.messages import messages
|
||||||
|
@ -4,8 +4,8 @@ import random
|
|||||||
from collections import defaultdict, deque
|
from collections import defaultdict, deque
|
||||||
|
|
||||||
from src.utilities import *
|
from src.utilities import *
|
||||||
from src.functions import get_players, get_all_players, get_target
|
from src.functions import get_players, get_all_players, get_target, get_main_role
|
||||||
from src import users, debuglog, errlog, plog
|
from src import users, channels, debuglog, errlog, plog
|
||||||
from src.decorators import command, event_listener
|
from src.decorators import command, event_listener
|
||||||
from src.messages import messages
|
from src.messages import messages
|
||||||
from src.events import Event
|
from src.events import Event
|
||||||
@ -40,7 +40,7 @@ def dullahan_kill(var, wrapper, message):
|
|||||||
|
|
||||||
wrapper.pm(messages["player_kill"].format(orig))
|
wrapper.pm(messages["player_kill"].format(orig))
|
||||||
|
|
||||||
debuglog("{0} (dullahan) KILL: {1} ({2})".format(wrapper.source, target, get_role(target.nick)))
|
debuglog("{0} (dullahan) KILL: {1} ({2})".format(wrapper.source, target, get_main_role(target)))
|
||||||
|
|
||||||
chk_nightdone(wrapper.client)
|
chk_nightdone(wrapper.client)
|
||||||
|
|
||||||
@ -68,7 +68,7 @@ def on_del_player(evt, var, user, mainrole, allroles, death_triggers):
|
|||||||
del KILLS[h]
|
del KILLS[h]
|
||||||
if death_triggers and "dullahan" in allroles:
|
if death_triggers and "dullahan" in allroles:
|
||||||
pl = evt.data["pl"]
|
pl = evt.data["pl"]
|
||||||
targets = TARGETS[user].intersection(users._get(x) for x in pl) # FIXME
|
targets = TARGETS[user].intersection(pl)
|
||||||
if targets:
|
if targets:
|
||||||
target = random.choice(list(targets))
|
target = random.choice(list(targets))
|
||||||
prots = deque(var.ACTIVE_PROTECTIONS[target.nick])
|
prots = deque(var.ACTIVE_PROTECTIONS[target.nick])
|
||||||
@ -79,7 +79,7 @@ def on_del_player(evt, var, user, mainrole, allroles, death_triggers):
|
|||||||
refresh_pl=evt.params.refresh_pl,
|
refresh_pl=evt.params.refresh_pl,
|
||||||
message_prefix="dullahan_die_",
|
message_prefix="dullahan_die_",
|
||||||
source="dullahan",
|
source="dullahan",
|
||||||
killer=user.nick,
|
killer=user,
|
||||||
killer_mainrole=mainrole,
|
killer_mainrole=mainrole,
|
||||||
killer_allroles=allroles,
|
killer_allroles=allroles,
|
||||||
prots=prots)
|
prots=prots)
|
||||||
@ -87,7 +87,7 @@ def on_del_player(evt, var, user, mainrole, allroles, death_triggers):
|
|||||||
# an event can read the current active protection and cancel or redirect the assassination
|
# an event can read the current active protection and cancel or redirect the assassination
|
||||||
# if it cancels, it is responsible for removing the protection from var.ACTIVE_PROTECTIONS
|
# if it cancels, it is responsible for removing the protection from var.ACTIVE_PROTECTIONS
|
||||||
# so that it cannot be used again (if the protection is meant to be usable once-only)
|
# so that it cannot be used again (if the protection is meant to be usable once-only)
|
||||||
if not aevt.dispatch(user.client, var, user.nick, target.nick, prots[0]):
|
if not aevt.dispatch(var, user, target, prots[0]):
|
||||||
evt.data["pl"] = aevt.data["pl"]
|
evt.data["pl"] = aevt.data["pl"]
|
||||||
if target is not aevt.data["target"]:
|
if target is not aevt.data["target"]:
|
||||||
target = aevt.data["target"]
|
target = aevt.data["target"]
|
||||||
@ -97,15 +97,14 @@ def on_del_player(evt, var, user, mainrole, allroles, death_triggers):
|
|||||||
return
|
return
|
||||||
prots.popleft()
|
prots.popleft()
|
||||||
|
|
||||||
target = target.nick # FIXME
|
|
||||||
if var.ROLE_REVEAL in ("on", "team"):
|
if var.ROLE_REVEAL in ("on", "team"):
|
||||||
role = get_reveal_role(target)
|
role = get_reveal_role(target.nick)
|
||||||
an = "n" if role.startswith(("a", "e", "i", "o", "u")) else ""
|
an = "n" if role.startswith(("a", "e", "i", "o", "u")) else ""
|
||||||
channels.Main.send(messages["dullahan_die_success"].format(user, target, an, role))
|
channels.Main.send(messages["dullahan_die_success"].format(user, target, an, role))
|
||||||
else:
|
else:
|
||||||
channels.Main.send(messages["dullahan_die_success_noreveal"].format(user, target))
|
channels.Main.send(messages["dullahan_die_success_noreveal"].format(user, target))
|
||||||
debuglog("{0} (dullahan) DULLAHAN ASSASSINATE: {1} ({2})".format(user, target, get_role(target)))
|
debuglog("{0} (dullahan) DULLAHAN ASSASSINATE: {1} ({2})".format(user, target, get_main_role(target)))
|
||||||
evt.params.del_player(user.client, target, True, end_game=False, killer_role="dullahan", deadlist=evt.params.deadlist, original=evt.params.original, ismain=False)
|
evt.params.del_player(target, end_game=False, killer_role="dullahan", deadlist=evt.params.deadlist, original=evt.params.original, ismain=False)
|
||||||
evt.data["pl"] = evt.params.refresh_pl(pl)
|
evt.data["pl"] = evt.params.refresh_pl(pl)
|
||||||
|
|
||||||
@event_listener("night_acted")
|
@event_listener("night_acted")
|
||||||
|
@ -7,7 +7,7 @@ from collections import defaultdict
|
|||||||
import botconfig
|
import botconfig
|
||||||
import src.settings as var
|
import src.settings as var
|
||||||
from src.utilities import *
|
from src.utilities import *
|
||||||
from src import users, debuglog, errlog, plog
|
from src import users, channels, debuglog, errlog, plog
|
||||||
from src.decorators import cmd, event_listener
|
from src.decorators import cmd, event_listener
|
||||||
from src.functions import get_players, get_all_players
|
from src.functions import get_players, get_all_players
|
||||||
from src.messages import messages
|
from src.messages import messages
|
||||||
@ -42,7 +42,7 @@ def on_transition_day(evt, var):
|
|||||||
evt.data["killers"][p].append(killer)
|
evt.data["killers"][p].append(killer)
|
||||||
|
|
||||||
@event_listener("assassinate", priority=1)
|
@event_listener("assassinate", priority=1)
|
||||||
def on_assassinate(evt, cli, var, nick, target, prot):
|
def on_assassinate(evt, var, killer, target, prot):
|
||||||
# bypass all protection if FA is doing the killing
|
# bypass all protection if FA is doing the killing
|
||||||
# we do this by stopping propagation, meaning future events won't fire
|
# we do this by stopping propagation, meaning future events won't fire
|
||||||
if "fallen angel" in evt.params.killer_allroles:
|
if "fallen angel" in evt.params.killer_allroles:
|
||||||
|
@ -4,8 +4,8 @@ from collections import defaultdict
|
|||||||
|
|
||||||
import src.settings as var
|
import src.settings as var
|
||||||
from src.utilities import *
|
from src.utilities import *
|
||||||
from src import users, debuglog, errlog, plog
|
from src import users, channels, debuglog, errlog, plog
|
||||||
from src.functions import get_players, get_all_players, get_target
|
from src.functions import get_players, get_all_players, get_target, get_main_role
|
||||||
from src.decorators import command, event_listener
|
from src.decorators import command, event_listener
|
||||||
from src.messages import messages
|
from src.messages import messages
|
||||||
from src.events import Event
|
from src.events import Event
|
||||||
@ -42,7 +42,7 @@ def hunter_kill(var, wrapper, message):
|
|||||||
|
|
||||||
wrapper.pm(messages["player_kill"].format(orig))
|
wrapper.pm(messages["player_kill"].format(orig))
|
||||||
|
|
||||||
debuglog("{0} (hunter) KILL: {1} ({2})".format(wrapper.source, target, get_role(target.nick)))
|
debuglog("{0} (hunter) KILL: {1} ({2})".format(wrapper.source, target, get_main_role(target)))
|
||||||
chk_nightdone(wrapper.client)
|
chk_nightdone(wrapper.client)
|
||||||
|
|
||||||
@command("retract", "r", chan=False, pm=True, playing=True, phases=("night",), roles=("hunter",))
|
@command("retract", "r", chan=False, pm=True, playing=True, phases=("night",), roles=("hunter",))
|
||||||
|
@ -8,12 +8,12 @@ import botconfig
|
|||||||
import src.settings as var
|
import src.settings as var
|
||||||
from src.utilities import *
|
from src.utilities import *
|
||||||
from src import channels, users, debuglog, errlog, plog
|
from src import channels, users, debuglog, errlog, plog
|
||||||
from src.functions import get_players, get_all_players
|
from src.functions import get_players, get_all_players, get_main_role
|
||||||
from src.decorators import command, event_listener
|
from src.decorators import command, event_listener
|
||||||
from src.messages import messages
|
from src.messages import messages
|
||||||
from src.events import Event
|
from src.events import Event
|
||||||
|
|
||||||
def _get_targets(var, pl, nick):
|
def _get_targets(var, pl, user):
|
||||||
"""Gets the mad scientist's targets.
|
"""Gets the mad scientist's targets.
|
||||||
|
|
||||||
var - settings module
|
var - settings module
|
||||||
@ -21,8 +21,8 @@ def _get_targets(var, pl, nick):
|
|||||||
nick - nick of the mad scientist
|
nick - nick of the mad scientist
|
||||||
|
|
||||||
"""
|
"""
|
||||||
for index, user in enumerate(var.ALL_PLAYERS):
|
for index, player in enumerate(var.ALL_PLAYERS):
|
||||||
if user.nick == nick: # FIXME
|
if player is user:
|
||||||
break
|
break
|
||||||
|
|
||||||
num_players = len(var.ALL_PLAYERS)
|
num_players = len(var.ALL_PLAYERS)
|
||||||
@ -33,14 +33,14 @@ def _get_targets(var, pl, nick):
|
|||||||
i = index
|
i = index
|
||||||
while True:
|
while True:
|
||||||
i = (i - 1) % num_players
|
i = (i - 1) % num_players
|
||||||
if var.ALL_PLAYERS[i].nick in pl or var.ALL_PLAYERS[i].nick == nick:
|
if var.ALL_PLAYERS[i] in pl or var.ALL_PLAYERS[i] is user:
|
||||||
target1 = var.ALL_PLAYERS[i]
|
target1 = var.ALL_PLAYERS[i]
|
||||||
break
|
break
|
||||||
# determine right player
|
# determine right player
|
||||||
i = index
|
i = index
|
||||||
while True:
|
while True:
|
||||||
i = (i + 1) % num_players
|
i = (i + 1) % num_players
|
||||||
if var.ALL_PLAYERS[i].nick in pl or var.ALL_PLAYERS[i].nick == nick:
|
if var.ALL_PLAYERS[i] in pl or var.ALL_PLAYERS[i] is user:
|
||||||
target2 = var.ALL_PLAYERS[i]
|
target2 = var.ALL_PLAYERS[i]
|
||||||
break
|
break
|
||||||
|
|
||||||
@ -53,7 +53,7 @@ def on_del_player(evt, var, user, mainrole, allroles, death_triggers):
|
|||||||
return
|
return
|
||||||
|
|
||||||
pl = evt.data["pl"]
|
pl = evt.data["pl"]
|
||||||
target1, target2 = _get_targets(var, pl, user.nick)
|
target1, target2 = _get_targets(var, pl, user)
|
||||||
|
|
||||||
# apply protections (if applicable)
|
# apply protections (if applicable)
|
||||||
prots1 = deque(var.ACTIVE_PROTECTIONS[target1.nick])
|
prots1 = deque(var.ACTIVE_PROTECTIONS[target1.nick])
|
||||||
@ -68,13 +68,13 @@ def on_del_player(evt, var, user, mainrole, allroles, death_triggers):
|
|||||||
refresh_pl=evt.params.refresh_pl,
|
refresh_pl=evt.params.refresh_pl,
|
||||||
message_prefix="mad_scientist_fail_",
|
message_prefix="mad_scientist_fail_",
|
||||||
source="mad scientist",
|
source="mad scientist",
|
||||||
killer=user.nick,
|
killer=user,
|
||||||
killer_mainrole=mainrole,
|
killer_mainrole=mainrole,
|
||||||
killer_allroles=allroles,
|
killer_allroles=allroles,
|
||||||
prots=prots1)
|
prots=prots1)
|
||||||
while len(prots1) > 0:
|
while len(prots1) > 0:
|
||||||
# events may be able to cancel this kill
|
# events may be able to cancel this kill
|
||||||
if not aevt.dispatch(user.client, var, user.nick, target1.nick, prots1[0]):
|
if not aevt.dispatch(var, user, target1, prots1[0]):
|
||||||
pl = aevt.data["pl"]
|
pl = aevt.data["pl"]
|
||||||
if target1 is not aevt.data["target"]:
|
if target1 is not aevt.data["target"]:
|
||||||
target1 = aevt.data["target"]
|
target1 = aevt.data["target"]
|
||||||
@ -87,7 +87,7 @@ def on_del_player(evt, var, user, mainrole, allroles, death_triggers):
|
|||||||
aevt.params.prots = prots2
|
aevt.params.prots = prots2
|
||||||
while len(prots2) > 0:
|
while len(prots2) > 0:
|
||||||
# events may be able to cancel this kill
|
# events may be able to cancel this kill
|
||||||
if not aevt.dispatch(user.client, var, user.nick, target2.nick, prots2[0]):
|
if not aevt.dispatch(var, user, target2, prots2[0]):
|
||||||
pl = aevt.data["pl"]
|
pl = aevt.data["pl"]
|
||||||
if target2 is not aevt.data["target"]:
|
if target2 is not aevt.data["target"]:
|
||||||
target2 = aevt.data["target"]
|
target2 = aevt.data["target"]
|
||||||
@ -97,8 +97,8 @@ def on_del_player(evt, var, user, mainrole, allroles, death_triggers):
|
|||||||
break
|
break
|
||||||
prots2.popleft()
|
prots2.popleft()
|
||||||
|
|
||||||
kill1 = target1.nick in pl and len(prots1) == 0
|
kill1 = target1 in pl and len(prots1) == 0
|
||||||
kill2 = target2.nick in pl and len(prots2) == 0 and target1 is not target2
|
kill2 = target2 in pl and len(prots2) == 0 and target1 is not target2
|
||||||
|
|
||||||
if kill1:
|
if kill1:
|
||||||
if kill2:
|
if kill2:
|
||||||
@ -111,14 +111,14 @@ def on_del_player(evt, var, user, mainrole, allroles, death_triggers):
|
|||||||
else:
|
else:
|
||||||
tmsg = messages["mad_scientist_kill_no_reveal"].format(user, target1, target2)
|
tmsg = messages["mad_scientist_kill_no_reveal"].format(user, target1, target2)
|
||||||
channels.Main.send(tmsg)
|
channels.Main.send(tmsg)
|
||||||
debuglog(user.nick, "(mad scientist) KILL: {0} ({1}) - {2} ({3})".format(target1, get_role(target1.nick), target2, get_role(target2.nick)))
|
debuglog(user.nick, "(mad scientist) KILL: {0} ({1}) - {2} ({3})".format(target1, get_main_role(target1), target2, get_main_role(target2)))
|
||||||
# here we DO want to tell that the other one is dying already so chained deaths don't mess things up
|
# here we DO want to tell that the other one is dying already so chained deaths don't mess things up
|
||||||
deadlist1 = evt.params.deadlist[:]
|
deadlist1 = evt.params.deadlist[:]
|
||||||
deadlist1.append(target2.nick)
|
deadlist1.append(target2)
|
||||||
deadlist2 = evt.params.deadlist[:]
|
deadlist2 = evt.params.deadlist[:]
|
||||||
deadlist2.append(target1.nick)
|
deadlist2.append(target1)
|
||||||
evt.params.del_player(user.client, target1.nick, True, end_game=False, killer_role="mad scientist", deadlist=deadlist1, original=evt.params.original, ismain=False)
|
evt.params.del_player(target1, end_game=False, killer_role="mad scientist", deadlist=deadlist1, original=evt.params.original, ismain=False)
|
||||||
evt.params.del_player(user.client, target2.nick, True, end_game=False, killer_role="mad scientist", deadlist=deadlist2, original=evt.params.original, ismain=False)
|
evt.params.del_player(target2, end_game=False, killer_role="mad scientist", deadlist=deadlist2, original=evt.params.original, ismain=False)
|
||||||
pl = evt.params.refresh_pl(pl)
|
pl = evt.params.refresh_pl(pl)
|
||||||
else:
|
else:
|
||||||
if var.ROLE_REVEAL in ("on", "team"):
|
if var.ROLE_REVEAL in ("on", "team"):
|
||||||
@ -128,8 +128,8 @@ def on_del_player(evt, var, user, mainrole, allroles, death_triggers):
|
|||||||
else:
|
else:
|
||||||
tmsg = messages["mad_scientist_kill_single_no_reveal"].format(user, target1)
|
tmsg = messages["mad_scientist_kill_single_no_reveal"].format(user, target1)
|
||||||
channels.Main.send(tmsg)
|
channels.Main.send(tmsg)
|
||||||
debuglog(user.nick, "(mad scientist) KILL: {0} ({1})".format(target1, get_role(target1.nick)))
|
debuglog(user.nick, "(mad scientist) KILL: {0} ({1})".format(target1, get_main_role(target1)))
|
||||||
evt.params.del_player(user.client, target1.nick, True, end_game=False, killer_role="mad scientist", deadlist=evt.params.deadlist, original=evt.params.original, ismain=False)
|
evt.params.del_player(target1, end_game=False, killer_role="mad scientist", deadlist=evt.params.deadlist, original=evt.params.original, ismain=False)
|
||||||
pl = evt.params.refresh_pl(pl)
|
pl = evt.params.refresh_pl(pl)
|
||||||
else:
|
else:
|
||||||
if kill2:
|
if kill2:
|
||||||
@ -140,8 +140,8 @@ def on_del_player(evt, var, user, mainrole, allroles, death_triggers):
|
|||||||
else:
|
else:
|
||||||
tmsg = messages["mad_scientist_kill_single_no_reveal"].format(user, target2)
|
tmsg = messages["mad_scientist_kill_single_no_reveal"].format(user, target2)
|
||||||
channels.Main.send(tmsg)
|
channels.Main.send(tmsg)
|
||||||
debuglog(user.nick, "(mad scientist) KILL: {0} ({1})".format(target2, get_role(target2.nick)))
|
debuglog(user.nick, "(mad scientist) KILL: {0} ({1})".format(target2, get_main_role(target2)))
|
||||||
evt.params.del_player(user.client, target2.nick, True, end_game=False, killer_role="mad scientist", deadlist=evt.params.deadlist, original=evt.params.original, ismain=False)
|
evt.params.del_player(target2, end_game=False, killer_role="mad scientist", deadlist=evt.params.deadlist, original=evt.params.original, ismain=False)
|
||||||
pl = evt.params.refresh_pl(pl)
|
pl = evt.params.refresh_pl(pl)
|
||||||
else:
|
else:
|
||||||
tmsg = messages["mad_scientist_fail"].format(user)
|
tmsg = messages["mad_scientist_fail"].format(user)
|
||||||
@ -153,8 +153,8 @@ def on_del_player(evt, var, user, mainrole, allroles, death_triggers):
|
|||||||
@event_listener("transition_night_end", priority=2)
|
@event_listener("transition_night_end", priority=2)
|
||||||
def on_transition_night_end(evt, var):
|
def on_transition_night_end(evt, var):
|
||||||
for ms in get_all_players(("mad scientist",)):
|
for ms in get_all_players(("mad scientist",)):
|
||||||
pl = list_players()
|
pl = get_players()
|
||||||
target1, target2 = _get_targets(var, pl, ms.nick) # FIXME: Need to update _get_targets to accept users
|
target1, target2 = _get_targets(var, pl, ms)
|
||||||
|
|
||||||
to_send = "mad_scientist_notify"
|
to_send = "mad_scientist_notify"
|
||||||
if ms.prefers_simple():
|
if ms.prefers_simple():
|
||||||
@ -164,15 +164,15 @@ def on_transition_night_end(evt, var):
|
|||||||
@event_listener("myrole")
|
@event_listener("myrole")
|
||||||
def on_myrole(evt, var, user):
|
def on_myrole(evt, var, user):
|
||||||
if user.nick in var.ROLES["mad scientist"]:
|
if user.nick in var.ROLES["mad scientist"]:
|
||||||
pl = list_players()
|
pl = get_players()
|
||||||
target1, target2 = _get_targets(var, pl, user.nick)
|
target1, target2 = _get_targets(var, pl, user)
|
||||||
evt.data["messages"].append(messages["mad_scientist_myrole_targets"].format(target1, target2))
|
evt.data["messages"].append(messages["mad_scientist_myrole_targets"].format(target1, target2))
|
||||||
|
|
||||||
@event_listener("revealroles_role")
|
@event_listener("revealroles_role")
|
||||||
def on_revealroles(evt, var, wrapper, nickname, role):
|
def on_revealroles(evt, var, wrapper, nickname, role):
|
||||||
if role == "mad scientist":
|
if role == "mad scientist":
|
||||||
pl = list_players()
|
pl = get_players()
|
||||||
target1, target2 = _get_targets(var, pl, nickname)
|
target1, target2 = _get_targets(var, pl, users._get(nickname)) # FIXME
|
||||||
evt.data["special_case"].append(messages["mad_scientist_revealroles_targets"].format(target1, target2))
|
evt.data["special_case"].append(messages["mad_scientist_revealroles_targets"].format(target1, target2))
|
||||||
|
|
||||||
|
|
||||||
|
@ -7,7 +7,7 @@ from collections import defaultdict
|
|||||||
import botconfig
|
import botconfig
|
||||||
import src.settings as var
|
import src.settings as var
|
||||||
from src.utilities import *
|
from src.utilities import *
|
||||||
from src import debuglog, errlog, plog
|
from src import users, channels, debuglog, errlog, plog
|
||||||
from src.decorators import cmd, event_listener
|
from src.decorators import cmd, event_listener
|
||||||
from src.messages import messages
|
from src.messages import messages
|
||||||
from src.events import Event
|
from src.events import Event
|
||||||
|
@ -3,7 +3,7 @@ import random
|
|||||||
|
|
||||||
import src.settings as var
|
import src.settings as var
|
||||||
from src.utilities import *
|
from src.utilities import *
|
||||||
from src import debuglog, errlog, plog
|
from src import users, channels, debuglog, errlog, plog
|
||||||
from src.functions import get_players, get_all_players
|
from src.functions import get_players, get_all_players
|
||||||
from src.decorators import cmd, event_listener
|
from src.decorators import cmd, event_listener
|
||||||
from src.messages import messages
|
from src.messages import messages
|
||||||
|
@ -3,7 +3,7 @@ import random
|
|||||||
|
|
||||||
import src.settings as var
|
import src.settings as var
|
||||||
from src.utilities import *
|
from src.utilities import *
|
||||||
from src import debuglog, errlog, plog
|
from src import users, channels, debuglog, errlog, plog
|
||||||
from src.decorators import cmd, event_listener
|
from src.decorators import cmd, event_listener
|
||||||
from src.functions import get_players, get_all_players, get_main_role
|
from src.functions import get_players, get_all_players, get_main_role
|
||||||
from src.messages import messages
|
from src.messages import messages
|
||||||
|
@ -297,7 +297,9 @@ def on_chk_decision_lynch5(evt, cli, var, voters):
|
|||||||
cli.msg(botconfig.CHANNEL, tmsg)
|
cli.msg(botconfig.CHANNEL, tmsg)
|
||||||
# we lie to this function so it doesn't devoice the player yet. instead, we'll let the call further down do it
|
# we lie to this function so it doesn't devoice the player yet. instead, we'll let the call further down do it
|
||||||
evt.data["deadlist"].append(target)
|
evt.data["deadlist"].append(target)
|
||||||
evt.params.del_player(cli, target, True, end_game=False, killer_role="shaman", deadlist=evt.data["deadlist"], original=target, ismain=False)
|
better_deadlist = [users._get(p) for p in evt.data["deadlist"]] # FIXME
|
||||||
|
target_user = users._get(target) # FIXME
|
||||||
|
evt.params.del_player(target_user, end_game=False, killer_role="shaman", deadlist=better_deadlist, ismain=False)
|
||||||
|
|
||||||
@event_listener("player_win")
|
@event_listener("player_win")
|
||||||
def on_player_win(evt, var, user, rol, winner, survived):
|
def on_player_win(evt, var, user, rol, winner, survived):
|
||||||
@ -576,12 +578,12 @@ def on_lynch(evt, cli, var, nick):
|
|||||||
evt.prevent_default = True
|
evt.prevent_default = True
|
||||||
|
|
||||||
@event_listener("assassinate")
|
@event_listener("assassinate")
|
||||||
def on_assassinate(evt, cli, var, nick, target, prot):
|
def on_assassinate(evt, var, killer, target, prot):
|
||||||
if prot == "totem":
|
if prot == "totem":
|
||||||
var.ACTIVE_PROTECTIONS[target].remove("totem")
|
var.ACTIVE_PROTECTIONS[target.nick].remove("totem")
|
||||||
evt.prevent_default = True
|
evt.prevent_default = True
|
||||||
evt.stop_processing = True
|
evt.stop_processing = True
|
||||||
cli.msg(botconfig.CHANNEL, messages[evt.params.message_prefix + "totem"].format(nick, target))
|
channels.Main.send(messages[evt.params.message_prefix + "totem"].format(killer, target))
|
||||||
|
|
||||||
@event_listener("succubus_visit")
|
@event_listener("succubus_visit")
|
||||||
def on_succubus_visit(evt, cli, var, nick, victim):
|
def on_succubus_visit(evt, cli, var, nick, victim):
|
||||||
|
@ -8,7 +8,7 @@ import botconfig
|
|||||||
import src.settings as var
|
import src.settings as var
|
||||||
from src.utilities import *
|
from src.utilities import *
|
||||||
from src import channels, users, debuglog, errlog, plog
|
from src import channels, users, debuglog, errlog, plog
|
||||||
from src.functions import get_players, get_all_players
|
from src.functions import get_players, get_all_players, get_main_role
|
||||||
from src.decorators import cmd, event_listener
|
from src.decorators import cmd, event_listener
|
||||||
from src.messages import messages
|
from src.messages import messages
|
||||||
from src.events import Event
|
from src.events import Event
|
||||||
@ -184,7 +184,7 @@ def on_del_player(evt, var, user, mainrole, allroles, death_triggers):
|
|||||||
if death_triggers:
|
if death_triggers:
|
||||||
ALL_SUCC_IDLE = False
|
ALL_SUCC_IDLE = False
|
||||||
if len(var.ROLES["succubus"]) == 0:
|
if len(var.ROLES["succubus"]) == 0:
|
||||||
entranced_alive = ENTRANCED - set(evt.params.deadlist)
|
entranced_alive = {users._get(x) for x in ENTRANCED}.difference(evt.params.deadlist) # FIXME
|
||||||
if ALL_SUCC_IDLE:
|
if ALL_SUCC_IDLE:
|
||||||
while ENTRANCED:
|
while ENTRANCED:
|
||||||
e = ENTRANCED.pop()
|
e = ENTRANCED.pop()
|
||||||
@ -198,7 +198,7 @@ def on_del_player(evt, var, user, mainrole, allroles, death_triggers):
|
|||||||
comma = ","
|
comma = ","
|
||||||
for e in entranced_alive:
|
for e in entranced_alive:
|
||||||
if var.ROLE_REVEAL in ("on", "team"):
|
if var.ROLE_REVEAL in ("on", "team"):
|
||||||
role = get_reveal_role(e)
|
role = get_reveal_role(e.nick)
|
||||||
an = "n" if role.startswith(("a", "e", "i", "o", "u")) else ""
|
an = "n" if role.startswith(("a", "e", "i", "o", "u")) else ""
|
||||||
msg.append("\u0002{0}\u0002, a{1} \u0002{2}\u0002".format(e, an, role))
|
msg.append("\u0002{0}\u0002, a{1} \u0002{2}\u0002".format(e, an, role))
|
||||||
else:
|
else:
|
||||||
@ -214,8 +214,8 @@ def on_del_player(evt, var, user, mainrole, allroles, death_triggers):
|
|||||||
# killing off everyone else that is entranced so they don't need to bother
|
# killing off everyone else that is entranced so they don't need to bother
|
||||||
dlc = list(evt.params.deadlist)
|
dlc = list(evt.params.deadlist)
|
||||||
dlc.extend(entranced_alive - {e})
|
dlc.extend(entranced_alive - {e})
|
||||||
debuglog("{0} (succubus) SUCCUBUS DEATH KILL: {1} ({2})".format(user, e, get_role(e)))
|
debuglog("{0} (succubus) SUCCUBUS DEATH KILL: {1} ({2})".format(user, e, get_main_role(e)))
|
||||||
evt.params.del_player(user.client, e, end_game=False, killer_role="succubus",
|
evt.params.del_player(e, end_game=False, killer_role="succubus",
|
||||||
deadlist=dlc, original=evt.params.original, ismain=False)
|
deadlist=dlc, original=evt.params.original, ismain=False)
|
||||||
evt.data["pl"] = evt.params.refresh_pl(evt.data["pl"])
|
evt.data["pl"] = evt.params.refresh_pl(evt.data["pl"])
|
||||||
ENTRANCED_DYING.clear()
|
ENTRANCED_DYING.clear()
|
||||||
|
@ -7,7 +7,7 @@ from collections import defaultdict
|
|||||||
import botconfig
|
import botconfig
|
||||||
import src.settings as var
|
import src.settings as var
|
||||||
from src.utilities import *
|
from src.utilities import *
|
||||||
from src import debuglog, errlog, plog, users
|
from src import debuglog, errlog, plog, users, channels
|
||||||
from src.decorators import cmd, event_listener
|
from src.decorators import cmd, event_listener
|
||||||
from src.messages import messages
|
from src.messages import messages
|
||||||
from src.events import Event
|
from src.events import Event
|
||||||
@ -29,19 +29,19 @@ def on_get_final_role(evt, cli, var, nick, role):
|
|||||||
evt.data["role"] = "traitor"
|
evt.data["role"] = "traitor"
|
||||||
|
|
||||||
@event_listener("update_stats", priority=1)
|
@event_listener("update_stats", priority=1)
|
||||||
def on_update_stats1(evt, cli, var, nick, nickrole, nickreveal, nicktpls):
|
def on_update_stats1(evt, var, player, mainrole, revealroles, allroles):
|
||||||
if nickrole == var.DEFAULT_ROLE and var.HIDDEN_TRAITOR:
|
if mainrole == var.DEFAULT_ROLE and var.HIDDEN_TRAITOR:
|
||||||
evt.data["possible"].add("traitor")
|
evt.data["possible"].add("traitor")
|
||||||
|
|
||||||
@event_listener("update_stats", priority=3)
|
@event_listener("update_stats", priority=3)
|
||||||
def on_update_stats3(evt, cli, var, nick, nickrole, nickreveal, nicktpls):
|
def on_update_stats3(evt, var, player, mainrole, revealroles, allroles):
|
||||||
# if this is a night death and we know for sure that wolves (and only wolves)
|
# if this is a night death and we know for sure that wolves (and only wolves)
|
||||||
# killed, then that kill cannot be traitor as long as they're in wolfchat.
|
# killed, then that kill cannot be traitor as long as they're in wolfchat.
|
||||||
# ismain True = night death, False = chain death; chain deaths can be traitors
|
# ismain True = night death, False = chain death; chain deaths can be traitors
|
||||||
# even if only wolves killed, so we short-circuit there as well
|
# even if only wolves killed, so we short-circuit there as well
|
||||||
# TODO: an observant user will be able to determine if traitor dies due to luck/misdirection totem
|
# TODO: an observant user will be able to determine if traitor dies due to luck/misdirection totem
|
||||||
# redirecting a wolf kill onto traitor
|
# redirecting a wolf kill onto traitor
|
||||||
if "traitor" not in evt.data["possible"] or not evt.params.ismain or nickrole == "traitor":
|
if "traitor" not in evt.data["possible"] or not evt.params.ismain or mainrole == "traitor":
|
||||||
return
|
return
|
||||||
if var.PHASE == "day" and var.GAMEPHASE == "night":
|
if var.PHASE == "day" and var.GAMEPHASE == "night":
|
||||||
mevt = Event("get_role_metadata", {})
|
mevt = Event("get_role_metadata", {})
|
||||||
|
@ -89,7 +89,7 @@ def on_player_win(evt, var, user, role, winner, survived):
|
|||||||
evt.data["iwon"] = False
|
evt.data["iwon"] = False
|
||||||
|
|
||||||
@event_listener("del_player", priority=6)
|
@event_listener("del_player", priority=6)
|
||||||
def on_del_player(evt, var, user, nickrole, nicktpls, death_triggers):
|
def on_del_player(evt, var, user, mainrole, allroles, death_triggers):
|
||||||
for h, v in list(KILLS.items()):
|
for h, v in list(KILLS.items()):
|
||||||
if user is v:
|
if user is v:
|
||||||
h.send(messages["hunter_discard"])
|
h.send(messages["hunter_discard"])
|
||||||
@ -97,7 +97,7 @@ def on_del_player(evt, var, user, nickrole, nicktpls, death_triggers):
|
|||||||
# extending VG to work with new teams can be done by registering a listener
|
# extending VG to work with new teams can be done by registering a listener
|
||||||
# at priority < 6, importing src.roles.vengefulghost, and setting
|
# at priority < 6, importing src.roles.vengefulghost, and setting
|
||||||
# GHOSTS[user] to something; if that is done then this logic is not run.
|
# GHOSTS[user] to something; if that is done then this logic is not run.
|
||||||
if death_triggers and nickrole == "vengeful ghost" and user not in GHOSTS:
|
if death_triggers and mainrole == "vengeful ghost" and user not in GHOSTS:
|
||||||
if evt.params.killer_role in var.WOLFTEAM_ROLES:
|
if evt.params.killer_role in var.WOLFTEAM_ROLES:
|
||||||
GHOSTS[user] = "wolves"
|
GHOSTS[user] = "wolves"
|
||||||
else:
|
else:
|
||||||
|
@ -4,7 +4,7 @@ from collections import defaultdict
|
|||||||
|
|
||||||
import src.settings as var
|
import src.settings as var
|
||||||
from src.utilities import *
|
from src.utilities import *
|
||||||
from src import users, debuglog, errlog, plog
|
from src import users, channels, debuglog, errlog, plog
|
||||||
from src.functions import get_players, get_all_players, get_main_role
|
from src.functions import get_players, get_all_players, get_main_role
|
||||||
from src.decorators import cmd, event_listener
|
from src.decorators import cmd, event_listener
|
||||||
from src.messages import messages
|
from src.messages import messages
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import src.settings as var
|
import src.settings as var
|
||||||
from src.utilities import *
|
from src.utilities import *
|
||||||
from src import debuglog, errlog, plog
|
from src import users, channels, debuglog, errlog, plog
|
||||||
from src.functions import get_players
|
from src.functions import get_players
|
||||||
from src.decorators import cmd, event_listener
|
from src.decorators import cmd, event_listener
|
||||||
from src.messages import messages
|
from src.messages import messages
|
||||||
|
@ -3,7 +3,7 @@ import re
|
|||||||
|
|
||||||
import src.settings as var
|
import src.settings as var
|
||||||
from src.utilities import *
|
from src.utilities import *
|
||||||
from src import users, debuglog, errlog, plog
|
from src import users, channels, debuglog, errlog, plog
|
||||||
from src.functions import get_players, get_all_players, get_main_role
|
from src.functions import get_players, get_all_players, get_main_role
|
||||||
from src.decorators import cmd, event_listener
|
from src.decorators import cmd, event_listener
|
||||||
from src.messages import messages
|
from src.messages import messages
|
||||||
@ -85,7 +85,7 @@ def on_del_player(evt, var, user, mainrole, allroles, death_triggers):
|
|||||||
return
|
return
|
||||||
|
|
||||||
for child in get_all_players(("wild child",)):
|
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:
|
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
|
continue
|
||||||
|
|
||||||
# change their main role to wolf, even if wild child was a template
|
# change their main role to wolf, even if wild child was a template
|
||||||
|
@ -5,7 +5,7 @@ from collections import defaultdict
|
|||||||
import src.settings as var
|
import src.settings as var
|
||||||
from src.utilities import *
|
from src.utilities import *
|
||||||
from src.functions import get_players, get_all_players, get_main_role, get_all_roles
|
from src.functions import get_players, get_all_players, get_main_role, get_all_roles
|
||||||
from src import debuglog, errlog, plog, users
|
from src import debuglog, errlog, plog, users, channels
|
||||||
from src.decorators import cmd, event_listener
|
from src.decorators import cmd, event_listener
|
||||||
from src.messages import messages
|
from src.messages import messages
|
||||||
from src.events import Event
|
from src.events import Event
|
||||||
@ -241,7 +241,7 @@ def on_exchange(evt, var, actor, target, actor_role, target_role):
|
|||||||
if player is target:
|
if player is target:
|
||||||
prole = actor_role
|
prole = actor_role
|
||||||
wevt = Event("wolflist", {"tags": set()})
|
wevt = Event("wolflist", {"tags": set()})
|
||||||
wevt.dispatch(actor.client, var, player.nick, actor.nick)
|
wevt.dispatch(var, player, actor)
|
||||||
tags = " ".join(wevt.data["tags"])
|
tags = " ".join(wevt.data["tags"])
|
||||||
if prole in wcroles:
|
if prole in wcroles:
|
||||||
if tags:
|
if tags:
|
||||||
@ -274,7 +274,7 @@ def on_exchange(evt, var, actor, target, actor_role, target_role):
|
|||||||
if player is actor:
|
if player is actor:
|
||||||
prole = target_role
|
prole = target_role
|
||||||
wevt = Event("wolflist", {"tags": set()})
|
wevt = Event("wolflist", {"tags": set()})
|
||||||
wevt.dispatch(actor.client, var, player.nick, target.nick)
|
wevt.dispatch(var, player, target)
|
||||||
tags = " ".join(wevt.data["tags"])
|
tags = " ".join(wevt.data["tags"])
|
||||||
if prole in wcroles:
|
if prole in wcroles:
|
||||||
if tags:
|
if tags:
|
||||||
@ -363,7 +363,7 @@ def on_transition_night_end(evt, var):
|
|||||||
wevt = Event("wolflist", {"tags": set()})
|
wevt = Event("wolflist", {"tags": set()})
|
||||||
tags = ""
|
tags = ""
|
||||||
if role in wcroles:
|
if role in wcroles:
|
||||||
wevt.dispatch(wolf.client, var, wolf.nick, wolf.nick) # FIXME: Need to update the wolflist event
|
wevt.dispatch(var, wolf, wolf)
|
||||||
tags = " ".join(wevt.data["tags"])
|
tags = " ".join(wevt.data["tags"])
|
||||||
if tags:
|
if tags:
|
||||||
tags += " "
|
tags += " "
|
||||||
@ -401,7 +401,7 @@ def on_transition_night_end(evt, var):
|
|||||||
for player in pl:
|
for player in pl:
|
||||||
prole = get_main_role(player)
|
prole = get_main_role(player)
|
||||||
wevt.data["tags"] = set()
|
wevt.data["tags"] = set()
|
||||||
wevt.dispatch(wolf.client, var, player.nick, wolf.nick) # FIXME: Need to update the wolflist event
|
wevt.dispatch(var, player, wolf)
|
||||||
tags = " ".join(wevt.data["tags"])
|
tags = " ".join(wevt.data["tags"])
|
||||||
if prole in wcroles:
|
if prole in wcroles:
|
||||||
if tags:
|
if tags:
|
||||||
|
@ -5,7 +5,7 @@ from collections import defaultdict
|
|||||||
import src.settings as var
|
import src.settings as var
|
||||||
from src.utilities import *
|
from src.utilities import *
|
||||||
from src.functions import get_players
|
from src.functions import get_players
|
||||||
from src import debuglog, errlog, plog, users
|
from src import debuglog, errlog, plog, users, channels
|
||||||
from src.decorators import cmd, event_listener
|
from src.decorators import cmd, event_listener
|
||||||
from src.messages import messages
|
from src.messages import messages
|
||||||
from src.events import Event
|
from src.events import Event
|
||||||
@ -78,7 +78,7 @@ def on_chk_win(evt, cli, var, rolemap, mainroles, lpl, lwolves, lrealwolves):
|
|||||||
evt.stop_processing = True
|
evt.stop_processing = True
|
||||||
|
|
||||||
@event_listener("reconfigure_stats")
|
@event_listener("reconfigure_stats")
|
||||||
def on_reconfigure_stats(evt, cli, var, stats):
|
def on_reconfigure_stats(evt, var, stats):
|
||||||
if "wolf cub" not in stats or stats["wolf cub"] == 0:
|
if "wolf cub" not in stats or stats["wolf cub"] == 0:
|
||||||
return
|
return
|
||||||
for role in var.WOLF_ROLES - {"wolf cub"}:
|
for role in var.WOLF_ROLES - {"wolf cub"}:
|
||||||
|
309
src/wolfgame.py
309
src/wolfgame.py
@ -49,7 +49,7 @@ import src.settings as var
|
|||||||
from src.utilities import *
|
from src.utilities import *
|
||||||
from src import db, events, dispatcher, channels, users, hooks, logger, proxy, debuglog, errlog, plog
|
from src import db, events, dispatcher, channels, users, hooks, logger, proxy, debuglog, errlog, plog
|
||||||
from src.decorators import command, cmd, hook, handle_error, event_listener, COMMANDS
|
from src.decorators import command, cmd, hook, handle_error, event_listener, COMMANDS
|
||||||
from src.functions import get_players, get_all_players, get_participants, get_main_role
|
from src.functions import get_players, get_all_players, get_participants, get_main_role, get_all_roles
|
||||||
from src.messages import messages
|
from src.messages import messages
|
||||||
from src.warnings import *
|
from src.warnings import *
|
||||||
from src.context import IRCContext
|
from src.context import IRCContext
|
||||||
@ -1084,7 +1084,7 @@ def fleave(var, wrapper, message):
|
|||||||
return
|
return
|
||||||
|
|
||||||
msg = [messages["fquit_success"].format(wrapper.source, target)]
|
msg = [messages["fquit_success"].format(wrapper.source, target)]
|
||||||
if get_role(target.nick) != "person" and var.ROLE_REVEAL in ("on", "team"):
|
if get_main_role(target) != "person" and var.ROLE_REVEAL in ("on", "team"):
|
||||||
msg.append(messages["fquit_goodbye"].format(get_reveal_role(target.nick)))
|
msg.append(messages["fquit_goodbye"].format(get_reveal_role(target.nick)))
|
||||||
if var.PHASE == "join":
|
if var.PHASE == "join":
|
||||||
player_count = len(list_players()) - 1
|
player_count = len(list_players()) - 1
|
||||||
@ -1103,7 +1103,7 @@ def fleave(var, wrapper, message):
|
|||||||
if target.nick in var.PLAYERS:
|
if target.nick in var.PLAYERS:
|
||||||
var.DCED_PLAYERS[target.nick] = var.PLAYERS.pop(target.nick)
|
var.DCED_PLAYERS[target.nick] = var.PLAYERS.pop(target.nick)
|
||||||
|
|
||||||
del_player(wrapper.client, target.nick, death_triggers=False) # FIXME: Need to fix once del_player is updated
|
del_player(target, death_triggers=False)
|
||||||
|
|
||||||
elif dead_target is not None:
|
elif dead_target is not None:
|
||||||
leave_deadchat(var, dead_target, force=wrapper.source)
|
leave_deadchat(var, dead_target, force=wrapper.source)
|
||||||
@ -1167,7 +1167,7 @@ def stats(cli, nick, chan, rest):
|
|||||||
for i, player in enumerate(ps):
|
for i, player in enumerate(ps):
|
||||||
prole = get_role(player)
|
prole = get_role(player)
|
||||||
wevt = Event("wolflist", {"tags": set()})
|
wevt = Event("wolflist", {"tags": set()})
|
||||||
wevt.dispatch(cli, var, player, nick)
|
wevt.dispatch(var, users._get(player), users._get(nick)) # FIXME
|
||||||
tags = " ".join(wevt.data["tags"])
|
tags = " ".join(wevt.data["tags"])
|
||||||
if prole in badguys:
|
if prole in badguys:
|
||||||
if tags:
|
if tags:
|
||||||
@ -1885,7 +1885,8 @@ def chk_decision(cli, force=""):
|
|||||||
else:
|
else:
|
||||||
lmsg = random.choice(messages["lynch_no_reveal"]).format(votee)
|
lmsg = random.choice(messages["lynch_no_reveal"]).format(votee)
|
||||||
cli.msg(botconfig.CHANNEL, lmsg)
|
cli.msg(botconfig.CHANNEL, lmsg)
|
||||||
if not del_player(cli, votee, True, killer_role="villager", deadlist=deadlist, original=votee):
|
better_deadlist = [users._get(p) for p in deadlist] # FIXME -- convert chk_decision_lynch to be user-aware
|
||||||
|
if not del_player(users._get(votee), killer_role="villager", deadlist=better_deadlist): # FIXME
|
||||||
return
|
return
|
||||||
do_night_transision = True
|
do_night_transision = True
|
||||||
break
|
break
|
||||||
@ -2371,166 +2372,171 @@ def chk_win_conditions(cli, rolemap, mainroles, end_game=True, winner=None):
|
|||||||
return True
|
return True
|
||||||
|
|
||||||
@handle_error
|
@handle_error
|
||||||
def del_player(cli, nick, forced_death=False, devoice=True, end_game=True, death_triggers=True, killer_role="", deadlist=[], original="", cmode=[], deadchat=[], ismain=True):
|
def del_player(player, *, devoice=True, end_game=True, death_triggers=True, killer_role="", deadlist=[], original=None, cmode=[], deadchat=[], ismain=True):
|
||||||
"""
|
"""
|
||||||
Returns: False if one side won.
|
Returns: False if one side won.
|
||||||
arg: forced_death = True when lynched
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def refresh_pl(old_pl):
|
def refresh_pl(old_pl):
|
||||||
return [p for p in list_players() if p in old_pl]
|
return set(p for p in get_players() if p in old_pl)
|
||||||
|
|
||||||
t = time.time() # time
|
t = time.time() # time
|
||||||
|
|
||||||
var.LAST_STATS = None # reset
|
var.LAST_STATS = None # reset
|
||||||
var.LAST_VOTES = None
|
var.LAST_VOTES = None
|
||||||
|
|
||||||
|
if original is None:
|
||||||
|
original = player
|
||||||
|
|
||||||
with var.GRAVEYARD_LOCK:
|
with var.GRAVEYARD_LOCK:
|
||||||
if not var.GAME_ID or var.GAME_ID > t:
|
if not var.GAME_ID or var.GAME_ID > t:
|
||||||
# either game ended, or a new game has started.
|
# either game ended, or a new game has started.
|
||||||
return False
|
return False
|
||||||
ret = True
|
ret = True
|
||||||
pl = list_players()
|
pl = set(get_players()).difference(deadlist)
|
||||||
for dead in deadlist:
|
if player is not None and (player is original or player in pl):
|
||||||
if dead in pl:
|
mainrole = get_main_role(player)
|
||||||
pl.remove(dead)
|
revealrole = get_reveal_role(player.nick) # FIXME
|
||||||
if nick != None and (nick == original or nick in pl):
|
allroles = get_all_roles(player)
|
||||||
nickrole = get_role(nick)
|
del var.MAIN_ROLES[player]
|
||||||
nickreveal = get_reveal_role(nick)
|
for r in allroles:
|
||||||
nicktpls = get_templates(nick)
|
var.ROLES[r].remove(player.nick) # FIXME
|
||||||
allroles = {nickrole} | set(nicktpls)
|
if player.nick in var.BITTEN_ROLES:
|
||||||
del var.MAIN_ROLES[users._get(nick)] # FIXME
|
del var.BITTEN_ROLES[player.nick] # FIXME
|
||||||
var.ROLES[nickrole].remove(nick)
|
if player.nick in var.CHARMED:
|
||||||
for t in nicktpls:
|
var.CHARMED.remove(player.nick) # FIXME
|
||||||
var.ROLES[t].remove(nick)
|
pl.discard(player)
|
||||||
if nick in var.BITTEN_ROLES:
|
|
||||||
del var.BITTEN_ROLES[nick]
|
|
||||||
if nick in var.CHARMED:
|
|
||||||
var.CHARMED.remove(nick)
|
|
||||||
if nick in pl:
|
|
||||||
pl.remove(nick)
|
|
||||||
# handle roles that trigger on death
|
# handle roles that trigger on death
|
||||||
# clone happens regardless of death_triggers being true or not
|
# clone happens regardless of death_triggers being true or not
|
||||||
if var.PHASE in var.GAME_PHASES:
|
if var.PHASE in var.GAME_PHASES:
|
||||||
clones = copy.copy(var.ROLES["clone"])
|
clones = get_all_players(("clone",))
|
||||||
for clone in clones:
|
for clone in clones:
|
||||||
if clone in var.CLONED and clone not in deadlist:
|
# clone is a User, var.CLONED is a Dict[str,str]
|
||||||
target = var.CLONED[clone]
|
# dealist is a List[User]; ensure we add .nick appropriately
|
||||||
if nick == target and clone in var.CLONED:
|
# FIXME: someone should convert var.CLONED
|
||||||
|
if clone.nick in var.CLONED and clone not in deadlist:
|
||||||
|
target = var.CLONED[clone.nick]
|
||||||
|
if player.nick == target and clone.nick in var.CLONED:
|
||||||
# clone is cloning nick, so clone becomes nick's role
|
# clone is cloning nick, so clone becomes nick's role
|
||||||
# clone does NOT get any of nick's templates (gunner/assassin/etc.)
|
# clone does NOT get any of nick's templates (gunner/assassin/etc.)
|
||||||
del var.CLONED[clone]
|
del var.CLONED[clone.nick]
|
||||||
if nickrole == "amnesiac":
|
if mainrole == "amnesiac":
|
||||||
# clone gets the amnesiac's real role
|
# clone gets the amnesiac's real role
|
||||||
sayrole = var.AMNESIAC_ROLES[nick]
|
sayrole = var.AMNESIAC_ROLES[player.nick]
|
||||||
else:
|
else:
|
||||||
sayrole = nickrole
|
sayrole = mainrole
|
||||||
change_role(users._get(clone), "clone", sayrole) # FIXME
|
change_role(clone, "clone", sayrole)
|
||||||
debuglog("{0} (clone) CLONE DEAD PLAYER: {1} ({2})".format(clone, target, sayrole))
|
debuglog("{0} (clone) CLONE DEAD PLAYER: {1} ({2})".format(clone, target, sayrole))
|
||||||
if sayrole in var.HIDDEN_VILLAGERS:
|
if sayrole in var.HIDDEN_VILLAGERS:
|
||||||
sayrole = "villager"
|
sayrole = "villager"
|
||||||
elif sayrole in var.HIDDEN_ROLES:
|
elif sayrole in var.HIDDEN_ROLES:
|
||||||
sayrole = var.DEFAULT_ROLE
|
sayrole = var.DEFAULT_ROLE
|
||||||
an = "n" if sayrole.startswith(("a", "e", "i", "o", "u")) else ""
|
an = "n" if sayrole.startswith(("a", "e", "i", "o", "u")) else ""
|
||||||
pm(cli, clone, messages["clone_turn"].format(an, sayrole))
|
clone.send(messages["clone_turn"].format(an, sayrole))
|
||||||
# if a clone is cloning a clone, clone who the old clone cloned
|
# if a clone is cloning a clone, clone who the old clone cloned
|
||||||
if nickrole == "clone" and nick in var.CLONED:
|
if mainrole == "clone" and player.nick in var.CLONED:
|
||||||
if var.CLONED[nick] == clone:
|
if var.CLONED[player.nick] == clone.nick:
|
||||||
pm(cli, clone, messages["forever_aclone"].format(nick))
|
clone.send(messages["forever_aclone"].format(player))
|
||||||
else:
|
else:
|
||||||
var.CLONED[clone] = var.CLONED[nick]
|
var.CLONED[clone.nick] = var.CLONED[player.nick]
|
||||||
pm(cli, clone, messages["clone_success"].format(var.CLONED[clone]))
|
clone.send(messages["clone_success"].format(var.CLONED[clone.nick]))
|
||||||
debuglog("{0} (clone) CLONE: {1} ({2})".format(clone, var.CLONED[clone], get_role(var.CLONED[clone])))
|
# FIXME: change below to get_main_role(var.CLONED[clone]) once var.CLONED is converted
|
||||||
elif nickrole in var.WOLFCHAT_ROLES:
|
debuglog("{0} (clone) CLONE: {1} ({2})".format(clone, var.CLONED[clone.nick], get_role(var.CLONED[clone.nick])))
|
||||||
wolves = list_players(var.WOLFCHAT_ROLES)
|
elif mainrole in var.WOLFCHAT_ROLES:
|
||||||
|
wolves = get_players(var.WOLFCHAT_ROLES)
|
||||||
wolves.remove(clone) # remove self from list
|
wolves.remove(clone) # remove self from list
|
||||||
for wolf in wolves:
|
for wolf in wolves:
|
||||||
pm(cli, wolf, messages["clone_wolf"].format(clone, nick))
|
wolf.queue_message(messages["clone_wolf"].format(clone, player))
|
||||||
|
if wolves:
|
||||||
|
wolf.send_messages()
|
||||||
if var.PHASE == "day":
|
if var.PHASE == "day":
|
||||||
random.shuffle(wolves)
|
random.shuffle(wolves)
|
||||||
for i, wolf in enumerate(wolves):
|
for i, wolf in enumerate(wolves):
|
||||||
wolfrole = get_role(wolf)
|
wolfrole = get_main_role(wolf)
|
||||||
wevt = Event("wolflist", {"tags": set()})
|
wevt = Event("wolflist", {"tags": set()})
|
||||||
wevt.dispatch(cli, var, wolf, clone)
|
wevt.dispatch(var, wolf, clone)
|
||||||
tags = " ".join(wevt.data["tags"])
|
tags = " ".join(wevt.data["tags"])
|
||||||
if tags:
|
if tags:
|
||||||
tags += " "
|
tags += " "
|
||||||
wolves[i] = "\u0002{0}\u0002 ({1}{2})".format(wolf, tags, wolfrole)
|
wolves[i] = "\u0002{0}\u0002 ({1}{2})".format(wolf, tags, wolfrole)
|
||||||
|
|
||||||
if len(wolves):
|
if wolves:
|
||||||
pm(cli, clone, "Wolves: " + ", ".join(wolves))
|
clone.send("Wolves: " + ", ".join(wolves))
|
||||||
else:
|
else:
|
||||||
pm(cli, clone, messages["no_other_wolves"])
|
clone.send(messages["no_other_wolves"])
|
||||||
elif nickrole == "turncoat":
|
elif mainrole == "turncoat":
|
||||||
var.TURNCOATS[clone] = ("none", -1)
|
var.TURNCOATS[clone.nick] = ("none", -1) # FIXME
|
||||||
|
|
||||||
if nickrole == "clone" and nick in var.CLONED:
|
if mainrole == "clone" and player.nick in var.CLONED:
|
||||||
del var.CLONED[nick]
|
del var.CLONED[player.nick]
|
||||||
|
|
||||||
if death_triggers and var.PHASE in var.GAME_PHASES:
|
if death_triggers and var.PHASE in var.GAME_PHASES:
|
||||||
if nick in var.LOVERS:
|
if player.nick in var.LOVERS:
|
||||||
others = var.LOVERS[nick].copy()
|
lovers = var.LOVERS[player.nick].copy()
|
||||||
var.LOVERS[nick].clear()
|
var.LOVERS[player.nick].clear()
|
||||||
for other in others:
|
for lovernick in lovers:
|
||||||
if other not in pl:
|
lover = users._get(lovernick) # FIXME
|
||||||
|
if lover not in pl:
|
||||||
continue # already died somehow
|
continue # already died somehow
|
||||||
if nick not in var.LOVERS[other]:
|
if player.nick not in var.LOVERS[lover.nick]:
|
||||||
continue
|
continue
|
||||||
var.LOVERS[other].remove(nick)
|
var.LOVERS[lover.nick].remove(player.nick)
|
||||||
if var.ROLE_REVEAL in ("on", "team"):
|
if var.ROLE_REVEAL in ("on", "team"):
|
||||||
role = get_reveal_role(other)
|
role = get_reveal_role(lover.nick)
|
||||||
an = "n" if role.startswith(("a", "e", "i", "o", "u")) else ""
|
an = "n" if role.startswith(("a", "e", "i", "o", "u")) else ""
|
||||||
message = messages["lover_suicide"].format(other, an, role)
|
message = messages["lover_suicide"].format(lover, an, role)
|
||||||
else:
|
else:
|
||||||
message = messages["lover_suicide_no_reveal"].format(other)
|
message = messages["lover_suicide_no_reveal"].format(lover)
|
||||||
cli.msg(botconfig.CHANNEL, message)
|
channels.Main.send(message)
|
||||||
debuglog("{0} ({1}) LOVE SUICIDE: {2} ({3})".format(other, get_role(other), nick, nickrole))
|
debuglog("{0} ({1}) LOVE SUICIDE: {2} ({3})".format(lover, get_main_role(lover), player, mainrole))
|
||||||
del_player(cli, other, True, end_game = False, killer_role = killer_role, deadlist = deadlist, original = original, ismain = False)
|
del_player(lover, end_game=False, killer_role=killer_role, deadlist=deadlist, original=original, ismain=False)
|
||||||
pl = refresh_pl(pl)
|
pl = refresh_pl(pl)
|
||||||
if "assassin" in nicktpls:
|
if "assassin" in allroles:
|
||||||
if nick in var.TARGETED:
|
if player.nick in var.TARGETED:
|
||||||
target = var.TARGETED[nick]
|
targetnick = var.TARGETED[player.nick]
|
||||||
del var.TARGETED[nick]
|
del var.TARGETED[player.nick]
|
||||||
|
if targetnick is None:
|
||||||
|
target = None
|
||||||
|
else:
|
||||||
|
target = users._get(targetnick) # FIXME
|
||||||
if target is not None and target in pl:
|
if target is not None and target in pl:
|
||||||
targuser = users._get(target) # FIXME
|
prots = deque(var.ACTIVE_PROTECTIONS[target.nick])
|
||||||
prots = deque(var.ACTIVE_PROTECTIONS[target])
|
aevt = Event("assassinate", {"pl": pl, "target": target},
|
||||||
aevt = Event("assassinate", {"pl": pl, "target": targuser},
|
|
||||||
del_player=del_player,
|
del_player=del_player,
|
||||||
deadlist=deadlist,
|
deadlist=deadlist,
|
||||||
original=original,
|
original=original,
|
||||||
refresh_pl=refresh_pl,
|
refresh_pl=refresh_pl,
|
||||||
message_prefix="assassin_fail_",
|
message_prefix="assassin_fail_",
|
||||||
source="assassin",
|
source="assassin",
|
||||||
killer=nick,
|
killer=player,
|
||||||
killer_mainrole=nickrole,
|
killer_mainrole=mainrole,
|
||||||
killer_allroles=allroles,
|
killer_allroles=allroles,
|
||||||
prots=prots)
|
prots=prots)
|
||||||
while len(prots) > 0:
|
while len(prots) > 0:
|
||||||
# an event can read the current active protection and cancel the assassination
|
# an event can read the current active protection and cancel the assassination
|
||||||
# if it cancels, it is responsible for removing the protection from var.ACTIVE_PROTECTIONS
|
# if it cancels, it is responsible for removing the protection from var.ACTIVE_PROTECTIONS
|
||||||
# so that it cannot be used again (if the protection is meant to be usable once-only)
|
# so that it cannot be used again (if the protection is meant to be usable once-only)
|
||||||
if not aevt.dispatch(cli, var, nick, target, prots[0]):
|
if not aevt.dispatch(var, player, target, prots[0]):
|
||||||
pl = aevt.data["pl"]
|
pl = aevt.data["pl"]
|
||||||
if targuser is not aevt.data["target"]:
|
if target is not aevt.data["target"]:
|
||||||
targuser = aevt.data["target"]
|
target = aevt.data["target"]
|
||||||
target = targuser.nick
|
prots = deque(var.ACTIVE_PROTECTIONS[target.nick])
|
||||||
prots = deque(var.ACTIVE_PROTECTIONS[target])
|
|
||||||
aevt.params.prots = prots
|
aevt.params.prots = prots
|
||||||
continue
|
continue
|
||||||
break
|
break
|
||||||
prots.popleft()
|
prots.popleft()
|
||||||
if len(prots) == 0:
|
if len(prots) == 0:
|
||||||
if var.ROLE_REVEAL in ("on", "team"):
|
if var.ROLE_REVEAL in ("on", "team"):
|
||||||
role = get_reveal_role(target)
|
role = get_reveal_role(target.nick)
|
||||||
an = "n" if role.startswith(("a", "e", "i", "o", "u")) else ""
|
an = "n" if role.startswith(("a", "e", "i", "o", "u")) else ""
|
||||||
message = messages["assassin_success"].format(nick, target, an, role)
|
message = messages["assassin_success"].format(player, target, an, role)
|
||||||
else:
|
else:
|
||||||
message = messages["assassin_success_no_reveal"].format(nick, target)
|
message = messages["assassin_success_no_reveal"].format(player, target)
|
||||||
cli.msg(botconfig.CHANNEL, message)
|
channels.Main.send(message)
|
||||||
debuglog("{0} (assassin) ASSASSINATE: {1} ({2})".format(nick, target, get_role(target)))
|
debuglog("{0} (assassin) ASSASSINATE: {1} ({2})".format(player, target, get_main_role(target)))
|
||||||
del_player(cli, target, True, end_game=False, killer_role=nickrole, deadlist=deadlist, original=original, ismain=False)
|
del_player(target, end_game=False, killer_role=mainrole, deadlist=deadlist, original=original, ismain=False)
|
||||||
pl = refresh_pl(pl)
|
pl = refresh_pl(pl)
|
||||||
if nickrole == "time lord":
|
if mainrole == "time lord":
|
||||||
if "DAY_TIME_LIMIT" not in var.ORIGINAL_SETTINGS:
|
if "DAY_TIME_LIMIT" not in var.ORIGINAL_SETTINGS:
|
||||||
var.ORIGINAL_SETTINGS["DAY_TIME_LIMIT"] = var.DAY_TIME_LIMIT
|
var.ORIGINAL_SETTINGS["DAY_TIME_LIMIT"] = var.DAY_TIME_LIMIT
|
||||||
if "DAY_TIME_WARN" not in var.ORIGINAL_SETTINGS:
|
if "DAY_TIME_WARN" not in var.ORIGINAL_SETTINGS:
|
||||||
@ -2549,7 +2555,7 @@ def del_player(cli, nick, forced_death=False, devoice=True, end_game=True, death
|
|||||||
var.SHORT_DAY_WARN = var.TIME_LORD_DAY_WARN
|
var.SHORT_DAY_WARN = var.TIME_LORD_DAY_WARN
|
||||||
var.NIGHT_TIME_LIMIT = var.TIME_LORD_NIGHT_LIMIT
|
var.NIGHT_TIME_LIMIT = var.TIME_LORD_NIGHT_LIMIT
|
||||||
var.NIGHT_TIME_WARN = var.TIME_LORD_NIGHT_WARN
|
var.NIGHT_TIME_WARN = var.TIME_LORD_NIGHT_WARN
|
||||||
cli.msg(botconfig.CHANNEL, messages["time_lord_dead"].format(var.TIME_LORD_DAY_LIMIT, var.TIME_LORD_NIGHT_LIMIT))
|
channels.Main.send(messages["time_lord_dead"].format(var.TIME_LORD_DAY_LIMIT, var.TIME_LORD_NIGHT_LIMIT))
|
||||||
if var.GAMEPHASE == "day" and timeleft_internal("day") > var.DAY_TIME_LIMIT and var.DAY_TIME_LIMIT > 0:
|
if var.GAMEPHASE == "day" and timeleft_internal("day") > var.DAY_TIME_LIMIT and var.DAY_TIME_LIMIT > 0:
|
||||||
if "day" in var.TIMERS:
|
if "day" in var.TIMERS:
|
||||||
var.TIMERS["day"][0].cancel()
|
var.TIMERS["day"][0].cancel()
|
||||||
@ -2557,7 +2563,7 @@ def del_player(cli, nick, forced_death=False, devoice=True, end_game=True, death
|
|||||||
var.TIMERS["day"] = (t, time.time(), var.DAY_TIME_LIMIT)
|
var.TIMERS["day"] = (t, time.time(), var.DAY_TIME_LIMIT)
|
||||||
t.daemon = True
|
t.daemon = True
|
||||||
t.start()
|
t.start()
|
||||||
# Don't duplicate warnings, e.g. only set the warn timer if a warning was not already given
|
# Don't duplicate warnings, i.e. only set the warn timer if a warning was not already given
|
||||||
if "day_warn" in var.TIMERS and var.TIMERS["day_warn"][0].isAlive():
|
if "day_warn" in var.TIMERS and var.TIMERS["day_warn"][0].isAlive():
|
||||||
var.TIMERS["day_warn"][0].cancel()
|
var.TIMERS["day_warn"][0].cancel()
|
||||||
t = threading.Timer(var.DAY_TIME_WARN, hurry_up, [cli, var.DAY_ID, False])
|
t = threading.Timer(var.DAY_TIME_WARN, hurry_up, [cli, var.DAY_ID, False])
|
||||||
@ -2579,17 +2585,16 @@ def del_player(cli, nick, forced_death=False, devoice=True, end_game=True, death
|
|||||||
t.daemon = True
|
t.daemon = True
|
||||||
t.start()
|
t.start()
|
||||||
|
|
||||||
debuglog(nick, "(time lord) TRIGGER")
|
debuglog(player.nick, "(time lord) TRIGGER")
|
||||||
|
|
||||||
pl = refresh_pl(pl)
|
pl = refresh_pl(pl)
|
||||||
# i herd u liek parameters
|
# i herd u liek parameters
|
||||||
evt_death_triggers = death_triggers and var.PHASE in var.GAME_PHASES
|
evt_death_triggers = death_triggers and var.PHASE in var.GAME_PHASES
|
||||||
user = users._get(nick) # FIXME
|
|
||||||
event = Event("del_player", {"pl": pl},
|
event = Event("del_player", {"pl": pl},
|
||||||
forced_death=forced_death, end_game=end_game,
|
end_game=end_game,
|
||||||
deadlist=deadlist, original=original, killer_role=killer_role,
|
deadlist=deadlist, original=original, killer_role=killer_role,
|
||||||
ismain=ismain, refresh_pl=refresh_pl, del_player=del_player)
|
ismain=ismain, refresh_pl=refresh_pl, del_player=del_player)
|
||||||
event.dispatch(var, user, nickrole, allroles, evt_death_triggers)
|
event.dispatch(var, player, mainrole, allroles, evt_death_triggers)
|
||||||
|
|
||||||
# update var.ROLE_STATS
|
# update var.ROLE_STATS
|
||||||
# Event priorities:
|
# Event priorities:
|
||||||
@ -2597,15 +2602,15 @@ def del_player(cli, nick, forced_death=False, devoice=True, end_game=True, death
|
|||||||
# 3 = Removing from the possible set (e.g. can't be traitor if was a night kill and only wolves could kill at night),
|
# 3 = Removing from the possible set (e.g. can't be traitor if was a night kill and only wolves could kill at night),
|
||||||
# 5 = Setting known_role to True if the role is actually known for sure publically (e.g. revealing totem)
|
# 5 = Setting known_role to True if the role is actually known for sure publically (e.g. revealing totem)
|
||||||
# 2 and 4 are not used by included roles, but may be useful expansion points for custom roles to modify stats
|
# 2 and 4 are not used by included roles, but may be useful expansion points for custom roles to modify stats
|
||||||
event = Event("update_stats", {"possible": {nickrole, nickreveal}, "known_role": False},
|
event = Event("update_stats", {"possible": {mainrole, revealrole}, "known_role": False},
|
||||||
killer_role=killer_role, ismain=ismain)
|
killer_role=killer_role, ismain=ismain)
|
||||||
event.dispatch(cli, var, nick, nickrole, nickreveal, nicktpls)
|
event.dispatch(var, player, mainrole, revealrole, allroles)
|
||||||
# Given the set of possible roles this nick could be (or its actual role if known_role is True),
|
# Given the set of possible roles this nick could be (or its actual role if known_role is True),
|
||||||
# figure out the set of roles that need deducting from their counts in var.ROLE_STATS
|
# figure out the set of roles that need deducting from their counts in var.ROLE_STATS
|
||||||
if event.data["known_role"]:
|
if event.data["known_role"]:
|
||||||
# we somehow know the exact role that died (for example, we know traitor died even though they revealed as villager)
|
# we somehow know the exact role that died (for example, we know traitor died even though they revealed as villager)
|
||||||
# as a result, deduct only them
|
# as a result, deduct only them
|
||||||
possible = {nickrole}
|
possible = {mainrole}
|
||||||
else:
|
else:
|
||||||
possible = set(event.data["possible"])
|
possible = set(event.data["possible"])
|
||||||
newstats = set()
|
newstats = set()
|
||||||
@ -2619,28 +2624,27 @@ def del_player(cli, nick, forced_death=False, devoice=True, end_game=True, death
|
|||||||
d = dict(rs)
|
d = dict(rs)
|
||||||
if p in d and d[p] >= 1:
|
if p in d and d[p] >= 1:
|
||||||
d[p] -= 1
|
d[p] -= 1
|
||||||
event.dispatch(cli, var, d)
|
event.dispatch(var, d)
|
||||||
if min(d.values()) >= 0:
|
if min(d.values()) >= 0:
|
||||||
newstats.add(frozenset(d.items()))
|
newstats.add(frozenset(d.items()))
|
||||||
var.ROLE_STATS = frozenset(newstats)
|
var.ROLE_STATS = frozenset(newstats)
|
||||||
|
|
||||||
if devoice and (var.PHASE != "night" or not var.DEVOICE_DURING_NIGHT):
|
if devoice and (var.PHASE != "night" or not var.DEVOICE_DURING_NIGHT):
|
||||||
cmode.append(("-v", nick))
|
cmode.append(("-v", player.nick))
|
||||||
if users.exists(nick):
|
if not player.is_fake:
|
||||||
host = users.get(nick).host.lower()
|
lplayer = player.lower()
|
||||||
acc = irc_lower(users.get(nick).account)
|
if lplayer.account not in var.DEADCHAT_PREFS_ACCS and lplayer.host not in var.DEADCHAT_PREFS:
|
||||||
if acc not in var.DEADCHAT_PREFS_ACCS and host not in var.DEADCHAT_PREFS:
|
deadchat.append(player)
|
||||||
deadchat.append(users._get(nick)) # FIXME
|
|
||||||
# devoice all players that died as a result, if we are in the original del_player
|
# devoice all players that died as a result, if we are in the original del_player
|
||||||
if ismain:
|
if ismain:
|
||||||
mass_mode(cli, cmode, [])
|
channels.Main.mode(*cmode)
|
||||||
del cmode[:]
|
del cmode[:]
|
||||||
if var.PHASE == "join":
|
if var.PHASE == "join":
|
||||||
if nick in var.GAMEMODE_VOTES:
|
if player.nick in var.GAMEMODE_VOTES:
|
||||||
del var.GAMEMODE_VOTES[nick]
|
del var.GAMEMODE_VOTES[player.nick]
|
||||||
|
|
||||||
with var.WARNING_LOCK:
|
with var.WARNING_LOCK:
|
||||||
var.START_VOTES.discard(nick)
|
var.START_VOTES.discard(player.nick)
|
||||||
|
|
||||||
# Cancel the start vote timer if there are no votes left
|
# Cancel the start vote timer if there are no votes left
|
||||||
if not var.START_VOTES and "start_votes" in var.TIMERS:
|
if not var.START_VOTES and "start_votes" in var.TIMERS:
|
||||||
@ -2648,17 +2652,17 @@ def del_player(cli, nick, forced_death=False, devoice=True, end_game=True, death
|
|||||||
del var.TIMERS["start_votes"]
|
del var.TIMERS["start_votes"]
|
||||||
|
|
||||||
# Died during the joining process as a person
|
# Died during the joining process as a person
|
||||||
for mode in var.OLD_MODES[users._get(nick)]: # FIXME
|
for mode in var.OLD_MODES[player]:
|
||||||
cmode.append(("+" + mode, nick))
|
cmode.append(("+" + mode, player.nick))
|
||||||
del var.OLD_MODES[users._get(nick)]
|
del var.OLD_MODES[player]
|
||||||
var.ALL_PLAYERS.remove(users._get(nick)) # FIXME
|
var.ALL_PLAYERS.remove(player)
|
||||||
ret = not chk_win(cli)
|
ret = not chk_win(channels.Main.client) # FIXME
|
||||||
else:
|
else:
|
||||||
# Died during the game, so quiet!
|
# Died during the game, so quiet!
|
||||||
if var.QUIET_DEAD_PLAYERS and not is_fake_nick(nick):
|
if var.QUIET_DEAD_PLAYERS and not player.is_fake:
|
||||||
cmode.append(("+{0}".format(var.QUIET_MODE), var.QUIET_PREFIX+nick+"!*@*"))
|
cmode.append(("+{0}".format(var.QUIET_MODE), var.QUIET_PREFIX+player.nick+"!*@*"))
|
||||||
var.DEAD.add(nick)
|
var.DEAD.add(player.nick)
|
||||||
ret = not chk_win(cli, end_game)
|
ret = not chk_win(channels.Main.client, end_game) # FIXME
|
||||||
# only join to deadchat if the game isn't about to end
|
# only join to deadchat if the game isn't about to end
|
||||||
if ismain:
|
if ismain:
|
||||||
if ret:
|
if ret:
|
||||||
@ -2667,36 +2671,36 @@ def del_player(cli, nick, forced_death=False, devoice=True, end_game=True, death
|
|||||||
if var.PHASE in var.GAME_PHASES:
|
if var.PHASE in var.GAME_PHASES:
|
||||||
# remove the player from variables if they're in there
|
# remove the player from variables if they're in there
|
||||||
if ret:
|
if ret:
|
||||||
for x in (var.OBSERVED, var.HVISITED, var.TARGETED, var.LASTHEXED):
|
for x in (var.OBSERVED, var.TARGETED, var.LASTHEXED):
|
||||||
for k in list(x):
|
for k in list(x):
|
||||||
if nick in (k, x[k]):
|
if player.nick in (k, x[k]):
|
||||||
del x[k]
|
del x[k]
|
||||||
if nick in var.DISCONNECTED:
|
if player.nick in var.DISCONNECTED:
|
||||||
del var.DISCONNECTED[nick]
|
del var.DISCONNECTED[player.nick]
|
||||||
if var.PHASE == "night":
|
if var.PHASE == "night":
|
||||||
# remove players from night variables
|
# remove players from night variables
|
||||||
# the dicts are handled above, these are the lists of who has acted which is used to determine whether night should end
|
# the dicts are handled above, these are the lists of who has acted which is used to determine whether night should end
|
||||||
# if these aren't cleared properly night may end prematurely
|
# if these aren't cleared properly night may end prematurely
|
||||||
for x in (var.PASSED, var.HEXED, var.MATCHMAKERS, var.CURSED, var.CHARMERS):
|
for x in (var.PASSED, var.HEXED, var.MATCHMAKERS, var.CURSED, var.CHARMERS):
|
||||||
x.discard(nick)
|
x.discard(player.nick)
|
||||||
if var.PHASE == "day" and not forced_death and ret: # didn't die from lynching
|
if var.PHASE == "day" and ret:
|
||||||
var.VOTES.pop(nick, None) # Delete other people's votes on the player
|
var.VOTES.pop(player.nick, None) # Delete other people's votes on the player
|
||||||
for k in list(var.VOTES.keys()):
|
for k in list(var.VOTES.keys()):
|
||||||
if nick in var.VOTES[k]:
|
if player.nick in var.VOTES[k]:
|
||||||
var.VOTES[k].remove(nick)
|
var.VOTES[k].remove(player.nick)
|
||||||
if not var.VOTES[k]: # no more votes on that person
|
if not var.VOTES[k]: # no more votes on that person
|
||||||
del var.VOTES[k]
|
del var.VOTES[k]
|
||||||
break # can only vote once
|
break # can only vote once
|
||||||
|
|
||||||
var.NO_LYNCH.discard(nick)
|
var.NO_LYNCH.discard(player.nick)
|
||||||
var.WOUNDED.discard(nick)
|
var.WOUNDED.discard(player.nick)
|
||||||
var.CONSECRATING.discard(nick)
|
var.CONSECRATING.discard(player.nick)
|
||||||
# note: PHASE = "day" and GAMEPHASE = "night" during transition_day;
|
# note: PHASE = "day" and GAMEPHASE = "night" during transition_day;
|
||||||
# we only want to induce a lynch if it's actually day
|
# we only want to induce a lynch if it's actually day and we aren't in a chained death
|
||||||
if var.GAMEPHASE == "day":
|
if var.GAMEPHASE == "day" and ismain:
|
||||||
chk_decision(cli)
|
chk_decision(channels.Main.client)
|
||||||
elif var.PHASE == "night" and ret:
|
elif var.PHASE == "night" and ret and ismain:
|
||||||
chk_nightdone(cli)
|
chk_nightdone(channels.Main.client)
|
||||||
|
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
@ -2772,7 +2776,7 @@ def reaper(cli, gameid):
|
|||||||
var.ORIGINAL_ROLES[r].add("(dced)"+nck)
|
var.ORIGINAL_ROLES[r].add("(dced)"+nck)
|
||||||
if var.IDLE_PENALTY:
|
if var.IDLE_PENALTY:
|
||||||
add_warning(cli, nck, var.IDLE_PENALTY, botconfig.NICK, messages["idle_warning"], expires=var.IDLE_EXPIRY)
|
add_warning(cli, nck, var.IDLE_PENALTY, botconfig.NICK, messages["idle_warning"], expires=var.IDLE_EXPIRY)
|
||||||
del_player(cli, nck, end_game = False, death_triggers = False)
|
del_player(users._get(nck), end_game=False, death_triggers=False) # FIXME
|
||||||
chk_win(cli)
|
chk_win(cli)
|
||||||
pl = list_players()
|
pl = list_players()
|
||||||
x = [a for a in to_warn if a in pl]
|
x = [a for a in to_warn if a in pl]
|
||||||
@ -2789,7 +2793,7 @@ def reaper(cli, gameid):
|
|||||||
cli.msg(chan, messages["quit_death_no_reveal"].format(dcedplayer))
|
cli.msg(chan, messages["quit_death_no_reveal"].format(dcedplayer))
|
||||||
if var.PHASE != "join" and var.PART_PENALTY:
|
if var.PHASE != "join" and var.PART_PENALTY:
|
||||||
add_warning(cli, dcedplayer, var.PART_PENALTY, botconfig.NICK, messages["quit_warning"], expires=var.PART_EXPIRY)
|
add_warning(cli, dcedplayer, var.PART_PENALTY, botconfig.NICK, messages["quit_warning"], expires=var.PART_EXPIRY)
|
||||||
if not del_player(cli, dcedplayer, devoice = False, death_triggers = False):
|
if not del_player(users._get(dcedplayer), devoice=False, death_triggers=False): # FIXME
|
||||||
return
|
return
|
||||||
elif what == "part" and (datetime.now() - timeofdc) > timedelta(seconds=var.PART_GRACE_TIME):
|
elif what == "part" and (datetime.now() - timeofdc) > timedelta(seconds=var.PART_GRACE_TIME):
|
||||||
if get_role(dcedplayer) != "person" and var.ROLE_REVEAL in ("on", "team"):
|
if get_role(dcedplayer) != "person" and var.ROLE_REVEAL in ("on", "team"):
|
||||||
@ -2798,7 +2802,7 @@ def reaper(cli, gameid):
|
|||||||
cli.msg(chan, messages["part_death_no_reveal"].format(dcedplayer))
|
cli.msg(chan, messages["part_death_no_reveal"].format(dcedplayer))
|
||||||
if var.PHASE != "join" and var.PART_PENALTY:
|
if var.PHASE != "join" and var.PART_PENALTY:
|
||||||
add_warning(cli, dcedplayer, var.PART_PENALTY, botconfig.NICK, messages["part_warning"], expires=var.PART_EXPIRY)
|
add_warning(cli, dcedplayer, var.PART_PENALTY, botconfig.NICK, messages["part_warning"], expires=var.PART_EXPIRY)
|
||||||
if not del_player(cli, dcedplayer, devoice = False, death_triggers = False):
|
if not del_player(users._get(dcedplayer), devoice=False, death_triggers=False): # FIXME
|
||||||
return
|
return
|
||||||
elif what == "account" and (datetime.now() - timeofdc) > timedelta(seconds=var.ACC_GRACE_TIME):
|
elif what == "account" and (datetime.now() - timeofdc) > timedelta(seconds=var.ACC_GRACE_TIME):
|
||||||
if get_role(dcedplayer) != "person" and var.ROLE_REVEAL in ("on", "team"):
|
if get_role(dcedplayer) != "person" and var.ROLE_REVEAL in ("on", "team"):
|
||||||
@ -2807,7 +2811,7 @@ def reaper(cli, gameid):
|
|||||||
cli.msg(chan, messages["account_death_no_reveal"].format(dcedplayer))
|
cli.msg(chan, messages["account_death_no_reveal"].format(dcedplayer))
|
||||||
if var.PHASE != "join" and var.ACC_PENALTY:
|
if var.PHASE != "join" and var.ACC_PENALTY:
|
||||||
add_warning(cli, dcedplayer, var.ACC_PENALTY, botconfig.NICK, messages["acc_warning"], expires=var.ACC_EXPIRY)
|
add_warning(cli, dcedplayer, var.ACC_PENALTY, botconfig.NICK, messages["acc_warning"], expires=var.ACC_EXPIRY)
|
||||||
if not del_player(cli, dcedplayer, devoice = False, death_triggers = False):
|
if not del_player(users._get(dcedplayer), devoice=False, death_triggers=False): # FIXME
|
||||||
return
|
return
|
||||||
time.sleep(10)
|
time.sleep(10)
|
||||||
|
|
||||||
@ -2999,8 +3003,7 @@ def rename_player(var, user, prefix):
|
|||||||
if prefix in var.PRAYED.keys():
|
if prefix in var.PRAYED.keys():
|
||||||
del var.PRAYED[prefix]
|
del var.PRAYED[prefix]
|
||||||
|
|
||||||
for dictvar in (var.HVISITED, var.OBSERVED, var.TARGETED,
|
for dictvar in (var.OBSERVED, var.TARGETED, var.CLONED, var.LASTHEXED, var.BITE_PREFERENCES):
|
||||||
var.CLONED, var.LASTHEXED, var.BITE_PREFERENCES):
|
|
||||||
kvp = []
|
kvp = []
|
||||||
for a,b in dictvar.items():
|
for a,b in dictvar.items():
|
||||||
if a == prefix:
|
if a == prefix:
|
||||||
@ -3197,7 +3200,7 @@ def leave(var, what, user, why=None):
|
|||||||
population = " " + messages["new_player_count"].format(lpl)
|
population = " " + messages["new_player_count"].format(lpl)
|
||||||
|
|
||||||
reveal = ""
|
reveal = ""
|
||||||
if get_role(user.nick) == "person" or var.ROLE_REVEAL not in ("on", "team"):
|
if get_main_role(user) == "person" or var.ROLE_REVEAL not in ("on", "team"):
|
||||||
reveal = "_no_reveal"
|
reveal = "_no_reveal"
|
||||||
|
|
||||||
grace_times = {"part": var.PART_GRACE_TIME, "quit": var.QUIT_GRACE_TIME, "account": var.ACC_GRACE_TIME, "leave": 0}
|
grace_times = {"part": var.PART_GRACE_TIME, "quit": var.QUIT_GRACE_TIME, "account": var.ACC_GRACE_TIME, "leave": 0}
|
||||||
@ -3226,7 +3229,7 @@ def leave(var, what, user, why=None):
|
|||||||
var.USERS[user.nick]["moded"] = set()
|
var.USERS[user.nick]["moded"] = set()
|
||||||
|
|
||||||
if killplayer:
|
if killplayer:
|
||||||
del_player(user.client, user.nick, death_triggers=False)
|
del_player(user, death_triggers=False)
|
||||||
else:
|
else:
|
||||||
temp = user.lower()
|
temp = user.lower()
|
||||||
var.DISCONNECTED[user.nick] = (temp.account, temp.userhost, datetime.now(), what) # FIXME: Need to make var.DISCONNECTED hold User instances
|
var.DISCONNECTED[user.nick] = (temp.account, temp.userhost, datetime.now(), what) # FIXME: Need to make var.DISCONNECTED hold User instances
|
||||||
@ -3280,7 +3283,7 @@ def leave_game(cli, nick, chan, rest):
|
|||||||
if nick in var.PLAYERS:
|
if nick in var.PLAYERS:
|
||||||
var.DCED_PLAYERS[nick] = var.PLAYERS.pop(nick)
|
var.DCED_PLAYERS[nick] = var.PLAYERS.pop(nick)
|
||||||
|
|
||||||
del_player(cli, nick, death_triggers = False)
|
del_player(users._get(nick), death_triggers=False) # FIXME
|
||||||
|
|
||||||
def begin_day(cli):
|
def begin_day(cli):
|
||||||
chan = botconfig.CHANNEL
|
chan = botconfig.CHANNEL
|
||||||
@ -3442,8 +3445,7 @@ def transition_day(cli, gameid=0):
|
|||||||
user = users._get(target) # FIXME
|
user = users._get(target) # FIXME
|
||||||
evt = Event("night_acted", {"acted": False})
|
evt = Event("night_acted", {"acted": False})
|
||||||
evt.dispatch(var, user, actor)
|
evt.dispatch(var, user, actor)
|
||||||
if ((target in var.HVISITED and var.HVISITED[target]) or
|
if ((target in var.PRAYED and var.PRAYED[target][0] > 0) or target in var.CHARMERS or
|
||||||
(target in var.PRAYED and var.PRAYED[target][0] > 0) or target in var.CHARMERS or
|
|
||||||
target in var.OBSERVED or target in var.HEXED or target in var.CURSED or evt.data["acted"]):
|
target in var.OBSERVED or target in var.HEXED or target in var.CURSED or evt.data["acted"]):
|
||||||
actor.send(messages["werecrow_success"].format(user))
|
actor.send(messages["werecrow_success"].format(user))
|
||||||
else:
|
else:
|
||||||
@ -3667,7 +3669,7 @@ def transition_day(cli, gameid=0):
|
|||||||
wolf.queue_message(messages["lycan_wc_notification"].format(victim))
|
wolf.queue_message(messages["lycan_wc_notification"].format(victim))
|
||||||
role = get_main_role(wolf)
|
role = get_main_role(wolf)
|
||||||
wevt = Event("wolflist", {"tags": set()})
|
wevt = Event("wolflist", {"tags": set()})
|
||||||
wevt.dispatch(cli, var, wolf.nick, victim.nick)
|
wevt.dispatch(var, wolf, victim)
|
||||||
tags = " ".join(wevt.data["tags"])
|
tags = " ".join(wevt.data["tags"])
|
||||||
if tags:
|
if tags:
|
||||||
tags += " "
|
tags += " "
|
||||||
@ -3818,12 +3820,11 @@ def transition_day(cli, gameid=0):
|
|||||||
# no killers, so assume suicide
|
# no killers, so assume suicide
|
||||||
killer_role[deadperson] = get_main_role(deadperson)
|
killer_role[deadperson] = get_main_role(deadperson)
|
||||||
|
|
||||||
dead_nicks = [p.nick for p in dead] # FIXME: Update once del_player has been updated
|
for deadperson in dead[:]:
|
||||||
for deadperson in dead:
|
|
||||||
# check if they have already been killed since del_player could do chain reactions and we want
|
# check if they have already been killed since del_player could do chain reactions and we want
|
||||||
# to avoid sending duplicate messages.
|
# to avoid sending duplicate messages.
|
||||||
if deadperson in get_players():
|
if deadperson in get_players():
|
||||||
del_player(cli, deadperson.nick, end_game=False, killer_role=killer_role[deadperson], deadlist=dead_nicks, original=deadperson.nick)
|
del_player(deadperson, end_game=False, killer_role=killer_role[deadperson], deadlist=dead)
|
||||||
|
|
||||||
event_end = Event("transition_day_end", {"begin_day": begin_day})
|
event_end = Event("transition_day_end", {"begin_day": begin_day})
|
||||||
event_end.dispatch(var)
|
event_end.dispatch(var)
|
||||||
@ -4314,7 +4315,7 @@ def shoot(var, wrapper, message):
|
|||||||
wrapper.send(messages["gunner_victim_wolf_death"].format(victim,an, victimrole))
|
wrapper.send(messages["gunner_victim_wolf_death"].format(victim,an, victimrole))
|
||||||
else: # off and team
|
else: # off and team
|
||||||
wrapper.send(messages["gunner_victim_wolf_death_no_reveal"].format(victim))
|
wrapper.send(messages["gunner_victim_wolf_death_no_reveal"].format(victim))
|
||||||
if not del_player(wrapper.source.client, victim, killer_role=get_role(wrapper.source.nick)):
|
if not del_player(users._get(victim), killer_role=get_main_role(wrapper.source)): # FIXME
|
||||||
return
|
return
|
||||||
elif random.random() <= chances[3]:
|
elif random.random() <= chances[3]:
|
||||||
accident = "accidentally "
|
accident = "accidentally "
|
||||||
@ -4323,7 +4324,7 @@ def shoot(var, wrapper, message):
|
|||||||
wrapper.send(messages["gunner_victim_villager_death"].format(victim, accident))
|
wrapper.send(messages["gunner_victim_villager_death"].format(victim, accident))
|
||||||
if var.ROLE_REVEAL in ("on", "team"):
|
if var.ROLE_REVEAL in ("on", "team"):
|
||||||
wrapper.send(messages["gunner_victim_role"].format(an, victimrole))
|
wrapper.send(messages["gunner_victim_role"].format(an, victimrole))
|
||||||
if not del_player(wrapper.source.client, victim, killer_role=get_role(wrapper.source.nick)):
|
if not del_player(users._get(victim), killer_role=get_main_role(wrapper.source)): # FIXME
|
||||||
return
|
return
|
||||||
else:
|
else:
|
||||||
wrapper.send(messages["gunner_victim_injured"].format(victim))
|
wrapper.send(messages["gunner_victim_injured"].format(victim))
|
||||||
@ -4344,7 +4345,7 @@ def shoot(var, wrapper, message):
|
|||||||
wrapper.send(messages["gunner_suicide"].format(wrapper.source.nick, get_reveal_role(wrapper.source.nick)))
|
wrapper.send(messages["gunner_suicide"].format(wrapper.source.nick, get_reveal_role(wrapper.source.nick)))
|
||||||
else:
|
else:
|
||||||
wrapper.send(messages["gunner_suicide_no_reveal"].format(wrapper.source.nick))
|
wrapper.send(messages["gunner_suicide_no_reveal"].format(wrapper.source.nick))
|
||||||
if not del_player(wrapper.source.client, wrapper.source.nick, killer_role="villager"): # blame explosion on villager's shoddy gun construction or something
|
if not del_player(wrapper.source, killer_role="villager"): # blame explosion on villager's shoddy gun construction or something
|
||||||
return # Someone won.
|
return # Someone won.
|
||||||
|
|
||||||
def is_safe(nick, victim): # replace calls to this with targeted_command event when splitting roles
|
def is_safe(nick, victim): # replace calls to this with targeted_command event when splitting roles
|
||||||
@ -5163,7 +5164,6 @@ def transition_night(cli):
|
|||||||
var.PASSED = set()
|
var.PASSED = set()
|
||||||
var.OBSERVED = {} # those whom werecrows have observed
|
var.OBSERVED = {} # those whom werecrows have observed
|
||||||
var.CHARMERS = set() # pipers who have charmed
|
var.CHARMERS = set() # pipers who have charmed
|
||||||
var.HVISITED = {}
|
|
||||||
var.TOBESILENCED = set()
|
var.TOBESILENCED = set()
|
||||||
var.CONSECRATING = set()
|
var.CONSECRATING = set()
|
||||||
for nick in var.PRAYED:
|
for nick in var.PRAYED:
|
||||||
@ -5623,7 +5623,6 @@ def start(cli, nick, chan, forced = False, restart = ""):
|
|||||||
var.ROLES = {var.DEFAULT_ROLE: set()}
|
var.ROLES = {var.DEFAULT_ROLE: set()}
|
||||||
var.GUNNERS = {}
|
var.GUNNERS = {}
|
||||||
var.OBSERVED = {}
|
var.OBSERVED = {}
|
||||||
var.HVISITED = {}
|
|
||||||
var.CLONED = {}
|
var.CLONED = {}
|
||||||
var.TARGETED = {}
|
var.TARGETED = {}
|
||||||
var.LASTHEXED = {}
|
var.LASTHEXED = {}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user