From 646749acb178f24ad16b771f9cc934ebf6a72c71 Mon Sep 17 00:00:00 2001 From: jona605a Date: Fri, 28 Aug 2020 23:11:19 +0200 Subject: [PATCH] :love_letter: Started on Love letter --- cogs/GamesCog.py | 5 ++ funcs/games/gameLoops.py | 41 ++++++++++++++- funcs/games/loveletter.py | 96 +++++++++++++++++++++++++++++++++++ funcs/games/loveletterDraw.py | 15 ++++++ resources/errorCodes.txt | 4 ++ 5 files changed, 159 insertions(+), 2 deletions(-) create mode 100644 funcs/games/loveletter.py create mode 100644 funcs/games/loveletterDraw.py diff --git a/cogs/GamesCog.py b/cogs/GamesCog.py index a8b8dab..86ecdff 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)) + 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 4a558bf..08066eb 100644 --- a/funcs/games/gameLoops.py +++ b/funcs/games/gameLoops.py @@ -203,11 +203,48 @@ 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): + try: + response, showImage, deleteImage = self.bot.hex.parseLove(command,str(channel.id),user) + 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/loveletter.py b/funcs/games/loveletter.py new file mode 100644 index 0000000..6281fc0 --- /dev/null +++ b/funcs/games/loveletter.py @@ -0,0 +1,96 @@ +import random + +from funcs import logThis +from .loveletterDraw import DrawLove + +class HexGame(): + def __init__(self,bot): + self.bot = bot + self.draw = DrawHex(bot) + + # Parses command + def parseLove(self, command, channel, user): + commands = command.lower().split() + game = self.bot.database["loveletter games"].find_one({"_id":channel}) + + if command == "" or command == " ": + logThis(str(user)+"started a Love Letter game with loveStart(). "+) + return self.loveStart(channel,user,commands[1]) # commands[1] is the opponent + + elif commands[0] == "start": + # Starting a game + if len(commands) == 1: # if the commands is "!hex start", the opponent is Gwendolyn at difficulty 2 + commands.append("2") + logThis("Starting a hex game with hexStart(). "+str(user)+" challenged "+commands[1]) + return self.hexStart(channel,user,commands[1]) # commands[1] is the opponent + + # If using a command with no game, return error + elif game == None: + return "There's no game in this channel", False, False, False, False + + # Stopping the game + elif commands[0] == "stop": + if user in game["players"]: + return "Ending game.", False, False, True, False + else: + return "You can't end a game where you're not a player.", False, False, False, False + + # Placing a piece + elif commands[0] == "place": + try: + return self.placeHex(channel,commands[1], user) + except: + return "I didn't get that. To place a piece use \"!hex place [position]\". A valid position is e.g. \"E2\".", False, False, False, False + + # Undo + elif commands[0] == "undo": + return self.undoHex(channel, user) + + # Surrender + elif commands[0] == "surrender": + players = game["players"] + if user in players: + opponent = (players.index(user) + 1) % 2 + self.bot.database["hex games"].update_one({"_id":channel},{"$set":{"winner":opponent + 1}}) + return "{} surrendered. That means {} won! Adding 30 Gwendobucks to their account.".format(self.bot.funcs.getName(user),self.bot.funcs.getName(players[opponent])), False, False, True, False + else: + return "You can't surrender when you're not a player.", False, False, False, False + + # Swap + elif commands[0] == "swap": + if len(game["gameHistory"]) == 1: # Only after the first move + self.bot.database["hex games"].update_one({"_id":channel}, + {"$set":{"players":game["players"][::-1]}}) # Swaps their player-number + + # Swaps the color of the hexes on the board drawing: + self.draw.drawSwap(channel) + player2 = game["players"][1] + gwendoTurn = (player2 == "Gwendolyn") + return "The color of both players were swapped. It is now {}'s turn".format(player2), True, True, False, gwendoTurn + else: + return "You can only swap as the second player after the very first move.", False, False, False, False + + else: + return "I didn't get that. Use \"!hex start [opponent]\" to start a game, \"!hex place [position]\" to place a piece, \"!hex undo\" to undo your last move or \"!hex stop\" to stop a current game.", False, False, False, False + + # Starts the game + def loveStart(self, channel, user, opponent): + 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,"user 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..317003d 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 \ No newline at end of file