add generator 'caption' property

This commit is contained in:
MihailRis 2024-10-13 22:53:12 +03:00
parent 7c56d8fd7f
commit de00414456
11 changed files with 59 additions and 21 deletions

View File

@ -5,11 +5,11 @@ function on_open()
table.sort(names) table.sort(names)
local panel = document.root local panel = document.root
for _,k in ipairs(names) do for k, caption in pairs(names) do
panel:add(gui.template("generator", { panel:add(gui.template("generator", {
callback=string.format("settings.generator=%q menu:back()", k), callback=string.format("settings.generator=%q menu:back()", k),
id=k, id=k,
name=settings.generator_name(k) name=settings.generator_name(caption)
})) }))
end end
panel:add("<button onclick='menu:back()'>@Back</button>") panel:add("<button onclick='menu:back()'>@Back</button>")

View File

@ -10,12 +10,7 @@ function save_state()
end end
function settings.generator_name(id) function settings.generator_name(id)
local prefix, name = parse_path(id) return gui.str(id, "world.generators"):gsub("^%l", string.upper)
if prefix == "core" then
return gui.str(name, "world.generators")
else
return id
end
end end
function create_world() function create_world()
@ -39,7 +34,7 @@ function on_open()
document.generator_btn.text = string.format( document.generator_btn.text = string.format(
"%s: %s", "%s: %s",
gui.str("World generator", "world"), gui.str("World generator", "world"),
settings.generator_name(settings.generator) settings.generator_name(generation.get_generators()[settings.generator])
) )
document.name_box.text = settings.name or '' document.name_box.text = settings.name or ''
document.seed_box.text = settings.seed or '' document.seed_box.text = settings.seed or ''

View File

@ -42,7 +42,7 @@ menu.Contents Menu=Меню контентпаков
world.Seed=Зерно world.Seed=Зерно
world.Name=Название world.Name=Название
world.World generator=Генератор мира world.World generator=Генератор мира
world.generators.default=Обычный world.generators.default=По-умолчанию
world.generators.flat=Плоский world.generators.flat=Плоский
world.Create World=Создать Мир world.Create World=Создать Мир
world.convert-request=Есть изменения в индексах! Конвертировать мир? world.convert-request=Есть изменения в индексах! Конвертировать мир?

View File

@ -54,7 +54,9 @@ static void detect_defs(
continue; continue;
} }
if (fs::is_regular_file(file) && files::is_data_file(file)) { if (fs::is_regular_file(file) && files::is_data_file(file)) {
detected.push_back(prefix.empty() ? name : prefix + ":" + name); auto map = files::read_object(file);
std::string id = prefix.empty() ? name : prefix + ":" + name;
detected.emplace_back(id);
} else if (fs::is_directory(file) && } else if (fs::is_directory(file) &&
file.extension() != fs::u8path(".files")) { file.extension() != fs::u8path(".files")) {
detect_defs(file, name, detected); detect_defs(file, name, detected);
@ -63,11 +65,38 @@ static void detect_defs(
} }
} }
std::vector<std::string> ContentLoader::scanContent( static void detect_defs_pairs(
const fs::path& folder,
const std::string& prefix,
std::vector<std::tuple<std::string, std::string>>& detected
) {
if (fs::is_directory(folder)) {
for (const auto& entry : fs::directory_iterator(folder)) {
const fs::path& file = entry.path();
std::string name = file.stem().string();
if (name[0] == '_') {
continue;
}
if (fs::is_regular_file(file) && files::is_data_file(file)) {
auto map = files::read_object(file);
std::string id = prefix.empty() ? name : prefix + ":" + name;
std::string caption = util::id_to_caption(id);
map.at("caption").get(caption);
detected.emplace_back(id, name);
} else if (fs::is_directory(file) &&
file.extension() != fs::u8path(".files")) {
detect_defs_pairs(file, name, detected);
}
}
}
}
std::vector<std::tuple<std::string, std::string>> ContentLoader::scanContent(
const ContentPack& pack, ContentType type const ContentPack& pack, ContentType type
) { ) {
std::vector<std::string> detected; std::vector<std::tuple<std::string, std::string>> detected;
detect_defs(pack.folder / ContentPack::getFolderFor(type), pack.id, detected); detect_defs_pairs(
pack.folder / ContentPack::getFolderFor(type), pack.id, detected);
return detected; return detected;
} }

View File

@ -70,7 +70,7 @@ public:
const std::string& contentSection const std::string& contentSection
); );
static std::vector<std::string> scanContent( static std::vector<std::tuple<std::string, std::string>> scanContent(
const ContentPack& pack, ContentType type const ContentPack& pack, ContentType type
); );

View File

@ -193,6 +193,7 @@ void ContentLoader::loadGenerator(
return; return;
} }
auto map = files::read_toml(generatorsDir / fs::u8path(name + ".toml")); auto map = files::read_toml(generatorsDir / fs::u8path(name + ".toml"));
map.at("caption").get(def.caption);
map.at("biome_parameters").get(def.biomeParameters); map.at("biome_parameters").get(def.biomeParameters);
map.at("biome-bpd").get(def.biomesBPD); map.at("biome-bpd").get(def.biomesBPD);
map.at("heights-bpd").get(def.heightsBPD); map.at("heights-bpd").get(def.heightsBPD);

View File

@ -52,10 +52,10 @@ static int l_get_generators(lua::State* L) {
int i = 1; int i = 1;
for (const auto& pack : packs) { for (const auto& pack : packs) {
auto names = ContentLoader::scanContent(pack, ContentType::GENERATOR); auto pairs = ContentLoader::scanContent(pack, ContentType::GENERATOR);
for (const auto& name : names) { for (const auto& [name, caption] : pairs) {
lua::pushstring(L, name); lua::pushstring(L, caption);
lua::rawseti(L, i); lua::setfield(L, name);
i++; i++;
} }
} }

View File

@ -405,6 +405,13 @@ std::wstring util::capitalized(const std::wstring& str) {
str.substr(1); str.substr(1);
} }
std::string util::capitalized(const std::string& str) {
if (str.empty()) return str;
static const std::locale loc("");
return std::string({static_cast<char>(std::toupper(str[0], loc))}) +
str.substr(1);
}
std::wstring util::pascal_case(const std::wstring& str) { std::wstring util::pascal_case(const std::wstring& str) {
if (str.empty()) return str; if (str.empty()) return str;
static const std::locale loc(""); static const std::locale loc("");

View File

@ -71,6 +71,8 @@ namespace util {
double parse_double(const std::string& str); double parse_double(const std::string& str);
double parse_double(const std::string& str, size_t offset, size_t len); double parse_double(const std::string& str, size_t offset, size_t len);
std::string capitalized(const std::string& str);
std::wstring lower_case(const std::wstring& str); std::wstring lower_case(const std::wstring& str);
std::wstring upper_case(const std::wstring& str); std::wstring upper_case(const std::wstring& str);
std::wstring capitalized(const std::wstring& str); std::wstring capitalized(const std::wstring& str);

View File

@ -10,8 +10,9 @@ VoxelStructure::VoxelStructure(
std::unique_ptr<VoxelFragment> structure std::unique_ptr<VoxelFragment> structure
) : fragments({std::move(structure)}), meta(std::move(meta)) {} ) : fragments({std::move(structure)}), meta(std::move(meta)) {}
GeneratorDef::GeneratorDef(std::string name)
GeneratorDef::GeneratorDef(std::string name) : name(std::move(name)) {} : name(std::move(name)), caption(util::id_to_caption(name)) {
}
void GeneratorDef::prepare(const Content* content) { void GeneratorDef::prepare(const Content* content) {
for (auto& biome : biomes) { for (auto& biome : biomes) {

View File

@ -192,6 +192,9 @@ struct VoxelStructure {
struct GeneratorDef { struct GeneratorDef {
/// @brief Generator full name - packid:name /// @brief Generator full name - packid:name
std::string name; std::string name;
/// @brief Generator display name
std::string caption;
std::unique_ptr<GeneratorScript> script; std::unique_ptr<GeneratorScript> script;
/// @brief Sea level (top of seaLayers) /// @brief Sea level (top of seaLayers)