118 lines
5.3 KiB
Python

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