Modernized keepaway code

This commit is contained in:
Eric Froemling 2020-06-01 22:08:59 -07:00
parent e0c827cd0e
commit ae0c9dde20
4 changed files with 55 additions and 56 deletions

View File

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

View File

@ -856,6 +856,9 @@
<w>hmmm</w>
<w>hmmmm</w>
<w>hoffs</w>
<w>holdingflag</w>
<w>holdingteam</w>
<w>holdingteams</w>
<w>holdposition</w>
<w>homebook</w>
<w>homebrew</w>
@ -1427,6 +1430,7 @@
<w>premultiply</w>
<w>preprocessing</w>
<w>prereqs</w>
<w>prevstate</w>
<w>priceraw</w>
<w>printcolors</w>
<w>printnodes</w>

View File

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

View File

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