SMG-Decomp
A decompilation of Super Mario Galaxy 1
Loading...
Searching...
No Matches
GreenCaterpillarBig.cpp
1#include "Game/MapObj/GreenCaterpillarBig.hpp"
2
3GreenCaterpillarBigBody::GreenCaterpillarBigBody(LiveActor *pCaterpillar, MtxPtr mtx) :
4 ModelObj("オオムイムイ体", "GreenCaterpillarBigBody", mtx, -2, -2, -2, false) {
5 mCaterpillar = pCaterpillar;
6 mFrontVec.x = 0.0f;
7 mFrontVec.y = 0.0f;
8 mFrontVec.z = 1.0f;
9 mPlanetLOD = nullptr;
10 }
11
13 MR::invalidateClipping(this);
14 mPlanetLOD = MR::createLodCtrlPlanet(this, rIter, -1.0f, -1);
15 mPlanetLOD->validate();
16 MR::calcFrontVec(&mFrontVec, mCaterpillar);
17 MR::startBck(this, "Wait", nullptr);
18 makeActorDead();
19}
20
21void GreenCaterpillarBigBody::setPosAndDirection(LiveActor *pActor) {
22 TVec3f jointPos;
23 MR::copyJointPos(mCaterpillar, "FollowPoint", &jointPos);
24 mPosition.setInline(jointPos);
25 calcBodyDir(pActor, &mFrontVec);
26
27 mScale.x = 1.0f;
28 mScale.y = 1.0f;
29 mScale.z = 1.0f;
30}
31
32void GreenCaterpillarBigBody::control() {
33 mPlanetLOD->update();
34}
35
37 if (MR::isNearZero(mFrontVec, 0.001f)) {
39 }
40 else {
41 MtxPtr jointMtx = MR::getJointMtx(mCaterpillar, "FollowPoint");
42 TVec3f pos;
43 pos.set(jointMtx[0][1], jointMtx[1][1], jointMtx[2][1]);
44 TPos3f frontUpPos;
45 MR::makeMtxFrontUpPos(&frontUpPos, mFrontVec, pos, mPosition);
46 MR::setBaseTRMtx(this, frontUpPos);
47 }
48}
49
50void GreenCaterpillarBigBody::calcBodyDir(LiveActor *pActor, TVec3f *pOutDir) {
51 f32 nearRailCoord = MR::calcNearestRailCoord(pActor, mPosition);
52 f32 coord = nearRailCoord - 300.0f;
53 if (coord <= 0.0f) {
54 MR::calcRailDirectionAtCoord(pOutDir, pActor, nearRailCoord);
55 }
56 else {
57 TVec3f railPos;
58 MR::calcRailPosAtCoord(&railPos, pActor, coord);
59 TVec3f stack_8;
60 stack_8.subInline3(mPosition, railPos);
61 MR::normalize(&stack_8);
62 MR::blendVec(pOutDir->toVec(), *pOutDir->toCVec(), *stack_8.toCVec(), 0.1f);
63 }
64}
65
66GreenCaterpillarBig::GreenCaterpillarBig(const char *pName) : LiveActor(pName) {
67 mBodyArray = nullptr;
68 mBodyArrayLength = 0;
69 mCurBodyParts = 0;
70 _98 = 0;
71 _9C = 0;
72 _9D = 0;
73 mPlanetLOD = nullptr;
74}
75
77 MR::initDefaultPos(this, rIter);
78 initModelManagerWithAnm("GreenCaterpillarBigFace", nullptr, false);
79 MR::connectToSceneMapObj(this);
80 initHitSensor(1);
81 MR::addBodyMessageSensorMapObj(this);
82 initEffectKeeper(0, nullptr, false);
83 initSound(6, false);
84 initRailRider(rIter);
85 initBodyParts(rIter);
86 MR::hideModel(this);
87 MR::invalidateClipping(this);
88 mPlanetLOD = MR::createLodCtrlPlanet(this, rIter, -1.0f, -1);
89 mPlanetLOD->validate();
90 initNerve(&NrvGreenCaterpillarBig::GreenCaterpillarBigNrvHide::sInstance);
91 makeActorAppeared();
92}
93
94void GreenCaterpillarBig::startWriggle() {
95 setNerve(&NrvGreenCaterpillarBig::GreenCaterpillarBigNrvWriggle::sInstance);
96}
97
98void GreenCaterpillarBig::exeWriggle() {
99 if (MR::isFirstStep(this)) {
100 if (MR::isHiddenModel(this)) {
101 MR::showModel(this);
102 }
103
104 MR::startBck(this, "Eat", nullptr);
105 }
106
107 MR::moveCoordAndFollowTrans(this, 50.0f);
108 MR::startLevelSound(this, "SE_OJ_LV_GRN_CATERP_MOVE", -1, -1, -1);
109
110 if (MR::isRailReachedGoal(this)) {
111 setNerve(&NrvGreenCaterpillarBig::GreenCaterpillarBigNrvEndAdjust::sInstance);
112 }
113 else {
114 _9C = 0;
115 _9D = 0;
116
117 bool isNotEqual = MR::getCurrentRailPointNo(this) != _98;
118
119 if (isNotEqual) {
120 _98 = MR::getCurrentRailPointNo(this);
121 f32 point_arg = -1.0f;
122 MR::getRailPointArg0NoInit(this, _98, &point_arg);
123
124 if (point_arg == 0.0f) {
125 _9C = 1;
126 MR::tryRumblePadStrong(this, 0);
127 MR::shakeCameraNormal();
128 MR::startSound(this, "SE_OJ_GRN_CATERP_IN", -1, -1);
129 }
130 else if (point_arg == 1.0f) {
131 setNerve(&NrvGreenCaterpillarBig::GreenCaterpillarBigNrvRest::sInstance);
132 }
133 else if (point_arg == 2.0f) {
134 leaveApple();
135 }
136 }
137 }
138}
139
140void GreenCaterpillarBig::initBodyParts(const JMapInfoIter &rIter) {
141 s32 count = MR::getRailTotalLength(this) / 300.0f;
142 mBodyArrayLength = count;
143 mBodyArray = new GreenCaterpillarBigBody*[count];
144 GreenCaterpillarBig* caterpillar = this;
145
146 for (s32 i = 0; i < mBodyArrayLength; i++) {
147 MtxPtr jointMtx = MR::getJointMtx(caterpillar, "FollowPoint");
148 mBodyArray[i] = new GreenCaterpillarBigBody(caterpillar, jointMtx);
149 mBodyArray[i]->init(rIter);
150 caterpillar = reinterpret_cast<GreenCaterpillarBig*>(mBodyArray[i]);
151 }
152}
153
154bool GreenCaterpillarBig::tryGenerateBodyParts() {
155 if (mCurBodyParts >= mBodyArrayLength) {
156 return false;
157 }
158
159 f32 coord = !mCurBodyParts ? MR::getRailCoord(this) : MR::calcNearestRailCoord(this, mBodyArray[mCurBodyParts - 1]->mPosition);
160
161 if (coord < 300.0f) {
162 return false;
163 }
164
165 mBodyArray[mCurBodyParts]->appear();
166 mCurBodyParts++;
167 return true;
168}
169
170void GreenCaterpillarBig::control() {
171 if (!isNerve(&NrvGreenCaterpillarBig::GreenCaterpillarBigNrvHide::sInstance)) {
172 if (!isNerve(&NrvGreenCaterpillarBig::GreenCaterpillarBigNrvEnd::sInstance)) {
173 tryGenerateBodyParts();
174 }
175
176 fixBodyPartsOnRail();
177 mPlanetLOD->update();
178 }
179}
180
182 TPos3f mtx;
183 MR::calcMtxFromGravityAndZAxis(&mtx, this, mGravity, MR::getRailDirection(this));
184 MR::setBaseTRMtx(this, mtx);
185}
186
187void GreenCaterpillarBig::startClipped() {
188 for (s32 i = 0; i < mCurBodyParts; i++) {
189 MR::validateClipping(mBodyArray[i]);
190 }
191
192 LiveActor::startClipped();
193}
194
195void GreenCaterpillarBig::endClipped() {
196 for (s32 i = 0; i < mCurBodyParts; i++) {
197 MR::invalidateClipping(mBodyArray[i]);
198 }
199
200 LiveActor::endClipped();
201}
202
203void GreenCaterpillarBig::fixBodyPartsOnRail() {
204 for (s32 i = 0; i < mCurBodyParts; i++) {
205 mBodyArray[i]->setPosAndDirection(this);
206 }
207}
208
209void GreenCaterpillarBig::leaveApple() {
210 _9D = 1;
211 MR::tryRumblePadStrong(this, 0);
212 MR::shakeCameraNormal();
213 MR::startSound(this, "SE_OJ_GRN_CATERP_DAMAGE", -1, -1);
214 MR::startSound(this, "SE_OJ_GRN_CATERP_OUT", -1, -1);
215}
216
217GreenCaterpillarBigBody::~GreenCaterpillarBigBody() {
218
219}
220
221GreenCaterpillarBig::~GreenCaterpillarBig() {
222
223}
224
225namespace NrvGreenCaterpillarBig {
226 INIT_NERVE(GreenCaterpillarBigNrvHide);
227 INIT_NERVE(GreenCaterpillarBigNrvWriggle);
228 INIT_NERVE(GreenCaterpillarBigNrvRest);
229 INIT_NERVE(GreenCaterpillarBigNrvEndAdjust);
230 INIT_NERVE(GreenCaterpillarBigNrvEnd);
231
232 void GreenCaterpillarBigNrvEnd::execute(Spine *pSpine) const {
233 GreenCaterpillarBig* caterpillar = reinterpret_cast<GreenCaterpillarBig*>(pSpine->mExecutor);
234 if (MR::isFirstStep(caterpillar)) {
235 MR::startBck(caterpillar, "Wait", nullptr);
236 }
237 }
238
239 void GreenCaterpillarBigNrvEndAdjust::execute(Spine *pSpine) const {
240 GreenCaterpillarBig* caterpillar = reinterpret_cast<GreenCaterpillarBig*>(pSpine->mExecutor);
241 if (MR::isStep(caterpillar, 0x78)) {
242 caterpillar->setNerve(&NrvGreenCaterpillarBig::GreenCaterpillarBigNrvEnd::sInstance);
243 }
244 }
245
246 void GreenCaterpillarBigNrvRest::execute(Spine *pSpine) const {
247 GreenCaterpillarBig* caterpillar = reinterpret_cast<GreenCaterpillarBig*>(pSpine->mExecutor);
248 MR::startLevelSound(caterpillar, "SE_OJ_LV_GRN_CATERP_EAT", -1, -1, -1);
249 }
250
251 void GreenCaterpillarBigNrvWriggle::execute(Spine *pSpine) const {
252 GreenCaterpillarBig* caterpillar = reinterpret_cast<GreenCaterpillarBig*>(pSpine->mExecutor);
253 caterpillar->exeWriggle();
254 }
255
256 void GreenCaterpillarBigNrvHide::execute(Spine *pSpine) const {
257 GreenCaterpillarBig* caterpillar = reinterpret_cast<GreenCaterpillarBig*>(pSpine->mExecutor);
258 MR::startLevelSound(caterpillar, "SE_OJ_LV_GRN_CATERP_EAT", -1, -1, -1);
259 }
260};
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.
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 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
virtual void calcAndSetBaseMtx()
Calculates and sets the base matrix of the actor.
TVec3f mGravity
3D vector of the actor's gravity.
Definition LiveActor.hpp:99
Definition Spine.hpp:9