Level statistics panel shown during level's end sequence
authorChristoph Sommer <mail@christoph-sommer.de>
Sun, 9 Apr 2006 23:05:23 +0000 (23:05 +0000)
committerChristoph Sommer <mail@christoph-sommer.de>
Sun, 9 Apr 2006 23:05:23 +0000 (23:05 +0000)
SVN-Revision: 3282

data/images/engine/menu/score-backdrop.png
src/game_session.cpp
src/game_session.hpp
src/statistics.cpp
src/statistics.hpp

index 76e66c4..6f12699 100644 (file)
Binary files a/data/images/engine/menu/score-backdrop.png and b/data/images/engine/menu/score-backdrop.png differ
index b502668..53152b3 100644 (file)
@@ -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<Sector*>::iterator i = level->sectors.begin(); i != level->sectors.end(); ++i)
-    {
-      Sector* sec = *i;
-
-      for(std::vector<GameObject*>::iterator j = sec->gameobjects.begin();
-          j != sec->gameobjects.end(); ++j)
-      {
-        GameObject* obj = *j;
-
-        LevelTime* lt = dynamic_cast<LevelTime*> (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<Sector*>::iterator i = level->sectors.begin(); i != level->sectors.end(); ++i)
+    {
+      Sector* sec = *i;
+
+      for(std::vector<GameObject*>::iterator j = sec->gameobjects.begin();
+          j != sec->gameobjects.end(); ++j)
+      {
+        GameObject* obj = *j;
+
+        LevelTime* lt = dynamic_cast<LevelTime*> (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);
+  }
 }
 
index 3b14707..6b72450 100644 (file)
@@ -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;
index 11c03b5..9203392 100644 (file)
@@ -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)
 {
index 08488e6..02c0a5c 100644 (file)
@@ -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);