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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
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
|