summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorThePixelGamer <thepixelmaster2354@gmail.com>2021-09-11 01:25:45 -0500
committerThePixelGamer <thepixelmaster2354@gmail.com>2021-09-14 15:34:52 -0500
commit4baa6d7ee8761d73649b8fe459bf78b8b37f7efa (patch)
tree8f29a1706cc1c5bcb9c7dc25b1d2f2338dd3a29f /src
parentd81186c2084f8e1fc675daa7ad98a85c64faaf22 (diff)
Implement LazyTraverseList
Diffstat (limited to 'src')
-rw-r--r--src/KingSystem/Map/CMakeLists.txt2
-rw-r--r--src/KingSystem/Map/mapLazyTraverseList.cpp112
-rw-r--r--src/KingSystem/Map/mapLazyTraverseList.h37
3 files changed, 151 insertions, 0 deletions
diff --git a/src/KingSystem/Map/CMakeLists.txt b/src/KingSystem/Map/CMakeLists.txt
index 7336bfd1..9bf05203 100644
--- a/src/KingSystem/Map/CMakeLists.txt
+++ b/src/KingSystem/Map/CMakeLists.txt
@@ -2,6 +2,8 @@ target_sources(uking PRIVATE
mapTypes.h
mapDebug.cpp
mapDebug.h
+ mapLazyTraverseList.cpp
+ mapLazyTraverseList.h
mapMubinIter.cpp
mapMubinIter.h
mapObject.cpp
diff --git a/src/KingSystem/Map/mapLazyTraverseList.cpp b/src/KingSystem/Map/mapLazyTraverseList.cpp
new file mode 100644
index 00000000..a87d2b94
--- /dev/null
+++ b/src/KingSystem/Map/mapLazyTraverseList.cpp
@@ -0,0 +1,112 @@
+#include "KingSystem/Map/mapLazyTraverseList.h"
+
+#include "Game/DLC/aocManager.h"
+#include "KingSystem/GameData/gdtManager.h"
+
+namespace ksys::map {
+
+LazyTraverseList::LazyTraverseList(sead::Heap* heap) {
+ ksys::res::Handle handle;
+ sead::SafeString path = "Map/MainField/LazyTraverseList.mubin";
+ ksys::res::LoadRequest request;
+
+ if (uking::aoc::Manager::instance())
+ uking::aoc::Manager::instance()->getFileDeviceForMap(&request.mAocFileDevice,
+ &request.mPackHandle, path);
+
+ handle.load(path, &request);
+
+ if (handle.checkLoadStatus()) {
+ mHasEntries = false;
+ } else {
+ auto* direct_res = sead::DynamicCast<sead::DirectResource>(handle.getResource());
+ if (!direct_res) {
+ mHasEntries = false;
+ } else {
+ auto* entryIter = new (heap) al::ByamlIter(direct_res->getRawData());
+ if (entryIter && entryIter->getSize() >= 1) {
+ mHasEntries = true;
+
+ mEntries.allocBufferAssert(entryIter->getSize(), heap);
+
+ int objectCount = 0;
+ for (int entryIdx = 0; entryIdx < entryIter->getSize(); ++entryIdx) {
+ const char* key;
+ entryIter->getKeyName(&key, entryIdx);
+
+ mEntries[entryIdx].flag_name = key;
+ mEntries[entryIdx].flag_value = 0;
+
+ al::ByamlIter objectIter;
+ if (entryIter->tryGetIterByIndex(&objectIter, entryIdx)) {
+ objectCount += objectIter.getSize();
+ }
+ }
+
+ mObjects.allocBufferAssert(objectCount, heap);
+
+ for (int object = 0, entryIdx = 0; entryIdx < entryIter->getSize(); ++entryIdx) {
+ al::ByamlIter objectIter;
+ const char* entryName;
+ entryIter->getKeyName(&entryName, entryIdx); // debug log?
+
+ if (!entryIter->tryGetIterByIndex(&objectIter, entryIdx))
+ continue;
+
+ for (int objectIdx = 0; objectIdx < objectIter.getSize(); ++objectIdx) {
+ al::ByamlIter kvIter;
+ if (!objectIter.tryGetIterByIndex(&kvIter, objectIdx))
+ continue;
+
+ const char* configName;
+ kvIter.tryGetStringByKey(&configName, "UnitConfigName"); // debug log?
+
+ kvIter.tryGetUIntByKey(&mObjects[object].hash_id, "HashId");
+ mObjects[object].entry_idx = entryIdx;
+ ++object;
+ }
+ }
+ } else {
+ mHasEntries = false;
+ }
+
+ if (entryIter) {
+ heap->free(entryIter);
+ }
+ }
+ }
+
+ handle.requestUnload();
+}
+
+LazyTraverseList::~LazyTraverseList() {
+ mEntries.freeBuffer();
+ mObjects.freeBuffer();
+ mHasEntries = false;
+}
+
+void LazyTraverseList::updateFlags() {
+ for (int i = 0; i < u8(mEntries.size()); ++i) {
+ ksys::gdt::Manager::instance()->getParamBypassPerm().get().getBool(&mEntries[i].flag_value,
+ mEntries[i].flag_name);
+ }
+}
+
+bool LazyTraverseList::wereFlagsUpdated() {
+ auto* mgr = ksys::gdt::Manager::instance();
+
+ bool updated = false;
+ for (int i = 0; i < mEntries.size(); ++i) {
+ if (mgr->wasFlagNotCopied(mEntries[i].flag_name)) {
+ updated = true;
+ mEntries[i].flag_value = false;
+ } else if (mgr->wasFlagCopied(mEntries[i].flag_name)) {
+ updated = true;
+ mEntries[i].flag_value = true;
+ }
+ }
+
+ return updated;
+}
+
+} // namespace ksys::map
diff --git a/src/KingSystem/Map/mapLazyTraverseList.h b/src/KingSystem/Map/mapLazyTraverseList.h
new file mode 100644
index 00000000..12afcd7e
--- /dev/null
+++ b/src/KingSystem/Map/mapLazyTraverseList.h
@@ -0,0 +1,37 @@
+#pragma once
+
+#include <basis/seadTypes.h>
+#include <container/seadBuffer.h>
+#include <prim/seadSafeString.h>
+#include "KingSystem/Resource/resHandle.h"
+#include "KingSystem/Utils/Types.h"
+
+namespace ksys::map {
+
+class LazyTraverseList {
+public:
+ explicit LazyTraverseList(sead::Heap* heap);
+ ~LazyTraverseList();
+ void updateFlags();
+ bool wereFlagsUpdated();
+
+private:
+ struct Entry {
+ sead::FixedSafeString<0x40> flag_name;
+ bool flag_value;
+ };
+ KSYS_CHECK_SIZE_NX150(Entry, 0x60);
+
+ struct Object {
+ u32 hash_id;
+ u32 entry_idx;
+ };
+ KSYS_CHECK_SIZE_NX150(Object, 0x8);
+
+ sead::Buffer<Entry> mEntries;
+ sead::Buffer<Object> mObjects;
+ bool mHasEntries = false;
+};
+KSYS_CHECK_SIZE_NX150(LazyTraverseList, 0x28);
+
+} // namespace ksys::map