comparison src/parpg/gamemodel.py @ 118:29869273f9e1

Fixed moving between maps.
author KarstenBock@gmx.net
date Mon, 26 Sep 2011 15:44:42 +0200
parents 9b5498e3bda0
children 3564a46544bc
comparison
equal deleted inserted replaced
117:b10de0310771 118:29869273f9e1
29 from common.utils import locateFiles 29 from common.utils import locateFiles
30 from common.utils import parseBool 30 from common.utils import parseBool
31 from parpg.dialogueparsers import YamlDialogueParser, DialogueFormatError 31 from parpg.dialogueparsers import YamlDialogueParser, DialogueFormatError
32 from parpg.entities import createEntity 32 from parpg.entities import createEntity
33 from parpg import behaviours 33 from parpg import behaviours
34 from parpg import components
34 from parpg.components import fifeagent, container, equip 35 from parpg.components import fifeagent, container, equip
35 36
36 try: 37 try:
37 import xml.etree.cElementTree as ElementTree 38 import xml.etree.cElementTree as ElementTree
38 except ImportError: 39 except ImportError:
396 new_map = GameMap(self.engine, self) 397 new_map = GameMap(self.engine, self)
397 self.game_state.maps[map_name] = new_map 398 self.game_state.maps[map_name] = new_map
398 new_map.load(map_file) 399 new_map.load(map_file)
399 400
400 def createAgent(self, agent, inst_id, world): 401 def createAgent(self, agent, inst_id, world):
401 entity_data = agent["Entity"] 402 entity_data = deepcopy(agent["Entity"])
402 if agent.has_key("Template"): 403 if agent.has_key("Template"):
403 entity_data = self.checkAttributes(entity_data, agent["Template"]) 404 entity_data = self.checkAttributes(entity_data, agent["Template"])
404 object_id = agent["Entity"]["fifeagent"]["gfx"] \ 405 object_id = entity_data["fifeagent"]["gfx"] \
405 if agent["Entity"]["fifeagent"].has_key("gfx") \ 406 if entity_data["fifeagent"].has_key("gfx") \
406 else "generic_item" 407 else "generic_item"
407 map_obj = self.fife_model.getObject(str(object_id), "PARPG") 408 map_obj = self.fife_model.getObject(str(object_id), "PARPG")
408 if not map_obj: 409 if not map_obj:
409 logging.warning("Object with inst_id={0}, ns=PARPG, " 410 logging.warning("Object with inst_id={0}, ns=PARPG, "
410 "could not be found. " 411 "could not be found. "
411 "Omitting...".format(str(obj_id))) 412 "Omitting...".format(str(object_id)))
412 413
413 x_pos = agent["Position"][0] 414 x_pos = agent["Position"][0]
414 y_pos = agent["Position"][1] 415 y_pos = agent["Position"][1]
415 z_pos = agent["Position"][2] if len(agent["Position"]) == 3 \ 416 z_pos = agent["Position"][2] if len(agent["Position"]) == 3 \
416 else 0.0 417 else 0.0
597 self.game_state.addObject(obj.general.identifier, self.game_state.current_map_name, obj) 598 self.game_state.addObject(obj.general.identifier, self.game_state.current_map_name, obj)
598 else: 599 else:
599 # yes, use the current game state data 600 # yes, use the current game state data
600 obj.fifeagent.pos.X = ref.X 601 obj.fifeagent.pos.X = ref.X
601 obj.fifeagent.pos.Y = ref.Y 602 obj.fifeagent.pos.Y = ref.Y
602 obj.fifeagent.gfx = ref.gfx 603 obj.fifeagent.gfx = ref.gfx
603 604
604 if obj.fifeagent.behaviour: 605 if obj.fifeagent.behaviour:
605 obj.fifeagent.behaviour.parent = obj 606 obj.fifeagent.behaviour.parent = obj
606 fifeagent.setup_behaviour(obj.fifeagent) 607 fifeagent.setup_behaviour(obj.fifeagent)
607 obj.fifeagent.behaviour.speed = self.settings.parpg.PCSpeed 608 obj.fifeagent.behaviour.speed = self.settings.parpg.PCSpeed
654 database_file = vfs.VFS.open(self.object_db_file) 655 database_file = vfs.VFS.open(self.object_db_file)
655 database = yaml.load_all(database_file) 656 database = yaml.load_all(database_file)
656 for object_info in database: 657 for object_info in database:
657 self.object_db.update(object_info) 658 self.object_db.update(object_info)
658 659
660 def updateObjectDB(self, world):
661 """Updates the values in the object database with the worlds values"""
662
663 for entity in world.entities:
664 identifier = entity.general.identifier
665 agent_data = {}
666 map_id = self.game_state.getMapOfObject(identifier)
667 if not map_id:
668 continue
669 if self.agents[self.ALL_AGENTS_KEY].has_key(identifier):
670 agent_data = self.agents[self.ALL_AGENTS_KEY][identifier]
671 else:
672 agent_data = self.agents[map_id][identifier]
673
674 entity_data = {}
675 entity_data["general"] = {"identifier": identifier}
676 for name, component in components.components.iteritems():
677 if hasattr(entity, name):
678 comp_data = {}
679 if name == "fifeagent":
680 if agent_data["Entity"].has_key("fifeagent"):
681 comp_data = agent_data["Entity"]["fifeagent"]
682 if entity.fifeagent.layer:
683 layer = entity.fifeagent.layer
684 inst = layer.getInstance(identifier)
685 loc = inst.getLocation().getExactLayerCoordinates()
686 agent_data["Position"] = (loc.x, loc.y, loc.z)
687 agent_data["Map"] = map_id
688 agent_data["Rotation"] = inst.getRotation()
689 elif name == "container":
690 #TODO: Save Inventory
691 pass
692 elif name == "equip":
693 #TODO: Save Equipment
694 pass
695 else:
696 comp_vals = getattr(entity, name)
697 for field in component.fields:
698 try:
699 comp_data[field] = getattr(comp_vals, field)
700 except AttributeError:
701 #The entity doesn't have this specific value,
702 #ignore it
703 pass
704 entity_data[name] = comp_data
705 agent_data["Entity"] = entity_data
706
707
659 def getAgentImportFiles(self): 708 def getAgentImportFiles(self):
660 """Searches the agents directory for import files """ 709 """Searches the agents directory for import files """
661 filepaths = locateFiles("*.xml", self.objects_directory) 710 filepaths = locateFiles("*.xml", self.objects_directory)
662 for filepath in filepaths: 711 for filepath in filepaths:
663 try: 712 try: