summaryrefslogtreecommitdiff
path: root/src/KingSystem/Event/evtInfoData.cpp
diff options
context:
space:
mode:
authoriTNTPiston <zhaoyizhu2000@gmail.com>2021-01-29 15:49:49 -0500
committeriTNTPiston <zhaoyizhu2000@gmail.com>2021-01-29 18:01:57 -0500
commit641dd1613a63b4cf976380ab96bf533966029b3f (patch)
tree56297f5025fa00fde3efb74cd2aaba6f8e0aec92 /src/KingSystem/Event/evtInfoData.cpp
parent189aaa2698a45a851d74063f0f99d23801955c31 (diff)
EventInfoData
Diffstat (limited to 'src/KingSystem/Event/evtInfoData.cpp')
-rw-r--r--src/KingSystem/Event/evtInfoData.cpp72
1 files changed, 72 insertions, 0 deletions
diff --git a/src/KingSystem/Event/evtInfoData.cpp b/src/KingSystem/Event/evtInfoData.cpp
new file mode 100644
index 00000000..03762193
--- /dev/null
+++ b/src/KingSystem/Event/evtInfoData.cpp
@@ -0,0 +1,72 @@
+#include "KingSystem/Event/evtInfoData.h"
+#include <basis/seadNew.h>
+#include <prim/seadSafeString.h>
+#include <resource/seadResource.h>
+#include "KingSystem/Resource/resHandle.h"
+#include "KingSystem/Resource/resLoadRequest.h"
+#include "KingSystem/Utils/Byaml/Byaml.h"
+
+namespace ksys::evt {
+
+SEAD_SINGLETON_DISPOSER_IMPL(InfoData)
+
+InfoData::InfoData() = default;
+
+void InfoData::init(sead::Heap* heap) {
+ doInit(heap, nullptr);
+}
+
+void InfoData::doInit(sead::Heap* heap, OverlayArena* arena) {
+ ksys::res::LoadRequest load_request;
+
+ load_request.mRequester = "evt::InfoData";
+ load_request._22 = true;
+ load_request.mArena = arena;
+
+ mHandle.load("Event/EventInfo.product.byml", &load_request, nullptr);
+ auto* resource = sead::DynamicCast<sead::DirectResource>(mHandle.getResource());
+
+ if (mRootIter)
+ delete mRootIter;
+
+ mRootIter = new (heap) al::ByamlIter(resource->getRawData());
+}
+
+InfoData::~InfoData() {
+ if (mRootIter)
+ delete mRootIter;
+
+ if (_80) {
+ delete _80;
+ }
+}
+
+bool InfoData::getEntry(al::ByamlIter* iter, const sead::SafeString& event_flow_name,
+ const sead::SafeString& entry_point) {
+ sead::FixedSafeString<256> formatted_key;
+
+ if (entry_point.isEmpty()) {
+ formatted_key.format("%s<%s>", event_flow_name.cstr(), event_flow_name.cstr());
+ } else {
+ formatted_key.format("%s<%s>", event_flow_name.cstr(), entry_point.cstr());
+ }
+
+ return mRootIter->tryGetIterByKey(iter, formatted_key.cstr());
+}
+
+bool InfoData::getSceneChangeEventTraverseLimit(const sead::SafeString& event_flow_name) {
+ if (event_flow_name != "ClearRemains") {
+ al::ByamlIter dict;
+ if (!getEntry(&dict, event_flow_name, "")) {
+ return false;
+ }
+
+ f32 value{};
+ if (!(dict.tryGetFloatByKey(&value, "traverse_limit") && value > 0.0)) {
+ return false;
+ }
+ }
+ return true;
+}
+
+} // namespace ksys::evt