fixed save/load-game.
[supertux.git] / src / intro.c
index b6ea153..b0db71c 100644 (file)
@@ -2,12 +2,12 @@
   intro.c
   
   Super Tux - Intro Screen
-  
+
   by Bill Kendrick
   bill@newbreedsoftware.com
   http://www.newbreedsoftware.com/supertux/
   
-  April 11, 2000 - April 23, 2000
+  April 11, 2000 - February 1st, 2004
 */
 
 #include <stdio.h>
@@ -28,7 +28,8 @@
 #include "globals.h"
 #include "intro.h"
 #include "screen.h"
-
+#include "texture.h"
+#include "timer.h"
 
 char * intro_text[] = {
   "Tux and Gown were having a nice picnic..",
@@ -43,68 +44,60 @@ char * intro_text[] = {
 int intro(void)
 {
   SDL_Event event;
-  SDL_Surface * bkgd, * copter_squish, * copter_stretch, * beam,
-    * gown_sit, * gown_lookup, * gown_upset,
-    * tux_sit, * tux_upset, * tux_mad;
-  SDL_Surface * copter[2];
+  texture_type bkgd,  copter_squish,  copter_stretch, beam,
+     gown_sit,  gown_lookup,  gown_upset,
+     tux_sit, tux_upset, tux_mad;
+  texture_type copter[2];
   SDL_Rect src, dest;
-  int done, i, quit, j;
+  int done, i, quit, j, scene;
   int * height, * height_speed;
-  
-  
+  timer_type timer;
+    
   /* Load sprite images: */
-  
-  bkgd = load_image(DATA_PREFIX "/images/intro/intro.png", IGNORE_ALPHA);
-  
-  gown_sit = load_image(DATA_PREFIX "/images/intro/gown-sit.png", USE_ALPHA);
-  gown_lookup = load_image(DATA_PREFIX "/images/intro/gown-lookup.png",
-                          USE_ALPHA);
-  gown_upset = load_image(DATA_PREFIX "/images/intro/gown-upset.png",
-                         USE_ALPHA);
-  tux_sit = load_image(DATA_PREFIX "/images/intro/tux-sit.png", USE_ALPHA);
-  tux_upset = load_image(DATA_PREFIX "/images/intro/tux-upset.png",
-                        USE_ALPHA);
-  tux_mad = load_image(DATA_PREFIX "/images/intro/tux-mad.png", USE_ALPHA);
-  copter[0] = load_image(DATA_PREFIX "/images/intro/copter1.png", USE_ALPHA);
-  copter[1] = load_image(DATA_PREFIX "/images/intro/copter2.png", USE_ALPHA);
-
-  copter_squish = load_image(DATA_PREFIX "/images/intro/copter-squish.png",
-                            USE_ALPHA);
-  copter_stretch = load_image(DATA_PREFIX "/images/intro/copter-stretch.png",
-                             USE_ALPHA);
-  beam = load_image(DATA_PREFIX "/images/intro/beam.png", USE_ALPHA);
-  
+  texture_load(&bkgd, DATA_PREFIX "/images/intro/intro.png", IGNORE_ALPHA);  
+  texture_load(&gown_sit, DATA_PREFIX "/images/intro/gown-sit.png", USE_ALPHA);
+  texture_load(&gown_lookup, DATA_PREFIX "/images/intro/gown-lookup.png", USE_ALPHA);
+  texture_load(&gown_upset, DATA_PREFIX "/images/intro/gown-upset.png", USE_ALPHA);
+  texture_load(&tux_sit, DATA_PREFIX "/images/intro/tux-sit.png", USE_ALPHA);
+  texture_load(&tux_upset, DATA_PREFIX "/images/intro/tux-upset.png", USE_ALPHA);
+  texture_load(&tux_mad, DATA_PREFIX "/images/intro/tux-mad.png", USE_ALPHA);
+  texture_load(&copter[0], DATA_PREFIX "/images/intro/copter1.png", USE_ALPHA);
+  texture_load(&copter[1], DATA_PREFIX "/images/intro/copter2.png", USE_ALPHA); 
+  texture_load(&copter_squish, DATA_PREFIX "/images/intro/copter-squish.png", USE_ALPHA); 
+  texture_load(&copter_stretch, DATA_PREFIX "/images/intro/copter-stretch.png", USE_ALPHA); 
+  texture_load(&beam, DATA_PREFIX "/images/intro/beam.png", USE_ALPHA); 
   
   /* Allocate buffer for height array: */
   
-  height = malloc(sizeof(int) * (gown_upset -> w));
-  height_speed = malloc(sizeof(int) * (gown_upset -> w));
+  height = (int*) malloc(sizeof(int) * (gown_upset.w));
+  height_speed = (int*) malloc(sizeof(int) * (gown_upset.w));
   
   
   /* Initialize height arrays: */
   
-  for (j = 0; j < (gown_upset -> w); j++)
+  for (j = 0; j < (gown_upset.w); j++)
     {
       height[j] = 400;
       height_speed[j] = (rand() % 10) + 1;
     }
   
+        /* Display background: */
   
-  /* Display background: */
-  
-  drawimage(bkgd, 0, 0, UPDATE);
-  
+  texture_draw_bg(&bkgd, UPDATE);
   
   /* Animation: */
   
   done = 0;
   quit = 0;
+  scene = 0;
+  i = 0;
   
-  for (i = 0; i < (10000 / FPS) && !done && !quit; i++)
+  timer_init(&timer,NO);
+  timer_start(&timer,10000);
+  
+  while (timer_check(&timer) && !done && !quit)
     {
+      
       /* Handle events: */
       
       while (SDL_PollEvent(&event))
@@ -132,188 +125,195 @@ int intro(void)
        }
       
       
+             /* Display background: */
+  
       /* Draw things: */
       
-      if (i == 0)
+      if (timer_get_gone(&timer) < 2000 && scene == 0)
        {
+         ++scene;
          /* Gown and tux sitting: */
          
-         drawimage(tux_sit, 270, 400, UPDATE);
-         drawimage(gown_sit, 320, 400, UPDATE);
+         texture_draw(&tux_sit, 270, 400, UPDATE);
+         texture_draw(&gown_sit, 320, 400, UPDATE);
          
-         drawcenteredtext(intro_text[0], 456, letters_blue, UPDATE, 1);
+         text_drawf(&white_text, intro_text[0], 0, -8, A_HMIDDLE, A_BOTTOM, 0, NO_UPDATE);
        }
       
       
-      if (i == (2000 / FPS))
+      if (timer_get_gone(&timer) >= 2000 && scene == 1)
        {
+         ++scene;
          /* Helicopter begins to fly in: */
          
-         erasecenteredtext(intro_text[0], 456, bkgd, UPDATE, 1);
-         drawcenteredtext(intro_text[1], 456, letters_red, UPDATE, 1);
+         erasecenteredtext(&white_text, intro_text[0], 454, &bkgd, NO_UPDATE, 1);
+         text_drawf(&white_text, intro_text[1], 0,-8, A_HMIDDLE, A_BOTTOM, 0, NO_UPDATE);
        }
 
       
-      if (i > (2000 / FPS) && i < (4000 / FPS))
+      if (timer_get_gone(&timer) >= 2000 && timer_get_gone(&timer) < 4000)
        {
          /* Helicopter flying in: */
+         texture_draw_part(&bkgd,0,32, 0, 32, screen->w, (copter[0].h), NO_UPDATE);
          
-         drawpart(bkgd, 0, 32, 640, (copter[0] -> h), NO_UPDATE);
-         
-         drawimage(copter[i % 2],
-                   (i - (2000 / FPS)) * (FPS / 5) - (copter[0] -> w), 32,
+         texture_draw(&copter[i % 2],
+                   (float)(timer_get_gone(&timer) - 2000) / 5  - (copter[0].w), 32,
                    NO_UPDATE);
-         
-         SDL_UpdateRect(screen, 0, 32, 640, (copter[0] -> h));
+
+         update_rect(screen, 0, 32, screen->w, (copter[0].h));
        }
 
       
-      if (i == (2500 / FPS))
+      if (timer_get_gone(&timer) >= 2500 && scene == 2)
        {
+       ++scene;
          /* Gown notices something... */
          
-         drawimage(gown_lookup, 320, 400, UPDATE);
+         texture_draw(&gown_lookup, 320, 400, UPDATE);
        }
 
       
-      if (i == (3500 / FPS))
+      if (timer_get_gone(&timer) >= 3500 && scene == 3)
        {
+       ++scene;
          /* Gown realizes it's bad! */
          
-         drawimage(gown_upset, 320, 400, UPDATE);
+         texture_draw(&gown_upset, 320, 400, UPDATE);
        }
 
       
-      if (i > (4000 / FPS) && i < (8000 / FPS))
+      if (timer_get_gone(&timer) >= 4000 && timer_get_gone(&timer) < 8000)
        {
          /* Helicopter sits: */
+         texture_draw_part(&bkgd,0,32, 0, 32, screen->w, (copter[0].h), NO_UPDATE);
          
-         drawpart(bkgd, 0, 32, 640, (copter[0] -> h), NO_UPDATE);
-         
-         drawimage(copter[i % 2], 400 - (copter[0] -> w), 32, NO_UPDATE);
-
-         SDL_UpdateRect(screen, 0, 32, 640, (copter[0] -> h));
+         texture_draw(&copter[i % 2], 400 - (copter[0].w), 32, NO_UPDATE);
+         update_rect(screen, 0, 32, screen->w, (copter[0].h));
        }
 
       
-      if (i == (5000 / FPS))
+      if (timer_get_gone(&timer) >= 5000 && scene == 4)
        {
+       ++scene;
          /* Tux realizes something's happening: */
          
-         drawimage(tux_upset, 270, 400, UPDATE);
+         texture_draw(&tux_upset, 270, 400, UPDATE);
          
          
-         erasecenteredtext(intro_text[1], 456, bkgd, UPDATE, 1);
-         drawcenteredtext(intro_text[2], 456, letters_red, UPDATE, 1);
+         erasecenteredtext(&white_text, intro_text[1], 454, &bkgd, UPDATE, 1);
+         text_drawf(&white_text, intro_text[2], 0,-8, A_HMIDDLE, A_BOTTOM, 0, NO_UPDATE);
        }
       
       
-      if (i > (5000 / FPS))
+      if (timer_get_gone(&timer) >= 5000 && timer_get_gone(&timer) <= 8000)
        {
          /* Beam gown up! */
          
-         drawpart(bkgd,
-                  320,
-                  32 + (copter[0] -> h),
-                  (gown_upset -> w),
-                  368 + (gown_upset -> h) - (copter[0] -> h), NO_UPDATE);
+         texture_draw_part(&bkgd,
+                  310, 32 + (copter[0].h), 310,
+                  32 + (copter[0].h),
+                  (gown_upset.w) + 20,
+                  376 + (gown_upset.h) - (copter[0].h), NO_UPDATE);
          
          
-         for (j = 0; j < (gown_upset -> w); j++)
+         for (j = 0; j < (gown_upset.sdl_surface -> w); j++)
            {
-             drawimage(beam, 320 + j - ((beam -> w) / 2), height[j],
+             texture_draw(&beam, 320 + j - ((beam.w) / 2), height[j],
                        NO_UPDATE);
              
              src.x = j;
              src.y = 0;
              src.w = 1;
-             src.h = (gown_upset -> h);
+             src.h = (gown_upset.h);
              
              dest.x = 320 + j;
              dest.y = height[j];
              dest.w = src.w;
              dest.h = src.h;
              
-             SDL_BlitSurface(gown_upset, &src, screen, &dest);
+             texture_draw_part(&gown_upset,src.x,src.y,dest.x,dest.y,dest.w,dest.h,NO_UPDATE);
              
-             height[j] = height[j] - height_speed[j];
-             
-             if ((i % 2) == 0)
-               height_speed[j]++;
+             height[j] = 400 + rand() % 10 - (int)(300. * ((float)(timer_get_gone(&timer) - 5000)/(float)3000.));
+             if(height[j] < 105)
+             height[j] = 105;
            }
-         
-         SDL_UpdateRect(screen,
-                        320,
-                        32 + (copter[0] -> h),
-                        (gown_upset -> w),
-                        400 + (gown_upset -> h) - (copter[0] -> h));
+
+         update_rect(screen,
+                        310,
+                        32 + (copter[0].h),
+                        (gown_upset.w) + 20,
+                        400 + (gown_upset.h) - (copter[0].h));
        }
       
       
-      if (i == (8000 / FPS))
+      if (timer_get_gone(&timer) >= 8000 && scene == 5)
        {
+                 texture_draw_part(&bkgd,
+                  310, 32 + (copter[0].h), 310,
+                  32 + (copter[0].h),
+                  (gown_upset.w) + 20,
+                  368 + (gown_upset.h) - (copter[0].h), NO_UPDATE);
+       
+       ++scene;
          /* Tux gets mad! */
          
-         drawimage(tux_mad, 270, 400, UPDATE);
+         texture_draw(&tux_mad, 270, 400, UPDATE);
          
-         erasecenteredtext(intro_text[2], 456, bkgd, UPDATE, 1);
-         drawcenteredtext(intro_text[3], 456, letters_gold, UPDATE, 1);
+         erasecenteredtext(&white_text, intro_text[2], 454, &bkgd, UPDATE, 1);
+         text_drawf(&white_text, intro_text[3], 0,-8, A_HMIDDLE, A_BOTTOM, 0, NO_UPDATE);
        }
       
       
-      if (i > (8000 / FPS) && i < (8250 / FPS))
+      if (timer_get_gone(&timer) >= 8000 && timer_get_gone(&timer) <= 8250)
        {
          /* Helicopter starting to speed off: */
          
-         drawpart(bkgd, 0, 32, 640, (copter_squish -> h), NO_UPDATE);
+         texture_draw_part(&bkgd, 0, 32, 0, 32, screen->w, (copter_squish.h), NO_UPDATE);
          
-         drawimage(copter_squish,
-                   400 - (copter[0] -> w), 32,
+         texture_draw(&copter_squish,
+                   400 - (copter[0].w), 32,
                    NO_UPDATE);
-         
-         SDL_UpdateRect(screen, 0, 32, 640, (copter_squish -> h));
+
+         update_rect(screen, 0, 32, screen->w, (copter_squish.h));
        }      
 
 
-      if (i > (8250 / FPS))
+      if (timer_get_gone(&timer) >= 8250)
        {
          /* Helicopter speeding off: */
          
-         drawpart(bkgd, 0, 32, 640, (copter_stretch -> h), NO_UPDATE);
+         texture_draw_part(&bkgd, 0, 32, 0, 32, screen->w, (copter_stretch.h), NO_UPDATE);
          
-         drawimage(copter_stretch,
-                   (i - (8250 / FPS)) * 30 + 400 - (copter[0] -> w),
+         texture_draw(&copter_stretch,
+                   (timer_get_gone(&timer) - 8250) /*(i - (8250 / FPS)) * 30*/ + 400 - (copter[0].w),
                    32,
                    NO_UPDATE);
-         
-         SDL_UpdateRect(screen, 0, 32, 640, (copter_stretch -> h));
+                   
+         update_rect(screen, 0, 32, screen->w, (copter_stretch.h));
        }      
-      
+       
+       flipscreen();
+
+      ++i;
       /* Pause: */
-      
-      SDL_Delay(FPS);
+      SDL_Delay(20);
     }
 
   
   /* Free surfaces: */
   
-  SDL_FreeSurface(bkgd);
-  
-  SDL_FreeSurface(gown_sit);
-  SDL_FreeSurface(gown_lookup);
-  SDL_FreeSurface(gown_upset);
-  
-  SDL_FreeSurface(tux_sit);
-  SDL_FreeSurface(tux_upset);
-  SDL_FreeSurface(tux_mad);
-  
-  SDL_FreeSurface(copter[0]);
-  SDL_FreeSurface(copter[1]);
-
-  SDL_FreeSurface(copter_squish);
-  SDL_FreeSurface(copter_stretch);
-
-  SDL_FreeSurface(beam);
+  texture_free(&bkgd);
+  texture_free(&gown_sit);
+  texture_free(&gown_lookup);
+  texture_free(&gown_upset);
+  texture_free(&tux_sit);
+  texture_free(&tux_upset);
+  texture_free(&tux_mad);
+  texture_free(&copter[0]);
+  texture_free(&copter[1]);
+  texture_free(&copter_squish);
+  texture_free(&copter_stretch);
+  texture_free(&beam);
   
   
   /* Free array buffers: */