X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fmain.cpp;h=1eadf1abf0ae1fee0e28f5209e0e1ed6f1c8098d;hb=d84d73b701cc7fa2bd74f3490b9be1bf8b6f705a;hp=1ab47a71612c3b8f28d27dc5059d403db7e713fa;hpb=fc73efa7ff699fe3c9c237845b6f4fda0d999862;p=supertux.git diff --git a/src/main.cpp b/src/main.cpp index 1ab47a716..1eadf1abf 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -43,17 +43,18 @@ #include "audio/sound_manager.hpp" #include "video/surface.hpp" #include "video/texture_manager.hpp" +#include "video/glutil.hpp" #include "control/joystickkeyboardcontroller.hpp" #include "options_menu.hpp" #include "mainloop.hpp" #include "title.hpp" #include "game_session.hpp" -#include "script_manager.hpp" -#include "scripting/sound.hpp" #include "scripting/level.hpp" -#include "scripting/wrapper_util.hpp" +#include "scripting/squirrel_util.hpp" #include "file_system.hpp" #include "physfs/physfs_sdl.hpp" +#include "random_generator.hpp" +#include "worldmap/worldmap.hpp" SDL_Surface* screen = 0; JoystickKeyboardController* main_controller = 0; @@ -85,7 +86,7 @@ static void init_physfs(const char* argv0) // Initialize physfs (this is a slightly modified version of // PHYSFS_setSaneConfig - const char* application = PACKAGE_NAME; + const char* application = "supertux2"; //instead of PACKAGE_NAME so we can coexist with MS1 const char* userdir = PHYSFS_getUserDir(); const char* dirsep = PHYSFS_getDirSeparator(); char* writedir = new char[strlen(userdir) + strlen(application) + 2]; @@ -250,6 +251,8 @@ static bool parse_commandline(int argc, char** argv) throw std::runtime_error("Need to specify a demo filename"); } config->record_demo = argv[++i]; + } else if(arg == "-d") { + config->enable_script_debugger = true; } else if(arg == "--help") { print_usage(argv[0]); return true; @@ -268,7 +271,7 @@ static bool parse_commandline(int argc, char** argv) static void init_sdl() { - if(SDL_Init(SDL_INIT_EVERYTHING) < 0) { + if(SDL_Init(SDL_INIT_TIMER | SDL_INIT_VIDEO | SDL_INIT_JOYSTICK) < 0) { std::stringstream msg; msg << "Couldn't initialize SDL: " << SDL_GetError(); throw std::runtime_error(msg.str()); @@ -286,44 +289,13 @@ static void init_sdl() ; } -static void check_gl_error() +static void init_rand() { - GLenum glerror = glGetError(); - std::string errormsg; - - if(glerror != GL_NO_ERROR) { - switch(glerror) { - case GL_INVALID_ENUM: - errormsg = "Invalid enumeration value"; - break; - case GL_INVALID_VALUE: - errormsg = "Numeric argzment out of range"; - break; - case GL_INVALID_OPERATION: - errormsg = "Invalid operation"; - break; - case GL_STACK_OVERFLOW: - errormsg = "stack overflow"; - break; - case GL_STACK_UNDERFLOW: - errormsg = "stack underflow"; - break; - case GL_OUT_OF_MEMORY: - errormsg = "out of memory"; - break; -#ifdef GL_TABLE_TOO_LARGE - case GL_TABLE_TOO_LARGE: - errormsg = "table too large"; - break; -#endif - default: - errormsg = "unknown error number"; - break; - } - std::stringstream msg; - msg << "OpenGL Error: " << errormsg; - throw std::runtime_error(msg.str()); - } + const char *how = config->random_seed? ", user fixed.": ", from time()."; + + config->random_seed = systemRandom.srand(config->random_seed); + + log_info << "Using random seed " << config->random_seed << how << std::endl; } void init_video() @@ -382,7 +354,7 @@ void init_video() glLoadIdentity(); glTranslatef(0, 0, 0); - check_gl_error(); + check_gl_error("Setting up view matrices"); if(texture_manager != NULL) texture_manager->reload_textures(); @@ -398,17 +370,6 @@ static void init_audio() sound_manager->enable_music(config->music_enabled); } -static void init_scripting() -{ - ScriptManager::instance = new ScriptManager(); - - HSQUIRRELVM vm = ScriptManager::instance->get_vm(); - sq_pushroottable(vm); - expose_object(vm, -1, new Scripting::Sound(), "Sound", true); - expose_object(vm, -1, new Scripting::Level(), "Level", true); - sq_pop(vm, 1); -} - static void quit_audio() { if(sound_manager != NULL) { @@ -483,9 +444,10 @@ int main(int argc, char** argv) int result = 0; try { - srand(time(0)); + Console::instance = new Console(); init_physfs(argv[0]); init_sdl(); + timelog("controller"); main_controller = new JoystickKeyboardController(); timelog("config"); @@ -499,10 +461,9 @@ int main(int argc, char** argv) init_audio(); timelog("video"); init_video(); - Console::instance = new Console(); + Console::instance->init_graphics(); timelog("scripting"); - init_scripting(); - + Scripting::init_squirrel(config->enable_script_debugger); timelog("resources"); load_shared(); timelog(0); @@ -513,18 +474,36 @@ int main(int argc, char** argv) // So we simply mount that path here... std::string dir = FileSystem::dirname(config->start_level); PHYSFS_addToSearchPath(dir.c_str(), true); - std::auto_ptr session - (new GameSession(FileSystem::basename(config->start_level))); - if(config->start_demo != "") - session->play_demo(config->start_demo); - if(config->record_demo != "") - session->record_demo(config->record_demo); - main_loop->push_screen(session.release()); + + if(config->start_level.size() > 4 && + config->start_level.compare(config->start_level.size() - 5, 5, ".stwm") == 0) { + init_rand(); + main_loop->push_screen(new WorldMapNS::WorldMap( + FileSystem::basename(config->start_level))); + } else { + init_rand();//If level uses random eg. for + // rain particles before we do this: + std::auto_ptr session ( + new GameSession(FileSystem::basename(config->start_level))); + + config->random_seed =session->get_demo_random_seed(config->start_demo); + init_rand();//initialise generator with seed from session + + if(config->start_demo != "") + session->play_demo(config->start_demo); + + if(config->record_demo != "") + session->record_demo(config->record_demo); + main_loop->push_screen(session.release()); + } } else { + init_rand(); main_loop->push_screen(new TitleScreen()); } + //init_rand(); PAK: this call might subsume the above 3, but I'm chicken! main_loop->run(); + } catch(std::exception& e) { log_fatal << "Unexpected exception: " << e.what() << std::endl; result = 1; @@ -548,8 +527,7 @@ int main(int argc, char** argv) main_controller = NULL; delete Console::instance; Console::instance = NULL; - delete ScriptManager::instance; - ScriptManager::instance = NULL; + Scripting::exit_squirrel(); delete texture_manager; texture_manager = NULL; SDL_Quit();