Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/trunk/src/orxonox/gamestates/GSLevel.cc @ 8459

Last change on this file since 8459 was 8079, checked in by landauf, 14 years ago

merged usability branch back to trunk

incomplete summary of the changes in this branch:

  • enhanced keyboard navigation in GUIs
  • implemented new graphics menu and changeable window size at runtime
  • added developer mode
  • HUD shows if game is paused, game pauses if ingame menu is opened
  • removed a few obsolete commands and hid some that are more for internal use
  • numpad works in console and gui
  • faster loading of level info
  • enhanced usage of compositors (Shader class)
  • improved camera handling, configurable FOV and aspect ratio
  • 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        if (GameMode::showsGraphics())
77        {
78            gameInputState_ = InputManager::getInstance().createInputState("game");
79            gameInputState_->setMouseExclusive(TriBool::True);
80            gameInputState_->setHandler(KeyBinderManager::getInstance().getDefaultAsHandler());
81            KeyBinderManager::getInstance().setToDefault();
82
83            guiMouseOnlyInputState_ = InputManager::getInstance().createInputState("guiMouseOnly");
84            guiMouseOnlyInputState_->setMouseExclusive(TriBool::True);
85            guiMouseOnlyInputState_->setMouseHandler(&GUIManager::getInstance());
86
87            guiKeysOnlyInputState_ = InputManager::getInstance().createInputState("guiKeysOnly");
88            guiKeysOnlyInputState_->setKeyHandler(&GUIManager::getInstance());
89        }
90
91        if (GameMode::isMaster())
92        {
93            this->loadLevel();
94        }
95
96        if (GameMode::showsGraphics())
97        {
98            // level is loaded: we can start capturing the input
99            InputManager::getInstance().enterState("game");
100
101            // connect the HumanPlayer to the game
102            PlayerManager::getInstance().clientConnected(0);
103
104            ModifyConsoleCommand(__CC_startMainMenu_name).activate();
105        }
106
107        if (GameMode::isStandalone())
108            ModifyConsoleCommand(__CC_changeGame_name).activate();
109    }
110
111    void GSLevel::deactivate()
112    {
113        if (GameMode::showsGraphics())
114            InputManager::getInstance().leaveState("game");
115
116        // disconnect all HumanPlayers
117        PlayerManager::getInstance().disconnectAllClients();
118
119        if (GameMode::isMaster())
120            this->unloadLevel();
121
122        if (GameMode::showsGraphics())
123        {
124#if OGRE_VERSION < 0x010700
125            // unload all compositors (this is only necessary because we don't yet destroy all resources!)
126            Ogre::CompositorManager::getSingleton().removeAll();
127#endif
128
129            gameInputState_->setHandler(0);
130            guiMouseOnlyInputState_->setHandler(0);
131            guiKeysOnlyInputState_->setHandler(0);
132            InputManager::getInstance().destroyState("game");
133            InputManager::getInstance().destroyState("guiKeysOnly");
134            InputManager::getInstance().destroyState("guiMouseOnly");
135
136            ModifyConsoleCommand(__CC_startMainMenu_name  ).deactivate();
137        }
138
139        if (GameMode::isStandalone())
140            ModifyConsoleCommand(__CC_changeGame_name).deactivate();
141    }
142
143    void GSLevel::update(const Clock& time)
144    {
145        // Note: Temporarily moved to GSRoot.
146        //// Call the scene objects
147        //for (ObjectList<Tickable>::iterator it = ObjectList<Tickable>::begin(); it; ++it)
148        //    it->tick(time.getDeltaTime() * this->timeFactor_);
149    }
150
151    void GSLevel::loadLevel()
152    {
153        for (ObjectList<BaseObject>::iterator it = ObjectList<BaseObject>::begin(); it != ObjectList<BaseObject>::end(); ++it)
154            this->staticObjects_.insert(*it);
155
156        // call the loader
157        COUT(0) << "Loading level..." << std::endl;
158        startFile_ = new XMLFile(LevelManager::getInstance().getDefaultLevel());
159        bool loaded = Loader::open(startFile_);
160
161        Core::getInstance().updateLastLevelTimestamp();
162        if(!loaded)
163            GSRoot::delayedStartMainMenu();
164    }
165
166    void GSLevel::unloadLevel()
167    {
168        Loader::unload(startFile_);
169        delete startFile_;
170
171        COUT(3) << "Unloaded level. Remaining objects:" << std::endl;
172        unsigned int i = 0;
173        for (ObjectList<BaseObject>::iterator it = ObjectList<BaseObject>::begin(); it != ObjectList<BaseObject>::end(); ++it)
174        {
175            std::set<BaseObject*>::const_iterator find = this->staticObjects_.find(*it);
176            if (find == this->staticObjects_.end())
177            {
178                COUT(3) << ++i << ": " << it->getIdentifier()->getName() << " (" << *it << "), references: " << it->getReferenceCount() << std::endl;
179            }
180        }
181        COUT(3) << i << " objects remaining.";
182        if (i == 0)
183            COUT(3) << " Well done!" << std::endl;
184        else
185            COUT(3) << " Try harder!" << std::endl;
186    }
187
188    /**
189    @brief
190        Starts the MainMenu.
191    */
192    /*static*/ void GSLevel::startMainMenu(void)
193    {
194        // HACK
195        Game::getInstance().popState();
196        Game::getInstance().popState();
197    }
198
199    /**
200    @brief
201        Terminates the current game and starts a new game.
202    @param level
203        The filename of the level to be started.
204    */
205    /*static*/ void GSLevel::changeGame(const std::string& level)
206    {
207        if(level != "")
208            LevelManager::getInstance().setDefaultLevel(level);
209
210        // HACK
211        Game::getInstance().popState();
212        Game::getInstance().popState();
213        Game::getInstance().requestStates("standalone, level");
214    }
215}
Note: See TracBrowser for help on using the repository browser.