bascenev1lib.actor.popuptext

Defines Actor(s).

  1# Released under the MIT License. See LICENSE for details.
  2#
  3"""Defines Actor(s)."""
  4
  5from __future__ import annotations
  6
  7import random
  8from typing import TYPE_CHECKING, override
  9
 10import bascenev1 as bs
 11
 12if TYPE_CHECKING:
 13    from typing import Any, Sequence
 14
 15
 16class PopupText(bs.Actor):
 17    """Text that pops up above a position to denote something special.
 18
 19    category: Gameplay Classes
 20    """
 21
 22    def __init__(
 23        self,
 24        text: str | bs.Lstr,
 25        position: Sequence[float] = (0.0, 0.0, 0.0),
 26        color: Sequence[float] = (1.0, 1.0, 1.0, 1.0),
 27        random_offset: float = 0.5,
 28        offset: Sequence[float] = (0.0, 0.0, 0.0),
 29        scale: float = 1.0,
 30    ):
 31        """Instantiate with given values.
 32
 33        random_offset is the amount of random offset from the provided position
 34        that will be applied. This can help multiple achievements from
 35        overlapping too much.
 36        """
 37        super().__init__()
 38        if len(color) == 3:
 39            color = (color[0], color[1], color[2], 1.0)
 40        pos = (
 41            position[0] + offset[0] + random_offset * (0.5 - random.random()),
 42            position[1] + offset[1] + random_offset * (0.5 - random.random()),
 43            position[2] + offset[2] + random_offset * (0.5 - random.random()),
 44        )
 45
 46        self.node = bs.newnode(
 47            'text',
 48            attrs={
 49                'text': text,
 50                'in_world': True,
 51                'shadow': 1.0,
 52                'flatness': 1.0,
 53                'h_align': 'center',
 54            },
 55            delegate=self,
 56        )
 57
 58        lifespan = 1.5
 59
 60        # scale up
 61        bs.animate(
 62            self.node,
 63            'scale',
 64            {
 65                0: 0.0,
 66                lifespan * 0.11: 0.020 * 0.7 * scale,
 67                lifespan * 0.16: 0.013 * 0.7 * scale,
 68                lifespan * 0.25: 0.014 * 0.7 * scale,
 69            },
 70        )
 71
 72        # translate upward
 73        self._tcombine = bs.newnode(
 74            'combine',
 75            owner=self.node,
 76            attrs={'input0': pos[0], 'input2': pos[2], 'size': 3},
 77        )
 78        bs.animate(
 79            self._tcombine, 'input1', {0: pos[1] + 1.5, lifespan: pos[1] + 2.0}
 80        )
 81        self._tcombine.connectattr('output', self.node, 'position')
 82
 83        # fade our opacity in/out
 84        self._combine = bs.newnode(
 85            'combine',
 86            owner=self.node,
 87            attrs={
 88                'input0': color[0],
 89                'input1': color[1],
 90                'input2': color[2],
 91                'size': 4,
 92            },
 93        )
 94        for i in range(4):
 95            bs.animate(
 96                self._combine,
 97                'input' + str(i),
 98                {
 99                    0.13 * lifespan: color[i],
100                    0.18 * lifespan: 4.0 * color[i],
101                    0.22 * lifespan: color[i],
102                },
103            )
104        bs.animate(
105            self._combine,
106            'input3',
107            {
108                0: 0,
109                0.1 * lifespan: color[3],
110                0.7 * lifespan: color[3],
111                lifespan: 0,
112            },
113        )
114        self._combine.connectattr('output', self.node, 'color')
115
116        # kill ourself
117        self._die_timer = bs.Timer(
118            lifespan, bs.WeakCall(self.handlemessage, bs.DieMessage())
119        )
120
121    @override
122    def handlemessage(self, msg: Any) -> Any:
123        assert not self.expired
124        if isinstance(msg, bs.DieMessage):
125            if self.node:
126                self.node.delete()
127        else:
128            super().handlemessage(msg)
class PopupText(bascenev1._actor.Actor):
 17class PopupText(bs.Actor):
 18    """Text that pops up above a position to denote something special.
 19
 20    category: Gameplay Classes
 21    """
 22
 23    def __init__(
 24        self,
 25        text: str | bs.Lstr,
 26        position: Sequence[float] = (0.0, 0.0, 0.0),
 27        color: Sequence[float] = (1.0, 1.0, 1.0, 1.0),
 28        random_offset: float = 0.5,
 29        offset: Sequence[float] = (0.0, 0.0, 0.0),
 30        scale: float = 1.0,
 31    ):
 32        """Instantiate with given values.
 33
 34        random_offset is the amount of random offset from the provided position
 35        that will be applied. This can help multiple achievements from
 36        overlapping too much.
 37        """
 38        super().__init__()
 39        if len(color) == 3:
 40            color = (color[0], color[1], color[2], 1.0)
 41        pos = (
 42            position[0] + offset[0] + random_offset * (0.5 - random.random()),
 43            position[1] + offset[1] + random_offset * (0.5 - random.random()),
 44            position[2] + offset[2] + random_offset * (0.5 - random.random()),
 45        )
 46
 47        self.node = bs.newnode(
 48            'text',
 49            attrs={
 50                'text': text,
 51                'in_world': True,
 52                'shadow': 1.0,
 53                'flatness': 1.0,
 54                'h_align': 'center',
 55            },
 56            delegate=self,
 57        )
 58
 59        lifespan = 1.5
 60
 61        # scale up
 62        bs.animate(
 63            self.node,
 64            'scale',
 65            {
 66                0: 0.0,
 67                lifespan * 0.11: 0.020 * 0.7 * scale,
 68                lifespan * 0.16: 0.013 * 0.7 * scale,
 69                lifespan * 0.25: 0.014 * 0.7 * scale,
 70            },
 71        )
 72
 73        # translate upward
 74        self._tcombine = bs.newnode(
 75            'combine',
 76            owner=self.node,
 77            attrs={'input0': pos[0], 'input2': pos[2], 'size': 3},
 78        )
 79        bs.animate(
 80            self._tcombine, 'input1', {0: pos[1] + 1.5, lifespan: pos[1] + 2.0}
 81        )
 82        self._tcombine.connectattr('output', self.node, 'position')
 83
 84        # fade our opacity in/out
 85        self._combine = bs.newnode(
 86            'combine',
 87            owner=self.node,
 88            attrs={
 89                'input0': color[0],
 90                'input1': color[1],
 91                'input2': color[2],
 92                'size': 4,
 93            },
 94        )
 95        for i in range(4):
 96            bs.animate(
 97                self._combine,
 98                'input' + str(i),
 99                {
100                    0.13 * lifespan: color[i],
101                    0.18 * lifespan: 4.0 * color[i],
102                    0.22 * lifespan: color[i],
103                },
104            )
105        bs.animate(
106            self._combine,
107            'input3',
108            {
109                0: 0,
110                0.1 * lifespan: color[3],
111                0.7 * lifespan: color[3],
112                lifespan: 0,
113            },
114        )
115        self._combine.connectattr('output', self.node, 'color')
116
117        # kill ourself
118        self._die_timer = bs.Timer(
119            lifespan, bs.WeakCall(self.handlemessage, bs.DieMessage())
120        )
121
122    @override
123    def handlemessage(self, msg: Any) -> Any:
124        assert not self.expired
125        if isinstance(msg, bs.DieMessage):
126            if self.node:
127                self.node.delete()
128        else:
129            super().handlemessage(msg)

Text that pops up above a position to denote something special.

category: Gameplay Classes

PopupText( text: str | babase.Lstr, position: Sequence[float] = (0.0, 0.0, 0.0), color: Sequence[float] = (1.0, 1.0, 1.0, 1.0), random_offset: float = 0.5, offset: Sequence[float] = (0.0, 0.0, 0.0), scale: float = 1.0)
 23    def __init__(
 24        self,
 25        text: str | bs.Lstr,
 26        position: Sequence[float] = (0.0, 0.0, 0.0),
 27        color: Sequence[float] = (1.0, 1.0, 1.0, 1.0),
 28        random_offset: float = 0.5,
 29        offset: Sequence[float] = (0.0, 0.0, 0.0),
 30        scale: float = 1.0,
 31    ):
 32        """Instantiate with given values.
 33
 34        random_offset is the amount of random offset from the provided position
 35        that will be applied. This can help multiple achievements from
 36        overlapping too much.
 37        """
 38        super().__init__()
 39        if len(color) == 3:
 40            color = (color[0], color[1], color[2], 1.0)
 41        pos = (
 42            position[0] + offset[0] + random_offset * (0.5 - random.random()),
 43            position[1] + offset[1] + random_offset * (0.5 - random.random()),
 44            position[2] + offset[2] + random_offset * (0.5 - random.random()),
 45        )
 46
 47        self.node = bs.newnode(
 48            'text',
 49            attrs={
 50                'text': text,
 51                'in_world': True,
 52                'shadow': 1.0,
 53                'flatness': 1.0,
 54                'h_align': 'center',
 55            },
 56            delegate=self,
 57        )
 58
 59        lifespan = 1.5
 60
 61        # scale up
 62        bs.animate(
 63            self.node,
 64            'scale',
 65            {
 66                0: 0.0,
 67                lifespan * 0.11: 0.020 * 0.7 * scale,
 68                lifespan * 0.16: 0.013 * 0.7 * scale,
 69                lifespan * 0.25: 0.014 * 0.7 * scale,
 70            },
 71        )
 72
 73        # translate upward
 74        self._tcombine = bs.newnode(
 75            'combine',
 76            owner=self.node,
 77            attrs={'input0': pos[0], 'input2': pos[2], 'size': 3},
 78        )
 79        bs.animate(
 80            self._tcombine, 'input1', {0: pos[1] + 1.5, lifespan: pos[1] + 2.0}
 81        )
 82        self._tcombine.connectattr('output', self.node, 'position')
 83
 84        # fade our opacity in/out
 85        self._combine = bs.newnode(
 86            'combine',
 87            owner=self.node,
 88            attrs={
 89                'input0': color[0],
 90                'input1': color[1],
 91                'input2': color[2],
 92                'size': 4,
 93            },
 94        )
 95        for i in range(4):
 96            bs.animate(
 97                self._combine,
 98                'input' + str(i),
 99                {
100                    0.13 * lifespan: color[i],
101                    0.18 * lifespan: 4.0 * color[i],
102                    0.22 * lifespan: color[i],
103                },
104            )
105        bs.animate(
106            self._combine,
107            'input3',
108            {
109                0: 0,
110                0.1 * lifespan: color[3],
111                0.7 * lifespan: color[3],
112                lifespan: 0,
113            },
114        )
115        self._combine.connectattr('output', self.node, 'color')
116
117        # kill ourself
118        self._die_timer = bs.Timer(
119            lifespan, bs.WeakCall(self.handlemessage, bs.DieMessage())
120        )

Instantiate with given values.

random_offset is the amount of random offset from the provided position that will be applied. This can help multiple achievements from overlapping too much.

node
@override
def handlemessage(self, msg: Any) -> Any:
122    @override
123    def handlemessage(self, msg: Any) -> Any:
124        assert not self.expired
125        if isinstance(msg, bs.DieMessage):
126            if self.node:
127                self.node.delete()
128        else:
129            super().handlemessage(msg)

General message handling; can be passed any message object.

Inherited Members
bascenev1._actor.Actor
autoretain
on_expire
expired
exists
is_alive
activity
getactivity