changeset 230:e4f983b68ef5

Start of advanced sprite definitions.
author Simon Cross <hodgestar@gmail.com>
date Wed, 14 Sep 2011 23:28:25 +0200
parents b0ef7eecc67a
children bf7bf54ed6ff
files data/Level_Format.txt data/levels/dev.txt mamba/level.py mamba/sprites.py
diffstat 4 files changed, 64 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/data/Level_Format.txt	Wed Sep 14 23:07:56 2011 +0200
+++ b/data/Level_Format.txt	Wed Sep 14 23:28:25 2011 +0200
@@ -5,7 +5,14 @@
 Level name
 Tileset name
 Map data as a grid of ascii characters
+"end"
+Advanced sprite definitions
 
+Advanced sprite definitions consist of:
 
+  (<x>, <y>): <SpriteClassName> <id> <arg1> <arg2>
 
-
+<x> and <y> give the starting tile position.
+<SpriteClassName> is looked up in mamba.sprites.
+<id> is a means for other sprites to lookup the sprite.
+<arg1> .. <argN> are string arguments to the sprite constructor.
--- a/data/levels/dev.txt	Wed Sep 14 23:07:56 2011 +0200
+++ b/data/levels/dev.txt	Wed Sep 14 23:28:25 2011 +0200
@@ -30,3 +30,6 @@
 X......................................X
 X......................................X
 XeXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+end
+10, 10: TunnelSprite t1 t2 east
+20, 10: TunnelSprite t2 t1 west
--- a/mamba/level.py	Wed Sep 14 23:07:56 2011 +0200
+++ b/mamba/level.py	Wed Sep 14 23:28:25 2011 +0200
@@ -77,7 +77,6 @@
 class Level(object):
     def __init__(self, level_name):
         self.level_name = level_name
-        self.tiles_ascii = ''
         self.load_level_data()
 
     def load_level_data(self):
@@ -89,8 +88,12 @@
         tileset_name = level_data.readline().strip()
         self.tileset = Tileset(tileset_name)
         tiles_ascii = [line.strip() for line in level_data.readlines()]
+        end = tiles_ascii.index("end")
+        sprites_ascii = tiles_ascii[end + 1:]
+        tiles_ascii = tiles_ascii[:end]
         self.tiles_ascii = tiles_ascii
-        self.setup_tiles(tiles_ascii)
+        self.sprites_ascii = sprites_ascii
+        self.setup_level(tiles_ascii, sprites_ascii)
         self.make_background()
 
     def save_level(self):
@@ -105,9 +108,16 @@
                 else:
                     save_file.write('.')
             save_file.write('\n')
+        save_file.write('end\n')
+        for sprite_ascii in self.sprites_ascii:
+            save_file.write(sprite_ascii)
+
+    def setup_level(self, tiles_ascii, sprites_ascii):
+        self.sprites = RenderUpdates()
+        self.setup_tiles(tiles_ascii)
+        self.setup_sprites(sprites_ascii)
 
     def setup_tiles(self, tiles_ascii):
-        self.sprites = RenderUpdates()
         self.tiles = []
         self.entry = None
         self.tile_size = (len(tiles_ascii[0]), len(tiles_ascii))
@@ -156,6 +166,21 @@
             orientation = self.get_tile_orientation(tile)
             tile.use_variant(*orientation)
 
+    def setup_sprites(self, sprites_ascii):
+        self.extra_sprites = []
+        for sprite_ascii in sprites_ascii:
+            pos, _sep, rest = sprite_ascii.partition(':')
+            pos = [int(x.strip()) for x in pos.split(',')]
+            class_name, rest = rest.split(None, 1)
+            args = rest.split()
+            print pos, class_name, args
+            cls = sprites.find_sprite(class_name)
+            sprite = cls(*args)
+            sprite.set_tile_pos(pos)
+            print sprite
+            self.extra_sprites.append(sprite)
+            self.sprites.add(sprite)
+
     def is_same_tile(self, tile, x, y):
         """Is there a tile of the same type?"""
         if tile.tile_char is None:
@@ -225,5 +250,5 @@
 
     def restart(self):
         """Reset the level state"""
-        self.setup_tiles(self.tiles_ascii)
+        self.setup_level(self.tiles_ascii, self.sprites_ascii)
         self.make_background()
--- a/mamba/sprites.py	Wed Sep 14 23:07:56 2011 +0200
+++ b/mamba/sprites.py	Wed Sep 14 23:28:25 2011 +0200
@@ -24,6 +24,12 @@
     return (ts_x * p_x, ts_y * p_y)
 
 
+def find_sprite(class_name):
+    cls = globals()[class_name]
+    assert isinstance(cls, type) and issubclass(cls, Sprite)
+    return cls
+
+
 class SpriteImageVariants(object):
     VARIANTS = {
         '....': ('-0', ()),
@@ -189,6 +195,24 @@
         snake.exit_level()
 
 
+class TunnelSprite(SingleImageTileSprite):
+    image_name = 'arrow-r'
+    name = 'tunnel entrance'
+    tileset = 'lab'
+
+    def __init__(self, sprite_id, other_id, direction):
+        super(TunnelSprite, self).__init__(tile_char=None)
+        self.sprite_id = sprite_id
+        self.other_id = other_id
+        self.direction = {
+            'north': UP, 'south': DOWN,
+            'east': LEFT, 'west': RIGHT,
+            }[direction]
+
+    def interact(self, snake, segment):
+        print "Warping to other entrace", self.other_id
+
+
 class PuddleSprite(SingleImageTileSprite):
     image_name = 'puddle'
     name = 'puddle'