blob: 51d2ea93b9e52c999d27d806ac21b86cf1e36a21 (
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
|
#pragma once
#include <basis/seadTypes.h>
#include <container/seadBuffer.h>
#include <prim/seadRuntimeTypeInfo.h>
#include <prim/seadSafeString.h>
#include "KingSystem/Utils/Types.h"
namespace ksys::act {
class Actor;
}
namespace ksys::act::ai {
class Behavior {
SEAD_RTTI_BASE(Behavior)
public:
struct InitArg {
Actor* actor;
/// The index of the behavior definition in the actor's AI program.
s32 def_idx;
};
KSYS_CHECK_SIZE_NX150(InitArg, 0x10);
explicit Behavior(const InitArg& arg);
virtual ~Behavior() = default;
bool init(sead::Heap* heap);
virtual bool hasPreDeleteCb() { return false; }
virtual bool hasUpdateForPreDeleteCb() { return false; }
virtual bool m6() { return true; }
virtual void m7() {}
virtual void m8() {}
virtual void m9() {}
virtual void m10() {}
virtual void m11() {}
virtual bool updateForPreDelete() { return true; }
virtual void onPreDelete() {}
protected:
Actor* mActor{};
u16 mDefIdx{};
u8 _12{};
u8 _13{};
void* _18{};
void* _20{};
};
KSYS_CHECK_SIZE_NX150(Behavior, 0x28);
struct BehaviorFactory {
using CreateFn = Behavior* (*)(const Behavior::InitArg& arg, sead::Heap* heap);
u32 hash;
CreateFn create_fn;
};
class Behaviors {
public:
Behaviors();
~Behaviors();
void finalize();
bool init(Actor* actor, sead::Heap* heap);
bool updateForPreDelete() const;
void onPreDelete() const;
const sead::Buffer<Behavior*>& getClasses() const { return mClasses; }
static BehaviorFactory* getFactory(const sead::SafeString& name);
static void setFactories(int count, BehaviorFactory* factories);
private:
static inline sead::Buffer<BehaviorFactory> sFactories;
sead::Buffer<Behavior*> mClasses;
// Non-owning buffer.
sead::Buffer<Behavior*> mOnPreDeleteCbs;
// Non-owning buffer.
sead::Buffer<Behavior*> mUpdateForPreDeleteCbs;
};
} // namespace ksys::act::ai
|