Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/cpp11_v2/src/orxonox/gamestates/GSRoot.cc @ 11003

Last change on this file since 11003 was 10920, checked in by landauf, 10 years ago

no static functions anymore in ObjectList. you need to instantiate an ObjectList to use it.
this allows for prettier for-loop syntax when iterating over an ObjectList of a specific context: for (T* object : ObjectList<T>(context)) { … }

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