import socket import pygame from Classes.Engine.Logger import Logger from Classes.Game.NetworkEvents.PlaceCard import CardPlaced from Classes.Game.NetworkEvents.GameStart import GameStart 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: def __init__(self, socket:socket, inputHandler:InputHandler, world:World): self.tcp_socket = socket self.__world = world self.__inputHandler = inputHandler 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 elif message["event"] == "AttackCard": pass elif message["event"] == "AttackPlayer": pass elif message["event"] == "ActivateEffectCard": pass elif message["event"] == "ActivateMonsterCard": pass # handles engine events this is separate from the network event handler class EngineEventHandler: __inputHandler:InputHandler __world:World __logger:Logger 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") if world == None: raise ValueError("world was found to be None") if world == tcpClient: raise ValueError("tcpCLient was found to be None") self.__inputHandler = inputHandler self.__world = world self.__tcpClient = tcpClient # handles the incoming event queue def handleEvent(self, events): # TODO: fix bug that stacks cards when dragging them around self.selectedCard = None self.mousePos = self.__inputHandler.getMousePos() for event in events: if event.type == pygame.QUIT: self.onCleanup() elif self.__inputHandler.getMousePos()[0]: for card in self.__world.getCards(): if card.rect.collidepoint(self.mousePos): 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: if event.button == 1: if self.selectedCard != None: for field in self.__world.getBoardFields(): if field.getRect().collidepoint(self.mousePos): if field.getSide() == "Player" and field.getType() == self.selectedCard.getType(): try: # snap card into the correct field self.selectedCard.rect.center = field.rect.center self.selectedCard.setDragging(False) print(self.selectedCard) if self.selectedCard == card: # TODO: adapt this into the new game engine version PlaceCard(self.__tcpClient, self.selectedCard) # 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