1#include "Game/Player/MarioActor.hpp"
2#include "Game/Animation/XanimePlayer.hpp"
3#include "Game/Enemy/KariKariDirector.hpp"
4#include "Game/Gravity.hpp"
5#include "Game/LiveActor/Binder.hpp"
6#include "Game/Map/CollisionParts.hpp"
7#include "Game/Map/HitInfo.hpp"
8#include "Game/Map/WaterInfo.hpp"
9#include "Game/Player/MarioAnimator.hpp"
10#include "Game/Player/MarioConst.hpp"
11#include "Game/Player/MarioEffect.hpp"
12#include "Game/Player/MarioHolder.hpp"
13#include "Game/Player/MarioMessenger.hpp"
14#include "Game/Player/MarioNullBck.hpp"
15#include "Game/Player/MarioParts.hpp"
16#include "Game/Player/MarioShadow.hpp"
17#include "Game/Player/MarioSwim.hpp"
18#include "Game/Player/RushEndInfo.hpp"
19#include "Game/Screen/GameSceneLayoutHolder.hpp"
20#include "Game/Util/CameraUtil.hpp"
21#include "Game/Util/FootPrint.hpp"
22#include "JSystem/JAudio2/JAIAudible.hpp"
23#include "JSystem/JMath/JMath.hpp"
27 mParts = rOther.mParts;
29 mSensor = rOther.mSensor;
30 mNormals[0] = rOther.mNormals[0];
31 mNormals[1] = rOther.mNormals[1];
32 mNormals[2] = rOther.mNormals[2];
33 mNormals[3] = rOther.mNormals[3];
34 mPos[0] = rOther.mPos[0];
35 mPos[1] = rOther.mPos[1];
36 mPos[2] = rOther.mPos[2];
41MarioActor::MarioActor(
const char *pName) :
LiveActor(pName), _1B0(0xFFFFFFFF)
44 mMario =
new Mario(
this);
51 if (MR::isPlayerLuigi()) {
56 if (MR::isGalaxyDarkCometAppearInCurrentStage()) {
89 mSuperKinokoCollected =
false;
90 mPowerupCollected =
false;
91 mTransforming =
false;
96 _3B0 = 0.000003814697265625f;
148 for (
int i = 0; i < 6; i++) {
188 _1B0.set(0xFF, 0xFF, 0xFF, 0);
227static float BASE_ROTATION = 0.0f;
231 long initialAnimation = -1;
232 if (!MR::isValidInfo(rInfo)) {
235 TVec3f position, rotation, scale;
237 MR::getJMapInfoTrans(rInfo, &position);
238 MR::getJMapInfoRotate(rInfo, &rotation);
239 MR::getJMapInfoScale(rInfo, &scale);
241 rotation.x = BASE_ROTATION + (f32)fmod(rotation.x - BASE_ROTATION + 360.0f, 360.0);
242 rotation.y = BASE_ROTATION + (f32)fmod(rotation.y - BASE_ROTATION + 360.0f, 360.0);
243 rotation.z = BASE_ROTATION + (f32)fmod(rotation.z - BASE_ROTATION + 360.0f, 360.0);
245 if (MR::isExistJMapArg(rInfo)) {
246 MR::getJMapInfoArg0NoInit(rInfo, &initialAnimation);
248 init2(position, rotation, initialAnimation);
255void MarioActor::init2(
const TVec3f &a,
const TVec3f &b,
long initialAnimation)
259 if (MR::isPlayerLuigi()) {
264 mScale.set(TVec3f(1.0f, 1.0f, 1.0f));
265 mMario->setHeadAndFrontVecFromRotate(
mRotation);
266 mMario->_290 = mMario->_310;
267 updateBaseScaleMtx();
272 _C28 =
new DUMMY[MR::getJointNum(
this)];
274 MR::connectToScene(
this, 0x25, 0x9, 0x14, 0x22);
275 MR::initLightCtrlForPlayer(
this);
283 mMario->initAfterConst();
286 initNerve(&NrvMarioActor::MarioActorNrvWait::sInstance);
290 initBinder(60.0f, 1.0f, 8);
294 mBinder->_1EC._0 =
false;
295 MR::setBinderOffsetVec(
this, &_2C4,
false);
299 mBinder->_1EC._3 =
true;
301 MR::invalidateClipping(
this);
303 _240.setInline(0.0f, -1.0f, 0.0f);
316 initMorphStringTable();
317 MR::declareGlobalEventCameraAbyss(
"奈落カメラ");
318 MR::declareBlackHoleCamera(
"ブラックホール");
319 MR::declareGlobalEventCameraDead(
"昇天カメラ", 0.34999999404f, 0x78, 0x3C);
320 MR::declareGlobalEventCamera(
"水中フォロー");
321 MR::declareGlobalEventCamera(
"水中プラネット");
322 MR::declareGlobalEventCamera(
"水上フォロー");
323 MR::declareGlobalEventCamera(
"引き戻し");
324 MR::declareEventCameraProgrammable(
"変身初出カメラ");
330 MR::getMarioHolder()->setMarioActor(
this);
336 MR::setGameCameraTargetToPlayer();
339 _B48->setTexture(MR::getTexFromArc(
"Footprint.bti",
this));
340 switch (initialAnimation) {
342 mMario->changeAnimation(
"基本", (
const char *)
nullptr);
345 mMario->changeAnimationNonStop(
"ウォークイン");
348 mMario->changeAnimation(
"ステージインA", (
const char *)
nullptr);
351 updateTransForCamera();
357 _498 =
new FixedPosition(
this,
"HandR", TVec3f(0.0f, 0.0f, 0.0f), TVec3f(0.0f, 0.0f, 0.0f));
358 _49C =
new FixedPosition(
this,
"HandR", TVec3f(76.3300018311f, 15.6899995804f, 88.9899978638f), TVec3f(1.79999995232f, 52.5099983215f, 39.5800018311f));
362 _4B8.setInline(0.0f, 1.0f, 0.0f);
379 _F3C =
new JAIAudible[0x1E];
382 for (
int i = 0; i < 0x1E; i++) {
383 JAIAudible &rAudible = _F3C[i];
391void MarioActor::initAfterPlacement()
393 updateGravityVec(
true,
true);
395 mMario->_1F0 = -_240;
396 mMario->_1FC = -_240;
399 _2C4 = _240 % -70.0f;
401 MR::updateHitSensorsAll(
this);
402 _360 = getGravityVector();
404 _9F4 = getGravityVector();
406 calcBaseFrontVec(-_240);
409void MarioActor::initAfterOpeningDemo()
411 mMario->changeAnimationNonStop(
"ウォークイン");
415void MarioActor::calcBaseFrontVec(
const TVec3f &rVec)
417 TVec3f cross, j(0.0f, 1.0f, 0.0f);
420 _258.setInline(0.0f, 0.0f, 1.0f);
424 if (MR::makeAxisAndCosignVecToVec(&cross, &cosine, rVec, j)) {
425 TVec3f k(0.0f, 0.0f, 1.0f);
427 PSMTXRotAxisRad(transformation, cross.toCVec(), -JMAAcosRadian(cosine));
428 PSMTXMultVecSR(transformation, k.toCVec(), _258.toVec());
429 MR::normalize(&_258);
432 _258.setInline(0.0f, 0.0f, 1.0f);
437void MarioActor::playSound(
const char *pName,
long duration)
439 mMario->playSound(pName, duration);
442void MarioActor::changeAnimation(
const char *pName,
const char *pNewName)
444 mMario->changeAnimation(pName, pNewName);
447void MarioActor::changeAnimationNonStop(
const char *pName)
449 mMario->changeAnimationNonStop(pName);
452void MarioActor::changeAnimationUpper(
const char *pName)
455 if (isAnimationRun(
"基本")) {
456 mMario->changeAnimationUpper(pName,
nullptr);
460 mMario->changeAnimation(pName, (
const char *)
nullptr);
463void MarioActor::stopAnimation(
const char *pName)
465 mMario->stopAnimation(pName, (
const char *)
nullptr);
468bool MarioActor::isAnimationRun(
const char *pName)
const
470 return mMario->isAnimationRun(pName);
473void MarioActor::changeNullAnimation(
const char *pName,
signed char num)
475 mNullAnimation->appear();
476 MR::startBck(mNullAnimation, pName,
nullptr);
480bool MarioActor::isStopNullAnimation()
const
482 if (!MR::isBckStopped(mNullAnimation)) {
483 return MR::isDead(mNullAnimation);
488void MarioActor::changeGameOverAnimation()
491 if (mMario->isStatusActive(0x12)) {
492 mMario->closeStatus(
nullptr);
495 if (mMario->isAnimationRun(
"前方小ダメージ")) {
498 if (mMario->isAnimationRun(
"後方小ダメージ")) {
501 if (mMario->isAnimationRun(
"ファイアラン前兆")) {
504 if (mMario->isAnimationRun(
"炎のランナー")) {
507 if (mMario->isAnimationRun(
"電気ダメージ")) {
510 if (mMario->isAnimationRun(
"電気ダメージ終了")) {
513 if (mMario->isAnimationRun(
"炎ダメージ")) {
516 if (mMario->isAnimationRun(
"ファイアダンス")) {
519 if (mMario->isAnimationRun(
"中ダメージ")) {
522 if (mMario->isAnimationRun(
"中ダメージ空中")) {
525 if (mMario->isAnimationRun(
"中ダメージ着地")) {
528 if (mMario->isAnimationRun(
"中後ダメージ")) {
531 if (mMario->isAnimationRun(
"中後ダメージ空中")) {
534 if (mMario->isAnimationRun(
"中後ダメージ着地")) {
537 if (mMario->isAnimationRun(
"落下")) {
540 if (mMario->isAnimationRun(
"空中ふんばり")) {
543 if (mMario->isAnimationRun(
"つぶれ")) {
546 if (mMario->isAnimationRun(
"つぶれ復帰")) {
550 if (mMario->isAnimationRun(
"氷結") || mMario->isStatusActive(0xd)) {
554 if (mMario->isSwimming()) {
557 if (isNerve(&NrvMarioActor::MarioActorNrvGameOverSink::sInstance)) {
560 if (MR::getKariKariClingNum() && mMario->getMovementStates()._1) {
572 mMario->changeAnimationNonStop(
"座りダウン");
575 mMario->changeAnimationNonStop(
"感電ダウン");
578 mMario->changeAnimationNonStop(
"炎ダウン");
581 mMario->changeAnimationNonStop(
"仰向けダウン");
584 mMario->changeAnimationNonStop(
"俯せダウン");
587 if (mMario->getMovementStates()._1) {
588 mMario->changeAnimationNonStop(
"座りダウン");
591 mMario->changeAnimationNonStop(
"奈落ダウン");
595 mMario->changeAnimationNonStop(
"つぶれダウン");
598 mMario->changeAnimationNonStop(
"水泳ダウン");
601 mMario->changeAnimationNonStop(
"埋まりダウン");
604 mMario->changeAnimationNonStop(
"レース負け");
607 mMario->changeAnimationNonStop(
"水中レース負け");
618 return pCore->getJointTransform(MR::getJointIndex(
this, pName));
621bool MarioActor::isTurning()
const
623 return getMovementStates()._3;
626bool MarioActor::isDebugMode()
const
628 return getMovementStates()._16;
631void MarioActor::updateRotationInfo()
634 PSMTXConcat(
getBaseMtx(), _E3C.toMtxPtr(), stack_44.toMtxPtr());
635 MR::makeRTFromMtxPtr(
nullptr, &
mRotation, stack_44.toMtxPtr(),
true);
642 stack_44.getEuler(_318);
643 _318.scaleInline(57.2957763672f);
644 stack_44.getEuler(_324);
645 _324.scaleInline(57.2957763672f);
646 if (MR::isSameDirection(_240, mMario->_208, .01f)) {
651 TVec3f stack_8 = -_240;
652 MR::makeMtxUpFront(&stack_14, stack_8, mMario->_208);
653 MR::makeRTFromMtxPtr(
nullptr, &_A18, stack_14.toMtxPtr(),
true);
654 if (_A18.z > 90.0f && _A18.x > 90.0f) {
655 f32 diff = 180.0f - _A18.y;
663void MarioActor::exeWait()
674void MarioActor::movement()
679 PSMTXCopy(_AE0.toMtxPtr(), _AB0.toMtxPtr());
680 PSMTXCopy(MR::getCameraViewMtx(), _AE0.toMtxPtr());
683 _4AC = 0.785398185253f;
684 LiveActor::movement();
687 TVec3f stack_128(stack_134);
690 TVec3f stack_11C(_288);
692 if (MR::isOppositeDirection(_288, stack_11C, 0.01f)) {
693 f32 mag_288 = PSVECMag(_288.toCVec());
694 f32 magStack_11C = PSVECMag(stack_11C.toCVec());
695 if (!MR::isNearZero(mag_288, 0.001f) && !MR::isNearZero(magStack_11C, 0.001f) && MR::isNearZero(mag_288 - magStack_11C, 1.0f)) {
699 if (PSVECMag(stack_128.toCVec()) > 0.1f) {
700 if (!(getMovementStates()._A)) {
701 if (!MR::isNearZero(
mVelocity, 0.001f)) {
702 f32 diffMag = PSVECMag(_294.translateOpposite(_270).toCVec());
704 if (PSVECMag(stack_128.toCVec()) > 2.0f * (diffMag + vMag)) {
709 if (getMovementStates()._23 && PSVECMag(
mVelocity.toCVec()) < PSVECMag(stack_134.toCVec())) {
710 if (stack_134.dot(getGravityVec()) < -0.0f) {
712 MR::vecKillElement(
mVelocity, getGravityVec(), &stack_110);
713 if (MR::isNearZero(stack_110, 0.001f)) {
714 MR::vecKillElement(stack_134, getGravityVec(), &stack_110);
716 stack_110.setLength(PSVECMag(stack_134.toCVec()));
717 mMario->push(stack_110);
718 if (mMario->_3BC <= 2) {
719 f32 scale = PSVECMag(stack_128.toCVec());
723 mMario->_2D4 += -getGravityVec() % scale;
727 else if (getMovementStates()._23) {
728 TVec3f stack_104(mMario->_8F8);
729 MR::normalizeOrZero(&stack_104);
731 f32 elementA = MR::vecKillElement(stack_134, stack_104, &stack_F8);
732 f32 elementB = MR::vecKillElement(
mVelocity, stack_104, &stack_F8);
733 if (PSVECMag(
mVelocity.toCVec()) > 20.0f && elementA < elementB * 0.5f) {
734 if (mMario->isAnimationRun(
"坂すべり下向きあおむけ")) {
735 mMario->push(mMario->_208 % 5.0f);
737 else if (mMario->isAnimationRun(
"坂すべり上向きうつぶせ")) {
738 mMario->push(mMario->_208 % -5.0f);
740 mMario->mDrawStates._2 =
true;
743 if (getMovementStates()._0 && !_9F1) {
744 if (stack_128.dot(getGravityVec()) < -40.0f) {
745 TVec3f stack_EC(
mPosition.translateOpposite(getGravityVec() % 100.0f));
747 Triangle *pTmp = mMario->getTmpPolygon();
749 if (MR::getFirstPolyOnLineToMap(&stack_E0, pTmp, stack_EC, getGravityVec() % 200f)) {
751 if (MR::vecKillElement(stack_E0.translateOpposite(
mPosition), getGravityVec(), &stack_D4) < -5f && pTmp->mParts && !pTmp->mParts->_D4 && getMovementStates()._3E != 1) {
755 mMario->changeAnimation(
"基本",
"落下");
756 mMario->updateGroundInfo();
760 else if (stack_128.dot(getGravityVec()) > 40.0f) {
761 if (mMario->_4C8->isValid()) {
762 if (MR::isSensorPressObj(mMario->_4C8->mSensor)) {
763 mMario->mDrawStates._1E =
true;
767 const u32 stop = mBinder->_28;
768 for (
int i = 0; i < stop; i++) {
769 if (MR::isSensorPressObj(mBinder->getPlane(i)->mSensor)) {
770 mMario->mDrawStates._1E =
true;
774 if (mMario->_31C.translateOpposite(
mPosition).dot(getGravityVector()) < 0.0f) {
777 if (parts && !mMario->_45C->mParts->_D4) {
778 TVec3f stack_C8, stack_BC, stack_B0;
779 PSMTXMultVec(parts->mInvBaseMatrix.toMtxPtr(), mMario->_31C.toCVec(), stack_C8.toVec());
780 PSMTXMultVec(parts->mPrevBaseMatrix.toMtxPtr(), stack_C8.toCVec(), stack_BC.toVec());
781 stack_B0 = mMario->_31C.translateOpposite(stack_BC);
782 if (stack_B0.dot(stack_128) > 0.0f) {
790 if (!mMario->_5FC && (getDrawStates()._1E || getPrevDrawStates()._1E)) {
791 TVec3f stack_A4(stack_128);
792 MR::normalizeOrZero(&stack_A4);
801 else if (mMario->getMovementStates()._1) {
802 const u32 stop = mBinder->_28;
804 for (u32 i = 0; i < stop; i++) {
805 const Triangle *plane = mBinder->getPlane(i);
806 if (!MR::isSensorPressObj(plane->mSensor)) {
809 if (mMario->_368.dot(*plane->getNormal(0)) > 0.0f) {
810 if (mMario->_72C < 200.0f) {
813 else if (plane->getNormal(0)->dot(stack_134) < 0.0f) {
820 else if (plane->getNormal(0)->dot(stack_134) < 0.0f) {
823 else if (mMario->_5FC) {
824 if (!MR::isWallCodeNoAction(plane) && !mMario->isOnimasuBinderPressSkip()) {
826 mMario->_10._3E =
false;
827 *mMario->_4C8 = *plane;
836 f32 element = MR::vecKillElement(stack_134, mMario->_368, &stack_98);
841 if (mMario->mDrawStates._1A) {
842 mMario->mDrawStates._1A =
false;
843 mMarioAnim->MarioAnimator::update();
845 mMario->recordRelativePosition();
846 updateTransForCamera();
847 calcAnimInMovement();
850 _F3C_vec[_F40] = mMario->_208;
851 _F40 = (u16)(_F40 + 1) % _F42;
854void MarioActor::control()
856 if (mSuperKinokoCollected) {
857 if (MR::tryStartDemoWithoutCinemaFrame(
this,
"マリオスーパー化")) {
858 mSuperKinokoCollected =
false;
860 MR::stopAnimFrame(
this);
861 MR::requestPowerupHPMeter();
862 mMario->startPadVib(
"マリオ[変身]");
863 MR::startSystemSE(
"SE_SY_SUPER_KINOKO_GET", -1, -1);
867 else if (mPowerupCollected) {
868 if (MR::tryStartDemoWithoutCinemaFrame(
this,
"マリオ変身")) {
869 mPowerupCollected =
false;
870 mTransforming =
true;
872 MR::requestMovementOn(_9A4);
873 changeTeresaAnimation(
"change", -1);
876 MR::stopAnimFrame(
this);
878 mMario->startPadVib(
"マリオ[変身]");
885void MarioActor::control2()
887 if ((_3D8 && _3D4) || _3DA) {
895 if (getMovementStates()._1 && !MR::isSameMtx(mMario->_45C->getPrevBaseMtx()->toMtxPtr(), mMario->_45C->getBaseMtx()->toMtxPtr())) {
897 mMario->checkEnforceMove();
916 if (getDrawStates()._B) {
917 mBinder->_1EC._1 =
false;
920 mBinder->_1EC._1 =
true;
922 if (mMario->isDamaging()) {
928void MarioActor::controlMain()
934 updateActionTrigger();
935 updateControllerSwing();
936 updateControllerSwingLeft();
941 if (!isEnableMoveMario()) {
949 updateRotationInfo();
950 updateTakingPosition();
953 updateBeeWingAnimation();
959void MarioActor::updateBehavior()
973 _264 =
mPosition.translateOpposite(_270);
977 if (_B94 && !--_B94) {
978 mMario->stopAnimationUpper(
"ハンマー投げ回転中",
nullptr);
979 mMario->stopAnimation(
"ハンマー投げ回転中", (
const char *)
nullptr);
982 if (!doPressing() && !doStun() && !doRush()) {
983 updateGravityVec(
false,
false);
984 if (!tryJumpRush()) {
985 checkPriorRushTarget();
986 if (!tryThrow() && !tryStandardRush()) {
987 if (getMovementStates()._1) {
994 if (!checkClapCatchStart()) {
996 mMario->Mario::update();
1000 mMario->mDrawStates._1A =
true;
1007void MarioActor::updateBindRatio()
1009 if (!_934 && !MR::isNearZero(_978.translateOpposite(_264), 0.001f)) {
1010 f32 mag = PSVECMag(_978.toCVec());
1011 if (mag / PSVECMag(_978.translateOpposite(_264).toCVec()) < 2.0f) {
1018 else if (!MR::isNearZero(_978, 0.001f)) {
1021 _984 = MR::clamp(_984, 0.0f, 1.0f);
1024bool MarioActor::isInPunchTimerRange()
const
1028 ret = MR::isInRange(_945, 6.0f, 20.0f);
1033void MarioActor::updatePunching()
1036 bool canSpinring =
true;
1039 if (!_946 && !getMovementStates()._2B) {
1040 canSpinring =
false;
1042 if (canSpinring && !mMario->isSwimming() && !_944 && selectAction(
"スピン回復エフェクト") ==
true) {
1043 playEffect(
"スピンリング");
1045 bool canPunch = isInPunchTimerRange();
1046 if (!mMario->isSwimming()) {
1051 if (moveStates._8 || moveStates._1A || moveStates._19) {
1052 mMario->tryWallPunch();
1056 if (mMario->isAnimationRun(
"ハンマー投げリリース") && mMario->getMovementStates()._1 && !_38C && !mMario->_420 && mMario->Mario::isStickOn()) {
1057 mMario->stopAnimation(
nullptr, (
const char *)
nullptr);
1061bool MarioActor::doRush()
1069 updateGravityVec(
false,
false);
1070 if (!checkClapCatchStart() && _7DC) {
1076 mMario->updateGroundInfo();
1077 mMario->updateCubeCode();
1078 mMario->decDamageAfterTimer();
1079 if (selectWaterInOutRush(_924)) {
1081 if (!MR::getWaterAreaObj(&stack_44,
mPosition)) {
1082 mMario->forceExitSwim();
1085 else if (!selectWaterInOut(_924->mActor->
mName)) {
1086 s32 initial = mMario->mSwim->_144;
1087 mMario->mSwim->checkWaterCube(
false);
1088 if ((
int)mMario->mSwim->_144 != initial) {
1089 if (mMario->mSwim->_144 <= 1 && (u32)initial - 2 <= 1) {
1090 playEffectRT(
"水面ジャンプ水柱", mMario->mSwim->_160, mMario->mSwim->_16C);
1091 emitEffectWaterColumn(mMario->mSwim->_160, mMario->mSwim->_16C);
1093 else if ((u32)initial <= 1 && mMario->mSwim->_144 - 2 <= 1) {
1094 playEffectRT(
"水面ジャンプ水柱", -mMario->_328, mMario->mSwim->_16C);
1095 emitEffectWaterColumn(mMario->mSwim->_160, mMario->mSwim->_16C);
1099 MR::getGameSceneLayoutHolder().changeLifeMeterModeGround();
1100 mMario->forceExitSwim();
1102 else if (initial == 0) {
1103 MR::getGameSceneLayoutHolder().changeLifeMeterModeWater();
1107 if (mMario->isForceStopRush()) {
1108 bool received = _924->receiveMessage(0x95,
getSensor(
"body"));
1109 if (_934 && received) {
1110 RushEndInfo stack_20(
nullptr, 4, TVec3f(0.0f, 0.0f, 0.0f),
false, 0);
1114 mMarioAnim->setHoming();
1116 if (_934 && selectRecoverFlyMeter(_924)) {
1117 for (u32 i = 0; i < 4; i++) {
1118 mMario->incAirWalkTimer();
1130void MarioActor::updateSwingTimer()
1133 stopSpinTicoEffect(
false);
1139 if (_94C && --_94C == 6) {
1142 if (_94E && --_94E == 0) {
1143 mMario->startPadVib((
unsigned long)0);
1144 mMario->playSound(
"スピン回復終了", -1);
1146 stack_8.set(0x50, 0x80, 0xc8, 0);
1153 if (--_946 == 0x18) {
1154 selectAction(
"スピン回復エフェクト");
1155 stopEffectForce(
"スピンリング");
1164void MarioActor::updateSwingAction()
1166 if (isJumping() && _3D4 != 6 && !mMario->isStatusActive(0x18)) {
1169 bool requestRush = isRequestRush();
1170 bool requestSpinJump2P =
false;
1172 if (requestRush = isRequestSpinJump2P()) {
1173 requestSpinJump2P =
true;
1181 if (!isPunching()) {
1192 tryReleaseBombTeresa();
1195 bool canRush =
true;
1199 if (mMario->isAnimationRun(
"壁はじき")) {
1202 if (isJumping() && mMario->_428) {
1208 if (mMario->getCurrentStatus() == 1) {
1211 if (mMario->isSwimming()) {
1214 if (mMario->isStatusActive(0x18)) {
1217 if (mMario->isStatusActive(0x13)) {
1223 if (mMario->isStatusActive(2)) {
1235 u8 action = selectAction(
"スピンアタック");
1238 bool didSpinPunch =
true;
1239 if (!mMario->mMovementStates._F && isJumping() && !mMario->isDamaging() && !mMario->mMovementStates._2B) {
1244 mMario->trySpinJump(tmp);
1245 setPunchHitTimer(0x19);
1246 tryReleaseBombTeresa();
1247 if (requestSpinJump2P) {
1248 MR::start2PJumpAssistSound();
1251 else if (!getMovementStates()._F && !mMario->isAnimationRun(
"地上ひねり")) {
1252 const char *pLastAnimationName = mMarioAnim->_10->getCurrentAnimationName();
1254 if (!mMario->isAnimationRun(
"ハチスピン")) {
1255 didSpinPunch = trySpinPunch();
1259 didSpinPunch = trySpinPunch();
1262 if (pLastAnimationName != mMarioAnim->_10->getCurrentAnimationName()) {
1263 mMario->playSound(
"パンチ風切り", -1);
1268 if (!mMario->isAnimationRun(
"ハチスピン空中")) {
1269 mMario->playSound(
"声スピン", -1);
1270 mMario->playSound(
"スピンジャンプ", -1);
1272 mMario->changeAnimation(
"ハチスピン空中", (
const char *)
nullptr);
1274 else if (getMovementStates()._A || _9F1) {
1275 mMario->changeAnimation(
"サマーソルト", (
const char *)
nullptr);
1278 mMario->changeAnimation(
"ハチスピン", (
const char *)
nullptr);
1282 _946 = mConst->_0[mConst->_8]->_426 + 0x22;
1286 if (isEnableSpinPunch() && !mMario->isSwimming()) {
1291 if (isEnableSpinPunch()) {
1293 setPunchHitTimer(0x1e);
1297 if (mMario->_418 != 0) {
1300 mMario->startTeresaDisappear();
1301 const Constants *pConstants = mConst->_0[mConst->_8];
1302 _946 = pConstants->_6C8 + pConstants->_426;
1305 if (!isEnableSpinPunch()) {
1309 mMario->changeAnimation(
"ハチスピン空中", (
const char *)
nullptr);
1312 if (getMovementStates()._A || _9F1) {
1313 mMario->changeAnimation(
"サマーソルト", (
const char *)
nullptr);
1316 mMario->changeAnimation(
"ハチスピン", (
const char *)
nullptr);
1319 _946 = mConst->_0[mConst->_8]->_426 + 0x22;
1324void MarioActor::updateRealMtx()
1326 updateBaseScaleMtx();
1327 getRealMtx(_C2C.toMtxPtr(),
"HandL");
1328 getRealMtx(_C5C.toMtxPtr(),
"HandR");
1329 PSMTXCopy(MR::getJointMtx(
this,
"HandL"), _C8C.toMtxPtr());
1330 PSMTXCopy(MR::getJointMtx(
this,
"HandR"), _CBC.toMtxPtr());
1331 PSMTXCopy(MR::getJointMtx(
this,
"Face0"), _CEC.toMtxPtr());
1332 getRealMtx(_D1C.toMtxPtr(),
"FootR");
1333 getRealMtx(_D4C.toMtxPtr(),
"Spine1");
1334 getRealMtx(_D7C.toMtxPtr(),
"CapPosition");
1335 getRealMtx(_DAC.toMtxPtr(),
"Hip");
1336 getRealMtx(_DDC.toMtxPtr(),
"Spine2");
1338 MR::extractMtxTrans(_DDC.toMtxPtr(), &stack_50);
1339 if (MR::isNan(stack_50)) {
1340 MR::getJointMtx(
this,
"Spine2");
1343 bool notStatus12 =
true;
1344 if (mMario->isStatusActive(0x12)) {
1345 notStatus12 =
false;
1350 TVec3f stack_44, stack_38;
1351 MR::extractMtxTrans(_D7C.toMtxPtr(), &stack_44);
1352 MR::extractMtxTrans(_DAC.toMtxPtr(), &stack_38);
1353 _4B8 = stack_44.translateOpposite(stack_38);
1354 _4C4 = stack_38.translateOpposite(stack_44);
1355 if (MR::normalizeOrZero(&_4B8)) {
1356 _4B8 = mMario->_1F0;
1358 if (MR::normalizeOrZero(&_4C4)) {
1359 _4C4 = -mMario->_1F0;
1361 if (mMario->getMovementStates()._A && mMario->mMovementStates._1) {
1362 _4C4 = -mMario->_1F0;
1367void MarioActor::decLife(
unsigned short amt)
1369 if (getMovementStates()._1F) {
1372 if (_388 > 0 && amt > _388) {
1384 if (mMaxHealth == 3) {
1393 if (mMaxHealth == 3) {
1402void MarioActor::decLifeLarge()
1407void MarioActor::decLifeMiddle()
1412void MarioActor::decLifeSmall()
1417void MarioActor::resetWaterLife()
1422void MarioActor::updateLife()
1436static const char *sMiddleWaterLifeReduction =
"水中ライフ減少";
1438void MarioActor::incLife(
unsigned long amt)
1440 if (isEnableNerveChange() && !_3E4) {
1441 const u32 health = getHealth();
1442 if (mHealth != mMaxHealth) {
1443 mMario->playSound(
"ライフ回復", -1);
1446 if (mHealth >= mMaxHealth) {
1447 mHealth = mMaxHealth;
1449 if (health == 1 && mMarioAnim->isAnimationStop()) {
1450 mMarioAnim->_C->changeTrackAnimation(3,
"ノーマルウエイト");
1451 if (mMario->_970 && strcmp(mMario->_970,
"DamageWait")) {
1452 mMario->startBas(
nullptr,
false, 0.0f, 0.0f);
1459void MarioActor::changeMaxLife(
long max)
1462 while (mHealth != max) {
1463 if (mHealth > max) {
1466 else if (mHealth < max) {
1475bool MarioActor::doPressing()
1482 if (!mMario->checkVerticalPress(
false)) {
1483 if (--_390 == 0x1e && !mHealth && isEnableNerveChange()) {
1484 setNerve(&NrvMarioActor::MarioActorNrvGameOver::sInstance);
1487 mMario->changeAnimation(
"つぶれ解除", (
const char *)
nullptr);
1494 if (--_390 == 0x1e && !mHealth && isEnableNerveChange()) {
1495 setNerve(&NrvMarioActor::MarioActorNrvGameOver::sInstance);
1498 mMario->changeAnimation(
"つぶれ解除", (
const char *)
nullptr);
1506 mMario->mMovementStates._8 =
false;
1507 mMario->mMovementStates._19 =
false;
1508 mMario->mMovementStates._1A =
false;
1514 mMarioAnim->setSpeed(0.0f);
1515 mMario->_350.zero();
1516 mMario->_35C.zero();
1521void MarioActor::careMovingObject()
1526 if (getMovementStates()._1 && !MR::isSameMtx(mMario->_45C->getPrevBaseMtx()->toMtxPtr(), mMario->_45C->getBaseMtx()->toMtxPtr())) {
1528 mMario->checkEnforceMove();
1532 mMario->_160.zero();
1533 mMario->powerAreaMove();
1534 mMario->powerRailMove();
1535 mMario->_130 += mMario->_160;
1536 mMario->_160.zero();
1538 mMario->checkGround();
1539 mMario->updateFloorCode();
1542bool MarioActor::doStun()
1545 mMario->mDrawStates._1A =
true;
1547 if (getMovementStates()._1 && !MR::isSameMtx(mMario->_45C->getPrevBaseMtx()->toMtxPtr(), mMario->_45C->getBaseMtx()->toMtxPtr())) {
1549 mMario->checkEnforceMove();
1554 getStickValue(&stickX, &stickY);
1555 if (MR::isNearZero(stickX, 0.001f) && MR::isNearZero(stickY, 0.001f) && !getMovementStates()._A) {
1559 mMario->inputStick();
1567void MarioActor::scaleMtx(MtxPtr rawMtx)
1570 const TRot3f *pMtx = (TRot3f *)rawMtx;
1571 f32 scalar = 0.35f * (1.0f - _3B0) + 1.0f;
1575 f32 elementX = MR::vecKillElement(i, _3B4, &i);
1576 f32 elementY = MR::vecKillElement(j, _3B4, &j);
1577 f32 elementZ = MR::vecKillElement(k, _3B4, &k);
1584 i += _3B4 % elementX;
1585 j += _3B4 % elementY;
1586 k += _3B4 % elementZ;
1598void MarioActor::updateBaseScaleMtx()
1600 if (mMario->mMovementStates._3C) {
1604 PSMTXIdentity(_BF8.toMtxPtr());
The basis of a drawable actor that can contain states (see: Nerve)
TVec3f mRotation
3D vector of the actor's rotation.
TVec3f mPosition
3D vector of the actor's position.
TVec3f mScale
3D vector of the actor's scale.
TVec3f mVelocity
3D vector of the actor's velocity.
virtual MtxPtr getBaseMtx() const
Gets the base matrix of the model used for the actor.
HitSensor * getSensor(const char *pSensorName) const
Gets a sensor.
void init(const JMapInfoIter &)
Intializes the NameObj and can set various settings and construct necessary classes.
const char * mName
A string to identify the NameObj.