- while (!done)
- {
- /* Calculate the movement-factor */
- double frame_ratio = ((double)(update_time-last_update_time))/((double)FRAME_RATE);
- if(frame_ratio > 1.5) /* Quick hack to correct the unprecise CPU clocks a little bit. */
- frame_ratio = 1.5 + (frame_ratio - 1.5) * 0.85;
- /* Lower the frame_ratio that Tux doesn't jump to hectically throught the demo. */
- frame_ratio /= 2;
-
- /* Handle events: */
-
- while (SDL_PollEvent(&event))
- {
- current_menu->event(event);
- if (event.type == SDL_QUIT)
- {
- done = true;
- }
- else if (event.type == SDL_KEYDOWN)
- {
- /* Keypress... */
- key = event.key.keysym.sym;
-
- /* Check for menu events */
- //menu_event(event);
-
- if (key == SDLK_ESCAPE)
- {
- /* Escape: Quit: */
- done = true;
- }
- }
- }
-
- /* Draw the background: */
- draw_background();
- draw_demo(&session, frame_ratio);
-
- if (current_menu == main_menu)
- texture_draw(&logo, 160, 30);
-
- text_draw(&white_small_text,
- " SuperTux " VERSION "\n"
- "Copyright (c) 2003 SuperTux Devel Team\n"
- "This game comes with ABSOLUTELY NO WARRANTY. This is free software, and you\n"
- "are welcome to redistribute it under certain conditions; see the file COPYING\n"
- "for details.\n",
- 0, 420, 0);
-
- /* Draw the high score: */
- /*
- sprintf(str, "High score: %d", hs_score);
- text_drawf(&gold_text, str, 0, -40, A_HMIDDLE, A_BOTTOM, 1);
- sprintf(str, "by %s", hs_name);
- text_drawf(&gold_text, str, 0, -20, A_HMIDDLE, A_BOTTOM, 1);
- */
-
- /* Don't draw menu, if quit is true */
- if(show_menu && !done)
- menu_process_current();
-
- if(current_menu == main_menu)
- {
- switch (main_menu->check())
- {
-#if 0
- case 0:
- // Quick Play
- // FIXME: obsolete
- done = 0;
- i = 0;
- if(level_subsets.num_items != 0)
- {
- subset.load(level_subsets.item[0]);
- while(!done)
- {
- texture_draw(&img_choose_subset,(screen->w - img_choose_subset.w) / 2, 0);
- if(level_subsets.num_items != 0)
- {
- texture_draw(&subset.image,(screen->w - subset.image.w) / 2 + 25,78);
- if(level_subsets.num_items > 1)
- {
- if(i > 0)
- texture_draw(&arrow_left,(screen->w / 2) - ((subset.title.length()+2)*16)/2,20);
- if(i < level_subsets.num_items-1)
- texture_draw(&arrow_right,(screen->w / 2) + ((subset.description.length())*16)/2,20);
- }
- text_drawf(&gold_text, subset.title.c_str(), 0, 20, A_HMIDDLE, A_TOP, 1);
- text_drawf(&gold_text, subset.description.c_str(), 20, -20, A_HMIDDLE, A_BOTTOM, 1);
- }
- updatescreen();
- SDL_Delay(50);
- while(SDL_PollEvent(&event) && !done)
- {
- switch(event.type)
- {
- case SDL_QUIT:
- done = true;
- break;
- case SDL_KEYDOWN: // key pressed
- // Keypress...
- key = event.key.keysym.sym;
-
- if(key == SDLK_LEFT)
- {
- if(i > 0)
- {
- --i;
- subset.free();
- subset.load(level_subsets.item[i]);
- }
- }
- else if(key == SDLK_RIGHT)
- {
- if(i < level_subsets.num_items -1)
- {
- ++i;
- subset.free();
- subset.load(level_subsets.item[i]);
- }
- }
- else if(key == SDLK_SPACE || key == SDLK_RETURN)
- {
- done = true;
- quit = gameloop(subset.name.c_str(),1,ST_GL_PLAY);
- subset.free();
- }
- else if(key == SDLK_ESCAPE)
- {
- done = true;
- }
- break;
- default:
- break;
- }
- }
- }
- }
- // reset tux
- scroll_x = 0;
- titletux.level_begin();
- update_time = st_get_ticks();
- break;
-#endif
- case 0:
- // Start Game, ie. goto the slots menu
- update_load_save_game_menu(load_game_menu, true);
- break;
- case 1:
- // Contrib Menu
- break;
- case 3:
- done = true;
- done = leveleditor(1);
- menu_reset();
- show_menu = 1;
- Menu::set_current(main_menu);
- break;
- case 4:
- display_credits();
- break;
- case 5:
- done = true;
- break;
- }
- }
- else if(current_menu == options_menu)
- {
- process_options_menu();
- }
- else if(current_menu == load_game_menu)
- {
- if (process_load_game_menu())
- {
- // FIXME: shouldn't be needed if GameSession doesn't relay on global variables
- // reset tux
- scroll_x = 0;
- //titletux.level_begin();
- update_time = st_get_ticks();
- }
- }
- else if(current_menu == contrib_menu)
- {
-
- }
-
- mouse_cursor->draw();
-
- flipscreen();
-
- /* Set the time of the last update and the time of the current update */
- last_update_time = update_time;
- update_time = st_get_ticks();
-
- /* Pause: */
- frame++;
- SDL_Delay(25);
+void
+TitleScreen::make_tux_jump()
+{
+ static bool jumpWasReleased = true;
+ Sector* sector = titlesession->get_current_sector();
+ Player* tux = sector->player;
+
+ controller->update();
+ controller->press(Controller::RIGHT);
+
+ // Check if we should press the jump button
+ Rect lookahead = tux->get_bbox();
+ lookahead.p2.x += 96;
+ bool pathBlocked = !sector->is_free_of_statics(lookahead);
+ if ((pathBlocked && jumpWasReleased) || !tux->on_ground()) {
+ controller->press(Controller::JUMP);
+ jumpWasReleased = false;
+ } else {
+ jumpWasReleased = true;
+ }
+
+ // Wrap around at the end of the level back to the beginning
+ if(sector->get_width() - 320 < tux->get_pos().x) {
+ sector->activate("main");
+ sector->camera->reset(tux->get_pos());
+ }
+}