Transform Boyd based on resistances
authorNeil <neil@dip.sun.ac.za>
Sat, 10 Sep 2016 16:34:40 +0000 (18:34 +0200)
committerNeil <neil@dip.sun.ac.za>
Sat, 10 Sep 2016 17:04:14 +0000 (19:04 +0200)
tabakrolletjie/enemies.py

index e4c868e89ae3dabd6d4ca6d3b9b08448ad93ce76..cca4ce1bfa079db0f6880fc4669b04890d5e1d99 100644 (file)
@@ -9,9 +9,10 @@ import pygame.surface
 import pygame.display
 
 from .constants import (SCREEN_SIZE, MOULD_CATEGORY, OBSTACLE_CATEGORY,
-                        TURNIP_CATEGORY)
+                        TURNIP_CATEGORY, COLOURS)
 from .loader import loader
 from .sound import sound
+from .transforms import Multiply
 
 MOULD_FILTER = pymunk.ShapeFilter(
     mask=MOULD_CATEGORY | OBSTACLE_CATEGORY,
@@ -34,10 +35,33 @@ HEAL_FACTOR = 1
 MOULD_STAGES = [15, 25]
 
 
+def calc_colour_transform(resistances):
+    fr = fg = fb = 0
+    for colour, value in resistances.items():
+        if value:
+            new_value = 63 + 64 * value
+            r, g, b = COLOURS[colour]
+            if r:
+                fr += new_value
+            if g:
+                fg += new_value
+            if b:
+                fb += new_value
+    # Scale if we've exceeded 255
+    # Should only be required when we have lights that aren't soley red,
+    # green or blue
+    max_value = max(fr, fg, fb)
+    if max_value > 255:
+        fr = int(255 * fr / float(max_value))
+        fg = int(255 * fg / float(max_value))
+        fb = int(255 * fb / float(max_value))
+    return Multiply(colour=(fr, fg, fb))
+
+
 class Mould(pymunk.Body):
     """A segment of Boyd"""
 
-    def __init__(self, gamestate, space, pos, resistances):
+    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)
@@ -49,6 +73,7 @@ class Mould(pymunk.Body):
         self.has_eyeball = False
         self._eyeball = None
         self._resistances = resistances
+        self._transform = transform
 
     def pygame_pos(self, surface):
         """Convert to pygame coordinates and offset position so
@@ -62,7 +87,8 @@ class Mould(pymunk.Body):
             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"
-            self._img = loader.load_image(size, name)
+            self._img = loader.load_image(size, name,
+                                          transform=self._transform)
         return self._img
 
     def get_eyeball(self):
@@ -109,7 +135,8 @@ class Mould(pymunk.Body):
             if query:
                 spawn = False
             if spawn:
-                child = Mould(gamestate, space, pos, self._resistances)
+                child = Mould(gamestate, space, pos, self._resistances,
+                              self._transform)
                 child._health = self._health
                 moulds.append(child)
                 refresh = True
@@ -157,9 +184,10 @@ class Boyd(object):
     def __init__(self, gamestate, space):
         self._moulds = []
         self._seen_colours = set()
+        self._mould_transform = calc_colour_transform(gamestate.resistances)
         for position in gamestate.get_spawn_positions():
             seed = Mould(gamestate, space, position,
-                         gamestate.resistances)
+                         gamestate.resistances, self._mould_transform)
             seed.set_health(MAX_HEALTH + gamestate.days * DAY_HEALTH)
             self._moulds.append(seed)
         self._image = pygame.surface.Surface(SCREEN_SIZE)