diff src/parpg/gamemodel.py @ 88:d89e88a90c9e

Implemented creation of dynamic entities.
author KarstenBock@gmx.net
date Sun, 18 Sep 2011 16:26:12 +0200
parents 1e7465a785c4
children 0f659c7675f6
line wrap: on
line diff
--- a/src/parpg/gamemodel.py	Sun Sep 18 16:07:07 2011 +0200
+++ b/src/parpg/gamemodel.py	Sun Sep 18 16:26:12 2011 +0200
@@ -98,20 +98,15 @@
                                           self.engine.getVFS() 
                                           )
 
-    def checkAttributes(self, attributes):
+    def checkAttributes(self, attributes, template):
         """Checks for attributes that where not given in the map file
         and fills them with values from the object database
-        @param attributes: attributes to check
+        @param attributes: attributes to check        
         @type attributes: Dictionary
+        @param template: Template from which the values will be used
         @return: The modified attributes""" 
-        if attributes.has_key("object_type"):
-            class_name = attributes.pop("object_type")
-        else:
-            class_name = attributes["type"]
-        if not attributes.has_key("type"):
-            attributes["type"] = class_name
-        if self.object_db.has_key(class_name):
-            db_attributes = deepcopy(self.object_db[class_name])
+        if self.object_db.has_key(template):
+            db_attributes = deepcopy(self.object_db[template])
             for key in db_attributes.keys():
                 if attributes.has_key(key):
                     attributes[key] = attributes[key] or db_attributes[key]
@@ -158,7 +153,6 @@
         # create the extra data
         extra = {}
         extra['controller'] = self
-        attributes = self.checkAttributes(attributes)
         
         info = {}
         info.update(attributes)
@@ -386,14 +380,11 @@
         agent[unique_agent_id] = agent_values
         self.agents[namespace].update(agent)
         object_model = ""
-        if agent_values.has_key("ObjectModel"): 
-            object_model =  agent_values["ObjectModel"]
-        elif agent_values["ObjectType"] == "MapItem":
-            object_data = self.object_db[agent_values["ItemType"]]
-            object_model = object_data["gfx"] if object_data.has_key("gfx") \
-                        else "generic_item"
+        if agent_values["Entity"].has_key("fifeagent") \
+           and agent_values["Entity"]["fifeagent"].has_key("gfx"): 
+            object_model = agent_values["Entity"]["fifeagent"]["gfx"]
         else:
-            object_model = self.object_db[agent_values["ObjectType"]]["gfx"]
+            object_model = self.object_db[agent_values["Template"]]["fifeagent"]["gfx"]
         import_file = self.agent_import_files[object_model]
         loadImportFile(self.obj_loader, import_file, self.engine)
         
@@ -454,17 +445,12 @@
             new_map.load(map_file)    
 
     def createAgent(self, agent, inst_id, world):
-        object_type = agent["ObjectType"]
-        object_id = agent["ObjectModel"] \
-                                if agent.has_key("ObjectModel") \
-                                else None
-        if object_id == None:
-            if object_type == "MapItem":
-                object_data = self.object_db[agent["ItemType"]]
-                object_id = object_data["gfx"] if object_data.has_key("gfx") \
-                            else "generic_item"
-            else:
-                object_id = self.object_db[object_type]["gfx"]
+        entity_data = agent["Entity"]
+        if agent.has_key("Template"):
+            entity_data = self.checkAttributes(entity_data, agent["Template"])
+        object_id = agent["Entity"]["fifeagent"]["gfx"] \
+                                if agent["Entity"]["fifeagent"].has_key("gfx") \
+                                else "generic_item"
         map_obj = self.fife_model.getObject(str(object_id), "PARPG")
         if not map_obj:
             logging.warning("Object with inst_id={0}, ns=PARPG, "
@@ -474,7 +460,6 @@
         x_pos = agent["Position"][0]
         y_pos = agent["Position"][1]
         z_pos = agent["Position"][2] if len(agent["Position"]) == 3 \
-                                        else -0.1 if object_type == "MapItem" \
                                         else 0.0  
         stack_pos = agent["Stackposition"] if \
                         agent.has_key("StackPosition") \
@@ -496,65 +481,19 @@
 
         if (map_obj.getAction('default')):
             target = fife.Location(self.active_map.agent_layer)
-            inst.act('default', target, True)
+            inst.act('default', target, True)        
+
             
-        inst_dict = {}
-        inst_dict["identifier"] = inst_id
-        inst_dict["world"]= world
-        inst_dict["type"] = object_type
-        inst_dict["gfx"] = object_id
-        if agent.has_key("Open"):
-            inst_dict["is_open"] = parseBool(agent["Open"])
-        if agent.has_key("Locked"):
-            inst_dict["locked"] = parseBool(agent["Locked"])
-        if agent.has_key("ViewName"):
-            inst_dict["view_name"] = agent["ViewName"]
-            inst_dict["real_name"] = agent["RealName"] \
-                     if agent.has_key("RealName") else agent["ViewName"]
-        if agent.has_key("Text"):
-            inst_dict["desc"] = agent["Text"]
+        entity_data["fifeagent"]["identifier"] = inst_id
+        if entity_data["fifeagent"].has_key("behaviour"):
+            entity_data["fifeagent"]["behaviour"] = getattr(behaviours, entity_data["fifeagent"]["behaviour"])()
+        else:
+            entity_data["fifeagent"]["behaviour"] = behaviours.Base()
         if self.dialogues.has_key(inst_id):
-            inst_dict["dialogue"] = self.dialogues[inst_id]
-        if agent.has_key("TargetMap"):
-            inst_dict["target_map_name"] = agent["TargetMap"]
-        if agent.has_key("TargetPosition"):
-            inst_dict["target_x"] = agent["TargetPosition"][0]
-            inst_dict["target_y"] = agent["TargetPosition"][1]
-        if agent.has_key("Inventory"):
-            #TODO: Fix setting of inventory
-            #inventory = Inventory()
-            #inventory_objs = agent["Inventory"]
-            #for inventory_obj in inventory_objs:
-            #    self.createInventoryObject(inventory,
-            #                               inventory_obj 
-            #                               )
-            #inst_dict["inventory"] = inventory
-            pass
-
-        if agent.has_key("Items"):
-            container_objs = agent["Items"]
-            #TODO: Create inventory items
-            items = []#self.createContainerItems(container_objs)
-            inst_dict["items"] = items
-            
-        if agent.has_key("ItemType"):
-            if not agent.has_key("item"):
-                item_data = {}
-                item_data["type"] = agent["ItemType"]
-                item_data["ID"] = inst_id 
-                #TODO item_data = self.createContainerObject(item_data)
-            else:
-                item_data = agent["item"]
-            inst_dict["item"] = item_data
-            inst_dict["item_type"] = agent["ItemType"]
-        if agent.has_key("Behaviour"):
-            inst_dict["behaviour"] = getattr(behaviours, agent["Behaviour"])()
-        #TODO: Add real statistics and bulk
-        if object_type == "Character":
-            inst_dict["statistics"] = {}
-            inst_dict["max_bulk"] = 100
-
-        self.createMapObject(self.active_map.agent_layer, inst_dict)
+            entity_data["dialogue"] = {}
+            entity_data["dialogue"]["dialogue"] = self.dialogues[inst_id]
+        
+        self.createMapObject(self.active_map.agent_layer, entity_data, world)
     
     def placeAgents(self, world):
         """Places the current maps agents """
@@ -618,7 +557,7 @@
         self.active_map.makeActive()
         self.game_state.current_map_name = map_name
 
-    def createMapObject (self, layer, attributes):
+    def createMapObject (self, layer, attributes, world):
         """Create an object and add it to the current map.
            @type layer: fife.Layer
            @param layer: FIFE layer object exists in
@@ -630,13 +569,12 @@
         # create the extra data
         extra = {}
         if layer is not None:
-            extra['layer'] = layer
-        attributes = self.checkAttributes(attributes)
+            extra['fifeagent'] = {}
+            extra['fifeagent']['layer'] = layer
         
-        obj_type = attributes["type"]
-        obj = createEntity(attributes, extra)
+        obj = createEntity(attributes, world, extra)
         if obj:
-            self.addObject(layer, obj, obj_type) 
+            self.addObject(layer, obj) 
 
     def addPC(self, layer, player_char):
         """Add the PlayerCharacter to the map
@@ -655,7 +593,7 @@
         self.game_state.getObjectById("PlayerCharacter").fifeagent.behaviour.speed = self.settings.parpg.PCSpeed
 
 
-    def addObject(self, layer, obj, obj_type):
+    def addObject(self, layer, obj):
         """Adds an object to the map.
            @type layer: fife.Layer
            @param layer: FIFE layer object exists in
@@ -675,7 +613,7 @@
             obj.fifeagent.pos.Y = ref.Y
             obj.fifeagent.gfx = ref.gfx  
              
-        if obj_type == "Character":
+        if obj.fifeagent.behaviour:
             obj.fifeagent.behaviour.parent = obj
             fifeagent.setup_behaviour(obj.fifeagent)
             obj.fifeagent.behaviour.speed = self.settings.parpg.PCSpeed