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
|
#include "KingSystem/Resource/Event/resDemoASLoader.h"
#include "KingSystem/Resource/Actor/resResourceAS.h"
#include "KingSystem/Resource/resHandle.h"
#include "KingSystem/Resource/resLoadRequest.h"
#include "KingSystem/Utils/Byaml/Byaml.h"
namespace ksys::res {
DemoASLoader::DemoASLoader(const sead::SafeString& event_name, sead::Heap* heap)
: mHeap(heap), mEventName(event_name) {}
DemoASLoader::~DemoASLoader() {
mHandles.freeBuffer();
mNames.freeBuffer();
}
void DemoASLoader::load(const al::ByamlIter& iter, bool synchronous, Handle* pack_handle) {
al::ByamlIter as_list;
if (!iter.tryGetIterByKey(&as_list, "as"))
return;
const int num_as = as_list.getSize();
if (num_as <= 0) {
mNumAS = 0;
} else {
mHandles.allocBufferAssert(num_as, mHeap);
mNames.allocBufferAssert(num_as, mHeap);
mNumAS = 0;
for (int i = 0; i < num_as; ++i) {
al::ByamlIter entry;
as_list.tryGetIterByIndex(&entry, i);
const char* file_c;
entry.tryGetStringByKey(&file_c, "file");
const sead::SafeString file = file_c;
sead::FixedSafeString<256> path;
path.format("Actor/AS/%s/%s.bas", mEventName.cstr(), file.cstr());
mNames[mNumAS].copy(file);
LoadRequest request;
request.mRequester = "DemoASLoader";
request.mPackHandle = pack_handle;
request._22 = true;
Handle::Status status = Handle::Status::Unknown;
if (synchronous)
mHandles[mNumAS].load(path, &request, &status);
else
mHandles[mNumAS].requestLoad(path, &request, &status);
++mNumAS;
}
}
mStatus = synchronous ? Status::Succeeded : Status::Loading;
}
const char* DemoASLoader::getName(int idx) const {
return mNames[idx].cstr();
}
AS* DemoASLoader::getAS(int idx) const {
return sead::DynamicCast<AS>(mHandles[idx].getResource());
}
bool DemoASLoader::finishLoad() {
if (mStatus == Status::Loading) {
bool ready = true;
for (int i = 0; i < mNumAS; ++i) {
auto& handle = mHandles[i];
if (handle.isReadyOrNeedsParse())
handle.parseResource(nullptr);
if (handle.isReady()) {
if (handle.checkLoadStatus()) {
mStatus = Status::Failed;
ready = false;
break;
}
} else {
ready = false;
}
}
if (ready)
mStatus = Status::Succeeded;
}
return mStatus != Status::Loading;
}
} // namespace ksys::res
|