From eea02e1119d17038d300ec31ba5256f4b0378b7f Mon Sep 17 00:00:00 2001 From: est31 Date: Sun, 17 Apr 2016 18:35:02 +0200 Subject: [PATCH 01/16] CONTRIBUTING: disallow signed git commits They break bzr-git, and bzr-git breaks the Minetest PPAs. --- CONTRIBUTING.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 468ba051..986f6002 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -25,6 +25,7 @@ If you are planning to start some significant coding, you would benefit from ask - Have a title which begins with a capital letter - Be descriptive. (e.g. no `Update init.lua` or `Fix a problem`) - Have a first line with less than *80 characters* and have a second line that is *empty* + - Do **not** [sign your commits](https://git-scm.com/book/uz/v2/Git-Tools-Signing-Your-Work), as Minetest offers automatically built ppas over launchpad and it [would break](https://bugs.launchpad.net/bzr-git/+bug/1084403) if there were signed commits in master 4. Once you are happy with your changes, submit a pull request. - Open the [pull-request form](https://github.com/minetest/minetest/pull/new/master) From 1893eec3cccff02fe6d4f748d8020237d2c2b842 Mon Sep 17 00:00:00 2001 From: Ekdohibs Date: Fri, 22 Apr 2016 14:20:16 +0200 Subject: [PATCH 02/16] Fix mainmenu code downloading the public serverlist twice. Also, fix a nil error that can happen sometimes in menu_handle_key_up_down --- builtin/mainmenu/common.lua | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/builtin/mainmenu/common.lua b/builtin/mainmenu/common.lua index 5bf39abd..1fd89ff7 100644 --- a/builtin/mainmenu/common.lua +++ b/builtin/mainmenu/common.lua @@ -178,7 +178,7 @@ end -------------------------------------------------------------------------------- function menu_handle_key_up_down(fields, textlist, settingname) - local oldidx, newidx = core.get_textlist_index(textlist) + local oldidx, newidx = core.get_textlist_index(textlist), 1 if fields.key_up or fields.key_down then if fields.key_up and oldidx and oldidx > 1 then newidx = oldidx - 1 @@ -203,12 +203,20 @@ function asyncOnlineFavourites() end menudata.favorites = menudata.public_known menudata.favorites_is_public = true + + if not menudata.public_downloading then + menudata.public_downloading = true + else + return + end + core.handle_async( function(param) return core.get_favorites("online") end, nil, function(result) + menudata.public_downloading = nil local favs = order_favorite_list(result) if favs[1] then menudata.public_known = favs From f3f23ad0de19ae6fbdf6a18e67e1e2c729daca6d Mon Sep 17 00:00:00 2001 From: Xunto Date: Thu, 21 Apr 2016 23:26:31 +0300 Subject: [PATCH 03/16] Fix bug that was leading to oversized tooltips containing multiline text when it have multiple lines --- src/guiFormSpecMenu.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/guiFormSpecMenu.cpp b/src/guiFormSpecMenu.cpp index 6492eb9d..1a6ee91c 100644 --- a/src/guiFormSpecMenu.cpp +++ b/src/guiFormSpecMenu.cpp @@ -2253,7 +2253,7 @@ void GUIFormSpecMenu::drawList(const ListDrawSpec &s, int phase, this->bringToFront(m_tooltip_element); m_tooltip_element->setText(utf8_to_wide(tooltip_text).c_str()); s32 tooltip_width = m_tooltip_element->getTextWidth() + m_btn_height; - s32 tooltip_height = m_tooltip_element->getTextHeight() * tt_rows.size() + 5; + s32 tooltip_height = m_tooltip_element->getTextHeight() + 5; v2u32 screenSize = driver->getScreenSize(); int tooltip_offset_x = m_btn_height; int tooltip_offset_y = m_btn_height; From ce488ea7f4ffa7b80c09ffbda4b090b5e3b04d10 Mon Sep 17 00:00:00 2001 From: Ekdohibs Date: Mon, 4 Apr 2016 18:31:00 +0200 Subject: [PATCH 04/16] Escape more strings: formspecs, item descriptions, infotexts... Also, change the escape character to the more standard \x1b Thus, it can be used in the future for translation or colored text, for example. --- src/chat.cpp | 4 +-- src/game.cpp | 8 +++-- src/guiFormSpecMenu.cpp | 54 ++++++++++++++------------------- src/guiFormSpecMenu.h | 25 ++++++++++----- src/hud.cpp | 7 +++-- src/unittest/test_utilities.cpp | 19 ++++++++++++ src/util/string.cpp | 27 ----------------- src/util/string.h | 44 +++++++++++++++++++++------ 8 files changed, 105 insertions(+), 83 deletions(-) diff --git a/src/chat.cpp b/src/chat.cpp index 7a5196ed..ab945444 100644 --- a/src/chat.cpp +++ b/src/chat.cpp @@ -679,8 +679,8 @@ ChatBackend::~ChatBackend() void ChatBackend::addMessage(std::wstring name, std::wstring text) { - name = removeChatEscapes(name); - text = removeChatEscapes(text); + name = unescape_enriched(name); + text = unescape_enriched(text); // Note: A message may consist of multiple lines, for example the MOTD. WStrfnd fnd(text); diff --git a/src/game.cpp b/src/game.cpp index d513517b..23f261cf 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -3731,7 +3731,7 @@ void Game::handlePointingAtNode(GameRunData *runData, NodeMetadata *meta = map.getNodeMetadata(nodepos); if (meta) { - infotext = utf8_to_wide(meta->getString("infotext")); + infotext = unescape_enriched(utf8_to_wide(meta->getString("infotext"))); } else { MapNode n = map.getNodeNoEx(nodepos); @@ -3807,13 +3807,15 @@ void Game::handlePointingAtObject(GameRunData *runData, const v3f &player_position, bool show_debug) { - infotext = utf8_to_wide(runData->selected_object->infoText()); + infotext = unescape_enriched( + utf8_to_wide(runData->selected_object->infoText())); if (show_debug) { if (infotext != L"") { infotext += L"\n"; } - infotext += utf8_to_wide(runData->selected_object->debugInfoText()); + infotext += unescape_enriched(utf8_to_wide( + runData->selected_object->debugInfoText())); } if (input->getLeftState()) { diff --git a/src/guiFormSpecMenu.cpp b/src/guiFormSpecMenu.cpp index 1a6ee91c..23cff3eb 100644 --- a/src/guiFormSpecMenu.cpp +++ b/src/guiFormSpecMenu.cpp @@ -609,8 +609,6 @@ void GUIFormSpecMenu::parseButton(parserData* data,std::string element, if(!data->explicit_size) warningstream<<"invalid use of button without a size[] element"< rect = core::rect(pos.X, pos.Y, pos.X+geom.X, pos.Y+geom.Y); FieldSpec spec( @@ -746,7 +743,7 @@ void GUIFormSpecMenu::parseTable(parserData* data,std::string element) spec.ftype = f_Table; for (unsigned int i = 0; i < items.size(); ++i) { - items[i] = unescape_string(items[i]); + items[i] = unescape_string(unescape_enriched(items[i])); } //now really show table @@ -818,7 +815,7 @@ void GUIFormSpecMenu::parseTextList(parserData* data,std::string element) spec.ftype = f_Table; for (unsigned int i = 0; i < items.size(); ++i) { - items[i] = unescape_string(items[i]); + items[i] = unescape_string(unescape_enriched(items[i])); } //now really show list @@ -889,7 +886,8 @@ void GUIFormSpecMenu::parseDropDown(parserData* data,std::string element) } for (unsigned int i=0; i < items.size(); i++) { - e->addItem(utf8_to_wide(items[i]).c_str()); + e->addItem(unescape_string(unescape_enriched( + utf8_to_wide(items[i]))).c_str()); } if (str_initial_selection != "") @@ -930,8 +928,6 @@ void GUIFormSpecMenu::parsePwdField(parserData* data,std::string element) core::rect rect = core::rect(pos.X, pos.Y, pos.X+geom.X, pos.Y+geom.Y); - label = unescape_string(label); - std::wstring wlabel = utf8_to_wide(label); FieldSpec spec( @@ -995,8 +991,6 @@ void GUIFormSpecMenu::parseSimpleField(parserData* data, if(m_form_src) default_val = m_form_src->resolveText(default_val); - default_val = unescape_string(default_val); - label = unescape_string(label); std::wstring wlabel = utf8_to_wide(label); @@ -1094,9 +1088,6 @@ void GUIFormSpecMenu::parseTextArea(parserData* data, default_val = m_form_src->resolveText(default_val); - default_val = unescape_string(default_val); - label = unescape_string(label); - std::wstring wlabel = utf8_to_wide(label); FieldSpec spec( @@ -1197,7 +1188,6 @@ void GUIFormSpecMenu::parseLabel(parserData* data,std::string element) if(!data->explicit_size) warningstream<<"invalid use of label without a size[] element"< lines = split(text, '\n'); for (unsigned int i = 0; i != lines.size(); i++) { @@ -1243,7 +1233,8 @@ void GUIFormSpecMenu::parseVertLabel(parserData* data,std::string element) ((parts.size() > 2) && (m_formspec_version > FORMSPEC_API_VERSION))) { std::vector v_pos = split(parts[0],','); - std::wstring text = utf8_to_wide(unescape_string(parts[1])); + std::wstring text = unescape_string( + unescape_enriched(utf8_to_wide(parts[1]))); MY_CHECKPOS("vertlabel",1); @@ -1330,7 +1321,6 @@ void GUIFormSpecMenu::parseImageButton(parserData* data,std::string element, image_name = unescape_string(image_name); pressed_image_name = unescape_string(pressed_image_name); - label = unescape_string(label); std::wstring wlabel = utf8_to_wide(label); @@ -1430,7 +1420,8 @@ void GUIFormSpecMenu::parseTabHeader(parserData* data,std::string element) e->setNotClipped(true); for (unsigned int i = 0; i < buttons.size(); i++) { - e->addTab(utf8_to_wide(buttons[i]).c_str(), -1); + e->addTab(unescape_string(unescape_enriched( + utf8_to_wide(buttons[i]))).c_str(), -1); } if ((tab_index >= 0) && @@ -1489,7 +1480,6 @@ void GUIFormSpecMenu::parseItemImageButton(parserData* data,std::string element) m_default_tooltip_bgcolor, m_default_tooltip_color); - label = unescape_string(label); FieldSpec spec( name, utf8_to_wide(label), @@ -1604,14 +1594,14 @@ void GUIFormSpecMenu::parseTooltip(parserData* data, std::string element) std::vector parts = split(element,';'); if (parts.size() == 2) { std::string name = parts[0]; - m_tooltips[name] = TooltipSpec(unescape_string(parts[1]), + m_tooltips[name] = TooltipSpec(parts[1], m_default_tooltip_bgcolor, m_default_tooltip_color); return; } else if (parts.size() == 4) { std::string name = parts[0]; video::SColor tmp_color1, tmp_color2; if ( parseColorString(parts[2], tmp_color1, false) && parseColorString(parts[3], tmp_color2, false) ) { - m_tooltips[name] = TooltipSpec(unescape_string(parts[1]), + m_tooltips[name] = TooltipSpec(parts[1], tmp_color1, tmp_color2); return; } @@ -2242,16 +2232,18 @@ void GUIFormSpecMenu::drawList(const ListDrawSpec &s, int phase, } // Draw tooltip - std::string tooltip_text = ""; - if (hovering && !m_selected_item) - tooltip_text = item.getDefinition(m_gamedef->idef()).description; - if (tooltip_text != "") { - std::vector tt_rows = str_split(tooltip_text, '\n'); + std::wstring tooltip_text = L""; + if (hovering && !m_selected_item) { + tooltip_text = utf8_to_wide(item.getDefinition(m_gamedef->idef()).description); + tooltip_text = unescape_enriched(tooltip_text); + } + if (tooltip_text != L"") { + std::vector tt_rows = str_split(tooltip_text, L'\n'); m_tooltip_element->setBackgroundColor(m_default_tooltip_bgcolor); m_tooltip_element->setOverrideColor(m_default_tooltip_color); m_tooltip_element->setVisible(true); this->bringToFront(m_tooltip_element); - m_tooltip_element->setText(utf8_to_wide(tooltip_text).c_str()); + m_tooltip_element->setText(tooltip_text.c_str()); s32 tooltip_width = m_tooltip_element->getTextWidth() + m_btn_height; s32 tooltip_height = m_tooltip_element->getTextHeight() + 5; v2u32 screenSize = driver->getScreenSize(); @@ -2504,7 +2496,7 @@ void GUIFormSpecMenu::drawMenu() u32 delta = 0; if (id == -1) { m_old_tooltip_id = id; - m_old_tooltip = ""; + m_old_tooltip = L""; } else { if (id == m_old_tooltip_id) { delta = porting::getDeltaMs(m_hovered_time, getTimeMs()); @@ -2517,11 +2509,11 @@ void GUIFormSpecMenu::drawMenu() if (id != -1 && delta >= m_tooltip_show_delay) { for(std::vector::iterator iter = m_fields.begin(); iter != m_fields.end(); ++iter) { - if ( (iter->fid == id) && (m_tooltips[iter->fname].tooltip != "") ){ + if (iter->fid == id && m_tooltips[iter->fname].tooltip != L"") { if (m_old_tooltip != m_tooltips[iter->fname].tooltip) { m_old_tooltip = m_tooltips[iter->fname].tooltip; - m_tooltip_element->setText(utf8_to_wide(m_tooltips[iter->fname].tooltip).c_str()); - std::vector tt_rows = str_split(m_tooltips[iter->fname].tooltip, '\n'); + m_tooltip_element->setText(m_tooltips[iter->fname].tooltip.c_str()); + std::vector tt_rows = str_split(m_tooltips[iter->fname].tooltip, L'\n'); s32 tooltip_width = m_tooltip_element->getTextWidth() + m_btn_height; s32 tooltip_height = m_tooltip_element->getTextHeight() * tt_rows.size() + 5; int tooltip_offset_x = m_btn_height; @@ -2875,7 +2867,7 @@ bool GUIFormSpecMenu::preprocessEvent(const SEvent& event) core::position2d(x, y)); if (event.MouseInput.Event == EMIE_LMOUSE_PRESSED_DOWN) { m_old_tooltip_id = -1; - m_old_tooltip = ""; + m_old_tooltip = L""; } if (!isChild(hovered,this)) { if (DoubleClickDetection(event)) { diff --git a/src/guiFormSpecMenu.h b/src/guiFormSpecMenu.h index 005b9136..8774d306 100644 --- a/src/guiFormSpecMenu.h +++ b/src/guiFormSpecMenu.h @@ -29,6 +29,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "modalMenu.h" #include "guiTable.h" #include "network/networkprotocol.h" +#include "util/string.h" class IGameDef; class InventoryManager; @@ -191,18 +192,26 @@ class GUIFormSpecMenu : public GUIModalMenu bool scale; }; + /* The responsibility of unescaping the strings has been shifted + * from the formspec parsing methods to the draw methods. + * There still are a few exceptions: + * - Vertical label, because it modifies the string by inserting + * '\n' between each character, + * - Tab header, because it gives the string immediately to + * Irrlicht and we can't unescape it later. + */ struct FieldSpec { FieldSpec() { } FieldSpec(const std::string &name, const std::wstring &label, - const std::wstring &fdeflt, int id) : + const std::wstring &default_text, int id) : fname(name), - flabel(label), - fdefault(fdeflt), fid(id) { + flabel = unescape_string(unescape_enriched(label)); + fdefault = unescape_string(unescape_enriched(default_text)); send = false; ftype = f_Unknown; is_exit = false; @@ -235,12 +244,12 @@ class GUIFormSpecMenu : public GUIModalMenu } TooltipSpec(std::string a_tooltip, irr::video::SColor a_bgcolor, irr::video::SColor a_color): - tooltip(a_tooltip), bgcolor(a_bgcolor), color(a_color) { + tooltip = unescape_string(unescape_enriched(utf8_to_wide(a_tooltip))); } - std::string tooltip; + std::wstring tooltip; irr::video::SColor bgcolor; irr::video::SColor color; }; @@ -252,18 +261,18 @@ class GUIFormSpecMenu : public GUIModalMenu } StaticTextSpec(const std::wstring &a_text, const core::rect &a_rect): - text(a_text), rect(a_rect), parent_button(NULL) { + text = unescape_string(unescape_enriched(a_text)); } StaticTextSpec(const std::wstring &a_text, const core::rect &a_rect, gui::IGUIButton *a_parent_button): - text(a_text), rect(a_rect), parent_button(a_parent_button) { + text = unescape_string(unescape_enriched(a_text)); } std::wstring text; core::rect rect; @@ -406,7 +415,7 @@ protected: u32 m_tooltip_show_delay; s32 m_hovered_time; s32 m_old_tooltip_id; - std::string m_old_tooltip; + std::wstring m_old_tooltip; bool m_rmouse_auto_place; diff --git a/src/hud.cpp b/src/hud.cpp index 502865ca..19feaef7 100644 --- a/src/hud.cpp +++ b/src/hud.cpp @@ -22,6 +22,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "hud.h" #include "settings.h" #include "util/numeric.h" +#include "util/string.h" #include "log.h" #include "gamedef.h" #include "itemdef.h" @@ -319,7 +320,7 @@ void Hud::drawLuaElements(const v3s16 &camera_offset) (e->number >> 8) & 0xFF, (e->number >> 0) & 0xFF); core::rect size(0, 0, e->scale.X, text_height * e->scale.Y); - std::wstring text = utf8_to_wide(e->text); + std::wstring text = unescape_enriched(utf8_to_wide(e->text)); core::dimension2d textsize = font->getDimension(text.c_str()); v2s32 offset((e->align.X - 1.0) * (textsize.Width / 2), (e->align.Y - 1.0) * (textsize.Height / 2)); @@ -355,11 +356,11 @@ void Hud::drawLuaElements(const v3s16 &camera_offset) (e->number >> 8) & 0xFF, (e->number >> 0) & 0xFF); core::rect size(0, 0, 200, 2 * text_height); - std::wstring text = utf8_to_wide(e->name); + std::wstring text = unescape_enriched(utf8_to_wide(e->name)); font->draw(text.c_str(), size + pos, color); std::ostringstream os; os << distance << e->text; - text = utf8_to_wide(os.str()); + text = unescape_enriched(utf8_to_wide(os.str())); pos.Y += text_height; font->draw(text.c_str(), size + pos, color); break; } diff --git a/src/unittest/test_utilities.cpp b/src/unittest/test_utilities.cpp index 1785997d..d73975b9 100644 --- a/src/unittest/test_utilities.cpp +++ b/src/unittest/test_utilities.cpp @@ -45,6 +45,7 @@ public: void testStringAllowed(); void testAsciiPrintableHelper(); void testUTF8(); + void testRemoveEscapes(); void testWrapRows(); void testIsNumber(); void testIsPowerOfTwo(); @@ -71,6 +72,7 @@ void TestUtilities::runTests(IGameDef *gamedef) TEST(testStringAllowed); TEST(testAsciiPrintableHelper); TEST(testUTF8); + TEST(testRemoveEscapes); TEST(testWrapRows); TEST(testIsNumber); TEST(testIsPowerOfTwo); @@ -253,6 +255,23 @@ void TestUtilities::testUTF8() == "the shovel dug a crumbly node!"); } +void TestUtilities::testRemoveEscapes() +{ + UASSERT(unescape_enriched( + L"abc\x1bXdef") == L"abcdef"); + UASSERT(unescape_enriched( + L"abc\x1b(escaped)def") == L"abcdef"); + UASSERT(unescape_enriched( + L"abc\x1b((escaped with parenthesis\\))def") == L"abcdef"); + UASSERT(unescape_enriched( + L"abc\x1b(incomplete") == L"abc"); + UASSERT(unescape_enriched( + L"escape at the end\x1b") == L"escape at the end"); + // Nested escapes not supported + UASSERT(unescape_enriched( + L"abc\x1b(outer \x1b(inner escape)escape)def") == L"abcescape)def"); +} + void TestUtilities::testWrapRows() { UASSERT(wrap_rows("12345678",4) == "1234\n5678"); diff --git a/src/util/string.cpp b/src/util/string.cpp index c8f528a7..2c4143c7 100644 --- a/src/util/string.cpp +++ b/src/util/string.cpp @@ -729,33 +729,6 @@ static bool parseNamedColorString(const std::string &value, video::SColor &color return true; } -std::wstring removeChatEscapes(const std::wstring &s) { - std::wstring output; - size_t i = 0; - while (i < s.length()) { - if (s[i] == L'\v') { - ++i; - if (i == s.length()) continue; - if (s[i] == L'(') { - ++i; - while (i < s.length() && s[i] != L')') { - if (s[i] == L'\\') { - ++i; - } - ++i; - } - ++i; - } else { - ++i; - } - continue; - } - output += s[i]; - ++i; - } - return output; -} - void str_replace(std::string &str, char from, char to) { std::replace(str.begin(), str.end(), from, to); diff --git a/src/util/string.h b/src/util/string.h index 9e59ab20..40ef3e4d 100644 --- a/src/util/string.h +++ b/src/util/string.h @@ -386,14 +386,6 @@ inline void str_replace(std::string &str, const std::string &pattern, } } -/** - * Remove all chat escape sequences in \p s. - * - * @param s The string in which to remove escape sequences. - * @return \p s, with escape sequences removed. - */ -std::wstring removeChatEscapes(const std::wstring &s); - /** * Replace all occurrences of the character \p from in \p str with \p to. * @@ -476,7 +468,7 @@ inline std::string wrap_rows(const std::string &from, * Removes backslashes from an escaped string (FormSpec strings) */ template -inline std::basic_string unescape_string(std::basic_string &s) +inline std::basic_string unescape_string(const std::basic_string &s) { std::basic_string res; @@ -492,6 +484,40 @@ inline std::basic_string unescape_string(std::basic_string &s) return res; } +/** + * Remove all escape sequences in \p s. + * + * @param s The string in which to remove escape sequences. + * @return \p s, with escape sequences removed. + */ +template +std::basic_string unescape_enriched(const std::basic_string &s) +{ + std::basic_string output; + size_t i = 0; + while (i < s.length()) { + if (s[i] == '\x1b') { + ++i; + if (i == s.length()) continue; + if (s[i] == '(') { + ++i; + while (i < s.length() && s[i] != ')') { + if (s[i] == '\\') { + ++i; + } + ++i; + } + ++i; + } else { + ++i; + } + continue; + } + output += s[i]; + ++i; + } + return output; +} /** * Checks that all characters in \p to_check are a decimal digits. From c0b78e965e45c4bfeeb17cba2c6b276ce2d0abb6 Mon Sep 17 00:00:00 2001 From: gregorycu Date: Sun, 24 Apr 2016 14:56:56 +1000 Subject: [PATCH 05/16] Make GUIEngine use pause_fps_max not fps_max --- src/guiEngine.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/guiEngine.cpp b/src/guiEngine.cpp index 84bc8488..ba286a91 100644 --- a/src/guiEngine.cpp +++ b/src/guiEngine.cpp @@ -361,7 +361,7 @@ void GUIEngine::cloudPreProcess() /******************************************************************************/ void GUIEngine::cloudPostProcess() { - float fps_max = g_settings->getFloat("fps_max"); + float fps_max = g_settings->getFloat("pause_fps_max"); // Time of frame without fps limit u32 busytime_u32; From 6569e39099e33dcbcde236f9f3c25531f4cd19f3 Mon Sep 17 00:00:00 2001 From: SmallJoker Date: Thu, 21 Apr 2016 21:54:30 +0200 Subject: [PATCH 06/16] tile.cpp: Automatically upscale lower resolution texture --- doc/lua_api.txt | 1 + src/client/tile.cpp | 23 ++++++++++++++++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/doc/lua_api.txt b/doc/lua_api.txt index fdc73690..47624496 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -243,6 +243,7 @@ Example: default_dirt.png^default_grass_side.png `default_grass_side.png` is overlayed over `default_dirt.png`. +The texture with the lower resolution will be automatically upscaled to the higher resolution texture. ### Texture grouping Textures can be grouped together by enclosing them in `(` and `)`. diff --git a/src/client/tile.cpp b/src/client/tile.cpp index e6668063..72d626da 100644 --- a/src/client/tile.cpp +++ b/src/client/tile.cpp @@ -1175,7 +1175,28 @@ bool TextureSource::generateImagePart(std::string part_of_name, core::rect(pos_from, dim), video::SColor(255,255,255,255), NULL);*/ - blit_with_alpha(image, baseimg, pos_from, pos_to, dim); + + core::dimension2d dim_dst = baseimg->getDimension(); + if (dim == dim_dst) { + blit_with_alpha(image, baseimg, pos_from, pos_to, dim); + } else if (dim.Width * dim.Height < dim_dst.Width * dim_dst.Height) { + // Upscale overlying image + video::IImage* scaled_image = m_device->getVideoDriver()-> + createImage(video::ECF_A8R8G8B8, dim_dst); + image->copyToScaling(scaled_image); + + blit_with_alpha(scaled_image, baseimg, pos_from, pos_to, dim_dst); + scaled_image->drop(); + } else { + // Upscale base image + video::IImage* scaled_base = m_device->getVideoDriver()-> + createImage(video::ECF_A8R8G8B8, dim); + baseimg->copyToScaling(scaled_base); + baseimg->drop(); + baseimg = scaled_base; + + blit_with_alpha(image, baseimg, pos_from, pos_to, dim); + } } //cleanup image->drop(); From b96bde331f9c74ec63f4dee2ec8062b4d0de93fc Mon Sep 17 00:00:00 2001 From: Xunto Date: Fri, 22 Apr 2016 15:49:06 +0300 Subject: [PATCH 07/16] Inventory: Make ItemStack with different metadata not stackable --- src/inventory.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/inventory.cpp b/src/inventory.cpp index fce8575e..cb8faecb 100644 --- a/src/inventory.cpp +++ b/src/inventory.cpp @@ -335,8 +335,9 @@ ItemStack ItemStack::addItem(const ItemStack &newitem_, *this = newitem; newitem.clear(); } - // If item name differs, bail out - else if(name != newitem.name) + // If item name or metadata differs, bail out + else if (name != newitem.name + || metadata != newitem.metadata) { // cannot be added } @@ -374,8 +375,9 @@ bool ItemStack::itemFits(const ItemStack &newitem_, { newitem.clear(); } - // If item name differs, bail out - else if(name != newitem.name) + // If item name or metadata differs, bail out + else if (name != newitem.name + || metadata != newitem.metadata) { // cannot be added } From be391fde1a10f14c36e002ffee2c1b7ea87e9e64 Mon Sep 17 00:00:00 2001 From: Maksim Gamarnik Date: Mon, 25 Apr 2016 15:05:35 +0300 Subject: [PATCH 08/16] Android: Update dependencies, GMP was required as a dependency --- build/android/Makefile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/build/android/Makefile b/build/android/Makefile index d27fb8cf..df5f65c4 100644 --- a/build/android/Makefile +++ b/build/android/Makefile @@ -107,7 +107,7 @@ OPENSSL_TIMESTAMP = $(OPENSSL_DIR)timestamp OPENSSL_TIMESTAMP_INT = $(ROOT)/deps/openssl_timestamp OPENSSL_URL = http://www.openssl.org/source/openssl-$(OPENSSL_VERSION).tar.gz -CURL_VERSION = 7.47.0 +CURL_VERSION = 7.48.0 CURL_DIR = $(ROOT)/deps/curl-$(CURL_VERSION) CURL_LIB = $(CURL_DIR)/lib/.libs/libcurl.a CURL_TIMESTAMP = $(CURL_DIR)/timestamp @@ -134,7 +134,7 @@ ICONV_TIMESTAMP = $(ICONV_DIR)timestamp ICONV_TIMESTAMP_INT = $(ROOT)/deps/iconv_timestamp ICONV_URL_HTTP = http://ftp.gnu.org/pub/gnu/libiconv/libiconv-$(ICONV_VERSION).tar.gz -SQLITE3_FOLDER = sqlite-amalgamation-3100200 +SQLITE3_FOLDER = sqlite-amalgamation-3120200 SQLITE3_URL = http://www.sqlite.org/2016/$(SQLITE3_FOLDER).zip -include $(PATHCFGFILE) @@ -307,7 +307,7 @@ openssl_download : openssl : $(OPENSSL_LIB) -$(OPENSSL_LIB): $(OPENSSL_TIMESTAMP) +$(OPENSSL_LIB): $(OPENSSL_TIMESTAMP) $(GMP_LIB) @REFRESH=0; \ if [ ! -e ${OPENSSL_TIMESTAMP_INT} ] ; then \ echo "${OPENSSL_TIMESTAMP_INT} doesn't exist"; \ From 04af4425fb13dd040e49dc17a0b3b7690483948d Mon Sep 17 00:00:00 2001 From: obneq Date: Thu, 28 Apr 2016 01:58:09 +1000 Subject: [PATCH 09/16] Handle particle spawners in env and delete expired ids Rebased by Zeno (2016-04-2016) --- src/environment.cpp | 46 +++++++++++++++++++++++++++++++++++++++++++++ src/environment.h | 7 +++++++ src/server.cpp | 25 ++++++++---------------- src/server.h | 6 +----- 4 files changed, 62 insertions(+), 22 deletions(-) diff --git a/src/environment.cpp b/src/environment.cpp index 902e2bda..413bc7ff 100644 --- a/src/environment.cpp +++ b/src/environment.cpp @@ -50,6 +50,9 @@ with this program; if not, write to the Free Software Foundation, Inc., #define LBM_NAME_ALLOWED_CHARS "abcdefghijklmnopqrstuvwxyz0123456789_:" +// A number that is much smaller than the timeout for particle spawners should/could ever be +#define PARTICLE_SPAWNER_NO_EXPIRY -1024.f + Environment::Environment(): m_time_of_day_speed(0), m_time_of_day(9000), @@ -1544,6 +1547,49 @@ void ServerEnvironment::step(float dtime) */ removeRemovedObjects(); } + + /* + Manage particle spawner expiration + */ + if (m_particle_management_interval.step(dtime, 1.0)) { + for (std::map::iterator i = m_particle_spawners.begin(); + i != m_particle_spawners.end(); ) { + //non expiring spawners + if (i->second == PARTICLE_SPAWNER_NO_EXPIRY) { + ++i; + continue; + } + + i->second -= 1.0f; + if (i->second <= 0.f) + m_particle_spawners.erase(i++); + else + ++i; + } + } +} + +u32 ServerEnvironment::addParticleSpawner(float exptime) +{ + // Timers with lifetime 0 do not expire + float time = exptime > 0.f ? exptime : PARTICLE_SPAWNER_NO_EXPIRY; + + u32 id = 0; + for (;;) { // look for unused particlespawner id + id++; + std::map::iterator f; + f = m_particle_spawners.find(id); + if (f == m_particle_spawners.end()) { + m_particle_spawners[id] = time; + break; + } + } + return id; +} + +void ServerEnvironment::deleteParticleSpawner(u32 id) +{ + m_particle_spawners.erase(id); } ServerActiveObject* ServerEnvironment::getActiveObject(u16 id) diff --git a/src/environment.h b/src/environment.h index 660c6f1b..c6786fae 100644 --- a/src/environment.h +++ b/src/environment.h @@ -337,6 +337,9 @@ public: // env_meta.txt doesn't exist (e.g. new world) void loadDefaultMeta(); + u32 addParticleSpawner(float exptime); + void deleteParticleSpawner(u32 id); + /* External ActiveObject interface ------------------------------------------- @@ -516,6 +519,10 @@ private: // Estimate for general maximum lag as determined by server. // Can raise to high values like 15s with eg. map generation mods. float m_max_lag_estimate; + + // Particles + IntervalLimiter m_particle_management_interval; + std::map m_particle_spawners; }; #ifndef SERVER diff --git a/src/server.cpp b/src/server.cpp index 6c008a2a..0aba2796 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -3194,19 +3194,7 @@ u32 Server::addParticleSpawner(u16 amount, float spawntime, peer_id = player->peer_id; } - u32 id = 0; - for(;;) // look for unused particlespawner id - { - id++; - if (std::find(m_particlespawner_ids.begin(), - m_particlespawner_ids.end(), id) - == m_particlespawner_ids.end()) - { - m_particlespawner_ids.push_back(id); - break; - } - } - + u32 id = m_env->addParticleSpawner(spawntime); SendAddParticleSpawner(peer_id, amount, spawntime, minpos, maxpos, minvel, maxvel, minacc, maxacc, minexptime, maxexptime, minsize, maxsize, @@ -3229,13 +3217,16 @@ void Server::deleteParticleSpawner(const std::string &playername, u32 id) peer_id = player->peer_id; } - m_particlespawner_ids.erase( - std::remove(m_particlespawner_ids.begin(), - m_particlespawner_ids.end(), id), - m_particlespawner_ids.end()); + m_env->deleteParticleSpawner(id); SendDeleteParticleSpawner(peer_id, id); } +void Server::deleteParticleSpawnerAll(u32 id) +{ + m_env->deleteParticleSpawner(id); + SendDeleteParticleSpawner(PEER_ID_INEXISTENT, id); +} + Inventory* Server::createDetachedInventory(const std::string &name) { if(m_detached_inventories.count(name) > 0){ diff --git a/src/server.h b/src/server.h index fd559ba1..daf51dee 100644 --- a/src/server.h +++ b/src/server.h @@ -287,6 +287,7 @@ public: const std::string &playername); void deleteParticleSpawner(const std::string &playername, u32 id); + void deleteParticleSpawnerAll(u32 id); // Creates or resets inventory Inventory* createDetachedInventory(const std::string &name); @@ -662,11 +663,6 @@ private: // key = name std::map m_detached_inventories; - /* - Particles - */ - std::vector m_particlespawner_ids; - DISABLE_CLASS_COPY(Server); }; From 8cf828a818c689668f76f5835d3e7172c3b76795 Mon Sep 17 00:00:00 2001 From: SmallJoker Date: Sun, 24 Apr 2016 15:44:10 +0200 Subject: [PATCH 10/16] Mainmenu: Standardize the menu button order and sizes --- builtin/mainmenu/dlg_config_world.lua | 38 ++++++++++++------------- builtin/mainmenu/dlg_create_world.lua | 6 ++-- builtin/mainmenu/dlg_delete_mod.lua | 9 +++--- builtin/mainmenu/dlg_delete_world.lua | 8 +++--- builtin/mainmenu/dlg_rename_modpack.lua | 12 ++++---- src/guiKeyChangeMenu.cpp | 4 +-- 6 files changed, 38 insertions(+), 39 deletions(-) diff --git a/builtin/mainmenu/dlg_config_world.lua b/builtin/mainmenu/dlg_config_world.lua index 4d13faea..eb0319ba 100644 --- a/builtin/mainmenu/dlg_config_world.lua +++ b/builtin/mainmenu/dlg_config_world.lua @@ -25,20 +25,20 @@ local function get_formspec(data) local mod = data.list:get_list()[data.selected_mod] local retval = - "size[11,6.5,true]" .. - "label[0.5,-0.25;" .. fgettext("World:") .. "]" .. - "label[1.75,-0.25;" .. data.worldspec.name .. "]" + "size[11.5,7.5,true]" .. + "label[0.5,0;" .. fgettext("World:") .. "]" .. + "label[1.75,0;" .. data.worldspec.name .. "]" if data.hide_gamemods then - retval = retval .. "checkbox[0,5.75;cb_hide_gamemods;" .. fgettext("Hide Game") .. ";true]" + retval = retval .. "checkbox[1,6;cb_hide_gamemods;" .. fgettext("Hide Game") .. ";true]" else - retval = retval .. "checkbox[0,5.75;cb_hide_gamemods;" .. fgettext("Hide Game") .. ";false]" + retval = retval .. "checkbox[1,6;cb_hide_gamemods;" .. fgettext("Hide Game") .. ";false]" end if data.hide_modpackcontents then - retval = retval .. "checkbox[2,5.75;cb_hide_mpcontent;" .. fgettext("Hide mp content") .. ";true]" + retval = retval .. "checkbox[6,6;cb_hide_mpcontent;" .. fgettext("Hide mp content") .. ";true]" else - retval = retval .. "checkbox[2,5.75;cb_hide_mpcontent;" .. fgettext("Hide mp content") .. ";false]" + retval = retval .. "checkbox[6,6;cb_hide_mpcontent;" .. fgettext("Hide mp content") .. ";false]" end if mod == nil then @@ -46,13 +46,13 @@ local function get_formspec(data) end retval = retval .. - "label[0,0.45;" .. fgettext("Mod:") .. "]" .. - "label[0.75,0.45;" .. mod.name .. "]" .. - "label[0,1;" .. fgettext("Depends:") .. "]" .. - "textlist[0,1.5;5,4.25;world_config_depends;" .. + "label[0,0.7;" .. fgettext("Mod:") .. "]" .. + "label[0.75,0.7;" .. mod.name .. "]" .. + "label[0,1.25;" .. fgettext("Depends:") .. "]" .. + "textlist[0,1.75;5,4.25;world_config_depends;" .. modmgr.get_dependencies(mod.path) .. ";0]" .. - "button[9.25,6.35;2,0.5;btn_config_world_save;" .. fgettext("Save") .. "]" .. - "button[7.4,6.35;2,0.5;btn_config_world_cancel;" .. fgettext("Cancel") .. "]" + "button[3.25,7;2.5,0.5;btn_config_world_save;" .. fgettext("Save") .. "]" .. + "button[5.75,7;2.5,0.5;btn_config_world_cancel;" .. fgettext("Cancel") .. "]" if mod ~= nil and mod.name ~= "" and mod.typ ~= "game_mod" then if mod.is_modpack then @@ -68,22 +68,22 @@ local function get_formspec(data) end if all_enabled == false then - retval = retval .. "button[5.5,-0.125;2,0.5;btn_mp_enable;" .. fgettext("Enable MP") .. "]" + retval = retval .. "button[5.5,0.125;2.5,0.5;btn_mp_enable;" .. fgettext("Enable MP") .. "]" else - retval = retval .. "button[5.5,-0.125;2,0.5;btn_mp_disable;" .. fgettext("Disable MP") .. "]" + retval = retval .. "button[5.5,0.125;2.5,0.5;btn_mp_disable;" .. fgettext("Disable MP") .. "]" end else if mod.enabled then - retval = retval .. "checkbox[5.5,-0.375;cb_mod_enable;" .. fgettext("enabled") .. ";true]" + retval = retval .. "checkbox[5.5,-0.125;cb_mod_enable;" .. fgettext("enabled") .. ";true]" else - retval = retval .. "checkbox[5.5,-0.375;cb_mod_enable;" .. fgettext("enabled") .. ";false]" + retval = retval .. "checkbox[5.5,-0.125;cb_mod_enable;" .. fgettext("enabled") .. ";false]" end end end retval = retval .. - "button[8.5,-0.125;2.5,0.5;btn_all_mods;" .. fgettext("Enable all") .. "]" .. - "textlist[5.5,0.5;5.5,5.75;world_config_modlist;" + "button[8.75,0.125;2.5,0.5;btn_all_mods;" .. fgettext("Enable all") .. "]" .. + "textlist[5.5,0.75;5.75,5.25;world_config_modlist;" retval = retval .. modmgr.render_modlist(data.list) retval = retval .. ";" .. data.selected_mod .."]" diff --git a/builtin/mainmenu/dlg_create_world.lua b/builtin/mainmenu/dlg_create_world.lua index b42d119e..477b8bcb 100644 --- a/builtin/mainmenu/dlg_create_world.lua +++ b/builtin/mainmenu/dlg_create_world.lua @@ -46,7 +46,7 @@ local function create_world_formspec(dialogdata) current_seed = core.formspec_escape(current_seed) local retval = - "size[12,6,true]" .. + "size[11.5,6.5,true]" .. "label[2,0;" .. fgettext("World name") .. "]".. "field[4.5,0.4;6,0.5;te_world_name;;]" .. @@ -60,8 +60,8 @@ local function create_world_formspec(dialogdata) "textlist[4.2,3;5.8,2.3;games;" .. gamemgr.gamelist() .. ";" .. gameidx .. ";true]" .. - "button[5,5.5;2.6,0.5;world_create_confirm;" .. fgettext("Create") .. "]" .. - "button[7.5,5.5;2.8,0.5;world_create_cancel;" .. fgettext("Cancel") .. "]" + "button[3.25,6;2.5,0.5;world_create_confirm;" .. fgettext("Create") .. "]" .. + "button[5.75,6;2.5,0.5;world_create_cancel;" .. fgettext("Cancel") .. "]" if #gamemgr.games == 0 then retval = retval .. "box[2,4;8,1;#ff8800]label[2.25,4;" .. diff --git a/builtin/mainmenu/dlg_delete_mod.lua b/builtin/mainmenu/dlg_delete_mod.lua index 6e00b804..2efd7041 100644 --- a/builtin/mainmenu/dlg_delete_mod.lua +++ b/builtin/mainmenu/dlg_delete_mod.lua @@ -22,10 +22,11 @@ local function delete_mod_formspec(dialogdata) dialogdata.mod = modmgr.global_mods:get_list()[dialogdata.selected] local retval = - "size[12.4,5,true]" .. - "field[1.75,1;10,3;;" .. fgettext("Are you sure you want to delete \"$1\"?", dialogdata.mod.name) .. ";]".. - "button[4,4.2;1,0.5;dlg_delete_mod_confirm;" .. fgettext("Yes") .. "]" .. - "button[6.5,4.2;3,0.5;dlg_delete_mod_cancel;" .. fgettext("No of course not!") .. "]" + "size[11.5,4.5,true]" .. + "label[2,2;" .. + fgettext("Are you sure you want to delete \"$1\"?", dialogdata.mod.name) .. "]".. + "button[3.25,3.5;2.5,0.5;dlg_delete_mod_confirm;" .. fgettext("Delete") .. "]" .. + "button[5.75,3.5;2.5,0.5;dlg_delete_mod_cancel;" .. fgettext("Cancel") .. "]" return retval end diff --git a/builtin/mainmenu/dlg_delete_world.lua b/builtin/mainmenu/dlg_delete_world.lua index aa710ef3..1e5af1fe 100644 --- a/builtin/mainmenu/dlg_delete_world.lua +++ b/builtin/mainmenu/dlg_delete_world.lua @@ -19,11 +19,11 @@ local function delete_world_formspec(dialogdata) local retval = - "size[12,6,true]" .. + "size[11.5,4.5,true]" .. "label[2,2;" .. - fgettext("Delete World \"$1\"?", dialogdata.delete_name) .. "]".. - "button[3.5,4.2;2.6,0.5;world_delete_confirm;" .. fgettext("Yes").. "]" .. - "button[6,4.2;2.8,0.5;world_delete_cancel;" .. fgettext("No") .. "]" + fgettext("Delete World \"$1\"?", dialogdata.delete_name) .. "]" .. + "button[3.25,3.5;2.5,0.5;world_delete_confirm;" .. fgettext("Delete") .. "]" .. + "button[5.75,3.5;2.5,0.5;world_delete_cancel;" .. fgettext("Cancel") .. "]" return retval end diff --git a/builtin/mainmenu/dlg_rename_modpack.lua b/builtin/mainmenu/dlg_rename_modpack.lua index 9e252408..959c65d9 100644 --- a/builtin/mainmenu/dlg_rename_modpack.lua +++ b/builtin/mainmenu/dlg_rename_modpack.lua @@ -22,14 +22,12 @@ local function rename_modpack_formspec(dialogdata) dialogdata.mod = modmgr.global_mods:get_list()[dialogdata.selected] local retval = - "size[12.4,5,true]" .. - "label[1.75,1;".. fgettext("Rename Modpack:") .. "]".. - "field[4.5,1.4;6,0.5;te_modpack_name;;" .. - dialogdata.mod.name .. - "]" .. - "button[5,4.2;2.6,0.5;dlg_rename_modpack_confirm;".. + "size[11.5,4.5,true]" .. + "field[2.5,2;7,0.5;te_modpack_name;".. fgettext("Rename Modpack:") .. ";" .. + dialogdata.mod.name .. "]" .. + "button[3.25,3.5;2.5,0.5;dlg_rename_modpack_confirm;".. fgettext("Accept") .. "]" .. - "button[7.5,4.2;2.8,0.5;dlg_rename_modpack_cancel;".. + "button[5.75,3.5;2.5,0.5;dlg_rename_modpack_cancel;".. fgettext("Cancel") .. "]" return retval diff --git a/src/guiKeyChangeMenu.cpp b/src/guiKeyChangeMenu.cpp index bb878d6e..b0581825 100644 --- a/src/guiKeyChangeMenu.cpp +++ b/src/guiKeyChangeMenu.cpp @@ -187,7 +187,7 @@ void GUIKeyChangeMenu::regenerateGui(v2u32 screensize) { core::rect < s32 > rect(0, 0, 100, 30); - rect += topleft + v2s32(size.X - 100 - 20, size.Y - 40); + rect += topleft + v2s32(size.X / 2 - 105, size.Y - 40); const wchar_t *text = wgettext("Save"); Environment->addButton(rect, this, GUI_ID_BACK_BUTTON, text); @@ -195,7 +195,7 @@ void GUIKeyChangeMenu::regenerateGui(v2u32 screensize) } { core::rect < s32 > rect(0, 0, 100, 30); - rect += topleft + v2s32(size.X - 100 - 20 - 100 - 20, size.Y - 40); + rect += topleft + v2s32(size.X / 2 + 5, size.Y - 40); const wchar_t *text = wgettext("Cancel"); Environment->addButton(rect, this, GUI_ID_ABORT_BUTTON, text); From 21e176b7a0d0c5f9dcf78b1da95a1c487269f27f Mon Sep 17 00:00:00 2001 From: rubenwardy Date: Sat, 9 Apr 2016 16:07:45 +0100 Subject: [PATCH 11/16] Builtin: Add basic_privs setting --- builtin/game/chatcommands.lua | 8 ++++++-- builtin/settingtypes.txt | 3 +++ doc/lua_api.txt | 1 + minetest.conf.example | 5 ++++- 4 files changed, 14 insertions(+), 3 deletions(-) diff --git a/builtin/game/chatcommands.lua b/builtin/game/chatcommands.lua index 4deff281..7480446f 100644 --- a/builtin/game/chatcommands.lua +++ b/builtin/game/chatcommands.lua @@ -181,8 +181,10 @@ core.register_chatcommand("grant", { end local privs = core.get_player_privs(grantname) local privs_unknown = "" + local basic_privs = + core.string_to_privs(core.setting_get("basic_privs") or "interact,shout") for priv, _ in pairs(grantprivs) do - if priv ~= "interact" and priv ~= "shout" and + if not basic_privs[priv] and not core.check_player_privs(name, {privs=true}) then return false, "Your privileges are insufficient." end @@ -223,8 +225,10 @@ core.register_chatcommand("revoke", { end local revoke_privs = core.string_to_privs(revoke_priv_str) local privs = core.get_player_privs(revoke_name) + local basic_privs = + core.string_to_privs(core.setting_get("basic_privs") or "interact,shout") for priv, _ in pairs(revoke_privs) do - if priv ~= "interact" and priv ~= "shout" and + if not basic_privs[priv] and not core.check_player_privs(name, {privs=true}) then return false, "Your privileges are insufficient." end diff --git a/builtin/settingtypes.txt b/builtin/settingtypes.txt index ca331ff4..0a951961 100644 --- a/builtin/settingtypes.txt +++ b/builtin/settingtypes.txt @@ -691,6 +691,9 @@ default_password (Default password) string # See /privs in game for a full list on your server and mod configuration. default_privs (Default privileges) string interact, shout +# Privileges that players with basic_privs can grant +basic_privs (Basic Privileges) string interact, shout + # Whether players are shown to clients without any range limit. # Deprecated, use the setting player_transfer_distance instead. unlimited_player_transfer_distance (Unlimited player transfer distance) bool true diff --git a/doc/lua_api.txt b/doc/lua_api.txt index 47624496..4b5f969d 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -1924,6 +1924,7 @@ Call these functions only at load time! * `minetest.register_privilege(name, definition)` * `definition`: `"description text"` * `definition`: `{ description = "description text", give_to_singleplayer = boolean, -- default: true }` + * To allow players with basic_privs to grant, see basic_privs minetest.conf setting. * `minetest.register_authentication_handler(handler)` * See `minetest.builtin_auth_handler` in `builtin.lua` for reference diff --git a/minetest.conf.example b/minetest.conf.example index e913140a..6f0eb786 100644 --- a/minetest.conf.example +++ b/minetest.conf.example @@ -826,6 +826,10 @@ # type: string # default_privs = interact, shout +# Privileges that players with basic_privs can grant +# type: string +# basic_privs = interact, shout + # Whether players are shown to clients without any range limit. # Deprecated, use the setting player_transfer_distance instead. # type: bool @@ -1513,4 +1517,3 @@ # type: string # modstore_details_url = https://forum.minetest.net/mmdb/mod/*/ - From 14c82f432b29356e6d15d3bade347885df21eea7 Mon Sep 17 00:00:00 2001 From: kilbith Date: Mon, 25 Apr 2016 11:18:17 +0200 Subject: [PATCH 12/16] Android menu: Unified serverlist --- builtin/mainmenu/tab_simple_main.lua | 210 ++++++++++++++------------- 1 file changed, 110 insertions(+), 100 deletions(-) diff --git a/builtin/mainmenu/tab_simple_main.lua b/builtin/mainmenu/tab_simple_main.lua index cb64b73f..3818f321 100644 --- a/builtin/mainmenu/tab_simple_main.lua +++ b/builtin/mainmenu/tab_simple_main.lua @@ -17,66 +17,80 @@ -------------------------------------------------------------------------------- local function get_formspec(tabview, name, tabdata) - local retval = "" + -- Update the cached supported proto info, + -- it may have changed after a change by the settings menu. + common_update_cached_supp_proto() + local fav_selected = menudata.favorites[tabdata.fav_selected] - local render_details = dump(core.setting_getbool("public_serverlist")) + local retval = + "label[9.5,0;".. fgettext("Name / Password") .. "]" .. + "field[0.25,3.35;5.5,0.5;te_address;;" .. + core.formspec_escape(core.setting_get("address")) .."]" .. + "field[5.75,3.35;2.25,0.5;te_port;;" .. + core.formspec_escape(core.setting_get("remote_port")) .."]" .. + "button[10,2.6;2,1.5;btn_mp_connect;".. fgettext("Connect") .. "]" .. + "field[9.8,1;2.6,0.5;te_name;;" .. + core.formspec_escape(core.setting_get("name")) .."]" .. + "pwdfield[9.8,2;2.6,0.5;te_pwd;]" - retval = retval .. - "label[8,0.5;".. fgettext("Name/Password") .. "]" .. - "field[0.25,3.25;5.5,0.5;te_address;;" .. - core.formspec_escape(core.setting_get("address")) .."]" .. - "field[5.75,3.25;2.25,0.5;te_port;;" .. - core.formspec_escape(core.setting_get("remote_port")) .."]" .. - "checkbox[8,-0.25;cb_public_serverlist;".. fgettext("Public Serverlist") .. ";" .. - render_details .. "]" - retval = retval .. - "button[8,2.5;4,1.5;btn_mp_connect;".. fgettext("Connect") .. "]" .. - "field[8.75,1.5;3.5,0.5;te_name;;" .. - core.formspec_escape(core.setting_get("name")) .."]" .. - "pwdfield[8.75,2.3;3.5,0.5;te_pwd;]" - - if render_details then - retval = retval .. "tablecolumns[" .. - "color,span=3;" .. - "text,align=right;" .. -- clients - "text,align=center,padding=0.25;" .. -- "/" - "text,align=right,padding=0.25;" .. -- clients_max - image_column(fgettext("Creative mode"), "creative") .. ",padding=1;" .. - image_column(fgettext("Damage enabled"), "damage") .. ",padding=0.25;" .. - image_column(fgettext("PvP enabled"), "pvp") .. ",padding=0.25;" .. - "color,span=1;" .. - "text,padding=1]" -- name - else - retval = retval .. "tablecolumns[text]" - end - retval = retval .. - "table[-0.05,0;7.55,2.75;favourites;" - - if #menudata.favorites > 0 then - retval = retval .. render_favorite(menudata.favorites[1],render_details) - - for i=2,#menudata.favorites,1 do - retval = retval .. "," .. render_favorite(menudata.favorites[i],render_details) + if tabdata.fav_selected and fav_selected then + if gamedata.fav then + retval = retval .. "button[7.7,2.6;2.3,1.5;btn_delete_favorite;" .. + fgettext("Del. Favorite") .. "]" end end - if tabdata.fav_selected ~= nil then + retval = retval .. "tablecolumns[" .. + image_column(fgettext("Favorite"), "favorite") .. ";" .. + "color,span=3;" .. + "text,align=right;" .. -- clients + "text,align=center,padding=0.25;" .. -- "/" + "text,align=right,padding=0.25;" .. -- clients_max + image_column(fgettext("Creative mode"), "creative") .. ",padding=1;" .. + image_column(fgettext("Damage enabled"), "damage") .. ",padding=0.25;" .. + image_column(fgettext("PvP enabled"), "pvp") .. ",padding=0.25;" .. + "color,span=1;" .. + "text,padding=1]" .. -- name + "table[-0.05,0;9.2,2.75;favourites;" + + if #menudata.favorites > 0 then + local favs = core.get_favorites("local") + if #favs > 0 then + for i = 1, #favs do + for j = 1, #menudata.favorites do + if menudata.favorites[j].address == favs[i].address and + menudata.favorites[j].port == favs[i].port then + table.insert(menudata.favorites, i, + table.remove(menudata.favorites, j)) + end + end + if favs[i].address ~= menudata.favorites[i].address then + table.insert(menudata.favorites, i, favs[i]) + end + end + end + retval = retval .. render_favorite(menudata.favorites[1], (#favs > 0)) + for i = 2, #menudata.favorites do + retval = retval .. "," .. render_favorite(menudata.favorites[i], (i <= #favs)) + end + end + + if tabdata.fav_selected then retval = retval .. ";" .. tabdata.fav_selected .. "]" else retval = retval .. ";0]" end -- separator - retval = retval .. - "box[-0.28,3.75;12.4,0.1;#FFFFFF]" + retval = retval .. "box[-0.28,3.75;12.4,0.1;#FFFFFF]" -- checkboxes retval = retval .. "checkbox[8.0,3.9;cb_creative;".. fgettext("Creative Mode") .. ";" .. - dump(core.setting_getbool("creative_mode")) .. "]".. + dump(core.setting_getbool("creative_mode")) .. "]".. "checkbox[8.0,4.4;cb_damage;".. fgettext("Enable Damage") .. ";" .. - dump(core.setting_getbool("enable_damage")) .. "]" + dump(core.setting_getbool("enable_damage")) .. "]" -- buttons retval = retval .. "button[0,3.7;8,1.5;btn_start_singleplayer;" .. fgettext("Start Singleplayer") .. "]" .. @@ -87,97 +101,100 @@ end -------------------------------------------------------------------------------- local function main_button_handler(tabview, fields, name, tabdata) - - if fields["btn_start_singleplayer"] then + if fields.btn_start_singleplayer then gamedata.selected_world = gamedata.worldindex gamedata.singleplayer = true core.start() return true end - if fields["favourites"] ~= nil then - local event = core.explode_table_event(fields["favourites"]) - + if fields.favourites then + local event = core.explode_table_event(fields.favourites) if event.type == "CHG" then if event.row <= #menudata.favorites then - local address = menudata.favorites[event.row].address - local port = menudata.favorites[event.row].port + gamedata.fav = false + local favs = core.get_favorites("local") + local fav = menudata.favorites[event.row] + local address = fav.address + local port = fav.port + gamedata.serverdescription = fav.description - if address ~= nil and - port ~= nil then - core.setting_set("address",address) - core.setting_set("remote_port",port) + for i = 1, #favs do + if fav.address == favs[i].address and + fav.port == favs[i].port then + gamedata.fav = true + end end + if address and port then + core.setting_set("address", address) + core.setting_set("remote_port", port) + end tabdata.fav_selected = event.row end + return true end + end + + if fields.btn_delete_favorite then + local current_favourite = core.get_table_index("favourites") + if not current_favourite then return end + + core.delete_favorite(current_favourite) + asyncOnlineFavourites() + tabdata.fav_selected = nil + + core.setting_set("address", "") + core.setting_set("remote_port", "30000") return true end - if fields["cb_public_serverlist"] ~= nil then - core.setting_set("public_serverlist", fields["cb_public_serverlist"]) - - if core.setting_getbool("public_serverlist") then - asyncOnlineFavourites() - else - menudata.favorites = core.get_favorites("local") - menudata.favorites_is_public = false - end + if fields.cb_creative then + core.setting_set("creative_mode", fields.cb_creative) return true end - if fields["cb_creative"] then - core.setting_set("creative_mode", fields["cb_creative"]) + if fields.cb_damage then + core.setting_set("enable_damage", fields.cb_damage) return true end - if fields["cb_damage"] then - core.setting_set("enable_damage", fields["cb_damage"]) - return true - end - - if fields["btn_mp_connect"] ~= nil or - fields["key_enter"] ~= nil then - - gamedata.playername = fields["te_name"] - gamedata.password = fields["te_pwd"] - gamedata.address = fields["te_address"] - gamedata.port = fields["te_port"] - + if fields.btn_mp_connect or fields.key_enter then + gamedata.playername = fields.te_name + gamedata.password = fields.te_pwd + gamedata.address = fields.te_address + gamedata.port = fields.te_port local fav_idx = core.get_textlist_index("favourites") - if fav_idx ~= nil and fav_idx <= #menudata.favorites and - menudata.favorites[fav_idx].address == fields["te_address"] and - menudata.favorites[fav_idx].port == fields["te_port"] then + if fav_idx and fav_idx <= #menudata.favorites and + menudata.favorites[fav_idx].address == fields.te_address and + menudata.favorites[fav_idx].port == fields.te_port then local fav = menudata.favorites[fav_idx] - gamedata.servername = fav.name gamedata.serverdescription = fav.description if menudata.favorites_is_public and - not is_server_protocol_compat_or_error( - fav.proto_min, fav.proto_max) then + not is_server_protocol_compat_or_error( + fav.proto_min, fav.proto_max) then return true end else - gamedata.servername = "" - gamedata.serverdescription = "" + gamedata.servername = "" + gamedata.serverdescription = "" end gamedata.selected_world = 0 - core.setting_set("address",fields["te_address"]) - core.setting_set("remote_port",fields["te_port"]) + core.setting_set("address", fields.te_address) + core.setting_set("remote_port", fields.te_port) core.start() return true end - if fields["btn_config_sp_world"] ~= nil then + if fields.btn_config_sp_world then local configdialog = create_configure_world_dlg(1) - - if (configdialog ~= nil) then + if configdialog then configdialog:set_parent(tabview) tabview:hide() configdialog:show() @@ -188,15 +205,8 @@ end -------------------------------------------------------------------------------- local function on_activate(type,old_tab,new_tab) - if type == "LEAVE" then - return - end - if core.setting_getbool("public_serverlist") then - asyncOnlineFavourites() - else - menudata.favorites = core.get_favorites("local") - menudata.favorites_is_public = false - end + if type == "LEAVE" then return end + asyncOnlineFavourites() end -------------------------------------------------------------------------------- From 0d64d635911b35ee53a8052c208c99d9fb4982f6 Mon Sep 17 00:00:00 2001 From: tenplus1 Date: Thu, 28 Apr 2016 23:59:54 +1000 Subject: [PATCH 13/16] Avoid teleporting player if /teleport coords are out-of-range --- builtin/game/chatcommands.lua | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/builtin/game/chatcommands.lua b/builtin/game/chatcommands.lua index 7480446f..3350140e 100644 --- a/builtin/game/chatcommands.lua +++ b/builtin/game/chatcommands.lua @@ -352,10 +352,16 @@ core.register_chatcommand("teleport", { p.x = tonumber(p.x) p.y = tonumber(p.y) p.z = tonumber(p.z) - teleportee = core.get_player_by_name(name) - if teleportee and p.x and p.y and p.z then - teleportee:setpos(p) - return true, "Teleporting to "..core.pos_to_string(p) + if p.x and p.y and p.z then + local lm = tonumber(minetest.setting_get("map_generation_limit") or 31000) + if p.x < -lm or p.x > lm or p.y < -lm or p.y > lm or p.z < -lm or p.z > lm then + return false, "Cannot teleport out of map bounds!" + end + teleportee = core.get_player_by_name(name) + if teleportee then + teleportee:setpos(p) + return true, "Teleporting to "..core.pos_to_string(p) + end end local teleportee = nil From 9459112457065db76d47d0e4a280e8399e0cfa0e Mon Sep 17 00:00:00 2001 From: ShadowNinja Date: Wed, 13 Apr 2016 14:14:04 -0400 Subject: [PATCH 14/16] Upgrade Android build to Gradle build system The old Ant build system has been deprecated for a while and new development is focused on Gradle. I also removed a hardcoded string that lint caught and moved the patch files to a subdirectory. I left the JNI files in the root directory. --- .gitignore | 15 +- build/android/AndroidManifest.xml.template | 35 -- build/android/Makefile | 372 ++++++++---------- build/android/build.gradle | 49 +++ build/android/build.xml | 16 - build/android/jni/Android.mk | 32 +- build/android/jni/Application.mk | 3 +- .../{ => patches}/irrlicht-back_button.patch | 0 .../{ => patches}/irrlicht-texturehack.patch | 0 .../{ => patches}/irrlicht-touchcount.patch | 0 .../{ => patches}/libiconv_android.patch | 0 .../{ => patches}/libiconv_stdio.patch | 0 .../{ => patches}/libvorbis-libogg-fpu.patch | 0 .../android/{ => patches}/openssl_arch.patch | 0 build/android/project.properties | 1 - build/android/settings.gradle | 2 + build/android/src/debug/AndroidManifest.xml | 4 + build/android/src/main/AndroidManifest.xml | 34 ++ .../MinetestAssetCopy.java | 0 .../MinetestTextEntry.java | 0 .../MtNativeActivity.java | 0 .../main}/res/drawable-hdpi/irr_icon.png | Bin .../main}/res/drawable-ldpi/irr_icon.png | Bin .../main}/res/drawable-mdpi/irr_icon.png | Bin .../main}/res/drawable-xhdpi/irr_icon.png | Bin .../{ => src/main}/res/layout/assetcopy.xml | 2 +- build/android/src/main/res/values/strings.xml | 5 + .../{ => src/main}/res/values/styles.xml | 0 util/bump_version.sh | 8 +- 29 files changed, 291 insertions(+), 287 deletions(-) delete mode 100644 build/android/AndroidManifest.xml.template create mode 100644 build/android/build.gradle delete mode 100644 build/android/build.xml rename build/android/{ => patches}/irrlicht-back_button.patch (100%) rename build/android/{ => patches}/irrlicht-texturehack.patch (100%) rename build/android/{ => patches}/irrlicht-touchcount.patch (100%) rename build/android/{ => patches}/libiconv_android.patch (100%) rename build/android/{ => patches}/libiconv_stdio.patch (100%) rename build/android/{ => patches}/libvorbis-libogg-fpu.patch (100%) rename build/android/{ => patches}/openssl_arch.patch (100%) delete mode 100644 build/android/project.properties create mode 100644 build/android/settings.gradle create mode 100644 build/android/src/debug/AndroidManifest.xml create mode 100644 build/android/src/main/AndroidManifest.xml rename build/android/src/{net/minetest/minetest => main/java/net.minetest.minetest}/MinetestAssetCopy.java (100%) rename build/android/src/{net/minetest/minetest => main/java/net.minetest.minetest}/MinetestTextEntry.java (100%) rename build/android/src/{net/minetest/minetest => main/java/net.minetest.minetest}/MtNativeActivity.java (100%) rename build/android/{ => src/main}/res/drawable-hdpi/irr_icon.png (100%) rename build/android/{ => src/main}/res/drawable-ldpi/irr_icon.png (100%) rename build/android/{ => src/main}/res/drawable-mdpi/irr_icon.png (100%) rename build/android/{ => src/main}/res/drawable-xhdpi/irr_icon.png (100%) rename build/android/{ => src/main}/res/layout/assetcopy.xml (94%) create mode 100644 build/android/src/main/res/values/strings.xml rename build/android/{ => src/main}/res/values/styles.xml (100%) diff --git a/.gitignore b/.gitignore index cd6ee3e3..f9c664da 100644 --- a/.gitignore +++ b/.gitignore @@ -73,15 +73,14 @@ locale/ *.a ## Android build files -build/android/assets -build/android/bin -build/android/Debug +build/android/src/main/assets +build/android/build build/android/deps -build/android/gen -build/android/jni/src build/android/libs +build/android/jni/src +build/android/src/main/jniLibs build/android/obj -build/android/path.cfg -build/android/and_env -build/android/AndroidManifest.xml +build/android/local.properties +build/android/.gradle timestamp + diff --git a/build/android/AndroidManifest.xml.template b/build/android/AndroidManifest.xml.template deleted file mode 100644 index 0f75ca64..00000000 --- a/build/android/AndroidManifest.xml.template +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - ###DEBUG_BUILD### - - - - - - - - - - - - - - diff --git a/build/android/Makefile b/build/android/Makefile index df5f65c4..f3a18189 100644 --- a/build/android/Makefile +++ b/build/android/Makefile @@ -8,29 +8,21 @@ OS := $(shell uname) # build for build platform APP_PLATFORM = android-9 -# paths used for timestaps, dependencys, tree config and libs -PATHCFGFILE = path.cfg - -ROOT = $(shell pwd) +ANDR_ROOT = $(shell pwd) +PROJ_ROOT = $(shell realpath $(ANDR_ROOT)/../..) +APP_ROOT = $(ANDR_ROOT)/src/main GAMES_TO_COPY = minetest_game MODS_TO_COPY = -VERSION_MAJOR := $(shell cat $(ROOT)/../../CMakeLists.txt | \ +VERSION_MAJOR := $(shell cat $(PROJ_ROOT)/CMakeLists.txt | \ grep ^set\(VERSION_MAJOR\ | sed 's/)/ /' | cut -f2 -d' ') -VERSION_MINOR := $(shell cat $(ROOT)/../../CMakeLists.txt | \ +VERSION_MINOR := $(shell cat $(PROJ_ROOT)/CMakeLists.txt | \ grep ^set\(VERSION_MINOR\ | sed 's/)/ /' | cut -f2 -d' ') -VERSION_PATCH := $(shell cat $(ROOT)/../../CMakeLists.txt | \ +VERSION_PATCH := $(shell cat $(PROJ_ROOT)/CMakeLists.txt | \ grep ^set\(VERSION_PATCH\ | sed 's/)/ /' | cut -f2 -d' ') -################################################################################ -# Android Version code -# Increase for each build! -################################################################################ -# Play Store actual version (16/03/15): 11 -ANDROID_VERSION_CODE = 13 - ################################################################################ # toolchain config for arm new processors ################################################################################ @@ -42,7 +34,7 @@ TARGET_CFLAGS_ADDON = -mfloat-abi=softfp -mfpu=vfpv3 -O3 TARGET_CXXFLAGS_ADDON = $(TARGET_CFLAGS_ADDON) TARGET_ARCH = armv7 CROSS_PREFIX = arm-linux-androideabi- -COMPILER_VERSION = 4.8 +COMPILER_VERSION = 4.9 HAVE_LEVELDB = 1 ################################################################################ @@ -54,7 +46,7 @@ HAVE_LEVELDB = 1 #TARGET_TOOLCHAIN = mipsel-linux-android- #TARGET_ARCH = mips32 #CROSS_PREFIX = mipsel-linux-android- -#COMPILER_VERSION = 4.8 +#COMPILER_VERSION = 4.9 #HAVE_LEVELDB = 0 ################################################################################ @@ -66,78 +58,80 @@ HAVE_LEVELDB = 1 #TARGET_TOOLCHAIN = x86- #CROSS_PREFIX = i686-linux-android- #TARGET_ARCH = x86 -#COMPILER_VERSION = 4.8 +#COMPILER_VERSION = 4.9 #HAVE_LEVELDB = 1 ################################################################################ ASSETS_TIMESTAMP = deps/assets_timestamp -LEVELDB_DIR = $(ROOT)/deps/leveldb/ +LEVELDB_DIR = $(ANDR_ROOT)/deps/leveldb/ LEVELDB_LIB = $(LEVELDB_DIR)libleveldb.a LEVELDB_TIMESTAMP = $(LEVELDB_DIR)/timestamp -LEVELDB_TIMESTAMP_INT = $(ROOT)/deps/leveldb_timestamp +LEVELDB_TIMESTAMP_INT = $(ANDR_ROOT)/deps/leveldb_timestamp LEVELDB_URL_GIT = https://github.com/google/leveldb LEVELDB_COMMIT = 2d0320a458d0e6a20fff46d5f80b18bfdcce7018 -OPENAL_DIR = $(ROOT)/deps/openal-soft/ +OPENAL_DIR = $(ANDR_ROOT)/deps/openal-soft/ OPENAL_LIB = $(OPENAL_DIR)libs/$(TARGET_ABI)/libopenal.so OPENAL_TIMESTAMP = $(OPENAL_DIR)/timestamp -OPENAL_TIMESTAMP_INT = $(ROOT)/deps/openal_timestamp +OPENAL_TIMESTAMP_INT = $(ANDR_ROOT)/deps/openal_timestamp OPENAL_URL_GIT = https://github.com/apportable/openal-soft -OGG_DIR = $(ROOT)/deps/libvorbis-libogg-android/ +OGG_DIR = $(ANDR_ROOT)/deps/libvorbis-libogg-android/ OGG_LIB = $(OGG_DIR)libs/$(TARGET_ABI)/libogg.so VORBIS_LIB = $(OGG_DIR)libs/$(TARGET_ABI)/libogg.so OGG_TIMESTAMP = $(OGG_DIR)timestamp -OGG_TIMESTAMP_INT = $(ROOT)/deps/ogg_timestamp +OGG_TIMESTAMP_INT = $(ANDR_ROOT)/deps/ogg_timestamp OGG_URL_GIT = https://github.com/vincentjames501/libvorbis-libogg-android IRRLICHT_REVISION = 5122 -IRRLICHT_DIR = $(ROOT)/deps/irrlicht/ +IRRLICHT_DIR = $(ANDR_ROOT)/deps/irrlicht/ IRRLICHT_LIB = $(IRRLICHT_DIR)lib/Android/libIrrlicht.a IRRLICHT_TIMESTAMP = $(IRRLICHT_DIR)timestamp -IRRLICHT_TIMESTAMP_INT = $(ROOT)/deps/irrlicht_timestamp +IRRLICHT_TIMESTAMP_INT = $(ANDR_ROOT)/deps/irrlicht_timestamp IRRLICHT_URL_SVN = http://svn.code.sf.net/p/irrlicht/code/branches/ogl-es@$(IRRLICHT_REVISION) OPENSSL_VERSION = 1.0.2g OPENSSL_BASEDIR = openssl-$(OPENSSL_VERSION) -OPENSSL_DIR = $(ROOT)/deps/$(OPENSSL_BASEDIR)/ +OPENSSL_DIR = $(ANDR_ROOT)/deps/$(OPENSSL_BASEDIR)/ OPENSSL_LIB = $(OPENSSL_DIR)/libssl.so.1.0.0 OPENSSL_TIMESTAMP = $(OPENSSL_DIR)timestamp -OPENSSL_TIMESTAMP_INT = $(ROOT)/deps/openssl_timestamp +OPENSSL_TIMESTAMP_INT = $(ANDR_ROOT)/deps/openssl_timestamp OPENSSL_URL = http://www.openssl.org/source/openssl-$(OPENSSL_VERSION).tar.gz CURL_VERSION = 7.48.0 -CURL_DIR = $(ROOT)/deps/curl-$(CURL_VERSION) +CURL_DIR = $(ANDR_ROOT)/deps/curl-$(CURL_VERSION) CURL_LIB = $(CURL_DIR)/lib/.libs/libcurl.a CURL_TIMESTAMP = $(CURL_DIR)/timestamp -CURL_TIMESTAMP_INT = $(ROOT)/deps/curl_timestamp +CURL_TIMESTAMP_INT = $(ANDR_ROOT)/deps/curl_timestamp CURL_URL_HTTP = http://curl.haxx.se/download/curl-${CURL_VERSION}.tar.bz2 GMP_VERSION = 6.1.0 -GMP_DIR = $(ROOT)/deps/gmp-$(GMP_VERSION) +GMP_DIR = $(ANDR_ROOT)/deps/gmp-$(GMP_VERSION) GMP_LIB = $(GMP_DIR)/usr/lib/libgmp.so GMP_TIMESTAMP = $(GMP_DIR)/timestamp -GMP_TIMESTAMP_INT = $(ROOT)/deps/gmp_timestamp +GMP_TIMESTAMP_INT = $(ANDR_ROOT)/deps/gmp_timestamp GMP_URL_HTTP = https://gmplib.org/download/gmp/gmp-$(GMP_VERSION).tar.bz2 -FREETYPE_DIR = $(ROOT)/deps/freetype2-android/ +FREETYPE_DIR = $(ANDR_ROOT)/deps/freetype2-android/ FREETYPE_LIB = $(FREETYPE_DIR)/Android/obj/local/$(TARGET_ABI)/libfreetype2-static.a FREETYPE_TIMESTAMP = $(FREETYPE_DIR)timestamp -FREETYPE_TIMESTAMP_INT = $(ROOT)/deps/freetype_timestamp +FREETYPE_TIMESTAMP_INT = $(ANDR_ROOT)/deps/freetype_timestamp FREETYPE_URL_GIT = https://github.com/cdave1/freetype2-android ICONV_VERSION = 1.14 -ICONV_DIR = $(ROOT)/deps/libiconv/ +ICONV_DIR = $(ANDR_ROOT)/deps/libiconv/ ICONV_LIB = $(ICONV_DIR)/lib/.libs/libiconv.so ICONV_TIMESTAMP = $(ICONV_DIR)timestamp -ICONV_TIMESTAMP_INT = $(ROOT)/deps/iconv_timestamp +ICONV_TIMESTAMP_INT = $(ANDR_ROOT)/deps/iconv_timestamp ICONV_URL_HTTP = http://ftp.gnu.org/pub/gnu/libiconv/libiconv-$(ICONV_VERSION).tar.gz SQLITE3_FOLDER = sqlite-amalgamation-3120200 SQLITE3_URL = http://www.sqlite.org/2016/$(SQLITE3_FOLDER).zip --include $(PATHCFGFILE) +ANDROID_SDK = $(shell grep '^sdk\.dir' local.properties | sed 's/^.*=[[:space:]]*//') +ANDROID_NDK = $(shell grep '^ndk\.dir' local.properties | sed 's/^.*=[[:space:]]*//') +NDK_MODULE_PATH = $(ANDROID_NDK)/toolchains #use interim target variable to switch leveldb on or off ifeq ($(HAVE_LEVELDB),1) @@ -151,54 +145,50 @@ endif freetype_download clean_freetype freetype \ apk clean_apk \ clean_all clean prep_srcdir \ - install_debug install envpaths all \ - manifest clean_manifest\ + install_debug install_release envpaths all \ $(ASSETS_TIMESTAMP) $(LEVELDB_TIMESTAMP) \ $(OPENAL_TIMESTAMP) $(OGG_TIMESTAMP) \ $(IRRLICHT_TIMESTAMP) $(CURL_TIMESTAMP) \ $(OPENSSL_TIMESTAMP) \ - $(ROOT)/jni/src/android_version.h \ - $(ROOT)/jni/src/android_version_githash.h + $(ANDR_ROOT)/jni/src/android_version.h \ + $(ANDR_ROOT)/jni/src/android_version_githash.h -debug : $(PATHCFGFILE) +debug : local.properties export NDEBUG=; \ export BUILD_TYPE=debug; \ $(MAKE) apk all : debug release -release : $(PATHCFGFILE) +release : local.properties @export NDEBUG=1; \ export BUILD_TYPE=release; \ $(MAKE) apk reconfig: delconfig - @$(MAKE) $(PATHCFGFILE) + @$(MAKE) local.properties -delconfig : - $(RM) ${PATHCFGFILE} +delconfig: + $(RM) local.properties -$(PATHCFGFILE) : +local.properties: @echo "Please specify path of ANDROID NDK"; \ - echo "e.g. /home/user/android-ndk-r9c/"; \ + echo "e.g. $$HOME/Android/ndk-r11c/"; \ read ANDROID_NDK ; \ if [ ! -d $$ANDROID_NDK ] ; then \ echo "$$ANDROID_NDK is not a valid folder"; \ exit 1; \ fi; \ - echo "ANDROID_NDK = $$ANDROID_NDK" > ${PATHCFGFILE}; \ - echo "NDK_MODULE_PATH = $$ANDROID_NDK/toolchains" >> ${PATHCFGFILE}; \ - echo "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++";\ - echo "+ Note: NDK_MODULE_PATH is set to $$ANDROID_NDK/toolchains"; \ - echo "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++";\ + echo "ndk.dir = $$ANDROID_NDK" > local.properties; \ echo "Please specify path of ANDROID SDK"; \ - echo "e.g. /home/user/adt-bundle-linux-x86_64-20131030/sdk/"; \ + echo "e.g. $$HOME/Android/sdk/"; \ read SDKFLDR ; \ if [ ! -d $$SDKFLDR ] ; then \ echo "$$SDKFLDR is not a valid folder"; \ exit 1; \ fi; \ - echo "SDKFOLDER = $$SDKFLDR" >> ${PATHCFGFILE}; + echo "sdk.dir = $$SDKFLDR" >> local.properties; + $(OPENAL_TIMESTAMP) : openal_download @LAST_MODIF=$$(find ${OPENAL_DIR} -type f -printf '%T@ %p\n' | sort -n | tail -1 | cut -f2- -d" "); \ @@ -209,8 +199,8 @@ $(OPENAL_TIMESTAMP) : openal_download openal_download : @if [ ! -d ${OPENAL_DIR} ] ; then \ echo "openal sources missing, downloading..."; \ - mkdir -p ${ROOT}/deps; \ - cd ${ROOT}/deps ; \ + mkdir -p ${ANDR_ROOT}/deps; \ + cd ${ANDR_ROOT}/deps ; \ git clone ${OPENAL_URL_GIT} || exit 1; \ fi @@ -225,14 +215,14 @@ $(OPENAL_LIB): $(OPENAL_TIMESTAMP) REFRESH=1; \ fi; \ if [ $$REFRESH -ne 0 ] ; then \ - export PATH=$$PATH:${SDKFOLDER}/platform-tools:${ANDROID_NDK}; \ echo "changed timestamp for openal detected building..."; \ cd ${OPENAL_DIR}; \ - ndk-build NDEBUG=${NDEBUG} NDK_MODULE_PATH=${NDK_MODULE_PATH} \ - APP_ABI=${TARGET_ABI} TARGET_ARCH_ABI=${TARGET_ABI} \ - APP_PLATFORM=${APP_PLATFORM} TARGET_CFLAGS+="${TARGET_CFLAGS_ADDON}" \ - TARGET_LDFLAGS+="${TARGET_LDFLAGS_ADDON}" \ - TARGET_CXXFLAGS+="${TARGET_CXXFLAGS_ADDON}" || exit 1; \ + ${ANDROID_NDK}/ndk-build NDEBUG=${NDEBUG} \ + NDK_MODULE_PATH=${NDK_MODULE_PATH} APP_ABI=${TARGET_ABI} \ + TARGET_ARCH_ABI=${TARGET_ABI} APP_PLATFORM=${APP_PLATFORM} \ + TARGET_CFLAGS+="${TARGET_CFLAGS_ADDON}" \ + TARGET_LDFLAGS+="${TARGET_LDFLAGS_ADDON}" \ + TARGET_CXXFLAGS+="${TARGET_CXXFLAGS_ADDON}" || exit 1; \ touch ${OPENAL_TIMESTAMP}; \ touch ${OPENAL_TIMESTAMP_INT}; \ else \ @@ -251,11 +241,11 @@ $(OGG_TIMESTAMP) : ogg_download ogg_download : @if [ ! -d ${OGG_DIR} ] ; then \ echo "ogg sources missing, downloading..."; \ - mkdir -p ${ROOT}/deps; \ - cd ${ROOT}/deps ; \ + mkdir -p ${ANDR_ROOT}/deps; \ + cd ${ANDR_ROOT}/deps ; \ git clone ${OGG_URL_GIT}|| exit 1; \ cd libvorbis-libogg-android ; \ - patch -p1 < ../../libvorbis-libogg-fpu.patch || exit 1; \ + patch -p1 < ${ANDR_ROOT}/patches/libvorbis-libogg-fpu.patch || exit 1; \ sed -i 's-:-?-' jni/Application.mk; \ fi @@ -271,14 +261,14 @@ $(OGG_LIB): $(OGG_TIMESTAMP) REFRESH=1; \ fi; \ if [ $$REFRESH -ne 0 ] ; then \ - export PATH=$$PATH:${SDKFOLDER}/platform-tools:${ANDROID_NDK}; \ echo "changed timestamp for ogg detected building..."; \ cd ${OGG_DIR}; \ - ndk-build NDEBUG=${NDEBUG} NDK_MODULE_PATH=${NDK_MODULE_PATH} \ - APP_ABI=${TARGET_ABI} APP_PLATFORM=${APP_PLATFORM} \ - TARGET_CFLAGS+="${TARGET_CFLAGS_ADDON}" \ - TARGET_LDFLAGS+="${TARGET_LDFLAGS_ADDON}" \ - TARGET_CXXFLAGS+="${TARGET_CXXFLAGS_ADDON}" || exit 1; \ + ${ANDROID_NDK}/ndk-build NDEBUG=${NDEBUG} \ + NDK_MODULE_PATH=${NDK_MODULE_PATH} \ + APP_ABI=${TARGET_ABI} APP_PLATFORM=${APP_PLATFORM} \ + TARGET_CFLAGS+="${TARGET_CFLAGS_ADDON}" \ + TARGET_LDFLAGS+="${TARGET_LDFLAGS_ADDON}" \ + TARGET_CXXFLAGS+="${TARGET_CXXFLAGS_ADDON}" || exit 1; \ touch ${OGG_TIMESTAMP}; \ touch ${OGG_TIMESTAMP_INT}; \ else \ @@ -297,12 +287,12 @@ $(OPENSSL_TIMESTAMP) : openssl_download openssl_download : @if [ ! -d ${OPENSSL_DIR} ] ; then \ echo "openssl sources missing, downloading..."; \ - mkdir -p ${ROOT}/deps; \ - cd ${ROOT}/deps ; \ + mkdir -p ${ANDR_ROOT}/deps; \ + cd ${ANDR_ROOT}/deps ; \ wget ${OPENSSL_URL} || exit 1; \ tar -xzf ${OPENSSL_BASEDIR}.tar.gz; \ cd ${OPENSSL_BASEDIR}; \ - patch -p1 < ../../openssl_arch.patch; \ + patch -p1 < ${ANDR_ROOT}/patches/openssl_arch.patch; \ fi openssl : $(OPENSSL_LIB) @@ -322,8 +312,8 @@ $(OPENSSL_LIB): $(OPENSSL_TIMESTAMP) $(GMP_LIB) ln -s ${OPENSSL_DIR} ../openssl; \ export TOOLCHAIN=/tmp/ndk-${TARGET_HOST}-openssl; \ ${ANDROID_NDK}/build/tools/make-standalone-toolchain.sh \ - --toolchain=${TARGET_TOOLCHAIN}${COMPILER_VERSION} \ - --install-dir=$${TOOLCHAIN}; \ + --toolchain=${TARGET_TOOLCHAIN}${COMPILER_VERSION} \ + --install-dir=$${TOOLCHAIN}; \ export PATH="$${TOOLCHAIN}/bin:$${PATH}"; \ CC=${CROSS_PREFIX}gcc ./Configure enable-gmp -DL_ENDIAN -I${GMP_DIR} -L${GMP_DIR}/usr/lib android-${TARGET_ARCH};\ CC=${CROSS_PREFIX}gcc ANDROID_DEV=/tmp/ndk-${TARGET_HOST} make depend; \ @@ -337,8 +327,8 @@ $(OPENSSL_LIB): $(OPENSSL_TIMESTAMP) $(GMP_LIB) clean_openssl : $(RM) -rf ${OPENSSL_DIR}; \ - $(RM) -rf $(ROOT)/deps/${OPENSSL_BASEDIR}.tar.gz; \ - $(RM) -rf $(ROOT)/deps/openssl + $(RM) -rf $(ANDR_ROOT)/deps/${OPENSSL_BASEDIR}.tar.gz; \ + $(RM) -rf $(ANDR_ROOT)/deps/openssl $(LEVELDB_TIMESTAMP) : leveldb_download @LAST_MODIF=$$(find ${LEVELDB_DIR} -type f -printf '%T@ %p\n' | sort -n | tail -1 | cut -f2- -d" "); \ @@ -349,8 +339,8 @@ $(LEVELDB_TIMESTAMP) : leveldb_download leveldb_download : @if [ ! -d ${LEVELDB_DIR} ] ; then \ echo "leveldb sources missing, downloading..."; \ - mkdir -p ${ROOT}/deps; \ - cd ${ROOT}/deps ; \ + mkdir -p ${ANDR_ROOT}/deps; \ + cd ${ANDR_ROOT}/deps ; \ git clone ${LEVELDB_URL_GIT} || exit 1; \ cd ${LEVELDB_DIR} || exit 1; \ git checkout ${LEVELDB_COMMIT} || exit 1; \ @@ -367,22 +357,21 @@ $(LEVELDB_LIB): $(LEVELDB_TIMESTAMP) REFRESH=1; \ fi; \ if [ $$REFRESH -ne 0 ] ; then \ - export PATH=$${PATH}:${SDKFOLDER}/platform-tools:${ANDROID_NDK}; \ echo "changed timestamp for leveldb detected building..."; \ cd deps/leveldb; \ export CROSS_PREFIX=${CROSS_PREFIX}; \ export TOOLCHAIN=/tmp/ndk-${TARGET_HOST}-leveldb; \ ${ANDROID_NDK}/build/tools/make-standalone-toolchain.sh \ - --toolchain=${TARGET_TOOLCHAIN}${COMPILER_VERSION} \ - --install-dir=$${TOOLCHAIN}; \ + --toolchain=${TARGET_TOOLCHAIN}${COMPILER_VERSION} \ + --install-dir=$${TOOLCHAIN}; \ export PATH="$${TOOLCHAIN}/bin:$${PATH}"; \ export CC=${CROSS_PREFIX}gcc; \ export CXX=${CROSS_PREFIX}g++; \ export CFLAGS="$${CFLAGS} ${TARGET_CFLAGS_ADDON}"; \ - export CPPFLAGS="$${CPPFLAGS} ${TARGET_CFLAGS_ADDON}"; \ + export CPPFLAGS="$${CPPFLAGS} ${TARGET_CXXFLAGS_ADDON}"; \ export LDFLAGS="$${LDFLAGS} ${TARGET_LDFLAGS_ADDON}"; \ export TARGET_OS=OS_ANDROID_CROSSCOMPILE; \ - $(MAKE) -s || exit 1; \ + $(MAKE) || exit 1; \ touch ${LEVELDB_TIMESTAMP}; \ touch ${LEVELDB_TIMESTAMP_INT}; \ $(RM) -rf $${TOOLCHAIN}; \ @@ -402,7 +391,7 @@ $(FREETYPE_TIMESTAMP) : freetype_download freetype_download : @if [ ! -d ${FREETYPE_DIR} ] ; then \ echo "freetype sources missing, downloading..."; \ - mkdir -p ${ROOT}/deps; \ + mkdir -p ${ANDR_ROOT}/deps; \ cd deps; \ git clone ${FREETYPE_URL_GIT} || exit 1; \ fi @@ -422,14 +411,14 @@ $(FREETYPE_LIB) : $(FREETYPE_TIMESTAMP) fi; \ if [ $$REFRESH -ne 0 ] ; then \ mkdir -p ${FREETYPE_DIR}; \ - export PATH=$$PATH:${SDKFOLDER}/platform-tools:${ANDROID_NDK}; \ echo "changed timestamp for freetype detected building..."; \ cd ${FREETYPE_DIR}/Android/jni; \ - ndk-build NDEBUG=${NDEBUG} NDK_MODULE_PATH=${NDK_MODULE_PATH} \ - APP_PLATFORM=${APP_PLATFORM} APP_ABI=${TARGET_ABI} \ - TARGET_CFLAGS+="${TARGET_CFLAGS_ADDON}" \ - TARGET_LDFLAGS+="${TARGET_LDFLAGS_ADDON}" \ - TARGET_CXXFLAGS+="${TARGET_CXXFLAGS_ADDON}" || exit 1; \ + ${ANDROID_NDK}/ndk-build NDEBUG=${NDEBUG} \ + NDK_MODULE_PATH=${NDK_MODULE_PATH} \ + APP_PLATFORM=${APP_PLATFORM} APP_ABI=${TARGET_ABI} \ + TARGET_CFLAGS+="${TARGET_CFLAGS_ADDON}" \ + TARGET_LDFLAGS+="${TARGET_LDFLAGS_ADDON}" \ + TARGET_CXXFLAGS+="${TARGET_CXXFLAGS_ADDON}" || exit 1; \ touch ${FREETYPE_TIMESTAMP}; \ touch ${FREETYPE_TIMESTAMP_INT}; \ else \ @@ -448,15 +437,15 @@ $(ICONV_TIMESTAMP) : iconv_download iconv_download : @if [ ! -d ${ICONV_DIR} ] ; then \ echo "iconv sources missing, downloading..."; \ - mkdir -p ${ROOT}/deps; \ - cd ${ROOT}/deps; \ + mkdir -p ${ANDR_ROOT}/deps; \ + cd ${ANDR_ROOT}/deps; \ wget ${ICONV_URL_HTTP} || exit 1; \ tar -xzf libiconv-${ICONV_VERSION}.tar.gz || exit 1; \ rm libiconv-${ICONV_VERSION}.tar.gz; \ ln -s libiconv-${ICONV_VERSION} libiconv; \ cd ${ICONV_DIR}; \ - patch -p1 < ${ROOT}/libiconv_android.patch; \ - patch -p1 < ${ROOT}/libiconv_stdio.patch; \ + patch -p1 < ${ANDR_ROOT}/patches/libiconv_android.patch; \ + patch -p1 < ${ANDR_ROOT}/patches/libiconv_stdio.patch; \ fi iconv : $(ICONV_LIB) @@ -474,14 +463,13 @@ $(ICONV_LIB) : $(ICONV_TIMESTAMP) fi; \ if [ $$REFRESH -ne 0 ] ; then \ mkdir -p ${ICONV_DIR}; \ - export PATH=$$PATH:${SDKFOLDER}/platform-tools:${ANDROID_NDK}; \ echo "changed timestamp for iconv detected building..."; \ cd ${ICONV_DIR}; \ \ export TOOLCHAIN=/tmp/ndk-${TARGET_HOST}-iconv; \ ${ANDROID_NDK}/build/tools/make-standalone-toolchain.sh \ - --toolchain=${TARGET_TOOLCHAIN}${COMPILER_VERSION} \ - --install-dir=$${TOOLCHAIN}; \ + --toolchain=${TARGET_TOOLCHAIN}${COMPILER_VERSION} \ + --install-dir=$${TOOLCHAIN}; \ export PATH="$${TOOLCHAIN}/bin:$${PATH}"; \ export CC=${CROSS_PREFIX}gcc; \ export CXX=${CROSS_PREFIX}g++; \ @@ -508,13 +496,13 @@ clean_iconv : irrlicht_download : @if [ ! -d "deps/irrlicht" ] ; then \ echo "irrlicht sources missing, downloading..."; \ - mkdir -p ${ROOT}/deps; \ + mkdir -p ${ANDR_ROOT}/deps; \ cd deps; \ svn co ${IRRLICHT_URL_SVN} irrlicht || exit 1; \ cd irrlicht; \ - patch -p1 < ../../irrlicht-touchcount.patch || exit 1; \ - patch -p1 < ../../irrlicht-back_button.patch || exit 1; \ - patch -p1 < ../../irrlicht-texturehack.patch || exit 1; \ + patch -p1 < ${ANDR_ROOT}/patches/irrlicht-touchcount.patch || exit 1; \ + patch -p1 < ${ANDR_ROOT}/patches/irrlicht-back_button.patch || exit 1; \ + patch -p1 < ${ANDR_ROOT}/patches/irrlicht-texturehack.patch || exit 1; \ fi $(IRRLICHT_TIMESTAMP) : irrlicht_download @@ -538,14 +526,14 @@ $(IRRLICHT_LIB): $(IRRLICHT_TIMESTAMP) $(FREETYPE_LIB) fi; \ if [ $$REFRESH -ne 0 ] ; then \ mkdir -p ${IRRLICHT_DIR}; \ - export PATH=$$PATH:${SDKFOLDER}/platform-tools:${ANDROID_NDK}; \ echo "changed timestamp for irrlicht detected building..."; \ cd deps/irrlicht/source/Irrlicht/Android; \ - ndk-build NDEBUG=${NDEBUG} NDK_MODULE_PATH=${NDK_MODULE_PATH} \ - APP_ABI=${TARGET_ABI} APP_PLATFORM=${APP_PLATFORM} \ - TARGET_CFLAGS+="${TARGET_CFLAGS_ADDON}" \ - TARGET_LDFLAGS+="${TARGET_LDFLAGS_ADDON}" \ - TARGET_CXXFLAGS+="${TARGET_CXXFLAGS_ADDON}" || exit 1; \ + ${ANDROID_NDK}/ndk-build NDEBUG=${NDEBUG} \ + NDK_MODULE_PATH=${NDK_MODULE_PATH} \ + APP_ABI=${TARGET_ABI} APP_PLATFORM=${APP_PLATFORM} \ + TARGET_CFLAGS+="${TARGET_CFLAGS_ADDON}" \ + TARGET_LDFLAGS+="${TARGET_LDFLAGS_ADDON}" \ + TARGET_CXXFLAGS+="${TARGET_CXXFLAGS_ADDON}" || exit 1; \ touch ${IRRLICHT_TIMESTAMP}; \ touch ${IRRLICHT_TIMESTAMP_INT}; \ else \ @@ -564,7 +552,7 @@ $(CURL_TIMESTAMP) : curl_download curl_download : @if [ ! -d "deps/curl-${CURL_VERSION}" ] ; then \ echo "curl sources missing, downloading..."; \ - mkdir -p ${ROOT}/deps; \ + mkdir -p ${ANDR_ROOT}/deps; \ cd deps; \ wget ${CURL_URL_HTTP} || exit 1; \ tar -xjf curl-${CURL_VERSION}.tar.bz2 || exit 1; \ @@ -587,20 +575,18 @@ $(CURL_LIB): $(CURL_TIMESTAMP) $(OPENSSL_LIB) fi; \ if [ $$REFRESH -ne 0 ] ; then \ mkdir -p ${CURL_DIR}; \ - export PATH="$${PATH}:${SDKFOLDER}/platform-tools:${ANDROID_NDK}"; \ echo "changed timestamp for curl detected building..."; \ cd deps/curl-${CURL_VERSION}; \ export CROSS_PREFIX=${CROSS_PREFIX}; \ export TOOLCHAIN=/tmp/ndk-${TARGET_HOST}-curl; \ ${ANDROID_NDK}/build/tools/make-standalone-toolchain.sh \ - --toolchain=${TARGET_TOOLCHAIN}${COMPILER_VERSION} \ - --install-dir=$${TOOLCHAIN}; \ + --toolchain=${TARGET_TOOLCHAIN}${COMPILER_VERSION} \ + --install-dir=$${TOOLCHAIN}; \ export PATH="$${TOOLCHAIN}/bin:$${PATH}"; \ export CC=${CROSS_PREFIX}gcc; \ export CXX=${CROSS_PREFIX}g++; \ export TARGET_OS=OS_ANDROID_CROSSCOMPILE; \ - export CPPFLAGS="$${CPPFLAGS} -I${OPENSSL_DIR}/include \ - ${TARGET_CFLAGS_ADDON}"; \ + export CPPFLAGS="$${CPPFLAGS} -I${OPENSSL_DIR}/include ${TARGET_CFLAGS_ADDON}"; \ export CFLAGS="$${CFLAGS} ${TARGET_CFLAGS_ADDON}"; \ export LDFLAGS="$${LDFLAGS} -L${OPENSSL_DIR} ${TARGET_LDFLAGS_ADDON}"; \ ./configure --host=${TARGET_HOST} --disable-shared --enable-static --with-ssl; \ @@ -625,7 +611,7 @@ $(GMP_TIMESTAMP) : gmp_download gmp_download : @if [ ! -d "${GMP_DIR}" ] ; then \ echo "gmp sources missing, downloading..."; \ - mkdir -p ${ROOT}/deps; \ + mkdir -p ${ANDR_ROOT}/deps; \ cd deps; \ wget ${GMP_URL_HTTP} || exit 1; \ tar -xjf gmp-${GMP_VERSION}.tar.bz2 || exit 1; \ @@ -648,14 +634,13 @@ $(GMP_LIB): $(GMP_TIMESTAMP) fi; \ if [ $$REFRESH -ne 0 ] ; then \ mkdir -p ${GMP_DIR}; \ - export PATH="$${PATH}:${SDKFOLDER}/platform-tools:${ANDROID_NDK}"; \ echo "changed timestamp for gmp detected building..."; \ cd deps/gmp-${GMP_VERSION}; \ export CROSS_PREFIX=${CROSS_PREFIX}; \ export TOOLCHAIN=/tmp/ndk-${TARGET_HOST}-gmp; \ ${ANDROID_NDK}/build/tools/make-standalone-toolchain.sh \ - --toolchain=${TARGET_TOOLCHAIN}${COMPILER_VERSION} \ - --install-dir=$${TOOLCHAIN}; \ + --toolchain=${TARGET_TOOLCHAIN}${COMPILER_VERSION} \ + --install-dir=$${TOOLCHAIN}; \ export PATH="$${TOOLCHAIN}/bin:$${PATH}"; \ export CC=${CROSS_PREFIX}gcc; \ export CXX=${CROSS_PREFIX}g++; \ @@ -687,11 +672,11 @@ clean_sqlite3: $(RM) -f sqlite $(ASSETS_TIMESTAMP) : $(IRRLICHT_LIB) - @mkdir -p ${ROOT}/deps; \ + @mkdir -p ${ANDR_ROOT}/deps; \ for DIRNAME in {builtin,client,doc,fonts,games,mods,po,textures}; do \ - LAST_MODIF=$$(find ${ROOT}/../../${DIRNAME} -type f -printf '%T@ %p\n' | sort -n | tail -1 | cut -f2- -d" "); \ + LAST_MODIF=$$(find ${PROJ_ROOT}/${DIRNAME} -type f -printf '%T@ %p\n' | sort -n | tail -1 | cut -f2- -d" "); \ if [ $$(basename $$LAST_MODIF) != "timestamp" ]; then \ - touch ${ROOT}/../../${DIRNAME}/timestamp; \ + touch ${PROJ_ROOT}/${DIRNAME}/timestamp; \ touch ${ASSETS_TIMESTAMP}; \ echo ${DIRNAME} changed $$LAST_MODIF; \ fi; \ @@ -701,11 +686,11 @@ $(ASSETS_TIMESTAMP) : $(IRRLICHT_LIB) touch ${IRRLICHT_DIR}/media/timestamp; \ touch ${ASSETS_TIMESTAMP}; \ fi; \ - if [ ${ROOT}/../../minetest.conf.example -nt ${ASSETS_TIMESTAMP} ] ; then \ + if [ ${PROJ_ROOT}/minetest.conf.example -nt ${ASSETS_TIMESTAMP} ] ; then \ echo "conf changed"; \ touch ${ASSETS_TIMESTAMP}; \ fi; \ - if [ ${ROOT}/../../README.txt -nt ${ASSETS_TIMESTAMP} ] ; then \ + if [ ${PROJ_ROOT}/README.txt -nt ${ASSETS_TIMESTAMP} ] ; then \ touch ${ASSETS_TIMESTAMP}; \ fi; \ if [ ! -e $(ASSETS_TIMESTAMP) ] ; then \ @@ -720,34 +705,34 @@ assets : $(ASSETS_TIMESTAMP) if [ ${ASSETS_TIMESTAMP} -nt ${ASSETS_TIMESTAMP}.old ] ; then \ REFRESH=1; \ fi; \ - if [ ! -d ${ROOT}/assets ] ; then \ + if [ ! -d ${APP_ROOT}/assets ] ; then \ REFRESH=1; \ fi; \ if [ $$REFRESH -ne 0 ] ; then \ echo "assets changed, refreshing..."; \ $(MAKE) clean_assets; \ - mkdir -p ${ROOT}/assets/Minetest; \ - cp ${ROOT}/../../minetest.conf.example ${ROOT}/assets/Minetest; \ - cp ${ROOT}/../../README.txt ${ROOT}/assets/Minetest; \ - cp -r ${ROOT}/../../builtin ${ROOT}/assets/Minetest; \ - mkdir ${ROOT}/assets/Minetest/client; \ - cp -r ${ROOT}/../../client/shaders ${ROOT}/assets/Minetest/client; \ - cp ${ROOT}/../../doc/lgpl-2.1.txt ${ROOT}/assets/Minetest/LICENSE.txt; \ - mkdir ${ROOT}/assets/Minetest/fonts; \ - cp -r ${ROOT}/../../fonts/*.ttf ${ROOT}/assets/Minetest/fonts/; \ - mkdir ${ROOT}/assets/Minetest/games; \ + mkdir -p ${APP_ROOT}/assets/Minetest; \ + cp ${PROJ_ROOT}/minetest.conf.example ${APP_ROOT}/assets/Minetest; \ + cp ${PROJ_ROOT}/README.txt ${APP_ROOT}/assets/Minetest; \ + cp -r ${PROJ_ROOT}/builtin ${APP_ROOT}/assets/Minetest; \ + mkdir -p ${APP_ROOT}/assets/Minetest/client; \ + cp -r ${PROJ_ROOT}/client/shaders ${APP_ROOT}/assets/Minetest/client; \ + cp ${PROJ_ROOT}/doc/lgpl-2.1.txt ${APP_ROOT}/assets/Minetest/LICENSE.txt; \ + mkdir -p ${APP_ROOT}/assets/Minetest/fonts; \ + cp -r ${PROJ_ROOT}/fonts/*.ttf ${APP_ROOT}/assets/Minetest/fonts/; \ + mkdir -p ${APP_ROOT}/assets/Minetest/games; \ for game in ${GAMES_TO_COPY}; do \ - cp -r ${ROOT}/../../games/$$game ${ROOT}/assets/Minetest/games/; \ + cp -r ${PROJ_ROOT}/games/$$game ${APP_ROOT}/assets/Minetest/games/; \ done; \ - mkdir ${ROOT}/assets/Minetest/mods; \ + mkdir -p ${APP_ROOT}/assets/Minetest/mods; \ for mod in ${MODS_TO_COPY}; do \ - cp -r ${ROOT}/../../mods/$$mod ${ROOT}/assets/Minetest/mods/; \ + cp -r ${PROJ_ROOT}/mods/$$mod ${APP_ROOT}/assets/Minetest/mods/; \ done; \ - cp -r ${ROOT}/../../po ${ROOT}/assets/Minetest; \ - cp -r ${ROOT}/../../textures ${ROOT}/assets/Minetest; \ - mkdir -p ${ROOT}/assets/Minetest/media; \ - cp -r ${IRRLICHT_DIR}/media/Shaders ${ROOT}/assets/Minetest/media; \ - cd ${ROOT}/assets || exit 1; \ + cp -r ${PROJ_ROOT}/po ${APP_ROOT}/assets/Minetest; \ + cp -r ${PROJ_ROOT}/textures ${APP_ROOT}/assets/Minetest; \ + mkdir -p ${APP_ROOT}/assets/Minetest/media; \ + cp -r ${IRRLICHT_DIR}/media/Shaders ${APP_ROOT}/assets/Minetest/media; \ + cd ${APP_ROOT}/assets || exit 1; \ find . -name "timestamp" -exec rm {} \; ; \ find . -name "*.blend" -exec rm {} \; ; \ find . -name "*~" -exec rm {} \; ; \ @@ -755,8 +740,8 @@ assets : $(ASSETS_TIMESTAMP) find . -type d -path "*.svn" -exec rm -rf {} \; ; \ find . -type f -path "*.gitignore" -exec rm -rf {} \; ; \ ls -R | grep ":$$" | sed -e 's/:$$//' -e 's/\.//' -e 's/^\///' > "index.txt"; \ - find Minetest >"filelist.txt"; \ - cp ${ROOT}/${ASSETS_TIMESTAMP} ${ROOT}/${ASSETS_TIMESTAMP}.old; \ + find -L Minetest > filelist.txt; \ + cp ${ANDR_ROOT}/${ASSETS_TIMESTAMP} ${ANDR_ROOT}/${ASSETS_TIMESTAMP}.old; \ else \ echo "nothing to be done for assets"; \ fi @@ -764,56 +749,50 @@ assets : $(ASSETS_TIMESTAMP) clean_assets : @$(RM) -r assets -apk: $(PATHCFGFILE) assets $(ICONV_LIB) $(IRRLICHT_LIB) $(CURL_LIB) $(GMP_LIB) $(LEVELDB_TARGET) \ - $(OPENAL_LIB) $(OGG_LIB) prep_srcdir $(ROOT)/jni/src/android_version.h \ - $(ROOT)/jni/src/android_version_githash.h sqlite3_download - @export NDEBUG=$$NDEBUG; $(MAKE) manifest; \ - export PATH=$$PATH:${SDKFOLDER}/platform-tools:${ANDROID_NDK}; \ - export ANDROID_HOME=${SDKFOLDER}; \ - mkdir -p ${ROOT}/src; \ - ndk-build NDK_MODULE_PATH=${NDK_MODULE_PATH} \ - GPROF=${GPROF} APP_ABI=${TARGET_ABI} HAVE_LEVELDB=${HAVE_LEVELDB} \ - APP_PLATFORM=${APP_PLATFORM} \ - TARGET_LIBDIR=${TARGET_LIBDIR} \ - TARGET_CFLAGS+="${TARGET_CFLAGS_ADDON}" \ - TARGET_LDFLAGS+="${TARGET_LDFLAGS_ADDON}" \ - TARGET_CXXFLAGS+="${TARGET_CXXFLAGS_ADDON}" && \ - ant $$BUILD_TYPE && \ - echo "++ Success!" && \ - echo "APK: bin/Minetest-$$BUILD_TYPE.apk" && \ - echo "You can install it with \`adb install -r bin/Minetest-$$BUILD_TYPE.apk\`" +apk: local.properties assets $(ICONV_LIB) $(IRRLICHT_LIB) $(CURL_LIB) $(GMP_LIB) $(LEVELDB_TARGET) \ + $(OPENAL_LIB) $(OGG_LIB) prep_srcdir $(ANDR_ROOT)/jni/src/android_version.h \ + $(ANDR_ROOT)/jni/src/android_version_githash.h sqlite3_download + @${ANDROID_NDK}/ndk-build NDK_MODULE_PATH=${NDK_MODULE_PATH} \ + GPROF=${GPROF} APP_ABI=${TARGET_ABI} HAVE_LEVELDB=${HAVE_LEVELDB} \ + APP_PLATFORM=${APP_PLATFORM} \ + TARGET_LIBDIR=${TARGET_LIBDIR} \ + TARGET_CFLAGS+="${TARGET_CFLAGS_ADDON}" \ + TARGET_LDFLAGS+="${TARGET_LDFLAGS_ADDON}" \ + TARGET_CXXFLAGS+="${TARGET_CXXFLAGS_ADDON}" || exit 1; \ + if [ ! -e ${APP_ROOT}/jniLibs ]; then \ + ln -s ${ANDR_ROOT}/libs ${APP_ROOT}/jniLibs || exit 1; \ + fi; \ + export VERSION_STR="${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}" && \ + export BUILD_TYPE_C=$$(echo "$${BUILD_TYPE}" | sed 's/./\U&/') && \ + gradle assemble$$BUILD_TYPE_C && \ + echo "APK stored at: build/outputs/apk/Minetest-$$BUILD_TYPE.apk" && \ + echo "You can install it with \`make install_$$BUILD_TYPE\`" + +# These Intentionally doesn't depend on their respective build steps, +# because it takes a while to verify that everything's up-to-date. +install_debug: + ${ANDROID_SDK}/platform-tools/adb install -r build/outputs/apk/Minetest-debug.apk + +install_release: + ${ANDROID_SDK}/platform-tools/adb install -r build/outputs/apk/Minetest-release.apk prep_srcdir : - @if [ ! -e ${ROOT}/jni/src ]; then \ - ln -s ${ROOT}/../../src ${ROOT}/jni/src; \ + @if [ ! -e ${ANDR_ROOT}/jni/src ]; then \ + ln -s ${PROJ_ROOT}/src ${ANDR_ROOT}/jni/src; \ fi -clean_apk : manifest - @export PATH=$$PATH:${SDKFOLDER}platform-tools:${ANDROID_NDK}; \ - export ANDROID_HOME=${SDKFOLDER}; \ - ant clean - -install_debug : - @export PATH=$$PATH:${SDKFOLDER}platform-tools:${ANDROID_NDK}; \ - adb install -r ${ROOT}/bin/Minetest-debug.apk - -install : - @export PATH=$$PATH:${SDKFOLDER}platform-tools:${ANDROID_NDK}; \ - adb install -r ${ROOT}/bin/Minetest-release.apk - -envpaths : - @echo "export PATH=$$PATH:${SDKFOLDER}platform-tools:${ANDROID_NDK}" > and_env;\ - echo "export ANDROID_HOME=${SDKFOLDER}" >> and_env; +clean_apk : + gradle clean clean_all : @$(MAKE) clean_apk; \ - $(MAKE) clean_assets clean_iconv clean_irrlicht clean_leveldb clean_curl clean_openssl \ - clean_openal clean_ogg clean_gmp clean_manifest; \ + $(MAKE) clean_assets clean_iconv clean_irrlicht clean_leveldb clean_curl \ + clean_openssl clean_openal clean_ogg clean_gmp; \ sleep 1; \ $(RM) -r gen libs obj deps bin Debug and_env -$(ROOT)/jni/src/android_version_githash.h : prep_srcdir - @export VERSION_FILE=${ROOT}/jni/src/android_version_githash.h; \ +$(ANDR_ROOT)/jni/src/android_version_githash.h : prep_srcdir + @export VERSION_FILE=${ANDR_ROOT}/jni/src/android_version_githash.h; \ export VERSION_FILE_NEW=$${VERSION_FILE}.new; \ { \ echo "#ifndef ANDROID_MT_VERSION_GITHASH_H"; \ @@ -831,8 +810,8 @@ $(ROOT)/jni/src/android_version_githash.h : prep_srcdir fi -$(ROOT)/jni/src/android_version.h : prep_srcdir - @export VERSION_FILE=${ROOT}/jni/src/android_version.h; \ +$(ANDR_ROOT)/jni/src/android_version.h : prep_srcdir + @export VERSION_FILE=${ANDR_ROOT}/jni/src/android_version.h; \ export VERSION_FILE_NEW=$${VERSION_FILE}.new; \ { \ echo "#ifndef ANDROID_MT_VERSION_H"; \ @@ -851,22 +830,5 @@ $(ROOT)/jni/src/android_version.h : prep_srcdir rm "$${VERSION_FILE_NEW}"; \ fi -manifest : - @BASE_VERSION="${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}"; \ - if [ "${NDEBUG}x" != "x" ] ; then \ - DBG=''; \ - DBG_FLAG="android:debuggable=\"false\""; \ - else \ - DBG=""; \ - DBG_FLAG="android:debuggable=\"true\""; \ - fi; \ - cat ${ROOT}/AndroidManifest.xml.template | \ - sed "s/###ANDROID_VERSION###/${ANDROID_VERSION_CODE}/g" | \ - sed "s/###BASE_VERSION###/$$BASE_VERSION/g" | \ - sed -e "s@###DEBUG_BUILD###@$$DBG@g" | \ - sed -e "s@###DEBUG_FLAG###@$$DBG_FLAG@g" >${ROOT}/AndroidManifest.xml - -clean_manifest : - rm -rf ${ROOT}/AndroidManifest.xml - clean : clean_apk clean_assets + diff --git a/build/android/build.gradle b/build/android/build.gradle new file mode 100644 index 00000000..3ce11bec --- /dev/null +++ b/build/android/build.gradle @@ -0,0 +1,49 @@ +buildscript { + repositories { + mavenCentral() + } + dependencies { + classpath "com.android.tools.build:gradle:1.5.0" + } +} + +apply plugin: "com.android.application" + +android { + compileSdkVersion 23 + buildToolsVersion "23.0.3" + + defaultConfig { + versionCode 13 + versionName "${System.env.VERSION_STR}.${versionCode}" + minSdkVersion 9 + targetSdkVersion 9 + applicationId "net.minetest.minetest" + manifestPlaceholders = [ package: "net.minetest.minetest", project: project.name ] + } + + lintOptions { + disable "OldTargetApi", "GoogleAppIndexingWarning" + } + + Properties props = new Properties() + props.load(new FileInputStream(file("local.properties"))) + + if (props.getProperty("keystore") != null) { + signingConfigs { + release { + storeFile file(props["keystore"]) + storePassword props["keystore.password"] + keyAlias props["key"] + keyPassword props["key.password"] + } + } + + buildTypes { + release { + signingConfig signingConfigs.release + } + } + } +} + diff --git a/build/android/build.xml b/build/android/build.xml deleted file mode 100644 index 50a3e95a..00000000 --- a/build/android/build.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - diff --git a/build/android/jni/Android.mk b/build/android/jni/Android.mk index 92738e6c..e8534eaa 100644 --- a/build/android/jni/Android.mk +++ b/build/android/jni/Android.mk @@ -69,13 +69,13 @@ GPROF_DEF=-DGPROF endif LOCAL_CFLAGS := -D_IRR_ANDROID_PLATFORM_ \ - -DHAVE_TOUCHSCREENGUI \ - -DUSE_CURL=1 \ - -DUSE_SOUND=1 \ - -DUSE_FREETYPE=1 \ - -DUSE_LEVELDB=$(HAVE_LEVELDB) \ - $(GPROF_DEF) \ - -pipe -fstrict-aliasing + -DHAVE_TOUCHSCREENGUI \ + -DUSE_CURL=1 \ + -DUSE_SOUND=1 \ + -DUSE_FREETYPE=1 \ + -DUSE_LEVELDB=$(HAVE_LEVELDB) \ + $(GPROF_DEF) \ + -pipe -fstrict-aliasing ifndef NDEBUG LOCAL_CFLAGS += -g -D_DEBUG -O0 -fno-omit-frame-pointer @@ -95,8 +95,8 @@ ifeq ($(TARGET_ARCH_ABI),x86) LOCAL_CFLAGS += -fno-stack-protector endif -LOCAL_C_INCLUDES := \ - jni/src jni/src/sqlite \ +LOCAL_C_INCLUDES := \ + jni/src \ jni/src/script \ jni/src/lua/src \ jni/src/json \ @@ -111,7 +111,7 @@ LOCAL_C_INCLUDES := \ deps/leveldb/include \ deps/sqlite/ -LOCAL_SRC_FILES := \ +LOCAL_SRC_FILES := \ jni/src/ban.cpp \ jni/src/camera.cpp \ jni/src/cavegen.cpp \ @@ -261,7 +261,7 @@ LOCAL_SRC_FILES := \ # intentionally kept out (we already build openssl itself): jni/src/util/sha256.c # Network -LOCAL_SRC_FILES += \ +LOCAL_SRC_FILES += \ jni/src/network/connection.cpp \ jni/src/network/networkpacket.cpp \ jni/src/network/clientopcodes.cpp \ @@ -270,7 +270,7 @@ LOCAL_SRC_FILES += \ jni/src/network/serverpackethandler.cpp \ # lua api -LOCAL_SRC_FILES += \ +LOCAL_SRC_FILES += \ jni/src/script/common/c_content.cpp \ jni/src/script/common/c_converter.cpp \ jni/src/script/common/c_internal.cpp \ @@ -310,11 +310,10 @@ LOCAL_SRC_FILES += \ jni/src/script/scripting_mainmenu.cpp #freetype2 support -LOCAL_SRC_FILES += \ - jni/src/cguittfont/xCGUITTFont.cpp +LOCAL_SRC_FILES += jni/src/cguittfont/xCGUITTFont.cpp -# lua -LOCAL_SRC_FILES += \ +# Lua +LOCAL_SRC_FILES += \ jni/src/lua/src/lapi.c \ jni/src/lua/src/lauxlib.c \ jni/src/lua/src/lbaselib.c \ @@ -374,3 +373,4 @@ ifdef GPROF $(call import-module,android-ndk-profiler) endif $(call import-module,android/native_app_glue) + diff --git a/build/android/jni/Application.mk b/build/android/jni/Application.mk index b7ffc56a..53467059 100644 --- a/build/android/jni/Application.mk +++ b/build/android/jni/Application.mk @@ -1,4 +1,4 @@ -# NDK_TOOLCHAIN_VERSION := clang3.3 +# NDK_TOOLCHAIN_VERSION := clang3.8 APP_PLATFORM := android-9 APP_MODULES := minetest @@ -6,3 +6,4 @@ APP_STL := gnustl_static APP_CPPFLAGS += -fexceptions APP_GNUSTL_FORCE_CPP_FEATURES := rtti + diff --git a/build/android/irrlicht-back_button.patch b/build/android/patches/irrlicht-back_button.patch similarity index 100% rename from build/android/irrlicht-back_button.patch rename to build/android/patches/irrlicht-back_button.patch diff --git a/build/android/irrlicht-texturehack.patch b/build/android/patches/irrlicht-texturehack.patch similarity index 100% rename from build/android/irrlicht-texturehack.patch rename to build/android/patches/irrlicht-texturehack.patch diff --git a/build/android/irrlicht-touchcount.patch b/build/android/patches/irrlicht-touchcount.patch similarity index 100% rename from build/android/irrlicht-touchcount.patch rename to build/android/patches/irrlicht-touchcount.patch diff --git a/build/android/libiconv_android.patch b/build/android/patches/libiconv_android.patch similarity index 100% rename from build/android/libiconv_android.patch rename to build/android/patches/libiconv_android.patch diff --git a/build/android/libiconv_stdio.patch b/build/android/patches/libiconv_stdio.patch similarity index 100% rename from build/android/libiconv_stdio.patch rename to build/android/patches/libiconv_stdio.patch diff --git a/build/android/libvorbis-libogg-fpu.patch b/build/android/patches/libvorbis-libogg-fpu.patch similarity index 100% rename from build/android/libvorbis-libogg-fpu.patch rename to build/android/patches/libvorbis-libogg-fpu.patch diff --git a/build/android/openssl_arch.patch b/build/android/patches/openssl_arch.patch similarity index 100% rename from build/android/openssl_arch.patch rename to build/android/patches/openssl_arch.patch diff --git a/build/android/project.properties b/build/android/project.properties deleted file mode 100644 index cc2a7c5c..00000000 --- a/build/android/project.properties +++ /dev/null @@ -1 +0,0 @@ -target=android-10 diff --git a/build/android/settings.gradle b/build/android/settings.gradle new file mode 100644 index 00000000..a6e60c43 --- /dev/null +++ b/build/android/settings.gradle @@ -0,0 +1,2 @@ +rootProject.name = "Minetest" + diff --git a/build/android/src/debug/AndroidManifest.xml b/build/android/src/debug/AndroidManifest.xml new file mode 100644 index 00000000..a3815b9f --- /dev/null +++ b/build/android/src/debug/AndroidManifest.xml @@ -0,0 +1,4 @@ + + + + diff --git a/build/android/src/main/AndroidManifest.xml b/build/android/src/main/AndroidManifest.xml new file mode 100644 index 00000000..df218fb3 --- /dev/null +++ b/build/android/src/main/AndroidManifest.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/build/android/src/net/minetest/minetest/MinetestAssetCopy.java b/build/android/src/main/java/net.minetest.minetest/MinetestAssetCopy.java similarity index 100% rename from build/android/src/net/minetest/minetest/MinetestAssetCopy.java rename to build/android/src/main/java/net.minetest.minetest/MinetestAssetCopy.java diff --git a/build/android/src/net/minetest/minetest/MinetestTextEntry.java b/build/android/src/main/java/net.minetest.minetest/MinetestTextEntry.java similarity index 100% rename from build/android/src/net/minetest/minetest/MinetestTextEntry.java rename to build/android/src/main/java/net.minetest.minetest/MinetestTextEntry.java diff --git a/build/android/src/net/minetest/minetest/MtNativeActivity.java b/build/android/src/main/java/net.minetest.minetest/MtNativeActivity.java similarity index 100% rename from build/android/src/net/minetest/minetest/MtNativeActivity.java rename to build/android/src/main/java/net.minetest.minetest/MtNativeActivity.java diff --git a/build/android/res/drawable-hdpi/irr_icon.png b/build/android/src/main/res/drawable-hdpi/irr_icon.png similarity index 100% rename from build/android/res/drawable-hdpi/irr_icon.png rename to build/android/src/main/res/drawable-hdpi/irr_icon.png diff --git a/build/android/res/drawable-ldpi/irr_icon.png b/build/android/src/main/res/drawable-ldpi/irr_icon.png similarity index 100% rename from build/android/res/drawable-ldpi/irr_icon.png rename to build/android/src/main/res/drawable-ldpi/irr_icon.png diff --git a/build/android/res/drawable-mdpi/irr_icon.png b/build/android/src/main/res/drawable-mdpi/irr_icon.png similarity index 100% rename from build/android/res/drawable-mdpi/irr_icon.png rename to build/android/src/main/res/drawable-mdpi/irr_icon.png diff --git a/build/android/res/drawable-xhdpi/irr_icon.png b/build/android/src/main/res/drawable-xhdpi/irr_icon.png similarity index 100% rename from build/android/res/drawable-xhdpi/irr_icon.png rename to build/android/src/main/res/drawable-xhdpi/irr_icon.png diff --git a/build/android/res/layout/assetcopy.xml b/build/android/src/main/res/layout/assetcopy.xml similarity index 94% rename from build/android/res/layout/assetcopy.xml rename to build/android/src/main/res/layout/assetcopy.xml index 8ec14bdc..1fcfffd6 100644 --- a/build/android/res/layout/assetcopy.xml +++ b/build/android/src/main/res/layout/assetcopy.xml @@ -18,7 +18,7 @@ android:ellipsize="middle" android:singleLine="true" android:layout_gravity="center_horizontal" - android:text="preparing media ..." + android:text="@string/preparing_media" android:textAppearance="?android:attr/textAppearanceSmall" /> diff --git a/build/android/src/main/res/values/strings.xml b/build/android/src/main/res/values/strings.xml new file mode 100644 index 00000000..b407a77c --- /dev/null +++ b/build/android/src/main/res/values/strings.xml @@ -0,0 +1,5 @@ + + + Preparing media... + + diff --git a/build/android/res/values/styles.xml b/build/android/src/main/res/values/styles.xml similarity index 100% rename from build/android/res/values/styles.xml rename to build/android/src/main/res/values/styles.xml diff --git a/util/bump_version.sh b/util/bump_version.sh index 5ff69c8a..948561ac 100755 --- a/util/bump_version.sh +++ b/util/bump_version.sh @@ -32,12 +32,12 @@ cd ${0%/*}/.. grep -q -E '^set\(VERSION_MAJOR [0-9]+\)$' CMakeLists.txt || die "error: Could not find CMakeLists.txt" grep -q -E '^set\(VERSION_MINOR [0-9]+\)$' CMakeLists.txt || die "error: Could not find CMakeLists.txt" grep -q -E '^set\(VERSION_PATCH [0-9]+\)$' CMakeLists.txt || die "error: Could not find CMakeLists.txt" -grep -q -E '^ANDROID_VERSION_CODE = [0-9]+$' build/android/Makefile || die "error: Could not find build/android/Makefile" +grep -q -E 'versionCode [0-9]+$' build/android/build.gradle || die "error: Could not find Android version code" VERSION_MAJOR=$(grep -E '^set\(VERSION_MAJOR [0-9]+\)$' CMakeLists.txt | tr -dC 0-9) VERSION_MINOR=$(grep -E '^set\(VERSION_MINOR [0-9]+\)$' CMakeLists.txt | tr -dC 0-9) VERSION_PATCH=$(grep -E '^set\(VERSION_PATCH [0-9]+\)$' CMakeLists.txt | tr -dC 0-9) -ANDROID_VERSION_CODE=$(grep -E '^ANDROID_VERSION_CODE = [0-9]+$' build/android/Makefile | tr -dC 0-9) +ANDROID_VERSION_CODE=$(grep -E 'versionCode [0-9]+$' build/android/build.gradle | tr -dC 0-9) echo "Current Minetest version: $VERSION_MAJOR.$VERSION_MINOR.$VERSION_PATCH" echo "Current Android version code: $ANDROID_VERSION_CODE" @@ -89,13 +89,13 @@ sed -i -re "s/^set\(VERSION_PATCH [0-9]+\)$/set(VERSION_PATCH $NEW_VERSION_PATCH sed -i -re "s/^set\(DEVELOPMENT_BUILD TRUE\)$/set(DEVELOPMENT_BUILD FALSE)/" CMakeLists.txt || die "Failed to unset DEVELOPMENT_BUILD" -sed -i -re "s/^ANDROID_VERSION_CODE = [0-9]+$/ANDROID_VERSION_CODE = $NEW_ANDROID_VERSION_CODE/" build/android/Makefile || die "Failed to update ANDROID_VERSION_CODE" +sed -i -re "s/versionCode [0-9]+$/versionCode $NEW_ANDROID_VERSION_CODE/" build/android/build.gradle || die "Failed to update Android version code" sed -i -re "1s/[0-9]+\.[0-9]+\.[0-9]+/$NEW_VERSION/g" doc/lua_api.txt || die "Failed to update doc/lua_api.txt" sed -i -re "1s/[0-9]+\.[0-9]+\.[0-9]+/$NEW_VERSION/g" doc/menu_lua_api.txt || die "Failed to update doc/menu_lua_api.txt" -git add -f CMakeLists.txt build/android/Makefile doc/lua_api.txt doc/menu_lua_api.txt || die "git add failed" +git add -f CMakeLists.txt build/android/build.gradle doc/lua_api.txt doc/menu_lua_api.txt || die "git add failed" git commit -m "Bump version to $NEW_VERSION" || die "git commit failed" From 138f6778122ffe0c3239c365dc0c77981cd0fa10 Mon Sep 17 00:00:00 2001 From: ShadowNinja Date: Mon, 7 Mar 2016 16:55:32 -0500 Subject: [PATCH 15/16] Fix race on thread creation This often broke the threading tests on OSX. --- src/threading/thread.cpp | 12 +----------- src/threading/thread.h | 18 ++++++++++++++++-- 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/src/threading/thread.cpp b/src/threading/thread.cpp index 8688c4cb..ecf8563f 100644 --- a/src/threading/thread.cpp +++ b/src/threading/thread.cpp @@ -116,9 +116,7 @@ bool Thread::start() #if USE_CPP11_THREADS try { - m_thread_obj = new std::thread(threadProc, this); - m_thread_id = m_thread_obj->get_id(); - m_thread_handle = m_thread_obj->native_handle(); + m_thread_obj = new std::thread(threadProc, this); } catch (const std::system_error &e) { return false; } @@ -135,8 +133,6 @@ bool Thread::start() if (status) return false; - m_thread_id = m_thread_handle; - #endif while (!m_running) @@ -234,12 +230,6 @@ bool Thread::getReturnValue(void **ret) } -bool Thread::isCurrentThread() -{ - return thr_is_current_thread(m_thread_id); -} - - #if USE_CPP11_THREADS || USE_POSIX_THREADS void *Thread::threadProc(void *param) #elif defined(_WIN32_WCE) diff --git a/src/threading/thread.h b/src/threading/thread.h index 6a24afff..10732c44 100644 --- a/src/threading/thread.h +++ b/src/threading/thread.h @@ -90,12 +90,22 @@ public: /* * Returns true if the calling thread is this Thread object. */ - bool isCurrentThread(); + bool isCurrentThread() { return thr_is_current_thread(getThreadId()); } inline bool isRunning() { return m_running; } inline bool stopRequested() { return m_request_stop; } + +#if USE_CPP11_THREADS + inline threadid_t getThreadId() { return m_thread_obj->get_id(); } + inline threadhandle_t getThreadHandle() { return m_thread_obj->native_handle(); } +#else +# if USE_WIN_THREADS inline threadid_t getThreadId() { return m_thread_id; } +# else + inline threadid_t getThreadId() { return m_thread_handle; } +# endif inline threadhandle_t getThreadHandle() { return m_thread_handle; } +#endif /* * Gets the thread return value. @@ -147,8 +157,12 @@ private: Atomic m_running; Mutex m_mutex; - threadid_t m_thread_id; +#if !USE_CPP11_THREADS threadhandle_t m_thread_handle; +#if _WIN32 + threadid_t m_thread_id; +#endif +#endif static ThreadStartFunc threadProc; From 2942a16393160beb7d0635af7b4650469541f91e Mon Sep 17 00:00:00 2001 From: paramat Date: Mon, 25 Apr 2016 11:47:25 +0100 Subject: [PATCH 16/16] Mapgen: Make 3D noise tunnels' width settable Correct parameter names mg_valleys to mgvalleys Remove biome NoiseParams from MapgenValleysParams Improve format of parameter code --- builtin/settingtypes.txt | 49 +++++++++++------ minetest.conf.example | 56 +++++++++++++------ src/mapgen_flat.cpp | 37 +++++++------ src/mapgen_flat.h | 7 +-- src/mapgen_fractal.cpp | 99 ++++++++++++++++----------------- src/mapgen_fractal.h | 8 +-- src/mapgen_v5.cpp | 15 +++-- src/mapgen_v5.h | 4 +- src/mapgen_v7.cpp | 15 +++-- src/mapgen_v7.h | 4 +- src/mapgen_valleys.cpp | 116 ++++++++++++++++++++------------------- src/mapgen_valleys.h | 39 ++++++------- 12 files changed, 244 insertions(+), 205 deletions(-) diff --git a/builtin/settingtypes.txt b/builtin/settingtypes.txt index 0a951961..ad269d8b 100644 --- a/builtin/settingtypes.txt +++ b/builtin/settingtypes.txt @@ -886,6 +886,9 @@ mg_biome_np_humidity_blend (Mapgen biome humidity blend noise parameters) noise_ [***Mapgen v5] +# Controls width of tunnels, a smaller value creates wider tunnels. +mgv5_cave_width (Mapgen v5 cave width) float 0.125 + mgv5_np_filler_depth (Mapgen v5 filler depth noise parameters) noise_params 0, 1, (150, 150, 150), 261, 4, 0.7, 2.0 mgv5_np_factor (Mapgen v5 factor noise parameters) noise_params 0, 1, (250, 250, 250), 920381, 3, 0.45, 2.0 mgv5_np_height (Mapgen v5 height noise parameters) noise_params 0, 10, (250, 250, 250), 84174, 4, 0.5, 2.0 @@ -940,6 +943,9 @@ mgv6_np_apple_trees (Mapgen v6 apple trees noise parameters) noise_params 0, 1, # Flags starting with 'no' are used to explicitly disable them. mgv7_spflags (Mapgen v7 flags) flags mountains,ridges mountains,ridges,nomountains,noridges +# Controls width of tunnels, a smaller value creates wider tunnels. +mgv7_cave_width (Mapgen v7 cave width) float 0.3 + mgv7_np_terrain_base (Mapgen v7 terrain base noise parameters) noise_params 4, 70, (600, 600, 600), 82341, 5, 0.6, 2.0 mgv7_np_terrain_alt (Mapgen v7 terrain altitude noise parameters) noise_params 4, 25, (600, 600, 600), 5934, 5, 0.6, 2.0 mgv7_np_terrain_persist (Mapgen v7 terrain persistation noise parameters) noise_params 0.6, 0.1, (2000, 2000, 2000), 539, 3, 0.6, 2.0 @@ -968,6 +974,9 @@ mgflat_ground_level (Mapgen flat ground level) int 8 # Y of upper limit of large pseudorandom caves. mgflat_large_cave_depth (Mapgen flat large cave depth) int -33 +# Controls width of tunnels, a smaller value creates wider tunnels. +mgflat_cave_width (Mapgen flat cave width) float 0.3 + # Terrain noise threshold for lakes. # Controls proportion of world area covered by lakes. # Adjust towards 0.0 for a larger proportion. @@ -995,6 +1004,9 @@ mgflat_np_cave2 (Mapgen flat cave2 noise parameters) noise_params 0, 12, (128, 1 [***Mapgen fractal] +# Controls width of tunnels, a smaller value creates wider tunnels. +mgfractal_cave_width (Mapgen fractal cave width) float 0.3 + # Choice of 18 fractals from 9 formulas. # 1 = 4D "Roundy" mandelbrot set. # 2 = 4D "Roundy" julia set. @@ -1074,60 +1086,63 @@ mgfractal_np_cave2 (Mapgen fractal cave2 noise parameters) noise_params 0, 12, ( mg_valleys_spflags (Valleys C Flags) flags altitude_chill,humid_rivers altitude_chill,noaltitude_chill,humid_rivers,nohumid_rivers # The altitude at which temperature drops by 20C -mg_valleys_altitude_chill (Altitude Chill) int 90 +mgvalleys_altitude_chill (Altitude Chill) int 90 # Depth below which you'll find large caves. -mg_valleys_large_cave_depth (Large cave depth) int -33 +mgvalleys_large_cave_depth (Large cave depth) int -33 # Creates unpredictable lava features in caves. # These can make mining difficult. Zero disables them. (0-10) -mg_valleys_lava_features (Lava Features) int 0 +mgvalleys_lava_features (Lava Features) int 0 # Depth below which you'll find massive caves. -mg_valleys_massive_cave_depth (Massive cave depth) int -256 +mgvalleys_massive_cave_depth (Massive cave depth) int -256 # How deep to make rivers -mg_valleys_river_depth (River Depth) int 4 +mgvalleys_river_depth (River Depth) int 4 # How wide to make rivers -mg_valleys_river_size (River Size) int 5 +mgvalleys_river_size (River Size) int 5 # Creates unpredictable water features in caves. # These can make mining difficult. Zero disables them. (0-10) -mg_valleys_water_features (Water Features) int 0 +mgvalleys_water_features (Water Features) int 0 + +# Controls width of tunnels, a smaller value creates wider tunnels. +mgvalleys_cave_width (Cave width) float 0.3 # Noise parameters [****Noises] # Caves and tunnels form at the intersection of the two noises -mg_valleys_np_cave1 (Cave noise #1) noise_params 0, 12, (100, 100, 100), 52534, 4, 0.5, 2.0 +mgvalleys_np_cave1 (Cave noise #1) noise_params 0, 12, (100, 100, 100), 52534, 4, 0.5, 2.0 # Caves and tunnels form at the intersection of the two noises -mg_valleys_np_cave2 (Cave noise #2) noise_params 0, 12, (100, 100, 100), 10325, 4, 0.5, 2.0 +mgvalleys_np_cave2 (Cave noise #2) noise_params 0, 12, (100, 100, 100), 10325, 4, 0.5, 2.0 # The depth of dirt or other filler -mg_valleys_np_filler_depth (Filler Depth) noise_params 0, 1.2, (256, 256, 256), 1605, 3, 0.5, 2.0 +mgvalleys_np_filler_depth (Filler Depth) noise_params 0, 1.2, (256, 256, 256), 1605, 3, 0.5, 2.0 # Massive caves form here. -mg_valleys_np_massive_caves (Massive cave noise) noise_params 0, 1, (768, 256, 768), 59033, 6, 0.63, 2.0 +mgvalleys_np_massive_caves (Massive cave noise) noise_params 0, 1, (768, 256, 768), 59033, 6, 0.63, 2.0 # River noise -- rivers occur close to zero -mg_valleys_np_rivers (River Noise) noise_params 0, 1, (256, 256, 256), -6050, 5, 0.6, 2.0 +mgvalleys_np_rivers (River Noise) noise_params 0, 1, (256, 256, 256), -6050, 5, 0.6, 2.0 # Base terrain height -mg_valleys_np_terrain_height (Terrain Height) noise_params -10, 50, (1024, 1024, 1024), 5202, 6, 0.4, 2.0 +mgvalleys_np_terrain_height (Terrain Height) noise_params -10, 50, (1024, 1024, 1024), 5202, 6, 0.4, 2.0 # Raises terrain to make valleys around the rivers -mg_valleys_np_valley_depth (Valley Depth) noise_params 5, 4, (512, 512, 512), -1914, 1, 1.0, 2.0 +mgvalleys_np_valley_depth (Valley Depth) noise_params 5, 4, (512, 512, 512), -1914, 1, 1.0, 2.0 # Slope and fill work together to modify the heights -mg_valleys_np_inter_valley_fill (Valley Fill) noise_params 0, 1, (256, 512, 256), 1993, 6, 0.8, 2.0 +mgvalleys_np_inter_valley_fill (Valley Fill) noise_params 0, 1, (256, 512, 256), 1993, 6, 0.8, 2.0 # Amplifies the valleys -mg_valleys_np_valley_profile (Valley Profile) noise_params 0.6, 0.5, (512, 512, 512), 777, 1, 1.0, 2.0 +mgvalleys_np_valley_profile (Valley Profile) noise_params 0.6, 0.5, (512, 512, 512), 777, 1, 1.0, 2.0 # Slope and fill work together to modify the heights -mg_valleys_np_inter_valley_slope (Valley Slope) noise_params 0.5, 0.5, (128, 128, 128), 746, 1, 1.0, 2.0 +mgvalleys_np_inter_valley_slope (Valley Slope) noise_params 0.5, 0.5, (128, 128, 128), 746, 1, 1.0, 2.0 [*Security] diff --git a/minetest.conf.example b/minetest.conf.example index 6f0eb786..e72c7e35 100644 --- a/minetest.conf.example +++ b/minetest.conf.example @@ -1098,6 +1098,10 @@ #### Mapgen v5 +# Controls width of tunnels, a smaller value creates wider tunnels. +# type: float +# mgv5_cave_width = 0.125 + # type: noise_params # mgv5_np_filler_depth = 0, 1, (150, 150, 150), 261, 4, 0.7, 2.0 @@ -1176,6 +1180,10 @@ # type: flags possible values: mountains, ridges, nomountains, noridges # mgv7_spflags = mountains,ridges +# Controls width of tunnels, a smaller value creates wider tunnels. +# type: float +# mgv7_cave_width = 0.3 + # type: noise_params # mgv7_np_terrain_base = 4, 70, (600, 600, 600), 82341, 5, 0.6, 2.0 @@ -1228,6 +1236,10 @@ # type: int # mgflat_large_cave_depth = -33 +# Controls width of tunnels, a smaller value creates wider tunnels. +# type: float +# mgflat_cave_width = 0.3 + # Terrain noise threshold for lakes. # Controls proportion of world area covered by lakes. # Adjust towards 0.0 for a larger proportion. @@ -1265,6 +1277,10 @@ #### Mapgen fractal +# Controls width of tunnels, a smaller value creates wider tunnels. +# type: float +# mgfractal_cave_width = 0.3 + # Choice of 18 fractals from 9 formulas. # 1 = 4D "Roundy" mandelbrot set. # 2 = 4D "Roundy" julia set. @@ -1356,79 +1372,83 @@ # Flags that are not specified in the flag string are not modified from the default. # Flags starting with 'no' are used to explicitly disable them. # type: flags possible values: altitude_chill, noaltitude_chill, humid_rivers, nohumid_rivers -# mg_valleys_spflags = altitude_chill,humid_rivers +# mgvalleys_spflags = altitude_chill,humid_rivers # The altitude at which temperature drops by 20C # type: int -# mg_valleys_altitude_chill = 90 +# mgvalleys_altitude_chill = 90 # Depth below which you'll find large caves. # type: int -# mg_valleys_large_cave_depth = -33 +# mgvalleys_large_cave_depth = -33 # Creates unpredictable lava features in caves. # These can make mining difficult. Zero disables them. (0-10) # type: int -# mg_valleys_lava_features = 0 +# mgvalleys_lava_features = 0 # Depth below which you'll find massive caves. # type: int -# mg_valleys_massive_cave_depth = -256 +# mgvalleys_massive_cave_depth = -256 # How deep to make rivers # type: int -# mg_valleys_river_depth = 4 +# mgvalleys_river_depth = 4 # How wide to make rivers # type: int -# mg_valleys_river_size = 5 +# mgvalleys_river_size = 5 # Creates unpredictable water features in caves. # These can make mining difficult. Zero disables them. (0-10) # type: int -# mg_valleys_water_features = 0 +# mgvalleys_water_features = 0 + +# Controls width of tunnels, a smaller value creates wider tunnels. +# type: float +# mgvalleys_cave_width = 0.3 ##### Noises # Caves and tunnels form at the intersection of the two noises # type: noise_params -# mg_valleys_np_cave1 = 0, 12, (100, 100, 100), 52534, 4, 0.5, 2.0 +# mgvalleys_np_cave1 = 0, 12, (100, 100, 100), 52534, 4, 0.5, 2.0 # Caves and tunnels form at the intersection of the two noises # type: noise_params -# mg_valleys_np_cave2 = 0, 12, (100, 100, 100), 10325, 4, 0.5, 2.0 +# mgvalleys_np_cave2 = 0, 12, (100, 100, 100), 10325, 4, 0.5, 2.0 # The depth of dirt or other filler # type: noise_params -# mg_valleys_np_filler_depth = 0, 1.2, (256, 256, 256), 1605, 3, 0.5, 2.0 +# mgvalleys_np_filler_depth = 0, 1.2, (256, 256, 256), 1605, 3, 0.5, 2.0 # Massive caves form here. # type: noise_params -# mg_valleys_np_massive_caves = 0, 1, (768, 256, 768), 59033, 6, 0.63, 2.0 +# mgvalleys_np_massive_caves = 0, 1, (768, 256, 768), 59033, 6, 0.63, 2.0 # River noise -- rivers occur close to zero # type: noise_params -# mg_valleys_np_rivers = 0, 1, (256, 256, 256), -6050, 5, 0.6, 2.0 +# mgvalleys_np_rivers = 0, 1, (256, 256, 256), -6050, 5, 0.6, 2.0 # Base terrain height # type: noise_params -# mg_valleys_np_terrain_height = -10, 50, (1024, 1024, 1024), 5202, 6, 0.4, 2.0 +# mgvalleys_np_terrain_height = -10, 50, (1024, 1024, 1024), 5202, 6, 0.4, 2.0 # Raises terrain to make valleys around the rivers # type: noise_params -# mg_valleys_np_valley_depth = 5, 4, (512, 512, 512), -1914, 1, 1.0, 2.0 +# mgvalleys_np_valley_depth = 5, 4, (512, 512, 512), -1914, 1, 1.0, 2.0 # Slope and fill work together to modify the heights # type: noise_params -# mg_valleys_np_inter_valley_fill = 0, 1, (256, 512, 256), 1993, 6, 0.8, 2.0 +# mgvalleys_np_inter_valley_fill = 0, 1, (256, 512, 256), 1993, 6, 0.8, 2.0 # Amplifies the valleys # type: noise_params -# mg_valleys_np_valley_profile = 0.6, 0.5, (512, 512, 512), 777, 1, 1.0, 2.0 +# mgvalleys_np_valley_profile = 0.6, 0.5, (512, 512, 512), 777, 1, 1.0, 2.0 # Slope and fill work together to modify the heights # type: noise_params -# mg_valleys_np_inter_valley_slope = 0.5, 0.5, (128, 128, 128), 746, 1, 1.0, 2.0 +# mgvalleys_np_inter_valley_slope = 0.5, 0.5, (128, 128, 128), 746, 1, 1.0, 2.0 ## Security diff --git a/src/mapgen_flat.cpp b/src/mapgen_flat.cpp index 0c243842..4669f171 100644 --- a/src/mapgen_flat.cpp +++ b/src/mapgen_flat.cpp @@ -67,14 +67,15 @@ MapgenFlat::MapgenFlat(int mapgenid, MapgenParams *params, EmergeManager *emerge this->humidmap = NULL; MapgenFlatParams *sp = (MapgenFlatParams *)params->sparams; - this->spflags = sp->spflags; - this->ground_level = sp->ground_level; + this->spflags = sp->spflags; + this->ground_level = sp->ground_level; this->large_cave_depth = sp->large_cave_depth; - this->lake_threshold = sp->lake_threshold; - this->lake_steepness = sp->lake_steepness; - this->hill_threshold = sp->hill_threshold; - this->hill_steepness = sp->hill_steepness; + this->cave_width = sp->cave_width; + this->lake_threshold = sp->lake_threshold; + this->lake_steepness = sp->lake_steepness; + this->hill_threshold = sp->hill_threshold; + this->hill_steepness = sp->hill_steepness; //// 2D noise noise_terrain = new Noise(&sp->np_terrain, seed, csize.X, csize.Z); @@ -139,14 +140,14 @@ MapgenFlat::~MapgenFlat() MapgenFlatParams::MapgenFlatParams() { - spflags = 0; - - ground_level = 8; + spflags = 0; + ground_level = 8; large_cave_depth = -33; - lake_threshold = -0.45; - lake_steepness = 48.0; - hill_threshold = 0.45; - hill_steepness = 64.0; + cave_width = 0.3; + lake_threshold = -0.45; + lake_steepness = 48.0; + hill_threshold = 0.45; + hill_steepness = 64.0; np_terrain = NoiseParams(0, 1, v3f(600, 600, 600), 7244, 5, 0.6, 2.0); np_filler_depth = NoiseParams(0, 1.2, v3f(150, 150, 150), 261, 3, 0.7, 2.0); @@ -157,10 +158,10 @@ MapgenFlatParams::MapgenFlatParams() void MapgenFlatParams::readParams(const Settings *settings) { - settings->getFlagStrNoEx("mgflat_spflags", spflags, flagdesc_mapgen_flat); - + settings->getFlagStrNoEx("mgflat_spflags", spflags, flagdesc_mapgen_flat); settings->getS16NoEx("mgflat_ground_level", ground_level); settings->getS16NoEx("mgflat_large_cave_depth", large_cave_depth); + settings->getFloatNoEx("mgflat_cave_width", cave_width); settings->getFloatNoEx("mgflat_lake_threshold", lake_threshold); settings->getFloatNoEx("mgflat_lake_steepness", lake_steepness); settings->getFloatNoEx("mgflat_hill_threshold", hill_threshold); @@ -175,10 +176,10 @@ void MapgenFlatParams::readParams(const Settings *settings) void MapgenFlatParams::writeParams(Settings *settings) const { - settings->setFlagStr("mgflat_spflags", spflags, flagdesc_mapgen_flat, U32_MAX); - + settings->setFlagStr("mgflat_spflags", spflags, flagdesc_mapgen_flat, U32_MAX); settings->setS16("mgflat_ground_level", ground_level); settings->setS16("mgflat_large_cave_depth", large_cave_depth); + settings->setFloat("mgflat_cave_width", cave_width); settings->setFloat("mgflat_lake_threshold", lake_threshold); settings->setFloat("mgflat_lake_steepness", lake_steepness); settings->setFloat("mgflat_hill_threshold", hill_threshold); @@ -592,7 +593,7 @@ void MapgenFlat::generateCaves(s16 max_stone_y) float d1 = contour(noise_cave1->result[index3d]); float d2 = contour(noise_cave2->result[index3d]); - if (d1 * d2 > 0.3f && ndef->get(c).is_ground_content) { + if (d1 * d2 > cave_width && ndef->get(c).is_ground_content) { // In tunnel and ground content, excavate vm->m_data[vi] = MapNode(CONTENT_AIR); is_tunnel = true; diff --git a/src/mapgen_flat.h b/src/mapgen_flat.h index 8ddfe708..8aed09be 100644 --- a/src/mapgen_flat.h +++ b/src/mapgen_flat.h @@ -34,14 +34,13 @@ extern FlagDesc flagdesc_mapgen_flat[]; struct MapgenFlatParams : public MapgenSpecificParams { u32 spflags; - s16 ground_level; s16 large_cave_depth; + float cave_width; float lake_threshold; float lake_steepness; float hill_threshold; float hill_steepness; - NoiseParams np_terrain; NoiseParams np_filler_depth; NoiseParams np_cave1; @@ -61,20 +60,20 @@ public: int ystride; int zstride_1d; - u32 spflags; v3s16 node_min; v3s16 node_max; v3s16 full_node_min; v3s16 full_node_max; + u32 spflags; s16 ground_level; s16 large_cave_depth; + float cave_width; float lake_threshold; float lake_steepness; float hill_threshold; float hill_steepness; - Noise *noise_terrain; Noise *noise_filler_depth; Noise *noise_cave1; diff --git a/src/mapgen_fractal.cpp b/src/mapgen_fractal.cpp index d75d1149..e2e29f87 100644 --- a/src/mapgen_fractal.cpp +++ b/src/mapgen_fractal.cpp @@ -65,21 +65,18 @@ MapgenFractal::MapgenFractal(int mapgenid, MapgenParams *params, EmergeManager * this->humidmap = NULL; MapgenFractalParams *sp = (MapgenFractalParams *)params->sparams; - this->spflags = sp->spflags; + this->spflags = sp->spflags; + this->cave_width = sp->cave_width; this->fractal = sp->fractal; this->iterations = sp->iterations; this->scale = sp->scale; this->offset = sp->offset; this->slice_w = sp->slice_w; - - this->julia_x = sp->julia_x; - this->julia_y = sp->julia_y; - this->julia_z = sp->julia_z; - this->julia_w = sp->julia_w; - - this->formula = fractal / 2 + fractal % 2; - this->julia = fractal % 2 == 0; + this->julia_x = sp->julia_x; + this->julia_y = sp->julia_y; + this->julia_z = sp->julia_z; + this->julia_w = sp->julia_w; //// 2D terrain noise noise_seabed = new Noise(&sp->np_seabed, seed, csize.X, csize.Z); @@ -96,6 +93,9 @@ MapgenFractal::MapgenFractal(int mapgenid, MapgenParams *params, EmergeManager * noise_heat_blend = new Noise(¶ms->np_biome_heat_blend, seed, csize.X, csize.Z); noise_humidity_blend = new Noise(¶ms->np_biome_humidity_blend, seed, csize.X, csize.Z); + this->formula = fractal / 2 + fractal % 2; + this->julia = fractal % 2 == 0; + //// Resolve nodes to be used INodeDefManager *ndef = emerge->ndef; @@ -144,18 +144,17 @@ MapgenFractal::~MapgenFractal() MapgenFractalParams::MapgenFractalParams() { - spflags = 0; - - fractal = 1; + spflags = 0; + cave_width = 0.3; + fractal = 1; iterations = 11; - scale = v3f(4096.0, 1024.0, 4096.0); - offset = v3f(1.79, 0.0, 0.0); - slice_w = 0.0; - - julia_x = 0.33; - julia_y = 0.33; - julia_z = 0.33; - julia_w = 0.33; + scale = v3f(4096.0, 1024.0, 4096.0); + offset = v3f(1.79, 0.0, 0.0); + slice_w = 0.0; + julia_x = 0.33; + julia_y = 0.33; + julia_z = 0.33; + julia_w = 0.33; np_seabed = NoiseParams(-14, 9, v3f(600, 600, 600), 41900, 5, 0.6, 2.0); np_filler_depth = NoiseParams(0, 1.2, v3f(150, 150, 150), 261, 3, 0.7, 2.0); @@ -166,45 +165,43 @@ MapgenFractalParams::MapgenFractalParams() void MapgenFractalParams::readParams(const Settings *settings) { - settings->getFlagStrNoEx("mgfractal_spflags", spflags, flagdesc_mapgen_fractal); + settings->getFlagStrNoEx("mgfractal_spflags", spflags, flagdesc_mapgen_fractal); + settings->getFloatNoEx("mgfractal_cave_width", cave_width); + settings->getU16NoEx("mgfractal_fractal", fractal); + settings->getU16NoEx("mgfractal_iterations", iterations); + settings->getV3FNoEx("mgfractal_scale", scale); + settings->getV3FNoEx("mgfractal_offset", offset); + settings->getFloatNoEx("mgfractal_slice_w", slice_w); + settings->getFloatNoEx("mgfractal_julia_x", julia_x); + settings->getFloatNoEx("mgfractal_julia_y", julia_y); + settings->getFloatNoEx("mgfractal_julia_z", julia_z); + settings->getFloatNoEx("mgfractal_julia_w", julia_w); - settings->getU16NoEx("mgfractal_fractal", fractal); - settings->getU16NoEx("mgfractal_iterations", iterations); - settings->getV3FNoEx("mgfractal_scale", scale); - settings->getV3FNoEx("mgfractal_offset", offset); - settings->getFloatNoEx("mgfractal_slice_w", slice_w); - - settings->getFloatNoEx("mgfractal_julia_x", julia_x); - settings->getFloatNoEx("mgfractal_julia_y", julia_y); - settings->getFloatNoEx("mgfractal_julia_z", julia_z); - settings->getFloatNoEx("mgfractal_julia_w", julia_w); - - settings->getNoiseParams("mgfractal_np_seabed", np_seabed); + settings->getNoiseParams("mgfractal_np_seabed", np_seabed); settings->getNoiseParams("mgfractal_np_filler_depth", np_filler_depth); - settings->getNoiseParams("mgfractal_np_cave1", np_cave1); - settings->getNoiseParams("mgfractal_np_cave2", np_cave2); + settings->getNoiseParams("mgfractal_np_cave1", np_cave1); + settings->getNoiseParams("mgfractal_np_cave2", np_cave2); } void MapgenFractalParams::writeParams(Settings *settings) const { - settings->setFlagStr("mgfractal_spflags", spflags, flagdesc_mapgen_fractal, U32_MAX); + settings->setFlagStr("mgfractal_spflags", spflags, flagdesc_mapgen_fractal, U32_MAX); + settings->setFloat("mgfractal_cave_width", cave_width); + settings->setU16("mgfractal_fractal", fractal); + settings->setU16("mgfractal_iterations", iterations); + settings->setV3F("mgfractal_scale", scale); + settings->setV3F("mgfractal_offset", offset); + settings->setFloat("mgfractal_slice_w", slice_w); + settings->setFloat("mgfractal_julia_x", julia_x); + settings->setFloat("mgfractal_julia_y", julia_y); + settings->setFloat("mgfractal_julia_z", julia_z); + settings->setFloat("mgfractal_julia_w", julia_w); - settings->setU16("mgfractal_fractal", fractal); - settings->setU16("mgfractal_iterations", iterations); - settings->setV3F("mgfractal_scale", scale); - settings->setV3F("mgfractal_offset", offset); - settings->setFloat("mgfractal_slice_w", slice_w); - - settings->setFloat("mgfractal_julia_x", julia_x); - settings->setFloat("mgfractal_julia_y", julia_y); - settings->setFloat("mgfractal_julia_z", julia_z); - settings->setFloat("mgfractal_julia_w", julia_w); - - settings->setNoiseParams("mgfractal_np_seabed", np_seabed); + settings->setNoiseParams("mgfractal_np_seabed", np_seabed); settings->setNoiseParams("mgfractal_np_filler_depth", np_filler_depth); - settings->setNoiseParams("mgfractal_np_cave1", np_cave1); - settings->setNoiseParams("mgfractal_np_cave2", np_cave2); + settings->setNoiseParams("mgfractal_np_cave1", np_cave1); + settings->setNoiseParams("mgfractal_np_cave2", np_cave2); } @@ -720,7 +717,7 @@ void MapgenFractal::generateCaves(s16 max_stone_y) float d1 = contour(noise_cave1->result[index3d]); float d2 = contour(noise_cave2->result[index3d]); - if (d1 * d2 > 0.3f && ndef->get(c).is_ground_content) { + if (d1 * d2 > cave_width && ndef->get(c).is_ground_content) { // In tunnel and ground content, excavate vm->m_data[vi] = MapNode(CONTENT_AIR); is_tunnel = true; diff --git a/src/mapgen_fractal.h b/src/mapgen_fractal.h index 8c21a8a4..dd96045e 100644 --- a/src/mapgen_fractal.h +++ b/src/mapgen_fractal.h @@ -35,18 +35,16 @@ extern FlagDesc flagdesc_mapgen_fractal[]; struct MapgenFractalParams : public MapgenSpecificParams { u32 spflags; - + float cave_width; u16 fractal; u16 iterations; v3f scale; v3f offset; float slice_w; - float julia_x; float julia_y; float julia_z; float julia_w; - NoiseParams np_seabed; NoiseParams np_filler_depth; NoiseParams np_cave1; @@ -75,18 +73,16 @@ public: v3s16 full_node_max; u32 spflags; - + float cave_width; u16 fractal; u16 iterations; v3f scale; v3f offset; float slice_w; - float julia_x; float julia_y; float julia_z; float julia_w; - Noise *noise_seabed; Noise *noise_filler_depth; Noise *noise_cave1; diff --git a/src/mapgen_v5.cpp b/src/mapgen_v5.cpp index 5ae2568a..b98acb92 100644 --- a/src/mapgen_v5.cpp +++ b/src/mapgen_v5.cpp @@ -63,7 +63,9 @@ MapgenV5::MapgenV5(int mapgenid, MapgenParams *params, EmergeManager *emerge) this->humidmap = NULL; MapgenV5Params *sp = (MapgenV5Params *)params->sparams; - this->spflags = sp->spflags; + + this->spflags = sp->spflags; + this->cave_width = sp->cave_width; // Terrain noise noise_filler_depth = new Noise(&sp->np_filler_depth, seed, csize.X, csize.Z); @@ -133,7 +135,8 @@ MapgenV5::~MapgenV5() MapgenV5Params::MapgenV5Params() { - spflags = 0; + spflags = 0; + cave_width = 0.125; np_filler_depth = NoiseParams(0, 1, v3f(150, 150, 150), 261, 4, 0.7, 2.0); np_factor = NoiseParams(0, 1, v3f(250, 250, 250), 920381, 3, 0.45, 2.0); @@ -150,7 +153,8 @@ MapgenV5Params::MapgenV5Params() void MapgenV5Params::readParams(const Settings *settings) { - settings->getFlagStrNoEx("mgv5_spflags", spflags, flagdesc_mapgen_v5); + settings->getFlagStrNoEx("mgv5_spflags", spflags, flagdesc_mapgen_v5); + settings->getFloatNoEx("mgv5_cave_width", cave_width); settings->getNoiseParams("mgv5_np_filler_depth", np_filler_depth); settings->getNoiseParams("mgv5_np_factor", np_factor); @@ -163,7 +167,8 @@ void MapgenV5Params::readParams(const Settings *settings) void MapgenV5Params::writeParams(Settings *settings) const { - settings->setFlagStr("mgv5_spflags", spflags, flagdesc_mapgen_v5, U32_MAX); + settings->setFlagStr("mgv5_spflags", spflags, flagdesc_mapgen_v5, U32_MAX); + settings->setFloat("mgv5_cave_width", cave_width); settings->setNoiseParams("mgv5_np_filler_depth", np_filler_depth); settings->setNoiseParams("mgv5_np_factor", np_factor); @@ -598,7 +603,7 @@ void MapgenV5::generateCaves(int max_stone_y) float d1 = contour(noise_cave1->result[index3d]); float d2 = contour(noise_cave2->result[index3d]); - if (d1 * d2 > 0.125f && ndef->get(c).is_ground_content) { + if (d1 * d2 > cave_width && ndef->get(c).is_ground_content) { // In tunnel and ground content, excavate vm->m_data[vi] = MapNode(CONTENT_AIR); is_tunnel = true; diff --git a/src/mapgen_v5.h b/src/mapgen_v5.h index 8047f225..fd2f7f4d 100644 --- a/src/mapgen_v5.h +++ b/src/mapgen_v5.h @@ -32,6 +32,7 @@ extern FlagDesc flagdesc_mapgen_v5[]; struct MapgenV5Params : public MapgenSpecificParams { u32 spflags; + float cave_width; NoiseParams np_filler_depth; NoiseParams np_factor; NoiseParams np_height; @@ -54,13 +55,14 @@ public: int ystride; int zstride_1d; - u32 spflags; v3s16 node_min; v3s16 node_max; v3s16 full_node_min; v3s16 full_node_max; + u32 spflags; + float cave_width; Noise *noise_filler_depth; Noise *noise_factor; Noise *noise_height; diff --git a/src/mapgen_v7.cpp b/src/mapgen_v7.cpp index 162bf068..9fb65f57 100644 --- a/src/mapgen_v7.cpp +++ b/src/mapgen_v7.cpp @@ -71,7 +71,9 @@ MapgenV7::MapgenV7(int mapgenid, MapgenParams *params, EmergeManager *emerge) this->ridge_heightmap = new s16[csize.X * csize.Z]; MapgenV7Params *sp = (MapgenV7Params *)params->sparams; - this->spflags = sp->spflags; + + this->spflags = sp->spflags; + this->cave_width = sp->cave_width; //// Terrain noise noise_terrain_base = new Noise(&sp->np_terrain_base, seed, csize.X, csize.Z); @@ -152,7 +154,8 @@ MapgenV7::~MapgenV7() MapgenV7Params::MapgenV7Params() { - spflags = MGV7_MOUNTAINS | MGV7_RIDGES; + spflags = MGV7_MOUNTAINS | MGV7_RIDGES; + cave_width = 0.3; np_terrain_base = NoiseParams(4, 70, v3f(600, 600, 600), 82341, 5, 0.6, 2.0); np_terrain_alt = NoiseParams(4, 25, v3f(600, 600, 600), 5934, 5, 0.6, 2.0); @@ -170,7 +173,8 @@ MapgenV7Params::MapgenV7Params() void MapgenV7Params::readParams(const Settings *settings) { - settings->getFlagStrNoEx("mgv7_spflags", spflags, flagdesc_mapgen_v7); + settings->getFlagStrNoEx("mgv7_spflags", spflags, flagdesc_mapgen_v7); + settings->getFloatNoEx("mgv7_cave_width", cave_width); settings->getNoiseParams("mgv7_np_terrain_base", np_terrain_base); settings->getNoiseParams("mgv7_np_terrain_alt", np_terrain_alt); @@ -188,7 +192,8 @@ void MapgenV7Params::readParams(const Settings *settings) void MapgenV7Params::writeParams(Settings *settings) const { - settings->setFlagStr("mgv7_spflags", spflags, flagdesc_mapgen_v7, U32_MAX); + settings->setFlagStr("mgv7_spflags", spflags, flagdesc_mapgen_v7, U32_MAX); + settings->setFloat("mgv7_cave_width", cave_width); settings->setNoiseParams("mgv7_np_terrain_base", np_terrain_base); settings->setNoiseParams("mgv7_np_terrain_alt", np_terrain_alt); @@ -735,7 +740,7 @@ void MapgenV7::generateCaves(s16 max_stone_y) float d1 = contour(noise_cave1->result[index3d]); float d2 = contour(noise_cave2->result[index3d]); - if (d1 * d2 > 0.3f && ndef->get(c).is_ground_content) { + if (d1 * d2 > cave_width && ndef->get(c).is_ground_content) { // In tunnel and ground content, excavate vm->m_data[vi] = MapNode(CONTENT_AIR); is_tunnel = true; diff --git a/src/mapgen_v7.h b/src/mapgen_v7.h index 57cb55a8..c2522064 100644 --- a/src/mapgen_v7.h +++ b/src/mapgen_v7.h @@ -34,6 +34,7 @@ extern FlagDesc flagdesc_mapgen_v7[]; struct MapgenV7Params : public MapgenSpecificParams { u32 spflags; + float cave_width; NoiseParams np_terrain_base; NoiseParams np_terrain_alt; NoiseParams np_terrain_persist; @@ -61,7 +62,6 @@ public: int ystride; int zstride_1u1d; int zstride_1d; - u32 spflags; v3s16 node_min; v3s16 node_max; @@ -70,6 +70,8 @@ public: s16 *ridge_heightmap; + u32 spflags; + float cave_width; Noise *noise_terrain_base; Noise *noise_terrain_alt; Noise *noise_terrain_persist; diff --git a/src/mapgen_valleys.cpp b/src/mapgen_valleys.cpp index 3926deb4..0ec5409c 100644 --- a/src/mapgen_valleys.cpp +++ b/src/mapgen_valleys.cpp @@ -86,25 +86,16 @@ MapgenValleys::MapgenValleys(int mapgenid, MapgenParams *params, EmergeManager * g_settings->getU16("map_generation_limit")); MapgenValleysParams *sp = (MapgenValleysParams *)params->sparams; - this->spflags = sp->spflags; - - this->humid_rivers = (spflags & MGVALLEYS_HUMID_RIVERS); - this->use_altitude_chill = (spflags & MGVALLEYS_ALT_CHILL); + this->spflags = sp->spflags; this->altitude_chill = sp->altitude_chill; - this->humidity_adjust = params->np_biome_humidity.offset - 50.f; this->large_cave_depth = sp->large_cave_depth; this->lava_features_lim = rangelim(sp->lava_features, 0, 10); this->massive_cave_depth = sp->massive_cave_depth; this->river_depth_bed = sp->river_depth + 1.f; this->river_size_factor = sp->river_size / 100.f; this->water_features_lim = rangelim(sp->water_features, 0, 10); - - // a small chance of overflows if the settings are very high - this->cave_water_max_height = water_level + MYMAX(0, water_features_lim - 4) * 50; - this->lava_max_height = water_level + MYMAX(0, lava_features_lim - 4) * 50; - - tcave_cache = new float[csize.Y + 2]; + this->cave_width = sp->cave_width; //// 2D Terrain noise noise_filler_depth = new Noise(&sp->np_filler_depth, seed, csize.X, csize.Z); @@ -128,6 +119,16 @@ MapgenValleys::MapgenValleys(int mapgenid, MapgenParams *params, EmergeManager * noise_humidity_blend = new Noise(¶ms->np_biome_humidity_blend, seed, csize.X, csize.Z); noise_humidity = new Noise(¶ms->np_biome_humidity, seed, csize.X, csize.Z); + this->humid_rivers = (spflags & MGVALLEYS_HUMID_RIVERS); + this->use_altitude_chill = (spflags & MGVALLEYS_ALT_CHILL); + this->humidity_adjust = params->np_biome_humidity.offset - 50.f; + + // a small chance of overflows if the settings are very high + this->cave_water_max_height = water_level + MYMAX(0, water_features_lim - 4) * 50; + this->lava_max_height = water_level + MYMAX(0, lava_features_lim - 4) * 50; + + tcave_cache = new float[csize.Y + 2]; + //// Resolve nodes to be used INodeDefManager *ndef = emerge->ndef; @@ -165,10 +166,6 @@ MapgenValleys::~MapgenValleys() delete noise_cave1; delete noise_cave2; delete noise_filler_depth; - delete noise_heat; - delete noise_heat_blend; - delete noise_humidity; - delete noise_humidity_blend; delete noise_inter_valley_fill; delete noise_inter_valley_slope; delete noise_rivers; @@ -177,6 +174,11 @@ MapgenValleys::~MapgenValleys() delete noise_valley_depth; delete noise_valley_profile; + delete noise_heat; + delete noise_heat_blend; + delete noise_humidity; + delete noise_humidity_blend; + delete[] biomemap; delete[] heightmap; delete[] tcave_cache; @@ -185,8 +187,7 @@ MapgenValleys::~MapgenValleys() MapgenValleysParams::MapgenValleysParams() { - spflags = MGVALLEYS_HUMID_RIVERS | MGVALLEYS_ALT_CHILL; - + spflags = MGVALLEYS_HUMID_RIVERS | MGVALLEYS_ALT_CHILL; altitude_chill = 90; // The altitude at which temperature drops by 20C. large_cave_depth = -33; lava_features = 0; // How often water will occur in caves. @@ -194,6 +195,7 @@ MapgenValleysParams::MapgenValleysParams() river_depth = 4; // How deep to carve river channels. river_size = 5; // How wide to make rivers. water_features = 0; // How often water will occur in caves. + cave_width = 0.3; np_cave1 = NoiseParams(0, 12, v3f(96, 96, 96), 52534, 4, 0.5, 2.0); np_cave2 = NoiseParams(0, 12, v3f(96, 96, 96), 10325, 4, 0.5, 2.0); @@ -205,56 +207,56 @@ MapgenValleysParams::MapgenValleysParams() np_terrain_height = NoiseParams(-10.f, 50.f, v3f(1024, 1024, 1024), 5202, 6, 0.4f, 2.f); np_valley_depth = NoiseParams(5.f, 4.f, v3f(512, 512, 512), -1914, 1, 1.f, 2.f); np_valley_profile = NoiseParams(0.6f, 0.5f, v3f(512, 512, 512), 777, 1, 1.f, 2.f); - } +} void MapgenValleysParams::readParams(const Settings *settings) { - settings->getFlagStrNoEx("mg_valleys_spflags", spflags, flagdesc_mapgen_valleys); + settings->getFlagStrNoEx("mgvalleys_spflags", spflags, flagdesc_mapgen_valleys); + settings->getU16NoEx("mgvalleys_altitude_chill", altitude_chill); + settings->getS16NoEx("mgvalleys_large_cave_depth", large_cave_depth); + settings->getU16NoEx("mgvalleys_lava_features", lava_features); + settings->getS16NoEx("mgvalleys_massive_cave_depth", massive_cave_depth); + settings->getU16NoEx("mgvalleys_river_depth", river_depth); + settings->getU16NoEx("mgvalleys_river_size", river_size); + settings->getU16NoEx("mgvalleys_water_features", water_features); + settings->getFloatNoEx("mgvalleys_cave_width", cave_width); - settings->getU16NoEx("mg_valleys_altitude_chill", altitude_chill); - settings->getS16NoEx("mg_valleys_large_cave_depth", large_cave_depth); - settings->getU16NoEx("mg_valleys_lava_features", lava_features); - settings->getS16NoEx("mg_valleys_massive_cave_depth", massive_cave_depth); - settings->getU16NoEx("mg_valleys_river_depth", river_depth); - settings->getU16NoEx("mg_valleys_river_size", river_size); - settings->getU16NoEx("mg_valleys_water_features", water_features); - - settings->getNoiseParams("mg_valleys_np_cave1", np_cave1); - settings->getNoiseParams("mg_valleys_np_cave2", np_cave2); - settings->getNoiseParams("mg_valleys_np_filler_depth", np_filler_depth); - settings->getNoiseParams("mg_valleys_np_inter_valley_fill", np_inter_valley_fill); - settings->getNoiseParams("mg_valleys_np_inter_valley_slope", np_inter_valley_slope); - settings->getNoiseParams("mg_valleys_np_rivers", np_rivers); - settings->getNoiseParams("mg_valleys_np_massive_caves", np_massive_caves); - settings->getNoiseParams("mg_valleys_np_terrain_height", np_terrain_height); - settings->getNoiseParams("mg_valleys_np_valley_depth", np_valley_depth); - settings->getNoiseParams("mg_valleys_np_valley_profile", np_valley_profile); + settings->getNoiseParams("mgvalleys_np_cave1", np_cave1); + settings->getNoiseParams("mgvalleys_np_cave2", np_cave2); + settings->getNoiseParams("mgvalleys_np_filler_depth", np_filler_depth); + settings->getNoiseParams("mgvalleys_np_inter_valley_fill", np_inter_valley_fill); + settings->getNoiseParams("mgvalleys_np_inter_valley_slope", np_inter_valley_slope); + settings->getNoiseParams("mgvalleys_np_rivers", np_rivers); + settings->getNoiseParams("mgvalleys_np_massive_caves", np_massive_caves); + settings->getNoiseParams("mgvalleys_np_terrain_height", np_terrain_height); + settings->getNoiseParams("mgvalleys_np_valley_depth", np_valley_depth); + settings->getNoiseParams("mgvalleys_np_valley_profile", np_valley_profile); } void MapgenValleysParams::writeParams(Settings *settings) const { - settings->setFlagStr("mg_valleys_spflags", spflags, flagdesc_mapgen_valleys, U32_MAX); + settings->setFlagStr("mgvalleys_spflags", spflags, flagdesc_mapgen_valleys, U32_MAX); + settings->setU16("mgvalleys_altitude_chill", altitude_chill); + settings->setS16("mgvalleys_large_cave_depth", large_cave_depth); + settings->setU16("mgvalleys_lava_features", lava_features); + settings->setS16("mgvalleys_massive_cave_depth", massive_cave_depth); + settings->setU16("mgvalleys_river_depth", river_depth); + settings->setU16("mgvalleys_river_size", river_size); + settings->setU16("mgvalleys_water_features", water_features); + settings->setFloat("mgvalleys_cave_width", cave_width); - settings->setU16("mg_valleys_altitude_chill", altitude_chill); - settings->setS16("mg_valleys_large_cave_depth", large_cave_depth); - settings->setU16("mg_valleys_lava_features", lava_features); - settings->setS16("mg_valleys_massive_cave_depth", massive_cave_depth); - settings->setU16("mg_valleys_river_depth", river_depth); - settings->setU16("mg_valleys_river_size", river_size); - settings->setU16("mg_valleys_water_features", water_features); - - settings->setNoiseParams("mg_valleys_np_cave1", np_cave1); - settings->setNoiseParams("mg_valleys_np_cave2", np_cave2); - settings->setNoiseParams("mg_valleys_np_filler_depth", np_filler_depth); - settings->setNoiseParams("mg_valleys_np_inter_valley_fill", np_inter_valley_fill); - settings->setNoiseParams("mg_valleys_np_inter_valley_slope", np_inter_valley_slope); - settings->setNoiseParams("mg_valleys_np_rivers", np_rivers); - settings->setNoiseParams("mg_valleys_np_massive_caves", np_massive_caves); - settings->setNoiseParams("mg_valleys_np_terrain_height", np_terrain_height); - settings->setNoiseParams("mg_valleys_np_valley_depth", np_valley_depth); - settings->setNoiseParams("mg_valleys_np_valley_profile", np_valley_profile); + settings->setNoiseParams("mgvalleys_np_cave1", np_cave1); + settings->setNoiseParams("mgvalleys_np_cave2", np_cave2); + settings->setNoiseParams("mgvalleys_np_filler_depth", np_filler_depth); + settings->setNoiseParams("mgvalleys_np_inter_valley_fill", np_inter_valley_fill); + settings->setNoiseParams("mgvalleys_np_inter_valley_slope", np_inter_valley_slope); + settings->setNoiseParams("mgvalleys_np_rivers", np_rivers); + settings->setNoiseParams("mgvalleys_np_massive_caves", np_massive_caves); + settings->setNoiseParams("mgvalleys_np_terrain_height", np_terrain_height); + settings->setNoiseParams("mgvalleys_np_valley_depth", np_valley_depth); + settings->setNoiseParams("mgvalleys_np_valley_profile", np_valley_profile); } @@ -964,7 +966,7 @@ void MapgenValleys::generateCaves(s16 max_stone_y) // when a tunnel undercuts a river. However, that's not for // the mapgen to correct. Fix it in lua. - if (d1 * d2 > 0.3f && ndef->get(c).is_ground_content) { + if (d1 * d2 > cave_width && ndef->get(c).is_ground_content) { // in a tunnel vm->m_data[index_data] = n_air; tunnel_air_above = true; diff --git a/src/mapgen_valleys.h b/src/mapgen_valleys.h index 4ad2d207..5224ea54 100644 --- a/src/mapgen_valleys.h +++ b/src/mapgen_valleys.h @@ -47,7 +47,6 @@ class BiomeManager; struct MapgenValleysParams : public MapgenSpecificParams { u32 spflags; - s16 large_cave_depth; s16 massive_cave_depth; u16 altitude_chill; @@ -55,11 +54,7 @@ struct MapgenValleysParams : public MapgenSpecificParams { u16 river_depth; u16 river_size; u16 water_features; - - NoiseParams np_biome_heat; - NoiseParams np_biome_heat_blend; - NoiseParams np_biome_humidity; - NoiseParams np_biome_humidity_blend; + float cave_width; NoiseParams np_cave1; NoiseParams np_cave2; NoiseParams np_filler_depth; @@ -110,23 +105,29 @@ private: float map_gen_limit; - u32 spflags; bool humid_rivers; bool use_altitude_chill; + float humidity_adjust; + s16 cave_water_max_height; + s16 lava_max_height; v3s16 node_min; v3s16 node_max; v3s16 full_node_min; v3s16 full_node_max; + u32 spflags; + float altitude_chill; + s16 lava_features_lim; + s16 massive_cave_depth; + float river_depth_bed; + float river_size_factor; + float *tcave_cache; + s16 water_features_lim; + float cave_width; Noise *noise_filler_depth; - Noise *noise_cave1; Noise *noise_cave2; - Noise *noise_heat; - Noise *noise_heat_blend; - Noise *noise_humidity; - Noise *noise_humidity_blend; Noise *noise_inter_valley_fill; Noise *noise_inter_valley_slope; Noise *noise_rivers; @@ -135,16 +136,10 @@ private: Noise *noise_valley_depth; Noise *noise_valley_profile; - float altitude_chill; - s16 cave_water_max_height; - float humidity_adjust; - s16 lava_features_lim; - s16 lava_max_height; - s16 massive_cave_depth; - float river_depth_bed; - float river_size_factor; - float *tcave_cache; - s16 water_features_lim; + Noise *noise_heat; + Noise *noise_heat_blend; + Noise *noise_humidity; + Noise *noise_humidity_blend; content_t c_cobble; content_t c_desert_stone;