From: Christoph Sommer Date: Sun, 9 Apr 2006 23:05:23 +0000 (+0000) Subject: Level statistics panel shown during level's end sequence X-Git-Url: https://git.verplant.org/?a=commitdiff_plain;h=cfa6a410943ae4fee8d5d8c5270f7119a82fe970;p=supertux.git Level statistics panel shown during level's end sequence SVN-Revision: 3282 --- diff --git a/data/images/engine/menu/score-backdrop.png b/data/images/engine/menu/score-backdrop.png index 76e66c4cd..6f126995f 100644 Binary files a/data/images/engine/menu/score-backdrop.png and b/data/images/engine/menu/score-backdrop.png differ diff --git a/src/game_session.cpp b/src/game_session.cpp index b502668c6..53152b35a 100644 --- a/src/game_session.cpp +++ b/src/game_session.cpp @@ -119,6 +119,8 @@ GameSession::GameSession(const std::string& levelfile_, GameSessionMode mode, Console::registerCommand(consoleCommands[i], this); } + statistics_backdrop = new Surface("images/engine/menu/score-backdrop.png"); + restart_level(true); } @@ -195,6 +197,8 @@ GameSession::~GameSession() Console::unregisterCommand(consoleCommands[i], this); } + delete statistics_backdrop; + current_ = NULL; } @@ -451,28 +455,6 @@ GameSession::check_end_conditions() /* End of level? */ if(end_sequence && endsequence_timer.check()) { finish(true); - - // add time spent to statistics - int tottime = 0, remtime = 0; - for(std::vector::iterator i = level->sectors.begin(); i != level->sectors.end(); ++i) - { - Sector* sec = *i; - - for(std::vector::iterator j = sec->gameobjects.begin(); - j != sec->gameobjects.end(); ++j) - { - GameObject* obj = *j; - - LevelTime* lt = dynamic_cast (obj); - if(lt) - { - tottime += int(lt->get_level_time()); - remtime += int(lt->get_remaining_time()); - } - } - } - global_stats.set_points(TIME_NEEDED_STAT, (tottime == 0 ? -1 : (tottime-remtime))); - return; } else if (!end_sequence && tux->is_dead()) { if (player_status->coins < 0) { @@ -796,6 +778,27 @@ GameSession::start_sequence(const std::string& sequencename) lt->stop(); } + // add time spent to statistics + int tottime = 0, remtime = 0; + for(std::vector::iterator i = level->sectors.begin(); i != level->sectors.end(); ++i) + { + Sector* sec = *i; + + for(std::vector::iterator j = sec->gameobjects.begin(); + j != sec->gameobjects.end(); ++j) + { + GameObject* obj = *j; + + LevelTime* lt = dynamic_cast (obj); + if(lt) + { + tottime += int(lt->get_level_time()); + remtime += int(lt->get_remaining_time()); + } + } + } + global_stats.set_points(TIME_NEEDED_STAT, (tottime == 0 ? -1 : (tottime-remtime))); + if(sequencename == "fireworks") { currentsector->add_object(new Fireworks()); } @@ -823,5 +826,10 @@ GameSession::drawstatus(DrawingContext& context) context.draw_text(white_text, fpstext, Vector(SCREEN_WIDTH - white_text->get_text_width(fpstext) - gold_text->get_text_width(" 99999") - BORDER_X, BORDER_Y + 20), LEFT_ALLIGN, LAYER_FOREGROUND1); context.draw_text(gold_text, str, Vector(SCREEN_WIDTH - BORDER_X, BORDER_Y + 20), RIGHT_ALLIGN, LAYER_FOREGROUND1); } + + // draw level stats while end_sequence is running + if (end_sequence) { + global_stats.draw_endseq_panel(context, best_level_statistics, statistics_backdrop); + } } diff --git a/src/game_session.hpp b/src/game_session.hpp index 3b14707c7..6b7245082 100644 --- a/src/game_session.hpp +++ b/src/game_session.hpp @@ -28,6 +28,7 @@ #include "statistics.hpp" #include "math/vector.hpp" #include "console.hpp" +#include "video/surface.hpp" /* GameLoop modes */ enum GameSessionMode { @@ -113,6 +114,8 @@ private: Timer endsequence_timer; Level* level; + Surface* statistics_backdrop; // FIXME: where to put this? + Sector* currentsector; GameSessionMode mode; diff --git a/src/statistics.cpp b/src/statistics.cpp index 11c03b52d..920339267 100644 --- a/src/statistics.cpp +++ b/src/statistics.cpp @@ -203,6 +203,66 @@ Statistics::draw_message_info(DrawingContext& context, std::string title) } } +void +Statistics::draw_endseq_panel(DrawingContext& context, Statistics* best_stats, Surface* backdrop) +{ + // abort if statistics are not yet initialized + if(stats[COINS_COLLECTED_STAT][SPLAYER] == -1) return; + + // abort if we have no backdrop + if (!backdrop) return; + + int box_w = 130+130+130; + int box_h = 30+20+20+20; + int box_x = (int)((SCREEN_WIDTH - box_w) / 2); + int box_y = (int)(SCREEN_HEIGHT / 2) - box_h; + + int bd_w = (int)backdrop->get_width(); + int bd_h = (int)backdrop->get_height(); + int bd_x = (int)((SCREEN_WIDTH - bd_w) / 2); + int bd_y = box_y + (box_h / 2) - (bd_h / 2); + + int col1_x = box_x; + int col2_x = col1_x+130; + int col3_x = col2_x+130; + + int row1_y = box_y; + int row2_y = row1_y+30; + int row3_y = row2_y+20; + int row4_y = row3_y+20; + + context.draw_surface(backdrop, Vector(bd_x, bd_y), LAYER_GUI); + + char buf[129]; + context.draw_text(white_text, "You", Vector(col2_x, row1_y), LEFT_ALLIGN, LAYER_GUI); + context.draw_text(white_text, "Best", Vector(col3_x, row1_y), LEFT_ALLIGN, LAYER_GUI); + + context.draw_text(white_text, "Coins", Vector(col1_x, row2_y), LEFT_ALLIGN, LAYER_GUI); + snprintf(buf, 128, "%d/%d", stats[COINS_COLLECTED_STAT][SPLAYER], stats[COINS_COLLECTED_STAT][STOTAL]); + context.draw_text(gold_text, buf, Vector(col2_x, row2_y), LEFT_ALLIGN, LAYER_GUI); + if (best_stats && (best_stats->stats[COINS_COLLECTED_STAT][SPLAYER] > stats[COINS_COLLECTED_STAT][SPLAYER])) { + snprintf(buf, 128, "%d/%d", best_stats->stats[COINS_COLLECTED_STAT][SPLAYER], best_stats->stats[COINS_COLLECTED_STAT][STOTAL]); + } + context.draw_text(gold_text, buf, Vector(col3_x, row2_y), LEFT_ALLIGN, LAYER_GUI); + + context.draw_text(white_text, "Time", Vector(col1_x, row3_y), LEFT_ALLIGN, LAYER_GUI); + snprintf(buf, 128, "%d:%02d", stats[TIME_NEEDED_STAT][SPLAYER] / 60, stats[TIME_NEEDED_STAT][SPLAYER] % 60); + context.draw_text(gold_text, buf, Vector(col2_x, row3_y), LEFT_ALLIGN, LAYER_GUI); + if (best_stats && (best_stats->stats[TIME_NEEDED_STAT][SPLAYER] < stats[TIME_NEEDED_STAT][SPLAYER])) { + snprintf(buf, 128, "%d:%02d", best_stats->stats[TIME_NEEDED_STAT][SPLAYER] / 60, best_stats->stats[TIME_NEEDED_STAT][SPLAYER] % 60); + } + context.draw_text(gold_text, buf, Vector(col3_x, row3_y), LEFT_ALLIGN, LAYER_GUI); + + context.draw_text(white_text, "Badguys", Vector(col1_x, row4_y), LEFT_ALLIGN, LAYER_GUI); + snprintf(buf, 128, "%d/%d", stats[BADGUYS_KILLED_STAT][SPLAYER], stats[BADGUYS_KILLED_STAT][STOTAL]); + context.draw_text(gold_text, buf, Vector(col2_x, row4_y), LEFT_ALLIGN, LAYER_GUI); + if (best_stats && (best_stats->stats[BADGUYS_KILLED_STAT][SPLAYER] > stats[BADGUYS_KILLED_STAT][SPLAYER])) { + snprintf(buf, 128, "%d/%d", best_stats->stats[BADGUYS_KILLED_STAT][SPLAYER], best_stats->stats[BADGUYS_KILLED_STAT][STOTAL]); + } + context.draw_text(gold_text, buf, Vector(col3_x, row4_y), LEFT_ALLIGN, LAYER_GUI); + +} + void Statistics::add_points(int stat, int points) { diff --git a/src/statistics.hpp b/src/statistics.hpp index 08488e673..02c0a5cf3 100644 --- a/src/statistics.hpp +++ b/src/statistics.hpp @@ -24,8 +24,8 @@ #include "timer.hpp" #include "lisp/lisp.hpp" #include "lisp/writer.hpp" - -class DrawingContext; +#include "video/surface.hpp" +#include "video/drawing_context.hpp" #define SPLAYER 0 #define STOTAL 1 @@ -58,6 +58,7 @@ public: // TODO: make this functions working void draw_worldmap_info(DrawingContext& context); void draw_message_info(DrawingContext& context, std::string title); + void draw_endseq_panel(DrawingContext& context, Statistics* best_stats, Surface* backdrop); /**< draw panel shown during level's end sequence */ /* Add / Set / Get points to/from one of the stats this can keep track of */ void add_points(int stat, int points);