def __init__(self): import __builtin__ __builtin__.LOG = LogConsole() print("Starting PSG Client ...") # Initialize event dispatcher self._dispatcher = Event.Dispatcher() self._dispatcher.register(self, 'E_StartGame', self.startGame) self._dispatcher.register(self, 'E_ExitGame', self.exitGame) self._dispatcher.register(self, 'E_ExitProgram', self.exitProgram) # Create server connection object self.clientconnection = ClientConnection() # Load settings self.gst = GameSettings() self.gst.loadSettings() self._mapStore = MapStore() # If AUTOSERVER is set automatically connect and start a game with the # local server #if (AUTOSERVER): # def connResp(status): # if status: # # Authenticate # self.clientconnection.authenticate('autoserver','password1', authResp) # else: # LOG.error("[GameClient] Could not autoconnect <%s>"%status) # def authResp(status): # if (status == 3): # self.clientconnection.newGame("debug game", mapDict['id'], "3", newResp) # else: # LOG.error("[GameClient] Could not autoauthenticate <%s>"%status) # def newResp(status): # if status > 0: # self.clientconnection.joinGame(status, joinResp) # else: # LOG.error("[GameClient] Could not automatically create a game <%s>"%status) # def joinResp(status, mapMD5): # if status == 2: # Event.Dispatcher().broadcast(Event.Event('E_StartGame', src=self, data=mapMD5)) # else: # LOG.error("[GameClient] Could not autojoin <%s>"%status) # # Use the debug map # mapDict = self._mapStore.getMap(name="Debugger Map") # # Connect # self.clientconnection.connect('localhost', 9091, 3000, connResp) if NOSERVER: mapDict = self._mapStore.getMap(name="Debugger Map") print(mapDict) Event.Dispatcher().broadcast( Event.Event('E_StartGame', src=self, data=mapDict['id'])) # Otherwise start menu GUI normally else: self.gui = Gui(Keys(), theme=RTheme()) self.menu = MainScreen(self)
def __init__(self, parent): self._parent = parent Pane.__init__(self) self._clientcon = ClientConnection() self.x = MENUPOS[0] self.y = MENUPOS[1] self.width = MENUSIZE[0] self.height = MENUSIZE[1] DEBUG_NAME = "Test Game" self.add(Label("NEW NETWORK GAME", pos=(160, 1))) self.add(Label("Name", pos=(MENUPAD[0], MENUPAD[2]))) self.i_name = self.add(Entry(DEBUG_NAME, pos=(MENUPAD[0] + 140, MENUPAD[2]), size=(220, 10))) self.add(Label("Number of Players", pos=(MENUPAD[0], MENUPAD[2] + 25))) self.i_num = self.add(Entry("3", pos=(MENUPAD[0] + 140, MENUPAD[2] + 25), size=(40, 10))) self.add(Label("Map", pos=(MENUPAD[0] + 160, MENUPAD[2] + 50))) self.s_maps = self.add( SelList([], pos=(MENUPAD[0], MENUPAD[2] + 75), size=(MENUSIZE[0] - MENUPAD[2] - 5, 150)) ) self.add(Button("Ok", self._ok, pos=(MENUPAD[0], MENUSIZE[1] - MENUPAD[3] - 20), size=(100, 12))) self.add( Button("Cancel", self._cancel, pos=(MENUSIZE[0] - 120, MENUSIZE[1] - MENUPAD[3] - 20), size=(100, 12)) ) self._mapStore = MapStore() self._refreshMaps()
def __init__(self): import __builtin__ __builtin__.LOG = LogConsole() print("Starting PSG Client ...") # Initialize event dispatcher self._dispatcher = Event.Dispatcher() self._dispatcher.register(self, "E_StartGame", self.startGame) self._dispatcher.register(self, "E_ExitGame", self.exitGame) self._dispatcher.register(self, "E_ExitProgram", self.exitProgram) # Create server connection object self.clientconnection = ClientConnection() # Load settings self.gst = GameSettings() self.gst.loadSettings() self._mapStore = MapStore() # If AUTOSERVER is set automatically connect and start a game with the # local server # if (AUTOSERVER): # def connResp(status): # if status: # # Authenticate # self.clientconnection.authenticate('autoserver','password1', authResp) # else: # LOG.error("[GameClient] Could not autoconnect <%s>"%status) # def authResp(status): # if (status == 3): # self.clientconnection.newGame("debug game", mapDict['id'], "3", newResp) # else: # LOG.error("[GameClient] Could not autoauthenticate <%s>"%status) # def newResp(status): # if status > 0: # self.clientconnection.joinGame(status, joinResp) # else: # LOG.error("[GameClient] Could not automatically create a game <%s>"%status) # def joinResp(status, mapMD5): # if status == 2: # Event.Dispatcher().broadcast(Event.Event('E_StartGame', src=self, data=mapMD5)) # else: # LOG.error("[GameClient] Could not autojoin <%s>"%status) # # Use the debug map # mapDict = self._mapStore.getMap(name="Debugger Map") # # Connect # self.clientconnection.connect('localhost', 9091, 3000, connResp) if NOSERVER: mapDict = self._mapStore.getMap(name="Debugger Map") print(mapDict) Event.Dispatcher().broadcast(Event.Event("E_StartGame", src=self, data=mapDict["id"])) # Otherwise start menu GUI normally else: self.gui = Gui(Keys(), theme=RTheme()) self.menu = MainScreen(self)
def __init__(self, parent, gcli): Pane.__init__(self) self._widgetClickers = dict() self._parent = parent self._gcli = gcli self.x = MENUPOS[0] self.y = MENUPOS[1] self.width = MENUSIZE[0] self.height = MENUSIZE[1] self._clientcon = ClientConnection() self._mapStore = MapStore() server = self._clientcon.address port = self._clientcon.port # Connection self.add(Label("NETWORK GAME", pos=(160, 1))) self.add(Label("Server:", pos=(MENUPAD[0], MENUPAD[2]))) self.i_server = self.add(Entry(server, pos=(MENUPAD[0] + 65, MENUPAD[2]), size=(120, 10))) self.add(Label("Port:", pos=(MENUPAD[0] + 200, MENUPAD[2]))) self.i_port = self.add(Entry(port, pos=(MENUPAD[0] + 265, MENUPAD[2]), size=(120, 10))) self.add(Label("Username:"******"Password:"******"Connect", self._connect, pos=(MENUSIZE[0] - 90, MENUPAD[2] + 50), size=(70, 12)) ) self.s_games = self.add( SelList([], pos=(MENUPAD[0], MENUPAD[2] + 75), size=(MENUSIZE[0] - MENUPAD[2] - 5, 150)) ) self.b_create = self.add( Button("Create Game", self._create, pos=(MENUPAD[0], MENUSIZE[1] - MENUPAD[3] - 45), size=(100, 12)) ) self._disable(self.b_create) self.add( Button( "Join Game", self._join, pos=(MENUSIZE[0] - MENUPAD[1] - 95, MENUSIZE[1] - MENUPAD[3] - 45), size=(100, 12), ) ) self.add(Button("Main Menu", parent.showMain, pos=(MENUPAD[0], MENUSIZE[1] - MENUPAD[3] - 20), size=(100, 12))) if self._clientcon.isAuthorized(): self._setConnected()
def __init__(self, parent): self._parent = parent Pane.__init__(self) self._clientcon = ClientConnection() self.x = MENUPOS[0] self.y = MENUPOS[1] self.width = MENUSIZE[0] self.height = MENUSIZE[1] DEBUG_NAME = "Test Game" self.add(Label("NEW NETWORK GAME", pos=(160, 1))) self.add(Label("Name", pos=(MENUPAD[0], MENUPAD[2]))) self.i_name = self.add( Entry(DEBUG_NAME, pos=(MENUPAD[0] + 140, MENUPAD[2]), size=(220, 10))) self.add( Label("Number of Players", pos=(MENUPAD[0], MENUPAD[2] + 25))) self.i_num = self.add( Entry("3", pos=(MENUPAD[0] + 140, MENUPAD[2] + 25), size=(40, 10))) self.add(Label("Map", pos=(MENUPAD[0] + 160, MENUPAD[2] + 50))) self.s_maps = self.add( SelList([], pos=(MENUPAD[0], MENUPAD[2] + 75), size=(MENUSIZE[0] - MENUPAD[2] - 5, 150))) self.add( Button("Ok", self._ok, pos=(MENUPAD[0], MENUSIZE[1] - MENUPAD[3] - 20), size=(100, 12))) self.add( Button("Cancel", self._cancel, pos=(MENUSIZE[0] - 120, MENUSIZE[1] - MENUPAD[3] - 20), size=(100, 12))) self._mapStore = MapStore() self._refreshMaps()
class createPane(Pane): def __init__(self, parent): self._parent = parent Pane.__init__(self) self._clientcon = ClientConnection() self.x = MENUPOS[0] self.y = MENUPOS[1] self.width = MENUSIZE[0] self.height = MENUSIZE[1] DEBUG_NAME = "Test Game" self.add(Label("NEW NETWORK GAME", pos=(160, 1))) self.add(Label("Name", pos=(MENUPAD[0], MENUPAD[2]))) self.i_name = self.add(Entry(DEBUG_NAME, pos=(MENUPAD[0] + 140, MENUPAD[2]), size=(220, 10))) self.add(Label("Number of Players", pos=(MENUPAD[0], MENUPAD[2] + 25))) self.i_num = self.add(Entry("3", pos=(MENUPAD[0] + 140, MENUPAD[2] + 25), size=(40, 10))) self.add(Label("Map", pos=(MENUPAD[0] + 160, MENUPAD[2] + 50))) self.s_maps = self.add( SelList([], pos=(MENUPAD[0], MENUPAD[2] + 75), size=(MENUSIZE[0] - MENUPAD[2] - 5, 150)) ) self.add(Button("Ok", self._ok, pos=(MENUPAD[0], MENUSIZE[1] - MENUPAD[3] - 20), size=(100, 12))) self.add( Button("Cancel", self._cancel, pos=(MENUSIZE[0] - 120, MENUSIZE[1] - MENUPAD[3] - 20), size=(100, 12)) ) self._mapStore = MapStore() self._refreshMaps() def _ok(self): self.createDialog = gui.add(Dialog()) if self.i_name.text is "": self.createDialog.text = "Please enter a name for the game" self.createDialog.button.text = "ok" elif self.i_num.text is "" or int(self.i_num.text) > MAX_GAME_PLAYERS: self.createDialog.text = "Invalid number of players" self.createDialog.button.text = "ok" elif self.s_maps.getSelectedOption() is None: self.createDialog.text = "Please select a map" self.createDialog.button.text = "ok" else: self.createDialog.text = "Creating game." # print(self._mapStore) mapName = self.s_maps.buttons[self.s_maps.getSelectedOption()].text # print(mapName) mapDict = self._mapStore.getMap(name=mapName) print("id=%s" % mapDict["id"]) if mapDict is not None: self._clientcon.newGame(self.i_name.text, mapDict["id"], self.i_num.text, self._createResponse) else: self.createDialog.text = "Cannot load selected map" LOG.error("[createPane] Cannot load selected map") def _createResponse(self, status): print("Resp=%s" % status) if status > 0: self.createDialog.ok() self._parent._refreshGames() self._cancel() else: self.createDialog.text = "Error creating game" LOG.error("[createPane] Error creating game") def _cancel(self): self._parent.visible = True self.visible = False gui.remove(self) del (self) def _refreshMaps(self): self._mapStore.rescan() mapList = self._mapStore.getAvailableNames() for b in self.s_maps.buttons: self.remove(b) for m in mapList: self.s_maps.addOption(m)
class MultiPane(Pane): class createPane(Pane): def __init__(self, parent): self._parent = parent Pane.__init__(self) self._clientcon = ClientConnection() self.x = MENUPOS[0] self.y = MENUPOS[1] self.width = MENUSIZE[0] self.height = MENUSIZE[1] DEBUG_NAME = "Test Game" self.add(Label("NEW NETWORK GAME", pos=(160, 1))) self.add(Label("Name", pos=(MENUPAD[0], MENUPAD[2]))) self.i_name = self.add(Entry(DEBUG_NAME, pos=(MENUPAD[0] + 140, MENUPAD[2]), size=(220, 10))) self.add(Label("Number of Players", pos=(MENUPAD[0], MENUPAD[2] + 25))) self.i_num = self.add(Entry("3", pos=(MENUPAD[0] + 140, MENUPAD[2] + 25), size=(40, 10))) self.add(Label("Map", pos=(MENUPAD[0] + 160, MENUPAD[2] + 50))) self.s_maps = self.add( SelList([], pos=(MENUPAD[0], MENUPAD[2] + 75), size=(MENUSIZE[0] - MENUPAD[2] - 5, 150)) ) self.add(Button("Ok", self._ok, pos=(MENUPAD[0], MENUSIZE[1] - MENUPAD[3] - 20), size=(100, 12))) self.add( Button("Cancel", self._cancel, pos=(MENUSIZE[0] - 120, MENUSIZE[1] - MENUPAD[3] - 20), size=(100, 12)) ) self._mapStore = MapStore() self._refreshMaps() def _ok(self): self.createDialog = gui.add(Dialog()) if self.i_name.text is "": self.createDialog.text = "Please enter a name for the game" self.createDialog.button.text = "ok" elif self.i_num.text is "" or int(self.i_num.text) > MAX_GAME_PLAYERS: self.createDialog.text = "Invalid number of players" self.createDialog.button.text = "ok" elif self.s_maps.getSelectedOption() is None: self.createDialog.text = "Please select a map" self.createDialog.button.text = "ok" else: self.createDialog.text = "Creating game." # print(self._mapStore) mapName = self.s_maps.buttons[self.s_maps.getSelectedOption()].text # print(mapName) mapDict = self._mapStore.getMap(name=mapName) print("id=%s" % mapDict["id"]) if mapDict is not None: self._clientcon.newGame(self.i_name.text, mapDict["id"], self.i_num.text, self._createResponse) else: self.createDialog.text = "Cannot load selected map" LOG.error("[createPane] Cannot load selected map") def _createResponse(self, status): print("Resp=%s" % status) if status > 0: self.createDialog.ok() self._parent._refreshGames() self._cancel() else: self.createDialog.text = "Error creating game" LOG.error("[createPane] Error creating game") def _cancel(self): self._parent.visible = True self.visible = False gui.remove(self) del (self) def _refreshMaps(self): self._mapStore.rescan() mapList = self._mapStore.getAvailableNames() for b in self.s_maps.buttons: self.remove(b) for m in mapList: self.s_maps.addOption(m) def __init__(self, parent, gcli): Pane.__init__(self) self._widgetClickers = dict() self._parent = parent self._gcli = gcli self.x = MENUPOS[0] self.y = MENUPOS[1] self.width = MENUSIZE[0] self.height = MENUSIZE[1] self._clientcon = ClientConnection() self._mapStore = MapStore() server = self._clientcon.address port = self._clientcon.port # Connection self.add(Label("NETWORK GAME", pos=(160, 1))) self.add(Label("Server:", pos=(MENUPAD[0], MENUPAD[2]))) self.i_server = self.add(Entry(server, pos=(MENUPAD[0] + 65, MENUPAD[2]), size=(120, 10))) self.add(Label("Port:", pos=(MENUPAD[0] + 200, MENUPAD[2]))) self.i_port = self.add(Entry(port, pos=(MENUPAD[0] + 265, MENUPAD[2]), size=(120, 10))) self.add(Label("Username:"******"Password:"******"Connect", self._connect, pos=(MENUSIZE[0] - 90, MENUPAD[2] + 50), size=(70, 12)) ) self.s_games = self.add( SelList([], pos=(MENUPAD[0], MENUPAD[2] + 75), size=(MENUSIZE[0] - MENUPAD[2] - 5, 150)) ) self.b_create = self.add( Button("Create Game", self._create, pos=(MENUPAD[0], MENUSIZE[1] - MENUPAD[3] - 45), size=(100, 12)) ) self._disable(self.b_create) self.add( Button( "Join Game", self._join, pos=(MENUSIZE[0] - MENUPAD[1] - 95, MENUSIZE[1] - MENUPAD[3] - 45), size=(100, 12), ) ) self.add(Button("Main Menu", parent.showMain, pos=(MENUPAD[0], MENUSIZE[1] - MENUPAD[3] - 20), size=(100, 12))) if self._clientcon.isAuthorized(): self._setConnected() def _setConnected(self, status=None): self._disable(self.i_server) self._disable(self.i_port) self._disable(self.i_username) self._disable(self.i_password) self._enable(self.b_create) self.b_connect.text = "Disconnect" self.b_connect.onClick = self._disconnect def _setDisconnected(self, status=None): self._enable(self.i_server) self._enable(self.i_port) self._enable(self.i_username) self._enable(self.i_password) self._disable(self.b_create) self.b_connect.text = "Connect" self.b_connect.onClick = self._connect def _disable(self, widget): widget.color = (0.4, 0.4, 0.4, 1) self._widgetClickers[widget] = widget.onClick widget.onClick = lambda: None def _enable(self, widget): widget.color = (1, 1, 1, 1) widget.onClick = self._widgetClickers[widget] def _disconnect(self): """ Disconect from the server""" self._clientcon.disconnect(self._setDisconnected) def _refreshGames(self): """Request list of available games from server and populate list""" LOG.debug("[MultiPane] Updating games") def onResp(games): for g in games: self.s_games.addOption("%s - %s" % (g["id"], g["name"])) self.s_games.clearOptions() self._clientcon.getGameList(onResp) def _connect(self): """ Connect to a server using the info filled in on this form.""" connectDialog = None connected = False authenticated = False def connectionResponse(resp): if resp: connectDialog.text = "Connected to the server,\nauthenticating..." LOG.notice("[MultiPane] Connected to the server, authenticating...") self._clientcon.authenticate(username, password, authResponse) else: connectDialog.text = "Connection failed." connectDialog.button.text = "ok" def authResponse(resp): if resp == 0: connectDialog.text = "Authentication failed." LOG.error("[MultiPane] Authentication failed") connectDialog.button.text = "ok" elif resp == 1: connectDialog.text = "You are already connected." LOG.error("[MultiPane] You are already connected") self._setConnected() connectDialog.button.text = "ok" elif resp == 2: connectDialog.text = "Incorrect password." LOG.error("[MultiPane] Incorrect password") connectDialog.button.text = "ok" elif resp == 3: connectDialog.text = "Authenticated.\nYou are connected." LOG.notice("[MultiPane] Authenticated. You are connected") self._setConnected() self._refreshGames() connectDialog.button.text = "ok" # self.updateGameList() LOG.notice( "[MultiPane] connecting server=%s port=%s user=%s, pass=%s" % (self.i_server.text, self.i_port.text, self.i_username.text, self.i_password.password) ) # Get the values from the form server = self.i_server.text username = self.i_username.text password = self.i_password.text port = self.i_port.text # If everything is ok attempt to connect and use connectDialog to show the status if server != "" and username != "" and password != "" and port != "": self._clientcon.address = server connectDialog = gui.add(Dialog()) connectDialog.text = "connecting to server %s" % server LOG.notice("[MultiPane] Connecting to server %s" % server) self._clientcon.connect(server, int(port), 3000, connectionResponse) else: LOG.error("[MultiPane] You did not fill in the all the values") connectDialog = gui.add(Dialog()) connectDialog.text = "Please fill in all the values." def _create(self): self.visible = False cPane = self.createPane(self) gui.add(cPane) def _join(self): """ Join the selected game The only way I can think of attaching the game ID to the selection list is in the button text so now we need to extract it. """ def response(status, mapMD5): if status == 0: joinDialog.text = "could not find the game" LOG.error("[MultiPane] Could not find the game") elif status == 1: joinDialog.text = "the game is full" LOG.error("[MultiPane] The game is full") elif status == 2: if self._mapStore.isAvailable(id=mapMD5): joinDialog.visible = False self._parent.startGame(mapMD5) else: joinDialog.text = "downloading map..." LOG.notice("[MultiPane] downloading map...") downloadMap(mapMD5) else: joinDialog.text = "unknown error" LOG.error("[MultiPane] Unknown error") def downloadResp(status, mapMD5): if status == 0: joinDialog.text = "download failed." LOG.error("[MultiPane] download failed") elif status == 1: self._parent.startGame(mapMD5) else: joinDialog.text = "unknown error" LOG.error("[MultiPane] Unknown error") def downloadMap(id): self._clientcon.downloadMap(id, callback) if self.s_games.getSelectedOption() is not None: gameString = self.s_games.buttons[self.s_games.getSelectedOption()].text gameID = int(gameString.split("-")[0].strip()) joinDialog = gui.add(Dialog()) joinDialog.text = "joining game '%s'" % gameString LOG.notice("[MultiPane] joining game '%s'" % gameString) self._clientcon.joinGame(gameID, response)
class GameClient(DirectObject): """ GameClient GameClient creates the Dispatcher, ClientConnection, GSM and GUI. Then it sits back and chills. The GUI handles setting organizing the rest of the setup, the dispatcher handles all communication and the GSM handles the game. """ def __init__(self): import __builtin__ __builtin__.LOG = LogConsole() print("Starting PSG Client ...") # Initialize event dispatcher self._dispatcher = Event.Dispatcher() self._dispatcher.register(self, "E_StartGame", self.startGame) self._dispatcher.register(self, "E_ExitGame", self.exitGame) self._dispatcher.register(self, "E_ExitProgram", self.exitProgram) # Create server connection object self.clientconnection = ClientConnection() # Load settings self.gst = GameSettings() self.gst.loadSettings() self._mapStore = MapStore() # If AUTOSERVER is set automatically connect and start a game with the # local server # if (AUTOSERVER): # def connResp(status): # if status: # # Authenticate # self.clientconnection.authenticate('autoserver','password1', authResp) # else: # LOG.error("[GameClient] Could not autoconnect <%s>"%status) # def authResp(status): # if (status == 3): # self.clientconnection.newGame("debug game", mapDict['id'], "3", newResp) # else: # LOG.error("[GameClient] Could not autoauthenticate <%s>"%status) # def newResp(status): # if status > 0: # self.clientconnection.joinGame(status, joinResp) # else: # LOG.error("[GameClient] Could not automatically create a game <%s>"%status) # def joinResp(status, mapMD5): # if status == 2: # Event.Dispatcher().broadcast(Event.Event('E_StartGame', src=self, data=mapMD5)) # else: # LOG.error("[GameClient] Could not autojoin <%s>"%status) # # Use the debug map # mapDict = self._mapStore.getMap(name="Debugger Map") # # Connect # self.clientconnection.connect('localhost', 9091, 3000, connResp) if NOSERVER: mapDict = self._mapStore.getMap(name="Debugger Map") print(mapDict) Event.Dispatcher().broadcast(Event.Event("E_StartGame", src=self, data=mapDict["id"])) # Otherwise start menu GUI normally else: self.gui = Gui(Keys(), theme=RTheme()) self.menu = MainScreen(self) def startGame(self, event): """ TODO - Document """ mapMD5 = event.data LOG.debug("[GameClient] Starting game with map ID %s" % mapMD5) if not NOSERVER: self.gui.clear() del (self.menu) del (self.gui) # Create GSM self.gsm = GSMgr.GSMgr(self.clientconnection) # Setup controls self.keyboardcontroller = Controller.KeyboardController() self.mousecontroller = Controller.MouseController() # Create GXEng self.gxm = GXMgr.GXMgr() self.gxm.makeGameEngine() self.gsm.registerGXEng(self.gxm) LOG.debug("[GameClient] Loading map id %s" % mapMD5) map = self._mapStore.loadMap(self._mapStore.getMap(mapMD5)["filename"]) self.gsm.startGame(map) def exitGame(self, event): """ Clean up open/running game. Show mainmenu.""" LOG.debug("[GameClient] Exiting game") self.gui = Gui(Keys(), theme=RTheme()) self.menu = MainScreen(self) def exitProgram(self, event): """ TODO - Document """ LOG.debug("[GameClient] Exiting process") # do any necessary cleanup if self.clientconnection.isConnected(): self.clientconnection.disconnect(None) sys.exit(0)
def __init__(self, parent, gcli): Pane.__init__(self) self._widgetClickers = dict() self._parent = parent self._gcli = gcli self.x = MENUPOS[0] self.y = MENUPOS[1] self.width = MENUSIZE[0] self.height = MENUSIZE[1] self._clientcon = ClientConnection() self._mapStore = MapStore() server = self._clientcon.address port = self._clientcon.port # Connection self.add(Label("NETWORK GAME", pos=(160, 1))) self.add(Label("Server:", pos=(MENUPAD[0], MENUPAD[2]))) self.i_server = self.add( Entry(server, pos=(MENUPAD[0] + 65, MENUPAD[2]), size=(120, 10))) self.add(Label("Port:", pos=(MENUPAD[0] + 200, MENUPAD[2]))) self.i_port = self.add( Entry(port, pos=(MENUPAD[0] + 265, MENUPAD[2]), size=(120, 10))) self.add(Label("Username:"******"Password:"******"Connect", self._connect, pos=(MENUSIZE[0] - 90, MENUPAD[2] + 50), size=(70, 12))) self.s_games = self.add( SelList([], pos=(MENUPAD[0], MENUPAD[2] + 75), size=(MENUSIZE[0] - MENUPAD[2] - 5, 150))) self.b_create = self.add( Button("Create Game", self._create, pos=(MENUPAD[0], MENUSIZE[1] - MENUPAD[3] - 45), size=(100, 12))) self._disable(self.b_create) self.add( Button("Join Game", self._join, pos=(MENUSIZE[0] - MENUPAD[1] - 95, MENUSIZE[1] - MENUPAD[3] - 45), size=(100, 12))) self.add( Button("Main Menu", parent.showMain, pos=(MENUPAD[0], MENUSIZE[1] - MENUPAD[3] - 20), size=(100, 12))) if self._clientcon.isAuthorized(): self._setConnected()
class createPane(Pane): def __init__(self, parent): self._parent = parent Pane.__init__(self) self._clientcon = ClientConnection() self.x = MENUPOS[0] self.y = MENUPOS[1] self.width = MENUSIZE[0] self.height = MENUSIZE[1] DEBUG_NAME = "Test Game" self.add(Label("NEW NETWORK GAME", pos=(160, 1))) self.add(Label("Name", pos=(MENUPAD[0], MENUPAD[2]))) self.i_name = self.add( Entry(DEBUG_NAME, pos=(MENUPAD[0] + 140, MENUPAD[2]), size=(220, 10))) self.add( Label("Number of Players", pos=(MENUPAD[0], MENUPAD[2] + 25))) self.i_num = self.add( Entry("3", pos=(MENUPAD[0] + 140, MENUPAD[2] + 25), size=(40, 10))) self.add(Label("Map", pos=(MENUPAD[0] + 160, MENUPAD[2] + 50))) self.s_maps = self.add( SelList([], pos=(MENUPAD[0], MENUPAD[2] + 75), size=(MENUSIZE[0] - MENUPAD[2] - 5, 150))) self.add( Button("Ok", self._ok, pos=(MENUPAD[0], MENUSIZE[1] - MENUPAD[3] - 20), size=(100, 12))) self.add( Button("Cancel", self._cancel, pos=(MENUSIZE[0] - 120, MENUSIZE[1] - MENUPAD[3] - 20), size=(100, 12))) self._mapStore = MapStore() self._refreshMaps() def _ok(self): self.createDialog = gui.add(Dialog()) if (self.i_name.text is ''): self.createDialog.text = "Please enter a name for the game" self.createDialog.button.text = "ok" elif (self.i_num.text is '' or int(self.i_num.text) > MAX_GAME_PLAYERS): self.createDialog.text = "Invalid number of players" self.createDialog.button.text = "ok" elif (self.s_maps.getSelectedOption() is None): self.createDialog.text = "Please select a map" self.createDialog.button.text = "ok" else: self.createDialog.text = "Creating game." #print(self._mapStore) mapName = self.s_maps.buttons[ self.s_maps.getSelectedOption()].text #print(mapName) mapDict = self._mapStore.getMap(name=mapName) print("id=%s" % mapDict['id']) if mapDict is not None: self._clientcon.newGame(self.i_name.text, mapDict['id'], self.i_num.text, self._createResponse) else: self.createDialog.text = "Cannot load selected map" LOG.error("[createPane] Cannot load selected map") def _createResponse(self, status): print("Resp=%s" % status) if status > 0: self.createDialog.ok() self._parent._refreshGames() self._cancel() else: self.createDialog.text = "Error creating game" LOG.error("[createPane] Error creating game") def _cancel(self): self._parent.visible = True self.visible = False gui.remove(self) del (self) def _refreshMaps(self): self._mapStore.rescan() mapList = self._mapStore.getAvailableNames() for b in self.s_maps.buttons: self.remove(b) for m in mapList: self.s_maps.addOption(m)
class MultiPane(Pane): class createPane(Pane): def __init__(self, parent): self._parent = parent Pane.__init__(self) self._clientcon = ClientConnection() self.x = MENUPOS[0] self.y = MENUPOS[1] self.width = MENUSIZE[0] self.height = MENUSIZE[1] DEBUG_NAME = "Test Game" self.add(Label("NEW NETWORK GAME", pos=(160, 1))) self.add(Label("Name", pos=(MENUPAD[0], MENUPAD[2]))) self.i_name = self.add( Entry(DEBUG_NAME, pos=(MENUPAD[0] + 140, MENUPAD[2]), size=(220, 10))) self.add( Label("Number of Players", pos=(MENUPAD[0], MENUPAD[2] + 25))) self.i_num = self.add( Entry("3", pos=(MENUPAD[0] + 140, MENUPAD[2] + 25), size=(40, 10))) self.add(Label("Map", pos=(MENUPAD[0] + 160, MENUPAD[2] + 50))) self.s_maps = self.add( SelList([], pos=(MENUPAD[0], MENUPAD[2] + 75), size=(MENUSIZE[0] - MENUPAD[2] - 5, 150))) self.add( Button("Ok", self._ok, pos=(MENUPAD[0], MENUSIZE[1] - MENUPAD[3] - 20), size=(100, 12))) self.add( Button("Cancel", self._cancel, pos=(MENUSIZE[0] - 120, MENUSIZE[1] - MENUPAD[3] - 20), size=(100, 12))) self._mapStore = MapStore() self._refreshMaps() def _ok(self): self.createDialog = gui.add(Dialog()) if (self.i_name.text is ''): self.createDialog.text = "Please enter a name for the game" self.createDialog.button.text = "ok" elif (self.i_num.text is '' or int(self.i_num.text) > MAX_GAME_PLAYERS): self.createDialog.text = "Invalid number of players" self.createDialog.button.text = "ok" elif (self.s_maps.getSelectedOption() is None): self.createDialog.text = "Please select a map" self.createDialog.button.text = "ok" else: self.createDialog.text = "Creating game." #print(self._mapStore) mapName = self.s_maps.buttons[ self.s_maps.getSelectedOption()].text #print(mapName) mapDict = self._mapStore.getMap(name=mapName) print("id=%s" % mapDict['id']) if mapDict is not None: self._clientcon.newGame(self.i_name.text, mapDict['id'], self.i_num.text, self._createResponse) else: self.createDialog.text = "Cannot load selected map" LOG.error("[createPane] Cannot load selected map") def _createResponse(self, status): print("Resp=%s" % status) if status > 0: self.createDialog.ok() self._parent._refreshGames() self._cancel() else: self.createDialog.text = "Error creating game" LOG.error("[createPane] Error creating game") def _cancel(self): self._parent.visible = True self.visible = False gui.remove(self) del (self) def _refreshMaps(self): self._mapStore.rescan() mapList = self._mapStore.getAvailableNames() for b in self.s_maps.buttons: self.remove(b) for m in mapList: self.s_maps.addOption(m) def __init__(self, parent, gcli): Pane.__init__(self) self._widgetClickers = dict() self._parent = parent self._gcli = gcli self.x = MENUPOS[0] self.y = MENUPOS[1] self.width = MENUSIZE[0] self.height = MENUSIZE[1] self._clientcon = ClientConnection() self._mapStore = MapStore() server = self._clientcon.address port = self._clientcon.port # Connection self.add(Label("NETWORK GAME", pos=(160, 1))) self.add(Label("Server:", pos=(MENUPAD[0], MENUPAD[2]))) self.i_server = self.add( Entry(server, pos=(MENUPAD[0] + 65, MENUPAD[2]), size=(120, 10))) self.add(Label("Port:", pos=(MENUPAD[0] + 200, MENUPAD[2]))) self.i_port = self.add( Entry(port, pos=(MENUPAD[0] + 265, MENUPAD[2]), size=(120, 10))) self.add(Label("Username:"******"Password:"******"Connect", self._connect, pos=(MENUSIZE[0] - 90, MENUPAD[2] + 50), size=(70, 12))) self.s_games = self.add( SelList([], pos=(MENUPAD[0], MENUPAD[2] + 75), size=(MENUSIZE[0] - MENUPAD[2] - 5, 150))) self.b_create = self.add( Button("Create Game", self._create, pos=(MENUPAD[0], MENUSIZE[1] - MENUPAD[3] - 45), size=(100, 12))) self._disable(self.b_create) self.add( Button("Join Game", self._join, pos=(MENUSIZE[0] - MENUPAD[1] - 95, MENUSIZE[1] - MENUPAD[3] - 45), size=(100, 12))) self.add( Button("Main Menu", parent.showMain, pos=(MENUPAD[0], MENUSIZE[1] - MENUPAD[3] - 20), size=(100, 12))) if self._clientcon.isAuthorized(): self._setConnected() def _setConnected(self, status=None): self._disable(self.i_server) self._disable(self.i_port) self._disable(self.i_username) self._disable(self.i_password) self._enable(self.b_create) self.b_connect.text = "Disconnect" self.b_connect.onClick = self._disconnect def _setDisconnected(self, status=None): self._enable(self.i_server) self._enable(self.i_port) self._enable(self.i_username) self._enable(self.i_password) self._disable(self.b_create) self.b_connect.text = "Connect" self.b_connect.onClick = self._connect def _disable(self, widget): widget.color = (.4, .4, .4, 1) self._widgetClickers[widget] = widget.onClick widget.onClick = lambda: None def _enable(self, widget): widget.color = (1, 1, 1, 1) widget.onClick = self._widgetClickers[widget] def _disconnect(self): ''' Disconect from the server''' self._clientcon.disconnect(self._setDisconnected) def _refreshGames(self): '''Request list of available games from server and populate list''' LOG.debug('[MultiPane] Updating games') def onResp(games): for g in games: self.s_games.addOption("%s - %s" % (g['id'], g['name'])) self.s_games.clearOptions() self._clientcon.getGameList(onResp) def _connect(self): ''' Connect to a server using the info filled in on this form.''' connectDialog = None connected = False authenticated = False def connectionResponse(resp): if resp: connectDialog.text = 'Connected to the server,\nauthenticating...' LOG.notice( "[MultiPane] Connected to the server, authenticating...") self._clientcon.authenticate(username, password, authResponse) else: connectDialog.text = 'Connection failed.' connectDialog.button.text = "ok" def authResponse(resp): if (resp == 0): connectDialog.text = 'Authentication failed.' LOG.error("[MultiPane] Authentication failed") connectDialog.button.text = "ok" elif (resp == 1): connectDialog.text = 'You are already connected.' LOG.error("[MultiPane] You are already connected") self._setConnected() connectDialog.button.text = "ok" elif (resp == 2): connectDialog.text = 'Incorrect password.' LOG.error("[MultiPane] Incorrect password") connectDialog.button.text = "ok" elif (resp == 3): connectDialog.text = 'Authenticated.\nYou are connected.' LOG.notice("[MultiPane] Authenticated. You are connected") self._setConnected() self._refreshGames() connectDialog.button.text = "ok" #self.updateGameList() LOG.notice( "[MultiPane] connecting server=%s port=%s user=%s, pass=%s" % (self.i_server.text, self.i_port.text, self.i_username.text, self.i_password.password)) # Get the values from the form server = self.i_server.text username = self.i_username.text password = self.i_password.text port = self.i_port.text # If everything is ok attempt to connect and use connectDialog to show the status if (server != '' and username != '' and password != '' and port != ''): self._clientcon.address = server connectDialog = gui.add(Dialog()) connectDialog.text = "connecting to server %s" % server LOG.notice("[MultiPane] Connecting to server %s" % server) self._clientcon.connect(server, int(port), 3000, connectionResponse) else: LOG.error('[MultiPane] You did not fill in the all the values') connectDialog = gui.add(Dialog()) connectDialog.text = "Please fill in all the values." def _create(self): self.visible = False cPane = self.createPane(self) gui.add(cPane) def _join(self): ''' Join the selected game The only way I can think of attaching the game ID to the selection list is in the button text so now we need to extract it. ''' def response(status, mapMD5): if (status == 0): joinDialog.text = "could not find the game" LOG.error("[MultiPane] Could not find the game") elif (status == 1): joinDialog.text = "the game is full" LOG.error("[MultiPane] The game is full") elif (status == 2): if self._mapStore.isAvailable(id=mapMD5): joinDialog.visible = False self._parent.startGame(mapMD5) else: joinDialog.text = "downloading map..." LOG.notice("[MultiPane] downloading map...") downloadMap(mapMD5) else: joinDialog.text = "unknown error" LOG.error("[MultiPane] Unknown error") def downloadResp(status, mapMD5): if (status == 0): joinDialog.text = "download failed." LOG.error("[MultiPane] download failed") elif (status == 1): self._parent.startGame(mapMD5) else: joinDialog.text = "unknown error" LOG.error("[MultiPane] Unknown error") def downloadMap(id): self._clientcon.downloadMap(id, callback) if (self.s_games.getSelectedOption() is not None): gameString = self.s_games.buttons[ self.s_games.getSelectedOption()].text gameID = int(gameString.split('-')[0].strip()) joinDialog = gui.add(Dialog()) joinDialog.text = "joining game '%s'" % gameString LOG.notice("[MultiPane] joining game '%s'" % gameString) self._clientcon.joinGame(gameID, response)
class GameClient(DirectObject): ''' GameClient GameClient creates the Dispatcher, ClientConnection, GSM and GUI. Then it sits back and chills. The GUI handles setting organizing the rest of the setup, the dispatcher handles all communication and the GSM handles the game. ''' def __init__(self): import __builtin__ __builtin__.LOG = LogConsole() print("Starting PSG Client ...") # Initialize event dispatcher self._dispatcher = Event.Dispatcher() self._dispatcher.register(self, 'E_StartGame', self.startGame) self._dispatcher.register(self, 'E_ExitGame', self.exitGame) self._dispatcher.register(self, 'E_ExitProgram', self.exitProgram) # Create server connection object self.clientconnection = ClientConnection() # Load settings self.gst = GameSettings() self.gst.loadSettings() self._mapStore = MapStore() # If AUTOSERVER is set automatically connect and start a game with the # local server #if (AUTOSERVER): # def connResp(status): # if status: # # Authenticate # self.clientconnection.authenticate('autoserver','password1', authResp) # else: # LOG.error("[GameClient] Could not autoconnect <%s>"%status) # def authResp(status): # if (status == 3): # self.clientconnection.newGame("debug game", mapDict['id'], "3", newResp) # else: # LOG.error("[GameClient] Could not autoauthenticate <%s>"%status) # def newResp(status): # if status > 0: # self.clientconnection.joinGame(status, joinResp) # else: # LOG.error("[GameClient] Could not automatically create a game <%s>"%status) # def joinResp(status, mapMD5): # if status == 2: # Event.Dispatcher().broadcast(Event.Event('E_StartGame', src=self, data=mapMD5)) # else: # LOG.error("[GameClient] Could not autojoin <%s>"%status) # # Use the debug map # mapDict = self._mapStore.getMap(name="Debugger Map") # # Connect # self.clientconnection.connect('localhost', 9091, 3000, connResp) if NOSERVER: mapDict = self._mapStore.getMap(name="Debugger Map") print(mapDict) Event.Dispatcher().broadcast( Event.Event('E_StartGame', src=self, data=mapDict['id'])) # Otherwise start menu GUI normally else: self.gui = Gui(Keys(), theme=RTheme()) self.menu = MainScreen(self) def startGame(self, event): ''' TODO - Document ''' mapMD5 = event.data LOG.debug("[GameClient] Starting game with map ID %s" % mapMD5) if not NOSERVER: self.gui.clear() del (self.menu) del (self.gui) # Create GSM self.gsm = GSMgr.GSMgr(self.clientconnection) # Setup controls self.keyboardcontroller = Controller.KeyboardController() self.mousecontroller = Controller.MouseController() # Create GXEng self.gxm = GXMgr.GXMgr() self.gxm.makeGameEngine() self.gsm.registerGXEng(self.gxm) LOG.debug("[GameClient] Loading map id %s" % mapMD5) map = self._mapStore.loadMap(self._mapStore.getMap(mapMD5)['filename']) self.gsm.startGame(map) def exitGame(self, event): ''' Clean up open/running game. Show mainmenu.''' LOG.debug("[GameClient] Exiting game") self.gui = Gui(Keys(), theme=RTheme()) self.menu = MainScreen(self) def exitProgram(self, event): ''' TODO - Document ''' LOG.debug("[GameClient] Exiting process") # do any necessary cleanup if self.clientconnection.isConnected(): self.clientconnection.disconnect(None) sys.exit(0)