diff src/parpg/quest_engine.py @ 0:1fd2201f5c36

Initial commit of parpg-core.
author M. George Hansen <technopolitica@gmail.com>
date Sat, 14 May 2011 01:12:35 -0700
parents
children d60f1dab8469
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/parpg/quest_engine.py	Sat May 14 01:12:35 2011 -0700
@@ -0,0 +1,259 @@
+#   This file is part of PARPG.
+
+#   PARPG is free software: you can redistribute it and/or modify
+#   it under the terms of the GNU General Public License as published by
+#   the Free Software Foundation, either version 3 of the License, or
+#   (at your option) any later version.
+
+#   PARPG is distributed in the hope that it will be useful,
+#   but WITHOUT ANY WARRANTY; without even the implied warranty of
+#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#   GNU General Public License for more details.
+
+#   You should have received a copy of the GNU General Public License
+#   along with PARPG.  If not, see <http://www.gnu.org/licenses/>.
+
+import yaml
+from parpg.common.utils import locateFiles
+import os.path
+
+class Quest(object):
+    """Class that holds the information for a quest"""
+    def __init__(self, quest_id, quest_giver_id, quest_name, description,
+                 variables):
+        self.quest_id = quest_id
+        self.quest_giver_id = quest_giver_id
+        self.quest_name = quest_name
+        self.description = description
+        self.quest_variables = variables
+    
+    def setValue(self, variable_name, value):
+        """Set the value of a quest variable
+           @param variable_name: the name of the variable to set
+           @param value: the value you want to assign to the variable
+           @return: True on success
+           @return: False when it failes"""
+
+        if self.quest_variables.has_key(variable_name):
+            self.quest_variables[variable_name]["value"] = value
+            return True
+        else:
+            return False
+
+    def getValue(self, variable_name):
+        """Get the value of a quest_variable
+           @param variable_name: the name of the variable to set
+           @return: the value of the quest_variable"""
+        if self.quest_variables.has_key(variable_name):
+            return self.quest_variables[variable_name]["value"]
+        else:
+            return False
+
+    def getGoalValue(self, variable_name):
+        """Get the goal value of a quest_variable
+           @param variable_name: the name of the variable to set
+           @return: the goal value of the quest variable"""
+        if self.quest_variables.has_key(variable_name):
+            return self.quest_variables[variable_name]["goal_value"]
+        else:
+            return False
+
+    def increaseValue(self, variable_name, value):
+        """Increase a variable by a specified value
+           @param variable_name: the name of the variable to set
+           @param value: the value you want to increase the variable with
+           @return: True on success
+           @return: False when it fails"""
+        if self.quest_variables.has_key(variable_name):
+            self.quest_variables[variable_name]["value"] += value
+            return True
+        else:
+            return False
+
+    def decreaseValue(self, variable_name, value):
+        """Decrease a variable by a specified value
+           @param variable_name: the name of the variable to set
+           @param value: the value you want to decrease the variable with
+           @return: True on success
+           @return: False when it failes"""
+        if self.quest_variables.has_key(variable_name):
+            self.quest_variables[variable_name]["value"] -= value
+            return True
+        else:
+            return False
+
+    def isGoalValue(self, variable_name):
+        """Check if the variable has reached it's goal value
+           @param variable_name: the name of the variable to check
+           @return: True when the variable has reached the goal value
+           @return: False when it has not reached the goal value"""
+        if self.quest_variables.has_key(variable_name):
+            return self.quest_variables[variable_name]["value"] == \
+                    self.quest_variables[variable_name]["goal_value"]
+        else:
+            return False
+
+    def isEqualOrBiggerThanGoalValue(self, variable_name):
+        """Check if the variable is equil or bigger then it's goal value
+           @param variable_name: the name of the variable to set
+           @return: True when it has reached or exceeded the goal value
+           @return: False when it has not reached or exceeded the goal value """
+        if variable_name in self.quest_variables:
+            return self.quest_variables[variable_name]["value"] >= \
+                             self.quest_variables[variable_name]["goal_value"]
+        else:
+            return False
+    
+    def restartQuest(self):
+        """Restarts the quest. This sets all values to the reset values,
+        if there is a reset value present """
+        for variable in self.quest_variables.itervalues():
+            if variable.has_key("reset_value"):
+                variable["value"] = variable["reset_value"]
+
+class QuestEngine(dict):
+    def __init__(self, quest_dir):
+        """Create a quest engine object"""
+        dict.__init__(self)
+        self.empty_quest = Quest(None, None, None, None, {})
+        self.quests = {}
+        self.active_quests = []
+        self.finished_quests = []
+        self.failed_quests = []
+        self.quest_dir = quest_dir
+
+    def __str__(self):
+        return self.quests.__str__()
+
+    def __getitem__(self, key):
+        try:
+            return self.quests.__getitem__(key)
+        except KeyError:
+            return self.empty_quest
+
+    def items(self):
+        return self.quests.items()
+
+    def values(self):
+        return self.quests.values()
+
+    def keys(self):
+        return self.quests.keys()
+    
+    def readQuests(self):
+        """Reads in the quests in the quest directory"""
+        files = locateFiles("*.yaml", self.quest_dir)
+        self.quests = {}
+        self.active_quests = []
+        self.finished_quests = []
+        self.failed_quests = []
+        for quest_file in files:
+            quest_file = os.path.relpath(quest_file).replace("\\", "/")
+            tree = yaml.load(open(quest_file))
+            quest_properties = tree["QUEST_PROPERTIES"]
+            variable_defines = tree["DEFINES"]
+    
+            self.quests[quest_properties["quest_id"]] = \
+                                  Quest(quest_properties["quest_id"],
+                                        quest_properties["quest_giver_id"],
+                                        quest_properties["quest_name"],
+                                        quest_properties["description"],
+                                        variable_defines)
+
+    def activateQuest(self, quest_id):
+        """Add a quest to the quest log
+           @param quest: the quest id of the quest to add to the quest log
+           @return: True if succesfully added
+           @return: False if failed to add"""
+
+        if quest_id in self.quests \
+            and not (quest_id in self.active_quests \
+                        or quest_id in self.finished_quests):
+            self.active_quests.append(quest_id)
+            return True
+        return False
+
+    def finishQuest(self, quest_id):
+        """Move a quest to the finished quests log
+           @param quest_id: The id of the quest you want to move
+           @return: True on success
+           @return: False when it failes"""
+        if quest_id in self.active_quests:
+            self.finished_quests.append(quest_id)
+            self.active_quests.remove(quest_id)
+            return True
+        return False
+    
+    def restartQuest(self, quest_id):
+        """Restart a quest
+           @param quest_id: ID of the quest you want to restart
+           @return: True on success
+           @return: False when it failes"""
+        if quest_id in self.active_quests:
+            self.quests[quest_id].restartQuest()
+    
+    def failQuest(self, quest_id):
+        """Set a quest to failed
+           @param quest_id: ID of the quest you want to fail
+           @return: True on success
+           @return: False when it failes"""
+        if quest_id in self.active_quests:
+            self.failed_quests.append(quest_id)
+            self.active_quests.remove(quest_id)
+            return True
+        return False
+            
+    def hasQuest(self, quest_id):
+        """Check whether a quest is present in the quest_list.
+        It doesn't matter which state the quest is, or even if its
+        started.
+        @param quest_id: ID of the quest you want to check
+        @return: True on when the quest is in the quest log
+        @return: False when it's not in the quest log"""
+        return quest_id in self.quests
+
+    def hasActiveQuest(self, quest_id):
+        """Check whether a quest is in the quest log
+        @param quest_id: ID of the quest you want to check
+        @return: True on when the quest is in the quest log
+        @return: False when it's not in the quest log"""
+        return quest_id in self.active_quests
+
+    def hasFinishedQuest(self, quest_id):
+        """Check whether a quest is in the finished quests log
+        @param quest_id: ID of the quest you want to check
+        @return: True on when the quest is in the finished quests log
+        @return: False when it's not in the finished quests log"""
+        return quest_id in self.finished_quests
+    
+    def hasFailedQuest(self, quest_id):
+        """Check whether a quest is in the failed quests log
+        @param quest_id: ID of the quest you want to check
+        @return: True on when the quest is in the failed quests log
+        @return: False when it's not in the failed quests log"""
+        return quest_id in self.failed_quests
+    
+    def getStateForSaving(self):
+        """Prepares state for saving
+        @type state: dictionary
+        @param state: State of the object"""
+        ret_dict = {}
+        variables_dict = ret_dict["Variables"] = {}
+        for quest in self.quests.itervalues():
+            quest_dict = variables_dict[quest.quest_id] = {}
+            for variable, data in quest.quest_variables.iteritems():
+                quest_dict[variable] = data["value"]
+        ret_dict["ActiveQuests"] = self.active_quests
+        ret_dict["FinishedQuests"] = self.finished_quests
+        ret_dict["FailedQuests"] = self.failed_quests
+        return ret_dict
+
+    def restoreFromState(self, state):
+        """Restores the state"""
+        variables_dict = state["Variables"]
+        for quest_id, variables in variables_dict.iteritems():
+            for variable, value in variables.iteritems():
+                self.quests[quest_id].setValue(variable, value)
+        self.active_quests = state["ActiveQuests"]
+        self.finished_quests = state["FinishedQuests"]
+        self.failed_quests = state["FailedQuests"]