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,
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)
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
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):
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
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)