today's changes

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

@ -39,8 +39,8 @@ class Game:
self.players = []
self.day_vote = {} # author, target
self.vote_totals = {} # id, total_votes
self.day_vote = {} # author: target
self.vote_totals = {} # id: total_votes
self.started = False
self.game_over = False
@ -157,6 +157,8 @@ class Game:
for result in self.night_results:
embed.add_field(name=result, value="________", inline=False)
self.night_results = [] # Clear for next day
await self.village_channel.send(embed=embed)
await self.generate_targets(self.village_channel)
@ -243,6 +245,9 @@ class Game:
return
self.can_vote = False
self.day_vote = {}
self.vote_totals = {}
await self.night_perms(self.village_channel)
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)
"""
player = self._get_player(author)
player = await self.get_player_by_member(author)
if player is None:
await channel.send("You're not in this game!")
@ -362,17 +367,16 @@ class Game:
await channel.send("Corpses can't vote")
return
channel_list = []
if channel == self.village_channel:
if not self.can_vote:
await channel.send("Voting is not allowed right now")
return
elif channel.name in self.p_channels:
pass
else:
channel_list = [c["channel"] for c in self.p_channels.values()]
if channel not in channel_list:
# Not part of the game
return # Don't say anything
await channel.send("Cannot vote in this channel")
return
try:
target = self.players[id]
@ -386,19 +390,36 @@ class Game:
# Now handle village vote or send to votegroup
if channel == self.village_channel:
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):
if author in self.day_vote:
self.vote_totals[self.day_vote[author]] -= 1
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
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 self.vote_totals[id] <
async def eval_results(self, target, source=None, method = None):
return "{} was found dead".format(target.member.display_name)
if sum
await self.village_channel.send("{} has voted to put {} to trial. {} more votes needed".format(
async def kill(self, target, source=None, method: str=None):
"""
Attempt to kill a target
@ -410,6 +431,7 @@ class Game:
target.alive = False
await self._at_kill(target)
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)
else:
target.protected = False

@ -46,7 +46,7 @@ class Role:
game_start_message= (
"Your role is **Default**\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):
@ -123,3 +123,7 @@ class Role:
async def _at_night_end(self, data=None):
pass
async def vote(self, target, id):
"""Handle night actions"""
pass

@ -15,7 +15,7 @@ class VanillaWerewolf(Role):
game_start_message = (
"Your role is **Werewolf**\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>`"
)
@ -93,3 +93,7 @@ class VanillaWerewolf(Role):
# async def _at_night_end(self, data=None):
# 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=(
"Your role is **Villager**\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):

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

@ -15,7 +15,7 @@ class WolfVote(VoteGroup):
channel_id = "werewolves"
kill_messages = [
"**{ID}** - {target} was attacked by wolves",
"**{ID}** - {target} was mauled by wolves",
"**{ID}** - {target} was found torn to shreds"]
def __init__(self, game, channel):
@ -70,7 +70,7 @@ class WolfVote(VoteGroup):
return
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)
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:
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):
# """
# Receive vote from game
# """
async def vote(self, target, author, id):
"""
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))

@ -86,17 +86,38 @@ class Werewolf:
await game.setup(ctx)
@ww.command()
async def vote(self, ctx, id):
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()
async def vote(self, ctx, id: int):
"""
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)
if not game:
await ctx.send("No game running, cannot vote")
# Game handles response now
channel = ctx.channel
if channel is game.village_channel:
if channel == game.village_channel:
await game.vote(ctx.author, id, channel)
elif channel in (c["channel"] for c in game.p_channels.values()):
await game.vote(ctx.author, id, channel)

Loading…
Cancel
Save