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: