Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/trunk/src/orxonox/LevelInfo.h @ 11504

Last change on this file since 11504 was 11356, checked in by patricwi, 8 years ago

merged space race with trunk

  • Property svn:eol-style set to native
File size: 12.6 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 *      Damian 'Mozork' Frick
24 *   Co-authors:
25 *      ...
26 *
27 */
28
29/**
30    @file LevelInfo.h
31    @brief Definition of the LevelInfo and LevelInfoItem class.
32    @ingroup Orxonox
33*/
34
35#ifndef _LevelInfo_H__
36#define _LevelInfo_H__
37
38#include "OrxonoxPrereqs.h"
39
40#include <set>
41#include <string>
42#include "util/StringUtils.h"
43
44#include "core/BaseObject.h"
45#include <iostream>
46#include <fstream>
47#include "core/class/OrxonoxInterface.h"
48
49namespace orxonox // tolua_export
50{ // tolua_export
51
52    /**
53    @brief
54        The LevelInfoItem class stores information regarding a @ref orxonox::Level "Level" and makes that information accessible through the @ref orxonox::LevelManager "LevelManager".
55        A LevelInfoItem object is commonly created from a @ref orxonox::LevelInfo "LevelInfo" object, using its <code>copy()</code> method.
56
57    @author
58        Damian 'Mozork' Frick
59
60    @ingroup Orxonox
61    */
62    class _OrxonoxExport LevelInfoItem // tolua_export
63        : virtual public OrxonoxInterface
64    { // tolua_export
65        public:
66            LevelInfoItem(); //!< Default constructor.
67            LevelInfoItem(const std::string& name, const std::string filename); //!< Constructor. Initializes the object.
68            virtual ~LevelInfoItem(); //!< Destructor.
69
70            /**
71            @brief Set the name of the Level.
72            @param name The name to be set.
73            */
74            inline void setName(const std::string& name)
75                { this->name_ = std::string(name); }
76            /**
77            @brief Get the name of the Level.
78            @return Returns the name of the Level.
79            */
80            inline const std::string& getName(void) const { return this->name_; } // tolua_export
81
82            /**
83            @brief Set the screenshot of the Level.
84            @param screenshot The screenshot to be set.
85            */
86            inline void setScreenshot(const std::string& screenshot) { this->screenshot_ = std::string(screenshot); }
87            /**
88            @brief Get the screenshot of the Level.
89            @return Returns the screenshot of the Level.
90            */
91            inline const std::string& getScreenshot() const { return this->screenshot_; } // tolua_export
92
93            /**
94            @brief Set the description of the Level.
95            @param description The description to be set.
96            */
97            inline void setDescription(const std::string& description)
98                { this->description_ = std::string(description); }
99            /**
100            @brief Get the description of the Level.
101            @return Returns the description of the Level.
102            */
103            inline const std::string& getDescription() const { return this->description_; } // tolua_export
104
105            void setTags(const std::string& tags); //!< Set the tags the Level is tagged with.
106            bool addTag(const std::string& tag, bool update = true); //!< Add a tag to the set of tags the Level is tagged with.
107            /**
108            @brief Get the lis of the tags the Level is tagged with.
109            @return Returns a comma-seperated string of all the tags the Level is tagged with.
110            */
111            inline const std::string& getTags(void) const
112                { return this->tagsString_; }
113            /**
114            @brief Get whether the Level has a specific tag.
115            @param tag The tag for which is checked.
116            @return Returns true if the Level is tagged with the input tag.
117            */
118            inline bool hasTag(const std::string& tag) const { return this->tags_.find(tag) != this->tags_.end(); } // tolua_export
119
120            bool addHighscore(const std::string& name,const int score);
121
122            inline const std::string& getHighscores(void) const { return this->highscoresString_; } // tolua_export
123
124            void setStartingShips(const std::string& ships); //!< Set the starting ship models of the level
125            bool addStartingShip(const std::string& ship, bool update = true); //!< Add a model to shipselection
126            /**
127            @brief Get the set of starting ship models the Level allows
128            @return Returns a comma-seperated string of all the allowed ship models for the shipselection.
129            */
130            inline const std::string& getStartingShips(void) const
131                { return this->startingShipsString_; }
132            /**
133            @brief Get whether the Level allows a specific starting ship model
134            @param ship The ship model for which is checked.
135            @return Returns true if the Level allows the input ship model
136            */
137            inline bool hasStartingShip(const std::string& ship) const { return this->startingShips_.find(ship) != this->startingShips_.end(); } // tolua_export
138            inline void selectStartingShip(const std::string& ship) { this->changeStartingShip(ship); } // tolua_export
139            /**
140            @brief Get the XML-filename of the Level.
141            @return Returns the XML-filename (including *.oxw extension) of the Level.
142            */
143            inline const std::string& getXMLFilename(void) const { return this->xmlfilename_; } // tolua_export
144
145
146        protected:
147            /**
148            @brief Set the XML-filename of the Level.
149            @param filename The XML-filename to be set.
150            */
151            inline void setXMLFilename(const std::string& filename)
152                { this->xmlfilename_ = std::string(filename); }
153
154            std::string xmlfilename_; //!< The XML-filename of the Level.
155
156        private:
157            void changeStartingShip (const std::string& model);
158            void startingshipsUpdated(void); //!< Updates the comma-seperated string of all possible starting ships.
159            void tagsUpdated(void); //!< Updates the comma-seperated string of all tags, if the set of tags has changed.
160            void highscoresUpdated(void);
161            static void initializeTags(void); //!< Initialize the set of allowed tags.
162            /**
163            @brief Check whether an input tag is allowed.
164            @param tag The tag to check.
165            @return Returns true if the input tag is allowed, false if not.
166            */
167            static bool validateTag(const std::string& tag)
168                { LevelInfoItem::initializeTags(); return LevelInfoItem::possibleTags_s.find(tag) != LevelInfoItem::possibleTags_s.end(); }
169
170            static std::set<std::string> possibleTags_s; //!< The set of allowed tags.
171            static const bool initialized_s = false; //!< Whether the set of allowed tags has been inizialized.
172
173            std::string name_; //!< The name of the Level.
174            std::string description_; //!< The description of the Level.
175            std::string screenshot_; //!< The screenshot of the Level.
176            std::set<std::string> tags_; //!< The set of tags the Level is tagged with.
177
178            std::set<std::string> highscores_; 
179            std::string highscoresString_;
180
181            std::string tagsString_; //!< The comma-seperated string of all the tags the Level is tagged with.
182            std::set<std::string> startingShips_; //!< The set of starting ship models the Level allows.
183            std::string startingShipsString_; //!< The comma-seperated string of all the allowed ship models for the shipselection.
184    }; // tolua_export
185
186    /**
187    @brief
188        The LevelInfo class can be used to store information regarding a @ref orxonox::Level "Level" in its level file.
189        The following parameters can be specified:
190        - @b name The name of the level.
191        - @b description The description of the level.
192        - @b screenshot The screenshot of the level.
193        - @b tags A comma-seperated string of tags. Allowed tags are: <em>test</em>, <em>singleplayer</em>, <em>multiplayer</em>, <em>showcase</em>, <em>tutorial</em>, <em>presentation</em>, <em>shipselection</em>.
194        - @b (optional) startingships The comma-seperated string of starting ship models
195        An example would be:
196        @code
197        <LevelInfo
198            name = "Levelname"lhs->compare(rhs) < 0
199            description = "This is just some awesome level."
200            screenshot = "Screenshot.png"
201            tags = "test, awesome"
202        />
203        @endcode
204        The LevelInfo is best located at the top of the level file.
205
206    @author
207        Damian 'Mozork' Frick
208        Matthias Hutter
209    @ingroup Orxonox
210    */
211    class _OrxonoxExport LevelInfo : public BaseObject, public LevelInfoItem
212    {
213        public:
214            LevelInfo(Context* context);
215            virtual ~LevelInfo();
216
217            virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode) override; //!< Creates a LevelInfo object through XML.
218
219            /**
220            @brief Set the screenshot of the Level.
221            @param screenshot The screenshot to be set.
222            */
223            inline void setScreenshot(const std::string& screenshot) { this->LevelInfoItem::setScreenshot(screenshot); }
224            /**
225            @brief Get the screenshot of the Level.
226            @return Returns the screenshot of the Level.
227            */
228            inline const std::string& getScreenshot() const { return this->LevelInfoItem::getScreenshot(); }
229
230            /**
231            @brief Set the description of the Level.
232            @param description The description to be set.
233            */
234            inline void setDescription(const std::string& description)
235                { this->LevelInfoItem::setDescription(description); }
236            /**
237            @brief Get the description of the Level.
238            @return Returns the description of the Level.
239            */
240            inline const std::string& getDescription() const
241                { return this->LevelInfoItem::getDescription(); }
242
243            /**
244            @brief Set the tags the Level is tagged with.
245            @param tags A comma-seperated string of all the tags to be set.
246            */
247            inline void setTags(const std::string& tags)
248                { this->LevelInfoItem::setTags(tags); }
249            /**
250            @brief Get the lis of the tags the Level is tagged with.
251            @return Returns a comma-seperated string of all the tags the Level is tagged with.
252            */
253            inline const std::string& getTags(void) const
254                { return this->LevelInfoItem::getTags(); }
255
256            inline const std::string& getHighscores(void) const
257                { return this->LevelInfoItem::getHighscores(); }
258            /**
259            @brief Set the starting ship models of the level
260            @param ships A comma-seperated string of all the allowed ship models for the shipselection.
261            */
262            inline void setStartingShips(const std::string& ships)
263                { this->LevelInfoItem::setStartingShips(ships); }
264            /**
265            @brief Get the starting ship models of the level
266            @return Returns a comma-seperated string of all the allowed ship models for the shipselection.
267            */
268            inline const std::string& getStartingShips(void) const
269                { return this->LevelInfoItem::getStartingShips(); }
270
271            LevelInfoItem* copy(void); //!< Copies the contents of this LevelInfo object to a new LevelInfoItem object.
272    };
273
274    /**
275    @brief
276        Struct that overloads the compare operation between two @ref orxonox::LevelInfoItem "LevelInfoItem" pointers.
277
278    @ingroup Orxonox
279    */
280    struct LevelInfoCompare
281    {
282        bool operator() (const LevelInfoItem* lhs, const LevelInfoItem* rhs) const
283            {
284                if(getLowercase(lhs->getName()).compare(getLowercase(rhs->getName())) == 0)
285                    return getLowercase(lhs->getXMLFilename()).compare(getLowercase(rhs->getXMLFilename())) < 0;
286                return getLowercase(lhs->getName()).compare(getLowercase(rhs->getName())) < 0;
287            }
288    };
289
290} // tolua_export
291
292#endif /* _LevelInfo_H__ */
Note: See TracBrowser for help on using the repository browser.