-bool rectcollision(base_type* one, base_type* two);
-void drawshape(float x, float y, unsigned int c, Uint8 alpha = 255);
-void bumpbrick(float x, float y);
+/** The GameSession class controlls the controll flow of a World, ie.
+ present the menu on specifc keypresses, render and update it while
+ keeping the speed and framerate sane, etc. */
+class GameSession
+{
+private:
+ 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;
+
+ // 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;
+ Timer2 time_left;
+
+ GameSession(const std::string& levelfile, int mode, Statistics* statistics=0);
+ ~GameSession();
+
+ /** Enter the busy loop */
+ ExitStatus run();