Source code for bascenev1lib.actor.tipstext

# Released under the MIT License. See LICENSE for details.
#
"""Provides tip related Actor(s)."""

from __future__ import annotations

from typing import TYPE_CHECKING, override

import bascenev1 as bs

if TYPE_CHECKING:
    from typing import Any


[docs] class TipsText(bs.Actor): """A bit of text showing various helpful game tips.""" def __init__(self, offs_y: float = 100.0): super().__init__() self._tip_scale = 0.8 self._tip_title_scale = 1.1 self._offs_y = offs_y self.node = bs.newnode( 'text', delegate=self, attrs={ 'text': '', 'scale': self._tip_scale, 'h_align': 'left', 'maxwidth': 800, 'vr_depth': -20, 'v_align': 'center', 'v_attach': 'bottom', }, ) tval = bs.Lstr( value='${A}:', subs=[('${A}', bs.Lstr(resource='tipText'))] ) self.title_node = bs.newnode( 'text', delegate=self, attrs={ 'text': tval, 'scale': self._tip_title_scale, 'maxwidth': 122, 'h_align': 'right', 'vr_depth': -20, 'v_align': 'center', 'v_attach': 'bottom', }, ) self._message_duration = 10000 self._message_spacing = 3000 self._change_timer = bs.Timer( 0.001 * (self._message_duration + self._message_spacing), bs.WeakCall(self.change_phrase), repeat=True, ) self._combine = bs.newnode( 'combine', owner=self.node, attrs={'input0': 1.0, 'input1': 0.8, 'input2': 1.0, 'size': 4}, ) self._combine.connectattr('output', self.node, 'color') self._combine.connectattr('output', self.title_node, 'color') self.change_phrase()
[docs] def change_phrase(self) -> None: """Switch the visible tip phrase.""" from babase import get_remote_app_name next_tip = bs.Lstr( translate=( 'tips', ( bs.app.classic.get_next_tip() if bs.app.classic is not None else '' ), ), subs=[('${REMOTE_APP_NAME}', get_remote_app_name())], ) spc = self._message_spacing assert self.node self.node.position = (-200, self._offs_y) self.title_node.position = (-220, self._offs_y + 3) keys = { spc: 0, spc + 1000: 1.0, spc + self._message_duration - 1000: 1.0, spc + self._message_duration: 0.0, } bs.animate( self._combine, 'input3', {k / 1000.0: v * 0.5 for k, v in list(keys.items())}, ) self.node.text = next_tip
[docs] @override def handlemessage(self, msg: Any) -> Any: assert not self.expired if isinstance(msg, bs.DieMessage): if self.node: self.node.delete() self.title_node.delete() return None return super().handlemessage(msg)