X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fgameloop.c;h=7567c04f61dc778d6d54f1fd51b830406ae119a9;hb=cc5f060754c9e0ba2c06ab6a00efa1254833baaa;hp=56aad9ca4be9cb4bd572b8c979ae0a7776954d7f;hpb=097f2a52856c4505466487b0e96f71a2ee87827a;p=supertux.git diff --git a/src/gameloop.c b/src/gameloop.c index 56aad9ca4..7567c04f6 100644 --- a/src/gameloop.c +++ b/src/gameloop.c @@ -7,7 +7,7 @@ bill@newbreedsoftware.com http://www.newbreedsoftware.com/supertux/ - April 11, 2000 - December 9, 2003 + April 11, 2000 - December 28, 2003 */ #include @@ -31,7 +31,9 @@ #include "setup.h" #include "high_scores.h" #include "menu.h" - +#include "badguy.h" +#include "world.h" +#include "player.h" /* Sound files: */ @@ -105,7 +107,7 @@ SDL_Surface * tux_right[3], * tux_left[3], * cape_right[2], * cape_left[2], * bigcape_right[2], * bigcape_left[2], * ducktux_right, * ducktux_left, -* skidtux_right, * skidtux_left; +* skidtux_right, * skidtux_left, * tux_life; SDL_Event event; SDL_Rect src, dest; SDLKey key; @@ -117,10 +119,11 @@ bad_guy_type bad_guys[NUM_BAD_GUYS]; floating_score_type floating_scores[NUM_FLOATING_SCORES]; upgrade_type upgrades[NUM_UPGRADES]; bullet_type bullets[NUM_BULLETS]; -char song_title[20]; -char levelname[20]; -char leveltheme[20]; -char str[10]; +char song_title[60]; +char levelname[60]; +char leveltheme[60]; +char str[60]; + /* Local function prototypes: */ @@ -133,6 +136,7 @@ void unloadlevelsong(void); void loadshared(void); void unloadshared(void); void drawshape(int x, int y, unsigned char c); +void savegame(void); unsigned char shape(int x, int y, int sx); int issolid(int x, int y, int sx); int isbrick(int x, int y, int sx); @@ -176,10 +180,10 @@ void game_event(void) key = event.key.keysym.sym; - /* Check for menu-events, if the menu is shown */ + /* Check for menu-events, if the menu is shown */ if(show_menu) menu_event(key); - + if (key == SDLK_ESCAPE) { /* Escape: Open/Close the menu: */ @@ -248,15 +252,15 @@ void game_event(void) game_pause = 1; } } - else if (key == SDLK_TAB) + else if (key == SDLK_TAB && debug_mode == YES) { tux_size = !tux_size; } - else if (key == SDLK_END) + else if (key == SDLK_END && debug_mode == YES) { distros += 50; } - else if (key == SDLK_SPACE) + else if (key == SDLK_SPACE && debug_mode == YES) { next_level = 1; } @@ -555,9 +559,9 @@ int game_action(void) if (score > highscore) save_hs(score); - unloadlevelgfx(); + unloadlevelgfx(); unloadlevelsong(); - unloadshared(); + unloadshared(); return(0); } /* if (lives < 0) */ } @@ -578,10 +582,18 @@ int game_action(void) /* Keep tux in bounds: */ - if (tux_x < 0) tux_x = 0; - else if (tux_x > 320 && scroll_x < ((level_width * 32) - 640)) + else if (tux_x < 160 && scroll_x > 0 && debug_mode == YES) + { + scroll_x = scroll_x - ( 160 - tux_x); + tux_x = 160; + + if(scroll_x < 0) + scroll_x = 0; + + } + else if (tux_x > 320 && scroll_x < ((level_width * 32) - 640)) { /* Scroll the screen in past center: */ @@ -1110,8 +1122,15 @@ int game_action(void) current_music = LEVEL_MUSIC; halt_music(); } + if (!playing_music()) - play_music( level_song, 1 ); + { + if (time_left <= TIME_WARNING) + play_music( level_song_fast, 1 ); + else + play_music( level_song, 1 ); + } + if (tux_invincible_time > 0) tux_invincible_time--; } @@ -2139,7 +2158,7 @@ void game_draw() drawtext("HIGH", 0, 20, letters_blue, NO_UPDATE); drawtext(str, 96, 20, letters_gold, NO_UPDATE); - if (time_left >= 50 || (frame % 10) < 5) + if (time_left >= TIME_WARNING || (frame % 10) < 5) { sprintf(str, "%d", time_left); drawtext("TIME", 224, 0, letters_blue, NO_UPDATE); @@ -2150,6 +2169,13 @@ void game_draw() drawtext("DISTROS", 480, 0, letters_blue, NO_UPDATE); drawtext(str, 608, 0, letters_gold, NO_UPDATE); + drawtext("LIVES", 480, 20, letters_blue, NO_UPDATE); + + for(i=0; i < lives; ++i) + { + drawimage(tux_life,565+(18*i),20,NO_UPDATE); + } + if(game_pause) drawcenteredtext("PAUSE",230,letters_red, NO_UPDATE); @@ -2234,7 +2260,10 @@ int gameloop(void) switch (current_music) { case LEVEL_MUSIC: - play_music(level_song, 1); + if (time_left <= TIME_WARNING) + play_music(level_song_fast, 1); + else + play_music(level_song, 1); break; case HERRING_MUSIC: play_music(herring_song, 1); @@ -2256,7 +2285,7 @@ int gameloop(void) now_time = SDL_GetTicks(); if (now_time < last_time + FPS) - SDL_Delay(last_time + FPS - now_time); + SDL_Delay(last_time + FPS - now_time); /* Handle time: */ @@ -2265,6 +2294,10 @@ int gameloop(void) { time_left--; + /* Stop the music; it will start again, faster! */ + if (time_left == TIME_WARNING) + halt_music(); + if (time_left <= 0) killtux(KILL); } @@ -2364,7 +2397,7 @@ void loadlevel(void) time_left = atoi(str); /* (Song file for this level) */ - fgets(str, 20, fi); + fgets(str, sizeof(song_title), fi); strcpy(song_title, str); song_title[strlen(song_title)-1] = '\0'; @@ -2527,14 +2560,22 @@ void loadlevelsong(void) { char * song_path; + char * song_subtitle; song_path = (char *) malloc(sizeof(char) * (strlen(DATA_PREFIX) + strlen(song_title) + 8)); - sprintf(song_path, "%s/music/%s", DATA_PREFIX, song_title); - level_song = load_song(song_path); + free(song_path); + + song_path = (char *) malloc(sizeof(char) * (strlen(DATA_PREFIX) + + strlen(song_title) + 8 + 5)); + song_subtitle = strdup(song_title); + strcpy(strstr(song_subtitle, "."), "\0"); + sprintf(song_path, "%s/music/%s-fast%s", DATA_PREFIX, song_subtitle, strstr(song_title, ".")); + level_song_fast = load_song(song_path); + free(song_subtitle); free(song_path); } @@ -2874,6 +2915,10 @@ void loadshared(void) img_distro[3] = load_image(DATA_PREFIX "/images/shared/distro-3.png", USE_ALPHA); + /* Tux life: */ + + tux_life = load_image(DATA_PREFIX "/images/shared/tux-life.png", + USE_ALPHA); /* Herring: */ @@ -2890,10 +2935,13 @@ void loadshared(void) /* Sound effects: */ - /* if (use_sound) // this can help speeding up a little, but - we shouldn't take care about "use_sound" here, it's load_sound's job - / Send a mail to neoneurone@users.sf.net, if you have another opinion. :) - */ + /* if (use_sound) // this will introduce SERIOUS bugs here ! because "load_sound" + // initialize sounds[i] with the correct pointer's value: + // NULL or something else. And it will be dangerous to + // play with not-initialized pointers. + // This is also true with if (use_music) + Send a mail to me: neoneurone@users.sf.net, if you have another opinion. :) + */ for (i = 0; i < NUM_SOUNDS; i++) sounds[i] = load_sound(soundfilenames[i]); @@ -3655,4 +3703,5 @@ void drawresultscreen(void) sleep(2); } - +void savegame(void) +{}