Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/output/src/orxonox/gamestates/GSLevel.cc @ 8830

Last change on this file since 8830 was 8830, checked in by landauf, 13 years ago

added some output (user and internal) throughout the initialization of the game, graphics, and game states

  • Property svn:eol-style set to native
File size: 6.9 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 *      Reto Grieder
24 *   Co-authors:
25 *      Fabian 'x3n' Landau
26 *      Benjamin Knecht
27 *
28 */
29
30#include "GSLevel.h"
31
32#include <OgreCompositorManager.h>
33
34#include "util/Clock.h"
35#include "core/input/InputManager.h"
36#include "core/input/InputState.h"
37#include "core/input/KeyBinderManager.h"
38#include "core/Core.h"
39#include "core/Game.h"
40#include "core/GameMode.h"
41#include "core/GUIManager.h"
42#include "core/Loader.h"
43#include "core/XMLFile.h"
44#include "core/command/ConsoleCommand.h"
45
46#include "LevelManager.h"
47#include "PlayerManager.h"
48#include "GSRoot.h"
49
50namespace orxonox
51{
52    DeclareGameState(GSLevel, "level", false, false);
53
54    static const std::string __CC_startMainMenu_name = "startMainMenu";
55    static const std::string __CC_changeGame_name = "changeGame";
56
57    SetConsoleCommand(__CC_startMainMenu_name, &GSLevel::startMainMenu).deactivate();
58    SetConsoleCommand(__CC_changeGame_name, &GSLevel::changeGame).defaultValues("").deactivate();
59
60    GSLevel::GSLevel(const GameStateInfo& info)
61        : GameState(info)
62        , gameInputState_(0)
63        , guiMouseOnlyInputState_(0)
64        , guiKeysOnlyInputState_(0)
65        , startFile_(0)
66        , bShowIngameGUI_(false)
67    {
68    }
69
70    GSLevel::~GSLevel()
71    {
72    }
73
74    void GSLevel::activate()
75    {
76        orxout(user_status) << "Loading level" << endl;
77
78        if (GameMode::showsGraphics())
79        {
80            gameInputState_ = InputManager::getInstance().createInputState("game");
81            gameInputState_->setMouseExclusive(true);
82            gameInputState_->setHandler(KeyBinderManager::getInstance().getDefaultAsHandler());
83            KeyBinderManager::getInstance().setToDefault();
84
85            guiMouseOnlyInputState_ = InputManager::getInstance().createInputState("guiMouseOnly");
86            guiMouseOnlyInputState_->setMouseExclusive(true);
87            guiMouseOnlyInputState_->setMouseHandler(&GUIManager::getInstance());
88
89            guiKeysOnlyInputState_ = InputManager::getInstance().createInputState("guiKeysOnly");
90            guiKeysOnlyInputState_->setKeyHandler(&GUIManager::getInstance());
91        }
92
93        if (GameMode::isMaster())
94        {
95            this->loadLevel();
96        }
97
98        if (GameMode::showsGraphics())
99        {
100            // level is loaded: we can start capturing the input
101            InputManager::getInstance().enterState("game");
102
103            // connect the HumanPlayer to the game
104            PlayerManager::getInstance().clientConnected(0);
105
106            ModifyConsoleCommand(__CC_startMainMenu_name).activate();
107        }
108
109        if (GameMode::isStandalone())
110            ModifyConsoleCommand(__CC_changeGame_name).activate();
111    }
112
113    void GSLevel::deactivate()
114    {
115        if (GameMode::showsGraphics())
116            InputManager::getInstance().leaveState("game");
117
118        // disconnect all HumanPlayers
119        PlayerManager::getInstance().disconnectAllClients();
120
121        if (GameMode::isMaster())
122            this->unloadLevel();
123
124        if (GameMode::showsGraphics())
125        {
126#if OGRE_VERSION < 0x010700
127            // unload all compositors (this is only necessary because we don't yet destroy all resources!)
128            Ogre::CompositorManager::getSingleton().removeAll();
129#endif
130
131            gameInputState_->setHandler(0);
132            guiMouseOnlyInputState_->setHandler(0);
133            guiKeysOnlyInputState_->setHandler(0);
134            InputManager::getInstance().destroyState("game");
135            InputManager::getInstance().destroyState("guiKeysOnly");
136            InputManager::getInstance().destroyState("guiMouseOnly");
137
138            ModifyConsoleCommand(__CC_startMainMenu_name  ).deactivate();
139        }
140
141        if (GameMode::isStandalone())
142            ModifyConsoleCommand(__CC_changeGame_name).deactivate();
143    }
144
145    void GSLevel::update(const Clock& time)
146    {
147        // Note: Temporarily moved to GSRoot.
148        //// Call the scene objects
149        //for (ObjectList<Tickable>::iterator it = ObjectList<Tickable>::begin(); it; ++it)
150        //    it->tick(time.getDeltaTime() * this->timeFactor_);
151    }
152
153    void GSLevel::loadLevel()
154    {
155        for (ObjectList<BaseObject>::iterator it = ObjectList<BaseObject>::begin(); it != ObjectList<BaseObject>::end(); ++it)
156            this->staticObjects_.insert(*it);
157
158        // call the loader
159        startFile_ = new XMLFile(LevelManager::getInstance().getDefaultLevel());
160        bool loaded = Loader::open(startFile_);
161
162        Core::getInstance().updateLastLevelTimestamp();
163        if(!loaded)
164            GSRoot::delayedStartMainMenu();
165    }
166
167    void GSLevel::unloadLevel()
168    {
169        Loader::unload(startFile_);
170        delete startFile_;
171
172        orxout(internal_info) << "Remaining objects:" << endl;
173        unsigned int i = 0;
174        for (ObjectList<BaseObject>::iterator it = ObjectList<BaseObject>::begin(); it != ObjectList<BaseObject>::end(); ++it)
175        {
176            std::set<BaseObject*>::const_iterator find = this->staticObjects_.find(*it);
177            if (find == this->staticObjects_.end())
178            {
179                orxout(internal_info) << ++i << ": " << it->getIdentifier()->getName() << " (" << *it << "), references: " << it->getReferenceCount() << endl;
180            }
181        }
182        orxout(internal_info) << i << " objects remaining.";
183        if (i == 0)
184            orxout(internal_info) << " Well done!" << endl;
185        else
186            orxout(internal_info) << " Try harder!" << endl;
187    }
188
189    /**
190    @brief
191        Starts the MainMenu.
192    */
193    /*static*/ void GSLevel::startMainMenu(void)
194    {
195        // HACK
196        Game::getInstance().popState();
197        Game::getInstance().popState();
198    }
199
200    /**
201    @brief
202        Terminates the current game and starts a new game.
203    @param level
204        The filename of the level to be started.
205    */
206    /*static*/ void GSLevel::changeGame(const std::string& level)
207    {
208        if(level != "")
209            LevelManager::getInstance().setDefaultLevel(level);
210
211        // HACK
212        Game::getInstance().popState();
213        Game::getInstance().popState();
214        Game::getInstance().requestStates("standalone, level");
215    }
216}
Note: See TracBrowser for help on using the repository browser.