02215f9450e45df2df207d9fd45fe6c03dd1ea79
[supertux.git] / src / supertux / levelintro.cpp
1 //  SuperTux -- LevelIntro screen
2 //  Copyright (C) 2008 Christoph Sommer <christoph.sommer@2008.expires.deltadevelopment.de>
3 //
4 //  This program is free software: you can redistribute it and/or modify
5 //  it under the terms of the GNU General Public License as published by
6 //  the Free Software Foundation, either version 3 of the License, or
7 //  (at your option) any later version.
8 //
9 //  This program is distributed in the hope that it will be useful,
10 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
11 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 //  GNU General Public License for more details.
13 //
14 //  You should have received a copy of the GNU General Public License
15 //  along with this program.  If not, see <http://www.gnu.org/licenses/>.
16
17 #include "supertux/levelintro.hpp"
18
19 #include "control/input_manager.hpp"
20 #include "math/random_generator.hpp"
21 #include "sprite/sprite_manager.hpp"
22 #include "supertux/fadeout.hpp"
23 #include "supertux/globals.hpp"
24 #include "supertux/screen_manager.hpp"
25 #include "supertux/resources.hpp"
26 #include "util/gettext.hpp"
27
28 #include <sstream>
29 #include <boost/format.hpp>
30
31 LevelIntro::LevelIntro(const Level* level, const Statistics* best_level_statistics) :
32   level(level),
33   best_level_statistics(best_level_statistics),
34   player_sprite(),
35   player_sprite_py(0),
36   player_sprite_vy(0),
37   player_sprite_jump_timer()
38 {
39   player_sprite = sprite_manager->create("images/creatures/tux/tux.sprite");
40   player_sprite->set_action("small-walk-right");
41   player_sprite_jump_timer.start(graphicsRandom.randf(5,10));
42 }
43
44 LevelIntro::~LevelIntro()
45 {
46 }
47
48 void
49 LevelIntro::setup()
50 {
51 }
52
53 void
54 LevelIntro::update(float elapsed_time)
55 {
56   Controller *controller = g_input_manager->get_controller();
57
58   // Check if it's time to exit the screen
59   if(controller->pressed(Controller::JUMP)
60      || controller->pressed(Controller::ACTION)
61      || controller->pressed(Controller::MENU_SELECT)
62      || controller->pressed(Controller::PAUSE_MENU)) {
63     g_screen_manager->pop_screen(std::unique_ptr<ScreenFade>(new FadeOut(0.1)));
64   }
65
66   player_sprite_py += player_sprite_vy * elapsed_time;
67   player_sprite_vy += 1000 * elapsed_time;
68   if (player_sprite_py >= 0) {
69     player_sprite_py = 0;
70     player_sprite_vy = 0;
71   }
72   if (player_sprite_jump_timer.check()) {
73     player_sprite_vy = -300;
74     player_sprite_jump_timer.start(graphicsRandom.randf(2,3));
75   }
76
77 }
78
79 void
80 LevelIntro::draw(DrawingContext& context)
81 {
82   const Statistics& stats = level->stats;
83   int py = static_cast<int>(SCREEN_HEIGHT / 2 - Resources::normal_font->get_height() / 2);
84
85   context.draw_filled_rect(Vector(0, 0), Vector(SCREEN_WIDTH, SCREEN_HEIGHT), Color(0.0f, 0.0f, 0.0f, 1.0f), 0);
86
87   {
88     context.draw_center_text(Resources::normal_font, level->get_name(), Vector(0, py), LAYER_FOREGROUND1, LevelIntro::header_color);
89     py += static_cast<int>(Resources::normal_font->get_height());
90   }
91
92   std::string author = level->get_author();
93   if ((author != "") && (author != "SuperTux Team")) {
94     std::string author_text = str(boost::format(_("contributed by %s")) % author);
95     context.draw_center_text(Resources::small_font, author_text, Vector(0, py), LAYER_FOREGROUND1, LevelIntro::author_color);
96     py += static_cast<int>(Resources::small_font->get_height());
97   }
98
99   py += 32;
100
101   {
102     player_sprite->draw(context, Vector((SCREEN_WIDTH - player_sprite->get_current_hitbox_width()) / 2, py + player_sprite_py), LAYER_FOREGROUND1);
103     py += static_cast<int>(player_sprite->get_current_hitbox_height());
104   }
105
106   py += 32;
107
108   {
109     context.draw_center_text(Resources::normal_font, std::string("- ") + _("Best Level Statistics") + std::string(" -"), Vector(0, py), LAYER_FOREGROUND1, LevelIntro::stat_hdr_color);
110     py += static_cast<int>(Resources::normal_font->get_height());
111   }
112
113   {
114     std::stringstream ss;
115     ss << _("Coins") << ": " << Statistics::coins_to_string((best_level_statistics && (best_level_statistics->coins >= 0)) ? best_level_statistics->coins : 0, stats.total_coins);
116     context.draw_center_text(Resources::normal_font, ss.str(), Vector(0, py), LAYER_FOREGROUND1, LevelIntro::stat_color);
117     py += static_cast<int>(Resources::normal_font->get_height());
118   }
119         
120   {
121     std::stringstream ss;
122     ss << _("Badguys killed") << ": " << Statistics::frags_to_string((best_level_statistics && (best_level_statistics->coins >= 0)) ? best_level_statistics->badguys : 0, stats.total_badguys);
123     context.draw_center_text(Resources::normal_font, ss.str(), Vector(0, py), LAYER_FOREGROUND1,LevelIntro::stat_color);
124     py += static_cast<int>(Resources::normal_font->get_height());
125   }
126
127   {
128     std::stringstream ss;
129     ss << _("Secrets") << ": " << Statistics::secrets_to_string((best_level_statistics && (best_level_statistics->coins >= 0)) ? best_level_statistics->secrets : 0, stats.total_secrets);
130     context.draw_center_text(Resources::normal_font, ss.str(), Vector(0, py), LAYER_FOREGROUND1,LevelIntro::stat_color);
131     py += static_cast<int>(Resources::normal_font->get_height());
132   }
133
134   {
135     std::stringstream ss;
136     ss << _("Best time") << ": " << Statistics::time_to_string((best_level_statistics && (best_level_statistics->coins >= 0)) ? best_level_statistics->time : 0);
137     context.draw_center_text(Resources::normal_font, ss.str(), Vector(0, py), LAYER_FOREGROUND1,LevelIntro::stat_color);
138     py += static_cast<int>(Resources::normal_font->get_height());
139   }
140
141   if(level->target_time){
142     std::stringstream ss;
143     ss << _("Level target time") << ": " << Statistics::time_to_string(level->target_time);
144     context.draw_center_text(Resources::normal_font, ss.str(), Vector(0, py), LAYER_FOREGROUND1,LevelIntro::stat_color);
145     py += static_cast<int>(Resources::normal_font->get_height());
146   }
147
148 }
149
150 /* EOF */