Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/trunk/src/orxonox/objects/quest/Quest.cc @ 2911

Last change on this file since 2911 was 2911, checked in by landauf, 15 years ago

Merged r1-2096 of questsystem5 back to trunk

I hope there weren't more "hidden merge changes" in r2909 than the one in OverlayGroup (removeElement) (and related to this the adjustments in NotificationQueue).

The corresponding media commit seems not yet to be done, but it doesn't break the build.

File size: 13.5 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 "OrxonoxStableHeaders.h"
35#include "Quest.h"
36
37#include "core/CoreIncludes.h"
38
39#include "orxonox/objects/infos/PlayerInfo.h"
40#include "QuestManager.h"
41#include "QuestDescription.h"
42#include "QuestHint.h"
43#include "QuestEffect.h"
44#include "QuestListener.h"
45
46namespace orxonox
47{
48    /**
49    @brief
50        Constructor. Registers and initializes object.
51    */
52    Quest::Quest(BaseObject* creator) : QuestItem(creator)
53    {
54        RegisterObject(Quest);
55
56        this->parentQuest_ = NULL;
57    }
58
59    /**
60    @brief
61        Destructor.
62    */
63    Quest::~Quest()
64    {
65
66    }
67
68    /**
69    @brief
70        Method for creating a Quest object through XML.
71    */
72    void Quest::XMLPort(Element& xmlelement, XMLPort::Mode mode)
73    {
74        SUPER(Quest, XMLPort, xmlelement, mode);
75
76        XMLPortObject(Quest, Quest, "subquests", addSubQuest, getSubQuest, xmlelement, mode);
77        XMLPortObject(Quest, QuestHint, "hints", addHint, getHint, xmlelement, mode);
78        XMLPortObject(Quest, QuestEffect, "fail-effects", addFailEffect, getFailEffect, xmlelement, mode);
79        XMLPortObject(Quest, QuestEffect, "complete-effects", addCompleteEffect, getCompleteEffect, xmlelement, mode);
80
81        QuestManager::getInstance().registerQuest(this); //!<Registers the Quest with the QuestManager.
82    }
83
84    /**
85    @brief
86        Sets the parentquest of the Quest.
87    @param quest
88        A pointer to the Quest to be set as parentquest.
89    @return
90        Returns true if the parentquest could be set.
91    */
92    bool Quest::setParentQuest(Quest* quest)
93    {
94        if(quest == NULL) //!< We don't want to set NULL-Pointers.
95        {
96            COUT(2) << "The parentquest to be added to quest {" << this->getId() << "} was NULL." << std::endl;
97            return false;
98        }
99
100        this->parentQuest_ = quest;
101
102        COUT(3) << "Parent Quest {" << quest->getId() << "} was added to Quest {" << this->getId() << "}." << std::endl;
103        return true;
104    }
105
106    /**
107    @brief
108        Adds a subquest to the Quest.
109    @param quest
110        A pointer to the Quest to be set as subquest.
111    @return
112        Returns true if the subquest could be set.
113    */
114    bool Quest::addSubQuest(Quest* quest)
115    {
116        if(quest == NULL) //!< We don't want to set NULL-Pointers.
117        {
118            COUT(2) << "The subquest to be added to quest {" << this->getId() << "} was NULL." << std::endl;
119            return false;
120        }
121
122        quest->setParentQuest(this); //!< Sets the currentQuest (this) as parentquest for the added subquest.
123        this->subQuests_.push_back(quest); //!< Adds the Quest to the end of the list of subquests.
124
125        COUT(3) << "Sub Quest {" << quest->getId() << "} was added to Quest {" << this->getId() << "}." << std::endl;
126        return true;
127    }
128
129
130    /**
131    @brief
132        Adds a QuestHint to the list of QuestHints
133    @param hint
134        The QuestHint that should be added to the list of QuestHints.
135    @return
136        Returns true if the hint was successfully added.
137    */
138    bool Quest::addHint(QuestHint* hint)
139    {
140        if(hint == NULL) //!< We don't want to set NULL-Pointers. Seriously!
141        {
142            COUT(2) << "A NULL-QuestHint was trying to be added." << std::endl;
143            return false;
144        }
145
146        hint->setQuest(this); //!< Sets the current Quest (this) as Quest for the added QuestHint.
147        this->hints_.push_back(hint); //!< Adds the QuestHint to the end of the list of QuestHints.
148
149        COUT(3) << "QuestHint {" << hint->getId() << "} was added to Quest {" << this->getId() << "}." << std::endl;
150        return true;
151    }
152
153    /**
154    @brief
155        Adds an QuestEffect to the list of fail QuestEffects.
156    @param effect
157        The QuestEffect to be added.
158    @return
159        Returns true if successful.
160    */
161    bool Quest::addFailEffect(QuestEffect* effect)
162    {
163        if(effect == NULL) //!< We don't want to set NULL-Pointers.
164        {
165            COUT(2) << "A NULL-QuestEffect was trying to be added" << std::endl;
166            return false;
167        }
168
169        this->failEffects_.push_back(effect); //!< Adds the QuestEffect to the end of the list of fail QuestEffects.
170
171        COUT(3) << "A FailEffect was added to Quest {" << this->getId() << "}." << std::endl;
172        return true;
173    }
174
175    /**
176    @brief
177        Adds an QuestEffect to the list of complete QuestEffects.
178    @param effect
179        The QuestEffect to be added.
180    @return
181        Returns true if successful.
182    */
183    bool Quest::addCompleteEffect(QuestEffect* effect)
184    {
185        if(effect == NULL) //!< We don't want to set NULL-Pointers.
186        {
187            COUT(2) << "A NULL-QuestEffect was trying to be added" << std::endl;
188            return false;
189        }
190
191        this->completeEffects_.push_back(effect); //!< Adds the QuestEffect to the end of the list of complete QuestEffects.
192
193        COUT(3) << "A CompleteEffect was added to Quest {" << this->getId() << "}." << std::endl;
194        return true;
195    }
196
197    /**
198    @brief
199        Returns the parentquest of the Quest.
200    @return
201        Returns a pointer to the parentquest of the Quest.
202    */
203    const Quest* Quest::getParentQuest(void)
204    {
205        return this->parentQuest_;
206    }
207
208    /**
209    @brief
210        Returns the subquest at the given index.
211    @param
212        The index.
213    @return
214        Returns a pointer to the subquest at the given index. NULL if there is no element at the given index.
215    */
216    const Quest* Quest::getSubQuest(unsigned int index) const
217    {
218        int i = index;
219       
220        //! Iterate through all subquests.
221        for (std::list<Quest*>::const_iterator subQuest = this->subQuests_.begin(); subQuest != this->subQuests_.end(); ++subQuest)
222        {
223            if(i == 0) //!< We're counting down...
224            {
225               return *subQuest;
226            }
227            i--;
228        }
229       
230        return NULL; //!< If the index is greater than the number of elements in the list.
231    }
232
233    /**
234    @brief
235        Returns the QuestHint at the given index.
236    @param
237        The index.
238    @return
239        Returns a pointer to the QuestHint at the given index. NULL if there is no element at the given index.
240    */
241    const QuestHint* Quest::getHint(unsigned int index) const
242    {
243        int i = index;
244       
245        //! Iterate through all QuestHints.
246        for (std::list<QuestHint*>::const_iterator hint = this->hints_.begin(); hint != this->hints_.end(); ++hint)
247        {
248            if(i == 0) //!< We're counting down...
249            {
250               return *hint;
251            }
252            i--;
253        }
254        return NULL; //!< If the index is greater than the number of elements in the list.
255    }
256
257    /**
258    @brief
259        Returns the fail QuestEffect at the given index.
260    @param
261        The index.
262    @return
263        Returns a pointer to the fail QuestEffect at the given index. NULL if there is no element at the given index.
264    */
265    const QuestEffect* Quest::getFailEffect(unsigned int index) const
266    {
267        int i = index;
268       
269        //! Iterate through all fail QuestEffects.
270        for (std::list<QuestEffect*>::const_iterator effect = this->failEffects_.begin(); effect != this->failEffects_.end(); ++effect)
271        {
272            if(i == 0) //!< We're counting down...
273            {
274               return *effect;
275            }
276            i--;
277        }
278        return NULL; //!< If the index is greater than the number of elements in the list.
279    }
280
281    /**
282    @brief
283        Returns the complete QuestEffect at the given index.
284    @param
285        The index.
286    @return
287        Returns a pointer to the complete QuestEffect at the given index. NULL if there is no element at the given index.
288    */
289    const QuestEffect* Quest::getCompleteEffect(unsigned int index) const
290    {
291        int i = index;
292       
293        //! Iterate through all complete QuestEffects.
294        for (std::list<QuestEffect*>::const_iterator effect = this->completeEffects_.begin(); effect != this->completeEffects_.end(); ++effect)
295        {
296            if(i == 0) //!< We're counting down...
297            {
298               return *effect;
299            }
300            i--;
301        }
302        return NULL; //!< If the index is greater than the number of elements in the list.
303    }
304
305    /**
306    @brief
307        Returns true if the quest status for the specific player is 'inactive'.
308    @param player
309        The player.
310    @return
311        Returns true if the quest status for the specific player is 'inactive'.
312    @throws
313        Throws an exception if getStatus throws one.
314    */
315    bool Quest::isInactive(const PlayerInfo* player) const
316    {
317        return this->getStatus(player) == questStatus::inactive;
318    }
319
320    /**
321    @brief
322        Returns true if the quest status for the specific player is 'active'.
323    @param player
324        The player.
325    @return
326        Returns true if the quest status for the specific player is 'active'.
327    @throws
328        Throws an exception if getStatus throws one.
329    */
330    bool Quest::isActive(const PlayerInfo* player) const
331    {
332
333        return this->getStatus(player) == questStatus::active;
334    }
335
336    /**
337    @brief
338        Returns true if the quest status for the specific player is 'failed'.
339    @param player
340        The player.
341    @return
342        Returns true if the quest status for the specific player is 'failed'.
343    @throws
344        Throws an exception if getStatus throws one.
345    */
346    bool Quest::isFailed(const PlayerInfo* player) const
347    {
348        return this->getStatus(player) == questStatus::failed;
349    }
350
351    /**
352    @brief
353        Returns true if the quest status for the specific player is 'completed'.
354    @param player
355        The player.
356    @return
357        Returns true if the quest status for the specific player is 'completed'.
358    @throws
359        Throws an exception if getStatus throws one.
360    */
361    bool Quest::isCompleted(const PlayerInfo* player) const
362    {
363        return this->getStatus(player) == questStatus::completed;
364    }
365   
366    /**
367    @brief
368        Fails the Quest for an input player.
369    @param player
370        The player.
371    @return
372        Returns true if the Quest could be failed, false if not.
373    */
374    bool Quest::fail(PlayerInfo* player)
375    {
376        QuestListener::advertiseStatusChange(this->listeners_, "fail"); //!< Tells the QuestListeners, that the status has changed to failed.
377        this->setStatus(player, questStatus::failed);
378       
379        COUT(4) << "Quest {" << this->getId() << "} is failed for player: " << player << " ." <<std::endl;
380       
381        this->getDescription()->sendFailQuestNotification();
382        return true;
383    }
384   
385    /**
386    @brief
387        Completes the Quest for an input player.
388    @param player
389        The player.
390    @return
391        Returns true if the Quest could be completed, false if not.
392    */
393    bool Quest::complete(PlayerInfo* player)
394    {
395        QuestListener::advertiseStatusChange(this->listeners_, "complete"); //!< Tells the QuestListeners, that the status has changed to completed.
396        this->setStatus(player, questStatus::completed);
397       
398        COUT(4) << "Quest {" << this->getId() << "} is completed for player: " << player << " ." <<std::endl;
399       
400        this->getDescription()->sendCompleteQuestNotification();
401        return true;
402    }
403
404    /**
405    @brief
406        Starts the Quest for an input player.
407    @param player
408        The player.
409    @return
410        Returns true if the Quest could be started, false if not.
411    */
412    bool Quest::start(PlayerInfo* player)
413    {
414        if(!this->isStartable(player)) //!< Checks whether the quest can be started.
415        {
416            COUT(4) << "A non-startable quest was trying to be started." << std::endl;
417            return false;
418        }
419       
420        COUT(4) << "Quest {" << this->getId() << "} is started for player: " << player << " ." <<std::endl;
421       
422        QuestListener::advertiseStatusChange(this->listeners_, "start"); //!< Tells the QuestListeners, that the status has changed to active.
423       
424        this->setStatus(player, questStatus::active);
425       
426        this->getDescription()->sendAddQuestNotification();
427        return true;
428    }
429   
430    /**
431    @brief
432        Adds a QuestListener to the list of QuestListeners listening to this Quest.
433    @param listener
434        The QuestListener to be added.
435    @return
436        Returns true if successful, false if not.
437    */
438    bool Quest::addListener(QuestListener* listener)
439    {
440        if(listener == NULL)
441        {
442            COUT(2) << "A NULL-QuestListener was trying to be added to a Quests listeners." << std::endl;
443            return false;
444        }
445       
446        this->listeners_.push_back(listener);
447        return true;
448    }
449
450}
Note: See TracBrowser for help on using the repository browser.