Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/trunk/src/orxonox/gamestates/GSMainMenu.cc @ 8424

Last change on this file since 8424 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: 7.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 *      Reto Grieder
24 *   Co-authors:
25 *      ...
26 *
27 */
28
29#include "GSMainMenu.h"
30
31#include <OgreSceneManager.h>
32
33#include "core/ConfigValueIncludes.h"
34#include "core/CoreIncludes.h"
35#include "core/Game.h"
36#include "core/GraphicsManager.h"
37#include "core/GUIManager.h"
38#include "core/command/ConsoleCommand.h"
39#include "core/input/KeyBinderManager.h"
40#include "network/Client.h"
41#include "util/StringUtils.h"
42#include "LevelManager.h"
43#include "Scene.h"
44#include "sound/AmbientSound.h"
45// HACK
46#include "core/input/InputManager.h"
47#include "core/input/InputState.h"
48
49namespace orxonox
50{
51    DeclareGameState(GSMainMenu, "mainMenu", false, true);
52
53    static const std::string __CC_startStandalone_name      = "startGame";
54    static const std::string __CC_startServer_name          = "startServer";
55    static const std::string __CC_startClient_name          = "startClient";
56    static const std::string __CC_startDedicated_name       = "startDedicated";
57    static const std::string __CC_setMainMenuSoundPath_name = "setMMSoundPath";
58
59    SetConsoleCommand(__CC_startStandalone_name,      &GSMainMenu::startStandalone).defaultValues("").deactivate();
60    SetConsoleCommand(__CC_startServer_name,          &GSMainMenu::startServer    ).defaultValues("").deactivate();
61    SetConsoleCommand(__CC_startClient_name,          &GSMainMenu::startClient    ).defaultValues("").deactivate();
62    SetConsoleCommand(__CC_startDedicated_name,       &GSMainMenu::startDedicated ).defaultValues("").deactivate();
63    SetConsoleCommand(__CC_setMainMenuSoundPath_name, &GSMainMenu::setMainMenuSoundPath).hide();
64
65    GSMainMenu::GSMainMenu(const GameStateInfo& info)
66        : GameState(info)
67    {
68        RegisterRootObject(GSMainMenu);
69
70        InputManager::getInstance().createInputState("MainMenuHackery", true, true)->setKeyHandler(KeyBinderManager::getInstance().getDefaultAsHandler());
71
72        // create an empty Scene
73        this->scene_ = new Scene(NULL);
74        this->scene_->setSyncMode( 0x0 );
75        // and a Camera
76        this->camera_ = this->scene_->getSceneManager()->createCamera("mainMenu/Camera");
77        if (GameMode::playsSound())
78        {
79            // Load sound
80            this->ambient_ = new AmbientSound();
81        }
82    }
83
84    GSMainMenu::~GSMainMenu()
85    {
86        if (GameMode::playsSound())
87            this->ambient_->destroy();
88
89        InputManager::getInstance().destroyState("MainMenuHackery");
90
91        this->scene_->getSceneManager()->destroyCamera(this->camera_);
92        this->scene_->destroy();
93    }
94
95    void GSMainMenu::activate()
96    {
97        // show main menu
98        GraphicsManager::getInstance().setCamera(this->camera_);
99        GUIManager::getInstance().showGUI("MainMenu", true);
100        GUIManager::getInstance().setBackgroundImage("MainMenuBackground", "Background");
101
102        InputManager::getInstance().enterState("MainMenuHackery");
103
104        ModifyConsoleCommand(__CC_startStandalone_name).activate();
105        ModifyConsoleCommand(__CC_startServer_name    ).activate();
106        ModifyConsoleCommand(__CC_startClient_name    ).activate();
107        ModifyConsoleCommand(__CC_startDedicated_name ).activate();
108        ModifyConsoleCommand(__CC_setMainMenuSoundPath_name).setObject(this);
109
110        KeyBinderManager::getInstance().setToDefault();
111
112        this->setConfigValues();
113
114        if (GameMode::playsSound())
115        {
116            this->ambient_->setLooping(true);
117            this->ambient_->play(); // works without source
118        }
119    }
120
121    void GSMainMenu::deactivate()
122    {
123        if (GameMode::playsSound())
124        {
125            this->ambient_->stop();
126        }
127
128        InputManager::getInstance().leaveState("MainMenuHackery");
129
130        GraphicsManager::getInstance().setCamera(0);
131        GUIManager::getInstance().setBackgroundImage("");
132        GUIManager::hideGUI("MainMenu");
133
134        ModifyConsoleCommand(__CC_startStandalone_name).deactivate();
135        ModifyConsoleCommand(__CC_startServer_name    ).deactivate();
136        ModifyConsoleCommand(__CC_startClient_name    ).deactivate();
137        ModifyConsoleCommand(__CC_startDedicated_name ).deactivate();
138        ModifyConsoleCommand(__CC_setMainMenuSoundPath_name).setObject(0);
139    }
140
141    void GSMainMenu::update(const Clock& time)
142    {
143    }
144
145    void GSMainMenu::setConfigValues()
146    {
147        SetConfigValue(soundPathMain_, "mainmenu.ogg")
148            .description("Contains the path to the main menu sound file.")
149            .callback(this, &GSMainMenu::reloadSound);
150    }
151
152    void GSMainMenu::reloadSound()
153    {
154        if (GameMode::playsSound())
155        {
156            this->ambient_->setAmbientSource(soundPathMain_);
157        }
158    }
159
160    const std::string& GSMainMenu::getMainMenuSoundPath()
161    {
162        return soundPathMain_;
163    }
164
165    void GSMainMenu::setMainMenuSoundPath(const std::string& path)
166    {
167        ModifyConfigValue(soundPathMain_, set, path);
168    }
169
170    /**
171    @brief
172        Start a level in standalone mode.
173    @param level
174        The filename of the level to be started. If empty, the default level is started.
175    */
176    void GSMainMenu::startStandalone(const std::string& level)
177    {
178        if(level != "")
179            LevelManager::getInstance().setDefaultLevel(level);
180
181        // HACK
182        Game::getInstance().popState();
183        Game::getInstance().requestStates("standalone, level");
184    }
185
186    /**
187    @brief
188        Start a level in server mode.
189    @param level
190        The filename of the level to be started. If empty, the default level is started.
191    */
192    void GSMainMenu::startServer(const std::string& level)
193    {
194        if(level != "")
195            LevelManager::getInstance().setDefaultLevel(level);
196
197        // HACK
198        Game::getInstance().popState();
199        Game::getInstance().requestStates("server, level");
200    }
201
202    /**
203    @brief
204        Connect to a game as client.
205    @param destination
206        The destination to connect to. If empty, the client connects to the default destination.
207    */
208    void GSMainMenu::startClient(const std::string& destination)
209    {
210        if(destination != "")
211            Client::getInstance()->setDestination(destination, NETWORK_PORT);
212
213        // HACK
214        Game::getInstance().popState();
215        Game::getInstance().requestStates("client, level");
216    }
217
218    /**
219    @brief
220        Start a level in dedicated mode.
221    @param level
222        The filename of the level to be started. If empty, the default level is started.
223    */
224    void GSMainMenu::startDedicated(const std::string& level)
225    {
226        if(level != "")
227            LevelManager::getInstance().setDefaultLevel(level);
228
229        // HACK
230        Game::getInstance().popState();
231        Game::getInstance().popState();
232        Game::getInstance().requestStates("server, level");
233    }
234
235}
Note: See TracBrowser for help on using the repository browser.