1#include "Library/HitSensor/HitSensorKeeper.h"
2
3#include "Library/Base/StringUtil.h"
4#include "Library/LiveActor/ActorFlagFunction.h"
5#include "Library/LiveActor/LiveActor.h"
6#include "Project/HitSensor/HitSensor.h"
7
8namespace al {
9
10HitSensorKeeper::HitSensorKeeper(s32 maxSensors) : mMaxSensors(maxSensors) {
11 mSensors = new HitSensor*[maxSensors];
12 for (s32 i = 0; i < mMaxSensors; i++)
13 mSensors[i] = nullptr;
14}
15
16HitSensor* HitSensorKeeper::addSensor(LiveActor* parentActor, const char* name, u32 hitSensorType,
17 f32 radius, u16 maxSensorCount,
18 const sead::Vector3f* followPos,
19 const sead::Matrix34f* followMatrix,
20 const sead::Vector3f& offset) {
21 auto* newSensor = new HitSensor(parentActor, name, hitSensorType, radius, maxSensorCount,
22 followPos, followMatrix, offset);
23 mSensors[mSensorCount] = newSensor;
24 mSensorCount++;
25 newSensor->update();
26 return newSensor;
27}
28
29void HitSensorKeeper::update() {
30 for (s32 i = 0; i < mSensorCount; i++)
31 mSensors[i]->update();
32}
33
34s32 HitSensorKeeper::getSensorNum() const {
35 return mSensorCount;
36}
37
38HitSensor* HitSensorKeeper::getSensor(s32 index) const {
39 return mSensors[index];
40}
41
42void HitSensorKeeper::attackSensor() {
43 for (s32 i = 0; i < mSensorCount; i++) {
44 auto* sensor = mSensors[i];
45 sensor->trySensorSort();
46 for (s32 j = 0; j < sensor->mSensorCount; j++) {
47 auto* subSensor = sensor->mSensors[j];
48 if (!isDead(actor: subSensor->mParentActor))
49 sensor->mParentActor->attackSensor(self: sensor, other: subSensor);
50 }
51 }
52}
53
54void HitSensorKeeper::clear() {
55 for (s32 i = 0; i < mSensorCount; i++)
56 mSensors[i]->mSensorCount = 0;
57}
58
59void HitSensorKeeper::validate() {
60 for (s32 i = 0; i < mSensorCount; i++)
61 mSensors[i]->validate();
62}
63
64void HitSensorKeeper::invalidate() {
65 for (s32 i = 0; i < mSensorCount; i++)
66 mSensors[i]->invalidate();
67}
68
69void HitSensorKeeper::validateBySystem() {
70 for (s32 i = 0; i < mSensorCount; i++)
71 mSensors[i]->validateBySystem();
72}
73
74void HitSensorKeeper::invalidateBySystem() {
75 for (s32 i = 0; i < mSensorCount; i++)
76 mSensors[i]->invalidateBySystem();
77}
78
79HitSensor* HitSensorKeeper::getSensor(const char* name) const {
80 if (mSensorCount == 1)
81 return mSensors[0];
82
83 for (s32 i = 0; i < mSensorCount; i++)
84 if (isEqualString(str1: mSensors[i]->mName, str2: name))
85 return mSensors[i];
86
87 return nullptr;
88}
89
90} // namespace al
91