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/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"
}

View File

@ -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 = ''

View File

@ -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()

View File

@ -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),

View File

@ -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')

View File

@ -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.

View File

@ -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,

View File

@ -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,

View File

@ -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:

View File

@ -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')

View File

@ -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

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)
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

View File

@ -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,

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_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

View File

@ -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

View File

@ -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()

View File

@ -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')

View File

@ -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(

View File

@ -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:

View File

@ -1,5 +1,5 @@
<!-- 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,
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>
@ -1236,8 +1236,18 @@ mycall()</pre>
</p>
<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>
<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>
<p><span>str</span></p>
<p>The name of the Campaign.</p>
@ -1250,41 +1260,29 @@ mycall()</pre>
</dd>
</dl>
<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>
<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>
</dd>
<dt><h4><a name="method_ba_Campaign__add_level">add_level()</a></dt></h4><dd>
<p><span>add_level(self, level: <a href="#class_ba_Level">ba.Level</a>) -&gt; None</span></p>
<dt><h4><a name="method_ba_Campaign__addlevel">addlevel()</a></dt></h4><dd>
<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>
</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>
<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>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>
<dt><h4><a name="method_ba_Campaign__reset">reset()</a></dt></h4><dd>
<p><span>reset(self) -&gt; None</span></p>
@ -3051,8 +3049,13 @@ prefs, etc.</p>
</p>
<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>
<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>
<p><span>bool</span></p>
<p>Whether this Level has been completed.</p>
@ -3093,22 +3096,14 @@ prefs, etc.</p>
</dd>
</dl>
<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>
<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>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>
<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>

View File

@ -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'),