Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/presentation2/src/modules/questsystem/QuestManager.cc @ 6214

Last change on this file since 6214 was 6182, checked in by rgrieder, 15 years ago

Singleton pointer initialisation should be part of the ManageScopedSingleton macro to ensure the order.

  • Property svn:eol-style set to native
File size: 7.8 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            COUT(3) << "Quest with questId {" << quest->getId() << "} successfully inserted." << std::endl;
117            return true;
118        }
119        else
120        {
121           COUT(2) << "Quest with the same id was already present." << std::endl;
122           return false;
123        }
124    }
125
126    /**
127    @brief
128        Registers a QuestHint with the QuestManager to make it globally accessable.
129        Uses it's id to make sure to be able to be identify and retrieve it later.
130    @param hint
131        The QuestHint to be registered.
132    @return
133        Returns true if successful, false if not.
134    */
135    bool QuestManager::registerHint(QuestHint* hint)
136    {
137        if(hint == NULL) //!< Still not liking NULL-pointers.
138        {
139            COUT(2) << "Registration of QuestHint in QuestManager failed, because inserted QuestHint-pointer was NULL." << std::endl;
140            return false;
141        }
142
143        std::pair<std::map<std::string, QuestHint*>::iterator,bool> result;
144        result = this->hintMap_.insert ( std::pair<std::string,QuestHint*>(hint->getId(),hint) ); //!< Inserting the QuestHSint.
145
146        if(result.second) //!< If inserting was a success.
147        {
148            COUT(3) << "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        Finds a Quest with the given id.
161    @param questId
162        The id of the Quest sought for.
163    @return
164        Returns a pointer to the Quest with the input id.
165        Returns NULL if there is no Quest with the given questId.
166    @throws
167        Throws an exception if the given questId is invalid.
168    */
169    Quest* QuestManager::findQuest(const std::string & questId)
170    {
171        if(!QuestItem::isId(questId)) //!< Check vor validity of the given id.
172        {
173            ThrowException(Argument, "Invalid questId.");
174        }
175
176        Quest* quest;
177        std::map<std::string, Quest*>::iterator it = this->questMap_.find(questId);
178        if (it != this->questMap_.end()) //!< If the Quest is registered.
179        {
180            quest = it->second;
181        }
182        else
183        {
184           quest = NULL;
185           COUT(2) << "The quest with id {" << questId << "} is nowhere to be found." << std::endl;
186        }
187
188        return quest;
189
190    }
191
192    /**
193    @brief
194        Finds a QuestHint with the given id.
195    @param hintId
196        The id of the QuestHint sought for.
197    @return
198        Returns a pointer to the QuestHint with the input id.
199        Returns NULL if there is no QuestHint with the given hintId.
200    @throws
201        Throws an exception if the given hintId is invalid.
202    */
203    QuestHint* QuestManager::findHint(const std::string & hintId)
204    {
205        if(!QuestItem::isId(hintId)) //!< Check vor validity of the given id.
206        {
207            ThrowException(Argument, "Invalid hintId.");
208        }
209
210        QuestHint* hint;
211        std::map<std::string, QuestHint*>::iterator it = this->hintMap_.find(hintId);
212        if (it != this->hintMap_.end()) //!< If the QuestHint is registered.
213        {
214            hint = it->second;
215        }
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    /**
227    @brief
228        Retreive the main window for the GUI.
229        This is for the use in the lua script tu start the QuestGUI.
230    @param guiName
231        The name of the GUI.
232    @return
233        Returns a CEGUI Window.
234    */
235    CEGUI::Window* QuestManager::getQuestGUI(const std::string & guiName)
236    {
237        PlayerInfo* player = this->retreivePlayer(guiName);
238
239        if(this->questGUIs_.find(player) == this->questGUIs_.end()) //!< Create a new GUI, if there is none, yet.
240            this->questGUIs_[player] = new QuestGUI(player);
241
242        return this->questGUIs_[player]->getGUI();
243    }
244
245    /**
246    @brief
247        Retrieve the player for a certain GUI.
248    @param guiName
249        The name of the GUI the player is retrieved for.
250    @return
251        Returns the player.
252    @todo
253        This very well might be outdated. So: Check if still needed, and update if necessary.
254    */
255    PlayerInfo* QuestManager::retreivePlayer(const std::string & guiName)
256    {
257        PlayerInfo* player = GUIManager::getInstance().getPlayer(guiName);
258        if(player == NULL)
259        {
260            COUT(1) << "Error: GUIOverlay with name '" << guiName << "' has no player." << std::endl;
261            return NULL;
262        }
263
264        return player;
265    }
266
267}
Note: See TracBrowser for help on using the repository browser.