Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

Last change on this file since 11757 was 11071, checked in by landauf, 9 years ago

merged branch cpp11_v3 back to trunk

  • Property svn:eol-style set to native
File size: 7.7 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/config/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/ConsoleCommandIncludes.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    RegisterAbstractClass(GSMainMenu).inheritsFrom<Configurable>();
66
67    GSMainMenu::GSMainMenu(const GameStateInfo& info)
68        : GameState(info)
69    {
70        RegisterObject(GSMainMenu);
71
72        InputManager::getInstance().createInputState("MainMenuHackery", true, true)->setKeyHandler(KeyBinderManager::getInstance().getDefaultAsHandler());
73
74        // create an empty Scene
75        this->scene_ = new Scene(nullptr);
76        this->scene_->setSyncMode( 0x0 );
77        // and a Camera
78        this->camera_ = this->scene_->getSceneManager()->createCamera("mainMenu/Camera");
79        if (GameMode::playsSound())
80        {
81            // Load sound
82            this->ambient_ = new AmbientSound();
83        }
84    }
85
86    GSMainMenu::~GSMainMenu()
87    {
88        if (GameMode::playsSound())
89            this->ambient_->destroy();
90
91        InputManager::getInstance().destroyState("MainMenuHackery");
92
93        this->scene_->getSceneManager()->destroyCamera(this->camera_);
94        this->scene_->destroy();
95    }
96
97    void GSMainMenu::activate()
98    {
99        orxout(user_status) << "Loading main menu" << endl;
100
101        // show main menu
102        GraphicsManager::getInstance().setCamera(this->camera_);
103        GUIManager::getInstance().showGUI("MainMenu", true);
104        GUIManager::getInstance().setBackgroundImage("MainMenuBackground", "Background");
105
106        InputManager::getInstance().enterState("MainMenuHackery");
107
108        ModifyConsoleCommand(__CC_startStandalone_name).activate();
109        ModifyConsoleCommand(__CC_startServer_name    ).activate();
110        ModifyConsoleCommand(__CC_startClient_name    ).activate();
111        ModifyConsoleCommand(__CC_startDedicated_name ).activate();
112        ModifyConsoleCommand(__CC_setMainMenuSoundPath_name).setObject(this);
113
114        KeyBinderManager::getInstance().setToDefault();
115
116        this->setConfigValues();
117
118        if (GameMode::playsSound())
119        {
120            this->ambient_->setLooping(true);
121            this->ambient_->play(); // works without source
122        }
123    }
124
125    void GSMainMenu::deactivate()
126    {
127        if (GameMode::playsSound())
128        {
129            this->ambient_->stop();
130        }
131
132        InputManager::getInstance().leaveState("MainMenuHackery");
133
134        GraphicsManager::getInstance().setCamera(nullptr);
135        GUIManager::getInstance().setBackgroundImage("");
136        GUIManager::hideGUI("MainMenu");
137
138        ModifyConsoleCommand(__CC_startStandalone_name).deactivate();
139        ModifyConsoleCommand(__CC_startServer_name    ).deactivate();
140        ModifyConsoleCommand(__CC_startClient_name    ).deactivate();
141        ModifyConsoleCommand(__CC_startDedicated_name ).deactivate();
142        ModifyConsoleCommand(__CC_setMainMenuSoundPath_name).setObject(nullptr);
143    }
144
145    void GSMainMenu::update(const Clock& time)
146    {
147    }
148
149    void GSMainMenu::setConfigValues()
150    {
151        SetConfigValue(soundPathMain_, "mainmenu.ogg")
152            .description("Contains the path to the main menu sound file.")
153            .callback(this, &GSMainMenu::reloadSound);
154    }
155
156    void GSMainMenu::reloadSound()
157    {
158        if (GameMode::playsSound())
159        {
160            this->ambient_->setAmbientSource(soundPathMain_);
161        }
162    }
163
164    const std::string& GSMainMenu::getMainMenuSoundPath()
165    {
166        return soundPathMain_;
167    }
168
169    void GSMainMenu::setMainMenuSoundPath(const std::string& path)
170    {
171        ModifyConfigValue(soundPathMain_, set, path);
172    }
173
174    /**
175    @brief
176        Start a level in standalone mode.
177    @param level
178        The filename of the level to be started. If empty, the default level is started.
179    */
180    void GSMainMenu::startStandalone(const std::string& level)
181    {
182        if(level != "")
183            LevelManager::getInstance().setDefaultLevel(level);
184
185        // HACK
186        Game::getInstance().popState();
187        Game::getInstance().requestStates("standalone, level");
188    }
189
190    /**
191    @brief
192        Start a level in server mode.
193    @param level
194        The filename of the level to be started. If empty, the default level is started.
195    */
196    void GSMainMenu::startServer(const std::string& level)
197    {
198        if(level != "")
199            LevelManager::getInstance().setDefaultLevel(level);
200
201        // HACK
202        Game::getInstance().popState();
203        Game::getInstance().requestStates("server, level");
204    }
205
206    /**
207    @brief
208        Connect to a game as client.
209    @param destination
210        The destination to connect to. If empty, the client connects to the default destination.
211    */
212    void GSMainMenu::startClient(const std::string& destination)
213    {
214        if(destination != "")
215            Client::getInstance()->setDestination(destination, NETWORK_PORT);
216
217        // HACK
218        Game::getInstance().popState();
219        Game::getInstance().requestStates("client, level");
220    }
221
222    /**
223    @brief
224        Start a level in dedicated mode.
225    @param level
226        The filename of the level to be started. If empty, the default level is started.
227    */
228    void GSMainMenu::startDedicated(const std::string& level)
229    {
230        if(level != "")
231            LevelManager::getInstance().setDefaultLevel(level);
232
233        // HACK
234        Game::getInstance().popState();
235        Game::getInstance().popState();
236        Game::getInstance().requestStates("server, level");
237    }
238
239}
Note: See TracBrowser for help on using the repository browser.