#ifndef SUPERTUX_GAMELOOP_H
#define SUPERTUX_GAMELOOP_H
-#include "special/timer.h"
-#include "special/base.h"
+#include <SDL.h>
+#include "timer.h"
+#include "statistics.h"
using namespace SuperTux;
class Level;
class Sector;
+class Statistics;
namespace SuperTux {
class DrawingContext;
keeping the speed and framerate sane, etc. */
class GameSession
{
-private:
- Timer fps_timer;
- Timer frame_timer;
- Timer endsequence_timer;
- Level* level;
- Sector* currentsector;
-
- int st_gl_mode;
- int levelnb;
- float fps_fps;
- unsigned int last_update_time;
- unsigned int update_time;
- int pause_menu_frame;
- int debug_fps;
-
- /** If true the end_sequence will be played, user input will be
- ignored while doing that */
- enum EndSequenceState {
- NO_ENDSEQUENCE,
- ENDSEQUENCE_RUNNING, // tux is running right
- ENDSEQUENCE_WAITING // waiting for the end of the music
- };
- EndSequenceState end_sequence;
- float last_x_pos;
-
- bool game_pause;
-
- std::string levelname;
- bool flip_level;
-
- // the sector and spawnpoint we shoudl spawn after this frame
- std::string newsector;
- std::string newspawnpoint;
public:
enum ExitStatus { ES_NONE, ES_LEVEL_FINISHED, ES_GAME_OVER, ES_LEVEL_ABORT };
-private:
- ExitStatus exit_status;
+
public:
DrawingContext* context;
- Timer time_left;
+ Timer2 time_left;
- GameSession(const std::string& level, int mode, bool flip_level_ = false);
+ GameSession(const std::string& levelfile, int mode, Statistics* statistics=0);
~GameSession();
/** Enter the busy loop */
ExitStatus run();
void draw();
- void action(double frame_ratio);
+ void action(float frame_ratio);
void set_current()
{ current_ = this; }
void respawn(const std::string& sectorname,
const std::string& spawnpointname);
+ void set_reset_point(const std::string& sectorname,
+ const Vector& pos);
+ void display_info_box(const std::string& text);
Sector* get_current_sector()
{ return currentsector; }
+
+ void start_sequence(const std::string& sequencename);
private:
- static GameSession* current_;
-
void restart_level();
void check_end_conditions();
void start_timers();
void process_events();
+ void handle_cheats();
void levelintro();
void drawstatus(DrawingContext& context);
void drawendscreen();
- void drawresultscreen(void);
+ void drawresultscreen();
+ void draw_pause();
-private:
void on_escape_press();
void process_menu();
+
+ Uint32 fps_ticks;
+ Timer2 endsequence_timer;
+ Level* level;
+ Sector* currentsector;
+
+ int st_gl_mode;
+ int levelnb;
+ float fps_fps;
+ int pause_menu_frame;
+
+ /** If true the end_sequence will be played, user input will be
+ ignored while doing that */
+ enum EndSequenceState {
+ NO_ENDSEQUENCE,
+ ENDSEQUENCE_RUNNING, // tux is running right
+ ENDSEQUENCE_WAITING // waiting for the end of the music
+ };
+ EndSequenceState end_sequence;
+ float last_x_pos;
+
+ bool game_pause;
+
+ std::string levelfile;
+
+ // reset point (the point where tux respawns if he dies)
+ std::string reset_sector;
+ Vector reset_pos;
+
+ // the sector and spawnpoint we should spawn after this frame
+ std::string newsector;
+ std::string newspawnpoint;
+
+ static GameSession* current_;
+
+ // for cheating
+ std::string last_keys;
+
+ Statistics* best_level_statistics;
+
+ ExitStatus exit_status;
};
std::string slotinfo(int slot);
-bool rectcollision(base_type* one, base_type* two);
-void bumpbrick(float x, float y);
-
/** Return true if the gameloop() was entered, false otherwise */
bool process_load_game_menu();