comparison 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
comparison
equal deleted inserted replaced
-1:000000000000 0:1fd2201f5c36
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 import yaml
17 from parpg.common.utils import locateFiles
18 import os.path
19
20 class Quest(object):
21 """Class that holds the information for a quest"""
22 def __init__(self, quest_id, quest_giver_id, quest_name, description,
23 variables):
24 self.quest_id = quest_id
25 self.quest_giver_id = quest_giver_id
26 self.quest_name = quest_name
27 self.description = description
28 self.quest_variables = variables
29
30 def setValue(self, variable_name, value):
31 """Set the value of a quest variable
32 @param variable_name: the name of the variable to set
33 @param value: the value you want to assign to the variable
34 @return: True on success
35 @return: False when it failes"""
36
37 if self.quest_variables.has_key(variable_name):
38 self.quest_variables[variable_name]["value"] = value
39 return True
40 else:
41 return False
42
43 def getValue(self, variable_name):
44 """Get the value of a quest_variable
45 @param variable_name: the name of the variable to set
46 @return: the value of the quest_variable"""
47 if self.quest_variables.has_key(variable_name):
48 return self.quest_variables[variable_name]["value"]
49 else:
50 return False
51
52 def getGoalValue(self, variable_name):
53 """Get the goal value of a quest_variable
54 @param variable_name: the name of the variable to set
55 @return: the goal value of the quest variable"""
56 if self.quest_variables.has_key(variable_name):
57 return self.quest_variables[variable_name]["goal_value"]
58 else:
59 return False
60
61 def increaseValue(self, variable_name, value):
62 """Increase a variable by a specified value
63 @param variable_name: the name of the variable to set
64 @param value: the value you want to increase the variable with
65 @return: True on success
66 @return: False when it fails"""
67 if self.quest_variables.has_key(variable_name):
68 self.quest_variables[variable_name]["value"] += value
69 return True
70 else:
71 return False
72
73 def decreaseValue(self, variable_name, value):
74 """Decrease a variable by a specified value
75 @param variable_name: the name of the variable to set
76 @param value: the value you want to decrease the variable with
77 @return: True on success
78 @return: False when it failes"""
79 if self.quest_variables.has_key(variable_name):
80 self.quest_variables[variable_name]["value"] -= value
81 return True
82 else:
83 return False
84
85 def isGoalValue(self, variable_name):
86 """Check if the variable has reached it's goal value
87 @param variable_name: the name of the variable to check
88 @return: True when the variable has reached the goal value
89 @return: False when it has not reached the goal value"""
90 if self.quest_variables.has_key(variable_name):
91 return self.quest_variables[variable_name]["value"] == \
92 self.quest_variables[variable_name]["goal_value"]
93 else:
94 return False
95
96 def isEqualOrBiggerThanGoalValue(self, variable_name):
97 """Check if the variable is equil or bigger then it's goal value
98 @param variable_name: the name of the variable to set
99 @return: True when it has reached or exceeded the goal value
100 @return: False when it has not reached or exceeded the goal value """
101 if variable_name in self.quest_variables:
102 return self.quest_variables[variable_name]["value"] >= \
103 self.quest_variables[variable_name]["goal_value"]
104 else:
105 return False
106
107 def restartQuest(self):
108 """Restarts the quest. This sets all values to the reset values,
109 if there is a reset value present """
110 for variable in self.quest_variables.itervalues():
111 if variable.has_key("reset_value"):
112 variable["value"] = variable["reset_value"]
113
114 class QuestEngine(dict):
115 def __init__(self, quest_dir):
116 """Create a quest engine object"""
117 dict.__init__(self)
118 self.empty_quest = Quest(None, None, None, None, {})
119 self.quests = {}
120 self.active_quests = []
121 self.finished_quests = []
122 self.failed_quests = []
123 self.quest_dir = quest_dir
124
125 def __str__(self):
126 return self.quests.__str__()
127
128 def __getitem__(self, key):
129 try:
130 return self.quests.__getitem__(key)
131 except KeyError:
132 return self.empty_quest
133
134 def items(self):
135 return self.quests.items()
136
137 def values(self):
138 return self.quests.values()
139
140 def keys(self):
141 return self.quests.keys()
142
143 def readQuests(self):
144 """Reads in the quests in the quest directory"""
145 files = locateFiles("*.yaml", self.quest_dir)
146 self.quests = {}
147 self.active_quests = []
148 self.finished_quests = []
149 self.failed_quests = []
150 for quest_file in files:
151 quest_file = os.path.relpath(quest_file).replace("\\", "/")
152 tree = yaml.load(open(quest_file))
153 quest_properties = tree["QUEST_PROPERTIES"]
154 variable_defines = tree["DEFINES"]
155
156 self.quests[quest_properties["quest_id"]] = \
157 Quest(quest_properties["quest_id"],
158 quest_properties["quest_giver_id"],
159 quest_properties["quest_name"],
160 quest_properties["description"],
161 variable_defines)
162
163 def activateQuest(self, quest_id):
164 """Add a quest to the quest log
165 @param quest: the quest id of the quest to add to the quest log
166 @return: True if succesfully added
167 @return: False if failed to add"""
168
169 if quest_id in self.quests \
170 and not (quest_id in self.active_quests \
171 or quest_id in self.finished_quests):
172 self.active_quests.append(quest_id)
173 return True
174 return False
175
176 def finishQuest(self, quest_id):
177 """Move a quest to the finished quests log
178 @param quest_id: The id of the quest you want to move
179 @return: True on success
180 @return: False when it failes"""
181 if quest_id in self.active_quests:
182 self.finished_quests.append(quest_id)
183 self.active_quests.remove(quest_id)
184 return True
185 return False
186
187 def restartQuest(self, quest_id):
188 """Restart a quest
189 @param quest_id: ID of the quest you want to restart
190 @return: True on success
191 @return: False when it failes"""
192 if quest_id in self.active_quests:
193 self.quests[quest_id].restartQuest()
194
195 def failQuest(self, quest_id):
196 """Set a quest to failed
197 @param quest_id: ID of the quest you want to fail
198 @return: True on success
199 @return: False when it failes"""
200 if quest_id in self.active_quests:
201 self.failed_quests.append(quest_id)
202 self.active_quests.remove(quest_id)
203 return True
204 return False
205
206 def hasQuest(self, quest_id):
207 """Check whether a quest is present in the quest_list.
208 It doesn't matter which state the quest is, or even if its
209 started.
210 @param quest_id: ID of the quest you want to check
211 @return: True on when the quest is in the quest log
212 @return: False when it's not in the quest log"""
213 return quest_id in self.quests
214
215 def hasActiveQuest(self, quest_id):
216 """Check whether a quest is in the quest log
217 @param quest_id: ID of the quest you want to check
218 @return: True on when the quest is in the quest log
219 @return: False when it's not in the quest log"""
220 return quest_id in self.active_quests
221
222 def hasFinishedQuest(self, quest_id):
223 """Check whether a quest is in the finished quests log
224 @param quest_id: ID of the quest you want to check
225 @return: True on when the quest is in the finished quests log
226 @return: False when it's not in the finished quests log"""
227 return quest_id in self.finished_quests
228
229 def hasFailedQuest(self, quest_id):
230 """Check whether a quest is in the failed quests log
231 @param quest_id: ID of the quest you want to check
232 @return: True on when the quest is in the failed quests log
233 @return: False when it's not in the failed quests log"""
234 return quest_id in self.failed_quests
235
236 def getStateForSaving(self):
237 """Prepares state for saving
238 @type state: dictionary
239 @param state: State of the object"""
240 ret_dict = {}
241 variables_dict = ret_dict["Variables"] = {}
242 for quest in self.quests.itervalues():
243 quest_dict = variables_dict[quest.quest_id] = {}
244 for variable, data in quest.quest_variables.iteritems():
245 quest_dict[variable] = data["value"]
246 ret_dict["ActiveQuests"] = self.active_quests
247 ret_dict["FinishedQuests"] = self.finished_quests
248 ret_dict["FailedQuests"] = self.failed_quests
249 return ret_dict
250
251 def restoreFromState(self, state):
252 """Restores the state"""
253 variables_dict = state["Variables"]
254 for quest_id, variables in variables_dict.iteritems():
255 for variable, value in variables.iteritems():
256 self.quests[quest_id].setValue(variable, value)
257 self.active_quests = state["ActiveQuests"]
258 self.finished_quests = state["FinishedQuests"]
259 self.failed_quests = state["FailedQuests"]