#include <limits>
#include "scripting/squirrel_util.hpp"
-#include "supertux/main.hpp"
+#include "supertux/globals.hpp"
#include "supertux/resources.hpp"
#include "util/gettext.hpp"
#include "video/drawing_context.hpp"
{
}
-/*
- void
- Statistics::parse(const Reader& reader)
- {
- reader.get("coins-collected", coins);
- reader.get("coins-collected-total", total_coins);
- reader.get("badguys-killed", badguys);
- reader.get("badguys-killed-total", total_badguys);
- reader.get("time-needed", time);
- reader.get("secrets-found", secrets);
- reader.get("secrets-found-total", total_secrets);
- }
-
- void
- Statistics::write(lisp::Writer& writer)
- {
- writer.write("coins-collected", coins);
- writer.write("coins-collected-total", total_coins);
- writer.write("badguys-killed", badguys);
- writer.write("badguys-killed-total", total_badguys);
- writer.write("time-needed", time);
- writer.write("secrets-found", secrets);
- writer.write("secrets-found-total", total_secrets);
- }
-*/
-
void
Statistics::serialize_to_squirrel(HSQUIRRELVM vm)
{
sq_pushstring(vm, "statistics", -1);
sq_newtable(vm);
- if (coins != nv_coins) Scripting::store_int(vm, "coins-collected", coins);
- if (total_coins != nv_coins) Scripting::store_int(vm, "coins-collected-total", total_coins);
- if (badguys != nv_badguys) Scripting::store_int(vm, "badguys-killed", badguys);
- if (total_badguys != nv_badguys) Scripting::store_int(vm, "badguys-killed-total", total_badguys);
- if (time != nv_time) Scripting::store_float(vm, "time-needed", time);
- if (secrets != nv_secrets) Scripting::store_int(vm, "secrets-found", secrets);
- if (total_secrets != nv_secrets) Scripting::store_int(vm, "secrets-found-total", total_secrets);
+ if (coins != nv_coins) scripting::store_int(vm, "coins-collected", coins);
+ if (total_coins != nv_coins) scripting::store_int(vm, "coins-collected-total", total_coins);
+ if (badguys != nv_badguys) scripting::store_int(vm, "badguys-killed", badguys);
+ if (total_badguys != nv_badguys) scripting::store_int(vm, "badguys-killed-total", total_badguys);
+ if (time != nv_time) scripting::store_float(vm, "time-needed", time);
+ if (secrets != nv_secrets) scripting::store_int(vm, "secrets-found", secrets);
+ if (total_secrets != nv_secrets) scripting::store_int(vm, "secrets-found-total", total_secrets);
sq_createslot(vm, -3);
}
if(SQ_FAILED(sq_get(vm, -2))) {
return;
}
- Scripting::get_int(vm, "coins-collected", coins);
- Scripting::get_int(vm, "coins-collected-total", total_coins);
- Scripting::get_int(vm, "badguys-killed", badguys);
- Scripting::get_int(vm, "badguys-killed-total", total_badguys);
- Scripting::get_float(vm, "time-needed", time);
- Scripting::get_int(vm, "secrets-found", secrets);
- Scripting::get_int(vm, "secrets-found-total", total_secrets);
+ scripting::get_int(vm, "coins-collected", coins);
+ scripting::get_int(vm, "coins-collected-total", total_coins);
+ scripting::get_int(vm, "badguys-killed", badguys);
+ scripting::get_int(vm, "badguys-killed-total", total_badguys);
+ scripting::get_float(vm, "time-needed", time);
+ scripting::get_int(vm, "secrets-found", secrets);
+ scripting::get_int(vm, "secrets-found-total", total_secrets);
sq_pop(vm, 1);
}
// skip draw if stats were declared invalid
if (!valid) return;
- context.draw_text(small_font, std::string("- ") + _("Best Level Statistics") + " -", Vector((WMAP_INFO_LEFT_X + WMAP_INFO_RIGHT_X) / 2, WMAP_INFO_TOP_Y1), ALIGN_CENTER, LAYER_GUI,Statistics::header_color);
+ context.draw_text(Resources::small_font, std::string("- ") + _("Best Level Statistics") + " -",
+ Vector((WMAP_INFO_LEFT_X + WMAP_INFO_RIGHT_X) / 2, WMAP_INFO_TOP_Y1),
+ ALIGN_CENTER, LAYER_HUD,Statistics::header_color);
std::string caption_buf;
std::string stat_buf;
break;
}
- context.draw_text(small_font, caption_buf, Vector(WMAP_INFO_LEFT_X, posy), ALIGN_LEFT, LAYER_GUI, Statistics::header_color);
- context.draw_text(small_font, stat_buf, Vector(WMAP_INFO_RIGHT_X, posy), ALIGN_RIGHT, LAYER_GUI, Statistics::header_color);
- posy += small_font->get_height() + 2;
+ context.draw_text(Resources::small_font, caption_buf, Vector(WMAP_INFO_LEFT_X, posy), ALIGN_LEFT, LAYER_HUD, Statistics::header_color);
+ context.draw_text(Resources::small_font, stat_buf, Vector(WMAP_INFO_RIGHT_X, posy), ALIGN_RIGHT, LAYER_HUD, Statistics::header_color);
+ posy += Resources::small_font->get_height() + 2;
}
}
void
-Statistics::draw_endseq_panel(DrawingContext& context, Statistics* best_stats, Surface* backdrop)
+Statistics::draw_endseq_panel(DrawingContext& context, Statistics* best_stats, SurfacePtr backdrop)
{
- // skip draw if level was never played
- // TODO: do we need this?
- if (coins == nv_coins) return;
-
// skip draw if stats were declared invalid
if (!valid) return;
int row2_y = row1_y+30;
int row3_y = row2_y+20;
int row4_y = row3_y+20;
+ int row5_y = row4_y+20;
context.push_transform();
context.set_alpha(0.5);
- context.draw_surface(backdrop, Vector(bd_x, bd_y), LAYER_GUI);
+ context.draw_surface(backdrop, Vector(bd_x, bd_y), LAYER_HUD);
context.pop_transform();
- context.draw_text(normal_font, _("You"), Vector(col2_x, row1_y), ALIGN_LEFT, LAYER_GUI, Statistics::header_color);
- context.draw_text(normal_font, _("Best"), Vector(col3_x, row1_y), ALIGN_LEFT, LAYER_GUI, Statistics::header_color);
-
- context.draw_text(normal_font, _("Coins"), Vector(col2_x-16, row3_y), ALIGN_RIGHT, LAYER_GUI, Statistics::header_color);
- int coins_best = (best_stats && (best_stats->coins > coins)) ? best_stats->coins : coins;
- int total_coins_best = (best_stats && (best_stats->total_coins > total_coins)) ? best_stats->total_coins : total_coins;
- context.draw_text(normal_font, coins_to_string(coins, total_coins), Vector(col2_x, row3_y), ALIGN_LEFT, LAYER_GUI, Statistics::text_color);
- context.draw_text(normal_font, coins_to_string(coins_best, total_coins_best), Vector(col3_x, row3_y), ALIGN_LEFT, LAYER_GUI, Statistics::text_color);
-
- context.draw_text(normal_font, _("Secrets"), Vector(col2_x-16, row4_y), ALIGN_RIGHT, LAYER_GUI, Statistics::header_color);
- int secrets_best = (best_stats && (best_stats->secrets > secrets)) ? best_stats->secrets : secrets;
- int total_secrets_best = (best_stats && (best_stats->total_secrets > total_secrets)) ? best_stats->total_secrets : total_secrets;
- context.draw_text(normal_font, secrets_to_string(secrets, total_secrets), Vector(col2_x, row4_y), ALIGN_LEFT, LAYER_GUI, Statistics::text_color);
- context.draw_text(normal_font, secrets_to_string(secrets_best, total_secrets_best), Vector(col3_x, row4_y), ALIGN_LEFT, LAYER_GUI, Statistics::text_color);
-
- context.draw_text(normal_font, _("Time"), Vector(col2_x-16, row2_y), ALIGN_RIGHT, LAYER_GUI, Statistics::header_color);
- float time_best = (best_stats && (best_stats->time < time)) ? best_stats->time : time;
- context.draw_text(normal_font, time_to_string(time), Vector(col2_x, row2_y), ALIGN_LEFT, LAYER_GUI, Statistics::text_color);
- context.draw_text(normal_font, time_to_string(time_best), Vector(col3_x, row2_y), ALIGN_LEFT, LAYER_GUI, Statistics::text_color);
+ context.draw_text(Resources::normal_font, _("You"), Vector(col2_x, row1_y), ALIGN_LEFT, LAYER_HUD, Statistics::header_color);
+ if (best_stats)
+ context.draw_text(Resources::normal_font, _("Best"), Vector(col3_x, row1_y), ALIGN_LEFT, LAYER_HUD, Statistics::header_color);
+
+ context.draw_text(Resources::normal_font, _("Coins"), Vector(col2_x-16, row3_y), ALIGN_RIGHT, LAYER_HUD, Statistics::header_color);
+ context.draw_text(Resources::normal_font, coins_to_string(coins, total_coins), Vector(col2_x, row3_y), ALIGN_LEFT, LAYER_HUD, Statistics::text_color);
+ if (best_stats) {
+ int coins_best = (best_stats->coins > coins) ? best_stats->coins : coins;
+ int total_coins_best = (best_stats->total_coins > total_coins) ? best_stats->total_coins : total_coins;
+ context.draw_text(Resources::normal_font, coins_to_string(coins_best, total_coins_best), Vector(col3_x, row3_y), ALIGN_LEFT, LAYER_HUD, Statistics::text_color);
+ }
+
+ context.draw_text(Resources::normal_font, _("Badguys"), Vector(col2_x-16, row4_y), ALIGN_RIGHT, LAYER_HUD, Statistics::header_color);
+ context.draw_text(Resources::normal_font, frags_to_string(badguys, total_badguys), Vector(col2_x, row4_y), ALIGN_LEFT, LAYER_HUD, Statistics::text_color);
+ if (best_stats) {
+ int badguys_best = (best_stats->badguys > badguys) ? best_stats->badguys : badguys;
+ int total_badguys_best = (best_stats->total_badguys > total_badguys) ? best_stats->total_badguys : total_badguys;
+ context.draw_text(Resources::normal_font, frags_to_string(badguys_best, total_badguys_best), Vector(col3_x, row4_y), ALIGN_LEFT, LAYER_HUD, Statistics::text_color);
+ }
+
+ context.draw_text(Resources::normal_font, _("Secrets"), Vector(col2_x-16, row5_y), ALIGN_RIGHT, LAYER_HUD, Statistics::header_color);
+ context.draw_text(Resources::normal_font, secrets_to_string(secrets, total_secrets), Vector(col2_x, row5_y), ALIGN_LEFT, LAYER_HUD, Statistics::text_color);
+ if (best_stats) {
+ int secrets_best = (best_stats->secrets > secrets) ? best_stats->secrets : secrets;
+ int total_secrets_best = (best_stats->total_secrets > total_secrets) ? best_stats->total_secrets : total_secrets;
+ context.draw_text(Resources::normal_font, secrets_to_string(secrets_best, total_secrets_best), Vector(col3_x, row5_y), ALIGN_LEFT, LAYER_HUD, Statistics::text_color);
+ }
+
+ context.draw_text(Resources::normal_font, _("Time"), Vector(col2_x-16, row2_y), ALIGN_RIGHT, LAYER_HUD, Statistics::header_color);
+ context.draw_text(Resources::normal_font, time_to_string(time), Vector(col2_x, row2_y), ALIGN_LEFT, LAYER_HUD, Statistics::text_color);
+ if (best_stats) {
+ float time_best = (best_stats->time < time) ? best_stats->time : time;
+ context.draw_text(Resources::normal_font, time_to_string(time_best), Vector(col3_x, row2_y), ALIGN_LEFT, LAYER_HUD, Statistics::text_color);
+ }
}
void
if (!s2.valid) return;
coins = std::max(coins, s2.coins);
total_coins = s2.total_coins;
+ coins = std::min(coins, total_coins);
badguys = std::max(badguys, s2.badguys);
total_badguys = s2.total_badguys;
+ badguys = std::min(badguys, total_badguys);
time = std::min(time, s2.time);
secrets = std::max(secrets, s2.secrets);
total_secrets = s2.total_secrets;
+ secrets = std::min(secrets, total_secrets);
}
void
if (s2.total_secrets != nv_secrets) total_secrets += s2.total_secrets;
}
+bool
+Statistics::completed(const Statistics& stats)
+{
+ return (stats.coins == stats.total_coins &&
+ stats.badguys == stats.total_badguys &&
+ stats.secrets == stats.total_secrets);
+}
+
void
Statistics::declare_invalid()
{