SMG-Decomp
A decompilation of Super Mario Galaxy 1
Loading...
Searching...
No Matches
AirBubble.cpp
1#include "Game/MapObj/AirBubble.hpp"
2
3AirBubble::AirBubble(const char *pName) : LiveActor(pName) {
4 _A4.x = 0.0f;
5 _A4.y = 0.0f;
6 _A4.z = 1.0f;
7 _B0 = 0.0f;
8 _C4 = 360;
9}
10
11void AirBubble::init(const JMapInfoIter &rIter) {
12 MR::initDefaultPos(this, rIter);
13 MR::useStageSwitchWriteDead(this, rIter);
14 initModelManagerWithAnm("AirBubble", nullptr, false);
15 MR::connectToSceneItem(this);
16 initHitSensor(1);
17 MR::addHitSensorMapObj(this, "body", 8, 130.0f * mScale.x, TVec3f(0.0f, 0.0f, 0.0f));
18 initEffectKeeper(0, nullptr, false);
19 initSound(2, false);
20 initNerve(&NrvAirBubble::AirBubbleNrvWait::sInstance);
21 _C8 = 0;
22 makeActorAppeared();
23 MR::setClippingFar100m(this);
24 MR::startBck(this, "Move", nullptr);
25 _C9 = 0;
26}
27
28void AirBubble::initAfterPlacement() {
29 if (_C8) {
30 MR::moveCoordAndTransToNearestRailPos(this);
31 }
32
33 _8C = mPosition;
34}
35
36void AirBubble::appear() {
37 LiveActor::appear();
38}
39
40void AirBubble::kill() {
41 if (MR::isValidSwitchDead(this)) {
42 MR::onSwitchDead(this);
43 }
44
45 LiveActor::kill();
46}
47
48void AirBubble::control() {
49
50}
51
52void AirBubble::appearMove(const TVec3f &a1, s32 a2) {
53 _8C.set(a1);
54 mPosition.set(a1);
55 appear();
56 MR::showModel(this);
57 setNerve(&NrvAirBubble::AirBubbleNrvMove::sInstance);
58 MR::invalidateClipping(this);
59 _C4 = a2 > 0 ? a2 : 360;
60}
61
62void AirBubble::exeBreak() {
63 if (MR::isFirstStep(this)) {
64 MR::startSound(this, "SE_OJ_AIR_BUBBLE_BREAK", -1, -1);
65 MR::emitEffect(this, "RecoveryBubbleBreak");
66 MR::incPlayerOxygen(8);
67 MR::tryRumblePadMiddle(this, 0);
68 kill();
69 }
70}
71
72bool AirBubble::receiveMsgPush(HitSensor *a2, HitSensor *a3) {
73 if (MR::isSensorPlayer(a2)) {
74 if (isNerve(&NrvAirBubble::AirBubbleNrvKillWait::sInstance)) {
75 MR::incPlayerOxygen(8);
76 kill();
77 return true;
78 }
79 else {
80 setNerve(&NrvAirBubble::AirBubbleNrvBreak::sInstance);
81 }
82
83 return true;
84 }
85
86 return false;
87}
88
89bool AirBubble::receiveOtherMsg(u32 msg, HitSensor *a2, HitSensor *a3) {
90 bool res;
91
92 if (MR::isMsgItemShow(msg)) {
93 return MR::receiveItemShowMsg(msg, a2, a3);
94 }
95
96 if (MR::isMsgItemHide(msg)) {
97 return MR::receiveItemHideMsg(msg, a2, a3);
98 }
99
100 if (MR::isMsgItemStartMove(msg)) {
101 _C9 = 1;
102 return true;
103 }
104 else if (MR::isMsgItemEndMove(msg)) {
105 _C9 = 0;
106 _8C = mPosition;
107 return true;
108 }
109 else if (MR::isMsgSpinStormRange(msg) && canSpinGet()) {
110 TVec3f stack_8(a2->mPosition);
111 stack_8 -= mPosition;
112
113 if (PSVECMag(stack_8.toCVec()) < 250.0f) {
114 setNerve(&NrvAirBubble::AirBubbleNrvBreak::sInstance);
115 return true;
116 }
117 }
118
119 return false;
120}
121
122bool AirBubble::canSpinGet() const {
123 if (isNerve(&NrvAirBubble::AirBubbleNrvWait::sInstance) || isNerve(&NrvAirBubble::AirBubbleNrvMove::sInstance)) {
124 return true;
125 }
126
127 return false;
128}
129
130AirBubble::~AirBubble() {
131
132}
133
134namespace NrvAirBubble {
135 INIT_NERVE(AirBubbleNrvWait);
136 INIT_NERVE(AirBubbleNrvMove);
137 INIT_NERVE(AirBubbleNrvBreak);
138 INIT_NERVE(AirBubbleNrvKillWait);
139
140 void AirBubbleNrvKillWait::execute(Spine *pSpine) const {
141 AirBubble* bubble = reinterpret_cast<AirBubble*>(pSpine->mExecutor);
142
143 if (MR::isGreaterStep(bubble, 90)) {
144 bubble->kill();
145 }
146 }
147
148 void AirBubbleNrvBreak::execute(Spine *pSpine) const {
149 AirBubble* bubble = reinterpret_cast<AirBubble*>(pSpine->mExecutor);
150 bubble->exeBreak();
151 }
152
153 void AirBubbleNrvMove::execute(Spine *pSpine) const {
154 AirBubble* bubble = reinterpret_cast<AirBubble*>(pSpine->mExecutor);
155 bubble->exeMove();
156 }
157
158 void AirBubbleNrvWait::execute(Spine *pSpine) const {
159 AirBubble* bubble = reinterpret_cast<AirBubble*>(pSpine->mExecutor);
160 bubble->exeWait();
161 }
162};
virtual void init(const JMapInfoIter &)
Intializes the NameObj and can set various settings and construct necessary classes.
Definition AirBubble.cpp:11
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
TVec3f mScale
3D vector of the actor's scale.
Definition LiveActor.hpp:97
Definition Spine.hpp:9