From 3bce6bdfd9244bbd2db27c3d507efc275fd12b39 Mon Sep 17 00:00:00 2001 From: mrbesen Date: Sat, 12 Jun 2021 20:17:24 +0200 Subject: [PATCH] fix setting of parent --- include/beatsaber-impl/beatlevelimpl.h | 3 ++ include/beatsaber-impl/beatsetimpl.h | 4 +++ src/beatlevel.cpp | 40 +++++++++++++++----------- src/beatmap.cpp | 5 +++- src/beatset.cpp | 19 ++++++++---- 5 files changed, 48 insertions(+), 23 deletions(-) diff --git a/include/beatsaber-impl/beatlevelimpl.h b/include/beatsaber-impl/beatlevelimpl.h index 8e852a3..c88dbf7 100644 --- a/include/beatsaber-impl/beatlevelimpl.h +++ b/include/beatsaber-impl/beatlevelimpl.h @@ -20,6 +20,7 @@ protected: double njs; double nso; + std::shared_ptr reader; const json& base; std::vector notes; @@ -29,6 +30,8 @@ public: BeatLevelImpl(std::weak_ptr p, std::shared_ptr r, const json& j); virtual ~BeatLevelImpl(); + bool load(); + virtual Difficulty::Difficulty getDifficulty() const override; virtual int32_t getDifficultyRank() const override; virtual std::string getFilename() const override; diff --git a/include/beatsaber-impl/beatsetimpl.h b/include/beatsaber-impl/beatsetimpl.h index 7eb98c6..dde68e7 100644 --- a/include/beatsaber-impl/beatsetimpl.h +++ b/include/beatsaber-impl/beatsetimpl.h @@ -11,6 +11,8 @@ class BeatSetImpl : public BeatSet, public std::enable_shared_from_this parent; + std::shared_ptr reader; + const json& base; BeatmapCharacteristic::BeatmapCharacteristic characteristic; std::vector> level; @@ -21,6 +23,8 @@ public: BeatSetImpl() = default; virtual ~BeatSetImpl(); + bool load(); + virtual void printDebug() const override; virtual BeatmapCharacteristic::BeatmapCharacteristic getCharacteristic() const override; diff --git a/src/beatlevel.cpp b/src/beatlevel.cpp index 3d66862..5421e27 100644 --- a/src/beatlevel.cpp +++ b/src/beatlevel.cpp @@ -9,24 +9,31 @@ namespace Beatsaber { -BeatLevelImpl::BeatLevelImpl(std::weak_ptr p, std::shared_ptr r, const json& j) : parent(p), base(j) { - dif = Difficulty::getByString(j.value("_difficulty", "")); - diffRank = j.value("_difficultyRank", 0); - filename = j.value("_beatmapFilename", ""); - njs = j.value("_noteJumpMovementSpeed", -1); - nso = j.value("_noteJumpStartBeatOffset", 0); +BeatLevelImpl::BeatLevelImpl(std::weak_ptr p, std::shared_ptr r, const json& j) : parent(p), reader(r), base(j) { +} + +BeatLevelImpl::~BeatLevelImpl() {} + +bool BeatLevelImpl::load() { + dif = Difficulty::getByString(base.value("_difficulty", "")); + diffRank = base.value("_difficultyRank", 0); + filename = base.value("_beatmapFilename", ""); + njs = base.value("_noteJumpMovementSpeed", -1); + nso = base.value("_noteJumpStartBeatOffset", 0); //load level content if(!filename.empty()) { try { - std::shared_ptr stream = r->getFileStream(filename); + std::shared_ptr stream = reader->getFileStream(filename); json diffjson; (*stream) >> diffjson; - - const std::string& version = diffjson["_version"]; - if(version != "2.0.0") { - //not supported - return; + + if(diffjson.contains("_version") && diffjson["_version"].is_string()) { + const std::string& version = diffjson["_version"]; + if(version != "2.0.0") { + //not supported + return false; + } } //load notes @@ -46,18 +53,19 @@ BeatLevelImpl::BeatLevelImpl(std::weak_ptr p, std::shared_ptrgetBeatMap()->getSongName(); - std::cout << "Could not load difficulty: " << filename << " from: " << mapname << std::endl; //is the direct access after p.lock() a problem? is the parent always loaded? + std::cout << "Could not load difficulty: " << filename << " from: " << mapname << " " << exc.what() << std::endl; //is the direct access after p.lock() a problem? is the parent always loaded? } } + return false; } -BeatLevelImpl::~BeatLevelImpl() {} - Difficulty::Difficulty BeatLevelImpl::getDifficulty() const { return dif; } diff --git a/src/beatmap.cpp b/src/beatmap.cpp index 036ea09..53781a2 100644 --- a/src/beatmap.cpp +++ b/src/beatmap.cpp @@ -24,7 +24,10 @@ bool BeatMapImpl::load() { //load all the beatsets for(const json& jsonbeatset : beatsets) { - beatSets.push_back(std::make_shared(weak_from_this(), reader, jsonbeatset)); + auto beatset = std::make_shared(weak_from_this(), reader, jsonbeatset); + if(beatset->load()) + beatSets.push_back(beatset); + //return false on false? } } diff --git a/src/beatset.cpp b/src/beatset.cpp index b2b0a04..a47f156 100644 --- a/src/beatset.cpp +++ b/src/beatset.cpp @@ -7,27 +7,34 @@ namespace Beatsaber { -BeatSetImpl::BeatSetImpl(std::weak_ptr p, std::shared_ptr r, const json& j) : parent(p) { +BeatSetImpl::BeatSetImpl(std::weak_ptr p, std::shared_ptr r, const json& j) : parent(p), reader(r), base(j) {} + +BeatSetImpl::~BeatSetImpl() {} + +bool BeatSetImpl::load() { try { - characteristic = BeatmapCharacteristic::getByString(j["_beatmapCharacteristicName"]); + characteristic = BeatmapCharacteristic::getByString(base["_beatmapCharacteristicName"]); //load level - const json& arr = j["_difficultyBeatmaps"]; + const json& arr = base["_difficultyBeatmaps"]; if(arr.is_array()) { level.reserve(arr.size()); //std::cout << "Try to load: " << arr.size() << " BeatLevel" << std::endl; for(const json& beat : arr) { - level.push_back(std::make_shared(weak_from_this(), r, beat)); + auto beatlevel = std::make_shared(weak_from_this(), reader, beat); + if(beatlevel->load()) + level.push_back(beatlevel); + // return false on false? } + return true; } } catch(std::exception& e) { std::cout << "Could not read BeatSet: " << e.what() << std::endl; characteristic = BeatmapCharacteristic::NONE; } + return false; } -BeatSetImpl::~BeatSetImpl() {} - void BeatSetImpl::printDebug() const { std::cout << " Characteristic: " << BeatmapCharacteristic::toString(characteristic) << std::endl;