Make roach management buttons print things.
[koperkapel.git] / koperkapel / scenes / roaches.py
1 """ Roach management scene. """
2
3 from pgzero.constants import keys, mouse
4 from pgzero.actor import Actor
5 from ..actors.buttons import TextButton, ImageButton
6 from ..constants import WIDTH, HEIGHT
7 from .base import Scene, ChangeSceneEvent
8
9
10 TOOLBAR_LEFT_X = WIDTH * 3 // 4
11 TOOLBAR_TOP_Y = 0
12 TOOLBAR_MID_Y = HEIGHT * 1 // 2
13 BUTTON_INSET = (20, 20)
14
15
16 def inset_button(pos, d):
17     return (
18         pos[0] + d[0] * BUTTON_INSET[0],
19         pos[1] + d[1] * BUTTON_INSET[1])
20
21
22 class RoachesScene(Scene):
23     """ Roach management scene. """
24
25     def __init__(self):
26         super().__init__()
27         self._roach_actors = {}
28         self._roaches = self.actors.add_layer("roaches", level=10)
29         self._pads = self.actors.add_layer("pads", level=5)
30         self._buttons = self.actors.add_layer("buttons", level=6)
31         self._init_bg()
32         self._init_pads()
33         self._init_buttons()
34
35     def _init_bg(self):
36         self.actors.default.add(Actor("vehicles/walking/background"))
37
38     def _init_pads(self):
39         self._roach_pad = self._pads.add(
40             Actor("roach_management/roach_pad", anchor=("left", "bottom")))
41         self._roach_pad.pos = (TOOLBAR_LEFT_X, TOOLBAR_MID_Y)
42         self._inventory_pad = self._pads.add(
43             Actor("roach_management/inventory_pad", anchor=("left", "top")))
44         self._inventory_pad.pos = (TOOLBAR_LEFT_X, TOOLBAR_MID_Y)
45
46     def _add_button(self, name, anchor, inset, pos, action):
47         button = self._buttons.add(
48             ImageButton(name, anchor=anchor, action=action))
49         button.pos = inset_button(pos, inset)
50         return button
51
52     def _init_buttons(self):
53         self._add_button(
54             "roach_management/left_button", ("left", "bottom"), (1, -1),
55             self._roach_pad.bottomleft, self._roach_left)
56
57         self._add_button(
58             "roach_management/right_button", ("right", "bottom"), (-1, -1),
59             self._roach_pad.bottomright, self._roach_right)
60
61         self._add_button(
62             "roach_management/left_button", ("left", "bottom"), (1, -1),
63             self._inventory_pad.bottomleft, self._inventory_left)
64
65         self._add_button(
66             "roach_management/right_button", ("right", "bottom"), (-1, -1),
67             self._inventory_pad.bottomright, self._inventory_right)
68
69         self._add_button(
70             "roach_management/eject_button", ("right", "top"), (-1, 1),
71             (TOOLBAR_LEFT_X, TOOLBAR_TOP_Y), self._eject_roach)
72
73     def _roach_left(self):
74         print("Cycle outside roaches left.")
75
76     def _roach_right(self):
77         print("Cycle outside roaches right.")
78
79     def _inventory_left(self):
80         print("Cycle inventory left.")
81
82     def _inventory_right(self):
83         print("Cycle inventory right.")
84
85     def _eject_roach(self):
86         print("Eject roach.")
87
88     def update(self, world, dt):
89         for i, roach in enumerate(world.roaches):
90             if roach.name in self._roach_actors:
91                 actor = self._roach_actors[roach.name]
92             else:
93                 actor = TextButton("%s [%s]" % (
94                     roach.name,
95                     ", ".join("%s=%s" % kv for kv in sorted(
96                         roach.attributes.items()),
97                     )))
98                 self._roach_actors[roach.name] = actor
99                 self._roaches.add(actor)
100             # TODO: remove missing roaches
101             actor.pos = (300, 100 + i * 100)
102
103     def on_key_down(self, key, mod, unicode):
104         if key == keys.ESCAPE:
105             from .menu import MenuScene
106             return [ChangeSceneEvent(MenuScene())]
107
108     def on_mouse_down(self, pos, button):
109         if button == mouse.LEFT:
110             for actor in self.actors.buttons:
111                 if actor.collidepoint(pos):
112                     actor.action()
113                     break