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_type 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(timer_check(&random_timer))
104 tux->key_event(SDLK_UP,UP);
106 tux->key_event(SDLK_UP,DOWN);
110 timer_start(&random_timer, 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 timer_init(&random_timer, true);
146 st_pause_ticks_init();
148 GameSession session(datadir + "/levels/misc/menu.stl");
151 //FIXME:activate_particle_systems();
153 /* Reset menu variables */
155 Menu::set_current(main_menu);
157 clearscreen(0, 0, 0);
162 texture_load(&bkg_title,datadir + "/images/title/background.jpg", IGNORE_ALPHA);
163 texture_load(&logo,datadir + "/images/title/logo.png", USE_ALPHA);
164 texture_load(&img_choose_subset,datadir + "/images/status/choose-level-subset.png", USE_ALPHA);
166 /* --- 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);
180 /* Calculate the movement-factor */
181 double frame_ratio = ((double)(update_time-last_update_time))/((double)FRAME_RATE);
182 if(frame_ratio > 1.5) /* Quick hack to correct the unprecise CPU clocks a little bit. */
183 frame_ratio = 1.5 + (frame_ratio - 1.5) * 0.85;
184 /* Lower the frame_ratio that Tux doesn't jump to hectically throught the demo. */
189 while (SDL_PollEvent(&event))
192 if (event.type == SDL_QUIT)
196 else if (event.type == SDL_KEYDOWN)
199 key = event.key.keysym.sym;
201 /* Check for menu events */
204 if (key == SDLK_ESCAPE)
212 /* Draw the background: */
214 draw_demo(&session, frame_ratio);
216 if (current_menu == main_menu)
217 texture_draw(&logo, 160, 30);
219 text_draw(&white_small_text,
220 " SuperTux " VERSION "\n"
221 "Copyright (c) 2003 SuperTux Devel Team\n"
222 "This game comes with ABSOLUTELY NO WARRANTY. This is free software, and you\n"
223 "are welcome to redistribute it under certain conditions; see the file COPYING\n"
227 /* Draw the high score: */
229 sprintf(str, "High score: %d", hs_score);
230 text_drawf(&gold_text, str, 0, -40, A_HMIDDLE, A_BOTTOM, 1);
231 sprintf(str, "by %s", hs_name);
232 text_drawf(&gold_text, str, 0, -20, A_HMIDDLE, A_BOTTOM, 1);
235 /* Don't draw menu, if quit is true */
236 if(show_menu && !done)
237 menu_process_current();
239 if(current_menu == main_menu)
241 switch (main_menu->check())
249 if(level_subsets.num_items != 0)
251 subset.load(level_subsets.item[0]);
254 texture_draw(&img_choose_subset,(screen->w - img_choose_subset.w) / 2, 0);
255 if(level_subsets.num_items != 0)
257 texture_draw(&subset.image,(screen->w - subset.image.w) / 2 + 25,78);
258 if(level_subsets.num_items > 1)
261 texture_draw(&arrow_left,(screen->w / 2) - ((subset.title.length()+2)*16)/2,20);
262 if(i < level_subsets.num_items-1)
263 texture_draw(&arrow_right,(screen->w / 2) + ((subset.description.length())*16)/2,20);
265 text_drawf(&gold_text, subset.title.c_str(), 0, 20, A_HMIDDLE, A_TOP, 1);
266 text_drawf(&gold_text, subset.description.c_str(), 20, -20, A_HMIDDLE, A_BOTTOM, 1);
270 while(SDL_PollEvent(&event) && !done)
277 case SDL_KEYDOWN: // key pressed
279 key = event.key.keysym.sym;
287 subset.load(level_subsets.item[i]);
290 else if(key == SDLK_RIGHT)
292 if(i < level_subsets.num_items -1)
296 subset.load(level_subsets.item[i]);
299 else if(key == SDLK_SPACE || key == SDLK_RETURN)
302 quit = gameloop(subset.name.c_str(),1,ST_GL_PLAY);
305 else if(key == SDLK_ESCAPE)
318 titletux.level_begin();
319 update_time = st_get_ticks();
323 // Start Game, ie. goto the slots menu
324 update_load_save_game_menu(load_game_menu, true);
331 done = leveleditor(1);
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(&timer, SDL_GetTicks());
420 timer_start(&timer, 50);
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(&timer) < 0)
508 timer_start(&timer, 50);
511 string_list_free(&names);
513 SDL_EnableKeyRepeat(0, 0); // disables key repeating
515 Menu::set_current(main_menu);