summaryrefslogtreecommitdiff
path: root/src/KingSystem/Resource/Event/resDemoASLoader.cpp
blob: a29bc57052e994963f861ed2fd00ca503fa9458f (plain)
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