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