blob: 56314813fbd7185455d02cbd11fbeb2c14df79a3 (
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
|
#include "KingSystem/Quest/qstActorData.h"
#include "KingSystem/Utils/Byaml/Byaml.h"
namespace ksys::qst {
CameraTarget::~CameraTarget() = default;
ActorData::ActorData(sead::Heap* heap) : heap(heap) {}
ActorData::~ActorData() {
for (int i = 0; i < targets.size(); ++i) {
/// @bug The object is destructed twice (UB).
std::destroy_at(targets[i]);
delete targets[i];
}
targets.freeBuffer();
}
bool ActorData::init(al::ByamlIter* iter, sead::BufferedSafeString* out_message) {
if (iter == nullptr)
return true;
sead::FixedSafeString<16> key("CameraTargets");
al::ByamlIter target_iter;
if (!iter->tryGetIterByKey(&target_iter, key.cstr()))
return true;
if (!targets.tryAllocBuffer(target_iter.getSize(), heap)) {
// Failed to setup photo target storage buffer. (Insufficient memory?)
out_message->format("写真対象格納バッファの設定に失敗しました。(メモリ不足?)");
return false;
}
for (int i = 0; i < target_iter.getSize(); ++i) {
const char* string = nullptr;
bool result = target_iter.tryGetStringByIndex(&string, i);
if (string == nullptr || !result) {
// Failed to get the photo target (%d).
out_message->format("写真対象(%d)の取得に失敗しました。", i);
return false;
}
auto* target = new (heap, std::nothrow_t()) CameraTarget();
if (target == nullptr) {
// Failed to allocate photo target information (%d).
out_message->format("写真対象情報(%d)の生成に失敗しました。");
return false;
}
target->enabled = false;
target->name = string;
targets.pushBack(target);
}
return true;
}
const CameraTarget* ActorData::getTarget(int idx) const {
if (targets.size() < 1 || idx < 0 || idx >= targets.size())
return nullptr;
return targets[idx];
}
void ActorData::disableAllTargets() {
for (int i = 0; i < targets.size(); ++i)
targets[i]->enabled = false;
}
void ActorData::enableAllTargets() {
for (int i = 0; i < targets.size(); ++i) {
targets[i]->enabled = true;
}
}
} // namespace ksys::qst
|