changeset 81:c8d6ca296884

Better level entry points.
author Jeremy Thurgood <firxen@gmail.com>
date Sun, 11 Sep 2011 18:35:39 +0200
parents 679d9bbe2683
children 136d96b1aa75
files data/levels/dev.txt mamba/level.py mamba/sprites.py mamba/widgets/level.py
diffstat 4 files changed, 37 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/data/levels/dev.txt	Sun Sep 11 18:34:37 2011 +0200
+++ b/data/levels/dev.txt	Sun Sep 11 18:35:39 2011 +0200
@@ -1,6 +1,6 @@
 lab
 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
-X...~....e.............................X
+X...~....E.............................X
 X..~~~.................................X
 X......................................X
 X...XXX................................X
@@ -27,5 +27,5 @@
 X......................................X
 X......................................X
 X......................................X
-XE.....................................X
+X^.....................................X
 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
--- a/mamba/level.py	Sun Sep 11 18:34:37 2011 +0200
+++ b/mamba/level.py	Sun Sep 11 18:35:39 2011 +0200
@@ -10,12 +10,19 @@
                            EntrySprite, ExitSprite, PuddleSprite)
 
 
+class InvalidMapError(Exception):
+    pass
+
+
 TILE_MAP = {
     '.': None,
     'X': (TileSprite, 'wall'),
     'R': (DoorSprite, 'red'),
     'B': (DoorSprite, 'blue'),
-    'e': (EntrySprite,),
+    '^': (EntrySprite, 'up'),
+    'v': (EntrySprite, 'down'),
+    '<': (EntrySprite, 'left'),
+    '>': (EntrySprite, 'right'),
     'E': (ExitSprite,),
     '~': (PuddleSprite,),
     }
@@ -66,12 +73,26 @@
         tileset_name = level_data.readline().strip()
         self.tileset = Tileset(tileset_name)
         tiles_ascii = level_data.readlines()
-        self.tilegroup = RenderUpdates()
-        self.tiles = [[self.tileset.get_tile(tile, (x, y), self.tilegroup)
-                       for x, tile in enumerate(row.strip())]
-                      for y, row in enumerate(tiles_ascii)]
+        self.setup_tiles(tiles_ascii)
         self.make_background()
 
+    def setup_tiles(self, tiles_ascii):
+        self.sprites = RenderUpdates()
+        self.tiles = []
+        self.entry = None
+        for y, row in enumerate(tiles_ascii):
+            tile_row = []
+            for x, tile_char in enumerate(row.strip()):
+                tile = self.tileset.get_tile(tile_char, (x, y), self.sprites)
+                tile_row.append(tile)
+                if isinstance(tile, EntrySprite):
+                    if self.entry is not None:
+                        raise InvalidMapError("Too many entry points.")
+                    self.entry = tile
+            self.tiles.append(tile_row)
+        if self.entry is None:
+            raise InvalidMapError("Not enough entry points.")
+
     def get_tile_size(self):
         return (len(self.tiles[0]), len(self.tiles))
 
@@ -84,3 +105,6 @@
         self.background = Surface(self.get_size())
         [self.background.blit(self.tileset.floor, tile_sizify((x, y)))
          for x in range(sx) for y in range(sy)]
+
+    def get_entry(self):
+        return (self.entry.tile_pos, self.entry.direction)
--- a/mamba/sprites.py	Sun Sep 11 18:34:37 2011 +0200
+++ b/mamba/sprites.py	Sun Sep 11 18:35:39 2011 +0200
@@ -24,6 +24,7 @@
         self.image = load_image('tiles/%s/%s.png' % (tileset, image_name))
 
     def set_tile_pos(self, tile_pos):
+        self.tile_pos = tile_pos
         self.rect = self.image.get_rect().move(tile_sizify(tile_pos))
 
 
@@ -46,9 +47,12 @@
 
 
 class EntrySprite(SingleImageTileSprite):
-    # image_name = 'entry'
     image_name = 'puddle-r'
 
+    def __init__(self, tileset_name, direction, *groups):
+        self.direction = direction
+        super(EntrySprite, self).__init__(tileset_name, direction)
+
 
 class ExitSprite(SingleImageTileSprite):
     # image_name = 'exit'
--- a/mamba/widgets/level.py	Sun Sep 11 18:34:37 2011 +0200
+++ b/mamba/widgets/level.py	Sun Sep 11 18:35:39 2011 +0200
@@ -11,7 +11,7 @@
 
     def draw(self, surface):
         surface.blit(self.level.background, (0, 0))
-        self.level.tilegroup.draw(surface)
+        self.level.sprites.draw(surface)
 
     def event(self, event):
         # TODO: Implement