4 Super Tux - Title Screen
7 bill@newbreedsoftware.com
8 http://www.newbreedsoftware.com/supertux/
10 April 11, 2000 - March 15, 2004
19 #include <SDL_image.h>
22 #include <sys/types.h>
30 #include "high_scores.h"
37 #include "leveleditor.h"
42 void loadshared(void);
43 void activate_particle_systems(void);
45 static texture_type bkg_title;
46 static texture_type logo;
47 static texture_type img_choose_subset;
50 static Player titletux;
51 static timer_type random_timer;
53 static SDL_Event event;
56 static unsigned int last_update_time;
57 static unsigned int update_time;
59 void display_credits();
61 void draw_background()
63 /* Draw the title background: */
65 texture_draw_bg(&bkg_title);
71 /* update particle systems */
72 std::vector<ParticleSystem*>::iterator p;
73 for(p = particle_systems.begin(); p != particle_systems.end(); ++p)
75 (*p)->simulate(frame_ratio);
78 // Draw particle systems (background)
79 for(p = particle_systems.begin(); p != particle_systems.end(); ++p)
81 (*p)->draw(scroll_x, 0, 0);
84 // Draw interactive tiles:
85 for (int y = 0; y < 15; ++y)
87 for (int x = 0; x < 21; ++x)
89 drawshape(32*x - fmodf(scroll_x, 32), y * 32,
90 current_level.ia_tiles[(int)y][(int)x + (int)(scroll_x / 32)]);
94 global_frame_counter++;
95 titletux.key_event(SDLK_RIGHT,DOWN);
97 if(timer_check(&random_timer))
100 titletux.key_event(SDLK_UP,UP);
102 titletux.key_event(SDLK_UP,DOWN);
106 timer_start(&random_timer, rand() % 3000 + 3000);
110 // Wrap around at the end of the level back to the beginnig
111 if(current_level.width * 32 - 320 < titletux.base.x)
113 titletux.base.x = titletux.base.x - (current_level.width * 32 - 640);
114 scroll_x = titletux.base.x - 320;
117 float last_tux_x_pos = titletux.base.x;
120 // Jump if tux stays in the same position for one loop, ie. if he is
121 // stuck behind a wall
122 if (last_tux_x_pos == titletux.base.x)
130 /* --- TITLE SCREEN --- */
135 string_list_type level_subsets;
137 level_subsets = dsubdirs("/levels", "info");
138 timer_init(&random_timer, true);
143 st_pause_ticks_init();
145 current_level.load((datadir + "/levels/misc/menu.stl").c_str());
147 activate_particle_systems();
148 /* Lower the gravity that tux doesn't jump to hectically through the demo */
151 /* Reset menu variables */
153 Menu::set_current(main_menu);
155 clearscreen(0, 0, 0);
160 texture_load(&bkg_title,datadir + "/images/title/background.jpg", IGNORE_ALPHA);
161 texture_load(&logo,datadir + "/images/title/logo.png", USE_ALPHA);
162 texture_load(&img_choose_subset,datadir + "/images/status/choose-level-subset.png", USE_ALPHA);
164 /* --- Main title loop: --- */
171 /* Draw the title background: */
172 texture_draw_bg(&bkg_title);
175 update_time = st_get_ticks();
176 timer_start(&random_timer, rand() % 2000 + 2000);
178 while (!done && !quit)
181 /* Calculate the movement-factor */
182 frame_ratio = ((double)(update_time-last_update_time))/((double)FRAME_RATE);
183 if(frame_ratio > 1.5) /* Quick hack to correct the unprecise CPU clocks a little bit. */
184 frame_ratio = 1.5 + (frame_ratio - 1.5) * 0.85;
185 /* Lower the frame_ratio that Tux doesn't jump to hectically throught the demo. */
190 while (SDL_PollEvent(&event))
193 if (event.type == SDL_QUIT)
195 /* Quit event - quit: */
198 else if (event.type == SDL_KEYDOWN)
202 key = event.key.keysym.sym;
204 /* Check for menu events */
207 if (key == SDLK_ESCAPE)
216 /* Draw the background: */
220 if (current_menu == main_menu)
221 texture_draw(&logo, 160, 30);
223 text_draw(&white_small_text,
224 " SuperTux " VERSION "\n"
225 "Copyright (c) 2003 SuperTux Devel Team\n"
226 "This game comes with ABSOLUTELY NO WARRANTY. This is free software, and you\n"
227 "are welcome to redistribute it under certain conditions; see the file COPYING\n"
231 /* Draw the high score: */
233 sprintf(str, "High score: %d", hs_score);
234 text_drawf(&gold_text, str, 0, -40, A_HMIDDLE, A_BOTTOM, 1);
235 sprintf(str, "by %s", hs_name);
236 text_drawf(&gold_text, str, 0, -20, A_HMIDDLE, A_BOTTOM, 1);
239 /* Don't draw menu, if quit is true */
240 if(show_menu && !quit)
241 menu_process_current();
243 if(current_menu == main_menu)
245 switch (main_menu->check())
253 if(level_subsets.num_items != 0)
255 subset.load(level_subsets.item[0]);
258 texture_draw(&img_choose_subset,(screen->w - img_choose_subset.w) / 2, 0);
259 if(level_subsets.num_items != 0)
261 texture_draw(&subset.image,(screen->w - subset.image.w) / 2 + 25,78);
262 if(level_subsets.num_items > 1)
265 texture_draw(&arrow_left,(screen->w / 2) - ((subset.title.length()+2)*16)/2,20);
266 if(i < level_subsets.num_items-1)
267 texture_draw(&arrow_right,(screen->w / 2) + ((subset.description.length())*16)/2,20);
269 text_drawf(&gold_text, subset.title.c_str(), 0, 20, A_HMIDDLE, A_TOP, 1);
270 text_drawf(&gold_text, subset.description.c_str(), 20, -20, A_HMIDDLE, A_BOTTOM, 1);
274 while(SDL_PollEvent(&event) && !done)
282 case SDL_KEYDOWN: // key pressed
284 key = event.key.keysym.sym;
292 subset.load(level_subsets.item[i]);
295 else if(key == SDLK_RIGHT)
297 if(i < level_subsets.num_items -1)
301 subset.load(level_subsets.item[i]);
304 else if(key == SDLK_SPACE || key == SDLK_RETURN)
307 quit = gameloop(subset.name.c_str(),1,ST_GL_PLAY);
310 else if(key == SDLK_ESCAPE)
323 titletux.level_begin();
324 update_time = st_get_ticks();
328 // Start Game, ie. goto the slots menu
329 update_load_save_game_menu(load_game_menu, true);
336 quit = leveleditor(1);
346 else if(current_menu == options_menu)
348 process_options_menu();
350 else if(current_menu == load_game_menu)
352 if (process_load_game_menu())
356 titletux.level_begin();
357 update_time = st_get_ticks();
360 else if(current_menu == contrib_menu)
365 mouse_cursor->draw();
369 /* Set the time of the last update and the time of the current update */
370 last_update_time = update_time;
371 update_time = st_get_ticks();
380 texture_free(&bkg_title);
382 string_list_free(&level_subsets);
384 /* Return to main! */
393 void display_credits()
402 string_list_type names;
404 string_list_init(&names);
405 sprintf(filename,"%s/CREDITS", datadir.c_str());
406 if((fi = fopen(filename,"r")) != NULL)
408 while(fgets(temp, sizeof(temp), fi) != NULL)
410 temp[strlen(temp)-1]='\0';
411 string_list_add_item(&names,temp);
417 string_list_add_item(&names,"Credits were not found!");
418 string_list_add_item(&names,"Shame on the guy, who");
419 string_list_add_item(&names,"forgot to include them");
420 string_list_add_item(&names,"in your SuperTux distribution.");
424 timer_init(&timer, SDL_GetTicks());
425 timer_start(&timer, 50);
433 length = names.num_items;
435 SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);
439 /* in case of input, exit */
440 while(SDL_PollEvent(&event))
444 switch(event.key.keysym.sym)
473 else if(speed < -MAX_VEL)
476 /* draw the credits */
480 text_drawf(&white_big_text, "- Credits -", 0, screen->h-scroll, A_HMIDDLE, A_TOP, 2);
482 for(i = 0, n = 0, d = 0; i < length; i++,n++,d++)
484 if(names.item[i] == "")
488 if(names.item[i][0] == ' ')
489 text_drawf(&white_small_text, names.item[i], 0, 60+screen->h+(n*18)+(d*18)-scroll-10, A_HMIDDLE, A_TOP, 1);
490 else if(names.item[i][0] == ' ')
491 text_drawf(&white_text, names.item[i], 0, 60+screen->h+(n*18)+(d*18)-scroll, A_HMIDDLE, A_TOP, 1);
492 else if(names.item[i+1][0] == '-' || names.item[i][0] == '-')
493 text_drawf(&white_big_text, names.item[i], 0, 60+screen->h+(n*18)+(d*18)-scroll, A_HMIDDLE, A_TOP, 3);
495 text_drawf(&blue_text, names.item[i], 0, 60+screen->h+(n*18)+(d*18)-scroll, A_HMIDDLE, A_TOP, 1);
501 if(60+screen->h+(n*18)+(d*18)-scroll < 0 && 20+60+screen->h+(n*18)+(d*18)-scroll < 0)
510 if(timer_get_left(&timer) < 0)
513 timer_start(&timer, 50);
516 string_list_free(&names);
518 SDL_EnableKeyRepeat(0, 0); // disables key repeating
520 Menu::set_current(main_menu);