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

summaryrefslogtreecommitdiff
path: root/source/game/StarDamageDatabase.cpp
blob: 17085526102fafce62254df0c3a41282fab1fafc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
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, std::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 {}. configfile {}", 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 {} in damage kind {}", kind.elementalType, name));

    m_damageKinds.set(name, std::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 '{}'.", 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 '{}'.", name));

  return m_elementalTypes.get(name);
}

}