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

summaryrefslogtreecommitdiff
path: root/source/game/StarQuestTemplateDatabase.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/StarQuestTemplateDatabase.cpp
parent6741a057e5639280d85d0f88ba26f000baa58f61 (diff)
everything everywhere
all at once
Diffstat (limited to 'source/game/StarQuestTemplateDatabase.cpp')
-rw-r--r--source/game/StarQuestTemplateDatabase.cpp84
1 files changed, 84 insertions, 0 deletions
diff --git a/source/game/StarQuestTemplateDatabase.cpp b/source/game/StarQuestTemplateDatabase.cpp
new file mode 100644
index 0000000..7b3e3ca
--- /dev/null
+++ b/source/game/StarQuestTemplateDatabase.cpp
@@ -0,0 +1,84 @@
+#include "StarQuestTemplateDatabase.hpp"
+#include "StarRoot.hpp"
+#include "StarAssets.hpp"
+#include "StarRoot.hpp"
+#include "StarJson.hpp"
+#include "StarJsonExtra.hpp"
+
+namespace Star {
+
+QuestTemplate::QuestTemplate(Json const& config) {
+ this->config = config;
+ templateId = config.getString("id");
+ title = config.getString("title", "");
+ text = config.getString("text", "");
+ completionText = config.getString("completionText", "");
+ failureText = config.getString("failureText", "");
+
+ parameterTypes = {};
+ parameterExamples = {};
+ for (auto entry : config.getObject("parameters", JsonObject{})) {
+ parameterTypes[entry.first] = entry.second.getString("type");
+ if (entry.second.contains("example"))
+ parameterExamples[entry.first] = entry.second.get("example");
+ }
+
+ moneyRange = jsonToVec2U(config.get("moneyRange", JsonArray{0, 0}));
+ for (auto options : config.getArray("rewards", {})) {
+ List<ItemDescriptor> rewardOption;
+ for (auto entry : options.iterateArray()) {
+ rewardOption.append(ItemDescriptor(entry));
+ }
+ rewards.append(rewardOption);
+ }
+ rewardParameters = config.getArray("rewardParameters", {}).transformed(mem_fn(&Json::toString));
+ completionCinema = config.optString("completionCinema");
+ canBeAbandoned = config.getBool("canBeAbandoned", true);
+ ephemeral = config.getBool("ephemeral", false);
+ showInLog = config.getBool("showInLog", true);
+ showAcceptDialog = config.getBool("showAcceptDialog", true);
+ showCompleteDialog = config.getBool("showCompleteDialog", true);
+ showFailDialog = config.getBool("showFailDialog", true);
+ mainQuest = config.getBool("mainQuest", false);
+ hideCrossServer = config.getBool("hideCrossServer", false);
+ questGiverIndicator = config.getString("questGiverIndicator", "questgiver");
+ questReceiverIndicator = config.getString("questReceiverIndicator", "questreceiver");
+ prerequisiteQuests = jsonToStringList(config.get("prerequisites", JsonArray{}));
+ requiredShipLevel = config.optUInt("requiredShipLevel");
+ requiredItems = config.getArray("requiredItems", {}).transformed([](Json item) { return ItemDescriptor(item); });
+
+ updateDelta = config.getUInt("updateDelta", 10);
+ script = config.optString("script");
+ scriptConfig = config.getObject("scriptConfig", JsonObject{});
+
+ if (auto guiConfigs = config.opt("guiConfigs")) {
+ newQuestGuiConfig = guiConfigs->optString("newQuest");
+ questCompleteGuiConfig = guiConfigs->optString("questComplete");
+ questFailedGuiConfig = guiConfigs->optString("questFailed");
+ }
+}
+
+QuestTemplateDatabase::QuestTemplateDatabase() {
+ auto assets = Root::singleton().assets();
+ auto files = assets->scanExtension("questtemplate");
+ assets->queueJsons(files);
+ for (auto qt : files) {
+ auto questTemplate = make_shared<QuestTemplate>(assets->json(qt));
+ if (!m_templates.insert(questTemplate->templateId, questTemplate).second)
+ throw StarException(strf("Duplicate quest template '%s'", questTemplate->templateId));
+ }
+}
+
+List<String> QuestTemplateDatabase::allQuestTemplateIds() const {
+ return m_templates.keys();
+}
+
+QuestTemplatePtr QuestTemplateDatabase::questTemplate(String const& templateId) const {
+ if (!m_templates.contains(templateId)) {
+ Logger::error("No quest template found for id '%s'", templateId);
+ return {};
+ }
+ return m_templates.get(templateId);
+}
+
+}