diff --git a/cogs/GamesCog.py b/cogs/GamesCog.py index a8b8dab..6d44d6d 100644 --- a/cogs/GamesCog.py +++ b/cogs/GamesCog.py @@ -100,5 +100,10 @@ class GamesCog(commands.Cog): async def hexCommand(self, ctx, *, content = ""): await self.client.gameLoops.runHex(ctx.message.channel,content,"#"+str(ctx.message.author.id)) + # Runs a game of Love Letter + @commands.command(aliases = ["ll"]) + async def loveletter(self, ctx, *, content = ""): + await self.client.gameLoops.runLoveletter(ctx.message.channel,content,"#"+str(ctx.message.author.id),ctx.message.author) + def setup(client): client.add_cog(GamesCog(client)) \ No newline at end of file diff --git a/funcs/games/gameLoops.py b/funcs/games/gameLoops.py index b5584e1..f02478e 100644 --- a/funcs/games/gameLoops.py +++ b/funcs/games/gameLoops.py @@ -176,6 +176,7 @@ class GameLoops(): logThis("Error parsing command (error code 1510)") await channel.send(response) + logThis(response,str(channel.id)) if showImage: if deleteImage: @@ -203,11 +204,47 @@ class GameLoops(): f.write(str(oldImage.id)) if gameDone: - game = self.bot.database["hexGames"].find_one({"_id":str(channel.id)}) - print(game) + game = self.bot.database["hex games"].find_one({"_id":str(channel.id)}) + winner = game["winner"] if winner != 0 and game["players"][0] != game["players"][1]: # player1 != player2 winnings = game["difficulty"]*10 self.bot.money.addMoney(game["players"][winner-1].lower(),winnings) self.bot.funcs.deleteGame("hex games",str(channel.id)) + + + # Runs Love letter + async def runLoveletter(self,channel,command,user,userchannel): + try: + response, showImage, deleteImage = self.bot.loveletter.parseLove(command,str(channel.id),user,userchannel) + except: + logThis("Error parsing command (error code 1810)") + + await channel.send(response) + logThis(response,str(channel.id)) + if showImage: + if deleteImage: + await self.deleteMessage("loveletter"+str(channel.id),channel) + oldImage = await channel.send(file = discord.File("resources/games/loveletterBoards/loveletterBoard"+str(channel.id)+".png")) + + if len(remainingLetters) > 15: + otherMessage = await channel.send("_ _") + reactionMessages = {oldImage : remainingLetters[:15],otherMessage : remainingLetters[15:]} + else: + otherMessage = "" + reactionMessages = {oldImage : remainingLetters} + + oldMessages = str(oldImage.id) + if otherMessage != "": + oldMessages += "\n"+str(otherMessage.id) + with open("resources/games/oldImages/hangman"+str(channel.id), "w") as f: + f.write(oldMessages) + + try: + for message, letters in reactionMessages.items(): + for letter in letters: + emoji = chr(ord(letter)+127397) + await message.add_reaction(emoji) + except: + logThis("Image deleted before adding all reactions") \ No newline at end of file diff --git a/funcs/games/hex.py b/funcs/games/hex.py index 74a76d1..4fc819c 100644 --- a/funcs/games/hex.py +++ b/funcs/games/hex.py @@ -22,7 +22,6 @@ class HexGame(): def parseHex(self, command, channel, user): commands = command.lower().split() game = self.bot.database["hex games"].find_one({"_id":channel}) - if command == "" or command == " ": return "I didn't get that. Use \"!hex start [opponent]\" to start a game.", False, False, False, False @@ -231,8 +230,9 @@ class HexGame(): logThis("Undoing {}'s last move".format(self.bot.funcs.getName(user))) lastMove = game["gameHistory"].pop() + game["board"][lastMove[0]][lastMove[1]] = 0 self.bot.database["hex games"].update_one({"_id":channel}, - {"$set":{"board."+lastMove[0]+"."+lastMove[1]:0}}) + {"$set":{"board":game["board"]}}) self.bot.database["hex games"].update_one({"_id":channel}, {"$set":{"turn":turn%2 + 1}}) diff --git a/funcs/games/loveletter.py b/funcs/games/loveletter.py new file mode 100644 index 0000000..b42a88e --- /dev/null +++ b/funcs/games/loveletter.py @@ -0,0 +1,81 @@ +import random + +from funcs import logThis +from .loveletterDraw import DrawLove + +class LoveLetter(): + def __init__(self,bot): + self.bot = bot + self.draw = DrawLove(bot) + + # Parses command + def parseLove(self, command, channel, user, userchannel): + commands = command.lower().split() + game = self.bot.database["loveletter games"].find_one({"_id":channel}) + + if command == "" or command == " ": + logThis(str(user)+" created a Love Letter game with loveStart(). ") + return self.loveStart(channel) + + # If using a command with no game, return error + elif game == None: + return "There's no game in this channel", False, False + + # Joining the game + elif commands[0] == "join": + if game["round"] == 0: + if user not in game["player hands"]: + # Deal cards + card = game["deck"].pop() + username = self.bot.funcs.getName(user) + game["player hands"][username] = card + game["discard piles"][username] = [] + game["user channel"][username] = userchannel # Used for direct (private) messages to the users + self.bot.database["loveletter games"].replace_one({"_id":channel},game) + return username+" joined the game! Type \"!loveletter begin\" once all players have joined.", False, False + else: + return "You're already playing!", False, False + else: + return "It's too late to join", False, False + + # Beginning the game + elif commands[0] == "begin": + if user in game["player hands"]: + if len(game["player hands"]) > 1: + pass + else: + return "AI functionality hasn't been implemented yet. Get another player to join!", False, False + else: + return "You can't begin a game, when you're not a player!", False, False + + # Stopping the game + elif commands[0] == "stop": + if user in game["player hands"]: + return "Ending game.", False, False + else: + return "You can't end a game where you're not a player.", False, False + + else: + return "I didn't get that. Use \"!loveletter\" to start a game or \"!loveletter join\" to join a game. ", False, False + + # Starts the game + def loveStart(self, channel): + game = self.bot.database["loveletter games"].find_one({"_id":channel}) + + if game == None: + + + deck = [1,1,1,1,1, 2,2, 3,3, 4,4, 5,5, 6, 7, 8] + random.shuffle(deck) + cardAside = deck[0] + del deck[0] # The card that is set aside + + newGame = {"_id":channel,"player hands": {},"discard piles":{},"deck":deck,"round":0,"cardAside":cardAside} + + self.bot.database["loveletter games"].insert_one(newGame) + + return "" + else: + logThis("There's already a Love Letter game going on in this channel",str(channel)) + return "There's already a Love Letter game going on in this channel" + diff --git a/funcs/games/loveletterDraw.py b/funcs/games/loveletterDraw.py new file mode 100644 index 0000000..51f4145 --- /dev/null +++ b/funcs/games/loveletterDraw.py @@ -0,0 +1,15 @@ +import math + +from PIL import Image, ImageDraw, ImageFont +from funcs import logThis + + + + + +class DrawLove(): + def __init__(self,bot): + self.bot = bot + + def drawBoard(self, channel): + logThis("Drawing empty Hex board") diff --git a/resources/errorCodes.txt b/resources/errorCodes.txt index cbfec1c..bd33632 100644 --- a/resources/errorCodes.txt +++ b/resources/errorCodes.txt @@ -137,3 +137,7 @@ 1714 - Error in drawMisses() 1720 - Unspecified hangmanGuess() error 1730 - Unspecified hangmanStart() error + +18 - Love Letter +1800 - Unspecified error +1801 - Error parsing command