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

summaryrefslogtreecommitdiff
path: root/source/game/StarPlayerCodexes.cpp
blob: bb96130e4f7ee100e17c84491b1cd9df1dc10604 (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
#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 '{}'", 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.{}", playerSpecies))))
    learnCodex(codexId, true);
}

CodexConstPtr PlayerCodexes::firstNewCodex() const {
  for (auto pair : m_codexes) {
    if (!pair.second.second)
      return pair.second.first;
  }
  return {};
}

}