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