bascenev1lib.activity.dualteamscore
Functionality related to the end screen in dual-team mode.
1# Released under the MIT License. See LICENSE for details. 2# 3"""Functionality related to the end screen in dual-team mode.""" 4 5from __future__ import annotations 6 7from typing import override 8 9import bascenev1 as bs 10 11from bascenev1lib.activity.multiteamscore import MultiTeamScoreScreenActivity 12from bascenev1lib.actor.zoomtext import ZoomText 13 14 15class TeamVictoryScoreScreenActivity(MultiTeamScoreScreenActivity): 16 """Scorescreen between rounds of a dual-team session.""" 17 18 def __init__(self, settings: dict): 19 super().__init__(settings=settings) 20 self._winner: bs.SessionTeam = settings['winner'] 21 assert isinstance(self._winner, bs.SessionTeam) 22 23 @override 24 def on_begin(self) -> None: 25 bs.set_analytics_screen('Teams Score Screen') 26 super().on_begin() 27 28 height = 130 29 active_team_count = len(self.teams) 30 vval = (height * active_team_count) / 2 - height / 2 31 i = 0 32 shift_time = 2.5 33 34 # Usually we say 'Best of 7', but if the language prefers we can say 35 # 'First to 4'. 36 session = self.session 37 assert isinstance(session, bs.MultiTeamSession) 38 if bs.app.lang.get_resource('bestOfUseFirstToInstead'): 39 best_txt = bs.Lstr( 40 resource='firstToSeriesText', 41 subs=[('${COUNT}', str(session.get_series_length() / 2 + 1))], 42 ) 43 else: 44 best_txt = bs.Lstr( 45 resource='bestOfSeriesText', 46 subs=[('${COUNT}', str(session.get_series_length()))], 47 ) 48 49 ZoomText( 50 best_txt, 51 position=(0, 175), 52 shiftposition=(-250, 175), 53 shiftdelay=2.5, 54 flash=False, 55 trail=False, 56 h_align='center', 57 scale=0.25, 58 color=(0.5, 0.5, 0.5, 1.0), 59 jitter=3.0, 60 ).autoretain() 61 for team in self.session.sessionteams: 62 bs.timer( 63 i * 0.15 + 0.15, 64 bs.WeakCall( 65 self._show_team_name, 66 vval - i * height, 67 team, 68 i * 0.2, 69 shift_time - (i * 0.150 + 0.150), 70 ), 71 ) 72 bs.timer(i * 0.150 + 0.5, self._score_display_sound_small.play) 73 scored = team is self._winner 74 delay = 0.2 75 if scored: 76 delay = 1.2 77 bs.timer( 78 i * 0.150 + 0.2, 79 bs.WeakCall( 80 self._show_team_old_score, 81 vval - i * height, 82 team, 83 shift_time - (i * 0.15 + 0.2), 84 ), 85 ) 86 bs.timer(i * 0.15 + 1.5, self._score_display_sound.play) 87 88 bs.timer( 89 i * 0.150 + delay, 90 bs.WeakCall( 91 self._show_team_score, 92 vval - i * height, 93 team, 94 scored, 95 i * 0.2 + 0.1, 96 shift_time - (i * 0.15 + delay), 97 ), 98 ) 99 i += 1 100 self.show_player_scores() 101 102 def _show_team_name( 103 self, 104 pos_v: float, 105 team: bs.SessionTeam, 106 kill_delay: float, 107 shiftdelay: float, 108 ) -> None: 109 del kill_delay # Unused arg. 110 ZoomText( 111 bs.Lstr(value='${A}:', subs=[('${A}', team.name)]), 112 position=(100, pos_v), 113 shiftposition=(-150, pos_v), 114 shiftdelay=shiftdelay, 115 flash=False, 116 trail=False, 117 h_align='right', 118 maxwidth=300, 119 color=team.color, 120 jitter=1.0, 121 ).autoretain() 122 123 def _show_team_old_score( 124 self, pos_v: float, sessionteam: bs.SessionTeam, shiftdelay: float 125 ) -> None: 126 ZoomText( 127 str(sessionteam.customdata['score'] - 1), 128 position=(150, pos_v), 129 maxwidth=100, 130 color=(0.6, 0.6, 0.7), 131 shiftposition=(-100, pos_v), 132 shiftdelay=shiftdelay, 133 flash=False, 134 trail=False, 135 lifespan=1.0, 136 h_align='left', 137 jitter=1.0, 138 ).autoretain() 139 140 def _show_team_score( 141 self, 142 pos_v: float, 143 sessionteam: bs.SessionTeam, 144 scored: bool, 145 kill_delay: float, 146 shiftdelay: float, 147 ) -> None: 148 # pylint: disable=too-many-positional-arguments 149 del kill_delay # Unused arg. 150 ZoomText( 151 str(sessionteam.customdata['score']), 152 position=(150, pos_v), 153 maxwidth=100, 154 color=(1.0, 0.9, 0.5) if scored else (0.6, 0.6, 0.7), 155 shiftposition=(-100, pos_v), 156 shiftdelay=shiftdelay, 157 flash=scored, 158 trail=scored, 159 h_align='left', 160 jitter=1.0, 161 trailcolor=(1, 0.8, 0.0, 0), 162 ).autoretain()
class
TeamVictoryScoreScreenActivity(bascenev1._activity.Activity[bascenev1._player.EmptyPlayer, bascenev1._team.EmptyTeam]):
16class TeamVictoryScoreScreenActivity(MultiTeamScoreScreenActivity): 17 """Scorescreen between rounds of a dual-team session.""" 18 19 def __init__(self, settings: dict): 20 super().__init__(settings=settings) 21 self._winner: bs.SessionTeam = settings['winner'] 22 assert isinstance(self._winner, bs.SessionTeam) 23 24 @override 25 def on_begin(self) -> None: 26 bs.set_analytics_screen('Teams Score Screen') 27 super().on_begin() 28 29 height = 130 30 active_team_count = len(self.teams) 31 vval = (height * active_team_count) / 2 - height / 2 32 i = 0 33 shift_time = 2.5 34 35 # Usually we say 'Best of 7', but if the language prefers we can say 36 # 'First to 4'. 37 session = self.session 38 assert isinstance(session, bs.MultiTeamSession) 39 if bs.app.lang.get_resource('bestOfUseFirstToInstead'): 40 best_txt = bs.Lstr( 41 resource='firstToSeriesText', 42 subs=[('${COUNT}', str(session.get_series_length() / 2 + 1))], 43 ) 44 else: 45 best_txt = bs.Lstr( 46 resource='bestOfSeriesText', 47 subs=[('${COUNT}', str(session.get_series_length()))], 48 ) 49 50 ZoomText( 51 best_txt, 52 position=(0, 175), 53 shiftposition=(-250, 175), 54 shiftdelay=2.5, 55 flash=False, 56 trail=False, 57 h_align='center', 58 scale=0.25, 59 color=(0.5, 0.5, 0.5, 1.0), 60 jitter=3.0, 61 ).autoretain() 62 for team in self.session.sessionteams: 63 bs.timer( 64 i * 0.15 + 0.15, 65 bs.WeakCall( 66 self._show_team_name, 67 vval - i * height, 68 team, 69 i * 0.2, 70 shift_time - (i * 0.150 + 0.150), 71 ), 72 ) 73 bs.timer(i * 0.150 + 0.5, self._score_display_sound_small.play) 74 scored = team is self._winner 75 delay = 0.2 76 if scored: 77 delay = 1.2 78 bs.timer( 79 i * 0.150 + 0.2, 80 bs.WeakCall( 81 self._show_team_old_score, 82 vval - i * height, 83 team, 84 shift_time - (i * 0.15 + 0.2), 85 ), 86 ) 87 bs.timer(i * 0.15 + 1.5, self._score_display_sound.play) 88 89 bs.timer( 90 i * 0.150 + delay, 91 bs.WeakCall( 92 self._show_team_score, 93 vval - i * height, 94 team, 95 scored, 96 i * 0.2 + 0.1, 97 shift_time - (i * 0.15 + delay), 98 ), 99 ) 100 i += 1 101 self.show_player_scores() 102 103 def _show_team_name( 104 self, 105 pos_v: float, 106 team: bs.SessionTeam, 107 kill_delay: float, 108 shiftdelay: float, 109 ) -> None: 110 del kill_delay # Unused arg. 111 ZoomText( 112 bs.Lstr(value='${A}:', subs=[('${A}', team.name)]), 113 position=(100, pos_v), 114 shiftposition=(-150, pos_v), 115 shiftdelay=shiftdelay, 116 flash=False, 117 trail=False, 118 h_align='right', 119 maxwidth=300, 120 color=team.color, 121 jitter=1.0, 122 ).autoretain() 123 124 def _show_team_old_score( 125 self, pos_v: float, sessionteam: bs.SessionTeam, shiftdelay: float 126 ) -> None: 127 ZoomText( 128 str(sessionteam.customdata['score'] - 1), 129 position=(150, pos_v), 130 maxwidth=100, 131 color=(0.6, 0.6, 0.7), 132 shiftposition=(-100, pos_v), 133 shiftdelay=shiftdelay, 134 flash=False, 135 trail=False, 136 lifespan=1.0, 137 h_align='left', 138 jitter=1.0, 139 ).autoretain() 140 141 def _show_team_score( 142 self, 143 pos_v: float, 144 sessionteam: bs.SessionTeam, 145 scored: bool, 146 kill_delay: float, 147 shiftdelay: float, 148 ) -> None: 149 # pylint: disable=too-many-positional-arguments 150 del kill_delay # Unused arg. 151 ZoomText( 152 str(sessionteam.customdata['score']), 153 position=(150, pos_v), 154 maxwidth=100, 155 color=(1.0, 0.9, 0.5) if scored else (0.6, 0.6, 0.7), 156 shiftposition=(-100, pos_v), 157 shiftdelay=shiftdelay, 158 flash=scored, 159 trail=scored, 160 h_align='left', 161 jitter=1.0, 162 trailcolor=(1, 0.8, 0.0, 0), 163 ).autoretain()
Scorescreen between rounds of a dual-team session.
TeamVictoryScoreScreenActivity(settings: dict)
19 def __init__(self, settings: dict): 20 super().__init__(settings=settings) 21 self._winner: bs.SessionTeam = settings['winner'] 22 assert isinstance(self._winner, bs.SessionTeam)
Creates an Activity in the current bascenev1.Session.
The activity will not be actually run until bascenev1.Session.setactivity is called. 'settings' should be a dict of key/value pairs specific to the activity.
Activities should preload as much of their media/etc as possible in their constructor, but none of it should actually be used until they are transitioned in.
@override
def
on_begin(self) -> None:
24 @override 25 def on_begin(self) -> None: 26 bs.set_analytics_screen('Teams Score Screen') 27 super().on_begin() 28 29 height = 130 30 active_team_count = len(self.teams) 31 vval = (height * active_team_count) / 2 - height / 2 32 i = 0 33 shift_time = 2.5 34 35 # Usually we say 'Best of 7', but if the language prefers we can say 36 # 'First to 4'. 37 session = self.session 38 assert isinstance(session, bs.MultiTeamSession) 39 if bs.app.lang.get_resource('bestOfUseFirstToInstead'): 40 best_txt = bs.Lstr( 41 resource='firstToSeriesText', 42 subs=[('${COUNT}', str(session.get_series_length() / 2 + 1))], 43 ) 44 else: 45 best_txt = bs.Lstr( 46 resource='bestOfSeriesText', 47 subs=[('${COUNT}', str(session.get_series_length()))], 48 ) 49 50 ZoomText( 51 best_txt, 52 position=(0, 175), 53 shiftposition=(-250, 175), 54 shiftdelay=2.5, 55 flash=False, 56 trail=False, 57 h_align='center', 58 scale=0.25, 59 color=(0.5, 0.5, 0.5, 1.0), 60 jitter=3.0, 61 ).autoretain() 62 for team in self.session.sessionteams: 63 bs.timer( 64 i * 0.15 + 0.15, 65 bs.WeakCall( 66 self._show_team_name, 67 vval - i * height, 68 team, 69 i * 0.2, 70 shift_time - (i * 0.150 + 0.150), 71 ), 72 ) 73 bs.timer(i * 0.150 + 0.5, self._score_display_sound_small.play) 74 scored = team is self._winner 75 delay = 0.2 76 if scored: 77 delay = 1.2 78 bs.timer( 79 i * 0.150 + 0.2, 80 bs.WeakCall( 81 self._show_team_old_score, 82 vval - i * height, 83 team, 84 shift_time - (i * 0.15 + 0.2), 85 ), 86 ) 87 bs.timer(i * 0.15 + 1.5, self._score_display_sound.play) 88 89 bs.timer( 90 i * 0.150 + delay, 91 bs.WeakCall( 92 self._show_team_score, 93 vval - i * height, 94 team, 95 scored, 96 i * 0.2 + 0.1, 97 shift_time - (i * 0.15 + delay), 98 ), 99 ) 100 i += 1 101 self.show_player_scores()
Called once the previous Activity has finished transitioning out.
At this point the activity's initial players and teams are filled in and it should begin its actual game logic.