diff demos/rpg/scripts/scene.py @ 528:796d49ab9380

Cleaned up the createScene function. Items can now be picked up.
author prock@33b003aa-7bff-0310-803a-e67f0ece8222
date Fri, 28 May 2010 14:52:56 +0000
parents 19db5a8619a4
children d0bce896a526
line wrap: on
line diff
--- a/demos/rpg/scripts/scene.py	Fri May 28 14:49:43 2010 +0000
+++ b/demos/rpg/scripts/scene.py	Fri May 28 14:52:56 2010 +0000
@@ -28,6 +28,7 @@
 
 from fife import fife
 from fife.extensions.loaders import loadMapFile
+from fife.extensions.loaders import loadImportFile
 from fife.extensions.fife_settings import Setting
 
 from scripts.actors.baseactor import Actor
@@ -49,6 +50,78 @@
 		self._player = None
 		self._objectlist = {}
 
+	def loadItems(self, mapfilename):
+		"""
+		@todo: create a new function "loadItem(self, itemname)" which takes care of
+		loading an individual item in case at some point in the game you want to
+		load one at some point.
+		"""
+		mapname = os.path.splitext(os.path.basename(mapfilename))
+		objectfile = "maps/" + mapname[0] + "_objects.xml"
+		modelfile = self._gamecontroller.settings.get("RPG", "AllObjectFile", "maps/allobjects.xml")
+		
+		objectsettings = Setting(app_name="",settings_file=objectfile)
+		modelsettings = Setting(app_name="", settings_file=modelfile)
+
+		for item in objectsettings.get("items", "itemlist", []):
+			itemdict = objectsettings.get("items", item, {})
+			modeldict = modelsettings.get("models", itemdict["typename"], {})
+			
+			loadImportFile(modeldict["file"], self._gamecontroller.engine)
+			
+			if itemdict["typename"] == "GoldStack":
+				newitem = GoldStack(self._gamecontroller, modeldict["model"], item)
+				newitem.value = itemdict["value"]
+			else:
+				newitem = BaseItem(self._gamecontroller, modeldict["model"], item)
+			
+			newitem.setMapPosition(float(itemdict["posx"]), float(itemdict["posy"]))	
+			self._objectlist[newitem.instance.getId()] = newitem
+			
+	def loadActors(self, mapfilename):
+		"""
+		@todo: create a new function "loadActor(self, actorname)" which takes care of
+		loading an individual actor in case at some point in the game you want to
+		load one at some point.
+		"""
+		mapname = os.path.splitext(os.path.basename(mapfilename))
+		objectfile = "maps/" + mapname[0] + "_objects.xml"
+		modelfile = self._gamecontroller.settings.get("RPG", "AllObjectFile", "maps/allobjects.xml")
+		
+		objectsettings = Setting(app_name="",settings_file=objectfile)
+		modelsettings = Setting(app_name="", settings_file=modelfile)
+
+		for npc in objectsettings.get("npcs", "npclist", []):
+			objdict = objectsettings.get("npcs", npc, {})
+			modeldict = modelsettings.get("models", objdict["typename"], {})
+			
+			loadImportFile(modeldict["file"], self._gamecontroller.engine)
+			
+			if modeldict["type"] == "QUESTGIVER":
+				actor = QuestGiver(self._gamecontroller, modeldict["model"], npc, True)
+				questcount = modelsettings.get(npc, "questcount", 0)
+				for x in range(1,questcount+1):
+					quest = "quest" + str(x)
+					(qname, qtext) = modelsettings.get(npc, quest, [])
+					actor.addQuest(Quest(actor, qname, qtext))
+						
+			elif modeldict["type"] == "NPC":
+				actor = Actor(self._gamecontroller, modeldict["model"], npc, True)
+
+			actor.setMapPosition(float(objdict["posx"]), float(objdict["posy"]))
+			self._objectlist[actor.instance.getId()] = actor		
+		
+	def loadPlayer(self):
+		"""
+		@todo: once we have all art assets this should be able to load one of 3 player models
+		"""
+		modelfile = self._gamecontroller.settings.get("RPG", "AllObjectFile", "maps/allobjects.xml")
+		modelsettings = Setting(app_name="", settings_file=modelfile)
+		modeldict = modelsettings.get("models", "Player", {})
+	
+		loadImportFile(modeldict["file"], self._gamecontroller.engine)
+		self._player = Player(self._gamecontroller, "warrior")
+
 	def createScene(self, mapfilename):
 		if not self._map:
 			self._map = loadMapFile(mapfilename, self._gamecontroller.engine)
@@ -63,45 +136,12 @@
 		self._actorlayer = self._map.getLayer(self._gamecontroller.settings.get("RPG", "ActorLayer", "actor_layer"))
 		self._itemlayer = self._map.getLayer(self._gamecontroller.settings.get("RPG", "ItemLayer", "item_layer"))
 		
-		self._player = Player(self._gamecontroller, "warrior")
-		
-		mapname = os.path.splitext(os.path.basename(mapfilename))
-		objectfile = "maps/" + mapname[0] + "_objects.xml"
-		itemfile = "maps/allobjects.xml"
-		objectsettings = Setting(app_name="",settings_file=objectfile)
-		itemsettings = Setting(app_name="", settings_file=itemfile)
+		self.loadItems(mapfilename)
+		self.loadActors(mapfilename)		
 		
-		for item in objectsettings.get("items", "itemlist", []):
-			itemdict = objectsettings.get("items", item, {})
-			modeldict = itemsettings.get("models", itemdict["typename"])
-			
-			if itemdict["typename"] == "GoldStack":
-				newitem = GoldStack(self._gamecontroller, modeldict["model"], item)
-				#newitem.value = itemdict["value"]
-				print itemdict["value"]
-			else:
-				newitem = BaseItem(self._gamecontroller, modeldict["model"], item)
-				
-			self._objectlist[newitem.instance.getId()] = newitem
-		
-		for npc in objectsettings.get("npcs", "npclist", []):
-			objdict = objectsettings.get("npcs", npc, {})
-			modeldict = itemsettings.get("models", objdict["typename"])
-			
-			if modeldict["type"] == "QUESTGIVER":
-				actor = QuestGiver(self._gamecontroller, modeldict["model"], npc, True)
-				questcount = itemsettings.get(npc, "questcount", 0)
-				for x in range(1,questcount+1):
-					quest = "quest" + str(x)
-					(qname, qtext) = itemsettings.get(npc, quest, [])
-					actor.addQuest(Quest(actor, qname, qtext))
-						
-			elif modeldict["type"] == "NPC":
-				actor = Actor(self._gamecontroller, modeldict["model"], npc, True)
-
-			actor.setMapPosition(float(objdict["posx"]), float(objdict["posy"]))
-			self._objectlist[actor.instance.getId()] = actor
-			
+		#finally load the player
+		self.loadPlayer()
+	
 		
 	def destroyScene(self):
 		self._cameras.clear()
@@ -120,11 +160,11 @@
 		self._player = None
 		self._objectlist.clear()
 		
-	def getInstancesAt(self, clickpoint):
+	def getInstancesAt(self, clickpoint, layer):
 		"""
-		Query the main camera for instances on the actor layer.
+		Query the main camera for instances on the specified layer.
 		"""
-		return self.cameras[self._maincameraname].getMatchingInstances(clickpoint, self._actorlayer)
+		return self.cameras[self._maincameraname].getMatchingInstances(clickpoint, layer)
 
 	def getLocationAt(self, clickpoint):
 		"""