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

summaryrefslogtreecommitdiff
path: root/source/game/StarUniverseSettings.cpp
blob: 30e8b6ef3c24ac999342106580b05bff96689362 (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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#include "StarUniverseSettings.hpp"
#include "StarRoot.hpp"
#include "StarAssets.hpp"
#include "StarJsonExtra.hpp"

namespace Star {

UniverseFlagAction parseUniverseFlagAction(Json const& json) {
  String actionType = json.getString("type");

  if (actionType == "placeDungeon") {
    PlaceDungeonFlagAction res;
    res.dungeonId = json.getString("dungeonId");
    res.targetInstance = json.getString("targetInstance");
    res.targetPosition = jsonToVec2I(json.get("targetPosition"));
    return res;
  } else {
    throw StarException(strf("Unsupported universe flag action type {}", actionType));
  }
}

UniverseSettings::UniverseSettings() {
  loadFlagActions();
}

UniverseSettings::UniverseSettings(Json const& json) {
  m_uuid = Uuid(json.getString("uuid"));
  m_flags = jsonToStringSet(json.get("flags"));

  loadFlagActions();
}

Json UniverseSettings::toJson() const {
  MutexLocker locker(m_lock);

  return JsonObject{
      {"uuid", m_uuid.hex()},
      {"flags", jsonFromStringSet(m_flags)}
    };
}

Uuid UniverseSettings::uuid() const {
  return m_uuid;
}

StringSet UniverseSettings::flags() const {
  MutexLocker locker(m_lock);

  return m_flags;
}

void UniverseSettings::setFlag(String const& flag) {
  MutexLocker locker(m_lock);

  if (m_flags.add(flag)) {
    Logger::info("Universe flags set to {}", m_flags);
    if (auto flagActions = m_flagActions.maybe(flag))
      m_pendingFlagActions.appendAll(*flagActions);
    else
      Logger::info("No actions configured for universe flag {}", flag);
  }
}

Maybe<List<UniverseFlagAction>> UniverseSettings::pullPendingFlagActions() {
  if (!m_pendingFlagActions.empty())
    return take(m_pendingFlagActions);
  return {};
}

List<UniverseFlagAction> UniverseSettings::currentFlagActions() const {
  List<UniverseFlagAction> res;
  for (String flag : m_flags) {
    if (auto flagActions = m_flagActions.maybe(flag))
      res.appendAll(*flagActions);
  }
  return res;
}

List<UniverseFlagAction> UniverseSettings::currentFlagActionsForInstanceWorld(String const& instanceName) const {
  List<UniverseFlagAction> res;
  for (String flag : m_flags) {
    for (auto flagAction : m_flagActions.maybe(flag).value()) {
      if (flagAction.is<PlaceDungeonFlagAction>() && flagAction.get<PlaceDungeonFlagAction>().targetInstance == instanceName)
        res.append(flagAction);
    }
  }
  return res;
}

void UniverseSettings::resetFlags() {
  m_flags.clear();
}

void UniverseSettings::loadFlagActions() {
  m_flagActions.clear();

  Json flagsConfig = Root::singleton().assets()->json("/universeflags.config");
  for (auto flagPair : flagsConfig.iterateObject()) {
    List<UniverseFlagAction> actions;
    for (auto actionConfig : flagPair.second.get("actions").iterateArray())
      actions.append(parseUniverseFlagAction(actionConfig));
    m_flagActions[flagPair.first] = actions;
  }
}

}