# HG changeset patch # User Simon Cross # Date 1316035705 -7200 # Node ID e4f983b68ef5c5a027a473e3f4d4188d5a8e8382 # Parent b0ef7eecc67ad332264a50c22d8960b6eaccd2b6 Start of advanced sprite definitions. diff -r b0ef7eecc67a -r e4f983b68ef5 data/Level_Format.txt --- 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: + (, ): - + and give the starting tile position. + is looked up in mamba.sprites. + is a means for other sprites to lookup the sprite. + .. are string arguments to the sprite constructor. diff -r b0ef7eecc67a -r e4f983b68ef5 data/levels/dev.txt --- 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 diff -r b0ef7eecc67a -r e4f983b68ef5 mamba/level.py --- 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() diff -r b0ef7eecc67a -r e4f983b68ef5 mamba/sprites.py --- 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'