SMG-Decomp
A decompilation of Super Mario Galaxy 1
Loading...
Searching...
No Matches
MarioSwim.cpp
1#include "Game/Player/MarioSwim.hpp"
2#include "Game/AreaObj/AreaObj.hpp"
3#include "Game/Player/MarineSnow.hpp"
4#include "Game/Player/MarioActor.hpp"
5#include "Game/Player/MarioAnimator.hpp"
6#include "Game/Player/MarioConst.hpp"
7#include "Game/Screen/GameSceneLayoutHolder.hpp"
8#include "Game/Util/SceneUtil.hpp"
9
10namespace {
11 f32 cFrontAcc[40] = {-0.2f, -0.2f, -0.2f, -0.1f, -0.1f, -0.1f, -0.1f, -0.1f, -0.0f, -0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.2f, 0.2f, 0.2f, 0.3f, 0.3f, 0.4f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.4f, 0.4f, 0.3f, 0.3f, 0.2f, 0.2f, 0.1f, 0.1f, 0.1f, 0.1f, 0.1f, 0.0f};
12
13 f32 cFrontAccSpin[30] = {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 8.0f, 6.0f, 4.0f, 2.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f};
14
15 f32 cFrontAccSpinSurface[20] = {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 8.0f, 6.0f, 4.0f, 2.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f};
16
17 f32 cWeightTable[16] = {
18 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f,
19 };
20
21 f32 cWeightTableSP[4] = {0.0f, 0.0f, 0.75f, 0.25f};
22
23 // In non-const mem region?
24
25 f32 cLimitAngleSink = 0.0f;
26 f32 cNeutralAngleWait = 0.0f;
27 f32 cLimitAngleWait = 0.0f;
28 f32 cUpperAngleWait = 0.0f;
29
30 // In const mem region?
31 const f32 cTurnMotionSpeed = 5.0f;
32
33} // namespace
34
35bool Mario::isSwimming() const
36{
37 if (isStatusActive(6)) {
38 return true;
39 }
40 return isStatusActive(24);
41}
42
43bool Mario::forceStartSwimAndShoot(const TVec3f &v)
44{
45 WaterInfo waterInfo;
46 if (!MR::getWaterAreaObj(&waterInfo, mActor->mPosition)) {
47 return false;
48 }
49 startSwim();
50 mSwim->setDamage(v, 0x1E);
51 return true;
52}
53
54bool Mario::forceExitSwim()
55{
56 if (!isStatusActive(6)) {
57 return false;
58 }
59 mSwim->_9E = 6;
60 closeStatus(mSwim);
61 return true;
62}
63
64void MarioSwim::setDamage(const TVec3f &v, u16 damage)
65{
66 _A0 = v;
67 _AE = damage;
68 _4C = 0.0f;
69 _50 = 0.0f;
70 _54 = 0.0f;
71 _7C = 0;
72 _7A = 0;
73 _34 = 0;
74 _2E = 0;
75 _32 = 0;
76 _2C = damage;
77 _30 = 0;
78 _24 = 0x12C;
79 if (_19) {
80 _19 = 0;
81 }
82}
83
84bool Mario::checkStartSwim()
85{
86 if (isStatusActive(6)) {
87 return false;
88 }
89 if (isStatusActive(29)) {
90 return false;
91 }
92 if (_10._7 && getMovementStates()._1) {
93 getAnimator()->waterToGround();
94 _10._7 = false;
95 }
96 if (mSwim->checkWaterCube(false)) {
97 if (getPlayerMode() == 3) {
98 TVec3f stack_14(-getGravityVec() % 100.0f);
99 addTrans(stack_14, nullptr);
100 if (getPlayer()->getMovementStates()._0) {
101 stopJump();
102 }
103 if (getPlayer()->isStatusActive(1)) {
104 getPlayer()->closeStatus(0);
105 }
106 if (getPlayer()->isStatusActive(4)) {
107 getPlayer()->closeStatus(0);
108 }
109 return false;
110 }
111 startSwim();
112 return true;
113 }
114 mSwim->updateUnderwater();
115 return false;
116}
117
118void Mario::startSwim()
119{
120 if (!isStatusActive(6)) {
121 if (getPlayer()->isDamaging()) {
122 mSwim->_9D = 4;
123 playSound("水落下突入", -1);
124 }
125 else if (getPlayer()->getMovementStates()._0) {
126 mSwim->_9D = 1;
127 playSound("水落下突入", -1);
128 }
129 else {
130 mSwim->_9D = 0;
131 playSound("水歩行突入", -1);
132 }
133 changeStatus(mSwim);
134 clearSlope();
135 stopWalk();
136 stopJump();
137 _735 = 0;
138 mMovementStates._3E = 0;
139 mMovementStates._12 = false;
140 if (mMovementStates._8 || mMovementStates._1A || mMovementStates._19) {
141 addVelocity(getWallNorm(), 50.0f);
142 }
143 getPlayer()->lockGroundCheck(mSwim, true);
144 checkBaseTransBall();
145 mActor->_F44 = false;
146 }
147}
148
149MarioSwim::MarioSwim(MarioActor *actor) : MarioState(actor, 6), _F4()
150{
151 _18 = 0;
152 _19 = 0;
153 _1A = 0;
154 _1B = 0;
155 _1C = 0;
156 _1D = 0;
157 _1E = 0;
158 _1F = 0;
159 _20 = 0;
160 _21 = 0;
161 _22 = 0;
162 _24 = 0;
163 _28 = 0;
164 _2C = 0;
165 _2E = 0;
166 _30 = 0;
167 _32 = 0;
168 _34 = 0;
169 _36 = 0;
170 _38 = 0;
171 _3A = 0;
172 _3C = 0;
173 _3E = 0;
174 _40 = 0;
175 _42 = 0;
176 _44 = 0;
177 _48 = 0.0f;
178 _4C = 0.0f;
179 _50 = 0.0f;
180 _54 = 0.0f;
181 _58 = 0.0f;
182 _5C = 0.0f;
183
184 _60.x = 1.0f;
185 _60.y = 0.0f;
186 _60.z = 0.0f;
187
188 _6C.x = 0.0f;
189 _6C.y = 1.0f;
190 _6C.z = 0.0f;
191
192 _78 = 0;
193 _7A = 0;
194 _7C = 0;
195 _80 = 0.0f;
196 _84 = 0.0f;
197 _88 = 0;
198 _8A = 0;
199 _8C = 0;
200 _8E = 0;
201 _90 = 0;
202 _94 = 0.0f;
203 _98 = 0.0f;
204 _9C = 0;
205 _9D = 0;
206 _9E = 0;
207 _9F = 0xFF;
208 _A0.zero();
209 _AC = 0;
210 _AD = 0;
211 _AE = 0;
212 PSMTXIdentity(_B0.toMtxPtr());
213 _E8 = 0;
214 _E0 = 0.0f;
215 _E4 = 0.0f;
216 _EC = 0;
217 _EE = 0x78;
218 _F0 = 0;
219 _144 = 0;
220 _148.zero();
221 _154.zero();
222 _160.setInline(0.0f, 1.0f, 0.0f);
223 _16C.zero();
224 _178.zero();
225 _184.zero();
226 _190.zero();
227 _1B0 = 0;
228 _19C = 0.0f;
229 _1A0 = 0.0f;
230 _1A4 = 0.0f;
231 _1A8 = 0.0f;
232 _1AC = 0.0f;
233 _1B2 = 0;
234 _1B4 = 0.0f;
235 _1B8 = 0.0f;
236 _14 = new MarineSnow();
237}
238
239void MarioSwim::init()
240{
241 _EA = mActor->getConst().getConstants()->_528;
242}
243
244inline f32 getSpecialNumber()
245{
246 return 1.74532938004f;
247}
248
249bool MarioSwim::start()
250{
251 _7C = 0;
252 _4C = 0.0f;
253 _50 = 0.0f;
254 _54 = 0.0f;
255 _7A = 0;
256 _E8 = 0;
257 _EA = mActor->getConst().getConstants()->_528;
258 _EE = 0x78;
259 _F0 = 0;
260 _AC = 0;
261 _44 = 0;
262 _EC = 0xB4;
263 _42 = 0;
264 _9E = 0;
265 _8C = 0;
266 _8E = 0;
267 _98 = 0.0f;
268 _3C = 0;
269 _80 = 0.0f;
270 _9F = 0xFF;
271 _AE = 0;
272 _A0.zero();
273 _28 = 0;
274 _E0 = 0.0f;
275 _E4 = 0.0f;
276 _1B0 = 0;
277 _24 = 0;
278 _48 = 0.0f;
279 _3E = 0;
280 _184.zero();
281 _190.zero();
282 _1B2 = 0;
283 _1B4 = 0.0f;
284 _1F = 0;
285 _22 = 0;
286 _58 = 0.0f;
287 if (!getPlayer()->getMovementStates()._0 || getPlayer()->_488 <= 100.0f) {
288 _58 = mActor->getConst().getConstants()->_500;
289 }
290 _9C = 1;
291 if (checkLvlA()) {
292 _9C = 0;
293 }
294 _5C = 0.523598790169f;
295 onSurface();
296 if ((_19C < -200.0f || mActor->_F74) && _19) {
297 _19 = 0;
298 }
299 _1B = 0;
300 u32 r1e = 0, r1d = 0;
301 _1D = 0;
302 _1E = 0;
303 if (isAnimationRun("飛び込みジャンプ")) {
304 r1e = 1;
305 }
306 if (isAnimationRun("後方飛び込みジャンプ")) {
307 r1e = 1;
308 getPlayer()->setFrontVecKeepUp(-getFrontVec(), -1.0f);
309 }
310 if (!mActor->_468.x) {
311 _8A = 0;
312 }
313 if (_9D == 4) {
314 r1d = 1;
315 }
316 if (_8A && getPlayer()->getMovementStates()._0) {
317 if (!getPlayer()->_10._1E) {
318 r1e = 2;
319 }
320 else {
321 getPlayer()->mMovementStates._0 = false;
322 }
323 }
324 getPlayer()->_10._1E = false;
325 if (isAnimationRun("リングダッシュ")) {
326 r1e = 2;
327 }
328 if (isAnimationRun("水泳スピン移動")) {
329 r1e = 3;
330 }
331 if (isAnimationRun("水泳スピンジャンプ")) {
332 r1e = 3;
333 }
334 _60 = getFrontVec();
335 MR::normalize(&_60);
336 stopAnimationUpper(nullptr, nullptr);
337 changeAnimation(nullptr, "水泳基本");
338 changeAnimationNonStop("水泳基本");
339 getPlayer()->mMovementStates._1 = false;
340 f32 fr1f = _1A4;
341 _2C = 0;
342 _32 = 0;
343 _2E = 0;
344 _34 = 0;
345 _36 = 0;
346 _38 = 0;
347 _3A = 0;
348 _1C = 0;
349 if (fr1f < -_19C) {
350 MarioActor *actor = mActor;
351 actor->emitEffectWaterColumn(-_160, getTrans() - _160 % fr1f);
352 }
353 else {
354 mActor->emitEffectWaterColumn(_160, _16C);
355 }
356 if (!getPlayer()->getMovementStates()._0 || getPlayer()->_488 > 100.0f || r1e) {
357 TVec3f stack_44;
358 _24 = 0;
359 Mario *mario = getPlayer();
360 MR::vecKillElement(mario->_2D4, getGravityVec(), &stack_44);
361 fr1f = PSVECMag(stack_44.toCVec());
362 if (getFrontVec().dot(stack_44) < 0.0f) {
363 fr1f = 0.0f;
364 }
365 fr1f *= 0.1f;
366 fr1f = MR::clamp(fr1f, 0.0f, 1.0f);
367 if (_19) {
368 _19 = 0;
369 }
370 if (_144 == 3) {
371 f32 ftmp = mActor->getConst().getConstants()->_4B4;
372 f32 ftmp2 = (0.2f + 0.1f * fr1f);
373 _34 = 0x3C;
374 _54 = ftmp2 * ftmp;
375 }
376 else if (getPlayer()->getMovementStates()._B || r1e) {
377 _54 = 10.0f;
378 if (_8A) {
379 changeAnimationNonStop("水泳ジェット");
380 }
381 else {
382 changeAnimation("水泳ジャンプダイブ回転", (const char *)nullptr);
383 }
384 playEffect("水面Z沈降");
385 switch (r1e) {
386 case 0:
387 case 1:
388 _2C = mActor->getConst().getConstants()->_55C;
389 _2E = mActor->getConst().getConstants()->_562;
390 break;
391 case 2:
392 _2C = mActor->getConst().getConstants()->_55E;
393 _2E = mActor->getConst().getConstants()->_564;
394 break;
395 case 3:
396 _2C = mActor->getConst().getConstants()->_560;
397 _2E = mActor->getConst().getConstants()->_566;
398 break;
399 }
400 // Possibly related to similar operations? (eg getSwimValue(), etc)
401 f32 ftmp2 = cLimitAngleSink * (1.0f - fr1f);
402 _5C = fr1f * getSpecialNumber() + ftmp2;
403 TVec3f stack_38(_60);
404 stack_38.y = -10.0f;
405 MR::normalize(&stack_38);
406 getPlayer()->forceSetHeadVecKeepSide(stack_38);
407 }
408 else if (r1d) {
409 changeAnimation("水上ダメージ着水", (const char *)nullptr);
410 _2E = mActor->getConst().getConstants()->_51E;
411 _AE = 0x78;
412 }
413 else {
414 _54 = (0.2f + 0.1f * fr1f) * mActor->getConst().getConstants()->_4B4;
415 changeAnimation("水泳ジャンプダイブ", (const char *)nullptr);
416 mActor->setBlendMtxTimer(8);
417 _2C = 15;
418 _2E = mActor->getConst().getConstants()->_51C;
419 _20 = 1;
420 _5C = 1.49599659443f;
421 if (getPlayer()->_488 < 200.0f) {
422 f32 ftmp = (getPlayer()->_488 / 200.0f);
423 _2C *= ftmp;
424 _2E *= ftmp;
425 mActor->setBlendMtxTimer(8.0f * ftmp);
426 }
427 }
428 }
429 else if (_19) {
430 _AE = 0x5A;
431 MR::vecKillElement(mActor->getLastMove(), _6C, &_A0);
432 _A0.scaleInline(0.5f);
433 }
434 if (mActor->_468.x) {
435 if (!_8A) {
436 if (mActor->getCarrySensor().isType(15) || mActor->getCarrySensor().isType(16)) {
437 u32 r1b = 0;
438 if (mActor->getCarrySensor().isType(16)) {
439 r1b = 1;
440 }
441 startJet(r1b);
442 r1e = 2;
443 _20 = 0;
444 _5C = 2.09439516068f;
445 if (_19) {
446 _19 = 0;
447 }
448 }
449 }
450 else {
451 r1e = 2;
452 }
453 }
454 if (r1e == 2) {
455 if (!isAnimationRun("水泳ジェット")) {
456 changeAnimation("水泳ジェット開始", "水泳ジェット");
457 }
458 else {
459 changeAnimation(nullptr, "水泳ジェット");
460 }
461 }
462 updateLifeByTime();
463 if (!getPlayer()->_1C._3) {
464 MR::getGameSceneLayoutHolder().changeLifeMeterModeWater();
465 }
466 _9E = 0;
467 return true;
468}
469
470static inline f32 getTwoPi()
471{
472 return 6.28318548203f;
473}
474
475static inline f32 funConversions1(u32 a, u16 tmp)
476{
477 return a * getTwoPi() / tmp;
478}
479
480static inline f32 funVecTime(const MarioSwim &self)
481{
482 return self.getTrans().y - self._19C;
483}
484
485static inline f32 funCalcTime()
486{
487 f32 tmp = 0.0f; // This line is included only to fix a register allocation mismatch
488 return 40.0f;
489}
490
491f32 MarioSwim::getSurface() const
492{
493 f32 fr1f = funVecTime(*this);
494 f32 fr1e = funCalcTime();
495 f32 fr1d = 0.00999999977648f;
496 f32 fr1c = 0.0299999993294f;
497 u16 tmp = 1800;
498 fr1d = 1.0f + fr1d * MR::sin(funConversions1(_24, tmp));
499 tmp = 500;
500 f32 ftmp = fr1c * MR::sin(funConversions1(_24, tmp));
501 tmp = 180;
502
503 // I love sin composition
504 return fr1f + fr1d * (fr1e * (MR::sin(ftmp + funConversions1(_24, tmp)) - 1.0f));
505}
506
507inline f32 procAngle(f32 l, f32 r)
508{
509 return l * (1.0f - r);
510}
511
512// possibly related to other calculations that take similar form? (eg getSwimValue)
513inline f32 calculate(f32 stick)
514{
515 return cLimitAngleSink + (cLimitAngleWait - cLimitAngleSink) * stick;
516}
517
518static inline TVec3f createAndScale(f32 scalar, const TVec3f &v)
519{
520 TVec3f ret(v);
521 ret.scale(scalar);
522 return ret;
523}
524
525bool MarioSwim::update()
526{
527 bool r1e = false;
528 _24++;
529 if (_22) {
530 _9E = 5;
531 return false;
532 }
533 if (!checkWaterCube(false)) {
534 if (_9E == 1 || _9E == 5) {
535 return false;
536 }
537 const TVec3f &rAirGravityVec = getAirGravityVec();
538 TVec3f stack_194;
539 MR::vecKillElement(_16C - getTrans(), rAirGravityVec, &stack_194);
540 if (PSVECMag(stack_194.toCVec()) > 100.0f || -_19C >= getPlayer()->_488 || _AE || _1B0) {
541 if (!isAnimationRun("水泳ジャンプダイブ")) {
542 if (_8A) {
543 doJetJump(1);
544 return false;
545 }
546 else {
547 _9E = 3;
548 return false;
549 }
550 }
551 }
552 else {
553 _144 = 1;
554 }
555 }
556 if (getPlayer()->mDrawStates._F && _19C > 0.963775992393f && MR::diffAngleAbsHorizontal(-getPlayer380(), getWorldPadDir(), getPlayer()->getAirGravityVec()) < 0.196349546313f) {
557 if (calcAngleD(getPlayer380()) >= 30.0f) {
558 _9E = 5;
559 return false;
560 }
561 else {
562 _9E = 1;
563 return false;
564 }
565 }
566 updateLifeByTime();
567 if (_18) {
568 onSurface();
569 _2E = 0;
570 _34 = 0;
571 _32 = 0;
572 _2C = 0;
573 _4C = 0.0f;
574 }
575 _6C = -getPlayer()->getAirGravityVec();
576 f32 fTmp = getSurface() - 30.0f;
577 if (_1B0) {
578 _1B0--;
579 }
580 if (_19 || (_20 && checkTrgA())) {
581 if (_7A || _7C) {
582 _9C = 0;
583 }
584 else {
585 if (_8A) {
586 if (checkTrgA()) {
587 doJetJump(0);
588 return false;
589 }
590 if (getStickY() <= 0) {
591 _5C = 0.00000381469726562f;
592 _4C = 1.0f;
593 }
594 }
595 else {
596 u32 tmp = 0x1E;
597 if (isAnimationRun("水上一掻き")) {
598 tmp = 0x1E;
599 }
600 if (checkLvlA()) {
601 if (_9C && (!isAnimationRun("水上一掻き") || !_28)) {
602 _28++;
603 }
604 if ((_1B0 || _8A || getPlayer()->mMovementStates._8 || getPlayer()->mMovementStates._32) && checkTrgA()) {
605 _28 = tmp;
606 }
607 }
608 else {
609 _9C = 1;
610 if (_28 && _28 < tmp) {
611 surfacePaddle();
612 }
613 _28 = 0;
614 _1C = 0;
615 }
616 if (mActor->isRequestSpinJump2P()) {
617 _28 = tmp;
618 getPlayer()->_1C._A = true;
619 getPlayer()->_10._1F = true;
620 }
621 bool tmp2 = false;
622 if ((!_32 || (_7A || _7C)) && (_28 >= tmp || _1C)) {
623 tmp2 = true;
624 }
625 if (mActor->isRequestSpin()) {
626 tmp2 = true;
627 }
628 if (tmp2) {
629 if (_24 > 6) {
630 f32 res = MR::clamp(_54 / mActor->getConst().getConstants()->_520, 0.0f, 1.0f);
631 getPlayer()->mMovementStates._5 = false;
632 getPlayer()->_278 = res;
633 getPlayer()->tryJump();
634 _9E = 2;
635 return false;
636 }
637 _1C = 1;
638 }
639 }
640 }
641 flowOnWave(fTmp);
642 }
643 else if (_19C > -30.0f) {
644 if (!_2C && !_32 && !_2E && !_8A) {
645 getAnimator()->forceSetBlendWeight(cWeightTable);
646 changeAnimation("炊泳上昇呼吸", (const char *)nullptr);
647 }
648 if (!_2E) {
649 onSurface();
650 _2C = 0;
651 }
652 if (_7C > 10) {
653 f32 res = MR::clamp(_54 / mActor->getConst().getConstants()->_520, 0.0f, 1.0f);
654 getPlayer()->mMovementStates._5 = false;
655 getPlayer()->_278 = res;
656 TVec3f stack_188;
657 mActor->getLastMove(&stack_188);
658 f32 res2 = MR::vecKillElement(stack_188, getGravityVec(), &stack_188);
659 if (res2 > -10.0f) {
660 res2 = -10.0f;
661 }
662 stack_188 += getGravityVec() % res2;
663 getPlayer()->tryForcePowerJump(stack_188, false);
664 _9E = 2;
665 if (isAnimationRun("水泳スピン移動")) {
666 changeAnimationNonStop("水泳スピン移動");
667 }
668 else {
669 changeAnimationNonStop("水泳スピンジャンプ");
670 }
671 return false;
672 }
673 if (_8A && (getStickY() < -0.1f || checkLvlA()) && getPlayer()->_488 - _19C > 200.0f) {
674 doJetJump(0);
675 return false;
676 }
677 if (_8C && getPlayer()->_488 - _19C > 200.0f) {
678 f32 res = MR::clamp(_54 / mActor->getConst().getConstants()->_520, 0.0f, 1.0f);
679 getPlayer()->mMovementStates._5 = false;
680 getPlayer()->_278 = res;
681 getPlayer()->tryForcePowerJump((mActor->getLastMove() % 2.0f).translate(_6C % 10.0f), false);
682 _9E = 2;
683 changeAnimationNonStop("リングダッシュ");
684 return false;
685 }
686 }
687 else {
688 checkWaterBottom();
689 if (getStickY() >= 0.0f && (_1F || (_1A4 < 60.0f && _54 > 1.0f))) {
690 const TVec3f &rShadowNorm = getPlayer()->getShadowNorm();
691 TVec3f stack_17C, stack_170;
692 PSVECCrossProduct(_60.toCVec(), rShadowNorm.toCVec(), stack_17C.toVec());
693 PSVECCrossProduct(rShadowNorm.toCVec(), stack_17C.toCVec(), stack_170.toVec());
694 if (-_19C + _1A4 > 1000.0f) {
695 _1A = 1;
696 }
697 f32 dot1 = _60.dot(stack_170);
698 f32 dot2 = _60.dot(rShadowNorm);
699 if (dot2 >= 0.0f) {
700 _5C = 1.57079637051f + 0.9f * marioAcos(dot1);
701 }
702 else if (_54 > 1.0f) {
703 _5C = 1.57079637051f - 0.5f * marioAcos(dot1);
704 }
705 else {
706 f32 angle = marioAcos(dot1);
707 _38 = 0x3C;
708 _5C = 1.57079637051f - angle;
709 }
710 if (_8A && getPlayer()->_488 < 100.0f) {
711 _42 = 2;
712 playEffect("水底接触");
713 _54 *= mActor->getConst().getConstants()->_53C;
714 }
715 }
716 _1F = 0;
717 }
718 if (_42) {
719 playSound("水底接触", -1);
720 if (--_42 == 0) {
721 stopEffect("水底接触");
722 }
723 }
724 if (_32 && --_32 == 0) {
725 r1e = true;
726 _5C = mActor->getConst().getConstants()->_54C;
727 _2C = mActor->getConst().getConstants()->_550;
728 _2E = mActor->getConst().getConstants()->_552;
729 _54 = mActor->getConst().getConstants()->_558;
730 _38 = 0x14;
731 }
732 f32 fr1f = 1.0f - MR::clamp(_54 / mActor->getConst().getConstants()->_4B4, 0.0f, 1.0f);
733 if (_1A4 - _19C < 400.0f) {
734 fr1f = 0.0f;
735 }
736 if (_38) {
737 _38--;
738 }
739 else {
740 f32 res = fr1f;
741 if (_19 && !_32) {
742 if (!_18) {
743 if (_8A) {
744 if (getStickY() > 0.707000017166f) {
745 _5C = mActor->getConst().getConstants()->_54C;
746 _20 = 0;
747 _1E = 0;
748 }
749
750 f32 a;
751 f32 b;
752 b = getSwimValue(a = getStickY(), 2, mActor->getConst().getConstants());
753 _4C = _4C * b + procAngle(a, b);
754
755 _50 = 2.5f * (getStickX() * (1.0f - mActor->getConst().getConstants()->_4EC[3]));
756 f32 fr1c = 1.0f;
757 if (getStickY() < 0.0f) {
758 fr1c += 2.0f * -getStickY();
759 }
760 _50 *= fr1c;
761 }
762 else if (checkTrgZ() && !check7Aand7C()) {
763 stopAnimationUpper("水泳水面初期移動", nullptr);
764 changeAnimation("水泳潜り", (const char *)nullptr);
765 playEffect("水面Z沈降");
766 playSound("水面潜り", -1);
767 _32 = mActor->getConst().getConstants()->_554;
768 }
769 else if (checkLvlZ() == 0) {
770 res = 0.0f;
771 }
772 else {
773 f32 a, b;
774 b = getSwimValue(a = getStickP(), 0, mActor->getConst().getConstants());
775 _4C = _4C * b + procAngle(a, b);
776 }
777 }
778 _50 *= mActor->getConst().getConstants()->_4EC[1];
779 }
780 else {
781 if (!_8C && _1A4 > 200.0f && checkTrgZ() && !_32 && !_2E && !_8A && !check7Aand7C()) {
782 stopAnimation(nullptr, (const char *)nullptr);
783 changeAnimation("水泳潜り", (const char *)nullptr);
784 playSound("水中潜り", -1);
785 playEffect("水面Z沈降");
786 _32 = mActor->getConst().getConstants()->_554;
787 }
788 if (_8A) {
789 f32 a;
790 f32 b;
791 b = getSwimValue(a = getStickY(), 2, mActor->getConst().getConstants());
792 _4C = _4C * b + procAngle(a, b);
793 b = getSwimValue(a = getStickX(), 3, mActor->getConst().getConstants());
794 _50 = _50 * b + procAngle(a, b);
795 }
796 else {
797 f32 a, b;
798 b = getSwimValue(a = getStickY(), 0, mActor->getConst().getConstants());
799 _4C = _4C * b + procAngle(a, b);
800 b = getSwimValue(a = getStickX(), 1, mActor->getConst().getConstants());
801 _50 = _50 * b + procAngle(a, b);
802 }
803 }
804 if (!_20 && !_3C && _2C) {
805 _5C += res * (_4C * mActor->getConst().getConstants()->_4E0);
806 }
807
808 if ((_54 < cTurnMotionSpeed || _19 || checkLvlA() || checkLvlZ()) && isAnimationRun("水泳一掻き") && isAnimationTerminate("水泳一掻き")) {
809 stopAnimation(nullptr, (const char *)nullptr);
810 }
811
812 if (!checkLvlA() && !checkLvlZ() && !_2C && _54 < cTurnMotionSpeed) {
813 bool worthless;
814 bool &worthlesser = worthless;
815 funReferenceTime(worthlesser);
816 if (!_20 && !_AE && _19C < -400.0f) {
817 _3C++;
818 if (MR::getRandom() < 0.03f) {
819 playSound("水中ウエイト", -1);
820 }
821 }
822 if (_3C >= 0x78) {
823 _3C = 0x78;
824 }
825 }
826 else {
827 _3C = 0;
828 }
829 f32 fr1d;
830 if (MR::isNearZero(getStickY(), 0.1f)) {
831 f32 num = _3C / 120.0f;
832 if (num > 1.0f) {
833 num = 1.0f;
834 }
835 fr1d = _5C + num * (cNeutralAngleWait - _5C);
836 }
837 else if (getStickY() > 0.0f) {
838 f32 fr4 = 0.0f;
839 f32 num = _3C / 120.0f;
840 if (_54 < 2.0f) {
841 fr4 = 1.0f;
842 }
843 else {
844 bool confusion;
845 bool &confusionion = confusion;
846 if (_54 > 10.0f) {
847 confusionion = true;
848 }
849 else {
850 fr4 = 1.0f - (_54 - 2.0f) / 8;
851 }
852 }
853 if (num < fr4) {
854 num = fr4;
855 }
856 f32 numClamped = MR::clamp(num, 0.0f, 1.0f);
857 f32 fr1c = numClamped * cLimitAngleWait + (1.0f - numClamped) * cLimitAngleSink;
858 if (_1A4 < 300.0f && -_19C < 100.0f) {
859 fr1c = cNeutralAngleWait;
860 }
861 fr1d = cNeutralAngleWait + (fr1c - cNeutralAngleWait) * getStickY();
862 }
863 else if (getStickY() < 0.0f) {
864 fr1d = cLimitAngleSink + (cLimitAngleWait - cLimitAngleSink) * -getStickY();
865 }
866 f32 fr1e = 0.05f;
867 if (_54 > 5.0f && (fr1e -= fr1e * (5.0f / _54)) < 0.0f) {
868 fr1e = 0.0f;
869 }
870 if (_8A) {
871 switch (_88) {
872 case 0:
873 fr1e *= mActor->getConst().getConstants()->_52C;
874 break;
875 default:
876 fr1e *= mActor->getConst().getConstants()->_530;
877 break;
878 }
879 }
880 if (_20) {
881 fr1d = 0.523598790169f;
882 fr1e = 0.01f;
883 }
884 if (_19) {
885 fr1d = 0.523598790169f;
886 }
887 if (_32) {
888 fr1e = 0.15f;
889 fr1d = mActor->getConst().getConstants()->_54C;
890 }
891 bool r1b = true;
892 _5C = _5C * (1.0f - fr1e) + fr1d * fr1e;
893 if (_3C && !_AE && !_32 && getStickY() > 0.0f) {
894 f32 fr1c = 3.14159274101f / mActor->getConst().getConstants()->_5B8;
895 f32 tmpsticky = getStickY();
896 fr1d = 0.523598790169f + tmpsticky * (fr1c - 0.523598790169f);
897 if (_5C < fr1d) {
898 _5C = _5C * mActor->getConst().getConstants()->_5BC + fr1d * (1.0f - mActor->getConst().getConstants()->_5BC);
899 }
900 else {
901 _5C = _5C * (1.0f - fr1e) + fr1d * fr1e;
902 }
903 if (!check7Aand7C() && !_8A) {
904 changeAnimation("水泳ターン下", (const char *)nullptr);
905 }
906 r1b = false;
907 }
908 if (r1b) {
909 stopAnimation("水泳ターン下", (const char *)nullptr);
910 }
911 if (_32) {
912 _5C = MR::clamp(_5C, 0.523598790169f, mActor->getConst().getConstants()->_54C);
913 }
914 else {
915 _5C = MR::clamp(_5C, cLimitAngleWait, cUpperAngleWait);
916 }
917 if (MR::isStageSwimAngleLimit()) {
918 _5C = MR::clamp(_5C, 0.872664690018f, 2.26892805099f);
919 }
920 }
921
922 if ((_20 || (_19 && isStickOn())) && !_8A) {
923 TVec3f stack_164(getWorldPadDir());
924 f32 tmp;
925 if (_19) {
926 tmp = 0.01f * (12.0f - _54);
927 if (tmp <= 0.01f) {
928 tmp = 0.01f;
929 }
930 }
931 else {
932 tmp = 0.01f * (10.0f - _54);
933 }
934 if (_8A) {
935 tmp *= 3.0f;
936 }
937 f32 res = MR::clamp(tmp * mActor->getConst().getConstants()->_518, 0.0f, 1.0f);
938 f32 diffAngle = MR::diffAngleAbs(_60, stack_164);
939 if (diffAngle > 0.0f) {
940 if (diffAngle < res) {
941 _60 = stack_164;
942 }
943 else {
944 MR::vecBlendSphere(_60, stack_164, &_60, res / diffAngle);
945 }
946 }
947 }
948 else {
949 f32 tmp = fr1f + mActor->getConst().getConstants()->_4E8;
950 MR::rotAxisVecRad(_60, -_6C, &_60, tmp * (_50 * mActor->mConst->getConstants()->_4E4));
951 }
952 TVec3f stack_158(_60);
953 MR::vecKillElement(_60, _6C, &_60);
954 TVec3f stack_14C, stack_140;
955 if (!MR::normalizeOrZero(&_60)) {
956 PSVECCrossProduct(_6C.toCVec(), _60.toCVec(), stack_140.toVec());
957 MR::normalize(&stack_140);
958 getPlayer()->setSideVec(stack_140);
959 MR::rotAxisVecRad(_60, stack_140, &stack_14C, _5C);
960 TVec3f stack_134(getPlayer()->_1F0);
961 TVec3f stack_128(getFrontVec());
962 TVec3f stack_11C;
963 f32 something = 0.1f;
964 if (r1e) {
965 something = 1.0f;
966 }
967 MR::vecBlendSphere(stack_128, stack_14C, &stack_11C, something);
968 getPlayer()->setFrontVecKeepSide(stack_11C);
969 }
970 else {
971 stack_14C = getFrontVec();
972 stack_140 = getPlayer()->_310;
973 }
974 spin();
975 TVec3f stack_110 = getPlayer()->_1FC;
976 if (_34 || _2E || isAnimationRun("水泳ジャンプダイブ回転") || isAnimationRun("水泳潜り")) {
977 PSVECCrossProduct(stack_14C.toCVec(), stack_140.toCVec(), stack_110.toVec());
978 }
979 if (!_8A) {
980 decideVelocity();
981 }
982 TVec3f stack_104 = createAndScale(_54, stack_110);
983 if (_19 && _6C.dot(stack_110) > 0.0f) {
984 f32 mag = PSVECMag(stack_104.toCVec());
985 MR::vecKillElement(stack_104, _6C, &stack_104);
986 stack_104.setLength(mag);
987 }
988 f32 element = MR::vecKillElement(stack_104, _6C, &stack_104);
989 f32 fr2;
990 if (_30 > 0x19) {
991 fr2 = (50 - _30) / 25.0f;
992 }
993 else {
994 fr2 = _30 / 25.0f;
995 }
996 f32 fr1d = fr2 + (1.0f - fr2) * mActor->getConst().getConstants()->_514;
997 stack_104 += _6C % element % fr1d;
998 addVelocity(stack_104);
999 u16 fr1b = _2E;
1000 if (fr1b) {
1001 addVelocity(getGravityVec(), 0.25f * fr1b);
1002 _2E--;
1003 }
1004
1005 if (_34) {
1006 _34--;
1007 }
1008 if (!_19 && !_2C && !_8A) {
1009 procBuoyancy();
1010 }
1011 else if (_6C.dot(stack_110) < 0.0f) {
1012 if (_19) {
1013 _19 = 0;
1014 }
1015 }
1016 else if (_19) {
1017 AreaObj *obj = MR::getAreaObj("WaterArea", getTrans().translate(getGravityVec() % 100f));
1018 if (obj) {
1019 TPos3f *followMtx = obj->getFollowMtx();
1020 if (followMtx) {
1021 TVec3f stack_F8;
1022 MR::extractMtxTrans(followMtx->toMtxPtr(), &stack_F8);
1023 bool cond = JGeometry::TUtil<f32>::epsilonEquals(stack_F8.x, _154.x, 0.000003814697265625f) && JGeometry::TUtil<f32>::epsilonEquals(stack_F8.y, _154.y, 0.000003814697265625f) && JGeometry::TUtil<f32>::epsilonEquals(stack_F8.z, _154.z, 0.000003814697265625f);
1024 if (!cond) {
1025 if (PSVECMag((stack_F8 - _154).toCVec()) < 10.0f) {
1026 addVelocity(stack_F8 - _154);
1027 }
1028 _154 = stack_F8;
1029 }
1030 }
1031 }
1032 }
1033 if (_AE) {
1034 _AE--;
1035 addVelocity(_A0);
1036 if (_AE < 0x78) {
1037 _A0.scaleInline(0.98f);
1038 }
1039 }
1040 if (_8A) {
1041 addVelocity(_184, mActor->getConst().getConstants()->_534);
1042 }
1043 else {
1044 addVelocity(_184);
1045 }
1046 TVec3f stack_EC(_184);
1047 f32 fr1dv2 = PSVECMag(stack_EC.toCVec());
1048 if (!MR::normalizeOrZero(&stack_EC)) {
1049 if (MR::diffAngleAbs(stack_EC, _60) < 1.57079637051f) {
1050 MR::vecBlendSphere(_60, stack_EC, &_60, 0.001f * fr1dv2);
1051 }
1052 else {
1053 MR::vecBlendSphere(_60, -stack_EC, &_60, 0.001f * fr1dv2);
1054 }
1055 }
1056 TVec3f stack_E0;
1057 if (MR::calcWhirlPoolAccelInfo(getTrans(), &stack_E0) && !MR::isNearZero(stack_E0, 0.001f)) {
1058 _184 += stack_E0;
1059 TVec3f stack_D4(stack_E0);
1060 MR::normalizeOrZero(&stack_D4);
1061 MR::vecBlendSphere(_60, stack_D4, &_60, 0.1f);
1062 }
1063 if (!_8A && !_19 && !MR::isNearZero(_190, 0.001f)) {
1064 f32 angleDiff = MR::diffAngleSignedHorizontal(_190, _60, getPlayer()->getAirGravityVec());
1065 f32 cmp = 1.04719758034f;
1066 if (angleDiff > cmp) {
1067 Mtx stack_1D0;
1068 PSMTXRotAxisRad(stack_1D0, _6C.toCVec(), angleDiff - 1.04719758034f);
1069 PSMTXMultVecSR(stack_1D0, _60.toCVec(), _60.toVec());
1070 }
1071 else if (angleDiff < -cmp) {
1072 Mtx stack_1A0;
1073 PSMTXRotAxisRad(stack_1A0, _6C.toCVec(), -(-angleDiff - 1.04719758034f));
1074 PSMTXMultVecSR(stack_1A0, _60.toCVec(), _60.toVec());
1075 }
1076 }
1077 decideAnimation();
1078 decideEffect(false);
1079 if (_2C) {
1080 _2C--;
1081 }
1082 if (_30) {
1083 _30--;
1084 }
1085 if (_44) {
1086 _44--;
1087 }
1088 updateTilt();
1089 jet();
1090 pushedByWaterWall();
1091 return true;
1092}
1093
1094/*
1095 *
1096 * ***********************************************
1097 * IMPORTANT: THIS FUNCTION SHOULD BE DELETED ONCE
1098 * THIS OBJECT FILE MATCHES
1099 * ***********************************************
1100 *
1101 * This function is only present so that the
1102 * compiler does not cull these variables
1103 *
1104 */
1105void dummyFunction()
1106{
1107 cFrontAcc[0] = 1.0f;
1108 cFrontAccSpin[0] = 1.0f;
1109 cFrontAccSpinSurface[0] = 1.0f;
1110 cWeightTableSP[0] = 1.0f;
1111};
TVec3f mPosition
3D vector of the actor's position.
Definition LiveActor.hpp:95