import json import socket from Classes.Game.Player import Player class GameManager: __players:dict __playingPlayer:Player __state:str __round:str def __init__(self, logger): self.__players = {} self.__playingPlayer = None self.__state = "waiting" self.__round = "none" self.logger = logger pass def getLogger(self): return self.logger # 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" print("game starts") for userAddr in self.__users.keys(): try: user = self.__serverWorld.getPlayers[userAddr]["player"] user.addMana(1000) user.adjustHP(1000) user.shuffleDeck() cards = user.getDeck() user.setHand(cards[:5]) payload = { "event":"startgame", "playermana": user.getMana(), "playerhp": user.getHP(), "playername": user.getName(), "hand": user.getHand() } tcpSocket.send(json.dumps(payload).encode()) except Exception as e: print(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) -> dict: self.__gameManager.getLogger().info(f"creating user with id: {player.getID}") self.__players[clientAddr] = { player: player, socket:socket } self.__gameManager.getLogger().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.__gameManager.getLogger().info("2 players have join game starts") self.startGame(socket) return self.__players