Changeset 570 for trunk/game/scripts


Ignore:
Timestamp:
06/29/10 17:09:38 (10 years ago)
Author:
beliar
Message:

Patch by Beliar.

  • Quest files are now read in and parsed at the start of the game. and the Quests stored in the quests property of quest_engine. This allows quest variables to be set even when the quest is not active.
  • replaced addQuest with activateQuest which now only accepts the quest_id as a parameter.
  • Removed deleteQuest and added failQuest instead
  • Added a function to restart a quest, this will reset quest_variables that have a "reset_value" property to this value.
  • Modified Dialogue and Quest files to work with the changes
  • Added "QuestsDirectory?" setting to the settings file. Please delete your old settings.xml and let the game recreate it.
Location:
trunk/game/scripts
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/game/scripts/dialogue.py

    r553 r570  
    210210                self.callbacks["start_quest"](state, 
    211211                        command.get("start_quest")) 
    212  
     212             
     213            elif command.get("restart_quest"): 
     214                self.callbacks["restart_quest"](state, 
     215                        command.get("restart_quest")) 
     216             
    213217            elif command.get("complete_quest"): 
    214218                self.callbacks["complete_quest"](state, 
    215219                        command.get("complete_quest")) 
    216220 
    217             elif command.get("delete_quest"): 
    218                 self.callbacks["delete_quest"](state, 
    219                         command.get("delete_quest")) 
     221            elif command.get("fail_quest"): 
     222                self.callbacks["fail_quest"](state, 
     223                        command.get("fail_quest")) 
    220224 
    221225            elif command.get("increase_value"): 
  • trunk/game/scripts/dialoguevalidator.py

    r479 r570  
    111111                #TODO: verify person  
    112112                elif action in ("complete_quest", "start_quest", \ 
    113                                 "delete_quest"): 
     113                                "restart_quest", "fail_quest"): 
    114114                    if not isinstance(entry[action], types.StringType): 
    115115                        raise DialogueFormatException(\ 
  • trunk/game/scripts/gamemodel.py

    r569 r570  
    1717 
    1818# there should be NO references to FIFE here! 
    19 import pickle 
    2019import sys 
    2120import os.path 
     
    2827from common.utils import parseBool 
    2928from inventory import Inventory 
     29from scripts.quest_engine import QuestEngine 
     30 
    3031try: 
    3132    import xml.etree.cElementTree as ElementTree 
     
    5556        self.savegame = None 
    5657        self.game_state = GameState() 
     58        self.game_state.quest_engine = QuestEngine(\ 
     59                                            settings.get("PARPG", 
     60                                                         "QuestsDirectory")) 
     61        self.game_state.quest_engine.readQuests() 
    5762        self.pc_run = 1 
    5863        self.target_position = None 
  • trunk/game/scripts/gamestate.py

    r565 r570  
    2222    def __init__(self): 
    2323        self.PlayerCharacter = None 
    24         self.quest_engine = quest_engine.QuestEngine() 
     24        self.quest_engine = None 
    2525        self.objects = {} 
    2626        self.object_ids = {} 
  • trunk/game/scripts/gui/dialoguegui.py

    r569 r570  
    2929        def start_quest(state, quest): 
    3030            print "You've picked up the '%s' quest!" % quest 
    31             state['quest'].addQuest(quest) 
     31            state['quest'].activateQuest(quest) 
    3232 
    3333        def complete_quest(state, quest_id): 
     
    3535            state['quest'].finishQuest(quest_id) 
    3636 
    37         def delete_quest(state, quest_id): 
    38             print "You've deleted quest %s" % quest_id 
    39             state['quest'].deleteQuest(quest_id) 
    40  
    41         def increase_value(state, quest_id, variable, value): 
     37        def fail_quest(state, quest_id): 
     38            print "You've failed quest %s" % quest_id 
     39            state['quest'].failQuest(quest_id) 
     40             
     41        def restart_quest(state, quest_id): 
     42            print "You've restarted quest %s" % quest_id 
     43            state['quest'].restartQuest(quest_id) 
     44 
     45        def increase_quest_value(state, quest_id, variable, value): 
    4246            print "Increased %s by %i"%(variable,value) 
    4347            state['quest'][quest_id].increaseValue(variable,value) 
    4448 
    45         def decrease_value(state, quest_id, variable, value): 
     49        def decrease_quest_value(state, quest_id, variable, value): 
    4650            print "Decreased %s by %i"%(variable,value) 
    4751            state['quest'][quest_id].decreaseValue(variable,value) 
     
    7175        dialogue_callbacks = { 
    7276            'complete_quest': complete_quest, 
    73             'decrease_value': decrease_value, 
    74             'delete_quest'  : delete_quest, 
     77            'decrease_quest_value': decrease_quest_value, 
     78            'fail_quest'  : fail_quest, 
    7579            'end'           : self.handleEnd, 
    7680            'get_stuff'     : get_stuff, 
    77             'increase_value': increase_value, 
     81            'increase_quest_value': increase_quest_value, 
    7882            'meet'          : meet, 
    7983            'npc_name'      : self.handleNpcName, 
     
    8387            'set_value'     : set_value, 
    8488            'start_quest'   : start_quest, 
     89            "restart_quest" : restart_quest, 
    8590            'give_stuff'    : give_stuff 
    8691        } 
  • trunk/game/scripts/gui/inventorygui.py

    r568 r570  
    121121            if item and item.trueAttr("usable"): 
    122122                actions = item.actions 
     123                if not actions: 
     124                    return 
    123125                menu_actions = [] 
    124126                x_pos, y_pos = widget.getAbsolutePos() 
  • trunk/game/scripts/gui/popups.py

    r568 r570  
    125125            if item and item.trueAttr("usable"): 
    126126                actions = item.actions 
     127                if not actions: 
     128                    return 
    127129                menu_actions = [] 
    128130                x_pos, y_pos = widget.getAbsolutePos() 
  • trunk/game/scripts/quest_engine.py

    r476 r570  
    1717 
    1818import yaml 
     19from scripts.common.utils import locateFiles 
     20import os.path 
    1921 
    2022class Quest(object): 
     
    2729        self.description = description 
    2830        self.quest_variables = variables 
    29  
     31        pass 
     32     
    3033    def setValue(self, variable_name, value): 
    3134        """Set the value of a quest variable 
     
    105108        else: 
    106109            return False 
     110     
     111    def restartQuest(self): 
     112        """Restarts the quest. This sets all values to the reset values, 
     113        if there is a reset value present 
     114        """ 
     115        for variable in self.quest_variables: 
     116            if variable.has_key["reset_value"]: 
     117                variable["value"] = variable["reset_value"] 
    107118 
    108119class QuestEngine(dict): 
    109     def __init__(self): 
     120    def __init__(self, quest_dir): 
    110121        """Create a quest engine object""" 
    111122        dict.__init__(self) 
    112         self.empty_quest = Quest(None,None,None,None,{}) 
    113         self.active_quests = {} 
    114         self.finished_quests = {} 
     123        self.empty_quest = Quest(None, None, None, None, {}) 
     124        self.quests = {} 
     125        self.active_quests = [] 
     126        self.finished_quests = [] 
     127        self.failed_quests = [] 
     128        self.quest_dir = quest_dir 
    115129 
    116130    def __str__(self): 
    117         return self.active_quests.__str__() 
     131        return self.quests.__str__() 
    118132 
    119133    def __getitem__(self, key): 
    120134        try: 
    121             return self.active_quests.__getitem__(key) 
     135            return self.quests.__getitem__(key) 
    122136        except KeyError: 
    123137            return self.empty_quest 
    124138 
    125139    def items(self): 
    126         return self.active_quests.items() 
     140        return self.quests.items() 
    127141 
    128142    def values(self): 
    129         return self.active_quests.values() 
     143        return self.quests.values() 
    130144 
    131145    def keys(self): 
    132         return self.active_quests.keys() 
    133  
    134     def addQuest(self, quest): 
     146        return self.quests.keys() 
     147     
     148    def readQuests(self): 
     149        """Reads in the quests in the quest directory""" 
     150        files = locateFiles("*.yaml", self.quest_dir) 
     151        for quest_file in files: 
     152            quest_file = os.path.relpath(quest_file).replace("\\", "/") 
     153            tree = yaml.load(open(quest_file)) 
     154            quest_properties = tree["QUEST_PROPERTIES"] 
     155            variable_defines = tree["DEFINES"] 
     156     
     157            self.quests[quest_properties["quest_id"]] = \ 
     158                                  Quest(quest_properties["quest_id"], 
     159                                        quest_properties["quest_giver_id"], 
     160                                        quest_properties["quest_name"], 
     161                                        quest_properties["description"], 
     162                                        variable_defines) 
     163 
     164    def activateQuest(self, quest_id): 
    135165        """Add a quest to the quest log 
    136            @param quest: the quest file or tree to add to the quest log 
     166           @param quest: the quest id of the quest to add to the quest log 
    137167           @return: True if succesfully added 
    138168           @return: False if failed to add""" 
    139169 
    140         if isinstance(quest, str): 
    141             # Convert YAML to Quest 
    142             tree = yaml.load(file(quest)) 
    143  
    144         if isinstance(quest, dict): 
    145             tree = quest 
    146  
    147         quest_properties = tree["QUEST_PROPERTIES"] 
    148         variable_defines = tree["DEFINES"] 
    149  
    150         self.active_quests[quest_properties["quest_id"]] = \ 
    151                               Quest(quest_properties["quest_id"], 
    152                                     quest_properties["quest_giver_id"], 
    153                                     quest_properties["quest_name"], 
    154                                     quest_properties["description"], 
    155                                     variable_defines) 
    156         return True 
     170        if quest_id in self.quests \ 
     171            and not (quest_id in self.active_quests \ 
     172                        or quest_id in self.finished_quests): 
     173            self.active_quests.append(quest_id) 
     174            return True 
     175        return False 
    157176 
    158177    def finishQuest(self, quest_id): 
     
    161180           @return: True on success 
    162181           @return: False when it failes""" 
    163         if self.active_quests.has_key(quest_id): 
    164             #Transfer to finished list 
     182        if quest_id in self.active_quests: 
    165183            self.finished_quests[quest_id] = self.active_quests[quest_id] 
    166184            del self.active_quests[quest_id] 
    167185            return True 
    168         elif self.finished_quests.has_key(quest_id): 
    169             #Temporary fix 
    170             return True 
    171         else: 
    172             return False 
    173  
     186        return False 
     187     
     188    def restartQuest(self, quest_id): 
     189        """Restart a quest 
     190           @param quest_id: ID of the quest you want to restart 
     191           @return: True on success 
     192           @return: False when it failes""" 
     193        if quest_id in self.active_quests: 
     194            self.quests[quest_id].restartQuest() 
     195     
     196    def failQuest(self, quest_id): 
     197        """Set a quest to failed 
     198           @param quest_id: ID of the quest you want to fail 
     199           @return: True on success 
     200           @return: False when it failes""" 
     201        if quest_id in self.active_quests: 
     202            self.failed_quests[quest_id] = self.active_quests[quest_id] 
     203            del self.active_quests[quest_id] 
     204            return True 
     205        return False 
     206             
    174207    def hasQuest(self, quest_id): 
    175         """Check wether a quest is in the quest log 
    176            @param quest_id: ID of the quest you want to check 
    177            @return: True on when the quest is in the quest log 
    178            @return: False when it's not in the quest log""" 
    179         if quest_id in self.active_quests.keys(): 
    180             return True 
    181         else: 
    182             return False 
     208        """Check whether a quest is present in the quest_list. 
     209        It doesn't matter which state the quest is, or even if its 
     210        started. 
     211        @param quest_id: ID of the quest you want to check 
     212        @return: True on when the quest is in the quest log 
     213        @return: False when it's not in the quest log""" 
     214        return quest_id in self.quests 
     215 
     216    def hasActiveQuest(self, quest_id): 
     217        """Check whether a quest is in the quest log 
     218        @param quest_id: ID of the quest you want to check 
     219        @return: True on when the quest is in the quest log 
     220        @return: False when it's not in the quest log""" 
     221        return quest_id in self.active_quests 
    183222 
    184223    def hasFinishedQuest(self, quest_id): 
    185         """Check wether a quest is in the finished quests log 
    186            @param quest_id: ID of the quest you want to check 
    187            @return: True on when the quest is in the fisnished quests log 
    188            @return: False when it's not in the finished quests log""" 
    189         if quest_id in self.finished_quests.keys(): 
    190             return True 
    191         else: 
    192             return False 
    193  
    194     def deleteQuest(self, quest_id): 
    195         """Delete a quest 
    196            @param quest_id: ID of the quest you want to delete 
    197            @return: True on success 
    198            @return: False when it failes""" 
    199         if quest_id in self.active_quests.keys(): 
    200             del self.active_quests[quest_id] 
    201             return True 
    202         elif quest_id in self.finished_quests.keys(): 
    203             del self.finished_quests[quest_id] 
    204             return True 
    205         return False 
     224        """Check whether a quest is in the finished quests log 
     225        @param quest_id: ID of the quest you want to check 
     226        @return: True on when the quest is in the finished quests log 
     227        @return: False when it's not in the finished quests log""" 
     228        return quest_id in self.finished_quests 
     229     
     230    def hasFailedQuest(self, quest_id): 
     231        """Check whether a quest is in the failed quests log 
     232        @param quest_id: ID of the quest you want to check 
     233        @return: True on when the quest is in the failed quests log 
     234        @return: False when it's not in the failed quests log""" 
     235        return quest_id in self.failed_quests 
Note: See TracChangeset for help on using the changeset viewer.