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]