today's changes

fight-fixes
bobloy 7 years ago
parent 2b4477bffa
commit cb9822f91c

@ -39,8 +39,8 @@ class Game:
self.players = [] self.players = []
self.day_vote = {} # author, target self.day_vote = {} # author: target
self.vote_totals = {} # id, total_votes self.vote_totals = {} # id: total_votes
self.started = False self.started = False
self.game_over = False self.game_over = False
@ -156,6 +156,8 @@ class Game:
embed=discord.Embed(title=random.choice(self.morning_messages)) embed=discord.Embed(title=random.choice(self.morning_messages))
for result in self.night_results: for result in self.night_results:
embed.add_field(name=result, value="________", inline=False) embed.add_field(name=result, value="________", inline=False)
self.night_results = [] # Clear for next day
await self.village_channel.send(embed=embed) await self.village_channel.send(embed=embed)
await self.generate_targets(self.village_channel) await self.generate_targets(self.village_channel)
@ -243,6 +245,9 @@ class Game:
return return
self.can_vote = False self.can_vote = False
self.day_vote = {}
self.vote_totals = {}
await self.night_perms(self.village_channel) await self.night_perms(self.village_channel)
await self.village_channel.send(embed=discord.Embed(title="**The sun sets on the village...**")) await self.village_channel.send(embed=discord.Embed(title="**The sun sets on the village...**"))
@ -352,7 +357,7 @@ class Game:
""" """
Member attempts to cast a vote (usually to lynch) Member attempts to cast a vote (usually to lynch)
""" """
player = self._get_player(author) player = await self.get_player_by_member(author)
if player is None: if player is None:
await channel.send("You're not in this game!") await channel.send("You're not in this game!")
@ -362,18 +367,17 @@ class Game:
await channel.send("Corpses can't vote") await channel.send("Corpses can't vote")
return return
channel_list = []
if channel == self.village_channel: if channel == self.village_channel:
if not self.can_vote: if not self.can_vote:
await channel.send("Voting is not allowed right now") await channel.send("Voting is not allowed right now")
return return
else: elif channel.name in self.p_channels:
channel_list = [c["channel"] for c in self.p_channels.values()] pass
else:
if channel not in channel_list:
# Not part of the game # Not part of the game
return # Don't say anything await channel.send("Cannot vote in this channel")
return
try: try:
target = self.players[id] target = self.players[id]
except IndexError: except IndexError:
@ -386,19 +390,36 @@ class Game:
# Now handle village vote or send to votegroup # Now handle village vote or send to votegroup
if channel == self.village_channel: if channel == self.village_channel:
await self._village_vote(target, author, id) await self._village_vote(target, author, id)
elif channel in self.p_channels: elif self.p_channels[channel.name]["votegroup"] is not None:
await self.vote_groups[channel.name].vote(target, author, id)
else: # Private channel voting, send to role
await self.player.role.vote(target, id)
async def _village_vote(self, target, author, id): async def _village_vote(self, target, author, id):
if author in self.day_vote: if author in self.day_vote:
self.vote_totals[self.day_vote[author]] -= 1 self.vote_totals[self.day_vote[author]] -= 1
self.day_vote[author] = id self.day_vote[author] = id
self.vote_totals[id] += 1 if id not in self.vote_totals:
self.vote_totals[id] = 1
else:
self.vote_totals[id] += 1
if self.vote_totals[id] < required_votes = len([player for player in self.players if player.alive]) // 7 + 2
if self.vote_totals[id] < required_votes:
await self.village_channel.send("{} has voted to put {} to trial. {} more votes needed".format(author.mention, target.member.mention, required_votes - self.vote_totals[id]))
else:
self.vote_totals[id] = 0
self.day_vote = {k:v for k,v in self.day_vote.items() if v != id} # Remove votes for this id
await self._at_voted(target)
if sum
await self.village_channel.send("{} has voted to put {} to trial. {} more votes needed".format( async def eval_results(self, target, source=None, method = None):
return "{} was found dead".format(target.member.display_name)
async def kill(self, target, source=None, method: str=None): async def kill(self, target, source=None, method: str=None):
""" """
Attempt to kill a target Attempt to kill a target
@ -410,6 +431,7 @@ class Game:
target.alive = False target.alive = False
await self._at_kill(target) await self._at_kill(target)
if not target.alive: # Still dead after notifying if not target.alive: # Still dead after notifying
self.night_results.append(await self.eval_results(target, source, method))
await self.dead_perms(target.member) await self.dead_perms(target.member)
else: else:
target.protected = False target.protected = False

@ -46,7 +46,7 @@ class Role:
game_start_message= ( game_start_message= (
"Your role is **Default**\n" "Your role is **Default**\n"
"You win by testing the game\n" "You win by testing the game\n"
"Lynch players during the day with `[p]ww lynch <ID>`" "Lynch players during the day with `[p]ww vote <ID>`"
) )
def __init__(self, game): def __init__(self, game):
@ -123,3 +123,7 @@ class Role:
async def _at_night_end(self, data=None): async def _at_night_end(self, data=None):
pass pass
async def vote(self, target, id):
"""Handle night actions"""
pass

@ -15,7 +15,7 @@ class VanillaWerewolf(Role):
game_start_message = ( game_start_message = (
"Your role is **Werewolf**\n" "Your role is **Werewolf**\n"
"You win by killing everyone else in the village\n" "You win by killing everyone else in the village\n"
"Lynch players during the day with `[p]ww lynch <ID>`\n" "Lynch players during the day with `[p]ww vote <ID>`\n"
"Vote to kill players at night with `[p]ww vote <ID>`" "Vote to kill players at night with `[p]ww vote <ID>`"
) )
@ -93,3 +93,7 @@ class VanillaWerewolf(Role):
# async def _at_night_end(self, data=None): # async def _at_night_end(self, data=None):
# super()._at_night_end(data) # super()._at_night_end(data)
async def vote(self, target, id):
"""Handle night actions"""
await self.player.member.send("Use this command in your wolf channel at night")

@ -12,7 +12,7 @@ class Villager(Role):
game_start_message=( game_start_message=(
"Your role is **Villager**\n" "Your role is **Villager**\n"
"You win by lynching all evil in the town\n" "You win by lynching all evil in the town\n"
"Lynch players during the day with `[p]ww lynch <ID>`\n" "Lynch players during the day with `[p]ww vote <ID>`\n"
) )
def __init__(self, game): def __init__(self, game):

@ -92,7 +92,7 @@ class VoteGroup:
if player.id in self.players: if player.id in self.players:
self.players.remove(player) self.players.remove(player)
async def vote(self, author, id): async def vote(self, target, author, id):
""" """
Receive vote from game Receive vote from game
""" """

@ -15,7 +15,7 @@ class WolfVote(VoteGroup):
channel_id = "werewolves" channel_id = "werewolves"
kill_messages = [ kill_messages = [
"**{ID}** - {target} was attacked by wolves", "**{ID}** - {target} was mauled by wolves",
"**{ID}** - {target} was found torn to shreds"] "**{ID}** - {target} was found torn to shreds"]
def __init__(self, game, channel): def __init__(self, game, channel):
@ -70,7 +70,7 @@ class WolfVote(VoteGroup):
return return
await self.game.generate_targets(self.channel) await self.game.generate_targets(self.channel)
await self.channel.send(" ".join(player.mention for player in self.players))
self.killer = random.choice(self.players) self.killer = random.choice(self.players)
await self.channel.send("{} has been selected as tonight's killer".format(self.killer.member.display_name)) await self.channel.send("{} has been selected as tonight's killer".format(self.killer.member.display_name))
@ -87,10 +87,14 @@ class WolfVote(VoteGroup):
if target and self.killer: if target and self.killer:
await self.game.kill(target, self.killer, random.choice(self.kill_messages)) await self.game.kill(target, self.killer, random.choice(self.kill_messages))
else:
await self.channel.send("**No kill will be attempted tonight...**")
# async def vote(self, author, id): async def vote(self, target, author, id):
# """ """
# Receive vote from game Receive vote from game
# """ """
self.vote_results[author.id] = id
# self.vote_results[author.id] = id await self.channel.send("{} has voted to kill {}".format(author.mention, target.member.display_name))

@ -84,19 +84,40 @@ class Werewolf:
await ctx.send("No game running, cannot start") await ctx.send("No game running, cannot start")
await game.setup(ctx) await game.setup(ctx)
@ww.command()
async def stop(self, ctx):
"""
Stops the current game
"""
game = self._get_game(ctx.guild)
if not game:
await ctx.send("No game running, cannot stop")
game.game_over = True
@ww.command() @ww.command()
async def vote(self, ctx, id): async def vote(self, ctx, id: int):
""" """
Vote for a player by ID Vote for a player by ID
""" """
try:
id = int(id)
except:
id = None
if id is None:
await ctx.send("`id` must be an integer")
return
game = self._get_game(ctx.guild) game = self._get_game(ctx.guild)
if not game: if not game:
await ctx.send("No game running, cannot vote") await ctx.send("No game running, cannot vote")
# Game handles response now # Game handles response now
channel = ctx.channel channel = ctx.channel
if channel is game.village_channel: if channel == game.village_channel:
await game.vote(ctx.author, id, channel) await game.vote(ctx.author, id, channel)
elif channel in (c["channel"] for c in game.p_channels.values()): elif channel in (c["channel"] for c in game.p_channels.values()):
await game.vote(ctx.author, id, channel) await game.vote(ctx.author, id, channel)

Loading…
Cancel
Save