#include "tile.h"
#include "particlesystem.h"
#include "resources.h"
+#include "music_manager.h"
GameSession* GameSession::current_ = 0;
GameSession::GameSession(const std::string& subset_, int levelnb_, int mode)
- : world(0), st_gl_mode(mode), levelnb(levelnb_), subset(subset_)
+ : world(0), st_gl_mode(mode), levelnb(levelnb_), end_sequenze(false),
+ subset(subset_)
{
current_ = this;
+
+ global_frame_counter = 0;
+ game_pause = false;
+
+ fps_timer.init(true);
+ frame_timer.init(true);
+
restart_level();
}
}
time_left.init(true);
- start_timers();
+ start_timers();
+ world->play_music(LEVEL_MUSIC);
}
GameSession::~GameSession()
void
GameSession::levelintro(void)
{
+ music_manager->halt_music();
+
char str[60];
- /* Level Intro: */
- clearscreen(0, 0, 0);
+
+ if (get_level()->img_bkgd)
+ get_level()->img_bkgd->draw(0, 0);
+ else
+ drawgradient(get_level()->bkgd_top, get_level()->bkgd_bottom);
sprintf(str, "%s", world->get_level()->name.c_str());
gold_text->drawf(str, 0, 200, A_HMIDDLE, A_TOP, 1);
void
GameSession::on_escape_press()
{
+ if(game_pause)
+ return;
+
if(st_gl_mode == ST_GL_TEST)
{
exit_status = LEVEL_ABORT;
void
GameSession::process_events()
{
- SDL_Event event;
- while (SDL_PollEvent(&event))
+ if (end_sequenze)
{
- /* Check for menu-events, if the menu is shown */
- if (Menu::current())
- {
- Menu::current()->event(event);
- st_pause_ticks_start();
- }
- else if (end_sequenze)
- {
- Player& tux = *world->get_tux();
- tux.input.left = UP;
- tux.input.right = DOWN;
- tux.input.up = UP;
- tux.input.down = UP;
- }
+ Player& tux = *world->get_tux();
+
+ tux.input.left = UP;
+ tux.input.right = DOWN;
+ tux.input.down = UP;
+
+ if (int(last_x_pos) == int(tux.base.x))
+ tux.input.up = DOWN;
else
- {
- Player& tux = *world->get_tux();
-
- st_pause_ticks_stop();
+ tux.input.up = UP;
- switch(event.type)
- {
- case SDL_QUIT: /* Quit event - quit: */
- st_abort("Received window close", "");
- break;
+ last_x_pos = tux.base.x;
+ }
+ else
+ {
+ if(!Menu::current() && !game_pause)
+ st_pause_ticks_stop();
- case SDL_KEYDOWN: /* A keypress! */
- {
- SDLKey key = event.key.keysym.sym;
-
- if(tux.key_event(key,DOWN))
+ SDL_Event event;
+ while (SDL_PollEvent(&event))
+ {
+ /* Check for menu-events, if the menu is shown */
+ if (Menu::current())
+ {
+ Menu::current()->event(event);
+ st_pause_ticks_start();
+ }
+ else
+ {
+ Player& tux = *world->get_tux();
+
+ switch(event.type)
+ {
+ case SDL_QUIT: /* Quit event - quit: */
+ st_abort("Received window close", "");
break;
- switch(key)
+ case SDL_KEYDOWN: /* A keypress! */
{
- case SDLK_ESCAPE: /* Escape: Open/Close the menu: */
- on_escape_press();
- break;
- default:
- break;
- }
- }
- break;
- case SDL_KEYUP: /* A keyrelease! */
- {
- SDLKey key = event.key.keysym.sym;
+ SDLKey key = event.key.keysym.sym;
+
+ if(tux.key_event(key,DOWN))
+ break;
- if(tux.key_event(key, UP))
+ switch(key)
+ {
+ case SDLK_ESCAPE: /* Escape: Open/Close the menu: */
+ on_escape_press();
+ break;
+ default:
+ break;
+ }
+ }
break;
-
- switch(key)
+ case SDL_KEYUP: /* A keyrelease! */
{
- case SDLK_p:
- if(!Menu::current())
+ SDLKey key = event.key.keysym.sym;
+
+ if(tux.key_event(key, UP))
+ break;
+
+ switch(key)
{
- if(game_pause)
- {
- game_pause = false;
- st_pause_ticks_stop();
- }
- else
+ case SDLK_p:
+ if(!Menu::current())
{
- game_pause = true;
- st_pause_ticks_start();
+ if(game_pause)
+ {
+ game_pause = false;
+ st_pause_ticks_stop();
+ }
+ else
+ {
+ game_pause = true;
+ st_pause_ticks_start();
+ }
}
- }
- break;
- case SDLK_TAB:
- if(debug_mode)
- {
- tux.size = !tux.size;
- if(tux.size == BIG)
+ break;
+ case SDLK_TAB:
+ if(debug_mode)
{
- tux.base.height = 64;
+ tux.size = !tux.size;
+ if(tux.size == BIG)
+ {
+ tux.base.height = 64;
+ }
+ else
+ tux.base.height = 32;
}
+ break;
+ case SDLK_END:
+ if(debug_mode)
+ player_status.distros += 50;
+ break;
+ case SDLK_DELETE:
+ if(debug_mode)
+ tux.got_coffee = 1;
+ break;
+ case SDLK_INSERT:
+ if(debug_mode)
+ tux.invincible_timer.start(TUX_INVINCIBLE_TIME);
+ break;
+ case SDLK_l:
+ if(debug_mode)
+ --player_status.lives;
+ break;
+ case SDLK_s:
+ if(debug_mode)
+ player_status.score += 1000;
+ case SDLK_f:
+ if(debug_fps)
+ debug_fps = false;
else
- tux.base.height = 32;
+ debug_fps = true;
+ break;
+ default:
+ break;
}
- break;
- case SDLK_END:
- if(debug_mode)
- player_status.distros += 50;
- break;
- case SDLK_DELETE:
- if(debug_mode)
- tux.got_coffee = 1;
- break;
- case SDLK_INSERT:
- if(debug_mode)
- tux.invincible_timer.start(TUX_INVINCIBLE_TIME);
- break;
- case SDLK_l:
- if(debug_mode)
- --player_status.lives;
- break;
- case SDLK_s:
- if(debug_mode)
- player_status.score += 1000;
- case SDLK_f:
- if(debug_fps)
- debug_fps = false;
- else
- debug_fps = true;
- break;
- default:
- break;
}
- }
- break;
+ break;
- case SDL_JOYAXISMOTION:
- if (event.jaxis.axis == joystick_keymap.x_axis)
- {
- if (event.jaxis.value < -joystick_keymap.dead_zone)
- {
- tux.input.left = DOWN;
- tux.input.right = UP;
- }
- else if (event.jaxis.value > joystick_keymap.dead_zone)
+ case SDL_JOYAXISMOTION:
+ if (event.jaxis.axis == joystick_keymap.x_axis)
{
- tux.input.left = UP;
- tux.input.right = DOWN;
+ if (event.jaxis.value < -joystick_keymap.dead_zone)
+ {
+ tux.input.left = DOWN;
+ tux.input.right = UP;
+ }
+ else if (event.jaxis.value > joystick_keymap.dead_zone)
+ {
+ tux.input.left = UP;
+ tux.input.right = DOWN;
+ }
+ else
+ {
+ tux.input.left = DOWN;
+ tux.input.right = DOWN;
+ }
}
- else
+ else if (event.jaxis.axis == joystick_keymap.y_axis)
{
- tux.input.left = DOWN;
- tux.input.right = DOWN;
+ if (event.jaxis.value > joystick_keymap.dead_zone)
+ tux.input.down = DOWN;
+ else if (event.jaxis.value < -joystick_keymap.dead_zone)
+ tux.input.down = UP;
+ else
+ tux.input.down = UP;
}
- }
- else if (event.jaxis.axis == joystick_keymap.y_axis)
- {
- if (event.jaxis.value > joystick_keymap.dead_zone)
- tux.input.down = DOWN;
- else if (event.jaxis.value < -joystick_keymap.dead_zone)
- tux.input.down = UP;
- else
- tux.input.down = UP;
- }
- break;
+ break;
- case SDL_JOYBUTTONDOWN:
- if (event.jbutton.button == joystick_keymap.a_button)
- tux.input.up = DOWN;
- else if (event.jbutton.button == joystick_keymap.b_button)
- tux.input.fire = DOWN;
- else if (event.jbutton.button == joystick_keymap.start_button)
- on_escape_press();
- break;
- case SDL_JOYBUTTONUP:
- if (event.jbutton.button == joystick_keymap.a_button)
- tux.input.up = UP;
- else if (event.jbutton.button == joystick_keymap.b_button)
- tux.input.fire = UP;
- break;
+ case SDL_JOYBUTTONDOWN:
+ if (event.jbutton.button == joystick_keymap.a_button)
+ tux.input.up = DOWN;
+ else if (event.jbutton.button == joystick_keymap.b_button)
+ tux.input.fire = DOWN;
+ else if (event.jbutton.button == joystick_keymap.start_button)
+ on_escape_press();
+ break;
+ case SDL_JOYBUTTONUP:
+ if (event.jbutton.button == joystick_keymap.a_button)
+ tux.input.up = UP;
+ else if (event.jbutton.button == joystick_keymap.b_button)
+ tux.input.fire = UP;
+ break;
- default:
- break;
- } /* switch */
- }
- } /* while */
+ default:
+ break;
+ } /* switch */
+ }
+ } /* while */
+ }
}
{
exit_status = LEVEL_FINISHED;
}
- else if (tux->base.x >= World::current()->get_level()->endpos)
+ else if (tux->base.x >= World::current()->get_level()->endpos && !end_sequenze)
{
end_sequenze = true;
- halt_music();
+ last_x_pos = -1;
+ music_manager->halt_music();
}
else
{
{
switch (game_menu->check())
{
- case 2:
+ case MNID_CONTINUE:
st_pause_ticks_stop();
break;
- case 5:
+ case MNID_ABORTLEVEL:
st_pause_ticks_stop();
exit_status = LEVEL_ABORT;
break;
GameSession::run()
{
Menu::set_current(0);
- Player* tux = world->get_tux();
current_ = this;
- int fps_cnt;
+ int fps_cnt = 0;
- global_frame_counter = 0;
- game_pause = false;
-
- fps_timer.init(true);
- frame_timer.init(true);
-
- last_update_time = st_get_ticks();
- fps_cnt = 0;
+ update_time = last_update_time = st_get_ticks();
/* Clear screen: */
clearscreen(0, 0, 0);
updatescreen();
- /* Play music: */
- play_current_music();
-
// Eat unneeded events
SDL_Event event;
while (SDL_PollEvent(&event)) {}
}
/* Handle events: */
- tux->input.old_fire = tux->input.fire;
+ world->get_tux()->input.old_fire = world->get_tux()->input.fire;
process_events();
process_menu();
}
/* Handle time: */
- if (time_left.check())
+ if (!time_left.check() && world->get_tux()->dying == DYING_NOT)
+ world->get_tux()->kill(Player::KILL);
+
+ /* Handle music: */
+ if(world->get_tux()->invincible_timer.check())
{
- /* are we low on time ? */
- if (time_left.get_left() < TIME_WARNING
- && (get_current_music() != HURRYUP_MUSIC)) /* play the fast music */
- {
- set_current_music(HURRYUP_MUSIC);
- play_current_music();
- }
+ if(world->get_music_type() != HERRING_MUSIC)
+ world->play_music(HERRING_MUSIC);
+ }
+ /* are we low on time ? */
+ else if (time_left.get_left() < TIME_WARNING
+ && (world->get_music_type() == LEVEL_MUSIC))
+ {
+ world->play_music(HURRYUP_MUSIC);
}
- else if(tux->dying == DYING_NOT)
+ /* or just normal music? */
+ else if(world->get_music_type() != LEVEL_MUSIC)
{
- tux->kill(KILL);
+ world->play_music(LEVEL_MUSIC);
}
/* Calculate frames per second */
}
}
- halt_music();
-
- world->get_level()->free_gfx();
- world->get_level()->cleanup();
- world->get_level()->free_song();
+ delete world;
+ world = 0;
return exit_status;
}
}
sprintf(str, "%d", player_status.distros);
- white_text->draw("DISTROS", screen->h, 0, 1);
+ white_text->draw("COINS", screen->h, 0, 1);
gold_text->draw(str, 608, 0, 1);
white_text->draw("LIVES", screen->h, 20, 1);
{
char str[80];
- clearscreen(0, 0, 0);
+ if (get_level()->img_bkgd)
+ get_level()->img_bkgd->draw(0, 0);
+ else
+ drawgradient(get_level()->bkgd_top, get_level()->bkgd_bottom);
blue_text->drawf("GAMEOVER", 0, 200, A_HMIDDLE, A_TOP, 1);
{
char str[80];
- clearscreen(0, 0, 0);
+ if (get_level()->img_bkgd)
+ get_level()->img_bkgd->draw(0, 0);
+ else
+ drawgradient(get_level()->bkgd_top, get_level()->bkgd_bottom);
blue_text->drawf("Result:", 0, 200, A_HMIDDLE, A_TOP, 1);
sprintf(str, "SCORE: %d", player_status.score);
gold_text->drawf(str, 0, 224, A_HMIDDLE, A_TOP, 1);
- sprintf(str, "DISTROS: %d", player_status.distros);
+ sprintf(str, "COINS: %d", player_status.distros);
gold_text->drawf(str, 0, 256, A_HMIDDLE, A_TOP, 1);
flipscreen();