SMG-Decomp
A decompilation of Super Mario Galaxy 1
Loading...
Searching...
No Matches
SuperSpinDriver.cpp
1#include "Game/MapObj/SuperSpinDriver.hpp"
2
3/* it seems like this file was compiled with an earlier compiler version */
4
5bool SuperSpinDriver::tryEndCapture() {
6 if (MR::isGreaterStep(this, 60) && PSVECDistance(_C4.toCVec(), mPosition.toCVec()) < 15.0f) {
7 cancelBind();
8 _174 = 0;
9 setNerve(&NrvSuperSpinDriver::SuperSpinDriverNrvWait::sInstance);
10 return true;
11 }
12
13 return false;
14}
15
16bool SuperSpinDriver::tryForceCancel() {
17 if (_8C == nullptr) {
18 setNerve(&NrvSuperSpinDriver::SuperSpinDriverNrvCoolDown::sInstance);
19 return true;
20 }
21
22 return false;
23}
24
25bool SuperSpinDriver::tryShootStart() {
26 bool flag = false;
27
28 if (MR::isPadSwing(0) || MR::isPlayerPointedBy2POnTriggerButton()) {
29 flag = true;
30 }
31
32 if (flag) {
33 MR::deleteEffect(this, "SuperSpinDriverLight");
34 setNerve(&NrvSuperSpinDriver::SuperSpinDriverNrvShootStart::sInstance);
35 return true;
36 }
37
38 return false;
39}
40
41bool SuperSpinDriver::tryShoot() {
42 if (MR::isGreaterStep(this, 45)) {
43 setNerve(&NrvSuperSpinDriver::SuperSpinDriverNrvShoot::sInstance);
44 return true;
45 }
46
47 return false;
48}
49
50bool SuperSpinDriver::tryEndShoot() {
51 if (MR::isGreaterEqualStep(this, _150)) {
52 endBind();
53 setNerve(&NrvSuperSpinDriver::SuperSpinDriverNrvCoolDown::sInstance);
54 return true;
55 }
56
57 return false;
58}
59
60bool SuperSpinDriver::tryEndCoolDown() {
61 if (MR::isGreaterStep(this, 60) && _178) {
62 setNerve(&NrvSuperSpinDriver::SuperSpinDriverNrvWait::sInstance);
63 return true;
64 }
65
66 return false;
67}
68
69bool SuperSpinDriver::trySwitchOff() {
70 if (MR::isValidSwitchAppear(this) && !MR::isOnSwitchAppear(this)) {
71 kill();
72 return true;
73 }
74
75 return false;
76}
77
78void SuperSpinDriver::requestAppear() {
79 MR::invalidateClipping(this);
80
81 if (mSpinDriverCamera->isUseAppearCamera(this)) {
82 MR::requestStartDemo(this, "出現", &NrvSuperSpinDriver::SuperSpinDriverNrvAppear::sInstance, &NrvSuperSpinDriver::SuperSpinDriverNrvTryDemo::sInstance);
83 }
84 else {
85 setNerve(&NrvSuperSpinDriver::SuperSpinDriverNrvAppear::sInstance);
86 }
87}
88
89void SuperSpinDriver::requestEmptyAppear() {
90 MR::invalidateClipping(this);
91
92 if (mSpinDriverCamera->isUseAppearCamera(this)) {
93 MR::requestStartDemo(this, "出現", &NrvSuperSpinDriver::SuperSpinDriverNrvEmptyAppear::sInstance, &NrvSuperSpinDriver::SuperSpinDriverNrvTryDemo::sInstance);
94 }
95 else {
96 setNerve(&NrvSuperSpinDriver::SuperSpinDriverNrvEmptyAppear::sInstance);
97 }
98}
99
100void SuperSpinDriver::requestActive() {
101 if (isNerve(&NrvSuperSpinDriver::SuperSpinDriverNrvNonActive::sInstance)) {
102 requestAppear();
103 }
104 else if (isNerve(&NrvSuperSpinDriver::SuperSpinDriverNrvEmptyNonActive::sInstance)) {
105 requestEmptyAppear();
106 }
107}
108
109void SuperSpinDriver::requestHide() {
110 if (!MR::isDead(this)) {
111 if (_8C != nullptr) {
112 endBind();
113 }
114
115 makeActorDead();
116 }
117}
118
119void SuperSpinDriver::requestShow() {
120 if (MR::isDead(this)) {
121 makeActorAppeared();
122 }
123}
124
125void SuperSpinDriver::exeEmptyNonActive() {
126 if (MR::isFirstStep(this)) {
127 MR::validateClipping(this);
128 }
129
130 if (isRightToUse()) {
131 onUse();
132 setNerve(&NrvSuperSpinDriver::SuperSpinDriverNrvNonActive::sInstance);
133 }
134}
135
136void SuperSpinDriver::exeEmptyAppear() {
137 if (MR::isFirstStep(this)) {
138 mSpinDriverCamera->startAppearCamera(this, _100, _E8, mPosition);
139
140 if (!_17F) {
141 MR::startSystemSE("SE_SY_SPIN_DRIVER_APPEAR", -1, -1);
142 MR::startSound(this, "SE_OJ_S_SPIN_DRV_APPEAR", -1, -1);
143 }
144 }
145
146 if (MR::isBckStopped(this)) {
147 s32 frames = mSpinDriverCamera->getAppearCameraFrames();
148
149 if (MR::isGreaterStep(this, frames)) {
150 setNerve(&NrvSuperSpinDriver::SuperSpinDriverNrvEmptyWait::sInstance);
151
152 if (mSpinDriverCamera->isUseAppearCamera(this)) {
153 mSpinDriverCamera->endAppearCamera(this);
154 MR::endDemoWaitCameraInterpolating(this, "出現");
155 }
156 }
157 }
158}
159
160void SuperSpinDriver::exeEmptyWait() {
161 if (MR::isFirstStep(this)) {
162 MR::validateClipping(this);
163 }
164
165 if (isRightToUse()) {
166 onUse();
167 setNerve(&NrvSuperSpinDriver::SuperSpinDriverNrvWait::sInstance);
168 }
169}
170
171void SuperSpinDriver::exeNonActive() {
172 if (MR::isFirstStep(this)) {
173 MR::startBck(this, "NonActive", nullptr);
174 MR::validateClipping(this);
175 }
176
177 addSwingSignRotateY();
178}
179
180void SuperSpinDriver::exeAppear() {
181 if (MR::isFirstStep(this)) {
182 mSpinDriverCamera->startAppearCamera(this, _100, _E8, mPosition);
183
184 if (!_17F) {
185 MR::startSystemSE("SE_SY_SPIN_DRIVER_APPEAR", -1, -1);
186 MR::startSound(this, "SE_OJ_S_SPIN_DRV_APPEAR", -1, -1);
187 }
188
189 MR::startBck(this, "Appear", nullptr);
190 _144 = 0.0f;
191 }
192
193 if (MR::isBckStopped(this)) {
194 s32 frames = mSpinDriverCamera->getAppearCameraFrames();
195
196 if (MR::isGreaterStep(this, frames)) {
197 setNerve(&NrvSuperSpinDriver::SuperSpinDriverNrvWait::sInstance);
198
199 if (mSpinDriverCamera->isUseAppearCamera(this)) {
200 mSpinDriverCamera->endAppearCamera(this);
201 MR::endDemoWaitCameraInterpolating(this, "出現");
202 }
203 }
204 }
205}
206
207void SuperSpinDriver::exeWait() {
208 if (MR::isFirstStep(this)) {
209 MR::startBck(this, "Wait", nullptr);
210 MR::validateClipping(this);
211 }
212
213 if (MR::isGreaterStep(this, sCanBindTime)) {
214 addSwingSignRotateY();
215 }
216
217 if (_178 > 0) {
218 MR::startLevelSound(this, "SE_OJ_LV_S_SPIN_DRV_SHINE", -1, -1, -1);
219
220 if (!_17C) {
221 MR::emitEffect(this, "SuperSpinDriverLight");
222 MR::startCSSound("CS_SPIN_BIND", nullptr, 0);
223 }
224
225 }
226 else {
227 MR::deleteEffect(this, "SuperSpinDriverLight");
228 }
229
230 trySwitchOff();
231}
232
233void SuperSpinDriver::exeCapture() {
234 if (tryForceCancel()) {
235 MR::deleteEffect(this, "SuperSpinDriverLight");
236 }
237 else {
238 if (MR::isFirstStep(this)) {
239 MR::emitEffect(this, "SuperSpinDriverLight");
240 MR::startBckPlayer("SpinDriverWait", "SuperSpinDriverCapture");
241 _144 = 0.0f;
242 }
243
244 MR::startLevelSound(this, "SE_OJ_LV_S_SPIN_DRV_SHINE", -1, -1, -1);
245 MR::startLevelSound(this, "SE_OJ_LV_SPIN_DRV_CAPTURE", -1, -1, -1);
246 moveBindPosToCenter();
247 f32 rate = MR::calcNerveRate(this, 60);
248 _134 = rate;
249 updateBindActorPoseToShoot((f64)rate);
250 _144 += 0.0040000002f;
251 MR::tryRumblePadWeak(this, 0);
252 _178 = 60;
253
254 if (!tryEndCapture()) {
255 if (!tryShootStart()) {
256 return;
257 }
258 }
259 }
260}
261
262void SuperSpinDriver::updateShootMotion() {
263 if (MR::isStep(this, _154)) {
264 MR::startBckPlayer("SpaceFlyLoop", "SuperSpinDriverFlyLoop");
265 }
266
267 if (MR::isLessStep(this, _158)) {
268 MR::startLevelSound(_8C, "SE_PM_LV_S_SPIN_DRV_FLY", -1, -1, -1);
269 }
270
271 if (MR::isStep(this, _158)) {
272 MR::startBckPlayer("SpaceFlyEnd", "SuperSpinDriverFlyEnd");
273 MR::startSound(_8C, "SE_PM_S_SPIN_DRV_COOL_DOWN", -1, -1);
274 MR::startSound(_8C, "SE_PV_JUMP_S", -1, -1);
275 }
276
277 if (MR::isStep(this, _15C)) {
278 MR::startBckPlayer("Fall", "SuperSpinDriverFall");
279 }
280}
281
282void SuperSpinDriver::cancelBind() {
283 if (_8C != nullptr) {
284 MR::endBindAndPlayerJump(this, _D0, 0);
285 _8C = nullptr;
286 }
287
288 mSpinDriverCamera->cancel();
289}
290
291void SuperSpinDriver::endBind() {
292 MR::endBindAndSpinDriverJump(this, _D0);
293 _8C = nullptr;
294 mSpinDriverCamera->end();
295}
296
297void SuperSpinDriver::startPathDraw() {
298 if (mPathDrawer != nullptr) {
299 if (MR::isDead(mPathDrawer)) {
300 mPathDrawer->appear();
301 MR::emitEffect(this, "EndGlow");
302 }
303 }
304}
305
306void SuperSpinDriver::endPathDraw() {
307 if (mPathDrawer != nullptr) {
308 if (!MR::isDead(mPathDrawer)) {
309 MR::emitEffect(this, "EndGlow");
310 }
311 }
312}
313
314/*
315void SuperSpinDriver::calcShootMotionTime() {
316 if (_150 >= 20) {
317 if (_150 >= 70) {
318 _158 = _150 - 70;
319 _15C = _150 - 20;
320
321 f32 v2 = 0.2f * _150;
322
323 if (v2 > 90) {
324 v2 = 90;
325 }
326
327 _154 = 10 * (v2 / 10);
328 }
329 }
330}
331*/
332
333void SuperSpinDriver::addSwingSignRotateY() {
334 bool flag = false;
335
336 if (MR::isPadSwing(0) || MR::isPlayerPointedBy2POnTriggerButton()) {
337 flag = true;
338 }
339
340 if (flag) {
341 f32 v4 = MR::add(_144, 0.1f);
342 _144 += 0.1f;
343
344 if (v4 > 0.23f) {
345 _144 = 0.23f;
346 }
347 }
348}
349
350void SuperSpinDriver::onUse() {
351 if (mEmptyModel != nullptr) {
352 mEmptyModel->kill();
353 }
354
355 MR::showModel(this);
356}
357
358void SuperSpinDriver::offUse() {
359 if (mEmptyModel != nullptr) {
360 mEmptyModel->appear();
361 }
362
363 MR::hideModelAndOnCalcAnim(this);
364}
365
366/*
367bool SuperSpinDriver::isRightToUse() const {
368 //return (mColor == 1) ? true : MR::isOnGameEventFlagGreenDriver();
369}
370*/
371
372void SuperSpinDriver::exeCoolDown() {
373 // BUG, is supposed to be a conditional to call tryEndCoolDown
374 MR::isFirstStep(this);
375 if (!tryEndCoolDown()) {
376 trySwitchOff();
377 }
378}
379
380void SuperSpinDriver::exeShootOnEnd() {
381 MR::invalidateHitSensor(this, "body");
382 mOperateRing->reset();
383}
384
385namespace MR {
386 NameObj* createSuperSpinDriverYellow(const char *pName) {
387 return new SuperSpinDriver(pName, 0);
388 }
389
390 NameObj* createSuperSpinDriverGreen(const char *pName) {
391 return new SuperSpinDriver(pName, 1);
392 }
393
394 NameObj* createSuperSpinDriverPink(const char *pName) {
395 return new SuperSpinDriver(pName, 2);
396 }
397};
398
399namespace NrvSuperSpinDriver {
400 INIT_NERVE(SuperSpinDriverNrvTryDemo);
401 INIT_NERVE(SuperSpinDriverNrvEmptyNonActive);
402 INIT_NERVE(SuperSpinDriverNrvEmptyAppear);
403 INIT_NERVE(SuperSpinDriverNrvEmptyWait);
404 INIT_NERVE(SuperSpinDriverNrvNonActive);
405 INIT_NERVE(SuperSpinDriverNrvAppear);
406 INIT_NERVE(SuperSpinDriverNrvWait);
407 INIT_NERVE(SuperSpinDriverNrvCapture);
408 INIT_NERVE(SuperSpinDriverNrvShootStart);
409 INIT_NERVE(SuperSpinDriverNrvShoot);
410 INIT_NERVE(SuperSpinDriverNrvCoolDown);
411};
TVec3f mPosition
3D vector of the actor's position.
Definition LiveActor.hpp:95
The most basic form of an object.
Definition NameObj.hpp:11