Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

Last change on this file since 2328 was 2261, checked in by landauf, 16 years ago

merged questsystem2 back to trunk

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