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