Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/questsystem2/src/orxonox/objects/quest/GlobalQuest.cc @ 2578

Last change on this file since 2578 was 2258, checked in by dafrick, 16 years ago

Finalizing, found an error…

File size: 8.3 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 */
[2146]28 
29/**
30    @file GlobalQuest.cc
31    @brief
[2251]32    Implementation of the GlobalQuest class.
[2146]33*/
[1992]34
[2105]35#include "OrxonoxStableHeaders.h"
36#include "GlobalQuest.h"
37
[2205]38#include "orxonox/objects/infos/PlayerInfo.h"
[1992]39#include "core/CoreIncludes.h"
[2068]40#include "util/Exception.h"
[1992]41
[2146]42#include "QuestEffect.h"
43
[1992]44namespace orxonox {
45
46    CreateFactory(GlobalQuest);
47
[2068]48    /**
49    @brief
[2159]50        Constructor. Registers the object.
[2068]51    */
[2092]52    GlobalQuest::GlobalQuest(BaseObject* creator) : Quest(creator)
[2021]53    {
[2146]54        RegisterObject(GlobalQuest);
55    }
[2092]56
[1992]57    /**
58    @brief
59        Destructor.
60    */
61    GlobalQuest::~GlobalQuest()
62    {
[2092]63
[1992]64    }
[2146]65   
66    /**
67    @brief
68        Method for creating a GlobalQuest object through XML.
69    */
[2076]70    void GlobalQuest::XMLPort(Element& xmlelement, XMLPort::Mode mode)
71    {
72        SUPER(GlobalQuest, XMLPort, xmlelement, mode);
[2146]73       
74        XMLPortObject(GlobalQuest, QuestEffect, "reward-effects", addRewardEffect, getRewardEffects, xmlelement, mode);
[2076]75
[2081]76        COUT(3) << "New GlobalQuest {" << this->getId() << "} created." << std::endl;
[2076]77    }
[2146]78   
79    /**
80    @brief
[2191]81        Fails the Quest for all players.
82        Invokes the fail QuestEffects on all the players possessing this Quest.
[2146]83    @param player
84        The player failing it.
85    @return
[2191]86        Returns true if the Quest could be failed, false if not.
[2146]87    */
[2205]88    bool GlobalQuest::fail(PlayerInfo* player)
[2146]89    {
[2191]90        if(this->isFailable(player)) //!< Check whether the Quest can be failed.
[2146]91        {
92            this->setStatus(player, questStatus::failed);
93           
[2191]94            //! Iterate through all players possessing this Quest.
[2205]95            for(std::set<PlayerInfo*>::const_iterator it = players_.begin(); it != players_.end(); it++)
[2146]96            {
[2159]97                QuestEffect::invokeEffects(*it, this->getFailEffectList());
[2146]98            }
[2092]99
[2146]100            return true;
101        }
102       
[2251]103        COUT(4) << "A non-completable quest was trying to be failed." << std::endl;
[2146]104        return false;
105    }
106
107    /**
108    @brief
[2191]109        Completes the Quest for all players.
110        Invokes the complete QuestEffects on all the players possessing this Quest.
111        Invokes the reward QuestEffects on the player completing the Quest.
[2146]112    @param player
113        The player completing it.
114    @return
[2191]115        Returns true if the Quest could be completed, false if not.
[2146]116    */
[2205]117    bool GlobalQuest::complete(PlayerInfo* player)
[2068]118    {
[2191]119        if(this->isCompletable(player)) //!< Check whether the Quest can be completed.
[2146]120        {
121            this->setStatus(player, questStatus::completed);
122           
[2191]123            //! Iterate through all players possessing the Quest.
[2205]124            for(std::set<PlayerInfo*>::const_iterator it = players_.begin(); it != players_.end(); it++)
[2146]125            {
[2159]126                QuestEffect::invokeEffects(*it, this->getCompleteEffectList());
[2146]127            }
128           
[2191]129            QuestEffect::invokeEffects(player, this->rewards_); //!< Invoke reward QuestEffects on the player completing the Quest.
[2146]130            return true;
131        }
132       
[2251]133        COUT(4) << "A non-completable quest was trying to be completed." << std::endl;
[2146]134        return false;
[2068]135    }
[2092]136
[1996]137    /**
138    @brief
[2191]139        Checks whether the Quest can be started.
[1996]140    @param player
141        The player for whom is to be checked.
142    @return
143        Returns true if the quest can be started, false if not.
[2068]144    @throws
145        Throws an exception if either isInactive() of isActive() throws one.
[1996]146    */
[2205]147    bool GlobalQuest::isStartable(const PlayerInfo* player) const
[1996]148    {
[2258]149        if(!(this->getParentQuest() == NULL || this->getParentQuest()->isActive(player)))
150        {
151            return false;
152        }
[2226]153        return (this->isInactive(player) && !(this->status_ == questStatus::completed || this->status_ == questStatus::failed));
[1996]154    }
[2092]155
[1996]156    /**
157    @brief
[2191]158        Checks whether the Quest can be failed.
[1996]159    @param player
160        The player for whom is to be checked.
161    @return
[2191]162        Returns true if the Quest can be failed, false if not.
[2068]163    @throws
164        Throws an Exception if isActive() throws one.
[1996]165    */
[2205]166    bool GlobalQuest::isFailable(const PlayerInfo* player) const
[1996]167    {
168        return this->isActive(player);
[2068]169
[1996]170    }
[2092]171
[1996]172    /**
173    @brief
[2191]174        Checks whether the Quest can be completed.
[1996]175    @param player
176        The player for whom is to be checked.
177    @return
[2191]178        Returns true if the Quest can be completed, false if not.
[2068]179    @throws
180        Throws an Exception if isActive() throws one.
[1996]181    */
[2205]182    bool GlobalQuest::isCompletable(const PlayerInfo* player) const
[1996]183    {
184        return this->isActive(player);
185    }
[1992]186
187    /**
188    @brief
[2191]189        Returns the status of the Quest for a specific player.
[1992]190    @param player
191        The player.
[2068]192    @throws
193        Throws an Exception if player is NULL.
[1992]194    */
[2205]195    questStatus::Enum GlobalQuest::getStatus(const PlayerInfo* player) const
[1992]196    {
[2146]197        if(player == NULL) //!< We don't want NULL-Pointers!
[2068]198        {
[2205]199            ThrowException(Argument, "The input PlayerInfo* is NULL.");
[2068]200        }
[2092]201
[2146]202        //! Find the player.
[2205]203        std::set<PlayerInfo*>::const_iterator it = this->players_.find((PlayerInfo*)(void*)player);
[2146]204        if (it != this->players_.end()) //!< If the player was found.
[2093]205        {
206            return this->status_;
207        }
[1992]208
[2251]209    return questStatus::inactive;
[1992]210    }
[2092]211
[1992]212    /**
213    @brief
214        Sets the status for a specific player.
[2093]215        But be careful wit this one, the status will just be set without checking for its validity. You have to know what you're doing.
[1992]216    @param player
217        The player.
218    @param status
219        The status to be set.
[2068]220    @return
221        Returns false if player is NULL.
[1992]222    */
[2205]223    bool GlobalQuest::setStatus(PlayerInfo* player, const questStatus::Enum & status)
[1992]224    {
[2146]225        if(player == NULL) //!< We don't want NULL-Pointers!
[2068]226        {
227            return false;
[2093]228        }
[2092]229
[2146]230        //! Find the player.
[2205]231        std::set<PlayerInfo*>::const_iterator it = this->players_.find(player);
[2021]232        if (it == this->players_.end()) //!< Player is not yet in the list.
[2093]233        {
[2146]234            this->players_.insert(player); //!< Add the player to the set.
[2093]235        }
[2146]236       
237        this->status_ = status; //!< Set the status, which is global, remember...?
[2093]238        return true;
[1992]239    }
[2146]240   
241    /**
242    @brief
[2191]243        Adds a reward QuestEffect to the list of reward QuestEffects.
[2146]244    @param effect
[2191]245        The QuestEffect to be added.
[2146]246    @return
247        Returns true if successful.
248    */
249    bool GlobalQuest::addRewardEffect(QuestEffect* effect)
250    {
251        if(effect == NULL) //!< We don't want NULL-Pointers!
252        {
253            COUT(2) << "The reward effect to be added to quest {" << this->getId() << "} was NULL." << std::endl;
254            return false;
255        }
[1992]256
[2191]257        this->rewards_.push_back(effect); //!< Add the QuestEffect to the list.
[1996]258
[2146]259        COUT(3) << "Reward effect was added to Quest {" << this->getId() << "}." << std::endl;
260        return true;
261    }
262   
263    /**
264    @brief
[2191]265        Returns the reward QuestEffect at the given index.
[2146]266    @param index
267        The index.
268    @return
269        Returns the QuestEffect at the given index.
270    */
271    const QuestEffect* GlobalQuest::getRewardEffects(unsigned int index) const
272    {
273        int i = index;
274        for (std::list<QuestEffect*>::const_iterator effect = this->rewards_.begin(); effect != this->rewards_.end(); ++effect)
275        {
276            if(i == 0)
277            {
278               return *effect;
279            }
280            i--;
281        }
282        return NULL;
283    }
284
285
[1992]286}
Note: See TracBrowser for help on using the repository browser.