Ticket #126: quest.diff

File quest.diff, 16.5 KB (added by Vaporice, 10 years ago)
  • dialogue_demo.py

     
    1616#   along with PARPG.  If not, see <http://www.gnu.org/licenses/>. 
    1717 
    1818from scripts import dialogue 
     19from scripts import quest_engine 
    1920import yaml 
    2021import sys 
    2122 
     
    5859        if npc in self.peopleIknow: 
    5960            raise RuntimeError("I already know %s" % npc) 
    6061        self.peopleIknow.add(npc) 
    61          
     62  
    6263    def met(self,npc): 
    6364        return npc in self.peopleIknow 
    6465         
     
    106107 
    107108    def start_quest(state, quest): 
    108109        print "You've picked up the '%s' quest!" % quest 
    109         state['pc'].startQuest(quest) 
     110        state['quest'].addQuest(quest) 
    110111 
    111     def complete_quest(state, quest): 
    112         print "You've finished the '%s' quest" % quest 
    113         state['pc'].completeQuest(quest) 
     112    def complete_quest(state, quest_id): 
     113        print "You've finished the quest %i" % quest_id 
     114        state['quest'].finishQuest(quest_id) 
     115 
     116    def delete_quest(state, quest_id): 
     117        print "You've deleted quest %i" % quest_id 
     118        state['quest'].deleteQuest(quest_id) 
     119 
     120    def increase_value(state, quest_id, variable, value): 
     121        print "Increased %s by %i"%(variable,value) 
     122        state['quest'][quest_id].increaseValue(variable,value) 
     123 
     124    def decrease_value(state, quest_id, variable, value): 
     125        print "Decreased %s by %i"%(variable,value) 
     126        state['quest'][quest_id].decreaseValue(variable,value) 
     127 
     128    def set_value(state,quest_id, variable, value): 
     129        print "Set %s to %i"%(variable,value) 
     130        state['quest'][quest_id].setValue(variable,value) 
     131 
    114132  
    115133    def meet(state, npc): 
    116134        print "You've met %s!" % npc 
     
    130148        "say": say_cb, 
    131149        "start_quest": start_quest, 
    132150        "complete_quest": complete_quest, 
     151        "delete_quest": delete_quest, 
     152        "increase_value": increase_value, 
     153        "decrease_value": decrease_value, 
     154        "set_value": set_value, 
    133155        "meet": meet, 
    134156        "get_stuff" : get_stuff, 
    135157        "take_stuff" : take_stuff 
     
    137159 
    138160    pc = Player() 
    139161    box = Box() 
    140      
     162    quest = quest_engine.QuestEngine() 
     163 
    141164    state = { 
    142         'quests': {}, 
     165        'quest': quest, 
    143166        'pc': pc, 
    144167        'box': box 
    145168    } 
     
    151174        responses = dialog.reply(choice) 
    152175 
    153176if __name__ == "__main__": 
    154     dialogue_file = 'dialogue/sample.yaml' 
     177    print "1 - Dialogue sample\n2 - Quest Sample" 
     178    choice = input("> ") 
     179    if choice == 1: 
     180        dialogue_file = 'dialogue/drunkard.yaml' 
     181    elif choice == 2: 
     182        dialogue_file = 'dialogue/quest_sample.yaml' 
    155183    if len(sys.argv) > 1: 
    156184        dialogue_file = sys.argv[1] 
    157185         
  • scripts/dialogue.py

     
    208208                self.callbacks["complete_quest"](state, \ 
    209209                                                 command.get("complete_quest")) 
    210210 
     211            elif command.get("delete_quest"): 
     212                self.callbacks["delete_quest"](state, \ 
     213                                                command.get("delete_quest")) 
     214 
     215            elif command.get("increase_value"): 
     216                self.callbacks["increase_value"](state, \ 
     217                                              command.get("increase_value")["quest"], 
     218                                              command.get("increase_value")["variable"], 
     219                                              command.get("increase_value")["value"]) 
     220 
     221            elif command.get("decrease_value"): 
     222                self.callbacks["decrease_value"](state, \ 
     223                                              command.get("decrease_value")["quest"], 
     224                                              command.get("decrease_value")["variable"], 
     225                                              command.get("decrease_value")["value"]) 
     226 
     227            elif command.get("set_value"): 
     228                self.callbacks["set_value"](state, \ 
     229                                              command.get("set_value")["quest"], 
     230                                              command.get("set_value")["variable"], 
     231                                              command.get("set_value")["value"]) 
     232 
     233 
    211234            elif command.get("meet"): 
    212235                self.callbacks["meet"](state, \ 
    213236                                                 command.get("meet")) 
    214  
    215237            elif command.get("get_stuff"): 
    216238                self.callbacks["get_stuff"](state, \ 
    217239                                                 command.get("get_stuff")) 
  • scripts/quest_engine.py

     
     1import yaml 
     2 
     3class Quest(object): 
     4    def __init__(self, quest_id, quest_giver_id, quest_name, description, variables): 
     5        """This holds all the quest information""" 
     6        self.quest_id = quest_id 
     7        self.quest_giver_id = quest_giver_id 
     8        self.quest_name = quest_name 
     9        self.description = description 
     10        self.quest_variables = variables 
     11 
     12    def setValue(self, variable_name, value): 
     13        """Set the value of a quest variable 
     14           @param variable_name: the name of the variable to set 
     15           @param value: the value you want to assign to the variable 
     16           @return: True on success 
     17           @return: False when it failes""" 
     18         
     19        if self.quest_variables.has_key(variable_name): 
     20            self.quest_variables[variable_name]["value"] = value 
     21            return True 
     22        else: 
     23            return False 
     24 
     25    def getValue(self, variable_name): 
     26        """Get the value of a quest_variable 
     27           @param variable_name: the name of the variable to set 
     28           @return: the value of the quest_variable""" 
     29        if self.quest_variables.has_key(variable_name): 
     30            return self.quest_variables[variable_name]["value"] 
     31        else:    
     32            return False 
     33         
     34     
     35    def getGoalValue(self, variable_name): 
     36        """Get the goal value of a quest_variable 
     37           @param variable_name: the name of the variable to set 
     38           @return: the goal value of the quest variable""" 
     39        if self.quest_variables.has_key(variable_name): 
     40            return self.quest_variables[variable_name]["goal_value"] 
     41        else: 
     42            return False 
     43 
     44    def increaseValue(self, variable_name, value): 
     45        """Increase a variable by a specified value 
     46           @param variable_name: the name of the variable to set 
     47           @param value: the value you want to increase the variable with 
     48           @return: True on success 
     49           @return: False when it failes""" 
     50        if self.quest_variables.has_key(variable_name): 
     51            self.quest_variables[variable_name]["value"] += value 
     52            return True 
     53        else: 
     54            return False 
     55     
     56    def decreaseValue(self, variable_name, value): 
     57        """Decrease a variable by a specified value 
     58           @param variable_name: the name of the variable to set 
     59           @param value: the value you want to decrease the variable with 
     60           @return: True on success 
     61           @return: False when it failes""" 
     62        if self.quest_variables.has_key(variable_name): 
     63            self.quest_variables[variable_name]["value"] -= value 
     64            return True 
     65        else: 
     66            return False 
     67 
     68    def isGoalValue(self, variable_name): 
     69        """Check if the variable has reached it's goal value 
     70           @param variable_name: the name of the variable to check 
     71           @return: True when the variable has reached the goal value 
     72           @return: False when it has not reached the goal value""" 
     73        if self.quest_variables.has_key(variable_name): 
     74            return self.quest_variables[variable_name]["value"] == \ 
     75                    self.quest_variables[variable_name]["goal_value"] 
     76        else: 
     77            return False 
     78 
     79    def isEquelOrBiggerThanGoalValue(self, variable_name): 
     80        """Check if the variable is equil or bigger then it's goal value 
     81           @param variable_name: the name of the variable to set 
     82           @return: True when it has reached or exceeded the goal value 
     83           @return: False when it has not reached or exceeded the goal value\ 
     84           """ 
     85        if variable_name in self.quest_variables: 
     86            return self.quest_variables[variable_name]["value"] >= \ 
     87                             self.quest_variables[variable_name]["goal_value"]  
     88        else: 
     89            return False 
     90     
     91class QuestEngine(dict): 
     92    def __init__(self): 
     93        """Create a quest engine object""" 
     94        dict.__init__(self) 
     95         
     96        self.empty_quest = Quest(None,None,None,None,{}) 
     97        self.active_quests = {} 
     98        self.finished_quests = {} 
     99 
     100    def __str__(self): 
     101        return self.active_quests.__str__() 
     102 
     103    def __getitem__(self, key): 
     104        try: 
     105            return self.active_quests.__getitem__(key) 
     106        except KeyError: 
     107            return self.empty_quest  
     108 
     109    def items(self): 
     110        return self.active_quests.items() 
     111 
     112    def values(self): 
     113        return self.active_quests.values() 
     114 
     115    def keys(self): 
     116        return self.active_quests.keys() 
     117 
     118    def addQuest(self, quest): 
     119        """Add a quest to the quest log 
     120           @param quest: the quest file or tree to add to the quest log 
     121           @return: True if succesfully added 
     122           @return: False if failed to add""" 
     123       
     124        if isinstance(quest, str): 
     125            #Convert YAML to Quest 
     126            tree = yaml.load(file(quest))                 
     127  
     128        if isinstance(quest, dict): 
     129            tree = quest 
     130 
     131        quest_properties = tree["QUEST_PROPERTIES"]  
     132        variable_defines = tree["DEFINES"] 
     133     
     134        self.active_quests[quest_properties["quest_id"]] = \ 
     135                              Quest(quest_properties["quest_id"],\ 
     136                                    quest_properties["quest_giver_id"],\ 
     137                                    quest_properties["quest_name"],\ 
     138                                    quest_properties["description"],\ 
     139                                    variable_defines)  
     140        return True 
     141 
     142    def finishQuest(self, quest_id): 
     143        """Move a quest to the finished quests log 
     144           @param quest_id: The id of the quest you want to move     
     145           @return: True on success 
     146           @return: False when it failes 
     147        """         
     148        if self.active_quests.has_key(quest_id): 
     149            #Transfer to finished list 
     150            self.finished_quests[quest_id] = self.active_quests[quest_id] 
     151            del self.active_quests[quest_id] 
     152            return True 
     153        elif self.finished_quests.has_key(quest_id): 
     154            #Temporary fix 
     155            return True 
     156 
     157        else: 
     158            return False 
     159 
     160    def hasQuest(self, quest_id): 
     161        """Check wether a quest is in the quest log 
     162           @param quest_id: ID of the quest you want to check 
     163           @return: True on when the quest is in the quest log 
     164           @return: False when it's not in the quest log""" 
     165        if quest_id in self.active_quests.keys(): 
     166            return True 
     167        else: 
     168            return False 
     169 
     170    def hasFinishedQuest(self, quest_id): 
     171        """Check wether a quest is in the finished quests log 
     172           @param quest_id: ID of the quest you want to check 
     173           @return: True on when the quest is in the fisnished quests log 
     174           @return: False when it's not in the finished quests log""" 
     175        if quest_id in self.finished_quests.keys(): 
     176            return True 
     177        else: 
     178            return False 
     179 
     180         
     181    def deleteQuest(self, quest_id): 
     182        """Delete a quest 
     183           @param quest_id: ID of the quest you want to delete 
     184           @return: True on success 
     185           @return: False when it failes""" 
     186        if quest_id in self.active_quests.keys(): 
     187            del self.active_quests[quest_id] 
     188            return True 
     189        elif quest_id in self.finished_quests.keys(): 
     190            del self.finished_quests[quest_id] 
     191            return True 
     192        return False 
  • dialogue/quest_sample.yaml

     
     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 
     16--- 
     17NPC:  NPC 
     18AVATAR: gui/icons/npc.png 
     19START: main_dialog 
     20 
     21SECTIONS: 
     22    main_dialog: 
     23        - say: "Things are tough around here, let me tell you our problems" 
     24        - responses: 
     25            - 
     26 
     27              - "Here's your beer" 
     28              - finish_quest 
     29              - quest[768].isGoalValue("beer_gathered") and not quest.hasFinishedQuest(768) 
     30 
     31            -  
     32              - "No problem (finished quest)" 
     33              - main_dialog 
     34              - quest.hasFinishedQuest(768)            
     35 
     36            - 
     37              - "Give me a beer! (Cheater!)" 
     38              - give_beer  
     39              - quest.hasQuest(768) and not quest.hasFinishedQuest(768) and not quest[768].isGoalValue("beer_gathered") 
     40            
     41            - 
     42              - "I'm on it"  
     43              - main_dialog  
     44              - quest.hasQuest(768) and not quest.hasFinishedQuest(768) 
     45                #pc class should call this function (pc.hasQuest) 
     46 
     47            - 
     48              - "Sure, tell me all about it" 
     49              - listen_more 
     50              - not quest.hasQuest(768) and not quest.hasFinishedQuest(768) 
     51 
     52            - 
     53              - "That sounds boring. Bye." 
     54              - end 
     55 
     56    listen_more: 
     57        - say: "Raiders stole our cattle, our well was poisoned, and the beer is all gone!" 
     58        - responses: 
     59            # Raiders quest 
     60            - 
     61              - "I help you" 
     62              - quest_accept 
     63 
     64            - 
     65              - "Good luck with that" 
     66              - end 
     67 
     68            - 
     69              - "Fear not, gentle villager. I will return shortly with the antidote." 
     70              - back listen_more 
     71 
     72    quest_accept: 
     73        - say: "All your beer are belong to us!" 
     74        - start_quest: "beer.yaml" 
     75        - responses: 
     76            - 
     77              - "Right..." 
     78              - main_dialog 
     79     
     80    give_beer: 
     81        - say: "Here's your beer..." 
     82        - increase_value: 
     83            quest: 768 
     84            variable: "beer_gathered" 
     85            value: 1 
     86        - responses: 
     87            - 
     88              - "Thanks." 
     89              - main_dialog 
     90 
     91    finish_quest: 
     92        - say: "This is the good stuff! *hik*" 
     93        - complete_quest: 768 
     94        - responses: 
     95            - 
     96              - "Sigh" 
     97              - main_dialog 
     98 
     99    stop_quest: 
     100        - say: "Jerk." 
     101        - delete_quest: 768 
     102        - responses: 
     103            - 
     104              - "That's how they call me!" 
     105              - main_dialog 
  • beer.yaml

     
     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 
     16DEFINES: 
     17    beer_gathered: 
     18        value: 0 
     19        goal_value: 5 
     20  
     21 
     22QUEST_PROPERTIES: 
     23    quest_id: 768 
     24    quest_giver_id: 12 
     25    quest_name: "Where's me beer!?" 
     26    description: "Arr, I need beer!" 
     27