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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
|
#include "KingSystem/ActorSystem/actAiRoot.h"
#include "KingSystem/ActorSystem/actActor.h"
#include "KingSystem/ActorSystem/actAiClassDef.h"
#include "KingSystem/Utils/InitTimeInfo.h"
namespace ksys::act::ai {
RootAi::RootAi(const InitArg& arg) : Ai(arg) {
mBehaviorsByStopAndCalcTiming[0].fill({});
mBehaviorsByStopAndCalcTiming[1].fill({});
}
RootAi::~RootAi() {
mQueries.finalize();
mBehaviors.finalize();
mAis.finalize();
mActions.finalize();
if (_140)
delete _140;
}
bool RootAi::loadMapUnitParams(const AIDef& def, sead::Heap* heap) {
return mMapUnitParams.load(*mActor, def, heap, AIDefInstParamKind::MapUnit);
}
bool RootAi::loadAITreeParams(const AIDef& def, sead::Heap* heap) {
return mAiTreeParams.load(*mActor, def, heap, AIDefInstParamKind::AITree);
}
bool RootAi::isActorDeletedOrDeleting() const {
return mActor->isDeletedOrDeleting();
}
bool RootAi::getMapUnitParam(sead::SafeString* value, const sead::SafeString& key) const {
sead::SafeString out;
if (mMapUnitParams.getString(&out, key)) {
*value = out.cstr();
return true;
}
*value = sead::SafeString::cEmptyString;
return false;
}
bool RootAi::getMapUnitParam(const s32** value, const sead::SafeString& key) const {
auto* ptr =
static_cast<int*>(mMapUnitParams.getAITreeVariablePointer(key, AIDefParamType::Int));
static const s32 sDefault{};
*value = ptr ? ptr : &sDefault;
return ptr != nullptr;
}
bool RootAi::getMapUnitParam(const f32** value, const sead::SafeString& key) const {
auto* ptr =
static_cast<f32*>(mMapUnitParams.getAITreeVariablePointer(key, AIDefParamType::Float));
static const f32 sDefault{};
*value = ptr ? ptr : &sDefault;
return ptr != nullptr;
}
bool RootAi::getMapUnitParam(const sead::Vector3f** value, const sead::SafeString& key) const {
auto* ptr = static_cast<sead::Vector3f*>(
mMapUnitParams.getAITreeVariablePointer(key, AIDefParamType::Vec3));
*value = ptr ? ptr : &sead::Vector3f::zero;
return ptr != nullptr;
}
bool RootAi::getMapUnitParam(const bool** value, const sead::SafeString& key) const {
auto* ptr =
static_cast<bool*>(mMapUnitParams.getAITreeVariablePointer(key, AIDefParamType::Bool));
static const bool sDefault{};
*value = ptr ? ptr : &sDefault;
return ptr != nullptr;
}
namespace {
sead::FixedSafeString<64> sDefaultString;
struct Vec3Wrapper {
util::InitTimeInfoEx init_time_info_ex;
sead::Vector3f sDefaultVec3{0, 0, 0};
};
Vec3Wrapper sDefaultAITreeVariables;
} // namespace
bool RootAi::getAITreeVariable(sead::SafeString** value, const sead::SafeString& key) const {
auto* ptr = static_cast<sead::SafeString*>(
mAiTreeParams.getAITreeVariablePointer(key, AIDefParamType::String));
*value = ptr ? ptr : &sDefaultString;
return ptr != nullptr;
}
bool RootAi::getAITreeVariable(s32** value, const sead::SafeString& key) const {
auto* ptr = static_cast<s32*>(mAiTreeParams.getAITreeVariablePointer(key, AIDefParamType::Int));
static s32 sDefault{};
*value = ptr ? ptr : &sDefault;
return ptr != nullptr;
}
bool RootAi::getAITreeVariable(f32** value, const sead::SafeString& key) const {
auto* ptr =
static_cast<f32*>(mAiTreeParams.getAITreeVariablePointer(key, AIDefParamType::Float));
static f32 sDefault{};
*value = ptr ? ptr : &sDefault;
return ptr != nullptr;
}
bool RootAi::getAITreeVariable(sead::Vector3f** value, const sead::SafeString& key) const {
auto* ptr = static_cast<sead::Vector3f*>(
mAiTreeParams.getAITreeVariablePointer(key, AIDefParamType::Vec3));
*value = ptr ? ptr : &sDefaultAITreeVariables.sDefaultVec3;
return ptr != nullptr;
}
bool RootAi::getAITreeVariable(bool** value, const sead::SafeString& key) const {
auto* ptr =
static_cast<bool*>(mAiTreeParams.getAITreeVariablePointer(key, AIDefParamType::Bool));
static bool sDefault{};
*value = ptr ? ptr : &sDefault;
return ptr != nullptr;
}
bool RootAi::getAITreeVariable(void** value, const sead::SafeString& key) const {
auto* ptr = static_cast<void**>(
mAiTreeParams.getAITreeVariablePointer(key, AIDefParamType::AITreeVariablePointer));
static void* sDefault{};
*value = ptr ? ptr : &sDefault;
return ptr != nullptr;
}
bool RootAi::getAITreeVariable(u32** value, const sead::SafeString& key) const {
auto* ptr =
static_cast<u32*>(mAiTreeParams.getAITreeVariablePointer(key, AIDefParamType::UInt));
static u32 sDefault{};
*value = ptr ? ptr : &sDefault;
return ptr != nullptr;
}
bool RootAi::getAITreeVariable2(sead::Vector3f** value, const sead::SafeString& key) const {
return getAITreeVariable(value, key);
}
bool RootAi::getAITreeVariable2(bool** value, const sead::SafeString& key) const {
return getAITreeVariable(value, key);
}
const char* getDefaultAiName(s32 root_idx) {
static constexpr const char* names[] = {"DemoRootAI", "Root"};
if (root_idx >= 2)
return "";
return names[root_idx];
}
const char* getDefaultActionName(s32) {
return "";
}
} // namespace ksys::act::ai
|