MapObj: Implement RiseMapPartsHolder (#919)

This commit is contained in:
Naii-the-Baf 2026-02-25 17:45:15 -06:00 committed by GitHub
parent c305fb1518
commit 84a0295905
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 436 additions and 31 deletions

View file

@ -82139,99 +82139,99 @@ MapObj/RiseMapPartsHolder.o:
- offset: 0x2fc448
size: 180
label: _ZN18RiseMapPartsHolderC2EPKc
status: NotDecompiled
status: Matching
- offset: 0x2fc4fc
size: 192
label: _ZN18RiseMapPartsHolderC1EPKc
status: NotDecompiled
status: Matching
- offset: 0x2fc5bc
size: 1084
label: _ZN18RiseMapPartsHolder4initERKN2al13ActorInitInfoE
status: NotDecompiled
status: NonMatchingMinor
- offset: 0x2fc9f8
size: 192
label: _ZN18RiseMapPartsHolder9startRiseEv
status: NotDecompiled
status: Matching
- offset: 0x2fcab8
size: 160
label: _ZN18RiseMapPartsHolder10receiveMsgEPKN2al9SensorMsgEPNS0_9HitSensorES5_
status: NotDecompiled
status: Matching
- offset: 0x2fcb58
size: 4
label: _ZN18RiseMapPartsHolder7exeWaitEv
status: NotDecompiled
status: Matching
- offset: 0x2fcb5c
size: 300
label: _ZN18RiseMapPartsHolder7exeMoveEv
status: NotDecompiled
status: Matching
- offset: 0x2fcc88
size: 132
label: _ZN18RiseMapPartsHolder17startRiseAllChildEv
status: NotDecompiled
status: Matching
- offset: 0x2fcd0c
size: 204
label: _ZN18RiseMapPartsHolder10exeMoveEndEv
status: NotDecompiled
status: Matching
- offset: 0x2fcdd8
size: 156
label: _ZN18RiseMapPartsHolder7exeStopEv
status: NotDecompiled
status: Matching
- offset: 0x2fce74
size: 4
label: _ZN18RiseMapPartsHolder14exeRequestDemoEv
status: NotDecompiled
status: Matching
- offset: 0x2fce78
size: 176
label: _ZN18RiseMapPartsHolder8exeDelayEv
status: NotDecompiled
status: Matching
- offset: 0x2fcf28
size: 224
label: _ZN18RiseMapPartsHolder9startDemoEb
status: NotDecompiled
status: Matching
- offset: 0x2fd008
size: 4
label: _ZNK12_GLOBAL__N_125RiseMapPartsHolderNrvWait7executeEPN2al11NerveKeeperE
status: NotDecompiled
status: Matching
guess: true
- offset: 0x2fd00c
size: 160
label: _ZNK12_GLOBAL__N_125RiseMapPartsHolderNrvStop7executeEPN2al11NerveKeeperE
status: NotDecompiled
status: Matching
guess: true
- offset: 0x2fd0ac
size: 8
label: _ZNK12_GLOBAL__N_125RiseMapPartsHolderNrvMove7executeEPN2al11NerveKeeperE
status: NotDecompiled
status: Matching
guess: true
- offset: 0x2fd0b4
size: 8
label: _ZNK12_GLOBAL__N_128RiseMapPartsHolderNrvMoveEnd7executeEPN2al11NerveKeeperE
status: NotDecompiled
status: Matching
guess: true
- offset: 0x2fd0bc
size: 4
label: _ZNK12_GLOBAL__N_132RiseMapPartsHolderNrvRequestDemo7executeEPN2al11NerveKeeperE
status: NotDecompiled
status: Matching
guess: true
- offset: 0x2fd0c0
size: 8
label: _ZNK12_GLOBAL__N_126RiseMapPartsHolderNrvDelay7executeEPN2al11NerveKeeperE
status: NotDecompiled
status: Matching
guess: true
- offset: 0x2fd0c8
size: 28
label: _ZNK2al10FunctorV0MIP18RiseMapPartsHolderMS1_FvvEEclEv
status: NotDecompiled
status: Matching
lazy: true
- offset: 0x2fd0e4
size: 76
label: _ZNK2al10FunctorV0MIP18RiseMapPartsHolderMS1_FvvEE5cloneEv
status: NotDecompiled
status: Matching
lazy: true
- offset: 0x2fd130
size: 4
label: _ZN2al10FunctorV0MIP18RiseMapPartsHolderMS1_FvvEED0Ev
status: NotDecompiled
status: Matching
lazy: true
MapObj/RiseMapPartsOld.o:
'.text':
@ -135903,7 +135903,7 @@ Scene/ProjectActorFactory.o:
- offset: 0x4bd14c
size: 52
label: _ZN2al19createActorFunctionI18RiseMapPartsHolderEEPNS_9LiveActorEPKc
status: NotDecompiled
status: Matching
lazy: true
- offset: 0x4bd180
size: 52

View file

@ -0,0 +1,28 @@
#pragma once
#include <basis/seadTypes.h>
#include <math/seadVector.h>
namespace al {
struct ActorInitInfo;
class LiveActor;
} // namespace al
class BarrierField;
namespace rs {
BarrierField* tryCreateBarrierField(const al::ActorInitInfo&);
void updateEyeMove(al::LiveActor*, const sead::Vector3f&, f32, const char*);
void resetEyeMove(al::LiveActor*, const char*);
void startBossBattle(const al::LiveActor*, s32);
void endBossBattle(const al::LiveActor*, s32);
s32 getBossBattleDeadCount(const al::LiveActor*, s32);
bool isAlreadyShowDemoBossBattleStart(const al::LiveActor*, s32, s32);
void saveShowDemoBossBattleStart(const al::LiveActor*, s32, s32);
bool isAlreadyShowDemoBossBattleEndKoopaLv2(const al::LiveActor*);
void saveShowDemoBossBattleEndKoopaLv2(const al::LiveActor*);
bool isAlreadyShowDemoMoonBasementCollapse(const al::LiveActor*);
void saveShowDemoMoonBasementCollapse(const al::LiveActor*);
bool isAlreadyDeadGK(const al::LiveActor*, s32, s32);
void onAlreadyDeadGK(const al::LiveActor*, s32, s32);
} // namespace rs

View file

@ -0,0 +1,295 @@
#include "MapObj/RiseMapPartsHolder.h"
#include <math/seadVector.h>
#include "Library/Camera/CameraUtil.h"
#include "Library/Demo/DemoFunction.h"
#include "Library/LiveActor/ActorClippingFunction.h"
#include "Library/LiveActor/ActorFlagFunction.h"
#include "Library/LiveActor/ActorInitFunction.h"
#include "Library/LiveActor/ActorInitInfo.h"
#include "Library/LiveActor/ActorInitUtil.h"
#include "Library/LiveActor/ActorSensorUtil.h"
#include "Library/LiveActor/LiveActorGroup.h"
#include "Library/Nerve/NerveSetupUtil.h"
#include "Library/Nerve/NerveUtil.h"
#include "Library/Placement/PlacementFunction.h"
#include "Library/Stage/StageSwitchUtil.h"
#include "Library/Thread/FunctorV0M.h"
#include "Boss/BossUtil/BossUtil.h"
#include "MapObj/RiseMapParts.h"
#include "System/GameDataFunction.h"
#include "System/GameDataHolderAccessor.h"
#include "System/GameDataUtil.h"
#include "System/SaveObjInfo.h"
#include "Util/DemoUtil.h"
#include "Util/PlayerDemoUtil.h"
#include "Util/SensorMsgFunction.h"
namespace {
NERVE_IMPL(RiseMapPartsHolder, Wait);
NERVE_IMPL(RiseMapPartsHolder, Move);
NERVE_IMPL(RiseMapPartsHolder, MoveEnd);
NERVE_IMPL(RiseMapPartsHolder, Stop);
NERVE_IMPL(RiseMapPartsHolder, RequestDemo);
NERVE_IMPL(RiseMapPartsHolder, Delay);
NERVES_MAKE_STRUCT(RiseMapPartsHolder, Wait, Stop, Move, MoveEnd, RequestDemo, Delay);
} // namespace
RiseMapPartsHolder::RiseMapPartsHolder(const char* name) : al::LiveActor(name) {}
// NON_MATCHING: https://decomp.me/scratch/lCb5J
void RiseMapPartsHolder::init(const al::ActorInitInfo& info) {
using RiseMapPartsHolderFunctor =
al::FunctorV0M<RiseMapPartsHolder*, void (RiseMapPartsHolder::*)()>;
al::initActorSceneInfo(this, info);
al::initActorPoseTRSV(this);
al::initActorClipping(this, info);
al::initExecutorUpdate(this, info, "コリジョン地形[Movement]");
al::initStageSwitch(this, info);
initHitSensor(1);
al::addHitSensorMapObj(this, info, "Body", 0.0f, 64, {0.0f, 0.0f, 0.0f});
mAddDemoInfo = al::registDemoRequesterToAddDemoInfo(this, info, 0);
if (al::isObjectNameSubStr(info, "Switch"))
mIsSwitch = true;
mLinkedShineIndex = GameDataFunction::tryFindLinkedShineIndex(this, info);
al::initNerve(this, &NrvRiseMapPartsHolder.Wait, 0);
_108 = rs::createSaveObjInfoWriteSaveData(info);
_110 = rs::createSaveObjInfoNoWriteSaveDataInSameWorld(info);
s32 childNum = al::calcLinkChildNum(info, "RiseParts");
mRiseMapPartsGroup = new al::DeriveActorGroup<RiseMapParts>("地形隆起パーツ", childNum);
for (s32 i = 0; i < childNum; i++) {
RiseMapParts* mapParts =
new RiseMapParts(al::getLinksActorDisplayName(info, "RiseParts", i));
al::initLinksActor(mapParts, info, "RiseParts", i);
mRiseMapPartsGroup->registerActor(mapParts);
}
if (al::isExistLinkChild(info, "PlayerRestartPos", 0)) {
al::getLinksMatrix(&mPlayerRestartPosMtx, info, "PlayerRestartPos");
mHasRestartPos = true;
}
bool isValidObjectCamera = false;
al::tryGetArg(&isValidObjectCamera, info, "IsValidObjectCamera");
if (isValidObjectCamera)
mDemoCamera = al::initDemoObjectCamera(this, info, nullptr, "固定");
al::tryGetArg(&mIsResetFirstPosInMiniGame, info, "ResetFirstPosInMiniGame");
al::tryGetArg(&mRelatedBoss, info, "RelatedBoss");
al::tryGetArg(&mDelayFrame, info, "DelayFrame");
if (mDelayFrame > -1)
mDelayFrame = -1;
if (mIsSwitch) {
makeActorAlive();
return;
}
bool isStageSwitchListening = al::listenStageSwitchOnStart(
this, RiseMapPartsHolderFunctor(this, &RiseMapPartsHolder::startRise));
bool isDead = false;
if (rs::isSequenceTimeBalloonOrRace(this))
isDead = true;
else if (mLinkedShineIndex < 0)
isDead = rs::isOnSaveObjInfo(_108);
else if (GameDataFunction::isGotShine(GameDataHolderAccessor(this), mLinkedShineIndex))
isDead = true;
else if (mLinkedShineIndex < 0)
isDead = rs::isOnSaveObjInfo(_108);
if (mRelatedBoss > -1)
isDead = rs::isAlreadyDeadGK(this, mRelatedBoss, 3);
if (isDead) {
if (rs::isSequenceTimeBalloonOrRace(this) && mIsResetFirstPosInMiniGame) {
makeActorDead();
al::setNerve(this, &NrvRiseMapPartsHolder.Wait);
return;
}
al::invalidateClipping(this);
al::setNerve(this, &NrvRiseMapPartsHolder.Stop);
makeActorAlive();
return;
}
if (al::listenStageSwitchOnAppear(
this, RiseMapPartsHolderFunctor(this, &RiseMapPartsHolder::startRise))) {
for (s32 i = 0; i < childNum; i++)
mRiseMapPartsGroup->getDeriveActor(i)->kill();
makeActorDead();
return;
}
if (isStageSwitchListening) {
makeActorAlive();
return;
}
s32 scenarioNo = -1;
if (!al::tryGetArg(&scenarioNo, info, "ScenarioNo")) {
makeActorDead();
return;
}
makeActorAlive();
}
void RiseMapPartsHolder::startRise() {
if (mRelatedBoss <= -1 && !mIsSwitch && rs::isOnSaveObjInfo(_108))
return;
if (al::isDead(this))
appear();
if (al::isNerve(this, &NrvRiseMapPartsHolder.Stop) ||
al::isNerve(this, &NrvRiseMapPartsHolder.Move) ||
al::isNerve(this, &NrvRiseMapPartsHolder.RequestDemo)) {
return;
}
if (!mIsSwitch)
rs::onSaveObjInfo(_110);
al::invalidateClipping(this);
rs::addDemoRiseMapPartsToList(this);
al::setNerve(this, &NrvRiseMapPartsHolder.RequestDemo);
}
bool RiseMapPartsHolder::receiveMsg(const al::SensorMsg* message, al::HitSensor* other,
al::HitSensor* self) {
if (rs::isMsgPlayerDisregardTargetMarker(message) ||
rs::isMsgPlayerDisregardHomingAttack(message) || al::isMsgPlayerDisregard(message) ||
al::isMsgSwitchOffInit(message)) {
return true;
}
if (rs::isMsgSwitchOnWithSaveRequest(message, &mSwitchOnSaveInfo)) {
startRise();
return true;
}
if (al::isMsgSwitchOnInit(message)) {
al::invalidateClipping(this);
al::setNerve(this, &NrvRiseMapPartsHolder.Stop);
return true;
}
return false;
}
void RiseMapPartsHolder::exeWait() {}
void RiseMapPartsHolder::exeMove() {
if (al::isFirstStep(this)) {
if (al::isActiveCameraInterpole(this, 0)) {
al::setNerve(this, &NrvRiseMapPartsHolder.Move);
return;
}
startRiseAllChild();
}
s32 actorCount = mRiseMapPartsGroup->getActorCount();
bool allStopped = true;
for (s32 i = 0; i < actorCount; i++) {
if (!mRiseMapPartsGroup->getDeriveActor(i)->isStop()) {
allStopped = false;
break;
}
}
if (allStopped) {
al::tryOnStageSwitch(this, "SwitchStopOn");
al::setNerve(this, &NrvRiseMapPartsHolder.MoveEnd);
}
}
void RiseMapPartsHolder::startRiseAllChild() {
if (!mIsSwitch && mRelatedBoss == -1)
rs::onSaveObjInfo(_108);
s32 actorCount = mRiseMapPartsGroup->getActorCount();
for (s32 i = 0; i < actorCount; i++)
mRiseMapPartsGroup->getDeriveActor(i)->startRise();
}
void RiseMapPartsHolder::exeMoveEnd() {
if (!al::isGreaterEqualStep(this, 90))
return;
if (mDemoCamera)
al::endCamera(this, mDemoCamera, -1, false);
if (mHasRestartPos) {
sead::Vector3f trans;
mPlayerRestartPosMtx.getTranslation(trans);
sead::Quatf quat = sead::Quatf::unit;
mPlayerRestartPosMtx.toQuat(quat);
rs::replaceDemoPlayer(this, trans, quat);
}
if (_188 && rs::isActiveDemo(this)) {
rs::requestEndDemoRiseMapParts(this);
if (mSwitchOnSaveInfo)
rs::onSaveObjInfo(mSwitchOnSaveInfo);
}
kill();
}
void RiseMapPartsHolder::exeStop() {
if (al::isFirstStep(this)) {
s32 actorCount = mRiseMapPartsGroup->getActorCount();
for (s32 i = 0; i < actorCount; i++)
mRiseMapPartsGroup->getDeriveActor(i)->setStop();
al::tryOnStageSwitch(this, "SwitchStopOn");
kill();
}
}
void RiseMapPartsHolder::exeRequestDemo() {}
void RiseMapPartsHolder::exeDelay() {
if (al::isGreaterEqualStep(this, mDelayFrame)) {
startRiseAllChild();
al::setNerve(this, &NrvRiseMapPartsHolder.Move);
}
}
// TODO: Rename `unk`
void RiseMapPartsHolder::startDemo(bool unk) {
al::invalidateClipping(this);
if (unk)
_188 = false;
if (mDemoCamera)
al::startCamera(this, mDemoCamera, -1);
if (mDelayFrame >= 0) {
al::setNerve(this, &NrvRiseMapPartsHolder.Delay);
return;
}
if (unk)
rs::addDemoActor(this, false);
else if (mSwitchActor)
rs::addDemoActor(mSwitchActor, false);
if (mRiseMapPartsArray)
for (s32 i = 0; i < mRiseMapPartsNum; i++)
rs::addDemoActor(mRiseMapPartsArray[i], false);
al::addDemoActorFromAddDemoInfo(this, mAddDemoInfo);
al::setNerve(this, &NrvRiseMapPartsHolder.Move);
}

View file

@ -1,19 +1,27 @@
#pragma once
#include <basis/seadTypes.h>
#include <math/seadMatrix.h>
#include "Library/LiveActor/LiveActor.h"
namespace al {
struct ActorInitInfo;
class AddDemoInfo;
class CameraTicket;
class HitSensor;
class LiveActorGroup;
class SensorMsg;
template <class T>
class DeriveActorGroup;
} // namespace al
class RiseMapParts;
class SaveObjInfo;
class RiseMapPartsHolder : public al::LiveActor {
public:
RiseMapPartsHolder(const char*);
RiseMapPartsHolder(const char* name);
void init(const al::ActorInitInfo& info) override;
void startRise();
bool receiveMsg(const al::SensorMsg* message, al::HitSensor* other,
@ -25,7 +33,7 @@ public:
void exeStop();
void exeRequestDemo();
void exeDelay();
void startDemo(bool);
void startDemo(bool unk);
void setSwitchActor(al::LiveActor* actor) { mSwitchActor = actor; }
@ -35,11 +43,23 @@ public:
}
private:
void* filler_108[13];
al::LiveActor* mSwitchActor;
RiseMapParts** mRiseMapPartsArray;
s32 mRiseMapPartsNum;
void* filler_188[2];
SaveObjInfo* _108 = nullptr;
SaveObjInfo* _110 = nullptr;
SaveObjInfo* mSwitchOnSaveInfo = nullptr;
al::CameraTicket* mDemoCamera = nullptr;
al::DeriveActorGroup<RiseMapParts>* mRiseMapPartsGroup = nullptr;
sead::Matrix34f mPlayerRestartPosMtx;
bool mHasRestartPos = false;
s32 mDelayFrame = -1;
bool mIsSwitch = false;
al::LiveActor* mSwitchActor = nullptr;
RiseMapParts** mRiseMapPartsArray = nullptr;
s32 mRiseMapPartsNum = 0;
s32 mLinkedShineIndex = -1;
bool _188 = true;
bool mIsResetFirstPosInMiniGame = false;
s32 mRelatedBoss = -1;
al::AddDemoInfo* mAddDemoInfo = nullptr;
};
static_assert(sizeof(RiseMapPartsHolder) == 0x198);

View file

@ -85,6 +85,7 @@
#include "MapObj/MoonWorldCaptureParadeLift.h"
#include "MapObj/PeachWorldTree.h"
#include "MapObj/PoleGrabCeil.h"
#include "MapObj/RiseMapPartsHolder.h"
#include "MapObj/RouletteSwitch.h"
#include "MapObj/SaveFlagCheckObj.h"
#include "MapObj/ShineTowerRocket.h"
@ -660,7 +661,7 @@ const al::NameToCreator<al::ActorCreatorFunction> sProjectActorFactoryEntries[]
{"RailMoveMapParts", al::createActorFunction<al::RailMoveMapParts>},
{"RiseMapParts", nullptr},
{"ReactionMapParts", nullptr},
{"RiseMapPartsHolder", nullptr},
{"RiseMapPartsHolder", al::createActorFunction<RiseMapPartsHolder>},
{"RocketFlower", nullptr},
{"RollingCubeMapParts", al::createActorFunction<al::RollingCubeMapParts>},
{"RippleFixMapParts", nullptr},

61
src/Util/PlayerDemoUtil.h Normal file
View file

@ -0,0 +1,61 @@
#pragma once
#include <basis/seadTypes.h>
#include <math/seadQuat.h>
#include <math/seadVector.h>
namespace al {
class LiveActor;
}
namespace rs {
void startActionDemoPlayer(const al::LiveActor*, const char*);
bool isActionEndDemoPlayer(const al::LiveActor*);
void setActionFrameRateDemoPlayer(const al::LiveActor*, f32);
void setActionFrameDemoPlayer(const al::LiveActor*, f32);
void clearDemoAnimInterpolatePlayer(const al::LiveActor*);
void hideDemoPlayer(const al::LiveActor*);
void showDemoPlayer(const al::LiveActor*);
void hideDemoPlayerSilhouette(const al::LiveActor*);
void showDemoPlayerSilhouette(const al::LiveActor*);
void addDemoLockOnCap(const al::LiveActor*);
void forcePutOnDemoCap(const al::LiveActor*);
void forcePutOffMarioHeadCap(const al::LiveActor*);
void hideDemoCap(const al::LiveActor*);
void showDemoCap(const al::LiveActor*);
void hideDemoCapSilhouette(const al::LiveActor*);
void showDemoCapSilhouette(const al::LiveActor*);
void killAllEffectPlayerAndCap(const al::LiveActor*);
const sead::Vector3f& getDemoPlayerTrans(const al::LiveActor*);
void setDemoPlayerQuat(const al::LiveActor*, const sead::Quatf&);
const sead::Quatf& getDemoPlayerQuat(const al::LiveActor*);
void replaceDemoPlayer(const al::LiveActor*, const sead::Vector3f&, const sead::Quatf&);
void validateIK(const al::LiveActor*);
void invalidateIK(const al::LiveActor*);
void validateWatchTarget(const al::LiveActor*, const sead::Vector3f&);
void invalidateWatchTarget(const al::LiveActor*);
void hideDemoPlayerAndStartDemoResetAction(const al::LiveActor*);
void calcDemoMarioJointPosAllRoot(sead::Vector3f*, const al::LiveActor*);
void invalidateMarioDitherFrame(const al::LiveActor*, s32);
void startMarioCapEyeAction(const al::LiveActor*, const char*);
void killMarioCapEye(const al::LiveActor*);
void startMarioRightHandAction(const al::LiveActor*, const char*);
f32 getMarioActionFrameMax(const al::LiveActor*);
void hideMarioGroundDepthShadow(const al::LiveActor*);
void showMarioGroundDepthShadow(const al::LiveActor*);
void setMarioGroundDepthShadowMapLength(const al::LiveActor*, f32);
void changeMarioDepthShadowMapSizeHight(const al::LiveActor*);
void changeMarioDepthShadowMapSizeNormal(const al::LiveActor*);
void setMarioDirectionalShadowMaskTypeNone(const al::LiveActor*);
void setMarioDirectionalShadowMaskTypeSelf(const al::LiveActor*);
void resetMarioDynamics(const al::LiveActor*);
void keepMarioCapVisibilityEndDemo(const al::LiveActor*);
void clearMarioFootPrint(const al::LiveActor*);
} // namespace rs
namespace PlayerDemoFunction {
void startCapCheckpointWarpMode(const al::LiveActor*);
void endMarioShadowMainShine(const al::LiveActor*);
void prepareSphinxQuizRouteKill(const al::LiveActor*);
void clearMarioStain(al::LiveActor*);
} // namespace PlayerDemoFunction