libBeatsaber/src/beatlevel.cpp

114 lines
2.8 KiB
C++

#include "beatlevelimpl.h"
#include <iostream>
#include <nlohmann/json.hpp>
#include "beatset.h"
#include "beatnoteimpl.h"
#include "beatmap.h" // for debug print
namespace Beatsaber {
BeatLevelImpl::BeatLevelImpl(std::weak_ptr<BeatSet> p, std::shared_ptr<FileReader> 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<std::istream> 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 = "<unknown>";
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<Note>& BeatLevelImpl::getNotes() const {
return notes;
}
const std::vector<Wall>& 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<BeatSet> BeatLevelImpl::getBeatSet() const {
return parent.lock();
}
std::shared_ptr<BeatMap> BeatLevelImpl::getBeatMap() const {
return parent.lock()->getBeatMap();
}
}