1 // SuperTux
2 // Copyright (C) 2004 Ingo Ruhnke <grumbel@gmail.com>
3 // Copyright (C) 2006 Christoph Sommer <christoph.sommer@2006.expires.deltadevelopment.de>
4 //
5 // This program is free software: you can redistribute it and/or modify
6 // it under the terms of the GNU General Public License as published by
7 // the Free Software Foundation, either version 3 of the License, or
8 // (at your option) any later version.
9 //
10 // This program is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 // GNU General Public License for more details.
14 //
15 // You should have received a copy of the GNU General Public License
16 // along with this program. If not, see <http://www.gnu.org/licenses/>.
17
18 #include "worldmap/level_tile.hpp"
19
20 #include <physfs.h>
21
22 #include "sprite/sprite.hpp"
23 #include "sprite/sprite_manager.hpp"
24 #include "util/file_system.hpp"
25 #include "util/log.hpp"
26 #include "util/reader_mapping.hpp"
27 #include "worldmap/worldmap.hpp"
28
29 namespace worldmap {
30
LevelTile(const std::string & basedir,const ReaderMapping & mapping)31 LevelTile::LevelTile(const std::string& basedir, const ReaderMapping& mapping) :
32 GameObject(mapping),
33 m_pos(0.0f, 0.0f),
34 m_basedir(basedir),
35 m_level_filename(),
36 m_title(),
37 m_auto_play(false),
38 m_target_time(),
39 m_extro_script(),
40 m_solved(false),
41 m_perfect(false),
42 m_statistics(),
43 m_sprite(),
44 m_title_color(WorldMap::level_title_color)
45 {
46 if (!mapping.get("level", m_level_filename)) {
47 // Hack for backward compatibility with 0.5.x level
48 m_level_filename = m_name;
49 }
50
51 mapping.get("x", m_pos.x);
52 mapping.get("y", m_pos.y);
53 mapping.get("auto-play", m_auto_play);
54
55 std::string spritefile = "images/worldmap/common/leveldot.sprite";
56 mapping.get("sprite", spritefile);
57 m_sprite = SpriteManager::current()->create(spritefile);
58
59 mapping.get("extro-script", m_extro_script);
60
61 std::vector<float> vColor;
62 if (mapping.get("color", vColor)) {
63 m_title_color = Color(vColor);
64 }
65
66 if (m_basedir == "./") {
67 m_basedir = "";
68 }
69
70 if (!PHYSFS_exists(FileSystem::join(m_basedir, m_level_filename).c_str()))
71 {
72 log_warning << "level file '" << m_level_filename
73 << "' does not exist and will not be added to the worldmap" << std::endl;
74 return;
75 }
76 }
77
~LevelTile()78 LevelTile::~LevelTile()
79 {
80 }
81
82 void
draw(DrawingContext & context)83 LevelTile::draw(DrawingContext& context)
84 {
85 m_sprite->draw(context.color(), m_pos * 32.0f + Vector(16, 16), LAYER_OBJECTS - 1);
86 }
87
88 void
update(float)89 LevelTile::update(float )
90 {
91 }
92
93 void
update_sprite_action()94 LevelTile::update_sprite_action()
95 {
96 if (!m_solved) {
97 m_sprite->set_action("default");
98 } else {
99 m_sprite->set_action((m_sprite->has_action("perfect") && m_perfect) ? "perfect" : "solved");
100 }
101 }
102
103 void
set_solved(bool v)104 LevelTile::set_solved(bool v)
105 {
106 m_solved = v;
107 update_sprite_action();
108 }
109
110 void
set_perfect(bool v)111 LevelTile::set_perfect(bool v)
112 {
113 m_perfect = v;
114 update_sprite_action();
115 }
116
117 } // namespace worldmap
118
119 /* EOF */
120