#include "beatlevelimpl.h" #include #include #include "beatset.h" #include "beatnoteimpl.h" #include "beatmap.h" // for debug print 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); //load level content if(!filename.empty()) { try { std::shared_ptr stream = r->getFileStream(filename); json diffjson; (*stream) >> diffjson; const std::string& version = diffjson["_version"]; if(version != "2.0.0") { //not supported return; } //load notes const json& jnotes = diffjson["_notes"]; if(jnotes.is_array()) { notes.reserve(jnotes.size()); for(const json& note : jnotes) { notes.push_back(note); } } //load walls const json& jwalls = diffjson["_obstacles"]; if(jwalls.is_array()) { walls.reserve(jwalls.size()); for(const json& wall : jwalls) { walls.push_back(wall); } } } catch(...) { std::string mapname = ""; auto par = parent.lock(); if(par) mapname = par->getBeatMap()->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? } } } BeatLevelImpl::~BeatLevelImpl() {} Difficulty::Difficulty BeatLevelImpl::getDifficulty() const { return dif; } int32_t BeatLevelImpl::getDifficultyRank() const { return diffRank; } std::string BeatLevelImpl::getFilename() const { return filename; } double BeatLevelImpl::getNoteJumpSpeed() const { return njs; } double BeatLevelImpl::getNoteStartOffset() const { return nso; } std::string BeatLevelImpl::getCustomData() const { if(base.contains("_customData")) { return base["_customData"].dump(); } return ""; } const std::vector& BeatLevelImpl::getNotes() const { return notes; } const std::vector& BeatLevelImpl::getWalls() const { return walls; } void BeatLevelImpl::printDebug() const { std::cout << " Difficulty: " << Difficulty::toString(dif) << " (" << diffRank << ")" << "\n Filename: " << getFilename() << "\n njs: " << getNoteJumpSpeed() << " nso: " << getNoteStartOffset() << "\n noteCount: " << notes.size() << " wallCount: " << walls.size() << "\n CustomData: " << getCustomData() << std::endl; } std::shared_ptr BeatLevelImpl::getBeatSet() const { return parent.lock(); } std::shared_ptr BeatLevelImpl::getBeatMap() const { return parent.lock()->getBeatMap(); } }