changeset 144:b292370c4548

Rearranged the orientation stuff. :-)
author Jeremy Thurgood <firxen@gmail.com>
date Mon, 12 Sep 2011 21:14:15 +0200
parents 525fe7b7da80
children 20b2cedf0f1d
files data/levels/dev.txt mamba/level.py mamba/sprites.py
diffstat 3 files changed, 65 insertions(+), 33 deletions(-) [+]
line wrap: on
line diff
--- a/data/levels/dev.txt	Mon Sep 12 19:34:03 2011 -0700
+++ b/data/levels/dev.txt	Mon Sep 12 21:14:15 2011 +0200
@@ -10,20 +10,20 @@
 X......................................X
 X......................................X
 X......................................X
-X.....l................................X
-X......r...............................X
-X......................................X
 X......................................X
 X......................................X
 X......................................X
 X......................................X
-X......................................X
-X......................................X
-X......................................X
-X......................................X
-X......................................X
-X......................................X
-X......................................X
+X...........~~~~~~.....................X
+X..........~~~~~~~~....................X
+X..........~~....~~....................X
+X.........~~......~~...................X
+X.........~~.~..~.~~...................X
+X.........~~......~~...................X
+X..........~.~..~.~....................X
+X..........~.~~~~.~....................X
+X..........~......~....................X
+X..........~~~~~~~~....................X
 X......................................X
 X......................................X
 X......................................X
--- a/mamba/level.py	Mon Sep 12 19:34:03 2011 -0700
+++ b/mamba/level.py	Mon Sep 12 21:14:15 2011 +0200
@@ -21,7 +21,7 @@
 
 TILE_MAP = {
     '.': None,
-    'X': mktile(TileSprite, image_name='wall'),
+    'X': mktile(TileSprite, image_name='wall', solid=True),
     'R': mktile(DoorSprite, colour='red'),
     'B': mktile(DoorSprite, colour='blue'),
     '^': mktile(EntrySprite, direction=Snake.UP),
@@ -30,8 +30,6 @@
     '>': mktile(EntrySprite, direction=Snake.RIGHT),
     'E': mktile(ExitSprite),
     '~': mktile(PuddleSprite),
-    'l': mktile(PuddleSprite, variant=(1, 1, 0, 0)),
-    'r': mktile(PuddleSprite, variant=(1, 0, 1, 0)),
     }
 
 THING_MAP = {
@@ -112,24 +110,43 @@
             self.tiles.append(tile_row)
         if self.entry is None:
             raise InvalidMapError("Not enough entry points.")
+        self.set_tile_orientations()
+
+    def set_tile_orientations(self):
+        tiles = [tile  # This is a scary listcomp. It makes me happy.
+                 for row in self.tiles
+                 for tile in row
+                 if tile is not None]
+        for tile in tiles:
+            orientation = self.get_tile_orientation(tile)
+            tile.use_variant(*orientation)
+            print tile.tile_pos, orientation
 
     def is_same_tile(self, tile, x, y):
         """Is there a tile of the same type?"""
-        try:
-            temp_tile = self.tiles_ascii[y][x]
-        except IndexError:
-            return {}  # The map went out of range'
+        if tile.tile_char is None:
+            # This isn't really a tile, so bail
+            return False
         try:
-            return str(temp_tile) == str(tile)
-        except KeyError:
-            return {}  # The map tile is not existing'
+            other_tile = self.tiles[y][x]
+        except IndexError:
+            # We're over the edge of the map
+            return False
+        if other_tile is None:
+            # Emptiness.
+            return False
+        return tile.tile_char == other_tile.tile_char
 
-    def get_tile_orientation(self, map_y, map_x, row, tile_char):
-        same_as_top = self.is_same_tile(tile_char, map_x, map_y - 1)
-        same_as_right = self.is_same_tile(tile_char, map_x + 1, map_y)
-        same_as_bottom = self.is_same_tile(tile_char, map_x, map_y + 1)
-        same_as_left = self.is_same_tile(tile_char, map_x - 1, map_y)
-        return (same_as_top, same_as_right, same_as_bottom, same_as_left)
+    def get_tile_orientation(self, tile):
+        if tile is None:
+            return (False, False, False, False)
+        map_x, map_y = tile.tile_pos
+        return (
+            self.is_same_tile(tile, map_x, map_y - 1),  # above
+            self.is_same_tile(tile, map_x, map_y + 1),  # below
+            self.is_same_tile(tile, map_x - 1, map_y),  # left
+            self.is_same_tile(tile, map_x + 1, map_y),  # right
+            )
 
     def get_tile_size(self):
         return self.tile_size
--- a/mamba/sprites.py	Mon Sep 12 19:34:03 2011 -0700
+++ b/mamba/sprites.py	Mon Sep 12 21:14:15 2011 +0200
@@ -50,8 +50,8 @@
     VARIANTS = {
         '....': ('-0', ()),
 
-        'X...': ('-1', (mutators.R90,)),
-        '.X..': ('-1', (mutators.R270,)),
+        'X...': ('-1', (mutators.R270,)),
+        '.X..': ('-1', (mutators.R90,)),
         '..X.': ('-1', (mutators.NULL,)),
         '...X': ('-1', (mutators.R180,)),
 
@@ -59,8 +59,8 @@
         '..XX': ('', ()),
 
         'X.X.': ('-2a', (mutators.R180,)),
-        'X..X': ('-2a', (mutators.R270,)),
-        '.XX.': ('-2a', (mutators.R90,)),
+        'X..X': ('-2a', (mutators.R90,)),
+        '.XX.': ('-2a', (mutators.R270,)),
         '.X.X': ('-2a', (mutators.NULL,)),
 
         '.XXX': ('', ()),
@@ -72,18 +72,24 @@
         }
 
 
+class InvariantSpriteImageVariants(SpriteImageVariants):
+    def __call__(self, top, bottom, left, right):
+        return (self.base_image_name, ())
+
+
 class BaseSprite(Sprite):
     tileset = 'common'
-    variants_class = None
+    variants_class = InvariantSpriteImageVariants
     variants = None
 
     def __init__(self, tile_char=None, tileset=None, image_name=None,
-                 mutators=()):
+                 mutators=(), solid=False):
         super(BaseSprite, self).__init__()
         self.tile_char = tile_char
         if tileset is not None:
             self.tileset = tileset
         if image_name is not None:
+            self.image_name = image_name
             self.image = self.load_image(image_name, mutators=mutators)
 
     def load_image(self, image_name, mutators=()):
@@ -95,10 +101,16 @@
         self.rect = self.image.get_rect().move(tile_sizify(tile_pos))
 
     def get_variant(self, top, bottom, left, right):
-        if (self.variants_class is not None) and (self.variants is None):
+        if self.variants is None:
             self.variants = self.variants_class(self.image_name)
         return self.variants(top, bottom, left, right)
 
+    def use_variant(self, *args):
+        self.image = self.load_image(*self.get_variant(*args))
+
+    def get_solid(self, snake_mutations):
+        return self.solid
+
 
 class TileSprite(BaseSprite):
     def __init__(self, tileset, **kw):
@@ -122,6 +134,9 @@
         kw.setdefault('image_name', image_name)
         super(DoorSprite, self).__init__(**kw)
 
+    def get_solid(self, snake_mutations):
+        return self.colour in self.snake_mutations
+
 
 class EntrySprite(SingleImageTileSprite):
     image_name = 'entrance-1'