Mercurial > nagslang
diff nagslang/level.py @ 145:0c49627920eb
Load game objects from level.
author | Jeremy Thurgood <firxen@gmail.com> |
---|---|
date | Mon, 02 Sep 2013 23:05:25 +0200 |
parents | d1f543ff0805 |
children | 06c681ff53aa |
line wrap: on
line diff
--- a/nagslang/level.py Mon Sep 02 22:40:14 2013 +0200 +++ b/nagslang/level.py Mon Sep 02 23:05:25 2013 +0200 @@ -1,6 +1,7 @@ import pygame import pygame.locals as pgl +from nagslang import game_object as go from nagslang.resources import resources from nagslang.yamlish import load, dump @@ -26,16 +27,40 @@ self._tile_image = None self._surface = None self._exterior = False + self._glue = go.PuzzleGlue() + self._drawables = [] - def load(self): + def _get_data(self): + # For overriding in tests. with resources.get_file('levels', self.name) as f: - data = load(f) + return load(f) + + def load(self, space): + data = self._get_data() self.x, self.y = data['size'] self.base_tile = data['base_tile'] for i, points in data['polygons'].iteritems(): self.polygons[i] = [] for point in points: self.polygons[i].append(tuple(point)) + for game_object_dict in data.get('game_objects', []): + self._create_game_object(space, **game_object_dict) + + def _create_game_object(self, space, classname, args, name=None): + # We should probably build a registry of game objects or something. + # At least this is better than just calling `eval`, right? + cls = getattr(go, classname) + if issubclass(cls, go.Puzzler): + gobj = cls(*args) + elif issubclass(cls, go.GameObject): + gobj = cls(space, *args) + self._drawables.append(gobj) + else: + raise TypeError( + "Expected a subclass of Puzzler or GameObject, got %s" % ( + classname)) + if name is not None: + self._glue.add_component(name, gobj) def all_closed(self): """Check if all the polygons are closed""" @@ -80,6 +105,9 @@ def get_walls(self): return self.polygons.values() + def get_drawables(self): + return self._drawables + def _draw_walls(self): for index, polygon in self.polygons.items(): color = POLY_COLORS[index]