X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fmain.cpp;h=cfd643ac76ba6fb9f7fc6d24c75dc66ba15eb82f;hb=b9d8e59bbf727fcc1a073bbf27e5d1703b9490ef;hp=b85dee77ce4cea594d730ab4ec87d9bdc67abbdb;hpb=3da05a09b5cf5160a897e8c65b9ce60f19157946;p=dragonfireclient.git diff --git a/src/main.cpp b/src/main.cpp index b85dee77c..cfd643ac7 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,18 +1,18 @@ /* -Minetest-c55 -Copyright (C) 2010-2011 celeron55, Perttu Ahola +Minetest +Copyright (C) 2010-2013 celeron55, Perttu Ahola This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, 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. +GNU Lesser General Public License for more details. -You should have received a copy of the GNU General Public License along +You should have received a copy of the GNU Lesser General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ @@ -47,7 +47,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include #include #include -#include "common_irrlicht.h" +#include "irrlichttypes_extrabloated.h" #include "debug.h" #include "test.h" #include "server.h" @@ -68,8 +68,13 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "profiler.h" #include "log.h" #include "mods.h" -#include "utility_string.h" +#if USE_FREETYPE +#include "xCGUITTFont.h" +#endif +#include "util/string.h" #include "subgame.h" +#include "quicktune.h" +#include "serverlist.h" /* Settings. @@ -89,8 +94,6 @@ Profiler *g_profiler = &main_profiler; // Connection std::ostream *dout_con_ptr = &dummyout; std::ostream *derr_con_ptr = &verbosestream; -//std::ostream *dout_con_ptr = &infostream; -//std::ostream *derr_con_ptr = &errorstream; // Server std::ostream *dout_server_ptr = &infostream; @@ -740,6 +743,20 @@ void SpeedTests() } } +static void print_worldspecs(const std::vector &worldspecs, + std::ostream &os) +{ + for(u32 i=0; i allowed_options; allowed_options.insert("help", ValueSpec(VALUETYPE_FLAG, - "Show allowed options")); + _("Show allowed options"))); allowed_options.insert("config", ValueSpec(VALUETYPE_STRING, - "Load configuration from specified file")); + _("Load configuration from specified file"))); allowed_options.insert("port", ValueSpec(VALUETYPE_STRING, - "Set network port (UDP)")); + _("Set network port (UDP)"))); allowed_options.insert("disable-unittests", ValueSpec(VALUETYPE_FLAG, - "Disable unit tests")); + _("Disable unit tests"))); allowed_options.insert("enable-unittests", ValueSpec(VALUETYPE_FLAG, - "Enable unit tests")); + _("Enable unit tests"))); allowed_options.insert("map-dir", ValueSpec(VALUETYPE_STRING, - "Same as --world (deprecated)")); + _("Same as --world (deprecated)"))); allowed_options.insert("world", ValueSpec(VALUETYPE_STRING, - "Set world path")); + _("Set world path (implies local game) ('list' lists all)"))); + allowed_options.insert("worldname", ValueSpec(VALUETYPE_STRING, + _("Set world by name (implies local game)"))); + allowed_options.insert("info", ValueSpec(VALUETYPE_FLAG, + _("Print more information to console"))); allowed_options.insert("verbose", ValueSpec(VALUETYPE_FLAG, - "Print more information to console")); + _("Print even more information to console"))); + allowed_options.insert("trace", ValueSpec(VALUETYPE_FLAG, + _("Print enormous amounts of information to log and console"))); allowed_options.insert("logfile", ValueSpec(VALUETYPE_STRING, - "Set logfile path ('' = no logging)")); + _("Set logfile path ('' = no logging)"))); allowed_options.insert("gameid", ValueSpec(VALUETYPE_STRING, - "Set gameid (\"--gameid list\" prints available ones)")); + _("Set gameid (\"--gameid list\" prints available ones)"))); #ifndef SERVER allowed_options.insert("speedtests", ValueSpec(VALUETYPE_FLAG, - "Run speed tests")); + _("Run speed tests"))); allowed_options.insert("address", ValueSpec(VALUETYPE_STRING, - "Address to connect to. ('' = local game)")); + _("Address to connect to. ('' = local game)"))); allowed_options.insert("random-input", ValueSpec(VALUETYPE_FLAG, - "Enable random user input, for testing")); + _("Enable random user input, for testing"))); allowed_options.insert("server", ValueSpec(VALUETYPE_FLAG, - "Run dedicated server")); + _("Run dedicated server"))); allowed_options.insert("name", ValueSpec(VALUETYPE_STRING, - "Set player name")); + _("Set player name"))); allowed_options.insert("password", ValueSpec(VALUETYPE_STRING, - "Set password")); + _("Set password"))); allowed_options.insert("go", ValueSpec(VALUETYPE_FLAG, - "Disable main menu")); + _("Disable main menu"))); #endif Settings cmd_args; bool ret = cmd_args.parseCommandLine(argc, argv, allowed_options); - if(ret == false || cmd_args.getFlag("help")) + if(ret == false || cmd_args.getFlag("help") || cmd_args.exists("nonopt1")) { - dstream<<"Allowed options:"<::Iterator i = allowed_options.getIterator(); i.atEnd() == false; i++) @@ -817,7 +848,7 @@ int main(int argc, char *argv[]) if(i.getNode()->getValue().type == VALUETYPE_FLAG) {} else - os1<<" "; + os1<<_(" "); dstream<getValue().help != NULL) @@ -832,9 +863,20 @@ int main(int argc, char *argv[]) Low-level initialization */ + // If trace is enabled, enable logging of certain things + if(cmd_args.getFlag("trace")){ + dstream<<_("Enabling trace level debug output")< worldspecs = getAvailableWorlds(); + print_worldspecs(worldspecs, dstream); + return 0; + } + // Print startup message - actionstream<getS32("debug_log_level"); + + if (loglevel == 0) //no logging + logfile = ""; + else if (loglevel > 0 && loglevel <= LMT_NUM_VALUES) + log_add_output_maxlev(&main_dstream_no_stderr_log_out, (LogMessageLevel)(loglevel - 1)); + + if(logfile != "") + debugstreams_init(false, logfile.c_str()); + else + debugstreams_init(false, NULL); + + infostream<<"logfile = "<exists("map-dir")) - world_path = g_settings->get("map-dir"); - else{ - // No map-dir option was specified. - // Check if the world is found from the default directory, and if - // not, see if the legacy world directory exists. - std::string legacy_world_path = porting::path_user+DIR_DELIM+".."+DIR_DELIM+"world"; - if(!fs::PathExists(world_path) && fs::PathExists(legacy_world_path)){ - errorstream<<"Warning: Using legacy world directory \"" - <get("map-dir"); + + // World name + std::string commanded_worldname = ""; + if(cmd_args.exists("worldname")) + commanded_worldname = cmd_args.get("worldname"); + + // Strip world.mt from commanded_world + { + std::string worldmt = "world.mt"; + if(commanded_world.size() > worldmt.size() && + commanded_world.substr(commanded_world.size()-worldmt.size()) + == worldmt){ + dstream<<_("Supplied world.mt file - stripping it off.")< worldspecs = getAvailableWorlds(); + bool found = false; + for(u32 i=0; iset("server_dedicated", run_dedicated_server ? "true" : "false"); if(run_dedicated_server) { DSTACK("Dedicated server branch"); - // Create time getter if built with Irrlicht #ifndef SERVER g_timegetter = new SimpleTimeGetter(); #endif - + + // World directory + std::string world_path; + verbosestream<<_("Determining world path")< worldspecs = getAvailableWorlds(); + // If a world name was specified, select it + if(commanded_worldname != ""){ + world_path = ""; + for(u32 i=0; i 1){ + dstream<<_("Multiple worlds are available.")<" + " or --world ")<get("default_game")); + infostream<<"Using default gameid ["<get("address"); - if(cmd_args.exists("address")) + if(commanded_world != "") + address = ""; + else if(cmd_args.exists("address")) address = cmd_args.get("address"); std::string playername = g_settings->get("name"); @@ -1072,10 +1251,16 @@ int main(int argc, char *argv[]) // Resolution selection - bool fullscreen = false; + bool fullscreen = g_settings->getBool("fullscreen"); u16 screenW = g_settings->getU16("screenW"); u16 screenH = g_settings->getU16("screenH"); + // bpp, fsaa, vsync + + bool vsync = g_settings->getBool("vsync"); + u16 bits = g_settings->getU16("fullscreen_bpp"); + u16 fsaa = g_settings->getU16("fsaa"); + // Determine driver video::E_DRIVER_TYPE driverType; @@ -1108,9 +1293,18 @@ int main(int argc, char *argv[]) MyEventReceiver receiver; IrrlichtDevice *device; - device = createDevice(driverType, - core::dimension2d(screenW, screenH), - 16, fullscreen, false, false, &receiver); + + SIrrlichtCreationParameters params = SIrrlichtCreationParameters(); + params.DriverType = driverType; + params.WindowSize = core::dimension2d(screenW, screenH); + params.Bits = bits; + params.AntiAlias = fsaa; + params.Fullscreen = fullscreen; + params.Stencilbuffer = false; + params.Vsync = vsync; + params.EventReceiver = &receiver; + + device = createDeviceEx(params); if (device == 0) return 1; // could not create selected driver. @@ -1121,9 +1315,6 @@ int main(int argc, char *argv[]) video::IVideoDriver* driver = device->getVideoDriver(); - // Disable mipmaps (because some of them look ugly) - driver->setTextureCreationFlag(video::ETCF_CREATE_MIP_MAPS, false); - /* This changes the minimum allowed number of vertices in a VBO. Default is 500. @@ -1160,7 +1351,13 @@ int main(int argc, char *argv[]) guienv = device->getGUIEnvironment(); gui::IGUISkin* skin = guienv->getSkin(); + #if USE_FREETYPE + std::string font_path = g_settings->get("font_path"); + u16 font_size = g_settings->getU16("font_size"); + gui::IGUIFont *font = gui::CGUITTFont::createTTFont(guienv, font_path.c_str(), font_size); + #else gui::IGUIFont* font = guienv->getFont(getTexturePath("fontlucida.png").c_str()); + #endif if(font) skin->setFont(font); else @@ -1179,7 +1376,15 @@ int main(int argc, char *argv[]) //skin->setColor(gui::EGDC_3D_SHADOW, video::SColor(0,0,0,0)); skin->setColor(gui::EGDC_3D_HIGH_LIGHT, video::SColor(255,0,0,0)); skin->setColor(gui::EGDC_3D_SHADOW, video::SColor(255,0,0,0)); - + skin->setColor(gui::EGDC_HIGH_LIGHT, video::SColor(255,70,100,50)); + skin->setColor(gui::EGDC_HIGH_LIGHT_TEXT, video::SColor(255,255,255,255)); + +#if (IRRLICHT_VERSION_MAJOR >= 1 && IRRLICHT_VERSION_MINOR >= 8) || IRRLICHT_VERSION_MAJOR >= 2 + // Irrlicht 1.8 input colours + skin->setColor(gui::EGDC_EDITABLE, video::SColor(255,128,128,128)); + skin->setColor(gui::EGDC_FOCUSED_EDITABLE, video::SColor(255,96,134,49)); +#endif + /* GUI stuff */ @@ -1196,13 +1401,15 @@ int main(int argc, char *argv[]) // The password entered during the menu screen, std::string password; + bool first_loop = true; + /* Menu-game loop */ while(device->run() && kill == false) { // Set the window caption - device->setWindowCaption(L"Minetest [Main Menu]"); + device->setWindowCaption((std::wstring(L"Minetest [")+wgettext("Main Menu")+L"]").c_str()); // This is used for catching disconnects try @@ -1221,6 +1428,16 @@ int main(int argc, char *argv[]) guiroot = guienv->addStaticText(L"", core::rect(0, 0, 10000, 10000)); + SubgameSpec gamespec; + WorldSpec worldspec; + bool simple_singleplayer_mode = false; + + // These are set up based on the menu and other things + std::string current_playername = "inv£lid"; + std::string current_password = ""; + std::string current_address = "does-not-exist"; + int current_port = 0; + /* Out-of-game menu loop. @@ -1228,33 +1445,96 @@ int main(int argc, char *argv[]) */ while(kill == false) { + // If skip_main_menu, only go through here once + if(skip_main_menu && !first_loop){ + kill = true; + break; + } + first_loop = false; + // Cursor can be non-visible when coming from the game device->getCursorControl()->setVisible(true); // Some stuff are left to scene manager when coming from the game // (map at least?) smgr->clear(); - // Reset or hide the debug gui texts - /*guitext->setText(L"Minetest-c55"); - guitext2->setVisible(false); - guitext_info->setVisible(false); - guitext_chat->setVisible(false);*/ // Initialize menu data MainMenuData menudata; + if(g_settings->exists("selected_mainmenu_tab")) + menudata.selected_tab = g_settings->getS32("selected_mainmenu_tab"); menudata.address = narrow_to_wide(address); menudata.name = narrow_to_wide(playername); menudata.port = narrow_to_wide(itos(port)); + if(cmd_args.exists("password")) + menudata.password = narrow_to_wide(cmd_args.get("password")); menudata.fancy_trees = g_settings->getBool("new_style_leaves"); menudata.smooth_lighting = g_settings->getBool("smooth_lighting"); menudata.clouds_3d = g_settings->getBool("enable_3d_clouds"); menudata.opaque_water = g_settings->getBool("opaque_water"); + menudata.mip_map = g_settings->getBool("mip_map"); + menudata.anisotropic_filter = g_settings->getBool("anisotropic_filter"); + menudata.bilinear_filter = g_settings->getBool("bilinear_filter"); + menudata.trilinear_filter = g_settings->getBool("trilinear_filter"); + menudata.enable_shaders = g_settings->getS32("enable_shaders"); + menudata.preload_item_visuals = g_settings->getBool("preload_item_visuals"); + menudata.enable_particles = g_settings->getBool("enable_particles"); + driver->setTextureCreationFlag(video::ETCF_CREATE_MIP_MAPS, menudata.mip_map); menudata.creative_mode = g_settings->getBool("creative_mode"); menudata.enable_damage = g_settings->getBool("enable_damage"); - if(cmd_args.exists("password")) - menudata.password = narrow_to_wide(cmd_args.get("password")); + menudata.enable_public = g_settings->getBool("server_announce"); + // Default to selecting nothing + menudata.selected_world = -1; + // Get world listing for the menu + std::vector worldspecs = getAvailableWorlds(); + // If there is only one world, select it + if(worldspecs.size() == 1){ + menudata.selected_world = 0; + } + // Otherwise try to select according to selected_world_path + else if(g_settings->exists("selected_world_path")){ + std::string trypath = g_settings->get("selected_world_path"); + for(u32 i=0; iget("default_game"); + name += " [new]"; + } + WorldSpec spec(commanded_world, name, gameid); + worldspecs.push_back(spec); + menudata.selected_world = worldspecs.size()-1; + } + // Copy worldspecs to menu + menudata.worlds = worldspecs; if(skip_main_menu == false) { + video::IVideoDriver* driver = device->getVideoDriver(); + + infostream<<"Waiting for other menus"<run() && kill == false) + { + if(noMenuActive()) + break; + driver->beginScene(true, true, + video::SColor(255,128,128,128)); + drawMenuBackground(driver); + guienv->drawAll(); + driver->endScene(); + // On some computers framerate doesn't seem to be + // automatically limited + sleep_ms(25); + } + infostream<<"Waited for other menus"<getVideoDriver(); - infostream<<"Created main menu"<run() && kill == false) @@ -1295,22 +1573,9 @@ int main(int argc, char *argv[]) sleep_ms(25); } - // Break out of menu-game loop to shut down cleanly - if(device->run() == false || kill == true) - break; - infostream<<"Dropping main menu"<drop(); - - // Delete map if requested - if(menudata.delete_map) - { - bool r = fs::RecursiveDeleteContent(world_path); - if(r == false) - error_message = L"Delete failed"; - continue; - } } playername = wide_to_narrow(menudata.name); @@ -1321,20 +1586,122 @@ int main(int argc, char *argv[]) int newport = stoi(wide_to_narrow(menudata.port)); if(newport != 0) port = newport; + simple_singleplayer_mode = menudata.simple_singleplayer_mode; // Save settings + g_settings->setS32("selected_mainmenu_tab", menudata.selected_tab); g_settings->set("new_style_leaves", itos(menudata.fancy_trees)); g_settings->set("smooth_lighting", itos(menudata.smooth_lighting)); g_settings->set("enable_3d_clouds", itos(menudata.clouds_3d)); g_settings->set("opaque_water", itos(menudata.opaque_water)); + + g_settings->set("mip_map", itos(menudata.mip_map)); + g_settings->set("anisotropic_filter", itos(menudata.anisotropic_filter)); + g_settings->set("bilinear_filter", itos(menudata.bilinear_filter)); + g_settings->set("trilinear_filter", itos(menudata.trilinear_filter)); + + g_settings->setS32("enable_shaders", menudata.enable_shaders); + g_settings->set("preload_item_visuals", itos(menudata.preload_item_visuals)); + g_settings->set("enable_particles", itos(menudata.enable_particles)); + g_settings->set("creative_mode", itos(menudata.creative_mode)); g_settings->set("enable_damage", itos(menudata.enable_damage)); + g_settings->set("server_announce", itos(menudata.enable_public)); g_settings->set("name", playername); g_settings->set("address", address); g_settings->set("port", itos(port)); - // Update configuration file - if(configpath != "") - g_settings->updateConfigFile(configpath.c_str()); - + if(menudata.selected_world != -1) + g_settings->set("selected_world_path", + worldspecs[menudata.selected_world].path); + + // Break out of menu-game loop to shut down cleanly + if(device->run() == false || kill == true) + break; + + current_playername = playername; + current_password = password; + current_address = address; + current_port = port; + + // If using simple singleplayer mode, override + if(simple_singleplayer_mode){ + current_playername = "singleplayer"; + current_password = ""; + current_address = ""; + current_port = 30011; + } + else if (address != "") + { + ServerListSpec server; + server["name"] = menudata.servername; + server["address"] = wide_to_narrow(menudata.address); + server["port"] = wide_to_narrow(menudata.port); + server["description"] = menudata.serverdescription; + ServerList::insert(server); + } + + // Set world path to selected one + if(menudata.selected_world != -1){ + worldspec = worldspecs[menudata.selected_world]; + infostream<<"Selected world: "<set("selected_world_path", path); + continue; + } + + // If local game + if(current_address == "") + { + if(menudata.selected_world == -1){ + error_message = wgettext("No world selected and no address " + "provided. Nothing to do."); + errorstream<run() == false || kill == true) break; - + /* Run game */ @@ -1352,37 +1719,38 @@ int main(int argc, char *argv[]) input, device, font, - world_path, - playername, - password, - address, - port, + worldspec.path, + current_playername, + current_password, + current_address, + current_port, error_message, configpath, chat_backend, - gamespec + gamespec, + simple_singleplayer_mode ); } //try catch(con::PeerNotFoundException &e) { - errorstream<<"Connection error (timed out?)"<updateConfigFile(configpath.c_str()); + + // Print modified quicktune values + { + bool header_printed = false; + std::vector names = getQuicktuneNames(); + for(u32 i=0; i