SMG-Decomp
A decompilation of Super Mario Galaxy 1
Loading...
Searching...
No Matches
FlipPanel.cpp
1#include "Game/MapObj/FlipPanel.hpp"
2#include "Game/LiveActor/ModelObj.hpp"
3#include "Game/LiveActor/LiveActorGroupArray.hpp"
4#include "JSystem/JMath/JMath.hpp"
5#include "Game/Util.hpp"
6
7FlipPanel::FlipPanel(const char *pName) : MapObjActor(pName) {
8 mDelegator = 0;
9 mFlipPanelGroup = 0;
10 _CC = 0;
11 _CD = 0;
12 _D0 = 0;
13 mIsReverse = false;
14}
15
16void FlipPanel::init(const JMapInfoIter &rIter) {
17 MapObjActor::init(rIter);
19 info.setupHioNode("地形オブジェ");
20 info.setupDefaultPos();
21 info.setupConnectToScene();
22 info.setupEffect("FlipPanel");
23 info.setupSound(4);
24 info.setupNerve(&NrvFlipPanel::FlipPanelNrvFront::sInstance);
25 initialize(rIter, info);
26 mIsReverse = isObjectName("FipPanelReverse");
27 mDelegator = MR::createJointDelegatorWithNullChildFunc(this, &FlipPanel::calcJointMove, "Panel");
28 mFlipPanelGroup = MR::joinToGroupArray(this, rIter, 0, 0x20);
29 MR::invalidateClipping(this);
30 MR::startBck(this, "PanelB", 0);
31 f32 frameMax = MR::getBckFrameMax(this);
32 MR::setBckFrameAndStop(this, frameMax);
33
34 if (mIsReverse) {
35 MapObjActorUtil::appearBloomModel(this);
36 }
37 else {
38 MapObjActorUtil::killBloomModel(this);
39 }
40}
41
42void FlipPanel::exeFrontLand() {
43 if (MR::isFirstStep(this)) {
44 MR::startBck(this, "PanelB", 0);
45
46 if (mIsReverse) {
47 MapObjActorUtil::appearBloomModel(this);
48 ModelObj* bloomModel = mBloomModel;
49 u32 frameMax = MR::getBrkFrameMax(bloomModel);
50 u32 val = sBloomSyncStep / frameMax;
51 frameMax = sBloomSyncStep - (val) * frameMax;
52 MR::setBrkFrame(bloomModel, frameMax);
53 }
54 else {
55 MapObjActorUtil::killBloomModel(this);
56 }
57
58 MR::tryRumblePadMiddle(this, 0);
59 MR::startSound(this, "SE_OJ_FLIP_PANEL_CHANGE", -1, -1);
60
61 if (_CD) {
62 MR::sendMsgToGroupMember(0x67, this, getSensor(0), "body");
63 _CD = 0;
64 }
65 }
66
67 if (MR::isOnGroundPlayer() && !MR::isOnPlayer(this)) {
68 setNerve(&NrvFlipPanel::FlipPanelNrvFront::sInstance);
69 }
70}
71
72void FlipPanel::exeBackLand() {
73 if (MR::isFirstStep(this)) {
74 MR::startBck(this, "PanelA", 0);
75
76 if (mIsReverse) {
77 MapObjActorUtil::killBloomModel(this);
78 }
79 else {
80 MapObjActorUtil::appearBloomModel(this);
81 ModelObj* bloomModel = mBloomModel;
82 u32 frameMax = MR::getBrkFrameMax(bloomModel);
83 u32 val = sBloomSyncStep / frameMax;
84 frameMax = sBloomSyncStep - (val) * frameMax;
85 MR::setBrkFrame(bloomModel, frameMax);
86 }
87
88 MR::tryRumblePadMiddle(this, 0);
89 MR::startSound(this, "SE_OJ_FLIP_PANEL_CHANGE", -1, -1);
90
91 if (!_CD) {
92 MR::sendMsgToGroupMember(0x66, this, getSensor(0), "body");
93 _CD = 1;
94 }
95 }
96
97 if (MR::isOnGroundPlayer() && !MR::isOnPlayer(this)) {
98 setNerve(&NrvFlipPanel::FlipPanelNrvBack::sInstance);
99 }
100}
101
102void FlipPanel::exeWait() {
103 if (MR::isFirstStep(this)) {
104 MR::validateClipping(this);
105 }
106
107 if (_CC && !MR::isOnPlayer(this) && MR::isOnGroundPlayer()) {
108 _CC = 0;
109 }
110
111 if (!_CC) {
112 if (checkPlayerOnTop()) {
113 if (isNerve(&NrvFlipPanel::FlipPanelNrvFront::sInstance)) {
114 setNerve(&NrvFlipPanel::FlipPanelNrvBackLand::sInstance);
115 }
116 else {
117 setNerve(&NrvFlipPanel::FlipPanelNrvFrontLand::sInstance);
118 }
119 }
120 }
121}
122
123void FlipPanel::exeEnd() {
124 if (MR::isFirstStep(this)) {
125 MR::startSystemSE("SE_OJ_FLIP_PANEL_COMPLETE", -1, -1);
126 MR::startBck(this, "PanelEnd", 0);
127 MapObjActorUtil::killBloomModel(this);
128 _CC = 0;
129 }
130
131 if (MR::isBckStopped(this)) {
132 if (MR::isEffectValid(this, "FlipPanelGold")) {
133 MR::validateClipping(this);
134 }
135 }
136}
137
138void FlipPanel::appear() {
139 MapObjActor::appear();
140 if (mIsReverse) {
141 MapObjActorUtil::appearBloomModel(this);
142 }
143 else {
144 MapObjActorUtil::killBloomModel(this);
145 }
146}
147
148void FlipPanel::endClipped() {
149 MapObjActor::endClipped();
150
151 if (MR::getBrkCtrl(mBloomModel)) {
152 ModelObj* bloomModel = mBloomModel;
153 u32 frameMax = MR::getBrkFrameMax(bloomModel);
154 u32 val = sBloomSyncStep / frameMax;
155 frameMax = sBloomSyncStep - (val) * frameMax;
156 MR::setBrkFrame(bloomModel, frameMax);
157 }
158}
159
162
163 if (_CC) {
164 mDelegator->registerCallBack();
165 }
166}
167
168bool FlipPanel::receiveOtherMsg(u32 msg, HitSensor *a2, HitSensor *a3) {
169 if (isNerve(&NrvFlipPanel::FlipPanelNrvEnd::sInstance)) {
170 return 0;
171 }
172
173 if ((msg - 0x66) <= 1) {
174 _CC = this == a2->mActor;
175 return 1;
176 }
177 else {
178 if (msg == 0x69) {
179 MR::invalidateClipping(this);
180 setNerve(&NrvFlipPanel::FlipPanelNrvEndPrepare::sInstance);
181 return 1;
182 }
183 else {
184 return 0;
185 }
186 }
187}
188
189bool FlipPanel::calcJointMove(TPos3f *pPos, const JointControllerInfo &rInfo) {
190 if (!_CC) {
191 return false;
192 }
193
194 TVec3f jointPos;
195 MR::copyJointPos(this, "Panel", &jointPos);
196 TVec3f upVec;
197 MR::calcUpVec(&upVec, this);
198 JMAVECScaleAdd((const Vec*)&upVec, (const Vec*)&jointPos, (Vec*)&jointPos, -25.0f);
199 pPos->mMtx[0][3] = jointPos.x;
200 pPos->mMtx[1][3] = jointPos.y;
201 pPos->mMtx[2][3] = jointPos.z;
202 return true;
203}
204
205bool FlipPanel::checkPlayerOnTop() {
206 if (MR::isPlayerJumpRising() && _D0) {
207 _D0 = 0;
208 return true;
209 }
210
211 if (!MR::isOnPlayer(this)) {
212 _D0 = 0;
213 return false;
214 }
215
216 TVec3f upVec;
217 MR::calcUpVec(&upVec, this);
218
219 if (!MR::getPlayerGroundingPolygon()) {
220 return false;
221 }
222
223 TVec3f* groundNormal = MR::getPlayerGroundNormal();
224
225 bool ret = JGeometry::TUtil<f32>::epsilonEquals(upVec.x, groundNormal->x, 0.0000038146973f)
226 && JGeometry::TUtil<f32>::epsilonEquals(upVec.y, groundNormal->y, 0.0000038146973f)
227 && JGeometry::TUtil<f32>::epsilonEquals(upVec.z, groundNormal->z, 0.0000038146973f);
228
229 if (!ret) {
230 _D0 = 0;
231 return false;
232 }
233
234 if (_D0 < 2) {
235 _D0 = _D0 + 1;
236 return false;
237 }
238
239 _D0 = 0;
240 return true;
241}
242
243FlipPanelObserver::FlipPanelObserver(const char *pName) : LiveActor(pName) {
244 _8C = 0;
245 _90 = 0;
246 mDemoDelay = 0;
247 mPowerStarId = -1;
248 _9C = 0;
249 sBloomSyncStep = 0;
250}
251
253 MR::initDefaultPos(this, rIter);
254 MR::connectToSceneMapObjMovement(this);
255 initHitSensor(1);
256 MR::addBodyMessageSensorMapObj(this);
257 MR::invalidateClipping(this);
258 _8C = MR::joinToGroupArray(this, rIter, 0, 0x20);
259 MR::useStageSwitchWriteA(this, rIter);
260 initSound(2, false);
261 MR::getJMapInfoArg7NoInit(rIter, &mPowerStarId);
262
263 if (mPowerStarId != -1) {
264 if (!mPowerStarId) {
265 MR::declarePowerStar(this);
266 }
267 else {
268 MR::declarePowerStar(this, mPowerStarId);
269 }
270 }
271
272 MR::getJMapInfoArg0NoInit(rIter, &mDemoDelay);
273 mDemoDelay += 0x28;
274
275 if (MR::isEqualStageName("HeavensDoorGalaxy")) {
276 _9C = 1;
277 }
278 else {
279 _9C = 0;
280 }
281
282 initNerve(&NrvFlipPanelObserver::FlipPanelObserverNrvWait::sInstance);
283 bool ret = MR::useStageSwitchReadAppear(this, rIter);
284
285 if (ret) {
286 MR::syncStageSwitchAppear(this);
287 makeActorDead();
288 }
289 else {
290 makeActorAppeared();
291 }
292}
293
294void FlipPanelObserver::exeWait() {
295 if (MR::isFirstStep(this) && MR::isValidSwitchAppear(this)) {
296 MR::callAppearAllGroupMember(this);
297 MR::startSound(this, "SE_OJ_FLIP_PANEL_APPEAR", -1, -1);
298 }
299
300 if (_90 == _8C->mObjectCount - 1 && MR::tryStartDemo(this, "FlipPanelComplete")) {
301 setNerve(&NrvFlipPanelObserver::FlipPanelObserverNrvComplete::sInstance);
302 }
303 else {
304 sBloomSyncStep++;
305 }
306}
307
308void FlipPanelObserver::exeComplete() {
309 if (MR::isFirstStep(this)) {
310 MR::callRequestMovementOnAllGroupMember(this);
311 MR::requestMovementOn(_8C);
312 MR::sendMsgToGroupMember(0x69, this, getSensor(0), "body");
313 }
314
315 if (MR::isGreaterStep(this, mDemoDelay)) {
316 MR::endDemo(this, "FlipPanelComplete");
317
318 if (mPowerStarId != -1) {
319 if (!mPowerStarId) {
320 MR::requestAppearPowerStar(this, mPosition);
321 }
322 else {
323 MR::requestAppearPowerStar(this, mPowerStarId, mPosition);
324 }
325 }
326
327 setNerve(&NrvFlipPanelObserver::FlipPanelObserverNrvDemoWait::sInstance);
328 }
329}
330
331void FlipPanelObserver::exeDemoWait() {
332 if (!MR::isDemoActive()) {
333 if (MR::isValidSwitchA(this)) {
334 MR::onSwitchA(this);
335 }
336
337 makeActorDead();
338 }
339}
340
341void FlipPanelObserver::initAfterPlacement() {
342 if (MR::isValidSwitchAppear(this)) {
343 MR::callMakeActorDeadAllGroupMember(this);
344 }
345}
346
347bool FlipPanelObserver::receiveOtherMsg(u32 msg, HitSensor *a2, HitSensor *a3) {
348 if (msg == 0x66) {
349 if (!_90) {
350 if (_9C) {
351 MR::startSystemME("ME_FLIP_PANEL_INV_OFF_FIRST");
352 }
353 else {
354 MR::startSystemME("ME_FLIP_PANEL_ON_FIRST");
355 }
356 }
357 else {
358 if (_9C) {
359 MR::startSystemME("ME_FLIP_PANEL_INV_OFF");
360 }
361 else {
362 MR::startSystemME("ME_FLIP_PANEL_ON");
363 }
364 }
365
366 _90++;
367 return 1;
368 }
369 else if (msg == 0x67) {
370 if (_9C) {
371 MR::startSystemME("ME_FLIP_PANEL_INV_ON");
372 }
373 else {
374 MR::startSystemME("ME_FLIP_PANEL_OFF");
375 }
376
377 _90--;
378 return 1;
379 }
380
381 return 0;
382}
383
384namespace NrvFlipPanel {
385 FlipPanelNrvFrontLand FlipPanelNrvFrontLand::sInstance;
386 FlipPanelNrvBackLand FlipPanelNrvBackLand::sInstance;
387 FlipPanelNrvFront FlipPanelNrvFront::sInstance;
388 FlipPanelNrvBack FlipPanelNrvBack::sInstance;
389 FlipPanelNrvEndPrepare FlipPanelNrvEndPrepare::sInstance;
390 FlipPanelNrvEnd FlipPanelNrvEnd::sInstance;
391};
392
393namespace NrvFlipPanelObserver {
394 FlipPanelObserverNrvWait FlipPanelObserverNrvWait::sInstance;
395 FlipPanelObserverNrvComplete FlipPanelObserverNrvComplete::sInstance;
396 FlipPanelObserverNrvDemoWait FlipPanelObserverNrvDemoWait::sInstance;
397};
398
399void NrvFlipPanelObserver::FlipPanelObserverNrvDemoWait::execute(Spine *pSpine) const {
400 FlipPanelObserver* obs = reinterpret_cast<FlipPanelObserver*>(pSpine->mExecutor);
401 obs->exeDemoWait();
402}
403
404void NrvFlipPanelObserver::FlipPanelObserverNrvComplete::execute(Spine *pSpine) const {
405 FlipPanelObserver* obs = reinterpret_cast<FlipPanelObserver*>(pSpine->mExecutor);
406 obs->exeComplete();
407}
408
409void NrvFlipPanelObserver::FlipPanelObserverNrvWait::execute(Spine *pSpine) const {
410 FlipPanelObserver* obs = reinterpret_cast<FlipPanelObserver*>(pSpine->mExecutor);
411 obs->exeWait();
412}
413
414void NrvFlipPanel::FlipPanelNrvEnd::execute(Spine *pSpine) const {
415 FlipPanel* panel = reinterpret_cast<FlipPanel*>(pSpine->mExecutor);
416 panel->exeEnd();
417}
418
419void NrvFlipPanel::FlipPanelNrvEndPrepare::execute(Spine *pSpine) const {
420 FlipPanel* panel = reinterpret_cast<FlipPanel*>(pSpine->mExecutor);
421
422 if (MR::isStep(panel, 0x14)) {
423 panel->setNerve(&NrvFlipPanel::FlipPanelNrvEnd::sInstance);
424 }
425}
426
427void NrvFlipPanel::FlipPanelNrvBack::execute(Spine *pSpine) const {
428 FlipPanel* panel = reinterpret_cast<FlipPanel*>(pSpine->mExecutor);
429 panel->exeWait();
430}
431
432void NrvFlipPanel::FlipPanelNrvFront::execute(Spine *pSpine) const {
433 FlipPanel* panel = reinterpret_cast<FlipPanel*>(pSpine->mExecutor);
434 panel->exeWait();
435}
436
437void NrvFlipPanel::FlipPanelNrvBackLand::execute(Spine *pSpine) const {
438 FlipPanel* panel = reinterpret_cast<FlipPanel*>(pSpine->mExecutor);
439 panel->exeBackLand();
440}
441
442void NrvFlipPanel::FlipPanelNrvFrontLand::execute(Spine *pSpine) const {
443 FlipPanel* panel = reinterpret_cast<FlipPanel*>(pSpine->mExecutor);
444 panel->exeFrontLand();
445}
446
447FlipPanel::~FlipPanel() {
448
449}
450
451FlipPanelObserver::~FlipPanelObserver() {
452
453}
virtual void init(const JMapInfoIter &)
Intializes the NameObj and can set various settings and construct necessary classes.
Definition FlipPanel.cpp:16
virtual void calcAndSetBaseMtx()
Calculates and sets the base matrix of the actor.
virtual void init(const JMapInfoIter &)
Intializes the NameObj and can set various settings and construct necessary classes.
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.
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.
Definition Spine.hpp:9