Source code for bascenev1lib.activity.dualteamscore

# Released under the MIT License. See LICENSE for details.
#
"""Functionality related to the end screen in dual-team mode."""

from __future__ import annotations

from typing import override

import bascenev1 as bs

from bascenev1lib.activity.multiteamscore import MultiTeamScoreScreenActivity
from bascenev1lib.actor.zoomtext import ZoomText


[docs] class TeamVictoryScoreScreenActivity(MultiTeamScoreScreenActivity): """Scorescreen between rounds of a dual-team session.""" def __init__(self, settings: dict): super().__init__(settings=settings) self._winner: bs.SessionTeam = settings['winner'] assert isinstance(self._winner, bs.SessionTeam)
[docs] @override def on_begin(self) -> None: bs.set_analytics_screen('Teams Score Screen') super().on_begin() height = 130 active_team_count = len(self.teams) vval = (height * active_team_count) / 2 - height / 2 i = 0 shift_time = 2.5 # Usually we say 'Best of 7', but if the language prefers we can say # 'First to 4'. session = self.session assert isinstance(session, bs.MultiTeamSession) if bs.app.lang.get_resource('bestOfUseFirstToInstead'): best_txt = bs.Lstr( resource='firstToSeriesText', subs=[('${COUNT}', str(session.get_series_length() / 2 + 1))], ) else: best_txt = bs.Lstr( resource='bestOfSeriesText', subs=[('${COUNT}', str(session.get_series_length()))], ) ZoomText( best_txt, position=(0, 175), shiftposition=(-250, 175), shiftdelay=2.5, flash=False, trail=False, h_align='center', scale=0.25, color=(0.5, 0.5, 0.5, 1.0), jitter=3.0, ).autoretain() for team in self.session.sessionteams: bs.timer( i * 0.15 + 0.15, bs.WeakCall( self._show_team_name, vval - i * height, team, i * 0.2, shift_time - (i * 0.150 + 0.150), ), ) bs.timer(i * 0.150 + 0.5, self._score_display_sound_small.play) scored = team is self._winner delay = 0.2 if scored: delay = 1.2 bs.timer( i * 0.150 + 0.2, bs.WeakCall( self._show_team_old_score, vval - i * height, team, shift_time - (i * 0.15 + 0.2), ), ) bs.timer(i * 0.15 + 1.5, self._score_display_sound.play) bs.timer( i * 0.150 + delay, bs.WeakCall( self._show_team_score, vval - i * height, team, scored, i * 0.2 + 0.1, shift_time - (i * 0.15 + delay), ), ) i += 1 self.show_player_scores()
def _show_team_name( self, pos_v: float, team: bs.SessionTeam, kill_delay: float, shiftdelay: float, ) -> None: del kill_delay # Unused arg. ZoomText( bs.Lstr(value='${A}:', subs=[('${A}', team.name)]), position=(100, pos_v), shiftposition=(-150, pos_v), shiftdelay=shiftdelay, flash=False, trail=False, h_align='right', maxwidth=300, color=team.color, jitter=1.0, ).autoretain() def _show_team_old_score( self, pos_v: float, sessionteam: bs.SessionTeam, shiftdelay: float ) -> None: ZoomText( str(sessionteam.customdata['score'] - 1), position=(150, pos_v), maxwidth=100, color=(0.6, 0.6, 0.7), shiftposition=(-100, pos_v), shiftdelay=shiftdelay, flash=False, trail=False, lifespan=1.0, h_align='left', jitter=1.0, ).autoretain() def _show_team_score( self, pos_v: float, sessionteam: bs.SessionTeam, scored: bool, kill_delay: float, shiftdelay: float, ) -> None: # pylint: disable=too-many-positional-arguments del kill_delay # Unused arg. ZoomText( str(sessionteam.customdata['score']), position=(150, pos_v), maxwidth=100, color=(1.0, 0.9, 0.5) if scored else (0.6, 0.6, 0.7), shiftposition=(-100, pos_v), shiftdelay=shiftdelay, flash=scored, trail=scored, h_align='left', jitter=1.0, trailcolor=(1, 0.8, 0.0, 0), ).autoretain()
# Docs-generation hack; import some stuff that we likely only forward-declared # in our actual source code so that docs tools can find it. from typing import (Coroutine, Any, Literal, Callable, Generator, Awaitable, Sequence, Self) import asyncio from concurrent.futures import Future from pathlib import Path from enum import Enum