diff options
Diffstat (limited to 'source/game/StarDamageDatabase.cpp')
-rw-r--r-- | source/game/StarDamageDatabase.cpp | 69 |
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); +} + +} |