diff --git a/include/NPC/NpcBase.hpp b/include/NPC/NpcBase.hpp index 01755ee40..ed08303ad 100644 --- a/include/NPC/NpcBase.hpp +++ b/include/NPC/NpcBase.hpp @@ -243,26 +243,27 @@ class TBaseNPC : public TSpineEnemy { } f32 getAnmOffDist_() { - bool bVar3 = false; - f32 fVar1 = gpCamera->mFar; - u32 uVar5 = unkD0->getCurrentAnmKind(); - f32 fVar2 = mPtrSaveNormal->mSLDanceAnmOffDist.get(); + bool useDanceDistance = false; + f32 distance = gpCamera->mFar; + int animationKind = unkD0->getCurrentAnmKind(); + f32 danceDistance = mPtrSaveNormal->mSLDanceAnmOffDist.get(); if (checkActionFlag(NPC_ACTION_HAPPY | NPC_ACTION_DANCE) - || mActorType == 0x400000D || uVar5 || uVar5 == 23) { - bVar3 = true; + || mActorType == 0x400000D || animationKind == NPC_ANM_KIND_MAD + || animationKind == NPC_ANM_KIND_UNK17) { + useDanceDistance = true; } - if (!isNerveMaybeDontCalcAnim0() && !isNerveMaybeDontCalcAnim1()) { - fVar1 = mIndividualParams->mWaitAnmOffDist1.get(); - if (bVar3 && fVar1 < fVar2) - fVar1 = fVar2; - } else { - fVar1 = mIndividualParams->mWaitAnmOffDist0.get(); - if (bVar3 && fVar1 < fVar2) - fVar1 = fVar2; + if (isNerveMaybeDontCalcAnim0()) { + distance = mIndividualParams->mWaitAnmOffDist0.get(); + if (useDanceDistance) + distance = danceDistance > distance ? danceDistance : distance; + } else if (isNerveMaybeDontCalcAnim1()) { + distance = mIndividualParams->mWaitAnmOffDist1.get(); + if (useDanceDistance) + distance = danceDistance > distance ? danceDistance : distance; } - return fVar1; + return distance; } void setNpcAnm_(EnumNpcAnmKind, EnumNpcStopMotionBlendOnOff); void requestNpcAnm_(EnumNpcAnmKind, EnumNpcStopMotionBlendOnOff); @@ -430,11 +431,20 @@ class TBaseNPC : public TSpineEnemy { void doThing() { - int iVar13 = mPtrSaveNormal->mSLGraphWanderMinFrame.get(); - int sVar1 = mPtrSaveNormal->mSLGraphWanderMaxFrame.get(); + int maxFrame = mPtrSaveNormal->mSLGraphWanderMaxFrame.get(); + int minFrame = mPtrSaveNormal->mSLGraphWanderMinFrame.get(); unk0 = 0; - unk4 = MsRandI(sVar1, iVar13); + unk4 = MsRandI(minFrame, maxFrame); + } + + void startGraphWait() + { + int maxFrame = mPtrSaveNormal->mSLGraphWaitMaxFrame.get(); + int minFrame = mPtrSaveNormal->mSLGraphWaitMinFrame.get(); + + unk0 = 0; + unk4 = MsRandI(minFrame, maxFrame); } bool doThing2() diff --git a/src/NPC/NpcAnm.cpp b/src/NPC/NpcAnm.cpp index d00b84f76..767eec58d 100644 --- a/src/NPC/NpcAnm.cpp +++ b/src/NPC/NpcAnm.cpp @@ -409,8 +409,6 @@ void TBaseNPC::npcFallIn() bool TBaseNPC::npcRecoverFromSinking() { - bool result = false; - if (!checkLiveFlag(LIVE_FLAG_UNK8000000)) { if (mMActor->getFrameCtrl(ANM_TYPE_BCK)->checkPass(32.0f)) { onLiveFlag(LIVE_FLAG_UNK8000000); @@ -428,6 +426,7 @@ bool TBaseNPC::npcRecoverFromSinking() } } + bool result = false; if (mMActor->isCurAnmAlreadyEnd(ANM_TYPE_BCK)) { result = true; offLiveFlag(LIVE_FLAG_AIRBORNE); diff --git a/src/NPC/NpcChange.cpp b/src/NPC/NpcChange.cpp index 07c444f4b..befa74809 100644 --- a/src/NPC/NpcChange.cpp +++ b/src/NPC/NpcChange.cpp @@ -464,52 +464,56 @@ void TBaseNPC::changeNerveProc_() | LIVE_FLAG_SINK_BOTTOM | LIVE_FLAG_UNK400000) && !checkActionFlag(NPC_ACTION_BURNING) && isClean()) { - if (isSunflowerReviving() && isNerveCanGoToTalk() + if (!isSunflowerReviving() && isNerveCanGoToTalk() && (mActorType != 0x4000006 || unkD0->getCurrentAnmKind() == NPC_ANM_KIND_UNK4) && !SMS_IsMarioOpeningDoor()) { + bool inCameraCube = true; if (gpMarDirector->mMap == 7) { JGeometry::TVec3 local_58 = mPosition; local_58.y += 75.0f; - if (SMS_IsInSameCameraCube(local_58)) - bVar5 = true; + inCameraCube = SMS_IsInSameCameraCube(local_58); } - f32 fVar1; - f32 fVar2; - if (mThrowCtrl != nullptr) { - fVar1 = mPtrSaveNormal->mSLThrowTalkAcceptHeight.get(); - fVar2 = mPtrSaveNormal->mSLThrowTalkAcceptDist.get(); - } else { - if (mActorType == 0x400001A) { - fVar2 = mPtrSaveNormal->mSLSunflowerLTalkDist.get(); + if (inCameraCube) { + f32 fVar1; + f32 fVar2; + if (mThrowCtrl != nullptr) { + fVar1 = mPtrSaveNormal->mSLThrowTalkAcceptHeight.get(); + fVar2 = mPtrSaveNormal->mSLThrowTalkAcceptDist.get(); } else { - fVar2 = mPtrSaveNormal->mTalkAcceptDist.get(); + if (mActorType == 0x400001A) { + fVar2 = mPtrSaveNormal->mSLSunflowerLTalkDist.get(); + } else { + fVar2 = mPtrSaveNormal->mTalkAcceptDist.get(); + } + fVar1 = mPtrSaveNormal->mTalkAcceptHeight.get(); } - fVar1 = mPtrSaveNormal->mTalkAcceptHeight.get(); - } - f32 fVar3; - if ((checkActionFlag(NPC_ACTION_UNK400 | NPC_ACTION_UNK1)) - || isSunflower() || mActorType == 0x400001D) { - fVar3 = mPtrSaveNormal->mSLSitTalkAcceptDegree.get(); - } else { - fVar3 = mPtrSaveNormal->mTalkAcceptDegree.get(); - } + f32 fVar3; + if ((checkActionFlag(NPC_ACTION_UNK400 | NPC_ACTION_UNK1)) + || isSunflower() || mActorType == 0x400001D) { + fVar3 = mPtrSaveNormal->mSLSitTalkAcceptDegree.get(); + } else { + fVar3 = mPtrSaveNormal->mTalkAcceptDegree.get(); + } - if (abs(SMS_GetMarioPos().y - mPosition.y) < fVar1 - && isInSight(SMS_GetMarioPos(), fVar2, fVar3, -1.0f) - && MsIsInSight( - SMS_GetMarioPos(), SHORTANGLE2DEG(*gpMarioAngleY), - mPosition, fVar2, - mPtrSaveNormal->mSLMarioTalkAcceptDegree.get(), 0.0f)) - bVar5 = true; + if (abs(SMS_GetMarioPos().y - mPosition.y) < fVar1 + && isInSight(SMS_GetMarioPos(), fVar2, fVar3, -1.0f) + && MsIsInSight( + SMS_GetMarioPos(), SHORTANGLE2DEG(*gpMarioAngleY), + mPosition, fVar2, + mPtrSaveNormal->mSLMarioTalkAcceptDegree.get(), + 0.0f)) + bVar5 = true; + } } } if (bVar5) { onLiveFlag(LIVE_FLAG_UNK20000); if (checkLiveFlag(LIVE_FLAG_UNK40000)) { + bVar4 = true; offLiveFlag(LIVE_FLAG_UNK40000); const TNerveBase* current = mSpine->getCurrentNerve(); @@ -550,7 +554,7 @@ void TBaseNPC::changeNerveProc_() unk15C->unk0 = 0; if (latestNerve == &TNerveNPCSink::theNerve()) { - if (gpPollution->isPolluted(mPosition.x, mPosition.y, mPosition.z)) + if (gpPollution->isPolluted(mPosition.x, unk1C4, mPosition.z)) return; mSpine->setNext(&TNerveNPCRecoverFromSink::theNerve()); diff --git a/src/NPC/NpcCollision.cpp b/src/NPC/NpcCollision.cpp index 0b362dae2..e5be2b87b 100644 --- a/src/NPC/NpcCollision.cpp +++ b/src/NPC/NpcCollision.cpp @@ -97,11 +97,11 @@ void TBaseNPC::execNpcObjCollision_() void TBaseNPC::setVariableDamageRadius_() { const TNpcInitInfo* initInfo = SMSGetNpcInitData(mActorType - 0x4000001); - f32 fVar6 = mScaling.x * initInfo->mDamageRadius; + f32 fVar6 = initInfo->mDamageRadius * mScaling.x; if (isBeTrampledNpc() && !SMS_IsMarioTouchGround4cm() && SMS_GetMarioPos().y > mPosition.y) { JGeometry::TVec3 diff; - diff.sub(mPosition, SMS_GetMarioPos()); + diff.sub(SMS_GetMarioPos(), mPosition); diff.y = 0.0f; if (diff.squared() < CLBSquared(fVar6 * 3.0f)) fVar6 = mIndividualParams->mSLDamageRadiusSmall.get(); diff --git a/src/NPC/NpcEvent.cpp b/src/NPC/NpcEvent.cpp index 6dbc23d84..c447d1cce 100644 --- a/src/NPC/NpcEvent.cpp +++ b/src/NPC/NpcEvent.cpp @@ -281,9 +281,9 @@ static void evFireStartDemoCamera(TSpcTypedInterp* interp, { interp->verifyArgNum(1, &arg_num); const char* cameraName = interp->pop().getDataString(); - gpMarDirector->fireStartDemoCamera(cameraName, nullptr, -1, 0.0f, true, - nullptr, 0, nullptr, - JDrama::TFlagT()); + SMSGetMarDirector()->fireStartDemoCamera(cameraName, nullptr, -1, 0.0f, + true, nullptr, 0, nullptr, + JDrama::TFlagT()); interp->push(); } @@ -377,20 +377,21 @@ void TNpcEvent::reviveOneSunflower() TBaseNPC* npc = static_cast(JDrama::TNameRefGen::search(acStack_50)); --mDownSunflowerNum; + JGeometry::TVec3* position = &npc->unk1B8; static const char* sCameraNames[] = { "ひまわりカメラ0", "ひまわりカメラ1", "ひまわりカメラ2", "ひまわりカメラ3", "ひまわりカメラ4", }; - gpMarDirector->fireStartDemoCamera(sCameraNames[idx], &npc->unk1B8, -1, + gpMarDirector->fireStartDemoCamera(sCameraNames[idx], position, -1, 0.0f, true, &ReviveSunflowerCallBack, (uintptr_t)npc, nullptr, 0); if (mDownSunflowerNum == 0) { gpItemManager->makeShineAppearWithDemo( - "ひまわり用シャイン", "ひまわりシャインカメラ", npc->unk1B8.x, - npc->unk1B8.y + 500.0f, npc->unk1B8.z); + "ひまわり用シャイン", "ひまわりシャインカメラ", position->x, + position->y + 500.0f, position->z); TFlagManager::getInstance()->setBool(false, 0x50003); } } diff --git a/src/NPC/NpcNerve.cpp b/src/NPC/NpcNerve.cpp index dc528825d..10b2563ce 100644 --- a/src/NPC/NpcNerve.cpp +++ b/src/NPC/NpcNerve.cpp @@ -77,7 +77,7 @@ DEFINE_NERVE(TNerveNPCGraphWait, TLiveActor) TBaseNPC* self = (TBaseNPC*)spine->getBody(); if (spine->getTime() == 0) - self->unk22C->doThing(); + self->unk22C->startGraphWait(); if (self->getMarchSpeed() < 0.001f) { if (self->unk22C->doThing2()) { @@ -114,13 +114,14 @@ DEFINE_NERVE(TNerveNPCWaitMarioApproach, TLiveActor) return true; } - if (self->getActorType() - 0x400001C > 1) { + u32 actorType = self->getActorType(); + if (actorType - 0x400001C > 1) { if (!self->isPeachTired()) { if (self->isSunflowerReviving()) { self->sunflowerReviving(); - } else if (self->getActorType() == 0x4000006) { + } else if (actorType == 0x4000006) { self->monteMESetAnmWhenFar(); self->execTurnToFirstState(); } else { @@ -149,11 +150,12 @@ DEFINE_NERVE(TNerveNPCTurnToMario, TLiveActor) return true; } - if (self->getActorType() - 0x400001C > 1) { + u32 actorType = self->getActorType(); + if (actorType - 0x400001C > 1) { if (!self->isPeachTired()) { if (self->isSunflowerReviving()) { self->sunflowerReviving(); - } else if (self->getActorType() == 0x4000006) { + } else if (actorType == 0x4000006) { self->monteMESetAnmWhenNear(); self->execTurnToFirstState(); } else if (self->isTurnToMarioWhenApproach()) {