mirror of
https://github.com/RYDE-WORK/ballistica.git
synced 2026-01-31 03:39:04 +08:00
Modernized onslaught code and other cleanup
This commit is contained in:
parent
e6755d9be8
commit
72be5c0b8d
@ -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/b1/22/e87fa53bad26b90154a8ac2383b5",
|
||||
"build/prefab/linux-server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/75/8f/4eabb293c30168da4ef63047c8de",
|
||||
"build/prefab/linux/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/7d/cf/0260a6399173881606846ea7080b",
|
||||
"build/prefab/linux/release/ballisticacore": "https://files.ballistica.net/cache/ba1/04/29/28d7d0ef9ac8fc9816bf002afaa8",
|
||||
"build/prefab/mac-server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/56/3b/09554ebdb31e64d3ddc145bc1eb8",
|
||||
"build/prefab/mac-server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/6f/2b/d0629250709393bc39dd30f54043",
|
||||
"build/prefab/mac/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/cc/30/f7120527ef4a402a656f38af1e65",
|
||||
"build/prefab/mac/release/ballisticacore": "https://files.ballistica.net/cache/ba1/fa/66/963c96391fcb5dae4da0999d04dc",
|
||||
"build/prefab/windows-server/debug/dist/ballisticacore_headless.exe": "https://files.ballistica.net/cache/ba1/84/fd/db055e722538fba088572f9c7423",
|
||||
"build/prefab/windows-server/release/dist/ballisticacore_headless.exe": "https://files.ballistica.net/cache/ba1/7b/f0/82920a407e5627da5b32bd3d7364",
|
||||
"build/prefab/windows/debug/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/d0/0c/a8bb182f1762d13521da694d0a3c",
|
||||
"build/prefab/windows/release/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/6d/57/baa2f3d7ba2345d94535ff2f04cb"
|
||||
"build/prefab/linux-server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/5a/42/5238d5de1cf94a07a513ea2b3e1b",
|
||||
"build/prefab/linux-server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/39/48/2f0e4350a080373301de625e2cc4",
|
||||
"build/prefab/linux/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/c0/1d/dbc0a5e2ca05b626cbeffd6def6c",
|
||||
"build/prefab/linux/release/ballisticacore": "https://files.ballistica.net/cache/ba1/ec/a8/5c58d6b5e1d844640334c35ad3af",
|
||||
"build/prefab/mac-server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/3d/0a/76b615f9bcb9bf4f0ca745060d40",
|
||||
"build/prefab/mac-server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/01/6b/0f623ac481e3553e352c1cd3cb7e",
|
||||
"build/prefab/mac/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/c4/a5/3cad1ced77551369dc56c6bca5fb",
|
||||
"build/prefab/mac/release/ballisticacore": "https://files.ballistica.net/cache/ba1/3b/3f/55094817619cae66f941a9f6db8c",
|
||||
"build/prefab/windows-server/debug/dist/ballisticacore_headless.exe": "https://files.ballistica.net/cache/ba1/ec/6b/7aa29831a746672f9984cbb1dbf1",
|
||||
"build/prefab/windows-server/release/dist/ballisticacore_headless.exe": "https://files.ballistica.net/cache/ba1/07/4c/00a6136d0bd5573946d10e294720",
|
||||
"build/prefab/windows/debug/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/8d/8d/af068e67244cbb28444b27ae66d7",
|
||||
"build/prefab/windows/release/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/f4/62/eb7cb26c952df481b757dcf53f9c"
|
||||
}
|
||||
@ -525,10 +525,7 @@ class Activity(DependencyComponent, Generic[PlayerType, TeamType]):
|
||||
(internal)
|
||||
"""
|
||||
|
||||
# Is this ever still happening?...
|
||||
if self._has_begun:
|
||||
print_error("_begin called twice; this shouldn't happen")
|
||||
return
|
||||
assert not self._has_begun
|
||||
|
||||
# Inherit stats from the session.
|
||||
self._stats = session.stats
|
||||
@ -791,6 +788,7 @@ class Activity(DependencyComponent, Generic[PlayerType, TeamType]):
|
||||
if player:
|
||||
try:
|
||||
sessionplayer = player.sessionplayer
|
||||
player.reset()
|
||||
sessionplayer.set_node(None)
|
||||
sessionplayer.set_activity(None)
|
||||
sessionplayer.gameplayer = None
|
||||
@ -818,7 +816,7 @@ class Activity(DependencyComponent, Generic[PlayerType, TeamType]):
|
||||
self._activity_data.destroy()
|
||||
except Exception:
|
||||
print_exception(
|
||||
'Exception during ba.Activity._expire() destroying data:')
|
||||
'Error during ba.Activity._expire() destroying data:')
|
||||
|
||||
def _prune_dead_actors(self) -> None:
|
||||
self._actor_refs = [a for a in self._actor_refs if a]
|
||||
|
||||
@ -1094,10 +1094,10 @@ class GameActivity(Activity[PlayerType, TeamType]):
|
||||
|
||||
def _standard_drop_powerup(self, index: int, expire: bool = True) -> None:
|
||||
# pylint: disable=cyclic-import
|
||||
from bastd.actor import powerupbox
|
||||
powerupbox.PowerupBox(
|
||||
from bastd.actor.powerupbox import PowerupBox, PowerupBoxFactory
|
||||
PowerupBox(
|
||||
position=self.map.powerup_spawn_points[index],
|
||||
poweruptype=powerupbox.get_factory().get_random_powerup_type(),
|
||||
poweruptype=PowerupBoxFactory.get().get_random_powerup_type(),
|
||||
expire=expire).autoretain()
|
||||
|
||||
def _standard_drop_powerups(self) -> None:
|
||||
|
||||
@ -99,6 +99,12 @@ class Player(Generic[TeamType]):
|
||||
self._nodeactor = NodeActor(node)
|
||||
sessionplayer.set_node(node)
|
||||
|
||||
def reset(self) -> None:
|
||||
"""(internal)"""
|
||||
self._nodeactor = None
|
||||
self.actor = None
|
||||
self.team = None # type: ignore
|
||||
|
||||
@property
|
||||
def sessionplayer(self) -> ba.SessionPlayer:
|
||||
"""Return the ba.SessionPlayer corresponding to this Player.
|
||||
|
||||
@ -139,7 +139,7 @@ class FlagPickedUpMessage:
|
||||
|
||||
|
||||
@dataclass
|
||||
class FlagDeathMessage:
|
||||
class FlagDiedMessage:
|
||||
"""A message saying a ba.Flag has died.
|
||||
|
||||
category: Message Classes
|
||||
@ -335,7 +335,7 @@ class Flag(ba.Actor):
|
||||
if self.node:
|
||||
self.node.delete()
|
||||
if not msg.immediate:
|
||||
self.activity.handlemessage(FlagDeathMessage(self))
|
||||
self.activity.handlemessage(FlagDiedMessage(self))
|
||||
elif isinstance(msg, ba.HitMessage):
|
||||
assert self.node
|
||||
assert msg.force_direction is not None
|
||||
|
||||
@ -90,18 +90,6 @@ class PlayerSpaz(Spaz):
|
||||
self._player = player
|
||||
self._drive_player_position()
|
||||
|
||||
# @property
|
||||
# def player(self, playertype: Type[PlayerType]) -> PlayerType:
|
||||
# """The ba.Player associated with this Spaz.
|
||||
|
||||
# If the player no longer exists, raises an ba.PlayerNotFoundError.
|
||||
# """
|
||||
# player = self._player
|
||||
# assert isinstance(player, playertype)
|
||||
# if not player:
|
||||
# raise ba.PlayerNotFoundError()
|
||||
# return player
|
||||
|
||||
@overload
|
||||
def getplayer(self,
|
||||
playertype: Type[PlayerType],
|
||||
|
||||
@ -182,21 +182,21 @@ class PowerupBoxFactory:
|
||||
self._lastpoweruptype = ptype
|
||||
return ptype
|
||||
|
||||
|
||||
def get_factory() -> PowerupBoxFactory:
|
||||
"""Return a shared ba.PowerupBoxFactory object, creating if necessary."""
|
||||
activity = ba.getactivity()
|
||||
if activity is None:
|
||||
raise RuntimeError('no current activity')
|
||||
try:
|
||||
# FIXME: et better way to store stuff with activity
|
||||
# pylint: disable=protected-access
|
||||
# noinspection PyProtectedMember
|
||||
return activity._shared_powerup_factory # type: ignore
|
||||
except Exception:
|
||||
factory = activity._shared_powerup_factory = ( # type: ignore
|
||||
PowerupBoxFactory())
|
||||
return factory
|
||||
@staticmethod
|
||||
def get() -> PowerupBoxFactory:
|
||||
"""Return a shared ba.PowerupBoxFactory object, creating if needed."""
|
||||
activity = ba.getactivity()
|
||||
if activity is None:
|
||||
raise RuntimeError('no current activity')
|
||||
try:
|
||||
# FIXME: et better way to store stuff with activity
|
||||
# pylint: disable=protected-access
|
||||
# noinspection PyProtectedMember
|
||||
return activity._shared_powerup_factory # type: ignore
|
||||
except Exception:
|
||||
factory = activity._shared_powerup_factory = ( # type: ignore
|
||||
PowerupBoxFactory())
|
||||
return factory
|
||||
|
||||
|
||||
class PowerupBox(ba.Actor):
|
||||
@ -229,7 +229,7 @@ class PowerupBox(ba.Actor):
|
||||
|
||||
super().__init__()
|
||||
|
||||
factory = get_factory()
|
||||
factory = PowerupBoxFactory.get()
|
||||
self.poweruptype = poweruptype
|
||||
self._powersgiven = False
|
||||
|
||||
@ -293,7 +293,7 @@ class PowerupBox(ba.Actor):
|
||||
self._handlemessage_sanity_check()
|
||||
|
||||
if isinstance(msg, ba.PowerupAcceptMessage):
|
||||
factory = get_factory()
|
||||
factory = PowerupBoxFactory.get()
|
||||
assert self.node
|
||||
if self.poweruptype == 'health':
|
||||
ba.playsound(factory.health_powerup_sound,
|
||||
|
||||
@ -28,7 +28,7 @@ from typing import TYPE_CHECKING
|
||||
|
||||
import ba
|
||||
from bastd.actor import bomb as stdbomb
|
||||
from bastd.actor import powerupbox
|
||||
from bastd.actor.powerupbox import PowerupBoxFactory
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from typing import (Any, Sequence, Optional, Dict, List, Union, Callable,
|
||||
@ -147,7 +147,7 @@ class Spaz(ba.Actor):
|
||||
extras_material = []
|
||||
|
||||
if can_accept_powerups:
|
||||
pam = powerupbox.get_factory().powerup_accept_material
|
||||
pam = PowerupBoxFactory.get().powerup_accept_material
|
||||
materials.append(pam)
|
||||
roller_materials.append(pam)
|
||||
extras_material.append(pam)
|
||||
@ -252,7 +252,7 @@ class Spaz(ba.Actor):
|
||||
self._score_text_hide_timer: Optional[ba.Timer] = None
|
||||
self._last_stand_pos: Optional[Sequence[float]] = None
|
||||
|
||||
# deprecated stuff.. need to make these into lists
|
||||
# Deprecated stuff.. should make these into lists.
|
||||
self.punch_callback: Optional[Callable[[Spaz], Any]] = None
|
||||
self.pick_up_powerup_callback: Optional[Callable[[Spaz], Any]] = None
|
||||
|
||||
@ -273,6 +273,7 @@ class Spaz(ba.Actor):
|
||||
Add a call to be run whenever this Spaz drops a bomb.
|
||||
The spaz and the newly-dropped bomb are passed as arguments.
|
||||
"""
|
||||
assert not self.expired
|
||||
self._dropped_bomb_callbacks.append(call)
|
||||
|
||||
def is_alive(self) -> bool:
|
||||
@ -725,7 +726,7 @@ class Spaz(ba.Actor):
|
||||
if self.pick_up_powerup_callback is not None:
|
||||
self.pick_up_powerup_callback(self)
|
||||
if msg.poweruptype == 'triple_bombs':
|
||||
tex = powerupbox.get_factory().tex_bomb
|
||||
tex = PowerupBoxFactory.get().tex_bomb
|
||||
self._flash_billboard(tex)
|
||||
self.set_bomb_count(3)
|
||||
if self.powerups_expire:
|
||||
@ -785,7 +786,7 @@ class Spaz(ba.Actor):
|
||||
timeformat=ba.TimeFormat.MILLISECONDS))
|
||||
elif msg.poweruptype == 'punch':
|
||||
self._has_boxing_gloves = True
|
||||
tex = powerupbox.get_factory().tex_punch
|
||||
tex = PowerupBoxFactory.get().tex_punch
|
||||
self._flash_billboard(tex)
|
||||
self.equip_boxing_gloves()
|
||||
if self.powerups_expire:
|
||||
@ -845,7 +846,7 @@ class Spaz(ba.Actor):
|
||||
if m != factory.curse_material))
|
||||
self.node.curse_death_time = 0
|
||||
self.hitpoints = self.hitpoints_max
|
||||
self._flash_billboard(powerupbox.get_factory().tex_health)
|
||||
self._flash_billboard(PowerupBoxFactory.get().tex_health)
|
||||
self.node.hurt = 0
|
||||
self._last_hit_time = None
|
||||
self._num_times_hit = 0
|
||||
@ -1292,7 +1293,7 @@ class Spaz(ba.Actor):
|
||||
if self.land_mine_count != 0:
|
||||
self.node.counter_text = 'x' + str(self.land_mine_count)
|
||||
self.node.counter_texture = (
|
||||
powerupbox.get_factory().tex_land_mines)
|
||||
PowerupBoxFactory.get().tex_land_mines)
|
||||
else:
|
||||
self.node.counter_text = ''
|
||||
|
||||
@ -1380,13 +1381,13 @@ class Spaz(ba.Actor):
|
||||
ba.playsound(sound, position=pos, volume=5.0)
|
||||
|
||||
def _get_bomb_type_tex(self) -> ba.Texture:
|
||||
bomb_factory = powerupbox.get_factory()
|
||||
factory = PowerupBoxFactory.get()
|
||||
if self.bomb_type == 'sticky':
|
||||
return bomb_factory.tex_sticky_bombs
|
||||
return factory.tex_sticky_bombs
|
||||
if self.bomb_type == 'ice':
|
||||
return bomb_factory.tex_ice_bombs
|
||||
return factory.tex_ice_bombs
|
||||
if self.bomb_type == 'impact':
|
||||
return bomb_factory.tex_impact_bombs
|
||||
return factory.tex_impact_bombs
|
||||
raise ValueError('invalid bomb type')
|
||||
|
||||
def _flash_billboard(self, tex: ba.Texture) -> None:
|
||||
@ -1411,7 +1412,7 @@ class Spaz(ba.Actor):
|
||||
def _gloves_wear_off_flash(self) -> None:
|
||||
if self.node:
|
||||
self.node.boxing_gloves_flashing = True
|
||||
self.node.billboard_texture = powerupbox.get_factory().tex_punch
|
||||
self.node.billboard_texture = PowerupBoxFactory.get().tex_punch
|
||||
self.node.billboard_opacity = 1.0
|
||||
self.node.billboard_cross_out = True
|
||||
|
||||
@ -1425,21 +1426,21 @@ class Spaz(ba.Actor):
|
||||
self._punch_cooldown = factory.punch_cooldown
|
||||
self._has_boxing_gloves = False
|
||||
if self.node:
|
||||
ba.playsound(powerupbox.get_factory().powerdown_sound,
|
||||
ba.playsound(PowerupBoxFactory.get().powerdown_sound,
|
||||
position=self.node.position)
|
||||
self.node.boxing_gloves = False
|
||||
self.node.billboard_opacity = 0.0
|
||||
|
||||
def _multi_bomb_wear_off_flash(self) -> None:
|
||||
if self.node:
|
||||
self.node.billboard_texture = powerupbox.get_factory().tex_bomb
|
||||
self.node.billboard_texture = PowerupBoxFactory.get().tex_bomb
|
||||
self.node.billboard_opacity = 1.0
|
||||
self.node.billboard_cross_out = True
|
||||
|
||||
def _multi_bomb_wear_off(self) -> None:
|
||||
self.set_bomb_count(self.default_bomb_count)
|
||||
if self.node:
|
||||
ba.playsound(powerupbox.get_factory().powerdown_sound,
|
||||
ba.playsound(PowerupBoxFactory.get().powerdown_sound,
|
||||
position=self.node.position)
|
||||
self.node.billboard_opacity = 0.0
|
||||
|
||||
@ -1452,6 +1453,6 @@ class Spaz(ba.Actor):
|
||||
def _bomb_wear_off(self) -> None:
|
||||
self.bomb_type = self.bomb_type_default
|
||||
if self.node:
|
||||
ba.playsound(powerupbox.get_factory().powerdown_sound,
|
||||
ba.playsound(PowerupBoxFactory.get().powerdown_sound,
|
||||
position=self.node.position)
|
||||
self.node.billboard_opacity = 0.0
|
||||
|
||||
@ -547,7 +547,7 @@ class CaptureTheFlagGame(ba.TeamGameActivity[Player, Team]):
|
||||
# Augment standard behavior.
|
||||
super().handlemessage(msg)
|
||||
self.respawn_player(msg.getplayer(Player))
|
||||
elif isinstance(msg, stdflag.FlagDeathMessage):
|
||||
elif isinstance(msg, stdflag.FlagDiedMessage):
|
||||
assert isinstance(msg.flag, CTFFlag)
|
||||
ba.timer(0.1, ba.Call(self._spawn_flag_for_team, msg.flag.team))
|
||||
elif isinstance(msg, stdflag.FlagPickedUpMessage):
|
||||
|
||||
@ -36,6 +36,7 @@ from bastd.actor.bomb import TNTSpawner
|
||||
from bastd.actor.playerspaz import PlayerSpaz
|
||||
from bastd.actor.scoreboard import Scoreboard
|
||||
from bastd.actor.respawnicon import RespawnIcon
|
||||
from bastd.actor.powerupbox import PowerupBoxFactory, PowerupBox
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from typing import Any, List, Type, Dict, Sequence, Optional, Union
|
||||
@ -105,6 +106,7 @@ class FootballTeamGame(ba.TeamGameActivity[Player, Team]):
|
||||
'default': 1.0
|
||||
}),
|
||||
]
|
||||
default_music = ba.MusicType.FOOTBALL
|
||||
|
||||
@classmethod
|
||||
def supports_session_type(cls, sessiontype: Type[ba.Session]) -> bool:
|
||||
@ -125,13 +127,15 @@ class FootballTeamGame(ba.TeamGameActivity[Player, Team]):
|
||||
self._score_sound = ba.getsound('score')
|
||||
self._swipsound = ba.getsound('swip')
|
||||
self._whistle_sound = ba.getsound('refWhistle')
|
||||
self.score_region_material = ba.Material()
|
||||
self.score_region_material.add_actions(
|
||||
self._score_region_material = ba.Material()
|
||||
self._score_region_material.add_actions(
|
||||
conditions=('they_have_material',
|
||||
stdflag.get_factory().flagmaterial),
|
||||
actions=(('modify_part_collision', 'collide',
|
||||
True), ('modify_part_collision', 'physical', False),
|
||||
('call', 'at_connect', self._handle_score)))
|
||||
actions=(
|
||||
('modify_part_collision', 'collide', True),
|
||||
('modify_part_collision', 'physical', False),
|
||||
('call', 'at_connect', self._handle_score),
|
||||
))
|
||||
self._flag_spawn_pos: Optional[Sequence[float]] = None
|
||||
self._score_regions: List[ba.NodeActor] = []
|
||||
self._flag: Optional[FootballFlag] = None
|
||||
@ -158,10 +162,6 @@ class FootballTeamGame(ba.TeamGameActivity[Player, Team]):
|
||||
return 'score ${ARG1} touchdowns', touchdowns
|
||||
return 'score a touchdown'
|
||||
|
||||
def on_transition_in(self) -> None:
|
||||
self.default_music = ba.MusicType.FOOTBALL
|
||||
super().on_transition_in()
|
||||
|
||||
def on_begin(self) -> None:
|
||||
super().on_begin()
|
||||
self.setup_standard_time_limit(self._time_limit)
|
||||
@ -176,7 +176,7 @@ class FootballTeamGame(ba.TeamGameActivity[Player, Team]):
|
||||
'position': defs.boxes['goal1'][0:3],
|
||||
'scale': defs.boxes['goal1'][6:9],
|
||||
'type': 'box',
|
||||
'materials': (self.score_region_material, )
|
||||
'materials': (self._score_region_material, )
|
||||
})))
|
||||
self._score_regions.append(
|
||||
ba.NodeActor(
|
||||
@ -185,7 +185,7 @@ class FootballTeamGame(ba.TeamGameActivity[Player, Team]):
|
||||
'position': defs.boxes['goal2'][0:3],
|
||||
'scale': defs.boxes['goal2'][6:9],
|
||||
'type': 'box',
|
||||
'materials': (self.score_region_material, )
|
||||
'materials': (self._score_region_material, )
|
||||
})))
|
||||
self._update_scoreboard()
|
||||
ba.playsound(self._chant_sound)
|
||||
@ -282,7 +282,7 @@ class FootballTeamGame(ba.TeamGameActivity[Player, Team]):
|
||||
self.respawn_player(msg.getplayer(Player))
|
||||
|
||||
# Respawn dead flags.
|
||||
elif isinstance(msg, stdflag.FlagDeathMessage):
|
||||
elif isinstance(msg, stdflag.FlagDiedMessage):
|
||||
if not self.has_ended():
|
||||
self._flag_respawn_timer = ba.Timer(3.0, self._spawn_flag)
|
||||
self._flag_respawn_light = ba.NodeActor(
|
||||
@ -333,6 +333,7 @@ class FootballCoopGame(ba.CoopGameActivity[Player, Team]):
|
||||
name = 'Football'
|
||||
tips = ['Use the pick-up button to grab the flag < ${PICKUP} >']
|
||||
score_info = ba.ScoreInfo(scoretype=ba.ScoreType.MILLISECONDS, version='B')
|
||||
default_music = ba.MusicType.FOOTBALL
|
||||
|
||||
# FIXME: Need to update co-op games to use get_score_info.
|
||||
def get_score_type(self) -> str:
|
||||
@ -369,16 +370,18 @@ class FootballCoopGame(ba.CoopGameActivity[Player, Team]):
|
||||
self._score_region_material.add_actions(
|
||||
conditions=('they_have_material',
|
||||
stdflag.get_factory().flagmaterial),
|
||||
actions=(('modify_part_collision', 'collide',
|
||||
True), ('modify_part_collision', 'physical', False),
|
||||
('call', 'at_connect', self._handle_score)))
|
||||
actions=(
|
||||
('modify_part_collision', 'collide', True),
|
||||
('modify_part_collision', 'physical', False),
|
||||
('call', 'at_connect', self._handle_score),
|
||||
))
|
||||
self._powerup_center = (0, 2, 0)
|
||||
self._powerup_spread = (10, 5.5)
|
||||
self._player_has_dropped_bomb = False
|
||||
self._player_has_punched = False
|
||||
self._scoreboard: Optional[Scoreboard] = None
|
||||
self._flag_spawn_pos: Optional[Sequence[float]] = None
|
||||
self.score_regions: List[ba.NodeActor] = []
|
||||
self._score_regions: List[ba.NodeActor] = []
|
||||
self._exclude_powerups: List[str] = []
|
||||
self._have_tnt = False
|
||||
self._bot_types_initial: Optional[List[Type[spazbot.SpazBot]]] = None
|
||||
@ -392,14 +395,13 @@ class FootballCoopGame(ba.CoopGameActivity[Player, Team]):
|
||||
self._bots = spazbot.BotSet()
|
||||
self._bot_spawn_timer: Optional[ba.Timer] = None
|
||||
self._powerup_drop_timer: Optional[ba.Timer] = None
|
||||
self.scoring_team: Optional[Team] = None
|
||||
self._scoring_team: Optional[Team] = None
|
||||
self._final_time_ms: Optional[int] = None
|
||||
self._time_text_timer: Optional[ba.Timer] = None
|
||||
self._flag_respawn_light: Optional[ba.Actor] = None
|
||||
self._flag: Optional[FootballFlag] = None
|
||||
|
||||
def on_transition_in(self) -> None:
|
||||
self.default_music = ba.MusicType.FOOTBALL
|
||||
super().on_transition_in()
|
||||
self._scoreboard = Scoreboard()
|
||||
self._flag_spawn_pos = self.map.get_flag_position(None)
|
||||
@ -407,7 +409,7 @@ class FootballCoopGame(ba.CoopGameActivity[Player, Team]):
|
||||
|
||||
# Set up the two score regions.
|
||||
defs = self.map.defs
|
||||
self.score_regions.append(
|
||||
self._score_regions.append(
|
||||
ba.NodeActor(
|
||||
ba.newnode('region',
|
||||
attrs={
|
||||
@ -416,7 +418,7 @@ class FootballCoopGame(ba.CoopGameActivity[Player, Team]):
|
||||
'type': 'box',
|
||||
'materials': [self._score_region_material]
|
||||
})))
|
||||
self.score_regions.append(
|
||||
self._score_regions.append(
|
||||
ba.NodeActor(
|
||||
ba.newnode('region',
|
||||
attrs={
|
||||
@ -608,12 +610,11 @@ class FootballCoopGame(ba.CoopGameActivity[Player, Team]):
|
||||
closest_bot.target_flag = self._flag
|
||||
|
||||
def _drop_powerup(self, index: int, poweruptype: str = None) -> None:
|
||||
from bastd.actor import powerupbox
|
||||
if poweruptype is None:
|
||||
poweruptype = (powerupbox.get_factory().get_random_powerup_type(
|
||||
poweruptype = (PowerupBoxFactory.get().get_random_powerup_type(
|
||||
excludetypes=self._exclude_powerups))
|
||||
powerupbox.PowerupBox(position=self.map.powerup_spawn_points[index],
|
||||
poweruptype=poweruptype).autoretain()
|
||||
PowerupBox(position=self.map.powerup_spawn_points[index],
|
||||
poweruptype=poweruptype).autoretain()
|
||||
|
||||
def _start_powerup_drops(self) -> None:
|
||||
self._powerup_drop_timer = ba.Timer(3.0,
|
||||
@ -624,7 +625,6 @@ class FootballCoopGame(ba.CoopGameActivity[Player, Team]):
|
||||
standard_points: bool = False,
|
||||
poweruptype: str = None) -> None:
|
||||
"""Generic powerup drop."""
|
||||
from bastd.actor import powerupbox
|
||||
if standard_points:
|
||||
spawnpoints = self.map.powerup_spawn_points
|
||||
for i, _point in enumerate(spawnpoints):
|
||||
@ -638,9 +638,9 @@ class FootballCoopGame(ba.CoopGameActivity[Player, Team]):
|
||||
-self._powerup_spread[1], self._powerup_spread[1]))
|
||||
|
||||
# Drop one random one somewhere.
|
||||
powerupbox.PowerupBox(
|
||||
PowerupBox(
|
||||
position=point,
|
||||
poweruptype=powerupbox.get_factory().get_random_powerup_type(
|
||||
poweruptype=PowerupBoxFactory.get().get_random_powerup_type(
|
||||
excludetypes=self._exclude_powerups)).autoretain()
|
||||
|
||||
def _kill_flag(self) -> None:
|
||||
@ -664,8 +664,8 @@ class FootballCoopGame(ba.CoopGameActivity[Player, Team]):
|
||||
# See which score region it was.
|
||||
region = ba.get_collision_info('source_node')
|
||||
i = None
|
||||
for i in range(len(self.score_regions)):
|
||||
if region == self.score_regions[i].node:
|
||||
for i in range(len(self._score_regions)):
|
||||
if region == self._score_regions[i].node:
|
||||
break
|
||||
|
||||
for team in [self.teams[0], self._bot_team]:
|
||||
@ -740,7 +740,7 @@ class FootballCoopGame(ba.CoopGameActivity[Player, Team]):
|
||||
self._scoreboard.set_team_value(team, team.score, win_score)
|
||||
if team.score >= win_score:
|
||||
if not have_scoring_team:
|
||||
self.scoring_team = team
|
||||
self._scoring_team = team
|
||||
if team is self._bot_team:
|
||||
self.continue_or_end_game()
|
||||
else:
|
||||
@ -835,7 +835,7 @@ class FootballCoopGame(ba.CoopGameActivity[Player, Team]):
|
||||
self._award_achievement('Super Mega Punch')
|
||||
|
||||
# Respawn dead flags.
|
||||
elif isinstance(msg, stdflag.FlagDeathMessage):
|
||||
elif isinstance(msg, stdflag.FlagDiedMessage):
|
||||
assert isinstance(msg.flag, FootballFlag)
|
||||
msg.flag.respawn_timer = ba.Timer(3.0, self._spawn_flag)
|
||||
self._flag_respawn_light = ba.NodeActor(
|
||||
|
||||
@ -29,7 +29,7 @@ from typing import TYPE_CHECKING
|
||||
|
||||
import ba
|
||||
from bastd.actor.scoreboard import Scoreboard
|
||||
from bastd.actor import powerupbox
|
||||
from bastd.actor.powerupbox import PowerupBoxFactory
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from typing import Any, Sequence, Dict, Type, List, Optional, Union
|
||||
@ -137,6 +137,7 @@ class HockeyGame(ba.TeamGameActivity[Player, Team]):
|
||||
'default': 1.0
|
||||
}),
|
||||
]
|
||||
default_music = ba.MusicType.HOCKEY
|
||||
|
||||
@classmethod
|
||||
def supports_session_type(cls, sessiontype: Type[ba.Session]) -> bool:
|
||||
@ -182,7 +183,7 @@ class HockeyGame(ba.TeamGameActivity[Player, Team]):
|
||||
# We want the puck to kill powerups; not get stopped by them
|
||||
self.puck_material.add_actions(
|
||||
conditions=('they_have_material',
|
||||
powerupbox.get_factory().powerup_material),
|
||||
PowerupBoxFactory.get().powerup_material),
|
||||
actions=(('modify_part_collision', 'physical', False),
|
||||
('message', 'their_node', 'at_connect', ba.DieMessage())))
|
||||
self._score_region_material = ba.Material()
|
||||
@ -205,10 +206,6 @@ class HockeyGame(ba.TeamGameActivity[Player, Team]):
|
||||
return 'score a goal'
|
||||
return 'score ${ARG1} goals', self.settings_raw['Score to Win']
|
||||
|
||||
def on_transition_in(self) -> None:
|
||||
self.default_music = ba.MusicType.HOCKEY
|
||||
super().on_transition_in()
|
||||
|
||||
def on_begin(self) -> None:
|
||||
super().on_begin()
|
||||
|
||||
@ -328,7 +325,6 @@ class HockeyGame(ba.TeamGameActivity[Player, Team]):
|
||||
self.end(results=results)
|
||||
|
||||
def _update_scoreboard(self) -> None:
|
||||
""" update scoreboard and check for winners """
|
||||
winscore = self.settings_raw['Score to Win']
|
||||
for team in self.teams:
|
||||
self._scoreboard.set_team_value(team, team.gamedata['score'],
|
||||
|
||||
@ -31,7 +31,7 @@ from typing import TYPE_CHECKING
|
||||
import ba
|
||||
from bastd.actor.playerspaz import PlayerSpaz
|
||||
from bastd.actor.scoreboard import Scoreboard
|
||||
from bastd.actor.flag import (Flag, FlagDroppedMessage, FlagDeathMessage,
|
||||
from bastd.actor.flag import (Flag, FlagDroppedMessage, FlagDiedMessage,
|
||||
FlagPickedUpMessage)
|
||||
|
||||
if TYPE_CHECKING:
|
||||
@ -270,7 +270,7 @@ class KeepAwayGame(ba.TeamGameActivity[Player, Team]):
|
||||
# Augment standard behavior.
|
||||
super().handlemessage(msg)
|
||||
self.respawn_player(msg.getplayer(Player))
|
||||
elif isinstance(msg, FlagDeathMessage):
|
||||
elif isinstance(msg, FlagDiedMessage):
|
||||
self._spawn_flag()
|
||||
elif isinstance(msg, (FlagDroppedMessage, FlagPickedUpMessage)):
|
||||
self._update_flag_state()
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -33,6 +33,7 @@ from bastd.actor import spazbot
|
||||
from bastd.actor.bomb import TNTSpawner
|
||||
from bastd.actor.scoreboard import Scoreboard
|
||||
from bastd.actor.respawnicon import RespawnIcon
|
||||
from bastd.actor.powerupbox import PowerupBox, PowerupBoxFactory
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from typing import Type, Any, List, Dict, Tuple, Sequence, Optional
|
||||
@ -482,12 +483,11 @@ class RunaroundGame(ba.CoopGameActivity[Player, Team]):
|
||||
self._player_has_picked_up_powerup = True
|
||||
|
||||
def _drop_powerup(self, index: int, poweruptype: str = None) -> None:
|
||||
from bastd.actor import powerupbox
|
||||
if poweruptype is None:
|
||||
poweruptype = (powerupbox.get_factory().get_random_powerup_type(
|
||||
poweruptype = (PowerupBoxFactory.get().get_random_powerup_type(
|
||||
excludetypes=self._exclude_powerups))
|
||||
powerupbox.PowerupBox(position=self.map.powerup_spawn_points[index],
|
||||
poweruptype=poweruptype).autoretain()
|
||||
PowerupBox(position=self.map.powerup_spawn_points[index],
|
||||
poweruptype=poweruptype).autoretain()
|
||||
|
||||
def _start_powerup_drops(self) -> None:
|
||||
ba.timer(3.0, self._drop_powerups, repeat=True)
|
||||
@ -496,7 +496,6 @@ class RunaroundGame(ba.CoopGameActivity[Player, Team]):
|
||||
standard_points: bool = False,
|
||||
force_first: str = None) -> None:
|
||||
""" Generic powerup drop """
|
||||
from bastd.actor import powerupbox
|
||||
|
||||
# If its been a minute since our last wave finished emerging, stop
|
||||
# giving out land-mine powerups. (prevents players from waiting
|
||||
@ -522,9 +521,9 @@ class RunaroundGame(ba.CoopGameActivity[Player, Team]):
|
||||
|
||||
# drop one random one somewhere..
|
||||
assert self._exclude_powerups is not None
|
||||
powerupbox.PowerupBox(
|
||||
PowerupBox(
|
||||
position=pos,
|
||||
poweruptype=powerupbox.get_factory().get_random_powerup_type(
|
||||
poweruptype=PowerupBoxFactory.get().get_random_powerup_type(
|
||||
excludetypes=self._exclude_powerups +
|
||||
extra_excludes)).autoretain()
|
||||
|
||||
|
||||
@ -71,6 +71,7 @@ class TargetPracticeGame(ba.TeamGameActivity[Player, Team]):
|
||||
'default': True
|
||||
}),
|
||||
]
|
||||
default_music = ba.MusicType.FORWARD_MARCH
|
||||
|
||||
@classmethod
|
||||
def get_supported_maps(cls, sessiontype: Type[ba.Session]) -> List[str]:
|
||||
@ -92,9 +93,6 @@ class TargetPracticeGame(ba.TeamGameActivity[Player, Team]):
|
||||
self._enable_impact_bombs = bool(settings['Enable Impact Bombs'])
|
||||
self._enable_triple_bombs = bool(settings['Enable Triple Bombs'])
|
||||
|
||||
# Base class overrides
|
||||
self.default_music = ba.MusicType.FORWARD_MARCH
|
||||
|
||||
def on_team_join(self, team: Team) -> None:
|
||||
if self.has_begun():
|
||||
self.update_scoreboard()
|
||||
|
||||
@ -30,6 +30,7 @@ from bastd.actor import spazbot
|
||||
from bastd.actor.playerspaz import PlayerSpaz
|
||||
from bastd.actor.bomb import TNTSpawner
|
||||
from bastd.actor.scoreboard import Scoreboard
|
||||
from bastd.actor.powerupbox import PowerupBoxFactory, PowerupBox
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from typing import Any, Dict, Type, List, Optional, Sequence
|
||||
@ -137,12 +138,11 @@ class TheLastStandGame(ba.CoopGameActivity[Player, Team]):
|
||||
ba.WeakCall(self._update_bots))
|
||||
|
||||
def _drop_powerup(self, index: int, poweruptype: str = None) -> None:
|
||||
from bastd.actor import powerupbox
|
||||
if poweruptype is None:
|
||||
poweruptype = (powerupbox.get_factory().get_random_powerup_type(
|
||||
poweruptype = (PowerupBoxFactory.get().get_random_powerup_type(
|
||||
excludetypes=self._excludepowerups))
|
||||
powerupbox.PowerupBox(position=self.map.powerup_spawn_points[index],
|
||||
poweruptype=poweruptype).autoretain()
|
||||
PowerupBox(position=self.map.powerup_spawn_points[index],
|
||||
poweruptype=poweruptype).autoretain()
|
||||
|
||||
def _start_powerup_drops(self) -> None:
|
||||
self._powerup_drop_timer = ba.Timer(3.0,
|
||||
@ -171,7 +171,7 @@ class TheLastStandGame(ba.CoopGameActivity[Player, Team]):
|
||||
# Drop one random one somewhere.
|
||||
powerupbox.PowerupBox(
|
||||
position=drop_pt,
|
||||
poweruptype=powerupbox.get_factory().get_random_powerup_type(
|
||||
poweruptype=PowerupBoxFactory.get().get_random_powerup_type(
|
||||
excludetypes=self._excludepowerups)).autoretain()
|
||||
|
||||
def do_end(self, outcome: str) -> None:
|
||||
|
||||
@ -858,8 +858,8 @@ def _preload1() -> None:
|
||||
]:
|
||||
ba.gettexture(tex)
|
||||
ba.gettexture('bg')
|
||||
from bastd.actor import powerupbox
|
||||
powerupbox.get_factory()
|
||||
from bastd.actor.powerupbox import PowerupBoxFactory
|
||||
PowerupBoxFactory.get()
|
||||
ba.timer(0.1, _preload2)
|
||||
|
||||
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
<!-- THIS FILE IS AUTO GENERATED; DO NOT EDIT BY HAND -->
|
||||
<h4><em>last updated on 2020-05-23 for Ballistica version 1.5.0 build 20026</em></h4>
|
||||
<h4><em>last updated on 2020-05-24 for Ballistica version 1.5.0 build 20026</em></h4>
|
||||
<p>This page documents the Python classes and functions in the 'ba' module,
|
||||
which are the ones most relevant to modding in Ballistica. If you come across something you feel should be included here or could be better explained, please <a href="mailto:support@froemling.net">let me know</a>. Happy modding!</p>
|
||||
<hr>
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user