Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/trunk/src/orxonox/objects/quest/GlobalQuest.cc @ 4008

Last change on this file since 4008 was 3280, checked in by rgrieder, 15 years ago

Merged most of the core4 revisions back to the trunk except for:

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