Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

Last change on this file since 2208 was 2205, checked in by dafrick, 16 years ago

Changed from ControllableEntity to PlayerInfo…

File size: 8.1 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(2) << "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(2) << "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        return this->isInactive(player) ||  this->isActive(player);
150    }
151
152    /**
153    @brief
154        Checks whether the Quest can be failed.
155    @param player
156        The player for whom is to be checked.
157    @return
158        Returns true if the Quest can be failed, false if not.
159    @throws
160        Throws an Exception if isActive() throws one.
161    */
162    bool GlobalQuest::isFailable(const PlayerInfo* player) const
163    {
164        return this->isActive(player);
165
166    }
167
168    /**
169    @brief
170        Checks whether the Quest can be completed.
171    @param player
172        The player for whom is to be checked.
173    @return
174        Returns true if the Quest can be completed, false if not.
175    @throws
176        Throws an Exception if isActive() throws one.
177    */
178    bool GlobalQuest::isCompletable(const PlayerInfo* player) const
179    {
180        return this->isActive(player);
181    }
182
183    /**
184    @brief
185        Returns the status of the Quest for a specific player.
186    @param player
187        The player.
188    @throws
189        Throws an Exception if player is NULL.
190    */
191    questStatus::Enum GlobalQuest::getStatus(const PlayerInfo* player) const
192    {
193        if(player == NULL) //!< We don't want NULL-Pointers!
194        {
195            ThrowException(Argument, "The input PlayerInfo* is NULL.");
196        }
197
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.
201        {
202            return this->status_;
203        }
204
205        return questStatus::inactive;
206    }
207
208    /**
209    @brief
210        Sets the status for a specific player.
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.
212    @param player
213        The player.
214    @param status
215        The status to be set.
216    @return
217        Returns false if player is NULL.
218    */
219    bool GlobalQuest::setStatus(PlayerInfo* player, const questStatus::Enum & status)
220    {
221        if(player == NULL) //!< We don't want NULL-Pointers!
222        {
223            return false;
224        }
225
226        //! Find the player.
227        std::set<PlayerInfo*>::const_iterator it = this->players_.find(player);
228        if (it == this->players_.end()) //!< Player is not yet in the list.
229        {
230            this->players_.insert(player); //!< Add the player to the set.
231        }
232       
233        this->status_ = status; //!< Set the status, which is global, remember...?
234        return true;
235    }
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        }
252
253        this->rewards_.push_back(effect); //!< Add the QuestEffect to the list.
254
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
282}
Note: See TracBrowser for help on using the repository browser.