X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fgameloop.cpp;h=790b8afdb0d9a510addb5abc6fe53e1a44928ffe;hb=ff8e7dfe9011afc8bdd4ca29b6a6306737d75689;hp=7b7afc9d4caa4695296e8c60ed90b3e2561ceb1e;hpb=2074a5e3f8167dec24989c008ddadda14687a3a6;p=supertux.git diff --git a/src/gameloop.cpp b/src/gameloop.cpp index 7b7afc9d4..790b8afdb 100644 --- a/src/gameloop.cpp +++ b/src/gameloop.cpp @@ -20,16 +20,16 @@ // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include #include -#include -#include -#include +#include + +#include "SDL.h" #ifndef WIN32 #include @@ -55,7 +55,7 @@ #include "resources.h" #include "background.h" #include "tilemap.h" -#include "music_manager.h" +#include "gettext.h" GameSession* GameSession::current_ = 0; @@ -145,7 +145,7 @@ GameSession::~GameSession() void GameSession::levelintro(void) { - music_manager->halt_music(); + sound_manager->halt_music(); char str[60]; @@ -160,7 +160,7 @@ GameSession::levelintro(void) LAYER_FOREGROUND1); context.draw_text_center(white_small_text, - std::string("by ") + level->get_author(), + std::string(_("by ")) + level->get_author(), Vector(0, 400), LAYER_FOREGROUND1); context.do_drawing(); @@ -316,6 +316,19 @@ GameSession::process_events() switch(key) { + case SDLK_a: + if(debug_mode) + { + char buf[160]; + snprintf(buf, sizeof(buf), "P: %4.1f,%4.1f", + tux.base.x, tux.base.y); + context->draw_text(white_text, buf, + Vector(0, screen->h - white_text->get_height()), + LAYER_FOREGROUND1); + context->do_drawing(); + SDL_Delay(1000); + } + break; case SDLK_p: if(!Menu::current()) { @@ -334,13 +347,7 @@ GameSession::process_events() case SDLK_TAB: if(debug_mode) { - tux.size = !tux.size; - if(tux.size == BIG) - { - tux.base.height = 64; - } - else - tux.base.height = 32; + tux.grow(false); } break; case SDLK_END: @@ -437,19 +444,9 @@ GameSession::check_end_conditions() Player* tux = currentsector->player; /* End of level? */ - int endpos = (currentsector->solids->get_width() - 5) * 32; Tile* endtile = collision_goal(tux->base); - // fallback in case the other endpositions don't trigger - if (!end_sequence && tux->base.x >= endpos) - { - end_sequence = ENDSEQUENCE_WAITING; - last_x_pos = -1; - music_manager->play_music(level_end_song, 0); - endsequence_timer.start(7000); - tux->invincible_timer.start(7000); //FIXME: Implement a winning timer for the end sequence (with special winning animation etc.) - } - else if(end_sequence && !endsequence_timer.check()) + if(end_sequence && !endsequence_timer.check()) { exit_status = ES_LEVEL_FINISHED; return; @@ -462,7 +459,7 @@ GameSession::check_end_conditions() { end_sequence = ENDSEQUENCE_RUNNING; last_x_pos = -1; - music_manager->play_music(level_end_song, 0); + sound_manager->play_music(level_end_song, 0); endsequence_timer.start(7000); // 5 seconds until we finish the map tux->invincible_timer.start(7000); //FIXME: Implement a winning timer for the end sequence (with special winning animation etc.) } @@ -491,6 +488,15 @@ GameSession::action(double frame_ratio) // Update Tux and the World currentsector->action(frame_ratio); } + + // respawning in new sector? + if(newsector != "" && newspawnpoint != "") { + Sector* sector = level->get_sector(newsector); + currentsector = sector; + currentsector->activate(newspawnpoint); + currentsector->play_music(LEVEL_MUSIC); + newsector = newspawnpoint = ""; + } } void @@ -514,7 +520,7 @@ GameSession::draw() context->draw_filled_rect( Vector(0,0), Vector(screen->w, screen->h), Color(rand() % 50, rand() % 50, rand() % 50, 128), LAYER_FOREGROUND1); - context->draw_text_center(blue_text, "PAUSE - Press 'P' To Play", + context->draw_text_center(blue_text, _("PAUSE - Press 'P' To Play"), Vector(0, 230), LAYER_FOREGROUND1+2); } @@ -670,13 +676,20 @@ GameSession::run() return exit_status; } +void +GameSession::respawn(const std::string& sector, const std::string& spawnpoint) +{ + newsector = sector; + newspawnpoint = spawnpoint; +} + /* Bounce a brick: */ void bumpbrick(float x, float y) { Sector::current()->add_bouncy_brick(Vector(((int)(x + 1) / 32) * 32, (int)(y / 32) * 32)); - play_sound(sounds[SND_BRICK], SOUND_CENTER_SPEAKER); + sound_manager->play_sound(sounds[SND_BRICK], Vector(x, y)); } /* (Status): */ @@ -685,35 +698,34 @@ GameSession::drawstatus(DrawingContext& context) { char str[60]; - snprintf(str, 60, "%d", player_status.score); - context.draw_text(white_text, "SCORE", Vector(0, 0), LAYER_FOREGROUND1); + snprintf(str, 60, " %d", player_status.score); + context.draw_text(white_text, _("SCORE"), Vector(0, 0), LAYER_FOREGROUND1); context.draw_text(gold_text, str, Vector(96, 0), LAYER_FOREGROUND1); if(st_gl_mode == ST_GL_TEST) { - context.draw_text(white_text, "Press ESC To Return", Vector(0,20), + context.draw_text(white_text, _("Press ESC To Return"), Vector(0,20), LAYER_FOREGROUND1); } if(!time_left.check()) { - context.draw_text_center(white_text, "TIME's UP", Vector(0, 0), + context.draw_text_center(white_text, _("TIME's UP"), Vector(0, 0), LAYER_FOREGROUND1); } else if (time_left.get_left() > TIME_WARNING || (global_frame_counter % 10) < 5) { - sprintf(str, "%d", time_left.get_left() / 1000 ); - context.draw_text_center(white_text, "TIME", + sprintf(str, " %d", time_left.get_left() / 1000 ); + context.draw_text_center(white_text, _("TIME"), Vector(0, 0), LAYER_FOREGROUND1); context.draw_text_center(gold_text, str, Vector(4*16, 0), LAYER_FOREGROUND1); } - sprintf(str, "%d", player_status.distros); - context.draw_text(white_text, "COINS", - Vector(screen->w - white_text->w*9, 0), LAYER_FOREGROUND1); + sprintf(str, " %d", player_status.distros); + context.draw_text(white_text, _("COINS"), + Vector(screen->w - white_text->get_text_width(_("COINS"))-white_text->get_text_width(" 99"), 0), + LAYER_FOREGROUND1); context.draw_text(gold_text, str, - Vector(screen->w - gold_text->w*2, 0), LAYER_FOREGROUND1); + Vector(screen->w - gold_text->get_text_width(" 99"), 0),LAYER_FOREGROUND1); - context.draw_text(white_text, "LIVES", - Vector(screen->w - white_text->w*9, 20), LAYER_FOREGROUND1); if (player_status.lives >= 5) { sprintf(str, "%dx", player_status.lives); @@ -730,11 +742,24 @@ GameSession::drawstatus(DrawingContext& context) LAYER_FOREGROUND1); } + context.draw_text(white_text, _("LIVES"), + Vector(screen->w - white_text->get_text_width(_("LIVES")) - white_text->get_text_width(" 99"), 20), + LAYER_FOREGROUND1); + + if(game_pause) + { + sprintf(str, _("Playing: %s"), level->name.c_str()); + + context.draw_text(white_text, str, Vector(0,20), + LAYER_FOREGROUND1); + } + if(show_fps) { sprintf(str, "%2.1f", fps_fps); context.draw_text(white_text, "FPS", - Vector(screen->w - white_text->w*9, 40), LAYER_FOREGROUND1); + Vector(screen->w - white_text->get_text_width("FPS "), 40), + LAYER_FOREGROUND1); context.draw_text(gold_text, str, Vector(screen->w-4*16, 40), LAYER_FOREGROUND1); } @@ -748,13 +773,13 @@ GameSession::drawresultscreen(void) DrawingContext context; currentsector->background->draw(context); - context.draw_text_center(blue_text, "Result:", Vector(0, 200), + context.draw_text_center(blue_text, _("Result:"), Vector(0, 200), LAYER_FOREGROUND1); - sprintf(str, "SCORE: %d", player_status.score); + sprintf(str, _("SCORE: %d"), player_status.score); context.draw_text_center(gold_text, str, Vector(0, 224), LAYER_FOREGROUND1); - sprintf(str, "COINS: %d", player_status.distros); + sprintf(str, _("COINS: %d"), player_status.distros); context.draw_text_center(gold_text, str, Vector(0, 256), LAYER_FOREGROUND1); context.do_drawing(); @@ -783,10 +808,10 @@ std::string slotinfo(int slot) if (!title.empty()) snprintf(tmp,1024,"Slot %d - %s",slot, title.c_str()); else - snprintf(tmp, 1024,"Slot %d - Savegame",slot); + snprintf(tmp, 1024,_("Slot %d - Savegame"),slot); } else - sprintf(tmp,"Slot %d - Free",slot); + sprintf(tmp,_("Slot %d - Free"),slot); return tmp; }