started to convert timer into a class
[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, 255, UPDATE);
84
85   /* Animation: */
86
87   done = 0;
88   quit = 0;
89   scene = 0;
90   i = 0;
91
92   timer.init(false);
93   timer.start(10000);
94
95   while (timer.check() && !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() < 2000 && scene == 0)
112         {
113           ++scene;
114           /* Gown and tux sitting: */
115
116           texture_draw(&tux_sit, 270, 400, 255, UPDATE);
117           texture_draw(&gown_sit, 320, 400, 255, 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() >= 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() >= 2000 && timer.get_gone() < 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() - 2000) / 5  - (copter[0].w), 32);
140
141           update_rect(screen, 0, 32, screen->w, (copter[0].h));
142         }
143
144
145       if (timer.get_gone() >= 2500 && scene == 2)
146         {
147           ++scene;
148           /* Gown notices something... */
149
150           texture_draw(&gown_lookup, 320, 400, 255, UPDATE);
151         }
152
153
154       if (timer.get_gone() >= 3500 && scene == 3)
155         {
156           ++scene;
157           /* Gown realizes it's bad! */
158           
159           texture_draw(&gown_upset, 320, 400, 255, UPDATE);
160         }
161
162
163       if (timer.get_gone() >= 4000 && timer.get_gone() < 8000)
164         {
165           /* Helicopter sits: */
166           texture_draw_part(&bkgd,0,32, 0, 32, screen->w, (copter[0].h));
167
168           texture_draw(&copter[i % 2], 400 - (copter[0].w), 32);
169           update_rect(screen, 0, 32, screen->w, (copter[0].h));
170         }
171
172
173       if (timer.get_gone() >= 5000 && scene == 4)
174         {
175           ++scene;
176           /* Tux realizes something's happening: */
177
178           texture_draw(&tux_upset, 270, 400, 255, UPDATE);
179
180
181           erasecenteredtext(&white_text, intro_text[1], 454, &bkgd, UPDATE, 1);
182           text_drawf(&white_text, intro_text[2], 0,-8, A_HMIDDLE, A_BOTTOM, 0);
183         }
184
185
186       if (timer.get_gone() >= 5000 && timer.get_gone() <= 8000)
187         {
188           /* Beam gown up! */
189
190           texture_draw_part(&bkgd,
191                             310, 32 + (copter[0].h), 310,
192                             32 + (copter[0].h),
193                             (gown_upset.w) + 20,
194                             376 + (gown_upset.h) - (copter[0].h));
195
196
197           for (j = 0; j < (gown_upset.sdl_surface -> w); j++)
198             {
199               texture_draw(&beam, 320 + j - ((beam.w) / 2), height[j]);
200
201               src.x = j;
202               src.y = 0;
203               src.w = 1;
204               src.h = (gown_upset.h);
205
206               dest.x = 320 + j;
207               dest.y = height[j];
208               dest.w = src.w;
209               dest.h = src.h;
210
211               texture_draw_part(&gown_upset,src.x,src.y,dest.x,dest.y,dest.w,dest.h);
212
213               height[j] = 400 + rand() % 10 - (int)(300. * ((float)(timer.get_gone() - 5000)/(float)3000.));
214               if(height[j] < 105)
215                 height[j] = 105;
216             }
217
218           update_rect(screen,
219                       310,
220                       32 + (copter[0].h),
221                       (gown_upset.w) + 20,
222                       400 + (gown_upset.h) - (copter[0].h));
223         }
224
225
226       if (timer.get_gone() >= 8000 && scene == 5)
227         {
228           texture_draw_part(&bkgd,
229                             310, 32 + (copter[0].h), 310,
230                             32 + (copter[0].h),
231                             (gown_upset.w) + 20,
232                             368 + (gown_upset.h) - (copter[0].h));
233
234           ++scene;
235           /* Tux gets mad! */
236
237           texture_draw(&tux_mad, 270, 400, UPDATE);
238
239           erasecenteredtext(&white_text, intro_text[2], 454, &bkgd, UPDATE, 1);
240           text_drawf(&white_text, intro_text[3], 0,-8, A_HMIDDLE, A_BOTTOM, 0);
241         }
242
243
244       if (timer.get_gone() >= 8000 && timer.get_gone() <= 8250)
245         {
246           /* Helicopter starting to speed off: */
247
248           texture_draw_part(&bkgd, 0, 32, 0, 32, screen->w, (copter_squish.h));
249
250           texture_draw(&copter_squish,
251                        400 - (copter[0].w), 32);
252
253           update_rect(screen, 0, 32, screen->w, (copter_squish.h));
254         }
255
256
257       if (timer.get_gone() >= 8250)
258         {
259           /* Helicopter speeding off: */
260
261           texture_draw_part(&bkgd, 0, 32, 0, 32, screen->w, (copter_stretch.h));
262
263           texture_draw(&copter_stretch,
264                        (timer.get_gone() - 8250) /*(i - (8250 / FPS)) * 30*/ + 400 - (copter[0].w),
265                        32);
266
267           update_rect(screen, 0, 32, screen->w, (copter_stretch.h));
268         }
269
270       flipscreen();
271
272       ++i;
273       /* Pause: */
274       SDL_Delay(20);
275     }
276
277
278   /* Free surfaces: */
279
280   texture_free(&bkgd);
281   texture_free(&gown_sit);
282   texture_free(&gown_lookup);
283   texture_free(&gown_upset);
284   texture_free(&tux_sit);
285   texture_free(&tux_upset);
286   texture_free(&tux_mad);
287   texture_free(&copter[0]);
288   texture_free(&copter[1]);
289   texture_free(&copter_squish);
290   texture_free(&copter_stretch);
291   texture_free(&beam);
292
293
294   /* Free array buffers: */
295
296   free(height);
297   free(height_speed);
298
299
300   /* Return to main! */
301
302   return(quit);
303 }