diff --git a/src/assets/ba_data/python/baclassic/_subsystem.py b/src/assets/ba_data/python/baclassic/_subsystem.py index 0babb92c..60037189 100644 --- a/src/assets/ba_data/python/baclassic/_subsystem.py +++ b/src/assets/ba_data/python/baclassic/_subsystem.py @@ -222,7 +222,6 @@ class ClassicSubsystem(AppSubsystem): # Run a test in a few seconds to see if we should pop up an existing # pending special offer. def check_special_offer() -> None: - plus = bui.app.plus assert plus is not None from bauiv1lib.specialoffer import show_offer diff --git a/src/assets/ba_data/python/bascenev1/_activity.py b/src/assets/ba_data/python/bascenev1/_activity.py index e7d1140e..d87f6e63 100644 --- a/src/assets/ba_data/python/bascenev1/_activity.py +++ b/src/assets/ba_data/python/bascenev1/_activity.py @@ -4,16 +4,10 @@ from __future__ import annotations import weakref +import logging from typing import TYPE_CHECKING, Generic, TypeVar -import _babase -from babase._error import ( - print_exception, - SessionTeamNotFoundError, - SessionPlayerNotFoundError, - NodeNotFoundError, -) -from babase._general import Call, verify_object_death +import babase import _bascenev1 from bascenev1._dependency import DependencyComponent from bascenev1._team import Team @@ -179,7 +173,7 @@ class Activity(DependencyComponent, Generic[PlayerT, TeamT]): # is dying. self._actor_refs: list[bascenev1.Actor] = [] self._actor_weak_refs: list[weakref.ref[bascenev1.Actor]] = [] - self._last_prune_dead_actors_time = _babase.apptime() + self._last_prune_dead_actors_time = babase.apptime() self._prune_dead_actors_timer: bascenev1.Timer | None = None self.teams = [] @@ -193,15 +187,15 @@ class Activity(DependencyComponent, Generic[PlayerT, TeamT]): # If the activity has been run then we should have already cleaned # it up, but we still need to run expire calls for un-run activities. if not self._expired: - with _babase.ContextRef.empty(): + with babase.ContextRef.empty(): self._expire() # Inform our owner that we officially kicked the bucket. if self._transitioning_out: session = self._session() if session is not None: - _babase.pushcall( - Call( + babase.pushcall( + babase.Call( session.transitioning_out_activity_was_freed, self.can_show_ad_on_death, ) @@ -219,7 +213,7 @@ class Activity(DependencyComponent, Generic[PlayerT, TeamT]): """ node = self._globalsnode if not node: - raise NodeNotFoundError() + raise babase.NodeNotFoundError() return node @property @@ -290,10 +284,12 @@ class Activity(DependencyComponent, Generic[PlayerT, TeamT]): # and reports any lingering references keeping it alive. # We store the timer on the activity so as soon as the activity dies # it gets cleaned up. - with _babase.ContextRef.empty(): + with babase.ContextRef.empty(): ref = weakref.ref(self) - self._activity_death_check_timer = _babase.AppTimer( - 5.0, Call(self._check_activity_death, ref, [0]), repeat=True + self._activity_death_check_timer = babase.AppTimer( + 5.0, + babase.Call(self._check_activity_death, ref, [0]), + repeat=True, ) # Run _expire in an empty context; nothing should be happening in @@ -302,7 +298,7 @@ class Activity(DependencyComponent, Generic[PlayerT, TeamT]): # and we can't properly provide context in that situation anyway; might # as well be consistent). if not self._expired: - with _babase.ContextRef.empty(): + with babase.ContextRef.empty(): self._expire() else: raise RuntimeError( @@ -460,7 +456,7 @@ class Activity(DependencyComponent, Generic[PlayerT, TeamT]): try: self.on_transition_in() except Exception: - print_exception(f'Error in on_transition_in for {self}.') + logging.exception('Error in on_transition_in for %s.', self) # Tell the C++ layer that this activity is the main one, so it uses # settings from our globals, directs various events to us, etc. @@ -474,7 +470,7 @@ class Activity(DependencyComponent, Generic[PlayerT, TeamT]): try: self.on_transition_out() except Exception: - print_exception(f'Error in on_transition_out for {self}.') + logging.exception('Error in on_transition_out for %s.', self) def begin(self, session: bascenev1.Session) -> None: """Begin the activity. @@ -570,7 +566,7 @@ class Activity(DependencyComponent, Generic[PlayerT, TeamT]): try: self.on_player_join(player) except Exception: - print_exception(f'Error in on_player_join for {self}.') + logging.exception('Error in on_player_join for %s.', self) def remove_player(self, sessionplayer: bascenev1.SessionPlayer) -> None: """Remove a player from the Activity while it is running. @@ -600,11 +596,11 @@ class Activity(DependencyComponent, Generic[PlayerT, TeamT]): try: self.on_player_leave(player) except Exception: - print_exception(f'Error in on_player_leave for {self}.') + logging.exception('Error in on_player_leave for %s.', self) try: player.leave() except Exception: - print_exception(f'Error on leave for {player} in {self}.') + logging.exception('Error on leave for %s in %s.', player, self) self._reset_session_player_for_no_activity(sessionplayer) @@ -629,7 +625,7 @@ class Activity(DependencyComponent, Generic[PlayerT, TeamT]): try: self.on_team_join(team) except Exception: - print_exception(f'Error in on_team_join for {self}.') + logging.exception('Error in on_team_join for %s.', self) def remove_team(self, sessionteam: bascenev1.SessionTeam) -> None: """Remove a team from a Running Activity @@ -651,11 +647,11 @@ class Activity(DependencyComponent, Generic[PlayerT, TeamT]): try: self.on_team_leave(team) except Exception: - print_exception(f'Error in on_team_leave for {self}.') + logging.exception('Error in on_team_leave for %s.', self) try: team.leave() except Exception: - print_exception(f'Error on leave for {team} in {self}.') + logging.exception('Error on leave for %s in %s.', team, self) sessionteam.activityteam = None @@ -675,16 +671,18 @@ class Activity(DependencyComponent, Generic[PlayerT, TeamT]): try: sessionplayer.setnode(None) except Exception: - print_exception( - f'Error resetting SessionPlayer node on {sessionplayer}' - f' for {self}.' + logging.exception( + 'Error resetting SessionPlayer node on %s for %s.', + sessionplayer, + self, ) try: sessionplayer.resetinput() except Exception: - print_exception( - f'Error resetting SessionPlayer input on {sessionplayer}' - f' for {self}.' + logging.exception( + 'Error resetting SessionPlayer input on %s for %s.', + sessionplayer, + self, ) # These should never fail I think... @@ -749,10 +747,10 @@ class Activity(DependencyComponent, Generic[PlayerT, TeamT]): counter[0] += 1 if counter[0] == 4: print('Killing app due to stuck activity... :-(') - _babase.quit() + babase.quit() except Exception: - print_exception('Error on _check_activity_death/') + logging.exception('Error on _check_activity_death.') def _expire(self) -> None: """Put the activity in a state where it can be garbage-collected. @@ -766,12 +764,12 @@ class Activity(DependencyComponent, Generic[PlayerT, TeamT]): try: self.on_expire() except Exception: - print_exception(f'Error in Activity on_expire() for {self}.') + logging.exception('Error in Activity on_expire() for %s.', self) try: self._customdata = None except Exception: - print_exception(f'Error clearing customdata for {self}.') + logging.exception('Error clearing customdata for %s.', self) # Don't want to be holding any delay-delete refs at this point. self._prune_delay_deletes() @@ -786,19 +784,19 @@ class Activity(DependencyComponent, Generic[PlayerT, TeamT]): try: self._activity_data.expire() except Exception: - print_exception(f'Error expiring _activity_data for {self}.') + logging.exception('Error expiring _activity_data for %s.', self) def _expire_actors(self) -> None: # Expire all Actors. for actor_ref in self._actor_weak_refs: actor = actor_ref() if actor is not None: - verify_object_death(actor) + babase.verify_object_death(actor) try: actor.on_expire() except Exception: - print_exception( - f'Error in Actor.on_expire()' f' for {actor_ref()}.' + logging.exception( + 'Error in Actor.on_expire() for %s.', actor_ref() ) def _expire_players(self) -> None: @@ -806,57 +804,57 @@ class Activity(DependencyComponent, Generic[PlayerT, TeamT]): # get freed soon. for ex_player in (p() for p in self._players_that_left): if ex_player is not None: - verify_object_death(ex_player) + babase.verify_object_death(ex_player) for player in self.players: # This should allow our bascenev1.Player instance to be freed. # Complain if that doesn't happen. - verify_object_death(player) + babase.verify_object_death(player) try: player.expire() except Exception: - print_exception(f'Error expiring {player}') + logging.exception('Error expiring %s.', player) # Reset the SessionPlayer to a not-in-an-activity state. try: sessionplayer = player.sessionplayer self._reset_session_player_for_no_activity(sessionplayer) - except SessionPlayerNotFoundError: + except babase.SessionPlayerNotFoundError: # Conceivably, someone could have held on to a Player object # until now whos underlying SessionPlayer left long ago... pass except Exception: - print_exception(f'Error expiring {player}.') + logging.exception('Error expiring %s.', player) def _expire_teams(self) -> None: # Issue warnings for any teams that left the game but don't # get freed soon. for ex_team in (p() for p in self._teams_that_left): if ex_team is not None: - verify_object_death(ex_team) + babase.verify_object_death(ex_team) for team in self.teams: # This should allow our bascenev1.Team instance to die. # Complain if that doesn't happen. - verify_object_death(team) + babase.verify_object_death(team) try: team.expire() except Exception: - print_exception(f'Error expiring {team}') + logging.exception('Error expiring %s.', team) try: sessionteam = team.sessionteam sessionteam.activityteam = None - except SessionTeamNotFoundError: + except babase.SessionTeamNotFoundError: # It is expected that Team objects may last longer than # the SessionTeam they came from (game objects may hold # team references past the point at which the underlying # player/team has left the game) pass except Exception: - print_exception(f'Error expiring Team {team}.') + logging.exception('Error expiring Team %s.', team) def _prune_delay_deletes(self) -> None: self._delay_delete_players.clear() @@ -871,7 +869,7 @@ class Activity(DependencyComponent, Generic[PlayerT, TeamT]): ] def _prune_dead_actors(self) -> None: - self._last_prune_dead_actors_time = _babase.apptime() + self._last_prune_dead_actors_time = babase.apptime() # Prune our strong refs when the Actor's exists() call gives False self._actor_refs = [a for a in self._actor_refs if a.exists()] diff --git a/src/assets/ba_data/python/bascenev1/_gameactivity.py b/src/assets/ba_data/python/bascenev1/_gameactivity.py index faea3fb1..a4d7960e 100644 --- a/src/assets/ba_data/python/bascenev1/_gameactivity.py +++ b/src/assets/ba_data/python/bascenev1/_gameactivity.py @@ -6,12 +6,10 @@ from __future__ import annotations import random +import logging from typing import TYPE_CHECKING, TypeVar -import _babase -from babase._language import Lstr -from babase._error import MapNotFoundError, print_error, print_exception -from babase._general import WeakCall +import babase import _bascenev1 from bascenev1._activity import Activity from bascenev1._player import PlayerInfo @@ -25,7 +23,6 @@ if TYPE_CHECKING: from bascenev1lib.actor.playerspaz import PlayerSpaz from bascenev1lib.actor.bomb import TNTSpawner - import babase import bascenev1 PlayerT = TypeVar('PlayerT', bound='bascenev1.Player') @@ -89,8 +86,8 @@ class GameActivity(Activity[PlayerT, TeamT]): bascenev1.GameActivity.get_supported_maps() they can just rely on the default implementation here which calls those methods. """ - assert _babase.app.classic is not None - delegate = _babase.app.classic.delegate + assert babase.app.classic is not None + delegate = babase.app.classic.delegate assert delegate is not None delegate.create_default_game_settings_ui( cls, sessiontype, settings, completion_call @@ -115,18 +112,18 @@ class GameActivity(Activity[PlayerT, TeamT]): Subclasses should override getname(); not this. """ - name = Lstr(translate=('gameNames', cls.getname())) + name = babase.Lstr(translate=('gameNames', cls.getname())) # A few substitutions for 'Epic', 'Solo' etc. modes. # FIXME: Should provide a way for game types to define filters of # their own and should not rely on hard-coded settings names. if settings is not None: if 'Solo Mode' in settings and settings['Solo Mode']: - name = Lstr( + name = babase.Lstr( resource='soloNameFilterText', subs=[('${NAME}', name)] ) if 'Epic Mode' in settings and settings['Epic Mode']: - name = Lstr( + name = babase.Lstr( resource='epicNameFilterText', subs=[('${NAME}', name)] ) @@ -135,7 +132,7 @@ class GameActivity(Activity[PlayerT, TeamT]): @classmethod def get_team_display_string(cls, name: str) -> babase.Lstr: """Given a team name, returns a localized version of it.""" - return Lstr(translate=('teamNames', name)) + return babase.Lstr(translate=('teamNames', name)) @classmethod def get_description(cls, sessiontype: type[bascenev1.Session]) -> str: @@ -157,7 +154,7 @@ class GameActivity(Activity[PlayerT, TeamT]): Sub-classes should override get_description(); not this. """ description = cls.get_description(sessiontype) - return Lstr(translate=('gameDescriptions', description)) + return babase.Lstr(translate=('gameDescriptions', description)) @classmethod def get_available_settings( @@ -179,8 +176,8 @@ class GameActivity(Activity[PlayerT, TeamT]): for this game-type for the given bascenev1.Session type. """ del sessiontype # Unused arg. - assert _babase.app.classic is not None - return _babase.app.classic.getmaps('melee') + assert babase.app.classic is not None + return babase.app.classic.getmaps('melee') @classmethod def get_settings_display_string(cls, config: dict[str, Any]) -> babase.Lstr: @@ -194,7 +191,7 @@ class GameActivity(Activity[PlayerT, TeamT]): # In newer configs, map is in settings; it used to be in the # config root. if 'map' in config['settings']: - sval = Lstr( + sval = babase.Lstr( value='${NAME} @ ${MAP}', subs=[ ('${NAME}', name), @@ -209,7 +206,7 @@ class GameActivity(Activity[PlayerT, TeamT]): ], ) elif 'map' in config: - sval = Lstr( + sval = babase.Lstr( value='${NAME} @ ${MAP}', subs=[ ('${NAME}', name), @@ -223,7 +220,7 @@ class GameActivity(Activity[PlayerT, TeamT]): ) else: print('invalid game config - expected map entry under settings') - sval = Lstr(value='???') + sval = babase.Lstr(value='???') return sval @classmethod @@ -240,7 +237,7 @@ class GameActivity(Activity[PlayerT, TeamT]): """Instantiate the Activity.""" super().__init__(settings) - plus = _babase.app.plus + plus = babase.app.plus # Holds some flattened info about the player set at the point # when on_begin() is called. @@ -297,7 +294,7 @@ class GameActivity(Activity[PlayerT, TeamT]): exist. """ if self._map is None: - raise MapNotFoundError + raise babase.MapNotFoundError return self._map def get_instance_display_string(self) -> babase.Lstr: @@ -323,7 +320,7 @@ class GameActivity(Activity[PlayerT, TeamT]): self.session.campaign_level_name ).displayname except Exception: - print_error('error getting campaign level name') + logging.exception('Error getting campaign level name.') return self.get_instance_display_string() def get_instance_description(self) -> str | Sequence: @@ -401,7 +398,7 @@ class GameActivity(Activity[PlayerT, TeamT]): """ def _continue_choice(self, do_continue: bool) -> None: - plus = _babase.app.plus + plus = babase.app.plus assert plus is not None self._is_waiting_for_continue = False if self.has_ended(): @@ -436,11 +433,11 @@ class GameActivity(Activity[PlayerT, TeamT]): # pylint: disable=cyclic-import from bascenev1._coopsession import CoopSession - classic = _babase.app.classic + classic = babase.app.classic assert classic is not None continues_window = classic.continues_window - plus = _babase.app.plus + plus = babase.app.plus try: if plus is not None and plus.get_v1_account_misc_read_val( 'enableContinues', False @@ -459,20 +456,20 @@ class GameActivity(Activity[PlayerT, TeamT]): # Only attempt this if we're not currently paused # and there appears to be no UI. - assert _babase.app.classic is not None - hmmw = _babase.app.ui_v1.has_main_menu_window() + assert babase.app.classic is not None + hmmw = babase.app.ui_v1.has_main_menu_window() if not gnode.paused and not hmmw: self._is_waiting_for_continue = True - with _babase.ContextRef.empty(): - _babase.apptimer( + with babase.ContextRef.empty(): + babase.apptimer( 0.5, lambda: continues_window( self, self._continue_cost, - continue_call=WeakCall( + continue_call=babase.WeakCall( self._continue_choice, True ), - cancel_call=WeakCall( + cancel_call=babase.WeakCall( self._continue_choice, False ), ), @@ -480,15 +477,15 @@ class GameActivity(Activity[PlayerT, TeamT]): return except Exception: - print_exception('Error handling continues.') + logging.exception('Error handling continues.') self.end_game() def on_begin(self) -> None: super().on_begin() - if _babase.app.classic is not None: - _babase.app.classic.game_begin_analytics() + if babase.app.classic is not None: + babase.app.classic.game_begin_analytics() # We don't do this in on_transition_in because it may depend on # players/teams which aren't available until now. @@ -510,13 +507,13 @@ class GameActivity(Activity[PlayerT, TeamT]): # time is left. tournament_id = self.session.tournament_id if tournament_id is not None: - assert _babase.app.plus is not None - _babase.app.plus.tournament_query( + assert babase.app.plus is not None + babase.app.plus.tournament_query( args={ 'tournamentIDs': [tournament_id], 'source': 'in-game time remaining query', }, - callback=WeakCall(self._on_tournament_query_response), + callback=babase.WeakCall(self._on_tournament_query_response), ) def _on_tournament_query_response( @@ -526,8 +523,8 @@ class GameActivity(Activity[PlayerT, TeamT]): data_t = data['t'] # This used to be the whole payload. # Keep our cached tourney info up to date - assert _babase.app.classic is not None - _babase.app.classic.accounts.cache_tournament_info(data_t) + assert babase.app.classic is not None + babase.app.classic.accounts.cache_tournament_info(data_t) self._setup_tournament_time_limit( max(5, data_t[0]['timeRemaining']) ) @@ -598,11 +595,11 @@ class GameActivity(Activity[PlayerT, TeamT]): subs = [] for i in range(len(sb_desc_l) - 1): subs.append(('${ARG' + str(i + 1) + '}', str(sb_desc_l[i + 1]))) - translation = Lstr( + translation = babase.Lstr( translate=('gameDescriptions', sb_desc_l[0]), subs=subs ) sb_desc = translation - vrmode = _babase.app.vr_mode + vrmode = babase.app.vr_mode yval = -34 if is_empty else -20 yval -= 16 sbpos = ( @@ -698,15 +695,17 @@ class GameActivity(Activity[PlayerT, TeamT]): subs = [] for i in range(len(desc_l) - 1): subs.append(('${ARG' + str(i + 1) + '}', str(desc_l[i + 1]))) - translation = Lstr(translate=('gameDescriptions', desc_l[0]), subs=subs) + translation = babase.Lstr( + translate=('gameDescriptions', desc_l[0]), subs=subs + ) # Do some standard filters (epic mode, etc). if self.settings_raw.get('Epic Mode', False): - translation = Lstr( + translation = babase.Lstr( resource='epicDescriptionFilterText', subs=[('${DESCRIPTION}', translation)], ) - vrmode = _babase.app.vr_mode + vrmode = babase.app.vr_mode dnode = _bascenev1.newnode( 'text', attrs={ @@ -741,8 +740,8 @@ class GameActivity(Activity[PlayerT, TeamT]): # If there's any tips left on the list, display one. if self.tips: tip = self.tips.pop(random.randrange(len(self.tips))) - tip_title = Lstr( - value='${A}:', subs=[('${A}', Lstr(resource='tipText'))] + tip_title = babase.Lstr( + value='${A}:', subs=[('${A}', babase.Lstr(resource='tipText'))] ) icon: bascenev1.Texture | None = None sound: bascenev1.Sound | None = None @@ -753,14 +752,14 @@ class GameActivity(Activity[PlayerT, TeamT]): assert isinstance(tip, str) # Do a few substitutions. - tip_lstr = Lstr( + tip_lstr = babase.Lstr( translate=('tips', tip), - subs=[('${PICKUP}', _babase.charstr(SpecialChar.TOP_BUTTON))], + subs=[('${PICKUP}', babase.charstr(SpecialChar.TOP_BUTTON))], ) base_position = (75, 50) tip_scale = 0.8 tip_title_scale = 1.2 - vrmode = _babase.app.vr_mode + vrmode = babase.app.vr_mode t_offs = -350.0 tnode = _bascenev1.newnode( @@ -909,7 +908,8 @@ class GameActivity(Activity[PlayerT, TeamT]): from bascenev1lib.actor.respawnicon import RespawnIcon player.customdata['respawn_timer'] = _bascenev1.Timer( - respawn_time, WeakCall(self.spawn_player_if_exists, player) + respawn_time, + babase.WeakCall(self.spawn_player_if_exists, player), ) player.customdata['respawn_icon'] = RespawnIcon( player, respawn_time @@ -958,7 +958,7 @@ class GameActivity(Activity[PlayerT, TeamT]): playerspaztype = PlayerSpaz light_color = _math.normalized_color(color) - display_color = _babase.safecolor(color, target_intensity=0.75) + display_color = babase.safecolor(color, target_intensity=0.75) spaz = playerspaztype( color=color, highlight=highlight, @@ -1006,7 +1006,7 @@ class GameActivity(Activity[PlayerT, TeamT]): self._powerup_drop_timer = _bascenev1.Timer( DEFAULT_POWERUP_INTERVAL, - WeakCall(self._standard_drop_powerups), + babase.WeakCall(self._standard_drop_powerups), repeat=True, ) self._standard_drop_powerups() @@ -1030,7 +1030,9 @@ class GameActivity(Activity[PlayerT, TeamT]): # Drop one powerup per point. points = self.map.powerup_spawn_points for i in range(len(points)): - _bascenev1.timer(i * 0.4, WeakCall(self._standard_drop_powerup, i)) + _bascenev1.timer( + i * 0.4, babase.WeakCall(self._standard_drop_powerup, i) + ) def _setup_standard_tnt_drops(self) -> None: """Standard tnt drop.""" @@ -1055,7 +1057,7 @@ class GameActivity(Activity[PlayerT, TeamT]): return self._standard_time_limit_time = int(duration) self._standard_time_limit_timer = _bascenev1.Timer( - 1.0, WeakCall(self._standard_time_limit_tick), repeat=True + 1.0, babase.WeakCall(self._standard_time_limit_tick), repeat=True ) self._standard_time_limit_text = NodeActor( _bascenev1.newnode( @@ -1121,7 +1123,7 @@ class GameActivity(Activity[PlayerT, TeamT]): 'color': (1, 0.7, 0, 1), 'position': (0, -90), 'scale': 1.2, - 'text': Lstr(resource='timeExpiredText'), + 'text': babase.Lstr(resource='timeExpiredText'), }, ) _bascenev1.getsound('refWhistle').play() @@ -1145,7 +1147,7 @@ class GameActivity(Activity[PlayerT, TeamT]): # then we have to mess with contexts and whatnot since its currently # not available in activity contexts. :-/ self._tournament_time_limit_timer = _bascenev1.BaseTimer( - 1.0, WeakCall(self._tournament_time_limit_tick), repeat=True + 1.0, babase.WeakCall(self._tournament_time_limit_tick), repeat=True ) self._tournament_time_limit_title_text = NodeActor( _bascenev1.newnode( @@ -1161,7 +1163,7 @@ class GameActivity(Activity[PlayerT, TeamT]): 'position': (60, 50), 'flatness': 1.0, 'scale': 0.5, - 'text': Lstr(resource='tournamentText'), + 'text': babase.Lstr(resource='tournamentText'), }, ) ) @@ -1233,7 +1235,7 @@ class GameActivity(Activity[PlayerT, TeamT]): if self._tournament_time_limit <= 0: self._tournament_time_limit_timer = None self.end_game() - tval = Lstr( + tval = babase.Lstr( resource='tournamentTimeExpiredText', fallback_resource='timeExpiredText', ) @@ -1275,7 +1277,7 @@ class GameActivity(Activity[PlayerT, TeamT]): # Reserve a spot on the screen (in case we get multiple of these so # they don't overlap). i = 0 - cur_time = _babase.apptime() + cur_time = babase.apptime() while True: if ( i not in self._zoom_message_times @@ -1303,8 +1305,8 @@ class GameActivity(Activity[PlayerT, TeamT]): # If settings doesn't specify a map, pick a random one from the # list of supported ones. unowned_maps: list[str] = ( - _babase.app.classic.store.get_unowned_maps() - if _babase.app.classic is not None + babase.app.classic.store.get_unowned_maps() + if babase.app.classic is not None else [] ) valid_maps: list[str] = [ @@ -1313,7 +1315,9 @@ class GameActivity(Activity[PlayerT, TeamT]): if m not in unowned_maps ] if not valid_maps: - _babase.screenmessage(Lstr(resource='noValidMapsErrorText')) + babase.screenmessage( + babase.Lstr(resource='noValidMapsErrorText') + ) raise RuntimeError('No valid maps') map_name = valid_maps[random.randrange(len(valid_maps))] return map_name diff --git a/src/assets/ba_data/python/bascenev1/_multiteamsession.py b/src/assets/ba_data/python/bascenev1/_multiteamsession.py index 2da69c7e..e31c0a05 100644 --- a/src/assets/ba_data/python/bascenev1/_multiteamsession.py +++ b/src/assets/ba_data/python/bascenev1/_multiteamsession.py @@ -5,17 +5,16 @@ from __future__ import annotations import copy import random +import logging from typing import TYPE_CHECKING -import _babase +import babase import _bascenev1 -from babase._error import NotFoundError, print_error from bascenev1._session import Session if TYPE_CHECKING: from typing import Any, Sequence - import babase import bascenev1 DEFAULT_TEAM_COLORS = ((0.1, 0.25, 1.0), (1.0, 0.25, 0.2)) @@ -43,7 +42,7 @@ class MultiTeamSession(Session): from bascenev1 import _playlist from bascenev1lib.activity.multiteamjoin import MultiTeamJoinActivity - app = _babase.app + app = babase.app classic = app.classic assert classic is not None cfg = app.config @@ -163,8 +162,8 @@ class MultiTeamSession(Session): def get_max_players(self) -> int: """Return max number of Players allowed to join the game at once.""" if self.use_teams: - return _babase.app.config.get('Team Game Max Players', 8) - return _babase.app.config.get('Free-for-All Max Players', 8) + return babase.app.config.get('Team Game Max Players', 8) + return babase.app.config.get('Free-for-All Max Players', 8) def _instantiate_next_game(self) -> None: self._next_game_instance = _bascenev1.newactivity( @@ -229,7 +228,7 @@ class MultiTeamSession(Session): # (ie: no longer sitting in the lobby). try: has_team = player.sessionteam is not None - except NotFoundError: + except babase.NotFoundError: has_team = False if has_team: self.stats.register_sessionplayer(player) @@ -245,7 +244,7 @@ class MultiTeamSession(Session): def _switch_to_score_screen(self, results: Any) -> None: """Switch to a score screen after leaving a round.""" del results # Unused arg. - print_error('this should be overridden') + logging.error('This should be overridden.', stack_info=True) def announce_game_results( self, @@ -262,8 +261,6 @@ class MultiTeamSession(Session): announcement of the same. """ # pylint: disable=cyclic-import - from babase._math import normalized_color - from babase._language import Lstr from bascenev1._gameutils import cameraflash from bascenev1._freeforallsession import FreeForAllSession from bascenev1._messages import CelebrateMessage @@ -286,14 +283,14 @@ class MultiTeamSession(Session): wins_resource = 'winsPlayerText' else: wins_resource = 'winsTeamText' - wins_text = Lstr( + wins_text = babase.Lstr( resource=wins_resource, subs=[('${NAME}', winning_sessionteam.name)], ) activity.show_zoom_message( wins_text, scale=0.85, - color=normalized_color(winning_sessionteam.color), + color=babase.normalized_color(winning_sessionteam.color), )