Modernized CTF a bit

This commit is contained in:
Eric Froemling 2020-05-18 15:44:52 -07:00
parent e76df7af23
commit 6d0b257934
4 changed files with 36 additions and 27 deletions

View File

@ -994,7 +994,7 @@ class GameActivity(Activity[PlayerType, TeamType]):
def spawn_player_spaz(self,
player: PlayerType,
position: Sequence[float] = (0, 0, 0),
angle: float = None) -> PlayerSpaz:
angle: float = None) -> PlayerSpaz[PlayerType]:
"""Create and wire up a ba.PlayerSpaz for the provided ba.Player."""
# pylint: disable=too-many-locals
# pylint: disable=cyclic-import

View File

@ -110,7 +110,7 @@ class TeamGameActivity(GameActivity[PlayerType, TeamType]):
def spawn_player_spaz(self,
player: PlayerType,
position: Sequence[float] = None,
angle: float = None) -> PlayerSpaz:
angle: float = None) -> PlayerSpaz[PlayerType]:
"""
Method override; spawns and wires up a standard ba.PlayerSpaz for
a ba.Player.
@ -128,6 +128,7 @@ class TeamGameActivity(GameActivity[PlayerType, TeamType]):
return super().spawn_player_spaz(player, position, angle)
# FIXME: need to unify these arguments with GameActivity.end()
def end( # type: ignore
self,
results: Any = None,

View File

@ -38,7 +38,9 @@ if TYPE_CHECKING:
class CTFFlag(stdflag.Flag):
"""Special flag type for ctf games."""
"""Special flag type for CTF games."""
activity: CaptureTheFlagGame
def __init__(self, team: Team):
assert team.flagmaterial is not None
@ -63,8 +65,7 @@ class CTFFlag(stdflag.Flag):
"""Clear flag related times in the activity."""
self.time_out_respawn_time = int(
self.activity.settings_raw['Flag Idle Return Time'])
self.touch_return_time = float(
self.activity.settings_raw['Flag Touch Return Time'])
self.touch_return_time = float(self.activity.flag_touch_return_time)
@property
def team(self) -> Team:
@ -163,8 +164,6 @@ class CaptureTheFlagGame(ba.TeamGameActivity[Player, Team]):
def __init__(self, settings: Dict[str, Any]):
super().__init__(settings)
self._scoreboard = Scoreboard()
if self.settings_raw['Epic Mode']:
self.slow_motion = True
self._alarmsound = ba.getsound('alarm')
self._ticking_sound = ba.getsound('ticking')
self._last_score_time = 0
@ -172,26 +171,36 @@ class CaptureTheFlagGame(ba.TeamGameActivity[Player, Team]):
self._swipsound = ba.getsound('swip')
self._all_bases_material = ba.Material()
self._last_home_flag_notice_print_time = 0.0
self._score_to_win = int(settings['Score to Win'])
self._flag_touch_return_time = float(
settings['Flag Touch Return Time'])
self._epic_mode = bool(settings['Epic Mode'])
self._time_limit = float(settings['Time Limit'])
# Base class overrides
self.slow_motion = self._epic_mode
self.default_music = (ba.MusicType.EPIC if self._epic_mode else
ba.MusicType.FLAG_CATCHER)
@property
def flag_touch_return_time(self) -> float:
"""How long a flag must be touched for to return it to base."""
return self._flag_touch_return_time
def get_instance_description(self) -> Union[str, Sequence]:
if self.settings_raw['Score to Win'] == 1:
if self._score_to_win == 1:
return 'Steal the enemy flag.'
return ('Steal the enemy flag ${ARG1} times.',
self.settings_raw['Score to Win'])
return 'Steal the enemy flag ${ARG1} times.', self._score_to_win
def get_instance_scoreboard_description(self) -> Union[str, Sequence]:
if self.settings_raw['Score to Win'] == 1:
if self._score_to_win == 1:
return 'return 1 flag'
return 'return ${ARG1} flags', self.settings_raw['Score to Win']
def on_transition_in(self) -> None:
self.default_music = (ba.MusicType.EPIC
if self.settings_raw['Epic Mode'] else
ba.MusicType.FLAG_CATCHER)
super().on_transition_in()
return 'return ${ARG1} flags', self._score_to_win
def create_team(self, sessionteam: ba.SessionTeam) -> Team:
# Create our team instance and its initial values.
base_pos = self.map.get_flag_position(sessionteam.id)
self.project_flag_stand(base_pos)
@ -264,7 +273,7 @@ class CaptureTheFlagGame(ba.TeamGameActivity[Player, Team]):
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()
ba.timer(1.0, call=self._tick, repeat=True)
@ -377,7 +386,7 @@ class CaptureTheFlagGame(ba.TeamGameActivity[Player, Team]):
assert reset_team.flag is not None
reset_team.flag.handlemessage(ba.DieMessage())
reset_team.enemy_flag_at_base = False
if team.score >= self.settings_raw['Score to Win']:
if team.score >= self._score_to_win:
self.end_game()
def end_game(self) -> None:
@ -434,8 +443,7 @@ class CaptureTheFlagGame(ba.TeamGameActivity[Player, Team]):
def _award_players_touching_own_flag(self, team: Team) -> None:
for player in team.players:
if player.touching_own_flag > 0:
return_score = 10 + 5 * int(
self.settings_raw['Flag Touch Return Time'])
return_score = 10 + 5 * int(self._flag_touch_return_time)
self.stats.player_scored(player,
return_score,
screenmessage=False)
@ -463,7 +471,7 @@ class CaptureTheFlagGame(ba.TeamGameActivity[Player, Team]):
# If return-time is zero, just kill it immediately.. otherwise keep
# track of touches and count down.
if float(self.settings_raw['Flag Touch Return Time']) <= 0.0:
if float(self._flag_touch_return_time) <= 0.0:
assert team.flag is not None
if not team.home_flag_at_base and team.flag.held_count == 0:
@ -508,7 +516,7 @@ class CaptureTheFlagGame(ba.TeamGameActivity[Player, Team]):
def spawn_player_spaz(self,
player: Player,
position: Sequence[float] = None,
angle: float = None) -> PlayerSpaz:
angle: float = None) -> PlayerSpaz[Player]:
"""Intercept new spazzes and add our team material for them."""
spaz = super().spawn_player_spaz(player, position, angle)
player = spaz.player
@ -540,7 +548,7 @@ class CaptureTheFlagGame(ba.TeamGameActivity[Player, Team]):
def _update_scoreboard(self) -> None:
for team in self.teams:
self._scoreboard.set_team_value(team, team.score,
self.settings_raw['Score to Win'])
self._score_to_win)
def handlemessage(self, msg: Any) -> Any:
if isinstance(msg, PlayerSpazDeathMessage):

View File

@ -2426,7 +2426,7 @@ and short description of the game.</p>
</dd>
<dt><h4><a name="method_ba_GameActivity__spawn_player_spaz">spawn_player_spaz()</a></dt></h4><dd>
<p><span>spawn_player_spaz(self, player: PlayerType, position: Sequence[float] = (0, 0, 0), angle: float = None) -&gt; PlayerSpaz</span></p>
<p><span>spawn_player_spaz(self, player: PlayerType, position: Sequence[float] = (0, 0, 0), angle: float = None) -&gt; PlayerSpaz[PlayerType]</span></p>
<p>Create and wire up a ba.PlayerSpaz for the provided <a href="#class_ba_Player">ba.Player</a>.</p>
@ -4840,7 +4840,7 @@ up until <a href="#method_ba_Activity__on_begin">ba.Activity.on_begin</a>() is c
</dd>
<dt><h4><a name="method_ba_TeamGameActivity__spawn_player_spaz">spawn_player_spaz()</a></dt></h4><dd>
<p><span>spawn_player_spaz(self, player: PlayerType, position: Sequence[float] = None, angle: float = None) -&gt; PlayerSpaz</span></p>
<p><span>spawn_player_spaz(self, player: PlayerType, position: Sequence[float] = None, angle: float = None) -&gt; PlayerSpaz[PlayerType]</span></p>
<p>Method override; spawns and wires up a standard ba.PlayerSpaz for
a <a href="#class_ba_Player">ba.Player</a>.</p>