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