diff --git a/.efrocachemap b/.efrocachemap
index a3cd6b95..9959a6e0 100644
--- a/.efrocachemap
+++ b/.efrocachemap
@@ -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/15/7a/d4e39ad022b8365418ecee4d026b",
- "build/prefab/linux-server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/ab/ad/7e371dfb7ed7b10d46f0bf9497d8",
- "build/prefab/linux/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/92/28/faa6501d779b381dec7fb9ac19c5",
- "build/prefab/linux/release/ballisticacore": "https://files.ballistica.net/cache/ba1/45/57/97d03c6230cfc4d9f0687249f408",
- "build/prefab/mac-server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/df/ec/9a476535716a8798813506f502a5",
- "build/prefab/mac-server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/ae/78/7a6522e860506fe1046808ce7b0b",
- "build/prefab/mac/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/fa/67/ec5ab3ace8d2e740e85f23ebfbb0",
- "build/prefab/mac/release/ballisticacore": "https://files.ballistica.net/cache/ba1/87/49/3c1d3c8a995df400e46df3470b02",
- "build/prefab/windows-server/debug/dist/ballisticacore_headless.exe": "https://files.ballistica.net/cache/ba1/7c/6f/c04c002f3a92497f52ff56f62bd3",
- "build/prefab/windows-server/release/dist/ballisticacore_headless.exe": "https://files.ballistica.net/cache/ba1/e2/c7/91f468ff6714872fe4329a11b27d",
- "build/prefab/windows/debug/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/85/ef/23050d0205b3449a8e4c74c35e62",
- "build/prefab/windows/release/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/ef/a1/78572099ac9ef2d0734fb14ed164"
+ "build/prefab/linux-server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/2e/aa/9bcdf166975aa5295669df48f641",
+ "build/prefab/linux-server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/d8/44/091ec27299abfb3e4a12efbb4016",
+ "build/prefab/linux/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/1b/2f/99bcfa67fb5a77d9d80883fcc9a4",
+ "build/prefab/linux/release/ballisticacore": "https://files.ballistica.net/cache/ba1/f6/f5/fbd4514b7ca4663f917ee848acc5",
+ "build/prefab/mac-server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/8b/3c/7f4895731a58ab99c8deb2caa563",
+ "build/prefab/mac-server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/ba/d5/5a51c250695ce84b0cf2d59ef447",
+ "build/prefab/mac/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/44/e9/33f406d3ff1a7a5ec5c0d7f185e6",
+ "build/prefab/mac/release/ballisticacore": "https://files.ballistica.net/cache/ba1/53/55/1f3e23b7c6e975056854005de9aa",
+ "build/prefab/windows-server/debug/dist/ballisticacore_headless.exe": "https://files.ballistica.net/cache/ba1/c5/5d/56272619667b1fcd87b759d8688d",
+ "build/prefab/windows-server/release/dist/ballisticacore_headless.exe": "https://files.ballistica.net/cache/ba1/8b/d0/24e71e25ac40fbd513e21c318ba4",
+ "build/prefab/windows/debug/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/8a/6a/ba53af1a84abfa764213f1791ea2",
+ "build/prefab/windows/release/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/d8/7b/b32727ec4d7e899d54ebe83e1203"
}
\ No newline at end of file
diff --git a/.idea/dictionaries/ericf.xml b/.idea/dictionaries/ericf.xml
index 1763add7..62472471 100644
--- a/.idea/dictionaries/ericf.xml
+++ b/.idea/dictionaries/ericf.xml
@@ -34,6 +34,7 @@
acnt
actionhero
activityname
+ activityplayer
activitytypes
activityutils
actorclass
diff --git a/assets/src/ba_data/python/_ba.py b/assets/src/ba_data/python/_ba.py
index fb7554fd..cea20518 100644
--- a/assets/src/ba_data/python/_ba.py
+++ b/assets/src/ba_data/python/_ba.py
@@ -34,7 +34,7 @@ NOTE: This file was autogenerated by gendummymodule; do not edit by hand.
"""
# (hash we can use to see if this file is out of date)
-# SOURCES_HASH=214847179904844500339904334878206016957
+# SOURCES_HASH=78832523659898286100096175148597852751
# I'm sorry Pylint. I know this file saddens you. Be strong.
# pylint: disable=useless-suppression
@@ -843,7 +843,7 @@ class SessionPlayer:
character: str
The character this player has selected in their profile.
- gameplayer: Optional[ba.Player]
+ activityplayer: Optional[ba.Player]
The current game-specific instance for this player.
"""
id: int
@@ -853,7 +853,7 @@ class SessionPlayer:
color: Sequence[float]
highlight: Sequence[float]
character: str
- gameplayer: Optional[ba.Player]
+ activityplayer: Optional[ba.Player]
def assigninput(self, type: Union[str, Tuple[str, ...]],
call: Callable) -> None:
diff --git a/assets/src/ba_data/python/ba/__init__.py b/assets/src/ba_data/python/ba/__init__.py
index 936cdef6..d3f41562 100644
--- a/assets/src/ba_data/python/ba/__init__.py
+++ b/assets/src/ba_data/python/ba/__init__.py
@@ -39,7 +39,7 @@ from _ba import (CollideModel, Context, ContextCall, Data, InputDevice,
open_url, widget)
from ba._activity import Activity
from ba._actor import Actor
-from ba._player import PlayerInfo, Player, StandLocation
+from ba._player import PlayerInfo, Player, EmptyPlayer, StandLocation
from ba._nodeactor import NodeActor
from ba._app import App
from ba._coopgame import CoopGameActivity
@@ -62,7 +62,7 @@ from ba._session import Session
from ba._servermode import ServerController
from ba._score import ScoreType, ScoreInfo
from ba._stats import PlayerScoredMessage, PlayerRecord, Stats
-from ba._team import SessionTeam, Team
+from ba._team import SessionTeam, Team, EmptyTeam
from ba._teamgame import TeamGameActivity
from ba._dualteamsession import DualTeamSession
from ba._achievement import Achievement
diff --git a/assets/src/ba_data/python/ba/_activity.py b/assets/src/ba_data/python/ba/_activity.py
index 6c494c5f..0fa0d50e 100644
--- a/assets/src/ba_data/python/ba/_activity.py
+++ b/assets/src/ba_data/python/ba/_activity.py
@@ -140,7 +140,7 @@ class Activity(DependencyComponent, Generic[PlayerType, TeamType]):
# the next activity?
can_show_ad_on_death = False
- def __init__(self, settings: Dict[str, Any]):
+ def __init__(self, settings: dict):
"""Creates an Activity in the current ba.Session.
The activity will not be actually run until ba.Session.setactivity()
@@ -582,7 +582,7 @@ class Activity(DependencyComponent, Generic[PlayerType, TeamType]):
assert team is not None
sessionplayer.setactivity(self)
with _ba.Context(self):
- sessionplayer.gameplayer = player = self.create_player(
+ sessionplayer.activityplayer = player = self.create_player(
sessionplayer)
player.postinit(sessionplayer)
@@ -606,7 +606,7 @@ class Activity(DependencyComponent, Generic[PlayerType, TeamType]):
"""
assert not self.expired
- player: Any = sessionplayer.gameplayer
+ player: Any = sessionplayer.activityplayer
assert isinstance(player, self._playertype)
team: Any = sessionplayer.sessionteam.gameteam
assert isinstance(team, self._teamtype)
@@ -714,7 +714,7 @@ class Activity(DependencyComponent, Generic[PlayerType, TeamType]):
# These should never fail I think...
sessionplayer.setactivity(None)
- sessionplayer.gameplayer = None
+ sessionplayer.activityplayer = None
def _setup_player_and_team_types(self) -> None:
"""Pull player and team types from our typing.Generic params."""
diff --git a/assets/src/ba_data/python/ba/_activitytypes.py b/assets/src/ba_data/python/ba/_activitytypes.py
index cb03c75c..66bbc980 100644
--- a/assets/src/ba_data/python/ba/_activitytypes.py
+++ b/assets/src/ba_data/python/ba/_activitytypes.py
@@ -26,9 +26,9 @@ from typing import TYPE_CHECKING
import _ba
from ba._activity import Activity
from ba._music import setmusic, MusicType
-# False positive due to our class_generics_filter custom pylint filter.
-from ba import _player
-from ba import _team
+# False-positive from pylint due to our class-generics-filter.
+from ba._player import EmptyPlayer # pylint: disable=W0611
+from ba._team import EmptyTeam # pylint: disable=W0611
if TYPE_CHECKING:
from typing import Any, Dict, Optional
@@ -36,21 +36,10 @@ if TYPE_CHECKING:
from ba._lobby import JoinInfo
-# Even though we don't need custom Player/Team types, define empty ones
-# so we don't have ba.Player[Any] and ba.Team[Any] as our types which
-# reduces type safety.
-class Player(_player.Player['Team']):
- """Our player type for this game."""
-
-
-class Team(_team.Team[Player]):
- """Our team type for this game."""
-
-
-class EndSessionActivity(Activity[Player, Team]):
+class EndSessionActivity(Activity[EmptyPlayer, EmptyTeam]):
"""Special ba.Activity to fade out and end the current ba.Session."""
- def __init__(self, settings: Dict[str, Any]):
+ def __init__(self, settings: dict):
super().__init__(settings)
# Keeps prev activity alive while we fade out.
@@ -75,13 +64,13 @@ class EndSessionActivity(Activity[Player, Team]):
call_after_ad(Call(_ba.new_host_session, MainMenuSession))
-class JoinActivity(Activity[Player, Team]):
+class JoinActivity(Activity[EmptyPlayer, EmptyTeam]):
"""Standard activity for waiting for players to join.
It shows tips and other info and waits for all players to check ready.
"""
- def __init__(self, settings: Dict[str, Any]):
+ def __init__(self, settings: dict):
super().__init__(settings)
# This activity is a special 'joiner' activity.
@@ -112,13 +101,13 @@ class JoinActivity(Activity[Player, Team]):
_ba.set_analytics_screen('Joining Screen')
-class TransitionActivity(Activity[Player, Team]):
+class TransitionActivity(Activity[EmptyPlayer, EmptyTeam]):
"""A simple overlay fade out/in.
Useful as a bare minimum transition between two level based activities.
"""
- def __init__(self, settings: Dict[str, Any]):
+ def __init__(self, settings: dict):
super().__init__(settings)
# Keep prev activity alive while we fade in.
@@ -145,13 +134,13 @@ class TransitionActivity(Activity[Player, Team]):
_ba.timer(0.1, self.end)
-class ScoreScreenActivity(Activity[Player, Team]):
+class ScoreScreenActivity(Activity[EmptyPlayer, EmptyTeam]):
"""A standard score screen that fades in and shows stuff for a while.
After a specified delay, player input is assigned to end the activity.
"""
- def __init__(self, settings: Dict[str, Any]):
+ def __init__(self, settings: dict):
super().__init__(settings)
self.transition_time = 0.5
self.inherits_tint = True
@@ -169,7 +158,7 @@ class ScoreScreenActivity(Activity[Player, Team]):
self._custom_continue_message: Optional[ba.Lstr] = None
self._server_transitioning: Optional[bool] = None
- def on_player_join(self, player: Player) -> None:
+ def on_player_join(self, player: EmptyPlayer) -> None:
from ba import _general
super().on_player_join(player)
time_till_assign = max(
@@ -235,7 +224,7 @@ class ScoreScreenActivity(Activity[Player, Team]):
# Otherwise end the activity normally.
self.end()
- def _safe_assign(self, player: Player) -> None:
+ 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).
diff --git a/assets/src/ba_data/python/ba/_coopgame.py b/assets/src/ba_data/python/ba/_coopgame.py
index 08c72572..6bba3296 100644
--- a/assets/src/ba_data/python/ba/_coopgame.py
+++ b/assets/src/ba_data/python/ba/_coopgame.py
@@ -50,7 +50,7 @@ class CoopGameActivity(GameActivity[PlayerType, TeamType]):
from ba._coopsession import CoopSession
return issubclass(sessiontype, CoopSession)
- def __init__(self, settings: Dict[str, Any]):
+ def __init__(self, settings: dict):
super().__init__(settings)
# Cache these for efficiency.
diff --git a/assets/src/ba_data/python/ba/_gameactivity.py b/assets/src/ba_data/python/ba/_gameactivity.py
index 370bc7a5..188d599d 100644
--- a/assets/src/ba_data/python/ba/_gameactivity.py
+++ b/assets/src/ba_data/python/ba/_gameactivity.py
@@ -278,7 +278,7 @@ class GameActivity(Activity[PlayerType, TeamType]):
# By default, games support any versus mode
return issubclass(sessiontype, MultiTeamSession)
- def __init__(self, settings: Dict[str, Any]):
+ def __init__(self, settings: dict):
"""Instantiate the Activity."""
super().__init__(settings)
@@ -1224,7 +1224,7 @@ class GameActivity(Activity[PlayerType, TeamType]):
trail=trail,
color=color).autoretain()
- def _calc_map_name(self, settings: Dict[str, Any]) -> str:
+ def _calc_map_name(self, settings: dict) -> str:
map_name: str
if 'map' in settings:
map_name = settings['map']
diff --git a/assets/src/ba_data/python/ba/_level.py b/assets/src/ba_data/python/ba/_level.py
index 8f59099a..05d4f709 100644
--- a/assets/src/ba_data/python/ba/_level.py
+++ b/assets/src/ba_data/python/ba/_level.py
@@ -42,7 +42,7 @@ class Level:
def __init__(self,
name: str,
gametype: Type[ba.GameActivity],
- settings: Dict[str, Any],
+ settings: dict,
preview_texture_name: str,
displayname: str = None):
"""Initializes a Level object with the provided values."""
diff --git a/assets/src/ba_data/python/ba/_player.py b/assets/src/ba_data/python/ba/_player.py
index b986d04c..3a1c38e1 100644
--- a/assets/src/ba_data/python/ba/_player.py
+++ b/assets/src/ba_data/python/ba/_player.py
@@ -299,6 +299,23 @@ class Player(Generic[TeamType]):
return self.exists()
+class EmptyPlayer(Player['ba.EmptyTeam']):
+ """An empty player for use by Activities that don't need to define one.
+
+ Category: Gameplay Classes
+
+ ba.Player and ba.Team are 'Generic' types, and so passing them as
+ type arguments when defining a ba.Activity reduces type safety.
+ For example, activity.teams[0].player will have type 'Any' in that case.
+ For that reason, it is better to pass EmptyPlayer and EmptyTeam when
+ defining a ba.Activity that does not need custom types of its own.
+
+ Note that EmptyPlayer defines its team type as EmptyTeam and vice versa,
+ so if you want to define your own class for one of them you must do so
+ for both.
+ """
+
+
# NOTE: It seems we might not need these playercast() calls; have gone
# the direction where things returning players generally take a type arg
# and do this themselves; that way the user is 'forced' to deal with types
diff --git a/assets/src/ba_data/python/ba/_session.py b/assets/src/ba_data/python/ba/_session.py
index 98b97728..a290efde 100644
--- a/assets/src/ba_data/python/ba/_session.py
+++ b/assets/src/ba_data/python/ba/_session.py
@@ -274,7 +274,7 @@ class Session:
' in on_player_leave.')
# Grab their activity-specific player instance.
- player = sessionplayer.gameplayer
+ player = sessionplayer.activityplayer
assert isinstance(player, (Player, type(None)))
# Remove them from any current Activity.
diff --git a/assets/src/ba_data/python/ba/_stats.py b/assets/src/ba_data/python/ba/_stats.py
index cdc0271d..b92dc374 100644
--- a/assets/src/ba_data/python/ba/_stats.py
+++ b/assets/src/ba_data/python/ba/_stats.py
@@ -206,9 +206,9 @@ class PlayerRecord:
# a current position for them.
our_pos: Optional[Sequence[float]] = None
if self._player is not None:
- if self._player.gameplayer is not None:
- if self._player.gameplayer.node:
- our_pos = self._player.gameplayer.node.position
+ if self._player.activityplayer is not None:
+ if self._player.activityplayer.node:
+ our_pos = self._player.activityplayer.node.position
if our_pos is None:
return
diff --git a/assets/src/ba_data/python/ba/_team.py b/assets/src/ba_data/python/ba/_team.py
index fa4be4d6..23326f82 100644
--- a/assets/src/ba_data/python/ba/_team.py
+++ b/assets/src/ba_data/python/ba/_team.py
@@ -211,3 +211,20 @@ class Team(Generic[PlayerType]):
return sessionteam
from ba import _error
raise _error.SessionTeamNotFoundError()
+
+
+class EmptyTeam(Team['ba.EmptyPlayer']):
+ """An empty player for use by Activities that don't need to define one.
+
+ Category: Gameplay Classes
+
+ ba.Player and ba.Team are 'Generic' types, and so passing them as
+ type arguments when defining a ba.Activity reduces type safety.
+ For example, activity.teams[0].player will have type 'Any' in that case.
+ For that reason, it is better to pass EmptyPlayer and EmptyTeam when
+ defining a ba.Activity that does not need custom types of its own.
+
+ Note that EmptyPlayer defines its team type as EmptyTeam and vice versa,
+ so if you want to define your own class for one of them you must do so
+ for both.
+ """
diff --git a/assets/src/ba_data/python/ba/_teamgame.py b/assets/src/ba_data/python/ba/_teamgame.py
index c34a67b4..b6cb3386 100644
--- a/assets/src/ba_data/python/ba/_teamgame.py
+++ b/assets/src/ba_data/python/ba/_teamgame.py
@@ -58,7 +58,7 @@ class TeamGameActivity(GameActivity[PlayerType, TeamType]):
return (issubclass(sessiontype, DualTeamSession)
or issubclass(sessiontype, FreeForAllSession))
- def __init__(self, settings: Dict[str, Any]):
+ def __init__(self, settings: dict):
super().__init__(settings)
# By default we don't show kill-points in free-for-all sessions.
diff --git a/assets/src/ba_data/python/bastd/activity/coopjoin.py b/assets/src/ba_data/python/bastd/activity/coopjoin.py
index 78addd43..54bd831f 100644
--- a/assets/src/ba_data/python/bastd/activity/coopjoin.py
+++ b/assets/src/ba_data/python/bastd/activity/coopjoin.py
@@ -38,7 +38,7 @@ class CoopJoinActivity(JoinActivity):
# We can assume our session is a CoopSession.
session: ba.CoopSession
- def __init__(self, settings: Dict[str, Any]):
+ def __init__(self, settings: dict):
super().__init__(settings)
session = self.session
assert isinstance(session, ba.CoopSession)
diff --git a/assets/src/ba_data/python/bastd/activity/coopscore.py b/assets/src/ba_data/python/bastd/activity/coopscore.py
index 45d4b0b2..e3092882 100644
--- a/assets/src/ba_data/python/bastd/activity/coopscore.py
+++ b/assets/src/ba_data/python/bastd/activity/coopscore.py
@@ -41,7 +41,7 @@ if TYPE_CHECKING:
class CoopScoreScreen(ba.Activity[ba.Player, ba.Team]):
"""Score screen showing the results of a cooperative game."""
- def __init__(self, settings: Dict[str, Any]):
+ def __init__(self, settings: dict):
# pylint: disable=too-many-statements
super().__init__(settings)
diff --git a/assets/src/ba_data/python/bastd/activity/dualteamscore.py b/assets/src/ba_data/python/bastd/activity/dualteamscore.py
index 5c7e28cd..8831d687 100644
--- a/assets/src/ba_data/python/bastd/activity/dualteamscore.py
+++ b/assets/src/ba_data/python/bastd/activity/dualteamscore.py
@@ -35,7 +35,7 @@ if TYPE_CHECKING:
class TeamVictoryScoreScreenActivity(MultiTeamScoreScreenActivity):
"""Scorescreen between rounds of a dual-team session."""
- def __init__(self, settings: Dict[str, Any]):
+ def __init__(self, settings: dict):
super().__init__(settings=settings)
self._winner: ba.SessionTeam = settings['winner']
assert isinstance(self._winner, ba.SessionTeam)
diff --git a/assets/src/ba_data/python/bastd/activity/freeforallvictory.py b/assets/src/ba_data/python/bastd/activity/freeforallvictory.py
index 9e0de4e8..3dd4232c 100644
--- a/assets/src/ba_data/python/bastd/activity/freeforallvictory.py
+++ b/assets/src/ba_data/python/bastd/activity/freeforallvictory.py
@@ -34,7 +34,7 @@ if TYPE_CHECKING:
class FreeForAllVictoryScoreScreenActivity(MultiTeamScoreScreenActivity):
"""Score screen shown at after free-for-all rounds."""
- def __init__(self, settings: Dict[str, Any]):
+ def __init__(self, settings: dict):
super().__init__(settings=settings)
# Keep prev activity alive while we fade in.
diff --git a/assets/src/ba_data/python/bastd/activity/multiteamjoin.py b/assets/src/ba_data/python/bastd/activity/multiteamjoin.py
index 08b10b71..56e344ae 100644
--- a/assets/src/ba_data/python/bastd/activity/multiteamjoin.py
+++ b/assets/src/ba_data/python/bastd/activity/multiteamjoin.py
@@ -35,7 +35,7 @@ if TYPE_CHECKING:
class MultiTeamJoinActivity(JoinActivity):
"""Join screen for teams sessions."""
- def __init__(self, settings: Dict[str, Any]):
+ def __init__(self, settings: dict):
super().__init__(settings)
self._next_up_text: Optional[Text] = None
diff --git a/assets/src/ba_data/python/bastd/activity/multiteamscore.py b/assets/src/ba_data/python/bastd/activity/multiteamscore.py
index 77b2a5f9..909619b5 100644
--- a/assets/src/ba_data/python/bastd/activity/multiteamscore.py
+++ b/assets/src/ba_data/python/bastd/activity/multiteamscore.py
@@ -35,7 +35,7 @@ if TYPE_CHECKING:
class MultiTeamScoreScreenActivity(ScoreScreenActivity):
"""Base class for score screens."""
- def __init__(self, settings: Dict[str, Any]):
+ def __init__(self, settings: dict):
super().__init__(settings=settings)
self._score_display_sound = ba.getsound('scoreHit01')
self._score_display_sound_small = ba.getsound('scoreHit02')
diff --git a/assets/src/ba_data/python/bastd/activity/multiteamvictory.py b/assets/src/ba_data/python/bastd/activity/multiteamvictory.py
index 39f37f8c..ea2bd5ae 100644
--- a/assets/src/ba_data/python/bastd/activity/multiteamvictory.py
+++ b/assets/src/ba_data/python/bastd/activity/multiteamvictory.py
@@ -34,7 +34,7 @@ if TYPE_CHECKING:
class TeamSeriesVictoryScoreScreenActivity(MultiTeamScoreScreenActivity):
"""Final score screen for a team series."""
- def __init__(self, settings: Dict[str, Any]):
+ def __init__(self, settings: dict):
super().__init__(settings=settings)
self._min_view_time = 15.0
self._is_ffa = isinstance(self.session, ba.FreeForAllSession)
diff --git a/assets/src/ba_data/python/bastd/game/assault.py b/assets/src/ba_data/python/bastd/game/assault.py
index f58594af..3aa609fa 100644
--- a/assets/src/ba_data/python/bastd/game/assault.py
+++ b/assets/src/ba_data/python/bastd/game/assault.py
@@ -86,7 +86,7 @@ class AssaultGame(ba.TeamGameActivity[Player, Team]):
def get_supported_maps(cls, sessiontype: Type[ba.Session]) -> List[str]:
return ba.getmaps('team_flag')
- def __init__(self, settings: Dict[str, Any]):
+ def __init__(self, settings: dict):
super().__init__(settings)
self._scoreboard = Scoreboard()
self._last_score_time = 0.0
diff --git a/assets/src/ba_data/python/bastd/game/capturetheflag.py b/assets/src/ba_data/python/bastd/game/capturetheflag.py
index 79528594..44ae5bb9 100644
--- a/assets/src/ba_data/python/bastd/game/capturetheflag.py
+++ b/assets/src/ba_data/python/bastd/game/capturetheflag.py
@@ -153,7 +153,7 @@ class CaptureTheFlagGame(ba.TeamGameActivity[Player, Team]):
def get_supported_maps(cls, sessiontype: Type[ba.Session]) -> List[str]:
return ba.getmaps('team_flag')
- def __init__(self, settings: Dict[str, Any]):
+ def __init__(self, settings: dict):
super().__init__(settings)
self._scoreboard = Scoreboard()
self._alarmsound = ba.getsound('alarm')
diff --git a/assets/src/ba_data/python/bastd/game/chosenone.py b/assets/src/ba_data/python/bastd/game/chosenone.py
index 740631bc..dd6cb3dd 100644
--- a/assets/src/ba_data/python/bastd/game/chosenone.py
+++ b/assets/src/ba_data/python/bastd/game/chosenone.py
@@ -95,7 +95,7 @@ class ChosenOneGame(ba.TeamGameActivity[Player, Team]):
def get_supported_maps(cls, sessiontype: Type[ba.Session]) -> List[str]:
return ba.getmaps('keep_away')
- def __init__(self, settings: Dict[str, Any]):
+ def __init__(self, settings: dict):
super().__init__(settings)
self._scoreboard = Scoreboard()
self._chosen_one_player: Optional[Player] = None
diff --git a/assets/src/ba_data/python/bastd/game/conquest.py b/assets/src/ba_data/python/bastd/game/conquest.py
index 8ae90f0c..3a40e783 100644
--- a/assets/src/ba_data/python/bastd/game/conquest.py
+++ b/assets/src/ba_data/python/bastd/game/conquest.py
@@ -120,7 +120,7 @@ class ConquestGame(ba.TeamGameActivity[Player, Team]):
def get_supported_maps(cls, sessiontype: Type[ba.Session]) -> List[str]:
return ba.getmaps('conquest')
- def __init__(self, settings: Dict[str, Any]):
+ def __init__(self, settings: dict):
super().__init__(settings)
shared = SharedObjects.get()
self._scoreboard = Scoreboard()
diff --git a/assets/src/ba_data/python/bastd/game/deathmatch.py b/assets/src/ba_data/python/bastd/game/deathmatch.py
index 2c2395d6..2ce26015 100644
--- a/assets/src/ba_data/python/bastd/game/deathmatch.py
+++ b/assets/src/ba_data/python/bastd/game/deathmatch.py
@@ -101,7 +101,7 @@ class DeathMatchGame(ba.TeamGameActivity[Player, Team]):
def get_supported_maps(cls, sessiontype: Type[ba.Session]) -> List[str]:
return ba.getmaps('melee')
- def __init__(self, settings: Dict[str, Any]):
+ def __init__(self, settings: dict):
super().__init__(settings)
self._scoreboard = Scoreboard()
self._score_to_win: Optional[int] = None
diff --git a/assets/src/ba_data/python/bastd/game/easteregghunt.py b/assets/src/ba_data/python/bastd/game/easteregghunt.py
index bef86f60..9d1b98cb 100644
--- a/assets/src/ba_data/python/bastd/game/easteregghunt.py
+++ b/assets/src/ba_data/python/bastd/game/easteregghunt.py
@@ -77,7 +77,7 @@ class EasterEggHuntGame(ba.TeamGameActivity[Player, Team]):
or issubclass(sessiontype, ba.DualTeamSession)
or issubclass(sessiontype, ba.FreeForAllSession))
- def __init__(self, settings: Dict[str, Any]):
+ def __init__(self, settings: dict):
super().__init__(settings)
shared = SharedObjects.get()
self._last_player_death_time = None
diff --git a/assets/src/ba_data/python/bastd/game/elimination.py b/assets/src/ba_data/python/bastd/game/elimination.py
index a2acd319..b6bbae25 100644
--- a/assets/src/ba_data/python/bastd/game/elimination.py
+++ b/assets/src/ba_data/python/bastd/game/elimination.py
@@ -237,7 +237,7 @@ class EliminationGame(ba.TeamGameActivity[Player, Team]):
def get_supported_maps(cls, sessiontype: Type[ba.Session]) -> List[str]:
return ba.getmaps('melee')
- def __init__(self, settings: Dict[str, Any]):
+ def __init__(self, settings: dict):
super().__init__(settings)
self._scoreboard = Scoreboard()
self._start_time: Optional[float] = None
diff --git a/assets/src/ba_data/python/bastd/game/football.py b/assets/src/ba_data/python/bastd/game/football.py
index e8c03711..3d8abc67 100644
--- a/assets/src/ba_data/python/bastd/game/football.py
+++ b/assets/src/ba_data/python/bastd/game/football.py
@@ -123,7 +123,7 @@ class FootballTeamGame(ba.TeamGameActivity[Player, Team]):
def get_supported_maps(cls, sessiontype: Type[ba.Session]) -> List[str]:
return ba.getmaps('football')
- def __init__(self, settings: Dict[str, Any]):
+ def __init__(self, settings: dict):
super().__init__(settings)
self._scoreboard: Optional[Scoreboard] = Scoreboard()
@@ -329,9 +329,7 @@ class FootballTeamGame(ba.TeamGameActivity[Player, Team]):
class FootballCoopGame(ba.CoopGameActivity[Player, Team]):
- """
- Co-op variant of football
- """
+ """Co-op variant of football."""
name = 'Football'
tips = ['Use the pick-up button to grab the flag < ${PICKUP} >']
@@ -356,7 +354,7 @@ class FootballCoopGame(ba.CoopGameActivity[Player, Team]):
return 'score ${ARG1} touchdowns', touchdowns
return 'score a touchdown'
- def __init__(self, settings: Dict[str, Any]):
+ def __init__(self, settings: dict):
settings['map'] = 'Football Stadium'
super().__init__(settings)
self._preset = settings.get('preset', 'rookie')
diff --git a/assets/src/ba_data/python/bastd/game/hockey.py b/assets/src/ba_data/python/bastd/game/hockey.py
index 0f13c998..57a17ec0 100644
--- a/assets/src/ba_data/python/bastd/game/hockey.py
+++ b/assets/src/ba_data/python/bastd/game/hockey.py
@@ -153,7 +153,7 @@ class HockeyGame(ba.TeamGameActivity[Player, Team]):
def get_supported_maps(cls, sessiontype: Type[ba.Session]) -> List[str]:
return ba.getmaps('hockey')
- def __init__(self, settings: Dict[str, Any]):
+ def __init__(self, settings: dict):
super().__init__(settings)
shared = SharedObjects.get()
self._scoreboard = Scoreboard()
diff --git a/assets/src/ba_data/python/bastd/game/keepaway.py b/assets/src/ba_data/python/bastd/game/keepaway.py
index 0dda4482..9ae4600a 100644
--- a/assets/src/ba_data/python/bastd/game/keepaway.py
+++ b/assets/src/ba_data/python/bastd/game/keepaway.py
@@ -94,7 +94,7 @@ class KeepAwayGame(ba.TeamGameActivity[Player, Team]):
def get_supported_maps(cls, sessiontype: Type[ba.Session]) -> List[str]:
return ba.getmaps('keep_away')
- def __init__(self, settings: Dict[str, Any]):
+ def __init__(self, settings: dict):
super().__init__(settings)
self._scoreboard = Scoreboard()
self._swipsound = ba.getsound('swip')
diff --git a/assets/src/ba_data/python/bastd/game/kingofthehill.py b/assets/src/ba_data/python/bastd/game/kingofthehill.py
index 56c04457..8d98b26e 100644
--- a/assets/src/ba_data/python/bastd/game/kingofthehill.py
+++ b/assets/src/ba_data/python/bastd/game/kingofthehill.py
@@ -96,7 +96,7 @@ class KingOfTheHillGame(ba.TeamGameActivity[Player, Team]):
def get_supported_maps(cls, sessiontype: Type[ba.Session]) -> List[str]:
return ba.getmaps('king_of_the_hill')
- def __init__(self, settings: Dict[str, Any]):
+ def __init__(self, settings: dict):
super().__init__(settings)
shared = SharedObjects.get()
self._scoreboard = Scoreboard()
diff --git a/assets/src/ba_data/python/bastd/game/meteorshower.py b/assets/src/ba_data/python/bastd/game/meteorshower.py
index c9887da8..7512a186 100644
--- a/assets/src/ba_data/python/bastd/game/meteorshower.py
+++ b/assets/src/ba_data/python/bastd/game/meteorshower.py
@@ -74,7 +74,7 @@ class MeteorShowerGame(ba.TeamGameActivity[Player, Team]):
or issubclass(sessiontype, ba.FreeForAllSession)
or issubclass(sessiontype, ba.CoopSession))
- def __init__(self, settings: Dict[str, Any]):
+ def __init__(self, settings: dict):
super().__init__(settings)
self._epic_mode = settings.get('Epic Mode', False)
diff --git a/assets/src/ba_data/python/bastd/game/ninjafight.py b/assets/src/ba_data/python/bastd/game/ninjafight.py
index 72e15581..c2187f80 100644
--- a/assets/src/ba_data/python/bastd/game/ninjafight.py
+++ b/assets/src/ba_data/python/bastd/game/ninjafight.py
@@ -71,7 +71,7 @@ class NinjaFightGame(ba.TeamGameActivity[Player, Team]):
# In the constructor we should load any media we need/etc.
# ...but not actually create anything yet.
- def __init__(self, settings: Dict[str, Any]):
+ def __init__(self, settings: dict):
super().__init__(settings)
self._winsound = ba.getsound('score')
self._won = False
diff --git a/assets/src/ba_data/python/bastd/game/onslaught.py b/assets/src/ba_data/python/bastd/game/onslaught.py
index 430a7251..607ce182 100644
--- a/assets/src/ba_data/python/bastd/game/onslaught.py
+++ b/assets/src/ba_data/python/bastd/game/onslaught.py
@@ -155,7 +155,7 @@ class OnslaughtGame(ba.CoopGameActivity[Player, Team]):
# Show messages when players die since it matters here.
announce_player_deaths = True
- def __init__(self, settings: Dict[str, Any]):
+ def __init__(self, settings: dict):
self._preset = Preset(settings.get('preset', 'training'))
if self._preset in {
diff --git a/assets/src/ba_data/python/bastd/game/race.py b/assets/src/ba_data/python/bastd/game/race.py
index cc90ff7a..be5d0ec5 100644
--- a/assets/src/ba_data/python/bastd/game/race.py
+++ b/assets/src/ba_data/python/bastd/game/race.py
@@ -144,7 +144,7 @@ class RaceGame(ba.TeamGameActivity[Player, Team]):
def get_supported_maps(cls, sessiontype: Type[ba.Session]) -> List[str]:
return ba.getmaps('race')
- def __init__(self, settings: Dict[str, Any]):
+ def __init__(self, settings: dict):
self._race_started = False
super().__init__(settings)
self._scoreboard = Scoreboard()
diff --git a/assets/src/ba_data/python/bastd/game/runaround.py b/assets/src/ba_data/python/bastd/game/runaround.py
index d4b1b6cb..cf27e920 100644
--- a/assets/src/ba_data/python/bastd/game/runaround.py
+++ b/assets/src/ba_data/python/bastd/game/runaround.py
@@ -86,7 +86,7 @@ class RunaroundGame(ba.CoopGameActivity[Player, Team]):
StickyBot: 0.5
}
- def __init__(self, settings: Dict[str, Any]):
+ def __init__(self, settings: dict):
settings['map'] = 'Tower D'
super().__init__(settings)
shared = SharedObjects.get()
diff --git a/assets/src/ba_data/python/bastd/game/targetpractice.py b/assets/src/ba_data/python/bastd/game/targetpractice.py
index 7832b038..632ddc46 100644
--- a/assets/src/ba_data/python/bastd/game/targetpractice.py
+++ b/assets/src/ba_data/python/bastd/game/targetpractice.py
@@ -83,7 +83,7 @@ class TargetPracticeGame(ba.TeamGameActivity[Player, Team]):
return (issubclass(sessiontype, ba.CoopSession)
or issubclass(sessiontype, ba.MultiTeamSession))
- def __init__(self, settings: Dict[str, Any]):
+ def __init__(self, settings: dict):
super().__init__(settings)
self._scoreboard = Scoreboard()
self._targets: List[Target] = []
diff --git a/assets/src/ba_data/python/bastd/game/thelaststand.py b/assets/src/ba_data/python/bastd/game/thelaststand.py
index 77c74e81..047c8a29 100644
--- a/assets/src/ba_data/python/bastd/game/thelaststand.py
+++ b/assets/src/ba_data/python/bastd/game/thelaststand.py
@@ -77,7 +77,7 @@ class TheLastStandGame(ba.CoopGameActivity[Player, Team]):
default_music = ba.MusicType.EPIC
- def __init__(self, settings: Dict[str, Any]):
+ def __init__(self, settings: dict):
settings['map'] = 'Rampage'
super().__init__(settings)
self._new_wave_sound = ba.getsound('scoreHit01')
diff --git a/assets/src/ba_data/python/bastd/tutorial.py b/assets/src/ba_data/python/bastd/tutorial.py
index 8e95c00e..95a65111 100644
--- a/assets/src/ba_data/python/bastd/tutorial.py
+++ b/assets/src/ba_data/python/bastd/tutorial.py
@@ -197,7 +197,7 @@ class Team(ba.Team[Player]):
class TutorialActivity(ba.Activity[Player, Team]):
- def __init__(self, settings: Dict[str, Any] = None):
+ def __init__(self, settings: dict = None):
from bastd.maps import Rampage
if settings is None:
settings = {}
diff --git a/assets/src/ba_data/python/bastd/ui/settings/gamepad.py b/assets/src/ba_data/python/bastd/ui/settings/gamepad.py
index 758b432f..8faea5ad 100644
--- a/assets/src/ba_data/python/bastd/ui/settings/gamepad.py
+++ b/assets/src/ba_data/python/bastd/ui/settings/gamepad.py
@@ -39,7 +39,7 @@ class GamepadSettingsWindow(ba.Window):
is_main_menu: bool = True,
transition: str = 'in_right',
transition_out: str = 'out_right',
- settings: Dict[str, Any] = None):
+ settings: dict = None):
self._input = gamepad
# If this fails, our input device went away or something;
diff --git a/assets/src/ba_data/python/bastd/ui/settings/keyboard.py b/assets/src/ba_data/python/bastd/ui/settings/keyboard.py
index b7c04984..340a5446 100644
--- a/assets/src/ba_data/python/bastd/ui/settings/keyboard.py
+++ b/assets/src/ba_data/python/bastd/ui/settings/keyboard.py
@@ -262,7 +262,7 @@ class ConfigKeyboardWindow(ba.Window):
class AwaitKeyboardInputWindow(ba.Window):
"""Window for capturing a keypress."""
- def __init__(self, button: str, ui: ba.Widget, settings: Dict[str, Any]):
+ def __init__(self, button: str, ui: ba.Widget, settings: dict):
self._capture_button = button
self._capture_key_ui = ui
diff --git a/docs/ba_module.md b/docs/ba_module.md
index af2783a2..12344a28 100644
--- a/docs/ba_module.md
+++ b/docs/ba_module.md
@@ -26,6 +26,9 @@
ba.Material
ba.Node
ba.Player
+
ba.PlayerInfo
ba.PlayerRecord
ba.ScoreInfo
@@ -43,6 +46,9 @@
ba.StandLocation
ba.Stats
ba.Team
+
ba.TeamGameResults
@@ -424,7 +430,7 @@ regardless of the player count).
-
-
ba.Activity(settings: Dict[str, Any])
+ba.Activity(settings: dict)
Creates an Activity in the current ba.Session.
@@ -1616,7 +1622,7 @@ start_long_action(callback_when_done=ba.ContextC
-
-
ba.CoopGameActivity(settings: Dict[str, Any])
+ba.CoopGameActivity(settings: dict)
Instantiate the Activity.
@@ -2063,6 +2069,111 @@ its time with lingering corpses, sound effects, etc.
+Inherits from: ba.Player, typing.Generic
+An empty player for use by Activities that don't need to define one.
+
+Category: Gameplay Classes
+
+ ba.Player and ba.Team are 'Generic' types, and so passing them as
+ type arguments when defining a ba.Activity reduces type safety.
+ For example, activity.teams[0].player will have type 'Any' in that case.
+ For that reason, it is better to pass EmptyPlayer and EmptyTeam when
+ defining a ba.Activity that does not need custom types of its own.
+
+ Note that EmptyPlayer defines its team type as EmptyTeam and vice versa,
+ so if you want to define your own class for one of them you must do so
+ for both.
+
+
+Attributes Inherited:
+
+Attributes Defined Here:
+
+
+-
+
dict
+Arbitrary values associated with the player.
+ Though it is encouraged that most player values be properly defined
+ on the ba.Player subclass, it may be useful for player-agnostic
+ objects to store values here. This dict is cleared when the player
+ leaves or expires so objects stored here will be disposed of at
+ the expected time, unlike the Player instance itself which may
+ continue to be referenced after it is no longer part of the game.
+
+
+-
+
ba.Node
+A ba.Node of type 'player' associated with this Player.
+
+ This node can be used to get a generic player position/etc.
+
+
+-
+
ba.Vec3
+The position of the player, as defined by its current ba.Actor.
+
+ This value is undefined when the player has no Actor.
+
+
+-
+
ba.SessionPlayer
+Return the ba.SessionPlayer corresponding to this Player.
+
+ Throws a ba.SessionPlayerNotFoundError if it does not exist.
+
+
+-
+
TeamType
+The ba.Team for this player.
+
+
+
+Methods:
+<all methods inherited from ba.Player>
+
+Inherits from: ba.Team, typing.Generic
+An empty player for use by Activities that don't need to define one.
+
+Category: Gameplay Classes
+
+ ba.Player and ba.Team are 'Generic' types, and so passing them as
+ type arguments when defining a ba.Activity reduces type safety.
+ For example, activity.teams[0].player will have type 'Any' in that case.
+ For that reason, it is better to pass EmptyPlayer and EmptyTeam when
+ defining a ba.Activity that does not need custom types of its own.
+
+ Note that EmptyPlayer defines its team type as EmptyTeam and vice versa,
+ so if you want to define your own class for one of them you must do so
+ for both.
+
+
+Attributes:
+
+
+-
+
dict
+Arbitrary values associated with the team.
+ Though it is encouraged that most player values be properly defined
+ on the ba.Team subclass, it may be useful for player-agnostic
+ objects to store values here. This dict is cleared when the team
+ leaves or expires so objects stored here will be disposed of at
+ the expected time, unlike the Team instance itself which may
+ continue to be referenced after it is no longer part of the game.
+
+
+-
+
SessionTeam
+Return the ba.SessionTeam corresponding to this Team.
+
+ Throws a ba.SessionTeamNotFoundError if there is none.
+
+
+
+Methods:
+<all methods inherited from ba.Team>
+
Inherits from: typing_extensions.Protocol
A Protocol for objects supporting an exists() method.
@@ -2209,7 +2320,7 @@ its time with lingering corpses, sound effects, etc.
-
-
ba.GameActivity(settings: Dict[str, Any])
+ba.GameActivity(settings: dict)
Instantiate the Activity.
@@ -2785,7 +2896,7 @@ prefs, etc.
-
-
ba.Level(name: str, gametype: Type[ba.GameActivity], settings: Dict[str, Any], preview_texture_name: str, displayname: str = None)
+ba.Level(name: str, gametype: Type[ba.GameActivity], settings: dict, preview_texture_name: str, displayname: str = None)
Initializes a Level object with the provided values.
@@ -4557,8 +4668,13 @@ that a SessionPlayer is still present if retaining references to one
for any length of time.
Attributes:
-
+
+-
+
Optional[ba.Player]
+The current game-specific instance for this player.
+
+
-
str
The character this player has selected in their profile.
@@ -4569,11 +4685,6 @@ for any length of time.
The base color for this Player.
In team games this will match the ba.SessionTeam's color.
-
--
-
Optional[ba.Player]
-The current game-specific instance for this player.
-
-
Sequence[float]
@@ -5124,7 +5235,7 @@ of the session.
-
-
ba.TeamGameActivity(settings: Dict[str, Any])
+ba.TeamGameActivity(settings: dict)
Instantiate the Activity.