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

summaryrefslogtreecommitdiff
path: root/source/game/StarCodexDatabase.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/game/StarCodexDatabase.cpp')
-rw-r--r--source/game/StarCodexDatabase.cpp41
1 files changed, 41 insertions, 0 deletions
diff --git a/source/game/StarCodexDatabase.cpp b/source/game/StarCodexDatabase.cpp
new file mode 100644
index 0000000..e3ef2ff
--- /dev/null
+++ b/source/game/StarCodexDatabase.cpp
@@ -0,0 +1,41 @@
+#include "StarCodexDatabase.hpp"
+#include "StarJsonExtra.hpp"
+#include "StarRoot.hpp"
+#include "StarAssets.hpp"
+
+namespace Star {
+
+CodexDatabase::CodexDatabase() {
+ auto assets = Root::singleton().assets();
+ auto files = assets->scanExtension("codex");
+ auto codexConfig = assets->json("/codex.config");
+ assets->queueJsons(files);
+ for (auto const& file : files) {
+ try {
+ auto codexJson = assets->json(file);
+ codexJson = codexJson.set("icon",
+ AssetPath::relativeTo(AssetPath::directory(file), codexJson.getString("icon", codexConfig.getString("defaultIcon"))));
+
+ auto codex = make_shared<Codex>(codexJson, AssetPath::directory(file));
+
+ if (m_codexes.contains(codex->id()))
+ throw CodexDatabaseException::format("Duplicate codex named '%s', config file '%s'", codex->id(), file);
+
+ m_codexes[codex->id()] = codex;
+ } catch (std::exception const& e) {
+ throw CodexDatabaseException(strf("Error reading codex config %s", file), e);
+ }
+ }
+}
+
+StringMap<CodexConstPtr> CodexDatabase::codexes() const {
+ return m_codexes;
+}
+
+CodexConstPtr CodexDatabase::codex(String const& codexId) const {
+ if (auto codex = m_codexes.maybe(codexId))
+ return codex.take();
+ return {};
+}
+
+}