- if(st_gl_mode != ST_GL_TEST)
- load_hs();
-
- loadshared();
-
- if(st_gl_mode == ST_GL_PLAY || st_gl_mode == ST_GL_LOAD_LEVEL_FILE)
- levelintro();
-
- timer_init(&time_left,true);
- start_timers();
-
- if(st_gl_mode == ST_GL_LOAD_GAME)
- loadgame(levelnb);
-
- /* --- MAIN GAME LOOP!!! --- */
-
- jump = false;
- done = 0;
- quit = 0;
- global_frame_counter = 0;
- game_pause = 0;
- timer_init(&fps_timer,true);
- timer_init(&frame_timer,true);
- fps_cnt = 0;
-
- /* Clear screen: */
-
- clearscreen(0, 0, 0);
- updatescreen();
-
- /* Play music: */
- play_current_music();
-
-
- while (SDL_PollEvent(&event))
- {}
-
- game_draw();
- do
- {
- jump = false;
-
- /* Calculate the movement-factor */
- 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;
-
- if(!timer_check(&frame_timer))
- {
- timer_start(&frame_timer,25);
- ++global_frame_counter;
- }
-
- /* Handle events: */
-
- tux.input.old_fire = tux.input.fire;
-
- game_event();
-
- if(show_menu)
- {
- if(current_menu == game_menu)
- {
- switch (game_menu->check())
- {
- case 2:
- st_pause_ticks_stop();
- break;
- case 3:
- update_load_save_game_menu(save_game_menu, false);
- break;
- case 4:
- update_load_save_game_menu(load_game_menu, true);
- break;
- case 7:
- st_pause_ticks_stop();
- done = 1;
- break;
- }
- }
- else if(current_menu == options_menu)
- {
- process_options_menu();
- }
- else if(current_menu == save_game_menu )
- {
- process_save_load_game_menu(true);
- }
- else if(current_menu == load_game_menu )
- {
- process_save_load_game_menu(false);
- }
- }
-
-
- /* Handle actions: */
-
- if(!game_pause && !show_menu)
- {
- /*float z = frame_ratio;
- frame_ratio = 1;
- while(z >= 1)
- {*/
- if (game_action() == 0)
- {
- /* == 0: no more lives */
- /* == -1: continues */
- return 0;
- }
- /* --z;
- }*/
- }
- else
- {
- ++pause_menu_frame;
- SDL_Delay(50);
- }
-
- if(debug_mode && debug_fps)
- SDL_Delay(60);
-
- /*Draw the current scene to the screen */
- /*If the machine running the game is too slow
- skip the drawing of the frame (so the calculations are more precise and
- the FPS aren't affected).*/
- /*if( ! fps_fps < 50.0 )
- game_draw();
- else
- jump = true;*/ /*FIXME: Implement this tweak right.*/
- game_draw();
-
- /* Time stops in pause mode */
- if(game_pause || show_menu )
- {
- continue;
- }
-
- /* 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 till next frame, if the machine running the game is too fast: */
- /* FIXME: Works great for in OpenGl mode, where the CPU doesn't have to do that much. But
- the results in SDL mode aren't perfect (thought the 100 FPS are reached), even on an AMD2500+. */
- if(last_update_time >= update_time - 12 && !jump)
- SDL_Delay(10);
- /*if((update_time - last_update_time) < 10)
- SDL_Delay((11 - (update_time - last_update_time))/2);*/
-
-
-
- /* Handle time: */
-
- if (timer_check(&time_left))
- {
- /* are we low on time ? */
- if ((timer_get_left(&time_left) < TIME_WARNING)
- && (get_current_music() != HURRYUP_MUSIC)) /* play the fast music */
- {
- set_current_music(HURRYUP_MUSIC);
- play_current_music();
- }
-
- }
- else
- tux.kill(KILL);
-
-
- /* Calculate frames per second */
- if(show_fps)
- {
- ++fps_cnt;
- fps_fps = (1000.0 / (float)timer_get_gone(&fps_timer)) * (float)fps_cnt;
-
- if(!timer_check(&fps_timer))
- {
- timer_start(&fps_timer,1000);
- fps_cnt = 0;
- }
- }
-
- }
- while (!done && !quit);
-
- halt_music();
-
- level_free_gfx();
- level_free(¤t_level);
- level_free_song();
- unloadshared();
- arrays_free();
-
- game_started = false;
-
- return(quit);
-}
-
-
-/* Load graphics/sounds shared between all levels: */
-
-void loadshared(void)
-{
- int i;
-
- /* Tuxes: */
- texture_load(&tux_right[0], datadir + "/images/shared/tux-right-0.png", USE_ALPHA);
- texture_load(&tux_right[1], datadir + "/images/shared/tux-right-1.png", USE_ALPHA);
- texture_load(&tux_right[2], datadir + "/images/shared/tux-right-2.png", USE_ALPHA);
-
- texture_load(&tux_left[0], datadir + "/images/shared/tux-left-0.png", USE_ALPHA);
- texture_load(&tux_left[1], datadir + "/images/shared/tux-left-1.png", USE_ALPHA);
- texture_load(&tux_left[2], datadir + "/images/shared/tux-left-2.png", USE_ALPHA);
-
- texture_load(&firetux_right[0], datadir + "/images/shared/firetux-right-0.png", USE_ALPHA);
- texture_load(&firetux_right[1], datadir + "/images/shared/firetux-right-1.png", USE_ALPHA);
- texture_load(&firetux_right[2], datadir + "/images/shared/firetux-right-2.png", USE_ALPHA);
-
- texture_load(&firetux_left[0], datadir + "/images/shared/firetux-left-0.png", USE_ALPHA);
- texture_load(&firetux_left[1], datadir + "/images/shared/firetux-left-1.png", USE_ALPHA);
- texture_load(&firetux_left[2], datadir + "/images/shared/firetux-left-2.png", USE_ALPHA);
-
-
- texture_load(&cape_right[0], datadir + "/images/shared/cape-right-0.png",
- USE_ALPHA);
-
- texture_load(&cape_right[1], datadir + "/images/shared/cape-right-1.png",
- USE_ALPHA);
-
- texture_load(&cape_left[0], datadir + "/images/shared/cape-left-0.png",
- USE_ALPHA);
-
- texture_load(&cape_left[1], datadir + "/images/shared/cape-left-1.png",
- USE_ALPHA);
-
- texture_load(&bigtux_right[0], datadir + "/images/shared/bigtux-right-0.png",
- USE_ALPHA);
-
- texture_load(&bigtux_right[1], datadir + "/images/shared/bigtux-right-1.png",
- USE_ALPHA);
-
- texture_load(&bigtux_right[2], datadir + "/images/shared/bigtux-right-2.png",
- USE_ALPHA);
-
- texture_load(&bigtux_right_jump, datadir + "/images/shared/bigtux-right-jump.png", USE_ALPHA);
-
- texture_load(&bigtux_left[0], datadir + "/images/shared/bigtux-left-0.png",
- USE_ALPHA);
-
- texture_load(&bigtux_left[1], datadir + "/images/shared/bigtux-left-1.png",
- USE_ALPHA);
-
- texture_load(&bigtux_left[2], datadir + "/images/shared/bigtux-left-2.png",
- USE_ALPHA);
-
- texture_load(&bigtux_left_jump, datadir + "/images/shared/bigtux-left-jump.png", USE_ALPHA);
-
- texture_load(&bigcape_right[0], datadir + "/images/shared/bigcape-right-0.png",
- USE_ALPHA);
-
- texture_load(&bigcape_right[1], datadir + "/images/shared/bigcape-right-1.png",
- USE_ALPHA);
-
- texture_load(&bigcape_left[0], datadir + "/images/shared/bigcape-left-0.png",
- USE_ALPHA);
-
- texture_load(&bigcape_left[1], datadir + "/images/shared/bigcape-left-1.png",
- USE_ALPHA);
-
- texture_load(&bigfiretux_right[0], datadir + "/images/shared/bigfiretux-right-0.png",
- USE_ALPHA);
-
- texture_load(&bigfiretux_right[1], datadir + "/images/shared/bigfiretux-right-1.png",
- USE_ALPHA);
-
- texture_load(&bigfiretux_right[2], datadir + "/images/shared/bigfiretux-right-2.png",
- USE_ALPHA);
-
- texture_load(&bigfiretux_right_jump, datadir + "/images/shared/bigfiretux-right-jump.png", USE_ALPHA);
-
- texture_load(&bigfiretux_left[0], datadir + "/images/shared/bigfiretux-left-0.png",
- USE_ALPHA);
-
- texture_load(&bigfiretux_left[1], datadir + "/images/shared/bigfiretux-left-1.png",
- USE_ALPHA);
-
- texture_load(&bigfiretux_left[2], datadir + "/images/shared/bigfiretux-left-2.png",
- USE_ALPHA);
-
- texture_load(&bigfiretux_left_jump, datadir + "/images/shared/bigfiretux-left-jump.png", USE_ALPHA);
-
- texture_load(&bigcape_right[0], datadir + "/images/shared/bigcape-right-0.png",
- USE_ALPHA);
-
- texture_load(&bigcape_right[1], datadir + "/images/shared/bigcape-right-1.png",
- USE_ALPHA);
-
- texture_load(&bigcape_left[0], datadir + "/images/shared/bigcape-left-0.png",
- USE_ALPHA);
-
- texture_load(&bigcape_left[1], datadir + "/images/shared/bigcape-left-1.png",
- USE_ALPHA);
-
-
- texture_load(&ducktux_right, datadir +
- "/images/shared/ducktux-right.png",
- USE_ALPHA);
-
- texture_load(&ducktux_left, datadir +
- "/images/shared/ducktux-left.png",
- USE_ALPHA);
-
- texture_load(&skidtux_right, datadir +
- "/images/shared/skidtux-right.png",
- USE_ALPHA);
-
- texture_load(&skidtux_left, datadir +
- "/images/shared/skidtux-left.png",
- USE_ALPHA);
-
- texture_load(&duckfiretux_right, datadir +
- "/images/shared/duckfiretux-right.png",
- USE_ALPHA);
-
- texture_load(&duckfiretux_left, datadir +
- "/images/shared/duckfiretux-left.png",
- USE_ALPHA);
-
- texture_load(&skidfiretux_right, datadir +
- "/images/shared/skidfiretux-right.png",
- USE_ALPHA);
-
- texture_load(&skidfiretux_left, datadir +
- "/images/shared/skidfiretux-left.png",
- USE_ALPHA);
-
-
- /* Boxes: */
-
- texture_load(&img_box_full, datadir + "/images/shared/box-full.png",
- IGNORE_ALPHA);
- texture_load(&img_box_empty, datadir + "/images/shared/box-empty.png",
- IGNORE_ALPHA);
-
-
- /* Water: */
-
-
- texture_load(&img_water, datadir + "/images/shared/water.png", IGNORE_ALPHA);
-
- texture_load(&img_waves[0], datadir + "/images/shared/waves-0.png",
- USE_ALPHA);
-
- texture_load(&img_waves[1], datadir + "/images/shared/waves-1.png",
- USE_ALPHA);
-
- texture_load(&img_waves[2], datadir + "/images/shared/waves-2.png",
- USE_ALPHA);
-
-
- /* Pole: */
-
- texture_load(&img_pole, datadir + "/images/shared/pole.png", USE_ALPHA);
- texture_load(&img_poletop, datadir + "/images/shared/poletop.png",
- USE_ALPHA);
-
-
- /* Flag: */
-
- texture_load(&img_flag[0], datadir + "/images/shared/flag-0.png",
- USE_ALPHA);
- texture_load(&img_flag[1], datadir + "/images/shared/flag-1.png",
- USE_ALPHA);
-
-
- /* Cloud: */
-
- texture_load(&img_cloud[0][0], datadir + "/images/shared/cloud-00.png",
- USE_ALPHA);
-
- texture_load(&img_cloud[0][1], datadir + "/images/shared/cloud-01.png",
- USE_ALPHA);
-
- texture_load(&img_cloud[0][2], datadir + "/images/shared/cloud-02.png",
- USE_ALPHA);
-
- texture_load(&img_cloud[0][3], datadir + "/images/shared/cloud-03.png",
- USE_ALPHA);
-
-
- texture_load(&img_cloud[1][0], datadir + "/images/shared/cloud-10.png",
- USE_ALPHA);
-
- texture_load(&img_cloud[1][1], datadir + "/images/shared/cloud-11.png",
- USE_ALPHA);
-
- texture_load(&img_cloud[1][2], datadir + "/images/shared/cloud-12.png",
- USE_ALPHA);
-
- texture_load(&img_cloud[1][3], datadir + "/images/shared/cloud-13.png",
- USE_ALPHA);
-
-
- /* Bad guys: */
- load_badguy_gfx();
-
- /* Upgrades: */
-
- texture_load(&img_mints, datadir + "/images/shared/mints.png", USE_ALPHA);
- texture_load(&img_coffee, datadir + "/images/shared/coffee.png", USE_ALPHA);
-
-
- /* Weapons: */
-
- texture_load(&img_bullet, datadir + "/images/shared/bullet.png", USE_ALPHA);
-
- texture_load(&img_red_glow, datadir + "/images/shared/red-glow.png",
- USE_ALPHA);
-
-
-
- /* Distros: */
-
- texture_load(&img_distro[0], datadir + "/images/shared/distro-0.png",
- USE_ALPHA);
-
- texture_load(&img_distro[1], datadir + "/images/shared/distro-1.png",
- USE_ALPHA);
-
- texture_load(&img_distro[2], datadir + "/images/shared/distro-2.png",
- USE_ALPHA);
-
- texture_load(&img_distro[3], datadir + "/images/shared/distro-3.png",
- USE_ALPHA);
-
-
- /* Tux life: */
-
- texture_load(&tux_life, datadir + "/images/shared/tux-life.png",
- USE_ALPHA);
-
- /* Herring: */
-
- texture_load(&img_golden_herring, datadir + "/images/shared/golden-herring.png",
- USE_ALPHA);
-
-
- /* Super background: */
-
- texture_load(&img_super_bkgd, datadir + "/images/shared/super-bkgd.png",
- IGNORE_ALPHA);
-
-
- /* Sound effects: */
-
- /* if (use_sound) // this will introduce SERIOUS bugs here ! because "load_sound"
- // initialize sounds[i] with the correct pointer's value:
- // NULL or something else. And it will be dangerous to
- // play with not-initialized pointers.
- // This is also true with if (use_music)
- Send a mail to me: neoneurone@users.sf.net, if you have another opinion. :)
- */
- for (i = 0; i < NUM_SOUNDS; i++)
- sounds[i] = load_sound(datadir + soundfilenames[i]);
-
- /* Herring song */
- herring_song = load_song(datadir + "/music/SALCON.MOD");
-}
-
-
-/* Free shared data: */
-
-void unloadshared(void)
-{
- int i;
-
- for (i = 0; i < 3; i++)
- {
- texture_free(&tux_right[i]);
- texture_free(&tux_left[i]);
- texture_free(&bigtux_right[i]);
- texture_free(&bigtux_left[i]);
- }
-
- texture_free(&bigtux_right_jump);
- texture_free(&bigtux_left_jump);
-
- for (i = 0; i < 2; i++)
- {
- texture_free(&cape_right[i]);
- texture_free(&cape_left[i]);
- texture_free(&bigcape_right[i]);
- texture_free(&bigcape_left[i]);
- }
-
- texture_free(&ducktux_left);
- texture_free(&ducktux_right);
-
- texture_free(&skidtux_left);
- texture_free(&skidtux_right);
-
- free_badguy_gfx();
-
- texture_free(&img_box_full);
- texture_free(&img_box_empty);
-
- texture_free(&img_water);
- for (i = 0; i < 3; i++)
- texture_free(&img_waves[i]);
-
- texture_free(&img_pole);
- texture_free(&img_poletop);
-
- for (i = 0; i < 2; i++)
- texture_free(&img_flag[i]);
-
- texture_free(&img_mints);
- texture_free(&img_coffee);
-
- for (i = 0; i < 4; i++)
- {
- texture_free(&img_distro[i]);
- texture_free(&img_cloud[0][i]);
- texture_free(&img_cloud[1][i]);
- }
-
- texture_free(&img_golden_herring);
-
- for (i = 0; i < NUM_SOUNDS; i++)
- free_chunk(sounds[i]);
-
- /* free the herring song */
- free_music( herring_song );
-}
-
-
-/* Draw a tile on the screen: */
-
-void drawshape(float x, float y, unsigned int c)
-{
- if (c != 0)
- {
- Tile* ptile = TileManager::instance()->get(c);
- if(ptile)
- {
- if(ptile->images.size() > 1)
- {
- texture_draw(&ptile->images[( ((global_frame_counter*25) / ptile->anim_speed) % (ptile->images.size()))],x,y);
- }
- else if (ptile->images.size() == 1)
- {
- texture_draw(&ptile->images[0],x,y);
- }
- else
- {
- printf("Tile not dravable %u\n", c);
- }
- }
- }
-
- /*
- if (c == 'X' || c == 'x')
- texture_draw(&img_brick[0], x, y);
- else if (c == 'Y' || c == 'y')
- texture_draw(&img_brick[1], x, y);
- else if (c == 'A' || c =='B' || c == '!')
- texture_draw(&img_box_full, x, y);
- else if (c == 'a')
- texture_draw(&img_box_empty, x, y);
- else if (c >= 'C' && c <= 'F')
- texture_draw(&img_cloud[0][c - 'C'], x, y);
- else if (c >= 'c' && c <= 'f')
- texture_draw(&img_cloud[1][c - 'c'], x, y);
- else if (c >= 'G' && c <= 'J')
- texture_draw(&img_bkgd_tile[0][c - 'G'], x, y);
- else if (c >= 'g' && c <= 'j')
- texture_draw(&img_bkgd_tile[1][c - 'g'], x, y);
- else if (c == '#')
- texture_draw(&img_solid[0], x, y);
- else if (c == '[')
- texture_draw(&img_solid[1], x, y);
- else if (c == '=')
- texture_draw(&img_solid[2], x, y);
- else if (c == ']')
- texture_draw(&img_solid[3], x, y);
- else if (c == '$')
- {
- z = (global_frame_counter / 2) % 6;
-
- if (z < 4)
- texture_draw(&img_distro[z], x, y);
- else if (z == 4)
- texture_draw(&img_distro[2], x, y);
- else if (z == 5)
- texture_draw(&img_distro[1], x, y);
- }
- else if (c == '^')
- {
- z = (global_frame_counter / 3) % 3;
-
- texture_draw(&img_waves[z], x, y);
- }
- else if (c == '*')
- texture_draw(&img_poletop, x, y);
- else if (c == '|')
- {
- texture_draw(&img_pole, x, y);
-
- }
- else if (c == '\\')
- {
- z = (global_frame_counter / 3) % 2;
-
- texture_draw(&img_flag[z], x + 16, y);
- }
- else if (c == '&')
- texture_draw(&img_water, x, y);*/
-
-}
-
-
-/* What shape is at some position? */
-unsigned int shape(float x, float y)
-{
-
- int xx, yy;
- unsigned int c;
-
- yy = ((int)y / 32);
- xx = ((int)x / 32);
-
- if (yy >= 0 && yy < 15 && xx >= 0 && xx <= current_level.width)
- {
- c = current_level.ia_tiles[yy][xx];
- }