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);
44 static texture_type bkg_title;
45 static texture_type logo;
46 static texture_type img_choose_subset;
49 static Player titletux;
50 static timer_type random_timer;
52 static SDL_Event event;
55 static unsigned int last_update_time;
56 static unsigned int update_time;
58 void display_credits();
60 void draw_background()
62 /* Draw the title background: */
64 texture_draw_bg(&bkg_title);
67 void draw_demo(Level* plevel)
70 // update particle systems
71 std::vector<ParticleSystem*>::iterator p;
72 for(p = particle_systems.begin(); p != particle_systems.end(); ++p)
74 (*p)->simulate(frame_ratio);
77 // Draw particle systems (background)
78 for(p = particle_systems.begin(); p != particle_systems.end(); ++p)
80 (*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 plevel->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(plevel->width * 32 - 320 < titletux.base.x)
113 titletux.base.x = titletux.base.x - (plevel->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 --- */
134 string_list_type level_subsets;
136 level_subsets = dsubdirs("/levels", "info");
137 timer_init(&random_timer, true);
142 st_pause_ticks_init();
144 GameSession session(datadir + "/levels/misc/menu.stl");
146 //FIXME:activate_particle_systems();
147 /* Lower the gravity that tux doesn't jump to hectically through the demo */
150 /* Reset menu variables */
152 Menu::set_current(main_menu);
154 clearscreen(0, 0, 0);
159 texture_load(&bkg_title,datadir + "/images/title/background.jpg", IGNORE_ALPHA);
160 texture_load(&logo,datadir + "/images/title/logo.png", USE_ALPHA);
161 texture_load(&img_choose_subset,datadir + "/images/status/choose-level-subset.png", USE_ALPHA);
163 /* --- Main title loop: --- */
168 /* Draw the title background: */
169 texture_draw_bg(&bkg_title);
172 update_time = st_get_ticks();
173 timer_start(&random_timer, rand() % 2000 + 2000);
177 /* Calculate the movement-factor */
178 frame_ratio = ((double)(update_time-last_update_time))/((double)FRAME_RATE);
179 if(frame_ratio > 1.5) /* Quick hack to correct the unprecise CPU clocks a little bit. */
180 frame_ratio = 1.5 + (frame_ratio - 1.5) * 0.85;
181 /* Lower the frame_ratio that Tux doesn't jump to hectically throught the demo. */
186 while (SDL_PollEvent(&event))
189 if (event.type == SDL_QUIT)
193 else if (event.type == SDL_KEYDOWN)
196 key = event.key.keysym.sym;
198 /* Check for menu events */
201 if (key == SDLK_ESCAPE)
209 /* Draw the background: */
211 draw_demo(session.get_level());
213 if (current_menu == main_menu)
214 texture_draw(&logo, 160, 30);
216 text_draw(&white_small_text,
217 " SuperTux " VERSION "\n"
218 "Copyright (c) 2003 SuperTux Devel Team\n"
219 "This game comes with ABSOLUTELY NO WARRANTY. This is free software, and you\n"
220 "are welcome to redistribute it under certain conditions; see the file COPYING\n"
224 /* Draw the high score: */
226 sprintf(str, "High score: %d", hs_score);
227 text_drawf(&gold_text, str, 0, -40, A_HMIDDLE, A_BOTTOM, 1);
228 sprintf(str, "by %s", hs_name);
229 text_drawf(&gold_text, str, 0, -20, A_HMIDDLE, A_BOTTOM, 1);
232 /* Don't draw menu, if quit is true */
233 if(show_menu && !done)
234 menu_process_current();
236 if(current_menu == main_menu)
238 switch (main_menu->check())
246 if(level_subsets.num_items != 0)
248 subset.load(level_subsets.item[0]);
251 texture_draw(&img_choose_subset,(screen->w - img_choose_subset.w) / 2, 0);
252 if(level_subsets.num_items != 0)
254 texture_draw(&subset.image,(screen->w - subset.image.w) / 2 + 25,78);
255 if(level_subsets.num_items > 1)
258 texture_draw(&arrow_left,(screen->w / 2) - ((subset.title.length()+2)*16)/2,20);
259 if(i < level_subsets.num_items-1)
260 texture_draw(&arrow_right,(screen->w / 2) + ((subset.description.length())*16)/2,20);
262 text_drawf(&gold_text, subset.title.c_str(), 0, 20, A_HMIDDLE, A_TOP, 1);
263 text_drawf(&gold_text, subset.description.c_str(), 20, -20, A_HMIDDLE, A_BOTTOM, 1);
267 while(SDL_PollEvent(&event) && !done)
274 case SDL_KEYDOWN: // key pressed
276 key = event.key.keysym.sym;
284 subset.load(level_subsets.item[i]);
287 else if(key == SDLK_RIGHT)
289 if(i < level_subsets.num_items -1)
293 subset.load(level_subsets.item[i]);
296 else if(key == SDLK_SPACE || key == SDLK_RETURN)
299 quit = gameloop(subset.name.c_str(),1,ST_GL_PLAY);
302 else if(key == SDLK_ESCAPE)
315 titletux.level_begin();
316 update_time = st_get_ticks();
320 // Start Game, ie. goto the slots menu
321 update_load_save_game_menu(load_game_menu, true);
328 done = leveleditor(1);
338 else if(current_menu == options_menu)
340 process_options_menu();
342 else if(current_menu == load_game_menu)
344 if (process_load_game_menu())
348 titletux.level_begin();
349 update_time = st_get_ticks();
352 else if(current_menu == contrib_menu)
357 mouse_cursor->draw();
361 /* Set the time of the last update and the time of the current update */
362 last_update_time = update_time;
363 update_time = st_get_ticks();
372 texture_free(&bkg_title);
374 string_list_free(&level_subsets);
376 /* Return to main! */
384 void display_credits()
393 string_list_type names;
395 string_list_init(&names);
396 sprintf(filename,"%s/CREDITS", datadir.c_str());
397 if((fi = fopen(filename,"r")) != NULL)
399 while(fgets(temp, sizeof(temp), fi) != NULL)
401 temp[strlen(temp)-1]='\0';
402 string_list_add_item(&names,temp);
408 string_list_add_item(&names,"Credits were not found!");
409 string_list_add_item(&names,"Shame on the guy, who");
410 string_list_add_item(&names,"forgot to include them");
411 string_list_add_item(&names,"in your SuperTux distribution.");
415 timer_init(&timer, SDL_GetTicks());
416 timer_start(&timer, 50);
424 length = names.num_items;
426 SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);
430 /* in case of input, exit */
431 while(SDL_PollEvent(&event))
435 switch(event.key.keysym.sym)
464 else if(speed < -MAX_VEL)
467 /* draw the credits */
471 text_drawf(&white_big_text, "- Credits -", 0, screen->h-scroll, A_HMIDDLE, A_TOP, 2);
473 for(i = 0, n = 0, d = 0; i < length; i++,n++,d++)
475 if(names.item[i] == "")
479 if(names.item[i][0] == ' ')
480 text_drawf(&white_small_text, names.item[i], 0, 60+screen->h+(n*18)+(d*18)-scroll-10, A_HMIDDLE, A_TOP, 1);
481 else if(names.item[i][0] == ' ')
482 text_drawf(&white_text, names.item[i], 0, 60+screen->h+(n*18)+(d*18)-scroll, A_HMIDDLE, A_TOP, 1);
483 else if(names.item[i+1][0] == '-' || names.item[i][0] == '-')
484 text_drawf(&white_big_text, names.item[i], 0, 60+screen->h+(n*18)+(d*18)-scroll, A_HMIDDLE, A_TOP, 3);
486 text_drawf(&blue_text, names.item[i], 0, 60+screen->h+(n*18)+(d*18)-scroll, A_HMIDDLE, A_TOP, 1);
492 if(60+screen->h+(n*18)+(d*18)-scroll < 0 && 20+60+screen->h+(n*18)+(d*18)-scroll < 0)
501 if(timer_get_left(&timer) < 0)
504 timer_start(&timer, 50);
507 string_list_free(&names);
509 SDL_EnableKeyRepeat(0, 0); // disables key repeating
511 Menu::set_current(main_menu);