Complete doomsayer (untested)
This commit is contained in:
parent
3571d664ed
commit
16db66677c
@ -189,12 +189,12 @@ ROLE_GUIDE = OrderedDict([ # This is order-sensitive - many parts of the code re
|
|||||||
("werekitten" , ( 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 )),
|
("werekitten" , ( 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 )),
|
||||||
("wolf mystic" , ( 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 )),
|
("wolf mystic" , ( 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 )),
|
||||||
("fallen angel" , ( 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 )),
|
("fallen angel" , ( 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 )),
|
||||||
|
("doomsayer" , ( 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 )),
|
||||||
("wolf cub" , ( 0 , 0 , 0 , 0 , 0 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 )),
|
("wolf cub" , ( 0 , 0 , 0 , 0 , 0 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 )),
|
||||||
("traitor" , ( 0 , 0 , 0 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 )),
|
("traitor" , ( 0 , 0 , 0 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 )),
|
||||||
("hag" , ( 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 )),
|
("hag" , ( 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 )),
|
||||||
("sorcerer" , ( 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 1 , 1 , 1 )),
|
("sorcerer" , ( 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 1 , 1 , 1 )),
|
||||||
("warlock" , ( 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 )),
|
("warlock" , ( 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 )),
|
||||||
("doomsayer" , ( 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 )),
|
|
||||||
("minion" , ( 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 )),
|
("minion" , ( 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 )),
|
||||||
("cultist" , ( 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 )),
|
("cultist" , ( 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 )),
|
||||||
# villager roles
|
# villager roles
|
||||||
@ -245,9 +245,9 @@ ROLE_GUIDE = OrderedDict([ # This is order-sensitive - many parts of the code re
|
|||||||
|
|
||||||
# Harlot dies when visiting, seer sees as wolf, gunner kills when shooting, GA and bodyguard have a chance at dying when guarding
|
# Harlot dies when visiting, seer sees as wolf, gunner kills when shooting, GA and bodyguard have a chance at dying when guarding
|
||||||
# If every wolf role dies, and there are no remaining traitors, the game ends and villagers win (monster may steal win)
|
# If every wolf role dies, and there are no remaining traitors, the game ends and villagers win (monster may steal win)
|
||||||
WOLF_ROLES = frozenset({"wolf", "alpha wolf", "werecrow", "wolf cub", "werekitten", "wolf mystic", "fallen angel"})
|
WOLF_ROLES = frozenset({"wolf", "alpha wolf", "werecrow", "wolf cub", "werekitten", "wolf mystic", "fallen angel", "doomsayer"})
|
||||||
# Access to wolfchat, and counted towards the # of wolves vs villagers when determining if a side has won
|
# Access to wolfchat, and counted towards the # of wolves vs villagers when determining if a side has won
|
||||||
WOLFCHAT_ROLES = WOLF_ROLES | {"traitor", "hag", "sorcerer", "warlock", "doomsayer"}
|
WOLFCHAT_ROLES = WOLF_ROLES | {"traitor", "hag", "sorcerer", "warlock"}
|
||||||
# Wins with the wolves, even if the roles are not necessarily wolves themselves
|
# Wins with the wolves, even if the roles are not necessarily wolves themselves
|
||||||
WOLFTEAM_ROLES = WOLFCHAT_ROLES | {"minion", "cultist"}
|
WOLFTEAM_ROLES = WOLFCHAT_ROLES | {"minion", "cultist"}
|
||||||
# These roles either steal away wins or can otherwise win with any team
|
# These roles either steal away wins or can otherwise win with any team
|
||||||
@ -258,7 +258,7 @@ AMNESIAC_BLACKLIST = frozenset({"monster", "demoniac", "minion", "matchmaker", "
|
|||||||
SEEN_WOLF = WOLF_ROLES | {"monster", "mad scientist", "succubus"}
|
SEEN_WOLF = WOLF_ROLES | {"monster", "mad scientist", "succubus"}
|
||||||
# These are seen as the default role (or villager) when seen by seer (this overrides SEEN_WOLF)
|
# These are seen as the default role (or villager) when seen by seer (this overrides SEEN_WOLF)
|
||||||
SEEN_DEFAULT = frozenset({"traitor", "hag", "sorcerer", "time lord", "villager", "cultist", "minion", "turncoat", "amnesiac",
|
SEEN_DEFAULT = frozenset({"traitor", "hag", "sorcerer", "time lord", "villager", "cultist", "minion", "turncoat", "amnesiac",
|
||||||
"vengeful ghost", "lycan", "clone", "fool", "jester", "werekitten", "warlock", "piper", "doomsayer", "demoniac"})
|
"vengeful ghost", "lycan", "clone", "fool", "jester", "werekitten", "warlock", "piper", "demoniac"})
|
||||||
|
|
||||||
# these totems are beneficial for the *receiving* person, but can be detrimental to someone else acting on the receiver!
|
# these totems are beneficial for the *receiving* person, but can be detrimental to someone else acting on the receiver!
|
||||||
BENEFICIAL_TOTEMS = frozenset({"protection", "revealing", "desperation", "influence", "luck", "pestilence", "retribution"})
|
BENEFICIAL_TOTEMS = frozenset({"protection", "revealing", "desperation", "influence", "luck", "pestilence", "retribution"})
|
||||||
|
@ -2092,7 +2092,7 @@ def hurry_up(cli, gameid, change):
|
|||||||
var.DAY_ID = 0
|
var.DAY_ID = 0
|
||||||
|
|
||||||
pl = var.list_players()
|
pl = var.list_players()
|
||||||
avail = len(pl) - len(var.WOUNDED | var.ASLEEP | var.CONSECRATING)
|
avail = len(pl) - len(var.WOUNDED | var.ASLEEP | var.CONSECRATING | var.SICK)
|
||||||
votesneeded = avail // 2 + 1
|
votesneeded = avail // 2 + 1
|
||||||
not_lynching = len(var.NO_LYNCH)
|
not_lynching = len(var.NO_LYNCH)
|
||||||
|
|
||||||
@ -2155,11 +2155,11 @@ def chk_decision(cli, force = ""):
|
|||||||
return
|
return
|
||||||
chan = botconfig.CHANNEL
|
chan = botconfig.CHANNEL
|
||||||
pl = var.list_players()
|
pl = var.list_players()
|
||||||
avail = len(pl) - len(var.WOUNDED | var.ASLEEP | var.CONSECRATING)
|
avail = len(pl) - len(var.WOUNDED | var.ASLEEP | var.CONSECRATING | var.SICK)
|
||||||
votesneeded = avail // 2 + 1
|
votesneeded = avail // 2 + 1
|
||||||
not_lynching = list(var.NO_LYNCH)
|
not_lynching = list(var.NO_LYNCH)
|
||||||
for p in var.PACIFISTS:
|
for p in var.PACIFISTS:
|
||||||
if p in pl and p not in (var.WOUNDED | var.ASLEEP | var.CONSECRATING):
|
if p in pl and p not in (var.WOUNDED | var.ASLEEP | var.CONSECRATING | var.SICK):
|
||||||
not_lynching.append(p)
|
not_lynching.append(p)
|
||||||
|
|
||||||
# .remove() will only remove the first instance, which means this plays nicely with pacifism countering this
|
# .remove() will only remove the first instance, which means this plays nicely with pacifism countering this
|
||||||
@ -2194,7 +2194,7 @@ def chk_decision(cli, force = ""):
|
|||||||
numvotes = 0
|
numvotes = 0
|
||||||
random.shuffle(var.IMPATIENT)
|
random.shuffle(var.IMPATIENT)
|
||||||
for v in var.IMPATIENT:
|
for v in var.IMPATIENT:
|
||||||
if v in pl and v not in voters and v != votee and v not in (var.WOUNDED | var.ASLEEP | var.CONSECRATING):
|
if v in pl and v not in voters and v != votee and v not in (var.WOUNDED | var.ASLEEP | var.CONSECRATING | var.SICK):
|
||||||
# don't add them in if they have the same number or more of pacifism totems
|
# don't add them in if they have the same number or more of pacifism totems
|
||||||
# this matters for desperation totem on the votee
|
# this matters for desperation totem on the votee
|
||||||
imp_count = var.IMPATIENT.count(v)
|
imp_count = var.IMPATIENT.count(v)
|
||||||
@ -2366,7 +2366,7 @@ def show_votes(cli, nick, chan, rest):
|
|||||||
cli.msg(chan, msg)
|
cli.msg(chan, msg)
|
||||||
|
|
||||||
pl = var.list_players()
|
pl = var.list_players()
|
||||||
avail = len(pl) - len(var.WOUNDED | var.ASLEEP | var.CONSECRATING)
|
avail = len(pl) - len(var.WOUNDED | var.ASLEEP | var.CONSECRATING | var.SICK)
|
||||||
votesneeded = avail // 2 + 1
|
votesneeded = avail // 2 + 1
|
||||||
not_voting = len(var.NO_LYNCH)
|
not_voting = len(var.NO_LYNCH)
|
||||||
if not_voting == 1:
|
if not_voting == 1:
|
||||||
@ -2718,7 +2718,7 @@ def chk_win(cli, end_game=True, winner=None):
|
|||||||
lsuccubi = len(var.ROLES.get("succubus", ()))
|
lsuccubi = len(var.ROLES.get("succubus", ()))
|
||||||
lentranced = len(var.ENTRANCED)
|
lentranced = len(var.ENTRANCED)
|
||||||
if var.PHASE == "day":
|
if var.PHASE == "day":
|
||||||
for p in var.WOUNDED | var.ASLEEP | var.CONSECRATING:
|
for p in var.WOUNDED | var.ASLEEP | var.CONSECRATING | var.SICK:
|
||||||
try:
|
try:
|
||||||
role = var.get_role(p)
|
role = var.get_role(p)
|
||||||
if role in var.WOLFCHAT_ROLES:
|
if role in var.WOLFCHAT_ROLES:
|
||||||
@ -3233,6 +3233,7 @@ def del_player(cli, nick, forced_death=False, devoice=True, end_game=True, death
|
|||||||
var.WOUNDED.discard(nick)
|
var.WOUNDED.discard(nick)
|
||||||
var.ASLEEP.discard(nick)
|
var.ASLEEP.discard(nick)
|
||||||
var.CONSECRATING.discard(nick)
|
var.CONSECRATING.discard(nick)
|
||||||
|
var.SICK.discard(nick)
|
||||||
chk_decision(cli)
|
chk_decision(cli)
|
||||||
elif var.PHASE == "night" and ret:
|
elif var.PHASE == "night" and ret:
|
||||||
chk_nightdone(cli)
|
chk_nightdone(cli)
|
||||||
@ -3705,6 +3706,9 @@ def rename_player(cli, prefix, nick):
|
|||||||
if prefix in var.ENTRANCED_DYING:
|
if prefix in var.ENTRANCED_DYING:
|
||||||
var.ENTRANCED_DYING.remove(prefix)
|
var.ENTRANCED_DYING.remove(prefix)
|
||||||
var.ENTRANCED_DYING.add(nick)
|
var.ENTRANCED_DYING.add(nick)
|
||||||
|
if prefix in var.SICK:
|
||||||
|
var.SICK.remove(prefix)
|
||||||
|
var.SICK.add(nick)
|
||||||
with var.GRAVEYARD_LOCK: # to be safe
|
with var.GRAVEYARD_LOCK: # to be safe
|
||||||
if prefix in var.LAST_SAID_TIME.keys():
|
if prefix in var.LAST_SAID_TIME.keys():
|
||||||
var.LAST_SAID_TIME[nick] = var.LAST_SAID_TIME.pop(prefix)
|
var.LAST_SAID_TIME[nick] = var.LAST_SAID_TIME.pop(prefix)
|
||||||
@ -4159,6 +4163,9 @@ def transition_day(cli, gameid=0):
|
|||||||
var.CHARMED.update(var.TOBECHARMED)
|
var.CHARMED.update(var.TOBECHARMED)
|
||||||
var.TOBECHARMED.clear()
|
var.TOBECHARMED.clear()
|
||||||
|
|
||||||
|
# send PMs to sick players
|
||||||
|
for victim in var.SICK:
|
||||||
|
pm(cli, victim, "You woke up today not feeling very well, you think it best to stay home for the remainder of the day and night.")
|
||||||
|
|
||||||
if var.START_WITH_DAY and var.FIRST_DAY:
|
if var.START_WITH_DAY and var.FIRST_DAY:
|
||||||
# TODO: need to message everyone their roles and give a short thing saying "it's daytime"
|
# TODO: need to message everyone their roles and give a short thing saying "it's daytime"
|
||||||
@ -4875,6 +4882,9 @@ def no_lynch(cli, nick, chan, rest):
|
|||||||
elif nick in var.CONSECRATING:
|
elif nick in var.CONSECRATING:
|
||||||
pm(cli, nick, "You are consecrating someone today and cannot participate in the vote.")
|
pm(cli, nick, "You are consecrating someone today and cannot participate in the vote.")
|
||||||
return
|
return
|
||||||
|
elif nick in var.SICK:
|
||||||
|
pm(cli, nick, "You are staying home due to your illness and cannot participate in the vote.")
|
||||||
|
return
|
||||||
candidates = var.VOTES.keys()
|
candidates = var.VOTES.keys()
|
||||||
for voter in list(candidates):
|
for voter in list(candidates):
|
||||||
if nick in var.VOTES[voter]:
|
if nick in var.VOTES[voter]:
|
||||||
@ -4910,6 +4920,9 @@ def lynch(cli, nick, chan, rest):
|
|||||||
if nick in var.CONSECRATING:
|
if nick in var.CONSECRATING:
|
||||||
pm(cli, nick, "You are consecrating someone today and cannot participate in the vote.")
|
pm(cli, nick, "You are consecrating someone today and cannot participate in the vote.")
|
||||||
return
|
return
|
||||||
|
if nick in var.SICK:
|
||||||
|
pm(cli, nick, "You are staying home due to your illness and cannot participate in the vote.")
|
||||||
|
return
|
||||||
|
|
||||||
var.NO_LYNCH.discard(nick)
|
var.NO_LYNCH.discard(nick)
|
||||||
|
|
||||||
@ -5950,7 +5963,7 @@ def hvisit(cli, nick, chan, rest):
|
|||||||
def is_fake_nick(who):
|
def is_fake_nick(who):
|
||||||
return re.search(r"^[0-9]+$", who)
|
return re.search(r"^[0-9]+$", who)
|
||||||
|
|
||||||
@cmd("see", chan=False, pm=True, playing=True, silenced=True, phases=("night",), roles=("seer", "oracle", "augur"))
|
@cmd("see", chan=False, pm=True, playing=True, silenced=True, phases=("night",), roles=("seer", "oracle", "augur", "doomsayer"))
|
||||||
def see(cli, nick, chan, rest):
|
def see(cli, nick, chan, rest):
|
||||||
"""Use your paranormal powers to determine the role or alignment of a player."""
|
"""Use your paranormal powers to determine the role or alignment of a player."""
|
||||||
role = var.get_role(nick)
|
role = var.get_role(nick)
|
||||||
@ -5965,6 +5978,9 @@ def see(cli, nick, chan, rest):
|
|||||||
pm(cli, nick, "Seeing yourself would be a waste.")
|
pm(cli, nick, "Seeing yourself would be a waste.")
|
||||||
return
|
return
|
||||||
victim = choose_target(nick, victim)
|
victim = choose_target(nick, victim)
|
||||||
|
if role == "doomsayer" and is_safe(nick, victim):
|
||||||
|
pm(cli, nick, "You may not see a succubus.")
|
||||||
|
return
|
||||||
if check_exchange(cli, nick, victim):
|
if check_exchange(cli, nick, victim):
|
||||||
return
|
return
|
||||||
victimrole = var.get_role(victim)
|
victimrole = var.get_role(victim)
|
||||||
@ -6000,6 +6016,24 @@ def see(cli, nick, chan, rest):
|
|||||||
"you see that \u0002{0}\u0002 exudes " +
|
"you see that \u0002{0}\u0002 exudes " +
|
||||||
"a \u0002{1}\u0002 aura!").format(victim, aura))
|
"a \u0002{1}\u0002 aura!").format(victim, aura))
|
||||||
debuglog("{0} ({1}) SEE: {2} ({3}) as {4} ({5} aura)".format(nick, role, victim, vrole, victimrole, aura))
|
debuglog("{0} ({1}) SEE: {2} ({3}) as {4} ({5} aura)".format(nick, role, victim, vrole, victimrole, aura))
|
||||||
|
elif role == "doomsayer":
|
||||||
|
mode = random.randint(1, 3)
|
||||||
|
if mode == 1:
|
||||||
|
mode = "DEATH"
|
||||||
|
pm(cli, nick, "You have a vision that \u0002{0}\u0002 will meet an untimely end tonight.".format(victim))
|
||||||
|
var.OTHER_KILLS[nick] = victim
|
||||||
|
elif mode == 2:
|
||||||
|
mode = "LYCAN"
|
||||||
|
pm(cli, nick, "You have a vision that \u0002{0}\u0002 is transforming into a savage beast tomorrow night.".format(victim))
|
||||||
|
var.TOBELYCANTHROPES.add(victim)
|
||||||
|
elif mode == 3:
|
||||||
|
mode = "SICK"
|
||||||
|
pm(cli, nick, "You have a vision that \u0002{0}\u0002 will become incredibly ill tomorrow and unable to do anything.".format(victim))
|
||||||
|
var.TOBEDISEASED.add(victim)
|
||||||
|
var.TOBESILENCED.add(victim)
|
||||||
|
var.SICK.add(victim) # counts as unable to vote and lets them know at beginning of day that they aren't feeling well
|
||||||
|
debuglog("{0} ({1}) SEE: {2} ({3}) - {4}".format(nick, role, victim, vrole, mode))
|
||||||
|
|
||||||
var.SEEN.add(nick)
|
var.SEEN.add(nick)
|
||||||
chk_nightdone(cli)
|
chk_nightdone(cli)
|
||||||
|
|
||||||
@ -6760,6 +6794,7 @@ def transition_night(cli):
|
|||||||
var.TOBEMISDIRECTED = set()
|
var.TOBEMISDIRECTED = set()
|
||||||
var.TOTEMS = {}
|
var.TOTEMS = {}
|
||||||
var.CONSECRATING = set()
|
var.CONSECRATING = set()
|
||||||
|
var.SICK = set()
|
||||||
for nick in var.PRAYED:
|
for nick in var.PRAYED:
|
||||||
var.PRAYED[nick][0] = 0
|
var.PRAYED[nick][0] = 0
|
||||||
var.PRAYED[nick][1] = None
|
var.PRAYED[nick][1] = None
|
||||||
@ -7701,6 +7736,7 @@ def start(cli, nick, chan, forced = False, restart = ""):
|
|||||||
var.ENTRANCED = set()
|
var.ENTRANCED = set()
|
||||||
var.ENTRANCED_DYING = set()
|
var.ENTRANCED_DYING = set()
|
||||||
var.PRAYED = {}
|
var.PRAYED = {}
|
||||||
|
var.SICK = set()
|
||||||
|
|
||||||
var.DEADCHAT_PLAYERS = set()
|
var.DEADCHAT_PLAYERS = set()
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user