diff mamba/sprites.py @ 182:0a955d2536f0

Painted Jezebel! (Assuming you name your snake Jezebel.)
author Jeremy Thurgood <firxen@gmail.com>
date Wed, 14 Sep 2011 16:27:11 +0200
parents 061d711ba570
children 045f6b4301eb
line wrap: on
line diff
--- a/mamba/sprites.py	Wed Sep 14 15:27:27 2011 +0200
+++ b/mamba/sprites.py	Wed Sep 14 16:27:11 2011 +0200
@@ -5,6 +5,19 @@
 from mamba import mutators
 
 
+COLOURS = {
+    'red': mutators.RED,
+    'blue': mutators.BLUE,
+    'yellow': mutators.YELLOW,
+    }
+
+
+def colour_with_fittings(image_name, tileset, colour):
+    fittings_mutator = mutators.Overlay(
+            "tiles/%s/%s-fittings.png" % (tileset, image_name))
+    return image_name, (COLOURS[colour], fittings_mutator)
+
+
 def tile_sizify(pos):
     ts_x, ts_y = TILE_SIZE
     p_x, p_y = pos
@@ -72,14 +85,9 @@
         }
 
 
-class InvariantSpriteImageVariants(SpriteImageVariants):
-    def __call__(self, top, bottom, left, right):
-        return (self.base_image_name, ())
-
-
 class BaseSprite(Sprite):
     tileset = 'common'
-    variants_class = InvariantSpriteImageVariants
+    variants_class = None
     variants = None
     name = None
     alive = True
@@ -109,7 +117,8 @@
         return self.variants(top, bottom, left, right)
 
     def use_variant(self, *args):
-        self.image = self.load_image(*self.get_variant(*args))
+        if self.variants_class is not None:
+            self.image = self.load_image(*self.get_variant(*args))
 
 
 class TileSprite(BaseSprite):
@@ -118,11 +127,11 @@
         self.tile_char = tile_char
         self.solid = solid
 
-    def get_solid(self, snake):
+    def get_solid(self, snake, segment):
         return self.solid
 
-    def interact(self, snake):
-        if self.get_solid(snake):
+    def interact(self, snake, segment):
+        if self.get_solid(snake, segment):
             snake.crash()
 
 
@@ -140,12 +149,12 @@
 
     def __init__(self, colour, **kw):
         self.colour = colour
-        image_name = 'door_%s' % (colour,)
-        kw.setdefault('image_name', image_name)
         super(DoorSprite, self).__init__(**kw)
+        self.image = self.load_image(
+            *colour_with_fittings("door", self.tileset, colour))
 
-    def get_solid(self, snake_mutations):
-        return self.colour in self.snake_mutations
+    def get_solid(self, snake, segment):
+        return COLOURS[self.colour] != segment._colour_overlay
 
 
 class EntrySprite(SingleImageTileSprite):
@@ -171,7 +180,7 @@
         super(PuddleSprite, self).__init__(**kw)
         self.image = self.load_image(*self.get_variant(*variant))
 
-    def get_solid(self, snake):
+    def get_solid(self, snake, segment):
         if snake.can_swim():
             print "Splishy!"
             return False
@@ -180,31 +189,45 @@
 
 
 class EdibleTile(SingleImageTileSprite):
-    def eat(self):
+    def interact(self, snake, segment):
+        if not segment.is_head:
+            return
+        self.eat(snake)
         self.alive = False
         self.kill()
 
+    def eat(self, snake):
+        print "I'm delicious!"
+
 
 class BigMouse(EdibleTile):
     image_name = "rat-big"
 
-    def interact(self, snake):
+    def eat(self, snake):
         print "Embiggen!"
-        self.eat()
 
 
 class SmallMouse(EdibleTile):
     image_name = "rat-small"
 
-    def interact(self, snake):
+    def eat(self, snake):
         print "Ensmallen!"
-        self.eat()
 
 
 class Frog(EdibleTile):
     image_name = "frog"
 
-    def interact(self, snake):
+    def eat(self, snake):
         print "Swimmery!"
         snake.mutate('amphibious')
-        self.eat()
+
+
+class Painter(TileSprite):
+    def __init__(self, colour, **kw):
+        super(Painter, self).__init__(**kw)
+        self.colour = colour
+        self.image = self.load_image(
+            *colour_with_fittings("spray", self.tileset, colour))
+
+    def interact(self, snake, segment):
+        segment.set_colour(COLOURS[self.colour])