Mercurial > fife-parpg
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>