From 40b2c345dceb1b88d62df29912ec89b450c82d15 Mon Sep 17 00:00:00 2001 From: skizzerz Date: Mon, 4 Dec 2017 18:18:16 -0600 Subject: [PATCH] Additional piper fixes --- src/roles/piper.py | 76 +++++++++++++++++++++++++--------------------- 1 file changed, 42 insertions(+), 34 deletions(-) diff --git a/src/roles/piper.py b/src/roles/piper.py index fb7e524..232330c 100644 --- a/src/roles/piper.py +++ b/src/roles/piper.py @@ -7,6 +7,7 @@ from collections import defaultdict import botconfig import src.settings as var from src.utilities import * +from src.functions import get_players, get_all_players, get_target, get_main_role from src import channels, users, debuglog, errlog, plog from src.decorators import command, event_listener from src.messages import messages @@ -44,50 +45,56 @@ def charm(var, wrapper, message): evt1.dispatch(wrapper.client, var, "charm", wrapper.source.nick, target1.nick, frozenset({"detrimental"})) if evt1.prevent_default: return - target1 = users._get(evt.data["target"]) # FIXME: need to make targeted_command use users + target1 = users._get(evt1.data["target"]) # FIXME: need to make targeted_command use users if target2 is not None: evt2 = Event("targeted_command", {"target": target2.nick, "misdirection": True, "exchange": True}) evt2.dispatch(wrapper.client, var, "charm", wrapper.source.nick, target2.nick, frozenset({"detrimental"})) if evt2.prevent_default: return - target2 = users._get(evt.data["target"]) # FIXME + target2 = users._get(evt2.data["target"]) # FIXME # Do these checks based on original targets, so piper doesn't know to change due to misdirection/luck totem if orig1 is orig2: - wrapper.pm(messages["must_charm_multiple"]) + wrapper.send(messages["must_charm_multiple"]) return if orig1 in CHARMED and orig2 in CHARMED: - wrapper.pm(messages["targets_already_charmed"].format(orig1, orig2)) + wrapper.send(messages["targets_already_charmed"].format(orig1, orig2)) return elif orig1 in CHARMED: - wrapper.pm(messages["target_already_charmed"].format(orig1)) + wrapper.send(messages["target_already_charmed"].format(orig1)) return elif orig2 in CHARMED: - wrapper.pm(messages["target_already_charmed"].format(orig2)) + wrapper.send(messages["target_already_charmed"].format(orig2)) return - TOBECHARMED[wrapper.source] = set(target1, target2) + TOBECHARMED[wrapper.source] = {target1, target2} TOBECHARMED[wrapper.source].discard(None) if orig2: debuglog("{0} (piper) CHARM {1} ({2}) && {3} ({4})".format(wrapper.source, target1, get_main_role(target1), target2, get_main_role(target2))) - wrapper.pm(messages["charm_multiple_success"].format(orig1, ori2)) + wrapper.send(messages["charm_multiple_success"].format(orig1, orig2)) else: debuglog("{0} (piper) CHARM {1} ({2})".format(wrapper.source, target1, get_main_role(target1))) - wrapper.pm(messages["charm_success"].format(orig1)) + wrapper.send(messages["charm_success"].format(orig1)) chk_nightdone(wrapper.client) @event_listener("chk_win", priority=2) def on_chk_win(evt, cli, var, rolemap, mainroles, lpl, lwolves, lrealwolves): - lp = len(rolemap.get("piper", ())) # lpl doesn't included wounded/sick people or consecrating priests # whereas we want to ensure EVERYONE (even wounded people) are charmed for piper win - if var.PHASE == "day" and lp + len(CHARMED) == len(get_players()): + pipers = set(users._get(p) for p in rolemap.get("piper", ())) # FIXME + lp = len(pipers) + if lp == 0: # no alive pipers, short-circuit this check + return + + uncharmed = set(get_players()) - CHARMED - pipers + + if var.PHASE == "day" and len(uncharmed) == 0: evt.data["winner"] = "pipers" evt.data["message"] = messages["piper_win"].format("s" if lp > 1 else "", "s" if lp == 1 else "") @@ -108,40 +115,41 @@ def on_del_player(evt, var, player, mainrole, allroles, death_triggers): @event_listener("transition_day_begin") def on_transition_day_begin(evt, var): - tocharm = set(itertools.chain(TOBECHARMED.values())) + tocharm = set(itertools.chain.from_iterable(TOBECHARMED.values())) # remove pipers from set; they can never be charmed # but might end up in there due to misdirection/luck totems tocharm.difference_update(get_all_players(("piper",))) # Send out PMs to players who have been charmed for target in tocharm: - charmedlist = list(CHARMED | tocharm - {victim}) + charmedlist = list(CHARMED | tocharm - {target}) message = messages["charmed"] if len(charmedlist) <= 0: - target.pm(message + messages["no_charmed_players"]) + target.send(message + messages["no_charmed_players"]) elif len(charmedlist) == 1: - target.pm(message + messages["one_charmed_player"].format(charmedlist[0])) + target.send(message + messages["one_charmed_player"].format(charmedlist[0])) elif len(charmedlist) == 2: - target.pm(message + messages["two_charmed_players"].format(charmedlist[0], charmedlist[1])) + target.send(message + messages["two_charmed_players"].format(charmedlist[0], charmedlist[1])) else: - target.pm(message + messages["many_charmed_players"].format("\u0002, \u0002".join(charmedlist[:-1]), charmedlist[-1])) + target.send(message + messages["many_charmed_players"].format("\u0002, \u0002".join(p.nick for p in charmedlist[:-1]), charmedlist[-1])) - for target in CHARMED: - tobecharmedlist = list(tocharm) + if len(tocharm) > 0: + for target in CHARMED: + tobecharmedlist = list(tocharm) - if len(tobecharmedlist) == 1: - message = messages["players_charmed_one"].format(tobecharmedlist[0]) - elif len(tobecharmedlist) == 2: - message = messages["players_charmed_two"].format(tobecharmedlist[0], tobecharmedlist[1]) - else: - message = messages["players_charmed_many"].format("\u0002, \u0002".join(tobecharmedlist[:-1]), tobecharmedlist[-1]) + if len(tobecharmedlist) == 1: + message = messages["players_charmed_one"].format(tobecharmedlist[0]) + elif len(tobecharmedlist) == 2: + message = messages["players_charmed_two"].format(tobecharmedlist[0], tobecharmedlist[1]) + else: + message = messages["players_charmed_many"].format("\u0002, \u0002".join(p.nick for p in tobecharmedlist[:-1]), tobecharmedlist[-1]) - previouscharmed = CHARMED - {target} - if len(previouscharmed): - target.pm(message + messages["previously_charmed"].format("\u0002, \u0002".join(previouscharmed))) - else: - target.pm(message) + previouscharmed = CHARMED - {target} + if len(previouscharmed): + target.send(message + messages["previously_charmed"].format("\u0002, \u0002".join(p.nick for p in previouscharmed))) + else: + target.send(message) CHARMED.update(tocharm) TOBECHARMED.clear() @@ -160,13 +168,13 @@ def on_chk_nightdone(evt, var): def on_transition_night_end(evt, var): ps = set(get_players()) - CHARMED for piper in get_all_players(("piper",)): - pl = ps[:] + pl = list(ps) random.shuffle(pl) pl.remove(piper) to_send = "piper_notify" if piper.prefers_simple(): to_send = "piper_simple" - piper.send(messages[to_send], "Players: " + ", ".join(pl), sep="\n") + piper.send(messages[to_send], "Players: " + ", ".join(p.nick for p in pl), sep="\n") @event_listener("exchange_roles") def on_exchange(evt, var, actor, target, actor_role, target_role): @@ -178,7 +186,7 @@ def on_exchange(evt, var, actor, target, actor_role, target_role): @event_listener("get_special") def on_get_special(evt, var): - evt.data["special"].extend(get_players(("piper",))) + evt.data["special"].update(get_players(("piper",))) @event_listener("reset") def on_reset(evt, var): @@ -188,6 +196,6 @@ def on_reset(evt, var): @event_listener("revealroles") def on_revealroles(evt, var, wrapper): if CHARMED: - evt.data["output"].append("\u0002charmed players\u0002: {0}".format(", ".join(CHARMED))) + evt.data["output"].append("\u0002charmed players\u0002: {0}".format(", ".join(p.nick for p in CHARMED))) # vim: set sw=4 expandtab: