SMG-Decomp
A decompilation of Super Mario Galaxy 1
Loading...
Searching...
No Matches
BeeFlowerHover.cpp
1#include "Game/MapObj/BeeFlowerHover.hpp"
2#include "Game/LiveActor/LodCtrl.hpp"
3
4BeeFlowerHover::BeeFlowerHover(const char *pName) : LiveActor(pName) {
5 mLodCtrlPlanet = 0;
6 _BC = 50.0f;
7 mRailMover = 0;
8 mRailPosture = 0;
9 _CC.x = 0.0f;
10 _CC.y = 0.0f;
11 _CC.z = 0.0f;
12 _8C.identity();
13}
14
16 MR::initDefaultPos(this, rIter);
17 initModelManagerWithAnm("BeeFlowerHover", 0, false);
18 MR::connectToSceneMapObj(this);
19 initHitSensor(1);
20 MR::addBodyMessageSensorMapObj(this);
21 MR::initCollisionPartsAutoEqualScale(this, "BeeFlowerHover", getSensor(0), 0);
22 initEffectKeeper(0, 0, false);
23 initSound(4, false);
24
25 if (MR::isConnectedWithRail(rIter)) {
26 initRailRider(rIter);
27 mRailMover = new MapPartsRailMover(this);
28 mRailMover->init(rIter);
29 mRailMover->start();
30
31 mRailPosture = new MapPartsRailPosture(this);
32 mRailPosture->_48 = 2;
33 mRailPosture->initWithoutIter();
34 mRailMover->start();
35 }
36
37 MR::initShadowVolumeCylinder(this, 450.0f);
38 MR::onShadowFollowHostScale(this, 0);
39
40 if (!mRailMover) {
41 MR::onCalcShadowOneTime(this, 0);
42 }
43
44 s32 drop_length = -1;
45 MR::getJMapInfoArg7NoInit(rIter, &drop_length);
46 if (drop_length != -1) {
47 MR::setShadowDropLength(this, 0, drop_length);
48 }
49
50 if (mRailMover) {
51 MR::initAndSetRailClipping(&_CC, this, 100.0f, 500.0f);
52 }
53 else {
54 MR::setClippingTypeSphereContainsModelBoundingBox(this, 100.0f);
55 }
56
57 if (mRailMover) {
58 MR::onCalcGravity(this);
59 }
60 else {
61 MR::calcGravity(this);
62 }
63
64 MR::getJMapInfoArg0NoInit(rIter, &_BC);
65 _BC /= 100.0f;
66 mLodCtrlPlanet = MR::createLodCtrlPlanet(this, rIter, 100.0f, -1);
67 mLodCtrlPlanet->validate();
68 initNerve(&NrvBeeFlowerHover::BeeFlowerHoverNrvWait::sInstance);
69 makeActorAppeared();
70}
71
72void BeeFlowerHover::exeSoftTouch() {
73 if (MR::isFirstStep(this)) {
74 MR::startBck(this, "OnBee", 0);
75 MR::startSound(this, "SE_OJ_BEE_FLOWER_BEE_ON", -1, -1);
76 }
77
78 if (MR::isBckStopped(this)) {
79 setNerve(&NrvBeeFlowerHover::BeeFlowerHoverNrvSoftTouchWait::sInstance);
80 }
81}
82
83void BeeFlowerHover::exeSoftTouchWait() {
84 if (MR::isFirstStep(this)) {
85 MR::startBck(this, "Wait", 0);
86 }
87
88 if (!MR::isPlayerElementModeBee()) {
89 setNerve(&NrvBeeFlowerHover::BeeFlowerHoverNrvHardTouch::sInstance);
90 }
91 else {
92
93 if (MR::isOnPlayer(getSensor(0))) {
94 setNerve(&NrvBeeFlowerHover::BeeFlowerHoverNrvWait::sInstance);
95 }
96 }
97}
98
99void BeeFlowerHover::exeHardTouch() {
100 if (MR::isFirstStep(this)) {
101 MR::startBck(this, "ThroughMario", 0);
102 MR::startSound(this, "SE_OJ_BEE_FLOWER_DISAPPEAR", -1, -1);
103 MR::invalidateCollisionParts(this);
104 MR::invalidateShadow(this, 0);
105 MR::onCalcShadowOneTime(this, 0);
106 MR::tryRumblePadMiddle(this, 0);
107 MR::shakeCameraNormal();
108 }
109
110 if (MR::isBckStopped(this)) {
111 MR::hideModel(this);
112 setNerve(&NrvBeeFlowerHover::BeeFlowerHoverNrvRecover::sInstance);
113 }
114}
115
116void BeeFlowerHover::exeRecover() {
117 if (MR::isStep(this, 0x3C)) {
118 MR::validateShadow(this, 0);
119 MR::onCalcShadowOneTime(this, 0);
120 MR::showModel(this);
121 MR::startBck(this, "Appear", 0);
122 MR::startSound(this, "SE_OJ_BEE_FLOWER_RECOVER", -1, -1);
123 }
124
125 if (MR::isGreaterEqualStep(this, 0x3C) && MR::isBckStopped(this) && !MR::isHiddenModel(this)) {
126 MR::validateCollisionParts(this);
127 setNerve(&NrvBeeFlowerHover::BeeFlowerHoverNrvWait::sInstance);
128 }
129}
130
131#ifdef NON_MATCHING
132void BeeFlowerHover::control() {
133 if (!isNerve(&NrvBeeFlowerHover::BeeFlowerHoverNrvRecover::sInstance)) {
134 mLodCtrlPlanet->update();
135
136 if (mLodCtrlPlanet->isShowLowModel()) {
137 return;
138 }
139 }
140
141 f32 v5 = _BC;
142 TVec3f v11;
143 v5 = v5 * 0.017453292f;
144 v11.y = 1.0f;
145 v11.x = 0.0f;
146 v11.z = 0.0f;
147
148 TMtx34f v12; // stack_20
149 v12.mMtx[0][3] = 0.0f;
150 v12.mMtx[1][3] = 0.0f;
151 v12.mMtx[2][3] = 0.0f;
152
153 TVec3f v10;
154 v10.set(v11);
155 f32 mag = PSVECMag(v10.toCVec());
156 PSVECNormalize(v10.toCVec(), v10.toVec());
157 f32 v6 = sin(v5);
158 f32 v7 = cos(v5);
159 v12.mMtx[0][0] = v7 + ((1.0f - v7) * (v10.x * v10.x));
160 v12.mMtx[1][1] = v7 + ((1.0f - v7) * (v10.y * v10.y));
161
162 v12.mMtx[2][2] = v7 + ((1.0f - v7) * (v10.z * v10.z));
163
164 //f32 val_3 =
165
166 v12.mMtx[0][1] = (v10.y * ((1.0f - v7) * v10.x)) - (v6 * v10.z);
167 v12.mMtx[1][0] = (v10.y * ((1.0f - v7) * v10.x)) + (v6 * v10.z);
168 v12.mMtx[0][2] = (v10.z * ((1.0f - v7) * v10.x)) + (v6 * v10.y);
169 v12.mMtx[2][0] = (v10.z * ((1.0f - v7) * v10.x)) - (v6 * v10.y);
170 v12.mMtx[1][2] = (v10.z * ((1.0f - v7) * v10.y)) - (v6 * v10.x);
171 v12.mMtx[2][1] = (v10.z * ((1.0f - v7) * v10.y)) + (v6 * v10.x);
172 _8C.concat(v12);
173
174 if (mRailMover) {
175 mRailMover->movement();
176 mRailPosture->movement();
177 mPosition.set(mRailMover->_28);
178 }
179}
180#endif
181
183 TPos3f stack_8;
184 stack_8.identity();
185
186 if (mRailPosture) {
187 stack_8.concat(mRailPosture->_18);
188 }
189 else {
190 MR::makeMtxRotate(stack_8.toMtxPtr(), mRotation);
191 }
192
193 stack_8.concat(_8C);
194 stack_8.mMtx[0][3] = mPosition.x;
195 stack_8.mMtx[1][3] = mPosition.y;
196 stack_8.mMtx[2][3] = mPosition.z;
197 MR::setBaseTRMtx(this, stack_8);
198}
199
200bool BeeFlowerHover::receiveOtherMsg(u32 msg, HitSensor *, HitSensor *) {
201 if (!isNerve(&NrvBeeFlowerHover::BeeFlowerHoverNrvWait::sInstance)) {
202 return 0;
203 }
204
205 if (MR::isMsgFloorTouch(msg)) {
206 if (MR::isPlayerElementModeBee()) {
207 setNerve(&NrvBeeFlowerHover::BeeFlowerHoverNrvSoftTouch::sInstance);
208 }
209 else {
210 setNerve(&NrvBeeFlowerHover::BeeFlowerHoverNrvHardTouch::sInstance);
211 }
212
213 return 1;
214 }
215
216 return 0;
217}
218
219BeeFlowerHover::~BeeFlowerHover() {
220
221}
222
223namespace NrvBeeFlowerHover {
224 INIT_NERVE(BeeFlowerHoverNrvWait);
225 INIT_NERVE(BeeFlowerHoverNrvSoftTouch);
226 INIT_NERVE(BeeFlowerHoverNrvSoftTouchWait);
227 INIT_NERVE(BeeFlowerHoverNrvHardTouch);
228 INIT_NERVE(BeeFlowerHoverNrvRecover);
229
230 void BeeFlowerHoverNrvRecover::execute(Spine *pSpine) const {
231 BeeFlowerHover* flower = reinterpret_cast<BeeFlowerHover*>(pSpine->mExecutor);
232 flower->exeRecover();
233 }
234
235 void BeeFlowerHoverNrvHardTouch::execute(Spine *pSpine) const {
236 BeeFlowerHover* flower = reinterpret_cast<BeeFlowerHover*>(pSpine->mExecutor);
237 flower->exeHardTouch();
238 }
239
240 void BeeFlowerHoverNrvSoftTouchWait::execute(Spine *pSpine) const {
241 BeeFlowerHover* flower = reinterpret_cast<BeeFlowerHover*>(pSpine->mExecutor);
242 flower->exeSoftTouchWait();
243 }
244
245 void BeeFlowerHoverNrvSoftTouch::execute(Spine *pSpine) const {
246 BeeFlowerHover* flower = reinterpret_cast<BeeFlowerHover*>(pSpine->mExecutor);
247 flower->exeSoftTouch();
248 }
249
250 void BeeFlowerHoverNrvWait::execute(Spine *pSpine) const {
251 BeeFlowerHover* flower = reinterpret_cast<BeeFlowerHover*>(pSpine->mExecutor);
252
253 if (MR::isFirstStep(flower)) {
254 MR::startBck(flower, "Wait", 0);
255 }
256 }
257};
virtual void init(const JMapInfoIter &)
Intializes the NameObj and can set various settings and construct necessary classes.
virtual void calcAndSetBaseMtx()
Calculates and sets the base matrix of the actor.
The basis of a drawable actor that can contain states (see: Nerve)
Definition LiveActor.hpp:24
TVec3f mRotation
3D vector of the actor's rotation.
Definition LiveActor.hpp:96
TVec3f mPosition
3D vector of the actor's position.
Definition LiveActor.hpp:95
HitSensor * getSensor(const char *pSensorName) const
Gets a sensor.
virtual void init(const JMapInfoIter &)
Intializes the NameObj and can set various settings and construct necessary classes.
void initWithoutIter()
Initializes a NameObj without a JMapInfoIter instance.
Definition NameObj.cpp:41
Definition Spine.hpp:9