Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/core7/src/modules/questsystem/Quest.cc @ 10400

Last change on this file since 10400 was 10362, checked in by landauf, 10 years ago

use static identifier initializer to store the inheritance definition of abstract classes. this prevents that identifiers are used (via Class(Name)) before they are properly initialized.

  • Property svn:eol-style set to native
File size: 12.3 KB
Line 
1/*
2 *   ORXONOX - the hottest 3D action shooter ever to exist
3 *                    > www.orxonox.net <
4 *
5 *
6 *   License notice:
7 *
8 *   This program is free software; you can redistribute it and/or
9 *   modify it under the terms of the GNU General Public License
10 *   as published by the Free Software Foundation; either version 2
11 *   of the License, or (at your option) any later version.
12 *
13 *   This program is distributed in the hope that it will be useful,
14 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
15 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 *   GNU General Public License for more details.
17 *
18 *   You should have received a copy of the GNU General Public License
19 *   along with this program; if not, write to the Free Software
20 *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
21 *
22 *   Author:
23 *      Damian 'Mozork' Frick
24 *   Co-authors:
25 *      ...
26 *
27 */
28
29/**
30    @file Quest.cc
31    @brief Implementation of the Quest class.
32*/
33
34#include "Quest.h"
35
36#include "core/CoreIncludes.h"
37#include "core/XMLPort.h"
38
39#include "QuestDescription.h"
40#include "QuestEffect.h"
41#include "QuestHint.h"
42#include "QuestListener.h"
43#include "QuestManager.h"
44
45namespace orxonox
46{
47    RegisterAbstractClass(Quest).inheritsFrom<QuestItem>();
48
49    /**
50    @brief
51        Constructor. Registers and initializes object.
52    */
53    Quest::Quest(Context* context) : QuestItem(context)
54    {
55        RegisterObject(Quest);
56
57        this->parentQuest_ = NULL;
58    }
59
60    /**
61    @brief
62        Destructor.
63    */
64    Quest::~Quest()
65    {
66        if(this->isRegistered())
67            QuestManager::getInstance().unregisterQuest(this);
68    }
69
70    /**
71    @brief
72        Method for creating a Quest object through XML.
73    */
74    void Quest::XMLPort(Element& xmlelement, XMLPort::Mode mode)
75    {
76        SUPER(Quest, XMLPort, xmlelement, mode);
77
78        XMLPortObject(Quest, Quest, "subquests", addSubQuest, getSubQuest, xmlelement, mode);
79        XMLPortObject(Quest, QuestHint, "hints", addHint, getHint, xmlelement, mode);
80        XMLPortObject(Quest, QuestEffect, "fail-effects", addFailEffect, getFailEffect, xmlelement, mode);
81        XMLPortObject(Quest, QuestEffect, "complete-effects", addCompleteEffect, getCompleteEffect, xmlelement, mode);
82
83        QuestManager::getInstance().registerQuest(this); // Registers the Quest with the QuestManager.
84    }
85
86    /**
87    @brief
88        Sets the parent-quest of the Quest.
89    @param quest
90        A pointer to the Quest to be set as parent-quest.
91    @return
92        Returns true if the parent-quest could be set.
93    */
94    bool Quest::setParentQuest(Quest* quest)
95    {
96        assert(quest);
97
98        this->parentQuest_ = quest;
99
100        orxout(verbose, context::quests) << "Parent Quest {" << quest->getId() << "} was added to Quest {" << this->getId() << "}." << endl;
101        return true;
102    }
103
104    /**
105    @brief
106        Adds a sub-quest to the Quest.
107    @param quest
108        A pointer to the Quest to be set as sub-quest.
109    @return
110        Returns true if the sub-quest could be set.
111    */
112    bool Quest::addSubQuest(Quest* quest)
113    {
114        assert(quest);
115
116        quest->setParentQuest(this); // Sets the currentQuest (this) as parent-quest for the added sub-quest.
117        this->subQuests_.push_back(quest); // Adds the Quest to the end of the list of sub-quests.
118
119        orxout(verbose, context::quests) << "Sub Quest {" << quest->getId() << "} was added to Quest {" << this->getId() << "}." << endl;
120        return true;
121    }
122
123
124    /**
125    @brief
126        Adds a QuestHint to the list of QuestHints
127    @param hint
128        The QuestHint that should be added to the list of QuestHints.
129    @return
130        Returns true if the hint was successfully added.
131    */
132    bool Quest::addHint(QuestHint* hint)
133    {
134        assert(hint);
135
136        hint->setQuest(this); // Sets the current Quest (this) as Quest for the added QuestHint.
137        this->hints_.push_back(hint); // Adds the QuestHint to the end of the list of QuestHints.
138
139        orxout(verbose, context::quests) << "QuestHint {" << hint->getId() << "} was added to Quest {" << this->getId() << "}." << endl;
140        return true;
141    }
142
143    /**
144    @brief
145        Adds an QuestEffect to the list of fail QuestEffects.
146    @param effect
147        The QuestEffect to be added.
148    @return
149        Returns true if successful.
150    */
151    bool Quest::addFailEffect(QuestEffect* effect)
152    {
153        assert(effect);
154
155        this->failEffects_.push_back(effect); // Adds the QuestEffect to the end of the list of fail QuestEffects.
156
157        orxout(verbose, context::quests) << "A FailEffect was added to Quest {" << this->getId() << "}." << endl;
158        return true;
159    }
160
161    /**
162    @brief
163        Adds an QuestEffect to the list of complete QuestEffects.
164    @param effect
165        The QuestEffect to be added.
166    @return
167        Returns true if successful.
168    */
169    bool Quest::addCompleteEffect(QuestEffect* effect)
170    {
171        assert(effect);
172
173        this->completeEffects_.push_back(effect); // Adds the QuestEffect to the end of the list of complete QuestEffects.
174
175        orxout(verbose, context::quests) << "A CompleteEffect was added to Quest {" << this->getId() << "}." << endl;
176        return true;
177    }
178
179    /**
180    @brief
181        Returns the sub-quest at the given index.
182    @param index
183        The index.
184    @return
185        Returns a pointer to the sub-quest at the given index. NULL if there is no element at the given index.
186    */
187    const Quest* Quest::getSubQuest(unsigned int index) const
188    {
189        int i = index;
190
191        // Iterate through all subquests.
192        for (std::list<Quest*>::const_iterator subQuest = this->subQuests_.begin(); subQuest != this->subQuests_.end(); ++subQuest)
193        {
194            if(i == 0) // We're counting down...
195               return *subQuest;
196
197            i--;
198        }
199
200        return NULL; // If the index is greater than the number of elements in the list.
201    }
202
203    /**
204    @brief
205        Returns the QuestHint at the given index.
206    @param index
207        The index.
208    @return
209        Returns a pointer to the QuestHint at the given index. NULL if there is no element at the given index.
210    */
211    const QuestHint* Quest::getHint(unsigned int index) const
212    {
213        int i = index;
214
215        // Iterate through all QuestHints.
216        for (std::list<QuestHint*>::const_iterator hint = this->hints_.begin(); hint != this->hints_.end(); ++hint)
217        {
218            if(i == 0) // We're counting down...
219               return *hint;
220
221            i--;
222        }
223        return NULL; // If the index is greater than the number of elements in the list.
224    }
225
226    /**
227    @brief
228        Returns the fail QuestEffect at the given index.
229    @param index
230        The index.
231    @return
232        Returns a pointer to the fail QuestEffect at the given index. NULL if there is no element at the given index.
233    */
234    const QuestEffect* Quest::getFailEffect(unsigned int index) const
235    {
236        int i = index;
237
238        // Iterate through all fail QuestEffects.
239        for (std::list<QuestEffect*>::const_iterator effect = this->failEffects_.begin(); effect != this->failEffects_.end(); ++effect)
240        {
241            if(i == 0) // We're counting down...
242               return *effect;
243
244            i--;
245        }
246        return NULL; // If the index is greater than the number of elements in the list.
247    }
248
249    /**
250    @brief
251        Returns the complete QuestEffect at the given index.
252    @param index
253        The index.
254    @return
255        Returns a pointer to the complete QuestEffect at the given index. NULL if there is no element at the given index.
256    */
257    const QuestEffect* Quest::getCompleteEffect(unsigned int index) const
258    {
259        int i = index;
260
261        // Iterate through all complete QuestEffects.
262        for (std::list<QuestEffect*>::const_iterator effect = this->completeEffects_.begin(); effect != this->completeEffects_.end(); ++effect)
263        {
264            if(i == 0) // We're counting down...
265               return *effect;
266
267            i--;
268        }
269        return NULL; // If the index is greater than the number of elements in the list.
270    }
271
272    /**
273    @brief
274        Returns true if the quest status for the specific player is 'inactive'.
275    @param player
276        The player.
277    @return
278        Returns true if the quest status for the specific player is 'inactive'.
279    */
280    bool Quest::isInactive(const PlayerInfo* player) const
281    {
282        if(player == NULL)
283            return true;
284        return this->getStatus(player) == QuestStatus::Inactive;
285    }
286
287    /**
288    @brief
289        Returns true if the quest status for the specific player is 'active'.
290    @param player
291        The player.
292    @return
293        Returns true if the quest status for the specific player is 'active'.
294    */
295    bool Quest::isActive(const PlayerInfo* player) const
296    {
297        if(player == NULL)
298            return false;
299        return this->getStatus(player) == QuestStatus::Active;
300    }
301
302    /**
303    @brief
304        Returns true if the quest status for the specific player is 'failed'.
305    @param player
306        The player.
307    @return
308        Returns true if the quest status for the specific player is 'failed'.
309    */
310    bool Quest::isFailed(const PlayerInfo* player) const
311    {
312        if(player == NULL)
313            return false;
314        return this->getStatus(player) == QuestStatus::Failed;
315    }
316
317    /**
318    @brief
319        Returns true if the quest status for the specific player is 'completed'.
320    @param player
321        The player.
322    @return
323        Returns true if the quest status for the specific player is 'completed'.
324    */
325    bool Quest::isCompleted(const PlayerInfo* player) const
326    {
327        if(player == NULL)
328            return false;
329        return this->getStatus(player) == QuestStatus::Completed;
330    }
331
332    /**
333    @brief
334        Fails the Quest for an input player.
335    @param player
336        The player.
337    @return
338        Returns true if the Quest could be failed, false if not.
339    */
340    bool Quest::fail(PlayerInfo* player)
341    {
342        QuestListener::advertiseStatusChange(this->listeners_, "fail"); // Tells the QuestListeners, that the status has changed to failed.
343        this->setStatus(player, QuestStatus::Failed);
344
345        orxout(verbose, context::quests) << "Quest {" << this->getId() << "} is failed for player: " << player << " ." << endl;
346
347        this->getDescription()->sendFailQuestNotification(player);
348        return true;
349    }
350
351    /**
352    @brief
353        Completes the Quest for an input player.
354    @param player
355        The player.
356    @return
357        Returns true if the Quest could be completed, false if not.
358    */
359    bool Quest::complete(PlayerInfo* player)
360    {
361        QuestListener::advertiseStatusChange(this->listeners_, "complete"); // Tells the QuestListeners, that the status has changed to completed.
362        this->setStatus(player, QuestStatus::Completed);
363
364        orxout(verbose, context::quests) << "Quest {" << this->getId() << "} is completed for player: " << player << " ." << endl;
365
366        this->getDescription()->sendCompleteQuestNotification(player);
367        return true;
368    }
369
370    /**
371    @brief
372        Starts the Quest for an input player.
373    @param player
374        The player.
375    @return
376        Returns true if the Quest could be started, false if not.
377    */
378    bool Quest::start(PlayerInfo* player)
379    {
380        if(!this->isStartable(player)) // Checks whether the quest can be started.
381        {
382            orxout(verbose, context::quests) << "A non-startable quest was trying to be started." << endl;
383            return false;
384        }
385
386        orxout(verbose, context::quests) << "Quest {" << this->getId() << "} is started for player: " << player << " ." << endl;
387
388        QuestListener::advertiseStatusChange(this->listeners_, "start"); // Tells the QuestListeners, that the status has changed to active.
389
390        this->setStatus(player, QuestStatus::Active);
391
392        this->getDescription()->sendAddQuestNotification(player);
393        return true;
394    }
395
396    /**
397    @brief
398        Adds a QuestListener to the list of QuestListeners listening to this Quest.
399    @param listener
400        The QuestListener to be added.
401    @return
402        Returns true if successful, false if not.
403    */
404    bool Quest::addListener(QuestListener* listener)
405    {
406        assert(listener);
407
408        this->listeners_.push_back(listener);
409        return true;
410    }
411
412}
Note: See TracBrowser for help on using the repository browser.