terom@185: #ifndef ENGINE_HH terom@185: #define ENGINE_HH terom@185: terom@218: // forward-declare terom@185: class Engine; terom@185: terom@185: #include "GameState.hh" terom@417: #include "Configuration.hh" terom@417: #include "Logger.hh" terom@185: terom@417: // forward-declare component pointer types terom@417: // XXX: move to some kind of Components.hh file? terom@419: namespace graphics { class Graphics; class GameView; } terom@417: class NetworkServer; terom@417: class NetworkClientConnect; terom@417: class NetworkClient; terom@419: class NetworkClientController; terom@185: terom@283: /** terom@283: * This is the core class that glues all the other components together and runs the main loop terom@283: */ terom@185: class Engine { terom@185: private: terom@418: /** The game's terrain */ terom@408: Terrain *terrain; terom@185: terom@418: /** The game's state */ terom@418: GameState *game_state; terom@418: terom@418: /** The graphics+input component */ terom@418: graphics::Graphics *graphics; terom@418: terom@418: /** Network server */ terom@185: NetworkServer *net_server; terom@185: terom@418: /** Network client connector */ terom@418: NetworkClientConnect *net_client_connect; terom@418: terom@418: /** Network client, currently unused */ terom@418: NetworkClient *net_client; terom@418: terom@419: /** The GameView, if open */ terom@419: graphics::GameView *game_view; terom@419: terom@418: /** Is the mainloop still running? */ terom@185: bool is_running; terom@418: terom@418: /** Used to load ClanLib resources */ terom@418: CL_ResourceManager resources; terom@218: terom@418: /** *Global* log level */ terom@418: static LogLevel log_level; terom@185: terom@185: public: terom@185: // default constructor terom@418: Engine (const EngineConfig &config); terom@185: terom@408: /** terom@408: * Setup game world using the given terrain, returning the new GameState terom@408: */ terom@419: void setupGame (Terrain *terrain); terom@408: terom@408: /** terom@409: * Setup game world using given terrain configuration terom@408: */ terom@409: void setupGame (const TerrainConfig &config); terom@408: terom@409: /** terom@417: * Enable graphics. terom@417: * terom@417: * Requires: GRAPHICS_ENABLED terom@409: */ terom@417: void setupGraphics (const DisplayConfig &config); terom@185: terom@409: /** terom@409: * Setup server, must call setupGame first terom@417: * terom@417: * Requires: NETWORK_ENABLED terom@409: */ terom@185: void setupNetworkServer (const std::string &listen_port); terom@409: terom@409: /** terom@409: * Setup client, do *not* call setupGame, configuration comes from the server terom@417: * terom@417: * Requires: NETWORK_ENABLED terom@409: */ terom@185: void setupNetworkClient (const std::string &connect_host, const std::string &connect_port); terom@409: terom@409: /** terom@409: * Setup singleplayer, must call setupGame first terom@409: */ morasa@447: void setupSinglePlayer (void); morasa@447: terom@185: terom@408: /** terom@408: * Run the game main loop. This will not return until the game aborts due to an error, or someone calls stop(). terom@408: */ terom@185: void run (void); terom@408: terom@408: /** terom@408: * Terminate the main loop, causing run() to return once this loop iteration is finished terom@408: */ terom@408: void stop (void); terom@185: terom@408: private: terom@408: /** terom@417: * Puts graphics into GameView mode, using our GameState and the given player terom@408: */ terom@417: void startGameView (LocalPlayer *player); terom@185: terom@419: protected: terom@419: friend class NetworkClientConnect; terom@419: friend class NetworkClientController; terom@419: terom@419: /** terom@419: * Interface for NetworkClient to use once it has connected terom@419: */ terom@419: GameState& onNetworkClientConnected (Terrain *terrain); terom@419: terom@419: /** terom@419: * Interface for NetworkClient to use once it has set up the player terom@419: */ terom@419: void onNetworkClientPlayer (LocalPlayer *player); terom@419: terom@185: public: terom@418: /** terom@418: * Get a pointer to our resource manager, please don't break it. terom@418: * terom@418: * Guaranteed to never be NULL terom@418: */ terom@418: CL_ResourceManager* getResourceManager (void) { return &resources; } terom@418: terom@418: /** terom@418: * Log output, see Logger for more info terom@418: * terom@418: * @see Logger terom@418: */ terom@418: static inline Logger log (LogLevel level, const char *type) { terom@418: return Logger(level <= WARN ? std::cerr : std::cout, level, type, log_level); terom@418: } terom@185: terom@185: }; terom@185: terom@185: #endif /* ENGINE_HH */