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

summaryrefslogtreecommitdiff
path: root/source/game/StarDamageDatabase.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/game/StarDamageDatabase.cpp')
-rw-r--r--source/game/StarDamageDatabase.cpp69
1 files changed, 69 insertions, 0 deletions
diff --git a/source/game/StarDamageDatabase.cpp b/source/game/StarDamageDatabase.cpp
new file mode 100644
index 0000000..872b34f
--- /dev/null
+++ b/source/game/StarDamageDatabase.cpp
@@ -0,0 +1,69 @@
+#include "StarDamageDatabase.hpp"
+#include "StarRandom.hpp"
+#include "StarAssets.hpp"
+#include "StarRoot.hpp"
+
+namespace Star {
+
+DamageDatabase::DamageDatabase() {
+ auto assets = Root::singleton().assets();
+
+ auto elementalConfig = assets->json("/damage/elementaltypes.config");
+ for (auto p : elementalConfig.iterateObject()) {
+ ElementalType type;
+ type.resistanceStat = p.second.getString("resistanceStat");
+ for (auto particle : p.second.getObject("damageNumberParticles")) {
+ type.damageNumberParticles.set(HitTypeNames.getLeft(particle.first), particle.second.toString());
+ }
+ m_elementalTypes.set(p.first, move(type));
+ }
+
+ auto files = assets->scanExtension("damage");
+ assets->queueJsons(files);
+ for (auto file : files) {
+ auto config = assets->json(file);
+ String name = config.getString("kind");
+ if (m_damageKinds.contains(name))
+ throw StarException(strf("Duplicate damage kind Name %s. configfile %s", name, file));
+
+ DamageKind kind;
+ kind.name = name;
+ for (auto effect : config.getObject("effects", JsonObject())) {
+ TargetMaterial material = effect.first;
+ kind.effects.set(material, {});
+ for (auto hit : effect.second.toObject()) {
+ DamageEffect effect = DamageEffect {
+ hit.second.get("sounds", JsonArray()),
+ hit.second.get("particles", JsonArray())
+ };
+ kind.effects[material].set(HitTypeNames.getLeft(hit.first), effect);
+ }
+ }
+ kind.elementalType = config.getString("elementalType", "default");
+ if (!m_elementalTypes.contains(kind.elementalType))
+ throw StarException(strf("Undefined elemental type %s in damage kind %s", kind.elementalType, name));
+
+ m_damageKinds.set(name, move(kind));
+ }
+}
+
+DamageKind const& DamageDatabase::damageKind(String kind) const {
+ if (kind.empty())
+ kind = "default";
+ else
+ kind = kind.toLower();
+
+ if (!m_damageKinds.contains(kind))
+ throw StarException(strf("Unknown damage definition with kind '%s'.", kind));
+
+ return m_damageKinds.get(kind);
+}
+
+ElementalType const& DamageDatabase::elementalType(String const& name) const {
+ if (!m_damageKinds.contains(name))
+ throw StarException(strf("Unknown elemental type with name '%s'.", name));
+
+ return m_elementalTypes.get(name);
+}
+
+}