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

summaryrefslogtreecommitdiff
path: root/source/game/StarStatusEffectDatabase.cpp
diff options
context:
space:
mode:
authorKae <80987908+Novaenia@users.noreply.github.com>2023-06-20 14:33:09 +1000
committerKae <80987908+Novaenia@users.noreply.github.com>2023-06-20 14:33:09 +1000
commit6352e8e3196f78388b6c771073f9e03eaa612673 (patch)
treee23772f79a7fbc41bc9108951e9e136857484bf4 /source/game/StarStatusEffectDatabase.cpp
parent6741a057e5639280d85d0f88ba26f000baa58f61 (diff)
everything everywhere
all at once
Diffstat (limited to 'source/game/StarStatusEffectDatabase.cpp')
-rw-r--r--source/game/StarStatusEffectDatabase.cpp54
1 files changed, 54 insertions, 0 deletions
diff --git a/source/game/StarStatusEffectDatabase.cpp b/source/game/StarStatusEffectDatabase.cpp
new file mode 100644
index 0000000..e8255a2
--- /dev/null
+++ b/source/game/StarStatusEffectDatabase.cpp
@@ -0,0 +1,54 @@
+#include "StarStatusEffectDatabase.hpp"
+#include "StarJsonExtra.hpp"
+#include "StarRoot.hpp"
+#include "StarAssets.hpp"
+
+namespace Star {
+
+StatusEffectDatabase::StatusEffectDatabase() {
+ auto assets = Root::singleton().assets();
+ auto files = assets->scanExtension("statuseffect");
+ assets->queueJsons(files);
+ for (auto file : files) {
+ auto uniqueEffect = parseUniqueEffect(assets->json(file), file);
+
+ if (m_uniqueEffects.contains(uniqueEffect.name))
+ throw StatusEffectDatabaseException::format(
+ "Duplicate stat effect named '%s', config file '%s'", uniqueEffect.name, file);
+ m_uniqueEffects[uniqueEffect.name] = uniqueEffect;
+ }
+}
+
+bool StatusEffectDatabase::isUniqueEffect(UniqueStatusEffect const& effect) const {
+ return m_uniqueEffects.contains(effect);
+}
+
+UniqueStatusEffectConfig StatusEffectDatabase::uniqueEffectConfig(UniqueStatusEffect const& effect) const {
+ if (auto uniqueEffect = m_uniqueEffects.maybe(effect))
+ return uniqueEffect.take();
+ throw StatusEffectDatabaseException::format("No such unique stat effect '%s'", effect);
+}
+
+UniqueStatusEffectConfig StatusEffectDatabase::parseUniqueEffect(Json const& config, String const& path) const {
+ try {
+ auto assets = Root::singleton().assets();
+
+ UniqueStatusEffectConfig effect;
+ effect.name = config.getString("name");
+ effect.blockingStat = config.optString("blockingStat");
+ effect.effectConfig = config.get("effectConfig", JsonObject());
+ effect.defaultDuration = config.getFloat("defaultDuration", 0.0f);
+ effect.scripts =
+ jsonToStringList(config.get("scripts", JsonArray{})).transformed(bind(&AssetPath::relativeTo, path, _1));
+ effect.scriptDelta = config.getUInt("scriptDelta", 1);
+ effect.animationConfig = config.optString("animationConfig").apply(bind(&AssetPath::relativeTo, path, _1));
+ effect.label = config.getString("label", "");
+ effect.description = config.getString("description", "");
+ effect.icon = config.optString("icon").apply(bind(&AssetPath::relativeTo, path, _1));
+ return effect;
+ } catch (std::exception const& e) {
+ throw StatusEffectDatabaseException("Error reading StatusEffect config", e);
+ }
+}
+
+}