def executioner(user_id,victim_id): """This function allows the Executioner / huntress to choose a victim that will die in their place, may they get lynched during the day. The function assumes the player is a huntress and has provided a living participant, so make sure to have filtered this out already. The function returns a Mailbox. Keyword arguments: user_id -> the huntress/executioner's id victim_id -> the target's id""" user_channel = int(db_get(user_id,'channel')) user_undead = int(db_get(user_id,'undead')) role = db_get(user_id,'role') answer = Mailbox() if user_id == victim_id: return Mailbox().respond("I'm sorry, <@{}>. You cannot choose to kill yourself instead of yourself.".format(user_id)) if user_undead == 1: return Mailbox().msg("I am sorry! Once you're undead, your target is set!",user_channel) user_found = False for action in db.get_standoff(user_id): if (action[2] == 'Huntress' or action[2] == 'Executioner') and role == action[2]: db.delete_standoff(action[0]) if int(action[1]) != victim_id: user_found = True answer.msg("You no longer have <@{}> as your target.".format(int(action[1])),user_channel) db.add_standoff(victim_id,role,user_id) answer.msg("You have successfully chosen <@{}> as your ",user_channel) if user_found: answer.msg_add("new ") answer.msg_add("target!") return answer
def disguise(user_id,victim_id,role): """This fuction is taking the tanner's action of disguising people. The function assumes the player is a participant and has the correct role, so make sure to have filtered this out already. The function returns a Mailbox. user_id -> the player who casts the spell victim_id -> the player upon whom the spell is cast role -> the role the player should be disguised as""" uses = int(db_get(user_id,'uses')) if uses < 1: return Mailbox().respond("I am sorry! You currently don't have the ability to disguise anyone!",True) db_set(user_id,'uses',uses - 1) user_channel = int(db_get(user_id,'channel')) user_role = db_get(user_id,'role') victim_role = db_get(user_id,'role') db_set(victim_id,'fakerole',role) answer = Mailbox().msg("You have successfully disguised <@{}> as the **{}**!".format(victim_id,role),user_channel) if uses - 1 > 0: answer.msg("You can disguise **{}** more players!".format(uses-1),user_channel,True) else: answer.msg("That\'s it for today! You can\'t disguise any more players.",user_channel,True) return answer.log("**{}** <@{}> has disguised <@{}>, the **{}**, as the **{}**!".format(user_role,user_id,victim_id,victim_role,role))
def ignite(user_id): """This function ignites all powdered players that aren't pyromancer. The function assumes the player is a participant and has the correct role, so make sure to have filtered this out already. The function returns a Mailbox. user_id -> the player who ignites all powdered players""" uses = int(db_get(user_id,'uses')) if uses < 1: return Mailbox().respond("I am sorry! You currently cannot ignite anyone!",True) db_set(user_id,'uses',uses - 1) user_role = db_get(user_id,'role') user_channel = db_get(user_id,'channel') user_undead = int(db_get(user_id,'undead')) if user_undead == 1: answer = Mailbox().log("<@{}>, an undead **{}**, has pretended to ignite all powdered players.".format(user_id,user_role)) answer.dm("Hey, you are undead, so your power won\'t work. But at least this won\'t blow your cover!",user_id) return answer.msg("Okay! All powdered players will die tomorrow.",user_channel) # Ignite all living players. for user in db.player_list(True,True): if db.isParticipant(user) and db_get(user,'role') != 'Pyromancer': db.add_kill(int(user),'Pyromancer',user_id) answer = Mailbox().log("The **{}** <@{}> has ignited all powdered players!".format(user_role,user_id)) return answer.msg("Okay! All powdered players will die tomorrow.",user_channel)
def disguise(user_id, victim_id, role): """This fuction is taking the tanner's action of disguising people. The function assumes the player is a participant and has the correct role, so make sure to have filtered this out already. The function returns a Mailbox. user_id -> the player who casts the spell victim_id -> the player upon whom the spell is cast role -> the role the player should be disguised as""" uses = int(db_get(user_id, 'uses')) if uses < 1: return Mailbox().respond( "I am sorry! You currently don't have the ability to disguise anyone!", True) user_channel = int(db_get(user_id, 'channel')) user_role = db_get(user_id, 'role') user_undead = int(db_get(user_id, 'undead')) victim_role = db_get(victim_id, 'role') victim_frozen = int(db_get(victim_id, 'frozen')) victim_abducted = int(db_get(victim_id, 'abducted')) if user_undead == 1: return Mailbox().dm( "I am sorry! You are undead, meaning you can no longer disguise people!", user_id, True) if victim_abducted == 1: return Mailbox().msg( "After having finished your great disguise, it seems like you couldn\'t find your target! Where have they gone off to?", user_channel, True) if victim_frozen == 1: return Mailbox().msg( "I am sorry, but <@{}> is too cold for that! You\'ll need a lot more than warm suit to get \'em warmed up." .format(victim_id), user_channel, True) db_set(user_id, 'uses', uses - 1) db_set(victim_id, 'fakerole', role) answer = Mailbox().msg( "You have successfully disguised <@{}> as the **{}**!".format( victim_id, role), user_channel) if uses - 1 > 0: answer.msg("You can disguise **{}** more players!".format(uses - 1), user_channel, True) else: answer.msg( "That\'s it for today! You can\'t disguise any more players.", user_channel, True) answer.log( "**{}** <@{}> has disguised <@{}>, the **{}**, as the **{}**!".format( user_role, user_id, victim_id, victim_role, role)) if victim_role == role: answer.log_add( "\n...does that sound stupid? *Of course!* But how are they supposed to know?" ) return answer
def night(): """Start the second part of the day. The function assumes all polls have been evaluated, and that looking after attacks can begin. The function returns a Mailbox.""" threat = db.get_kill() answer = Mailbox().log("**Results from daily deaths:**") if dy.get_stage() == "Night": return Mailbox().respond("Sure, man. Whatever.") while threat != None: answer = roles.attack(threat[1],threat[2],threat[3],answer) threat = db.get_kill() for player in db.player_list(True): # Give potential night uses user_role = db_get(player,'role') for i in range(len(roles.night_users)): if user_role in roles.night_users[i]: # Give one-time users their one-time power if i == 0: if dy.day_number() == 0: db_set(player,'uses',1) break if user_role in ['White Werewolf'] and dy.day_number() % 2 == 0: i = 1 db_set(player,'uses',i) answer.msg(power.power(user_role),db_get(player,'channel')) break answer.story(evening.evening(db.get_deadies())) db.delete_deadies() # Add polls for player in db.player_list(): if db_get(player,'role') in pos.wolf_pack: for channel_id in db.get_secret_channels('Werewolf'): answer.new_poll(channel_id,'wolf',db.random_wolf(),story_text('wolf')) break for player in db.player_list(): if db_get(player,'role') == 'Cult Leader': for channel_id in db.get_secret_channels('Cult_Leader'): answer.new_poll(channel_id,'cult',db.random_cult(),story_text('cult')) break for channel_id in db.get_secret_channels('Swamp'): answer.new_poll(channel_id,'thing','',story_text('thing')) answer.log("```Night {}```".format(dy.day_number())) dy.set_stage("Night") return answer
def silence(user_id, victim_id): """This fuction is taking grandma's action of silencing people. The function assumes the player is a participant and has the correct role, so make sure to have filtered this out already. The function returns a Mailbox. user_id -> the grandma who silences the victim victim_id -> the player who shall be silenced""" uses = int(db_get(user_id, 'uses')) if uses < 1: return Mailbox().respond( "I am sorry! You currently don't have the ability to silence anyone!", True) user_channel = int(db_get(user_id, 'channel')) user_undead = int(db_get(user_id, 'undead')) victim_frozen = int(db_get(victim_id, 'frozen')) victim_abducted = int(db_get(victim_id, 'abducted')) if user_undead == 1: return Mailbox().dm( "I am sorry! You are undead, meaning you can no longer silence people!", user_id) if victim_abducted == 1: return Mailbox().msg( "It seems like <@{}> has disappeared! Oh well, at least then they won't make any noises either.", user_channel, True) if victim_frozen == 1: return Mailbox().msg( "Don't worry. <@{}>'s so cold, that they probably won't make any noise tomorrow." .format(victim_id), user_channel, True) db_set(user_id, 'uses', uses - 1) db_set(victim_id, 'votes', 0) answer = Mailbox().msg( "You have successfully silenced <@{}>!".format(victim_id), user_channel) if uses - 1 > 0: answer.msg( "You can silence **{}** more players tonight!".format(uses - 1), user_channel, True) else: answer.msg( "That\'s it for tonight! You can\'t silence any more players.", user_channel, True) return answer.log("**Grandma** <@{}> has silenced <@{}>.".format( user_id, victim_id))
def dog_follow(user_id, role): """This function allows the dog to choose a role to become. The function assumes the player is a cupid and has provided a role, so make sure to have filtered this out already. The role does not need to be Innocent, Cursed Civilian or Werewolf yet. The function returns a Mailbox. user_id -> the dog who chooses a role role -> the role they'd like to be""" uses = int(db_get(user_id, 'uses')) if uses < 1: return Mailbox().respond( "I am sorry! You currently cannot choose a role to become!", True) user_channel = int(db_get(user_id, 'channel')) if role not in ['Innocent', 'Cursed Civilian', 'Werewolf']: return Mailbox().msg( "I'm sorry, <{}>. Being a dog lets you choose a role, but it doesn't mean you can become ANYTHING." .format(user_id), user_channel, True) db_set(user_id, 'uses', uses - 1) answer = Mailbox().msg( "You have chosen to become the **{}**!".format(role), user_channel) answer.log("The **Dog** <@{}> has chosen to become a".format(user_id)) if role == 'Innocent': answer.log_add('n **Innocent**!').dm( "You have chosen to become an **Innocent**. Protect the town, kill all those wolves!", user_id) if role == 'Cursed Civilian': answer.log_add(' **Cursed Civilian**!').dm( "You have chosen to become a **Cursed Civilian**! You will be part of the town... for now.", user_id) if role == 'Werewolf': answer.log_add(' **Werewolf**!').dm( "You have chosen to become a **Werewolf**! You will now join the wolf pack!", user_id) for channel_id in db.get_secret_channels("Werewolf"): answer.edit_cc(channel_id, user_id, 1) if int(db_get(user_id, 'frozen')) == 1: answer.edit_cc(channel_id, user_id, 2) answer.msg( "**ARRROOOO!\nWelcome, <@{0}>, to the wolf pack!** <@{0}>, a **Dog**, has chosen to turn themselves into a Werewolf! Give them a warm welcome." .format(user_id), channel_id) db_set(user_id, 'role', role) return answer
def day(): """Start the second part of the day. The function assumes all polls have been evaluated, and that looking after attacks can begin. The function returns a Mailbox.""" threat = db.get_kill() answer = Mailbox().log("**Results from night attacks:**") if dy.get_stage() == "Day": return Mailbox().respond("Sure, man. Whatever.") while threat != None: answer = roles.attack(threat[1], threat[2], threat[3], answer) threat = db.get_kill() for player in db.player_list(True): # Give potential day uses user_role = db_get(player, 'role') for i in range(len(roles.day_users)): if user_role in roles.day_users[i]: # Give one-time users their one-time power if i == 0: if dy.day_number() == 0: db_set(player, 'uses', 1) break db_set(player, 'uses', i) answer.msg(power.power(user_role), db_get(player, 'channel')) break answer.story(morning.story_time(db.get_deadies())) db.delete_deadies() db.delete_hookers() # Add polls if dy.day_number() != 0: answer.new_poll(dy.voting_booth(), 'lynch', '', story_text('lynch')) if dy.get_mayor() == 0: answer.new_poll(dy.voting_booth(), 'Mayor', '', story_text('Mayor')) elif dy.get_reporter() == 0: answer.new_poll(dy.voting_booth(), 'Reporter', '', story_text('Reporter')) dy.next_day() dy.set_stage('Day') answer.log("```Day {}```".format(dy.day_number())) return answer
def enchant(user_id,victim_id): """This function allows the flute player to enchant targets. The function assumes both players are participants, of which the casting user is a flute player. Make sure to have filtered this out already. The function returns a Mailbox. Keyword arguments: user_id -> the flute player who enchants the player victim_id -> the player who's enchanted""" uses = int(db_get(user_id,'uses')) if uses < 1: return Mailbox().respond("I am sorry! You currently don't have the ability to enchant anyone!",True) user_channel = int(db_get(user_id,'channel')) user_undead = int(db_get(user_id,'undead')) victim_frozen = int(db_get(victim_id,'frozen')) victim_abducted = int(db_get(victim_id,'abducted')) victim_enchanted = int(db_get(victim_id,'enchanted')) if db_get(victim_id,'role') == 'Flute Player': return Mailbox().msg("You cannot enchant a flute player, sorry.",user_channel,True) if victim_abducted == 1: return Mailbox().msg("You wanted to warm up <@{}>... but you weren't able to find them! That is strange...",user_channel,True) if victim_frozen == 1: return Mailbox().msg("You failed to enchant your target, as they were frozen to the bone!.",user_channel,True) if victim_enchanted == 1: return Mailbox().msg("I am terribly sorry, but you cannot enchant a player who already *IS* enchanted!",user_channel,True) answer = Mailbox().msg("You have successfully enchanted <@{}>!".format(victim_id),user_channel) db_set(user_id,'uses',uses - 1) if user_undead == 1: answer.dm("You're an Undead, so you can't actually enchant anyone... but this will help you keep up your cover!",user_id) answer.log("The **Undead** <@{}> has pretended to enchant <@{}>.".format(user_id,victim_id)) else: for channel_id in db.get_secret_channels('Flute_Victims'): answer.edit_cc(channel_id,victim_id,1) answer.msg("<@{}> has been enchanted! Please welcome them to the circle of the enchanted ones.".format(victim_id),channel_id) answer.log("The **Flute Player** <@{}> has enchanted <@{}>.".format(user_id,victim_id)) db_set(victim_id,'enchanted',1) return answer
def seek(user_id,victim_id,role): """This fuction allows the crowd seeker to inspect players. The function assumes the player is a participant and has the correct role, so make sure to have filtered this out already. The function returns a Mailbox. user_id -> the player who casts the spell victim_id -> the player upon whom the spell is cast role -> the role the player will be checked as""" uses = int(db_get(user_id,'uses')) if uses < 1: return Mailbox().respond("I am sorry! You currently don't have the ability to seek anyone!",True) user_channel = int(db_get(user_id,'channel')) user_role = db_get(user_id,'role') user_undead = int(db_get(user_id,'undead')) victim_role = db_get(victim_id,'role') victim_frozen = int(db_get(victim_id,'frozen')) victim_abducted = int(db_get(victim_id,'abducted')) if user_undead == 1: return Mailbox().dm("I am sorry! You are undead, meaning you can no longer seek players!",user_id,True) if victim_abducted == 1: return Mailbox().msg("You appear to be unable to find <@{}> among the crowds! Where could they be?".format(victim_id),user_channel,True) if victim_frozen == 1: return Mailbox().msg("<@{}> was isolated from the crowd, and has gotten too cold to seek. Please try someone else!".format(victim_id),user_channel,True) db_set(user_id,'uses',uses - 1) answer = Mailbox() if role == victim_role: answer.msg("{} - <@{}> has the role of the **{}**!".format(db_get(victim_id,'emoji'),victim_id,role),user_channel) answer.log("The **Crowd Seeker** <@{}> has seen <@{}> as the **{}**!".format(user_id,victim_id,role)) else: answer.msg("{} - <@{}> does **NOT** have the role of the **{}**.".format(db_get(victim_id,'emoji'),victim_id,role),user_channel) answer.log("The **Crowd Seeker** <@{}> guessed incorrectly that <@{}> would be the **{}**.".format(user_id,victim_id,role)) if uses - 1 > 0: answer.msg("You can seek **{}** more time".format(uses-1),user_channel,True) if uses - 1 > 1: answer.msg_add("s") answer.msg_add("!") else: answer.msg("That\'s it for today! You cannot seek any more players.",user_channel,True) return answer
def purify(user_id,victim_id): """This function allows the priestess to purify targets. The function assumes both players are participants, and that the casting user is a priestess. Make sure to have filtered this out beforehand. The function returns a Mailbox.""" uses = int(db_get(user_id,'uses')) if uses < 1: return Mailbox().respond("I am sorry! You currently don't have the ability to purify anyone!",True) user_channel = int(db_get(user_id,'channel')) user_undead = int(db_get(user_id,'undead')) victim_role = db_get(victim_id,'role') victim_frozen = int(db_get(victim_id,'frozen')) victim_abducted = int(db_get(victim_id,'abducted')) if user_undead == 1: return Mailbox().msg("I am sorry! You cannot purify anyone while you're **Undead**!",user_channel,True) if victim_abducted == 1: return Mailbox().msg("You have attempted to purify <@{}>... but your powers cannot locate them! Strange...".format(victim_id),user_channel,True) if victim_frozen == 1: return Mailbox().msg("You wanted to purify <@{}>, but you were unable to reach them through the thick layer of ice surrounding them".format(victim_id),user_channel,True) answer = Mailbox() db_set(user_id,'uses',uses - 1) if victim_role in ['Cursed Civilian','Sacred Wolf']: answer.msg("Your powers' results were **positive**. They are no longer cursed civilians or sacred wolves!",user_channel) answer.log("The **Priestess** <@{}> has purified the **{}** <@{}>.".format(user_id,victim_role,victim_id)) if victim_role == 'Cursed Civilian': db_set(victim_id,'role','Innocent') answer.dm(rolestory.to_innocent(victim_id,'Cursed Civilian'),victim_id) if victim_role == 'Sacred Wolf': db_set(victim_id,'role','Werewolf') answer.dm("This message yet needs to be written!",victim_id) # TODO elif victim_role in ['Innocent','Werewolf']: answer.msg("Your powers' results were **neutral**. They were already innocent or a werewolf!",user_channel) answer.log("The **Priestess** <@{}> has attempted to purify the **{}** <@{}>.".format(user_id,victim_role,victim_id)) else: answer.msg("Your powers' results were **negative**. They weren't cursed civilians or sacred wolves, so they couldn't be purified!",user_channel) answer.log("The **Priestess** <@{}> has ineffectively attempted to purify the **{}** <@{}>.".format(user_id,victim_role,victim_id)) return answer
def pay(): """This function takes care of all properties that need to happen in the first wave of the end of the night. The function returns a Mailbox.""" if dy.get_stage() == "Day": return [ Mailbox().respond( "Whaddaya mean, `{}pay`? It already **is** day, bud.".format( config.universal_prefix)) ] answer = Mailbox() answer_table = [Mailbox(True)] for user_id in db.player_list(): user_role = db_get(user_id, 'role') # Remove potential night uses for i in range(len(roles.night_users)): if user_role in roles.night_users[i]: if i > 0: db_set(user_id, 'uses', 0) break # Force Cupid to fall in love if user_role == "Cupid" and db_get(user_id, 'uses') > 0: chosen = False attempts = 0 while not chosen and attempts < 1000: forced_victim = random.choice(db.player_list(True, True)) chosen = cupid_kiss(user_id, forced_victim, False) answer_table.append(chosen) # Force Dog to become Innocent if user_role == "Dog" and db_get(user_id, 'uses') > 0: db_set(user_id, 'role', "Innocent") answer.msg( "You haven't chosen a role! That's why you have now become and **Innocent**!", db_get(user_id, 'channel')) answer.log( "The **Dog** <@{}> didn't choose a role last night and turned into an **Innocent**!" .format(user_id)) # Remove hooker effects db_set(user_id, 'sleepingover', 0) for standoff in db.get_standoff(user_id): if standoff[2] == 'Hooker': db.delete_standoff(standoff[0]) # Force Look-Alike to become Innocent if user_role == "Look-Alike": db_set(user_id, 'role', "Innocent") answer.msg( "You haven't chosen a role! That's why you have now become an **Innocent**!", db_get(user_id, 'channel')) answer.log( "The **Dog** <@{}> didn't choose a role last night and turned into an **Innocent**!" .format(user_id)) # Remove tanner disguises db_set(user_id, 'fakerole', user_role) # Remove zombie tag db_set(user_id, 'bitten', 0) answer_table.append(answer) return answer_table