diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..23c2a55 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,29 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Old Shadowcrest Engine Server", + "type": "python", + "request": "launch", + "program": "OLD_Server/index.py", + "console": "integratedTerminal", + "justMyCode": true + }, + { + "name": "Shadowcrest Engine Server", + "type": "python", + "request": "launch", + "program": "OLD_Server/index.py", + "console": "integratedTerminal", + "justMyCode": true + }, + { + "name": "ShadowCrest Python GameEngine Client", + "type": "python", + "request": "launch", + "program": "Client/main.py", + "console": "integratedTerminal", + "justMyCode": true + } + ] +} \ No newline at end of file diff --git a/Client/.vscode/settings.json b/Client/.vscode/settings.json new file mode 100644 index 0000000..6b1a4ea --- /dev/null +++ b/Client/.vscode/settings.json @@ -0,0 +1,15 @@ +{ + "cSpell.words": [ + "pygame", + "yvel" + ], + "cSpell.ignoreWords": [ + "activateeffectcard", + "activatemonstereffect", + "attackcard", + "attackplayer", + "movecard", + "placecard", + "removecard" + ] +} \ No newline at end of file diff --git a/Client/Assets/Arenas/default.png b/Client/Assets/Arenas/default.png new file mode 100644 index 0000000..ba5da22 Binary files /dev/null and b/Client/Assets/Arenas/default.png differ diff --git a/Client/Assets/Cards/0/field.png b/Client/Assets/Cards/0/field.png new file mode 100644 index 0000000..472f0a1 Binary files /dev/null and b/Client/Assets/Cards/0/field.png differ diff --git a/Client/Assets/Cards/1/card.json b/Client/Assets/Cards/1/card.json new file mode 100644 index 0000000..3ce8af5 --- /dev/null +++ b/Client/Assets/Cards/1/card.json @@ -0,0 +1,23 @@ +{ + "id": 1, + "type":"MonsterCard", + "name": "Test Monster", + "image": "Assets/Cards/1/cards.png", + "description": "can attack other monsters", + "costs": 30, + "defense": 40, + "attacks":[ + { + "id": 1, + "name":"test attack", + "description": "can attack another Monster", + "damage": 80 + }, + { + "id": 2, + "name":"test attack", + "description": "can attack another Monster", + "damage": 80 + } + ] +} diff --git a/Client/Assets/Cards/1/card.png b/Client/Assets/Cards/1/card.png new file mode 100644 index 0000000..320d60d Binary files /dev/null and b/Client/Assets/Cards/1/card.png differ diff --git a/Client/Assets/Cards/2/artworkjson.png b/Client/Assets/Cards/2/artworkjson.png new file mode 100644 index 0000000..9955a0c Binary files /dev/null and b/Client/Assets/Cards/2/artworkjson.png differ diff --git a/Client/Assets/Cards/2/testspellcard.json b/Client/Assets/Cards/2/testspellcard.json new file mode 100644 index 0000000..f812019 --- /dev/null +++ b/Client/Assets/Cards/2/testspellcard.json @@ -0,0 +1,9 @@ +{ + "name": "testspell", + "type":"EffectCard", + "image":"Assets/Cards/2/artwork.png", + "costs": 30, + "defense": 0, + "description":"this is a test spell card", + "attacks": [] +} \ No newline at end of file diff --git a/Client/Assets/Cards/3/artworkjson.png b/Client/Assets/Cards/3/artworkjson.png new file mode 100644 index 0000000..9955a0c Binary files /dev/null and b/Client/Assets/Cards/3/artworkjson.png differ diff --git a/Client/Assets/Cards/3/testtrapcard.json b/Client/Assets/Cards/3/testtrapcard.json new file mode 100644 index 0000000..13ed51a --- /dev/null +++ b/Client/Assets/Cards/3/testtrapcard.json @@ -0,0 +1,9 @@ +{ + "name": "testtrap", + "type":"EffectCard", + "image":"Assets/Cards/3/artwork.png", + "costs": 30, + "defense": 0, + "description":"this is a test trap card", + "attacks": [] +} \ No newline at end of file diff --git a/Client/Classes/Game/BoardField.py b/Client/Classes/Game/BoardField.py new file mode 100644 index 0000000..c490fee --- /dev/null +++ b/Client/Classes/Game/BoardField.py @@ -0,0 +1,85 @@ +import os +import pygame + +class BoardField(pygame.sprite.Sprite): + __fieldID:str + __name:str + __side:str + __type:str + __pos:pygame.Vector2 + __size:tuple + __color:tuple = (255,255,255) + __holdsCard = None + image:pygame.image + rect:pygame.rect + + def __init__(self, name:str, side:str, type:str, pos:pygame.Vector2, imagePath:str, fid:str): + pygame.sprite.Sprite.__init__(self) + self.__name = name + self.__side = side + self.__type = type + self.__pos = pos + self.__holdsCard = None + self.__fieldID = fid + + # Überprüfen des Dateipfads + if not os.path.exists(imagePath): + print("Der Dateipfad zur Bilddatei ist ungültig oder die Datei existiert nicht.") + else: + # Wenn der Pfad gültig ist, versuchen Sie, das Bild zu laden + self.image = pygame.image.load(imagePath).convert_alpha() + self.rect = self.image.get_rect() + self.rect.center = self.__pos + + def getName(self) -> str: + return self.__name + + def getSide(self) -> str: + return self.__side + + def getType(self) -> str: + return self.__type + + def getPos(self) -> pygame.Vector2: + return self.__pos + + def getSize(self) -> tuple: + return self.__size + + def getColor(self) -> tuple: + return self.__color + + def getRect(self) -> pygame.Rect: + return self.rect + + def getImage(self) -> pygame.image: + return self.image + + def getHoldingCard(self): + return self.__holdsCard + + def setName(self, name:str) -> str: + self.__name = name + return self.__name + + def setType(self,type:str) -> str: + self.__type = type + return self.__type + + def setPos(self, pos:pygame.Vector2) -> pygame.Vector2: + self.pos = pos + return self.__pos + + def setSize(self, size:tuple) -> tuple: + self.__size = size + return self.__size + + def setColor(self, color:tuple) -> tuple: + self.__color = color + return self.__color + + def setCardHolding(self, card): + self.__holdsCard = card + + def getFieldID(self) -> str: + return self.__fieldID \ No newline at end of file diff --git a/Client/Classes/Game/Cards/Card.py b/Client/Classes/Game/Cards/Card.py new file mode 100644 index 0000000..3ef646b --- /dev/null +++ b/Client/Classes/Game/Cards/Card.py @@ -0,0 +1,105 @@ +import json +import pygame + +from Classes.System.Components.InputHandler import InputHandler +from Classes.Game.Player import Player + +class Card(pygame.sprite.Sprite): + __name:str + __id:int + __description:str + __attacks = [] + __type:str = "Monster" + __pos:pygame.Vector2 + __dragging:bool = False + __offset:pygame.Vector2 = pygame.Vector2(0,0) + __inputHandler: InputHandler + __owner:Player + __state:str + image:pygame.image + rect:pygame.rect + + def __init__(self, pos: pygame.Vector2, assetDir: str, inputHandler: InputHandler, owner: Player): + if assetDir == "": + raise ValueError("Card: imagePath cannot be empty") + + pygame.sprite.Sprite.__init__(self) + + with open(assetDir + "/card.json", 'r') as file: + data = json.load(file) + + self.__owner = owner + self.__id = int(data["id"]) + self.__pos = pos + self.__name = data["name"] + self.__type = data.get("type") + self.image = pygame.image.load(assetDir + "/card.png").convert_alpha() + self.rect = self.image.get_rect() + self.__inputHandler = inputHandler + self.rect.center = self.__pos + self.__description = data["description"] + self.original_size = self.image.get_size() + self.original_position = self.rect.center + self.__state = "onHand" + self.__type = "Monster" + + self.__attacks = [] + for attack in data.get("attacks", []): + self.__attacks.append(attack) + + def update(self): + if self.__dragging: + mouse_pos = self.__inputHandler.getMousePos() + self.__pos = mouse_pos + self.rect.center = self.__pos + + def attacks(self): + return self.__attacks + + def getName(self) -> str: + return self.__name + + def getCardSprite(self) -> pygame.image: + return self.__cardSprite + + def getDescription(self): + return self.__description + + def getDragging(self): + return self.__dragging + + def getOffset(self): + return self.__offset + + def getPos(self) -> pygame.Vector2: + return self.__pos + + def getX(self) -> int: + return self.__pos.x + + def getY(self) -> int: + return self.__pos.y + + def getType(self): + return self.__type + + def getID(self) -> int: + return self.__id + + def getOwner(self) -> Player: + return self.__owner + + def getState(self) -> str: + return self.__state + + def setDragging(self, dragging:bool): + self.__dragging = dragging + + def setOffset(self, offset:pygame.Vector2): + self.__offset = offset + + def setPos(self, pos:pygame.Vector2): + self.__pos = pos + + def setState(self, state:str): + self.__state = state \ No newline at end of file diff --git a/Client/Classes/Game/Cards/MonsterCard.py b/Client/Classes/Game/Cards/MonsterCard.py new file mode 100644 index 0000000..63f1e28 --- /dev/null +++ b/Client/Classes/Game/Cards/MonsterCard.py @@ -0,0 +1,88 @@ +import json +import pygame + +from Classes.System.Components.InputHandler import InputHandler +from Classes.Game.Player import Player + +class MonsterCard(pygame.sprite.Sprite): + __name:str + __id:int + __description:str + __attacks = [] + __type:str = "Monster" + __pos:pygame.Vector2 + __dragging:bool = False + __offset:pygame.Vector2 = pygame.Vector2(0,0) + __inputHandler: InputHandler + __owner:Player + image:pygame.image + rect:pygame.rect + + def __init__(self, pos:pygame.Vector2, assetDir:str, inputHandler:InputHandler, owner:Player): + if assetDir == "": + return ValueError.add_note("Card: imagePath cannot be empty") + + pygame.sprite.Sprite.__init__(self) + + data = json.load(open(assetDir + "/card.json")) + self.__owner = owner + self.__id = int(data["id"]) + self.__pos = pos + self.__name = data["name"] + self.image = pygame.image.load(assetDir + "/card.png").convert_alpha() + self.rect = self.image.get_rect() + self.dragging = False + self.offset = pygame.Vector2(0, 0) # Offset zwischen der Karte und der Mausposition + self.__inputHandler = inputHandler + self.rect.center = self.__pos + self.__description = data["description"] + self.original_size = self.image.get_size() + self.original_position = self.rect.center + + for attack in data["attacks"]: + self.__attacks.append(attack) + + def update(self): + if self.__dragging: + mouse_pos = self.__inputHandler.getMousePos() + self.__pos = mouse_pos + self.rect.center = self.__pos + + def attacks(self): + return self.__attacks + + def getName(self) -> str: + return self.__name + + def getCardSprite(self) -> pygame.image: + return self.__cardSprite + + def getDescription(self): + return self.__description + + def getDragging(self): + return self.__dragging + + def getOffset(self): + return self.__offset + + def getPos(self): + return self.__pos + + def getType(self): + return self.__type + + def getID(self) -> int: + return self.__id + + def getOwner(self) -> Player: + return self.__owner + + def setDragging(self, dragging:bool): + self.__dragging = dragging + + def setOffset(self, offset:pygame.Vector2): + self.__offset = offset + + def setPos(self, pos:pygame.Vector2): + self.__pos = pos \ No newline at end of file diff --git a/Client/Classes/Game/Cards/SpellCard.py b/Client/Classes/Game/Cards/SpellCard.py new file mode 100644 index 0000000..5209399 --- /dev/null +++ b/Client/Classes/Game/Cards/SpellCard.py @@ -0,0 +1,72 @@ +import json +from typing import Any + +import pygame + +from Classes.System.Components.InputHandler import InputHandler + +class SpellCard(pygame.sprite.Sprite): + __name:str + __description:str + __pos:pygame.Vector2 + __dragging:bool = False + __offset:pygame.Vector2 = pygame.Vector2(0,0) + __inputHandler: InputHandler + __type:str = "Effect" + image:pygame.image + rect:pygame.rect + + def __init__(self, pos:pygame.Vector2, assetDir:str, inputHandler:InputHandler): + if assetDir == "": + return ValueError.add_note("Card: imagePath cannot be empty") + + pygame.sprite.Sprite.__init__(self) + + data = json.load(open(assetDir + "/card.json")) + self.__pos = pos + self.__name = data["name"] + self.image = pygame.image.load(assetDir + "/card.png").convert_alpha() + self.rect = self.image.get_rect() + self.dragging = False + self.offset = pygame.Vector2(0, 0) # Offset zwischen der Karte und der Mausposition + self.__inputHandler = inputHandler + self.rect.center = self.__pos + self.__description = data["description"] + self.original_size = self.image.get_size() + self.original_position = self.rect.center + + def update(self): + if self.getDragging(): + mouse_pos = self.__inputHandler.getMousePos() + self.__pos = mouse_pos + self.rect.center = self.__pos + + def getName(self) -> str: + return self.__name + + def getCardSprite(self) -> pygame.image: + return self.__cardSprite + + def getDescription(self): + return self.__description + + def getDragging(self): + return self.__dragging + + def getOffset(self): + return self.__offset + + def getPos(self): + return self.__pos + + def getType(self): + return self.__type + + def setDragging(self, dragging:bool): + self.__dragging = dragging + + def setOffset(self, offset:pygame.Vector2): + self.__offset = offset + + def setPos(self, pos:pygame.Vector2): + self.__pos = pos \ No newline at end of file diff --git a/Client/Classes/Game/Cards/TrapCard.py b/Client/Classes/Game/Cards/TrapCard.py new file mode 100644 index 0000000..dcb6f76 --- /dev/null +++ b/Client/Classes/Game/Cards/TrapCard.py @@ -0,0 +1,72 @@ +import json +from typing import Any + +import pygame + +from Classes.System.Components.InputHandler import InputHandler + +class TrapCard(pygame.sprite.Sprite): + __name:str + __description:str + __pos:pygame.Vector2 + __dragging:bool = False + __offset:pygame.Vector2 = pygame.Vector2(0,0) + __inputHandler: InputHandler + __type:str = "Effect" + image:pygame.image + rect:pygame.rect + + def __init__(self, pos:pygame.Vector2, assetDir:str, inputHandler:InputHandler): + if assetDir == "": + return ValueError.add_note("Card: imagePath cannot be empty") + + pygame.sprite.Sprite.__init__(self) + + data = json.load(open(assetDir + "/card.json")) + self.__pos = pos + self.__name = data["name"] + self.__inputHandler = inputHandler + self.__description = data["description"] + self.original_size = self.image.get_size() + self.original_position = self.rect.center + self.offset = pygame.Vector2(0, 0) # Offset zwischen der Karte und der Mausposition + self.rect = self.image.get_rect() + self.rect.center = self.__pos + self.image = pygame.image.load(assetDir + "/card.png").convert_alpha() + self.__dragging = False + + def update(self): + if self.getDragging(): + mouse_pos = self.__inputHandler.getMousePos() + self.__pos = mouse_pos + self.rect.center = self.__pos + + def getName(self) -> str: + return self.__name + + def getCardSprite(self) -> pygame.image: + return self.__cardSprite + + def getDescription(self): + return self.__description + + def getDragging(self): + return self.__dragging + + def getOffset(self): + return self.__offset + + def getPos(self): + return self.__pos + + def getType(self): + return self.__type + + def setDragging(self, dragging:bool): + self.__dragging = dragging + + def setOffset(self, offset:pygame.Vector2): + self.__offset = offset + + def setPos(self, pos:pygame.Vector2): + self.__pos = pos \ No newline at end of file diff --git a/Client/Classes/Game/Cards/__pycache__/Card.cpython-311.pyc b/Client/Classes/Game/Cards/__pycache__/Card.cpython-311.pyc new file mode 100644 index 0000000..c81c6ad Binary files /dev/null and b/Client/Classes/Game/Cards/__pycache__/Card.cpython-311.pyc differ diff --git a/Client/Classes/Game/Cards/__pycache__/Card.cpython-312.pyc b/Client/Classes/Game/Cards/__pycache__/Card.cpython-312.pyc new file mode 100644 index 0000000..3e97a31 Binary files /dev/null and b/Client/Classes/Game/Cards/__pycache__/Card.cpython-312.pyc differ diff --git a/Client/Classes/Game/Cards/__pycache__/MonsterCard.cpython-311.pyc b/Client/Classes/Game/Cards/__pycache__/MonsterCard.cpython-311.pyc new file mode 100644 index 0000000..704782a Binary files /dev/null and b/Client/Classes/Game/Cards/__pycache__/MonsterCard.cpython-311.pyc differ diff --git a/Client/Classes/Game/Cards/__pycache__/MonsterCard.cpython-312.pyc b/Client/Classes/Game/Cards/__pycache__/MonsterCard.cpython-312.pyc new file mode 100644 index 0000000..6b648b0 Binary files /dev/null and b/Client/Classes/Game/Cards/__pycache__/MonsterCard.cpython-312.pyc differ diff --git a/Client/Classes/Game/Cards/__pycache__/SpellCard.cpython-311.pyc b/Client/Classes/Game/Cards/__pycache__/SpellCard.cpython-311.pyc new file mode 100644 index 0000000..f31c7ed Binary files /dev/null and b/Client/Classes/Game/Cards/__pycache__/SpellCard.cpython-311.pyc differ diff --git a/Client/Classes/Game/Cards/__pycache__/SpellCard.cpython-312.pyc b/Client/Classes/Game/Cards/__pycache__/SpellCard.cpython-312.pyc new file mode 100644 index 0000000..90a425e Binary files /dev/null and b/Client/Classes/Game/Cards/__pycache__/SpellCard.cpython-312.pyc differ diff --git a/Client/Classes/Game/Cards/__pycache__/TrapCard.cpython-311.pyc b/Client/Classes/Game/Cards/__pycache__/TrapCard.cpython-311.pyc new file mode 100644 index 0000000..0871a3b Binary files /dev/null and b/Client/Classes/Game/Cards/__pycache__/TrapCard.cpython-311.pyc differ diff --git a/Client/Classes/Game/Cards/__pycache__/TrapCard.cpython-312.pyc b/Client/Classes/Game/Cards/__pycache__/TrapCard.cpython-312.pyc new file mode 100644 index 0000000..7fb7dd7 Binary files /dev/null and b/Client/Classes/Game/Cards/__pycache__/TrapCard.cpython-312.pyc differ diff --git a/Client/Classes/Game/Events/GameStart.py b/Client/Classes/Game/Events/GameStart.py new file mode 100644 index 0000000..29b3bff --- /dev/null +++ b/Client/Classes/Game/Events/GameStart.py @@ -0,0 +1,16 @@ +import pygame +from Classes.Game.World import World +from Classes.Game.Cards.Card import Card +from Classes.Game.Player import Player +from Classes.System.Components.InputHandler import InputHandler + + +# send from the server to tell the player the game starts +# gives the client its and the opponents stats (not cards!!) +def GameStart(world: World, handCards:list, inputHandler:InputHandler, owner:Player, opponent:Player): + index:int = 0 + world.setEnemy(opponent) + + for card in handCards: + world.AddToPlayerHand(Card(pygame.Vector2(500 + (index + 100), 1050), f"Assets/Cards/{card}/", inputHandler, owner)) + \ No newline at end of file diff --git a/Client/Classes/Game/Events/Login.py b/Client/Classes/Game/Events/Login.py new file mode 100644 index 0000000..71fef11 --- /dev/null +++ b/Client/Classes/Game/Events/Login.py @@ -0,0 +1,25 @@ +import json +import pygame +from Classes.Game.World import World +from Classes.Game.Player import Player + + +# event the client sends to let the server know it logged in +def Login(tcpClient): + payload = { + "event":"login", + "username": "player", + "deck": [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1] + } + + tcpClient.send(payload) + +# server response for login event +def LoginResponse(message:dict, world:World): + print("LoginResponse called") + # checks if the response on the login request is successfull + if message["status"] != "success": + print("login failed") + else: + print("receiving login confirmation from server") + world.setPlayer(Player(0,0,message["name"], message["id"])) \ No newline at end of file diff --git a/Client/Classes/Game/Events/PlaceCard.py b/Client/Classes/Game/Events/PlaceCard.py new file mode 100644 index 0000000..4b2a39a --- /dev/null +++ b/Client/Classes/Game/Events/PlaceCard.py @@ -0,0 +1,30 @@ +import pygame +from Classes.Game.World import World +from Classes.System.Components.InputHandler import InputHandler +from Classes.Game.Cards.Card import Card + +# the event the client sends to the server when it places a card +def PlaceCard(tcpClient, card:Card, player): + # todo: send card information to the server + # todo: required info is: + # - position + # - field type (used for validating what field the card is played in will be compared on server side) + # - card id (server will do the rest to fetch card info) + payload = { + "event":"placecard", + "card": card.getID(), + "type": card.getType(), + "user": player.getID(), + "x": card.getX(), + "y": card.getY(), + } + + tcpClient.send(payload) + +# the event send from the server to display a card on the field +def CardPlaced(world:World, card:int, type:str, owner:str, pos:pygame.Vector2, inputHandler:InputHandler): + # todo: make this work with all cardtypes + world.spawnCard(f"Assets/Cards/{card}/", pos, inputHandler, owner) + +def MovedCard(world:World, card:int, type:str, owner:str, oldPos:pygame.Vector2, newPos:pygame.Vector2, inputHandler:InputHandler): + pass \ No newline at end of file diff --git a/Client/Classes/Game/Events/__pycache__/GameStart.cpython-311.pyc b/Client/Classes/Game/Events/__pycache__/GameStart.cpython-311.pyc new file mode 100644 index 0000000..40ebc60 Binary files /dev/null and b/Client/Classes/Game/Events/__pycache__/GameStart.cpython-311.pyc differ diff --git a/Client/Classes/Game/Events/__pycache__/GameStart.cpython-312.pyc b/Client/Classes/Game/Events/__pycache__/GameStart.cpython-312.pyc new file mode 100644 index 0000000..8048845 Binary files /dev/null and b/Client/Classes/Game/Events/__pycache__/GameStart.cpython-312.pyc differ diff --git a/Client/Classes/Game/Events/__pycache__/Login.cpython-311.pyc b/Client/Classes/Game/Events/__pycache__/Login.cpython-311.pyc new file mode 100644 index 0000000..436d900 Binary files /dev/null and b/Client/Classes/Game/Events/__pycache__/Login.cpython-311.pyc differ diff --git a/Client/Classes/Game/Events/__pycache__/Login.cpython-312.pyc b/Client/Classes/Game/Events/__pycache__/Login.cpython-312.pyc new file mode 100644 index 0000000..f293a04 Binary files /dev/null and b/Client/Classes/Game/Events/__pycache__/Login.cpython-312.pyc differ diff --git a/Client/Classes/Game/Events/__pycache__/PlaceCard.cpython-311.pyc b/Client/Classes/Game/Events/__pycache__/PlaceCard.cpython-311.pyc new file mode 100644 index 0000000..ca1ef0e Binary files /dev/null and b/Client/Classes/Game/Events/__pycache__/PlaceCard.cpython-311.pyc differ diff --git a/Client/Classes/Game/Events/__pycache__/PlaceCard.cpython-312.pyc b/Client/Classes/Game/Events/__pycache__/PlaceCard.cpython-312.pyc new file mode 100644 index 0000000..d5ef877 Binary files /dev/null and b/Client/Classes/Game/Events/__pycache__/PlaceCard.cpython-312.pyc differ diff --git a/Client/Classes/Game/Player.py b/Client/Classes/Game/Player.py new file mode 100644 index 0000000..cb8ec7f --- /dev/null +++ b/Client/Classes/Game/Player.py @@ -0,0 +1,46 @@ +import pygame + +class Player: + __id:int + __hp:int + __mana:int + __name:str + __handCards:pygame.sprite.Group + + def __init__(self, hp:int, mana:int, name:str, id:int=0): + self.__hp = hp + self.__mana = mana + self.__name = name + self.__id = id + + def setID(self, id:int): + self.__id = id + + def getID(self) -> int: + return self.__id + + def getName(self) -> str: + return self.__name + + def getHP(self) -> int: + return self.__hp + + def getMana(self) -> int: + return self.__mana + + def adjustHP(self, hp:int) -> int: + self.__hp = self.__hp + hp + + def getHand(self) -> pygame.sprite.Group: + return self.__handCards + + def AddToHand(self, card) -> pygame.sprite.Group: + self.__handCards.add(card) + return self.__handCards + + def removeFromHand(self, pos:int) -> pygame.sprite.Group: + self.__handCards.remove(pos) + return self.__handCards + + def setMana(self, mana:int): + self.__mana = mana \ No newline at end of file diff --git a/Game Client/Classes/Game/World.py b/Client/Classes/Game/World.py similarity index 76% rename from Game Client/Classes/Game/World.py rename to Client/Classes/Game/World.py index a5fbaae..d5761c1 100644 --- a/Game Client/Classes/Game/World.py +++ b/Client/Classes/Game/World.py @@ -1,18 +1,18 @@ import pygame -from Classes.Engine.Logger import Logger -from Classes.Engine.Components.BoardField import BoardField -from Classes.Engine.Components.Label import Label +from Classes.Game.BoardField import BoardField +from Classes.System.Components.Label import Label from Classes.Game.Cards.MonsterCard import MonsterCard from Classes.Game.Cards.SpellCard import SpellCard from Classes.Game.Cards.TrapCard import TrapCard -from Classes.Engine.InputHandler import InputHandler +from Classes.System.Components.InputHandler import InputHandler from Classes.Game.Player import Player from Classes.Game.Cards.Card import Card +from Classes.System.Utils.Path import PathUtil class World(): __boardFields:list - __player:Player - __enemy:Player + player:Player + enemy:Player __labels:list __cards:pygame.sprite.Group() __PlayerHandCards:pygame.sprite.Group() @@ -20,12 +20,8 @@ class World(): __cardWidth:int = 150 __cardHeight:int = 200 __cardOffset:int = 400 - __logger:Logger - def __init__(self, logger:Logger, screen:pygame.surface, cardWidth:int=200, cardHeight:int=250, cardOffset:int=400): - self.__logger = logger - - self.__logger.info("initializing world") + def __init__(self, screen:pygame.surface, cardWidth:int=200, cardHeight:int=250, cardOffset:int=400): self.__boardFields = [] self.__labels = [] self.__cards = pygame.sprite.Group() @@ -34,13 +30,13 @@ class World(): self.__cardWidth = cardWidth self.__cardHeight = cardHeight self.__cardOffset = cardOffset - self.__player = None - self.__enemy = None + self.player = None + self.enemy = None self.buildGameWorld() def buildGameWorld(self): # construct elements arround the playerfield - self.__logger.info("building game world") + # Todo add lifepoint label for player and enemy and make them scriptable move to player class # presets the y position later passed down to the vector2 eRow1Height = 85 @@ -52,33 +48,36 @@ class World(): eGravePos = pygame.Vector2((self.__cardOffset + ((self.__cardWidth + 10) * 0)), eRow2Height) eNamePos = pygame.Vector2(15, 45) eHPPos = pygame.Vector2(15, 75) + pGravePos = pygame.Vector2((self.__cardOffset + (((self.__cardWidth + 10) - 30 ) * 5)), pRow1Height) pDeckPos = pygame.Vector2((self.__cardOffset + (((self.__cardWidth + 10) - 30 ) * 5)), pRow2Height) - self.__labels.append(Label("EnemyHP", self.__screen, "1000 / 1000", eHPPos)) - self.__labels.append(Label("EnemyName", self.__screen, "Enemy", eNamePos)) - self.__boardFields.append(BoardField("EnemyDeck", "Enemy", "Deck", eDeckPos, "Assets/Cards/0/field.png", "e-deck")) - self.__boardFields.append(BoardField("EnemyGraveyard", "Enemy", "Grave", eGravePos, "Assets/Cards/0/field.png", "e-grave")) - pNamePos = pygame.Vector2(20, pRow2Height + 195) pHPPos = pygame.Vector2(20, pRow2Height + 225) pManaPos = pygame.Vector2(20, pRow2Height + 255) + + # labeling self.__labels.append(Label("PlayerHP", self.__screen, "1000 / 1000", pHPPos)) self.__labels.append(Label("PlayerName", self.__screen, "Player", pNamePos)) self.__labels.append(Label("PlayerName", self.__screen, "0", pManaPos)) - self.__boardFields.append(BoardField("PlayerDeck", "Player", "Deck", pDeckPos, "Assets/Cards/0/field.png", "P-deck")) - self.__boardFields.append(BoardField("PlayerGraveyard", "Player", "Grave", pGravePos, "Assets/Cards/0/field.png", "p-grave")) + self.__labels.append(Label("EnemyHP", self.__screen, "1000 / 1000", eHPPos)) + self.__labels.append(Label("EnemyName", self.__screen, "Enemy", eNamePos)) + + self.__boardFields.append(BoardField("EnemyDeck", "Enemy", "Deck", eDeckPos, PathUtil.getAbsolutePathTo("Assets/Cards/0/field.png"), "e-deck")) + self.__boardFields.append(BoardField("EnemyGraveyard", "Enemy", "Grave", eGravePos, PathUtil.getAbsolutePathTo("Assets/Cards/0/field.png"), "e-grave")) + self.__boardFields.append(BoardField("PlayerDeck", "Player", "Deck", pDeckPos, PathUtil.getAbsolutePathTo("Assets/Cards/0/field.png"), "P-deck")) + self.__boardFields.append(BoardField("PlayerGraveyard", "Player", "Grave", pGravePos, PathUtil.getAbsolutePathTo("Assets/Cards/0/field.png"), "p-grave")) # handle field creation for i in range(5): pMonsterPos = pygame.Vector2((self.__cardOffset + (((self.__cardWidth + 10) - 30) * i)), pRow1Height) pEffectPos = pygame.Vector2((self.__cardOffset + (((self.__cardWidth + 10) - 30) * i)), pRow2Height) - self.__boardFields.append(BoardField("PlayerMonsterField-"+str(i), "Player", "Monster", pMonsterPos, "Assets/Cards/0/field.png", "pm"+str(id))) - self.__boardFields.append(BoardField("PlayerEffectField-"+str(i), "Player", "Effect", pEffectPos, "Assets/Cards/0/field.png", "pe"+str(id))) - eMonsterPos = pygame.Vector2((self.__cardOffset + (((self.__cardWidth + 10) - 30) * (i+1)), eRow1Height)) eEffectPos = pygame.Vector2((self.__cardOffset + (((self.__cardWidth + 10) - 30) * (i+1))), eRow2Height) - self.__boardFields.append(BoardField("EnemyMonsterField-"+str(i), "Enemy", "Monster", eMonsterPos, "Assets/Cards/0/field.png", "em"+str(id))) - self.__boardFields.append(BoardField("EnemySpellTrapField-"+str(i), "Enemy", "Effect", eEffectPos, "Assets/Cards/0/field.png", "ee"+str(id))) + + self.__boardFields.append(BoardField("PlayerMonsterField-"+str(i), "Player", "Monster", pMonsterPos, PathUtil.getAbsolutePathTo("Assets/Cards/0/field.png"), "pm"+str(id))) + self.__boardFields.append(BoardField("PlayerEffectField-"+str(i), "Player", "Effect", pEffectPos, PathUtil.getAbsolutePathTo("Assets/Cards/0/field.png"), "pe"+str(id))) + self.__boardFields.append(BoardField("EnemyMonsterField-"+str(i), "Enemy", "Monster", eMonsterPos, PathUtil.getAbsolutePathTo("Assets/Cards/0/field.png"), "em"+str(id))) + self.__boardFields.append(BoardField("EnemySpellTrapField-"+str(i), "Enemy", "Effect", eEffectPos, PathUtil.getAbsolutePathTo("Assets/Cards/0/field.png"), "ee"+str(id))) def getBoardFields(self) -> list: return self.__boardFields @@ -108,13 +107,13 @@ class World(): for label in self.__labels: if label.getName() == "PlayerName": label.setText(player.getName()) - self.__player = player + self.player = player def setEnemy(self, player:Player): for label in self.__labels: if label.getName() == "EnemyName": label.setText(player.getName()) - self.__enemy = player + self.enemy = player def spawnCard(self, asset:str, pos:pygame.Vector2, inputHandler:InputHandler, owner:Player) -> Card: card = Card(pos, asset, inputHandler, owner) diff --git a/Client/Classes/Game/__pycache__/BoardField.cpython-311.pyc b/Client/Classes/Game/__pycache__/BoardField.cpython-311.pyc new file mode 100644 index 0000000..72f14ce Binary files /dev/null and b/Client/Classes/Game/__pycache__/BoardField.cpython-311.pyc differ diff --git a/Client/Classes/Game/__pycache__/BoardField.cpython-312.pyc b/Client/Classes/Game/__pycache__/BoardField.cpython-312.pyc new file mode 100644 index 0000000..690b53a Binary files /dev/null and b/Client/Classes/Game/__pycache__/BoardField.cpython-312.pyc differ diff --git a/Client/Classes/Game/__pycache__/Player.cpython-311.pyc b/Client/Classes/Game/__pycache__/Player.cpython-311.pyc new file mode 100644 index 0000000..27b8347 Binary files /dev/null and b/Client/Classes/Game/__pycache__/Player.cpython-311.pyc differ diff --git a/Client/Classes/Game/__pycache__/Player.cpython-312.pyc b/Client/Classes/Game/__pycache__/Player.cpython-312.pyc new file mode 100644 index 0000000..ab04806 Binary files /dev/null and b/Client/Classes/Game/__pycache__/Player.cpython-312.pyc differ diff --git a/Client/Classes/Game/__pycache__/World.cpython-311.pyc b/Client/Classes/Game/__pycache__/World.cpython-311.pyc new file mode 100644 index 0000000..acaf9b6 Binary files /dev/null and b/Client/Classes/Game/__pycache__/World.cpython-311.pyc differ diff --git a/Client/Classes/Game/__pycache__/World.cpython-312.pyc b/Client/Classes/Game/__pycache__/World.cpython-312.pyc new file mode 100644 index 0000000..9ecabfc Binary files /dev/null and b/Client/Classes/Game/__pycache__/World.cpython-312.pyc differ diff --git a/Client/Classes/System/App.py b/Client/Classes/System/App.py new file mode 100644 index 0000000..a19a257 --- /dev/null +++ b/Client/Classes/System/App.py @@ -0,0 +1,140 @@ +import pygame +from pygame.locals import * + +from Classes.Game.Cards.MonsterCard import MonsterCard +from Classes.System.Components.Window import Window +from Classes.System.Components.InputHandler import InputHandler +from Classes.Game.World import World +from Classes.System.Network.TCPClient import TCPClient +from Classes.Game.Events.Login import Login +from Classes.Game.Events.PlaceCard import PlaceCard +from Classes.Game.Player import Player +from Classes.Game.Cards.Card import Card +from Classes.System.Utils.Path import PathUtil + +class App: + + __window:Window + __running:bool = True + __FPS = 60 + __clock = pygame.time.Clock() + __myFont:pygame.font + __world:World + __inputHandler: InputHandler + __tcpClient: TCPClient + + def __init__(self, width:int=1920, height:int=1080, title:str="default title"): + pygame.font.init() + self.__myFont = pygame.font.SysFont('Comic Sans MS', 30) + self.__window = Window(width=width, height=height, title=title) + self.__inputHandler = InputHandler() + self.selectedCard = None + + # game word + self.__world = World(self.__window.getScreen()) + + try: + self.__tcpClient = TCPClient("127.0.0.1", "54322", self.__world, self.__inputHandler) + Login(self.__tcpClient) # will login to the server + except Exception as e: + print(f"failed to login due to error {e}") + print("server connection failed or got refused") + pass + + self.startGameLoop() + self.onCleanup() + + def startGameLoop(self): + + # create sprite groups + # todo: remove these and let server handle card creation instead + # blocker: server - client communication [WIP] + self.__world.spawnCard(PathUtil.getAbsolutePathTo("Assets/Cards/1/"), pygame.Vector2(500, 1050), self.__inputHandler, Player(1000, 0, "test")) + self.__world.spawnCard(PathUtil.getAbsolutePathTo("Assets/Cards/1/"), pygame.Vector2(600, 1050), self.__inputHandler, Player(1000, 0, "test")) + self.__world.spawnCard(PathUtil.getAbsolutePathTo("Assets/Cards/1/"), pygame.Vector2(700, 1050), self.__inputHandler, Player(1000, 0, "test")) + self.__world.spawnCard(PathUtil.getAbsolutePathTo("Assets/Cards/1/"), pygame.Vector2(800, 1050), self.__inputHandler, Player(1000, 0, "test")) + self.__world.spawnCard(PathUtil.getAbsolutePathTo("Assets/Cards/1/"), pygame.Vector2(900, 1050), self.__inputHandler, Player(1000, 0, "test")) + self.__world.spawnCard(PathUtil.getAbsolutePathTo("Assets/Cards/1/"), pygame.Vector2(1000, 1050), self.__inputHandler, Player(1000, 0, "test")) + + while self.__running: + self.__clock.tick(self.__FPS) + + self.__window.getScreen().fill((0,0,0)) + + # render world + self.__window.drawWorld(self.__world) + + # updates all cards inside the cards Spritegroup at each step the gameloops does + self.__world.getCards().update() + self.__world.getHandCards().update() + + # draw groups + self.__window.drawSpriteGroup(self.__world.getCards()) + self.__window.drawSpriteGroup(self.__world.getHandCards()) + + # event handler + self.handleEvent(pygame.event.get()) + + # emits update to the game + pygame.display.update() + + # handles incoming event queue + def handleEvent(self, events): + # TODO: fix bug that stacks cards when dragging them around + try: + for event in events: + if event.type == pygame.QUIT: + self.onCleanup() + elif self.__inputHandler.getMousePressed()[0]: + for card in self.__world.getCards(): + if card.rect.collidepoint(self.__inputHandler.getMousePos()): + #self.__logger.info(f"dragging card {card}") + self.selectedCard = card + + # failsafe to prevent NoneType errors + if self.selectedCard != None: + #self.__logger.info(f"working with card: {self.selectedCard}") + self.selectedCard.setDragging(True) + elif event.type == pygame.MOUSEBUTTONUP: + print("left mousebutton") + if event.button == 1: + if self.selectedCard != None: + self.selectedCard.setDragging(False) + print(self.selectedCard) + for field in self.__world.getBoardFields(): + print(f"checking field {field} is field mathinc? {field.getRect().collidepoint(self.__inputHandler.getMousePos())}") + if field.getRect().collidepoint(self.__inputHandler.getMousePos()): + print(f"is position valid? {field.getSide() == 'Player' and field.getType() == self.selectedCard.getType()} ") + print(f"side {field.getSide()} fieldtype {field.getType()} card type {self.selectedCard.getType()}") + + if field.getSide() == "Player" and field.getType() == self.selectedCard.getType(): + print(f"found field {field}") + try: + print(f"placing card {self.selectedCard} in field {field}") + # snap card into the correct field + self.selectedCard.rect.center = field.rect.center + self.selectedCard.setDragging(False) + + print(self.selectedCard) + # TODO: adapt this into the new game engine version + PlaceCard(self.__tcpClient, self.selectedCard, self.__world.getPlayer()) # tells te server that the player placed this card + self.selectedCard = None + except Exception as e: + print(f"failed to place card on server due to error: {e}") + + if self.selectedCard != None: + self.selectedCard = None + else: + raise ValueError("selected card in event handler was found empty this should never happen!") + pass + except: + pass + + # sets the running state for the gameloop + def setRunning(self, running:bool): + self.__running = running + + # ensures the gameloop stops running and the pygame instance is stopped properly + def onCleanup(self): + self.__running = False + pygame.quit() \ No newline at end of file diff --git a/Game Client/Classes/Engine/InputHandler.py b/Client/Classes/System/Components/InputHandler.py similarity index 100% rename from Game Client/Classes/Engine/InputHandler.py rename to Client/Classes/System/Components/InputHandler.py diff --git a/Client/Classes/System/Components/Label.py b/Client/Classes/System/Components/Label.py new file mode 100644 index 0000000..ed04c54 --- /dev/null +++ b/Client/Classes/System/Components/Label.py @@ -0,0 +1,47 @@ +import pygame + +class Label: + rect:pygame.rect + image:pygame.image + __screen:pygame.surface + __text:str + __pos:pygame.Vector2 + __font:pygame.font + font:pygame.font + __name:str + + def __init__(self, name:str, screen:pygame.surface, text:str, pos:pygame.Vector2, size:float=20, color:str="white"): + self.__font = pygame.font.SysFont("Arial", size) + self.font = pygame.font.SysFont("Arial", size) + self.image = self.font.render(text, 1, color) + _, _, w, h = self.image.get_rect() + self.__pos = pos + self.rect = pygame.Rect(self.__pos.x, self.__pos.y, w, h) + self.__screen = screen + self.__text = text + self.__name = name + + def getText(self) -> str: + return self.__text + + def getFont(self) -> pygame.font: + return self.__font + + def getPos(self) -> pygame.Vector2: + return self.__pos + + def getName(self) -> str: + return self.__name + + def setText(self, newtext:str, color:str="white"): + self.image = self.font.render(newtext, 1, color) + + def setFont(self, font:pygame.font, size:float, color:str="white"): + self.__font = pygame.font.SysFont(font, size) + self.change_text(self.text, color) + + def setPos(self, pos:pygame.Vector2): + self.__pos = pos + + def draw(self): + self.__screen.blit(self.image, (self.rect)) \ No newline at end of file diff --git a/Game Client/Classes/Engine/Window.py b/Client/Classes/System/Components/Window.py similarity index 100% rename from Game Client/Classes/Engine/Window.py rename to Client/Classes/System/Components/Window.py diff --git a/Client/Classes/System/Components/__pycache__/InputHandler.cpython-311.pyc b/Client/Classes/System/Components/__pycache__/InputHandler.cpython-311.pyc new file mode 100644 index 0000000..a0402a9 Binary files /dev/null and b/Client/Classes/System/Components/__pycache__/InputHandler.cpython-311.pyc differ diff --git a/Client/Classes/System/Components/__pycache__/InputHandler.cpython-312.pyc b/Client/Classes/System/Components/__pycache__/InputHandler.cpython-312.pyc new file mode 100644 index 0000000..7761966 Binary files /dev/null and b/Client/Classes/System/Components/__pycache__/InputHandler.cpython-312.pyc differ diff --git a/Client/Classes/System/Components/__pycache__/Label.cpython-311.pyc b/Client/Classes/System/Components/__pycache__/Label.cpython-311.pyc new file mode 100644 index 0000000..31d3e3d Binary files /dev/null and b/Client/Classes/System/Components/__pycache__/Label.cpython-311.pyc differ diff --git a/Client/Classes/System/Components/__pycache__/Label.cpython-312.pyc b/Client/Classes/System/Components/__pycache__/Label.cpython-312.pyc new file mode 100644 index 0000000..6ff947a Binary files /dev/null and b/Client/Classes/System/Components/__pycache__/Label.cpython-312.pyc differ diff --git a/Client/Classes/System/Components/__pycache__/Window.cpython-311.pyc b/Client/Classes/System/Components/__pycache__/Window.cpython-311.pyc new file mode 100644 index 0000000..1867184 Binary files /dev/null and b/Client/Classes/System/Components/__pycache__/Window.cpython-311.pyc differ diff --git a/Client/Classes/System/Components/__pycache__/Window.cpython-312.pyc b/Client/Classes/System/Components/__pycache__/Window.cpython-312.pyc new file mode 100644 index 0000000..3ffb5fc Binary files /dev/null and b/Client/Classes/System/Components/__pycache__/Window.cpython-312.pyc differ diff --git a/Client/Classes/System/Network/EventHandler.py b/Client/Classes/System/Network/EventHandler.py new file mode 100644 index 0000000..99dbf40 --- /dev/null +++ b/Client/Classes/System/Network/EventHandler.py @@ -0,0 +1,40 @@ +import socket + +import pygame + +from Classes.Game.Events.PlaceCard import CardPlaced +from Classes.System.Components.InputHandler import InputHandler +from Classes.Game.World import World +from Classes.Game.Events.GameStart import GameStart +from Classes.Game.Player import Player +from Classes.Game.Events.Login import LoginResponse + +class TCPEventHandler: + def __init__(self, socket:socket): + self.tcp_socket = socket + + def handleEvents(self, message, inputHandler:InputHandler, world:World): + print(message) + if message["event"] == "loginresponse": + LoginResponse(message, world) + pass + elif message["event"] == "startgame": + world.player.setMana(message["player"]["mana"]) + world.player.setHp(message["player"]["hp"]) + GameStart(world, message["player"]["hand"], inputHandler, world.getPlayer(), Player(message["enemy"]["hp"],message["enemy"]["mana"],message["enemy"]["name"], message["enemy"]["id"])) + pass + elif message["event"] == "placecard": + CardPlaced(world, message["card"], message["type"], message["owner"], pygame.Vector2(int(message["x"]), int(message["y"]), inputHandler)) + pass + elif message["event"] == "MoveCard": + pass + elif message["event"] == "RemoveCard": + pass + elif message["event"] == "AttackCard": + pass + elif message["event"] == "AttackPlayer": + pass + elif message["event"] == "ActivateEffectCard": + pass + elif message["event"] == "ActivateMonsterCard": + pass \ No newline at end of file diff --git a/Game Client/Classes/Engine/TCPClient.py b/Client/Classes/System/Network/TCPClient.py similarity index 91% rename from Game Client/Classes/Engine/TCPClient.py rename to Client/Classes/System/Network/TCPClient.py index c75e0af..c1d7354 100644 --- a/Game Client/Classes/Engine/TCPClient.py +++ b/Client/Classes/System/Network/TCPClient.py @@ -2,9 +2,9 @@ import json import socket import threading -from Classes.Engine.EventHandler import TCPEventHandler +from Classes.System.Network.EventHandler import TCPEventHandler from Classes.Game.World import World -from Classes.Engine.InputHandler import InputHandler +from Classes.System.Components.InputHandler import InputHandler class TCPClient: def __init__(self, addr: str, port: str, world:World, inputHandler:InputHandler): diff --git a/Client/Classes/System/Network/__pycache__/EventHandler.cpython-311.pyc b/Client/Classes/System/Network/__pycache__/EventHandler.cpython-311.pyc new file mode 100644 index 0000000..b33e7db Binary files /dev/null and b/Client/Classes/System/Network/__pycache__/EventHandler.cpython-311.pyc differ diff --git a/Client/Classes/System/Network/__pycache__/EventHandler.cpython-312.pyc b/Client/Classes/System/Network/__pycache__/EventHandler.cpython-312.pyc new file mode 100644 index 0000000..a62a2d3 Binary files /dev/null and b/Client/Classes/System/Network/__pycache__/EventHandler.cpython-312.pyc differ diff --git a/Client/Classes/System/Network/__pycache__/NetworkManager.cpython-311.pyc b/Client/Classes/System/Network/__pycache__/NetworkManager.cpython-311.pyc new file mode 100644 index 0000000..125a49f Binary files /dev/null and b/Client/Classes/System/Network/__pycache__/NetworkManager.cpython-311.pyc differ diff --git a/Client/Classes/System/Network/__pycache__/TCPClient.cpython-311.pyc b/Client/Classes/System/Network/__pycache__/TCPClient.cpython-311.pyc new file mode 100644 index 0000000..62eed0f Binary files /dev/null and b/Client/Classes/System/Network/__pycache__/TCPClient.cpython-311.pyc differ diff --git a/Client/Classes/System/Network/__pycache__/TCPClient.cpython-312.pyc b/Client/Classes/System/Network/__pycache__/TCPClient.cpython-312.pyc new file mode 100644 index 0000000..1471f32 Binary files /dev/null and b/Client/Classes/System/Network/__pycache__/TCPClient.cpython-312.pyc differ diff --git a/Client/Classes/System/Utils/Path.py b/Client/Classes/System/Utils/Path.py new file mode 100644 index 0000000..9b01eb9 --- /dev/null +++ b/Client/Classes/System/Utils/Path.py @@ -0,0 +1,6 @@ +import os + + +class PathUtil: + def getAbsolutePathTo(notAbsolutPath:str) -> str: + return os.path.abspath("Client/" + notAbsolutPath) \ No newline at end of file diff --git a/Game Client/Classes/Engine/Utils/StringUtils.py b/Client/Classes/System/Utils/StringUtils.py similarity index 100% rename from Game Client/Classes/Engine/Utils/StringUtils.py rename to Client/Classes/System/Utils/StringUtils.py diff --git a/Client/Classes/System/Utils/__pycache__/Path.cpython-311.pyc b/Client/Classes/System/Utils/__pycache__/Path.cpython-311.pyc new file mode 100644 index 0000000..36eabe2 Binary files /dev/null and b/Client/Classes/System/Utils/__pycache__/Path.cpython-311.pyc differ diff --git a/Client/Classes/System/Utils/__pycache__/StringUtils.cpython-311.pyc b/Client/Classes/System/Utils/__pycache__/StringUtils.cpython-311.pyc new file mode 100644 index 0000000..4052b1a Binary files /dev/null and b/Client/Classes/System/Utils/__pycache__/StringUtils.cpython-311.pyc differ diff --git a/Client/Classes/System/__pycache__/App.cpython-311.pyc b/Client/Classes/System/__pycache__/App.cpython-311.pyc new file mode 100644 index 0000000..455bd28 Binary files /dev/null and b/Client/Classes/System/__pycache__/App.cpython-311.pyc differ diff --git a/Client/Classes/System/__pycache__/App.cpython-312.pyc b/Client/Classes/System/__pycache__/App.cpython-312.pyc new file mode 100644 index 0000000..92bec22 Binary files /dev/null and b/Client/Classes/System/__pycache__/App.cpython-312.pyc differ diff --git a/Client/Classes/System/__pycache__/InputHandler.cpython-311.pyc b/Client/Classes/System/__pycache__/InputHandler.cpython-311.pyc new file mode 100644 index 0000000..6739cf5 Binary files /dev/null and b/Client/Classes/System/__pycache__/InputHandler.cpython-311.pyc differ diff --git a/Client/Classes/System/__pycache__/InputHandler.cpython-312.pyc b/Client/Classes/System/__pycache__/InputHandler.cpython-312.pyc new file mode 100644 index 0000000..e4c1099 Binary files /dev/null and b/Client/Classes/System/__pycache__/InputHandler.cpython-312.pyc differ diff --git a/Client/Classes/System/__pycache__/Window.cpython-311.pyc b/Client/Classes/System/__pycache__/Window.cpython-311.pyc new file mode 100644 index 0000000..3a9adcb Binary files /dev/null and b/Client/Classes/System/__pycache__/Window.cpython-311.pyc differ diff --git a/Client/Classes/System/__pycache__/Window.cpython-312.pyc b/Client/Classes/System/__pycache__/Window.cpython-312.pyc new file mode 100644 index 0000000..f345dc8 Binary files /dev/null and b/Client/Classes/System/__pycache__/Window.cpython-312.pyc differ diff --git a/Client/Classes/System/__pycache__/World.cpython-311.pyc b/Client/Classes/System/__pycache__/World.cpython-311.pyc new file mode 100644 index 0000000..65cde38 Binary files /dev/null and b/Client/Classes/System/__pycache__/World.cpython-311.pyc differ diff --git a/Client/Classes/System/__pycache__/World.cpython-312.pyc b/Client/Classes/System/__pycache__/World.cpython-312.pyc new file mode 100644 index 0000000..e5851d5 Binary files /dev/null and b/Client/Classes/System/__pycache__/World.cpython-312.pyc differ diff --git a/Client/main.py b/Client/main.py new file mode 100644 index 0000000..d243f0c --- /dev/null +++ b/Client/main.py @@ -0,0 +1,7 @@ +import pygame +from Classes.System.App import App + +if __name__ == "__main__": + pygame.init() + game = App() + game.onExecute() \ No newline at end of file diff --git a/Game Client/App.py b/New_Client/App.py similarity index 78% rename from Game Client/App.py rename to New_Client/App.py index 31aeebe..6b0b928 100644 --- a/Game Client/App.py +++ b/New_Client/App.py @@ -6,6 +6,7 @@ from Classes.Engine.TCPClient import TCPClient from Classes.Engine.Window import Window from Classes.Game.World import World +from Classes.Game.NetworkEvents.Login import Login class App: @@ -29,9 +30,18 @@ class App: pygame.font.init() self.__myFont = pygame.font.SysFont('Comic Sans MS', 30) self.__window = Window(width=width, height=height, title=title) + self.__world = World(self.logger, self.__window.getScreen()) self.__inputHandler = InputHandler() - self.__eventHandler = EngineEventHandler(self.__inputHandler, self.__world, self.logger, self.__tcpClient) - pass + + # attempt to connect to server + try: + self.logger.info("logging into server") + self.__tcpClient = TCPClient("127.0.0.1", "54322", self.__world, self.__inputHandler) + Login(self.__tcpClient) # will login to the server + except Exception as e: + print(f"failed to login due to error {e}") + print("server connection failed or got refused") + pass def startGameLoop(self): self.__running = True diff --git a/New_Client/Assets/Cards/0/field.png b/New_Client/Assets/Cards/0/field.png new file mode 100644 index 0000000..472f0a1 Binary files /dev/null and b/New_Client/Assets/Cards/0/field.png differ diff --git a/New_Client/Assets/Cards/1/card.json b/New_Client/Assets/Cards/1/card.json new file mode 100644 index 0000000..3ce8af5 --- /dev/null +++ b/New_Client/Assets/Cards/1/card.json @@ -0,0 +1,23 @@ +{ + "id": 1, + "type":"MonsterCard", + "name": "Test Monster", + "image": "Assets/Cards/1/cards.png", + "description": "can attack other monsters", + "costs": 30, + "defense": 40, + "attacks":[ + { + "id": 1, + "name":"test attack", + "description": "can attack another Monster", + "damage": 80 + }, + { + "id": 2, + "name":"test attack", + "description": "can attack another Monster", + "damage": 80 + } + ] +} diff --git a/New_Client/Assets/Cards/1/card.png b/New_Client/Assets/Cards/1/card.png new file mode 100644 index 0000000..76bef2d Binary files /dev/null and b/New_Client/Assets/Cards/1/card.png differ diff --git a/New_Client/Assets/Cards/2/artworkjson.png b/New_Client/Assets/Cards/2/artworkjson.png new file mode 100644 index 0000000..9955a0c Binary files /dev/null and b/New_Client/Assets/Cards/2/artworkjson.png differ diff --git a/New_Client/Assets/Cards/2/testspellcard.json b/New_Client/Assets/Cards/2/testspellcard.json new file mode 100644 index 0000000..f812019 --- /dev/null +++ b/New_Client/Assets/Cards/2/testspellcard.json @@ -0,0 +1,9 @@ +{ + "name": "testspell", + "type":"EffectCard", + "image":"Assets/Cards/2/artwork.png", + "costs": 30, + "defense": 0, + "description":"this is a test spell card", + "attacks": [] +} \ No newline at end of file diff --git a/New_Client/Assets/Cards/3/artworkjson.png b/New_Client/Assets/Cards/3/artworkjson.png new file mode 100644 index 0000000..9955a0c Binary files /dev/null and b/New_Client/Assets/Cards/3/artworkjson.png differ diff --git a/New_Client/Assets/Cards/3/testtrapcard.json b/New_Client/Assets/Cards/3/testtrapcard.json new file mode 100644 index 0000000..13ed51a --- /dev/null +++ b/New_Client/Assets/Cards/3/testtrapcard.json @@ -0,0 +1,9 @@ +{ + "name": "testtrap", + "type":"EffectCard", + "image":"Assets/Cards/3/artwork.png", + "costs": 30, + "defense": 0, + "description":"this is a test trap card", + "attacks": [] +} \ No newline at end of file diff --git a/New_Client/Assets/Cards/Arenas/default.png b/New_Client/Assets/Cards/Arenas/default.png new file mode 100644 index 0000000..ba5da22 Binary files /dev/null and b/New_Client/Assets/Cards/Arenas/default.png differ diff --git a/Game Client/Classes/Engine/Components/BoardField.py b/New_Client/Classes/Engine/Components/BoardField.py similarity index 100% rename from Game Client/Classes/Engine/Components/BoardField.py rename to New_Client/Classes/Engine/Components/BoardField.py diff --git a/Game Client/Classes/Engine/Components/Label.py b/New_Client/Classes/Engine/Components/Label.py similarity index 100% rename from Game Client/Classes/Engine/Components/Label.py rename to New_Client/Classes/Engine/Components/Label.py diff --git a/New_Client/Classes/Engine/Components/__pycache__/BoardField.cpython-311.pyc b/New_Client/Classes/Engine/Components/__pycache__/BoardField.cpython-311.pyc new file mode 100644 index 0000000..68492b2 Binary files /dev/null and b/New_Client/Classes/Engine/Components/__pycache__/BoardField.cpython-311.pyc differ diff --git a/New_Client/Classes/Engine/Components/__pycache__/Label.cpython-311.pyc b/New_Client/Classes/Engine/Components/__pycache__/Label.cpython-311.pyc new file mode 100644 index 0000000..01f94e8 Binary files /dev/null and b/New_Client/Classes/Engine/Components/__pycache__/Label.cpython-311.pyc differ diff --git a/Game Client/Classes/Engine/EventHandler.py b/New_Client/Classes/Engine/EventHandler.py similarity index 82% rename from Game Client/Classes/Engine/EventHandler.py rename to New_Client/Classes/Engine/EventHandler.py index b049a8d..8cb9a0b 100644 --- a/Game Client/Classes/Engine/EventHandler.py +++ b/New_Client/Classes/Engine/EventHandler.py @@ -2,7 +2,6 @@ import socket import pygame from Classes.Engine.Logger import Logger -from Classes.Engine.TCPClient import TCPClient from Classes.Game.NetworkEvents.PlaceCard import CardPlaced from Classes.Game.NetworkEvents.GameStart import GameStart @@ -10,6 +9,7 @@ from Classes.Game.NetworkEvents.PlaceCard import PlaceCard from Classes.Engine.InputHandler import InputHandler from Classes.Game.World import World from Classes.Game.Player import Player +from Classes.Game.NetworkEvents.Login import LoginResponse # network event handler this only handles events coming from the server class TCPEventHandler: @@ -18,14 +18,26 @@ class TCPEventHandler: self.__world = world self.__inputHandler = inputHandler - def handleEvents(self, message): - if message["event"] == "login": + def handleEvents(self, message:dict): + if message["event"] == "loginresponse": + LoginResponse(message) pass elif message["event"] == "startgame": + print("gamestart") + GameStart(self.__world, message["hand"], self.__inputHandler, self.__world.getPlayer()) pass elif message["event"] == "PlaceCard": + CardPlaced(self.__world, message["card"], message["type"], message["owner"], pygame.Vector2(int(message["x"]), int(message["y"]), self.__inputHandler)) pass elif message["event"] == "MoveCard": + CardMoved( + self.__world, + message["card"], + message["type"], + message["owner"], + pygame.Vector2(int(message["old_x"]), int(message["old_y"])), + pygame.Vector2(int(message["new_x"]), int(message["new_y"])), + self.__inputHandler) pass elif message["event"] == "RemoveCard": pass @@ -44,9 +56,9 @@ class EngineEventHandler: __inputHandler:InputHandler __world:World __logger:Logger - __tcpClient:TCPClient - def __init__(self, inputHandler:InputHandler, world:World, logger:Logger, tcpClient:TCPClient): + def __init__(self, inputHandler:InputHandler, world:World, logger:Logger, tcpClient): + self.__logger = logger self.__logger.info("initializing engine Event Handler") if inputHandler == None: raise ValueError("InputHandler was found to be None") @@ -62,7 +74,7 @@ class EngineEventHandler: self.__tcpClient = tcpClient # handles the incoming event queue - def handleEvent(self, events:list[pygame.Event]): + def handleEvent(self, events): # TODO: fix bug that stacks cards when dragging them around self.selectedCard = None self.mousePos = self.__inputHandler.getMousePos() diff --git a/New_Client/Classes/Engine/InputHandler.py b/New_Client/Classes/Engine/InputHandler.py new file mode 100644 index 0000000..8df7dd3 --- /dev/null +++ b/New_Client/Classes/Engine/InputHandler.py @@ -0,0 +1,53 @@ +import pygame + +from Classes.Engine.Components.BoardField import BoardField + +class InputHandler: + # returns pressed key + @staticmethod + def getPressed(): + return pygame.key.get_pressed() + + # returns pressed key + @staticmethod + def getMousePressed(): + return pygame.mouse.get_pressed() + + # takes in movement inputs and maps them to x and y axis + @staticmethod + def getInputAxis() -> tuple: + xvel = 0 + yvel = 0 + + # construct x and y velocity input axis + if InputHandler.getPressed()[pygame.K_a] or InputHandler.getPressed()[pygame.K_LEFT]: + xvel = -1 + if InputHandler.getPressed()[pygame.K_d] or InputHandler.getPressed()[pygame.K_RIGHT]: + xvel = 1 + if InputHandler.getPressed()[pygame.K_w] or InputHandler.getPressed()[pygame.K_UP]: + yvel = -1 + if InputHandler.getPressed()[pygame.K_s] or InputHandler.getPressed()[pygame.K_DOWN]: + yvel = 1 + + return tuple((xvel, yvel)) + + @staticmethod + def getMousePos() -> pygame.Vector2: + return pygame.Vector2(pygame.mouse.get_pos()) + + # get field under mousbutton + @staticmethod + def getMouseHover(mouse_pos: pygame.Vector2, world_card_width: int, world_card_height: int, board_fields: list) -> BoardField: + x_pos = mouse_pos.x / world_card_width + y_pos = mouse_pos.y / world_card_height + + for field in board_fields: + field_x = field.getPos().x + field_y = field.getPos().y + field_width = world_card_width # Annahme: Jedes Feld hat eine Breite von 1 Einheit + field_height = world_card_height # Annahme: Jedes Feld hat eine Höhe von 1 Einheit + + if field_x <= x_pos < field_x + field_width and field_y <= y_pos < field_y + field_height: + return field + + return None diff --git a/Game Client/Classes/Engine/Logger.py b/New_Client/Classes/Engine/Logger.py similarity index 100% rename from Game Client/Classes/Engine/Logger.py rename to New_Client/Classes/Engine/Logger.py diff --git a/New_Client/Classes/Engine/TCPClient.py b/New_Client/Classes/Engine/TCPClient.py new file mode 100644 index 0000000..a44fbc9 --- /dev/null +++ b/New_Client/Classes/Engine/TCPClient.py @@ -0,0 +1,52 @@ +import json +import socket +import threading + +from Classes.Engine.EventHandler import TCPEventHandler +from Classes.Game.World import World +from Classes.Engine.InputHandler import InputHandler + +class TCPClient: + + __running:bool + + def __init__(self, addr: str, port: str, world:World, inputHandler:InputHandler): + self.addr = addr + self.port = int(port) + self.tcpSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + self.world = world + self.inputHandler = inputHandler + self.eventHandler = TCPEventHandler(self.tcpSocket, self.inputHandler, self.world) + + try: + self.tcpSocket.connect((self.addr, self.port)) + self.__running = True + + except Exception as e: + print(f"Error connecting TCP socket: {e}") + self.__running = False + + # Starten des Listener-Threads + self.listen() + + def send(self, message: dict): + try: + self.tcpSocket.sendall(json.dumps(message).encode()) + except Exception as e: + print(f"Error sending TCP data: {e}") + + def receive(self): + while True: + try: + data = self.tcpSocket.recv(1024) + if data: + decoded_data = json.loads(data.decode()) + self.eventHandler.handleEvents(decoded_data) + except Exception as e: + print(f"Error receiving TCP data: {e}") + break + + def listen(self): + self.tcpThread = threading.Thread(target=self.receive) + self.tcpThread.daemon = True + self.tcpThread.start() \ No newline at end of file diff --git a/New_Client/Classes/Engine/Utils/Path.py b/New_Client/Classes/Engine/Utils/Path.py new file mode 100644 index 0000000..9b01eb9 --- /dev/null +++ b/New_Client/Classes/Engine/Utils/Path.py @@ -0,0 +1,6 @@ +import os + + +class PathUtil: + def getAbsolutePathTo(notAbsolutPath:str) -> str: + return os.path.abspath("Client/" + notAbsolutPath) \ No newline at end of file diff --git a/New_Client/Classes/Engine/Utils/StringUtils.py b/New_Client/Classes/Engine/Utils/StringUtils.py new file mode 100644 index 0000000..e4d02a1 --- /dev/null +++ b/New_Client/Classes/Engine/Utils/StringUtils.py @@ -0,0 +1,11 @@ +import random +import string + + +class StringUtils: + def get_random_string(length) -> str: + # choose from all lowercase letter + letters = string.ascii_lowercase + result_str = ''.join(random.choice(letters) for i in range(length)) + print("Random string of length", length, "is:", result_str) + return result_str diff --git a/New_Client/Classes/Engine/Utils/__pycache__/Path.cpython-311.pyc b/New_Client/Classes/Engine/Utils/__pycache__/Path.cpython-311.pyc new file mode 100644 index 0000000..36eabe2 Binary files /dev/null and b/New_Client/Classes/Engine/Utils/__pycache__/Path.cpython-311.pyc differ diff --git a/New_Client/Classes/Engine/Utils/__pycache__/StringUtils.cpython-311.pyc b/New_Client/Classes/Engine/Utils/__pycache__/StringUtils.cpython-311.pyc new file mode 100644 index 0000000..4052b1a Binary files /dev/null and b/New_Client/Classes/Engine/Utils/__pycache__/StringUtils.cpython-311.pyc differ diff --git a/New_Client/Classes/Engine/Window.py b/New_Client/Classes/Engine/Window.py new file mode 100644 index 0000000..461db85 --- /dev/null +++ b/New_Client/Classes/Engine/Window.py @@ -0,0 +1,54 @@ +import pygame +from pygame.locals import * + +from Classes.Engine.Components.BoardField import BoardField +from Classes.Game.World import World + +class Window: + __width:int = 800 + __height:int = 600 # takes 80% of width which tranlates to 640 + __title:str = "python game engine" + __screen:pygame.Surface + __clock:pygame.time.Clock + + def __init__(self, width:int=800, height:int=600, title:str="python game engine"): + self.__width = width + self.__height = height + self.__title = title + + pygame.init() + + self.__screen = pygame.display.set_mode((self.__width, self.__height)) + self.__screen.fill((236, 240, 241)) # Hier liegt der Fehler, es muss eine Tuple übergeben werden + pygame.display.set_caption(self.__title) + + self.__clock = pygame.time.Clock() + self.__framerate = 60 # Framerate auf 60 FPS festlegen + + # set framerate (where the fuck is it?) + def Render(self): + # dear future me figure out what past me did! + pass + + def setWidth(self, width:int): + self.__width = width + + def setHeight(self, height:int): + self.__height = height + + def setTitle(self, title:str): + self.__title = title + + def getScreen(self) -> pygame.surface: + return self.__screen + + # draws a passed sprite group to the screen + def drawSpriteGroup(self, group:pygame.sprite.Group): + group.draw(self.__screen) + + # draws a given group of rectangles onto the screen + def drawWorld(self, world:World): + for field in world.getBoardFields(): + pygame.draw.rect(self.__screen, field.getColor(), field.getRect()) + for label in world.getLabels(): + label.draw() \ No newline at end of file diff --git a/New_Client/Classes/Engine/__pycache__/EventHandler.cpython-311.pyc b/New_Client/Classes/Engine/__pycache__/EventHandler.cpython-311.pyc new file mode 100644 index 0000000..f41445c Binary files /dev/null and b/New_Client/Classes/Engine/__pycache__/EventHandler.cpython-311.pyc differ diff --git a/New_Client/Classes/Engine/__pycache__/InputHandler.cpython-311.pyc b/New_Client/Classes/Engine/__pycache__/InputHandler.cpython-311.pyc new file mode 100644 index 0000000..3df4b9d Binary files /dev/null and b/New_Client/Classes/Engine/__pycache__/InputHandler.cpython-311.pyc differ diff --git a/New_Client/Classes/Engine/__pycache__/Logger.cpython-311.pyc b/New_Client/Classes/Engine/__pycache__/Logger.cpython-311.pyc new file mode 100644 index 0000000..0dec236 Binary files /dev/null and b/New_Client/Classes/Engine/__pycache__/Logger.cpython-311.pyc differ diff --git a/New_Client/Classes/Engine/__pycache__/TCPClient.cpython-311.pyc b/New_Client/Classes/Engine/__pycache__/TCPClient.cpython-311.pyc new file mode 100644 index 0000000..cd3e928 Binary files /dev/null and b/New_Client/Classes/Engine/__pycache__/TCPClient.cpython-311.pyc differ diff --git a/New_Client/Classes/Engine/__pycache__/Window.cpython-311.pyc b/New_Client/Classes/Engine/__pycache__/Window.cpython-311.pyc new file mode 100644 index 0000000..3824f8a Binary files /dev/null and b/New_Client/Classes/Engine/__pycache__/Window.cpython-311.pyc differ diff --git a/Game Client/Classes/Game/Cards/Card.py b/New_Client/Classes/Game/Cards/Card.py similarity index 97% rename from Game Client/Classes/Game/Cards/Card.py rename to New_Client/Classes/Game/Cards/Card.py index 748819e..cd11413 100644 --- a/Game Client/Classes/Game/Cards/Card.py +++ b/New_Client/Classes/Game/Cards/Card.py @@ -1,7 +1,7 @@ import json import pygame -from Classes.System.Components.InputHandler import InputHandler +from Classes.Engine.InputHandler import InputHandler from Classes.Game.Player import Player class Card(pygame.sprite.Sprite): diff --git a/Game Client/Classes/Game/Cards/MonsterCard.py b/New_Client/Classes/Game/Cards/MonsterCard.py similarity index 100% rename from Game Client/Classes/Game/Cards/MonsterCard.py rename to New_Client/Classes/Game/Cards/MonsterCard.py diff --git a/Game Client/Classes/Game/Cards/SpellCard.py b/New_Client/Classes/Game/Cards/SpellCard.py similarity index 100% rename from Game Client/Classes/Game/Cards/SpellCard.py rename to New_Client/Classes/Game/Cards/SpellCard.py diff --git a/Game Client/Classes/Game/Cards/TrapCard.py b/New_Client/Classes/Game/Cards/TrapCard.py similarity index 100% rename from Game Client/Classes/Game/Cards/TrapCard.py rename to New_Client/Classes/Game/Cards/TrapCard.py diff --git a/New_Client/Classes/Game/Cards/__pycache__/Card.cpython-311.pyc b/New_Client/Classes/Game/Cards/__pycache__/Card.cpython-311.pyc new file mode 100644 index 0000000..bbcc627 Binary files /dev/null and b/New_Client/Classes/Game/Cards/__pycache__/Card.cpython-311.pyc differ diff --git a/New_Client/Classes/Game/Cards/__pycache__/MonsterCard.cpython-311.pyc b/New_Client/Classes/Game/Cards/__pycache__/MonsterCard.cpython-311.pyc new file mode 100644 index 0000000..3d1c166 Binary files /dev/null and b/New_Client/Classes/Game/Cards/__pycache__/MonsterCard.cpython-311.pyc differ diff --git a/New_Client/Classes/Game/Cards/__pycache__/SpellCard.cpython-311.pyc b/New_Client/Classes/Game/Cards/__pycache__/SpellCard.cpython-311.pyc new file mode 100644 index 0000000..ad3c56b Binary files /dev/null and b/New_Client/Classes/Game/Cards/__pycache__/SpellCard.cpython-311.pyc differ diff --git a/New_Client/Classes/Game/Cards/__pycache__/TrapCard.cpython-311.pyc b/New_Client/Classes/Game/Cards/__pycache__/TrapCard.cpython-311.pyc new file mode 100644 index 0000000..e01fe77 Binary files /dev/null and b/New_Client/Classes/Game/Cards/__pycache__/TrapCard.cpython-311.pyc differ diff --git a/Game Client/Classes/Game/NetworkEvents/GameStart.py b/New_Client/Classes/Game/NetworkEvents/GameStart.py similarity index 100% rename from Game Client/Classes/Game/NetworkEvents/GameStart.py rename to New_Client/Classes/Game/NetworkEvents/GameStart.py diff --git a/Game Client/Classes/Game/NetworkEvents/Login.py b/New_Client/Classes/Game/NetworkEvents/Login.py similarity index 78% rename from Game Client/Classes/Game/NetworkEvents/Login.py rename to New_Client/Classes/Game/NetworkEvents/Login.py index cf02e46..7eee320 100644 --- a/Game Client/Classes/Game/NetworkEvents/Login.py +++ b/New_Client/Classes/Game/NetworkEvents/Login.py @@ -1,12 +1,11 @@ import json import pygame -from Classes.Engine.TCPClient import TCPClient from Classes.Game.World import World from Classes.Game.Player import Player # event the client sends to let the server know it logged in -def Login(tcpClient:TCPClient): +def Login(tcpClient): payload = { "event":"login", "username": "player", @@ -16,7 +15,8 @@ def Login(tcpClient:TCPClient): tcpClient.send(payload) # server response for login event -def LoginResponse(message:json): +def LoginResponse(message:dict): # checks if the response on the login request is successfull if message["status"] != "success": - print("login failed") \ No newline at end of file + print("login failed") + pass \ No newline at end of file diff --git a/Game Client/Classes/Game/NetworkEvents/PlaceCard.py b/New_Client/Classes/Game/NetworkEvents/PlaceCard.py similarity index 100% rename from Game Client/Classes/Game/NetworkEvents/PlaceCard.py rename to New_Client/Classes/Game/NetworkEvents/PlaceCard.py diff --git a/New_Client/Classes/Game/NetworkEvents/__pycache__/GameStart.cpython-311.pyc b/New_Client/Classes/Game/NetworkEvents/__pycache__/GameStart.cpython-311.pyc new file mode 100644 index 0000000..c7ad626 Binary files /dev/null and b/New_Client/Classes/Game/NetworkEvents/__pycache__/GameStart.cpython-311.pyc differ diff --git a/New_Client/Classes/Game/NetworkEvents/__pycache__/Login.cpython-311.pyc b/New_Client/Classes/Game/NetworkEvents/__pycache__/Login.cpython-311.pyc new file mode 100644 index 0000000..638f90b Binary files /dev/null and b/New_Client/Classes/Game/NetworkEvents/__pycache__/Login.cpython-311.pyc differ diff --git a/New_Client/Classes/Game/NetworkEvents/__pycache__/PlaceCard.cpython-311.pyc b/New_Client/Classes/Game/NetworkEvents/__pycache__/PlaceCard.cpython-311.pyc new file mode 100644 index 0000000..4bea892 Binary files /dev/null and b/New_Client/Classes/Game/NetworkEvents/__pycache__/PlaceCard.cpython-311.pyc differ diff --git a/Game Client/Classes/Game/Player.py b/New_Client/Classes/Game/Player.py similarity index 100% rename from Game Client/Classes/Game/Player.py rename to New_Client/Classes/Game/Player.py diff --git a/New_Client/Classes/Game/World.py b/New_Client/Classes/Game/World.py new file mode 100644 index 0000000..e92c06d --- /dev/null +++ b/New_Client/Classes/Game/World.py @@ -0,0 +1,116 @@ +import pygame +from Classes.Engine.Logger import Logger +from Classes.Engine.Components.BoardField import BoardField +from Classes.Engine.Components.Label import Label +from Classes.Game.Cards.MonsterCard import MonsterCard +from Classes.Game.Cards.SpellCard import SpellCard +from Classes.Game.Cards.TrapCard import TrapCard +from Classes.Engine.InputHandler import InputHandler +from Classes.Game.Player import Player +from Classes.Game.Cards.Card import Card +from Classes.Engine.Utils.Path import PathUtil + +class World(): + __boardFields:list + __player:Player + __enemy:Player + __labels:list + __cards:pygame.sprite.Group() + __PlayerHandCards:pygame.sprite.Group() + __screen:pygame.surface + __cardWidth:int = 150 + __cardHeight:int = 200 + __cardOffset:int = 400 + __logger:Logger + + def __init__(self, logger:Logger, screen:pygame.surface, cardWidth:int=200, cardHeight:int=250, cardOffset:int=400): + self.__logger = logger + + self.__logger.info("initializing world") + self.__boardFields = [] + self.__labels = [] + self.__cards = pygame.sprite.Group() + self.__PlayerHandCards = pygame.sprite.Group() + self.__screen = screen + self.__cardWidth = cardWidth + self.__cardHeight = cardHeight + self.__cardOffset = cardOffset + self.__player = None + self.__enemy = None + self.buildGameWorld() + + def buildGameWorld(self): + # construct elements around the player field + self.__logger.info("building game world") + + # presets the y position later passed down to the vector2 + eRow1Height = 85 + eRow2Height = (self.__cardHeight + 45) + pRow1Height = ((2 * self.__cardHeight) + 75) + pRow2Height = ((2 * self.__cardHeight) + self.__cardHeight + 30) + + self.__labels.append(Label("EnemyHP", self.__screen, "1000 / 1000", pygame.Vector2(15, 75))) + self.__labels.append(Label("EnemyName", self.__screen, "Enemy", pygame.Vector2(15, 45))) + self.__boardFields.append(BoardField("EnemyDeck", "Enemy", "Deck", pygame.Vector2((self.__cardOffset + ((self.__cardWidth + 10) * 0)), eRow1Height), PathUtil.getAbsolutePathTo("Assets/Cards/0/field.png"), "e-deck")) + self.__boardFields.append(BoardField("EnemyGraveyard", "Enemy", "Grave", pygame.Vector2((self.__cardOffset + ((self.__cardWidth + 10) * 0)), eRow2Height), PathUtil.getAbsolutePathTo("Assets/Cards/0/field.png"), "e-grave")) + + self.__labels.append(Label("PlayerHP", self.__screen, "1000 / 1000", pygame.Vector2(20, pRow2Height + 225))) + self.__labels.append(Label("PlayerName", self.__screen, "Player", pygame.Vector2(20, pRow2Height + 195))) + self.__labels.append(Label("Player Mana", self.__screen, "0", pygame.Vector2(20, pRow2Height + 255))) + self.__boardFields.append(BoardField("PlayerDeck", "Player", "Deck", pygame.Vector2((self.__cardOffset + (((self.__cardWidth + 10) - 30 ) * 5)), pRow2Height), PathUtil.getAbsolutePathTo("Assets/Cards/0/field.png"), "P-deck")) + self.__boardFields.append(BoardField("PlayerGraveyard", "Player", "Grave", pygame.Vector2((self.__cardOffset + (((self.__cardWidth + 10) - 30 ) * 5)), pRow1Height), PathUtil.getAbsolutePathTo("Assets/Cards/0/field.png"), "p-grave")) + + # handle field creation + for i in range(5): + self.__boardFields.append(BoardField("PlayerMonsterField-"+str(i), "Player", "Monster", pygame.Vector2((self.__cardOffset + (((self.__cardWidth + 10) - 30) * i)), pRow1Height), PathUtil.getAbsolutePathTo("Assets/Cards/0/field.png"), "pm"+str(id))) + self.__boardFields.append(BoardField("PlayerEffectField-"+str(i), "Player", "Effect", pygame.Vector2((self.__cardOffset + (((self.__cardWidth + 10) - 30) * i)), pRow2Height), PathUtil.getAbsolutePathTo("Assets/Cards/0/field.png"), "pe"+str(id))) + self.__boardFields.append(BoardField("EnemyMonsterField-"+str(i), "Enemy", "Monster", pygame.Vector2((self.__cardOffset + (((self.__cardWidth + 10) - 30) * (i+1)), eRow1Height)), PathUtil.getAbsolutePathTo("Assets/Cards/0/field.png"), "em"+str(id))) + self.__boardFields.append(BoardField("EnemySpellTrapField-"+str(i), "Enemy", "Effect", pygame.Vector2((self.__cardOffset + (((self.__cardWidth + 10) - 30) * (i+1))), eRow2Height), PathUtil.getAbsolutePathTo("Assets/Cards/0/field.png"), "ee"+str(id))) + + def getBoardFields(self) -> list: + return self.__boardFields + + def getLabels(self) -> list: + return self.__labels + + def getCardWidth(self) -> int: + return self.__cardWidth + + def getCardHeight(self) -> int: + return self.__cardHeight + + def getCards(self) -> pygame.sprite.Group: + return self.__cards + + def getHandCards(self) -> pygame.sprite.Group: + return self.__PlayerHandCards + + def getPlayer(self) -> Player: + return self.__player + + def getEnemy(self) -> Player: + return self.__enemy + + def setPlayer(self, player:Player): + for label in self.__labels: + if label.getName() == "PlayerName": + label.setText(player.getName()) + self.__player = player + + def setEnemy(self, player:Player): + for label in self.__labels: + if label.getName() == "EnemyName": + label.setText(player.getName()) + self.__enemy = player + + def spawnCard(self, asset:str, pos:pygame.Vector2, inputHandler:InputHandler, owner:Player) -> Card: + card = Card(pos, asset, inputHandler, owner) + self.__cards.add(card) + return card + + def spawnCards(self, cards:pygame.sprite.Group): + for card in cards: + self.__cards.add(card) + + def AddToPlayerHand(self, Card:Card): + self.__PlayerHandCards.add(Card) \ No newline at end of file diff --git a/New_Client/Classes/Game/__pycache__/Player.cpython-311.pyc b/New_Client/Classes/Game/__pycache__/Player.cpython-311.pyc new file mode 100644 index 0000000..ab1a2f6 Binary files /dev/null and b/New_Client/Classes/Game/__pycache__/Player.cpython-311.pyc differ diff --git a/New_Client/Classes/Game/__pycache__/World.cpython-311.pyc b/New_Client/Classes/Game/__pycache__/World.cpython-311.pyc new file mode 100644 index 0000000..d4f207b Binary files /dev/null and b/New_Client/Classes/Game/__pycache__/World.cpython-311.pyc differ diff --git a/New_Client/__pycache__/App.cpython-311.pyc b/New_Client/__pycache__/App.cpython-311.pyc new file mode 100644 index 0000000..b4f4b15 Binary files /dev/null and b/New_Client/__pycache__/App.cpython-311.pyc differ diff --git a/New_Client/log/aruudvef.log b/New_Client/log/aruudvef.log new file mode 100644 index 0000000..6d420c6 --- /dev/null +++ b/New_Client/log/aruudvef.log @@ -0,0 +1,6 @@ +18:31:53,299 root INFO starting game engine +18:31:53,300 root INFO initializing dependencies +18:31:53,543 root INFO initializing world +18:31:53,545 root INFO building game world +18:31:53,562 root INFO initializing engine Event Handler +18:31:53,562 root INFO attempting to login to server diff --git a/New_Client/log/azkihdia.log b/New_Client/log/azkihdia.log new file mode 100644 index 0000000..3e6a943 --- /dev/null +++ b/New_Client/log/azkihdia.log @@ -0,0 +1,6 @@ +18:35:17,398 root INFO starting game engine +18:35:17,399 root INFO initializing dependencies +18:35:17,647 root INFO initializing world +18:35:17,647 root INFO building game world +18:35:17,664 root INFO initializing engine Event Handler +18:35:17,664 root INFO attempting to login to server diff --git a/New_Client/log/cssmtaso.log b/New_Client/log/cssmtaso.log new file mode 100644 index 0000000..507a8b3 --- /dev/null +++ b/New_Client/log/cssmtaso.log @@ -0,0 +1,6 @@ +18:28:36,740 root INFO starting game engine +18:28:36,740 root INFO initializing dependencies +18:28:36,976 root INFO initializing world +18:28:36,976 root INFO building game world +18:28:36,995 root INFO initializing engine Event Handler +18:28:36,995 root INFO attempting to login to server diff --git a/New_Client/log/dypjnvwx.log b/New_Client/log/dypjnvwx.log new file mode 100644 index 0000000..9c3683e --- /dev/null +++ b/New_Client/log/dypjnvwx.log @@ -0,0 +1,6 @@ +18:24:39,228 root INFO starting game engine +18:24:39,229 root INFO initializing dependencies +18:24:39,473 root INFO initializing world +18:24:39,473 root INFO building game world +18:24:39,489 root INFO initializing engine Event Handler +18:24:39,490 root INFO attempting to login to server diff --git a/New_Client/log/ecnwzwpv.log b/New_Client/log/ecnwzwpv.log new file mode 100644 index 0000000..3f8fd1c --- /dev/null +++ b/New_Client/log/ecnwzwpv.log @@ -0,0 +1,6 @@ +18:24:07,392 root INFO starting game engine +18:24:07,392 root INFO initializing dependencies +18:24:07,636 root INFO initializing world +18:24:07,636 root INFO building game world +18:24:07,653 root INFO initializing engine Event Handler +18:24:07,653 root INFO attempting to login to server diff --git a/New_Client/log/ezuxqfek.log b/New_Client/log/ezuxqfek.log new file mode 100644 index 0000000..a669868 --- /dev/null +++ b/New_Client/log/ezuxqfek.log @@ -0,0 +1,6 @@ +18:34:47,406 root INFO starting game engine +18:34:47,406 root INFO initializing dependencies +18:34:47,651 root INFO initializing world +18:34:47,651 root INFO building game world +18:34:47,668 root INFO initializing engine Event Handler +18:34:47,669 root INFO attempting to login to server diff --git a/New_Client/log/hpyfylsj.log b/New_Client/log/hpyfylsj.log new file mode 100644 index 0000000..3890461 --- /dev/null +++ b/New_Client/log/hpyfylsj.log @@ -0,0 +1,6 @@ +18:15:16,227 root INFO starting game engine +18:15:16,227 root INFO initializing dependencies +18:15:16,469 root INFO initializing world +18:15:16,469 root INFO building game world +18:15:16,486 root INFO initializing engine Event Handler +18:15:16,487 root INFO attempting to login to server diff --git a/New_Client/log/jqqeltiy.log b/New_Client/log/jqqeltiy.log new file mode 100644 index 0000000..abcb170 --- /dev/null +++ b/New_Client/log/jqqeltiy.log @@ -0,0 +1,6 @@ +18:26:41,981 root INFO starting game engine +18:26:41,982 root INFO initializing dependencies +18:26:42,202 root INFO initializing world +18:26:42,202 root INFO building game world +18:26:44,431 root INFO initializing engine Event Handler +18:26:44,431 root INFO attempting to login to server diff --git a/New_Client/log/mhtlvsqm.log b/New_Client/log/mhtlvsqm.log new file mode 100644 index 0000000..5e1a630 --- /dev/null +++ b/New_Client/log/mhtlvsqm.log @@ -0,0 +1,6 @@ +18:03:55,272 root INFO starting game engine +18:03:55,273 root INFO initializing dependencies +18:03:55,522 root INFO initializing world +18:03:55,524 root INFO building game world +18:03:55,541 root INFO initializing engine Event Handler +18:03:55,541 root INFO attempting to login to server diff --git a/New_Client/log/pbwegfvw.log b/New_Client/log/pbwegfvw.log new file mode 100644 index 0000000..85b8c96 --- /dev/null +++ b/New_Client/log/pbwegfvw.log @@ -0,0 +1,4 @@ +18:28:05,511 root INFO starting game engine +18:28:05,512 root INFO initializing dependencies +18:28:05,733 root INFO initializing world +18:28:05,735 root INFO building game world diff --git a/New_Client/log/qqebhbex.log b/New_Client/log/qqebhbex.log new file mode 100644 index 0000000..150872d --- /dev/null +++ b/New_Client/log/qqebhbex.log @@ -0,0 +1,6 @@ +18:12:06,302 root INFO starting game engine +18:12:06,302 root INFO initializing dependencies +18:12:06,552 root INFO initializing world +18:12:06,553 root INFO building game world +18:12:06,570 root INFO initializing engine Event Handler +18:12:06,571 root INFO attempting to login to server diff --git a/New_Client/log/rnwforll.log b/New_Client/log/rnwforll.log new file mode 100644 index 0000000..17f202d --- /dev/null +++ b/New_Client/log/rnwforll.log @@ -0,0 +1,6 @@ +18:26:02,924 root INFO starting game engine +18:26:02,925 root INFO initializing dependencies +18:26:03,152 root INFO initializing world +18:26:03,153 root INFO building game world +18:26:15,219 root INFO initializing engine Event Handler +18:26:15,219 root INFO attempting to login to server diff --git a/New_Client/log/rrffvbhc.log b/New_Client/log/rrffvbhc.log new file mode 100644 index 0000000..8877eee --- /dev/null +++ b/New_Client/log/rrffvbhc.log @@ -0,0 +1,6 @@ +18:31:12,770 root INFO starting game engine +18:31:12,771 root INFO initializing dependencies +18:31:13,6 root INFO initializing world +18:31:13,6 root INFO building game world +18:31:13,23 root INFO initializing engine Event Handler +18:31:13,23 root INFO attempting to login to server diff --git a/New_Client/log/snqncicq.log b/New_Client/log/snqncicq.log new file mode 100644 index 0000000..df03f86 --- /dev/null +++ b/New_Client/log/snqncicq.log @@ -0,0 +1,6 @@ +18:32:14,21 root INFO starting game engine +18:32:14,22 root INFO initializing dependencies +18:32:14,268 root INFO initializing world +18:32:14,268 root INFO building game world +18:32:14,285 root INFO initializing engine Event Handler +18:32:14,285 root INFO attempting to login to server diff --git a/New_Client/log/sstwdlli.log b/New_Client/log/sstwdlli.log new file mode 100644 index 0000000..3142c48 --- /dev/null +++ b/New_Client/log/sstwdlli.log @@ -0,0 +1,6 @@ +18:17:42,689 root INFO starting game engine +18:17:42,689 root INFO initializing dependencies +18:17:42,927 root INFO initializing world +18:17:42,928 root INFO building game world +18:17:42,946 root INFO initializing engine Event Handler +18:17:42,946 root INFO attempting to login to server diff --git a/New_Client/log/vzybrxrc.log b/New_Client/log/vzybrxrc.log new file mode 100644 index 0000000..52e5aed --- /dev/null +++ b/New_Client/log/vzybrxrc.log @@ -0,0 +1,6 @@ +18:25:06,487 root INFO starting game engine +18:25:06,487 root INFO initializing dependencies +18:25:06,730 root INFO initializing world +18:25:06,730 root INFO building game world +18:25:06,748 root INFO initializing engine Event Handler +18:25:06,748 root INFO attempting to login to server diff --git a/New_Client/log/wqfhotaq.log b/New_Client/log/wqfhotaq.log new file mode 100644 index 0000000..825538c --- /dev/null +++ b/New_Client/log/wqfhotaq.log @@ -0,0 +1,6 @@ +18:35:28,383 root INFO starting game engine +18:35:28,383 root INFO initializing dependencies +18:35:28,619 root INFO initializing world +18:35:28,620 root INFO building game world +18:35:28,637 root INFO initializing engine Event Handler +18:35:28,638 root INFO attempting to login to server diff --git a/New_Client/log/xqetosuq.log b/New_Client/log/xqetosuq.log new file mode 100644 index 0000000..9822c82 --- /dev/null +++ b/New_Client/log/xqetosuq.log @@ -0,0 +1,6 @@ +18:28:22,876 root INFO starting game engine +18:28:22,876 root INFO initializing dependencies +18:28:23,117 root INFO initializing world +18:28:23,117 root INFO building game world +18:28:23,134 root INFO initializing engine Event Handler +18:28:23,135 root INFO attempting to login to server diff --git a/New_Client/log/xwrmortx.log b/New_Client/log/xwrmortx.log new file mode 100644 index 0000000..76c0ab5 --- /dev/null +++ b/New_Client/log/xwrmortx.log @@ -0,0 +1,6 @@ +18:14:40,491 root INFO starting game engine +18:14:40,492 root INFO initializing dependencies +18:14:40,714 root INFO initializing world +18:14:40,715 root INFO building game world +18:14:41,59 root INFO initializing engine Event Handler +18:14:41,168 root INFO attempting to login to server diff --git a/New_Client/log/xxfpqmla.log b/New_Client/log/xxfpqmla.log new file mode 100644 index 0000000..3a73195 --- /dev/null +++ b/New_Client/log/xxfpqmla.log @@ -0,0 +1,6 @@ +18:17:28,90 root INFO starting game engine +18:17:28,90 root INFO initializing dependencies +18:17:28,335 root INFO initializing world +18:17:28,336 root INFO building game world +18:17:28,352 root INFO initializing engine Event Handler +18:17:28,352 root INFO attempting to login to server diff --git a/New_Client/log/ysnrngup.log b/New_Client/log/ysnrngup.log new file mode 100644 index 0000000..a45e4ca --- /dev/null +++ b/New_Client/log/ysnrngup.log @@ -0,0 +1,4 @@ +18:30:56,421 root INFO starting game engine +18:30:56,421 root INFO initializing dependencies +18:30:56,654 root INFO initializing world +18:30:56,654 root INFO building game world diff --git a/New_Client/log/zlnfjkpf.log b/New_Client/log/zlnfjkpf.log new file mode 100644 index 0000000..0086ccb --- /dev/null +++ b/New_Client/log/zlnfjkpf.log @@ -0,0 +1,6 @@ +18:14:31,193 root INFO starting game engine +18:14:31,193 root INFO initializing dependencies +18:14:31,416 root INFO initializing world +18:14:31,416 root INFO building game world +18:14:36,438 root INFO initializing engine Event Handler +18:14:36,864 root INFO attempting to login to server diff --git a/New_Client/log/zoukqhzj.log b/New_Client/log/zoukqhzj.log new file mode 100644 index 0000000..4ead003 --- /dev/null +++ b/New_Client/log/zoukqhzj.log @@ -0,0 +1,6 @@ +18:34:33,865 root INFO starting game engine +18:34:33,865 root INFO initializing dependencies +18:34:34,103 root INFO initializing world +18:34:34,104 root INFO building game world +18:34:34,121 root INFO initializing engine Event Handler +18:34:34,121 root INFO attempting to login to server diff --git a/New_Client/log/zpvgppfk.log b/New_Client/log/zpvgppfk.log new file mode 100644 index 0000000..11d7f19 --- /dev/null +++ b/New_Client/log/zpvgppfk.log @@ -0,0 +1,5 @@ +18:37:44,978 root INFO starting game engine +18:37:44,978 root INFO initializing dependencies +18:37:45,225 root INFO initializing world +18:37:45,225 root INFO building game world +18:37:45,242 root INFO logging into server diff --git a/Game Client/main.py b/New_Client/main.py similarity index 59% rename from Game Client/main.py rename to New_Client/main.py index e4e3cba..ec7ad0e 100644 --- a/Game Client/main.py +++ b/New_Client/main.py @@ -1,9 +1,11 @@ from App import App from Classes.Engine.Logger import Logger from Classes.Engine.Utils.StringUtils import StringUtils +from Classes.Engine.Utils.Path import PathUtil if __name__ == "__main__": - logger = Logger("log/"+StringUtils.get_random_string(8)+".log") + + logger = Logger(PathUtil.getAbsolutePathTo("log/"+StringUtils.get_random_string(8)+".log")) logger.info("starting game engine") game = App(logger) \ No newline at end of file diff --git a/OLD_Server/.env b/OLD_Server/.env new file mode 100644 index 0000000..56fba80 --- /dev/null +++ b/OLD_Server/.env @@ -0,0 +1,4 @@ +HOST="127.0.0.1" +TCPPORT=54322 +UDPPORT=54323 +ENV="DEV" \ No newline at end of file diff --git a/OLD_Server/.vscode/settings.json b/OLD_Server/.vscode/settings.json new file mode 100644 index 0000000..1341321 --- /dev/null +++ b/OLD_Server/.vscode/settings.json @@ -0,0 +1,14 @@ +{ + "cSpell.words": [ + "DGRAM" + ], + "cSpell.ignoreWords": [ + "activateeffectcard", + "activatemonstereffect", + "attackcard", + "attackplayer", + "movecard", + "placecard", + "removecard" + ] +} \ No newline at end of file diff --git a/OLD_Server/Assets/Arenas/default.png b/OLD_Server/Assets/Arenas/default.png new file mode 100644 index 0000000..ba5da22 Binary files /dev/null and b/OLD_Server/Assets/Arenas/default.png differ diff --git a/OLD_Server/Assets/Cards/Arena/field.png b/OLD_Server/Assets/Cards/Arena/field.png new file mode 100644 index 0000000..472f0a1 Binary files /dev/null and b/OLD_Server/Assets/Cards/Arena/field.png differ diff --git a/OLD_Server/Assets/Cards/MonsterCards/testmonstercard/card.json b/OLD_Server/Assets/Cards/MonsterCards/testmonstercard/card.json new file mode 100644 index 0000000..0df2ece --- /dev/null +++ b/OLD_Server/Assets/Cards/MonsterCards/testmonstercard/card.json @@ -0,0 +1,22 @@ +{ + "id": 1, + "name": "Test Monster", + "image": "Assets/Cards/testmonstercard/cards.png", + "description": "can attack other monsters", + "costs": 30, + "defense": 40, + "attacks":[ + { + "id": 1, + "name":"test attack", + "description": "can attack another Monster", + "damage": 80 + }, + { + "id": 2, + "name":"test attack", + "description": "can attack another Monster", + "damage": 80 + } + ] +} diff --git a/OLD_Server/Assets/Cards/MonsterCards/testmonstercard/card.png b/OLD_Server/Assets/Cards/MonsterCards/testmonstercard/card.png new file mode 100644 index 0000000..320d60d Binary files /dev/null and b/OLD_Server/Assets/Cards/MonsterCards/testmonstercard/card.png differ diff --git a/OLD_Server/Assets/Cards/SpeelCards/testspellcard/artworkjson.png b/OLD_Server/Assets/Cards/SpeelCards/testspellcard/artworkjson.png new file mode 100644 index 0000000..9955a0c Binary files /dev/null and b/OLD_Server/Assets/Cards/SpeelCards/testspellcard/artworkjson.png differ diff --git a/OLD_Server/Assets/Cards/SpeelCards/testspellcard/testspellcard.json b/OLD_Server/Assets/Cards/SpeelCards/testspellcard/testspellcard.json new file mode 100644 index 0000000..51d4083 --- /dev/null +++ b/OLD_Server/Assets/Cards/SpeelCards/testspellcard/testspellcard.json @@ -0,0 +1,6 @@ +{ + "name": "testspell", + "image":"Assets/Cards/testspelltcard/artwork.png", + "costs": 30, + "description":"this is a test spell card" +} \ No newline at end of file diff --git a/OLD_Server/Assets/Cards/TrapCards/testtrapcard/artworkjson.png b/OLD_Server/Assets/Cards/TrapCards/testtrapcard/artworkjson.png new file mode 100644 index 0000000..9955a0c Binary files /dev/null and b/OLD_Server/Assets/Cards/TrapCards/testtrapcard/artworkjson.png differ diff --git a/OLD_Server/Assets/Cards/TrapCards/testtrapcard/testtrapcard.json b/OLD_Server/Assets/Cards/TrapCards/testtrapcard/testtrapcard.json new file mode 100644 index 0000000..6d1cd5a --- /dev/null +++ b/OLD_Server/Assets/Cards/TrapCards/testtrapcard/testtrapcard.json @@ -0,0 +1,6 @@ +{ + "name": "testtrap", + "image":"Assets/Cards/testtrapcard/artwork.png", + "costs": 30, + "description":"this is a test tryp card" +} \ No newline at end of file diff --git a/OLD_Server/Classes/Game/Player.py b/OLD_Server/Classes/Game/Player.py new file mode 100644 index 0000000..2d337be --- /dev/null +++ b/OLD_Server/Classes/Game/Player.py @@ -0,0 +1,57 @@ +import random + + +class Player: + __id:int + __hp:int + __mana:int + __name:str + __handCards:list + __deck:list + + def __init__(self, name:str, deck:list, hp:int=1000, mana:int=0): + self.__hp = hp + self.__mana = mana + self.__name = name + self.__handCards = [] + self.__deck = deck + self.__id = random.randint(3, 99999) + + def shuffleDeck(self): + self.__deck = random.shuffle(self.__deck) + + def getDeck(self) -> list: + return self.__deck + + def getName(self) -> str: + return self.__name + + def getHP(self) -> int: + return self.__hp + + def adjustHP(self, hp:int) -> int: + self.__hp = self.__hp + hp + + def getID(self) -> int: + return self.__id + + def getHand(self) -> list: + return self.__handCards + + def getMana(self) -> int: + return self.__mana + + def addMana(self, amount) -> int: + self.__mana + amount + return self.__mana + + def AddToHand(self, card) -> list: + self.__handCards.append(card) + return self.__handCards + + def setHand(self, hand:list): + self.__handCards = hand + + def removeFromHand(self, pos:int) -> list: + self.__handCards.remove(pos) + return self.__handCards \ No newline at end of file diff --git a/OLD_Server/Classes/Game/__pycache__/Player.cpython-311.pyc b/OLD_Server/Classes/Game/__pycache__/Player.cpython-311.pyc new file mode 100644 index 0000000..2c346f1 Binary files /dev/null and b/OLD_Server/Classes/Game/__pycache__/Player.cpython-311.pyc differ diff --git a/OLD_Server/Classes/Game/__pycache__/Player.cpython-312.pyc b/OLD_Server/Classes/Game/__pycache__/Player.cpython-312.pyc new file mode 100644 index 0000000..2da2dba Binary files /dev/null and b/OLD_Server/Classes/Game/__pycache__/Player.cpython-312.pyc differ diff --git a/OLD_Server/Classes/System/GameManager.py b/OLD_Server/Classes/System/GameManager.py new file mode 100644 index 0000000..f3a19b8 --- /dev/null +++ b/OLD_Server/Classes/System/GameManager.py @@ -0,0 +1,137 @@ +import json +import socket +from Classes.Game.Player import Player + + +class GameManager: + __players:dict + __playingPlayer:Player + __state:str + __round:str + __cards:list + + def __init__(self, logger): + self.__players = {} + self.__playingPlayer = None + self.__state = "waiting" + self.__round = "none" + self.logger = logger + self.__cards = [] + pass + + def getLogger(self): + return self.logger + + # card management + def spawnCard(self, card, owner, x, y): + self.logger("spawning card") + + self.__cards.append(card) + + payload = { + "event":"PlacedCard", + "owner": owner, + "card": card, + "x": x, + "y": y, + } + + for userAddr in self.__players.keys(): + self.logger.info(f"send to client {self.__players[userAddr]['player'].getID() != owner}") + if self.__players[userAddr]["player"].getID() != owner: + self.__players[userAddr]["socket"].send(json.dumps(payload).encode()) + + # game round management + # this section manages the flow of rounds this should inherit itself + # ============================================================================= + + # this function iterates all + def progressRound(self): + # phases + # - playerPrep => playing player switches, gets a mana point and gets verified + if self.__playingPlayer != None: + for player in self.__players: + if self.__playingPlayer != player: + self.__playingPlayer = player + else: + self.__playingPlayer = next(iter(self.__players)) + # - playerDraw => player draws a card + # - playerPlay => player can place cards and active effects + # - playerEnd => player ends his turn and the code reiterates with the remaining player + pass + + # game state management + # this section mostly only used by the networking and event handling classes + # other parts should never need to interface with this unless really required + # ============================================================================= + def startGame(self, tcpSocket:socket): + self.__state = "running" + + players = list(self.__players.values()) + + print("game starts") + self.logger.info("game manager is starting the game") + for userAddr, player_data in self.__players.items(): + try: + user = self.__players[userAddr]["player"] + user.addMana(1000) + user.adjustHP(1000) + user.shuffleDeck() + cards = self.__players[userAddr]["deck"] + user.setHand(cards[:5]) + + # iterates until the enemy player is not anymore equal to current player + enemy = next(player_data["player"] for player_data in players if player_data["player"] != user) + + payload = { + "event": "startgame", + "player": { + "mana": user.getMana(), + "hp": user.getHP(), + "hand": user.getHand() + }, + "enemy": { + "id": enemy.getID(), + "name": enemy.getName(), + "hp": enemy.getHP(), + }, + } + + tcpSocket.send(json.dumps(payload).encode()) + except Exception as e: + self.logger.error(f"failed to start game due to error: {e}") + break + # handles notifying all players that the game starts + pass + + def stopGame(self): + # handles notifying all players that the game stops + # handles stoping the game itself and notifies server to stop itself + pass + + # player management + # the network manager will create a player instance + # ============================================================= + + # gets all player known to the game manager and returns them + def getPlayers(self) -> dict: + return self.__players + + # creates a player and handles counting all players and if conditions met starting the game + # returns the new dict in which the new player now is added + def addPlayers(self, player:Player, socket:socket, clientAddr, deck) -> dict: + + self.logger.info(f"creating user with id: {player.getID}") + self.__players[clientAddr] = { + "player": player, + "deck": deck, + "socket":socket + } + self.logger.info(f"new length of user dictionary: {len(self.__players)}") + + # counts participating players and starts the game if enough have joined + if len(self.__players) == 2: + self.logger.info("2 players have join game starts") + self.startGame(socket) + + return self.__players \ No newline at end of file diff --git a/OLD_Server/Classes/System/Logger.py b/OLD_Server/Classes/System/Logger.py new file mode 100644 index 0000000..b548160 --- /dev/null +++ b/OLD_Server/Classes/System/Logger.py @@ -0,0 +1,18 @@ +import logging + + +class Logger: + def __init__(self, filename): + logging.basicConfig(filename=filename, + filemode='a', + format='%(asctime)s,%(msecs)d %(name)s %(levelname)s %(message)s', + datefmt='%H:%M:%S', + level=logging.DEBUG) + + def info(self, message): + print(message) + logging.info(message) + + def error(self, message): + print(message) + logging.error(message) \ No newline at end of file diff --git a/OLD_Server/Classes/System/Network/EventHandler.py b/OLD_Server/Classes/System/Network/EventHandler.py new file mode 100644 index 0000000..6cca201 --- /dev/null +++ b/OLD_Server/Classes/System/Network/EventHandler.py @@ -0,0 +1,32 @@ +import socket +from Classes.Game.Player import Player +from Classes.System.GameManager import GameManager + +from Classes.System.World import World + + +class TCPEventHandler: + __tcpSocket:socket + + def __init__(self, socket:socket): + self.__tcpSocket = socket + + # handles passing of event data to the right functions + def handleTCPEvents(self, event, gameManager:GameManager, address): + gameManager.getLogger().info(f"incommingevent {event}") + if event["event"] == "placecard": + gameManager.spawnCard(event["card"], event["user"], event["x"], event["y"]) + pass + elif event["event"] == "MoveCard": + pass + elif event["event"] == "RemoveCard": + pass + elif event["event"] == "AttackCard": + pass + elif event["event"] == "AttackPlayer": + pass + elif event["event"] == "ActivateEffectCard": + pass + elif event["event"] == "ActivateMonsterCard": + pass + pass \ No newline at end of file diff --git a/OLD_Server/Classes/System/Network/NetworkManger.py b/OLD_Server/Classes/System/Network/NetworkManger.py new file mode 100644 index 0000000..a08faa6 --- /dev/null +++ b/OLD_Server/Classes/System/Network/NetworkManger.py @@ -0,0 +1,142 @@ +import json +import signal +import socket +import sys +import threading +from Classes.Game.Player import Player +from Classes.System.GameManager import GameManager + +from Classes.System.Network.EventHandler import TCPEventHandler +from Classes.System.World import World + +class NetworkManager: + class TCP: + __Addr:str + __Port:str + __BufferSize:int = 1024 + __tcpSocket:socket + __eventHandler: dict + __users: dict + __TCPClientThread:threading.Thread + __gameManager:GameManager + + def __init__(self, Addr:str, Port:str, gameManager:GameManager): + gameManager.getLogger().info("starting up network manager") + + self.running = True + self.__Addr = Addr + self.__Port = int(Port) + self.__gameManager = gameManager + self.__eventHandler = {} + + gameManager.getLogger().info("starting up tcp server") + self.__tcpSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + self.__tcpSocket.bind((self.__Addr, self.__Port)) + self.__tcpSocket.listen() + + gameManager.getLogger().info("starting up thread for client socket accepting") + self.__TCPClientThread = threading.Thread(target=self.accept_connections) + self.__TCPClientThread.daemon = True + self.__TCPClientThread.start() + + def accept_connections(self): + while self.running: + try: + client_tcp_socket, client_address = self.__tcpSocket.accept() + self.__gameManager.getLogger().info(f"Connected with {client_address}") + self.__gameManager.getPlayers()[client_address] = client_tcp_socket + self.__eventHandler[client_address] = TCPEventHandler(client_tcp_socket) + + client_handler_thread = threading.Thread( + target=self.receive, + args=(client_tcp_socket, client_address) + ) + + self.__gameManager.getLogger().info(f"starting client handler thread for client at address {client_address}") + client_handler_thread.daemon = True + client_handler_thread.start() + + except Exception as e: + self.__gameManager.getLogger().error(f"tcp socket failed to accept connection due to error: {e}") + pass + client_handler_thread.join() + + def receive(self, client_socket, client_address): + while self.running: + try: + data = client_socket.recv(self.__BufferSize) + if not data: + self.__gameManager.getLogger().info(f"Connection with {client_address} closed.") + break + + try: + + message = data.decode() + messageJson = json.loads(message) + self.__gameManager.getLogger().info(f"decoded message {messageJson}") + user = messageJson.get("user") + self.__gameManager.getLogger().info(f"user in message {user}") + + except Exception as ex: + self.__gameManager.getLogger().info(f"decoding incoming packet failed due to exception: {ex}") + + # creates a user and counts how many currently are connected to the server + # if enough users for a round are connected the server has to start the game + if user not in self.__gameManager.getPlayers(): + if messageJson["event"] == "login": + self.__gameManager.getLogger().info("user logging in") + self.__gameManager.getLogger().info("task passed off to gameManager") + user = self.__gameManager.addPlayers(Player(messageJson["username"], messageJson["deck"]), client_socket, client_address, messageJson["deck"]) + self.__gameManager.getLogger().info(f"connected users {len(self.__gameManager.getPlayers())}") + + self.__gameManager.getLogger().info(f"confirming login for user") + self.send({ + "event":"loginresponse", + "status": "success", + "id": user[client_address]["player"].getID(), + "name": user[client_address]["player"].getName() + }, client_address) + + self.__eventHandler[client_address].handleTCPEvents(messageJson, self.__gameManager, client_address) + self.__gameManager.getLogger().info(f"Received message from {client_address}: {message}") + + except socket.error as e: + + if e.errno == 10054: + self.__gameManager.getLogger().error(f"Connection with {client_address} forcibly closed by remote host.") + break + + self.__gameManager.getLogger().error(f"Socket error receiving data from {client_address}: {e}") + + except json.JSONDecodeError as e: + self.__gameManager.getLogger().error(f"JSON decoding error receiving data from {client_address}: {e}") + + # except Exception as e: + # self.__gameManager.getLogger().error(f"UknownError receiving data from {client_address} due to error: {e}") + + def broadcast(self, payload:dict): + for user in self.__gameManager.getPlayers().values(): + user["socket"].send(json.dumps(payload).encode()) + + def send(self, payload: dict, user: str): + players = self.__gameManager.getPlayers() + + if user in players and "socket" in players[user]: + players[user]["socket"].send(json.dumps(payload).encode()) + else: + self.__gameManager.getLogger().error(f"user '{user}' or socket was not found 'socket' failed to send data.") + + def stop(self): + self.__TCPClientThread.join() # Wait for the thread to finish before exiting + + tcp: TCP + # udp: UDP + + def __init__(self, Addr:str, TCPPort:str, UDPPort:str, gameManager:GameManager): + self.tcp = self.TCP(Addr, TCPPort, gameManager) + signal.signal(signal.SIGINT, self.handle_interrupt) # Register the signal handler + + def handle_interrupt(self, signum, frame): + self.__gameManager.getLogger().info("Received keyboard interrupt. Stopping the server.") + self.tcp().stop() + sys.exit(0) \ No newline at end of file diff --git a/OLD_Server/Classes/System/Network/__pycache__/EventHandler.cpython-311.pyc b/OLD_Server/Classes/System/Network/__pycache__/EventHandler.cpython-311.pyc new file mode 100644 index 0000000..8e128bb Binary files /dev/null and b/OLD_Server/Classes/System/Network/__pycache__/EventHandler.cpython-311.pyc differ diff --git a/OLD_Server/Classes/System/Network/__pycache__/EventHandler.cpython-312.pyc b/OLD_Server/Classes/System/Network/__pycache__/EventHandler.cpython-312.pyc new file mode 100644 index 0000000..fc97bd5 Binary files /dev/null and b/OLD_Server/Classes/System/Network/__pycache__/EventHandler.cpython-312.pyc differ diff --git a/OLD_Server/Classes/System/Network/__pycache__/NetworkManger.cpython-311.pyc b/OLD_Server/Classes/System/Network/__pycache__/NetworkManger.cpython-311.pyc new file mode 100644 index 0000000..a79516b Binary files /dev/null and b/OLD_Server/Classes/System/Network/__pycache__/NetworkManger.cpython-311.pyc differ diff --git a/OLD_Server/Classes/System/Network/__pycache__/NetworkManger.cpython-312.pyc b/OLD_Server/Classes/System/Network/__pycache__/NetworkManger.cpython-312.pyc new file mode 100644 index 0000000..4845ff9 Binary files /dev/null and b/OLD_Server/Classes/System/Network/__pycache__/NetworkManger.cpython-312.pyc differ diff --git a/OLD_Server/Classes/System/PlayerManager.py b/OLD_Server/Classes/System/PlayerManager.py new file mode 100644 index 0000000..e149622 --- /dev/null +++ b/OLD_Server/Classes/System/PlayerManager.py @@ -0,0 +1,23 @@ +import json +class Player: + + def createUser(self, user:json): + self.__users.append(user) + + def createUser(self, user:json): + if self.getUser(user["username"]) == None: + self.__users.append(Player(user["username"])) + + def removeUser(self, user:int): + self.__users.remove(user) + + def removeUser(self, user:str): + self.__users.remove(user) + + def getUsers(self) -> list: + return self.__users + + def getUser(self, user:int): + for user in self.__users: + if int(user["id"]) == user: + return user \ No newline at end of file diff --git a/OLD_Server/Classes/System/QueueManager.py b/OLD_Server/Classes/System/QueueManager.py new file mode 100644 index 0000000..be82662 --- /dev/null +++ b/OLD_Server/Classes/System/QueueManager.py @@ -0,0 +1,34 @@ + + +from Classes.Game.Player import Player + + +class QueueManager: + __queue:list + + def __init__(self): + self.__queue = [] + + def getQueue(self) -> list: + return self.__queue + + def addToQueue(self, user) -> list: + if self.isInQueue(user["id"]): + self.__queue.append(user) + return self.__queue + + def removeFromQueue(self, player:Player) -> list: + self.__queue.remove(player) + return self.__queue + + def isInQueue(self, user:int) -> bool: + for user in self.__queue: + if int(user["id"]) == user: + return True + return False + + def isInQueue(self, user:str) -> bool: + for user in self.__queue: + if user["username"] == user: + return True + return False \ No newline at end of file diff --git a/OLD_Server/Classes/System/Server.py b/OLD_Server/Classes/System/Server.py new file mode 100644 index 0000000..c3485db --- /dev/null +++ b/OLD_Server/Classes/System/Server.py @@ -0,0 +1,40 @@ +import json +import socket +import threading +from Classes.System.GameManager import GameManager + +from Classes.System.Network.NetworkManger import NetworkManager +from Classes.System.PlayerManager import Player +from Classes.System.World import World +from Classes.System.Logger import Logger + +class Server: + + __address:str + __tcpPort:str + __udpPort:str + __world:World + __gameManager:GameManager + + networkManager:NetworkManager + + def __init__(self, address:str, tcpPort:str, udpPort:str, logger:Logger): + self.__address = address + self.__tcpPort = tcpPort + self.__udpPort = udpPort + self.__world = World() + self.logger = logger + + self.logger.info("starting up game manager") + self.__gameManager = GameManager(logger) + + self.logger.info("preparing to start server") + self.startServer(self.__gameManager) + + # handles starting the server and assigning socket values to the local reference + def startServer(self, gameManager:GameManager): + self.logger.info("starting up network manager") + self.__networkManager = NetworkManager(self.__address, self.__tcpPort, self.__udpPort, gameManager) + + def getNetworkManager(self) -> NetworkManager: + return self.__networkManager \ No newline at end of file diff --git a/OLD_Server/Classes/System/Utils/Path.py b/OLD_Server/Classes/System/Utils/Path.py new file mode 100644 index 0000000..a274f43 --- /dev/null +++ b/OLD_Server/Classes/System/Utils/Path.py @@ -0,0 +1,6 @@ +import os + + +class PathUtil: + def getAbsolutePathTo(notAbsolutPath:str) -> str: + return os.path.abspath("OLD_Server/" + notAbsolutPath) \ No newline at end of file diff --git a/OLD_Server/Classes/System/Utils/StringUtils.py b/OLD_Server/Classes/System/Utils/StringUtils.py new file mode 100644 index 0000000..e4d02a1 --- /dev/null +++ b/OLD_Server/Classes/System/Utils/StringUtils.py @@ -0,0 +1,11 @@ +import random +import string + + +class StringUtils: + def get_random_string(length) -> str: + # choose from all lowercase letter + letters = string.ascii_lowercase + result_str = ''.join(random.choice(letters) for i in range(length)) + print("Random string of length", length, "is:", result_str) + return result_str diff --git a/OLD_Server/Classes/System/Utils/__pycache__/Path.cpython-311.pyc b/OLD_Server/Classes/System/Utils/__pycache__/Path.cpython-311.pyc new file mode 100644 index 0000000..9fdc487 Binary files /dev/null and b/OLD_Server/Classes/System/Utils/__pycache__/Path.cpython-311.pyc differ diff --git a/OLD_Server/Classes/System/Utils/__pycache__/StringUtils.cpython-311.pyc b/OLD_Server/Classes/System/Utils/__pycache__/StringUtils.cpython-311.pyc new file mode 100644 index 0000000..4052b1a Binary files /dev/null and b/OLD_Server/Classes/System/Utils/__pycache__/StringUtils.cpython-311.pyc differ diff --git a/OLD_Server/Classes/System/World.py b/OLD_Server/Classes/System/World.py new file mode 100644 index 0000000..f6b2957 --- /dev/null +++ b/OLD_Server/Classes/System/World.py @@ -0,0 +1,20 @@ +import socket +from Classes.Game.Player import Player + + +class World: + __players:dict + + def __init__(self): + self.__players = {} + + def getPlayers(self) -> list: + return self.__players + + def addPlayers(self, player:Player, socket:socket, clientAddr) -> list: + self.__players[clientAddr] = { + player: player, + socket:socket + } + + return self.__players \ No newline at end of file diff --git a/OLD_Server/Classes/System/__pycache__/GameManager.cpython-311.pyc b/OLD_Server/Classes/System/__pycache__/GameManager.cpython-311.pyc new file mode 100644 index 0000000..240b40b Binary files /dev/null and b/OLD_Server/Classes/System/__pycache__/GameManager.cpython-311.pyc differ diff --git a/OLD_Server/Classes/System/__pycache__/GameManager.cpython-312.pyc b/OLD_Server/Classes/System/__pycache__/GameManager.cpython-312.pyc new file mode 100644 index 0000000..963cabf Binary files /dev/null and b/OLD_Server/Classes/System/__pycache__/GameManager.cpython-312.pyc differ diff --git a/OLD_Server/Classes/System/__pycache__/Logger.cpython-311.pyc b/OLD_Server/Classes/System/__pycache__/Logger.cpython-311.pyc new file mode 100644 index 0000000..7dc2efc Binary files /dev/null and b/OLD_Server/Classes/System/__pycache__/Logger.cpython-311.pyc differ diff --git a/OLD_Server/Classes/System/__pycache__/Logger.cpython-312.pyc b/OLD_Server/Classes/System/__pycache__/Logger.cpython-312.pyc new file mode 100644 index 0000000..ac8ea48 Binary files /dev/null and b/OLD_Server/Classes/System/__pycache__/Logger.cpython-312.pyc differ diff --git a/OLD_Server/Classes/System/__pycache__/PlayerManager.cpython-311.pyc b/OLD_Server/Classes/System/__pycache__/PlayerManager.cpython-311.pyc new file mode 100644 index 0000000..b43d1ec Binary files /dev/null and b/OLD_Server/Classes/System/__pycache__/PlayerManager.cpython-311.pyc differ diff --git a/OLD_Server/Classes/System/__pycache__/PlayerManager.cpython-312.pyc b/OLD_Server/Classes/System/__pycache__/PlayerManager.cpython-312.pyc new file mode 100644 index 0000000..fccebea Binary files /dev/null and b/OLD_Server/Classes/System/__pycache__/PlayerManager.cpython-312.pyc differ diff --git a/OLD_Server/Classes/System/__pycache__/Server.cpython-311.pyc b/OLD_Server/Classes/System/__pycache__/Server.cpython-311.pyc new file mode 100644 index 0000000..9c11ea7 Binary files /dev/null and b/OLD_Server/Classes/System/__pycache__/Server.cpython-311.pyc differ diff --git a/OLD_Server/Classes/System/__pycache__/Server.cpython-312.pyc b/OLD_Server/Classes/System/__pycache__/Server.cpython-312.pyc new file mode 100644 index 0000000..7700f63 Binary files /dev/null and b/OLD_Server/Classes/System/__pycache__/Server.cpython-312.pyc differ diff --git a/OLD_Server/Classes/System/__pycache__/World.cpython-311.pyc b/OLD_Server/Classes/System/__pycache__/World.cpython-311.pyc new file mode 100644 index 0000000..a74158d Binary files /dev/null and b/OLD_Server/Classes/System/__pycache__/World.cpython-311.pyc differ diff --git a/OLD_Server/Classes/System/__pycache__/World.cpython-312.pyc b/OLD_Server/Classes/System/__pycache__/World.cpython-312.pyc new file mode 100644 index 0000000..e427115 Binary files /dev/null and b/OLD_Server/Classes/System/__pycache__/World.cpython-312.pyc differ diff --git a/OLD_Server/index.py b/OLD_Server/index.py new file mode 100644 index 0000000..27fd861 --- /dev/null +++ b/OLD_Server/index.py @@ -0,0 +1,31 @@ +import logging +import os +import random +import string +import sys + +from Classes.System.Server import Server +from Classes.System.Logger import Logger +from Classes.System.Utils.Path import PathUtil + +def get_random_string(length) -> str: + # choose from all lowercase letter + letters = string.ascii_lowercase + result_str = ''.join(random.choice(letters) for i in range(length)) + print("Random string of length", length, "is:", result_str) + return result_str + +def main(): + # retrieves host data from environment + HOST = "127.0.0.1" + TCPPORT = "54322" + UDPPORT = "54323" + + logger = Logger(PathUtil.getAbsolutePathTo("log/"+get_random_string(8)+".log")) + logger.info("starting up server") + server = Server(HOST, TCPPORT, UDPPORT, logging) + server.getNetworkManager().tcp.stop() + sys.exit(0) + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/OLD_Server/log/jopxlbza.log b/OLD_Server/log/jopxlbza.log new file mode 100644 index 0000000..c904742 --- /dev/null +++ b/OLD_Server/log/jopxlbza.log @@ -0,0 +1,28 @@ +21:35:45,88 root INFO starting up server +21:35:45,89 root INFO starting up game manager +21:35:45,89 root INFO preparing to start server +21:35:45,89 root INFO starting up network manager +21:35:45,89 root INFO starting up network manager +21:35:45,89 root INFO starting up tcp server +21:35:45,89 root INFO starting up thread for client socket accepting +21:35:51,856 root INFO Connected with ('127.0.0.1', 49747) +21:35:51,856 root INFO starting client handler thread for client at address ('127.0.0.1', 49747) +21:35:51,859 root INFO decoded message {'event': 'login', 'username': 'player', 'deck': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]} +21:35:51,860 root INFO user in message None +21:35:51,861 root INFO user logging in +21:35:51,861 root INFO task passed off to gameManager +21:35:51,861 root INFO creating user with id: > +21:35:56,111 root INFO new length of user dictionary: 1 +21:36:08,506 root INFO connected users 1 +21:36:08,506 root INFO confirming login for user +21:36:08,507 root INFO incommingevent {'event': 'login', 'username': 'player', 'deck': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]} +21:36:08,507 root INFO Received message from ('127.0.0.1', 49747): {"event": "login", "username": "player", "deck": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]} +21:37:40,56 root INFO Connected with ('127.0.0.1', 49795) +21:37:40,56 root INFO starting client handler thread for client at address ('127.0.0.1', 49795) +21:37:40,57 root INFO decoded message {'event': 'login', 'username': 'player', 'deck': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]} +21:37:40,58 root INFO user in message None +21:37:40,58 root INFO user logging in +21:37:40,58 root INFO task passed off to gameManager +21:37:40,58 root INFO creating user with id: > +21:37:43,614 root INFO new length of user dictionary: 2 +21:37:50,2 root INFO 2 players have join game starts diff --git a/OLD_Server/log/jsrrepta.log b/OLD_Server/log/jsrrepta.log new file mode 100644 index 0000000..62fc73f --- /dev/null +++ b/OLD_Server/log/jsrrepta.log @@ -0,0 +1,28 @@ +21:02:55,541 root INFO starting up server +21:02:55,542 root INFO starting up game manager +21:02:55,542 root INFO preparing to start server +21:02:55,542 root INFO starting up network manager +21:02:55,543 root INFO starting up network manager +21:02:55,543 root INFO starting up tcp server +21:02:55,543 root INFO starting up thread for client socket accepting +21:03:03,608 root INFO Connected with ('127.0.0.1', 65384) +21:03:03,609 root INFO starting client handler thread for client at address ('127.0.0.1', 65384) +21:03:03,610 root INFO decoded message {'event': 'login', 'username': 'player', 'deck': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]} +21:03:03,613 root INFO user in message None +21:03:03,613 root INFO user logging in +21:03:03,613 root INFO task passed off to gameManager +21:03:03,613 root INFO creating user with id: > +21:03:03,613 root INFO new length of user dictionary: 1 +21:03:03,613 root INFO connected users 1 +21:03:03,613 root INFO confirming login for user +21:03:03,614 root INFO incommingevent {'event': 'login', 'username': 'player', 'deck': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]} +21:03:03,614 root INFO Received message from ('127.0.0.1', 65384): {"event": "login", "username": "player", "deck": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]} +21:03:21,850 root INFO Connected with ('127.0.0.1', 65399) +21:03:21,850 root INFO starting client handler thread for client at address ('127.0.0.1', 65399) +21:03:21,852 root INFO decoded message {'event': 'login', 'username': 'player', 'deck': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]} +21:03:21,852 root INFO user in message None +21:03:21,852 root INFO user logging in +21:03:21,852 root INFO task passed off to gameManager +21:03:21,852 root INFO creating user with id: > +21:03:21,852 root INFO new length of user dictionary: 2 +21:03:21,852 root INFO 2 players have join game starts diff --git a/OLD_Server/log/kawhnrji.log b/OLD_Server/log/kawhnrji.log new file mode 100644 index 0000000..8a5fbfd --- /dev/null +++ b/OLD_Server/log/kawhnrji.log @@ -0,0 +1,32 @@ +22:18:28,492 root INFO starting up server +22:18:28,493 root INFO starting up game manager +22:18:28,493 root INFO preparing to start server +22:18:28,493 root INFO starting up network manager +22:18:28,493 root INFO starting up network manager +22:18:28,493 root INFO starting up tcp server +22:18:28,493 root INFO starting up thread for client socket accepting +22:18:33,537 root INFO Connected with ('127.0.0.1', 50893) +22:18:33,537 root INFO starting client handler thread for client at address ('127.0.0.1', 50893) +22:18:33,539 root INFO decoded message {'event': 'login', 'username': 'player', 'deck': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]} +22:18:33,540 root INFO user in message None +22:18:36,99 root INFO user logging in +22:18:36,131 root INFO task passed off to gameManager +22:18:36,195 root INFO creating user with id: > +22:18:36,427 root INFO new length of user dictionary: 1 +22:18:36,454 root INFO connected users 1 +22:18:36,467 root INFO confirming login for user +22:18:37,23 root INFO incommingevent {'event': 'login', 'username': 'player', 'deck': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]} +22:18:37,87 root INFO Received message from ('127.0.0.1', 50893): {"event": "login", "username": "player", "deck": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]} +22:18:42,538 root INFO Connected with ('127.0.0.1', 50897) +22:18:42,538 root INFO starting client handler thread for client at address ('127.0.0.1', 50897) +22:18:42,540 root INFO decoded message {'event': 'login', 'username': 'player', 'deck': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]} +22:18:42,540 root INFO user in message None +22:18:44,273 root INFO user logging in +22:18:44,305 root INFO task passed off to gameManager +22:18:44,369 root INFO creating user with id: > +22:18:44,475 root INFO new length of user dictionary: 2 +22:18:45,389 root INFO 2 players have join game starts +22:18:47,378 root INFO connected users 2 +22:18:47,410 root INFO confirming login for user +22:18:47,948 root INFO incommingevent {'event': 'login', 'username': 'player', 'deck': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]} +22:18:48,11 root INFO Received message from ('127.0.0.1', 50897): {"event": "login", "username": "player", "deck": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]} diff --git a/OLD_Server/log/olchcxfi.log b/OLD_Server/log/olchcxfi.log new file mode 100644 index 0000000..119245f --- /dev/null +++ b/OLD_Server/log/olchcxfi.log @@ -0,0 +1,33 @@ +22:30:19,522 root INFO starting up server +22:30:19,523 root INFO starting up game manager +22:30:19,523 root INFO preparing to start server +22:30:19,523 root INFO starting up network manager +22:30:19,523 root INFO starting up network manager +22:30:19,523 root INFO starting up tcp server +22:30:19,523 root INFO starting up thread for client socket accepting +22:30:25,764 root INFO Connected with ('127.0.0.1', 51190) +22:30:25,765 root INFO starting client handler thread for client at address ('127.0.0.1', 51190) +22:30:25,767 root INFO decoded message {'event': 'login', 'username': 'player', 'deck': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]} +22:30:25,769 root INFO user in message None +22:30:28,438 root INFO user logging in +22:30:28,469 root INFO task passed off to gameManager +22:30:28,531 root INFO creating user with id: > +22:30:28,679 root INFO new length of user dictionary: 1 +22:30:28,898 root INFO connected users 1 +22:30:28,910 root INFO confirming login for user +22:30:29,365 root INFO incommingevent {'event': 'login', 'username': 'player', 'deck': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]} +22:30:29,397 root INFO Received message from ('127.0.0.1', 51190): {"event": "login", "username": "player", "deck": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]} +22:30:35,73 root INFO Connected with ('127.0.0.1', 51194) +22:30:35,73 root INFO starting client handler thread for client at address ('127.0.0.1', 51194) +22:30:35,75 root INFO decoded message {'event': 'login', 'username': 'player', 'deck': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]} +22:30:35,75 root INFO user in message None +22:30:35,940 root INFO user logging in +22:30:35,982 root INFO task passed off to gameManager +22:30:36,3 root INFO creating user with id: > +22:30:36,98 root INFO new length of user dictionary: 2 +22:30:36,277 root INFO 2 players have join game starts +22:30:36,468 root INFO game manager is starting the game +22:30:36,805 root INFO connected users 2 +22:30:36,817 root INFO confirming login for user +22:30:42,749 root INFO incommingevent {'event': 'login', 'username': 'player', 'deck': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]} +22:30:42,781 root INFO Received message from ('127.0.0.1', 51194): {"event": "login", "username": "player", "deck": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]} diff --git a/OLD_Server/log/ploaokwx.log b/OLD_Server/log/ploaokwx.log new file mode 100644 index 0000000..a6fdccd --- /dev/null +++ b/OLD_Server/log/ploaokwx.log @@ -0,0 +1,59 @@ +22:53:50,717 root INFO starting up server +22:53:50,718 root INFO starting up game manager +22:53:50,718 root INFO preparing to start server +22:53:50,718 root INFO starting up network manager +22:53:50,718 root INFO starting up network manager +22:53:50,718 root INFO starting up tcp server +22:53:50,719 root INFO starting up thread for client socket accepting +22:53:57,759 root INFO Connected with ('127.0.0.1', 51806) +22:53:57,759 root INFO starting client handler thread for client at address ('127.0.0.1', 51806) +22:53:57,761 root INFO decoded message {'event': 'login', 'username': 'player', 'deck': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]} +22:53:57,764 root INFO user in message None +22:53:58,552 root INFO user logging in +22:53:58,584 root INFO task passed off to gameManager +22:53:58,657 root INFO creating user with id: > +22:53:58,751 root INFO new length of user dictionary: 1 +22:53:58,980 root INFO connected users 1 +22:53:59,2 root INFO confirming login for user +22:53:59,505 root INFO incommingevent {'event': 'login', 'username': 'player', 'deck': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]} +22:53:59,516 root INFO Received message from ('127.0.0.1', 51806): {"event": "login", "username": "player", "deck": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]} +22:54:02,832 root INFO Connected with ('127.0.0.1', 51810) +22:54:02,832 root INFO starting client handler thread for client at address ('127.0.0.1', 51810) +22:54:02,832 root INFO decoded message {'event': 'login', 'username': 'player', 'deck': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]} +22:54:02,834 root INFO user in message None +22:54:03,426 root INFO user logging in +22:54:03,448 root INFO task passed off to gameManager +22:54:03,480 root INFO creating user with id: > +22:54:03,586 root INFO new length of user dictionary: 2 +22:54:03,818 root INFO 2 players have join game starts +22:54:03,923 root INFO game manager is starting the game +22:54:04,230 root INFO connected users 2 +22:54:04,262 root INFO confirming login for user +22:54:04,741 root INFO incommingevent {'event': 'login', 'username': 'player', 'deck': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]} +22:54:04,774 root INFO Received message from ('127.0.0.1', 51810): {"event": "login", "username": "player", "deck": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]} +23:01:35,624 root INFO Connected with ('127.0.0.1', 51984) +23:01:35,624 root INFO starting client handler thread for client at address ('127.0.0.1', 51984) +23:01:35,625 root ERROR Connection with ('127.0.0.1', 51806) forcibly closed by remote host. +23:01:35,625 root ERROR Connection with ('127.0.0.1', 51810) forcibly closed by remote host. +23:01:36,21 root INFO decoded message {'event': 'login', 'username': 'player', 'deck': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]} +23:01:36,22 root INFO user in message None +23:01:36,637 root INFO user logging in +23:01:36,700 root INFO task passed off to gameManager +23:01:36,762 root INFO creating user with id: > +23:01:36,975 root INFO new length of user dictionary: 3 +23:01:37,228 root INFO connected users 3 +23:01:37,312 root INFO confirming login for user +23:01:37,756 root INFO incommingevent {'event': 'login', 'username': 'player', 'deck': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]} +23:01:37,852 root INFO Received message from ('127.0.0.1', 51984): {"event": "login", "username": "player", "deck": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]} +23:01:41,725 root INFO Connected with ('127.0.0.1', 51989) +23:01:41,725 root INFO starting client handler thread for client at address ('127.0.0.1', 51989) +23:01:41,727 root INFO decoded message {'event': 'login', 'username': 'player', 'deck': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]} +23:01:41,727 root INFO user in message None +23:01:42,769 root INFO user logging in +23:01:42,801 root INFO task passed off to gameManager +23:01:42,853 root INFO creating user with id: > +23:01:43,191 root INFO new length of user dictionary: 4 +23:01:43,244 root INFO connected users 4 +23:01:43,349 root INFO confirming login for user +23:01:43,822 root INFO incommingevent {'event': 'login', 'username': 'player', 'deck': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]} +23:01:43,843 root INFO Received message from ('127.0.0.1', 51989): {"event": "login", "username": "player", "deck": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]} diff --git a/OLD_Server/log/tmqifhet.log b/OLD_Server/log/tmqifhet.log new file mode 100644 index 0000000..f6bd341 --- /dev/null +++ b/OLD_Server/log/tmqifhet.log @@ -0,0 +1,23 @@ +22:17:17,848 root INFO starting up server +22:17:17,849 root INFO starting up game manager +22:17:17,849 root INFO preparing to start server +22:17:17,849 root INFO starting up network manager +22:17:17,849 root INFO starting up network manager +22:17:17,849 root INFO starting up tcp server +22:17:17,849 root INFO starting up thread for client socket accepting +22:17:23,920 root INFO Connected with ('127.0.0.1', 50854) +22:17:23,921 root INFO starting client handler thread for client at address ('127.0.0.1', 50854) +22:17:23,923 root INFO decoded message {'event': 'login', 'username': 'player', 'deck': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]} +22:17:23,923 root INFO user in message None +22:17:26,307 root INFO user logging in +22:17:26,339 root INFO task passed off to gameManager +22:17:26,370 root INFO creating user with id: > +22:17:26,466 root INFO new length of user dictionary: 1 +22:17:26,654 root INFO connected users 1 +22:17:26,665 root INFO confirming login for user +22:17:27,185 root INFO incommingevent {'event': 'login', 'username': 'player', 'deck': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]} +22:17:27,239 root INFO Received message from ('127.0.0.1', 50854): {"event": "login", "username": "player", "deck": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]} +22:17:35,108 root INFO Connected with ('127.0.0.1', 50858) +22:17:35,109 root INFO starting client handler thread for client at address ('127.0.0.1', 50858) +22:17:35,110 root INFO decoded message {'event': 'login', 'username': 'player', 'deck': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]} +22:17:35,110 root INFO user in message None diff --git a/OLD_Server/log/usujxxks.log b/OLD_Server/log/usujxxks.log new file mode 100644 index 0000000..61d04d6 --- /dev/null +++ b/OLD_Server/log/usujxxks.log @@ -0,0 +1,7 @@ +22:18:11,454 root INFO starting up server +22:18:11,455 root INFO starting up game manager +22:18:11,455 root INFO preparing to start server +22:18:11,455 root INFO starting up network manager +22:18:11,456 root INFO starting up network manager +22:18:11,456 root INFO starting up tcp server +22:18:11,457 root INFO starting up thread for client socket accepting diff --git a/OLD_Server/log/votjjlwn.log b/OLD_Server/log/votjjlwn.log new file mode 100644 index 0000000..fa08189 --- /dev/null +++ b/OLD_Server/log/votjjlwn.log @@ -0,0 +1,35 @@ +21:49:14,507 root INFO starting up server +21:49:14,507 root INFO starting up game manager +21:49:14,507 root INFO preparing to start server +21:49:14,507 root INFO starting up network manager +21:49:14,507 root INFO starting up network manager +21:49:14,507 root INFO starting up tcp server +21:49:14,509 root INFO starting up thread for client socket accepting +21:49:17,561 root INFO Connected with ('127.0.0.1', 50136) +21:49:17,561 root INFO starting client handler thread for client at address ('127.0.0.1', 50136) +21:49:17,562 root INFO decoded message {'event': 'login', 'username': 'player', 'deck': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]} +21:49:17,562 root INFO user in message None +21:49:20,150 root INFO user logging in +21:49:20,182 root INFO task passed off to gameManager +21:49:20,214 root INFO creating user with id: > +21:49:20,319 root INFO new length of user dictionary: 1 +21:49:20,508 root INFO connected users 1 +21:49:20,539 root INFO confirming login for user +21:49:21,932 root INFO incommingevent {'event': 'login', 'username': 'player', 'deck': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]} +21:49:21,995 root INFO Received message from ('127.0.0.1', 50136): {"event": "login", "username": "player", "deck": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]} +21:49:28,5 root INFO Connected with ('127.0.0.1', 50140) +21:49:28,5 root INFO starting client handler thread for client at address ('127.0.0.1', 50140) +21:49:28,6 root INFO decoded message {'event': 'login', 'username': 'player', 'deck': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]} +21:49:28,7 root INFO user in message None +21:49:28,943 root INFO user logging in +21:49:28,975 root INFO task passed off to gameManager +21:49:29,39 root INFO creating user with id: > +21:49:29,153 root INFO new length of user dictionary: 2 +21:49:29,375 root INFO 2 players have join game starts +21:50:40,445 root INFO connected users 2 +21:51:12,743 root INFO confirming login for user +21:51:14,842 root INFO incommingevent {'event': 'login', 'username': 'player', 'deck': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]} +21:51:15,515 root INFO Received message from ('127.0.0.1', 50140): {"event": "login", "username": "player", "deck": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]} +21:51:22,712 root INFO decoded message {'event': 'placecard', 'card': 1, 'type': 'Monster', 'user': 35452, 'x': 1114.0, 'y': 599.0} +21:51:22,712 root INFO user in message 35452 +21:51:28,960 root INFO incommingevent {'event': 'placecard', 'card': 1, 'type': 'Monster', 'user': 35452, 'x': 1114.0, 'y': 599.0} diff --git a/OLD_Server/log/wdqxolbm.log b/OLD_Server/log/wdqxolbm.log new file mode 100644 index 0000000..ad78473 --- /dev/null +++ b/OLD_Server/log/wdqxolbm.log @@ -0,0 +1,47 @@ +22:46:35,887 root INFO starting up server +22:46:35,888 root INFO starting up game manager +22:46:35,888 root INFO preparing to start server +22:46:35,888 root INFO starting up network manager +22:46:35,889 root INFO starting up network manager +22:46:35,889 root INFO starting up tcp server +22:46:35,890 root INFO starting up thread for client socket accepting +22:46:43,643 root INFO Connected with ('127.0.0.1', 51606) +22:46:43,643 root INFO starting client handler thread for client at address ('127.0.0.1', 51606) +22:46:43,645 root INFO decoded message {'event': 'login', 'username': 'player', 'deck': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]} +22:46:43,649 root INFO user in message None +22:46:45,928 root INFO user logging in +22:46:45,961 root INFO task passed off to gameManager +22:46:45,994 root INFO creating user with id: > +22:46:46,152 root INFO new length of user dictionary: 1 +22:46:46,427 root INFO connected users 1 +22:46:46,461 root INFO confirming login for user +22:46:47,23 root INFO incommingevent {'event': 'login', 'username': 'player', 'deck': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]} +22:46:47,87 root INFO Received message from ('127.0.0.1', 51606): {"event": "login", "username": "player", "deck": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]} +22:46:54,634 root INFO Connected with ('127.0.0.1', 51611) +22:46:54,634 root INFO starting client handler thread for client at address ('127.0.0.1', 51611) +22:46:54,636 root INFO decoded message {'event': 'login', 'username': 'player', 'deck': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]} +22:46:54,636 root INFO user in message None +22:46:55,649 root INFO user logging in +22:46:55,670 root INFO task passed off to gameManager +22:46:55,753 root INFO creating user with id: > +22:46:55,912 root INFO new length of user dictionary: 2 +22:46:56,217 root INFO 2 players have join game starts +22:46:56,281 root INFO game manager is starting the game +22:46:56,639 root INFO connected users 2 +22:46:56,744 root INFO confirming login for user +22:46:57,245 root INFO incommingevent {'event': 'login', 'username': 'player', 'deck': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]} +22:46:57,267 root INFO Received message from ('127.0.0.1', 51611): {"event": "login", "username": "player", "deck": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]} +22:51:59,765 root ERROR Connection with ('127.0.0.1', 51611) forcibly closed by remote host. +22:52:04,500 root ERROR Connection with ('127.0.0.1', 51606) forcibly closed by remote host. +22:52:08,317 root INFO Connected with ('127.0.0.1', 51743) +22:52:08,317 root INFO starting client handler thread for client at address ('127.0.0.1', 51743) +22:52:08,318 root INFO decoded message {'event': 'login', 'username': 'player', 'deck': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]} +22:52:08,319 root INFO user in message None +22:52:10,75 root INFO user logging in +22:52:10,140 root INFO task passed off to gameManager +22:52:10,203 root INFO creating user with id: > +22:52:11,567 root INFO new length of user dictionary: 3 +22:52:11,673 root INFO connected users 3 +22:52:11,684 root INFO confirming login for user +22:52:12,84 root INFO incommingevent {'event': 'login', 'username': 'player', 'deck': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]} +22:52:12,95 root INFO Received message from ('127.0.0.1', 51743): {"event": "login", "username": "player", "deck": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]} diff --git a/OLD_Server/log/yxojocbd.log b/OLD_Server/log/yxojocbd.log new file mode 100644 index 0000000..59118dd --- /dev/null +++ b/OLD_Server/log/yxojocbd.log @@ -0,0 +1,33 @@ +22:52:35,47 root INFO starting up server +22:52:35,47 root INFO starting up game manager +22:52:35,47 root INFO preparing to start server +22:52:35,48 root INFO starting up network manager +22:52:35,48 root INFO starting up network manager +22:52:35,48 root INFO starting up tcp server +22:52:35,48 root INFO starting up thread for client socket accepting +22:52:39,563 root INFO Connected with ('127.0.0.1', 51765) +22:52:39,563 root INFO starting client handler thread for client at address ('127.0.0.1', 51765) +22:52:39,564 root INFO decoded message {'event': 'login', 'username': 'player', 'deck': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]} +22:52:39,566 root INFO user in message None +22:52:40,945 root INFO user logging in +22:52:40,976 root INFO task passed off to gameManager +22:52:41,8 root INFO creating user with id: > +22:52:41,125 root INFO new length of user dictionary: 1 +22:52:41,303 root INFO connected users 1 +22:52:41,324 root INFO confirming login for user +22:52:41,819 root INFO incommingevent {'event': 'login', 'username': 'player', 'deck': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]} +22:52:41,851 root INFO Received message from ('127.0.0.1', 51765): {"event": "login", "username": "player", "deck": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]} +22:52:45,441 root INFO Connected with ('127.0.0.1', 51768) +22:52:45,441 root INFO starting client handler thread for client at address ('127.0.0.1', 51768) +22:52:45,442 root INFO decoded message {'event': 'login', 'username': 'player', 'deck': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]} +22:52:45,443 root INFO user in message None +22:52:46,369 root INFO user logging in +22:52:46,401 root INFO task passed off to gameManager +22:52:46,453 root INFO creating user with id: > +22:52:46,549 root INFO new length of user dictionary: 2 +22:52:46,783 root INFO 2 players have join game starts +22:52:46,867 root INFO game manager is starting the game +22:52:47,205 root INFO connected users 2 +22:52:47,216 root INFO confirming login for user +22:52:47,857 root INFO incommingevent {'event': 'login', 'username': 'player', 'deck': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]} +22:52:47,868 root INFO Received message from ('127.0.0.1', 51768): {"event": "login", "username": "player", "deck": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]} diff --git a/OLD_Server/server logic notes.md b/OLD_Server/server logic notes.md new file mode 100644 index 0000000..7370d4a --- /dev/null +++ b/OLD_Server/server logic notes.md @@ -0,0 +1,42 @@ +# validation for placing cards: +- is the game still running +- is it the players turn +- does the card exist +- does the player have that card in his deck +- does the player have this card in his hand +- is the type of card allowed in that type of field +- is the field already blocked by another card + +# validation for attacking another player +- is the game still running +- is it the players turn +- does the card exist +- does the player have that card in his deck +- is that card played +- does the enemy have remaining monster cards on his side + - if yes a direct attack would only be possible if a effect allows it +- can this card attack + - is the card of correct type + - is it blocked by effects (will be implemented after card effects are implemented) + +# player death management (win condition) +- does a players hp go to 0? + - make the other player the winner + - if an effect affects the playing player card priority comes first + +# handle a player leaving +- check if game still runs + - make remaining player win if yes + +# turn management +- server keeps track of each turn + - whos turn is it + - what turn state is currently active + - draw state + - place state + - is the player trying to do actions not allowed in the given state + +# drawing cards: +- ensure the player only can have 7 cards + - if limit exceeds the player payes lifepoints and drops a card +- ensure the drawn card for sure still can be in the players deck \ No newline at end of file