view mamba/level.py @ 71:58557a89ec86

Some tile improvements and stuff.
author Jeremy Thurgood <firxen@gmail.com>
date Sun, 11 Sep 2011 17:51:43 +0200
parents cd5ad2c45e2d
children c8d6ca296884
line wrap: on
line source

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

from pygame.surface import Surface
from pygame.sprite import RenderUpdates

from mamba.data import load_file
from mamba.sprites import (tile_sizify, TileSprite, BaseSprite, DoorSprite,
                           EntrySprite, ExitSprite, PuddleSprite)


TILE_MAP = {
    '.': None,
    'X': (TileSprite, 'wall'),
    'R': (DoorSprite, 'red'),
    'B': (DoorSprite, 'blue'),
    'e': (EntrySprite,),
    'E': (ExitSprite,),
    '~': (PuddleSprite,),
    }

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 = {}
        self.floor = TileSprite(self.name, 'floor').image
        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)]
        self.make_background()

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

    def get_size(self):
        x, y = self.get_tile_size()
        return tile_sizify((x, y))

    def make_background(self):
        sx, sy = self.get_tile_size()
        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)]