# HG changeset patch # User Jeremy Thurgood # Date 1315854855 -7200 # Node ID b292370c4548b3279efb1180ea423899204ee9f8 # Parent 525fe7b7da8030e6dda4c2242710efa2195bd560 Rearranged the orientation stuff. :-) diff -r 525fe7b7da80 -r b292370c4548 data/levels/dev.txt --- 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 diff -r 525fe7b7da80 -r b292370c4548 mamba/level.py --- 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 diff -r 525fe7b7da80 -r b292370c4548 mamba/sprites.py --- 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'