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

summaryrefslogtreecommitdiff
path: root/source/game/StarPlayerCodexes.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/StarPlayerCodexes.cpp
parent6741a057e5639280d85d0f88ba26f000baa58f61 (diff)
everything everywhere
all at once
Diffstat (limited to 'source/game/StarPlayerCodexes.cpp')
-rw-r--r--source/game/StarPlayerCodexes.cpp87
1 files changed, 87 insertions, 0 deletions
diff --git a/source/game/StarPlayerCodexes.cpp b/source/game/StarPlayerCodexes.cpp
new file mode 100644
index 0000000..0391c5a
--- /dev/null
+++ b/source/game/StarPlayerCodexes.cpp
@@ -0,0 +1,87 @@
+#include "StarPlayerCodexes.hpp"
+#include "StarCodex.hpp"
+#include "StarCodexDatabase.hpp"
+#include "StarJsonExtra.hpp"
+#include "StarRoot.hpp"
+#include "StarAssets.hpp"
+
+namespace Star {
+
+PlayerCodexes::PlayerCodexes(Json const& variant) {
+ if (variant) {
+ auto assets = Root::singleton().assets();
+ auto codexData = jsonToMapV<StringMap<bool>>(variant, mem_fn(&Json::toBool));
+ for (auto pair : codexData) {
+ if (auto codex = Root::singleton().codexDatabase()->codex(pair.first)) {
+ m_codexes[pair.first] = CodexEntry{codex, pair.second};
+ } else {
+ Logger::debug("Failed to load missing codex '%s'", pair.first);
+ }
+ }
+ }
+}
+
+Json PlayerCodexes::toJson() const {
+ return jsonFromMapV<StringMap<CodexEntry>>(m_codexes, [](CodexEntry const& entry) { return entry.second; });
+}
+
+List<PlayerCodexes::CodexEntry> PlayerCodexes::codexes() const {
+ List<CodexEntry> result;
+ for (auto pair : m_codexes)
+ result.append(pair.second);
+ sort(result,
+ [](CodexEntry const& left, CodexEntry const& right) -> bool {
+ return make_tuple(left.second, left.first->title()) < make_tuple(right.second, right.first->title());
+ });
+ return result;
+}
+
+bool PlayerCodexes::codexKnown(String const& codexId) const {
+ return m_codexes.contains(codexId);
+}
+
+CodexConstPtr PlayerCodexes::learnCodex(String const& codexId, bool markRead) {
+ if (!codexKnown(codexId)) {
+ if (auto codex = Root::singleton().codexDatabase()->codex(codexId)) {
+ auto entry = CodexEntry{codex, markRead};
+ m_codexes[codexId] = entry;
+ return entry.first;
+ }
+ }
+ return {};
+}
+
+bool PlayerCodexes::codexRead(String const& codexId) const {
+ return m_codexes.contains(codexId) && m_codexes.get(codexId).second;
+}
+
+bool PlayerCodexes::markCodexRead(String const& codexId) {
+ if (codexKnown(codexId) && !codexRead(codexId)) {
+ m_codexes[codexId].second = true;
+ return true;
+ }
+ return false;
+}
+
+bool PlayerCodexes::markCodexUnread(String const& codexId) {
+ if (codexKnown(codexId) && codexRead(codexId)) {
+ m_codexes[codexId].second = false;
+ return true;
+ }
+ return false;
+}
+
+void PlayerCodexes::learnInitialCodexes(String const& playerSpecies) {
+ for (auto codexId : jsonToStringList(Root::singleton().assets()->json(strf("/player.config:defaultCodexes.%s", playerSpecies))))
+ learnCodex(codexId, true);
+}
+
+CodexConstPtr PlayerCodexes::firstNewCodex() const {
+ for (auto pair : m_codexes) {
+ if (!pair.second.second)
+ return pair.second.first;
+ }
+ return {};
+}
+
+}