diff --git a/src/data/dynamic.cpp b/src/data/dynamic.cpp index ca08472f..6f60b3f7 100644 --- a/src/data/dynamic.cpp +++ b/src/data/dynamic.cpp @@ -44,15 +44,27 @@ int64_t List::integer(size_t index) const { } Map* List::map(size_t index) const { + if (values[index]->type != valtype::map) { + throw std::runtime_error("type error"); + } return values[index]->value.map; } List* List::list(size_t index) const { + if (values[index]->type != valtype::list) { + throw std::runtime_error("type error"); + } return values[index]->value.list; } bool List::flag(size_t index) const { - return values[index]->value.boolean; + const auto& val = values[index]; + switch (val->type) { + case valtype::integer: return val->value.integer; + case valtype::boolean: return val->value.boolean; + default: + throw std::runtime_error("type error"); + } } List& List::put(std::string value) { @@ -180,9 +192,14 @@ int64_t Map::getInt(std::string key, int64_t def) const { bool Map::getBool(std::string key, bool def) const { auto found = values.find(key); - if (found != values.end()) - return found->second->value.boolean; - return def; + if (found == values.end()) + return def; + auto& val = found->second; + switch (val->type) { + case valtype::integer: return val->value.integer; + case valtype::boolean: return val->value.boolean; + default: throw std::runtime_error("type error"); + } } void Map::num(std::string key, double& dst) const { @@ -232,9 +249,7 @@ List* Map::list(std::string key) const { } void Map::flag(std::string key, bool& dst) const { - auto found = values.find(key); - if (found != values.end()) - dst = found->second->value.boolean; + dst = getBool(key, dst); } Map& Map::put(std::string key, uint value) { diff --git a/src/data/dynamic.h b/src/data/dynamic.h index eb4bdf1b..304111c4 100644 --- a/src/data/dynamic.h +++ b/src/data/dynamic.h @@ -22,7 +22,7 @@ namespace dynamic { std::string* str; double decimal; int64_t integer; - bool boolean; + uint64_t boolean; }; class Value { diff --git a/src/engine.cpp b/src/engine.cpp index 32673e11..7d5df765 100644 --- a/src/engine.cpp +++ b/src/engine.cpp @@ -138,6 +138,7 @@ void Engine::loadContent() { auto resdir = paths->getResources(); ContentBuilder contentBuilder; setup_definitions(&contentBuilder); + paths->setContentPacks(&contentPacks); std::vector resRoots; for (auto& pack : contentPacks) { @@ -163,7 +164,7 @@ void Engine::loadContent() { } assets->extend(*new_assets.get()); - paths->setContentPacks(&contentPacks); + } void Engine::loadWorldContent(const fs::path& folder) { diff --git a/src/frontend/menu.cpp b/src/frontend/menu.cpp index 40833a99..98e232e6 100644 --- a/src/frontend/menu.cpp +++ b/src/frontend/menu.cpp @@ -250,9 +250,11 @@ void create_main_menu_panel(Engine* engine, PagesControl* menu) { typedef std::function packconsumer; +const int PACKS_PANEL_WIDTH = 550; + std::shared_ptr create_packs_panel(const std::vector& packs, Engine* engine, bool backbutton, packconsumer callback) { auto assets = engine->getAssets(); - auto panel = std::make_shared(vec2(400, 200), vec4(5.0f)); + auto panel = std::make_shared(vec2(PACKS_PANEL_WIDTH, 200), vec4(5.0f)); panel->color(vec4(1.0f, 1.0f, 1.0f, 0.07f)); panel->maxLength(400); panel->scrollable(true); @@ -266,7 +268,7 @@ std::shared_ptr create_packs_panel(const std::vector& packs, } auto idlabel = std::make_shared