#include <SDL_image.h>
#include <physfs.h>
#include <iostream>
+#include <binreloc.h>
+#include <tinygettext/log.hpp>
+
+#include "supertux/main.hpp"
#ifdef MACOSX
namespace supertux_apple {
#include "addon/addon_manager.hpp"
#include "audio/sound_manager.hpp"
-#include "binreloc/binreloc.h"
#include "control/joystickkeyboardcontroller.hpp"
#include "math/random_generator.hpp"
#include "physfs/ifile_stream.hpp"
#include "physfs/physfs_sdl.hpp"
+#include "physfs/physfs_file_system.hpp"
#include "scripting/squirrel_util.hpp"
#include "supertux/gameconfig.hpp"
#include "supertux/globals.hpp"
-#include "supertux/mainloop.hpp"
+#include "supertux/screen_manager.hpp"
#include "supertux/resources.hpp"
#include "supertux/title_screen.hpp"
#include "util/file_system.hpp"
namespace { DrawingContext *context_pointer; }
-static void init_config()
+void
+Main::init_config()
{
g_config = new Config();
try {
}
}
-static void init_tinygettext()
+void
+Main::init_tinygettext()
{
- dictionary_manager.add_directory("locale");
- dictionary_manager.set_charset("UTF-8");
+ dictionary_manager = new tinygettext::DictionaryManager();
+ tinygettext::Log::set_log_info_callback(0);
+ dictionary_manager->set_filesystem(std::auto_ptr<tinygettext::FileSystem>(new PhysFSFileSystem));
+
+ dictionary_manager->add_directory("locale");
+ dictionary_manager->set_charset("UTF-8");
// Config setting "locale" overrides language detection
- if (g_config->locale != "") {
- dictionary_manager.set_language(tinygettext::Language::from_name(g_config->locale));
+ if (g_config->locale != "")
+ {
+ dictionary_manager->set_language(tinygettext::Language::from_name(g_config->locale));
}
}
-static void init_physfs(const char* argv0)
+void
+Main::init_physfs(const char* argv0)
{
if(!PHYSFS_init(argv0)) {
std::stringstream msg;
PHYSFS_freeList(searchpath);
}
-static void print_usage(const char* argv0)
+void
+Main::print_usage(const char* argv0)
{
- fprintf(stderr, _("Usage: %s [OPTIONS] [LEVELFILE]\n\n"), argv0);
- fprintf(stderr,
- _("Options:\n"
- " -f, --fullscreen Run in fullscreen mode\n"
- " -w, --window Run in window mode\n"
- " -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"
- " -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"
- " -s, --debug-scripts Enable script debugger.\n"
- "%s\n"), "");
+ std::cerr << _("Usage: ") << argv0 << _(" [OPTIONS] [LEVELFILE]\n\n")
+ << _("Options:\n"
+ " -f, --fullscreen Run in fullscreen mode\n"
+ " -w, --window Run in window mode\n"
+ " -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"
+ " -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"
+ " -s, --debug-scripts Enable script debugger.\n"
+ "\n")
+ << std::flush;
}
/**
* Options that should be evaluated prior to any initializations at all go here
*/
-static bool pre_parse_commandline(int argc, char** argv)
+bool
+Main::pre_parse_commandline(int argc, char** argv)
{
for(int i = 1; i < argc; ++i) {
std::string arg = argv[i];
/**
* Options that should be evaluated after config is read go here
*/
-static bool parse_commandline(int argc, char** argv)
+bool
+Main::parse_commandline(int argc, char** argv)
{
for(int i = 1; i < argc; ++i) {
std::string arg = argv[i];
} else if(arg == "--default" || arg == "-d") {
g_config->use_fullscreen = false;
- g_config->window_width = 800;
- g_config->window_height = 600;
-
- g_config->fullscreen_width = 800;
- g_config->fullscreen_height = 600;
-
- g_config->aspect_width = 0; // auto detect
- g_config->aspect_height = 0;
+ g_config->window_size = Size(800, 600);
+ g_config->fullscreen_size = Size(800, 600);
+ g_config->aspect_size = Size(0, 0); // auto detect
} else if(arg == "--window" || arg == "-w") {
g_config->use_fullscreen = false;
}
else
{
- g_config->window_width = width;
- g_config->window_height = height;
-
- g_config->fullscreen_width = width;
- g_config->fullscreen_height = height;
+ g_config->window_size = Size(width, height);
+ g_config->fullscreen_size = Size(width, height);
}
}
} else if(arg == "--aspect" || arg == "-a") {
}
else
{
- float aspect_ratio = static_cast<double>(g_config->aspect_width) /
- static_cast<double>(g_config->aspect_height);
+ float aspect_ratio = static_cast<float>(aspect_width) / static_cast<float>(aspect_height);
// use aspect ratio to calculate logical resolution
if (aspect_ratio > 1) {
- g_config->aspect_width = static_cast<int> (600 * aspect_ratio + 0.5);
- g_config->aspect_height = 600;
+ g_config->aspect_size = Size(static_cast<int>(600 * aspect_ratio + 0.5),
+ 600);
} else {
- g_config->aspect_width = 600;
- g_config->aspect_height = static_cast<int> (600 * 1/aspect_ratio + 0.5);
+ g_config->aspect_size = Size(600,
+ static_cast<int>(600 * 1/aspect_ratio + 0.5));
}
}
}
return false;
}
-static void init_sdl()
+void
+Main::init_sdl()
{
if(SDL_Init(SDL_INIT_TIMER | SDL_INIT_VIDEO | SDL_INIT_JOYSTICK) < 0) {
std::stringstream msg;
;
}
-static void init_rand()
+void
+Main::init_rand()
{
g_config->random_seed = systemRandom.srand(g_config->random_seed);
//log_info << "Using random seed " << config->random_seed << how << std::endl;
}
-void init_video()
+void
+Main::init_video()
{
// FIXME: Add something here
SCREEN_WIDTH = 800;
SDL_WM_SetIcon(icon, 0);
SDL_FreeSurface(icon);
}
-#ifdef DEBUG
+#ifndef NDEBUG
else {
log_warning << "Couldn't load icon '" << icon_fname << "'" << std::endl;
}
SDL_ShowCursor(0);
log_info << (g_config->use_fullscreen?"fullscreen ":"window ")
- << " Window: " << g_config->window_width << "x" << g_config->window_height
- << " Fullscreen: " << g_config->fullscreen_width << "x" << g_config->fullscreen_height
- << " Area: " << g_config->aspect_width << "x" << g_config->aspect_height << std::endl;
+ << " Window: " << g_config->window_size
+ << " Fullscreen: " << g_config->fullscreen_size
+ << " Area: " << g_config->aspect_size << std::endl;
}
-static void init_audio()
+void
+Main::init_audio()
{
sound_manager = new SoundManager();
sound_manager->enable_music(g_config->music_enabled);
}
-static void quit_audio()
+void
+Main::quit_audio()
{
if(sound_manager != NULL) {
delete sound_manager;
}
}
-void wait_for_event(float min_delay, float max_delay)
+void
+Main::wait_for_event(float min_delay, float max_delay)
{
assert(min_delay <= max_delay);
while(SDL_PollEvent(&event)) {
switch(event.type) {
case SDL_QUIT:
- g_main_loop->quit();
+ g_screen_manager->quit();
break;
case SDL_KEYDOWN:
case SDL_JOYBUTTONDOWN:
}
}
-#ifdef DEBUG
+#ifndef NDEBUG
static Uint32 last_timelog_ticks = 0;
static const char* last_timelog_component = 0;
}
#endif
-std::istream* physfs_open_file(const char* name)
-{
- return new IFileStream(name);
-}
-
-void physfs_free_list(char** name)
-{
- PHYSFS_freeList(name);
-}
-
-int supertux_main(int argc, char** argv)
+int
+Main::main(int argc, char** argv)
{
int result = 0;
init_physfs(argv[0]);
init_sdl();
- { // Let tinygettext use PhysFS
- tinygettext::DirOp dir_op;
- dir_op.enumerate_files = &PHYSFS_enumerateFiles;
- dir_op.free_list = &physfs_free_list;
- dir_op.open_file = &physfs_open_file;
-
- dictionary_manager.set_dir_op(dir_op);
- }
-
timelog("controller");
g_main_controller = new JoystickKeyboardController();
Console::instance->init_graphics();
timelog("scripting");
- Scripting::init_squirrel(g_config->enable_script_debugger);
+ scripting::init_squirrel(g_config->enable_script_debugger);
timelog("resources");
- load_shared();
+ Resources::load_shared();
timelog(0);
- g_main_loop = new MainLoop();
+ g_screen_manager = new ScreenManager();
if(g_config->start_level != "") {
// we have a normal path specified at commandline, not a physfs path.
// So we simply mount that path here...
if(g_config->start_level.size() > 4 &&
g_config->start_level.compare(g_config->start_level.size() - 5, 5, ".stwm") == 0) {
init_rand();
- g_main_loop->push_screen(new WorldMapNS::WorldMap(
+ g_screen_manager->push_screen(new worldmap::WorldMap(
FileSystem::basename(g_config->start_level)));
} else {
init_rand();//If level uses random eg. for
if(g_config->record_demo != "")
session->record_demo(g_config->record_demo);
- g_main_loop->push_screen(session.release());
+ g_screen_manager->push_screen(session.release());
}
} else {
init_rand();
- g_main_loop->push_screen(new TitleScreen());
+ g_screen_manager->push_screen(new TitleScreen());
}
//init_rand(); PAK: this call might subsume the above 3, but I'm chicken!
- g_main_loop->run(context);
+ g_screen_manager->run(context);
} catch(std::exception& e) {
log_fatal << "Unexpected exception: " << e.what() << std::endl;
result = 1;
result = 1;
}
- delete g_main_loop;
- g_main_loop = NULL;
+ delete g_screen_manager;
+ g_screen_manager = NULL;
- unload_shared();
+ Resources::unload_shared();
quit_audio();
if(g_config)
g_main_controller = NULL;
delete Console::instance;
Console::instance = NULL;
- Scripting::exit_squirrel();
+ scripting::exit_squirrel();
delete texture_manager;
texture_manager = NULL;
SDL_Quit();