diff --git a/res/layouts/pages/main.xml b/res/layouts/pages/main.xml index 29cbc9c8..08fb5d86 100644 --- a/res/layouts/pages/main.xml +++ b/res/layouts/pages/main.xml @@ -1,5 +1,5 @@ - + diff --git a/res/layouts/pages/new_world.xml b/res/layouts/pages/new_world.xml new file mode 100644 index 00000000..de984f79 --- /dev/null +++ b/res/layouts/pages/new_world.xml @@ -0,0 +1,17 @@ + + + + + + + + + + diff --git a/res/layouts/pages/new_world.xml.lua b/res/layouts/pages/new_world.xml.lua new file mode 100644 index 00000000..cd8101cf --- /dev/null +++ b/res/layouts/pages/new_world.xml.lua @@ -0,0 +1,35 @@ +settings = session.get_entry('new_world') + +function world_name_validator(name) + return name:match("^[%w-\\.\\ ]+$") ~= nil and not world.exists(name) +end + +function settings.generator_name(id) + local prefix, name = parse_path(id) + if prefix == "core" then + return gui.str(name, "world.generators") + else + return id + end +end + +function create_world() + if not document.name_box.valid then + return + end + local name = document.name_box.text + local seed = document.seed_box.text + core.new_world(name, seed, settings.generator) +end + +function on_open() + if settings.generator == nil then + settings.generator = core.get_default_generator() + end + document.generator_btn.text = string.format( + "%s: %s", + gui.str("World generator", "world"), + settings.generator_name(settings.generator) + ) + document.seed_box.placeholder = tostring(math.random()):sub(3) +end diff --git a/res/layouts/pages/world_generators.xml b/res/layouts/pages/world_generators.xml new file mode 100644 index 00000000..38722bed --- /dev/null +++ b/res/layouts/pages/world_generators.xml @@ -0,0 +1,3 @@ + + + diff --git a/res/layouts/pages/world_generators.xml.lua b/res/layouts/pages/world_generators.xml.lua new file mode 100644 index 00000000..57964fb0 --- /dev/null +++ b/res/layouts/pages/world_generators.xml.lua @@ -0,0 +1,16 @@ +settings = session.get_entry('new_world') + +function on_open() + local names = core.get_generators() + table.sort(names) + + local panel = document.root + for _,k in ipairs(names) do + panel:add(gui.template("generator", { + callback=string.format("settings.generator=%q menu:back()", k), + id=k, + name=settings.generator_name(k) + })) + end + panel:add("") +end diff --git a/res/layouts/templates/generator.xml b/res/layouts/templates/generator.xml new file mode 100644 index 00000000..51120738 --- /dev/null +++ b/res/layouts/templates/generator.xml @@ -0,0 +1,4 @@ + + + + diff --git a/res/scripts/stdlib.lua b/res/scripts/stdlib.lua index 82df4bd7..faf85909 100644 --- a/res/scripts/stdlib.lua +++ b/res/scripts/stdlib.lua @@ -215,6 +215,23 @@ function gui.template(name, params) return text end +session = { + entries={} +} + +function session.get_entry(name) + local entry = session.entries[name] + if entry == nil then + entry = {} + session.entries[name] = entry + end + return entry +end + +function session.reset_entry(name) + session.entries[name] = nil +end + -- Deprecated functions block_index = block.index block_name = block.name diff --git a/res/texts/ru_RU.txt b/res/texts/ru_RU.txt index 81040ad5..ca6d97f7 100644 --- a/res/texts/ru_RU.txt +++ b/res/texts/ru_RU.txt @@ -31,7 +31,7 @@ world.Name=Название world.World generator=Генератор мира world.generators.default=Обычный world.generators.flat=Плоский -menu.Create World=Создать Мир +world.Create World=Создать Мир world.convert-request=Есть изменения в индексах! Конвертировать мир? world.delete-confirm=Удалить мир безвозвратно? diff --git a/src/frontend/menu/menu.cpp b/src/frontend/menu/menu.cpp index 0d27fdfb..c472744c 100644 --- a/src/frontend/menu/menu.cpp +++ b/src/frontend/menu/menu.cpp @@ -40,10 +40,6 @@ namespace fs = std::filesystem; using namespace gui; -namespace menus { - extern std::string generatorID; -} - void menus::create_version_label(Engine* engine) { auto gui = engine->getGUI(); auto vlabel = std::make_shared( @@ -220,10 +216,7 @@ void menus::delete_world(std::string name, Engine* engine) { } void menus::create_menus(Engine* engine) { - menus::generatorID = WorldGenerators::getDefaultGeneratorID(); - create_new_world_panel(engine); create_settings_panel(engine); - create_world_generators_panel(engine); auto menu = engine->getGUI()->getMenu(); menu->setPageLoader([=](auto name) { @@ -238,6 +231,4 @@ void menus::create_menus(Engine* engine) { } void menus::refresh_menus(Engine* engine) { - create_new_world_panel(engine); - create_world_generators_panel(engine); } diff --git a/src/frontend/menu/menu.h b/src/frontend/menu/menu.h index 059fecdd..1573fe25 100644 --- a/src/frontend/menu/menu.h +++ b/src/frontend/menu/menu.h @@ -20,12 +20,6 @@ namespace menus { // implemented in menu_settings.cpp extern void create_settings_panel(Engine* engine); - // implemented in menu_create_world.cpp - extern void create_new_world_panel(Engine* engine); - - // implemented in menu_create_world.cpp - extern void create_world_generators_panel(Engine* engine); - extern std::shared_ptr create_packs_panel( const std::vector& packs, Engine* engine, @@ -57,6 +51,13 @@ namespace menus { std::vector packs ); + void create_world( + Engine* engine, + const std::string& name, + const std::string& seedstr, + const std::string& generatorID + ); + /// @brief Create development version label at the top-right screen corner void create_version_label(Engine* engine); void create_menus(Engine* engine); diff --git a/src/frontend/menu/menu_create_world.cpp b/src/frontend/menu/menu_create_world.cpp index 5b72a427..be29e879 100644 --- a/src/frontend/menu/menu_create_world.cpp +++ b/src/frontend/menu/menu_create_world.cpp @@ -20,12 +20,6 @@ using namespace gui; -std::shared_ptr generatorTypeButton; - -namespace menus { - std::string generatorID; -} - inline uint64_t randU64() { srand(time(NULL)); return rand() ^ (rand() << 8) ^ @@ -35,134 +29,62 @@ inline uint64_t randU64() { ((uint64_t)rand() << 56); } -inline uint64_t str2seed(std::wstring seedstr) { +inline uint64_t str2seed(const std::string& seedstr) { if (util::is_integer(seedstr)) { try { return std::stoull(seedstr); } catch (const std::out_of_range& err) { - std::hash hash; + std::hash hash; return hash(seedstr); } } else { - std::hash hash; + std::hash hash; return hash(seedstr); } } -static std::string translate_generator_id(std::string& id) { - int delimiterPosition = id.find(":"); - std::string pack = id.substr(0, delimiterPosition); - std::string generator = id.substr(delimiterPosition + 1); +void menus::create_world( + Engine* engine, + const std::string& name, + const std::string& seedstr, + const std::string& generatorID +) { + uint64_t seed = str2seed(seedstr); - if(pack == "core") { - return util::wstr2str_utf8(langs::get(util::str2wstr_utf8(generator), L"world.generators")); - } else { - return id; - } -} - -void menus::create_world_generators_panel(Engine* engine) { - auto menu = engine->getGUI()->getMenu(); - auto panel = menus::create_page(engine, "world_generators", 400, 0.5f, 1); - panel->setScrollable(true); - - std::vector generatorsIDs = WorldGenerators::getGeneratorsIDs(); - std::sort(generatorsIDs.begin(), generatorsIDs.end()); - for (std::string& id : generatorsIDs) { - const std::string& fullName = translate_generator_id(id); - auto button = std::make_shared(glm::vec2(80, 30)); - - auto idlabel = std::make_shared