Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/Presentation_HS17_merge/src/modules/questsystem/Quest.cc @ 11774

Last change on this file since 11774 was 11774, checked in by landauf, 6 years ago

merged Waypoints_HS17

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