Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

Last change on this file since 10017 was 9944, checked in by landauf, 11 years ago

no Thilo, we don't want to call preDestroy()
made documentation of destroy() and preDestroy() more explicit.

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