Merge branch 'master' of ctpug.org.za:tabakrolletjie
authorSimon Cross <hodgestar@gmail.com>
Sat, 10 Sep 2016 10:54:59 +0000 (12:54 +0200)
committerSimon Cross <hodgestar@gmail.com>
Sat, 10 Sep 2016 10:54:59 +0000 (12:54 +0200)
1  2 
tabakrolletjie/lights.py

diff --combined tabakrolletjie/lights.py
index 8b688f71907588608f698084615eb8f4b6c37e8f,b2e081201ae27bf9113146ba4a3106389a4bda44..1eaba7c8e92ee3804026383fdc3ece6c06dfe203
@@@ -1,8 -1,6 +1,8 @@@
  """ May it be a light for you in dark places, when all other lights go out.
  """
  
 +import math
 +
  import pymunk
  import pymunk.pygame_util
  import pygame.display
@@@ -14,7 -12,7 +14,7 @@@ from .constants import LIGHT_CATEGORY, 
  from .rays import RayPolyManager
  from .utils import DetailedTimer
  from .loader import loader
- from .transforms import Multiply
+ from .transforms import Multiply, MultiplyImage
  
  LIGHT_FILTER = pymunk.ShapeFilter(
      mask=pymunk.ShapeFilter.ALL_MASKS ^ (
@@@ -85,9 -83,6 +85,9 @@@ class LightManager(object)
              if light.on and light.ray_manager.reaches(shape.body.position)
          ]
  
 +    def total_power_usage(self):
 +        return sum(light.power_usage() for light in self._lights)
 +
      def render_light(self, surface):
          for light in self._lights:
              light.render_light(surface)
@@@ -129,6 -124,7 +129,7 @@@ class BaseLight(object)
              self.body, self.FITTING_RADIUS, self.ray_manager.position)
          self.fitting.filter = FITTINGS_FILTER
          self._fitting_image = None
+         self._colour_mult_image = None
  
      @property
      def position(self):
  
      def fitting_image(self):
          if self._fitting_image is None:
-             fitting_colour = COLOURS[self.colour]
-             self._fitting_image = loader.load_image(
+             fitting_colours = [COLOURS[c] for c in self.colour_cycle]
+             ncolour = len(fitting_colours)
+             if ncolour > 3:
+                 print "Multicoloured light should not have more than 3 colours"
+                 ncolour = 3
+             if ncolour == 1:
+                 self._fitting_image = loader.load_image(
                  "48", self.FITTING_IMG,
-                 transform=Multiply(colour=fitting_colour))
+                 transform=Multiply(colour=fitting_colours[0]))
+             else:
+                 if self._colour_mult_image is None:
+                     self._colour_mult_image = pygame.surface.Surface((48, 48))
+                     for i in range(ncolour):
+                         sector = loader.load_image(
+                             "48", "light_mask_%d_%d.png" % (ncolour, i + 1),
+                             transform=Multiply(colour=fitting_colours[i]))
+                         self._colour_mult_image.blit(sector, (0,0), None, 0)
+                     
+                 self._fitting_image = loader.load_image(
+                     "48", self.FITTING_IMG,
+                     transform=MultiplyImage(image=self._colour_mult_image))
          return self._fitting_image
  
      def invalidate_fitting_image(self):
          rx, ry = self.ray_manager.pygame_position(surface)
          surface.blit(self.fitting_image(), (rx - 24, ry - 24), None, 0)
  
 +    def power_usage(self):
 +        if not self.on:
 +            return 0.0
 +        area = math.pi * (self.ray_manager.max_radius ** 2)  # radius
 +        area = area * (self.ray_manager.spread / (2 * math.pi))  # spread
 +        return 5 * area * self.intensity
 +
 +    def base_damage(self):
 +        return 5 * self.intensity
 +
      def toggle(self):
          self.colour_pos += 1
          if self.colour_pos >= len(self.colour_cycle):
@@@ -248,14 -254,6 +269,6 @@@ class Lamp(BaseLight)
      FITTING_IMG = "lamp.png"
  
  
- class MultiColourLamp(BaseLight):
-     FITTING_IMG = "lamp.png"
-     def __init__(self, **kw):
-         super(MultiColourLamp, self).__init__(**kw)
  class PulsatingLamp(BaseLight):
  
      FITTING_IMG = "lamp.png"