Implemented --help and --disable-sound (patch by Duong-Khang NGUYEN <neoneurone@users...
[supertux.git] / src / gameloop.c
index bba8c2f..808e142 100644 (file)
 #include <SDL.h>
 #include <SDL_image.h>
 
-#ifndef NOSOUND
-#include <SDL_mixer.h>
-#endif
-
 #ifdef LINUX
 #include <pwd.h>
 #include <sys/types.h>
@@ -34,6 +30,7 @@
 #include "screen.h"
 #include "sound.h"
 #include "setup.h"
+#include "high_scores.h"
 
 
 /* Sound files: */
@@ -54,7 +51,7 @@ enum {
   SND_EXCELLENT,
   SND_COFFEE,
   SND_SHOOT,
-  NUM_SOUNDS
+  SND_LIFEUP
 };
 
 char * soundfilenames[NUM_SOUNDS] = {
@@ -72,13 +69,14 @@ char * soundfilenames[NUM_SOUNDS] = {
   DATA_PREFIX "/sounds/upgrade.wav",
   DATA_PREFIX "/sounds/excellent.wav",
   DATA_PREFIX "/sounds/coffee.wav",
-  DATA_PREFIX "/sounds/shoot.wav"
+  DATA_PREFIX "/sounds/shoot.wav",
+  DATA_PREFIX "/sounds/lifeup.wav"
 };
 
 
 /* Local variables: */
 
-int score, distros, level, lives, scroll_x, next_level,
+int score, highscore, distros, level, lives, scroll_x, next_level,
   tux_dir, tux_size, tux_duck, tux_x, tux_xm, tux_y, tux_ym,
   tux_dying, tux_safe, jumping, jump_counter, frame, score_multiplier,
   tux_frame_main, tux_frame, tux_got_coffee, tux_skidding,
@@ -107,10 +105,6 @@ SDL_Surface * tux_right[3], * tux_left[3],
   * bigcape_right[2], * bigcape_left[2],
   * ducktux_right, * ducktux_left,
   * skidtux_right, * skidtux_left;
-#ifndef NOSOUND
-Mix_Chunk * sounds[NUM_SOUNDS];
-Mix_Music * song;
-#endif
 unsigned char * tiles[15];
 bouncy_distro_type bouncy_distros[NUM_BOUNCY_DISTROS];
 broken_brick_type broken_bricks[NUM_BROKEN_BRICKS];
@@ -154,6 +148,7 @@ void trybumpbadguy(int x, int y, int sx);
 void add_upgrade(int x, int y, int kind);
 void killtux(int mode);
 void add_bullet(int x, int y, int dir, int xm);
+void drawendscreen(void);
 
 
 /* --- GAME LOOP! --- */
@@ -181,6 +176,7 @@ int gameloop(void)
   loadlevel();
   loadlevelgfx();
   loadlevelsong();
+  highscore = load_hs();
   
   
   /* --- MAIN GAME LOOP!!! --- */
@@ -272,6 +268,10 @@ int gameloop(void)
                {
                  tux_size = !tux_size;
                }
+             else if (key == SDLK_END)
+               {
+                 distros += 50;
+               }
            }
 #ifdef JOY_YES
          else if (event.type == SDL_JOYAXISMOTION)
@@ -328,9 +328,9 @@ int gameloop(void)
                      tux_dir == LEFT)
                    {
                      tux_skidding = SKID_TIME;
-#ifndef NOSOUND
+
                      playsound(sounds[SND_SKID]);
-#endif
+
                    }
                  tux_dir = RIGHT;
                }
@@ -382,9 +382,7 @@ int gameloop(void)
                      tux_dir == RIGHT)
                    {
                      tux_skidding = SKID_TIME;
-#ifndef NOSOUND
                      playsound(sounds[SND_SKID]);
-#endif
                    }
                  tux_dir = LEFT;
                }
@@ -465,12 +463,10 @@ int gameloop(void)
                        {
                          jumping = YES;
                         
-#ifndef NOSOUND
                          if (tux_size == SMALL)
                            playsound(sounds[SND_JUMP]);
                          else
                            playsound(sounds[SND_BIGJUMP]);
-#endif
                        }
                    }
                }
@@ -524,13 +520,11 @@ int gameloop(void)
          
          if (tux_y >= 480)
            {
-#ifndef NOSOUND
              if (use_sound)
                {
                  if (Mix_PlayingMusic())
                    Mix_HaltMusic();
                }
-#endif
             
              if (next_level)
              {
@@ -549,34 +543,14 @@ int gameloop(void)
              
              /* No more lives!? */
 
-             if (lives <= 0)
+             if (lives < 0)
              {
+                drawendscreen();
 
+               if (score > highscore)
+                 save_hs(score);
 
-               /* Display end-of-level stuff */
-               /* (FIXME: This should go in its own event loop function!) */
-               
-               clearscreen(0, 0, 0);
-
-               drawcenteredtext("GAMEOVER", 200, letters_red, NO_UPDATE);
-
-               sprintf(str, "SCORE: %d", score);
-               drawcenteredtext(str, 224, letters_gold, NO_UPDATE);
-
-               sprintf(str, "DISTROS: %d", distros);
-               drawcenteredtext(str, 256, letters_blue, NO_UPDATE);
-
-               SDL_Flip(screen);
-               SDL_Delay(5000);
-
-
-               /* FIXME: Should return to title screen, not restart game... */
-               
-               level = 0;
-               lives = 3;
-               
-               score=0;
-               distros=0;
+               return(0);
              }
              
              
@@ -821,9 +795,7 @@ int gameloop(void)
                              if (distro_counter <= 0)
                                change(tux_x, tux_y, scroll_x, 'a');
                              
-#ifndef NOSOUND
                              playsound(sounds[SND_DISTRO]);
-#endif
                              score = score + SCORE_DISTRO;
                              distros++;
                            }
@@ -843,9 +815,7 @@ int gameloop(void)
                              if (distro_counter <= 0)
                                change(tux_x + 31, tux_y, scroll_x, 'a');
                              
-#ifndef NOSOUND
                              playsound(sounds[SND_DISTRO]);
-#endif
                              score = score + SCORE_DISTRO;
                              distros++;
                            }
@@ -894,6 +864,7 @@ int gameloop(void)
 
        distros = distros - DISTROS_LIFEUP;
        lives++;
+        playsound(sounds[SND_LIFEUP]);
       }
      
 
@@ -1099,9 +1070,7 @@ int gameloop(void)
 
 
                          /* Play death sound: */
-#ifndef NOSOUND
                          playsound(sounds[SND_FALL]);
-#endif
                        }
                    }
                }
@@ -1192,25 +1161,19 @@ int gameloop(void)
                      
                      if (upgrades[i].kind == UPGRADE_MINTS)
                        {
-#ifndef NOSOUND
                           playsound(sounds[SND_EXCELLENT]);
-#endif
                          tux_size = BIG;
                          super_bkgd_time = 8;
                        }
                      else if (upgrades[i].kind == UPGRADE_COFFEE)
                        {
-#ifndef NOSOUND
                          playsound(sounds[SND_COFFEE]);
-#endif
                          tux_got_coffee = YES;
                          super_bkgd_time = 4;
                        }
                      else if (upgrades[i].kind == UPGRADE_HERRING)
                        {
-#ifndef NOSOUND
                          playsound(sounds[SND_HERRING]);
-#endif
                          tux_invincible_time = 200;
                          super_bkgd_time = 4;
                        }
@@ -1339,10 +1302,8 @@ int gameloop(void)
                            {
                              bad_guys[i].dir = !bad_guys[i].dir;
                             
-#ifndef NOSOUND
                              if (bad_guys[i].mode == KICK)
                                playsound(sounds[SND_RICOCHET]);
-#endif
                            }
                        }
                      
@@ -1366,9 +1327,7 @@ int gameloop(void)
                                  
                                  bad_guys[j].dying = FALLING;
                                  bad_guys[j].ym = -8;
-#ifndef NOSOUND
                                  playsound(sounds[SND_FALL]);
-#endif
 
                                  add_score(bad_guys[i].x - scroll_x,
                                            bad_guys[i].y, 100);
@@ -1465,9 +1424,7 @@ int gameloop(void)
                          add_score(bad_guys[i].x - scroll_x, bad_guys[i].y,
                                    50 * score_multiplier);
                          
-#ifndef NOSOUND
                          playsound(sounds[SND_SQUISH]);
-#endif
                        }
                      else if (bad_guys[i].kind == BAD_LAPTOP)
                        {
@@ -1501,9 +1458,7 @@ int gameloop(void)
                                    bad_guys[i].y,
                                    25 * score_multiplier);
                         
-#ifndef NOSOUND
                          /* playsound(sounds[SND_SQUISH]); */
-#endif
                        }
                      else if (bad_guys[i].kind == -1)
                        {
@@ -1565,9 +1520,7 @@ int gameloop(void)
                                    {
                                      bad_guys[i].dying = FALLING;
                                      bad_guys[i].ym = -8;
-#ifndef NOSOUND
                                      playsound(sounds[SND_FALL]);
-#endif
                                    }
                                }
                            }
@@ -1582,9 +1535,7 @@ int gameloop(void)
                            {
                              bad_guys[i].dying = FALLING;
                              bad_guys[i].ym = -8;
-#ifndef NOSOUND
                              playsound(sounds[SND_FALL]);
-#endif
                            }
                        }
                    }
@@ -2146,6 +2097,10 @@ int gameloop(void)
       sprintf(str, "%d", score);
       drawtext("SCORE", 0, 0, letters_blue, NO_UPDATE);
       drawtext(str, 96, 0, letters_gold, NO_UPDATE);
+
+      sprintf(str, "%d", highscore);
+      drawtext("HIGH", 0, 20, letters_blue, NO_UPDATE);
+      drawtext(str, 96, 20, letters_gold, NO_UPDATE);
       
       if (time_left >= 50 || (frame % 10) < 5)
        {
@@ -2166,7 +2121,6 @@ int gameloop(void)
       
       /* Keep playing music: */
     
-#ifndef NOSOUND
       if (use_sound)
         {
           if (!Mix_PlayingMusic())
@@ -2174,7 +2128,6 @@ int gameloop(void)
              Mix_PlayMusic(song, 1);
            }
         }
-#endif
       
       
       /* Pause til next frame: */
@@ -2196,13 +2149,11 @@ int gameloop(void)
     }
   while (!done && !quit);
  
-#ifndef NOSOUND
   if (use_sound)
     {
       if (Mix_PlayingMusic())
         Mix_HaltMusic();
     }
-#endif
   
   unloadlevelgfx();
   unloadlevelsong();
@@ -2377,7 +2328,7 @@ void loadlevel(void)
   
   clearscreen(0, 0, 0);
   
-  sprintf(str, "LEVEL %d", level + 1);
+  sprintf(str, "LEVEL %d", level);
   drawcenteredtext(str, 200, letters_red, NO_UPDATE);
   
   sprintf(str, "%s", levelname);
@@ -2392,41 +2343,39 @@ void loadlevel(void)
 }
 
 
+/* Load a level-specific graphic... */
+
+SDL_Surface * load_level_image(char * file, int use_alpha)
+{
+  char fname[1024];
+
+  snprintf(fname, 1024, "%s/images/level%d/%s", DATA_PREFIX, level, file);
+
+  return(load_image(fname, use_alpha));
+}
+
+
 /* Load graphics: */
 
 void loadlevelgfx(void)
 {
-  img_brick[0] = load_image(DATA_PREFIX "/images/level1/brick0.png",
-                           IGNORE_ALPHA);
-  img_brick[1] = load_image(DATA_PREFIX "/images/level1/brick1.png",
-                           IGNORE_ALPHA);
-  
-  img_solid[0] = load_image(DATA_PREFIX "/images/level1/solid0.png",
-                           USE_ALPHA);
-  img_solid[1] = load_image(DATA_PREFIX "/images/level1/solid1.png",
-                           USE_ALPHA);
-  img_solid[2] = load_image(DATA_PREFIX "/images/level1/solid2.png",
-                           USE_ALPHA);
-  img_solid[3] = load_image(DATA_PREFIX "/images/level1/solid3.png",
-                           USE_ALPHA);
-
-  img_bkgd[0][0] = load_image(DATA_PREFIX "/images/level1/bkgd-00.png",
-                              USE_ALPHA);
-  img_bkgd[0][1] = load_image(DATA_PREFIX "/images/level1/bkgd-01.png",
-                              USE_ALPHA);
-  img_bkgd[0][2] = load_image(DATA_PREFIX "/images/level1/bkgd-02.png",
-                              USE_ALPHA);
-  img_bkgd[0][3] = load_image(DATA_PREFIX "/images/level1/bkgd-03.png",
-                              USE_ALPHA);
-
-  img_bkgd[1][0] = load_image(DATA_PREFIX "/images/level1/bkgd-10.png",
-                              USE_ALPHA);
-  img_bkgd[1][1] = load_image(DATA_PREFIX "/images/level1/bkgd-11.png",
-                              USE_ALPHA);
-  img_bkgd[1][2] = load_image(DATA_PREFIX "/images/level1/bkgd-12.png",
-                              USE_ALPHA);
-  img_bkgd[1][3] = load_image(DATA_PREFIX "/images/level1/bkgd-13.png",
-                              USE_ALPHA);
+  img_brick[0] = load_level_image("brick0.png", IGNORE_ALPHA);
+  img_brick[1] = load_level_image("brick1.png", IGNORE_ALPHA);
+  
+  img_solid[0] = load_level_image("solid0.png", USE_ALPHA);
+  img_solid[1] = load_level_image("solid1.png", USE_ALPHA);
+  img_solid[2] = load_level_image("solid2.png", USE_ALPHA);
+  img_solid[3] = load_level_image("solid3.png", USE_ALPHA);
+
+  img_bkgd[0][0] = load_level_image("bkgd-00.png", USE_ALPHA);
+  img_bkgd[0][1] = load_level_image("bkgd-01.png", USE_ALPHA);
+  img_bkgd[0][2] = load_level_image("bkgd-02.png", USE_ALPHA);
+  img_bkgd[0][3] = load_level_image("bkgd-03.png", USE_ALPHA);
+
+  img_bkgd[1][0] = load_level_image("bkgd-10.png", USE_ALPHA);
+  img_bkgd[1][1] = load_level_image("bkgd-11.png", USE_ALPHA);
+  img_bkgd[1][2] = load_level_image("bkgd-12.png", USE_ALPHA);
+  img_bkgd[1][3] = load_level_image("bkgd-13.png", USE_ALPHA);
 }
 
 
@@ -2436,7 +2385,6 @@ void loadlevelsong(void)
 {
   char * song_path;
 
-#ifndef NOSOUND
   song_path = (char *) malloc(sizeof(char) * (strlen(DATA_PREFIX) +
                                              strlen(song_title) + 8));
 
@@ -2445,7 +2393,6 @@ void loadlevelsong(void)
   song = load_song(DATA_PREFIX "/music/ji_turn.it");
 
   free(song_path);
-#endif
 }
 
 
@@ -2472,12 +2419,10 @@ void unloadlevelgfx(void)
 
 void unloadlevelsong(void)
 {
-#ifndef NOSOUND
   if (use_sound)
     {
       Mix_FreeMusic(song);
     }
-#endif
 }
 
 
@@ -2485,9 +2430,7 @@ void unloadlevelsong(void)
 
 void loadshared(void)
 {
-#ifndef NOSOUND
   int i;
-#endif
   
   
   /* Tuxes: */
@@ -2807,13 +2750,12 @@ void loadshared(void)
   
   /* Sound effects: */
   
-#ifndef NOSOUND
   if (use_sound)
     {
       for (i = 0; i < NUM_SOUNDS; i++)
        sounds[i] = load_sound(soundfilenames[i]);
+       
     }
-#endif
 }
 
 
@@ -2903,13 +2845,11 @@ void unloadshared(void)
   
   SDL_FreeSurface(img_golden_herring);
 
-#ifndef NOSOUND
   if (use_sound)
     {
       for (i = 0; i < NUM_SOUNDS; i++)
         Mix_FreeChunk(sounds[i]);
     }
-#endif
 }
 
 
@@ -3126,9 +3066,7 @@ void trybreakbrick(int x, int y, int sx)
          if (distro_counter <= 0)
           change(x, y, sx, 'a');
         
-#ifndef NOSOUND
          playsound(sounds[SND_DISTRO]);
-#endif
          score = score + SCORE_DISTRO;
          distros++;
        }
@@ -3148,9 +3086,7 @@ void trybreakbrick(int x, int y, int sx)
       
       /* Get some score: */
       
-#ifndef NOSOUND
       playsound(sounds[SND_BRICK]);
-#endif
       score = score + SCORE_BRICK;
     }
 }
@@ -3163,9 +3099,7 @@ void bumpbrick(int x, int y, int sx)
   add_bouncy_brick(((x + sx + 1) / 32) * 32,
                   (y / 32) * 32);
   
-#ifndef NOSOUND
   playsound(sounds[SND_BRICK]);
-#endif
 }
 
 
@@ -3182,9 +3116,7 @@ void tryemptybox(int x, int y, int sx)
          add_bouncy_distro(((x + sx + 1) / 32) * 32,
                            (y / 32) * 32 - 32);
          
-#ifndef NOSOUND
          playsound(sounds[SND_DISTRO]);
-#endif
          score = score + SCORE_DISTRO;
          distros++;
        }
@@ -3209,9 +3141,7 @@ void tryemptybox(int x, int y, int sx)
                          UPGRADE_COFFEE);
            }
          
-#ifndef NOSOUND
          playsound(sounds[SND_UPGRADE]);
-#endif
        }
       else if (shape(x, y, sx) == '!')
        {
@@ -3236,9 +3166,7 @@ void trygrabdistro(int x, int y, int sx, int bounciness)
   if (shape(x, y, sx) == '$')
     {
       change(x, y, sx, '.');
-#ifndef NOSOUND
       playsound(sounds[SND_DISTRO]);
-#endif
       
       if (bounciness == BOUNCE)
        {
@@ -3424,9 +3352,7 @@ void trybumpbadguy(int x, int y, int sx)
            {
              bad_guys[i].dying = FALLING;
              bad_guys[i].ym = -8;
-#ifndef NOSOUND
              playsound(sounds[SND_FALL]);
-#endif
            }
        }
     }
@@ -3442,9 +3368,7 @@ void trybumpbadguy(int x, int y, int sx)
        {
          upgrades[i].xm = -upgrades[i].xm;
          upgrades[i].ym = -8;
-#ifndef NOSOUND
          playsound(sounds[SND_BUMP_UPGRADE]);
-#endif
        }
     }
 }
@@ -3483,9 +3407,7 @@ void killtux(int mode)
 {
   tux_ym = -16;
  
-#ifndef NOSOUND
   playsound(sounds[SND_HURT]);
-#endif
  
   if (tux_dir == RIGHT)
     tux_xm = -8;
@@ -3540,8 +3462,26 @@ void add_bullet(int x, int y, int dir, int xm)
       bullets[found].y = y;
       bullets[found].ym = BULLET_STARTING_YM;
       
-#ifndef NOSOUND
       playsound(sounds[SND_SHOOT]);
-#endif
     }
 }
+
+
+void drawendscreen(void)
+{
+  char str[80];
+  
+  clearscreen(0, 0, 0);
+
+  drawcenteredtext("GAMEOVER", 200, letters_red, NO_UPDATE);
+
+  sprintf(str, "SCORE: %d", score);
+  drawcenteredtext(str, 224, letters_gold, NO_UPDATE);
+
+  sprintf(str, "DISTROS: %d", distros);
+  drawcenteredtext(str, 256, letters_blue, NO_UPDATE);
+
+  SDL_Flip(screen);
+  SDL_Delay(2000);
+}
+