// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
// 02111-1307, USA.
#include <config.h>
+#include <version.h>
#include <assert.h>
#include "log.hpp"
" -g, --geometry WIDTHxHEIGHT Run SuperTux in given resolution\n"
" -a, --aspect WIDTH:HEIGHT Run SuperTux with given aspect ratio\n"
" -d, --default Reset video settings to default values\n"
+ " --renderer RENDERER Use sdl, opengl, or auto to render\n"
" --disable-sfx Disable sound effects\n"
" --disable-music Disable music\n"
- " --help Show this help message\n"
- " --version Display SuperTux version and quit\n"
+ " -h, --help Show this help message and quit\n"
+ " -v, --version Show SuperTux version and quit\n"
" --console Enable ingame scripting console\n"
" --noconsole Disable ingame scripting console\n"
" --show-fps Display framerate in levels\n"
" --no-show-fps Do not display framerate in levels\n"
" --record-demo FILE LEVEL Record a demo to FILE\n"
" --play-demo FILE LEVEL Play a recorded demo\n"
- "\n"));
+ " -s, --debug-scripts Enable script debugger.\n"
+ "%s\n"), "");
}
/**
for(int i = 1; i < argc; ++i) {
std::string arg = argv[i];
- if(arg == "--version") {
+ if(arg == "--version" || arg == "-v") {
std::cout << PACKAGE_NAME << " " << PACKAGE_VERSION << std::endl;
return true;
}
+ if(arg == "--help" || arg == "-h") {
+ print_usage(argv[0]);
+ return true;
+ }
}
return false;
for(int i = 1; i < argc; ++i) {
std::string arg = argv[i];
- if(arg == "--help") {
- print_usage(argv[0]);
- return true;
- } else if(arg == "--fullscreen" || arg == "-f") {
+ if(arg == "--fullscreen" || arg == "-f") {
config->use_fullscreen = true;
} else if(arg == "--default" || arg == "-d") {
config->use_fullscreen = false;
config->fullscreen_width = 800;
config->fullscreen_height = 600;
- config->aspect_width = 4;
- config->aspect_height = 3;
+ config->aspect_width = 0; // auto detect
+ config->aspect_height = 0;
} else if(arg == "--window" || arg == "-w") {
config->use_fullscreen = false;
if(i >= argc)
{
print_usage(argv[0]);
- throw std::runtime_error("Need to specify a parameter for geometry switch");
+ throw std::runtime_error("Need to specify a size (WIDTHxHEIGHT) for geometry argument");
}
else
{
if(i >= argc)
{
print_usage(argv[0]);
- throw std::runtime_error("Need to specify a parameter for aspect switch");
+ throw std::runtime_error("Need to specify a ratio (WIDTH:HEIGHT) for aspect ratio");
}
else
{
- int aspect_width = 4;
- int aspect_height = 3;
- if(sscanf(argv[++i], "%d:%d", &aspect_width, &aspect_height) != 2) {
- print_usage(argv[0]);
- throw std::runtime_error("Invalid aspect spec, should be WIDTH:HEIGHT");
- } else {
- float aspect_ratio = static_cast<double>(config->aspect_width) /
- static_cast<double>(config->aspect_height);
-
- // use aspect ratio to calculate logical resolution
- if (aspect_ratio > 1) {
- config->aspect_width = static_cast<int> (600 * aspect_ratio + 0.5);
- config->aspect_height = 600;
- } else {
- config->aspect_width = 600;
- config->aspect_height = static_cast<int> (600 * 1/aspect_ratio + 0.5);
+ int aspect_width = 0;
+ int aspect_height = 0;
+ if (strcmp(argv[i], "auto") == 0)
+ {
+ aspect_width = 0;
+ aspect_height = 0;
+ }
+ else if (sscanf(argv[i], "%d:%d", &aspect_width, &aspect_height) != 2)
+ {
+ print_usage(argv[0]);
+ throw std::runtime_error("Invalid aspect spec, should be WIDTH:HEIGHT or auto");
}
- }
+ else
+ {
+ float aspect_ratio = static_cast<double>(config->aspect_width) /
+ static_cast<double>(config->aspect_height);
+
+ // use aspect ratio to calculate logical resolution
+ if (aspect_ratio > 1) {
+ config->aspect_width = static_cast<int> (600 * aspect_ratio + 0.5);
+ config->aspect_height = 600;
+ } else {
+ config->aspect_width = 600;
+ config->aspect_height = static_cast<int> (600 * 1/aspect_ratio + 0.5);
+ }
+ }
+ }
+ } else if(arg == "--renderer") {
+ i += 1;
+ if(i >= argc)
+ {
+ print_usage(argv[0]);
+ throw std::runtime_error("Need to specify a renderer for renderer argument");
+ }
+ else
+ {
+ config->video = get_video_system(argv[i]);
}
} else if(arg == "--show-fps") {
config->show_fps = true;
throw std::runtime_error("Need to specify a demo filename");
}
config->record_demo = argv[++i];
- } else if(arg == "-d") {
+ } else if(arg == "--debug-scripts" || arg == "-s") {
config->enable_script_debugger = true;
} else if(arg[0] != '-') {
config->start_level = arg;
SDL_WM_SetCaption(PACKAGE_NAME " " PACKAGE_VERSION, 0);
// set icon
- #ifdef MACOSX
+#ifdef MACOSX
const char* icon_fname = "images/engine/icons/supertux-256x256.png";
- #else
+#else
const char* icon_fname = "images/engine/icons/supertux.xpm";
- #endif
- SDL_Surface* icon = IMG_Load_RW(get_physfs_SDLRWops(icon_fname), true);
+#endif
+ SDL_Surface* icon;
+ try {
+ icon = IMG_Load_RW(get_physfs_SDLRWops(icon_fname), true);
+ } catch (const std::runtime_error& err) {
+ icon = 0;
+ log_warning << "Couldn't load icon '" << icon_fname << "': " << err.what() << std::endl;
+ }
if(icon != 0) {
SDL_WM_SetIcon(icon, 0);
SDL_FreeSurface(icon);
}
#ifdef DEBUG
else {
- log_warning << "Couldn't find icon '" << icon_fname << "'" << std::endl;
+ log_warning << "Couldn't load icon '" << icon_fname << "'" << std::endl;
}
#endif
{
int result = 0;
-#ifndef NO_CATCH
try {
-#endif
if(pre_parse_commandline(argc, argv))
return 0;
timelog("controller");
main_controller = new JoystickKeyboardController();
+
timelog("config");
init_config();
+
timelog("addons");
AddonManager::get_instance().load_addons();
+
timelog("tinygettext");
init_tinygettext();
+
timelog("commandline");
if(parse_commandline(argc, argv))
return 0;
+
timelog("audio");
init_audio();
+
timelog("video");
DrawingContext context;
context_pointer = &context;
init_video();
+
Console::instance->init_graphics();
+
timelog("scripting");
Scripting::init_squirrel(config->enable_script_debugger);
+
timelog("resources");
load_shared();
+
timelog(0);
main_loop = new MainLoop();
if(config->start_level != "") {
- // we have a normal path specified at commandline not physfs paths.
+ // we have a normal path specified at commandline, not a physfs path.
// So we simply mount that path here...
std::string dir = FileSystem::dirname(config->start_level);
+ log_debug << "Adding dir: " << dir << std::endl;
PHYSFS_addToSearchPath(dir.c_str(), true);
if(config->start_level.size() > 4 &&
//init_rand(); PAK: this call might subsume the above 3, but I'm chicken!
main_loop->run(context);
-#ifndef NO_CATCH
} catch(std::exception& e) {
log_fatal << "Unexpected exception: " << e.what() << std::endl;
result = 1;
log_fatal << "Unexpected exception" << std::endl;
result = 1;
}
-#endif
delete main_loop;
main_loop = NULL;