SMG-Decomp
A decompilation of Super Mario Galaxy 1
Loading...
Searching...
No Matches
FireBar.cpp
1#include "Game/MapObj/FireBar.hpp"
2#include "Game/Util.hpp"
3#include "JSystem/JMath/JMath.hpp"
4
5FireBarBall::~FireBarBall() {
6
7}
8
9FireBar::~FireBar() {
10
11}
12
13FireBarBall::FireBarBall(LiveActor *pParent) : ModelObj("ファイアバー玉", "FireBarBall", 0, 0xB, -2, -2, false) {
14 mFireBarParent = pParent;
15}
16
17void FireBarBall::init(const JMapInfoIter &rIter) {
18 f32 shadowDropDist = 100.0f;
19 MR::getJMapInfoArg6NoInit(rIter, &shadowDropDist);
20
21 if (0.0f != shadowDropDist) {
22 MR::initShadowVolumeCylinder(this, 55.0f);
23 MR::setShadowDropLength(this, 0, shadowDropDist);
24 s32 shadowDropRotate = -1;
25 MR::getJMapInfoArg4NoInit(rIter, &shadowDropRotate);
26
27 if (shadowDropRotate == 0) {
28 TVec3f upVec;
29 MR::calcUpVec(&upVec, mFireBarParent);
30 upVec.negate();
31 MR::setShadowDropDirection(this, 0, upVec);
32 }
33
34 s32 cutShadows = -1;
35 MR::getJMapInfoArg2NoInit(rIter, &cutShadows);
36
37 if (cutShadows == 0) {
38 MR::setShadowVolumeEndDropOffset(this, 0, 20.0f);
39 MR::onShadowVolumeCutDropLength(this, 0);
40 MR::onCalcShadow(this, 0);
41 }
42 }
43
44 MR::setClippingTypeSphereContainsModelBoundingBox(this, 100.0f);
45 makeActorAppeared();
46}
47
48void FireBarBall::initAfterPlacement() {
49 MR::calcGravity(this);
50}
51
52void FireBarBall::control() {
53 controlEmitEffect();
54}
55
56void FireBarBall::startClipped() {
57 MR::deleteEffect(this, "FireBarBall");
58 LiveActor::startClipped();
59}
60
61void FireBarBall::endClipped() {
62 LiveActor::endClipped();
63}
64
65void FireBarBall::controlEmitEffect() {
66 if (MR::isNearPlayerAnyTime(this, 5000.0f)) {
67 MR::emitEffect(this, "FireBarBall");
68 }
69 else {
70 MR::deleteEffect(this, "FireBarBall");
71 }
72}
73
74FireBar::FireBar(const char *pName) : LiveActor(pName) {
75 mFireBalls = 0;
76 mFireBallCount = 5;
77 _94.x = 0.0f;
78 _94.y = 0.0f;
79 _94.z = 0.0f;
80 mFireBarSpeed = -1.0f;
81 mStickCount = 1;
82 mStickDistance = 140.0f;
83}
84
85void FireBar::init(const JMapInfoIter &rIter) {
86 MR::initDefaultPos(this, rIter);
87 initModelManagerWithAnm("FireBarCore", 0, false);
88 MR::connectToSceneMapObj(this);
89 initHitSensor(2);
90 MR::addBodyMessageSensorMapObj(this);
91 MR::addHitSensorCallbackEnemyAttack(this, "fire", 8, 30.0f);
92 MR::initCollisionParts(this, "FireBarCore", getSensor("body"), 0);
93 initEffectKeeper(0, 0, false);
94 initSound(3, false);
95 MR::calcGravity(this);
96
97 f32 shadowDropDist = 100.0f;
98 MR::getJMapInfoArg6NoInit(rIter, &shadowDropDist);
99 MR::getJMapInfoArg3NoInit(rIter, &shadowDropDist);
100 shadowDropDist -= 55.0f;
101
102 if (shadowDropDist > 0.0f) {
103 TVec3f up_vec;
104 TVec3f scaled_vec;
105 TVec3f drop_direction;
106 TVec3f shadow_box;
107 shadow_box.x = 100.0f;
108 shadow_box.y = 100.0f;
109 shadow_box.z = 100.0f;
110 MR::initShadowVolumeBox(this, shadow_box);
111 MR::calcUpVec(&up_vec, this);
112 JMAVECScaleAdd((const Vec*)&up_vec, (const Vec*)&mPosition, (Vec*)&scaled_vec, 50.0f);
113 MR::setShadowDropPosition(this, 0, scaled_vec);
114 MR::setShadowVolumeStartDropOffset(this, 0, 100.0f);
115 MR::setShadowDropLength(this, 0, shadowDropDist);
116
117 s32 rotateShadow = -1;
118 MR::getJMapInfoArg4NoInit(rIter, &rotateShadow);
119 if (rotateShadow == 0) {
120 MR::calcUpVec(&drop_direction, this);
121 drop_direction.negate();
122 MR::setShadowDropDirection(this, 0, drop_direction);
123 }
124 }
125
126 s32 numFireBalls = 5;
127 f32 fireBallSpeed = -1.0f;
128 MR::getJMapInfoArg0NoInit(rIter, &numFireBalls);
129 MR::getJMapInfoArg1NoInit(rIter, &fireBallSpeed);
130 MR::getJMapInfoArg5NoInit(rIter, &mStickDistance);
131 MR::getJMapInfoArg7NoInit(rIter, &mStickCount);
132
133 mFireBarSpeed = 0.1f * fireBallSpeed;
134 mFireBallCount = mStickCount * numFireBalls;
135 MR::calcFrontVec(&_94, this);
136 initFireBarBall(rIter);
137 MR::setGroupClipping(this, rIter, 0x20);
138 MR::setClippingTypeSphere(this, (mFireBallCount + 1) * 100.0f);
139 MR::useStageSwitchSleep(this, rIter);
140 initNerve(&NrvFireBar::FireBarNrvWait::sInstance);
141 makeActorAppeared();
142}
143
144void FireBar::exeWait() {
145 TVec3f up_vec;
146 MR::calcUpVec(&up_vec, this);
147 MR::rotateVecDegree(&up_vec, _94, mFireBarSpeed);
148 MR::startLevelSound(this, "SE_OJ_LV_FIRE_BAR_CENTER", -1, -1, -1);
149 fixFireBarBall();
150}
151
152void FireBar::makeActorAppeared() {
153 for (s32 i = 0; i < mFireBallCount; i++) {
154 mFireBalls[i]->makeActorAppeared();
155 }
156
157 LiveActor::makeActorAppeared();
158}
159
160void FireBar::makeActorDead() {
161 for (s32 i = 0; i < mFireBallCount; i++) {
162 mFireBalls[i]->makeActorDead();
163 }
164
165 LiveActor::makeActorDead();
166}
167
168void FireBar::attackSensor(HitSensor *a1, HitSensor *a2) {
169 if (MR::isSensorPlayerOrRide(a2) && MR::isSensorEnemyAttack(a1)) {
170 MR::sendMsgEnemyAttackFire(a2, a1);
171 }
172}
173
174// updateHitSensor__7FireBarFP9HitSensor
175
176#ifdef NON_MATCHING
177// meh
178void FireBar::initFireBarBall(const JMapInfoIter &rIter) {
179 mFireBalls = new FireBarBall*[mFireBallCount];
180 s32 totalNum = mFireBallCount;
181 totalNum /= mStickCount;
182 f32 startVal = 25.0f;
183
184 for (s32 i = 0; i < mFireBallCount; i++) {
185 mFireBalls[i] = new FireBarBall(this);
186 mFireBalls[i]->init(rIter);
187 MR::startBtk(mFireBalls[i], "FireBarBall");
188 s32 div = i / totalNum;
189 div *= totalNum;
190
191 startVal = !(i - div) ? 0.0f : startVal + 25.0f;
192 s32 btkFrame = MR::getBtkFrameMax(mFireBalls[i]);
193 s32 derp = startVal;
194 startVal = (derp - (derp / (btkFrame * btkFrame)));
195 MR::setBtkFrame(mFireBalls[i], startVal);
196 }
197
198 fixFireBarBall();
199}
200#endif
201
202void FireBar::fixFireBarBall() {
203 TVec3f scaled;
204 scaled.scale(100.0f, _94);
205
206 TVec3f final_pos;
207 final_pos.z = 0.0f;
208 final_pos.y = 0.0f;
209 final_pos.x = 0.0f;
210
211 s32 totalNum = mFireBallCount;
212 totalNum /= mStickCount;
213 for (s32 i = 0; i < mFireBallCount; i++) {
214 s32 div = i / totalNum;
215 div *= totalNum;
216 if (!(i - div)) {
217 TVec3f up_vec;
218 MR::calcUpVec(&up_vec, this);
219 MR::rotateVecDegree(&scaled, up_vec, 360.0f / mStickCount);
220 TVec3f norm;
221 MR::normalize(scaled, &norm);
222 JMAVECScaleAdd((const Vec*)&norm, (const Vec*)&mPosition, (Vec*)&final_pos, mStickDistance);
223 JMAVECScaleAdd((const Vec*)&up_vec, (const Vec*)&final_pos, (Vec*)&final_pos, 50.0f);
224 }
225 else {
226 JMathInlineVEC::PSVECAdd((const Vec*)&final_pos, (const Vec*)&scaled, (Vec*)&final_pos);
227 }
228
229 mFireBalls[i]->mPosition.set(scaled);
230 }
231}
232
233namespace NrvFireBar {
234 FireBarNrvWait FireBarNrvWait::sInstance;
235
236 void FireBarNrvWait::execute(Spine *pSpine) const {
237 FireBar* bar = reinterpret_cast<FireBar*>(pSpine->mExecutor);
238 bar->exeWait();
239 }
240};
virtual void init(const JMapInfoIter &)
Intializes the NameObj and can set various settings and construct necessary classes.
Definition FireBar.cpp:17
virtual void init(const JMapInfoIter &)
Intializes the NameObj and can set various settings and construct necessary classes.
Definition FireBar.cpp:85
The basis of a drawable actor that can contain states (see: Nerve)
Definition LiveActor.hpp:24
TVec3f mPosition
3D vector of the actor's position.
Definition LiveActor.hpp:95
HitSensor * getSensor(const char *pSensorName) const
Gets a sensor.
Definition Spine.hpp:9