def __create_game(self, load=None, chosen_map=None): """ Actually create a game, join it, and display the lobby. @param load: game data tuple for creating loaded games @param chosen_map: the name of the map to start a new game on (overrides the gui) """ # create the game if load: mapname, gamename = load path = SavegameManager.get_multiplayersave_map(mapname) maxplayers = SavegameAccessor.get_players_num(path) load = SavegameAccessor.get_hash(path) else: mapindex = None if chosen_map is not None: for i, map in enumerate(self.maps_display): if map == chosen_map: mapindex = i break if mapindex is None: mapindex = self.current.collectData('maplist') mapname = self.maps_display[mapindex] maxplayers = self.current.collectData('playerlimit') + 2 # 1 is the first entry gamename = self.current.collectData('gamename') load = None game = NetworkInterface().creategame(mapname, maxplayers, gamename, load) if game is None: return self.__show_gamelobby()
def __join_game(self, game=None): """Joins a multiplayer game. Displays lobby for that specific game""" if game == None: game = self.__get_selected_game() if ( game.load is not None and SavegameAccessor.get_hash(SavegameManager.get_multiplayersave_map(game.mapname)) != game.load ): self.show_popup(_("Error"), self.current.findChild(name="save_missing_help_button").btn_text, size=1) return if game.get_uuid() == -1: # -1 signals no game AmbientSoundComponent.play_special("error") return if game.get_version() != NetworkInterface().get_clientversion(): self.show_popup( _("Wrong version"), # xgettext:python-format _( "The game's version differs from your version. Every player in a multiplayer game must use the same version. This can be fixed by every player updating to the latest version. Game version: {game_version} Your version: {own_version}" ).format(game_version=game.get_version(), own_version=NetworkInterface().get_clientversion()), ) return # actual join join_worked = NetworkInterface().joingame(game.get_uuid()) if not join_worked: return self.__apply_new_nickname() self.__show_gamelobby()
def __update_game_details(self, game=None): """Set map name and other misc data in a widget. Only possible in certain states""" if game == None: game = self.__get_selected_game() # xgettext:python-format self.current.findChild(name="game_map").text = _("Map: {map_name}").format(map_name=game.get_map_name()) self.current.findChild(name="game_name").text = _("Name: {game_name}").format(game_name=game.get_name()) # xgettext:python-format self.current.findChild(name="game_playersnum").text = _("Players: {player_amount}/{player_limit}").format( player_amount=game.get_player_count(), player_limit=game.get_player_limit() ) creator_text = self.current.findChild(name="game_creator") # xgettext:python-format creator_text.text = _("Creator: {player}").format(player=game.get_creator()) creator_text.adaptLayout() vbox_inner = self.current.findChild(name="game_info") if game.load is not None: # work around limitations of current systems via messages path = SavegameManager.get_multiplayersave_map(game.mapname) if SavegameAccessor.get_hash(path) != game.load: text = "" btn_name = "save_missing_help_button" btn = vbox_inner.findChild(name=btn_name) if btn is None: btn = pychan.widgets.Button(name=btn_name, text=_("This savegame is missing (click here)")) last_elem = vbox_inner.findChild(name="game_info_last") if last_elem is None: # no last elem -> we are last vbox_inner.addChild(btn) else: vbox_inner.insertChildBefore(btn, last_elem) btn_text = ( _( u"For multiplayer load, it is currently necessary for you to ensure you have the correct savegame file." ) + u"\n" ) btn_text += _(u"This is not nice and we hope to offer a more convenient solution very soon.") + u"\n" btn_text += _( u"Meanwhile, please request the file {path} from the game creator and put it in {map_directory} ." ).format(path=os.path.basename(path), map_directory=os.path.dirname(path)) btn.btn_text = btn_text def show(): self.show_popup(_("Help"), btn_text, size=1) btn.capture(show) else: text = _(u"This is a savegame.") if text: self.current.findChild(name="game_isloaded").text = text textplayers = self.current.findChild(name="game_players") if textplayers is not None: textplayers.text = u", ".join(game.get_players()) vbox_inner.adaptLayout() # inner vbox always exists vbox = self.current.findChild(name="gamedetailsbox") if vbox is not None: vbox.adaptLayout()
def __send_toggle_ready(self): game = NetworkInterface().get_game() if game.load is not None and \ SavegameAccessor.get_hash(SavegameManager.get_multiplayersave_map(game.mapname)) != game.load: self.__print_event_message("You are fetching savegame data. You must wait for it") return NetworkInterface().send_toggle_ready(NetworkInterface().get_client_name())
def __update_game_details(self, game=None): """Set map name and other misc data in a widget. Only possible in certain states""" if game == None: game = self.__get_selected_game() #xgettext:python-format self.current.findChild(name="game_map").text = _("Map: {map_name}").format(map_name=game.get_map_name()) self.current.findChild(name="game_name").text = _("Name: {game_name}").format(game_name=game.get_name()) #xgettext:python-format self.current.findChild(name="game_playersnum").text = _("Players: {player_amount}/{player_limit}").format( player_amount=game.get_player_count(), player_limit=game.get_player_limit()) vbox_inner = self.current.findChild(name="game_info") if game.load is not None: # work around limitations of current systems via messages path = SavegameManager.get_multiplayersave_map(game.mapname) btn_name = "save_missing_help_button" btn = vbox_inner.findChild(name=btn_name) if SavegameAccessor.get_hash(path) != game.load: text = "" if btn is None: btn = pychan.widgets.Button(name=btn_name, text=_("This savegame is missing (click here)")) last_elem = vbox_inner.findChild(name="game_info_last") if last_elem is None: # no last elem -> we are last vbox_inner.addChild( btn ) else: vbox_inner.insertChildBefore( btn, last_elem ) btn_text = _(u"For multiplayer load, it is necessary for you to have the correct savegame file.") + u"\n" btn_text += _(u"The file will be downloaded when you join the game.") btn.btn_text = btn_text def show(): self.show_popup(_("Help"), btn_text, size=1) btn.capture(show) else: text = _(u"This is a savegame.") if btn is not None: btn.hide() if text: self.current.findChild(name="game_isloaded").text = text self.__update_players_box(game) vbox_inner.adaptLayout() # inner vbox always exists vbox = self.current.findChild(name="gamedetailsbox") if vbox is not None: vbox.adaptLayout()
def __join_game(self, game=None): """Joins a multiplayer game. Displays lobby for that specific game""" if game == None: game = self.__get_selected_game() if game.load is not None and SavegameAccessor.get_hash(SavegameManager.get_multiplayersave_map(game.mapname)) != game.load: NetworkInterface().send_fetch_game(NetworkInterface().get_clientversion(), game.get_uuid()) if game.get_uuid() == -1: # -1 signals no game AmbientSoundComponent.play_special('error') return if game.get_version() != NetworkInterface().get_clientversion(): self.show_popup(_("Wrong version"), #xgettext:python-format _("The game's version differs from your version. Every player in a multiplayer game must use the same version. This can be fixed by every player updating to the latest version. Game version: {game_version} Your version: {own_version}").format( game_version=game.get_version(), own_version=NetworkInterface().get_clientversion())) return # actual join if game.password: self.__enter_password_dialog(game) else: self.__actual_join(game)