X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fworldmap.cpp;h=b49ecaa5499d852727c8b85a1a391cdf82d4d809;hb=810053f3d4fbacb77f22bb4c2c60f5615ad5ec36;hp=18469174d3441d985725170ca1129d20774adb35;hpb=3e1ea65bfa3cf450b9c7207831d9403a2c0f9101;p=supertux.git diff --git a/src/worldmap.cpp b/src/worldmap.cpp index 18469174d..b49ecaa54 100644 --- a/src/worldmap.cpp +++ b/src/worldmap.cpp @@ -33,6 +33,7 @@ #include "video/screen.h" #include "video/drawing_context.h" #include "special/frame_rate.h" +#include "special/sprite_manager.h" #include "audio/sound_manager.h" #include "lisp/parser.h" #include "lisp/lisp.h" @@ -43,12 +44,15 @@ #include "worldmap.h" #include "resources.h" #include "misc.h" -#include "scene.h" +#include "player_status.h" +#include "textscroller.h" #define map_message_TIME 2.8 Menu* worldmap_menu = 0; +static const float TUXSPEED = 200; + namespace WorldMapNS { Direction reverse_dir(Direction direction) @@ -107,10 +111,8 @@ string_to_direction(const std::string& directory) Tux::Tux(WorldMap* worldmap_) : worldmap(worldmap_) { - largetux_sprite = new Surface(datadir + "/images/worldmap/tux.png", true); - firetux_sprite = new Surface(datadir + "/images/worldmap/firetux.png", true); - smalltux_sprite = new Surface(datadir + "/images/worldmap/smalltux.png", true); - + tux_sprite = sprite_manager->create("worldmaptux"); + offset = 0; moving = false; tile_pos.x = worldmap->get_start_x(); @@ -121,30 +123,31 @@ Tux::Tux(WorldMap* worldmap_) Tux::~Tux() { - delete smalltux_sprite; - delete firetux_sprite; - delete largetux_sprite; + delete tux_sprite; } void -Tux::draw(DrawingContext& context, const Vector& offset) +Tux::draw(DrawingContext& context) { - Vector pos = get_pos(); - switch (player_status.bonus) - { - case PlayerStatus::GROWUP_BONUS: - context.draw_surface(largetux_sprite, - Vector(pos.x + offset.x, pos.y + offset.y - 10), LAYER_OBJECTS); + switch (player_status.bonus) { + case GROWUP_BONUS: + tux_sprite->set_action("large"); break; - case PlayerStatus::FLOWER_BONUS: - context.draw_surface(firetux_sprite, - Vector(pos.x + offset.x, pos.y + offset.y - 10), LAYER_OBJECTS); + case FIRE_BONUS: + tux_sprite->set_action("fire"); break; - case PlayerStatus::NO_BONUS: - context.draw_surface(smalltux_sprite, - Vector(pos.x + offset.x, pos.y + offset.y - 10), LAYER_OBJECTS); + case NO_BONUS: + tux_sprite->set_action("small"); break; - } + default: +#ifdef DBEUG + std::cerr << "Bonus type not handled in worldmap.\n"; +#endif + tux_sprite->set_action("large"); + break; + } + + tux_sprite->draw(context, get_pos(), LAYER_OBJECTS); } @@ -220,8 +223,8 @@ Tux::action(float delta) } else { - // Let tux walk a few pixels (20 pixel/sec) - offset += 20.0f * delta; + // Let tux walk + offset += TUXSPEED * delta; if (offset > 32) { // We reached the next tile, so we check what to do now @@ -349,6 +352,7 @@ WorldMap::WorldMap() name = ""; music = "salcon.mod"; + intro_displayed = false; total_stats.reset(); } @@ -393,6 +397,7 @@ WorldMap::load_map() const lisp::Lisp* props = iter.lisp(); props->get("name", name); props->get("music", music); + props->get("intro-filename", intro_filename); props->get("start_pos_x", start_x); props->get("start_pos_y", start_y); } else if(iter.item() == "special-tiles") { @@ -734,14 +739,6 @@ WorldMap::update(float delta) level->statistics.merge(global_stats); calculate_total_stats(); - if (session.get_current_sector()->player->got_power != - session.get_current_sector()->player->NONE_POWER) - player_status.bonus = PlayerStatus::FLOWER_BONUS; - else if (session.get_current_sector()->player->size == BIG) - player_status.bonus = PlayerStatus::GROWUP_BONUS; - else - player_status.bonus = PlayerStatus::NO_BONUS; - if (old_level_state != level->solved && level->auto_path) { // Try to detect the next direction to which we should walk // FIXME: Mostly a hack @@ -779,7 +776,7 @@ WorldMap::update(float delta) status. But the minimum lives and no bonus. */ player_status.distros = old_player_status.distros; player_status.lives = std::min(old_player_status.lives, player_status.lives); - player_status.bonus = player_status.NO_BONUS; + player_status.bonus = NO_BONUS; break; case GameSession::ES_GAME_OVER: @@ -827,14 +824,12 @@ WorldMap::update(float delta) } /* The porpose of the next checking is that if the player lost the level (in case there is one), don't show anything */ - if(level_finished) - { - if (!level->extro_filename.empty()) - { + if(level_finished) { + if (!level->extro_filename.empty()) { // Display a text file - display_text_file(level->extro_filename, SCROLL_SPEED_MESSAGE, - white_big_text , white_text, white_small_text, blue_text ); - } + std::string filename = levels_path + level->extro_filename; + display_text_file(filename); + } if (!level->next_worldmap.empty()) { @@ -911,26 +906,24 @@ WorldMap::at_special_tile() return 0; } - void -WorldMap::draw(DrawingContext& context, const Vector& offset) +WorldMap::draw(DrawingContext& context) { for(int y = 0; y < height; ++y) for(int x = 0; x < width; ++x) { const Tile* tile = at(Vector(x, y)); - tile->draw(context, Vector(x*32 + offset.x, y*32 + offset.y), - LAYER_TILES); + tile->draw(context, Vector(x*32, y*32), LAYER_TILES); } for(Levels::iterator i = levels.begin(); i != levels.end(); ++i) { if (i->solved) context.draw_surface(leveldot_green, - Vector(i->pos.x*32 + offset.x, i->pos.y*32 + offset.y), LAYER_TILES+1); + Vector(i->pos.x*32, i->pos.y*32), LAYER_TILES+1); else context.draw_surface(leveldot_red, - Vector(i->pos.x*32 + offset.x, i->pos.y*32 + offset.y), LAYER_TILES+1); + Vector(i->pos.x*32, i->pos.y*32), LAYER_TILES+1); } for(SpecialTiles::iterator i = special_tiles.begin(); i != special_tiles.end(); ++i) @@ -940,20 +933,23 @@ WorldMap::draw(DrawingContext& context, const Vector& offset) if (i->teleport_dest != Vector(-1, -1)) context.draw_surface(teleporterdot, - Vector(i->pos.x*32 + offset.x, i->pos.y*32 + offset.y), LAYER_TILES+1); + Vector(i->pos.x*32, i->pos.y*32), LAYER_TILES+1); else if (!i->map_message.empty() && !i->passive_message) context.draw_surface(messagedot, - Vector(i->pos.x*32 + offset.x, i->pos.y*32 + offset.y), LAYER_TILES+1); + Vector(i->pos.x*32, i->pos.y*32), LAYER_TILES+1); } - tux->draw(context, offset); + tux->draw(context); draw_status(context); } void WorldMap::draw_status(DrawingContext& context) { + context.push_transform(); + context.set_translation(Vector(0, 0)); + char str[80]; sprintf(str, " %d", total_stats.get_points(SCORE_STAT)); @@ -1023,6 +1019,8 @@ WorldMap::draw_status(DrawingContext& context) context.draw_text(gold_text, passive_message, Vector(screen->w/2, screen->h - white_text->get_height() - 60), CENTER_ALLIGN, LAYER_FOREGROUND1); + + context.pop_transform(); } void @@ -1035,50 +1033,49 @@ WorldMap::display() song = SoundManager::get()->load_music(datadir + "/music/" + music); SoundManager::get()->play_music(song); - FrameRate frame_rate(10); - frame_rate.set_frame_limit(false); - - frame_rate.start(); + if(!intro_displayed && intro_filename != "") { + std::string filename = levels_path + intro_filename; + display_text_file(filename); + intro_displayed = true; + } + Uint32 lastticks = SDL_GetTicks(); DrawingContext context; - while(!quit) - { - float delta = frame_rate.get(); - - delta *= 1.3f; - - if (delta > 10.0f) - delta = .3f; - - frame_rate.update(); - - Vector tux_pos = tux->get_pos(); - if (1) - { - offset.x = -tux_pos.x + screen->w/2; - offset.y = -tux_pos.y + screen->h/2; - - if (offset.x > 0) offset.x = 0; - if (offset.y > 0) offset.y = 0; + while(!quit) { + Uint32 ticks = SDL_GetTicks(); + float elapsed_time = float(ticks - lastticks) / 1000; + global_time += elapsed_time; + lastticks = ticks; + + // 40 fps minimum + if(elapsed_time > .025) + elapsed_time = .025; + + Vector tux_pos = tux->get_pos(); + + offset.x = -tux_pos.x + screen->w/2; + offset.y = -tux_pos.y + screen->h/2; - if (offset.x < screen->w - width*32) offset.x = screen->w - width*32; - if (offset.y < screen->h - height*32) offset.y = screen->h - height*32; - } + if (offset.x > 0) offset.x = 0; + if (offset.y > 0) offset.y = 0; - draw(context, offset); - get_input(); - update(delta); + if (offset.x < screen->w - width*32) offset.x = screen->w - width*32; + if (offset.y < screen->h - height*32) offset.y = screen->h - height*32; + + context.push_transform(); + context.set_translation(-offset); + draw(context); + context.pop_transform(); + get_input(); + update(elapsed_time); - if(Menu::current()) - { - Menu::current()->draw(context); - mouse_cursor->draw(context); - } - - context.do_drawing(); - - SDL_Delay(20); + if(Menu::current()) { + Menu::current()->draw(context); + mouse_cursor->draw(context); } + + context.do_drawing(); + } } void @@ -1087,8 +1084,6 @@ WorldMap::savegame(const std::string& filename) if(filename == "") return; - std::cout << "savegame: " << filename << std::endl; - std::ofstream file(filename.c_str(), std::ios::out); lisp::Writer writer(file); @@ -1110,16 +1105,15 @@ WorldMap::savegame(const std::string& filename) writer.write_string("title", std::string(name + " - " + nb_solved_levels_str+"/"+total_levels_str)); writer.write_string("map", map_filename); - writer.write_int("lives", player_status.lives); - writer.write_int("distros", player_status.lives); - writer.write_int("max-score-multiplier", player_status.max_score_multiplier); + writer.write_bool("intro-displayed", intro_displayed); writer.start_list("tux"); writer.write_float("x", tux->get_tile_pos().x); writer.write_float("y", tux->get_tile_pos().y); writer.write_string("back", direction_to_string(tux->back_direction)); - writer.write_string("bonus", bonus_to_string(player_status.bonus)); + player_status.write(writer); + writer.write_string("back", direction_to_string(tux->back_direction)); writer.end_list("tux"); @@ -1163,25 +1157,24 @@ WorldMap::loadgame(const std::string& filename) savegame->get("map", map_filename); load_map(); + savegame->get("intro-displayed", intro_displayed); savegame->get("lives", player_status.lives); savegame->get("distros", player_status.distros); savegame->get("max-score-multiplier", player_status.max_score_multiplier); if (player_status.lives < 0) - player_status.lives = START_LIVES; + player_status.reset(); const lisp::Lisp* tux_lisp = savegame->get_lisp("tux"); if(tux) { Vector p; std::string back_str = "none"; - std::string bonus_str = "none"; tux_lisp->get("x", p.x); tux_lisp->get("y", p.y); tux_lisp->get("back", back_str); - tux_lisp->get("bonus", bonus_str); + player_status.read(*tux_lisp); - player_status.bonus = string_to_bonus(bonus_str); tux->back_direction = string_to_direction(back_str); tux->set_tile_pos(p); } @@ -1232,8 +1225,3 @@ WorldMap::loadmap(const std::string& filename) } } // namespace WorldMapNS - -/* Local Variables: */ -/* mode:c++ */ -/* End: */ -