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
  7import bascenev1 as bs
  8from bascenev1lib.activity.multiteamscore import MultiTeamScoreScreenActivity
  9from bascenev1lib.actor.zoomtext import ZoomText
 10
 11
 12class TeamVictoryScoreScreenActivity(MultiTeamScoreScreenActivity):
 13    """Scorescreen between rounds of a dual-team session."""
 14
 15    def __init__(self, settings: dict):
 16        super().__init__(settings=settings)
 17        self._winner: bs.SessionTeam = settings['winner']
 18        assert isinstance(self._winner, bs.SessionTeam)
 19
 20    def on_begin(self) -> None:
 21        bs.set_analytics_screen('Teams Score Screen')
 22        super().on_begin()
 23
 24        height = 130
 25        active_team_count = len(self.teams)
 26        vval = (height * active_team_count) / 2 - height / 2
 27        i = 0
 28        shift_time = 2.5
 29
 30        # Usually we say 'Best of 7', but if the language prefers we can say
 31        # 'First to 4'.
 32        session = self.session
 33        assert isinstance(session, bs.MultiTeamSession)
 34        if bs.app.lang.get_resource('bestOfUseFirstToInstead'):
 35            best_txt = bs.Lstr(
 36                resource='firstToSeriesText',
 37                subs=[('${COUNT}', str(session.get_series_length() / 2 + 1))],
 38            )
 39        else:
 40            best_txt = bs.Lstr(
 41                resource='bestOfSeriesText',
 42                subs=[('${COUNT}', str(session.get_series_length()))],
 43            )
 44
 45        ZoomText(
 46            best_txt,
 47            position=(0, 175),
 48            shiftposition=(-250, 175),
 49            shiftdelay=2.5,
 50            flash=False,
 51            trail=False,
 52            h_align='center',
 53            scale=0.25,
 54            color=(0.5, 0.5, 0.5, 1.0),
 55            jitter=3.0,
 56        ).autoretain()
 57        for team in self.session.sessionteams:
 58            bs.timer(
 59                i * 0.15 + 0.15,
 60                bs.WeakCall(
 61                    self._show_team_name,
 62                    vval - i * height,
 63                    team,
 64                    i * 0.2,
 65                    shift_time - (i * 0.150 + 0.150),
 66                ),
 67            )
 68            bs.timer(i * 0.150 + 0.5, self._score_display_sound_small.play)
 69            scored = team is self._winner
 70            delay = 0.2
 71            if scored:
 72                delay = 1.2
 73                bs.timer(
 74                    i * 0.150 + 0.2,
 75                    bs.WeakCall(
 76                        self._show_team_old_score,
 77                        vval - i * height,
 78                        team,
 79                        shift_time - (i * 0.15 + 0.2),
 80                    ),
 81                )
 82                bs.timer(i * 0.15 + 1.5, self._score_display_sound.play)
 83
 84            bs.timer(
 85                i * 0.150 + delay,
 86                bs.WeakCall(
 87                    self._show_team_score,
 88                    vval - i * height,
 89                    team,
 90                    scored,
 91                    i * 0.2 + 0.1,
 92                    shift_time - (i * 0.15 + delay),
 93                ),
 94            )
 95            i += 1
 96        self.show_player_scores()
 97
 98    def _show_team_name(
 99        self,
100        pos_v: float,
101        team: bs.SessionTeam,
102        kill_delay: float,
103        shiftdelay: float,
104    ) -> None:
105        del kill_delay  # Unused arg.
106        ZoomText(
107            bs.Lstr(value='${A}:', subs=[('${A}', team.name)]),
108            position=(100, pos_v),
109            shiftposition=(-150, pos_v),
110            shiftdelay=shiftdelay,
111            flash=False,
112            trail=False,
113            h_align='right',
114            maxwidth=300,
115            color=team.color,
116            jitter=1.0,
117        ).autoretain()
118
119    def _show_team_old_score(
120        self, pos_v: float, sessionteam: bs.SessionTeam, shiftdelay: float
121    ) -> None:
122        ZoomText(
123            str(sessionteam.customdata['score'] - 1),
124            position=(150, pos_v),
125            maxwidth=100,
126            color=(0.6, 0.6, 0.7),
127            shiftposition=(-100, pos_v),
128            shiftdelay=shiftdelay,
129            flash=False,
130            trail=False,
131            lifespan=1.0,
132            h_align='left',
133            jitter=1.0,
134        ).autoretain()
135
136    def _show_team_score(
137        self,
138        pos_v: float,
139        sessionteam: bs.SessionTeam,
140        scored: bool,
141        kill_delay: float,
142        shiftdelay: float,
143    ) -> None:
144        del kill_delay  # Unused arg.
145        ZoomText(
146            str(sessionteam.customdata['score']),
147            position=(150, pos_v),
148            maxwidth=100,
149            color=(1.0, 0.9, 0.5) if scored else (0.6, 0.6, 0.7),
150            shiftposition=(-100, pos_v),
151            shiftdelay=shiftdelay,
152            flash=scored,
153            trail=scored,
154            h_align='left',
155            jitter=1.0,
156            trailcolor=(1, 0.8, 0.0, 0),
157        ).autoretain()
class TeamVictoryScoreScreenActivity(bascenev1._activity.Activity[bascenev1._player.EmptyPlayer, bascenev1._team.EmptyTeam]):
 13class TeamVictoryScoreScreenActivity(MultiTeamScoreScreenActivity):
 14    """Scorescreen between rounds of a dual-team session."""
 15
 16    def __init__(self, settings: dict):
 17        super().__init__(settings=settings)
 18        self._winner: bs.SessionTeam = settings['winner']
 19        assert isinstance(self._winner, bs.SessionTeam)
 20
 21    def on_begin(self) -> None:
 22        bs.set_analytics_screen('Teams Score Screen')
 23        super().on_begin()
 24
 25        height = 130
 26        active_team_count = len(self.teams)
 27        vval = (height * active_team_count) / 2 - height / 2
 28        i = 0
 29        shift_time = 2.5
 30
 31        # Usually we say 'Best of 7', but if the language prefers we can say
 32        # 'First to 4'.
 33        session = self.session
 34        assert isinstance(session, bs.MultiTeamSession)
 35        if bs.app.lang.get_resource('bestOfUseFirstToInstead'):
 36            best_txt = bs.Lstr(
 37                resource='firstToSeriesText',
 38                subs=[('${COUNT}', str(session.get_series_length() / 2 + 1))],
 39            )
 40        else:
 41            best_txt = bs.Lstr(
 42                resource='bestOfSeriesText',
 43                subs=[('${COUNT}', str(session.get_series_length()))],
 44            )
 45
 46        ZoomText(
 47            best_txt,
 48            position=(0, 175),
 49            shiftposition=(-250, 175),
 50            shiftdelay=2.5,
 51            flash=False,
 52            trail=False,
 53            h_align='center',
 54            scale=0.25,
 55            color=(0.5, 0.5, 0.5, 1.0),
 56            jitter=3.0,
 57        ).autoretain()
 58        for team in self.session.sessionteams:
 59            bs.timer(
 60                i * 0.15 + 0.15,
 61                bs.WeakCall(
 62                    self._show_team_name,
 63                    vval - i * height,
 64                    team,
 65                    i * 0.2,
 66                    shift_time - (i * 0.150 + 0.150),
 67                ),
 68            )
 69            bs.timer(i * 0.150 + 0.5, self._score_display_sound_small.play)
 70            scored = team is self._winner
 71            delay = 0.2
 72            if scored:
 73                delay = 1.2
 74                bs.timer(
 75                    i * 0.150 + 0.2,
 76                    bs.WeakCall(
 77                        self._show_team_old_score,
 78                        vval - i * height,
 79                        team,
 80                        shift_time - (i * 0.15 + 0.2),
 81                    ),
 82                )
 83                bs.timer(i * 0.15 + 1.5, self._score_display_sound.play)
 84
 85            bs.timer(
 86                i * 0.150 + delay,
 87                bs.WeakCall(
 88                    self._show_team_score,
 89                    vval - i * height,
 90                    team,
 91                    scored,
 92                    i * 0.2 + 0.1,
 93                    shift_time - (i * 0.15 + delay),
 94                ),
 95            )
 96            i += 1
 97        self.show_player_scores()
 98
 99    def _show_team_name(
100        self,
101        pos_v: float,
102        team: bs.SessionTeam,
103        kill_delay: float,
104        shiftdelay: float,
105    ) -> None:
106        del kill_delay  # Unused arg.
107        ZoomText(
108            bs.Lstr(value='${A}:', subs=[('${A}', team.name)]),
109            position=(100, pos_v),
110            shiftposition=(-150, pos_v),
111            shiftdelay=shiftdelay,
112            flash=False,
113            trail=False,
114            h_align='right',
115            maxwidth=300,
116            color=team.color,
117            jitter=1.0,
118        ).autoretain()
119
120    def _show_team_old_score(
121        self, pos_v: float, sessionteam: bs.SessionTeam, shiftdelay: float
122    ) -> None:
123        ZoomText(
124            str(sessionteam.customdata['score'] - 1),
125            position=(150, pos_v),
126            maxwidth=100,
127            color=(0.6, 0.6, 0.7),
128            shiftposition=(-100, pos_v),
129            shiftdelay=shiftdelay,
130            flash=False,
131            trail=False,
132            lifespan=1.0,
133            h_align='left',
134            jitter=1.0,
135        ).autoretain()
136
137    def _show_team_score(
138        self,
139        pos_v: float,
140        sessionteam: bs.SessionTeam,
141        scored: bool,
142        kill_delay: float,
143        shiftdelay: float,
144    ) -> None:
145        del kill_delay  # Unused arg.
146        ZoomText(
147            str(sessionteam.customdata['score']),
148            position=(150, pos_v),
149            maxwidth=100,
150            color=(1.0, 0.9, 0.5) if scored else (0.6, 0.6, 0.7),
151            shiftposition=(-100, pos_v),
152            shiftdelay=shiftdelay,
153            flash=scored,
154            trail=scored,
155            h_align='left',
156            jitter=1.0,
157            trailcolor=(1, 0.8, 0.0, 0),
158        ).autoretain()

Scorescreen between rounds of a dual-team session.

TeamVictoryScoreScreenActivity(settings: dict)
16    def __init__(self, settings: dict):
17        super().__init__(settings=settings)
18        self._winner: bs.SessionTeam = settings['winner']
19        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.

def on_begin(self) -> None:
21    def on_begin(self) -> None:
22        bs.set_analytics_screen('Teams Score Screen')
23        super().on_begin()
24
25        height = 130
26        active_team_count = len(self.teams)
27        vval = (height * active_team_count) / 2 - height / 2
28        i = 0
29        shift_time = 2.5
30
31        # Usually we say 'Best of 7', but if the language prefers we can say
32        # 'First to 4'.
33        session = self.session
34        assert isinstance(session, bs.MultiTeamSession)
35        if bs.app.lang.get_resource('bestOfUseFirstToInstead'):
36            best_txt = bs.Lstr(
37                resource='firstToSeriesText',
38                subs=[('${COUNT}', str(session.get_series_length() / 2 + 1))],
39            )
40        else:
41            best_txt = bs.Lstr(
42                resource='bestOfSeriesText',
43                subs=[('${COUNT}', str(session.get_series_length()))],
44            )
45
46        ZoomText(
47            best_txt,
48            position=(0, 175),
49            shiftposition=(-250, 175),
50            shiftdelay=2.5,
51            flash=False,
52            trail=False,
53            h_align='center',
54            scale=0.25,
55            color=(0.5, 0.5, 0.5, 1.0),
56            jitter=3.0,
57        ).autoretain()
58        for team in self.session.sessionteams:
59            bs.timer(
60                i * 0.15 + 0.15,
61                bs.WeakCall(
62                    self._show_team_name,
63                    vval - i * height,
64                    team,
65                    i * 0.2,
66                    shift_time - (i * 0.150 + 0.150),
67                ),
68            )
69            bs.timer(i * 0.150 + 0.5, self._score_display_sound_small.play)
70            scored = team is self._winner
71            delay = 0.2
72            if scored:
73                delay = 1.2
74                bs.timer(
75                    i * 0.150 + 0.2,
76                    bs.WeakCall(
77                        self._show_team_old_score,
78                        vval - i * height,
79                        team,
80                        shift_time - (i * 0.15 + 0.2),
81                    ),
82                )
83                bs.timer(i * 0.15 + 1.5, self._score_display_sound.play)
84
85            bs.timer(
86                i * 0.150 + delay,
87                bs.WeakCall(
88                    self._show_team_score,
89                    vval - i * height,
90                    team,
91                    scored,
92                    i * 0.2 + 0.1,
93                    shift_time - (i * 0.15 + delay),
94                ),
95            )
96            i += 1
97        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.

Inherited Members
bascenev1lib.activity.multiteamscore.MultiTeamScoreScreenActivity
show_player_scores
bascenev1._activitytypes.ScoreScreenActivity
transition_time
inherits_tint
inherits_vr_camera_offset
use_fixed_vr_overlay
default_music
on_player_join
on_transition_in
bascenev1._activity.Activity
settings_raw
teams
players
announce_player_deaths
is_joining_activity
allow_pausing
allow_kick_idle_players
slow_motion
inherits_slow_motion
inherits_music
inherits_vr_overlay_center
allow_mid_activity_joins
can_show_ad_on_death
paused_text
preloads
lobby
context
globalsnode
stats
on_expire
customdata
expired
playertype
teamtype
retain_actor
add_actor_weak_ref
session
on_player_leave
on_team_join
on_team_leave
on_transition_out
handlemessage
has_transitioned_in
has_begun
has_ended
is_transitioning_out
transition_out
end
create_player
create_team
bascenev1._dependency.DependencyComponent
dep_is_present
get_dynamic_deps