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