first item in menu is highlighted by default now.
[supertux.git] / src / intro.c
1 /*
2   intro.c
3   
4   Super Tux - Intro Screen
5   
6   by Bill Kendrick
7   bill@newbreedsoftware.com
8   http://www.newbreedsoftware.com/supertux/
9   
10   April 11, 2000 - April 23, 2000
11 */
12
13 #include <stdio.h>
14 #include <stdlib.h>
15 #include <string.h>
16 #include <errno.h>
17 #include <unistd.h>
18 #include <SDL.h>
19 #include <SDL_image.h>
20
21 #ifdef LINUX
22 #include <pwd.h>
23 #include <sys/types.h>
24 #include <ctype.h>
25 #endif
26
27 #include "defines.h"
28 #include "globals.h"
29 #include "intro.h"
30 #include "screen.h"
31
32
33 char * intro_text[] = {
34   "Tux and Gown were having a nice picnic..",
35   "when suddenly...",
36   "Gown is beamed away!!!",
37   "This looks like a job for ---"
38 };
39
40
41 /* --- INTRO --- */
42
43 int intro(void)
44 {
45   SDL_Event event;
46   SDL_Surface * bkgd, * copter_squish, * copter_stretch, * beam,
47     * gown_sit, * gown_lookup, * gown_upset,
48     * tux_sit, * tux_upset, * tux_mad;
49   SDL_Surface * copter[2];
50   SDL_Rect src, dest;
51   int done, i, quit, j;
52   int * height, * height_speed;
53   
54   
55   /* Load sprite images: */
56   
57   bkgd = load_image(DATA_PREFIX "/images/intro/intro.png", IGNORE_ALPHA);
58   
59   gown_sit = load_image(DATA_PREFIX "/images/intro/gown-sit.png", USE_ALPHA);
60   gown_lookup = load_image(DATA_PREFIX "/images/intro/gown-lookup.png",
61                            USE_ALPHA);
62   gown_upset = load_image(DATA_PREFIX "/images/intro/gown-upset.png",
63                           USE_ALPHA);
64  
65   tux_sit = load_image(DATA_PREFIX "/images/intro/tux-sit.png", USE_ALPHA);
66   tux_upset = load_image(DATA_PREFIX "/images/intro/tux-upset.png",
67                          USE_ALPHA);
68   tux_mad = load_image(DATA_PREFIX "/images/intro/tux-mad.png", USE_ALPHA);
69  
70   copter[0] = load_image(DATA_PREFIX "/images/intro/copter1.png", USE_ALPHA);
71   copter[1] = load_image(DATA_PREFIX "/images/intro/copter2.png", USE_ALPHA);
72
73   copter_squish = load_image(DATA_PREFIX "/images/intro/copter-squish.png",
74                              USE_ALPHA);
75   copter_stretch = load_image(DATA_PREFIX "/images/intro/copter-stretch.png",
76                               USE_ALPHA);
77  
78   beam = load_image(DATA_PREFIX "/images/intro/beam.png", USE_ALPHA);
79   
80   
81   /* Allocate buffer for height array: */
82   
83   height = malloc(sizeof(int) * (gown_upset -> w));
84   height_speed = malloc(sizeof(int) * (gown_upset -> w));
85   
86   
87   /* Initialize height arrays: */
88   
89   for (j = 0; j < (gown_upset -> w); j++)
90     {
91       height[j] = 400;
92       height_speed[j] = (rand() % 10) + 1;
93     }
94   
95   
96   /* Display background: */
97   
98   drawimage(bkgd, 0, 0, UPDATE);
99   
100   
101   /* Animation: */
102   
103   done = 0;
104   quit = 0;
105   
106   for (i = 0; i < (10000 / FPS) && !done && !quit; i++)
107     {
108       /* Handle events: */
109       
110       while (SDL_PollEvent(&event))
111         {
112           if (event.type == SDL_QUIT)
113             {
114               /* Quit event - quit: */
115               
116               quit = 1;
117             }
118           else if (event.type == SDL_KEYDOWN)
119             {
120               /* Keypress - skip intro: */
121               
122               done = 1;
123             }
124 #ifdef JOY_YES
125           else if (event.type == SDL_JOYBUTTONDOWN)
126             {
127               /* Fire button - skip intro: */
128               
129               done = 1;
130             }
131 #endif
132         }
133       
134       
135       /* Draw things: */
136       
137       if (i == 0)
138         {
139           /* Gown and tux sitting: */
140           
141           drawimage(tux_sit, 270, 400, UPDATE);
142           drawimage(gown_sit, 320, 400, UPDATE);
143           
144           drawcenteredtext(intro_text[0], 456, letters_blue, UPDATE);
145         }
146       
147       
148       if (i == (2000 / FPS))
149         {
150           /* Helicopter begins to fly in: */
151           
152           erasecenteredtext(intro_text[0], 456, bkgd, UPDATE);
153           drawcenteredtext(intro_text[1], 456, letters_red, UPDATE);
154         }
155
156       
157       if (i > (2000 / FPS) && i < (4000 / FPS))
158         {
159           /* Helicopter flying in: */
160           
161           drawpart(bkgd, 0, 32, 640, (copter[0] -> h), NO_UPDATE);
162           
163           drawimage(copter[i % 2],
164                     (i - (2000 / FPS)) * (FPS / 5) - (copter[0] -> w), 32,
165                     NO_UPDATE);
166           
167           SDL_UpdateRect(screen, 0, 32, 640, (copter[0] -> h));
168         }
169
170       
171       if (i == (2500 / FPS))
172         {
173           /* Gown notices something... */
174           
175           drawimage(gown_lookup, 320, 400, UPDATE);
176         }
177
178       
179       if (i == (3500 / FPS))
180         {
181           /* Gown realizes it's bad! */
182           
183           drawimage(gown_upset, 320, 400, UPDATE);
184         }
185
186       
187       if (i > (4000 / FPS) && i < (8000 / FPS))
188         {
189           /* Helicopter sits: */
190           
191           drawpart(bkgd, 0, 32, 640, (copter[0] -> h), NO_UPDATE);
192           
193           drawimage(copter[i % 2], 400 - (copter[0] -> w), 32, NO_UPDATE);
194
195           SDL_UpdateRect(screen, 0, 32, 640, (copter[0] -> h));
196         }
197
198       
199       if (i == (5000 / FPS))
200         {
201           /* Tux realizes something's happening: */
202           
203           drawimage(tux_upset, 270, 400, UPDATE);
204           
205           
206           erasecenteredtext(intro_text[1], 456, bkgd, UPDATE);
207           drawcenteredtext(intro_text[2], 456, letters_red, UPDATE);
208         }
209       
210       
211       if (i > (5000 / FPS))
212         {
213           /* Beam gown up! */
214           
215           drawpart(bkgd,
216                    320,
217                    32 + (copter[0] -> h),
218                    (gown_upset -> w),
219                    368 + (gown_upset -> h) - (copter[0] -> h), NO_UPDATE);
220           
221           
222           for (j = 0; j < (gown_upset -> w); j++)
223             {
224               drawimage(beam, 320 + j - ((beam -> w) / 2), height[j],
225                         NO_UPDATE);
226               
227               src.x = j;
228               src.y = 0;
229               src.w = 1;
230               src.h = (gown_upset -> h);
231               
232               dest.x = 320 + j;
233               dest.y = height[j];
234               dest.w = src.w;
235               dest.h = src.h;
236               
237               SDL_BlitSurface(gown_upset, &src, screen, &dest);
238               
239               height[j] = height[j] - height_speed[j];
240               
241               if ((i % 2) == 0)
242                 height_speed[j]++;
243             }
244           
245           SDL_UpdateRect(screen,
246                          320,
247                          32 + (copter[0] -> h),
248                          (gown_upset -> w),
249                          400 + (gown_upset -> h) - (copter[0] -> h));
250         }
251       
252       
253       if (i == (8000 / FPS))
254         {
255           /* Tux gets mad! */
256           
257           drawimage(tux_mad, 270, 400, UPDATE);
258           
259           erasecenteredtext(intro_text[2], 456, bkgd, UPDATE);
260           drawcenteredtext(intro_text[3], 456, letters_gold, UPDATE);
261         }
262       
263       
264       if (i > (8000 / FPS) && i < (8250 / FPS))
265         {
266           /* Helicopter starting to speed off: */
267           
268           drawpart(bkgd, 0, 32, 640, (copter_squish -> h), NO_UPDATE);
269           
270           drawimage(copter_squish,
271                     400 - (copter[0] -> w), 32,
272                     NO_UPDATE);
273           
274           SDL_UpdateRect(screen, 0, 32, 640, (copter_squish -> h));
275         }      
276
277
278       if (i > (8250 / FPS))
279         {
280           /* Helicopter speeding off: */
281           
282           drawpart(bkgd, 0, 32, 640, (copter_stretch -> h), NO_UPDATE);
283           
284           drawimage(copter_stretch,
285                     (i - (8250 / FPS)) * 30 + 400 - (copter[0] -> w),
286                     32,
287                     NO_UPDATE);
288           
289           SDL_UpdateRect(screen, 0, 32, 640, (copter_stretch -> h));
290         }      
291       
292       /* Pause: */
293       
294       SDL_Delay(FPS);
295     }
296
297   
298   /* Free surfaces: */
299   
300   SDL_FreeSurface(bkgd);
301   
302   SDL_FreeSurface(gown_sit);
303   SDL_FreeSurface(gown_lookup);
304   SDL_FreeSurface(gown_upset);
305   
306   SDL_FreeSurface(tux_sit);
307   SDL_FreeSurface(tux_upset);
308   SDL_FreeSurface(tux_mad);
309   
310   SDL_FreeSurface(copter[0]);
311   SDL_FreeSurface(copter[1]);
312
313   SDL_FreeSurface(copter_squish);
314   SDL_FreeSurface(copter_stretch);
315
316   SDL_FreeSurface(beam);
317   
318   
319   /* Free array buffers: */
320   
321   free(height);
322   free(height_speed);
323   
324   
325   /* Return to main! */
326   
327   return(quit);
328 }