diff options
| author | iTNTPiston <zhaoyizhu2000@gmail.com> | 2021-01-29 15:49:49 -0500 |
|---|---|---|
| committer | iTNTPiston <zhaoyizhu2000@gmail.com> | 2021-01-29 18:01:57 -0500 |
| commit | 641dd1613a63b4cf976380ab96bf533966029b3f (patch) | |
| tree | 56297f5025fa00fde3efb74cd2aaba6f8e0aec92 /src/KingSystem/Event/evtInfoData.cpp | |
| parent | 189aaa2698a45a851d74063f0f99d23801955c31 (diff) | |
EventInfoData
Diffstat (limited to 'src/KingSystem/Event/evtInfoData.cpp')
| -rw-r--r-- | src/KingSystem/Event/evtInfoData.cpp | 72 |
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 |
