view mamba/level.py @ 57:cd5ad2c45e2d

Minor level fiddlery.
author Jeremy Thurgood <firxen@gmail.com>
date Sun, 11 Sep 2011 16:19:05 +0200
parents e730ec8b82e8
children 58557a89ec86
line wrap: on
line source

"""
Level for our shiny game.
"""

from pygame.sprite import RenderUpdates

from mamba.data import load_file
from mamba.sprites import tile_sizify, TileSprite, BaseSprite, DoorSprite


TILE_MAP = {
    '.': None,
    'X': (TileSprite, 'randomtile'),
    'R': (DoorSprite, 'red'),
    'B': (DoorSprite, 'blue'),
    }

THING_MAP = {
    'a': (BaseSprite, 'snake/snake-head-r'),
    }


class Tileset(object):
    def __init__(self, tileset_name):
        self.name = tileset_name
        self.load_tiles()

    def load_tiles(self):
        self.tiles = {}
        for name, value in TILE_MAP.items():
            if value is not None:
                value = (value[0], self.name) + value[1:]
            self.tiles[name] = value
        self.tiles.update(THING_MAP)

    def __getitem__(self, key):
        tilespec = self.tiles[key]
        if not tilespec:
            return None
        return tilespec[0](*tilespec[1:])

    def get_tile(self, key, tile_pos, *groups):
        tile = self[key]
        if tile:
            tile.add(*groups)
            tile.set_tile_pos(tile_pos)
        return tile


class Level(object):
    def __init__(self, level_name):
        self.level_name = level_name
        self.load_level_data()

    def load_level_data(self):
        """
        This file format is potentially yucky.
        """
        level_data = load_file('levels/%s.txt' % (self.level_name,))
        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)]

    def get_size(self):
        return tile_sizify((len(self.tiles[0]), len(self.tiles)))