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

summaryrefslogtreecommitdiff
path: root/source/game/StarStatisticsDatabase.cpp
diff options
context:
space:
mode:
authorKae <80987908+Novaenia@users.noreply.github.com>2023-06-20 14:33:09 +1000
committerKae <80987908+Novaenia@users.noreply.github.com>2023-06-20 14:33:09 +1000
commit6352e8e3196f78388b6c771073f9e03eaa612673 (patch)
treee23772f79a7fbc41bc9108951e9e136857484bf4 /source/game/StarStatisticsDatabase.cpp
parent6741a057e5639280d85d0f88ba26f000baa58f61 (diff)
everything everywhere
all at once
Diffstat (limited to 'source/game/StarStatisticsDatabase.cpp')
-rw-r--r--source/game/StarStatisticsDatabase.cpp93
1 files changed, 93 insertions, 0 deletions
diff --git a/source/game/StarStatisticsDatabase.cpp b/source/game/StarStatisticsDatabase.cpp
new file mode 100644
index 0000000..7a21ef2
--- /dev/null
+++ b/source/game/StarStatisticsDatabase.cpp
@@ -0,0 +1,93 @@
+#include "StarStatisticsDatabase.hpp"
+#include "StarJsonExtra.hpp"
+
+namespace Star {
+
+StatisticsDatabase::StatisticsDatabase() : m_cacheMutex(), m_eventCache() {
+ auto assets = Root::singleton().assets();
+
+ auto eventFiles = assets->scanExtension("event");
+ assets->queueJsons(eventFiles);
+ auto achievementFiles = assets->scanExtension("achievement");
+ assets->queueJsons(achievementFiles);
+
+ for (auto file : eventFiles) {
+ try {
+ String name = assets->json(file).getString("eventName");
+ if (m_eventPaths.contains(name))
+ Logger::error("Event %s defined twice, second time from %s", name, file);
+ else
+ m_eventPaths[name] = file;
+ } catch (std::exception const& e) {
+ Logger::error("Error loading event file %s: %s", file, outputException(e, true));
+ }
+ }
+
+ for (auto file : achievementFiles) {
+ try {
+ Json achievement = assets->json(file);
+ String name = achievement.getString("name");
+ if (m_achievementPaths.contains(name))
+ Logger::error("Achievement %s defined twice, second time from %s", name, file);
+ else
+ m_achievementPaths[name] = file;
+
+ for (Json const& stat : achievement.getArray("triggers", {})) {
+ m_statAchievements[stat.toString()].append(name);
+ }
+ } catch (std::exception const& e) {
+ Logger::error("Error loading achievement file %s: %s", file, outputException(e, true));
+ }
+ }
+}
+
+StatEventPtr StatisticsDatabase::event(String const& name) const {
+ MutexLocker locker(m_cacheMutex);
+ return m_eventCache.get(name, [this](String const& name) -> StatEventPtr {
+ if (auto path = m_eventPaths.maybe(name))
+ return readEvent(*path);
+ return {};
+ });
+}
+
+AchievementPtr StatisticsDatabase::achievement(String const& name) const {
+ MutexLocker locker(m_cacheMutex);
+ return m_achievementCache.get(name, [this](String const& name) -> AchievementPtr {
+ if (auto path = m_achievementPaths.maybe(name))
+ return readAchievement(*path);
+ return {};
+ });
+}
+
+StringList StatisticsDatabase::allAchievements() const {
+ return m_achievementPaths.keys();
+}
+
+StringList StatisticsDatabase::achievementsForStat(String const& statName) const {
+ return m_statAchievements.value(statName);
+}
+
+StatEventPtr StatisticsDatabase::readEvent(String const& path) {
+ auto assets = Root::singleton().assets();
+ Json config = assets->json(path);
+
+ return make_shared<StatEvent>(StatEvent {
+ config.getString("eventName"),
+ jsonToStringList(config.get("scripts")),
+ config
+ });
+}
+
+AchievementPtr StatisticsDatabase::readAchievement(String const& path) {
+ auto assets = Root::singleton().assets();
+ Json config = assets->json(path);
+
+ return make_shared<Achievement>(Achievement {
+ config.getString("name"),
+ jsonToStringList(config.get("triggers")),
+ jsonToStringList(config.get("scripts")),
+ config
+ });
+}
+
+}