SMG-Decomp
A decompilation of Super Mario Galaxy 1
Loading...
Searching...
No Matches
SensorHitChecker.cpp
1#include "Game/LiveActor/SensorHitChecker.hpp"
2#include "Game/Scene/SceneObjHolder.hpp"
3#include "Game/Util.hpp"
4
6 MR::connectToScene(this, 5, -1, -1, -1);
7}
8
9void SensorHitChecker::initGroup(HitSensor *pSensor) {
10 if (MR::isSensorPlayer(pSensor)) {
11 pSensor->mSensorGroup = mPlayerGroup;
12 }
13 else if (MR::isSensorRide(pSensor)) {
14 pSensor->mSensorGroup = mRideGroup;
15 }
16 else if (pSensor->isType(0x7F)) {
17 pSensor->mSensorGroup = mRideGroup;
18 }
19 else if (pSensor->isType(0x4A) || pSensor->isType(0x4C)
20 || pSensor->isType(0x15) || pSensor->isType(0x47)
21 || pSensor->isType(0x1F) || MR::isSensorRush(pSensor) || MR::isSensorAutoRush(pSensor)) {
22 pSensor->mSensorGroup = mSimpleGroup;
23 }
24 else {
25 if (MR::isSensorMapObj(pSensor)) {
26 pSensor->mSensorGroup = mMapObjGroup;
27 }
28 else {
29 pSensor->mSensorGroup = mCharacterGroup;
30 }
31 }
32}
33
34void SensorHitChecker::movement() {
35 mPlayerGroup->clear();
36 mRideGroup->clear();
37 mEyeGroup->clear();
38 mSimpleGroup->clear();
39 mMapObjGroup->clear();
40 mCharacterGroup->clear();
41 doObjColGroup(mPlayerGroup, mCharacterGroup);
42 doObjColGroup(mPlayerGroup, mMapObjGroup);
43 doObjColGroup(mPlayerGroup, mRideGroup);
44 doObjColGroup(mPlayerGroup, mSimpleGroup);
45 doObjColGroup(mPlayerGroup, mEyeGroup);
46 doObjColGroup(mRideGroup, mCharacterGroup);
47 doObjColGroup(mRideGroup, mMapObjGroup);
48 doObjColGroup(mRideGroup, mSimpleGroup);
49 doObjColGroup(mRideGroup, mEyeGroup);
50 doObjColGroup(mEyeGroup, mCharacterGroup);
51 doObjColGroup(mEyeGroup, mMapObjGroup);
52 doObjColGroup(mEyeGroup, mSimpleGroup);
53 doObjColGroup(mCharacterGroup, mMapObjGroup);
54 doObjColInSameGroup(mCharacterGroup);
55}
56
57#ifdef NON_MATCHING // Wrong registers
58void SensorHitChecker::doObjColGroup(SensorGroup *pGroup1, SensorGroup *pGroup2) const {
59 s32 group1SensorCount = pGroup1->mSensorCount;
60 for (s32 i = 0; i < group1SensorCount; i++) {
61 HitSensor* curGroup1Sensor = pGroup1->mSensors[i];
62 bool group1Sensorvalidated = false;
63
64 if (curGroup1Sensor->mValidByHost && curGroup1Sensor->mValidBySystem) {
65 group1Sensorvalidated = true;
66 }
67
68 if (group1Sensorvalidated && !MR::isClipped(curGroup1Sensor->mActor)) {
69 s32 group2SensorCount = pGroup2->mSensorCount;
70 for (s32 x = 0; x < group2SensorCount; x++) {
71 HitSensor* curGroup2Sensor = pGroup2->mSensors[x];
72 bool group2Validated = false;
73
74 if (curGroup2Sensor->mValidByHost && curGroup2Sensor->mValidBySystem) {
75 group2Validated = true;
76 }
77
78 if (group2Validated && !MR::isClipped(curGroup2Sensor->mActor)) {
79 checkAttack(curGroup1Sensor, curGroup2Sensor);
80 }
81 }
82 }
83 }
84}
85#endif
86
87#ifdef NON_MATCHING // Same register issue
88void SensorHitChecker::doObjColInSameGroup(SensorGroup *pSensorGroup) const {
89 s32 sensorGroupCount = pSensorGroup->mSensorCount;
90 for (s32 i = 0; i < sensorGroupCount; i++) {
91 HitSensor* pFirstSensor = pSensorGroup->mSensors[i];
92 bool isFirstSensorValid = false;
93
94 if (pFirstSensor->mValidByHost && pFirstSensor->mValidBySystem) {
95 isFirstSensorValid = true;
96 }
97
98 if (isFirstSensorValid && !MR::isClipped(pFirstSensor->mActor)) {
99 for (s32 x = 0; x < sensorGroupCount; x++) {
100 HitSensor* pSecondSensor = pSensorGroup->mSensors[x];
101 bool isSecondSensorValid = false;
102
103 if (pSecondSensor->mValidByHost && pSecondSensor->mValidBySystem) {
104 isSecondSensorValid = true;
105 }
106
107 if (isSecondSensorValid && !MR::isClipped(pSecondSensor->mActor)) {
108 checkAttack(pFirstSensor, pSecondSensor);
109 }
110 }
111 }
112 }
113}
114#endif
115
116#ifdef NON_MATCHING // Wrong registers
117void SensorHitChecker::checkAttack(HitSensor *pSensor1, HitSensor *pSensor2) const {
118 if (pSensor1->mActor != pSensor2->mActor) {
119 f32 xPos = pSensor1->mPosition.x - pSensor2->mPosition.x;
120 f32 yPos = pSensor1->mPosition.y - pSensor2->mPosition.y;
121 f32 zPos = pSensor1->mPosition.z - pSensor2->mPosition.z;
122 f32 totalSize = pSensor2->mRadius + pSensor1->mRadius;
123
124 if (!((((yPos * yPos) + (xPos * xPos)) + (zPos * zPos)) >= (totalSize * totalSize))) {
125 if (!pSensor2->isType(127)) {
126 pSensor1->addHitSensor(pSensor2);
127 }
128
129 if (!pSensor1->isType(127)) {
130 pSensor2->addHitSensor(pSensor1);
131 }
132 }
133 }
134}
135#endif
136
137namespace MR {
138 void initHitSensorGroup(HitSensor *pSensor) {
139 reinterpret_cast<SensorHitChecker*>(MR::getSceneObjHolder()->getObj(0))->initGroup(pSensor);
140 }
141};
142
143SensorHitChecker::~SensorHitChecker() {}
144
145SensorHitChecker::SensorHitChecker(const char *pName) : NameObj(pName) {
146 mPlayerGroup = nullptr;
147 mRideGroup = nullptr;
148 mEyeGroup = nullptr;
149 mSimpleGroup = nullptr;
150 mMapObjGroup = nullptr;
151 mCharacterGroup = nullptr;
152
153 mPlayerGroup = new SensorGroup(0x10, "Player");
154 mRideGroup = new SensorGroup(0x80, "Ride");
155 mEyeGroup = new SensorGroup(0x200, "Eye");
156 mSimpleGroup = new SensorGroup(0x800, "Simple");
157 mMapObjGroup = new SensorGroup(0x400, "MapObj");
158 mCharacterGroup = new SensorGroup(0x400, "Character");
159}
160
161SensorGroup::SensorGroup(int maxSensors, const char *a2) {
162 mMaxSensors = maxSensors;
163 mSensorCount = 0;
164 mSensors = nullptr;
165 mSensors = new HitSensor*[maxSensors];
166
167 for (s32 i = 0; i < mMaxSensors; i++) {
168 mSensors[i] = nullptr;
169 }
170}
171
172void SensorGroup::add(HitSensor *pSensor) {
173 mSensors[mSensorCount] = pSensor;
174 mSensorCount++;
175 pSensor->mSensorGroup = this;
176}
177
178void SensorGroup::remove(HitSensor *pSensor) {
179 for (s32 i = 0; i < mSensorCount; i++) {
180 if (mSensors[i] == pSensor) {
181 u32 count = mSensorCount -1;
182 mSensors[i] = mSensors[count];
183 mSensorCount--;
184 break;
185 }
186 }
187}
188
189void SensorGroup::clear() const {
190 for (s32 i = 0; i < mSensorCount; i++) {
191 mSensors[i]->mSensorCount = nullptr;
192 }
193}
The most basic form of an object.
Definition NameObj.hpp:11
virtual void init(const JMapInfoIter &)
Intializes the NameObj and can set various settings and construct necessary classes.