X-Git-Url: https://git.octo.it/?a=blobdiff_plain;ds=sidebyside;f=src%2Fgame_session.hpp;h=edae3a632660dfbe64f860fb940a57bb68255b04;hb=c686b6e6bc389edb08cef2215b0882b2b0ff4b4b;hp=3b14707c7364f8903aa6e8927af9aa174125d9f9;hpb=70291cc1f49340fc07bf1e3fec8f604c52e781ac;p=supertux.git diff --git a/src/game_session.hpp b/src/game_session.hpp index 3b14707c7..edae3a632 100644 --- a/src/game_session.hpp +++ b/src/game_session.hpp @@ -1,9 +1,7 @@ // $Id$ -// +// // SuperTux -// Copyright (C) 2004 Bill Kendrick -// Tobias Glaesser -// Ingo Ruhnke +// Copyright (C) 2006 Matthias Braun // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License @@ -14,7 +12,7 @@ // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// +// // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. @@ -23,46 +21,30 @@ #include #include +#include #include "screen.hpp" -#include "timer.hpp" -#include "statistics.hpp" #include "math/vector.hpp" -#include "console.hpp" - -/* GameLoop modes */ -enum GameSessionMode { - ST_GL_PLAY, - ST_GL_TEST, - ST_GL_LOAD_GAME, - ST_GL_LOAD_LEVEL_FILE, - ST_GL_DEMO_GAME -}; - -enum GameMenuIDs { - MNID_CONTINUE, - MNID_ABORTLEVEL -}; - -extern int game_started; +#include "video/surface.hpp" +#include "object/endsequence.hpp" class Level; class Sector; class Statistics; class DrawingContext; class CodeController; +class Menu; /** - * The GameSession class controlls the controll flow of the Game (the part - * where you actually play a level) + * Screen that runs a Level, where Players run and jump through Sectors. */ -class GameSession : public Screen, public ConsoleCommandReceiver +class GameSession : public Screen { public: - GameSession(const std::string& levelfile, GameSessionMode mode, - Statistics* statistics = NULL); + GameSession(const std::string& levelfile, Statistics* statistics = NULL); ~GameSession(); void record_demo(const std::string& filename); + int get_demo_random_seed(const std::string& filename); void play_demo(const std::string& filename); void draw(DrawingContext& context); @@ -76,30 +58,43 @@ public: /// ends the current level void finish(bool win = true); - 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); - + void respawn(const std::string& sectorname, const std::string& spawnpointname); + void set_reset_point(const std::string& sectorname, const Vector& pos); + std::string get_reset_point_sectorname() + { return reset_sector; } + + Vector get_reset_point_pos() + { return reset_pos; } + Sector* get_current_sector() { return currentsector; } Level* get_current_level() - { return level; } + { return level.get(); } void start_sequence(const std::string& sequencename); - /** returns the "working directory" usually this is the directory where the + /** + * returns the "working directory" usually this is the directory where the * currently played level resides. This is used when locating additional * resources for the current level/world */ std::string get_working_directory(); - bool consoleCommand(std::string command, std::vector arguments); /**< callback from Console; return false if command was unknown, true otherwise */ + void restart_level(); -private: - void restart_level(bool fromBeginning = true); + void toggle_pause(); + + /** + * Enters or leaves level editor mode + */ + void set_editmode(bool edit_mode = true); + + /** + * Forces all Players to enter ghost mode + */ + void force_ghost_mode(); +private: void check_end_conditions(); void process_events(); void capture_demo_step(); @@ -108,30 +103,26 @@ private: void drawstatus(DrawingContext& context); void draw_pause(DrawingContext& context); + HSQUIRRELVM run_script(std::istream& in, const std::string& sourcename); void on_escape_press(); void process_menu(); - Timer endsequence_timer; - Level* level; + std::auto_ptr level; + std::auto_ptr statistics_backdrop; + + // scripts + typedef std::vector ScriptList; + ScriptList scripts; + Sector* currentsector; - GameSessionMode 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; - CodeController* end_sequence_controller; + EndSequence* end_sequence; - bool game_pause; + bool game_pause; + float speed_before_pause; std::string levelfile; @@ -151,8 +142,12 @@ private: std::string capture_file; std::istream* playback_demo_stream; CodeController* demo_controller; - Console* console; + + std::auto_ptr game_menu; + + float play_time; /**< total time in seconds that this session ran interactively */ + + bool edit_mode; /**< true if GameSession runs in level editor mode */ }; #endif /*SUPERTUX_GAMELOOP_H*/ -