int main(int argc, char** argv) { std::vector<Pathname> files; enum { kTitle = (1<<0), kDescription = (1<<1), kLevels = (1<<2), kFilename = (1<<3) }; unsigned int mode = 0; CommandLine argp; argp.add_usage("[OPTIONS]... [FILE]..."); argp.add_option('h', "help", "", "Displays this help"); argp.add_option('t', "title", "", "Display title of the levelset"); argp.add_option('d', "description", "", "Display description of the levelset"); argp.add_option('l', "levels", "", "Display levels in this levelset"); argp.add_option('f', "filename", "", "Display filename of the level"); argp.parse_args(argc, argv); argp.set_help_indent(20); while (argp.next()) { switch (argp.get_key()) { case 'h': argp.print_help(); exit(EXIT_SUCCESS); break; case 't': mode |= kTitle; break; case 'd': mode |= kDescription; break; case 'l': mode |= kLevels; break; case 'f': mode |= kFilename; break; case CommandLine::REST_ARG: files.push_back(Pathname(argp.get_argument(), Pathname::SYSTEM_PATH)); break; } } if (files.empty()) { argp.print_help(); exit(EXIT_SUCCESS); } else { // FIXME: a little ugly that levelset loads sprites and savegames System::init_directories(); g_path_manager.set_path("data/"); SavegameManager savegame_manager("savegames/savegames.scm"); StatManager stat_manager("savegames/variables.scm"); Resource::init(); Display::create_window(NULL_FRAMEBUFFER, Size(), false, false); for(auto it = files.begin(); it != files.end(); ++it) { const Pathname& path = *it; std::unique_ptr<Levelset> levelset = Levelset::from_file(path); if (mode == 0) { std::cout << "filename : " << path << std::endl; std::cout << "title : " << levelset->get_title() << std::endl; std::cout << "description : " << levelset->get_description() << std::endl; std::cout << "levels : " << std::endl; for(int i = 0; i < levelset->get_level_count(); ++i) { std::cout << " " << levelset->get_level(i)->resname << std::endl; } std::cout << std::endl; } else { if (mode & kFilename) { std::cout << path << ": "; } if (mode & kTitle) { std::cout << levelset->get_title() << std::endl; } if (mode & kDescription) { std::cout << levelset->get_description() << std::endl; } if (mode & kLevels) { for(int i = 0; i < levelset->get_level_count(); ++i) { std::cout << " " << levelset->get_level(i)->resname << std::endl; } std::cout << std::endl; } } } Resource::deinit(); } return 0; }
int PingusMain::run(int argc, char** argv) { g_logger.set_log_level(Logger::kWarning); tinygettext::Log::set_log_info_callback(0); try { // FIXME force set language using System::get_language() to get it from env dictionary_manager.set_language(tinygettext::Language::from_env(System::get_language())); parse_args(argc, argv); // here language and po dir isn't set, no traslation in command line init_path_finder(); // here init language path read_rc_file(); // here set language if ~/.pingus/config exist and language value is set apply_args(); // here set language if arg -l is specified print_greeting_message(); // init the display FramebufferType fbtype = SDL_FRAMEBUFFER; if (cmd_options.framebuffer_type.is_set()) { fbtype = cmd_options.framebuffer_type.get(); } bool fullscreen = cmd_options.fullscreen.is_set() ? cmd_options.fullscreen.get() : false; bool resizable = cmd_options.resizable.is_set() ? cmd_options.resizable.get() : true; Size screen_size(800, 600); if (fullscreen) { if (cmd_options.fullscreen_resolution.is_set()) { screen_size = cmd_options.fullscreen_resolution.get(); } } else { if (cmd_options.geometry.is_set()) { screen_size = cmd_options.geometry.get(); } } SDLSystem system; try { system.create_window(fbtype, screen_size, fullscreen, resizable); } catch(const std::exception& err) { if (fbtype == SDL_FRAMEBUFFER) { throw; } else { log_error("couldn't create window, falling back to SDL: " << err.what()); system.create_window(SDL_FRAMEBUFFER, screen_size, fullscreen, resizable); config_manager.set_renderer(SDL_FRAMEBUFFER); } } // init other components SavegameManager savegame_manager("savegames/savegames.scm"); StatManager stat_manager("savegames/variables.scm"); // FIXME: turn these into RAII Resource::init(); Fonts::init(); Sound::PingusSound::init(); config_manager.apply(cmd_options); // start and run the actual game start_game(); } catch (const std::bad_alloc&) { std::cout << _("Pingus: Out of memory!") << std::endl; } catch (const std::exception& a) { std::cout << _("Pingus: Standard exception caught!:\n") << a.what() << std::endl; } catch (...) { std::cout << _("Pingus: Unknown throw caught!") << std::endl; } Sound::PingusSound::deinit(); Fonts::deinit(); WorldObjFactory::deinit(); Resource::deinit(); return 0; }