def _on_player_ready(self, chooser: ba.Chooser) -> None: """Called when a ba.Player has checked themself ready.""" from ba._lang import Lstr lobby = chooser.lobby activity = self._activity_weak() # In joining activities, we wait till all choosers are ready # and then create all players at once. if activity is not None and activity.is_joining_activity: if lobby.check_all_ready(): choosers = lobby.get_choosers() min_players = self.min_players if len(choosers) >= min_players: for lch in lobby.get_choosers(): self._add_chosen_player(lch) lobby.remove_all_choosers() # Get our next activity going. self._complete_end_activity(activity, {}) else: _ba.screenmessage(Lstr(resource='notEnoughPlayersText', subs=[('${COUNT}', str(min_players)) ]), color=(1, 1, 0)) _ba.playsound(_ba.getsound('error')) else: return # Otherwise just add players on the fly. else: self._add_chosen_player(chooser) lobby.remove_chooser(chooser.getplayer())
def _on_player_ready(self, chooser: ba.Chooser) -> None: """Called when a ba.Player has checked themself ready.""" lobby = chooser.lobby activity = self._activity_weak() # This happens sometimes. That seems like it shouldn't be happening; # when would we have a session and a chooser with players but no # active activity? if activity is None: print('_on_player_ready called with no activity.') return # In joining-activities, we wait till all choosers are ready # and then create all players at once. if activity.is_joining_activity: if not lobby.check_all_ready(): return choosers = lobby.get_choosers() min_players = self.min_players if len(choosers) >= min_players: for lch in lobby.get_choosers(): self._add_chosen_player(lch) lobby.remove_all_choosers() # Get our next activity going. self._complete_end_activity(activity, {}) else: _ba.screenmessage( Lstr(resource='notEnoughPlayersText', subs=[('${COUNT}', str(min_players))]), color=(1, 1, 0), ) _ba.playsound(_ba.getsound('error')) # Otherwise just add players on the fly. else: self._add_chosen_player(chooser) lobby.remove_chooser(chooser.getplayer())
def _add_chosen_player(self, chooser: ba.Chooser) -> ba.Player: # pylint: disable=too-many-statements # pylint: disable=too-many-branches from ba import _error from ba._lang import Lstr from ba._team import Team from ba import _freeforallsession player = chooser.getplayer() if player not in self.players: _error.print_error('player not found in session ' 'player-list after chooser selection') activity = self._activity_weak() assert activity is not None # We need to reset the player's input here, as it is currently # referencing the chooser which could inadvertently keep it alive. player.reset_input() # Pass it to the current activity if it has already begun # (otherwise it'll get passed once begin is called). pass_to_activity = (activity.has_begun() and not activity.is_joining_activity) # If we're not allowing mid-game joins, don't pass; just announce # the arrival. if pass_to_activity: if not self._allow_mid_activity_joins: pass_to_activity = False with _ba.Context(self): _ba.screenmessage(Lstr(resource='playerDelayedJoinText', subs=[('${PLAYER}', player.get_name(full=True)) ]), color=(0, 1, 0)) # If we're a non-team game, each player gets their own team # (keeps mini-game coding simpler if we can always deal with teams). if self._use_teams: team = chooser.get_team() else: our_team_id = self._next_team_id team = Team(team_id=our_team_id, name=chooser.getplayer().get_name(full=True, icon=False), color=chooser.get_color()) self.teams.append(team) self._next_team_id += 1 try: with _ba.Context(self): self.on_team_join(team) except Exception: _error.print_exception(f'exception in on_team_join for {self}') if pass_to_activity: if team in activity.teams: _error.print_error( 'Duplicate team ID in ba.Session._add_chosen_player') activity.teams.append(team) try: with _ba.Context(activity): activity.on_team_join(team) except Exception: _error.print_exception( f'ERROR: exception in on_team_join for {activity}') player.set_data(team=team, character=chooser.get_character_name(), color=chooser.get_color(), highlight=chooser.get_highlight()) self.stats.register_player(player) if pass_to_activity: if isinstance(self, _freeforallsession.FreeForAllSession): if player.team.players: _error.print_error('expected 0 players in FFA team') # Don't actually add the player to their team list if we're not # in an activity. (players get (re)added to their team lists # when the activity begins). player.team.players.append(player) if player in activity.players: _error.print_exception( f'Dup player in ba.Session._add_chosen_player: {player}') else: activity.players.append(player) player.set_activity(activity) pnode = activity.create_player_node(player) player.set_node(pnode) try: with _ba.Context(activity): activity.on_player_join(player) except Exception: _error.print_exception( f'Error on on_player_join for {activity}') return player
def _add_chosen_player(self, chooser: ba.Chooser) -> ba.SessionPlayer: from ba._team import SessionTeam sessionplayer = chooser.getplayer() assert sessionplayer in self.sessionplayers, ( 'SessionPlayer not found in session ' 'player-list after chooser selection.') activity = self._activity_weak() assert activity is not None # Reset the player's input here, as it is probably # referencing the chooser which could inadvertently keep it alive. sessionplayer.resetinput() # We can pass it to the current activity if it has already begun # (otherwise it'll get passed once begin is called). pass_to_activity = (activity.has_begun() and not activity.is_joining_activity) # However, if we're not allowing mid-game joins, don't actually pass; # just announce the arrival and say they'll partake next round. if pass_to_activity: if not self.allow_mid_activity_joins: pass_to_activity = False with _ba.Context(self): _ba.screenmessage( Lstr(resource='playerDelayedJoinText', subs=[('${PLAYER}', sessionplayer.getname(full=True))]), color=(0, 1, 0), ) # If we're a non-team session, each player gets their own team. # (keeps mini-game coding simpler if we can always deal with teams). if self.use_teams: sessionteam = chooser.sessionteam else: our_team_id = self._next_team_id self._next_team_id += 1 sessionteam = SessionTeam( team_id=our_team_id, color=chooser.get_color(), name=chooser.getplayer().getname(full=True, icon=False), ) # Add player's team to the Session. self.sessionteams.append(sessionteam) with _ba.Context(self): try: self.on_team_join(sessionteam) except Exception: print_exception(f'Error in on_team_join for {self}.') # Add player's team to the Activity. if pass_to_activity: activity.add_team(sessionteam) assert sessionplayer not in sessionteam.players sessionteam.players.append(sessionplayer) sessionplayer.setdata(team=sessionteam, character=chooser.get_character_name(), color=chooser.get_color(), highlight=chooser.get_highlight()) self.stats.register_sessionplayer(sessionplayer) if pass_to_activity: activity.add_player(sessionplayer) return sessionplayer