Ignore:
Timestamp:
06/19/09 13:41:49 (10 years ago)
Author:
maximinus_parpg
Message:

Merged gamestate and engine.
Fixed a few typos.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/PARPG/scripts/engine.py

    r150 r151  
    1717 
    1818# there should be NO references to FIFE here! 
     19import pickle 
    1920from agents.hero import Hero 
    2021from agents.npc import NPC 
    21 from objects import GameObject 
    2222from objLoader import LocalXMLParser 
    2323from saver import Saver 
    24 import pickle 
    25 from gamestate import GameState 
    2624from gamedata import * 
     25from gamedata import BaseObjectData 
    2726 
    2827# design note: 
     
    3635# This other file has the name AAA_objects.xml where AAA.xml is the name 
    3736# of the original mapfile. 
    38  
    39 class MapDoor: 
    40     """A MapDoor is an item that when clicked transports the player to 
    41        another map""" 
    42     def __init__(self, name, new_map, location): 
    43         """@type name: string 
    44            @param name: name of fife object 
    45            @type new_map: string 
    46            @param new_map: name of new map 
    47            @type location: tuple 
    48            @param location: where to put the PC when map is loaded 
    49            @return: None""" 
    50         self.id = name 
    51         self.map = new_map 
    52         # location is an (int, int) which stores the intended location  
    53         # of the PC on the new map 
    54         self.targ_coords = location 
    5537 
    5638class Engine: 
     
    6648           @param view: A world instance 
    6749           @return: None""" 
    68         # a World object 
     50        # a World object (the fife stuff, essentially) 
    6951        self.view = view 
    70         self.gameState = GameState() 
    7152        self.doors = {} 
    72         self.objects = [] 
    7353        self.npcs = [] 
    7454        self.PC = None 
    7555        self.mapchange = False 
     56        # below this needs to be pickled 
     57        self.PC_old = None 
     58        self.objects = {} 
     59        self.currentMap = None 
    7660 
    7761    def reset(self): 
     
    8165        self.PC = None 
    8266        self.npcs = [] 
    83         self.objects = [] 
    8467        self.doors = {} 
    8568 
     
    9073           @return: None""" 
    9174        self.updateGameState() 
    92         f = open(filename, 'w') 
    93         pickle.dump(self.gameState, f) 
     75        try: 
     76            f = open(filename, 'r') 
     77        except(IOError): 
     78            sys.stderr.write("Error: Can't find save game\n") 
     79            return 
     80        pickle.dump(self.PC_old, f) 
     81        pickle.dump(self.objects, f) 
     82        pickle.dump(self.currentMap, f) 
    9483        f.close() 
    9584 
     
    9988           @param filename: the name of the file to load from 
    10089           @return: None""" 
    101         f = open(filename, 'r') 
    102         self.gameState = pickle.load(f) 
     90        try: 
     91            f = open(filename, 'r') 
     92        except(IOError): 
     93            sys.stderr.write("Error: Can't find save game file\n") 
     94            return 
     95        self.PC_old = pickle.load(f) 
     96        self.objects = pickle.load(f) 
     97        self.currentMap = pickle.load(f) 
    10398        f.close() 
    10499        if self.gameState.currentMap: 
     
    106101             
    107102    def updateGameState(self): 
    108         """Stores the current npcs positons in the game state.""" 
    109         #save the PC position 
    110         self.gameState.PC.posx = self.PC.getX() 
    111         self.gameState.PC.posy = self.PC.getY() 
     103        """Stores the current pc and npcs positons in the game state.""" 
     104        # save the PC position 
     105        self.PC_old.posx = self.PC.getX() 
     106        self.PC_old.posy = self.PC.getY() 
    112107        #save npc positions 
    113108        for i in self.npcs: 
    114             if str(i.id) in self.gameState.objects: 
    115                 self.gameState.getObjectById(str(i.id)).posx = i.getX() 
    116                 self.gameState.getObjectById(str(i.id)).posy = i.getY() 
     109            if str(i.id) in self.objects: 
     110                self.getObjectById(str(i.id)).posx = i.getX() 
     111                self.getObjectById(str(i.id)).posy = i.getY() 
    117112 
    118113    def loadObjects(self, filename): 
     
    151146           @return: None""" 
    152147        # sync with game data 
    153         posx, posy = 0, 0 
    154         if self.gameState.PC: 
     148        if self.PC_old: 
    155149            # use existing position 
    156             posx = self.gameState.PC.posx 
    157             posy = self.gameState.PC.posy 
     150            posx = self.PC_old.posx 
     151            posy = self.PC_old.posy 
    158152        else: 
    159153            posx = pc[0] 
    160154            posy = pc[1] 
    161155            # save the new PC to the game data 
    162             self.gameState.PC = HeroData("PC", posx, posy, "PC", self.gameState.currentMap) 
    163              
     156            self.PC_old = HeroData("PC", posx, posy, "PC", self.currentMap) 
     157        # add to game data     
    164158        self.view.addObject(float(posx), float(posy),"PC","PC") 
    165159         # create the PC agent 
     
    175169           @return: None""" 
    176170        for i in objects: 
    177             # add it to the game state 
    178             ref = self.gameState.getObjectById(i.id)  
     171            # already in game data? 
     172            ref = self.getObjectById(i.id) 
    179173            if ref is None: 
    180                 i.map = self.gameState.currentMap 
    181                 self.gameState.objects[str(i.id)] = i 
     174                # no, add it to the game state 
     175                i.map = self.currentMap 
     176                self.objects[i.id] = i 
    182177            else: 
    183                 # use the current game state data 
     178                # yes, use the current game state data 
    184179                i.posx = ref.posx 
    185180                i.posy = ref.posy 
    186181                i.gfx = ref.gfx         
    187182            # is it visible? 
    188             if(i.display): 
     183            if(i.display == True): 
    189184                self.view.addObject(i.posx, i.posy, i.gfx, i.id) 
    190185 
     
    195190           @return: None""" 
    196191        for i in npcs: 
    197             # add it to the game state 
    198             ref = self.gameState.getObjectById(i.id)  
     192            # already in the game data? 
     193            ref = self.getObjectById(i.id)  
    199194            if ref is None: 
    200                 i.map = self.gameState.currentMap 
    201                 self.gameState.objects[i.id] = i 
     195                # no, add it to the game state 
     196                i.map = self.currentMap 
     197                self.objects[i.id] = i 
    202198            else: 
    203                 # use the current game state data 
     199                # yes, use the current game state data 
    204200                i.posx = ref.posx 
    205201                i.posy = ref.posy 
     
    227223           @rtype: boolean 
    228224           @return: Status of result (True/False)""" 
    229         for i in self.gameState.getObjectsFromMap(self.gameState.currentMap): 
     225        for i in self.getObjectsFromMap(self.currentMap): 
    230226            if i.display and (i.id == ident): 
    231227                # we found a match 
     
    243239        # note: ALWAYS check NPC's first! 
    244240        # is it an NPC? 
    245         for i in self.gameState.getObjectsFromMap(self.gameState.currentMap): 
     241        for i in self.getObjectsFromMap(self.currentMap): 
    246242            if(obj_id == i.id): 
    247243                if isinstance(i, NpcData): 
     
    274270        # then we update FIFE with the PC, NPC and object details 
    275271        self.reset() 
    276         self.gameState.currentMap = map_file 
     272        self.currentMap = map_file 
    277273        self.loadObjects(map_file[:-4] + "_objects.xml") 
    278274 
     
    294290        self.updateGameState() 
    295291        # set the PC position 
    296         self.gameState.PC.posx = targetPosition[0] 
    297         self.gameState.PC.posy = targetPosition[1] 
     292        self.PC_old.posx = targetPosition[0] 
     293        self.PC_old.posy = targetPosition[1] 
    298294        # set the parameters for the mapchange 
    299295        self.targetMap = map 
     
    301297        self.mapchange = True 
    302298 
     299    def getObjectsFromMap(self, cmap): 
     300        """Gets all objects that are currently on the given map. 
     301           @type cmap: String 
     302           @param cmap: The map name. 
     303           @returns: The list of objects on this map.""" 
     304        return [i for i in self.objects.values() if i.map == cmap] 
     305     
     306    def getObjectById(self, ident): 
     307        """Gets an object by it's id 
     308           @type ident: String 
     309           @param ident: The id of the object. 
     310           @returns: The object or None.""" 
     311        if ident in self.objects: 
     312            return self.objects[ident] 
     313 
    303314    def handleCommands(self): 
    304315        if self.mapchange: 
Note: See TracChangeset for help on using the changeset viewer.