From 546ad7848f63895300c06144a245f429a6c73a52 Mon Sep 17 00:00:00 2001 From: Eric Froemling Date: Tue, 2 Jun 2020 15:37:47 -0700 Subject: [PATCH] Tidying --- .efrocachemap | 24 ++-- .idea/dictionaries/ericf.xml | 1 + assets/src/ba_data/python/_ba.py | 6 +- assets/src/ba_data/python/ba/__init__.py | 4 +- assets/src/ba_data/python/ba/_activity.py | 8 +- .../src/ba_data/python/ba/_activitytypes.py | 37 ++--- assets/src/ba_data/python/ba/_coopgame.py | 2 +- assets/src/ba_data/python/ba/_gameactivity.py | 4 +- assets/src/ba_data/python/ba/_level.py | 2 +- assets/src/ba_data/python/ba/_player.py | 17 +++ assets/src/ba_data/python/ba/_session.py | 2 +- assets/src/ba_data/python/ba/_stats.py | 6 +- assets/src/ba_data/python/ba/_team.py | 17 +++ assets/src/ba_data/python/ba/_teamgame.py | 2 +- .../ba_data/python/bastd/activity/coopjoin.py | 2 +- .../python/bastd/activity/coopscore.py | 2 +- .../python/bastd/activity/dualteamscore.py | 2 +- .../bastd/activity/freeforallvictory.py | 2 +- .../python/bastd/activity/multiteamjoin.py | 2 +- .../python/bastd/activity/multiteamscore.py | 2 +- .../python/bastd/activity/multiteamvictory.py | 2 +- .../src/ba_data/python/bastd/game/assault.py | 2 +- .../python/bastd/game/capturetheflag.py | 2 +- .../ba_data/python/bastd/game/chosenone.py | 2 +- .../src/ba_data/python/bastd/game/conquest.py | 2 +- .../ba_data/python/bastd/game/deathmatch.py | 2 +- .../python/bastd/game/easteregghunt.py | 2 +- .../ba_data/python/bastd/game/elimination.py | 2 +- .../src/ba_data/python/bastd/game/football.py | 8 +- .../src/ba_data/python/bastd/game/hockey.py | 2 +- .../src/ba_data/python/bastd/game/keepaway.py | 2 +- .../python/bastd/game/kingofthehill.py | 2 +- .../ba_data/python/bastd/game/meteorshower.py | 2 +- .../ba_data/python/bastd/game/ninjafight.py | 2 +- .../ba_data/python/bastd/game/onslaught.py | 2 +- assets/src/ba_data/python/bastd/game/race.py | 2 +- .../ba_data/python/bastd/game/runaround.py | 2 +- .../python/bastd/game/targetpractice.py | 2 +- .../ba_data/python/bastd/game/thelaststand.py | 2 +- assets/src/ba_data/python/bastd/tutorial.py | 2 +- .../python/bastd/ui/settings/gamepad.py | 2 +- .../python/bastd/ui/settings/keyboard.py | 2 +- docs/ba_module.md | 133 ++++++++++++++++-- 43 files changed, 230 insertions(+), 97 deletions(-) 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
  • Gameplay Functions

    @@ -424,7 +430,7 @@ regardless of the player count).

    <constructor>, add_actor_weak_ref(), create_player(), create_team(), end(), handlemessage(), has_begun(), has_ended(), has_transitioned_in(), is_transitioning_out(), on_begin(), on_expire(), on_player_join(), on_player_leave(), on_team_join(), on_team_leave(), on_transition_in(), on_transition_out(), retain_actor(), transition_out()

    <constructor>

    -

    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
    <constructor>, celebrate(), fade_to_red(), get_score_type(), on_begin(), setup_low_life_warning_sound(), spawn_player_spaz(), supports_session_type()

    <constructor>

    -

    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.


    +

    ba.EmptyPlayer

    +

    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:

    +
    actor
    +

    Attributes Defined Here:

    +
    customdata, node, position, sessionplayer, team
    +
    +

    customdata

    +

    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.

    + +
    +

    node

    +

    ba.Node

    +

    A ba.Node of type 'player' associated with this Player.

    + +

    This node can be used to get a generic player position/etc.

    + +
    +

    position

    +

    ba.Vec3

    +

    The position of the player, as defined by its current ba.Actor.

    + +

    This value is undefined when the player has no Actor.

    + +
    +

    sessionplayer

    +

    ba.SessionPlayer

    +

    Return the ba.SessionPlayer corresponding to this Player.

    + +

    Throws a ba.SessionPlayerNotFoundError if it does not exist.

    + +
    +

    team

    +

    TeamType

    +

    The ba.Team for this player.

    + +
    +
    +

    Methods:

    +

    <all methods inherited from ba.Player>

    +
    +

    ba.EmptyTeam

    +

    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:

    +
    customdata, sessionteam
    +
    +

    customdata

    +

    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

    +

    SessionTeam

    +

    Return the ba.SessionTeam corresponding to this Team.

    + +

    Throws a ba.SessionTeamNotFoundError if there is none.

    + +
    +
    +

    Methods:

    +

    <all methods inherited from ba.Team>

    +

    ba.Existable

    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.

    <constructor>, continue_or_end_game(), create_settings_ui(), end(), end_game(), get_description(), get_description_display_string(), get_display_string(), get_game_settings(), get_instance_description(), get_instance_description_short(), get_instance_display_string(), get_instance_scoreboard_display_string(), get_score_info(), get_settings_display_string(), get_supported_maps(), get_team_display_string(), getname(), handlemessage(), is_waiting_for_continue(), on_begin(), on_continue(), on_player_join(), on_transition_in(), respawn_player(), setup_standard_powerup_drops(), setup_standard_time_limit(), show_zoom_message(), spawn_player(), spawn_player_if_exists(), spawn_player_spaz(), supports_session_type()

    <constructor>

    -

    ba.GameActivity(settings: Dict[str, Any])

    +

    ba.GameActivity(settings: dict)

    Instantiate the Activity.

    @@ -2785,7 +2896,7 @@ prefs, etc.

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

    <constructor>

    -

    ba.Level(name: str, gametype: Type[ba.GameActivity], settings: Dict[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:

    -
    character, color, gameplayer, highlight, id, in_game, inputdevice, sessionteam
    +
    activityplayer, character, color, highlight, id, in_game, inputdevice, sessionteam
    +

    activityplayer

    +

    Optional[ba.Player]

    +

    The current game-specific instance for this player.

    + +

    character

    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.

    -
    -

    gameplayer

    -

    Optional[ba.Player]

    -

    The current game-specific instance for this player.

    -

    highlight

    Sequence[float]

    @@ -5124,7 +5235,7 @@ of the session.

    <constructor>, end(), on_begin(), on_transition_in(), spawn_player_spaz(), supports_session_type()

    <constructor>

    -

    ba.TeamGameActivity(settings: Dict[str, Any])

    +

    ba.TeamGameActivity(settings: dict)

    Instantiate the Activity.