mirror of
https://github.com/RYDE-WORK/ballistica.git
synced 2026-01-26 00:47:10 +08:00
Modernized keepaway code
This commit is contained in:
parent
e0c827cd0e
commit
ae0c9dde20
@ -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"
|
||||
}
|
||||
4
.idea/dictionaries/ericf.xml
generated
4
.idea/dictionaries/ericf.xml
generated
@ -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>
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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:
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user