From 58766a8f6e28a311ff3fa198b8605a04953d8731 Mon Sep 17 00:00:00 2001 From: Eric Froemling Date: Wed, 3 Jun 2020 12:06:40 -0700 Subject: [PATCH] Tidying and language updates --- .efrocachemap | 32 +++--- assets/src/ba_data/python/ba/_achievement.py | 4 +- assets/src/ba_data/python/ba/_activity.py | 51 ++++----- .../src/ba_data/python/ba/_activitytypes.py | 37 +++---- assets/src/ba_data/python/ba/_analytics.py | 2 +- assets/src/ba_data/python/ba/_app.py | 11 +- assets/src/ba_data/python/ba/_campaign.py | 100 +++++++++--------- assets/src/ba_data/python/ba/_coopgame.py | 2 +- assets/src/ba_data/python/ba/_coopsession.py | 10 +- assets/src/ba_data/python/ba/_gameactivity.py | 2 +- assets/src/ba_data/python/ba/_level.py | 23 ++-- assets/src/ba_data/python/ba/internal.py | 2 +- .../ba_data/python/bastd/activity/coopjoin.py | 4 +- .../python/bastd/activity/coopscore.py | 16 +-- .../python/bastd/activity/multiteamvictory.py | 8 +- .../ba_data/python/bastd/game/ninjafight.py | 7 +- .../python/bastd/ui/account/settings.py | 12 +-- .../ba_data/python/bastd/ui/coop/browser.py | 22 ++-- .../python/bastd/ui/coop/gamebutton.py | 18 ++-- docs/ba_module.md | 63 +++++------ tools/batools/build.py | 2 +- 21 files changed, 202 insertions(+), 226 deletions(-) diff --git a/.efrocachemap b/.efrocachemap index f420e66d..250ee99d 100644 --- a/.efrocachemap +++ b/.efrocachemap @@ -423,7 +423,7 @@ "assets/build/ba_data/data/langdata.json": "https://files.ballistica.net/cache/ba1/98/6d/e6de20b119fd6a5914982cd468b6", "assets/build/ba_data/data/languages/arabic.json": "https://files.ballistica.net/cache/ba1/b8/ed/e18bec56ff1d094aae86517a7854", "assets/build/ba_data/data/languages/belarussian.json": "https://files.ballistica.net/cache/ba1/49/5f/b29bb65369040892fe6601801637", - "assets/build/ba_data/data/languages/chinese.json": "https://files.ballistica.net/cache/ba1/15/1b/3e0690b975c7cafbfa65e3aafad3", + "assets/build/ba_data/data/languages/chinese.json": "https://files.ballistica.net/cache/ba1/80/b2/b24a9a8395580ef2dea714abf478", "assets/build/ba_data/data/languages/chinesetraditional.json": "https://files.ballistica.net/cache/ba1/aa/91/2411c0728bae33619c21237a2689", "assets/build/ba_data/data/languages/croatian.json": "https://files.ballistica.net/cache/ba1/bb/9c/360fc084e6254a087096993af219", "assets/build/ba_data/data/languages/czech.json": "https://files.ballistica.net/cache/ba1/f2/90/62968ad28a2499a8d182a5740a85", @@ -444,14 +444,14 @@ "assets/build/ba_data/data/languages/polish.json": "https://files.ballistica.net/cache/ba1/db/eb/324f86a4b714240ae50ffeeed2f8", "assets/build/ba_data/data/languages/portuguese.json": "https://files.ballistica.net/cache/ba1/a9/bc/ea61ebd23066c685fb779e23d10f", "assets/build/ba_data/data/languages/romanian.json": "https://files.ballistica.net/cache/ba1/f6/d0/335b952306d211d56172b5c72d8c", - "assets/build/ba_data/data/languages/russian.json": "https://files.ballistica.net/cache/ba1/78/5e/d24967ddaa15e0a574bd274544db", + "assets/build/ba_data/data/languages/russian.json": "https://files.ballistica.net/cache/ba1/56/f4/b76f1e862b29db5f642a67da67f3", "assets/build/ba_data/data/languages/serbian.json": "https://files.ballistica.net/cache/ba1/e7/d8/ace32888249fc8b8cca0e2edb48b", "assets/build/ba_data/data/languages/slovak.json": "https://files.ballistica.net/cache/ba1/b7/0a/fab820b96e7aa587ee56427ecdc2", "assets/build/ba_data/data/languages/spanish.json": "https://files.ballistica.net/cache/ba1/90/d9/0f8f5b03bbe2dfebfb544cee6bd6", "assets/build/ba_data/data/languages/swedish.json": "https://files.ballistica.net/cache/ba1/50/9f/be006ba19be6a69a57837eb6dca0", - "assets/build/ba_data/data/languages/turkish.json": "https://files.ballistica.net/cache/ba1/b6/c9/999c95ff8d917126352a306d89a3", + "assets/build/ba_data/data/languages/turkish.json": "https://files.ballistica.net/cache/ba1/30/70/ba6f57b2d865d0027a50c6e1dba5", "assets/build/ba_data/data/languages/ukrainian.json": "https://files.ballistica.net/cache/ba1/e0/f7/f6daa488dc29e303dea69aae864b", - "assets/build/ba_data/data/languages/vietnamese.json": "https://files.ballistica.net/cache/ba1/53/fe/b06f46dfeb31fb29d47a9546c01a", + "assets/build/ba_data/data/languages/vietnamese.json": "https://files.ballistica.net/cache/ba1/5f/a8/7d563fe99b8d1d1eb9bea49dc5df", "assets/build/ba_data/data/maps/big_g.json": "https://files.ballistica.net/cache/ba1/47/0a/a617cc85d927b576c4e6fc1091ed", "assets/build/ba_data/data/maps/bridgit.json": "https://files.ballistica.net/cache/ba1/03/4b/57ee9b42854b26f23f81bd8c58ef", "assets/build/ba_data/data/maps/courtyard.json": "https://files.ballistica.net/cache/ba1/03/38/344dd05bfef7bbdf464035ec5aa2", @@ -4132,16 +4132,16 @@ "assets/build/windows/x64/python.exe": "https://files.ballistica.net/cache/ba1/25/a7/dc87c1be41605eb6fefd0145144c", "assets/build/windows/x64/python37.dll": "https://files.ballistica.net/cache/ba1/b9/e4/d912f56e42e9991bcbb4c804cfcb", "assets/build/windows/x64/pythonw.exe": "https://files.ballistica.net/cache/ba1/6c/bb/b6f52c306aa4e88061510e96cefe", - "build/prefab/linux-server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/4c/7f/785a205dbe19ee4099f427dd9ca2", - "build/prefab/linux-server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/b3/10/7ab16ca078a401bbbe2310660b85", - "build/prefab/linux/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/ef/f5/be729c0261c6326c3ef92330b764", - "build/prefab/linux/release/ballisticacore": "https://files.ballistica.net/cache/ba1/98/9d/98bc183187af679fbc6531e3ac04", - "build/prefab/mac-server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/17/07/aed82d9bc9c5b4dd3457fcea9a8a", - "build/prefab/mac-server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/71/5e/a837ebb98b829cd3bebf081e02b0", - "build/prefab/mac/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/9c/a0/3204f264abfd13f40f7f4f72aa65", - "build/prefab/mac/release/ballisticacore": "https://files.ballistica.net/cache/ba1/68/ab/de21be17db5b93a7191c353dbce8", - "build/prefab/windows-server/debug/dist/ballisticacore_headless.exe": "https://files.ballistica.net/cache/ba1/54/5a/e32b46e614ed37c7ebe42c73b03c", - "build/prefab/windows-server/release/dist/ballisticacore_headless.exe": "https://files.ballistica.net/cache/ba1/15/09/2245bdaf317da30c7d63d8559c82", - "build/prefab/windows/debug/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/f6/45/6972dd74de4fc822a28e995a4a0d", - "build/prefab/windows/release/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/34/74/e8ff832e808ceaa07a4015fb2a5f" + "build/prefab/linux-server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/92/ca/9fa8a48f38554ef676a900136ce9", + "build/prefab/linux-server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/e3/2c/f3e52a261f8dabced7a41d925053", + "build/prefab/linux/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/df/82/1c63fa091da3fb52bcecf87f8ea6", + "build/prefab/linux/release/ballisticacore": "https://files.ballistica.net/cache/ba1/83/18/a60e9e2f6e37e2f36ca8c8f4f42c", + "build/prefab/mac-server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/96/6a/cc35319fd83bca6ff578e4c8dad6", + "build/prefab/mac-server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/5a/a2/b04d489862ae208c6b2b31697519", + "build/prefab/mac/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/a8/ca/89e007ea20b4f2a3dee09e1361c3", + "build/prefab/mac/release/ballisticacore": "https://files.ballistica.net/cache/ba1/6e/cd/f8ad50715cb46d5cae7bd87bb498", + "build/prefab/windows-server/debug/dist/ballisticacore_headless.exe": "https://files.ballistica.net/cache/ba1/36/d1/67a51def178a07f99acc3cc2b11c", + "build/prefab/windows-server/release/dist/ballisticacore_headless.exe": "https://files.ballistica.net/cache/ba1/52/4a/a7a5b56eda157fde6e58a90ab98a", + "build/prefab/windows/debug/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/cc/ec/d82c9ba9d587598f8183bc360326", + "build/prefab/windows/release/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/8e/2a/f24b48e15ef4fd5794c5e426081b" } \ No newline at end of file diff --git a/assets/src/ba_data/python/ba/_achievement.py b/assets/src/ba_data/python/ba/_achievement.py index 44292c28..73165ba8 100644 --- a/assets/src/ba_data/python/ba/_achievement.py +++ b/assets/src/ba_data/python/ba/_achievement.py @@ -291,9 +291,9 @@ class Achievement: name: Union[ba.Lstr, str] try: if self._level_name != '': - from ba._campaign import get_campaign + from ba._campaign import getcampaign campaignname, campaign_level = self._level_name.split(':') - name = get_campaign(campaignname).get_level( + name = getcampaign(campaignname).getlevel( campaign_level).displayname else: name = '' diff --git a/assets/src/ba_data/python/ba/_activity.py b/assets/src/ba_data/python/ba/_activity.py index 08795ab9..d439d6db 100644 --- a/assets/src/ba_data/python/ba/_activity.py +++ b/assets/src/ba_data/python/ba/_activity.py @@ -326,14 +326,9 @@ class Activity(DependencyComponent, Generic[PlayerType, TeamType]): returns False for the Actor. The ba.Actor.autoretain() method is a convenient way to access this same functionality. """ - from ba import _actor as bsactor - if not isinstance(actor, bsactor.Actor): - raise TypeError('non-actor passed to retain_actor') - - # Make sure our pruning is happening... - assert (not self.has_transitioned_in() - or _ba.time() - self._last_prune_dead_actors_time < 10.0) - + if __debug__: + from ba._actor import Actor + assert isinstance(actor, Actor) self._actor_refs.append(actor) def add_actor_weak_ref(self, actor: ba.Actor) -> None: @@ -341,14 +336,9 @@ class Activity(DependencyComponent, Generic[PlayerType, TeamType]): (called by the ba.Actor base class) """ - from ba import _actor as bsactor - if not isinstance(actor, bsactor.Actor): - raise TypeError('non-actor passed to add_actor_weak_ref') - - # Make sure our pruning is happening... - assert (not self.has_transitioned_in() - or _ba.time() - self._last_prune_dead_actors_time < 10.0) - + if __debug__: + from ba._actor import Actor + assert isinstance(actor, Actor) self._actor_weak_refs.append(weakref.ref(actor)) @property @@ -476,7 +466,7 @@ class Activity(DependencyComponent, Generic[PlayerType, TeamType]): try: self.on_transition_in() except Exception: - print_exception(f'Error in on_transition_in for {self}') + print_exception(f'Error in on_transition_in for {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. @@ -490,7 +480,7 @@ class Activity(DependencyComponent, Generic[PlayerType, TeamType]): try: self.on_transition_out() except Exception: - print_exception('Error in on_transition_out for', self) + print_exception(f'Error in on_transition_out for {self}.') def begin(self, session: ba.Session) -> None: """Begin the activity. @@ -586,7 +576,7 @@ class Activity(DependencyComponent, Generic[PlayerType, TeamType]): try: self.on_player_join(player) except Exception: - print_exception('Error in on_player_join for', self) + print_exception(f'Error in on_player_join for {self}.') def remove_player(self, sessionplayer: ba.SessionPlayer) -> None: """Remove a player from the Activity while it is running. @@ -616,11 +606,11 @@ class Activity(DependencyComponent, Generic[PlayerType, TeamType]): try: self.on_player_leave(player) except Exception: - print_exception(f'Error in on_player_leave for {self}') + print_exception(f'Error in on_player_leave for {self}.') try: player.leave() except Exception: - print_exception(f'Error on leave for {player} in {self}') + print_exception(f'Error on leave for {player} in {self}.') self._reset_session_player_for_no_activity(sessionplayer) @@ -645,7 +635,7 @@ class Activity(DependencyComponent, Generic[PlayerType, TeamType]): try: self.on_team_join(team) except Exception: - print_exception(f'Error in on_team_join for {self}') + print_exception(f'Error in on_team_join for {self}.') def remove_team(self, sessionteam: ba.SessionTeam) -> None: """Remove a team from a Running Activity @@ -667,11 +657,11 @@ class Activity(DependencyComponent, Generic[PlayerType, TeamType]): try: self.on_team_leave(team) except Exception: - print_exception(f'Error in on_team_leave for {self}') + print_exception(f'Error in on_team_leave for {self}.') try: team.leave() except Exception: - print_exception(f'Error on leave for {team} in {self}') + print_exception(f'Error on leave for {team} in {self}.') sessionteam.gameteam = None @@ -693,13 +683,13 @@ class Activity(DependencyComponent, Generic[PlayerType, TeamType]): except Exception: print_exception( f'Error resetting SessionPlayer node on {sessionplayer}' - f' for {self}') + f' for {self}.') try: sessionplayer.resetinput() except Exception: print_exception( f'Error resetting SessionPlayer input on {sessionplayer}' - f' for {self}') + f' for {self}.') # These should never fail I think... sessionplayer.setactivity(None) @@ -767,7 +757,7 @@ class Activity(DependencyComponent, Generic[PlayerType, TeamType]): _ba.quit() except Exception: - print_exception('exception on _check_activity_death:') + print_exception('Error on _check_activity_death/') def _expire(self) -> None: """Put the activity in a state where it can be garbage-collected. @@ -801,8 +791,7 @@ class Activity(DependencyComponent, Generic[PlayerType, TeamType]): try: self._activity_data.expire() except Exception: - print_exception( - 'Error during ba.Activity._expire() destroying data:') + print_exception(f'Error expiring _activity_data for {self}.') def _expire_actors(self) -> None: # Expire all Actors. @@ -843,7 +832,7 @@ class Activity(DependencyComponent, Generic[PlayerType, TeamType]): # until now whos underlying SessionPlayer left long ago... pass except Exception: - print_exception(f'Error expiring {player}') + print_exception(f'Error expiring {player}.') def _expire_teams(self) -> None: @@ -873,7 +862,7 @@ class Activity(DependencyComponent, Generic[PlayerType, TeamType]): # player/team has left the game) pass except Exception: - print_exception(f'Error expiring Team {team}') + print_exception(f'Error expiring Team {team}.') def _prune_delay_deletes(self) -> None: self._delay_delete_players.clear() diff --git a/assets/src/ba_data/python/ba/_activitytypes.py b/assets/src/ba_data/python/ba/_activitytypes.py index 01e3fc55..d17d391a 100644 --- a/assets/src/ba_data/python/ba/_activitytypes.py +++ b/assets/src/ba_data/python/ba/_activitytypes.py @@ -103,21 +103,21 @@ class JoinActivity(Activity[EmptyPlayer, EmptyTeam]): class TransitionActivity(Activity[EmptyPlayer, EmptyTeam]): - """A simple overlay fade out/in. + """A simple overlay to fade out/in. Useful as a bare minimum transition between two level based activities. """ + # Keep prev activity alive while we fade in. + transition_time = 0.5 + inherits_slow_motion = True # Don't change. + inherits_tint = True # Don't change. + inherits_vr_camera_offset = True # Don't change. + inherits_vr_overlay_center = True + use_fixed_vr_overlay = True + def __init__(self, settings: dict): super().__init__(settings) - - # Keep prev activity alive while we fade in. - self.transition_time = 0.5 - self.inherits_slow_motion = True # Don't change. - self.inherits_tint = True # Don't change. - self.inherits_vr_camera_offset = True # Don't change. - self.inherits_vr_overlay_center = True - self.use_fixed_vr_overlay = True self._background: Optional[ba.Actor] = None def on_transition_in(self) -> None: @@ -141,13 +141,15 @@ class ScoreScreenActivity(Activity[EmptyPlayer, EmptyTeam]): After a specified delay, player input is assigned to end the activity. """ + transition_time = 0.5 + inherits_tint = True + inherits_vr_camera_offset = True + use_fixed_vr_overlay = True + + default_music: Optional[MusicType] = MusicType.SCORES + def __init__(self, settings: dict): super().__init__(settings) - self.transition_time = 0.5 - self.inherits_tint = True - self.inherits_vr_camera_offset = True - self.use_fixed_vr_overlay = True - self.default_music: Optional[MusicType] = MusicType.SCORES self._birth_time = _ba.time() self._min_view_time = 5.0 self._allow_server_transition = False @@ -160,15 +162,14 @@ class ScoreScreenActivity(Activity[EmptyPlayer, EmptyTeam]): self._server_transitioning: Optional[bool] = None def on_player_join(self, player: EmptyPlayer) -> None: - from ba import _general + from ba._general import WeakCall super().on_player_join(player) time_till_assign = max( 0, self._birth_time + self._min_view_time - _ba.time()) # If we're still kicking at the end of our assign-delay, assign this # guy's input to trigger us. - _ba.timer(time_till_assign, _general.WeakCall(self._safe_assign, - player)) + _ba.timer(time_till_assign, WeakCall(self._safe_assign, player)) def on_transition_in(self) -> None: from bastd.actor.tipstext import TipsText @@ -228,7 +229,7 @@ class ScoreScreenActivity(Activity[EmptyPlayer, EmptyTeam]): def _safe_assign(self, player: EmptyPlayer) -> None: # Just to be extra careful, don't assign if we're transitioning out. - # (though theoretically that would be ok). + # (though theoretically that should be ok). if not self.is_transitioning_out() and player: player.assigninput((InputType.JUMP_PRESS, InputType.PUNCH_PRESS, InputType.BOMB_PRESS, InputType.PICK_UP_PRESS), diff --git a/assets/src/ba_data/python/ba/_analytics.py b/assets/src/ba_data/python/ba/_analytics.py index 8448c963..f01853fd 100644 --- a/assets/src/ba_data/python/ba/_analytics.py +++ b/assets/src/ba_data/python/ba/_analytics.py @@ -50,7 +50,7 @@ def game_begin_analytics() -> None: assert campaign is not None _ba.set_analytics_screen( 'Coop Game: ' + campaign.name + ' ' + - campaign.get_level(_ba.app.coop_session_args['level']).name) + campaign.getlevel(_ba.app.coop_session_args['level']).name) _ba.increment_analytics_count('Co-op round start') if len(activity.players) == 1: _ba.increment_analytics_count('Co-op round start 1 human player') diff --git a/assets/src/ba_data/python/ba/_app.py b/assets/src/ba_data/python/ba/_app.py index 8847c13c..946a8908 100644 --- a/assets/src/ba_data/python/ba/_app.py +++ b/assets/src/ba_data/python/ba/_app.py @@ -724,26 +724,25 @@ class App: args: Dict = None) -> bool: """High level way to launch a local co-op session.""" # pylint: disable=cyclic-import - from ba._campaign import get_campaign + from ba._campaign import getcampaign from bastd.ui.coop.level import CoopLevelLockedWindow if args is None: args = {} if game == '': raise ValueError('empty game name') campaignname, levelname = game.split(':') - campaign = get_campaign(campaignname) - levels = campaign.get_levels() + campaign = getcampaign(campaignname) # If this campaign is sequential, make sure we've completed the # one before this. if campaign.sequential and not force: - for level in levels: + for level in campaign.levels: if level.name == levelname: break if not level.complete: CoopLevelLockedWindow( - campaign.get_level(levelname).displayname, - campaign.get_level(level.name).displayname) + campaign.getlevel(levelname).displayname, + campaign.getlevel(level.name).displayname) return False # Ok, we're good to go. diff --git a/assets/src/ba_data/python/ba/_campaign.py b/assets/src/ba_data/python/ba/_campaign.py index b7112972..6fd832e6 100644 --- a/assets/src/ba_data/python/ba/_campaign.py +++ b/assets/src/ba_data/python/ba/_campaign.py @@ -35,7 +35,7 @@ def register_campaign(campaign: ba.Campaign) -> None: _ba.app.campaigns[campaign.name] = campaign -def get_campaign(name: str) -> ba.Campaign: +def getcampaign(name: str) -> ba.Campaign: """Return a campaign by name.""" return _ba.app.campaigns[name] @@ -61,18 +61,19 @@ class Campaign: """Whether this Campaign's levels must be played in sequence.""" return self._sequential - def add_level(self, level: ba.Level) -> None: + def addlevel(self, level: ba.Level) -> None: """Adds a ba.Level to the Campaign.""" - if level.get_campaign() is not None: - raise RuntimeError('level already belongs to a campaign') + if level.campaign is not None: + raise RuntimeError('Level already belongs to a campaign.') level.set_campaign(self, len(self._levels)) self._levels.append(level) - def get_levels(self) -> List[ba.Level]: - """Return the set of ba.Levels in the Campaign.""" + @property + def levels(self) -> List[ba.Level]: + """The list of ba.Levels in the Campaign.""" return self._levels - def get_level(self, name: str) -> ba.Level: + def getlevel(self, name: str) -> ba.Level: """Return a contained ba.Level by name.""" from ba import _error for level in self._levels: @@ -89,14 +90,15 @@ class Campaign: # FIXME should these give/take ba.Level instances instead of level names?.. def set_selected_level(self, levelname: str) -> None: """Set the Level currently selected in the UI (by name).""" - self.get_config_dict()['Selection'] = levelname + self.configdict['Selection'] = levelname _ba.app.config.commit() def get_selected_level(self) -> str: """Return the name of the Level currently selected in the UI.""" - return self.get_config_dict().get('Selection', self._levels[0].name) + return self.configdict.get('Selection', self._levels[0].name) - def get_config_dict(self) -> Dict[str, Any]: + @property + def configdict(self) -> Dict[str, Any]: """Return the live config dict for this campaign.""" val: Dict[str, Any] = (_ba.app.config.setdefault('Campaigns', {}).setdefault( @@ -123,47 +125,47 @@ def init_campaigns() -> None: # FIXME: Once translations catch up, we can convert these to use the # generic display-name '${GAME} Training' type stuff. campaign = Campaign('Easy') - campaign.add_level( + campaign.addlevel( _level.Level('Onslaught Training', gametype=OnslaughtGame, settings={'preset': 'training_easy'}, preview_texture_name='doomShroomPreview')) - campaign.add_level( + campaign.addlevel( _level.Level('Rookie Onslaught', gametype=OnslaughtGame, settings={'preset': 'rookie_easy'}, preview_texture_name='courtyardPreview')) - campaign.add_level( + campaign.addlevel( _level.Level('Rookie Football', gametype=FootballCoopGame, settings={'preset': 'rookie_easy'}, preview_texture_name='footballStadiumPreview')) - campaign.add_level( + campaign.addlevel( _level.Level('Pro Onslaught', gametype=OnslaughtGame, settings={'preset': 'pro_easy'}, preview_texture_name='doomShroomPreview')) - campaign.add_level( + campaign.addlevel( _level.Level('Pro Football', gametype=FootballCoopGame, settings={'preset': 'pro_easy'}, preview_texture_name='footballStadiumPreview')) - campaign.add_level( + campaign.addlevel( _level.Level('Pro Runaround', gametype=RunaroundGame, settings={'preset': 'pro_easy'}, preview_texture_name='towerDPreview')) - campaign.add_level( + campaign.addlevel( _level.Level('Uber Onslaught', gametype=OnslaughtGame, settings={'preset': 'uber_easy'}, preview_texture_name='courtyardPreview')) - campaign.add_level( + campaign.addlevel( _level.Level('Uber Football', gametype=FootballCoopGame, settings={'preset': 'uber_easy'}, preview_texture_name='footballStadiumPreview')) - campaign.add_level( + campaign.addlevel( _level.Level('Uber Runaround', gametype=RunaroundGame, settings={'preset': 'uber_easy'}, @@ -172,52 +174,52 @@ def init_campaigns() -> None: # "hard" mode campaign = Campaign('Default') - campaign.add_level( + campaign.addlevel( _level.Level('Onslaught Training', gametype=OnslaughtGame, settings={'preset': 'training'}, preview_texture_name='doomShroomPreview')) - campaign.add_level( + campaign.addlevel( _level.Level('Rookie Onslaught', gametype=OnslaughtGame, settings={'preset': 'rookie'}, preview_texture_name='courtyardPreview')) - campaign.add_level( + campaign.addlevel( _level.Level('Rookie Football', gametype=FootballCoopGame, settings={'preset': 'rookie'}, preview_texture_name='footballStadiumPreview')) - campaign.add_level( + campaign.addlevel( _level.Level('Pro Onslaught', gametype=OnslaughtGame, settings={'preset': 'pro'}, preview_texture_name='doomShroomPreview')) - campaign.add_level( + campaign.addlevel( _level.Level('Pro Football', gametype=FootballCoopGame, settings={'preset': 'pro'}, preview_texture_name='footballStadiumPreview')) - campaign.add_level( + campaign.addlevel( _level.Level('Pro Runaround', gametype=RunaroundGame, settings={'preset': 'pro'}, preview_texture_name='towerDPreview')) - campaign.add_level( + campaign.addlevel( _level.Level('Uber Onslaught', gametype=OnslaughtGame, settings={'preset': 'uber'}, preview_texture_name='courtyardPreview')) - campaign.add_level( + campaign.addlevel( _level.Level('Uber Football', gametype=FootballCoopGame, settings={'preset': 'uber'}, preview_texture_name='footballStadiumPreview')) - campaign.add_level( + campaign.addlevel( _level.Level('Uber Runaround', gametype=RunaroundGame, settings={'preset': 'uber'}, preview_texture_name='towerDPreview')) - campaign.add_level( + campaign.addlevel( _level.Level('The Last Stand', gametype=TheLastStandGame, settings={}, @@ -226,17 +228,17 @@ def init_campaigns() -> None: # challenges: our 'official' random extra co-op levels campaign = Campaign('Challenges', sequential=False) - campaign.add_level( + campaign.addlevel( _level.Level('Infinite Onslaught', gametype=OnslaughtGame, settings={'preset': 'endless'}, preview_texture_name='doomShroomPreview')) - campaign.add_level( + campaign.addlevel( _level.Level('Infinite Runaround', gametype=RunaroundGame, settings={'preset': 'endless'}, preview_texture_name='towerDPreview')) - campaign.add_level( + campaign.addlevel( _level.Level('Race', displayname='${GAME}', gametype=RaceGame, @@ -246,7 +248,7 @@ def init_campaigns() -> None: 'Bomb Spawning': 0 }, preview_texture_name='bigGPreview')) - campaign.add_level( + campaign.addlevel( _level.Level('Pro Race', displayname='Pro ${GAME}', gametype=RaceGame, @@ -256,7 +258,7 @@ def init_campaigns() -> None: 'Bomb Spawning': 1000 }, preview_texture_name='bigGPreview')) - campaign.add_level( + campaign.addlevel( _level.Level('Lake Frigid Race', displayname='${GAME}', gametype=RaceGame, @@ -267,55 +269,55 @@ def init_campaigns() -> None: 'Bomb Spawning': 0 }, preview_texture_name='lakeFrigidPreview')) - campaign.add_level( + campaign.addlevel( _level.Level('Football', displayname='${GAME}', gametype=FootballCoopGame, settings={'preset': 'tournament'}, preview_texture_name='footballStadiumPreview')) - campaign.add_level( + campaign.addlevel( _level.Level('Pro Football', displayname='Pro ${GAME}', gametype=FootballCoopGame, settings={'preset': 'tournament_pro'}, preview_texture_name='footballStadiumPreview')) - campaign.add_level( + campaign.addlevel( _level.Level('Runaround', displayname='${GAME}', gametype=RunaroundGame, settings={'preset': 'tournament'}, preview_texture_name='towerDPreview')) - campaign.add_level( + campaign.addlevel( _level.Level('Uber Runaround', displayname='Uber ${GAME}', gametype=RunaroundGame, settings={'preset': 'tournament_uber'}, preview_texture_name='towerDPreview')) - campaign.add_level( + campaign.addlevel( _level.Level('The Last Stand', displayname='${GAME}', gametype=TheLastStandGame, settings={'preset': 'tournament'}, preview_texture_name='rampagePreview')) - campaign.add_level( + campaign.addlevel( _level.Level('Tournament Infinite Onslaught', displayname='Infinite Onslaught', gametype=OnslaughtGame, settings={'preset': 'endless_tournament'}, preview_texture_name='doomShroomPreview')) - campaign.add_level( + campaign.addlevel( _level.Level('Tournament Infinite Runaround', displayname='Infinite Runaround', gametype=RunaroundGame, settings={'preset': 'endless_tournament'}, preview_texture_name='towerDPreview')) - campaign.add_level( + campaign.addlevel( _level.Level('Target Practice', displayname='Pro ${GAME}', gametype=TargetPracticeGame, settings={}, preview_texture_name='doomShroomPreview')) - campaign.add_level( + campaign.addlevel( _level.Level('Target Practice B', displayname='${GAME}', gametype=TargetPracticeGame, @@ -325,38 +327,38 @@ def init_campaigns() -> None: 'Enable Triple Bombs': False }, preview_texture_name='doomShroomPreview')) - campaign.add_level( + campaign.addlevel( _level.Level('Meteor Shower', displayname='${GAME}', gametype=MeteorShowerGame, settings={}, preview_texture_name='rampagePreview')) - campaign.add_level( + campaign.addlevel( _level.Level('Epic Meteor Shower', displayname='${GAME}', gametype=MeteorShowerGame, settings={'Epic Mode': True}, preview_texture_name='rampagePreview')) - campaign.add_level( + campaign.addlevel( _level.Level('Easter Egg Hunt', displayname='${GAME}', gametype=EasterEggHuntGame, settings={}, preview_texture_name='towerDPreview')) - campaign.add_level( + campaign.addlevel( _level.Level('Pro Easter Egg Hunt', displayname='Pro ${GAME}', gametype=EasterEggHuntGame, settings={'Pro Mode': True}, preview_texture_name='towerDPreview')) - campaign.add_level( + campaign.addlevel( _level.Level( name='Ninja Fight', # (unique id not seen by player) displayname='${GAME}', # (readable name seen by player) gametype=NinjaFightGame, settings={'preset': 'regular'}, preview_texture_name='courtyardPreview')) - campaign.add_level( + campaign.addlevel( _level.Level(name='Pro Ninja Fight', displayname='Pro ${GAME}', gametype=NinjaFightGame, diff --git a/assets/src/ba_data/python/ba/_coopgame.py b/assets/src/ba_data/python/ba/_coopgame.py index 0895181d..4e169f81 100644 --- a/assets/src/ba_data/python/ba/_coopgame.py +++ b/assets/src/ba_data/python/ba/_coopgame.py @@ -74,7 +74,7 @@ class CoopGameActivity(GameActivity[PlayerType, TeamType]): levelname = self._get_coop_level_name() campaign = self.session.campaign assert campaign is not None - config_str = (str(len(self.players)) + 'p' + campaign.get_level( + config_str = (str(len(self.players)) + 'p' + campaign.getlevel( self.settings_raw['name']).get_score_version_string().replace( ' ', '_')) _ba.get_scores_to_beat(levelname, config_str, diff --git a/assets/src/ba_data/python/ba/_coopsession.py b/assets/src/ba_data/python/ba/_coopsession.py index 8f57b9b8..90da45f8 100644 --- a/assets/src/ba_data/python/ba/_coopsession.py +++ b/assets/src/ba_data/python/ba/_coopsession.py @@ -60,7 +60,7 @@ class CoopSession(Session): def __init__(self) -> None: """Instantiate a co-op mode session.""" # pylint: disable=cyclic-import - from ba._campaign import get_campaign + from ba._campaign import getcampaign from bastd.activity.coopjoin import CoopJoinActivity _ba.increment_analytics_count('Co-op session start') @@ -90,7 +90,7 @@ class CoopSession(Session): self.tournament_id: Optional[str] = ( app.coop_session_args.get('tournament_id')) - self.campaign = get_campaign(app.coop_session_args['campaign']) + self.campaign = getcampaign(app.coop_session_args['campaign']) self.campaign_level_name: str = app.coop_session_args['level'] self._ran_tutorial_activity = False @@ -116,7 +116,7 @@ class CoopSession(Session): # Build an instance for the current level. assert self.campaign is not None - level = self.campaign.get_level(self.campaign_level_name) + level = self.campaign.getlevel(self.campaign_level_name) gametype = level.gametype settings = level.get_settings() @@ -131,8 +131,8 @@ class CoopSession(Session): self._current_game_instance: GameActivity = newactivity # Find the next level and build an instance for it too. - levels = self.campaign.get_levels() - level = self.campaign.get_level(self.campaign_level_name) + levels = self.campaign.levels + level = self.campaign.getlevel(self.campaign_level_name) nextlevel: Optional[ba.Level] if level.index < len(levels) - 1: diff --git a/assets/src/ba_data/python/ba/_gameactivity.py b/assets/src/ba_data/python/ba/_gameactivity.py index c83e6ea6..b7e7cb77 100644 --- a/assets/src/ba_data/python/ba/_gameactivity.py +++ b/assets/src/ba_data/python/ba/_gameactivity.py @@ -290,7 +290,7 @@ class GameActivity(Activity[PlayerType, TeamType]): if isinstance(self.session, CoopSession): campaign = self.session.campaign assert campaign is not None - return campaign.get_level( + return campaign.getlevel( self.session.campaign_level_name).displayname except Exception: print_error('error getting campaign level name') diff --git a/assets/src/ba_data/python/ba/_level.py b/assets/src/ba_data/python/ba/_level.py index ffe88bde..42afa83a 100644 --- a/assets/src/ba_data/python/ba/_level.py +++ b/assets/src/ba_data/python/ba/_level.py @@ -45,7 +45,6 @@ class Level: settings: dict, preview_texture_name: str, displayname: str = None): - """Initializes a Level object with the provided values.""" self._name = name self._gametype = gametype self._settings = settings @@ -93,8 +92,9 @@ class Level: """The type of game used for this Level.""" return self._gametype - def get_campaign(self) -> Optional[ba.Campaign]: - """Return the ba.Campaign this Level is associated with, or None.""" + @property + def campaign(self) -> Optional[ba.Campaign]: + """The ba.Campaign this Level is associated with, or None.""" return None if self._campaign is None else self._campaign() @property @@ -123,7 +123,7 @@ class Level: config = self._get_config_dict() config['Complete'] = val - def get_high_scores(self) -> Dict: + def get_high_scores(self) -> dict: """Return the current high scores for this Level.""" config = self._get_config_dict() high_scores_key = 'High Scores' + self.get_score_version_string() @@ -167,15 +167,14 @@ class Level: The referenced dict exists under the game's config dict and can be modified in place.""" - campaign = self.get_campaign() + campaign = self.campaign if campaign is None: - raise TypeError('level is not in a campaign') - campaign_config = campaign.get_config_dict() - val: Dict[str, - Any] = campaign_config.setdefault(self._name, { - 'Rating': 0.0, - 'Complete': False - }) + raise RuntimeError('Level is not in a campaign.') + configdict = campaign.configdict + val: Dict[str, Any] = configdict.setdefault(self._name, { + 'Rating': 0.0, + 'Complete': False + }) assert isinstance(val, dict) return val diff --git a/assets/src/ba_data/python/ba/internal.py b/assets/src/ba_data/python/ba/internal.py index 4a9f5386..a33bee87 100644 --- a/assets/src/ba_data/python/ba/internal.py +++ b/assets/src/ba_data/python/ba/internal.py @@ -48,7 +48,7 @@ from ba._apputils import (is_browser_likely_available, get_remote_app_name, should_submit_debug_info, show_ad, show_ad_2) from ba._benchmark import (run_gpu_benchmark, run_cpu_benchmark, run_media_reload_benchmark, run_stress_test) -from ba._campaign import get_campaign +from ba._campaign import getcampaign from ba._messages import PlayerProfilesChangedMessage from ba._meta import get_game_types from ba._modutils import show_user_scripts diff --git a/assets/src/ba_data/python/bastd/activity/coopjoin.py b/assets/src/ba_data/python/bastd/activity/coopjoin.py index 54bd831f..e1f06dd0 100644 --- a/assets/src/ba_data/python/bastd/activity/coopjoin.py +++ b/assets/src/ba_data/python/bastd/activity/coopjoin.py @@ -47,7 +47,7 @@ class CoopJoinActivity(JoinActivity): assert session.campaign is not None level_name_full = (session.campaign.name + ':' + session.campaign_level_name) - config_str = ('1p' + session.campaign.get_level( + config_str = ('1p' + session.campaign.getlevel( session.campaign_level_name).get_score_version_string().replace( ' ', '_')) _ba.get_scores_to_beat(level_name_full, config_str, @@ -59,7 +59,7 @@ class CoopJoinActivity(JoinActivity): super().on_transition_in() assert isinstance(self.session, ba.CoopSession) assert self.session.campaign - Text(self.session.campaign.get_level( + Text(self.session.campaign.getlevel( self.session.campaign_level_name).displayname, scale=1.3, h_attach=Text.HAttach.CENTER, diff --git a/assets/src/ba_data/python/bastd/activity/coopscore.py b/assets/src/ba_data/python/bastd/activity/coopscore.py index e3092882..9f05dd18 100644 --- a/assets/src/ba_data/python/bastd/activity/coopscore.py +++ b/assets/src/ba_data/python/bastd/activity/coopscore.py @@ -174,7 +174,7 @@ class CoopScoreScreen(ba.Activity[ba.Player, ba.Team]): self._game_name_str = self._campaign.name + ':' + self._level_name self._game_config_str = str(len( - self._playerinfos)) + 'p' + self._campaign.get_level( + self._playerinfos)) + 'p' + self._campaign.getlevel( self._level_name).get_score_version_string().replace(' ', '_') # If game-center/etc scores are available we show our friends' @@ -183,7 +183,7 @@ class CoopScoreScreen(ba.Activity[ba.Player, ba.Team]): self._game_name_str, self._game_config_str) try: - self._old_best_rank = self._campaign.get_level( + self._old_best_rank = self._campaign.getlevel( self._level_name).rating except Exception: self._old_best_rank = 0.0 @@ -522,8 +522,8 @@ class CoopScoreScreen(ba.Activity[ba.Player, ba.Team]): self._begin_time = ba.time() # Calc whether the level is complete and other stuff. - levels = self._campaign.get_levels() - level = self._campaign.get_level(self._level_name) + levels = self._campaign.levels + level = self._campaign.getlevel(self._level_name) self._was_complete = level.complete self._is_complete = (self._was_complete or self._victory) self._newly_complete = (self._is_complete and not self._was_complete) @@ -591,7 +591,7 @@ class CoopScoreScreen(ba.Activity[ba.Player, ba.Team]): pstr = ba.Lstr(value='- ${A} -', subs=[('${A}', ba.Lstr(resource='singlePlayerCountText'))]) - ZoomText(self._campaign.get_level(self._level_name).displayname, + ZoomText(self._campaign.getlevel(self._level_name).displayname, maxwidth=800, flash=False, trail=False, @@ -659,7 +659,7 @@ class CoopScoreScreen(ba.Activity[ba.Player, ba.Team]): ba.timer(0.4, ba.WeakCall(self._play_drumroll)) # Add us to high scores, filter, and store. - our_high_scores_all = self._campaign.get_level( + our_high_scores_all = self._campaign.getlevel( self._level_name).get_high_scores() try: our_high_scores = our_high_scores_all[str(len(self._playerinfos)) + @@ -691,7 +691,7 @@ class CoopScoreScreen(ba.Activity[ba.Player, ba.Team]): del our_high_scores[10:] if self._score is not None: - sver = (self._campaign.get_level( + sver = (self._campaign.getlevel( self._level_name).get_score_version_string()) _ba.add_transaction({ 'type': 'SET_LEVEL_LOCAL_HIGH_SCORES', @@ -1391,7 +1391,7 @@ class CoopScoreScreen(ba.Activity[ba.Player, ba.Team]): dostar(2, 10 - 30, -112, '7.5') dostar(3, 77 - 30, -112, '9.5') try: - best_rank = self._campaign.get_level(self._level_name).rating + best_rank = self._campaign.getlevel(self._level_name).rating except Exception: best_rank = 0.0 diff --git a/assets/src/ba_data/python/bastd/activity/multiteamvictory.py b/assets/src/ba_data/python/bastd/activity/multiteamvictory.py index ea2bd5ae..eec98f82 100644 --- a/assets/src/ba_data/python/bastd/activity/multiteamvictory.py +++ b/assets/src/ba_data/python/bastd/activity/multiteamvictory.py @@ -34,18 +34,16 @@ if TYPE_CHECKING: class TeamSeriesVictoryScoreScreenActivity(MultiTeamScoreScreenActivity): """Final score screen for a team series.""" + # Dont' play music by default; (we do manually after a delay). + default_music = None + def __init__(self, settings: dict): super().__init__(settings=settings) self._min_view_time = 15.0 self._is_ffa = isinstance(self.session, ba.FreeForAllSession) self._allow_server_transition = True self._tips_text = None - - def on_transition_in(self) -> None: - # We don't yet want music and whatnot... - self.default_music = None self._default_show_tips = False - super().on_transition_in() def on_begin(self) -> None: # pylint: disable=too-many-branches diff --git a/assets/src/ba_data/python/bastd/game/ninjafight.py b/assets/src/ba_data/python/bastd/game/ninjafight.py index 1180dda6..be60ecc2 100644 --- a/assets/src/ba_data/python/bastd/game/ninjafight.py +++ b/assets/src/ba_data/python/bastd/game/ninjafight.py @@ -56,6 +56,7 @@ class NinjaFightGame(ba.TeamGameActivity[Player, Team]): scoreconfig = ba.ScoreConfig(label='Time', scoretype=ba.ScoreType.MILLISECONDS, lower_is_better=True) + default_music = ba.MusicType.TO_THE_DEATH @classmethod def get_supported_maps(cls, sessiontype: Type[ba.Session]) -> List[str]: @@ -79,12 +80,6 @@ class NinjaFightGame(ba.TeamGameActivity[Player, Team]): self._bots = SpazBotSet() self._preset = str(settings['preset']) - # Called when our game is transitioning in but not ready to begin; - # we can go ahead and start creating stuff, playing music, etc. - def on_transition_in(self) -> None: - self.default_music = ba.MusicType.TO_THE_DEATH - super().on_transition_in() - # Called when our game actually begins. def on_begin(self) -> None: super().on_begin() diff --git a/assets/src/ba_data/python/bastd/ui/account/settings.py b/assets/src/ba_data/python/bastd/ui/account/settings.py index 48b63361..4ece4879 100644 --- a/assets/src/ba_data/python/bastd/ui/account/settings.py +++ b/assets/src/ba_data/python/bastd/ui/account/settings.py @@ -968,13 +968,13 @@ class AccountSettingsWindow(ba.Window): ('${A}', accounts_str)])) def _refresh_campaign_progress_text(self) -> None: - from ba.internal import get_campaign + from ba.internal import getcampaign if self._campaign_progress_text is None: return p_str: Union[str, ba.Lstr] try: - campaign = get_campaign('Default') - levels = campaign.get_levels() + campaign = getcampaign('Default') + levels = campaign.levels levels_complete = sum((1 if l.complete else 0) for l in levels) # Last level cant be completed; hence the -1; @@ -1071,14 +1071,14 @@ class AccountSettingsWindow(ba.Window): def _reset_progress(self) -> None: try: - from ba.internal import get_campaign + from ba.internal import getcampaign # FIXME: This would need to happen server-side these days. if self._can_reset_achievements: ba.app.config['Achievements'] = {} _ba.reset_achievements() - campaign = get_campaign('Default') + campaign = getcampaign('Default') campaign.reset() # also writes the config.. - campaign = get_campaign('Challenges') + campaign = getcampaign('Challenges') campaign.reset() # also writes the config.. except Exception: ba.print_exception('exception resetting co-op campaign progress') diff --git a/assets/src/ba_data/python/bastd/ui/coop/browser.py b/assets/src/ba_data/python/bastd/ui/coop/browser.py index 721f4c6d..396dead6 100644 --- a/assets/src/ba_data/python/bastd/ui/coop/browser.py +++ b/assets/src/ba_data/python/bastd/ui/coop/browser.py @@ -343,7 +343,7 @@ class CoopBrowserWindow(ba.Window): # pylint: disable=too-many-statements # pylint: disable=too-many-locals # pylint: disable=too-many-branches - from ba.internal import get_campaign, get_tournament_prize_strings + from ba.internal import getcampaign, get_tournament_prize_strings # If the number of tournaments or challenges in the data differs from # our current arrangement, refresh with the new number. @@ -466,20 +466,20 @@ class CoopBrowserWindow(ba.Window): opacity=0.2) else: campaignname, levelname = game.split(':') - campaign = get_campaign(campaignname) + campaign = getcampaign(campaignname) max_players = ba.app.tournament_info[ tbtn['tournament_id']]['maxPlayers'] txt = ba.Lstr( value='${A} ${B}', - subs=[('${A}', campaign.get_level(levelname).displayname), + subs=[('${A}', campaign.getlevel(levelname).displayname), ('${B}', ba.Lstr(resource='playerCountAbbreviatedText', subs=[('${COUNT}', str(max_players))]))]) ba.textwidget(edit=tbtn['button_text'], text=txt) - ba.imagewidget(edit=tbtn['image'], - texture=campaign.get_level( - levelname).get_preview_texture(), - opacity=1.0 if enabled else 0.5) + ba.imagewidget( + edit=tbtn['image'], + texture=campaign.getlevel(levelname).get_preview_texture(), + opacity=1.0 if enabled else 0.5) fee = entry['fee'] @@ -615,7 +615,7 @@ class CoopBrowserWindow(ba.Window): def _refresh_campaign_row(self) -> None: # pylint: disable=too-many-locals # pylint: disable=cyclic-import - from ba.internal import get_campaign + from ba.internal import getcampaign from bastd.ui.coop.gamebutton import GameButton parent_widget = self._campaign_sub_container @@ -716,8 +716,8 @@ class CoopBrowserWindow(ba.Window): down_widget=next_widget_down) # Update our existing percent-complete text. - campaign = get_campaign(campaignname) - levels = campaign.get_levels() + campaign = getcampaign(campaignname) + levels = campaign.levels levels_complete = sum((1 if l.complete else 0) for l in levels) # Last level cant be completed; hence the -1. @@ -936,7 +936,7 @@ class CoopBrowserWindow(ba.Window): # add all custom user levels here.. # items += [ # 'User:' + l.getname() - # for l in get_campaign('User').get_levels() + # for l in getcampaign('User').getlevels() # ] self._custom_h_scroll = custom_h_scroll = h_scroll = ba.hscrollwidget( diff --git a/assets/src/ba_data/python/bastd/ui/coop/gamebutton.py b/assets/src/ba_data/python/bastd/ui/coop/gamebutton.py index f7bd8b87..3f7683cb 100644 --- a/assets/src/ba_data/python/bastd/ui/coop/gamebutton.py +++ b/assets/src/ba_data/python/bastd/ui/coop/gamebutton.py @@ -40,7 +40,7 @@ class GameButton: x: float, y: float, select: bool, row: str): # pylint: disable=too-many-statements # pylint: disable=too-many-locals - from ba.internal import (get_achievements_for_coop_level, get_campaign) + from ba.internal import (get_achievements_for_coop_level, getcampaign) self._game = game sclx = 195.0 scly = 195.0 @@ -54,8 +54,8 @@ class GameButton: campaignname = 'Default' rating: Optional[float] - campaign = get_campaign(campaignname) - rating = campaign.get_level(levelname).rating + campaign = getcampaign(campaignname) + rating = campaign.getlevel(levelname).rating if game == 'Easy:The Last Stand': rating = None @@ -95,10 +95,10 @@ class GameButton: size=(image_width, image_width * 0.5), model_transparent=window.lsbt, model_opaque=window.lsbo, - texture=campaign.get_level(levelname).get_preview_texture(), + texture=campaign.getlevel(levelname).get_preview_texture(), mask_texture=ba.gettexture('mapPreviewMask')) - translated = campaign.get_level(levelname).displayname + translated = campaign.getlevel(levelname).displayname self._achievements = (get_achievements_for_coop_level(game)) self._name_widget = ba.textwidget(parent=parent, @@ -182,7 +182,7 @@ class GameButton: def _update(self) -> None: # pylint: disable=too-many-boolean-expressions - from ba.internal import have_pro, get_campaign + from ba.internal import have_pro, getcampaign game = self._game campaignname, levelname = game.split(':') @@ -192,15 +192,13 @@ class GameButton: if game == 'Easy:The Last Stand': campaignname = 'Default' - campaign = get_campaign(campaignname) - - levels = campaign.get_levels() + campaign = getcampaign(campaignname) # If this campaign is sequential, make sure we've unlocked # everything up to here. unlocked = True if campaign.sequential: - for level in levels: + for level in campaign.levels: if level.name == levelname: break if not level.complete: diff --git a/docs/ba_module.md b/docs/ba_module.md index 662e9975..ed4fc6dc 100644 --- a/docs/ba_module.md +++ b/docs/ba_module.md @@ -1,5 +1,5 @@ -

last updated on 2020-06-03 for Ballistica version 1.5.0 build 20044

+

last updated on 2020-06-03 for Ballistica version 1.5.0 build 20045

This page documents the Python classes and functions in the 'ba' module, which are the ones most relevant to modding in Ballistica. If you come across something you feel should be included here or could be better explained, please let me know. Happy modding!


@@ -1236,8 +1236,18 @@ mycall()

Attributes:

-
name, sequential
+
configdict, levels, name, sequential
+

configdict

+

Dict[str, Any]

+

Return the live config dict for this campaign.

+ +
+

levels

+

List[ba.Level]

+

The list of ba.Levels in the Campaign.

+ +

name

str

The name of the Campaign.

@@ -1250,41 +1260,29 @@ mycall()

Methods:

-
<constructor>, add_level(), get_config_dict(), get_level(), get_levels(), get_selected_level(), reset(), set_selected_level()
+
<constructor>, addlevel(), get_selected_level(), getlevel(), reset(), set_selected_level()

<constructor>

ba.Campaign(name: str, sequential: bool = True)

-

add_level()

-

add_level(self, level: ba.Level) -> None

+

addlevel()

+

addlevel(self, level: ba.Level) -> None

Adds a ba.Level to the Campaign.

-
-

get_config_dict()

-

get_config_dict(self) -> Dict[str, Any]

- -

Return the live config dict for this campaign.

- -
-

get_level()

-

get_level(self, name: str) -> ba.Level

- -

Return a contained ba.Level by name.

- -
-

get_levels()

-

get_levels(self) -> List[ba.Level]

- -

Return the set of ba.Levels in the Campaign.

-

get_selected_level()

get_selected_level(self) -> str

Return the name of the Level currently selected in the UI.

+
+

getlevel()

+

getlevel(self, name: str) -> ba.Level

+ +

Return a contained ba.Level by name.

+

reset()

reset(self) -> None

@@ -3051,8 +3049,13 @@ prefs, etc.

Attributes:

-
complete, displayname, gametype, index, name, preview_texture_name, rating
+
campaign, complete, displayname, gametype, index, name, preview_texture_name, rating
+

campaign

+

Optional[ba.Campaign]

+

The ba.Campaign this Level is associated with, or None.

+ +

complete

bool

Whether this Level has been completed.

@@ -3093,22 +3096,14 @@ prefs, etc.

Methods:

-
<constructor>, get_campaign(), get_high_scores(), get_preview_texture(), get_score_version_string(), get_settings(), set_complete(), set_high_scores(), set_rating()
+
<constructor>, get_high_scores(), get_preview_texture(), get_score_version_string(), get_settings(), set_complete(), set_high_scores(), set_rating()

<constructor>

ba.Level(name: str, gametype: Type[ba.GameActivity], settings: dict, preview_texture_name: str, displayname: str = None)

-

Initializes a Level object with the provided values.

- -
-

get_campaign()

-

get_campaign(self) -> Optional[ba.Campaign]

- -

Return the ba.Campaign this Level is associated with, or None.

-

get_high_scores()

-

get_high_scores(self) -> Dict

+

get_high_scores(self) -> dict

Return the current high scores for this Level.

diff --git a/tools/batools/build.py b/tools/batools/build.py index 524b3043..f36b2e8c 100644 --- a/tools/batools/build.py +++ b/tools/batools/build.py @@ -47,7 +47,7 @@ class PipRequirement: PIP_REQUIREMENTS = [ PipRequirement(modulename='pylint', minversion=[2, 5, 2]), - PipRequirement(modulename='mypy', minversion=[0, 770]), + PipRequirement(modulename='mypy', minversion=[0, 780]), PipRequirement(modulename='yapf', minversion=[0, 30, 0]), PipRequirement(modulename='cpplint', minversion=[1, 5, 0]), PipRequirement(modulename='typing_extensions'),