Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/ai2/src/modules/questsystem/QuestManager.cc @ 8804

Last change on this file since 8804 was 8706, checked in by dafrick, 13 years ago

Merging presentation branch back into trunk.
There are many new features and also a lot of other changes and bugfixes, if you want to know, digg through the svn log.
Not everything is yet working as it should, but it should be fairly stable. If you habe any bug reports, just send me an email.

  • Property svn:eol-style set to native
File size: 12.5 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 QuestManager.cc
31    @brief Implementation of the QuestManager class.
32*/
33
34#include "QuestManager.h"
35
36#include "util/Exception.h"
37#include "util/ScopedSingletonManager.h"
38#include "core/command/ConsoleCommand.h"
39#include "core/CoreIncludes.h"
40#include "core/GUIManager.h"
41#include "core/LuaState.h"
42
43#include "infos/PlayerInfo.h"
44
45#include "Quest.h"
46#include "QuestHint.h"
47#include "QuestItem.h"
48
49#include "ToluaBindQuestsystem.h"
50
51namespace orxonox
52{
53    // Register tolua_open function when loading the library
54    DeclareToluaInterface(Questsystem);
55
56    ManageScopedSingleton(QuestManager, ScopeID::Root, false);
57
58    /**
59    @brief
60        Constructor. Registers the object.
61    @todo
62        Is inheriting from BaseObject proper?
63    */
64    QuestManager::QuestManager()
65    {
66        RegisterRootObject(QuestManager);
67
68        COUT(3) << "QuestManager created." << std::endl;
69    }
70
71    /**
72    @brief
73        Destructor.
74    */
75    QuestManager::~QuestManager()
76    {
77        COUT(3) << "QuestManager destroyed." << std::endl;
78    }
79
80    /**
81    @brief
82        Retreive all Quests.
83    @return
84        Returns a map with all Quests indexed by their id's.
85    */
86    std::map<std::string, Quest*> & QuestManager::getQuests(void)
87    {
88        return this->questMap_;
89    }
90
91    /**
92    @brief
93        Registers a Quest with the QuestManager to make it globally accessible.
94        Uses it's id to make sure to be able to be identify and retrieve it later.
95    @param quest
96        The Quest that is to be registered.
97    @return
98        Returns true if successful, false if not.
99    */
100    bool QuestManager::registerQuest(Quest* quest)
101    {
102        assert(quest);
103
104        std::pair<std::map<std::string, Quest*>::iterator,bool> result;
105        result = this->questMap_.insert( std::pair<std::string,Quest*>(quest->getId(),quest) ); // Inserting the Quest.
106
107        if(result.second) // If inserting was a success.
108        {
109            quest->setRegistered();
110            COUT(4) << "Quest with questId {" << quest->getId() << "} successfully inserted." << std::endl;
111            return true;
112        }
113        else
114        {
115           COUT(2) << "Quest with the same id was already present." << std::endl;
116           return false;
117        }
118    }
119
120    /**
121    @brief
122        Unregisters a Quest in the QuestManager.
123    */
124    bool QuestManager::unregisterQuest(Quest* quest)
125    {
126        return this->questMap_.erase(quest->getId()) == 1;
127    }
128
129    /**
130    @brief
131        Registers a QuestHint with the QuestManager to make it globally accessible.
132        Uses it's id to make sure to be able to be identify and retrieve it later.
133    @param hint
134        The QuestHint to be registered.
135    @return
136        Returns true if successful, false if not.
137    */
138    bool QuestManager::registerHint(QuestHint* hint)
139    {
140        assert(hint);
141
142        std::pair<std::map<std::string, QuestHint*>::iterator,bool> result;
143        result = this->hintMap_.insert ( std::pair<std::string,QuestHint*>(hint->getId(),hint) ); // Inserting the QuestHSint.
144
145        if(result.second) // If inserting was a success.
146        {
147            hint->setRegistered();
148            COUT(4) << "QuestHint with hintId {" << hint->getId() << "} successfully inserted." << std::endl;
149            return true;
150        }
151        else
152        {
153           COUT(2) << "QuestHint with the same id was already present." << std::endl;
154           return false;
155        }
156    }
157
158    /**
159    @brief
160        Unregisters a QuestHint in the QuestManager.
161    */
162    bool QuestManager::unregisterHint(QuestHint* hint)
163    {
164        return this->hintMap_.erase(hint->getId()) == 1;
165    }
166
167    /**
168    @brief
169        Finds a Quest with the given id.
170    @param questId
171        The id of the Quest sought for.
172    @return
173        Returns a pointer to the Quest with the input id.
174        Returns NULL if there is no Quest with the given questId.
175    @throws
176        Throws an exception if the given questId is invalid.
177    */
178    Quest* QuestManager::findQuest(const std::string & questId)
179    {
180        if(questId == "") // Check for validity of the given id.
181            ThrowException(Argument, "Invalid questId.");
182
183        Quest* quest;
184        std::map<std::string, Quest*>::iterator it = this->questMap_.find(questId);
185        if (it != this->questMap_.end()) // If the Quest is registered.
186            quest = it->second;
187        else
188        {
189           quest = NULL;
190           COUT(2) << "The quest with id {" << questId << "} is nowhere to be found." << std::endl;
191        }
192
193        return quest;
194    }
195
196    /**
197    @brief
198        Finds a QuestHint with the given id.
199    @param hintId
200        The id of the QuestHint sought for.
201    @return
202        Returns a pointer to the QuestHint with the input id.
203        Returns NULL if there is no QuestHint with the given hintId.
204    @throws
205        Throws an exception if the given hintId is invalid.
206    */
207    QuestHint* QuestManager::findHint(const std::string & hintId)
208    {
209        if(hintId == "") // Check for validity of the given id.
210            ThrowException(Argument, "Invalid hintId.");
211
212        QuestHint* hint;
213        std::map<std::string, QuestHint*>::iterator it = this->hintMap_.find(hintId);
214        if (it != this->hintMap_.end()) // If the QuestHint is registered.
215            hint = it->second;
216        else
217        {
218           hint = NULL;
219           COUT(2) << "The hint with id {" << hintId << "} is nowhere to be found." << std::endl;
220        }
221
222        return hint;
223    }
224
225    /**
226    @brief
227        Get the number of Quests the input player has, that are root quests.
228    @param player
229        The player.
230    @return
231        Returns the number of Quests the input player has, that are root quests.
232    */
233    int QuestManager::getNumRootQuests(PlayerInfo* player)
234    {
235        int numQuests = 0;
236        for(std::map<std::string, Quest*>::iterator it = this->questMap_.begin(); it != this->questMap_.end(); it++)
237        {
238            if(it->second->getParentQuest() == NULL && !it->second->isInactive(player))
239                numQuests++;
240        }
241        return numQuests;
242    }
243
244    /**
245    @brief
246        Get the index-th root quest of the input player.
247    @param player
248        The player.
249    @param index
250        The index of the root quest.
251    @return
252        Returns the index-th root quest of the input player.
253    */
254    Quest* QuestManager::getRootQuest(PlayerInfo* player, int index)
255    {
256        for(std::map<std::string, Quest*>::iterator it = this->questMap_.begin(); it != this->questMap_.end(); it++)
257        {
258            if(it->second->getParentQuest() == NULL && !it->second->isInactive(player) && index-- == 0)
259                return it->second;
260        }
261        return NULL;
262    }
263
264    /**
265    @brief
266        Get the number of sub-quest of an input Quest for the input player.
267    @param quest
268        The quest to get the sub-quests of.
269    @param player
270        The player.
271    @return
272        Returns the number of sub-quest of an input Quest for the input player.
273    */
274    int QuestManager::getNumSubQuests(Quest* quest, PlayerInfo* player)
275    {
276        if(quest == NULL)
277            return this->getNumRootQuests(player);
278
279        std::list<Quest*> quests = quest->getSubQuestList();
280        int numQuests = 0;
281        for(std::list<Quest*>::iterator it = quests.begin(); it != quests.end(); it++)
282        {
283            if(!(*it)->isInactive(player))
284                numQuests++;
285        }
286        return numQuests;
287    }
288
289    /**
290    @brief
291        Get the index-th sub-quest of the input Quest for the input player.
292    @param quest
293        The Quest to get the sub-quest of.
294    @param player
295        The player.
296    @param index
297        The index of the sub-quest.
298    */
299    Quest* QuestManager::getSubQuest(Quest* quest, PlayerInfo* player, int index)
300    {
301        if(quest == NULL)
302            return this->getRootQuest(player, index);
303
304        std::list<Quest*> quests = quest->getSubQuestList();
305        for(std::list<Quest*>::iterator it = quests.begin(); it != quests.end(); it++)
306        {
307            if(!(*it)->isInactive(player) && index-- == 0)
308                return *it;
309        }
310        return NULL;
311    }
312
313    /**
314    @brief
315        Get the number of QuestHints of the input Quest for the input player.
316    @param quest
317        The quest to get the hints of.
318    @param player
319        The player.
320    @return
321        Returns the number of QuestHints of the input Quest for the input player.
322    */
323    int QuestManager::getNumHints(Quest* quest, PlayerInfo* player)
324    {
325        std::list<QuestHint*> hints = quest->getHintsList();
326        int numHints = 0;
327        for(std::list<QuestHint*>::iterator it = hints.begin(); it != hints.end(); it++)
328        {
329            if((*it)->isActive(player))
330                numHints++;
331        }
332        return numHints;
333    }
334
335    /**
336    @brief
337        Get the index-th QuestHint of the input Quest for the input player.
338    @param quest
339        The Quest to get the QuestHint of.
340    @param player
341        The player.
342    @param index
343        The index of the QuestHint.
344    @return
345        Returns a pointer to the index-th QuestHint of the input Quest for the input player.
346    */
347    QuestHint* QuestManager::getHints(Quest* quest, PlayerInfo* player, int index)
348    {
349        std::list<QuestHint*> hints = quest->getHintsList();
350        for(std::list<QuestHint*>::iterator it = hints.begin(); it != hints.end(); it++)
351        {
352            if((*it)->isActive(player) && index-- == 0)
353                return *it;
354        }
355        return NULL;
356    }
357
358    /**
359    @brief
360        Get the parent-quest of the input Quest.
361    @param quest
362        The Quest to get the parent-quest of.
363    @return
364        Returns a pointer to the parent-quest of the input Quest.
365    */
366    Quest* QuestManager::getParentQuest(Quest* quest)
367    {
368        return quest->getParentQuest();
369    }
370
371    /**
372    @brief
373        Get the QuestDescription of the input Quest.
374    @param item
375        The Quest to get the QuestDescription of.
376    @return
377        Return a pointer ot the QuestDescription of the input Quest.
378    */
379    QuestDescription* QuestManager::getDescription(Quest* item)
380    {
381        return item->getDescription();
382    }
383
384    /**
385    @brief
386        Get the QuestDescription of the input QuestHint.
387    @param item
388        The QuestHint to get the QuestDescription of.
389    @return
390        Returns a pointer to the QuestDescription of the input QuestHint.
391    */
392    QuestDescription* QuestManager::getDescription(QuestHint* item)
393    {
394        return item->getDescription();
395    }
396
397    /**
398    @brief
399        Get the id of the input Quest.
400    @param item
401        The Quest to get the id of.
402    @return
403        Returns the id of the input Quest.
404    */
405    const std::string QuestManager::getId(Quest* item) const
406    {
407        return item->getId();
408    }
409
410    /**
411    @brief
412        Get the id of the input QuestHint.
413    @param item
414        The QuestHint to get the id of.
415    @return
416        Returns the id of the input QuestHint.
417    */
418    const std::string QuestManager::getId(QuestHint* item) const
419    {
420        return item->getId();
421    }
422
423    /**
424    @brief
425        Retrieve the player for a certain GUI.
426    @param guiName
427        The name of the GUI the player is retrieved for.
428    @return
429        Returns the player.
430    @todo
431        This very well might be outdated. So: Check if still needed, and update if necessary.
432    */
433    PlayerInfo* QuestManager::retrievePlayer(const std::string & guiName)
434    {
435        PlayerInfo* player = GUIManager::getInstance().getPlayer(guiName);
436        if(player == NULL)
437        {
438            COUT(1) << "Error: GUIOverlay with name '" << guiName << "' has no player." << std::endl;
439            return NULL;
440        }
441
442        return player;
443    }
444
445}
Note: See TracBrowser for help on using the repository browser.