X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fmain.cpp;h=94045d612deedbc779b87a5891a5c9b1c6551573;hb=3e89eb527d5f3bca2cb8cd219784048764a148f5;hp=900079e655381a5947277b3d642ba1612910fb76;hpb=acd1950b9b853d6b7c56a2cb43e77ec3147b2369;p=supertux.git diff --git a/src/main.cpp b/src/main.cpp index 900079e65..94045d612 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,7 +1,7 @@ // $Id$ -// +// // SuperTux -// Copyright (C) 2005 Matthias Braun +// 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 @@ -12,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 @@ -20,7 +20,7 @@ #include #include -#include "msg.hpp" +#include "log.hpp" #include "main.hpp" #include @@ -35,7 +35,7 @@ #include #include #include -#include +#include #include "gameconfig.hpp" #include "resources.hpp" @@ -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 "misc.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; @@ -65,7 +66,7 @@ static void init_config() try { config->load(); } catch(std::exception& e) { - msg_info << "Couldn't load config file: " << e.what() << ", using default settings" << std::endl; + log_info << "Couldn't load config file: " << e.what() << ", using default settings" << std::endl; } } @@ -148,11 +149,28 @@ static void init_physfs(const char* argv0) if(f) { fclose(f); if(!PHYSFS_addToSearchPath(dir.c_str(), 1)) { + log_warning << "Couldn't add '" << dir << "' to physfs searchpath: " << PHYSFS_getLastError() << std::endl; + } else { + sourcedir = true; + } + } + +#ifdef MACOSX + // when started from Application file on Mac OS X... + dir = PHYSFS_getBaseDir(); + dir += "SuperTux.app/Contents/Resources/data"; + testfname = dir + "/credits.txt"; + sourcedir = false; + f = fopen(testfname.c_str(), "r"); + if(f) { + fclose(f); + if(!PHYSFS_addToSearchPath(dir.c_str(), 1)) { msg_warning << "Couldn't add '" << dir << "' to physfs searchpath: " << PHYSFS_getLastError() << std::endl; } else { sourcedir = true; } } +#endif if(!sourcedir) { #if defined(APPDATADIR) || defined(ENABLE_BINRELOC) @@ -165,7 +183,7 @@ static void init_physfs(const char* argv0) datadir = APPDATADIR; #endif if(!PHYSFS_addToSearchPath(datadir.c_str(), 1)) { - msg_warning << "Couldn't add '" << datadir << "' to physfs searchpath: " << PHYSFS_getLastError() << std::endl; + log_warning << "Couldn't add '" << datadir << "' to physfs searchpath: " << PHYSFS_getLastError() << std::endl; } #endif } @@ -175,7 +193,7 @@ static void init_physfs(const char* argv0) //show search Path for(char** i = PHYSFS_getSearchPath(); *i != NULL; i++) - msg_info << "[" << *i << "] is in the search path" << std::endl; + log_info << "[" << *i << "] is in the search path" << std::endl; } static void print_usage(const char* argv0) @@ -233,16 +251,18 @@ 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; } else if(arg == "--version") { - msg_info << PACKAGE_NAME << " " << PACKAGE_VERSION << std::endl; + log_info << PACKAGE_NAME << " " << PACKAGE_VERSION << std::endl; return true; } else if(arg[0] != '-') { config->start_level = arg; } else { - msg_warning << "Unknown option '" << arg << "'. Use --help to see a list of options" << std::endl; + log_warning << "Unknown option '" << arg << "'. Use --help to see a list of options" << std::endl; } } @@ -251,11 +271,13 @@ 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()); } + // just to be sure + atexit(SDL_Quit); SDL_EnableUNICODE(1); @@ -267,42 +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; - case GL_TABLE_TOO_LARGE: - errormsg = "table too large"; - break; - 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() @@ -341,7 +334,7 @@ void init_video() } #ifdef DEBUG else { - msg_warning << "Couldn't find icon 'images/engine/icons/supertux.xpm'" << std::endl; + log_warning << "Couldn't find icon 'images/engine/icons/supertux.xpm'" << std::endl; } #endif @@ -361,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(); @@ -377,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) { @@ -445,7 +427,7 @@ static inline void timelog(const char* component) Uint32 current_ticks = SDL_GetTicks(); if(last_timelog_component != 0) { - msg_info << "Component '" << last_timelog_component << "' finished after " << (current_ticks - last_timelog_ticks) / 1000.0 << " seconds" << std::endl; + log_info << "Component '" << last_timelog_component << "' finished after " << (current_ticks - last_timelog_ticks) / 1000.0 << " seconds" << std::endl; } last_timelog_ticks = current_ticks; @@ -459,10 +441,14 @@ static inline void timelog(const char* ) int main(int argc, char** argv) { + int result = 0; + try { - srand(time(0)); + Console::instance = new Console(); +// srand(time(0)); // this breaks repeatability in random numbers init_physfs(argv[0]); init_sdl(); + timelog("controller"); main_controller = new JoystickKeyboardController(); timelog("config"); @@ -476,13 +462,11 @@ int main(int argc, char** argv) init_audio(); timelog("video"); init_video(); + Console::instance->init_graphics(); timelog("scripting"); - init_scripting(); - - timelog("menu"); - setup_menu(); + Scripting::init_squirrel(config->enable_script_debugger); timelog("resources"); - load_shared(); + load_shared(); timelog(0); main_loop = new MainLoop(); @@ -491,33 +475,43 @@ 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); - GameSession* session - = new GameSession( - FileSystem::basename(config->start_level), ST_GL_LOAD_LEVEL_FILE); - 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); + + init_rand(); // play_demo sets seed, record_demo uses it + + if(config->start_level.size() > 4 && + config->start_level.compare(config->start_level.size() - 5, 5, ".stwm") == 0) { + main_loop->push_screen(new WorldMapNS::WorldMap( + FileSystem::basename(config->start_level))); + } else { + 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()); + } } else { + init_rand(); main_loop->push_screen(new TitleScreen()); } main_loop->run(); - delete main_loop; - main_loop = NULL; } catch(std::exception& e) { - msg_fatal << "Unexpected exception: " << e.what() << std::endl; - return 1; + log_fatal << "Unexpected exception: " << e.what() << std::endl; + result = 1; } catch(...) { - msg_fatal << "Unexpected exception" << std::endl; - return 1; + log_fatal << "Unexpected exception" << std::endl; + result = 1; } - free_menu(); - delete ScriptManager::instance; - ScriptManager::instance = NULL; + delete main_loop; + main_loop = NULL; + + free_options_menu(); unload_shared(); quit_audio(); @@ -527,10 +521,13 @@ int main(int argc, char** argv) config = NULL; delete main_controller; main_controller = NULL; + delete Console::instance; + Console::instance = NULL; + Scripting::exit_squirrel(); delete texture_manager; texture_manager = NULL; SDL_Quit(); PHYSFS_deinit(); - return 0; + return result; }