diff --git a/src/content/ContentControl.cpp b/src/content/ContentControl.cpp index c0ed582d..9c99135b 100644 --- a/src/content/ContentControl.cpp +++ b/src/content/ContentControl.cpp @@ -54,7 +54,7 @@ void ContentControl::resetContent() { scripting::cleanup(); std::vector resRoots; { - auto pack = ContentPack::createCore(paths); + auto pack = ContentPack::createCore(); resRoots.push_back({"core", pack.folder}); load_configs(input, pack.folder); } @@ -66,8 +66,7 @@ void ContentControl::resetContent() { content.reset(); scripting::on_content_reset(); - contentPacks.clear(); - contentPacks = manager->getAll(basePacks); + setContentPacksRaw(manager->getAll(basePacks)); postContent(); } @@ -98,10 +97,8 @@ void ContentControl::loadContent() { ContentBuilder contentBuilder; corecontent::setup(input, contentBuilder); - auto corePack = ContentPack::createCore(paths); - - auto allPacks = contentPacks; - allPacks.insert(allPacks.begin(), corePack); + allPacks = contentPacks; + allPacks.insert(allPacks.begin(), ContentPack::createCore()); // Setup filesystem entry points std::vector resRoots; @@ -122,14 +119,21 @@ void ContentControl::loadContent() { postContent(); } -std::vector& ContentControl::getContentPacks() { +void ContentControl::setContentPacksRaw(std::vector&& packs) { + if (content) { + throw std::runtime_error("setContentPacksRaw called with content loaded"); + } + contentPacks = std::move(packs); + allPacks = contentPacks; + allPacks.insert(allPacks.begin(), ContentPack::createCore()); +} + +const std::vector& ContentControl::getContentPacks() const { return contentPacks; } -std::vector ContentControl::getAllContentPacks() { - auto packs = contentPacks; - packs.insert(packs.begin(), ContentPack::createCore(paths)); - return packs; +const std::vector& ContentControl::getAllContentPacks() const { + return allPacks; } PacksManager& ContentControl::scan() { diff --git a/src/content/ContentControl.hpp b/src/content/ContentControl.hpp index 4c52ec10..ef45a04a 100644 --- a/src/content/ContentControl.hpp +++ b/src/content/ContentControl.hpp @@ -40,8 +40,10 @@ public: void loadContent(); - std::vector& getContentPacks(); - std::vector getAllContentPacks(); + void setContentPacksRaw(std::vector&& packs); + + const std::vector& getContentPacks() const; + const std::vector& getAllContentPacks() const; PacksManager& scan(); private: @@ -52,4 +54,5 @@ private: std::vector basePacks; std::unique_ptr manager; std::vector contentPacks; + std::vector allPacks; // includes 'core' }; diff --git a/src/content/ContentPack.cpp b/src/content/ContentPack.cpp index 1451b14c..9114aacd 100644 --- a/src/content/ContentPack.cpp +++ b/src/content/ContentPack.cpp @@ -13,7 +13,7 @@ namespace fs = std::filesystem; -ContentPack ContentPack::createCore(const EnginePaths& paths) { +ContentPack ContentPack::createCore() { return ContentPack { "core", "Core", ENGINE_VERSION_STRING, "", "", "res:", {} }; diff --git a/src/content/ContentPack.hpp b/src/content/ContentPack.hpp index be0b7c71..d434268a 100644 --- a/src/content/ContentPack.hpp +++ b/src/content/ContentPack.hpp @@ -73,7 +73,7 @@ struct ContentPack { const std::string& name ); - static ContentPack createCore(const EnginePaths&); + static ContentPack createCore(); static inline io::path getFolderFor(ContentType type) { switch (type) { diff --git a/src/frontend/screens/LevelScreen.cpp b/src/frontend/screens/LevelScreen.cpp index 210ef802..ca80ed11 100644 --- a/src/frontend/screens/LevelScreen.cpp +++ b/src/frontend/screens/LevelScreen.cpp @@ -115,6 +115,7 @@ LevelScreen::~LevelScreen() { void LevelScreen::initializeContent() { auto& content = controller->getLevel()->content; for (auto& entry : content.getPacks()) { + logger.info() << "initializing pack '" << entry.first << "'"; initializePack(entry.second.get()); } scripting::on_frontend_init( diff --git a/src/io/engine_paths.cpp b/src/io/engine_paths.cpp index 39851228..4c424f95 100644 --- a/src/io/engine_paths.cpp +++ b/src/io/engine_paths.cpp @@ -149,8 +149,12 @@ void EnginePaths::setProjectFolder(std::filesystem::path folder) { } void EnginePaths::setCurrentWorldFolder(io::path folder) { + if (folder.empty()) { + io::remove_device("world"); + } else { + io::create_subdevice("world", "user", folder); + } this->currentWorldFolder = std::move(folder); - io::create_subdevice("world", "user", currentWorldFolder); } std::string EnginePaths::mount(const io::path& file) { diff --git a/src/logic/EngineController.cpp b/src/logic/EngineController.cpp index 9cfbba30..0d0a5a60 100644 --- a/src/logic/EngineController.cpp +++ b/src/logic/EngineController.cpp @@ -323,7 +323,7 @@ static void reconfig_packs_outside( names.erase(std::find(names.begin(), names.end(), id)); } names = manager.assemble(names); - contentControl.getContentPacks() = manager.getAll(names); + contentControl.setContentPacksRaw(manager.getAll(names)); } static void reconfig_packs_inside(