Add jester role
Similar to fool, the jester wins if they are lynched. Unlike fool, the game continues if jester is lynched and they win alongside the normal winners. Also change it so that a fool's lover does NOT win with fool, so that fool/jester win mechanics are similar (since jester's lover would die with jester). It doesn't pay to fall in love with fools!
This commit is contained in:
parent
a8e1f84412
commit
137a4f2d03
@ -810,7 +810,7 @@ def chk_decision(cli, force = ""):
|
|||||||
return
|
return
|
||||||
# roles that eliminate other players upon being lynched
|
# roles that eliminate other players upon being lynched
|
||||||
# note that lovers, assassin, clone, and vengeful ghost are handled in del_player() since they trigger on more than just lynch
|
# note that lovers, assassin, clone, and vengeful ghost are handled in del_player() since they trigger on more than just lynch
|
||||||
elif votee in var.DESPERATE:
|
if votee in var.DESPERATE:
|
||||||
# Also kill the very last person to vote them, unless they voted themselves last in which case nobody else dies
|
# Also kill the very last person to vote them, unless they voted themselves last in which case nobody else dies
|
||||||
target = voters[-1]
|
target = voters[-1]
|
||||||
if target != votee:
|
if target != votee:
|
||||||
@ -898,6 +898,9 @@ def chk_decision(cli, force = ""):
|
|||||||
var.LOGGER.logMessage(tmsg.replace("\02", ""))
|
var.LOGGER.logMessage(tmsg.replace("\02", ""))
|
||||||
var.LOGGER.logBare(votee, "MAD SCIENTIST")
|
var.LOGGER.logBare(votee, "MAD SCIENTIST")
|
||||||
cli.msg(botconfig.CHANNEL, tmsg)
|
cli.msg(botconfig.CHANNEL, tmsg)
|
||||||
|
# Other
|
||||||
|
if votee in var.ROLES["jester"]:
|
||||||
|
var.JESTERS.append(votee)
|
||||||
|
|
||||||
if var.ROLE_REVEAL:
|
if var.ROLE_REVEAL:
|
||||||
lmsg = random.choice(var.LYNCH_MESSAGES).format(votee, var.get_reveal_role(votee))
|
lmsg = random.choice(var.LYNCH_MESSAGES).format(votee, var.get_reveal_role(votee))
|
||||||
@ -1113,7 +1116,6 @@ def stop_game(cli, winner = ""):
|
|||||||
iwon = True
|
iwon = True
|
||||||
elif rol == "monster" and splr in survived and winner == "monsters":
|
elif rol == "monster" and splr in survived and winner == "monsters":
|
||||||
iwon = True
|
iwon = True
|
||||||
# del_player() doesn't get called on lynched fool, so both will survive even in that case
|
|
||||||
elif splr in var.LOVERS and splr in survived:
|
elif splr in var.LOVERS and splr in survived:
|
||||||
for lvr in var.LOVERS[splr]:
|
for lvr in var.LOVERS[splr]:
|
||||||
if lvr in plrl:
|
if lvr in plrl:
|
||||||
@ -1123,13 +1125,7 @@ def stop_game(cli, winner = ""):
|
|||||||
if lvrrol == "clone" and lvr in var.FINAL_ROLES:
|
if lvrrol == "clone" and lvr in var.FINAL_ROLES:
|
||||||
lvrrol = var.FINAL_ROLES[lvr]
|
lvrrol = var.FINAL_ROLES[lvr]
|
||||||
|
|
||||||
if lvr in survived and not winner.startswith("@") and winner != "monsters":
|
if lvr in survived and winner == "monsters" and lvrrol == "monster":
|
||||||
iwon = True
|
|
||||||
break
|
|
||||||
elif lvr in survived and winner.startswith("@") and winner == "@" + lvr:
|
|
||||||
iwon = True
|
|
||||||
break
|
|
||||||
elif lvr in survived and winner == "monsters" and lvrrol == "monster":
|
|
||||||
iwon = True
|
iwon = True
|
||||||
break
|
break
|
||||||
if rol == "crazed shaman" or rol == "clone":
|
if rol == "crazed shaman" or rol == "clone":
|
||||||
@ -1155,6 +1151,8 @@ def stop_game(cli, winner = ""):
|
|||||||
won = False
|
won = False
|
||||||
if not iwon:
|
if not iwon:
|
||||||
iwon = won and splr in survived
|
iwon = won and splr in survived
|
||||||
|
elif rol == "jester" and splr in var.JESTERS:
|
||||||
|
iwon = True
|
||||||
elif not iwon:
|
elif not iwon:
|
||||||
iwon = won and splr in survived # survived, team won = individual win
|
iwon = won and splr in survived # survived, team won = individual win
|
||||||
|
|
||||||
@ -3773,6 +3771,13 @@ def transition_night(cli):
|
|||||||
else:
|
else:
|
||||||
cli.notice(fool, "You are a \u0002fool\u0002.")
|
cli.notice(fool, "You are a \u0002fool\u0002.")
|
||||||
|
|
||||||
|
for jester in var.ROLES["jester"]:
|
||||||
|
if jester in var.PLAYERS and var.PLAYERS[jester]["cloak"] not in var.SIMPLE_NOTIFY:
|
||||||
|
cli.msg(jester, ('You are a \u0002jester\u0002. You will win alongside the normal winners ' +
|
||||||
|
'if you are lynched during the day. You cannot otherwise win this game.'))
|
||||||
|
else:
|
||||||
|
cli.notice(jester, "You are a \u0002jester\u0002.")
|
||||||
|
|
||||||
for monster in var.ROLES["monster"]:
|
for monster in var.ROLES["monster"]:
|
||||||
if monster in var.PLAYERS and var.PLAYERS[monster]["cloak"] not in var.SIMPLE_NOTIFY:
|
if monster in var.PLAYERS and var.PLAYERS[monster]["cloak"] not in var.SIMPLE_NOTIFY:
|
||||||
cli.msg(monster, ('You are a \u0002monster\u0002. You cannot be killed by the wolves. ' +
|
cli.msg(monster, ('You are a \u0002monster\u0002. You cannot be killed by the wolves. ' +
|
||||||
@ -4057,6 +4062,7 @@ def start(cli, nick, chann_, rest):
|
|||||||
var.ASLEEP = []
|
var.ASLEEP = []
|
||||||
var.PROTECTED = []
|
var.PROTECTED = []
|
||||||
var.DYING = []
|
var.DYING = []
|
||||||
|
var.JESTERS = []
|
||||||
var.NIGHT_COUNT = 0
|
var.NIGHT_COUNT = 0
|
||||||
var.DAY_COUNT = 0
|
var.DAY_COUNT = 0
|
||||||
var.ANGRY_WOLVES = False
|
var.ANGRY_WOLVES = False
|
||||||
|
@ -114,6 +114,7 @@ ROLE_GUIDE = {# village roles
|
|||||||
"clone" : ( 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ),
|
"clone" : ( 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ),
|
||||||
"crazed shaman" : ( 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ),
|
"crazed shaman" : ( 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ),
|
||||||
"fool" : ( 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ),
|
"fool" : ( 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ),
|
||||||
|
"jester" : ( 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ),
|
||||||
"monster" : ( 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ),
|
"monster" : ( 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ),
|
||||||
# templates
|
# templates
|
||||||
"cursed villager" : ( 0 , 1 , 1 , 1 , 1 , 1 , 1 , 2 , 2 ),
|
"cursed villager" : ( 0 , 1 , 1 , 1 , 1 , 1 , 1 , 2 , 2 ),
|
||||||
@ -134,14 +135,14 @@ WOLFCHAT_ROLES = ["wolf", "traitor", "werecrow", "hag", "wolf cub", "sorcerer"]
|
|||||||
# 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 = ["wolf", "traitor", "werecrow", "hag", "wolf cub", "sorcerer", "minion", "cultist"]
|
WOLFTEAM_ROLES = ["wolf", "traitor", "werecrow", "hag", "wolf cub", "sorcerer", "minion", "cultist"]
|
||||||
# These roles never win as a team, only ever individually (either instead of or in addition to the regular winners)
|
# These roles never win as a team, only ever individually (either instead of or in addition to the regular winners)
|
||||||
TRUE_NEUTRAL_ROLES = ["vengeful ghost", "crazed shaman", "fool", "monster", "clone"]
|
TRUE_NEUTRAL_ROLES = ["vengeful ghost", "crazed shaman", "fool", "jester", "monster", "clone"]
|
||||||
|
|
||||||
# The roles in here are considered templates and will be applied on TOP of other roles. The restrictions are a list of roles that they CANNOT be applied to
|
# The roles in here are considered templates and will be applied on TOP of other roles. The restrictions are a list of roles that they CANNOT be applied to
|
||||||
# NB: if you want a template to apply to everyone, list it here but make the restrictions an empty list. Templates not listed here are considered full roles instead
|
# NB: if you want a template to apply to everyone, list it here but make the restrictions an empty list. Templates not listed here are considered full roles instead
|
||||||
TEMPLATE_RESTRICTIONS = {"cursed villager" : ["wolf", "wolf cub", "werecrow", "seer", "oracle", "augur", "fool"],
|
TEMPLATE_RESTRICTIONS = {"cursed villager" : ["wolf", "wolf cub", "werecrow", "seer", "oracle", "augur", "fool", "jester"],
|
||||||
"gunner" : ["wolf", "traitor", "werecrow", "hag", "wolf cub", "sorcerer", "minion", "cultist", "fool", "lycan"],
|
"gunner" : ["wolf", "traitor", "werecrow", "hag", "wolf cub", "sorcerer", "minion", "cultist", "fool", "lycan", "jester"],
|
||||||
"sharpshooter" : ["wolf", "traitor", "werecrow", "hag", "wolf cub", "sorcerer", "minion", "cultist", "fool", "lycan"],
|
"sharpshooter" : ["wolf", "traitor", "werecrow", "hag", "wolf cub", "sorcerer", "minion", "cultist", "fool", "lycan", "jester"],
|
||||||
"mayor" : ["fool"],
|
"mayor" : ["fool", "jester"],
|
||||||
"assassin" : ["seer", "augur", "oracle", "harlot", "detective", "bodyguard", "guardian angel", "village drunk", "hunter", "shaman", "crazed shaman", "fool", "mayor", "wolf", "werecrow", "wolf cub", "traitor", "lycan"],
|
"assassin" : ["seer", "augur", "oracle", "harlot", "detective", "bodyguard", "guardian angel", "village drunk", "hunter", "shaman", "crazed shaman", "fool", "mayor", "wolf", "werecrow", "wolf cub", "traitor", "lycan"],
|
||||||
"amnesiac" : ["villager", "cultist", "wolf", "minion", "matchmaker", "village elder", "time lord", "clone", "mad scientist", "vengeful ghost"],
|
"amnesiac" : ["villager", "cultist", "wolf", "minion", "matchmaker", "village elder", "time lord", "clone", "mad scientist", "vengeful ghost"],
|
||||||
"bureaucrat" : [],
|
"bureaucrat" : [],
|
||||||
@ -315,6 +316,7 @@ class EvilVillageMode(object):
|
|||||||
"clone" : ( 0 , 0 ),
|
"clone" : ( 0 , 0 ),
|
||||||
"crazed shaman" : ( 0 , 0 ),
|
"crazed shaman" : ( 0 , 0 ),
|
||||||
"fool" : ( 0 , 0 ),
|
"fool" : ( 0 , 0 ),
|
||||||
|
"jester" : ( 0 , 0 ),
|
||||||
"monster" : ( 0 , 0 ),
|
"monster" : ( 0 , 0 ),
|
||||||
# templates
|
# templates
|
||||||
"cursed villager" : ( 0 , 0 ),
|
"cursed villager" : ( 0 , 0 ),
|
||||||
|
Loading…
x
Reference in New Issue
Block a user