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

summaryrefslogtreecommitdiff
path: root/source/game/StarStatusEffectDatabase.cpp
blob: 63080bbcef8b7abe8aa83c8db3e9c657748ef43b (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
#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 '{}', config file '{}'", 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 '{}'", 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);
  }
}

}