Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/objecthierarchy2/src/orxonox/gamestates/GSLevel.cc @ 2173

Last change on this file since 2173 was 2173, checked in by landauf, 15 years ago
  • Added new XMLPort mode, ExpandObject, which works like LoadObject but doesn't use default values if there are missing parameters. This is used if an object is expanded by templates (like adding CameraPositions).
  • Changed default level to sample3.oxw in objecthierarchy2 branch
  • Small fix with doubly added clients in Level- and PlayerManager
  • Property svn:eol-style set to native
File size: 9.3 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 *
27 */
28
29#include "OrxonoxStableHeaders.h"
30#include "GSLevel.h"
31
32#include "core/input/InputManager.h"
33#include "core/input/SimpleInputState.h"
34#include "core/input/KeyBinder.h"
35#include "core/Loader.h"
36#include "core/XMLFile.h"
37#include "core/CommandExecutor.h"
38#include "core/ConsoleCommand.h"
39#include "core/CommandLine.h"
40#include "core/ConfigValueIncludes.h"
41#include "core/CoreIncludes.h"
42#include "core/Core.h"
43//#include "objects/Backlight.h"
44#include "objects/Tickable.h"
45#include "objects/Radar.h"
46//#include "tools/ParticleInterface.h"
47#include "CameraManager.h"
48#include "LevelManager.h"
49#include "Settings.h"
50
51namespace orxonox
52{
53    SetCommandLineArgument(level, "sample3.oxw").shortcut("l");
54
55    GSLevel::GSLevel()
56//        : GameState<GSGraphics>(name)
57        : timeFactor_(1.0f)
58        , keyBinder_(0)
59        , inputState_(0)
60        , radar_(0)
61        , startFile_(0)
62        , cameraManager_(0)
63        , levelManager_(0)
64    {
65        RegisterObject(GSLevel);
66        setConfigValues();
67    }
68
69    GSLevel::~GSLevel()
70    {
71    }
72
73    void GSLevel::setConfigValues()
74    {
75        SetConfigValue(keyDetectorCallbackCode_, "KeybindBindingStringKeyName=");
76        SetConfigValue(defaultKeybindings_, "def_keybindings.ini")
77            .description("Filename of default keybindings.");
78    }
79
80    void GSLevel::enter(Ogre::Viewport* viewport)
81    {
82        if (Core::showsGraphics())
83        {
84            inputState_ = InputManager::getInstance().createInputState<SimpleInputState>("game", 20);
85            keyBinder_ = new KeyBinder();
86            keyBinder_->loadBindings("keybindings.ini", defaultKeybindings_);
87            inputState_->setHandler(keyBinder_);
88
89            // create the global CameraManager
90            assert(viewport);
91            this->cameraManager_ = new CameraManager(viewport);
92
93            // Start the Radar
94            this->radar_ = new Radar();
95        }
96
97        if (Core::isMaster())
98        {
99            // create the global LevelManager
100            this->levelManager_ = new LevelManager();
101
102            // reset game speed to normal
103            timeFactor_ = 1.0f;
104
105            this->loadLevel();
106        }
107
108        if (Core::showsGraphics())
109        {
110            // TODO: insert slomo console command with
111            // .accessLevel(AccessLevel::Offline).defaultValue(0, 1.0).axisParamIndex(0).isAxisRelative(false);
112
113            // keybind console command
114            FunctorMember<GSLevel>* functor1 = createFunctor(&GSLevel::keybind);
115            functor1->setObject(this);
116            CommandExecutor::addConsoleCommandShortcut(createConsoleCommand(functor1, "keybind"));
117            FunctorMember<GSLevel>* functor2 = createFunctor(&GSLevel::tkeybind);
118            functor2->setObject(this);
119            CommandExecutor::addConsoleCommandShortcut(createConsoleCommand(functor2, "tkeybind"));
120            // set our console command as callback for the key detector
121            InputManager::getInstance().setKeyDetectorCallback(std::string("keybind ") + keyDetectorCallbackCode_);
122
123            // level is loaded: we can start capturing the input
124            InputManager::getInstance().requestEnterState("game");
125        }
126
127        if (Core::isMaster())
128        {
129            // time factor console command
130            FunctorMember<GSLevel>* functor = createFunctor(&GSLevel::setTimeFactor);
131            functor->setObject(this);
132            CommandExecutor::addConsoleCommandShortcut(createConsoleCommand(functor, "setTimeFactor")).accessLevel(AccessLevel::Offline).defaultValue(0, 1.0);;
133        }
134    }
135
136    void GSLevel::leave()
137    {
138        // this call will delete every BaseObject!
139        // But currently this will call methods of objects that exist no more
140        // The only 'memory leak' is the ParticleSpawer. They would be deleted here
141        // and call a sceneNode method that has already been destroy by the corresponding space ship.
142        //Loader::close();
143
144        if (Core::showsGraphics())
145            InputManager::getInstance().requestLeaveState("game");
146
147        if (Core::isMaster())
148            this->unloadLevel();
149
150        if (this->radar_)
151            delete this->radar_;
152
153        if (this->cameraManager_)
154            delete this->cameraManager_;
155
156        if (this->levelManager_)
157            delete this->levelManager_;
158
159        if (Core::showsGraphics())
160        {
161            inputState_->setHandler(0);
162            InputManager::getInstance().requestDestroyState("game");
163            if (this->keyBinder_)
164                delete this->keyBinder_;
165        }
166    }
167
168    void GSLevel::ticked(const Clock& time)
169    {
170        // Commented by 1337: Temporarily moved to GSGraphics.
171        //// Call the scene objects
172        //for (ObjectList<Tickable>::iterator it = ObjectList<Tickable>::begin(); it; ++it)
173        //    it->tick(time.getDeltaTime() * this->timeFactor_);
174    }
175
176    /**
177    @brief
178        Changes the speed of Orxonox
179    */
180    void GSLevel::setTimeFactor(float factor)
181    {
182/*
183        float change = factor / this->timeFactor_;
184*/
185        this->timeFactor_ = factor;
186/*
187        for (ObjectList<ParticleInterface>::iterator it = ObjectList<ParticleInterface>::begin(); it; ++it)
188            it->setSpeedFactor(it->getSpeedFactor() * change);
189
190        for (ObjectList<Backlight>::iterator it = ObjectList<Backlight>::begin(); it; ++it)
191            it->setTimeFactor(timeFactor_);
192*/
193    }
194
195    void GSLevel::loadLevel()
196    {
197        // call the loader
198        COUT(0) << "Loading level..." << std::endl;
199        std::string levelName;
200        CommandLine::getValue("level", &levelName);
201        startFile_ = new XMLFile(Settings::getDataPath() + std::string("levels/") + levelName);
202        Loader::open(startFile_);
203    }
204
205    void GSLevel::unloadLevel()
206    {
207        //////////////////////////////////////////////////////////////////////////////////////////
208        // TODO // TODO // TODO // TODO // TODO // TODO // TODO // TODO // TODO // TODO // TODO //
209        //////////////////////////////////////////////////////////////////////////////////////////
210        // Loader::unload(startFile_); // TODO: REACTIVATE THIS IF LOADER::UNLOAD WORKS PROPERLY /
211        //////////////////////////////////////////////////////////////////////////////////////////
212
213        delete this->startFile_;
214    }
215
216    void GSLevel::keybind(const std::string &command)
217    {
218        this->keybindInternal(command, false);
219    }
220
221    void GSLevel::tkeybind(const std::string &command)
222    {
223        this->keybindInternal(command, true);
224    }
225
226    /**
227    @brief
228        Assigns a command string to a key/button/axis. The name is determined via KeyDetector.
229    @param command
230        Command string that can be executed by the CommandExecutor
231        OR: Internal string "KeybindBindingStringKeyName=" used for the second call to identify
232        the key/button/axis that has been activated. This is configured above in enter().
233    */
234    void GSLevel::keybindInternal(const std::string& command, bool bTemporary)
235    {
236        if (Core::showsGraphics())
237        {
238            static std::string bindingString = "";
239            static bool bTemporarySaved = false;
240            static bool bound = true;
241            // note: We use a long name to make 'sure' that the user doesn't use it accidentally.
242            // Howerver there will be no real issue if it happens anyway.
243            if (command.find(keyDetectorCallbackCode_) != 0)
244            {
245                if (bound)
246                {
247                    COUT(0) << "Press any button/key or move a mouse/joystick axis" << std::endl;
248                    InputManager::getInstance().requestEnterState("detector");
249                    bindingString = command;
250                    bTemporarySaved = bTemporary;
251                    bound = false;
252                }
253                //else:  We're still in a keybind command. ignore this call.
254            }
255            else
256            {
257                if (!bound)
258                {
259                    // user has pressed the key
260                    std::string name = command.substr(this->keyDetectorCallbackCode_.size());
261                    COUT(0) << "Binding string \"" << bindingString << "\" on key '" << name << "'" << std::endl;
262                    this->keyBinder_->setBinding(bindingString, name, bTemporarySaved);
263                    InputManager::getInstance().requestLeaveState("detector");
264                    bound = true;
265                }
266                // else: A key was pressed within the same tick, ignore it.
267            }
268        }
269    }
270}
Note: See TracBrowser for help on using the repository browser.