Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/presentation2/src/orxonox/LevelManager.cc @ 6202

Last change on this file since 6202 was 6182, checked in by rgrieder, 15 years ago

Singleton pointer initialisation should be part of the ManageScopedSingleton macro to ensure the order.

  • Property svn:eol-style set to native
File size: 4.4 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 *      Fabian 'x3n' Landau
24 *   Co-authors:
25 *      ...
26 *
27 */
28
29#include "LevelManager.h"
30
31#include <map>
32#include <OgreResourceGroupManager.h>
33
34#include "core/CommandLineParser.h"
35#include "core/ConfigValueIncludes.h"
36#include "core/CoreIncludes.h"
37#include "core/Loader.h"
38#include "core/ScopedSingletonManager.h"
39#include "PlayerManager.h"
40#include "Level.h"
41
42namespace orxonox
43{
44    SetCommandLineArgument(level, "").shortcut("l").information("Default level file (overrides LevelManager::defaultLevelName_ configValue)");
45
46    ManageScopedSingleton(LevelManager, ScopeID::Root, false);
47
48    LevelManager::LevelManager()
49    {
50        RegisterRootObject(LevelManager);
51        this->setConfigValues();
52
53        // check override
54        if (!CommandLineParser::getArgument("level")->hasDefaultValue())
55        {
56            ModifyConfigValue(defaultLevelName_, tset, CommandLineParser::getValue("level").getString());
57        }
58    }
59
60    LevelManager::~LevelManager()
61    {
62    }
63
64    void LevelManager::setConfigValues()
65    {
66        SetConfigValue(defaultLevelName_, "presentation_dm.oxw")
67            .description("Sets the preselection of the level in the main menu.");
68    }
69
70    void LevelManager::requestActivity(Level* level)
71    {
72        this->levels_s.push_back(level);
73        if (this->levels_s.size() == 1)
74            this->activateNextLevel();
75    }
76
77    void LevelManager::releaseActivity(Level* level)
78    {
79        if (this->levels_s.size() > 0)
80        {
81            if (this->levels_s.front() == level)
82            {
83                level->setActive(false);
84                this->levels_s.pop_front();
85                this->activateNextLevel();
86            }
87            else
88            {
89                for (std::list<Level*>::iterator it = this->levels_s.begin(); it != this->levels_s.end(); ++it)
90                    if ((*it) == level)
91                        this->levels_s.erase(it);
92            }
93        }
94    }
95
96    Level* LevelManager::getActiveLevel()
97    {
98        if (this->levels_s.size() > 0)
99            return this->levels_s.front();
100        else
101            return 0;
102    }
103
104    void LevelManager::activateNextLevel()
105    {
106        if (this->levels_s.size() > 0)
107        {
108            this->levels_s.front()->setActive(true);
109            for (std::map<unsigned int, PlayerInfo*>::const_iterator it = PlayerManager::getInstance().getClients().begin(); it != PlayerManager::getInstance().getClients().end(); ++it)
110                this->levels_s.front()->playerEntered(it->second);
111        }
112    }
113
114    void LevelManager::setDefaultLevel(const std::string& levelName)
115    {
116        ModifyConfigValue(defaultLevelName_, set, levelName);
117    }
118
119    const std::string& LevelManager::getDefaultLevel() const
120    {
121        return defaultLevelName_;
122    }
123
124    std::string LevelManager::getAvailableLevelListItem(unsigned int index) const
125    {
126        if (index >= availableLevels_.size())
127            return std::string();
128        else
129            return availableLevels_[index];
130    }
131
132    void LevelManager::compileAvailableLevelList()
133    {
134        availableLevels_.clear();
135
136        availableLevels_ = *Ogre::ResourceGroupManager::getSingleton().findResourceNames(
137            Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, "*.oxw");
138
139        for (std::vector<std::string>::iterator it = availableLevels_.begin(); it != availableLevels_.end();)
140            if (it->find("old/") == 0)
141                it = availableLevels_.erase(it);
142            else
143            {
144                size_t pos = it->find(".oxw");
145                *it = it->substr(0, pos);
146                ++it;
147            }
148    }
149}
Note: See TracBrowser for help on using the repository browser.