X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fmain.cpp;h=940580b7a067d563093232733b380bb7c858eec7;hb=7935044820a02817cd5483be32ec82c2fe47a550;hp=2925f048c5ea9dbffa89dfaacccb6614460f3bff;hpb=899004207d35350117611aaa2ee2130bf2519cd5;p=minetest.git diff --git a/src/main.cpp b/src/main.cpp index 2925f048c..940580b7a 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,9 +47,10 @@ 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 "clouds.h" #include "server.h" #include "constants.h" #include "porting.h" @@ -68,9 +69,14 @@ 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" +#include "guiEngine.h" /* Settings. @@ -78,11 +84,16 @@ with this program; if not, write to the Free Software Foundation, Inc., */ Settings main_settings; Settings *g_settings = &main_settings; +std::string g_settings_path; // Global profiler Profiler main_profiler; Profiler *g_profiler = &main_profiler; +// Menu clouds are created later +Clouds *g_menuclouds = 0; +irr::scene::ISceneManager *g_menucloudsmgr = 0; + /* Debug streams */ @@ -90,8 +101,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; @@ -130,7 +139,12 @@ MainGameCallback *g_gamecallback = NULL; u32 getTimeMs() { /* Use imprecise system calls directly (from porting.h) */ - return porting::getTimeMs(); + return porting::getTime(PRECISION_MILLI); +} + +u32 getTime(TimePrecision prec) +{ + return porting::getTime(prec); } #else @@ -139,7 +153,7 @@ u32 getTimeMs() class TimeGetter { public: - virtual u32 getTime() = 0; + virtual u32 getTime(TimePrecision prec) = 0; }; // A precise irrlicht one @@ -149,11 +163,15 @@ class IrrlichtTimeGetter: public TimeGetter IrrlichtTimeGetter(IrrlichtDevice *device): m_device(device) {} - u32 getTime() + u32 getTime(TimePrecision prec) { - if(m_device == NULL) - return 0; - return m_device->getTimer()->getRealTime(); + if (prec == PRECISION_MILLI) { + if(m_device == NULL) + return 0; + return m_device->getTimer()->getRealTime(); + } else { + return porting::getTime(prec); + } } private: IrrlichtDevice *m_device; @@ -162,9 +180,9 @@ class IrrlichtTimeGetter: public TimeGetter class SimpleTimeGetter: public TimeGetter { public: - u32 getTime() + u32 getTime(TimePrecision prec) { - return porting::getTimeMs(); + return porting::getTime(prec); } }; @@ -176,9 +194,14 @@ u32 getTimeMs() { if(g_timegetter == NULL) return 0; - return g_timegetter->getTime(); + return g_timegetter->getTime(PRECISION_MILLI); } +u32 getTime(TimePrecision prec) { + if (g_timegetter == NULL) + return 0; + return g_timegetter->getTime(prec); +} #endif class StderrLogOutput: public ILogOutput @@ -221,7 +244,7 @@ class MyEventReceiver : public IEventReceiver */ if(noMenuActive() == false) { - return false; + return g_menumgr.preprocessEvent(event); } // Remember whether each key is down or up @@ -594,54 +617,7 @@ class RandomInputHandler : public InputHandler bool rightreleased; }; -void drawMenuBackground(video::IVideoDriver* driver) -{ - core::dimension2d screensize = driver->getScreenSize(); - - video::ITexture *bgtexture = - driver->getTexture(getTexturePath("menubg.png").c_str()); - if(bgtexture) - { - s32 scaledsize = 128; - - // The important difference between destsize and screensize is - // that destsize is rounded to whole scaled pixels. - // These formulas use component-wise multiplication and division of v2u32. - v2u32 texturesize = bgtexture->getSize(); - v2u32 sourcesize = texturesize * screensize / scaledsize + v2u32(1,1); - v2u32 destsize = scaledsize * sourcesize / texturesize; - - // Default texture wrapping mode in Irrlicht is ETC_REPEAT. - driver->draw2DImage(bgtexture, - core::rect(0, 0, destsize.X, destsize.Y), - core::rect(0, 0, sourcesize.X, sourcesize.Y), - NULL, NULL, true); - } - - video::ITexture *logotexture = - driver->getTexture(getTexturePath("menulogo.png").c_str()); - if(logotexture) - { - v2s32 logosize(logotexture->getOriginalSize().Width, - logotexture->getOriginalSize().Height); - logosize *= 4; - - video::SColor bgcolor(255,50,50,50); - core::rect bgrect(0, screensize.Height-logosize.Y-20, - screensize.Width, screensize.Height); - driver->draw2DRectangle(bgcolor, bgrect, NULL); - - core::rect rect(0,0,logosize.X,logosize.Y); - rect += v2s32(screensize.Width/2,screensize.Height-10-logosize.Y); - rect -= v2s32(logosize.X/2, 0); - driver->draw2DImage(logotexture, rect, - core::rect(core::position2d(0,0), - core::dimension2di(logotexture->getSize())), - NULL, NULL, true); - } -} - -#endif +#endif // !SERVER // These are defined global so that they're not optimized too much. // Can't change them to volatile. @@ -698,14 +674,14 @@ void SpeedTests() } { - TimeTaker timer("Testing core::map speed"); + TimeTaker timer("Testing std::map speed"); - core::map map1; + std::map map1; tempf = -324; const s16 ii=300; for(s16 y=0; y &worldspecs, + std::ostream &os) +{ + for(u32 i=0; i allowed_options; - allowed_options.insert("help", ValueSpec(VALUETYPE_FLAG, - "Show allowed options")); - allowed_options.insert("config", ValueSpec(VALUETYPE_STRING, - "Load configuration from specified file")); - allowed_options.insert("port", ValueSpec(VALUETYPE_STRING, - "Set network port (UDP)")); - allowed_options.insert("disable-unittests", ValueSpec(VALUETYPE_FLAG, - "Disable unit tests")); - allowed_options.insert("enable-unittests", ValueSpec(VALUETYPE_FLAG, - "Enable unit tests")); - allowed_options.insert("map-dir", ValueSpec(VALUETYPE_STRING, - "Same as --world (deprecated)")); - allowed_options.insert("world", ValueSpec(VALUETYPE_STRING, - "Set world path (implies local game)")); - allowed_options.insert("verbose", ValueSpec(VALUETYPE_FLAG, - "Print more information to console")); - allowed_options.insert("logfile", ValueSpec(VALUETYPE_STRING, - "Set logfile path ('' = no logging)")); - allowed_options.insert("gameid", ValueSpec(VALUETYPE_STRING, - "Set gameid (\"--gameid list\" prints available ones)")); + std::map allowed_options; + allowed_options.insert(std::make_pair("help", ValueSpec(VALUETYPE_FLAG, + _("Show allowed options")))); + allowed_options.insert(std::make_pair("config", ValueSpec(VALUETYPE_STRING, + _("Load configuration from specified file")))); + allowed_options.insert(std::make_pair("port", ValueSpec(VALUETYPE_STRING, + _("Set network port (UDP)")))); + allowed_options.insert(std::make_pair("disable-unittests", ValueSpec(VALUETYPE_FLAG, + _("Disable unit tests")))); + allowed_options.insert(std::make_pair("enable-unittests", ValueSpec(VALUETYPE_FLAG, + _("Enable unit tests")))); + allowed_options.insert(std::make_pair("map-dir", ValueSpec(VALUETYPE_STRING, + _("Same as --world (deprecated)")))); + allowed_options.insert(std::make_pair("world", ValueSpec(VALUETYPE_STRING, + _("Set world path (implies local game) ('list' lists all)")))); + allowed_options.insert(std::make_pair("worldname", ValueSpec(VALUETYPE_STRING, + _("Set world by name (implies local game)")))); + allowed_options.insert(std::make_pair("info", ValueSpec(VALUETYPE_FLAG, + _("Print more information to console")))); + allowed_options.insert(std::make_pair("verbose", ValueSpec(VALUETYPE_FLAG, + _("Print even more information to console")))); + allowed_options.insert(std::make_pair("trace", ValueSpec(VALUETYPE_FLAG, + _("Print enormous amounts of information to log and console")))); + allowed_options.insert(std::make_pair("logfile", ValueSpec(VALUETYPE_STRING, + _("Set logfile path ('' = no logging)")))); + allowed_options.insert(std::make_pair("gameid", ValueSpec(VALUETYPE_STRING, + _("Set gameid (\"--gameid list\" prints available ones)")))); #ifndef SERVER - allowed_options.insert("speedtests", ValueSpec(VALUETYPE_FLAG, - "Run speed tests")); - allowed_options.insert("address", ValueSpec(VALUETYPE_STRING, - "Address to connect to. ('' = local game)")); - allowed_options.insert("random-input", ValueSpec(VALUETYPE_FLAG, - "Enable random user input, for testing")); - allowed_options.insert("server", ValueSpec(VALUETYPE_FLAG, - "Run dedicated server")); - allowed_options.insert("name", ValueSpec(VALUETYPE_STRING, - "Set player name")); - allowed_options.insert("password", ValueSpec(VALUETYPE_STRING, - "Set password")); - allowed_options.insert("go", ValueSpec(VALUETYPE_FLAG, - "Disable main menu")); + allowed_options.insert(std::make_pair("videomodes", ValueSpec(VALUETYPE_FLAG, + _("Show available video modes")))); + allowed_options.insert(std::make_pair("speedtests", ValueSpec(VALUETYPE_FLAG, + _("Run speed tests")))); + allowed_options.insert(std::make_pair("address", ValueSpec(VALUETYPE_STRING, + _("Address to connect to. ('' = local game)")))); + allowed_options.insert(std::make_pair("random-input", ValueSpec(VALUETYPE_FLAG, + _("Enable random user input, for testing")))); + allowed_options.insert(std::make_pair("server", ValueSpec(VALUETYPE_FLAG, + _("Run dedicated server")))); + allowed_options.insert(std::make_pair("name", ValueSpec(VALUETYPE_STRING, + _("Set player name")))); + allowed_options.insert(std::make_pair("password", ValueSpec(VALUETYPE_STRING, + _("Set password")))); + allowed_options.insert(std::make_pair("go", ValueSpec(VALUETYPE_FLAG, + _("Disable main menu")))); #endif Settings cmd_args; @@ -808,21 +814,21 @@ int main(int argc, char *argv[]) if(ret == false || cmd_args.getFlag("help") || cmd_args.exists("nonopt1")) { - dstream<<"Allowed options:"<::Iterator - i = allowed_options.getIterator(); - i.atEnd() == false; i++) + dstream<<_("Allowed options:")<::iterator + i = allowed_options.begin(); + i != allowed_options.end(); ++i) { std::ostringstream os1(std::ios::binary); - os1<<" --"<getKey(); - if(i.getNode()->getValue().type == VALUETYPE_FLAG) + os1<<" --"<first; + if(i->second.type == VALUETYPE_FLAG) {} else - os1<<" "; + os1<<_(" "); dstream<getValue().help != NULL) - dstream<getValue().help; + if(i->second.help != NULL) + dstream<second.help; dstream< worldspecs = getAvailableWorlds(); + print_worldspecs(worldspecs, dstream); + return 0; + } + // Print startup message - actionstream< filenames; + std::vector filenames; filenames.push_back(porting::path_user + DIR_DELIM + "minetest.conf"); // Legacy configuration file location filenames.push_back(porting::path_user + DIR_DELIM + ".." + DIR_DELIM + "minetest.conf"); -#ifdef RUN_IN_PLACE +#if RUN_IN_PLACE // Try also from a lower level (to aid having the same configuration // for many RUN_IN_PLACE installs) filenames.push_back(porting::path_user + @@ -936,15 +947,40 @@ int main(int argc, char *argv[]) bool r = g_settings->readConfigFile(filenames[i].c_str()); if(r) { - configpath = filenames[i]; + g_settings_path = filenames[i]; break; } } // If no path found, use the first one (menu creates the file) - if(configpath == "") - configpath = filenames[0]; + if(g_settings_path == "") + g_settings_path = filenames[0]; } + + // Initialize debug streams +#define DEBUGFILE "debug.txt" +#if RUN_IN_PLACE + std::string logfile = DEBUGFILE; +#else + std::string logfile = porting::path_user+DIR_DELIM+DEBUGFILE; +#endif + if(cmd_args.exists("logfile")) + logfile = cmd_args.get("logfile"); + + log_remove_output(&main_dstream_no_stderr_log_out); + int loglevel = g_settings->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")) commanded_world = g_settings->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"); @@ -1025,45 +1092,109 @@ int main(int argc, char *argv[]) // 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("name"); if(cmd_args.exists("name")) @@ -1098,10 +1227,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; @@ -1120,6 +1255,14 @@ int main(int argc, char *argv[]) driverType = video::EDT_DIRECT3D9; else if(driverstring == "opengl") driverType = video::EDT_OPENGL; +#ifdef _IRR_COMPILE_WITH_OGLES1_ + else if(driverstring == "ogles1") + driverType = video::EDT_OGLES1; +#endif +#ifdef _IRR_COMPILE_WITH_OGLES2_ + else if(driverstring == "ogles2") + driverType = video::EDT_OGLES2; +#endif else { errorstream<<"WARNING: Invalid video_driver specified; defaulting " @@ -1128,15 +1271,79 @@ int main(int argc, char *argv[]) } /* - Create device and exit if creation failed + List video modes if requested */ MyEventReceiver receiver; + if(cmd_args.getFlag("videomodes")){ + IrrlichtDevice *nulldevice; + + SIrrlichtCreationParameters params = SIrrlichtCreationParameters(); + params.DriverType = video::EDT_NULL; + params.WindowSize = core::dimension2d(640, 480); + params.Bits = 24; + params.AntiAlias = fsaa; + params.Fullscreen = false; + params.Stencilbuffer = false; + params.Vsync = vsync; + params.EventReceiver = &receiver; + params.HighPrecisionFPU = g_settings->getBool("high_precision_fpu"); + + nulldevice = createDeviceEx(params); + + if(nulldevice == 0) + return 1; + + dstream<<_("Available video modes (WxHxD):")<getVideoModeList(); + + if(videomode_list == 0){ + nulldevice->drop(); + return 1; + } + + s32 videomode_count = videomode_list->getVideoModeCount(); + core::dimension2d videomode_res; + s32 videomode_depth; + for (s32 i = 0; i < videomode_count; ++i){ + videomode_res = videomode_list->getVideoModeResolution(i); + videomode_depth = videomode_list->getVideoModeDepth(i); + dstream<getDesktopResolution(); + videomode_depth = videomode_list->getDesktopDepth(); + dstream<drop(); + + return 0; + } + + /* + Create device and exit if creation failed + */ + 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; + params.HighPrecisionFPU = g_settings->getBool("high_precision_fpu"); + + device = createDeviceEx(params); if (device == 0) return 1; // could not create selected driver. @@ -1147,9 +1354,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. @@ -1169,6 +1373,7 @@ int main(int argc, char *argv[]) { dstream<<"Running speed tests"<drop(); return 0; } @@ -1186,7 +1391,19 @@ int main(int argc, char *argv[]) guienv = device->getGUIEnvironment(); gui::IGUISkin* skin = guienv->getSkin(); - gui::IGUIFont* font = guienv->getFont(getTexturePath("fontlucida.png").c_str()); + std::string font_path = g_settings->get("font_path"); + gui::IGUIFont *font; + bool use_freetype = g_settings->getBool("freetype"); + #if USE_FREETYPE + if (use_freetype) { + u16 font_size = g_settings->getU16("font_size"); + font = gui::CGUITTFont::createTTFont(guienv, font_path.c_str(), font_size); + } else { + font = guienv->getFont(font_path.c_str()); + } + #else + font = guienv->getFont(font_path.c_str()); + #endif if(font) skin->setFont(font); else @@ -1207,7 +1424,26 @@ int main(int argc, char *argv[]) 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 + + + // Create the menu clouds + if (!g_menucloudsmgr) + g_menucloudsmgr = smgr->createNewSceneManager(); + if (!g_menuclouds) + g_menuclouds = new Clouds(g_menucloudsmgr->getRootSceneNode(), + g_menucloudsmgr, -1, rand(), 100); + g_menuclouds->update(v2f(0, 0), video::SColor(255,200,200,255)); + scene::ICameraSceneNode* camera; + camera = g_menucloudsmgr->addCameraSceneNode(0, + v3f(0,0,0), v3f(0, 60, 100)); + camera->setFarValue(10000); + /* GUI stuff */ @@ -1232,7 +1468,9 @@ int main(int argc, char *argv[]) while(device->run() && kill == false) { // Set the window caption - device->setWindowCaption(L"Minetest [Main Menu]"); + wchar_t* text = wgettext("Main Menu"); + device->setWindowCaption((std::wstring(L"Minetest [")+text+L"]").c_str()); + delete[] text; // This is used for catching disconnects try @@ -1253,6 +1491,13 @@ int main(int argc, char *argv[]) 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. @@ -1276,177 +1521,138 @@ int main(int argc, char *argv[]) // 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)); + menudata.address = address; + menudata.name = playername; + menudata.port = itos(port); + menudata.errormessage = wide_to_narrow(error_message); + error_message = L""; 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.creative_mode = g_settings->getBool("creative_mode"); - menudata.enable_damage = g_settings->getBool("enable_damage"); - // Default to selecting nothing - menudata.selected_world = -1; - // Get world listing for the menu + menudata.password = cmd_args.get("password"); + + driver->setTextureCreationFlag(video::ETCF_CREATE_MIP_MAPS, g_settings->getBool("mip_map")); + + menudata.enable_public = g_settings->getBool("server_announce"); + 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; + //TODO find within worldspecs and set config } - // Copy worldspecs to menu - menudata.worlds = worldspecs; if(skip_main_menu == false) { - GUIMainMenu *menu = - new GUIMainMenu(guienv, guiroot, -1, - &g_menumgr, &menudata, g_gamecallback); - menu->allowFocusRemoval(true); - - if(error_message != L"") - { - verbosestream<<"error_message = " - <drop(); - error_message = L""; - } - video::IVideoDriver* driver = device->getVideoDriver(); - - infostream<<"Created main menu"<run() && kill == false) { - if(menu->getStatus() == true) + if(noMenuActive()) break; - - //driver->beginScene(true, true, video::SColor(255,0,0,0)); - driver->beginScene(true, true, video::SColor(255,128,128,128)); - - drawMenuBackground(driver); - + driver->beginScene(true, true, + video::SColor(255,128,128,128)); guienv->drawAll(); - driver->endScene(); - // On some computers framerate doesn't seem to be // automatically limited sleep_ms(25); } + infostream<<"Waited for other menus"<clear(); + } - menu->drop(); + if(menudata.errormessage != ""){ + error_message = narrow_to_wide(menudata.errormessage); + continue; } - playername = wide_to_narrow(menudata.name); - password = translatePassword(playername, menudata.password); + //update worldspecs (necessary as new world may have been created) + worldspecs = getAvailableWorlds(); + + if (menudata.name == "") + menudata.name = std::string("Guest") + itos(myrand_range(1000,9999)); + else + playername = menudata.name; + + password = translatePassword(playername, narrow_to_wide(menudata.password)); //infostream<<"Main: password hash: '"<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("creative_mode", itos(menudata.creative_mode)); - g_settings->set("enable_damage", itos(menudata.enable_damage)); g_settings->set("name", playername); g_settings->set("address", address); g_settings->set("port", itos(port)); - if(menudata.selected_world != -1) + + if((menudata.selected_world >= 0) && + (menudata.selected_world < worldspecs.size())) g_settings->set("selected_world_path", worldspecs[menudata.selected_world].path); - /*// Update configuration file - if(configpath != "") - g_settings->updateConfigFile(configpath.c_str());*/ - + // 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 = myrand_range(49152, 65535); + } + else if (address != "") + { + ServerListSpec server; + server["name"] = menudata.servername; + server["address"] = menudata.address; + server["port"] = menudata.port; + server["description"] = menudata.serverdescription; + ServerList::insert(server); + } + // Set world path to selected one - if(menudata.selected_world != -1){ + if ((menudata.selected_world >= 0) && + (menudata.selected_world < worldspecs.size())) { worldspec = worldspecs[menudata.selected_world]; infostream<<"Selected world: "<set("selected_world_path", path); - continue; - } - // If local game - if(address == "") + if(current_address == "") { if(menudata.selected_world == -1){ - error_message = L"No world selected and no address " - L"provided. Nothing to do."; + error_message = wgettext("No world selected and no address " + "provided. Nothing to do."); errorstream<run() == false || kill == true) + if(device->run() == false || kill == true) { + if(g_settings_path != "") { + g_settings->updateConfigFile( + g_settings_path.c_str()); + } break; - + } + /* Run game */ @@ -1485,36 +1697,27 @@ int main(int argc, char *argv[]) device, font, worldspec.path, - playername, - password, - address, - port, + current_playername, + current_password, + current_address, + current_port, error_message, - configpath, chat_backend, - gamespec + gamespec, + simple_singleplayer_mode ); + smgr->clear(); } //try catch(con::PeerNotFoundException &e) { - error_message = L"Connection error (timed out?)"; + error_message = wgettext("Connection error (timed out?)"); errorstream<drop(); + g_menucloudsmgr->drop(); + delete input; /* @@ -1541,11 +1748,16 @@ int main(int argc, char *argv[]) */ device->drop(); +#if USE_FREETYPE + if (use_freetype) + font->drop(); +#endif + #endif // !SERVER // Update configuration file - if(configpath != "") - g_settings->updateConfigFile(configpath.c_str()); + if(g_settings_path != "") + g_settings->updateConfigFile(g_settings_path.c_str()); // Print modified quicktune values {