1 """ Roach management scene. """
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
13 TOOLBAR_LEFT_X = WIDTH * 3 // 4
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)
22 def inset_button(pos, d):
24 pos[0] + d[0] * BUTTON_INSET[0],
25 pos[1] + d[1] * BUTTON_INSET[1])
28 class RoachesScene(Scene):
29 """ Roach management scene. """
35 self._outside_roach_pos = 0
36 self._inventory_pos = 0
37 self._inventory_item = None
38 self._roach_layer = self.actors.add_layer("roaches", level=10)
39 self._inventory_layer = self.actors.add_layer("inventory", level=10)
40 self._pad_layer = self.actors.add_layer("pads", level=5)
41 self._seat_layer = self.actors.add_layer("seats", level=5)
42 self._button_layer = self.actors.add_layer("buttons", level=6)
47 def enter(self, world):
48 self._vehicle = Vehicle.by_type(world.vehicles.current)
51 self._init_roaches(world.roaches)
52 self._update_inventory(world)
55 self.actors.default.clear()
56 self.actors.default.add(self._vehicle.roach_management_overlay())
58 def _init_seats(self):
59 self._seat_layer.clear()
60 for seat in self._vehicle.seats:
61 seat_actor = self._seat_layer.add(seat.actor())
63 seat.vehicle_pos[0] + VEHICLE_MID_X,
64 seat.vehicle_pos[1] + VEHICLE_MID_Y)
66 def _init_roaches(self, roaches):
67 self._roach_layer.clear()
68 for i, roach in enumerate(roaches):
69 roach_actor = self._roach_layer.add(big_roaches.assemble(roach))
70 # TODO: less hacky seat assignment
71 if i < len(self._seat_layer):
72 roach_actor.pos = self._seat_layer[i].pos
74 def _init_serums(self):
75 self._serum_actors = {
76 serum: big_serums.assemble(serum) for serum in SERUMS}
78 def _update_inventory(self, world):
79 self._inventory_layer.clear()
83 self._inventory_pos %= len(serums)
84 serum_actor = self._serum_actors[serums[self._inventory_pos]]
85 inv_pad_centre = self._inventory_pad.center
87 inv_pad_centre[0] + SERUM_OFFSET[0],
88 inv_pad_centre[1] + SERUM_OFFSET[1])
89 self._inventory_layer.add(serum_actor)
92 self._roach_pad = self._pad_layer.add(
93 Actor("roach_management/roach_pad", anchor=("left", "bottom")))
94 self._roach_pad.pos = (TOOLBAR_LEFT_X, TOOLBAR_MID_Y)
95 self._inventory_pad = self._pad_layer.add(
96 Actor("roach_management/inventory_pad", anchor=("left", "top")))
97 self._inventory_pad.pos = (TOOLBAR_LEFT_X, TOOLBAR_MID_Y)
99 def _add_button(self, name, anchor, inset, pos, action):
100 button = self._button_layer.add(
101 ImageButton(name, anchor=anchor, action=action))
102 button.pos = inset_button(pos, inset)
105 def _init_buttons(self):
106 self._button_layer.clear()
108 "roach_management/left_button", ("left", "bottom"), (1, -1),
109 self._roach_pad.bottomleft, self._roach_left)
112 "roach_management/right_button", ("right", "bottom"), (-1, -1),
113 self._roach_pad.bottomright, self._roach_right)
116 "roach_management/left_button", ("left", "bottom"), (1, -1),
117 self._inventory_pad.bottomleft, self._inventory_left)
120 "roach_management/right_button", ("right", "bottom"), (-1, -1),
121 self._inventory_pad.bottomright, self._inventory_right)
124 "roach_management/eject_button", ("right", "top"), (-1, 1),
125 (TOOLBAR_LEFT_X, TOOLBAR_TOP_Y), self._eject_roach)
127 def _roach_left(self):
128 self._outside_roach_pos -= 1
130 def _roach_right(self):
131 self._outside_roach_pos += 1
133 def _inventory_left(self):
134 self._inventory_pos -= 1
136 def _inventory_right(self):
137 self._inventory_pos += 1
139 def _eject_roach(self):
140 print("Eject roach.")
142 def update(self, world, dt):
143 self._update_inventory(world)
145 def on_key_down(self, key, mod, unicode):
146 if key == keys.ESCAPE:
147 from .menu import MenuScene
148 return [ChangeSceneEvent(MenuScene())]
150 def on_mouse_down(self, pos, button):
151 if button == mouse.LEFT:
152 for actor in self.actors.buttons:
153 if actor.collidepoint(pos):