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 #include "resources.h"
44 static texture_type bkg_title;
45 static texture_type logo;
46 static texture_type img_choose_subset;
49 static Timer random_timer;
51 static SDL_Event event;
54 static unsigned int last_update_time;
55 static unsigned int update_time;
57 void display_credits();
59 void draw_background()
61 /* Draw the title background: */
63 texture_draw_bg(&bkg_title);
66 void draw_demo(GameSession* session, double frame_ratio)
68 World::set_current(session->get_world());
69 //World* world = session->get_world();
70 Level* plevel = session->get_level();
71 Player* tux = session->get_world()->get_tux();
74 // update particle systems
75 std::vector<ParticleSystem*>::iterator p;
76 for(p = particle_systems.begin(); p != particle_systems.end(); ++p)
78 (*p)->simulate(frame_ratio);
81 // Draw particle systems (background)
82 for(p = particle_systems.begin(); p != particle_systems.end(); ++p)
84 (*p)->draw(scroll_x, 0, 0);
88 // Draw interactive tiles:
89 for (int y = 0; y < 15; ++y)
91 for (int x = 0; x < 21; ++x)
93 Tile::draw(32*x - fmodf(scroll_x, 32), y * 32,
94 plevel->ia_tiles[(int)y][(int)x + (int)(scroll_x / 32)]);
98 global_frame_counter++;
99 tux->key_event(SDLK_RIGHT,DOWN);
101 if(random_timer.check())
104 tux->key_event(SDLK_UP,UP);
106 tux->key_event(SDLK_UP,DOWN);
110 random_timer.start(rand() % 3000 + 3000);
114 // Wrap around at the end of the level back to the beginnig
115 if(plevel->width * 32 - 320 < tux->base.x)
117 tux->base.x = tux->base.x - (plevel->width * 32 - 640);
118 scroll_x = tux->base.x - 320;
123 float last_tux_x_pos = tux->base.x;
124 tux->action(frame_ratio);
126 // Jump if tux stays in the same position for one loop, ie. if he is
127 // stuck behind a wall
128 if (last_tux_x_pos == tux->base.x)
136 /* --- TITLE SCREEN --- */
139 string_list_type level_subsets;
141 level_subsets = dsubdirs("/levels", "info");
142 random_timer.init(true);
146 st_pause_ticks_init();
148 GameSession session(datadir + "/levels/misc/menu.stl");
150 //FIXME:activate_particle_systems();
152 /* Reset menu variables */
154 Menu::set_current(main_menu);
156 clearscreen(0, 0, 0);
161 texture_load(&bkg_title,datadir + "/images/title/background.jpg", IGNORE_ALPHA);
162 texture_load(&logo,datadir + "/images/title/logo.png", USE_ALPHA);
163 texture_load(&img_choose_subset,datadir + "/images/status/choose-level-subset.png", USE_ALPHA);
165 /* --- Main title loop: --- */
170 /* Draw the title background: */
171 texture_draw_bg(&bkg_title);
174 update_time = st_get_ticks();
175 random_timer.start(rand() % 2000 + 2000);
179 /* Calculate the movement-factor */
180 double frame_ratio = ((double)(update_time-last_update_time))/((double)FRAME_RATE);
181 if(frame_ratio > 1.5) /* Quick hack to correct the unprecise CPU clocks a little bit. */
182 frame_ratio = 1.5 + (frame_ratio - 1.5) * 0.85;
183 /* Lower the frame_ratio that Tux doesn't jump to hectically throught the demo. */
188 while (SDL_PollEvent(&event))
191 if (event.type == SDL_QUIT)
195 else if (event.type == SDL_KEYDOWN)
198 key = event.key.keysym.sym;
200 /* Check for menu events */
203 if (key == SDLK_ESCAPE)
211 /* Draw the background: */
213 draw_demo(&session, frame_ratio);
215 if (current_menu == main_menu)
216 texture_draw(&logo, 160, 30);
218 text_draw(&white_small_text,
219 " SuperTux " VERSION "\n"
220 "Copyright (c) 2003 SuperTux Devel Team\n"
221 "This game comes with ABSOLUTELY NO WARRANTY. This is free software, and you\n"
222 "are welcome to redistribute it under certain conditions; see the file COPYING\n"
226 /* Draw the high score: */
228 sprintf(str, "High score: %d", hs_score);
229 text_drawf(&gold_text, str, 0, -40, A_HMIDDLE, A_BOTTOM, 1);
230 sprintf(str, "by %s", hs_name);
231 text_drawf(&gold_text, str, 0, -20, A_HMIDDLE, A_BOTTOM, 1);
234 /* Don't draw menu, if quit is true */
235 if(show_menu && !done)
236 menu_process_current();
238 if(current_menu == main_menu)
240 switch (main_menu->check())
248 if(level_subsets.num_items != 0)
250 subset.load(level_subsets.item[0]);
253 texture_draw(&img_choose_subset,(screen->w - img_choose_subset.w) / 2, 0);
254 if(level_subsets.num_items != 0)
256 texture_draw(&subset.image,(screen->w - subset.image.w) / 2 + 25,78);
257 if(level_subsets.num_items > 1)
260 texture_draw(&arrow_left,(screen->w / 2) - ((subset.title.length()+2)*16)/2,20);
261 if(i < level_subsets.num_items-1)
262 texture_draw(&arrow_right,(screen->w / 2) + ((subset.description.length())*16)/2,20);
264 text_drawf(&gold_text, subset.title.c_str(), 0, 20, A_HMIDDLE, A_TOP, 1);
265 text_drawf(&gold_text, subset.description.c_str(), 20, -20, A_HMIDDLE, A_BOTTOM, 1);
269 while(SDL_PollEvent(&event) && !done)
276 case SDL_KEYDOWN: // key pressed
278 key = event.key.keysym.sym;
286 subset.load(level_subsets.item[i]);
289 else if(key == SDLK_RIGHT)
291 if(i < level_subsets.num_items -1)
295 subset.load(level_subsets.item[i]);
298 else if(key == SDLK_SPACE || key == SDLK_RETURN)
301 quit = gameloop(subset.name.c_str(),1,ST_GL_PLAY);
304 else if(key == SDLK_ESCAPE)
317 titletux.level_begin();
318 update_time = st_get_ticks();
322 // Start Game, ie. goto the slots menu
323 update_load_save_game_menu(load_game_menu, true);
330 done = leveleditor(1);
331 Menu::set_current(main_menu);
341 else if(current_menu == options_menu)
343 process_options_menu();
345 else if(current_menu == load_game_menu)
347 if (process_load_game_menu())
349 // FIXME: shouldn't be needed if GameSession doesn't relay on global variables
352 //titletux.level_begin();
353 update_time = st_get_ticks();
356 else if(current_menu == contrib_menu)
361 mouse_cursor->draw();
365 /* Set the time of the last update and the time of the current update */
366 last_update_time = update_time;
367 update_time = st_get_ticks();
376 texture_free(&bkg_title);
378 string_list_free(&level_subsets);
380 /* Return to main! */
388 void display_credits()
397 string_list_type names;
399 string_list_init(&names);
400 sprintf(filename,"%s/CREDITS", datadir.c_str());
401 if((fi = fopen(filename,"r")) != NULL)
403 while(fgets(temp, sizeof(temp), fi) != NULL)
405 temp[strlen(temp)-1]='\0';
406 string_list_add_item(&names,temp);
412 string_list_add_item(&names,"Credits were not found!");
413 string_list_add_item(&names,"Shame on the guy, who");
414 string_list_add_item(&names,"forgot to include them");
415 string_list_add_item(&names,"in your SuperTux distribution.");
419 timer.init(SDL_GetTicks());
428 length = names.num_items;
430 SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);
434 /* in case of input, exit */
435 while(SDL_PollEvent(&event))
439 switch(event.key.keysym.sym)
468 else if(speed < -MAX_VEL)
471 /* draw the credits */
475 text_drawf(&white_big_text, "- Credits -", 0, screen->h-scroll, A_HMIDDLE, A_TOP, 2);
477 for(i = 0, n = 0, d = 0; i < length; i++,n++,d++)
479 if(names.item[i] == "")
483 if(names.item[i][0] == ' ')
484 text_drawf(&white_small_text, names.item[i], 0, 60+screen->h+(n*18)+(d*18)-scroll-10, A_HMIDDLE, A_TOP, 1);
485 else if(names.item[i][0] == ' ')
486 text_drawf(&white_text, names.item[i], 0, 60+screen->h+(n*18)+(d*18)-scroll, A_HMIDDLE, A_TOP, 1);
487 else if(names.item[i+1][0] == '-' || names.item[i][0] == '-')
488 text_drawf(&white_big_text, names.item[i], 0, 60+screen->h+(n*18)+(d*18)-scroll, A_HMIDDLE, A_TOP, 3);
490 text_drawf(&blue_text, names.item[i], 0, 60+screen->h+(n*18)+(d*18)-scroll, A_HMIDDLE, A_TOP, 1);
496 if(60+screen->h+(n*18)+(d*18)-scroll < 0 && 20+60+screen->h+(n*18)+(d*18)-scroll < 0)
505 if(timer.get_left() < 0)
511 string_list_free(&names);
513 SDL_EnableKeyRepeat(0, 0); // disables key repeating
515 Menu::set_current(main_menu);