Skip to content

Commit

Permalink
Worldmap now supports an additional level sprite action that indicate…
Browse files Browse the repository at this point in the history
…s completion of all level stats.

A potential future improvement to this mechanism would be adding an optional "target_time" to levels which needs to be reached before the level is marked as "perfect".

Note that this change will cause a one-time reset of all level stats- sorry.
  • Loading branch information
LMH0013 authored and tobbi committed Oct 26, 2013
1 parent 21b7863 commit ff8457f
Show file tree
Hide file tree
Showing 15 changed files with 115 additions and 7 deletions.
1 change: 1 addition & 0 deletions WHATSNEW.txt
Expand Up @@ -5,6 +5,7 @@ Tracking major changes in-situ:
glow effects
new badguys: iceflame, ghostflame, livefire, goldbomb, smartblock
new bonuses: coinrain, coinexplode
statistics improved

Supertux Release 0.3.4 (2013-07)
--------------------------------
Expand Down
29 changes: 29 additions & 0 deletions data/images/worldmap/common/bonusdot.sprite
Expand Up @@ -11,4 +11,33 @@
(hitbox 16 16 0 0)
(images "leveldot_green.png")
)
(action
(name "perfect")
(hitbox 16 16 0 0)
(images "leveldot_green.png"
"leveldot_green.png"
"leveldot_green.png"
"leveldot_green.png"
"leveldot_green.png"
"leveldot_green.png"
"leveldot_green.png"
"leveldot_green.png"
"leveldot_green.png"
"leveldot_green_perfect-0.png"
"leveldot_green_perfect-1.png"
"leveldot_green_perfect-2.png"
"leveldot_green_perfect-3.png"
"leveldot_green_perfect-2.png"
"leveldot_green_perfect-1.png"
"leveldot_green_perfect-0.png"
"leveldot_green.png"
"leveldot_green.png"
"leveldot_green.png"
"leveldot_green.png"
"leveldot_green.png"
"leveldot_green.png"
"leveldot_green.png"
"leveldot_green.png"
"leveldot_green.png")
)
)
29 changes: 29 additions & 0 deletions data/images/worldmap/common/hiddendot.sprite
Expand Up @@ -9,4 +9,33 @@
(hitbox 16 16 0 0)
(images "leveldot_green.png")
)
(action
(name "perfect")
(hitbox 16 16 0 0)
(images "leveldot_green.png"
"leveldot_green.png"
"leveldot_green.png"
"leveldot_green.png"
"leveldot_green.png"
"leveldot_green.png"
"leveldot_green.png"
"leveldot_green.png"
"leveldot_green.png"
"leveldot_green_perfect-0.png"
"leveldot_green_perfect-1.png"
"leveldot_green_perfect-2.png"
"leveldot_green_perfect-3.png"
"leveldot_green_perfect-2.png"
"leveldot_green_perfect-1.png"
"leveldot_green_perfect-0.png"
"leveldot_green.png"
"leveldot_green.png"
"leveldot_green.png"
"leveldot_green.png"
"leveldot_green.png"
"leveldot_green.png"
"leveldot_green.png"
"leveldot_green.png"
"leveldot_green.png")
)
)
29 changes: 29 additions & 0 deletions data/images/worldmap/common/leveldot.sprite
Expand Up @@ -9,4 +9,33 @@
(hitbox 16 16 0 0)
(images "leveldot_green.png")
)
(action
(name "perfect")
(hitbox 16 16 0 0)
(images "leveldot_green.png"
"leveldot_green.png"
"leveldot_green.png"
"leveldot_green.png"
"leveldot_green.png"
"leveldot_green.png"
"leveldot_green.png"
"leveldot_green.png"
"leveldot_green.png"
"leveldot_green_perfect-0.png"
"leveldot_green_perfect-1.png"
"leveldot_green_perfect-2.png"
"leveldot_green_perfect-3.png"
"leveldot_green_perfect-2.png"
"leveldot_green_perfect-1.png"
"leveldot_green_perfect-0.png"
"leveldot_green.png"
"leveldot_green.png"
"leveldot_green.png"
"leveldot_green.png"
"leveldot_green.png"
"leveldot_green.png"
"leveldot_green.png"
"leveldot_green.png"
"leveldot_green.png")
)
)
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
5 changes: 5 additions & 0 deletions data/images/worldmap/common/shroom.sprite
Expand Up @@ -20,6 +20,11 @@
(action
(name "solved")
(hitbox 16 16 0 0)
(images "level_star.png")
)
(action
(name "perfect")
(hitbox 16 16 0 0)
(images "level_star.png"
"level_star1.png"
"level_star1.png"
Expand Down
8 changes: 8 additions & 0 deletions src/supertux/statistics.cpp
Expand Up @@ -258,6 +258,14 @@ Statistics::operator+=(const Statistics& s2)
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()
{
Expand Down
6 changes: 1 addition & 5 deletions src/supertux/statistics.hpp
Expand Up @@ -48,11 +48,6 @@ class Statistics
Statistics(); /**< Creates new statistics, call reset() before counting */
~Statistics();

/// read statistics from lisp file
//void parse(const Reader& lisp);
/// write statistics to lisp file
//void write(Writer& writer);

/**
* serialize statistics object as squirrel table "statistics"
*/
Expand All @@ -70,6 +65,7 @@ class Statistics
void reset(); /**< Set stats (but not totals) to zero */
void merge(const Statistics& stats); /**< Given another Statistics object finds the best of each one */
void operator+=(const Statistics& o); /**< Add two Statistics objects */
bool completed(const Statistics& stats); /* Check if stats match total stats */

void declare_invalid(); /**< marks statistics as invalid for their entire lifetime (e.g. after cheating). Invalid statistics will not be merged or drawn. */

Expand Down
1 change: 1 addition & 0 deletions src/worldmap/level.cpp
Expand Up @@ -33,6 +33,7 @@ LevelTile::LevelTile(const std::string& basedir, const Reader& lisp) :
pos(),
title(),
solved(false),
perfect(false),
auto_play(false),
sprite(),
statistics(),
Expand Down
1 change: 1 addition & 0 deletions src/worldmap/level.hpp
Expand Up @@ -43,6 +43,7 @@ class LevelTile : public GameObject
Vector pos;
std::string title;
bool solved;
bool perfect;
bool auto_play; /**< true if Tux should automatically enter this level if it's unfinished */

SpritePtr sprite;
Expand Down
2 changes: 1 addition & 1 deletion src/worldmap/tux.cpp
Expand Up @@ -147,7 +147,7 @@ Tux::tryStartWalking()

// We got a new direction, so lets start walking when possible
Vector next_tile;
if ((!level || level->solved)
if ((!level || level->solved || level->perfect)
&& worldmap->path_ok(input_direction, tile_pos, &next_tile)) {
tile_pos = next_tile;
moving = true;
Expand Down
11 changes: 10 additions & 1 deletion src/worldmap/worldmap.cpp
Expand Up @@ -461,6 +461,10 @@ WorldMap::finished_level(Level* gamelevel)
// deal with statistics
level->statistics.merge(gamelevel->stats);
calculate_total_stats();
if(level->statistics.completed(level->statistics)) {
level->perfect = true;
level->sprite->set_action("perfect");
}

save_state();

Expand Down Expand Up @@ -987,6 +991,7 @@ WorldMap::save_state()
sq_newtable(vm);

store_bool(vm, "solved", level->solved);
store_bool(vm, "perfect", level->perfect);
level->statistics.serialize_to_squirrel(vm);

sq_createslot(vm, -3);
Expand Down Expand Up @@ -1058,7 +1063,11 @@ WorldMap::load_state()
sq_pushstring(vm, level->get_name().c_str(), -1);
if(SQ_SUCCEEDED(sq_get(vm, -2))) {
level->solved = read_bool(vm, "solved");
level->sprite->set_action(level->solved ? "solved" : "default");
level->perfect = read_bool(vm, "perfect");
if(!level->solved)
level->sprite->set_action("default");
else
level->sprite->set_action((level->sprite->has_action("perfect") && level->perfect) ? "perfect" : "solved");
level->statistics.unserialize_from_squirrel(vm);
sq_pop(vm, 1);
}
Expand Down

0 comments on commit ff8457f

Please sign in to comment.