commit:91c385ebe24eebf695c24551b1dfdf2621c660c4
author:Chip Black
committer:Chip Black
date:Sun Jul 27 01:50:49 2008 -0500
parents:cb02405151e70406179dd232d7e6e40a10fd9393
Begun YAML-based loading system
diff --git a/Richter/Level.py b/Richter/Level.py
line changes: +66/-0
index 0000000..2c5671f
--- /dev/null
+++ b/Richter/Level.py
@@ -0,0 +1,66 @@
+import os
+import imp
+import yaml
+from Collage import Collage
+from Surface import SurfaceSet
+from Stage import Stage, Layer
+
+classpath = ['classes', 'Richter']
+
+def findClass(classname):
+	"A fun bit of metaprogramming, loading a class based on its name"
+	mod = imp.find_module(classname, classpath)
+	try:
+		c = imp.load_module(classname, *mod)
+		mod[0].close()
+		return eval("c.%s" % classname)
+	finally:
+		mod[0].close()
+
+
+class Level:
+	def __init__(self, dir):
+		self.env = {}
+		self.load(dir)
+
+
+	def load(self, dir):
+		f = open(os.path.join(dir, 'level.yaml'), 'r')
+		layers = yaml.safe_load(f)
+		f.close()
+
+		self.stage = Stage()
+
+		for layer in layers:
+			print layer
+			collage = None
+			surfaces = None
+			scale = 1.0
+			parallax = 1.0
+
+			print 'Name:', layer['name']
+			if layer.has_key('collage'):
+				collage = Collage(os.path.join(dir, 'collages', layer['collage']))
+			if layer.has_key('surfaces'):
+				surfaces = SurfaceSet(os.path.join(dir, 'surfaces', layer['surfaces']))
+			if layer.has_key('properties'):
+				if layer['properties'].has_key('scale'):
+					scale = layer['properties']['scale']
+				if layer['properties'].has_key('parallax'):
+					parallax = layer['properties']['parallax']
+
+			new_layer = Layer(collage, surfaces, scale, parallax)
+			self.stage.addLayerBack(new_layer)
+
+			if layer.has_key('things'):
+				self.compileThings(new_layer, layer['things'])
+
+
+	def compileThings(self, layer, things):
+		for (name, t) in things.iteritems():
+			c = findClass(t['class'])
+			properties = {}
+			if t.has_key('properties'):
+				properties = t['properties']
+			self.env[name] = c(**properties)
+			layer.add(self.env[name])