diff --git a/src/content/ContentPack.cpp b/src/content/ContentPack.cpp index 372ec84a..ca6dbdd9 100644 --- a/src/content/ContentPack.cpp +++ b/src/content/ContentPack.cpp @@ -1,7 +1,6 @@ #include "ContentPack.h" #include -#include #include "../coders/json.h" #include "../files/files.h" @@ -12,6 +11,20 @@ namespace fs = std::filesystem; const std::string ContentPack::PACKAGE_FILENAME = "package.json"; const std::string ContentPack::CONTENT_FILENAME = "content.json"; +contentpack_error::contentpack_error( + std::string packId, + std::filesystem::path folder, + std::string message) + : std::runtime_error(message), packId(packId), folder(folder) { +} + +std::string contentpack_error::getPackId() const { + return packId; +} +std::filesystem::path contentpack_error::getFolder() const { + return folder; +} + std::filesystem::path ContentPack::getContentFile() const { return folder/fs::path(CONTENT_FILENAME); } @@ -28,7 +41,7 @@ ContentPack ContentPack::read(std::filesystem::path folder) { root->str("version", pack.version); pack.folder = folder; if (pack.id == "none") - throw std::runtime_error("content-pack id is none: "+folder.u8string()); + throw contentpack_error(pack.id, folder, "content-pack id is none"); return pack; } @@ -60,7 +73,8 @@ std::vector ContentPack::worldPacksList(fs::path folder) { fs::path ContentPack::findPack(const EnginePaths* paths, std::string name) { auto folder = paths->getResources() / fs::path("content") / fs::path(name); if (!fs::is_directory(folder)) { - throw std::runtime_error("could not to find pack '"+name+"'"); + throw contentpack_error(name, folder, + "could not to find pack '"+name+"'"); } return folder; } diff --git a/src/content/ContentPack.h b/src/content/ContentPack.h index 23814d3c..37e85ee8 100644 --- a/src/content/ContentPack.h +++ b/src/content/ContentPack.h @@ -3,10 +3,23 @@ #include #include +#include #include class EnginePaths; +class contentpack_error : public std::runtime_error { + std::string packId; + std::filesystem::path folder; +public: + contentpack_error(std::string packId, + std::filesystem::path folder, + std::string message); + + std::string getPackId() const; + std::filesystem::path getFolder() const; +}; + struct ContentPack { std::string id = "none"; std::string title = "untitled"; diff --git a/src/engine.cpp b/src/engine.cpp index 23c72787..8a4eecce 100644 --- a/src/engine.cpp +++ b/src/engine.cpp @@ -203,5 +203,4 @@ void Engine::loadAllPacks() { auto resdir = paths->getResources(); contentPacks.clear(); ContentPack::scan(resdir/fs::path("content"), contentPacks); - loadContent(); } diff --git a/src/frontend/menu.cpp b/src/frontend/menu.cpp index aaada578..41486f72 100644 --- a/src/frontend/menu.cpp +++ b/src/frontend/menu.cpp @@ -156,16 +156,16 @@ void open_world(std::string name, Engine* engine) { packs.clear(); auto packnames = ContentPack::worldPacksList(folder); for (auto name : packnames) { - fs::path packfolder; try { - packfolder = ContentPack::findPack(paths, name); - } catch (std::runtime_error& error) { + fs::path packfolder = ContentPack::findPack(paths, name); + packs.push_back(ContentPack::read(packfolder)); + } catch (contentpack_error& error) { + // could not to find or read pack guiutil::alert(engine->getGUI(), langs::get(L"error.pack-not-found")+ - L": "+util::str2wstr_utf8(name)); + L": "+util::str2wstr_utf8(error.getPackId())); return; } - packs.push_back(ContentPack::read(packfolder)); } engine->loadContent(); @@ -291,6 +291,7 @@ void create_new_world_panel(Engine* engine, PagesControl* menu) { fs::create_directories(folder); engine->loadAllPacks(); + engine->loadContent(); Level* level = World::create(nameutf8, folder, seed,