diff --git a/.efrocachemap b/.efrocachemap index c6f8425d..62ce73ba 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/96/a0/04fd3bb8245edd1d4e5845cc4629", - "build/prefab/linux-server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/6e/7e/82399a3b10f5a9d73a76c1cfb16e", - "build/prefab/linux/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/30/f0/cfd79764333c0282c8ffdec3c942", - "build/prefab/linux/release/ballisticacore": "https://files.ballistica.net/cache/ba1/02/51/5ac1a2bc29cf8639ba65629fa009", - "build/prefab/mac-server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/5c/ff/e78f3f17b45eea5d0359e68c311a", - "build/prefab/mac-server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/53/bf/dade39164bd18003c8bd51b05119", - "build/prefab/mac/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/7c/7e/30bfdd3a09b468014a4cde5cf3b7", - "build/prefab/mac/release/ballisticacore": "https://files.ballistica.net/cache/ba1/7a/cf/b25179f9e1db8b6b774ba6a31e82", - "build/prefab/windows-server/debug/dist/ballisticacore_headless.exe": "https://files.ballistica.net/cache/ba1/71/fd/90b17177aee6354de45cc205f65c", - "build/prefab/windows-server/release/dist/ballisticacore_headless.exe": "https://files.ballistica.net/cache/ba1/c2/ac/d87356932ec11dc4bac0d988145e", - "build/prefab/windows/debug/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/ce/7b/6ec6f8b2da73e1b2b64b64192712", - "build/prefab/windows/release/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/78/78/3639288018f221c9e978f391abd8" + "build/prefab/linux-server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/63/2c/d64f68f0e4ecbb55f3731ad95530", + "build/prefab/linux-server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/86/cd/c8c9b3e4a265ac816c5d249e4638", + "build/prefab/linux/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/29/92/c312438bf1dbdb599bd020a5c220", + "build/prefab/linux/release/ballisticacore": "https://files.ballistica.net/cache/ba1/68/75/6686aa5b6e0f88e1a40d444fd013", + "build/prefab/mac-server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/c1/bc/23b3f5d0929adf8c497accad24bb", + "build/prefab/mac-server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/81/07/d95b4d6354acf4003f70307ba7cb", + "build/prefab/mac/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/2c/bd/18dff8eda46be2d2edeee0a7ece9", + "build/prefab/mac/release/ballisticacore": "https://files.ballistica.net/cache/ba1/8d/64/a0beab66455ed6be694583fb6d53", + "build/prefab/windows-server/debug/dist/ballisticacore_headless.exe": "https://files.ballistica.net/cache/ba1/a2/ba/1e71e85b38eed56a55f8e0d85821", + "build/prefab/windows-server/release/dist/ballisticacore_headless.exe": "https://files.ballistica.net/cache/ba1/dd/38/d98994fed8732ab774e879b0c8a5", + "build/prefab/windows/debug/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/2c/e0/97ebbdf740a3bfbc5324f510204e", + "build/prefab/windows/release/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/4e/69/2af7295ec87bcf480e57f41e19a7" } \ No newline at end of file diff --git a/.idea/dictionaries/ericf.xml b/.idea/dictionaries/ericf.xml index 58339e57..f8e28694 100644 --- a/.idea/dictionaries/ericf.xml +++ b/.idea/dictionaries/ericf.xml @@ -856,6 +856,9 @@ hmmm hmmmm hoffs + holdingflag + holdingteam + holdingteams holdposition homebook homebrew @@ -1427,6 +1430,7 @@ premultiply preprocessing prereqs + prevstate priceraw printcolors printnodes diff --git a/assets/src/ba_data/python/bastd/game/capturetheflag.py b/assets/src/ba_data/python/bastd/game/capturetheflag.py index dd293beb..79528594 100644 --- a/assets/src/ba_data/python/bastd/game/capturetheflag.py +++ b/assets/src/ba_data/python/bastd/game/capturetheflag.py @@ -170,7 +170,7 @@ class CaptureTheFlagGame(ba.TeamGameActivity[Player, Team]): self.flag_touch_return_time = float(settings['Flag Touch Return Time']) self.flag_idle_return_time = float(settings['Flag Idle Return Time']) - # Base class overrides + # Base class overrides. self.slow_motion = self._epic_mode self.default_music = (ba.MusicType.EPIC if self._epic_mode else ba.MusicType.FLAG_CATCHER) diff --git a/assets/src/ba_data/python/bastd/game/keepaway.py b/assets/src/ba_data/python/bastd/game/keepaway.py index fae6bada..0dda4482 100644 --- a/assets/src/ba_data/python/bastd/game/keepaway.py +++ b/assets/src/ba_data/python/bastd/game/keepaway.py @@ -53,6 +53,10 @@ class Player(ba.Player['Team']): class Team(ba.Team[Player]): """Our team type for this game.""" + def __init__(self, timeremaining: int) -> None: + self.timeremaining = timeremaining + self.holdingflag = False + # ba_meta export game class KeepAwayGame(ba.TeamGameActivity[Player, Team]): @@ -79,6 +83,7 @@ class KeepAwayGame(ba.TeamGameActivity[Player, Team]): }), ] score_info = ba.ScoreInfo(label='Time Held') + default_music = ba.MusicType.KEEP_AWAY @classmethod def supports_session_type(cls, sessiontype: Type[ba.Session]) -> bool: @@ -113,26 +118,24 @@ class KeepAwayGame(ba.TeamGameActivity[Player, Team]): self._flag_light: Optional[ba.Node] = None self._scoring_team: Optional[Team] = None self._flag: Optional[Flag] = None + self._hold_time = int(settings['Hold Time']) + self._time_limit = float(settings['Time Limit']) def get_instance_description(self) -> Union[str, Sequence]: - return ('Carry the flag for ${ARG1} seconds.', - self.settings_raw['Hold Time']) + return 'Carry the flag for ${ARG1} seconds.', self._hold_time def get_instance_description_short(self) -> Union[str, Sequence]: - return ('carry the flag for ${ARG1} seconds', - self.settings_raw['Hold Time']) + return 'carry the flag for ${ARG1} seconds', self._hold_time - def on_transition_in(self) -> None: - self.default_music = ba.MusicType.KEEP_AWAY - super().on_transition_in() + def create_team(self, sessionteam: ba.SessionTeam) -> Team: + return Team(timeremaining=self._hold_time) def on_team_join(self, team: Team) -> None: - team.gamedata['time_remaining'] = self.settings_raw['Hold Time'] self._update_scoreboard() def on_begin(self) -> None: super().on_begin() - self.setup_standard_time_limit(self.settings_raw['Time Limit']) + self.setup_standard_time_limit(self._time_limit) self.setup_standard_powerup_drops() self._flag_spawn_pos = self.map.get_flag_position(None) self._spawn_flag() @@ -152,82 +155,74 @@ class KeepAwayGame(ba.TeamGameActivity[Player, Team]): screenmessage=False, display=False) - scoring_team = self._scoring_team + scoreteam = self._scoring_team - if scoring_team is not None: + if scoreteam is not None: - if scoring_team.gamedata['time_remaining'] > 0: + if scoreteam.timeremaining > 0: ba.playsound(self._tick_sound) - scoring_team.gamedata['time_remaining'] = max( - 0, scoring_team.gamedata['time_remaining'] - 1) + scoreteam.timeremaining = max(0, scoreteam.timeremaining - 1) self._update_scoreboard() - if scoring_team.gamedata['time_remaining'] > 0: + if scoreteam.timeremaining > 0: assert self._flag is not None - self._flag.set_score_text( - str(scoring_team.gamedata['time_remaining'])) + self._flag.set_score_text(str(scoreteam.timeremaining)) # Announce numbers we have sounds for. - try: - ba.playsound(self._countdownsounds[ - scoring_team.gamedata['time_remaining']]) - except Exception: - pass + if scoreteam.timeremaining in self._countdownsounds: + ba.playsound(self._countdownsounds[scoreteam.timeremaining]) # Winner. - if scoring_team.gamedata['time_remaining'] <= 0: + if scoreteam.timeremaining <= 0: self.end_game() def end_game(self) -> None: results = ba.TeamGameResults() for team in self.teams: - results.set_team_score( - team, self.settings_raw['Hold Time'] - - team.gamedata['time_remaining']) + results.set_team_score(team, self._hold_time - team.timeremaining) self.end(results=results, announce_delay=0) def _update_flag_state(self) -> None: for team in self.teams: - team.gamedata['holding_flag'] = False + team.holdingflag = False self._holding_players = [] for player in self.players: - holding_flag = False + holdingflag = False try: assert isinstance(player.actor, (PlayerSpaz, type(None))) if (player.actor and player.actor.node and player.actor.node.hold_node): - holding_flag = ( + holdingflag = ( player.actor.node.hold_node.getnodetype() == 'flag') except Exception: ba.print_exception('exception checking hold flag') - if holding_flag: + if holdingflag: self._holding_players.append(player) - player.team.gamedata['holding_flag'] = True + player.team.holdingflag = True - holding_teams = set(t for t in self.teams - if t.gamedata['holding_flag']) - prev_state = self._flag_state + holdingteams = set(t for t in self.teams if t.holdingflag) + prevstate = self._flag_state assert self._flag is not None assert self._flag_light assert self._flag.node - if len(holding_teams) > 1: + if len(holdingteams) > 1: self._flag_state = FlagState.CONTESTED self._scoring_team = None self._flag_light.color = (0.6, 0.6, 0.1) self._flag.node.color = (1.0, 1.0, 0.4) - elif len(holding_teams) == 1: - holding_team = list(holding_teams)[0] + elif len(holdingteams) == 1: + holdingteam = list(holdingteams)[0] self._flag_state = FlagState.HELD - self._scoring_team = holding_team - self._flag_light.color = ba.normalized_color(holding_team.color) - self._flag.node.color = holding_team.color + self._scoring_team = holdingteam + self._flag_light.color = ba.normalized_color(holdingteam.color) + self._flag.node.color = holdingteam.color else: self._flag_state = FlagState.UNCONTESTED self._scoring_team = None self._flag_light.color = (0.2, 0.2, 0.2) self._flag.node.color = (1, 1, 1) - if self._flag_state != prev_state: + if self._flag_state != prevstate: ba.playsound(self._swipsound) def _spawn_flag(self) -> None: @@ -261,8 +256,8 @@ class KeepAwayGame(ba.TeamGameActivity[Player, Team]): def _update_scoreboard(self) -> None: for team in self.teams: self._scoreboard.set_team_value(team, - team.gamedata['time_remaining'], - self.settings_raw['Hold Time'], + team.timeremaining, + self._hold_time, countdown=True) def handlemessage(self, msg: Any) -> Any: