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))
190 current_menu->event(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);
333 Menu::set_current(main_menu);
343 else if(current_menu == options_menu)
345 process_options_menu();
347 else if(current_menu == load_game_menu)
349 if (process_load_game_menu())
351 // FIXME: shouldn't be needed if GameSession doesn't relay on global variables
354 //titletux.level_begin();
355 update_time = st_get_ticks();
358 else if(current_menu == contrib_menu)
363 mouse_cursor->draw();
367 /* Set the time of the last update and the time of the current update */
368 last_update_time = update_time;
369 update_time = st_get_ticks();
378 texture_free(&bkg_title);
380 string_list_free(&level_subsets);
382 /* Return to main! */
390 void display_credits()
399 string_list_type names;
401 string_list_init(&names);
402 sprintf(filename,"%s/CREDITS", datadir.c_str());
403 if((fi = fopen(filename,"r")) != NULL)
405 while(fgets(temp, sizeof(temp), fi) != NULL)
407 temp[strlen(temp)-1]='\0';
408 string_list_add_item(&names,temp);
414 string_list_add_item(&names,"Credits were not found!");
415 string_list_add_item(&names,"Shame on the guy, who");
416 string_list_add_item(&names,"forgot to include them");
417 string_list_add_item(&names,"in your SuperTux distribution.");
421 timer.init(SDL_GetTicks());
430 length = names.num_items;
432 SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);
436 /* in case of input, exit */
437 while(SDL_PollEvent(&event))
441 switch(event.key.keysym.sym)
470 else if(speed < -MAX_VEL)
473 /* draw the credits */
477 text_drawf(&white_big_text, "- Credits -", 0, screen->h-scroll, A_HMIDDLE, A_TOP, 2);
479 for(i = 0, n = 0, d = 0; i < length; i++,n++,d++)
481 if(names.item[i] == "")
485 if(names.item[i][0] == ' ')
486 text_drawf(&white_small_text, names.item[i], 0, 60+screen->h+(n*18)+(d*18)-scroll-10, A_HMIDDLE, A_TOP, 1);
487 else if(names.item[i][0] == ' ')
488 text_drawf(&white_text, names.item[i], 0, 60+screen->h+(n*18)+(d*18)-scroll, A_HMIDDLE, A_TOP, 1);
489 else if(names.item[i+1][0] == '-' || names.item[i][0] == '-')
490 text_drawf(&white_big_text, names.item[i], 0, 60+screen->h+(n*18)+(d*18)-scroll, A_HMIDDLE, A_TOP, 3);
492 text_drawf(&blue_text, names.item[i], 0, 60+screen->h+(n*18)+(d*18)-scroll, A_HMIDDLE, A_TOP, 1);
498 if(60+screen->h+(n*18)+(d*18)-scroll < 0 && 20+60+screen->h+(n*18)+(d*18)-scroll < 0)
507 if(timer.get_left() < 0)
513 string_list_free(&names);
515 SDL_EnableKeyRepeat(0, 0); // disables key repeating
517 Menu::set_current(main_menu);