Working HUD.
[koperkapel.git] / koperkapel / hud.py
1 """ Roach up display. """
2
3 import math
4 from pygame.surface import Surface
5 from .actors.surf import SurfActor
6 from .serums import default_serums
7
8
9 class HudActor(SurfActor):
10     def __init__(self, stats, **kw):
11         self._stats = None
12         self.stats = stats
13         super().__init__(surf=self._surf, **kw)
14
15     def _build_bar(self, value, *args, **kw):
16         icon = default_serums.assemble_icon(*args, **kw)
17         rect = icon.get_rect()
18         value = math.ceil(value)
19         surf = Surface((rect.w, rect.h * value)).convert_alpha()
20         surf.fill((255, 255, 255, 0))
21         x, y = 0, (surf.get_rect().h - rect.h)
22         for i in range(value):
23             surf.blit(icon, (x, y))
24             y -= rect.h / 4
25         return surf
26
27     def _rebuild_hud_surf(self):
28         stats = self._stats
29         bars = [
30             self._build_bar(stats.smart, "smart"),
31             self._build_bar(stats.fast, "fast"),
32             self._build_bar(stats.strong, "strong"),
33             self._build_bar(stats.health / 5, "strong", color="health"),
34         ]
35         rects = [b.get_rect() for b in bars]
36         h, w = max(r.h for r in rects), sum(r.w for r in rects)
37         x = (w - rects[0].w) / 2
38         surf = Surface((w, h)).convert_alpha()
39         surf.fill((255, 255, 255, 0))
40         for i, bar in enumerate(bars):
41             surf.blit(bar, (x, h - rects[i].h))
42             x += rects[i].w / 2
43         return surf
44
45     @property
46     def stats(self):
47         return self._stats
48
49     @stats.setter
50     def stats(self, stats):
51         if self._stats == stats:
52             return
53         self._stats = stats
54         self.surf = self._rebuild_hud_surf()