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"
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};
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};
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};
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,
21 f32 cWeightTableSP[4] = {0.0f, 0.0f, 0.75f, 0.25f};
25 f32 cLimitAngleSink = 0.0f;
26 f32 cNeutralAngleWait = 0.0f;
27 f32 cLimitAngleWait = 0.0f;
28 f32 cUpperAngleWait = 0.0f;
31 const f32 cTurnMotionSpeed = 5.0f;
35bool Mario::isSwimming()
const
37 if (isStatusActive(6)) {
40 return isStatusActive(24);
43bool Mario::forceStartSwimAndShoot(
const TVec3f &v)
46 if (!MR::getWaterAreaObj(&waterInfo, mActor->
mPosition)) {
50 mSwim->setDamage(v, 0x1E);
54bool Mario::forceExitSwim()
56 if (!isStatusActive(6)) {
64void MarioSwim::setDamage(
const TVec3f &v, u16 damage)
84bool Mario::checkStartSwim()
86 if (isStatusActive(6)) {
89 if (isStatusActive(29)) {
92 if (_10._7 && getMovementStates()._1) {
93 getAnimator()->waterToGround();
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) {
103 if (getPlayer()->isStatusActive(1)) {
104 getPlayer()->closeStatus(0);
106 if (getPlayer()->isStatusActive(4)) {
107 getPlayer()->closeStatus(0);
114 mSwim->updateUnderwater();
118void Mario::startSwim()
120 if (!isStatusActive(6)) {
121 if (getPlayer()->isDamaging()) {
123 playSound(
"水落下突入", -1);
125 else if (getPlayer()->getMovementStates()._0) {
127 playSound(
"水落下突入", -1);
131 playSound(
"水歩行突入", -1);
138 mMovementStates._3E = 0;
139 mMovementStates._12 =
false;
140 if (mMovementStates._8 || mMovementStates._1A || mMovementStates._19) {
141 addVelocity(getWallNorm(), 50.0f);
143 getPlayer()->lockGroundCheck(mSwim,
true);
144 checkBaseTransBall();
145 mActor->_F44 =
false;
212 PSMTXIdentity(_B0.toMtxPtr());
222 _160.setInline(0.0f, 1.0f, 0.0f);
239void MarioSwim::init()
241 _EA = mActor->getConst().getConstants()->_528;
244inline f32 getSpecialNumber()
246 return 1.74532938004f;
249bool MarioSwim::start()
257 _EA = mActor->getConst().getConstants()->_528;
287 if (!getPlayer()->getMovementStates()._0 || getPlayer()->_488 <= 100.0f) {
288 _58 = mActor->getConst().getConstants()->_500;
294 _5C = 0.523598790169f;
296 if ((_19C < -200.0f || mActor->_F74) && _19) {
300 u32 r1e = 0, r1d = 0;
303 if (isAnimationRun(
"飛び込みジャンプ")) {
306 if (isAnimationRun(
"後方飛び込みジャンプ")) {
308 getPlayer()->setFrontVecKeepUp(-getFrontVec(), -1.0f);
310 if (!mActor->_468.x) {
316 if (_8A && getPlayer()->getMovementStates()._0) {
317 if (!getPlayer()->_10._1E) {
321 getPlayer()->mMovementStates._0 =
false;
324 getPlayer()->_10._1E =
false;
325 if (isAnimationRun(
"リングダッシュ")) {
328 if (isAnimationRun(
"水泳スピン移動")) {
331 if (isAnimationRun(
"水泳スピンジャンプ")) {
336 stopAnimationUpper(
nullptr,
nullptr);
337 changeAnimation(
nullptr,
"水泳基本");
338 changeAnimationNonStop(
"水泳基本");
339 getPlayer()->mMovementStates._1 =
false;
351 actor->emitEffectWaterColumn(-_160, getTrans() - _160 % fr1f);
354 mActor->emitEffectWaterColumn(_160, _16C);
356 if (!getPlayer()->getMovementStates()._0 || getPlayer()->_488 > 100.0f || r1e) {
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) {
366 fr1f = MR::clamp(fr1f, 0.0f, 1.0f);
371 f32 ftmp = mActor->getConst().getConstants()->_4B4;
372 f32 ftmp2 = (0.2f + 0.1f * fr1f);
376 else if (getPlayer()->getMovementStates()._B || r1e) {
379 changeAnimationNonStop(
"水泳ジェット");
382 changeAnimation(
"水泳ジャンプダイブ回転", (
const char *)
nullptr);
388 _2C = mActor->getConst().getConstants()->_55C;
389 _2E = mActor->getConst().getConstants()->_562;
392 _2C = mActor->getConst().getConstants()->_55E;
393 _2E = mActor->getConst().getConstants()->_564;
396 _2C = mActor->getConst().getConstants()->_560;
397 _2E = mActor->getConst().getConstants()->_566;
401 f32 ftmp2 = cLimitAngleSink * (1.0f - fr1f);
402 _5C = fr1f * getSpecialNumber() + ftmp2;
403 TVec3f stack_38(_60);
405 MR::normalize(&stack_38);
406 getPlayer()->forceSetHeadVecKeepSide(stack_38);
409 changeAnimation(
"水上ダメージ着水", (
const char *)
nullptr);
410 _2E = mActor->getConst().getConstants()->_51E;
414 _54 = (0.2f + 0.1f * fr1f) * mActor->getConst().getConstants()->_4B4;
415 changeAnimation(
"水泳ジャンプダイブ", (
const char *)
nullptr);
416 mActor->setBlendMtxTimer(8);
418 _2E = mActor->getConst().getConstants()->_51C;
420 _5C = 1.49599659443f;
421 if (getPlayer()->_488 < 200.0f) {
422 f32 ftmp = (getPlayer()->_488 / 200.0f);
425 mActor->setBlendMtxTimer(8.0f * ftmp);
431 MR::vecKillElement(mActor->getLastMove(), _6C, &_A0);
432 _A0.scaleInline(0.5f);
434 if (mActor->_468.x) {
436 if (mActor->getCarrySensor().isType(15) || mActor->getCarrySensor().isType(16)) {
438 if (mActor->getCarrySensor().isType(16)) {
444 _5C = 2.09439516068f;
455 if (!isAnimationRun(
"水泳ジェット")) {
456 changeAnimation(
"水泳ジェット開始",
"水泳ジェット");
459 changeAnimation(
nullptr,
"水泳ジェット");
463 if (!getPlayer()->_1C._3) {
464 MR::getGameSceneLayoutHolder().changeLifeMeterModeWater();
470static inline f32 getTwoPi()
472 return 6.28318548203f;
475static inline f32 funConversions1(u32 a, u16 tmp)
477 return a * getTwoPi() / tmp;
480static inline f32 funVecTime(
const MarioSwim &self)
482 return self.getTrans().y - self._19C;
485static inline f32 funCalcTime()
491f32 MarioSwim::getSurface()
const
493 f32 fr1f = funVecTime(*
this);
494 f32 fr1e = funCalcTime();
495 f32 fr1d = 0.00999999977648f;
496 f32 fr1c = 0.0299999993294f;
498 fr1d = 1.0f + fr1d * MR::sin(funConversions1(_24, tmp));
500 f32 ftmp = fr1c * MR::sin(funConversions1(_24, tmp));
504 return fr1f + fr1d * (fr1e * (MR::sin(ftmp + funConversions1(_24, tmp)) - 1.0f));
507inline f32 procAngle(f32 l, f32 r)
509 return l * (1.0f - r);
513inline f32 calculate(f32 stick)
515 return cLimitAngleSink + (cLimitAngleWait - cLimitAngleSink) * stick;
518static inline TVec3f createAndScale(f32 scalar,
const TVec3f &v)
525bool MarioSwim::update()
533 if (!checkWaterCube(
false)) {
534 if (_9E == 1 || _9E == 5) {
537 const TVec3f &rAirGravityVec = getAirGravityVec();
539 MR::vecKillElement(_16C - getTrans(), rAirGravityVec, &stack_194);
540 if (PSVECMag(stack_194.toCVec()) > 100.0f || -_19C >= getPlayer()->_488 || _AE || _1B0) {
541 if (!isAnimationRun(
"水泳ジャンプダイブ")) {
556 if (getPlayer()->mDrawStates._F && _19C > 0.963775992393f && MR::diffAngleAbsHorizontal(-getPlayer380(), getWorldPadDir(), getPlayer()->getAirGravityVec()) < 0.196349546313f) {
557 if (calcAngleD(getPlayer380()) >= 30.0f) {
575 _6C = -getPlayer()->getAirGravityVec();
576 f32 fTmp = getSurface() - 30.0f;
580 if (_19 || (_20 && checkTrgA())) {
590 if (getStickY() <= 0) {
591 _5C = 0.00000381469726562f;
597 if (isAnimationRun(
"水上一掻き")) {
601 if (_9C && (!isAnimationRun(
"水上一掻き") || !_28)) {
604 if ((_1B0 || _8A || getPlayer()->mMovementStates._8 || getPlayer()->mMovementStates._32) && checkTrgA()) {
610 if (_28 && _28 < tmp) {
616 if (mActor->isRequestSpinJump2P()) {
618 getPlayer()->_1C._A =
true;
619 getPlayer()->_10._1F =
true;
622 if ((!_32 || (_7A || _7C)) && (_28 >= tmp || _1C)) {
625 if (mActor->isRequestSpin()) {
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();
643 else if (_19C > -30.0f) {
644 if (!_2C && !_32 && !_2E && !_8A) {
645 getAnimator()->forceSetBlendWeight(cWeightTable);
646 changeAnimation(
"炊泳上昇呼吸", (
const char *)
nullptr);
653 f32 res = MR::clamp(_54 / mActor->getConst().getConstants()->_520, 0.0f, 1.0f);
654 getPlayer()->mMovementStates._5 =
false;
655 getPlayer()->_278 = res;
657 mActor->getLastMove(&stack_188);
658 f32 res2 = MR::vecKillElement(stack_188, getGravityVec(), &stack_188);
662 stack_188 += getGravityVec() % res2;
663 getPlayer()->tryForcePowerJump(stack_188,
false);
665 if (isAnimationRun(
"水泳スピン移動")) {
666 changeAnimationNonStop(
"水泳スピン移動");
669 changeAnimationNonStop(
"水泳スピンジャンプ");
673 if (_8A && (getStickY() < -0.1f || checkLvlA()) && getPlayer()->_488 - _19C > 200.0f) {
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);
683 changeAnimationNonStop(
"リングダッシュ");
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) {
697 f32 dot1 = _60.dot(stack_170);
698 f32 dot2 = _60.dot(rShadowNorm);
700 _5C = 1.57079637051f + 0.9f * marioAcos(dot1);
702 else if (_54 > 1.0f) {
703 _5C = 1.57079637051f - 0.5f * marioAcos(dot1);
706 f32 angle = marioAcos(dot1);
708 _5C = 1.57079637051f - angle;
710 if (_8A && getPlayer()->_488 < 100.0f) {
713 _54 *= mActor->getConst().getConstants()->_53C;
719 playSound(
"水底接触", -1);
724 if (_32 && --_32 == 0) {
726 _5C = mActor->getConst().getConstants()->_54C;
727 _2C = mActor->getConst().getConstants()->_550;
728 _2E = mActor->getConst().getConstants()->_552;
729 _54 = mActor->getConst().getConstants()->_558;
732 f32 fr1f = 1.0f - MR::clamp(_54 / mActor->getConst().getConstants()->_4B4, 0.0f, 1.0f);
733 if (_1A4 - _19C < 400.0f) {
744 if (getStickY() > 0.707000017166f) {
745 _5C = mActor->getConst().getConstants()->_54C;
752 b = getSwimValue(a = getStickY(), 2, mActor->getConst().getConstants());
753 _4C = _4C * b + procAngle(a, b);
755 _50 = 2.5f * (getStickX() * (1.0f - mActor->getConst().getConstants()->_4EC[3]));
757 if (getStickY() < 0.0f) {
758 fr1c += 2.0f * -getStickY();
762 else if (checkTrgZ() && !check7Aand7C()) {
763 stopAnimationUpper(
"水泳水面初期移動",
nullptr);
764 changeAnimation(
"水泳潜り", (
const char *)
nullptr);
766 playSound(
"水面潜り", -1);
767 _32 = mActor->getConst().getConstants()->_554;
769 else if (checkLvlZ() == 0) {
774 b = getSwimValue(a = getStickP(), 0, mActor->getConst().getConstants());
775 _4C = _4C * b + procAngle(a, b);
778 _50 *= mActor->getConst().getConstants()->_4EC[1];
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);
786 _32 = mActor->getConst().getConstants()->_554;
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);
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);
804 if (!_20 && !_3C && _2C) {
805 _5C += res * (_4C * mActor->getConst().getConstants()->_4E0);
808 if ((_54 < cTurnMotionSpeed || _19 || checkLvlA() || checkLvlZ()) && isAnimationRun(
"水泳一掻き") && isAnimationTerminate(
"水泳一掻き")) {
809 stopAnimation(
nullptr, (
const char *)
nullptr);
812 if (!checkLvlA() && !checkLvlZ() && !_2C && _54 < cTurnMotionSpeed) {
814 bool &worthlesser = worthless;
815 funReferenceTime(worthlesser);
816 if (!_20 && !_AE && _19C < -400.0f) {
818 if (MR::getRandom() < 0.03f) {
819 playSound(
"水中ウエイト", -1);
830 if (MR::isNearZero(getStickY(), 0.1f)) {
831 f32 num = _3C / 120.0f;
835 fr1d = _5C + num * (cNeutralAngleWait - _5C);
837 else if (getStickY() > 0.0f) {
839 f32 num = _3C / 120.0f;
845 bool &confusionion = confusion;
850 fr4 = 1.0f - (_54 - 2.0f) / 8;
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;
861 fr1d = cNeutralAngleWait + (fr1c - cNeutralAngleWait) * getStickY();
863 else if (getStickY() < 0.0f) {
864 fr1d = cLimitAngleSink + (cLimitAngleWait - cLimitAngleSink) * -getStickY();
867 if (_54 > 5.0f && (fr1e -= fr1e * (5.0f / _54)) < 0.0f) {
873 fr1e *= mActor->getConst().getConstants()->_52C;
876 fr1e *= mActor->getConst().getConstants()->_530;
881 fr1d = 0.523598790169f;
885 fr1d = 0.523598790169f;
889 fr1d = mActor->getConst().getConstants()->_54C;
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);
898 _5C = _5C * mActor->getConst().getConstants()->_5BC + fr1d * (1.0f - mActor->getConst().getConstants()->_5BC);
901 _5C = _5C * (1.0f - fr1e) + fr1d * fr1e;
903 if (!check7Aand7C() && !_8A) {
904 changeAnimation(
"水泳ターン下", (
const char *)
nullptr);
909 stopAnimation(
"水泳ターン下", (
const char *)
nullptr);
912 _5C = MR::clamp(_5C, 0.523598790169f, mActor->getConst().getConstants()->_54C);
915 _5C = MR::clamp(_5C, cLimitAngleWait, cUpperAngleWait);
917 if (MR::isStageSwimAngleLimit()) {
918 _5C = MR::clamp(_5C, 0.872664690018f, 2.26892805099f);
922 if ((_20 || (_19 && isStickOn())) && !_8A) {
923 TVec3f stack_164(getWorldPadDir());
926 tmp = 0.01f * (12.0f - _54);
932 tmp = 0.01f * (10.0f - _54);
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) {
944 MR::vecBlendSphere(_60, stack_164, &_60, res / diffAngle);
949 f32 tmp = fr1f + mActor->getConst().getConstants()->_4E8;
950 MR::rotAxisVecRad(_60, -_6C, &_60, tmp * (_50 * mActor->mConst->getConstants()->_4E4));
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());
963 f32 something = 0.1f;
967 MR::vecBlendSphere(stack_128, stack_14C, &stack_11C, something);
968 getPlayer()->setFrontVecKeepSide(stack_11C);
971 stack_14C = getFrontVec();
972 stack_140 = getPlayer()->_310;
975 TVec3f stack_110 = getPlayer()->_1FC;
976 if (_34 || _2E || isAnimationRun(
"水泳ジャンプダイブ回転") || isAnimationRun(
"水泳潜り")) {
977 PSVECCrossProduct(stack_14C.toCVec(), stack_140.toCVec(), stack_110.toVec());
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);
988 f32 element = MR::vecKillElement(stack_104, _6C, &stack_104);
991 fr2 = (50 - _30) / 25.0f;
996 f32 fr1d = fr2 + (1.0f - fr2) * mActor->getConst().getConstants()->_514;
997 stack_104 += _6C % element % fr1d;
998 addVelocity(stack_104);
1001 addVelocity(getGravityVec(), 0.25f * fr1b);
1008 if (!_19 && !_2C && !_8A) {
1011 else if (_6C.dot(stack_110) < 0.0f) {
1017 AreaObj *obj = MR::getAreaObj(
"WaterArea", getTrans().translate(getGravityVec() % 100f));
1019 TPos3f *followMtx = obj->getFollowMtx();
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);
1025 if (PSVECMag((stack_F8 - _154).toCVec()) < 10.0f) {
1026 addVelocity(stack_F8 - _154);
1037 _A0.scaleInline(0.98f);
1041 addVelocity(_184, mActor->getConst().getConstants()->_534);
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);
1053 MR::vecBlendSphere(_60, -stack_EC, &_60, 0.001f * fr1dv2);
1057 if (MR::calcWhirlPoolAccelInfo(getTrans(), &stack_E0) && !MR::isNearZero(stack_E0, 0.001f)) {
1059 TVec3f stack_D4(stack_E0);
1060 MR::normalizeOrZero(&stack_D4);
1061 MR::vecBlendSphere(_60, stack_D4, &_60, 0.1f);
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) {
1068 PSMTXRotAxisRad(stack_1D0, _6C.toCVec(), angleDiff - 1.04719758034f);
1069 PSMTXMultVecSR(stack_1D0, _60.toCVec(), _60.toVec());
1071 else if (angleDiff < -cmp) {
1073 PSMTXRotAxisRad(stack_1A0, _6C.toCVec(), -(-angleDiff - 1.04719758034f));
1074 PSMTXMultVecSR(stack_1A0, _60.toCVec(), _60.toVec());
1078 decideEffect(
false);
1090 pushedByWaterWall();
1107 cFrontAcc[0] = 1.0f;
1108 cFrontAccSpin[0] = 1.0f;
1109 cFrontAccSpinSurface[0] = 1.0f;
1110 cWeightTableSP[0] = 1.0f;
TVec3f mPosition
3D vector of the actor's position.