SMG-Decomp
A decompilation of Super Mario Galaxy 1
Loading...
Searching...
No Matches
CrystalCageMoving.cpp
1#include "Game/MapObj/CrystalCageMoving.hpp"
2#include "JSystem/JMath/JMath.hpp"
3
4CrystalCageMoving::CrystalCageMoving(const char *pName) : MapObjActor(pName) {
5 mTicoModel = nullptr;
6 mCameraInfo = nullptr;
7 _FC.x = 0.0f;
8 _FC.y = 0.0f;
9 _FC.z = 0.0f;
10 _108 = 0;
11 _C8.identity();
12}
13
15 MapObjActor::init(rIter);
17 info.setupHioNode("地形オブジェ");
18 info.setupDefaultPos();
19 info.setupConnectToScene();
20 info.setupEffect(0);
21 info.setupSound(4);
22 info.setupNerve(&NrvCrystalCageMoving::CrystalCageMovingNrvWaitBig::sInstance);
23 info.setupRailMover();
24 info.setupHitSensorCallBack();
25
26 TVec3f vec;
27 vec.x = 0.0f;
28 vec.y = 0.0f;
29 vec.z = 0.0f;
30 info.setupHitSensorParam(4, 350.0f, vec);
31 initialize(rIter, info);
32 _FC.set<f32>(mPosition);
33 initDummyModel(rIter);
34 MR::initActorCamera(this, rIter, &mCameraInfo);
35 MR::startBck(this, "Wait", nullptr);
36
37 if (MR::isDemoExist("脱出スピドラ出現")) {
38 MR::registerDemoActionNerve(this, &NrvCrystalCageMoving::CrystalCageMovingNrvDemoTicoMove::sInstance, nullptr);
39 }
40}
41
42void CrystalCageMoving::exeBreakBig() {
43 if (MR::isFirstStep(this)) {
44 MR::startBck(this, "CoreWait", nullptr);
45 MR::startActorCameraNoTarget(this, mCameraInfo, -1);
46 MR::setSensorRadius(this, "body", 30.0f);
47 _108 = 1;
48 MR::emitEffect(this, "BreakOutside");
49 MR::startSound(this, "SE_OJ_CRY_CAGE_MV_BREAK_EDG", -1, -1);
50 }
51
52 if (MR::isStep(this, 10)) {
53 setNerve(&NrvCrystalCageMoving::CrystalCageMovingNrvWaitSmall::sInstance);
54 }
55}
56
57void CrystalCageMoving::exeBreakSmall() {
58 if (MR::isFirstStep(this)) {
59 startBreakDemo();
60 MR::emitEffect(this, "BreakInside");
61 MR::startSound(this, "SE_OJ_CRY_CAGE_MV_BREAK_OUT", -1, -1);
62 }
63}
64
65void CrystalCageMoving::exeBreakAll() {
66 if (MR::isFirstStep(this)) {
67 startBreakDemo();
68 MR::emitEffect(this, "BreakOutside");
69 MR::emitEffect(this, "BreakInside");
70 MR::startSound(this, "SE_OJ_CRY_CAGE_MV_BREAK_ALL", -1, -1);
71 }
72}
73
74void CrystalCageMoving::exeDemoTicoMove() {
75 if (MR::isFirstStep(this)) {
76 MR::startBck(mTicoModel, "Fly", nullptr);
77 MR::startSound(mTicoModel, "SE_SM_TICO_SPIN", -1, -1);
78 }
79
80 TVec3f stack_14;
81 stack_14.subInline2(_FC, mPosition);
82 f32 nerveRate = MR::calcNerveRate(this, 0x1E);
83 TVec3f stack_8;
84 JMAVECScaleAdd(stack_14.toCVec(), mPosition.toCVec(), stack_8.toVec(), nerveRate);
85 _C8.setTrans(stack_8);
86
87 if (MR::isStep(this, 0x1E)) {
88 setNerve(&NrvCrystalCageMoving::CrystalCageMovingNrvDemoTicoStop::sInstance);
89 }
90}
91
92void CrystalCageMoving::exeDemoTicoStop() {
93 if (MR::isFirstStep(this)) {
94 _C8.set(getBaseMtx());
95 _C8.setTrans(_FC);
96 MR::setBckRate(mTicoModel, 1.5f);
97 }
98
99 if (MR::isStep(this, 30)) {
100 setNerve(&NrvCrystalCageMoving::CrystalCageMovingNrvDemoTicoChange::sInstance);
101 }
102}
103
104void CrystalCageMoving::exeDemoTicoChange() {
105 if (MR::isFirstStep(this)) {
106 MR::startBck(mTicoModel, "Metamorphosis", nullptr);
107 MR::startSound(mTicoModel, "SE_SM_TICO_METAMORPHOSE", -1, -1);
108 MR::setBckRate(mTicoModel, 1.5f);
109 }
110
111 if (MR::isBckStopped(mTicoModel)) {
112 kill();
113 }
114}
115
116void CrystalCageMoving::kill() {
117 if (mTicoModel) {
118 mTicoModel->kill();
119 }
120
121 MapObjActor::kill();
122}
123
124void CrystalCageMoving::control() {
125 if (!isNerveTypeEnd()) {
126 MapObjActor::control();
127 _C8.set(MR::getJointMtx(this, 0));
128 TVec3f trans;
129 PSMTXMultVec(_C8.toMtxPtr(), sDummyModelOffset.toCVec(), trans.toVec());
130 _C8.setTrans(trans);
131 }
132}
133
134bool CrystalCageMoving::receiveOtherMsg(u32 msg, HitSensor *a2, HitSensor *a3) {
135 if (isNerveTypeEnd()) {
136 return false;
137 }
138
139 if (msg == 69) {
140 crashMario(a2, a3);
141 return true;
142 }
143
144 return false;
145}
146
147void CrystalCageMoving::crashMario(HitSensor *a1, HitSensor *a2) {
148 MR::tryRumblePadVeryStrong(this, 0);
149 MR::shakeCameraVeryStrong();
150
151 if (_108) {
152 setNerve(&NrvCrystalCageMoving::CrystalCageMovingNrvBreakSmall::sInstance);
153 }
154 else {
155 f32 sensorDist = PSVECDistance(a2->mPosition.toCVec(), a1->mPosition.toCVec());
156 f32 sensorObjDist = PSVECDistance(mPosition.toCVec(), a1->mPosition.toCVec());
157
158 if (sensorDist < 30.0f && sensorObjDist < 450.0f) {
159 setNerve(&NrvCrystalCageMoving::CrystalCageMovingNrvBreakAll::sInstance);
160 }
161 else {
162 setNerve(&NrvCrystalCageMoving::CrystalCageMovingNrvBreakBig::sInstance);
163 }
164 }
165}
166
167void CrystalCageMoving::updateHitSensor(HitSensor *pSensor) {
168 if (!_108) {
169 pSensor->mPosition.set<f32>(mPosition);
170 }
171 else {
172 f32 radius = pSensor->mRadius;
173 TMtx34f joint_mtx;
174 joint_mtx.set(MR::getJointMtx(this, nullptr));
175 TVec3f joint_pos;
176 f32 z = joint_mtx.mMtx[2][1];
177 f32 y = joint_mtx.mMtx[1][1];
178 f32 x = joint_mtx.mMtx[0][1];
179 joint_pos.set<f32>(x, y, z);
180 TVec3f stack_14;
181 JMAVECScaleAdd(joint_pos.toCVec(), mPosition.toCVec(), stack_14.toVec(), (-450.0f + radius));
182 TVec3f stack_8;
183 JMAVECScaleAdd(joint_pos.toCVec(), mPosition.toCVec(), stack_8.toVec(), (450.0f - radius));
184 MR::calcPerpendicFootToLineInside(&pSensor->mPosition, *MR::getPlayerPos(), stack_14, stack_8);
185 }
186}
187
188void CrystalCageMoving::connectToScene(const MapObjActorInitInfo &rInfo) {
189 if (rInfo.mConnectToScene) {
190 MR::connectToSceneCrystal(this);
191 }
192}
193
194void CrystalCageMoving::initDummyModel(const JMapInfoIter &rIter) {
195 _C8.set(MR::getJointMtx(this, 0));
196 TVec3f stack_8;
197 PSMTXMultVec(_C8.toMtxPtr(), sDummyModelOffset.toCVec(), stack_8.toVec());
198 _C8.setTrans(stack_8);
199 mTicoModel = new ModelObj("動くクリスタルケージ中身", "Tico", _C8.toMtxPtr(), 0x21, -2, -2, false);
200 mTicoModel->initWithoutIter();
201 ModelObj* tico = mTicoModel;
202 tico->mScale.x = 3.0f;
203 tico->mScale.y = 3.0f;
204 tico->mScale.z = 3.0f;
205 MR::startBrk(mTicoModel, "ColorChange");
206 MR::setBrkFrameAndStop(mTicoModel, 0.0f);
207
208 if (MR::isDemoCast(this, nullptr)) {
209 MR::tryRegisterDemoCast(mTicoModel, rIter);
210 }
211}
212
213void CrystalCageMoving::startBreakDemo() {
214 MR::startSound(this, "SE_OJ_CRY_CAGE_MV_TICO_APR", -1, -1);
215 MR::requestStartTimeKeepDemo(this, "脱出スピドラ出現", nullptr, nullptr, "クリスタル破壊");
216 MR::hideModel(this);
217 ModelObj* tico = mTicoModel;
218 tico->mScale.x = 1.0f;
219 tico->mScale.y = 1.0f;
220 tico->mScale.z = 1.0f;
221}
222
223bool CrystalCageMoving::isNerveTypeEnd() const {
224 bool ret = false;
225
226 if (isNerve(&NrvCrystalCageMoving::CrystalCageMovingNrvBreakBig::sInstance) ||
227 isNerve(&NrvCrystalCageMoving::CrystalCageMovingNrvBreakSmall::sInstance) ||
228 isNerve(&NrvCrystalCageMoving::CrystalCageMovingNrvBreakAll::sInstance) ||
229 isNerve(&NrvCrystalCageMoving::CrystalCageMovingNrvDemoTicoMove::sInstance) ||
230 isNerve(&NrvCrystalCageMoving::CrystalCageMovingNrvDemoTicoStop::sInstance) ||
231 isNerve(&NrvCrystalCageMoving::CrystalCageMovingNrvDemoTicoChange::sInstance)) {
232 ret = true;
233 }
234
235 return ret;
236}
237
238CrystalCageMoving::~CrystalCageMoving() {
239
240}
241
242namespace NrvCrystalCageMoving {
243 INIT_NERVE(CrystalCageMovingNrvWaitBig);
244 INIT_NERVE(CrystalCageMovingNrvBreakBig);
245 INIT_NERVE(CrystalCageMovingNrvWaitSmall);
246 INIT_NERVE(CrystalCageMovingNrvBreakSmall);
247 INIT_NERVE(CrystalCageMovingNrvBreakAll);
248 INIT_NERVE(CrystalCageMovingNrvDemoTicoMove);
249 INIT_NERVE(CrystalCageMovingNrvDemoTicoStop);
250 INIT_NERVE(CrystalCageMovingNrvDemoTicoChange);
251
252 void CrystalCageMovingNrvDemoTicoChange::execute(Spine *pSpine) const {
253 CrystalCageMoving* cage = reinterpret_cast<CrystalCageMoving*>(pSpine->mExecutor);
254 cage->exeDemoTicoChange();
255 }
256
257 void CrystalCageMovingNrvDemoTicoStop::execute(Spine *pSpine) const {
258 CrystalCageMoving* cage = reinterpret_cast<CrystalCageMoving*>(pSpine->mExecutor);
259 cage->exeDemoTicoStop();
260 }
261
262 void CrystalCageMovingNrvDemoTicoMove::execute(Spine *pSpine) const {
263 CrystalCageMoving* cage = reinterpret_cast<CrystalCageMoving*>(pSpine->mExecutor);
264 cage->exeDemoTicoMove();
265 }
266
267 void CrystalCageMovingNrvBreakAll::execute(Spine *pSpine) const {
268 CrystalCageMoving* cage = reinterpret_cast<CrystalCageMoving*>(pSpine->mExecutor);
269 cage->exeBreakAll();
270 }
271
272 void CrystalCageMovingNrvBreakSmall::execute(Spine *pSpine) const {
273 CrystalCageMoving* cage = reinterpret_cast<CrystalCageMoving*>(pSpine->mExecutor);
274 cage->exeBreakSmall();
275 }
276
277 void CrystalCageMovingNrvWaitSmall::execute(Spine *) const {
278
279 }
280
281 void CrystalCageMovingNrvBreakBig::executeOnEnd(Spine *pSpine) const {
282 CrystalCageMoving* cage = reinterpret_cast<CrystalCageMoving*>(pSpine->mExecutor);
283 MR::endActorCamera(cage, cage->mCameraInfo, true, -1);
284 }
285
286 void CrystalCageMovingNrvBreakBig::execute(Spine *pSpine) const {
287 CrystalCageMoving* cage = reinterpret_cast<CrystalCageMoving*>(pSpine->mExecutor);
288 cage->exeBreakBig();
289 }
290
291 void CrystalCageMovingNrvWaitBig::execute(Spine *) const {
292
293 }
294};
virtual void init(const JMapInfoIter &)
Intializes the NameObj and can set various settings and construct necessary classes.
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 MtxPtr getBaseMtx() const
Gets the base matrix of the model used for the actor.
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