Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/trunk/src/orxonox/gamestates/GSRoot.cc @ 8706

Last change on this file since 8706 was 8706, checked in by dafrick, 13 years ago

Merging presentation branch back into trunk.
There are many new features and also a lot of other changes and bugfixes, if you want to know, digg through the svn log.
Not everything is yet working as it should, but it should be fairly stable. If you habe any bug reports, just send me an email.

  • Property svn:eol-style set to native
File size: 6.1 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 "GSRoot.h"
30
31#include "util/Clock.h"
32#include "core/BaseObject.h"
33#include "core/Game.h"
34#include "core/GameMode.h"
35#include "core/command/ConsoleCommand.h"
36#include "network/NetworkFunction.h"
37#include "tools/Timer.h"
38#include "tools/interfaces/Tickable.h"
39
40#include "GSLevel.h"
41
42namespace orxonox
43{
44    DeclareGameState(GSRoot, "root", false, false);
45
46    static const std::string __CC_setTimeFactor_name = "setTimeFactor";
47    static const std::string __CC_getTimeFactor_name = "getTimeFactor";
48    static const std::string __CC_setPause_name = "setPause";
49    static const std::string __CC_pause_name = "pause";
50
51    /*static*/ bool GSRoot::startMainMenu_s = false;
52
53    SetConsoleCommand("printObjects", &GSRoot::printObjects).hide();
54    SetConsoleCommand(__CC_setTimeFactor_name, &GSRoot::setTimeFactor).accessLevel(AccessLevel::Master).defaultValues(1.0);
55    SetConsoleCommand(__CC_getTimeFactor_name, &GSRoot::getTimeFactor).accessLevel(AccessLevel::Master);
56    SetConsoleCommand(__CC_setPause_name,      &GSRoot::setPause     ).accessLevel(AccessLevel::Master).hide();
57    SetConsoleCommand(__CC_pause_name,         &GSRoot::pause        ).accessLevel(AccessLevel::Master);
58
59    registerStaticNetworkFunction(&TimeFactorListener::setTimeFactor);
60
61    GSRoot::GSRoot(const GameStateInfo& info)
62        : GameState(info)
63        , bPaused_(false)
64        , timeFactorPauseBackup_(1.0f)
65    {
66    }
67
68    GSRoot::~GSRoot()
69    {
70        NetworkFunctionBase::destroyAllNetworkFunctions();
71    }
72
73    void GSRoot::printObjects()
74    {
75        unsigned int nr=0;
76        for (ObjectList<BaseObject>::iterator it = ObjectList<BaseObject>::begin(); it; ++it)
77        {
78            if (dynamic_cast<Synchronisable*>(*it))
79                COUT(0) << "object: " << it->getIdentifier()->getName() << " id: " << dynamic_cast<Synchronisable*>(*it)->getObjectID() << std::endl;
80            else
81                COUT(0) << "object: " << it->getIdentifier()->getName() << std::endl;
82            nr++;
83        }
84        COUT(0) << "currently got " << nr << " objects" << std::endl;
85    }
86
87    void GSRoot::activate()
88    {
89        // reset game speed to normal
90        TimeFactorListener::setTimeFactor(1.0f);
91
92        ModifyConsoleCommand(__CC_setTimeFactor_name).setObject(this);
93        ModifyConsoleCommand(__CC_getTimeFactor_name).setObject(this);
94        ModifyConsoleCommand(__CC_setPause_name).setObject(this);
95        ModifyConsoleCommand(__CC_pause_name).setObject(this);
96    }
97
98    void GSRoot::deactivate()
99    {
100        ModifyConsoleCommand(__CC_setTimeFactor_name).setObject(0);
101        ModifyConsoleCommand(__CC_getTimeFactor_name).setObject(0);
102        ModifyConsoleCommand(__CC_setPause_name).setObject(0);
103        ModifyConsoleCommand(__CC_pause_name).setObject(0);
104    }
105
106    void GSRoot::update(const Clock& time)
107    {
108        if(startMainMenu_s)
109        {
110            delayedStartMainMenu();
111            startMainMenu_s = false;
112        }
113
114        for (ObjectList<Timer>::iterator it = ObjectList<Timer>::begin(); it; )
115        {
116            Timer* object = *it;
117            ++it;
118            object->tick(time);
119        }
120
121        /*** HACK *** HACK ***/
122        // Call the Tickable objects
123        float leveldt = time.getDeltaTime();
124        if (leveldt > 1.0f)
125        {
126            // just loaded
127            leveldt = 0.0f;
128        }
129        float realdt = leveldt * TimeFactorListener::getTimeFactor();
130        for (ObjectList<Tickable>::iterator it = ObjectList<Tickable>::begin(); it; )
131        {
132            Tickable* object = *it;
133            ++it;
134            object->tick(realdt);
135        }
136        /*** HACK *** HACK ***/
137    }
138
139    /**
140    @brief
141        Changes the speed of Orxonox
142    @remark
143        This function is a hack when placed here!
144        Timefactor should be related to the scene (level or so), not the game
145    */
146    void GSRoot::setTimeFactor(float factor)
147    {
148        if (GameMode::isMaster())
149        {
150            if (!this->bPaused_)
151            {
152                TimeFactorListener::setTimeFactor(factor);
153            }
154            else
155                this->timeFactorPauseBackup_ = factor;
156        }
157    }
158
159    float GSRoot::getTimeFactor()
160    {
161        return TimeFactorListener::getTimeFactor();
162    }
163
164    void GSRoot::pause()
165    {
166        if (GameMode::isMaster())
167        {
168            if (!this->bPaused_)
169            {
170                this->timeFactorPauseBackup_ = TimeFactorListener::getTimeFactor();
171                this->setTimeFactor(0.0f);
172                this->bPaused_ = true;
173            }
174            else
175            {
176                this->bPaused_ = false;
177                this->setTimeFactor(this->timeFactorPauseBackup_);
178            }
179        }
180    }
181
182    void GSRoot::setPause(bool pause)
183    {
184        if (GameMode::isMaster())
185        {
186            if (pause != this->bPaused_)
187                this->pause();
188        }
189    }
190
191    void GSRoot::changedTimeFactor(float factor_new, float factor_old)
192    {
193        if (!GameMode::isStandalone())
194            callStaticNetworkFunction(&TimeFactorListener::setTimeFactor, NETWORK_PEER_ID_BROADCAST, factor_new);
195    }
196
197    /*static*/ void GSRoot::delayedStartMainMenu(void)
198    {
199        if(!startMainMenu_s)
200            startMainMenu_s = true;
201        else
202            GSLevel::startMainMenu();
203    }
204
205}
Note: See TracBrowser for help on using the repository browser.