Веб-сайт самохостера Lotigara

summaryrefslogtreecommitdiff
path: root/source/game/StarDanceDatabase.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/game/StarDanceDatabase.cpp')
-rw-r--r--source/game/StarDanceDatabase.cpp64
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});
+}
+
+}