Maybe dispatch? WIP
This commit is contained in:
parent
7e1a6e108e
commit
fe1f11b2eb
@ -5,6 +5,7 @@ from typing import List, Any, Dict, Set, Union
|
||||
|
||||
import discord
|
||||
from redbot.core import commands
|
||||
from redbot.core.bot import Red
|
||||
|
||||
from .builder import parse_code
|
||||
from .player import Player
|
||||
@ -34,10 +35,15 @@ class Game:
|
||||
"**Morning has arrived on day {}..**",
|
||||
]
|
||||
|
||||
night_messages = [
|
||||
"**Dawn falls on day {}..****"
|
||||
]
|
||||
|
||||
day_vote_count = 3
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
bot: Red,
|
||||
guild: discord.Guild,
|
||||
role: discord.Role = None,
|
||||
category: discord.CategoryChannel = None,
|
||||
@ -45,6 +51,7 @@ class Game:
|
||||
log_channel: discord.TextChannel = None,
|
||||
game_code=None,
|
||||
):
|
||||
self.bot = bot
|
||||
self.guild = guild
|
||||
self.game_code = game_code
|
||||
|
||||
@ -340,6 +347,9 @@ class Game:
|
||||
await self.village_channel.send(
|
||||
"**{} will be put to trial and has 30 seconds to defend themselves**".format(
|
||||
target.mention
|
||||
),
|
||||
allowed_mentions=discord.AllowedMentions(
|
||||
everyone=False, users=[target]
|
||||
)
|
||||
)
|
||||
|
||||
@ -347,11 +357,14 @@ class Game:
|
||||
|
||||
await self.speech_perms(self.village_channel, target.member, undo=True) # No one can talk
|
||||
|
||||
message = await self.village_channel.send(
|
||||
message: discord.Message = await self.village_channel.send(
|
||||
"Everyone will now vote whether to lynch {}\n"
|
||||
"👍 to save, 👎 to lynch\n"
|
||||
"*Majority rules, no-lynch on ties, "
|
||||
"vote both or neither to abstain, 15 seconds to vote*".format(target.mention)
|
||||
"vote both or neither to abstain, 15 seconds to vote*".format(target.mention),
|
||||
allowed_mentions=discord.AllowedMentions(
|
||||
everyone=False, users=[target]
|
||||
)
|
||||
)
|
||||
|
||||
await message.add_reaction("👍")
|
||||
@ -442,7 +455,7 @@ class Game:
|
||||
await self.village_channel.send(
|
||||
embed=discord.Embed(title="**Thirty seconds until sunrise...**")
|
||||
)
|
||||
await asyncio.sleep(3) # .5 minutes FixMe to 3 Later
|
||||
await asyncio.sleep(3) # .5 minutes FixMe to 30 Later
|
||||
|
||||
await self._at_night_end()
|
||||
|
||||
@ -462,19 +475,20 @@ class Game:
|
||||
|
||||
async def _notify(self, event, data=None):
|
||||
for i in range(1, 7): # action guide 1-6 (0 is no action)
|
||||
tasks = []
|
||||
# Role priorities
|
||||
role_order = [role for role in self.roles if role.action_list[event][1] == i]
|
||||
for role in role_order:
|
||||
tasks.append(asyncio.ensure_future(role.on_event(event, data), loop=self.loop))
|
||||
# VoteGroup priorities
|
||||
vote_order = [vg for vg in self.vote_groups.values() if vg.action_list[event][1] == i]
|
||||
for vote_group in vote_order:
|
||||
tasks.append(
|
||||
asyncio.ensure_future(vote_group.on_event(event, data), loop=self.loop)
|
||||
)
|
||||
if tasks:
|
||||
await asyncio.gather(*tasks)
|
||||
self.bot.dispatch(f"red.fox.werewolf.{event}", data=data, priority=i)
|
||||
# tasks = []
|
||||
# # Role priorities
|
||||
# role_order = [role for role in self.roles if role.action_list[event][1] == i]
|
||||
# for role in role_order:
|
||||
# tasks.append(asyncio.ensure_future(role.on_event(event, data), loop=self.loop))
|
||||
# # VoteGroup priorities
|
||||
# vote_order = [vg for vg in self.vote_groups.values() if vg.action_list[event][1] == i]
|
||||
# for vote_group in vote_order:
|
||||
# tasks.append(
|
||||
# asyncio.ensure_future(vote_group.on_event(event, data), loop=self.loop)
|
||||
# )
|
||||
# if tasks:
|
||||
# await asyncio.gather(*tasks)
|
||||
# Run same-priority task simultaneously
|
||||
|
||||
############END Notify structure############
|
||||
|
@ -38,7 +38,7 @@ class Role:
|
||||
3. Protection / Preempt actions (bodyguard/framer)
|
||||
4. Non-disruptive actions (seer/silencer)
|
||||
5. Disruptive actions (Killing)
|
||||
6. Role altering actions (Cult / Mason)
|
||||
6. Role altering actions (Cult / Mason / Shifter)
|
||||
"""
|
||||
|
||||
rand_choice = False # Determines if it can be picked as a random role (False for unusually disruptive roles)
|
||||
|
@ -14,8 +14,10 @@ class Seer(Role):
|
||||
"Lynch players during the day with `[p]ww vote <ID>`\n"
|
||||
"Check for werewolves at night with `[p]ww choose <ID>`"
|
||||
)
|
||||
description = "A mystic in search of answers in a chaotic town.\n" \
|
||||
"Calls upon the cosmos to discern those of Lycan blood"
|
||||
description = (
|
||||
"A mystic in search of answers in a chaotic town.\n"
|
||||
"Calls upon the cosmos to discern those of Lycan blood"
|
||||
)
|
||||
|
||||
def __init__(self, game):
|
||||
super().__init__(game)
|
||||
@ -33,7 +35,7 @@ class Seer(Role):
|
||||
(self._at_day_end, 0),
|
||||
(self._at_night_start, 2),
|
||||
(self._at_night_end, 4),
|
||||
(self._at_visit, 0)
|
||||
(self._at_visit, 0),
|
||||
]
|
||||
|
||||
async def see_alignment(self, source=None):
|
||||
@ -87,4 +89,8 @@ class Seer(Role):
|
||||
await super().choose(ctx, data)
|
||||
|
||||
self.see_target, target = await pick_target(self, ctx, data)
|
||||
await ctx.send("**You will attempt to see the role of {} tonight...**".format(target.member.display_name))
|
||||
await ctx.send(
|
||||
"**You will attempt to see the role of {} tonight...**".format(
|
||||
target.member.display_name
|
||||
)
|
||||
)
|
||||
|
@ -37,7 +37,7 @@ class Shifter(Role):
|
||||
3. Protection / Preempt actions (bodyguard/framer)
|
||||
4. Non-disruptive actions (seer/silencer)
|
||||
5. Disruptive actions (Killing)
|
||||
6. Role altering actions (Cult / Mason)
|
||||
6. Role altering actions (Cult / Mason / Shifter)
|
||||
"""
|
||||
|
||||
rand_choice = False # Determines if it can be picked as a random role (False for unusually disruptive roles)
|
||||
|
@ -13,7 +13,8 @@ class WolfVote(VoteGroup):
|
||||
|
||||
kill_messages = [
|
||||
"**{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):
|
||||
super().__init__(game, channel)
|
||||
@ -34,7 +35,7 @@ class WolfVote(VoteGroup):
|
||||
(self._at_day_end, 0),
|
||||
(self._at_night_start, 2),
|
||||
(self._at_night_end, 5), # Kill priority
|
||||
(self._at_visit, 0)
|
||||
(self._at_visit, 0),
|
||||
]
|
||||
|
||||
# async def on_event(self, event, data):
|
||||
@ -75,7 +76,9 @@ class WolfVote(VoteGroup):
|
||||
await self.channel.send(mention_list)
|
||||
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)
|
||||
)
|
||||
|
||||
async def _at_night_end(self, data=None):
|
||||
if self.channel is None:
|
||||
@ -90,7 +93,9 @@ class WolfVote(VoteGroup):
|
||||
print("Target id: {}\nKiller: {}".format(target_id, self.killer.member.display_name))
|
||||
if target_id is not None and self.killer:
|
||||
await self.game.kill(target_id, self.killer, random.choice(self.kill_messages))
|
||||
await self.channel.send("**{} has left to complete the kill...**".format(self.killer.member.display_name))
|
||||
await self.channel.send(
|
||||
"**{} has left to complete the kill...**".format(self.killer.member.display_name)
|
||||
)
|
||||
else:
|
||||
await self.channel.send("**No kill will be attempted tonight...**")
|
||||
|
||||
@ -117,4 +122,6 @@ class WolfVote(VoteGroup):
|
||||
|
||||
self.vote_results[author.id] = target_id
|
||||
|
||||
await self.channel.send("{} has voted to kill {}".format(author.mention, target.member.display_name))
|
||||
await self.channel.send(
|
||||
"{} has voted to kill {}".format(author.mention, target.member.display_name)
|
||||
)
|
||||
|
@ -97,7 +97,7 @@ class Werewolf(Cog):
|
||||
@wwset.command(name="role")
|
||||
async def wwset_role(self, ctx: commands.Context, role: discord.Role = None):
|
||||
"""
|
||||
Assign the game role
|
||||
Set the game role
|
||||
This role should not be manually assigned
|
||||
"""
|
||||
if role is None:
|
||||
@ -222,7 +222,7 @@ class Werewolf(Cog):
|
||||
await ctx.send("No game running, cannot start")
|
||||
|
||||
if not await game.setup(ctx):
|
||||
pass # Do something?
|
||||
pass # ToDo something?
|
||||
|
||||
@commands.guild_only()
|
||||
@ww.command(name="stop")
|
||||
@ -230,10 +230,10 @@ class Werewolf(Cog):
|
||||
"""
|
||||
Stops the current game
|
||||
"""
|
||||
if ctx.guild is None:
|
||||
# Private message, can't get guild
|
||||
await ctx.send("Cannot start game from PM!")
|
||||
return
|
||||
# if ctx.guild is None:
|
||||
# # Private message, can't get guild
|
||||
# await ctx.send("Cannot stop game from PM!")
|
||||
# return
|
||||
if ctx.guild.id not in self.games or self.games[ctx.guild.id].game_over:
|
||||
await ctx.send("No game to stop")
|
||||
return
|
||||
@ -354,11 +354,11 @@ class Werewolf(Cog):
|
||||
await ctx.send("Role ID not found")
|
||||
|
||||
async def _get_game(self, ctx: commands.Context, game_code=None):
|
||||
guild: discord.Guild = ctx.guild
|
||||
guild: discord.Guild = getattr(ctx, "guild", None)
|
||||
|
||||
if guild is None:
|
||||
# Private message, can't get guild
|
||||
await ctx.send("Cannot start game from PM!")
|
||||
await ctx.send("Cannot start game from DM!")
|
||||
return None
|
||||
if guild.id not in self.games or self.games[guild.id].game_over:
|
||||
await ctx.send("Starting a new game...")
|
||||
@ -368,7 +368,7 @@ class Werewolf(Cog):
|
||||
await ctx.send("Cannot start a new game")
|
||||
return None
|
||||
|
||||
self.games[guild.id] = Game(guild, role, category, channel, log_channel, game_code)
|
||||
self.games[guild.id] = Game(self.bot, guild, role, category, channel, log_channel, game_code)
|
||||
|
||||
return self.games[guild.id]
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user