changeset 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 79d5741fada6
children d0bce896a526
files demos/rpg/maps/allobjects.xml demos/rpg/scripts/actors/baseactor.py demos/rpg/scripts/actors/player.py demos/rpg/scripts/gamecontroller.py demos/rpg/scripts/objects/baseobject.py demos/rpg/scripts/scene.py demos/rpg/settings-dist.xml
diffstat 7 files changed, 126 insertions(+), 54 deletions(-) [+]
line wrap: on
line diff
--- a/demos/rpg/maps/allobjects.xml	Fri May 28 14:49:43 2010 +0000
+++ b/demos/rpg/maps/allobjects.xml	Fri May 28 14:52:56 2010 +0000
@@ -1,8 +1,9 @@
 <?xml version='1.0' encoding='UTF-8'?>
 <Settings>
   <Module name="models">
-    <Setting name="GoldStack" type="dict"> type : ITEM ; model : goldstack </Setting>
-    <Setting name="Quiller" type="dict"> type : QUESTGIVER ; model : warrior </Setting>
+    <Setting name="Player" type="dict"> type : ITEM ; file : objects/actors/player/warrior/object.xml ; model : goldstack </Setting>
+    <Setting name="GoldStack" type="dict"> type : ITEM ; file : objects/items/goldstack/object.xml ; model : goldstack </Setting>
+    <Setting name="Quiller" type="dict"> type : QUESTGIVER ; file : objects/actors/player/warrior/object.xml ; model : warrior </Setting>
   </Module>
   
    <Module name="Quiller">
--- a/demos/rpg/scripts/actors/baseactor.py	Fri May 28 14:49:43 2010 +0000
+++ b/demos/rpg/scripts/actors/baseactor.py	Fri May 28 14:52:56 2010 +0000
@@ -64,6 +64,15 @@
 				self._dest.instance.say("I've got nothing for you...  leave me alone.", 2500)
 		else:
 			self._dest.instance.say("Hello there!")
+			
+class PickUpItemAction(BaseAction):
+	def __init__(self, actor, item):
+		self._actiontype = Actions['PICKUP']
+		self._actor = actor
+		self._item = item
+		
+	def execute(self):
+		self._actor.pickUpItem(self._item)
 
 ActorStates = {'STAND':0,
 			   'WALK':1,
@@ -106,6 +115,15 @@
 		if self._nextaction:
 			self._nextaction.execute()
 			self._nextaction = None
+			
+	def pickUpItem(self, item):
+		self._inventory.append(item)
+		
+		#removes it from FIFE (to stop rendering the item)
+		item.destroy()
+		
+		#remove it from the scene
+		del self._gamecontroller.scene.objectlist[item.id]
 		
 	def _getState(self):
 		return self._state
--- a/demos/rpg/scripts/actors/player.py	Fri May 28 14:49:43 2010 +0000
+++ b/demos/rpg/scripts/actors/player.py	Fri May 28 14:52:56 2010 +0000
@@ -48,4 +48,4 @@
 		
 		self._playeractionlistener = PlayerActionListener(self._gamecontroller, self)
 		
-
+		self._inventory = []
--- a/demos/rpg/scripts/gamecontroller.py	Fri May 28 14:49:43 2010 +0000
+++ b/demos/rpg/scripts/gamecontroller.py	Fri May 28 14:52:56 2010 +0000
@@ -33,7 +33,7 @@
 
 from scripts.scene import Scene
 from scripts.guicontroller import GUIController
-from scripts.actors.baseactor import TalkAction
+from scripts.actors.baseactor import TalkAction, PickUpItemAction
 from scripts.objects.baseobject import GameObjectTypes
 
 
@@ -91,12 +91,20 @@
 		if (event.getButton() == fife.MouseEvent.LEFT):
 			self._lastmousepos = (clickpoint.x, clickpoint.y)
 			self._gamecontroller.scene.player.walk( self._gamecontroller.scene.getLocationAt(clickpoint) )
-			instances = self._gamecontroller.scene.getInstancesAt(clickpoint)
-			if instances:
-				obj = self._gamecontroller.scene.objectlist[instances[0].getId()]
+			actor_instances = self._gamecontroller.scene.getInstancesAt(clickpoint, self._gamecontroller.scene.actorlayer)
+			item_instances = self._gamecontroller.scene.getInstancesAt(clickpoint, self._gamecontroller.scene.itemlayer)
+			if actor_instances:
+				obj = self._gamecontroller.scene.objectlist[actor_instances[0].getId()]
 				if obj.type == GameObjectTypes["QUESTGIVER"]:
 					action = TalkAction(self._gamecontroller.scene.player, obj)
 					self._gamecontroller.scene.player.nextaction = action
+			
+			if item_instances:
+				obj = self._gamecontroller.scene.objectlist[item_instances[0].getId()]
+				if obj.type == GameObjectTypes["ITEM"]:
+					action = PickUpItemAction(self._gamecontroller.scene.player, obj)
+					self._gamecontroller.scene.player.nextaction = action
+					
 
 		if (event.getButton() == fife.MouseEvent.RIGHT):
 			instances = self._gamecontroller.scene.getInstancesAt(clickpoint)
@@ -116,10 +124,13 @@
 			return
 
 		pt = fife.ScreenPoint(event.getX(), event.getY())
-		instances = self._gamecontroller.scene.getInstancesAt(pt);
-
-		for i in instances:
+		actor_instances = self._gamecontroller.scene.getInstancesAt(pt, self._gamecontroller.scene.actorlayer)
+		item_instances = self._gamecontroller.scene.getInstancesAt(pt, self._gamecontroller.scene.itemlayer)
+		for i in actor_instances:
 			renderer.addOutlined(i, 173, 255, 47, 2)
+			
+		for j in item_instances:
+			renderer.addOutlined(j, 173, 255, 47, 2)
 
 	def mouseEntered(self, event):
 		pass
@@ -197,9 +208,6 @@
 		if self._scene:
 			self._scene.destroyScene()
 			self._scene = None
-			
-		loadImportFile("objects/actors/player/warrior/object.xml", self._engine)
-		loadImportFile("objects/items/goldstack/object.xml", self._engine)
 		
 		self._scene = Scene(self)
 		self._scene.createScene(self._settings.get("RPG", "TownMapFile", "maps/town.xml"))
--- a/demos/rpg/scripts/objects/baseobject.py	Fri May 28 14:49:43 2010 +0000
+++ b/demos/rpg/scripts/objects/baseobject.py	Fri May 28 14:52:56 2010 +0000
@@ -132,6 +132,10 @@
 	def _getType(self):
 		return self._type
 	
+	def _getId(self):
+		return self._id
+	
 	location = property(_getLocation, _setLocation)
 	instance = property(_getInstance)
 	type = property(_getType)
+	id = property(_getId)
--- 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):
 		"""
--- a/demos/rpg/settings-dist.xml	Fri May 28 14:49:43 2010 +0000
+++ b/demos/rpg/settings-dist.xml	Fri May 28 14:52:56 2010 +0000
@@ -24,6 +24,7 @@
 
 	<Module name="RPG">
 		<Setting name="TownMapFile" type="str"> maps/town.xml </Setting>
+		<Setting name="AllObjectFile" type="str"> maps/allobjects.xml </Setting>
 		<Setting name="Level1MapFile" type="str"> maps/level1.xml </Setting>
 		<Setting name="DefaultCameraName" type="str"> camera1 </Setting>
 		<Setting name="DefaultZoom" type="float"> 2.0 </Setting>