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