Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/presentation3/src/modules/questsystem/QuestManager.cc @ 6940

Last change on this file since 6940 was 6940, checked in by dafrick, 14 years ago

Resolved issue with the Questsystem causing a segfault when a level with Quests was loaded twice. The issue still persists, but not with the Questsystem anymore and it will be addressed with my next commit.
Also removed restrictions to the number of characters a quest/hint identifier must have.

  • Property svn:eol-style set to native
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
31    @brief Implementation of the QuestManager class.
32*/
33
34#include "QuestManager.h"
35
36#include <CEGUIWindow.h>
37
38#include "util/Exception.h"
39#include "core/CoreIncludes.h"
40#include "core/GUIManager.h"
41#include "core/ConsoleCommand.h"
42#include "core/LuaState.h"
43#include "core/ScopedSingletonManager.h"
44#include "infos/PlayerInfo.h"
45#include "overlays/GUIOverlay.h"
46
47#include "ToluaBindQuestsystem.h"
48#include "Quest.h"
49#include "QuestHint.h"
50#include "QuestItem.h"
51
52namespace orxonox
53{
54    // Register tolua_open function when loading the library
55    DeclareToluaInterface(Questsystem);
56
57    ManageScopedSingleton(QuestManager, ScopeID::Root, false);
58
59    /**
60    @brief
61        Constructor. Registers the object.
62    @todo
63        Is inheriting from BaseObject proper?
64    */
65    QuestManager::QuestManager()
66    {
67        RegisterRootObject(QuestManager);
68    }
69
70    /**
71    @brief
72        Destructor.
73    */
74    QuestManager::~QuestManager()
75    {
76        for(std::map<PlayerInfo*, QuestGUI*>::iterator it = this->questGUIs_.begin(); it != this->questGUIs_.end(); it++)
77        {
78            it->second->destroy();
79        }
80        this->questGUIs_.clear();
81    }
82
83    /**
84    @brief
85        Retreive all Quests.
86    @return
87        Returns a map with all Quests indexed by their id's.
88    */
89    std::map<std::string, Quest*> & QuestManager::getQuests(void)
90    {
91        return this->questMap_;
92    }
93
94    /**
95    @brief
96        Registers a Quest with the QuestManager to make it globally accessable.
97        Uses it's id to make sure to be able to be identify and retrieve it later.
98    @param quest
99        The Quest that is to be registered.
100    @return
101        Returns true if successful, false if not.
102    */
103    bool QuestManager::registerQuest(Quest* quest)
104    {
105        if(quest == NULL) //!< Doh! Just as if there were actual quests behind NULL-pointers.
106        {
107            COUT(2) << "Registration of Quest in QuestManager failed, because inserted Quest-pointer was NULL." << std::endl;
108            return false;
109        }
110
111        std::pair<std::map<std::string, Quest*>::iterator,bool> result;
112        result = this->questMap_.insert( std::pair<std::string,Quest*>(quest->getId(),quest) ); //!< Inserting the Quest.
113
114        if(result.second) //!< If inserting was a success.
115        {
116            quest->setRegistered();
117            COUT(3) << "Quest with questId {" << quest->getId() << "} successfully inserted." << std::endl;
118            return true;
119        }
120        else
121        {
122           COUT(2) << "Quest with the same id was already present." << std::endl;
123           return false;
124        }
125    }
126
127    /**
128    @brief
129        Unregisters a Quest in the QuestManager.
130    */
131    bool QuestManager::unregisterQuest(Quest* quest)
132    {
133        return this->questMap_.erase(quest->getId()) == 1;
134    }
135
136    /**
137    @brief
138        Registers a QuestHint with the QuestManager to make it globally accessable.
139        Uses it's id to make sure to be able to be identify and retrieve it later.
140    @param hint
141        The QuestHint to be registered.
142    @return
143        Returns true if successful, false if not.
144    */
145    bool QuestManager::registerHint(QuestHint* hint)
146    {
147        if(hint == NULL) //!< Still not liking NULL-pointers.
148        {
149            COUT(2) << "Registration of QuestHint in QuestManager failed, because inserted QuestHint-pointer was NULL." << std::endl;
150            return false;
151        }
152
153        std::pair<std::map<std::string, QuestHint*>::iterator,bool> result;
154        result = this->hintMap_.insert ( std::pair<std::string,QuestHint*>(hint->getId(),hint) ); //!< Inserting the QuestHSint.
155
156        if(result.second) //!< If inserting was a success.
157        {
158            hint->setRegistered();
159            COUT(3) << "QuestHint with hintId {" << hint->getId() << "} successfully inserted." << std::endl;
160            return true;
161        }
162        else
163        {
164           COUT(2) << "QuestHint with the same id was already present." << std::endl;
165           return false;
166        }
167    }
168
169    /**
170    @brief
171        Unregisters a QuestHint in the QuestManager.
172    */
173    bool QuestManager::unregisterHint(QuestHint* hint)
174    {
175        return this->hintMap_.erase(hint->getId()) == 1;
176    }
177
178    /**
179    @brief
180        Finds a Quest with the given id.
181    @param questId
182        The id of the Quest sought for.
183    @return
184        Returns a pointer to the Quest with the input id.
185        Returns NULL if there is no Quest with the given questId.
186    @throws
187        Throws an exception if the given questId is invalid.
188    */
189    Quest* QuestManager::findQuest(const std::string & questId)
190    {
191        if(questId.compare(BLANKSTRING) == 1) //!< Check vor validity of the given id.
192        {
193            ThrowException(Argument, "Invalid questId.");
194        }
195
196        Quest* quest;
197        std::map<std::string, Quest*>::iterator it = this->questMap_.find(questId);
198        if (it != this->questMap_.end()) //!< If the Quest is registered.
199        {
200            quest = it->second;
201        }
202        else
203        {
204           quest = NULL;
205           COUT(2) << "The quest with id {" << questId << "} is nowhere to be found." << std::endl;
206        }
207
208        return quest;
209
210    }
211
212    /**
213    @brief
214        Finds a QuestHint with the given id.
215    @param hintId
216        The id of the QuestHint sought for.
217    @return
218        Returns a pointer to the QuestHint with the input id.
219        Returns NULL if there is no QuestHint with the given hintId.
220    @throws
221        Throws an exception if the given hintId is invalid.
222    */
223    QuestHint* QuestManager::findHint(const std::string & hintId)
224    {
225        if(hintId.compare(BLANKSTRING) == 1) //!< Check vor validity of the given id.
226        {
227            ThrowException(Argument, "Invalid hintId.");
228        }
229
230        QuestHint* hint;
231        std::map<std::string, QuestHint*>::iterator it = this->hintMap_.find(hintId);
232        if (it != this->hintMap_.end()) //!< If the QuestHint is registered.
233        {
234            hint = it->second;
235        }
236        else
237        {
238           hint = NULL;
239           COUT(2) << "The hint with id {" << hintId << "} is nowhere to be found." << std::endl;
240        }
241
242        return hint;
243
244    }
245
246    /**
247    @brief
248        Retreive the main window for the GUI.
249        This is for the use in the lua script tu start the QuestGUI.
250    @param guiName
251        The name of the GUI.
252    @return
253        Returns a CEGUI Window.
254    */
255    CEGUI::Window* QuestManager::getQuestGUI(const std::string & guiName)
256    {
257        PlayerInfo* player = this->retrievePlayer(guiName);
258
259        if(this->questGUIs_.find(player) == this->questGUIs_.end()) //!< Create a new GUI, if there is none, yet.
260            this->questGUIs_[player] = new QuestGUI(player);
261
262        return this->questGUIs_[player]->getGUI();
263    }
264
265    /**
266    @brief
267        Retrieve the player for a certain GUI.
268    @param guiName
269        The name of the GUI the player is retrieved for.
270    @return
271        Returns the player.
272    @todo
273        This very well might be outdated. So: Check if still needed, and update if necessary.
274    */
275    PlayerInfo* QuestManager::retrievePlayer(const std::string & guiName)
276    {
277        PlayerInfo* player = GUIManager::getInstance().getPlayer(guiName);
278        if(player == NULL)
279        {
280            COUT(1) << "Error: GUIOverlay with name '" << guiName << "' has no player." << std::endl;
281            return NULL;
282        }
283
284        return player;
285    }
286
287}
Note: See TracBrowser for help on using the repository browser.