Tidying and language updates

This commit is contained in:
Eric Froemling 2020-06-03 12:06:40 -07:00
parent 9a48d6581a
commit 58766a8f6e
21 changed files with 202 additions and 226 deletions

View File

@ -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/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/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/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/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/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", "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/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/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/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/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/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/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/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/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/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/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", "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/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/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", "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/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/b3/10/7ab16ca078a401bbbe2310660b85", "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/ef/f5/be729c0261c6326c3ef92330b764", "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/98/9d/98bc183187af679fbc6531e3ac04", "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/17/07/aed82d9bc9c5b4dd3457fcea9a8a", "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/71/5e/a837ebb98b829cd3bebf081e02b0", "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/9c/a0/3204f264abfd13f40f7f4f72aa65", "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/68/ab/de21be17db5b93a7191c353dbce8", "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/54/5a/e32b46e614ed37c7ebe42c73b03c", "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/15/09/2245bdaf317da30c7d63d8559c82", "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/f6/45/6972dd74de4fc822a28e995a4a0d", "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/34/74/e8ff832e808ceaa07a4015fb2a5f" "build/prefab/windows/release/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/8e/2a/f24b48e15ef4fd5794c5e426081b"
} }

View File

@ -291,9 +291,9 @@ class Achievement:
name: Union[ba.Lstr, str] name: Union[ba.Lstr, str]
try: try:
if self._level_name != '': if self._level_name != '':
from ba._campaign import get_campaign from ba._campaign import getcampaign
campaignname, campaign_level = self._level_name.split(':') campaignname, campaign_level = self._level_name.split(':')
name = get_campaign(campaignname).get_level( name = getcampaign(campaignname).getlevel(
campaign_level).displayname campaign_level).displayname
else: else:
name = '' name = ''

View File

@ -326,14 +326,9 @@ class Activity(DependencyComponent, Generic[PlayerType, TeamType]):
returns False for the Actor. The ba.Actor.autoretain() method returns False for the Actor. The ba.Actor.autoretain() method
is a convenient way to access this same functionality. is a convenient way to access this same functionality.
""" """
from ba import _actor as bsactor if __debug__:
if not isinstance(actor, bsactor.Actor): from ba._actor import Actor
raise TypeError('non-actor passed to retain_actor') assert isinstance(actor, Actor)
# Make sure our pruning is happening...
assert (not self.has_transitioned_in()
or _ba.time() - self._last_prune_dead_actors_time < 10.0)
self._actor_refs.append(actor) self._actor_refs.append(actor)
def add_actor_weak_ref(self, actor: ba.Actor) -> None: 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) (called by the ba.Actor base class)
""" """
from ba import _actor as bsactor if __debug__:
if not isinstance(actor, bsactor.Actor): from ba._actor import Actor
raise TypeError('non-actor passed to add_actor_weak_ref') assert isinstance(actor, Actor)
# Make sure our pruning is happening...
assert (not self.has_transitioned_in()
or _ba.time() - self._last_prune_dead_actors_time < 10.0)
self._actor_weak_refs.append(weakref.ref(actor)) self._actor_weak_refs.append(weakref.ref(actor))
@property @property
@ -476,7 +466,7 @@ class Activity(DependencyComponent, Generic[PlayerType, TeamType]):
try: try:
self.on_transition_in() self.on_transition_in()
except Exception: 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 # Tell the C++ layer that this activity is the main one, so it uses
# settings from our globals, directs various events to us, etc. # settings from our globals, directs various events to us, etc.
@ -490,7 +480,7 @@ class Activity(DependencyComponent, Generic[PlayerType, TeamType]):
try: try:
self.on_transition_out() self.on_transition_out()
except Exception: 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: def begin(self, session: ba.Session) -> None:
"""Begin the activity. """Begin the activity.
@ -586,7 +576,7 @@ class Activity(DependencyComponent, Generic[PlayerType, TeamType]):
try: try:
self.on_player_join(player) self.on_player_join(player)
except Exception: 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: def remove_player(self, sessionplayer: ba.SessionPlayer) -> None:
"""Remove a player from the Activity while it is running. """Remove a player from the Activity while it is running.
@ -616,11 +606,11 @@ class Activity(DependencyComponent, Generic[PlayerType, TeamType]):
try: try:
self.on_player_leave(player) self.on_player_leave(player)
except Exception: except Exception:
print_exception(f'Error in on_player_leave for {self}') print_exception(f'Error in on_player_leave for {self}.')
try: try:
player.leave() player.leave()
except Exception: 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) self._reset_session_player_for_no_activity(sessionplayer)
@ -645,7 +635,7 @@ class Activity(DependencyComponent, Generic[PlayerType, TeamType]):
try: try:
self.on_team_join(team) self.on_team_join(team)
except Exception: 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: def remove_team(self, sessionteam: ba.SessionTeam) -> None:
"""Remove a team from a Running Activity """Remove a team from a Running Activity
@ -667,11 +657,11 @@ class Activity(DependencyComponent, Generic[PlayerType, TeamType]):
try: try:
self.on_team_leave(team) self.on_team_leave(team)
except Exception: except Exception:
print_exception(f'Error in on_team_leave for {self}') print_exception(f'Error in on_team_leave for {self}.')
try: try:
team.leave() team.leave()
except Exception: 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 sessionteam.gameteam = None
@ -693,13 +683,13 @@ class Activity(DependencyComponent, Generic[PlayerType, TeamType]):
except Exception: except Exception:
print_exception( print_exception(
f'Error resetting SessionPlayer node on {sessionplayer}' f'Error resetting SessionPlayer node on {sessionplayer}'
f' for {self}') f' for {self}.')
try: try:
sessionplayer.resetinput() sessionplayer.resetinput()
except Exception: except Exception:
print_exception( print_exception(
f'Error resetting SessionPlayer input on {sessionplayer}' f'Error resetting SessionPlayer input on {sessionplayer}'
f' for {self}') f' for {self}.')
# These should never fail I think... # These should never fail I think...
sessionplayer.setactivity(None) sessionplayer.setactivity(None)
@ -767,7 +757,7 @@ class Activity(DependencyComponent, Generic[PlayerType, TeamType]):
_ba.quit() _ba.quit()
except Exception: except Exception:
print_exception('exception on _check_activity_death:') print_exception('Error on _check_activity_death/')
def _expire(self) -> None: def _expire(self) -> None:
"""Put the activity in a state where it can be garbage-collected. """Put the activity in a state where it can be garbage-collected.
@ -801,8 +791,7 @@ class Activity(DependencyComponent, Generic[PlayerType, TeamType]):
try: try:
self._activity_data.expire() self._activity_data.expire()
except Exception: except Exception:
print_exception( print_exception(f'Error expiring _activity_data for {self}.')
'Error during ba.Activity._expire() destroying data:')
def _expire_actors(self) -> None: def _expire_actors(self) -> None:
# Expire all Actors. # Expire all Actors.
@ -843,7 +832,7 @@ class Activity(DependencyComponent, Generic[PlayerType, TeamType]):
# until now whos underlying SessionPlayer left long ago... # until now whos underlying SessionPlayer left long ago...
pass pass
except Exception: except Exception:
print_exception(f'Error expiring {player}') print_exception(f'Error expiring {player}.')
def _expire_teams(self) -> None: def _expire_teams(self) -> None:
@ -873,7 +862,7 @@ class Activity(DependencyComponent, Generic[PlayerType, TeamType]):
# player/team has left the game) # player/team has left the game)
pass pass
except Exception: except Exception:
print_exception(f'Error expiring Team {team}') print_exception(f'Error expiring Team {team}.')
def _prune_delay_deletes(self) -> None: def _prune_delay_deletes(self) -> None:
self._delay_delete_players.clear() self._delay_delete_players.clear()

View File

@ -103,21 +103,21 @@ class JoinActivity(Activity[EmptyPlayer, EmptyTeam]):
class TransitionActivity(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. 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): def __init__(self, settings: dict):
super().__init__(settings) 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 self._background: Optional[ba.Actor] = None
def on_transition_in(self) -> 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. 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): def __init__(self, settings: dict):
super().__init__(settings) 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._birth_time = _ba.time()
self._min_view_time = 5.0 self._min_view_time = 5.0
self._allow_server_transition = False self._allow_server_transition = False
@ -160,15 +162,14 @@ class ScoreScreenActivity(Activity[EmptyPlayer, EmptyTeam]):
self._server_transitioning: Optional[bool] = None self._server_transitioning: Optional[bool] = None
def on_player_join(self, player: EmptyPlayer) -> None: def on_player_join(self, player: EmptyPlayer) -> None:
from ba import _general from ba._general import WeakCall
super().on_player_join(player) super().on_player_join(player)
time_till_assign = max( time_till_assign = max(
0, self._birth_time + self._min_view_time - _ba.time()) 0, self._birth_time + self._min_view_time - _ba.time())
# If we're still kicking at the end of our assign-delay, assign this # If we're still kicking at the end of our assign-delay, assign this
# guy's input to trigger us. # guy's input to trigger us.
_ba.timer(time_till_assign, _general.WeakCall(self._safe_assign, _ba.timer(time_till_assign, WeakCall(self._safe_assign, player))
player))
def on_transition_in(self) -> None: def on_transition_in(self) -> None:
from bastd.actor.tipstext import TipsText from bastd.actor.tipstext import TipsText
@ -228,7 +229,7 @@ class ScoreScreenActivity(Activity[EmptyPlayer, EmptyTeam]):
def _safe_assign(self, player: EmptyPlayer) -> None: def _safe_assign(self, player: EmptyPlayer) -> None:
# Just to be extra careful, don't assign if we're transitioning out. # 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: if not self.is_transitioning_out() and player:
player.assigninput((InputType.JUMP_PRESS, InputType.PUNCH_PRESS, player.assigninput((InputType.JUMP_PRESS, InputType.PUNCH_PRESS,
InputType.BOMB_PRESS, InputType.PICK_UP_PRESS), InputType.BOMB_PRESS, InputType.PICK_UP_PRESS),

View File

@ -50,7 +50,7 @@ def game_begin_analytics() -> None:
assert campaign is not None assert campaign is not None
_ba.set_analytics_screen( _ba.set_analytics_screen(
'Coop Game: ' + campaign.name + ' ' + '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') _ba.increment_analytics_count('Co-op round start')
if len(activity.players) == 1: if len(activity.players) == 1:
_ba.increment_analytics_count('Co-op round start 1 human player') _ba.increment_analytics_count('Co-op round start 1 human player')

View File

@ -724,26 +724,25 @@ class App:
args: Dict = None) -> bool: args: Dict = None) -> bool:
"""High level way to launch a local co-op session.""" """High level way to launch a local co-op session."""
# pylint: disable=cyclic-import # pylint: disable=cyclic-import
from ba._campaign import get_campaign from ba._campaign import getcampaign
from bastd.ui.coop.level import CoopLevelLockedWindow from bastd.ui.coop.level import CoopLevelLockedWindow
if args is None: if args is None:
args = {} args = {}
if game == '': if game == '':
raise ValueError('empty game name') raise ValueError('empty game name')
campaignname, levelname = game.split(':') campaignname, levelname = game.split(':')
campaign = get_campaign(campaignname) campaign = getcampaign(campaignname)
levels = campaign.get_levels()
# If this campaign is sequential, make sure we've completed the # If this campaign is sequential, make sure we've completed the
# one before this. # one before this.
if campaign.sequential and not force: if campaign.sequential and not force:
for level in levels: for level in campaign.levels:
if level.name == levelname: if level.name == levelname:
break break
if not level.complete: if not level.complete:
CoopLevelLockedWindow( CoopLevelLockedWindow(
campaign.get_level(levelname).displayname, campaign.getlevel(levelname).displayname,
campaign.get_level(level.name).displayname) campaign.getlevel(level.name).displayname)
return False return False
# Ok, we're good to go. # Ok, we're good to go.

View File

@ -35,7 +35,7 @@ def register_campaign(campaign: ba.Campaign) -> None:
_ba.app.campaigns[campaign.name] = campaign _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 a campaign by name."""
return _ba.app.campaigns[name] return _ba.app.campaigns[name]
@ -61,18 +61,19 @@ class Campaign:
"""Whether this Campaign's levels must be played in sequence.""" """Whether this Campaign's levels must be played in sequence."""
return self._sequential 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.""" """Adds a ba.Level to the Campaign."""
if level.get_campaign() is not None: if level.campaign is not None:
raise RuntimeError('level already belongs to a campaign') raise RuntimeError('Level already belongs to a campaign.')
level.set_campaign(self, len(self._levels)) level.set_campaign(self, len(self._levels))
self._levels.append(level) self._levels.append(level)
def get_levels(self) -> List[ba.Level]: @property
"""Return the set of ba.Levels in the Campaign.""" def levels(self) -> List[ba.Level]:
"""The list of ba.Levels in the Campaign."""
return self._levels 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.""" """Return a contained ba.Level by name."""
from ba import _error from ba import _error
for level in self._levels: for level in self._levels:
@ -89,14 +90,15 @@ class Campaign:
# FIXME should these give/take ba.Level instances instead of level names?.. # FIXME should these give/take ba.Level instances instead of level names?..
def set_selected_level(self, levelname: str) -> None: def set_selected_level(self, levelname: str) -> None:
"""Set the Level currently selected in the UI (by name).""" """Set the Level currently selected in the UI (by name)."""
self.get_config_dict()['Selection'] = levelname self.configdict['Selection'] = levelname
_ba.app.config.commit() _ba.app.config.commit()
def get_selected_level(self) -> str: def get_selected_level(self) -> str:
"""Return the name of the Level currently selected in the UI.""" """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.""" """Return the live config dict for this campaign."""
val: Dict[str, Any] = (_ba.app.config.setdefault('Campaigns', val: Dict[str, Any] = (_ba.app.config.setdefault('Campaigns',
{}).setdefault( {}).setdefault(
@ -123,47 +125,47 @@ def init_campaigns() -> None:
# FIXME: Once translations catch up, we can convert these to use the # FIXME: Once translations catch up, we can convert these to use the
# generic display-name '${GAME} Training' type stuff. # generic display-name '${GAME} Training' type stuff.
campaign = Campaign('Easy') campaign = Campaign('Easy')
campaign.add_level( campaign.addlevel(
_level.Level('Onslaught Training', _level.Level('Onslaught Training',
gametype=OnslaughtGame, gametype=OnslaughtGame,
settings={'preset': 'training_easy'}, settings={'preset': 'training_easy'},
preview_texture_name='doomShroomPreview')) preview_texture_name='doomShroomPreview'))
campaign.add_level( campaign.addlevel(
_level.Level('Rookie Onslaught', _level.Level('Rookie Onslaught',
gametype=OnslaughtGame, gametype=OnslaughtGame,
settings={'preset': 'rookie_easy'}, settings={'preset': 'rookie_easy'},
preview_texture_name='courtyardPreview')) preview_texture_name='courtyardPreview'))
campaign.add_level( campaign.addlevel(
_level.Level('Rookie Football', _level.Level('Rookie Football',
gametype=FootballCoopGame, gametype=FootballCoopGame,
settings={'preset': 'rookie_easy'}, settings={'preset': 'rookie_easy'},
preview_texture_name='footballStadiumPreview')) preview_texture_name='footballStadiumPreview'))
campaign.add_level( campaign.addlevel(
_level.Level('Pro Onslaught', _level.Level('Pro Onslaught',
gametype=OnslaughtGame, gametype=OnslaughtGame,
settings={'preset': 'pro_easy'}, settings={'preset': 'pro_easy'},
preview_texture_name='doomShroomPreview')) preview_texture_name='doomShroomPreview'))
campaign.add_level( campaign.addlevel(
_level.Level('Pro Football', _level.Level('Pro Football',
gametype=FootballCoopGame, gametype=FootballCoopGame,
settings={'preset': 'pro_easy'}, settings={'preset': 'pro_easy'},
preview_texture_name='footballStadiumPreview')) preview_texture_name='footballStadiumPreview'))
campaign.add_level( campaign.addlevel(
_level.Level('Pro Runaround', _level.Level('Pro Runaround',
gametype=RunaroundGame, gametype=RunaroundGame,
settings={'preset': 'pro_easy'}, settings={'preset': 'pro_easy'},
preview_texture_name='towerDPreview')) preview_texture_name='towerDPreview'))
campaign.add_level( campaign.addlevel(
_level.Level('Uber Onslaught', _level.Level('Uber Onslaught',
gametype=OnslaughtGame, gametype=OnslaughtGame,
settings={'preset': 'uber_easy'}, settings={'preset': 'uber_easy'},
preview_texture_name='courtyardPreview')) preview_texture_name='courtyardPreview'))
campaign.add_level( campaign.addlevel(
_level.Level('Uber Football', _level.Level('Uber Football',
gametype=FootballCoopGame, gametype=FootballCoopGame,
settings={'preset': 'uber_easy'}, settings={'preset': 'uber_easy'},
preview_texture_name='footballStadiumPreview')) preview_texture_name='footballStadiumPreview'))
campaign.add_level( campaign.addlevel(
_level.Level('Uber Runaround', _level.Level('Uber Runaround',
gametype=RunaroundGame, gametype=RunaroundGame,
settings={'preset': 'uber_easy'}, settings={'preset': 'uber_easy'},
@ -172,52 +174,52 @@ def init_campaigns() -> None:
# "hard" mode # "hard" mode
campaign = Campaign('Default') campaign = Campaign('Default')
campaign.add_level( campaign.addlevel(
_level.Level('Onslaught Training', _level.Level('Onslaught Training',
gametype=OnslaughtGame, gametype=OnslaughtGame,
settings={'preset': 'training'}, settings={'preset': 'training'},
preview_texture_name='doomShroomPreview')) preview_texture_name='doomShroomPreview'))
campaign.add_level( campaign.addlevel(
_level.Level('Rookie Onslaught', _level.Level('Rookie Onslaught',
gametype=OnslaughtGame, gametype=OnslaughtGame,
settings={'preset': 'rookie'}, settings={'preset': 'rookie'},
preview_texture_name='courtyardPreview')) preview_texture_name='courtyardPreview'))
campaign.add_level( campaign.addlevel(
_level.Level('Rookie Football', _level.Level('Rookie Football',
gametype=FootballCoopGame, gametype=FootballCoopGame,
settings={'preset': 'rookie'}, settings={'preset': 'rookie'},
preview_texture_name='footballStadiumPreview')) preview_texture_name='footballStadiumPreview'))
campaign.add_level( campaign.addlevel(
_level.Level('Pro Onslaught', _level.Level('Pro Onslaught',
gametype=OnslaughtGame, gametype=OnslaughtGame,
settings={'preset': 'pro'}, settings={'preset': 'pro'},
preview_texture_name='doomShroomPreview')) preview_texture_name='doomShroomPreview'))
campaign.add_level( campaign.addlevel(
_level.Level('Pro Football', _level.Level('Pro Football',
gametype=FootballCoopGame, gametype=FootballCoopGame,
settings={'preset': 'pro'}, settings={'preset': 'pro'},
preview_texture_name='footballStadiumPreview')) preview_texture_name='footballStadiumPreview'))
campaign.add_level( campaign.addlevel(
_level.Level('Pro Runaround', _level.Level('Pro Runaround',
gametype=RunaroundGame, gametype=RunaroundGame,
settings={'preset': 'pro'}, settings={'preset': 'pro'},
preview_texture_name='towerDPreview')) preview_texture_name='towerDPreview'))
campaign.add_level( campaign.addlevel(
_level.Level('Uber Onslaught', _level.Level('Uber Onslaught',
gametype=OnslaughtGame, gametype=OnslaughtGame,
settings={'preset': 'uber'}, settings={'preset': 'uber'},
preview_texture_name='courtyardPreview')) preview_texture_name='courtyardPreview'))
campaign.add_level( campaign.addlevel(
_level.Level('Uber Football', _level.Level('Uber Football',
gametype=FootballCoopGame, gametype=FootballCoopGame,
settings={'preset': 'uber'}, settings={'preset': 'uber'},
preview_texture_name='footballStadiumPreview')) preview_texture_name='footballStadiumPreview'))
campaign.add_level( campaign.addlevel(
_level.Level('Uber Runaround', _level.Level('Uber Runaround',
gametype=RunaroundGame, gametype=RunaroundGame,
settings={'preset': 'uber'}, settings={'preset': 'uber'},
preview_texture_name='towerDPreview')) preview_texture_name='towerDPreview'))
campaign.add_level( campaign.addlevel(
_level.Level('The Last Stand', _level.Level('The Last Stand',
gametype=TheLastStandGame, gametype=TheLastStandGame,
settings={}, settings={},
@ -226,17 +228,17 @@ def init_campaigns() -> None:
# challenges: our 'official' random extra co-op levels # challenges: our 'official' random extra co-op levels
campaign = Campaign('Challenges', sequential=False) campaign = Campaign('Challenges', sequential=False)
campaign.add_level( campaign.addlevel(
_level.Level('Infinite Onslaught', _level.Level('Infinite Onslaught',
gametype=OnslaughtGame, gametype=OnslaughtGame,
settings={'preset': 'endless'}, settings={'preset': 'endless'},
preview_texture_name='doomShroomPreview')) preview_texture_name='doomShroomPreview'))
campaign.add_level( campaign.addlevel(
_level.Level('Infinite Runaround', _level.Level('Infinite Runaround',
gametype=RunaroundGame, gametype=RunaroundGame,
settings={'preset': 'endless'}, settings={'preset': 'endless'},
preview_texture_name='towerDPreview')) preview_texture_name='towerDPreview'))
campaign.add_level( campaign.addlevel(
_level.Level('Race', _level.Level('Race',
displayname='${GAME}', displayname='${GAME}',
gametype=RaceGame, gametype=RaceGame,
@ -246,7 +248,7 @@ def init_campaigns() -> None:
'Bomb Spawning': 0 'Bomb Spawning': 0
}, },
preview_texture_name='bigGPreview')) preview_texture_name='bigGPreview'))
campaign.add_level( campaign.addlevel(
_level.Level('Pro Race', _level.Level('Pro Race',
displayname='Pro ${GAME}', displayname='Pro ${GAME}',
gametype=RaceGame, gametype=RaceGame,
@ -256,7 +258,7 @@ def init_campaigns() -> None:
'Bomb Spawning': 1000 'Bomb Spawning': 1000
}, },
preview_texture_name='bigGPreview')) preview_texture_name='bigGPreview'))
campaign.add_level( campaign.addlevel(
_level.Level('Lake Frigid Race', _level.Level('Lake Frigid Race',
displayname='${GAME}', displayname='${GAME}',
gametype=RaceGame, gametype=RaceGame,
@ -267,55 +269,55 @@ def init_campaigns() -> None:
'Bomb Spawning': 0 'Bomb Spawning': 0
}, },
preview_texture_name='lakeFrigidPreview')) preview_texture_name='lakeFrigidPreview'))
campaign.add_level( campaign.addlevel(
_level.Level('Football', _level.Level('Football',
displayname='${GAME}', displayname='${GAME}',
gametype=FootballCoopGame, gametype=FootballCoopGame,
settings={'preset': 'tournament'}, settings={'preset': 'tournament'},
preview_texture_name='footballStadiumPreview')) preview_texture_name='footballStadiumPreview'))
campaign.add_level( campaign.addlevel(
_level.Level('Pro Football', _level.Level('Pro Football',
displayname='Pro ${GAME}', displayname='Pro ${GAME}',
gametype=FootballCoopGame, gametype=FootballCoopGame,
settings={'preset': 'tournament_pro'}, settings={'preset': 'tournament_pro'},
preview_texture_name='footballStadiumPreview')) preview_texture_name='footballStadiumPreview'))
campaign.add_level( campaign.addlevel(
_level.Level('Runaround', _level.Level('Runaround',
displayname='${GAME}', displayname='${GAME}',
gametype=RunaroundGame, gametype=RunaroundGame,
settings={'preset': 'tournament'}, settings={'preset': 'tournament'},
preview_texture_name='towerDPreview')) preview_texture_name='towerDPreview'))
campaign.add_level( campaign.addlevel(
_level.Level('Uber Runaround', _level.Level('Uber Runaround',
displayname='Uber ${GAME}', displayname='Uber ${GAME}',
gametype=RunaroundGame, gametype=RunaroundGame,
settings={'preset': 'tournament_uber'}, settings={'preset': 'tournament_uber'},
preview_texture_name='towerDPreview')) preview_texture_name='towerDPreview'))
campaign.add_level( campaign.addlevel(
_level.Level('The Last Stand', _level.Level('The Last Stand',
displayname='${GAME}', displayname='${GAME}',
gametype=TheLastStandGame, gametype=TheLastStandGame,
settings={'preset': 'tournament'}, settings={'preset': 'tournament'},
preview_texture_name='rampagePreview')) preview_texture_name='rampagePreview'))
campaign.add_level( campaign.addlevel(
_level.Level('Tournament Infinite Onslaught', _level.Level('Tournament Infinite Onslaught',
displayname='Infinite Onslaught', displayname='Infinite Onslaught',
gametype=OnslaughtGame, gametype=OnslaughtGame,
settings={'preset': 'endless_tournament'}, settings={'preset': 'endless_tournament'},
preview_texture_name='doomShroomPreview')) preview_texture_name='doomShroomPreview'))
campaign.add_level( campaign.addlevel(
_level.Level('Tournament Infinite Runaround', _level.Level('Tournament Infinite Runaround',
displayname='Infinite Runaround', displayname='Infinite Runaround',
gametype=RunaroundGame, gametype=RunaroundGame,
settings={'preset': 'endless_tournament'}, settings={'preset': 'endless_tournament'},
preview_texture_name='towerDPreview')) preview_texture_name='towerDPreview'))
campaign.add_level( campaign.addlevel(
_level.Level('Target Practice', _level.Level('Target Practice',
displayname='Pro ${GAME}', displayname='Pro ${GAME}',
gametype=TargetPracticeGame, gametype=TargetPracticeGame,
settings={}, settings={},
preview_texture_name='doomShroomPreview')) preview_texture_name='doomShroomPreview'))
campaign.add_level( campaign.addlevel(
_level.Level('Target Practice B', _level.Level('Target Practice B',
displayname='${GAME}', displayname='${GAME}',
gametype=TargetPracticeGame, gametype=TargetPracticeGame,
@ -325,38 +327,38 @@ def init_campaigns() -> None:
'Enable Triple Bombs': False 'Enable Triple Bombs': False
}, },
preview_texture_name='doomShroomPreview')) preview_texture_name='doomShroomPreview'))
campaign.add_level( campaign.addlevel(
_level.Level('Meteor Shower', _level.Level('Meteor Shower',
displayname='${GAME}', displayname='${GAME}',
gametype=MeteorShowerGame, gametype=MeteorShowerGame,
settings={}, settings={},
preview_texture_name='rampagePreview')) preview_texture_name='rampagePreview'))
campaign.add_level( campaign.addlevel(
_level.Level('Epic Meteor Shower', _level.Level('Epic Meteor Shower',
displayname='${GAME}', displayname='${GAME}',
gametype=MeteorShowerGame, gametype=MeteorShowerGame,
settings={'Epic Mode': True}, settings={'Epic Mode': True},
preview_texture_name='rampagePreview')) preview_texture_name='rampagePreview'))
campaign.add_level( campaign.addlevel(
_level.Level('Easter Egg Hunt', _level.Level('Easter Egg Hunt',
displayname='${GAME}', displayname='${GAME}',
gametype=EasterEggHuntGame, gametype=EasterEggHuntGame,
settings={}, settings={},
preview_texture_name='towerDPreview')) preview_texture_name='towerDPreview'))
campaign.add_level( campaign.addlevel(
_level.Level('Pro Easter Egg Hunt', _level.Level('Pro Easter Egg Hunt',
displayname='Pro ${GAME}', displayname='Pro ${GAME}',
gametype=EasterEggHuntGame, gametype=EasterEggHuntGame,
settings={'Pro Mode': True}, settings={'Pro Mode': True},
preview_texture_name='towerDPreview')) preview_texture_name='towerDPreview'))
campaign.add_level( campaign.addlevel(
_level.Level( _level.Level(
name='Ninja Fight', # (unique id not seen by player) name='Ninja Fight', # (unique id not seen by player)
displayname='${GAME}', # (readable name seen by player) displayname='${GAME}', # (readable name seen by player)
gametype=NinjaFightGame, gametype=NinjaFightGame,
settings={'preset': 'regular'}, settings={'preset': 'regular'},
preview_texture_name='courtyardPreview')) preview_texture_name='courtyardPreview'))
campaign.add_level( campaign.addlevel(
_level.Level(name='Pro Ninja Fight', _level.Level(name='Pro Ninja Fight',
displayname='Pro ${GAME}', displayname='Pro ${GAME}',
gametype=NinjaFightGame, gametype=NinjaFightGame,

View File

@ -74,7 +74,7 @@ class CoopGameActivity(GameActivity[PlayerType, TeamType]):
levelname = self._get_coop_level_name() levelname = self._get_coop_level_name()
campaign = self.session.campaign campaign = self.session.campaign
assert campaign is not None 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( self.settings_raw['name']).get_score_version_string().replace(
' ', '_')) ' ', '_'))
_ba.get_scores_to_beat(levelname, config_str, _ba.get_scores_to_beat(levelname, config_str,

View File

@ -60,7 +60,7 @@ class CoopSession(Session):
def __init__(self) -> None: def __init__(self) -> None:
"""Instantiate a co-op mode session.""" """Instantiate a co-op mode session."""
# pylint: disable=cyclic-import # pylint: disable=cyclic-import
from ba._campaign import get_campaign from ba._campaign import getcampaign
from bastd.activity.coopjoin import CoopJoinActivity from bastd.activity.coopjoin import CoopJoinActivity
_ba.increment_analytics_count('Co-op session start') _ba.increment_analytics_count('Co-op session start')
@ -90,7 +90,7 @@ class CoopSession(Session):
self.tournament_id: Optional[str] = ( self.tournament_id: Optional[str] = (
app.coop_session_args.get('tournament_id')) 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.campaign_level_name: str = app.coop_session_args['level']
self._ran_tutorial_activity = False self._ran_tutorial_activity = False
@ -116,7 +116,7 @@ class CoopSession(Session):
# Build an instance for the current level. # Build an instance for the current level.
assert self.campaign is not None 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 gametype = level.gametype
settings = level.get_settings() settings = level.get_settings()
@ -131,8 +131,8 @@ class CoopSession(Session):
self._current_game_instance: GameActivity = newactivity self._current_game_instance: GameActivity = newactivity
# Find the next level and build an instance for it too. # Find the next level and build an instance for it too.
levels = self.campaign.get_levels() levels = self.campaign.levels
level = self.campaign.get_level(self.campaign_level_name) level = self.campaign.getlevel(self.campaign_level_name)
nextlevel: Optional[ba.Level] nextlevel: Optional[ba.Level]
if level.index < len(levels) - 1: if level.index < len(levels) - 1:

View File

@ -290,7 +290,7 @@ class GameActivity(Activity[PlayerType, TeamType]):
if isinstance(self.session, CoopSession): if isinstance(self.session, CoopSession):
campaign = self.session.campaign campaign = self.session.campaign
assert campaign is not None assert campaign is not None
return campaign.get_level( return campaign.getlevel(
self.session.campaign_level_name).displayname self.session.campaign_level_name).displayname
except Exception: except Exception:
print_error('error getting campaign level name') print_error('error getting campaign level name')

View File

@ -45,7 +45,6 @@ class Level:
settings: dict, settings: dict,
preview_texture_name: str, preview_texture_name: str,
displayname: str = None): displayname: str = None):
"""Initializes a Level object with the provided values."""
self._name = name self._name = name
self._gametype = gametype self._gametype = gametype
self._settings = settings self._settings = settings
@ -93,8 +92,9 @@ class Level:
"""The type of game used for this Level.""" """The type of game used for this Level."""
return self._gametype return self._gametype
def get_campaign(self) -> Optional[ba.Campaign]: @property
"""Return the ba.Campaign this Level is associated with, or None.""" 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() return None if self._campaign is None else self._campaign()
@property @property
@ -123,7 +123,7 @@ class Level:
config = self._get_config_dict() config = self._get_config_dict()
config['Complete'] = val config['Complete'] = val
def get_high_scores(self) -> Dict: def get_high_scores(self) -> dict:
"""Return the current high scores for this Level.""" """Return the current high scores for this Level."""
config = self._get_config_dict() config = self._get_config_dict()
high_scores_key = 'High Scores' + self.get_score_version_string() 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 The referenced dict exists under the game's config dict and
can be modified in place.""" can be modified in place."""
campaign = self.get_campaign() campaign = self.campaign
if campaign is None: if campaign is None:
raise TypeError('level is not in a campaign') raise RuntimeError('Level is not in a campaign.')
campaign_config = campaign.get_config_dict() configdict = campaign.configdict
val: Dict[str, val: Dict[str, Any] = configdict.setdefault(self._name, {
Any] = campaign_config.setdefault(self._name, { 'Rating': 0.0,
'Rating': 0.0, 'Complete': False
'Complete': False })
})
assert isinstance(val, dict) assert isinstance(val, dict)
return val return val

View File

@ -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) should_submit_debug_info, show_ad, show_ad_2)
from ba._benchmark import (run_gpu_benchmark, run_cpu_benchmark, from ba._benchmark import (run_gpu_benchmark, run_cpu_benchmark,
run_media_reload_benchmark, run_stress_test) 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._messages import PlayerProfilesChangedMessage
from ba._meta import get_game_types from ba._meta import get_game_types
from ba._modutils import show_user_scripts from ba._modutils import show_user_scripts

View File

@ -47,7 +47,7 @@ class CoopJoinActivity(JoinActivity):
assert session.campaign is not None assert session.campaign is not None
level_name_full = (session.campaign.name + ':' + level_name_full = (session.campaign.name + ':' +
session.campaign_level_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( session.campaign_level_name).get_score_version_string().replace(
' ', '_')) ' ', '_'))
_ba.get_scores_to_beat(level_name_full, config_str, _ba.get_scores_to_beat(level_name_full, config_str,
@ -59,7 +59,7 @@ class CoopJoinActivity(JoinActivity):
super().on_transition_in() super().on_transition_in()
assert isinstance(self.session, ba.CoopSession) assert isinstance(self.session, ba.CoopSession)
assert self.session.campaign assert self.session.campaign
Text(self.session.campaign.get_level( Text(self.session.campaign.getlevel(
self.session.campaign_level_name).displayname, self.session.campaign_level_name).displayname,
scale=1.3, scale=1.3,
h_attach=Text.HAttach.CENTER, h_attach=Text.HAttach.CENTER,

View File

@ -174,7 +174,7 @@ class CoopScoreScreen(ba.Activity[ba.Player, ba.Team]):
self._game_name_str = self._campaign.name + ':' + self._level_name self._game_name_str = self._campaign.name + ':' + self._level_name
self._game_config_str = str(len( 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(' ', '_') self._level_name).get_score_version_string().replace(' ', '_')
# If game-center/etc scores are available we show our friends' # 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) self._game_name_str, self._game_config_str)
try: try:
self._old_best_rank = self._campaign.get_level( self._old_best_rank = self._campaign.getlevel(
self._level_name).rating self._level_name).rating
except Exception: except Exception:
self._old_best_rank = 0.0 self._old_best_rank = 0.0
@ -522,8 +522,8 @@ class CoopScoreScreen(ba.Activity[ba.Player, ba.Team]):
self._begin_time = ba.time() self._begin_time = ba.time()
# Calc whether the level is complete and other stuff. # Calc whether the level is complete and other stuff.
levels = self._campaign.get_levels() levels = self._campaign.levels
level = self._campaign.get_level(self._level_name) level = self._campaign.getlevel(self._level_name)
self._was_complete = level.complete self._was_complete = level.complete
self._is_complete = (self._was_complete or self._victory) self._is_complete = (self._was_complete or self._victory)
self._newly_complete = (self._is_complete and not self._was_complete) 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} -', pstr = ba.Lstr(value='- ${A} -',
subs=[('${A}', subs=[('${A}',
ba.Lstr(resource='singlePlayerCountText'))]) ba.Lstr(resource='singlePlayerCountText'))])
ZoomText(self._campaign.get_level(self._level_name).displayname, ZoomText(self._campaign.getlevel(self._level_name).displayname,
maxwidth=800, maxwidth=800,
flash=False, flash=False,
trail=False, trail=False,
@ -659,7 +659,7 @@ class CoopScoreScreen(ba.Activity[ba.Player, ba.Team]):
ba.timer(0.4, ba.WeakCall(self._play_drumroll)) ba.timer(0.4, ba.WeakCall(self._play_drumroll))
# Add us to high scores, filter, and store. # 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() self._level_name).get_high_scores()
try: try:
our_high_scores = our_high_scores_all[str(len(self._playerinfos)) + 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:] del our_high_scores[10:]
if self._score is not None: if self._score is not None:
sver = (self._campaign.get_level( sver = (self._campaign.getlevel(
self._level_name).get_score_version_string()) self._level_name).get_score_version_string())
_ba.add_transaction({ _ba.add_transaction({
'type': 'SET_LEVEL_LOCAL_HIGH_SCORES', '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(2, 10 - 30, -112, '7.5')
dostar(3, 77 - 30, -112, '9.5') dostar(3, 77 - 30, -112, '9.5')
try: try:
best_rank = self._campaign.get_level(self._level_name).rating best_rank = self._campaign.getlevel(self._level_name).rating
except Exception: except Exception:
best_rank = 0.0 best_rank = 0.0

View File

@ -34,18 +34,16 @@ if TYPE_CHECKING:
class TeamSeriesVictoryScoreScreenActivity(MultiTeamScoreScreenActivity): class TeamSeriesVictoryScoreScreenActivity(MultiTeamScoreScreenActivity):
"""Final score screen for a team series.""" """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): def __init__(self, settings: dict):
super().__init__(settings=settings) super().__init__(settings=settings)
self._min_view_time = 15.0 self._min_view_time = 15.0
self._is_ffa = isinstance(self.session, ba.FreeForAllSession) self._is_ffa = isinstance(self.session, ba.FreeForAllSession)
self._allow_server_transition = True self._allow_server_transition = True
self._tips_text = None 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 self._default_show_tips = False
super().on_transition_in()
def on_begin(self) -> None: def on_begin(self) -> None:
# pylint: disable=too-many-branches # pylint: disable=too-many-branches

View File

@ -56,6 +56,7 @@ class NinjaFightGame(ba.TeamGameActivity[Player, Team]):
scoreconfig = ba.ScoreConfig(label='Time', scoreconfig = ba.ScoreConfig(label='Time',
scoretype=ba.ScoreType.MILLISECONDS, scoretype=ba.ScoreType.MILLISECONDS,
lower_is_better=True) lower_is_better=True)
default_music = ba.MusicType.TO_THE_DEATH
@classmethod @classmethod
def get_supported_maps(cls, sessiontype: Type[ba.Session]) -> List[str]: 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._bots = SpazBotSet()
self._preset = str(settings['preset']) 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. # Called when our game actually begins.
def on_begin(self) -> None: def on_begin(self) -> None:
super().on_begin() super().on_begin()

View File

@ -968,13 +968,13 @@ class AccountSettingsWindow(ba.Window):
('${A}', accounts_str)])) ('${A}', accounts_str)]))
def _refresh_campaign_progress_text(self) -> None: 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: if self._campaign_progress_text is None:
return return
p_str: Union[str, ba.Lstr] p_str: Union[str, ba.Lstr]
try: try:
campaign = get_campaign('Default') campaign = getcampaign('Default')
levels = campaign.get_levels() levels = campaign.levels
levels_complete = sum((1 if l.complete else 0) for l in levels) levels_complete = sum((1 if l.complete else 0) for l in levels)
# Last level cant be completed; hence the -1; # Last level cant be completed; hence the -1;
@ -1071,14 +1071,14 @@ class AccountSettingsWindow(ba.Window):
def _reset_progress(self) -> None: def _reset_progress(self) -> None:
try: try:
from ba.internal import get_campaign from ba.internal import getcampaign
# FIXME: This would need to happen server-side these days. # FIXME: This would need to happen server-side these days.
if self._can_reset_achievements: if self._can_reset_achievements:
ba.app.config['Achievements'] = {} ba.app.config['Achievements'] = {}
_ba.reset_achievements() _ba.reset_achievements()
campaign = get_campaign('Default') campaign = getcampaign('Default')
campaign.reset() # also writes the config.. campaign.reset() # also writes the config..
campaign = get_campaign('Challenges') campaign = getcampaign('Challenges')
campaign.reset() # also writes the config.. campaign.reset() # also writes the config..
except Exception: except Exception:
ba.print_exception('exception resetting co-op campaign progress') ba.print_exception('exception resetting co-op campaign progress')

View File

@ -343,7 +343,7 @@ class CoopBrowserWindow(ba.Window):
# pylint: disable=too-many-statements # pylint: disable=too-many-statements
# pylint: disable=too-many-locals # pylint: disable=too-many-locals
# pylint: disable=too-many-branches # 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 # If the number of tournaments or challenges in the data differs from
# our current arrangement, refresh with the new number. # our current arrangement, refresh with the new number.
@ -466,20 +466,20 @@ class CoopBrowserWindow(ba.Window):
opacity=0.2) opacity=0.2)
else: else:
campaignname, levelname = game.split(':') campaignname, levelname = game.split(':')
campaign = get_campaign(campaignname) campaign = getcampaign(campaignname)
max_players = ba.app.tournament_info[ max_players = ba.app.tournament_info[
tbtn['tournament_id']]['maxPlayers'] tbtn['tournament_id']]['maxPlayers']
txt = ba.Lstr( txt = ba.Lstr(
value='${A} ${B}', value='${A} ${B}',
subs=[('${A}', campaign.get_level(levelname).displayname), subs=[('${A}', campaign.getlevel(levelname).displayname),
('${B}', ('${B}',
ba.Lstr(resource='playerCountAbbreviatedText', ba.Lstr(resource='playerCountAbbreviatedText',
subs=[('${COUNT}', str(max_players))]))]) subs=[('${COUNT}', str(max_players))]))])
ba.textwidget(edit=tbtn['button_text'], text=txt) ba.textwidget(edit=tbtn['button_text'], text=txt)
ba.imagewidget(edit=tbtn['image'], ba.imagewidget(
texture=campaign.get_level( edit=tbtn['image'],
levelname).get_preview_texture(), texture=campaign.getlevel(levelname).get_preview_texture(),
opacity=1.0 if enabled else 0.5) opacity=1.0 if enabled else 0.5)
fee = entry['fee'] fee = entry['fee']
@ -615,7 +615,7 @@ class CoopBrowserWindow(ba.Window):
def _refresh_campaign_row(self) -> None: def _refresh_campaign_row(self) -> None:
# pylint: disable=too-many-locals # pylint: disable=too-many-locals
# pylint: disable=cyclic-import # pylint: disable=cyclic-import
from ba.internal import get_campaign from ba.internal import getcampaign
from bastd.ui.coop.gamebutton import GameButton from bastd.ui.coop.gamebutton import GameButton
parent_widget = self._campaign_sub_container parent_widget = self._campaign_sub_container
@ -716,8 +716,8 @@ class CoopBrowserWindow(ba.Window):
down_widget=next_widget_down) down_widget=next_widget_down)
# Update our existing percent-complete text. # Update our existing percent-complete text.
campaign = get_campaign(campaignname) campaign = getcampaign(campaignname)
levels = campaign.get_levels() levels = campaign.levels
levels_complete = sum((1 if l.complete else 0) for l in levels) levels_complete = sum((1 if l.complete else 0) for l in levels)
# Last level cant be completed; hence the -1. # Last level cant be completed; hence the -1.
@ -936,7 +936,7 @@ class CoopBrowserWindow(ba.Window):
# add all custom user levels here.. # add all custom user levels here..
# items += [ # items += [
# 'User:' + l.getname() # '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( self._custom_h_scroll = custom_h_scroll = h_scroll = ba.hscrollwidget(

View File

@ -40,7 +40,7 @@ class GameButton:
x: float, y: float, select: bool, row: str): x: float, y: float, select: bool, row: str):
# pylint: disable=too-many-statements # pylint: disable=too-many-statements
# pylint: disable=too-many-locals # 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 self._game = game
sclx = 195.0 sclx = 195.0
scly = 195.0 scly = 195.0
@ -54,8 +54,8 @@ class GameButton:
campaignname = 'Default' campaignname = 'Default'
rating: Optional[float] rating: Optional[float]
campaign = get_campaign(campaignname) campaign = getcampaign(campaignname)
rating = campaign.get_level(levelname).rating rating = campaign.getlevel(levelname).rating
if game == 'Easy:The Last Stand': if game == 'Easy:The Last Stand':
rating = None rating = None
@ -95,10 +95,10 @@ class GameButton:
size=(image_width, image_width * 0.5), size=(image_width, image_width * 0.5),
model_transparent=window.lsbt, model_transparent=window.lsbt,
model_opaque=window.lsbo, model_opaque=window.lsbo,
texture=campaign.get_level(levelname).get_preview_texture(), texture=campaign.getlevel(levelname).get_preview_texture(),
mask_texture=ba.gettexture('mapPreviewMask')) 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._achievements = (get_achievements_for_coop_level(game))
self._name_widget = ba.textwidget(parent=parent, self._name_widget = ba.textwidget(parent=parent,
@ -182,7 +182,7 @@ class GameButton:
def _update(self) -> None: def _update(self) -> None:
# pylint: disable=too-many-boolean-expressions # pylint: disable=too-many-boolean-expressions
from ba.internal import have_pro, get_campaign from ba.internal import have_pro, getcampaign
game = self._game game = self._game
campaignname, levelname = game.split(':') campaignname, levelname = game.split(':')
@ -192,15 +192,13 @@ class GameButton:
if game == 'Easy:The Last Stand': if game == 'Easy:The Last Stand':
campaignname = 'Default' campaignname = 'Default'
campaign = get_campaign(campaignname) campaign = getcampaign(campaignname)
levels = campaign.get_levels()
# If this campaign is sequential, make sure we've unlocked # If this campaign is sequential, make sure we've unlocked
# everything up to here. # everything up to here.
unlocked = True unlocked = True
if campaign.sequential: if campaign.sequential:
for level in levels: for level in campaign.levels:
if level.name == levelname: if level.name == levelname:
break break
if not level.complete: if not level.complete:

View File

@ -1,5 +1,5 @@
<!-- THIS FILE IS AUTO GENERATED; DO NOT EDIT BY HAND --> <!-- THIS FILE IS AUTO GENERATED; DO NOT EDIT BY HAND -->
<h4><em>last updated on 2020-06-03 for Ballistica version 1.5.0 build 20044</em></h4> <h4><em>last updated on 2020-06-03 for Ballistica version 1.5.0 build 20045</em></h4>
<p>This page documents the Python classes and functions in the 'ba' module, <p>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 <a href="mailto:support@froemling.net">let me know</a>. Happy modding!</p> 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 <a href="mailto:support@froemling.net">let me know</a>. Happy modding!</p>
<hr> <hr>
@ -1236,8 +1236,18 @@ mycall()</pre>
</p> </p>
<h3>Attributes:</h3> <h3>Attributes:</h3>
<h5><a href="#attr_ba_Campaign__name">name</a>, <a href="#attr_ba_Campaign__sequential">sequential</a></h5> <h5><a href="#attr_ba_Campaign__configdict">configdict</a>, <a href="#attr_ba_Campaign__levels">levels</a>, <a href="#attr_ba_Campaign__name">name</a>, <a href="#attr_ba_Campaign__sequential">sequential</a></h5>
<dl> <dl>
<dt><h4><a name="attr_ba_Campaign__configdict">configdict</a></h4></dt><dd>
<p><span>Dict[str, Any]</span></p>
<p>Return the live config dict for this campaign.</p>
</dd>
<dt><h4><a name="attr_ba_Campaign__levels">levels</a></h4></dt><dd>
<p><span>List[<a href="#class_ba_Level">ba.Level</a>]</span></p>
<p>The list of <a href="#class_ba_Level">ba.Levels</a> in the Campaign.</p>
</dd>
<dt><h4><a name="attr_ba_Campaign__name">name</a></h4></dt><dd> <dt><h4><a name="attr_ba_Campaign__name">name</a></h4></dt><dd>
<p><span>str</span></p> <p><span>str</span></p>
<p>The name of the Campaign.</p> <p>The name of the Campaign.</p>
@ -1250,41 +1260,29 @@ mycall()</pre>
</dd> </dd>
</dl> </dl>
<h3>Methods:</h3> <h3>Methods:</h3>
<h5><a href="#method_ba_Campaign____init__">&lt;constructor&gt;</a>, <a href="#method_ba_Campaign__add_level">add_level()</a>, <a href="#method_ba_Campaign__get_config_dict">get_config_dict()</a>, <a href="#method_ba_Campaign__get_level">get_level()</a>, <a href="#method_ba_Campaign__get_levels">get_levels()</a>, <a href="#method_ba_Campaign__get_selected_level">get_selected_level()</a>, <a href="#method_ba_Campaign__reset">reset()</a>, <a href="#method_ba_Campaign__set_selected_level">set_selected_level()</a></h5> <h5><a href="#method_ba_Campaign____init__">&lt;constructor&gt;</a>, <a href="#method_ba_Campaign__addlevel">addlevel()</a>, <a href="#method_ba_Campaign__get_selected_level">get_selected_level()</a>, <a href="#method_ba_Campaign__getlevel">getlevel()</a>, <a href="#method_ba_Campaign__reset">reset()</a>, <a href="#method_ba_Campaign__set_selected_level">set_selected_level()</a></h5>
<dl> <dl>
<dt><h4><a name="method_ba_Campaign____init__">&lt;constructor&gt;</a></dt></h4><dd> <dt><h4><a name="method_ba_Campaign____init__">&lt;constructor&gt;</a></dt></h4><dd>
<p><span>ba.Campaign(name: str, sequential: bool = True)</span></p> <p><span>ba.Campaign(name: str, sequential: bool = True)</span></p>
</dd> </dd>
<dt><h4><a name="method_ba_Campaign__add_level">add_level()</a></dt></h4><dd> <dt><h4><a name="method_ba_Campaign__addlevel">addlevel()</a></dt></h4><dd>
<p><span>add_level(self, level: <a href="#class_ba_Level">ba.Level</a>) -&gt; None</span></p> <p><span>addlevel(self, level: <a href="#class_ba_Level">ba.Level</a>) -&gt; None</span></p>
<p>Adds a <a href="#class_ba_Level">ba.Level</a> to the Campaign.</p> <p>Adds a <a href="#class_ba_Level">ba.Level</a> to the Campaign.</p>
</dd>
<dt><h4><a name="method_ba_Campaign__get_config_dict">get_config_dict()</a></dt></h4><dd>
<p><span>get_config_dict(self) -&gt; Dict[str, Any]</span></p>
<p>Return the live config dict for this campaign.</p>
</dd>
<dt><h4><a name="method_ba_Campaign__get_level">get_level()</a></dt></h4><dd>
<p><span>get_level(self, name: str) -&gt; <a href="#class_ba_Level">ba.Level</a></span></p>
<p>Return a contained <a href="#class_ba_Level">ba.Level</a> by name.</p>
</dd>
<dt><h4><a name="method_ba_Campaign__get_levels">get_levels()</a></dt></h4><dd>
<p><span>get_levels(self) -&gt; List[<a href="#class_ba_Level">ba.Level</a>]</span></p>
<p>Return the set of <a href="#class_ba_Level">ba.Levels</a> in the Campaign.</p>
</dd> </dd>
<dt><h4><a name="method_ba_Campaign__get_selected_level">get_selected_level()</a></dt></h4><dd> <dt><h4><a name="method_ba_Campaign__get_selected_level">get_selected_level()</a></dt></h4><dd>
<p><span>get_selected_level(self) -&gt; str</span></p> <p><span>get_selected_level(self) -&gt; str</span></p>
<p>Return the name of the Level currently selected in the UI.</p> <p>Return the name of the Level currently selected in the UI.</p>
</dd>
<dt><h4><a name="method_ba_Campaign__getlevel">getlevel()</a></dt></h4><dd>
<p><span>getlevel(self, name: str) -&gt; <a href="#class_ba_Level">ba.Level</a></span></p>
<p>Return a contained <a href="#class_ba_Level">ba.Level</a> by name.</p>
</dd> </dd>
<dt><h4><a name="method_ba_Campaign__reset">reset()</a></dt></h4><dd> <dt><h4><a name="method_ba_Campaign__reset">reset()</a></dt></h4><dd>
<p><span>reset(self) -&gt; None</span></p> <p><span>reset(self) -&gt; None</span></p>
@ -3051,8 +3049,13 @@ prefs, etc.</p>
</p> </p>
<h3>Attributes:</h3> <h3>Attributes:</h3>
<h5><a href="#attr_ba_Level__complete">complete</a>, <a href="#attr_ba_Level__displayname">displayname</a>, <a href="#attr_ba_Level__gametype">gametype</a>, <a href="#attr_ba_Level__index">index</a>, <a href="#attr_ba_Level__name">name</a>, <a href="#attr_ba_Level__preview_texture_name">preview_texture_name</a>, <a href="#attr_ba_Level__rating">rating</a></h5> <h5><a href="#attr_ba_Level__campaign">campaign</a>, <a href="#attr_ba_Level__complete">complete</a>, <a href="#attr_ba_Level__displayname">displayname</a>, <a href="#attr_ba_Level__gametype">gametype</a>, <a href="#attr_ba_Level__index">index</a>, <a href="#attr_ba_Level__name">name</a>, <a href="#attr_ba_Level__preview_texture_name">preview_texture_name</a>, <a href="#attr_ba_Level__rating">rating</a></h5>
<dl> <dl>
<dt><h4><a name="attr_ba_Level__campaign">campaign</a></h4></dt><dd>
<p><span>Optional[<a href="#class_ba_Campaign">ba.Campaign</a>]</span></p>
<p>The <a href="#class_ba_Campaign">ba.Campaign</a> this Level is associated with, or None.</p>
</dd>
<dt><h4><a name="attr_ba_Level__complete">complete</a></h4></dt><dd> <dt><h4><a name="attr_ba_Level__complete">complete</a></h4></dt><dd>
<p><span>bool</span></p> <p><span>bool</span></p>
<p>Whether this Level has been completed.</p> <p>Whether this Level has been completed.</p>
@ -3093,22 +3096,14 @@ prefs, etc.</p>
</dd> </dd>
</dl> </dl>
<h3>Methods:</h3> <h3>Methods:</h3>
<h5><a href="#method_ba_Level____init__">&lt;constructor&gt;</a>, <a href="#method_ba_Level__get_campaign">get_campaign()</a>, <a href="#method_ba_Level__get_high_scores">get_high_scores()</a>, <a href="#method_ba_Level__get_preview_texture">get_preview_texture()</a>, <a href="#method_ba_Level__get_score_version_string">get_score_version_string()</a>, <a href="#method_ba_Level__get_settings">get_settings()</a>, <a href="#method_ba_Level__set_complete">set_complete()</a>, <a href="#method_ba_Level__set_high_scores">set_high_scores()</a>, <a href="#method_ba_Level__set_rating">set_rating()</a></h5> <h5><a href="#method_ba_Level____init__">&lt;constructor&gt;</a>, <a href="#method_ba_Level__get_high_scores">get_high_scores()</a>, <a href="#method_ba_Level__get_preview_texture">get_preview_texture()</a>, <a href="#method_ba_Level__get_score_version_string">get_score_version_string()</a>, <a href="#method_ba_Level__get_settings">get_settings()</a>, <a href="#method_ba_Level__set_complete">set_complete()</a>, <a href="#method_ba_Level__set_high_scores">set_high_scores()</a>, <a href="#method_ba_Level__set_rating">set_rating()</a></h5>
<dl> <dl>
<dt><h4><a name="method_ba_Level____init__">&lt;constructor&gt;</a></dt></h4><dd> <dt><h4><a name="method_ba_Level____init__">&lt;constructor&gt;</a></dt></h4><dd>
<p><span>ba.Level(name: str, gametype: Type[<a href="#class_ba_GameActivity">ba.GameActivity</a>], settings: dict, preview_texture_name: str, displayname: str = None)</span></p> <p><span>ba.Level(name: str, gametype: Type[<a href="#class_ba_GameActivity">ba.GameActivity</a>], settings: dict, preview_texture_name: str, displayname: str = None)</span></p>
<p>Initializes a Level object with the provided values.</p>
</dd>
<dt><h4><a name="method_ba_Level__get_campaign">get_campaign()</a></dt></h4><dd>
<p><span>get_campaign(self) -&gt; Optional[<a href="#class_ba_Campaign">ba.Campaign</a>]</span></p>
<p>Return the <a href="#class_ba_Campaign">ba.Campaign</a> this Level is associated with, or None.</p>
</dd> </dd>
<dt><h4><a name="method_ba_Level__get_high_scores">get_high_scores()</a></dt></h4><dd> <dt><h4><a name="method_ba_Level__get_high_scores">get_high_scores()</a></dt></h4><dd>
<p><span>get_high_scores(self) -&gt; Dict</span></p> <p><span>get_high_scores(self) -&gt; dict</span></p>
<p>Return the current high scores for this Level.</p> <p>Return the current high scores for this Level.</p>

View File

@ -47,7 +47,7 @@ class PipRequirement:
PIP_REQUIREMENTS = [ PIP_REQUIREMENTS = [
PipRequirement(modulename='pylint', minversion=[2, 5, 2]), 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='yapf', minversion=[0, 30, 0]),
PipRequirement(modulename='cpplint', minversion=[1, 5, 0]), PipRequirement(modulename='cpplint', minversion=[1, 5, 0]),
PipRequirement(modulename='typing_extensions'), PipRequirement(modulename='typing_extensions'),