X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fsupertux%2Flevel.cpp;h=311ec12d72696980307c06b40ffe63566a3e9f3e;hb=2fee8cb489f155b847abb2fd90580c4cab5f3cda;hp=a398d7fbfa04265c78634f5f756be3abd1961726;hpb=c1277f5b7db9f55d1d28f658b4e804f32b76f0ce;p=supertux.git diff --git a/src/supertux/level.cpp b/src/supertux/level.cpp index a398d7fbf..311ec12d7 100644 --- a/src/supertux/level.cpp +++ b/src/supertux/level.cpp @@ -16,27 +16,32 @@ #include "supertux/level.hpp" +#include "badguy/goldbomb.hpp" #include "lisp/list_iterator.hpp" #include "lisp/parser.hpp" -#include "object/block.hpp" +#include "object/bonus_block.hpp" #include "object/coin.hpp" #include "supertux/sector.hpp" #include "supertux/tile_manager.hpp" #include "supertux/tile_set.hpp" #include "trigger/secretarea_trigger.hpp" +#include +#include + using namespace std; Level::Level() : - name("noname"), - author("Mr. X"), + name("noname"), + author("Mr. X"), contact(), license(), filename(), on_menukey_script(), sectors(), stats(), - tileset(NULL), + target_time(), + tileset(NULL), free_tileset(false) { } @@ -64,28 +69,28 @@ Level::load(const std::string& filepath) int version = 1; level->get("version", version); if(version == 1) { - log_info << "level uses old format: version 1" << std::endl; - tileset = tile_manager->get_tileset("images/tiles.strf"); + log_info << "[" << filepath << "] level uses old format: version 1" << std::endl; + tileset = TileManager::current()->get_tileset("images/tiles.strf"); load_old_format(*level); return; } const lisp::Lisp* tilesets_lisp = level->get_lisp("tilesets"); if(tilesets_lisp != NULL) { - tileset = tile_manager->parse_tileset_definition(*tilesets_lisp); + tileset = TileManager::current()->parse_tileset_definition(*tilesets_lisp).release(); free_tileset = true; } std::string tileset_name; if(level->get("tileset", tileset_name)) { if(tileset != NULL) { - log_warning << "multiple tilesets specified in level" << std::endl; + log_warning << "[" << filepath << "] multiple tilesets specified in level" << std::endl; } else { - tileset = tile_manager->get_tileset(tileset_name); + tileset = TileManager::current()->get_tileset(tileset_name); } } /* load default tileset */ if(tileset == NULL) { - tileset = tile_manager->get_tileset("images/tiles.strf"); + tileset = TileManager::current()->get_tileset("images/tiles.strf"); } current_tileset = tileset; @@ -98,7 +103,7 @@ Level::load(const std::string& filepath) if(token == "version") { iter.value()->get(version); if(version > 2) { - log_warning << "level format newer than application" << std::endl; + log_warning << "[" << filepath << "] level format newer than application" << std::endl; } } else if(token == "tileset" || token == "tilesets") { continue; @@ -116,14 +121,15 @@ Level::load(const std::string& filepath) Sector* sector = new Sector(this); sector->parse(*(iter.lisp())); add_sector(sector); + } else if(token == "target-time") { + iter.value()->get(target_time); } else { - log_warning << "Unknown token '" << token << "' in level file" << std::endl; + log_warning << "[" << filepath << "] Unknown token '" << token << "' in level file" << std::endl; } } if (license == "") { - log_warning << "The level author did not specify a license for this level. You might not be allowed to share it." << std::endl; - + log_warning << "[" << filepath << "] The level author \"" << author << "\" did not specify a license for this level \"" << name << "\". You might not be allowed to share it." << std::endl; } } catch(std::exception& e) { std::stringstream msg; @@ -156,11 +162,11 @@ Level::add_sector(Sector* sector) } Sector* -Level::get_sector(const std::string& name) +Level::get_sector(const std::string& name_) { for(Sectors::iterator i = sectors.begin(); i != sectors.end(); ++i) { Sector* sector = *i; - if(sector->get_name() == name) + if(sector->get_name() == name_) return sector; } @@ -168,13 +174,13 @@ Level::get_sector(const std::string& name) } size_t -Level::get_sector_count() +Level::get_sector_count() const { return sectors.size(); } Sector* -Level::get_sector(size_t num) +Level::get_sector(size_t num) const { return sectors.at(num); } @@ -185,31 +191,31 @@ Level::get_total_coins() int total_coins = 0; for(Sectors::iterator i = sectors.begin(); i != sectors.end(); ++i) { Sector* sector = *i; - for(Sector::GameObjects::iterator o = sector->gameobjects.begin(); - o != sector->gameobjects.end(); ++o) { - Coin* coin = dynamic_cast (*o); + for(auto o = sector->gameobjects.begin(); o != sector->gameobjects.end(); ++o) { + Coin* coin = dynamic_cast(o->get()); if(coin) { total_coins++; continue; } - BonusBlock *block = dynamic_cast (*o); + BonusBlock *block = dynamic_cast(o->get()); if(block) { if (block->contents == BonusBlock::CONTENT_COIN) { - total_coins++; + total_coins += block->hit_counter; continue; - } -#if 0 - // FIXME: do we want this? q.v. src/object/oneup.cpp - else if (block->contents == BonusBlock::CONTENT_1UP) - { - total_coins += 100; + } else if (block->contents == BonusBlock::CONTENT_RAIN) { + total_coins += 10; + continue; + } else if (block->contents == BonusBlock::CONTENT_EXPLODE) { + total_coins += 10; continue; } -#endif } + GoldBomb *goldbomb = dynamic_cast(o->get()); + if(goldbomb) + total_coins += 10; } } return total_coins; @@ -228,7 +234,7 @@ int Level::get_total_secrets() { int total_secrets = 0; - for(Sectors::iterator i = sectors.begin(); i != sectors.end(); ++i) + for(auto i = sectors.begin(); i != sectors.end(); ++i) total_secrets += (*i)->get_total_count(); return total_secrets; }