1 """ Roach management scene. """
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
11 TOOLBAR_LEFT_X = WIDTH * 3 // 4
13 TOOLBAR_MID_Y = HEIGHT * 1 // 2
14 VEHICLE_MID_X = WIDTH * 3 // 8
15 VEHICLE_MID_Y = HEIGHT * 1 // 2
16 BUTTON_INSET = (20, 20)
19 def inset_button(pos, d):
21 pos[0] + d[0] * BUTTON_INSET[0],
22 pos[1] + d[1] * BUTTON_INSET[1])
25 class RoachesScene(Scene):
26 """ Roach management scene. """
30 self._roach_actors = {}
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)
38 def enter(self, world):
39 self._vehicle = Vehicle.by_type(world.vehicles.current)
44 self.actors.default.add(self._vehicle.background)
46 def _init_seats(self):
47 vrad = self._vehicle.approximate_radius
48 for seat in self._vehicle.seats:
49 seat_actor = self._seats.add(seat.actor)
51 seat.pos[0] * vrad + VEHICLE_MID_X,
52 seat.pos[1] * vrad + VEHICLE_MID_Y)
55 self._roach_pad = self._pads.add(
56 Actor("roach_management/roach_pad", anchor=("left", "bottom")))
57 self._roach_pad.pos = (TOOLBAR_LEFT_X, TOOLBAR_MID_Y)
58 self._inventory_pad = self._pads.add(
59 Actor("roach_management/inventory_pad", anchor=("left", "top")))
60 self._inventory_pad.pos = (TOOLBAR_LEFT_X, TOOLBAR_MID_Y)
62 def _add_button(self, name, anchor, inset, pos, action):
63 button = self._buttons.add(
64 ImageButton(name, anchor=anchor, action=action))
65 button.pos = inset_button(pos, inset)
68 def _init_buttons(self):
70 "roach_management/left_button", ("left", "bottom"), (1, -1),
71 self._roach_pad.bottomleft, self._roach_left)
74 "roach_management/right_button", ("right", "bottom"), (-1, -1),
75 self._roach_pad.bottomright, self._roach_right)
78 "roach_management/left_button", ("left", "bottom"), (1, -1),
79 self._inventory_pad.bottomleft, self._inventory_left)
82 "roach_management/right_button", ("right", "bottom"), (-1, -1),
83 self._inventory_pad.bottomright, self._inventory_right)
86 "roach_management/eject_button", ("right", "top"), (-1, 1),
87 (TOOLBAR_LEFT_X, TOOLBAR_TOP_Y), self._eject_roach)
89 def _roach_left(self):
90 print("Cycle outside roaches left.")
92 def _roach_right(self):
93 print("Cycle outside roaches right.")
95 def _inventory_left(self):
96 print("Cycle inventory left.")
98 def _inventory_right(self):
99 print("Cycle inventory right.")
101 def _eject_roach(self):
102 print("Eject roach.")
104 def update(self, world, dt):
105 for i, roach in enumerate(world.roaches):
106 if roach.name in self._roach_actors:
107 actor = self._roach_actors[roach.name]
109 actor = TextButton("%s [%s]" % (
111 ", ".join("%s=%s" % kv for kv in sorted(
112 roach.attributes.items()),
114 self._roach_actors[roach.name] = actor
115 self._roaches.add(actor)
116 # TODO: remove missing roaches
117 actor.pos = (300, 100 + i * 100)
119 def on_key_down(self, key, mod, unicode):
120 if key == keys.ESCAPE:
121 from .menu import MenuScene
122 return [ChangeSceneEvent(MenuScene())]
124 def on_mouse_down(self, pos, button):
125 if button == mouse.LEFT:
126 for actor in self.actors.buttons:
127 if actor.collidepoint(pos):