Pull SelectableSurfActor out of vehicles.
[koperkapel.git] / koperkapel / vehicles / base.py
index 2ae347cd54e541187b46cd39729da98a7cc86f2b..ba21bbeb94857284f829ebbb8ccc1c731d84ee9e 100644 (file)
@@ -1,11 +1,13 @@
 """ Base class for vehicles.  """
 
 import math
+import random
 from itertools import chain, islice, repeat
 from pygame.constants import BLEND_RGBA_MULT
 from pgzero.loaders import images
-from ..actors.orientatedsurf import OrientatedSurfActor
+from ..actors.orientatedsurf import SelectableSurfActor
 from ..actors.animsurf import AnimatedSurfActor
+from ..weapons import default_weapons
 
 
 class Vehicle:
@@ -14,6 +16,7 @@ class Vehicle:
     vehicle_type = None
     overlay_frame_no = None
     approximate_radius = 200
+    weapons_taped_on = True
     selected_seat_overlay_color = (255, 0, 0, 255)
 
     def __init__(self):
@@ -73,6 +76,10 @@ class Vehicle:
     def register(cls, vehicle_cls):
         cls._vehicle_types[vehicle_cls.__name__.lower()] = vehicle_cls
 
+    @classmethod
+    def random(cls):
+        return random.choice(list(cls._vehicle_types.keys()))
+
     @classmethod
     def register_all(cls):
         from .walking import Walking
@@ -84,14 +91,17 @@ class Vehicle:
         cls.register(Robot)
         cls.register(Roomba)
 
-    def _avatar_frame(self, i, suffix="_tiles"):
+    def _avatar_frame(self, i, weapon, suffix="_tiles"):
         vehicle = images.load("vehicle%s/%s_%d" % (
             suffix, self.vehicle_type, i + 1))
         frame = vehicle.copy()
+        frame.blit(weapon.surf, (0, 0))
         return frame
 
     def get_avatar(self, world):
-        frames = [self._avatar_frame(i) for i in range(4)]
+        weapon = default_weapons.assemble(
+            world.weapons.current, tape=self.weapons_taped_on)
+        frames = [self._avatar_frame(i, weapon) for i in range(4)]
         return AnimatedSurfActor(frames, anchor=(0, 0))
 
 
@@ -119,24 +129,7 @@ class Seat:
         selected_seat = seat.copy()
         selected_seat.fill(
             self.vehicle.selected_seat_overlay_color, None, BLEND_RGBA_MULT)
-        return SeatActor(seat, selected_seat)
-
-
-class SeatActor(OrientatedSurfActor):
-    def __init__(self, seat, selected_seat):
-        self._selected = False
-        self._seat = seat
-        self._selected_seat = selected_seat
-        super().__init__(surf=self._seat, angle=0)
-
-    @property
-    def selected(self):
-        return self._selected
-
-    @selected.setter
-    def selected(self, value):
-        self._selected = value
-        self.surf = self._selected_seat if value else self._seat
+        return SelectableSurfActor(seat, selected_seat)
 
 
 def circle_of_seats(n_seats, **kw):