/* client/client.cc This file is part of the Osirion project and is distributed under the terms and conditions of the GNU General Public License version 2 */ #include #include #include #include #include "client/chat.h" #include "client/client.h" #include "client/video.h" #include "client/camera.h" #include "client/console.h" #include "client/input.h" #include "client/view.h" #include "core/core.h" namespace client { core::Cvar *cl_framerate = 0; //--- private definition ------------------------------------------ /// client application implementation class Client : public core::Application { public: /// initialize the client Client virtual void init(int count, char **arguments); /// run the client Client virtual void run(); /// shutdown the client Client virtual void shutdown(); /// quit the client Client virtual void quit(int status); }; Client app; //--- engine functions -------------------------------------------- void func_r_restart(std::stringstream &args) { video::shutdown(); if (!video::init()) { app.quit(1); } } //--- public ------------------------------------------------------ void client_main(int count, char **arguments) { std::cout << core::name() << " " << core::version() << std::endl; for (int i =0; i < count; i++) std::cout << arguments[i] << " "; std::cout << std::endl; app.init(count, arguments); app.run(); app.shutdown(); } //--- private ----------------------------------------------------- void Client::quit(int status) { SDL_Quit(); core::Application::quit(status); } void Client::init(int count, char **arguments) { con_print << "^BInitializing client..." << std::endl; // initialize core core::Cvar::sv_dedicated = core::Cvar::set("sv_private", "0"); core::Application::init(count, arguments); Console::init(); // client variables core::Cvar *cvar = 0; cvar = core::Cvar::get("cl_name", "Player", core::Cvar::Archive | core::Cvar::Info); cvar->set_info("[str] player name"); cvar = core::Cvar::get("cl_color", "1.0 1.0 1.0", core::Cvar::Archive | core::Cvar::Info); cvar->set_info("[r g b] player color"); cl_framerate = core::Cvar::get("cl_framerate", "120", core::Cvar::Archive); cl_framerate->set_info("[int] client framerate in frames/sec"); // initialize SDL, but do not initialize any subsystems SDL_Init(0); // Initialize the video subsystem if (!video::init()) { quit(1); } // initialize console chat::init(); // initialize input input::init(); // add engine functions core::Func *func = 0; func = core::Func::add("r_restart", (core::FuncPtr) func_r_restart); func->set_info("restart render subsystem"); } void Client::run() { con_print << "^BRunning client..." << std::endl; Uint32 client_framerate = (Uint32)(1000/120); Uint32 elapsed = 0; console()->flush(); console()->clear_notify(); while (true) { Uint32 chrono = SDL_GetTicks(); core::Application::frame((float)elapsed / 1000.0f); video::frame((float)elapsed / 1000.0f); input::frame((float)elapsed / 1000.0f); Uint32 current = SDL_GetTicks(); elapsed = current - chrono; if (cl_framerate->value()) { client_framerate = (Uint32) (1000.0f / cl_framerate->value()); if (client_framerate && (elapsed < client_framerate)) { SDL_Delay(client_framerate - elapsed); elapsed = client_framerate; } }; //con_debug << "tick " << std::setw(8) << chrono << " " << std::setw(8) << current << " " << elapsed; } } void Client::shutdown() { con_print << "^BShutting down client..." << std::endl; // remove engine functions core::Func::remove("r_restart"); chat::shutdown(); Console::shutdown(); input::shutdown(); video::shutdown(); core::Application::shutdown(); quit(0); } } // namespace client