fixed eyeball colour; associated popping sound with eyeball
[tabakrolletjie.git] / tabakrolletjie / enemies.py
index cca4ce1bfa079db0f6880fc4669b04890d5e1d99..0bd2d43f4afe720ae31cc37f6052889147383a8d 100644 (file)
@@ -13,6 +13,7 @@ from .constants import (SCREEN_SIZE, MOULD_CATEGORY, OBSTACLE_CATEGORY,
 from .loader import loader
 from .sound import sound
 from .transforms import Multiply
+from .utils import debug_timer
 
 MOULD_FILTER = pymunk.ShapeFilter(
     mask=MOULD_CATEGORY | OBSTACLE_CATEGORY,
@@ -22,8 +23,8 @@ EAT_TURNIP_FILTER = pymunk.ShapeFilter(mask=TURNIP_CATEGORY)
 
 
 # Boyd parameters
-SPAWN_RATE = 10
-MAX_AGE = 60
+SPAWN_RATE = 5
+MAX_AGE = 30
 MAX_ELEMENTS = 400
 MAX_HEALTH = 100
 
@@ -32,7 +33,9 @@ DAY_HEALTH = 10
 
 HEAL_FACTOR = 1
 
-MOULD_STAGES = [15, 25]
+MOULD_STAGES = [7, 13]
+
+MOULD_RADIUS = 16
 
 
 def calc_colour_transform(resistances):
@@ -64,7 +67,7 @@ class Mould(pymunk.Body):
     def __init__(self, gamestate, space, pos, resistances, transform):
         super(Mould, self).__init__(0, 0, pymunk.Body.STATIC)
         self.position = pos
-        self._shape = pymunk.Circle(self, 16)
+        self._shape = pymunk.Circle(self, MOULD_RADIUS)
         space.add(self, self._shape)
         self._shape.filter = MOULD_FILTER
         self._age = 0
@@ -80,13 +83,16 @@ class Mould(pymunk.Body):
            our position is the centre of the image."""
         # The odd sign combination is because of the pymunk / pygame
         # transform, but we do it this way to exploit Vec2d math magic
-        return pymunk.pygame_util.to_pygame(self.position + (-16, 16), surface)
+        return pymunk.pygame_util.to_pygame(
+            self.position + (-MOULD_RADIUS, MOULD_RADIUS), surface)
 
     def get_image(self):
         if not self._img:
             name = random.choice(
                 ('mouldA.png', 'mouldB.png', 'mouldC.png'))
-            size = "16" if self._age < MOULD_STAGES[0] else "32" if self._age < MOULD_STAGES[1] else "64"
+            size = (
+                "16" if self._age < MOULD_STAGES[0] else
+                "32" if self._age < MOULD_STAGES[1] else "64")
             self._img = loader.load_image(size, name,
                                           transform=self._transform)
         return self._img
@@ -96,6 +102,8 @@ class Mould(pymunk.Body):
             name = random.choice(
                 ('eyeballA.png', 'eyeballB.png', 'eyeballC.png'))
             self._eyeball = loader.load_image("32", name)
+            eyelid = loader.load_image("32", "eyelid.png", transform=self._transform)
+            self._eyeball.blit(eyelid, (0, 0), None)
         return self._eyeball
 
     def set_health(self, new_health):
@@ -140,8 +148,6 @@ class Mould(pymunk.Body):
                 child._health = self._health
                 moulds.append(child)
                 refresh = True
-                if random.randint(0, 10) < 2:
-                    sound.play_sound("mouth_pop_2a.ogg")
 
         if self._age in MOULD_STAGES:
             # We grow in size
@@ -151,6 +157,7 @@ class Mould(pymunk.Body):
         if self._age > MOULD_STAGES[1] and random.randint(0, 500) < 1:
             # Maybe we grow an eyeball
             self.has_eyeball = True
+            sound.play_sound("mouth_pop_2a.ogg")
 
         if self._age > MAX_AGE:
             # We die of old age
@@ -160,7 +167,8 @@ class Mould(pymunk.Body):
         else:
             # Check for turnips we can eat
             # Note that we can only eat a tick after we spawn
-            query = space.point_query(self.position, 16, EAT_TURNIP_FILTER)
+            query = space.point_query(self.position, MOULD_RADIUS,
+                                      EAT_TURNIP_FILTER)
             if query:
                 query[0].shape.body.turnip.eaten = True
         return refresh
@@ -205,6 +213,7 @@ class Boyd(object):
                 self._image.blit(m.get_eyeball(), m.pygame_pos(self._image),
                                  None, 0)
 
+    @debug_timer('Boyd.tick')
     def tick(self, gamestate, space, lights):
         redraw = False
         # Handle spawn events
@@ -213,7 +222,7 @@ class Boyd(object):
             if mould.tick(gamestate, space, self._moulds):
                 redraw = True
             # Check for damage
-            lit_by = lights.light_query(mould._shape)
+            lit_by = lights.lit_by(mould.position, MOULD_RADIUS)
             for light in lit_by:
                 self._seen_colours.add(light.colour)
                 if mould.damage(light, space, self._moulds):