diff options
Diffstat (limited to 'source/game/StarDanceDatabase.cpp')
-rw-r--r-- | source/game/StarDanceDatabase.cpp | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/source/game/StarDanceDatabase.cpp b/source/game/StarDanceDatabase.cpp new file mode 100644 index 0000000..594fde4 --- /dev/null +++ b/source/game/StarDanceDatabase.cpp @@ -0,0 +1,64 @@ +#include "StarDanceDatabase.hpp" +#include "StarJsonExtra.hpp" + +namespace Star { + +DanceDatabase::DanceDatabase() { + auto assets = Root::singleton().assets(); + auto files = assets->scanExtension("dance"); + for (auto file : files) { + try { + DancePtr dance = readDance(file); + m_dances[dance->name] = dance; + } catch (std::exception const& e) { + Logger::error("Error loading dance file %s: %s", file, outputException(e, true)); + } + } +} + +DancePtr DanceDatabase::getDance(String const& name) const { + return m_dances.get(name); +} + +DancePtr DanceDatabase::readDance(String const& path) { + auto assets = Root::singleton().assets(); + Json config = assets->json(path); + + String name = config.getString("name"); + List<String> states = config.getArray("states").transformed([](Json const& state) { return state.toString(); }); + float cycle = config.getFloat("cycle"); + bool cyclic = config.getBool("cyclic"); + float duration = config.getFloat("duration"); + List<DanceStep> steps = config.getArray("steps").transformed([](Json const& step) { + if (step.isType(Json::Type::Object)) { + Maybe<String> bodyFrame = step.optString("bodyFrame"); + Maybe<String> frontArmFrame = step.optString("frontArmFrame"); + Maybe<String> backArmFrame = step.optString("backArmFrame"); + Vec2F headOffset = step.opt("headOffset").apply(jsonToVec2F).value(Vec2F()); + Vec2F frontArmOffset = step.opt("frontArmOffset").apply(jsonToVec2F).value(Vec2F()); + Vec2F backArmOffset = step.opt("backArmOffset").apply(jsonToVec2F).value(Vec2F()); + float frontArmRotation = step.optFloat("frontArmRotation").value(0.0f); + float backArmRotation = step.optFloat("frontArmRotation").value(0.0f); + return DanceStep{bodyFrame, + frontArmFrame, + backArmFrame, + headOffset, + frontArmOffset, + backArmOffset, + frontArmRotation, + backArmRotation}; + } else { + Maybe<String> bodyFrame = step.get(0).optString(); + Maybe<String> frontArmFrame = step.get(1).optString(); + Maybe<String> backArmFrame = step.get(2).optString(); + Vec2F headOffset = step.get(3).opt().apply(jsonToVec2F).value(Vec2F()); + Vec2F frontArmOffset = step.get(4).opt().apply(jsonToVec2F).value(Vec2F()); + Vec2F backArmOffset = step.get(5).opt().apply(jsonToVec2F).value(Vec2F()); + return DanceStep{bodyFrame, frontArmFrame, backArmFrame, headOffset, frontArmOffset, backArmOffset, 0.0f, 0.0f}; + } + }); + + return make_shared<Dance>(Dance{name, states, cycle, cyclic, duration, steps}); +} + +} |