Changeset 563


Ignore:
Timestamp:
06/25/10 18:01:54 (8 years ago)
Author:
beliar
Message:

Ticket #200: Patch by Beliar.

  • Merging map_loading_change branch back into trunk

fixes[s:trac, t:200]

Location:
trunk
Files:
2 added
2 deleted
25 edited
6 copied

Legend:

Unmodified
Added
Removed
  • trunk

    • Property svn:ignore
      •  

        old new  
         1*.pyc 
         2.project 
         3.pydevproject 
        14Thumbs.db 
        2 *.pyc 
    • Property svn:mergeinfo changed
      /branches/map_loading_change (added)merged: 554-562
  • trunk/game/dialogue/quartermaster.yaml

    r504 r563  
    1515 
    1616--- 
    17 NPC: Heljq 
     17NPC: Helja 
    1818AVATAR: gui/icons/quartermaster.jpg 
    1919START: main_dialog 
  • trunk/game/local_loaders/__init__.py

    r553 r563  
    2626from traceback import print_exc 
    2727 
    28 __all__ = ('ET', 'SerializerError', 'InvalidFormat', 'WrongFileType', 
     28__all__ = ('ElementTree', 'SerializerError', 'InvalidFormat', 'WrongFileType', 
    2929           'NameClash', 'NotFound', 'displayWarning', 'getRootSubfile', 
    3030           'reverseRootSubfile') 
    3131 
    3232try: 
    33     import xml.etree.cElementTree as ET 
     33    import xml.etree.cElementTree as ElementTree 
    3434except(ImportError): 
    35     import xml.etree.ElementTree as ET #@Reimport 
     35    import xml.etree.ElementTree as ElementTree #@Reimport 
    3636 
    3737class SerializerError(Exception): 
  • trunk/game/local_loaders/xmlmap.py

    r553 r563  
    2323from fife import fife  
    2424try: 
    25     import xml.etree.cElementTree as ET  
     25    import xml.etree.cElementTree as ElementTree  
    2626except ImportError: 
    27     import xml.etree.ElementTree as ET 
     27    import xml.etree.ElementTree as ElementTree 
    2828 
    2929from fife.extensions import loaders 
     
    131131        f = self.vfs.open(self.source) 
    132132        f.thisown = 1 
    133         tree = ET.parse(f) 
     133        tree = ElementTree.parse(f) 
    134134        root = tree.getroot() 
    135135             
     
    183183        for item in map_elt.findall('import'): 
    184184            imp_file = item.get('file') 
     185            directory = item.get('dir') 
    185186            if imp_file: 
    186187                imp_file = reverseRootSubfile(self.source, imp_file) 
    187             directory = item.get('dir') 
    188188            if directory: 
    189189                directory = reverseRootSubfile(self.source, directory) 
     
    192192            if (directory,imp_file) in parsedImports: 
    193193                print "Duplicate import:" ,(directory,imp_file) 
    194                 continue 
     194                #TODO return 
    195195            parsedImports[(directory,imp_file)] = 1 
    196196 
     
    295295        for instance in instances: 
    296296 
     297            object_type = instance.get('object_type') 
    297298            object_id = instance.get('map_object') 
    298299            if not object_id: 
     
    300301            if not object_id: 
    301302                object_id = instance.get('o') 
    302  
    303             if not object_id: self._err('<instance> does not specify an '\ 
    304                                         'map_obj attribute.') 
     303            if not object_id: 
     304                try: 
     305                    object_id = self.model.object_db[object_type]["gfx"] 
     306                except AttributeError:  
     307                    self._err('<instance> does not specify a '\ 
     308                                'map_obj attribute.') 
    305309 
    306310            n_space = instance.get('namespace') 
     
    379383                 
    380384            #Check for PARPG specific map_obj attributes 
    381             object_type = instance.get('object_type') 
    382385            if object_type: 
    383386                inst_dict = {} 
     
    394397                    inst_dict['dialogue'] = instance.get('dialogue') 
    395398                inst_dict["target_map_name"] = instance.get('target_map_name') 
    396                 inst_dict["target_map"] = instance.get('target_map') 
    397399                inst_dict["target_x"] = instance.get('target_x') 
    398400                inst_dict["target_y"] = instance.get('target_y') 
     
    402404                if inventory_el is not None: 
    403405                    inventory = Inventory() 
    404                     inv_objects = inventory_el.findall("map_obj") 
     406                    inv_objects = inventory_el.findall("object") 
    405407                    for inv_object in inv_objects: 
    406408                        attributes = inv_object.attrib.copy() 
    407409                        self.model.createInventoryObject(inventory, attributes) 
    408410                    inst_dict["inventory"] = inventory 
     411                 
     412                inventory_el = instance.find("items")    
     413                if inventory_el is not None: 
     414                    items = [] 
     415                    inv_objects = inventory_el.findall("object") 
     416                    for inv_object in inv_objects: 
     417                        attributes = inv_object.attrib.copy() 
     418                        items.append(self.model.createContainerObject(attributes)) 
     419                    inst_dict["items"] = items 
     420 
    409421                self.model.createMapObject(layer, inst_dict, inst) 
    410422                 
  • trunk/game/maps/map.xml

    r540 r563  
    11<?xml version="1.0" encoding="ascii"?> 
    2 <map format="1.0" id="main-map"> 
     2<map format="1.0" id="Mall"> 
    33        <import file="../objects/ground/snow/snow0/snow02.xml" /> 
    44        <import file="../objects/ground/gravel/gravel.xml" /> 
    5         <import file="../objects/agents/npcs/long_coat_female/long_coat_female.xml" /> 
    6         <import file="../objects/agents/npcs/long_coat_male/long_coat_male.xml" /> 
    7         <import file="../objects/agents/npcs/male_farmer_1/male_farmer_1.xml" /> 
    8         <import file="../objects/agents/npcs/male_traveler_1/male_traveler_1.xml" /> 
    9         <import file="../objects/agents/npcs/npc_woman/npc_woman.xml" /> 
    105        <import file="../objects/scenery/crate/crate.xml" /> 
    116        <import file="../objects/buildings/guard_tower/guard_tower.xml" /> 
    12         <import file="../objects/agents/player/player.xml" /> 
    13         <import file="../objects/buildings/shanty/shanty-door.xml" /> 
    147        <import file="../objects/buildings/container_house/container_house01.xml" /> 
    158        <import file="../objects/buildings/container_house/container_house02.xml" /> 
    169        <import file="../objects/ground/block/block.xml" /> 
    1710        <import file="../objects/scenery/burning_barrel/burning_barrel.xml" /> 
    18         <import file="../objects/scenery/lock_box_metal/lock_box_metal.xml" /> 
    1911        <import file="../objects/buildings/gate/pillar1/p1_s0.xml" /> 
    2012        <import file="../objects/buildings/gate/pillar1/p1_s1.xml" /> 
     
    53405332        <layer grid_type="square" id="ObjectLayer" pathing="cell_edges_and_diagonals" rotation="0.0" transparency="0" x_offset="0.0" x_scale="1.0" y_offset="0.0" y_scale="1.0"> 
    53415333                <instances> 
    5342                         <i dialogue="dialogue/fguard.yaml" id="long_coat_female0" is_open="None" locked="None" name="Janie" o="long_coat_female" object_type="NonPlayerCharacter" r="0" target_map="None" target_map_name="None" target_x="None" target_y="None" text="A woman wearing a large coat, and a big gun" x="-5.0" y="-3.0" z="0.0" /> 
    5343                         <i dialogue="dialogue/drunkard.yaml" id="long_coat_male0" is_open="None" locked="None" name="Bart" o="long_coat_male" object_type="NonPlayerCharacter" r="0" target_map="None" target_map_name="None" target_x="None" target_y="None" text="A very drunk looking man" x="-5.0" y="-4.0" z="0.0" /> 
    5344                         <i dialogue="dialogue/crazy_swede.yaml" id="male_traveler0" is_open="None" locked="None" name="Skwisgaar" o="male_traveler_1" object_type="NonPlayerCharacter" r="0" target_map="None" target_map_name="None" target_x="None" target_y="None" text="A wild-eyed man with an axe" x="-5.0" y="-6.0" z="0.0" /> 
    5345                         <i dialogue="dialogue/snowshoveler.yaml" id="male_traveler01" is_open="None" locked="None" name="Matti" o="male_traveler_1" object_type="NonPlayerCharacter" r="0" target_map="None" target_map_name="None" target_x="None" target_y="None" text="A man shoveling snow into a hole" x="-8.0" y="-6.0" z="0.0" /> 
    5346                         <i dialogue="dialogue/bouncer.yaml" id="male_traveler02" is_open="None" locked="None" name="Dig" o="male_traveler_1" object_type="NonPlayerCharacter" r="0" target_map="None" target_map_name="None" target_x="None" target_y="None" text="A tough looking dude." x="2.0" y="-6.0" z="0.0" /> 
    5347                         <i dialogue="dialogue/innkeeper.yaml" id="long_coat_male01" is_open="None" locked="None" name="Jacob" o="long_coat_male" object_type="NonPlayerCharacter" r="0" target_map="None" target_map_name="None" target_x="None" target_y="None" text="A lean man with a sharp face and an appraising gaze" x="3.0" y="-6.0" z="0.0" /> 
    5348                         <i dialogue="dialogue/leader.yaml" id="male_traveler03" is_open="None" locked="None" name="Kimmo" o="long_coat_male" object_type="NonPlayerCharacter" r="0" target_map="None" target_map_name="None" target_x="None" target_y="None" text="An older man who exudes confidence and ability" x="4.0" y="-6.0" z="0.0" /> 
    5349                         <i dialogue="dialogue/quartermaster.yaml" id="woman01" is_open="None" locked="None" name="Helja" o="npc_woman" object_type="NonPlayerCharacter" r="0" target_map="None" target_map_name="None" target_x="None" target_y="None" text="A business-like woman, short and stout" x="5.0" y="-7.0" z="0.0" /> 
    5350                         <i dialogue="dialogue/ma.yaml" id="woman02" is_open="None" locked="None" name="Aino" o="npc_woman" object_type="NonPlayerCharacter" r="0" target_map="None" target_map_name="None" target_x="None" target_y="None" text="An ancient crone with a tight lipped smile.  She has an unlit cigarette dangling from her lips" x="-6.0" y="-7.0" z="0.0" /> 
    5351                         <i dialogue="dialogue/grifter2.yaml" id="woman03" is_open="None" locked="None" name="Kandi" o="npc_woman" object_type="NonPlayerCharacter" r="0" target_map="None" target_map_name="None" target_x="None" target_y="None" text="A dark haired, scantily clad woman giving you the once over" x="-7.0" y="-7.0" z="0.0" /> 
    5352                         <i dialogue="dialogue/grifter1.yaml" id="woman04" is_open="None" locked="None" name="Cali" o="npc_woman" object_type="NonPlayerCharacter" r="0" target_map="None" target_map_name="None" target_x="None" target_y="None" text="A scantily clad blond, checking you out" x="-8.0" y="-7.0" z="0.0" /> 
    5353                         <i dialogue="dialogue/camilla.yaml" id="sister00" is_open="None" locked="None" name="Camilla" o="long_coat_female" object_type="NonPlayerCharacter" r="0" target_map="None" target_map_name="None" target_x="None" target_y="None" text="A hard-faced pretty young woman.  She seems to be scowling." x="-5.0" y="-8.0" z="0.0" /> 
    5354                         <i dialogue="dialogue/synnove.yaml" id="sister01" is_open="None" locked="None" name="Synnove" o="long_coat_female" object_type="NonPlayerCharacter" r="0" target_map="None" target_map_name="None" target_x="None" target_y="None" text="A plain looking girl with a faraway look in her eye" x="-5.0" y="-9.0" z="0.0" /> 
    5355                         <i id="crate02" is_open="False" locked="False" name="A dirty old crate" o="crate" object_type="WoodenCrate" r="0" target_map="None" target_map_name="None" target_x="None" target_y="None" text="A crate that is covered in grime and dirt. There doesn&apos;t seem to be anything remarkable about it" x="-2.0" y="-11.0" z="0.0" /> 
    53565334                        <i o="guard_tower" r="315" x="4.0" y="-17.0" z="0.0" /> 
    5357                         <i id="PC" is_open="None" locked="None" name="None" o="player" object_type="PlayerCharacter" r="0" target_map="None" target_map_name="None" target_x="None" target_y="None" text="None" x="2.0" y="-8.0" z="0.0" >  
    5358                                 <inventory> 
    5359                                         <object id="456" object_type="Dagger123" /> 
    5360                                         <object id="555" object_type="Beer" /> 
    5361                                         <object id="616" object_type="Pamphlet" /> 
    5362                                 </inventory> 
    5363                         </i> 
    5364                         <i id="shanty-door01" is_open="False" locked="None" o="shanty-door" object_type="ShantyDoor" r="0" target_map="maps/map2.xml" target_map_name="map2" target_x="10.0" target_y="10.0" x="-6.0" y="-13.0" z="0.0" /> 
    53655335                        <i o="container_house01" r="0" x="-1.0" y="2.0" z="0.0" /> 
    53665336                        <i o="container_house02" r="0" x="14.0" y="4.0" z="0.0" /> 
     
    54765446                        <i o="block" r="0" x="5.0" y="-20.0" z="0.0" /> 
    54775447                        <i o="block" r="0" x="6.0" y="-20.0" z="0.0" /> 
    5478                         <i id="lock_box01" is_open="False" locked="False" o="lock_box_metal01" object_type="Footlocker" r="225" target_map="None" target_map_name="None" target_x="None" target_y="None" x="-9.0" y="0.0" z="0.0" /> 
    54795448                        <i o="pillar1_segment0" r="0" x="-35.0" y="-60.0" z="0.0" /> 
    54805449                        <i o="pillar1_segment1" r="0" x="-33.0" y="-60.0" z="0.0" /> 
  • trunk/game/maps/map2.xml

    r539 r563  
    11<?xml version="1.0" encoding="ascii"?> 
    2 <map format="1.0" id="map2"> 
     2<map format="1.0" id="Farm"> 
    33        <import file="../objects/ground/grass/grass-a.xml" /> 
    4         <import file="../objects/buildings/shanty/shanty-door.xml" /> 
    5         <import file="../objects/agents/npcs/long_coat_male/long_coat_male.xml" /> 
    6         <import file="../objects/agents/npcs/male_farmer_1/male_farmer_1.xml" /> 
    74        <layer grid_type="square" id="GroundLayer" pathing="cell_edges_only" rotation="0.0" transparency="0" x_offset="0.0" x_scale="1.0" y_offset="0.0" y_scale="1.0"> 
    85                <instances> 
     
    10101007        <layer grid_type="square" id="ObjectLayer" pathing="cell_edges_and_diagonals" rotation="0.0" transparency="0" x_offset="0.0" x_scale="1.0" y_offset="0.0" y_scale="1.0"> 
    10111008                <instances> 
    1012                         <i dialogue="dialogue/farmer.yaml" id="male_farmer0" is_open="None" locked="None" name="Manslow" o="male_farmer_1" object_type="NonPlayerCharacter" r="0" target_map="None" target_map_name="None" target_x="None" target_y="None" text="A grimy looking farmer" x="-3.0" y="-3.0" z="0.0" /> 
    1013                         <i dialogue="dialogue/farm_boy1.yaml" id="farm_boy0" is_open="None" locked="None" name="Sami"    o="long_coat_male" object_type="NonPlayerCharacter" r="0" target_map="None" target_map_name="None" target_x="None" target_y="None" text="An earstwhile boy, working hard" x="3.0" y="4.0" z="0.0" /> 
    1014                         <i dialogue="dialogue/farm_boy2.yaml" id="farm_boy1" is_open="None" locked="None" name="Rasmus"  o="long_coat_male" object_type="NonPlayerCharacter" r="0" target_map="None" target_map_name="None" target_x="None" target_y="None" text="A grimy looking farmer" x="4.0" y="3.0" z="0.0" /> 
    1015                         <i id="shanty-door01" is_open="False" locked="None" o="shanty-door" object_type="ShantyDoor" r="0" target_map="maps/map.xml" target_map_name="main-map" target_x="5.0" target_y="5.0" text="Looks like the exit of the building." x="-2.0" y="6.0" z="0.0" /> 
    10161009                </instances> 
    10171010        </layer> 
  • trunk/game/objects/ObjectDatabase.yaml

    r540 r563  
     1#   This file is part of PARPG. 
     2 
     3#   PARPG is free software: you can redistribute it and/or modify 
     4#   it under the terms of the GNU General Public License as published by 
     5#   the Free Software Foundation, either version 3 of the License, or 
     6#   (at your option) any later version. 
     7 
     8#   PARPG is distributed in the hope that it will be useful, 
     9#   but WITHOUT ANY WARRANTY; without even the implied warranty of 
     10#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
     11#   GNU General Public License for more details. 
     12 
     13#   You should have received a copy of the GNU General Public License 
     14#   along with PARPG.  If not, see <http://www.gnu.org/licenses/>. 
     15--- 
    116Footlocker: 
    217  name: Footlocker 
    318  text: Just a normal footlocker used to store items. 
    419  gfx: lock_box_metal01 
    5  
     20--- 
    621WoodenCrate: 
    722  name: Wooden Crate 
    823  text: A battered crate 
    924  gfx: crate 
     25--- 
     26ShantyDoor: 
     27  name: Shanty Door 
     28  text: Looks like the entrance to the building. 
     29  gfx: shanty-door 
     30--- 
     31Dagger: 
     32  name: Dagger 
     33--- 
     34Beer: 
     35  name: Beer 
     36--- 
     37Pamphlet: 
     38  name: Pamphlet 
     39  image: /gui/inv_images/inv_pamphlet.png 
    1040   
    11 ShantyDoor: 
    12   name: "Shanty Door" 
    13   text: "Looks like the entrance to the building." 
    14   gfx: "shanty-door" 
    15  
    16 Dagger123: 
    17   name: "Dagger123" 
    18  
    19 Beer: 
    20   name: "Beer" 
    21  
    22 Pamphlet: 
    23   name: "Pamphlet" 
    24   image: "/gui/inv_images/inv_pamphlet.png" 
    25    
  • trunk/game/run.py

    r553 r563  
    1515 
    1616import os 
    17  
    1817from scripts.common import utils 
    1918 
  • trunk/game/saves

    • Property svn:ignore
      •  

        old new  
        11Thumbs.db 
        22*.pyc 
         3*.dat 
  • trunk/game/scripts/common/utils.py

    r530 r563  
    1414# Miscellaneous game functions 
    1515 
    16 import os, sys 
    17  
    18 # TODO: Having a file like this just looks cheap and 'hackish'. Fix if possible 
     16import os, sys, fnmatch 
    1917 
    2018def addPaths (*paths): 
     
    3634        return value.lower()[0] == "t" 
    3735    return False 
     36 
     37def locateFiles(pattern, root=os.curdir): 
     38    """Locate all files matching supplied filename pattern in and below 
     39    supplied root directory.""" 
     40    for path, _, files in os.walk(os.path.abspath(root)): 
     41        for filename in fnmatch.filter(files, pattern): 
     42            yield os.path.join(path, filename) 
  • trunk/game/scripts/controllerbase.py

    r553 r563  
    2424                 model,  
    2525                 application,  
    26                  settings,  
    2726                 reg_mouse = True,  
    2827                 reg_keys = True): 
     
    4948         
    5049        self.application = application 
    51         self.settings = settings 
  • trunk/game/scripts/gamemodel.py

    r553 r563  
    1919import pickle 
    2020import sys 
     21import os.path 
    2122from gamestate import GameState 
    2223from objects import createObject 
    23 from map import Map 
     24from objects.composed import CarryableItem 
     25from gamemap import GameMap 
    2426from fife import fife 
     27from common.utils import locateFiles 
     28from common.utils import parseBool 
     29from inventory import Inventory 
     30try: 
     31    import xml.etree.cElementTree as ElementTree 
     32except ImportError: 
     33    import xml.etree.ElementTree as ElementTree 
    2534 
    2635import yaml 
     
    3241       the fife view here. This also prevents us from just having a 
    3342       function heavy controller.""" 
    34     def __init__(self, engine): 
     43    ALL_AGENTS_KEY = "All" 
     44        
     45    def __init__(self, engine, settings): 
    3546        """Initialize the instance. 
    3647        @param engine: A fife.Engine object 
    3748        @type emgome: fife.Engine  
     49        @param setting: The applications settigns 
     50        @type setting: fife_settings.Setting  
    3851        @return: None""" 
    39         # a World object (the fife stuff, essentially) 
    4052        self.map_change = False 
    4153        self.load_saver = False 
     
    4557        self.target_position = None 
    4658        self.target_map_name = None 
    47         self.target_map_file = None 
    4859        self.object_db = {} 
    49         # self.map is a Map object, set to none here 
    5060        self.active_map = None 
    5161        self.maps = {} 
    52         self.engine = engine         
     62        self.map_files = {} 
     63        self.agents = {} 
     64        self.agents[self.ALL_AGENTS_KEY] = {} 
     65        self.engine = engine 
     66        self.fife_model = engine.getModel() 
     67        self.maps_file = "maps/maps.yaml" 
     68        self.all_agents_file = "maps/all_agents.yaml" 
     69        self.object_db_file = "objects/ObjectDatabase.yaml" 
     70        self.agents_directory = "objects/" 
     71        self.dialogues_directory = "dialogue" 
     72        self.dialogues = {} 
     73        self.agent_import_files = {} 
     74        self.settings = settings 
    5375 
    5476    def checkAttributes(self, attributes): 
     
    7193        return attributes 
    7294     
     95    def createContainerObject(self, attributes): 
     96        """Create an object that can be stored in  
     97        an container and return it 
     98        @param attributes: Dictionary of all object attributes 
     99        @type attributes: Dictionary 
     100        @return: The created object 
     101        """ 
     102        # create the extra data 
     103        extra = {} 
     104        extra['controller'] = self 
     105        attributes = self.checkAttributes(attributes) 
     106         
     107        """TODO: Change when we use other and or more classes  
     108        for inventory objects""" 
     109        info = {} 
     110        info.update(attributes) 
     111        info.update(extra) 
     112        ID = info.pop("id") if info.has_key("id") else info.pop("ID") 
     113                 
     114        return CarryableItem(ID = ID, **info)   
     115       
    73116    def createInventoryObject(self, container, attributes): 
    74117        """Create an inventory object and place it into a container 
     
    78121           @param attributes: Dictionary of all object attributes 
    79122           @return: None""" 
    80         # create the extra data 
    81         extra = {} 
    82         extra['controller'] = self 
    83         attributes = self.checkAttributes(attributes) 
    84          
    85         """TODO: Change when we use other and or more classes  
    86         for inventory objects""" 
    87         from objects.composed import CarryableItem 
    88         info = {} 
    89         info.update(attributes) 
    90         info.update(extra) 
    91         ID = info.pop("id") 
    92          
    93         obj = CarryableItem(ID = ID, **info) 
     123        index = attributes.pop("index") if attributes.has_key("index") else None 
     124        slot = attributes.pop("slot") if attributes.has_key("slot") else None 
     125        obj = self.createContainerObject(attributes)         
    94126        #obj = createObject(attributes, extra) 
    95         container.placeItem(obj) 
     127        if slot: 
     128            container.moveItemToSlot(obj, slot) 
     129        else: 
     130            container.placeItem(obj, index) 
    96131         
    97132    def save(self, path, filename): 
     
    102137        fname = '/'.join([path, filename]) 
    103138        try: 
    104             save_file = open(fname, 'wb') 
     139            save_file = open(fname, 'w') 
    105140        except(IOError): 
    106             sys.stderr.write("Error: Can't find save game: " + fname + "\n") 
     141            sys.stderr.write("Error: Can't create save game: " + fname + "\n") 
    107142            return 
    108          
    109         # save the PC coordinates 
    110         coords = self.game_state.PlayerCharacter.behaviour.agent.getLocation().\ 
    111                     getMapCoordinates() 
    112         self.game_state.saved_pc_coordinates = (coords.x, coords.y) 
    113          
    114         # Pickle it  
    115         pickle.dump(self.game_state, save_file) 
     143        save_state = {} 
     144        save_state["Agents"] = {} 
     145        for map_name in self.agents: 
     146            if map_name == self.ALL_AGENTS_KEY: 
     147                continue 
     148            agents_dict = {} 
     149            for agent in self.agents[map_name]: 
     150                agent_obj = self.game_state.getObjectById(agent, map_name) 
     151                agent_inst = self.maps[map_name].agent_layer.getInstance(agent) 
     152                agent_dict = self.agents[map_name][agent] 
     153                agent_dict.update(agent_obj.getStateForSaving()) 
     154                agent_dict["Rotation"] = agent_inst.getRotation() 
     155                agents_dict[agent] = agent_dict 
     156            save_state["Agents"][map_name] = agents_dict 
     157        agents_dict = {} 
     158        for agent in self.agents["All"]: 
     159            map_name = self.agents["All"][agent]["Map"] 
     160            agent_dict = self.agents["All"][agent] 
     161            agent_obj = None 
     162            if agent == "PlayerCharacter": 
     163                agent_obj = self.game_state.PlayerCharacter 
     164            else: 
     165                agent_obj = self.game_state.getObjectById(agent, map_name) 
     166            if agent_obj: 
     167                agent_inst = self.maps[map_name].agent_layer.getInstance(agent) 
     168                agent_dict.update(agent_obj.getStateForSaving()) 
     169                agent_dict["Rotation"] = agent_inst.getRotation() 
     170                agent_dict["MapName"] = map_name 
     171            agents_dict[agent] = agent_dict 
     172        save_state["Agents"]["All"] = agents_dict 
     173        save_state["GameState"] = self.game_state.getStateForSaving() 
     174        yaml.dump(save_state, save_file) 
     175         
    116176        save_file.close()        
    117177 
     
    124184 
    125185        try: 
    126             load_file = open(fname, 'rb') 
     186            load_file = open(fname, 'r') 
    127187        except(IOError): 
    128188            sys.stderr.write("Error: Can't find save game file\n") 
    129189            return         
    130          
    131         self.game_state = pickle.load(load_file) 
     190        self.deleteMaps() 
     191        self.clearAgents() 
     192         
     193        save_state = yaml.load(load_file) 
     194        self.game_state.restoreFromState(save_state["GameState"]) 
     195        maps = save_state["Agents"] 
     196        for map_name in maps: 
     197            for agent_name in maps[map_name]: 
     198                agent = {agent_name:maps[map_name][agent_name]} 
     199                self.addAgent(map_name, agent) 
     200                 
    132201        load_file.close() 
    133  
    134         self.target_position = self.game_state.saved_pc_coordinates 
    135  
     202         
    136203        # Load the current map 
    137         if self.game_state.current_map_file: 
    138             self.loadMap(self.game_state.current_map_name, \ 
    139                          self.game_state.current_map_file)          
     204        if self.game_state.current_map_name: 
     205            self.loadMap(self.game_state.current_map_name)          
    140206 
    141207        # Recreate all the behaviours. These can't be saved because FIFE 
    142208        # objects cannot be pickled 
    143209         
    144         for map_id in self.game_state.objects: 
    145             for obj in self.game_state.objects[map_id].itervalues(): 
    146                 if obj.trueAttr("NPC") or obj.trueAttr("AnimatedContainer"): 
    147                     obj.createBehaviour(self.active_map.agent_layer) 
    148                     obj.setup() 
     210        self.placeAgents() 
     211        self.placePC() 
    149212       
    150213        # In most maps we'll create the PlayerCharacter Instance internally.  
    151214        # In these cases we need a target position 
    152215          
    153     def teleport(self, position): 
    154         """Called when a door is used that moves a player to a new 
    155            location on the same map. the setting of position may want 
    156            to be created as its own method down the road. 
    157            @type position: String Tuple 
    158            @param position: X,Y coordinates passed from engine.changeMap 
    159            @return: fife.Location""" 
     216    def teleport(self, agent, position): 
     217        """Called when a an agent is moved instantly to a new position.  
     218        The setting of position may wan to be created as its own method down the road. 
     219        @type position: String Tuple 
     220        @param position: X,Y coordinates passed from engine.changeMap 
     221        @return: fife.Location""" 
    160222        print position 
    161223        coord = fife.DoublePoint3D(float(position[0]), float(position[1]), 0) 
    162224        location = fife.Location(self.active_map.agent_layer) 
    163225        location.setMapCoordinates(coord) 
    164         self.game_state.PlayerCharacter.teleport(location) 
    165                  
     226        agent.teleport(location)          
     227                
    166228    def getObjectAtCoords(self, coords): 
    167229        """Get the object which is at the given coords 
    168             @type coords: fife.Screenpoint 
    169             @param coords: Coordinates where to check for an object 
    170             @rtype: fife.Object 
    171             @return: An object or None""" 
     230        @type coords: fife.Screenpoint 
     231        @param coords: Coordinates where to check for an object 
     232        @rtype: fife.Object 
     233        @return: An object or None""" 
    172234        instances = self.active_map.cameras[ 
    173235                                            self.active_map.my_cam_id].\ 
     
    215277        self.active_map.togglePause() 
    216278     
    217     def loadMap(self, map_name, map_file): 
     279    def readMapFiles(self): 
     280        """Read all a available map-files and store them""" 
     281        maps_data = file(self.maps_file) 
     282        self.map_files = yaml.load(maps_data)["Maps"] 
     283     
     284    def addAgent(self, namespace, agent): 
     285        """Adds an agent to the agents dictionary 
     286        @param namespace: the namespace where the agent is to be added to 
     287        @type namespace: str 
     288        @param agent: The agent to be added 
     289        @type agent: dict 
     290        """ 
     291        from local_loaders.loaders import loadImportFile 
     292        if not self.agents.has_key(namespace): 
     293            self.agents[namespace] = {} 
     294 
     295        self.agents[namespace].update(agent) 
     296        object_model = "" 
     297        agent_values = agent.values()[0] 
     298        if agent_values.has_key("ObjectModel"):  
     299            object_model =  agent_values["ObjectModel"] 
     300        else: 
     301            object_model = self.object_db[agent_values["ObjectType"]]["gfx"] 
     302        import_file = self.agent_import_files[object_model] 
     303        loadImportFile(import_file, self.engine) 
     304         
     305    def readAllAgents(self): 
     306        """Read the agents of the all_agents_file and store them""" 
     307        agents_data = file(self.all_agents_file) 
     308        agents = yaml.load_all(agents_data) 
     309        for agent in agents: 
     310            if not agent == None: 
     311                self.addAgent(self.ALL_AGENTS_KEY, agent)   
     312                 
     313    def getAgentsOfMap(self, map_name): 
     314        """Returns the agents that are on the given map 
     315        @param map_name: Name of the map 
     316        @type map_name: str 
     317        @return: A dictionary with the agents of the map 
     318        """ 
     319        if not self.agents.has_key(map_name): 
     320            return {} 
     321        ret_dict = self.agents[map_name].copy() 
     322        for agent_name, agent_value in self.agents[self.ALL_AGENTS_KEY].iteritems(): 
     323            if agent_value["Map"] == map_name: 
     324                ret_dict[agent_name] = agent_value 
     325        return ret_dict 
     326                 
     327    def getAgentsOfActiveMap(self): 
     328        """Returns the agents that are on active map 
     329        @return: A dictionary with the agents of the map 
     330        """ 
     331        return self.getAgentsOfMap(self.active_map.map.getId()) 
     332 
     333    def clearAgents(self): 
     334        """Resets the agents dictionary""" 
     335        self.agents = {} 
     336        self.agents[self.ALL_AGENTS_KEY] = {} 
     337     
     338    def loadMap(self, map_name): 
    218339        """Load a new map. 
    219340           @type map_name: string 
    220341           @param map_name: Name of the map to load 
    221            @type map_file: string 
    222            @param map_file: Filename of map file to load 
    223            @return: None""" 
    224         self.game_state.current_map_file = map_file 
     342           @return: None""" 
    225343        self.game_state.current_map_name = map_name 
    226344 
    227         if not map_name in self.maps:            
    228             new_map = Map(self.engine, self) 
     345        if not map_name in self.maps:   
     346            map_file = self.map_files[map_name] 
     347            map_agents_file = map_file.replace(".xml", "_agents.yaml")    
     348            new_map = GameMap(self.engine, self) 
    229349            self.maps[map_name] = new_map 
    230             new_map.load(map_file) 
     350            #Get the agents of the map 
     351            agents_data = file(map_agents_file) 
     352            agents = yaml.load_all(agents_data) 
     353            for agent in agents: 
     354                if not agent == None: 
     355                    self.addAgent(map_name, agent)   
     356            new_map.load(self.map_files[map_name]) 
    231357        else: 
    232358            self.setActiveMap(map_name) 
    233359 
     360    def createAgent(self, agent, inst_id): 
     361        object_type = agent["ObjectType"] 
     362        object_id = agent["ObjectModel"] \ 
     363                                if agent.has_key("ObjectModel") \ 
     364                                else None 
     365        if object_id == None: 
     366            object_id = self.object_db[object_type]["gfx"] 
     367        map_obj = self.fife_model.getObject(str(object_id), "PARPG") 
     368        if not map_obj: 
     369            print ''.join(['Object with inst_id=', str(object_id),  
     370                           ' ns=PARPG', \ 
     371                           ' could not be found. Omitting...']) 
     372 
     373        x_pos = agent["Position"][0] 
     374        y_pos = agent["Position"][1] 
     375        z_pos = agent["Position"][2] if len(agent["Position"]) == 3 else 0.0 
     376        stack_pos = agent["Stackposition"] if \ 
     377                        agent.has_key("StackPosition") \ 
     378                        else None 
     379        inst = self.active_map.agent_layer.\ 
     380                        createInstance(map_obj, 
     381                                       fife.ExactModelCoordinate(x_pos,  
     382                                                                 y_pos,  
     383                                                                 z_pos), 
     384                                       inst_id) 
     385 
     386        inst.setId(inst_id) 
     387        rotation = agent["Rotation"] 
     388        inst.setRotation(rotation) 
     389 
     390        fife.InstanceVisual.create(inst) 
     391        if (stack_pos): 
     392            inst.get2dGfxVisual().setStackPosition(int(stack_pos)) 
     393 
     394        if (map_obj.getAction('default')): 
     395            target = fife.Location(self.active_map.agent_layer) 
     396            inst.act('default', target, True) 
     397             
     398        inst_dict = {} 
     399        inst_dict["type"] = object_type 
     400        inst_dict["id"] = inst_id 
     401        inst_dict["xpos"] = x_pos 
     402        inst_dict["ypos"] = y_pos 
     403        inst_dict["gfx"] = object_id 
     404        inst_dict["is_open"] = parseBool(agent["Open"]) \ 
     405                                if agent.has_key("Open") \ 
     406                                else False 
     407        inst_dict["locked"] = parseBool(agent["Locked"]) \ 
     408                                if agent.has_key("Locked") \ 
     409                                else False 
     410        inst_dict["name"] = agent["ViewName"] 
     411        inst_dict["real_name"] = agent["RealName"] \ 
     412                                    if agent.has_key("RealName") \ 
     413                                    else agent["ViewName"] 
     414        inst_dict["text"] = agent["Text"] \ 
     415                                    if agent.has_key("Text") \ 
     416                                    else None 
     417        if self.dialogues.has_key(inst_id): 
     418            inst_dict["dialogue"] = self.dialogues[inst_id] 
     419        inst_dict["target_map_name"] = agent["TargetMap"] \ 
     420                                        if agent.\ 
     421                                            has_key("TargetMap") \ 
     422                                        else None 
     423        inst_dict["target_x"] = agent["TargetPosition"][0] \ 
     424                                    if agent.\ 
     425                                        has_key("TargetPosition") \ 
     426                                    else None 
     427        inst_dict["target_y"] = agent["TargetPosition"][1] \ 
     428                                    if agent.\ 
     429                                        has_key("TargetPosition") \ 
     430                                    else None 
     431        if agent.has_key("Inventory"): 
     432            inventory = Inventory() 
     433            inventory_objs = agent["Inventory"] 
     434            for inventory_obj in inventory_objs: 
     435                self.createInventoryObject(inventory, 
     436                                           inventory_obj  
     437                                           ) 
     438            inst_dict["inventory"] = inventory 
     439 
     440        if agent.has_key("Items"): 
     441            items = [] 
     442            inventory_objs = agent["Items"] 
     443            for inventory_obj in inventory_objs: 
     444                items.append(self.createContainerObject(inventory_obj)) 
     445            inst_dict["items"] = items 
     446 
     447                     
     448        self.createMapObject(self.active_map.agent_layer, inst_dict, inst) 
     449     
     450    def placeAgents(self): 
     451        """Places the current maps agents 
     452        """ 
     453        if not self.active_map: 
     454            return 
     455        agents = self.getAgentsOfMap(self.game_state.current_map_name) 
     456        for agent in agents: 
     457            if agent == "PlayerCharacter": 
     458                continue 
     459            if self.active_map.agent_layer.getInstances(agent): 
     460                continue 
     461            self.createAgent(agents[agent], agent) 
     462 
     463    def placePC(self): 
     464        """Places the PlayerCharacter on the map""" 
     465        agent = self.agents[self.ALL_AGENTS_KEY]["PlayerCharacter"] 
     466        inst_id = "PlayerCharacter" 
     467        self.createAgent(agent, inst_id) 
     468         
    234469        # create the PlayerCharacter agent 
    235470        self.active_map.addPC() 
    236471        self.game_state.PlayerCharacter.start() 
    237  
    238     def changeMap(self, map_name, map_file, target_position): 
     472                       
     473    def changeMap(self, map_name, target_position): 
    239474        """Registers for a map change on the next pump(). 
    240475           @type map_name: String 
     
    248483        if map_name != self.game_state.current_map_name: 
    249484            self.target_map_name = map_name 
    250             self.target_map_file = map_file 
    251485            self.target_position = target_position 
    252486            # issue the map change 
     
    262496        self.engine.getModel().deleteMaps() 
    263497        self.engine.getModel().deleteObjects() 
     498        self.game_state.clearObjects() 
    264499        self.maps = {} 
    265500         
     
    289524        if layer is not None: 
    290525            extra['agent_layer'] = layer 
    291         extra['controller'] = self 
    292526        attributes = self.checkAttributes(attributes) 
    293527         
     
    369603            self.game_state.PlayerCharacter.walk(position) 
    370604         
    371     def teleportPlayer(self, position): 
    372         """Code called when the player should teleport to another location 
     605    def teleportAgent(self, agent, position): 
     606        """Code called when an agent should teleport to another location 
    373607           @type position: fife.ScreenPoint 
    374608           @param position: Screen position to teleport to 
    375609           @return: None""" 
    376         self.game_state.PlayerCharacter.teleport(position) 
    377  
    378     def readObjectDB(self, db_file): 
     610        agent.teleport(position) 
     611        self.agents[agent.ID]["Position"] = position 
     612 
     613    def readObjectDB(self): 
    379614        """Reads the Object Information Database from a file. 
    380         @type db_file: String 
    381         @param db_file: The file to load from 
    382         """ 
    383         database_file = file(db_file, "r") 
     615        """ 
     616        database_file = file(self.object_db_file, "r") 
    384617        database = yaml.load_all(database_file) 
    385618        for object_info in database: 
    386619            self.object_db.update(object_info) 
     620 
     621    def getAgentImportFiles(self): 
     622        """Searches the agents directory for import files 
     623        """ 
     624        files = locateFiles("*.xml", self.agents_directory) 
     625        for xml_file in files: 
     626            xml_file = os.path.relpath(xml_file).replace("\\", "/") 
     627            root = ElementTree.parse(xml_file).getroot() 
     628            if root.tag == "object": 
     629                self.agent_import_files[root.attrib["id"]] = xml_file 
     630     
     631    def getDialogues(self): 
     632        """Searches the dialogue directory for dialogues 
     633        """ 
     634        files = locateFiles("*.yaml", self.dialogues_directory) 
     635        for dialogue_file in files: 
     636            dialogue_file = os.path.relpath(dialogue_file).replace("\\", "/") 
     637            dialogues = yaml.load_all(file(dialogue_file, "r")) 
     638            for dialogue in dialogues: 
     639                self.dialogues[dialogue["NPC"]] = dialogue 
  • trunk/game/scripts/gamescenecontroller.py

    r553 r563  
    2424import os 
    2525from objects.action import ChangeMapAction, ExamineBoxAction, OpenBoxAction, \ 
    26                             UnlockBoxAction, LockBoxAction, TalkAction 
     26                           UnlockBoxAction, LockBoxAction, TalkAction 
    2727 
    2828class GameSceneController(ControllerBase): 
     
    3434 
    3535 
    36     def __init__(self, engine, view, model, application, settings): 
     36    def __init__(self, engine, view, model, application): 
    3737        ''' 
    3838        Constructor 
     
    5252                                                  model, 
    5353                                                  application, 
    54                                                   settings, 
    5554                                                  reg_mouse=True,  
    5655                                                  reg_keys=True) 
     
    6059        self.mouse_callback = None 
    6160 
    62         # don't force restart if skipping to new section 
    63         if settings.get("FIFE",  "PlaySounds"): 
     61        if model.settings.get("FIFE",  "PlaySounds"): 
    6462            if not self.view.sounds.music_init: 
    6563                music_file = random.choice(glob.glob(os.path.join( 
     
    7876        } 
    7977        self.view.hud = Hud(self.engine,  
    80                             self.settings,  
     78                            self.model.settings,  
    8179                            self.model,  
    8280                            hud_callbacks) 
     
    145143            tmp_active_map = self.model.active_map 
    146144            instances = tmp_active_map.cameras[tmp_active_map.my_cam_id].\ 
    147                             getMatchingInstances(scr_point, \ 
     145                            getMatchingInstances(scr_point, 
    148146                                                 tmp_active_map.agent_layer) 
    149147            info = None 
     
    172170 
    173171    def handleCommands(self): 
     172        """Check if a command is to be executed 
     173        """ 
    174174        if self.model.map_change: 
    175             self.model.loadMap(self.model.target_map_name,  
    176                                self.model.target_map_file) 
    177             self.model.teleport(self.model.target_position) 
     175            player_agent = self.model.active_map.\ 
     176                                agent_layer.getInstance("PlayerCharacter") 
     177            self.model.active_map.agent_layer.deleteInstance(player_agent) 
     178            self.model.loadMap(self.model.target_map_name)       
     179            player_char = self.model.game_state.PlayerCharacter 
     180            self.model.game_state.PlayerCharacter = None 
     181            pc_agent = self.model.agents[self.model.ALL_AGENTS_KEY]["PlayerCharacter"]  
     182            pc_agent["Map"] = self.model.target_map_name  
     183            pc_agent["Position"] = self.model.target_position 
     184            pc_agent["Inventory"] = player_char.inventory.serializeInventory() 
     185            self.model.placeAgents() 
     186            self.model.placePC() 
    178187            self.model.map_change = False 
    179188            # The PlayerCharacter has an inventory, and also some  
     
    195204        # TODO: work more on this when we get NPCData and HeroData straightened 
    196205        # out 
    197         npc = self.model.game_state.getObjectById(npc_info.ID, \ 
    198                                             self.model.game_state.current_map_name) 
     206        npc = self.model.game_state.getObjectById(npc_info.ID, 
     207                                            self.model.game_state.\ 
     208                                                current_map_name) 
    199209        self.model.game_state.PlayerCharacter.approach([npc.getLocation().\ 
    200                                      getLayerCoordinates().x, \ 
     210                                     getLayerCoordinates().x, 
    201211                                     npc.getLocation().\ 
    202                                      getLayerCoordinates().y], \ 
     212                                     getLayerCoordinates().y], 
    203213                                    TalkAction(self.model, self.view, npc)) 
    204214 
     
    211221        actions = [] 
    212222        # note: ALWAYS check NPC's first! 
    213         obj = self.model.game_state.getObjectById(obj_id, \ 
    214                                             self.model.game_state.current_map_name) 
     223        obj = self.model.game_state.\ 
     224                        getObjectById(obj_id, 
     225                                      self.model.game_state.current_map_name) 
    215226         
    216227        if obj is not None: 
     
    221232            else: 
    222233                actions.append(["Examine", "Examine", 
    223                                 self.model.game_state.PlayerCharacter.approach, [obj.X, obj.Y], \ 
     234                                self.model.game_state.PlayerCharacter.approach,  
     235                                [obj.X, obj.Y], 
    224236                                ExamineBoxAction(self.model, self.view,  
    225237                                                 obj.name, obj.text)]) 
     
    227239                if obj.trueAttr("door"): 
    228240                    actions.append(["Change Map", "Change Map", 
    229                        self.model.game_state.PlayerCharacter.approach, [obj.X, obj.Y], \ 
    230                             ChangeMapAction(self.model, self.view 
    231                                             , obj.target_map_name, 
    232                                 obj.target_map, obj.target_pos)]) 
     241                       self.model.game_state.PlayerCharacter.approach,  
     242                       [obj.X, obj.Y], 
     243                       ChangeMapAction(self.model, self.view, 
     244                                       obj.target_map_name, 
     245                                       obj.target_pos)]) 
    233246                # is it a container? 
    234247                if obj.trueAttr("container"): 
    235248                    actions.append(["Open", "Open",  
    236                                     self.model.game_state.PlayerCharacter.approach, \ 
     249                                    self.model.game_state.\ 
     250                                        PlayerCharacter.approach, 
    237251                                    [obj.X, obj.Y], 
    238252                                    OpenBoxAction(self.model, self.view, obj)]) 
    239253                    actions.append(["Unlock", "Unlock",  
    240                                     self.model.game_state.PlayerCharacter.approach, \ 
     254                                    self.model.game_state.\ 
     255                                        PlayerCharacter.approach, 
    241256                                    [obj.X, obj.Y], 
    242257                                    UnlockBoxAction(obj)]) 
    243258                    actions.append(["Lock", "Lock",  
    244                                     self.model.game_state.PlayerCharacter.approach, \ 
     259                                    self.model.game_state.\ 
     260                                        PlayerCharacter.approach, 
    245261                                    [obj.X, obj.Y], 
    246262                                    LockBoxAction(obj)]) 
     
    273289        # uncomment to instrument 
    274290        # t0 = time.time() 
    275         self.view.highlightFrontObject(self.last_mousecoords) 
    276         self.view.refreshTopLayerTransparencies() 
     291        if self.model.active_map: 
     292            self.view.highlightFrontObject(self.last_mousecoords) 
     293            self.view.refreshTopLayerTransparencies() 
    277294        self.handleCommands() 
    278295        # print "%05f" % (time.time()-t0,) 
  • trunk/game/scripts/gamesceneview.py

    r557 r563  
    6060        """Fade or unfade TopLayer instances if the PlayerCharacter  
    6161        is under them.""" 
     62        if not self.model.active_map: 
     63            return 
     64 
    6265        # get the PlayerCharacter's screen coordinates 
    6366        camera = self.model.active_map.cameras[self.model.active_map.my_cam_id] 
     
    9093        """Highlights the object that is at the  
    9194        current mouse coordinates"""         
     95        if not self.model.active_map: 
     96            return 
    9297        if mouse_coords: 
    9398            front_obj = self.model.getObjectAtCoords(mouse_coords) 
  • trunk/game/scripts/gamestate.py

    r553 r563  
    2424        self.quest_engine = quest_engine.QuestEngine() 
    2525        self.objects = {} 
    26         self.current_map_file = None 
    2726        self.current_map_name = None 
    28         # these coordinates are only used for saving and loading the game. 
    29         # They do not represent the pc's active location 
    30         self.saved_pc_coordinates = (0,0) 
    3127         
    3228    def getObjectsFromMap(self, map_id): 
     
    3632           @returns: The list of objects on this map. Or an empty list""" 
    3733        if map_id in self.objects: 
    38             return [i for i in self.objects[map_id].values() if map_id in self.objects] 
     34            return [i for i in self.objects[map_id].values() \ 
     35                                        if map_id in self.objects] 
    3936         
    4037        return {} 
     
    5148        if obj_id in self.objects[map_id]: 
    5249            return self.objects[map_id][obj_id] 
     50     
     51    def clearObjects(self): 
     52        """Delete all objects from the state 
     53        """ 
     54        self.objects = {} 
     55         
     56    def getStateForSaving(self): 
     57        """Prepares state for saving 
     58        @type state: dictionary 
     59        @param state: State of the object   
     60        """ 
     61        ret_dict = {} 
     62        ret_dict["CurrentMap"] = self.current_map_name 
     63        return ret_dict 
     64 
     65    def restoreFromState(self, state): 
     66        """Restores the state""" 
     67        self.current_map_name = state["CurrentMap"] 
     68         
  • trunk/game/scripts/gui/inventorygui.py

    r553 r563  
    2121 
    2222from scripts.gui import drag_drop_data as data_drag 
     23from scripts.objects.base import Container 
    2324 
    2425class InventoryGUI(object): 
     
    227228                    data_drag.dragged_container.takeItem(data_drag.dragged_item) 
    228229                self.inventory_storage.moveItemToSlot(data_drag.dragged_item, 
    229                                                   drop_widget.slot, drop_widget.index) 
     230                                                      drop_widget.slot, 
     231                                                      drop_widget.index) 
    230232            if drop_widget.slot == 'ready': 
    231233                self.readyCallback() 
    232234            self.resetMouseCursor() 
    233235            data_drag.dragging = False 
    234         except "Container.TooBig" : 
     236        except Container.TooBig : 
    235237            print("%s too big to fit into %s" % (data_drag.dragged_item, 
    236238                                                 drop_widget.slot)) 
  • trunk/game/scripts/inventory.py

    r553 r563  
    121121 
    122122    def __repr__(self): 
    123         return "[Inventory contents: " +reduce((lambda a,b: str(a) +', '+str(b)), self.items.values())+" ]" 
     123        return "[Inventory contents: " + \ 
     124                            reduce((lambda a,b: str(a)  
     125                                    + ', ' + str(b)),  
     126                                    self.items.values()) + " ]" 
     127 
     128    def serializeInventory(self): 
     129        """Returns the inventory items as a list""" 
     130        inventory = [] 
     131        inventory.extend(self.items["backpack"].serializeItems()) 
     132        for key, slot in self.items.iteritems(): 
     133            if key == "ready" or key == "backpack": 
     134                continue 
     135            elif len(slot.items) > 0: 
     136                item = slot.items[0] 
     137                item_dict = item.item_dict = item.getStateForSaving() 
     138                item_dict["slot"] = key                                 
     139                item_dict["type"] = type(item).__name__  
     140                inventory.append(item_dict) 
     141        return inventory 
     142             
     143    def getStateForSaving(self): 
     144        """Returns state for saving 
     145        """ 
     146        state = {} 
     147        state["Inventory"] = self.serializeInventory() 
     148        return state 
  • trunk/game/scripts/objects/action.py

    r553 r563  
    2424class ChangeMapAction(Action): 
    2525    """A change map scheduled""" 
    26     def __init__(self, model, view, target_map_name, target_map_file , target_pos): 
     26    def __init__(self, model, view, target_map_name, target_pos): 
    2727        """Initiates a change of the position of the character 
    2828           possibly flagging a new map to be loaded. 
     
    3333           @type target_map_name: String 
    3434           @param target_map_name: Target map id  
    35            @type target_map_file: String 
    36            @param target_map_file: Target map filename 
    3735           @type target_pos: Tuple 
    3836           @param target_pos: (X, Y) coordinates on the target map. 
     
    4341        self.target_pos = target_pos 
    4442        self.target_map_name = target_map_name 
    45         self.target_map_file = target_map_file 
    4643 
    4744    def execute(self): 
    4845        """Executes the map change.""" 
    49         self.model.changeMap(self.target_map_name, self.target_map_file,\ 
     46        self.model.changeMap(self.target_map_name, 
    5047                              self.target_pos) 
    5148        
     
    148145        # If we are too far away, we approach the NPC again 
    149146        if distance_squared > 2: 
    150             pc.approach([self.npc.getLocation().\ 
    151                          getLayerCoordinates().x, \ 
    152                          self.npc.getLocation().\ 
    153                          getLayerCoordinates().y], \ 
    154                         TalkAction(self.model,\ 
     147            pc.approach([self.npc.getLocation(). 
     148                         getLayerCoordinates().x, 
     149                         self.npc.getLocation(). 
     150                         getLayerCoordinates().y],  
     151                        TalkAction(self.model, 
     152                                   self.view, 
    155153                                   self.npc))         
    156154        else: 
  • trunk/game/scripts/objects/actors.py

    r553 r563  
    4040        self.state = None 
    4141        self.speed = 0 
     42        self.idle_counter = 1 
    4243     
    4344    def attachToLayer(self, agent_ID): 
     
    6465        return self.agent.getLocation().getLayerCoordinates().y 
    6566         
     67    def onNewMap(self, layer): 
     68        """Sets the agent onto the new layer.""" 
     69        if self.agent is not None: 
     70            self.agent.removeActionListener(self) 
     71             
     72        self.agent = layer.getInstance(self.parent.ID) 
     73        self.agent.addActionListener(self) 
     74        self.state = _AGENT_STATE_NONE 
     75        self.idle_counter = 1 
     76     
     77    def idle(self): 
     78        """@return: None""" 
     79        self.state = _AGENT_STATE_IDLE 
     80        self.agent.act('stand', self.agent.getFacingLocation()) 
     81 
    6682    def onInstanceActionFinished(self, instance, action): 
    6783        pass 
     
    94110            self.idle_counter = 1 
    95111        else: 
    96             self.idle_counter += 1 
    97              
    98     def onNewMap(self, layer): 
    99         """Sets the agent onto the new layer.""" 
    100         if self.agent is not None: 
    101             self.agent.removeActionListener(self) 
    102              
    103         self.agent = layer.getInstance(self.parent.ID) 
    104         self.agent.addActionListener(self) 
    105         self.state = _AGENT_STATE_NONE 
    106         self.idle_counter = 1 
    107      
    108     def idle(self): 
    109         """@return: None""" 
    110         self.state = _AGENT_STATE_IDLE 
    111         self.agent.act('stand', self.agent.getFacingLocation()) 
     112            self.idle_counter += 1             
    112113 
    113114class PlayerCharacter (GameObject, Living, CharStats): 
    114115    """PC class""" 
    115     def __init__ (self, ID, agent_layer = None, inventory = None, **kwargs): 
    116         GameObject.__init__( self, ID, **kwargs ) 
     116    def __init__ (self, ID, agent_layer = None, inventory = None, text = "Its you. Who would've thought that?", **kwargs): 
     117        GameObject.__init__( self, ID, text = text, **kwargs ) 
    117118        Living.__init__( self, **kwargs ) 
    118119        CharStats.__init__( self, **kwargs ) 
     
    137138        self.createBehaviour(agent_layer) 
    138139     
    139     def prepareStateForSaving(self, state): 
    140         """Prepares state for saving 
    141         @type state: dictionary 
    142         @param state: State of the object   
     140    def getLocation(self): 
     141        """Get the NPC's position as a fife.Location object. Basically a 
     142           wrapper. 
     143           @rtype: fife.Location 
     144           @return: the location of the NPC""" 
     145        return self.behaviour.agent.getLocation() 
     146 
     147    def getStateForSaving(self): 
     148        """Returns state for saving 
    143149        """ 
    144         GameObject.prepareStateForSaving(self, state) 
    145         del state["behaviour"] 
    146  
     150        ret_dict = super(PlayerCharacter, self).getStateForSaving() 
     151        ret_dict["Inventory"] = self.inventory.serializeInventory() 
     152        ret_dict["PeopleKnown"] = self.peopleIknow 
     153        return ret_dict 
     154     
    147155    def meet(self, npc): 
    148156        """Record that the PC has met a certain NPC 
     
    215223        l.setLayerCoordinates(fife.ModelCoordinate(*boxLocation)) 
    216224        self.behaviour.agent.move('run', l, self.behaviour.speed+1) 
     225     
     226    def _getCoords(self): 
     227        """Get-er property function""" 
     228        return (self.getLocation().getMapCoordinates().x,  
     229                self.getLocation().getMapCoordinates().y) 
     230     
     231    def _setCoords(self, coords): 
     232        """Set-er property function""" 
     233        map_coords = self.getLocation().getMapCoordinates() 
     234        map_coords.X, map_coords.Y = float(coords[0]), float (coords[1]) 
     235        self.teleport(map_coords) 
     236     
     237    coords = property (_getCoords, _setCoords,  
     238        doc = "Property allowing you to get and set the object's \ 
     239                coordinates via tuples") 
    217240 
    218241 
     
    225248        self.pc = None 
    226249        self.target_loc = None 
     250        self.nextAction = None 
    227251         
    228252        # hard code this for now 
     
    285309    """NPC class""" 
    286310    def __init__(self, ID, agent_layer=None, name='NPC', \ 
    287                  text = 'A nonplayer character', inventory = None, **kwargs): 
     311                 text = 'A nonplayer character', inventory = None,  
     312                 real_name = 'NPC', dialogue = None, **kwargs): 
    288313        # init game object 
    289         GameObject.__init__(self, ID, name=name, **kwargs) 
     314        GameObject.__init__(self, ID, name=name, real_name=real_name, text = text, **kwargs) 
    290315        Living.__init__(self, **kwargs) 
    291316        Scriptable.__init__(self, **kwargs) 
     
    294319        self.is_NPC = True 
    295320        self.behaviour = None 
     321        self.state = None 
    296322         
    297323        if inventory == None: 
     
    305331        self.layer_id = agent_layer.getId() 
    306332        self.createBehaviour(agent_layer)         
    307         self.dialogue = kwargs.get('dialogue') 
    308          
     333        self.dialogue = dialogue 
     334 
    309335    def prepareStateForSaving(self, state): 
    310336        """Prepares state for saving 
     
    315341        del state["behaviour"] 
    316342 
     343    def getStateForSaving(self): 
     344        """Returns state for saving 
     345        """ 
     346        ret_dict = super(NonPlayerCharacter, self).getStateForSaving() 
     347        ret_dict["Lives"] = self.is_living 
     348        ret_dict["State"] = self.behaviour.state 
     349        return ret_dict 
     350 
    317351    def createBehaviour(self, layer): 
    318352        """Creates the behaviour for this actor. 
     
    327361        return self.behaviour.agent.getLocation() 
    328362     
     363    def teleport(self, location): 
     364        """Teleports a NPC instantly to the given location. 
     365           @type location: fife.Location 
     366           @param location: Target coordinates for PC. 
     367           @return: None""" 
     368        self.state = _AGENT_STATE_IDLE 
     369        self.behaviour.nextAction = None  
     370        self.behaviour.agent.setLocation(location) 
     371 
    329372    def wander(self, location): 
    330373        """Nice slow movement for random walking. 
     
    364407        """@return: None""" 
    365408        self.behaviour.idle() 
     409 
     410    def _getCoords(self): 
     411        """Get-er property function""" 
     412        return (self.getLocation().getMapCoordinates().x,  
     413                self.getLocation().getMapCoordinates().y) 
     414     
     415    def _setCoords(self, coords): 
     416        """Set-er property function""" 
     417        map_coords = self.getLocation().getMapCoordinates() 
     418        map_coords.X, map_coords.Y = float(coords[0]), float (coords[1]) 
     419        self.teleport(map_coords) 
     420 
     421    coords = property (_getCoords, _setCoords,  
     422        doc = "Property allowing you to get and set the object's \ 
     423                coordinates via tuples") 
  • trunk/game/scripts/objects/base.py

    r553 r563  
    5656class DynamicObject (object): 
    5757    """A base class that only supports dynamic attributes functionality""" 
    58     def __init__ (self, name="Dynamic object", image=None, **kwargs): 
     58    def __init__ (self, name="Dynamic object", real_name=None, image=None, **kwargs): 
    5959        """Initialise minimalistic set of data 
    6060           @type name: String 
     
    6363           @param name: Filename of image to use in inventory""" 
    6464        self.name = name 
     65        self.real_name = real_name or name 
    6566        self.image = image 
    6667 
     
    9192           is_%attr and if that attribute evaluates to True""" 
    9293        return hasattr(self,'is_%s' % attr) and getattr(self, 'is_%s' % attr) 
    93  
     94     
     95    def getStateForSaving(self): 
     96        """Returns state for saving 
     97        """ 
     98        state = {} 
     99        state["Name"] = self.name 
     100        state["RealName"] = self.real_name 
     101        state["Image"] = self.image 
     102        return state 
    94103 
    95104class GameObject (DynamicObject): 
     
    97106       first class (left to right) inherited by any game object.""" 
    98107    def __init__ (self, ID, gfx = None, xpos = 0.0, ypos = 0.0, map_id = None,  
    99                   blocking=True, name="Generic object", text="Item description", 
     108                  blocking=True, name="Generic object", real_name="Generic object", text="Item description", 
    100109                  desc="Detailed description", **kwargs): 
    101110        """Set the basic values that are shared by all game objects. 
     
    117126           @param desc: A long description of the item that is displayed when it is examined 
    118127           """ 
    119         DynamicObject.__init__(self, name, **kwargs) 
     128        DynamicObject.__init__(self, name, real_name, **kwargs) 
    120129        self.ID = ID 
    121130        self.gfx = gfx or {} 
     
    136145         
    137146    coords = property (_getCoords, _setCoords,  
    138         doc = "Property allowing you to get and set the obejct's \ 
     147        doc = "Property allowing you to get and set the object's \ 
    139148                coordinates via tuples") 
    140149     
     
    142151        """A debugging string representation of the object""" 
    143152        return "<%s:%s>" % (self.name, self.ID) 
     153 
     154    def getStateForSaving(self): 
     155        """Returns state for saving 
     156        """ 
     157        state = super(GameObject, self).getStateForSaving() 
     158        state["ObjectModel"] = self.gfx 
     159        state["Text"] = self.text 
     160        state["Desc"] = self.desc 
     161        state["Position"] = list(self.coords) 
     162        return state 
     163 
    144164 
    145165class Scriptable (object): 
     
    255275        pass 
    256276 
    257     def __init__ (self, capacity = 0, **kwargs): 
     277    def __init__ (self, capacity = 0, items = None, **kwargs): 
    258278        DynamicObject.__init__(self, **kwargs) 
    259279        Scriptable.__init__(self, **kwargs) 
     
    261281        self.items = {} 
    262282        self.capacity = capacity 
     283        if items: 
     284            for item in items: 
     285                self.placeItem(item) 
    263286         
    264287    def placeItem (self, item, index=None): 
     
    339362            return self.items[i] 
    340363        return None 
     364     
     365    def serializeItems(self): 
     366        """Returns the items as a list""" 
     367        items = [] 
     368        for index, item in self.items.iteritems(): 
     369            item_dict = item.getStateForSaving() 
     370            item_dict["index"] = index 
     371            item_dict["type"] = type(item).__name__  
     372            items.append(item_dict) 
     373        return items 
     374     
     375    def getStateForSaving(self): 
     376        """Returns state for saving 
     377        """ 
     378        ret_state = {} 
     379        ret_state["Items"] = self.serializeItems() 
     380        return ret_state 
    341381         
    342382class Living (object): 
  • trunk/game/scripts/objects/composed.py

    r553 r563  
    4343    def getWeight(self): 
    4444        """Resulting weight of a container""" 
    45         return sum((item.weight for item in self.items.values()), self.own_weight) 
     45        return sum((item.weight for item in self.items.values()),  
     46                   self.own_weight) 
    4647 
    4748    def setWeight(self, weight): 
    48         """Set container's own weight. For compatibility with inherited methods""" 
     49        """Set container's own weight.  
     50        For compatibility with inherited methods""" 
    4951        self.own_weight = weight 
    5052 
     
    6264 
    6365    def __repr__(self): 
    64         return "[%s"%self.name +str(reduce((lambda a,b: a +', '+ \ 
    65                                     str(self.items[b])), self.items,""))+" ]" 
    66  
     66        return "[%s" % self.name + str(reduce((lambda a, b: a + ', ' + \ 
     67                                    str(self.items[b])), self.items, "")) + " ]" 
     68     
    6769class SingleItemContainer (CarryableContainer) : 
    6870    """Container that can only store a single item. 
     
    7981    """Composite class that will be used for all carryable items""" 
    8082    def __init__(self, **kwargs): 
    81         GameObject.__init__(self,**kwargs) 
    82         Carryable.__init__(self,**kwargs) 
     83        GameObject.__init__(self, **kwargs) 
     84        Carryable.__init__(self, **kwargs) 
    8385 
     86    def prepareStateForSaving(self, state): 
     87        """Prepares state for saving 
     88        @type state: dictionary 
     89        @param state: State of the object   
     90        """ 
     91        del state["in_container"] 
     92 
     93    def getStateForSaving(self): 
     94        """Returns state for saving 
     95        @type state: dictionary 
     96        @param state: State of the object   
     97        """ 
     98        ret_dict = self.__dict__.copy() 
     99        self.prepareStateForSaving(ret_dict) 
     100        return ret_dict 
     101         
    84102class Door(GameObject, Lockable, Scriptable, Trappable): 
    85103    """Composite class that can be used to create doors on a map.""" 
    86     def __init__ (self, target_map_name = 'my-map', target_map = 'map/map.xml', 
     104    def __init__ (self, target_map_name = 'my-map', 
    87105                  target_x = 0.0, target_y = 0.0, **kwargs): 
    88106        GameObject.__init__(self, **kwargs) 
     
    92110        self.is_door = True 
    93111        self.target_map_name = target_map_name 
    94         self.target_map = target_map 
    95112        self.target_pos = (target_x, target_y) 
    96113        self.blocking = True 
     114 
     115    def getStateForSaving(self): 
     116        """Returns state for saving 
     117        """ 
     118        ret_dict = super(Door, self).getStateForSaving() 
     119        return ret_dict 
  • trunk/game/scripts/objects/containers.py

    r542 r563  
    2525 
    2626from composed import ImmovableContainer 
    27 from composed import CarryableItem 
    2827from fife import fife 
    2928 
     
    3332        ImmovableContainer.__init__(self, ID = object_id, name = name,  
    3433                                    gfx = gfx, text = text, **kwargs) 
    35         self.placeItem(CarryableItem(ID=987, name="Dagger456")) 
    3634         
    3735class ContainerBehaviour(fife.InstanceActionListener): 
     
    8785                                    gfx = gfx, text = text, **kwargs) 
    8886        self.behaviour = None 
    89         self.placeItem(CarryableItem(ID=987, name="Dagger456")) 
    9087 
    9188        self.is_AnimatedContainer = True 
  • trunk/game/scripts/objects/doors.py

    r477 r563  
    1818"""Containes classes defining concrete door game objects.""" 
    1919 
    20 __all__ = ["ShantyDoor",] 
     20__all__ = ["ShantyDoor", ] 
    2121 
    2222from composed import Door 
     
    2525    def __init__ (self, ID, name = 'Shanty Door', text = 'A door', 
    2626                   gfx = 'shanty-door', target_map_name = 'my-map', 
    27                    target_map = 'map.xml', target_x = 0.0, 
    28                    target_y = 0.0, **kwargs): 
     27                   target_x = 0.0, target_y = 0.0, **kwargs): 
    2928        Door.__init__(self, ID = ID, name = name, text = text, gfx = gfx, 
    3029                      target_map_name = target_map_name, 
    31                       target_map = target_map, target_x = target_x, 
     30                      target_x = target_x, 
    3231                      target_y = target_y, **kwargs) 
  • trunk/game/scripts/parpg.py

    r553 r563  
    9696        super(PARPGApplication, self).__init__(setting) 
    9797        #self.engine.getModel(self) 
    98         self.model = gamemodel.GameModel(self.engine) 
     98        self.model = gamemodel.GameModel(self.engine, setting) 
     99        self.model.maps_file = self._setting.get("PARPG", "MapsFile") 
     100        self.model.readMapFiles() 
     101        self.model.object_db_file = self._setting.get("PARPG",  
     102                                                      "ObjectDatabaseFile")  
     103        self.model.readObjectDB() 
     104        self.model.agents_directory = self._setting.get("PARPG", 
     105                                                        "AgentsDirectory")  
     106        self.model.getAgentImportFiles() 
     107        self.model.all_agents_file = self._setting.get("PARPG", "AllAgentsFile") 
     108        self.model.readAllAgents() 
     109        self.model.dialogues_directory = self._setting.get("PARPG",  
     110                                                           "DialoguesDirectory") 
     111        self.model.getDialogues() 
    99112        self.view = gamesceneview.GameSceneView(self.engine, self.model) 
    100113        self.controller = gamescenecontroller.GameSceneController(self.engine,  
    101114                                                        self.view,  
    102115                                                        self.model,  
    103                                                         self, 
    104                                                         setting) 
    105         self.model.readObjectDB(self._setting.get("PARPG",  
    106                                                   "ObjectDatabaseFile")) 
     116                                                        self) 
    107117        self.controller.initHud() 
    108118        self.listener = ApplicationListener(self.engine,  
    109119                                            self.view,  
    110120                                            self.model) 
    111         self.model.loadMap("main-map", str(self._setting.get("PARPG",  
    112                                                              "MapFile"))) 
     121        self.model.loadMap(str(self._setting.get("PARPG", "Map"))) 
     122        self.model.placeAgents() 
     123        self.model.placePC() 
    113124        pychan.init(self.engine, debug = True) 
    114125 
  • trunk/game/settings-dist.xml

    r543 r563  
    1 <?xml version='1.0' encoding='UTF-8'?> 
    2 <Settings> 
    3         <Module name="FIFE">     
    4         <Setting name="FullScreen" type="bool"> False </Setting> 
    5         <Setting name="PlaySounds" type="bool"> True </Setting> 
    6         <Setting name="RenderBackend" type="str"> OpenGL </Setting> 
     1<?xml version='1.0' encoding='UTF-8'?><!DOCTYPE Settings PUBLIC "FIFE.SettingsFile" "Settings.dtd"> 
     2<Settings>"E:/projekte/FIFE/engine/python/fife/extensions/fife_settings.py" 
     3        <Module name="FIFE"> 
     4        <Setting name="FullScreen" type="bool">False</Setting> 
     5        <Setting name="PlaySounds" type="bool">True</Setting> 
     6        <Setting name="RenderBackend" type="str">OpenGL</Setting> 
    77                <Setting name="ScreenResolution" type="str">1024x768</Setting> 
    8         <Setting name="BitsPerPixel" type="int"> 0 </Setting> 
    9         <Setting name="InitialVolume" type="float"> 5.0 </Setting> 
    10         <Setting name="SDLRemoveFakeAlpha" type="int"> 1 </Setting> 
    11         <Setting name="WindowTitle" type="str"> PARPG Demo </Setting> 
    12         <Setting name="WindowIcon" type="str"> gui/icons/window_icon.png </Setting> 
    13         <Setting name="Font" type="str"> fonts/samanata.ttf </Setting> 
    14         <Setting name="FontGlyphs" strip="0" type="str"> abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.,!?-+/():;%&amp;`'*#=[]\"</Setting> 
    15         <Setting name="DefaultFontSize" type="int"> 12 </Setting> 
    16         <Setting name="LogModules" type="list"> controller </Setting> 
    17                 <Setting name="PychanDebug" type="bool"> False </Setting> 
    18         <Setting name="LogToPrompt" type="int"> 0 </Setting> 
    19         <Setting name="LogToFile" type="int"> 0 </Setting> 
    20                 <Setting name="UsePsyco" type="bool"> False </Setting> 
    21                 <Setting name="ProfilingOn" type="bool"> False </Setting> 
    22         <Setting name="ImageChunkSize" type="int"> 256 </Setting> 
    23     </Module> 
     8        <Setting name="BitsPerPixel" type="int">0</Setting> 
     9        <Setting name="InitialVolume" type="float">5.0</Setting> 
     10        <Setting name="SDLRemoveFakeAlpha" type="int">1</Setting> 
     11        <Setting name="WindowTitle" type="str">PARPG Demo</Setting> 
     12        <Setting name="WindowIcon" type="str">gui/icons/window_icon.png</Setting> 
     13        <Setting name="Font" type="str">fonts/samanata.ttf</Setting> 
     14                <Setting name="FontGlyphs" strip="0" type="str"> abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.,!?-+/():;%&amp;`'*#=[]\"</Setting> 
     15        <Setting name="DefaultFontSize" type="int">12</Setting> 
     16        <Setting name="LogModules" type="list">controller</Setting> 
     17                <Setting name="PychanDebug" type="bool">False</Setting> 
     18        <Setting name="LogToPrompt" type="int">0</Setting> 
     19        <Setting name="LogToFile" type="int">0</Setting> 
     20                <Setting name="UsePsyco" type="bool">False</Setting> 
     21                <Setting name="ProfilingOn" type="bool">False</Setting> 
     22        <Setting name="ImageChunkSize" type="int">256</Setting> 
     23   </Module> 
    2424    <Module name="PARPG"> 
    25         <Setting name="MapFile" type="str"> maps/map.xml </Setting> 
    26         <Setting name="ObjectDatabaseFile" type="str"> objects/ObjectDatabase.yaml</Setting> 
    27         <Setting name="PCSpeed" type="int"> 3 </Setting> 
    28     </Module> 
     25        <Setting name="Map" type="str">Mall</Setting> 
     26        <Setting name="ObjectDatabaseFile" type="str">objects/ObjectDatabase.yaml</Setting> 
     27        <Setting name="MapsFile" type = "str">maps/maps.yaml</Setting> 
     28        <Setting name="AllAgentsFile" type = "str">maps/all_agents.yaml</Setting> 
     29        <Setting name="AgentsDirectory" type="str">objects/</Setting> 
     30        <Setting name="DialoguesDirectory" type="str">dialogue/</Setting> 
     31        <Setting name="PCSpeed" type="int">3</Setting> 
     32   </Module> 
    2933</Settings> 
Note: See TracChangeset for help on using the changeset viewer.