From 078ccd649c60c862acb3c47ab901ac3c1743f5cb Mon Sep 17 00:00:00 2001 From: Fuzzy2319 <61144247+Fuzzy2319@users.noreply.github.com> Date: Wed, 29 Jan 2025 23:42:05 +0100 Subject: [PATCH] Library/MapObj: Implement `SwingMapParts` (#321) --- data/odyssey_functions.csv | 48 ++++----- lib/al/Library/MapObj/SwingMapParts.cpp | 131 ++++++++++++++++++++++++ lib/al/Library/MapObj/SwingMapParts.h | 34 ++++++ lib/al/Library/Movement/SwingMovement.h | 2 + src/Scene/ProjectActorFactory.cpp | 3 +- 5 files changed, 193 insertions(+), 25 deletions(-) create mode 100644 lib/al/Library/MapObj/SwingMapParts.cpp create mode 100644 lib/al/Library/MapObj/SwingMapParts.h diff --git a/data/odyssey_functions.csv b/data/odyssey_functions.csv index a1edf310b..f58a1678c 100644 --- a/data/odyssey_functions.csv +++ b/data/odyssey_functions.csv @@ -30478,7 +30478,7 @@ Address,Quality,Size,Name 0x00000071004bd250,O,000052,_ZN2al19createActorFunctionINS_13SlideMapPartsEEEPNS_9LiveActorEPKc 0x00000071004bd284,O,000052,_ZN2al19createActorFunctionINS_19SubActorLodMapPartsEEEPNS_9LiveActorEPKc 0x00000071004bd2b8,O,000052,_ZN2al19createActorFunctionINS_12SurfMapPartsEEEPNS_9LiveActorEPKc -0x00000071004bd2ec,U,000052,_ZN2al19createActorFunctionINS_13SwingMapPartsEEEPNS_9LiveActorEPKc +0x00000071004bd2ec,O,000052,_ZN2al19createActorFunctionINS_13SwingMapPartsEEEPNS_9LiveActorEPKc 0x00000071004bd320,O,000052,_ZN2al19createActorFunctionINS_20SwitchDitherMapPartsEEEPNS_9LiveActorEPKc 0x00000071004bd354,U,000052,_ZN2al19createActorFunctionINS_19SwitchKeepOnWatcherEEEPNS_9LiveActorEPKc 0x00000071004bd388,O,000052,_ZN2al19createActorFunctionINS_18SwitchOpenMapPartsEEEPNS_9LiveActorEPKc @@ -58492,29 +58492,29 @@ Address,Quality,Size,Name 0x000000710091a238,O,000240,_ZN2al12SurfMapParts4initERKNS_13ActorInitInfoE 0x000000710091a328,O,000424,_ZN2al12SurfMapParts7exeWaitEv 0x000000710091a4d0,O,000008,_ZNK12_GLOBAL__N_119SurfMapPartsNrvWait7executeEPN2al11NerveKeeperE -0x000000710091a4d8,U,000168,_ZN2al13SwingMapPartsC2EPKc -0x000000710091a580,U,000180,_ZN2al13SwingMapPartsC1EPKc -0x000000710091a634,U,000380,_ZN2al13SwingMapParts4initERKNS_13ActorInitInfoE -0x000000710091a7b0,U,000092,_ZN2al13SwingMapParts5startEv -0x000000710091a80c,U,000008,_ZN2al13SwingMapParts18initAfterPlacementEv -0x000000710091a814,U,000172,_ZN2al13SwingMapParts10receiveMsgEPKNS_9SensorMsgEPNS_9HitSensorES5_ -0x000000710091a8c0,U,000020,_ZN2al13SwingMapParts7controlEv -0x000000710091a8d4,U,000004,_ZN2al13SwingMapParts10exeStandByEv -0x000000710091a8d8,U,000072,_ZN2al13SwingMapParts12exeMoveRightEv -0x000000710091a920,U,000072,_ZN2al13SwingMapParts11exeMoveLeftEv -0x000000710091a968,U,000096,_ZN2al13SwingMapParts7exeStopEv -0x000000710091a9c8,U,000004, -0x000000710091a9cc,U,000012, -0x000000710091a9d8,U,000072, -0x000000710091aa20,U,000012, -0x000000710091aa2c,U,000072, -0x000000710091aa74,U,000012, -0x000000710091aa80,U,000096, -0x000000710091aae0,U,000012, -0x000000710091aaec,U,000028,_ZNK2al10FunctorV0MIPNS_13SwingMapPartsEMS1_FvvEEclEv -0x000000710091ab08,U,000076,_ZNK2al10FunctorV0MIPNS_13SwingMapPartsEMS1_FvvEE5cloneEv -0x000000710091ab54,U,000004,_ZN2al10FunctorV0MIPNS_13SwingMapPartsEMS1_FvvEED0Ev -0x000000710091ab58,U,000140, +0x000000710091a4d8,O,000168,_ZN2al13SwingMapPartsC2EPKc +0x000000710091a580,O,000180,_ZN2al13SwingMapPartsC1EPKc +0x000000710091a634,O,000380,_ZN2al13SwingMapParts4initERKNS_13ActorInitInfoE +0x000000710091a7b0,O,000092,_ZN2al13SwingMapParts5startEv +0x000000710091a80c,O,000008,_ZN2al13SwingMapParts18initAfterPlacementEv +0x000000710091a814,O,000172,_ZN2al13SwingMapParts10receiveMsgEPKNS_9SensorMsgEPNS_9HitSensorES5_ +0x000000710091a8c0,O,000020,_ZN2al13SwingMapParts7controlEv +0x000000710091a8d4,O,000004,_ZN2al13SwingMapParts10exeStandByEv +0x000000710091a8d8,O,000072,_ZN2al13SwingMapParts12exeMoveRightEv +0x000000710091a920,O,000072,_ZN2al13SwingMapParts11exeMoveLeftEv +0x000000710091a968,O,000096,_ZN2al13SwingMapParts7exeStopEv +0x000000710091a9c8,O,000004,_ZNK12_GLOBAL__N_123SwingMapPartsNrvStandBy7executeEPN2al11NerveKeeperE +0x000000710091a9cc,O,000012,_ZNK12_GLOBAL__N_123SwingMapPartsNrvStandBy13getActionNameEv +0x000000710091a9d8,O,000072,_ZNK12_GLOBAL__N_125SwingMapPartsNrvMoveRight7executeEPN2al11NerveKeeperE +0x000000710091aa20,O,000012,_ZNK12_GLOBAL__N_125SwingMapPartsNrvMoveRight13getActionNameEv +0x000000710091aa2c,O,000072,_ZNK12_GLOBAL__N_124SwingMapPartsNrvMoveLeft7executeEPN2al11NerveKeeperE +0x000000710091aa74,O,000012,_ZNK12_GLOBAL__N_124SwingMapPartsNrvMoveLeft13getActionNameEv +0x000000710091aa80,O,000096,_ZNK12_GLOBAL__N_120SwingMapPartsNrvStop7executeEPN2al11NerveKeeperE +0x000000710091aae0,O,000012,_ZNK12_GLOBAL__N_120SwingMapPartsNrvStop13getActionNameEv +0x000000710091aaec,O,000028,_ZNK2al10FunctorV0MIPNS_13SwingMapPartsEMS1_FvvEEclEv +0x000000710091ab08,O,000076,_ZNK2al10FunctorV0MIPNS_13SwingMapPartsEMS1_FvvEE5cloneEv +0x000000710091ab54,O,000004,_ZN2al10FunctorV0MIPNS_13SwingMapPartsEMS1_FvvEED0Ev +0x000000710091ab58,O,000140,_GLOBAL__sub_I_SwingMapParts.cpp 0x000000710091abe4,O,000120,_ZN2al20SwitchDitherMapPartsC2EPKc 0x000000710091ac5c,O,000132,_ZN2al20SwitchDitherMapPartsC1EPKc 0x000000710091ace0,O,000184,_ZN2al20SwitchDitherMapParts4initERKNS_13ActorInitInfoE diff --git a/lib/al/Library/MapObj/SwingMapParts.cpp b/lib/al/Library/MapObj/SwingMapParts.cpp new file mode 100644 index 000000000..baa943e7f --- /dev/null +++ b/lib/al/Library/MapObj/SwingMapParts.cpp @@ -0,0 +1,131 @@ +#include "Library/MapObj/SwingMapParts.h" + +#include "Library/LiveActor/ActorActionFunction.h" +#include "Library/LiveActor/ActorAreaFunction.h" +#include "Library/LiveActor/ActorClippingFunction.h" +#include "Library/LiveActor/ActorInitFunction.h" +#include "Library/LiveActor/ActorModelFunction.h" +#include "Library/LiveActor/ActorMovementFunction.h" +#include "Library/LiveActor/ActorPoseKeeper.h" +#include "Library/LiveActor/ActorSensorMsgFunction.h" +#include "Library/MapObj/ChildStep.h" +#include "Library/Movement/SwingMovement.h" +#include "Library/Nerve/NerveSetupUtil.h" +#include "Library/Placement/PlacementFunction.h" +#include "Library/Stage/StageSwitchKeeper.h" +#include "Library/Thread/FunctorV0M.h" + +namespace { +using namespace al; + +NERVE_ACTION_IMPL(SwingMapParts, StandBy) +NERVE_ACTION_IMPL(SwingMapParts, MoveRight) +NERVE_ACTION_IMPL(SwingMapParts, MoveLeft) +NERVE_ACTION_IMPL(SwingMapParts, Stop) + +NERVE_ACTIONS_MAKE_STRUCT(SwingMapParts, StandBy, MoveRight, MoveLeft, Stop) +} // namespace + +namespace al { +SwingMapParts::SwingMapParts(const char* name) : LiveActor(name) {} + +void SwingMapParts::init(const ActorInitInfo& info) { + using SwingMapPartsFunctor = FunctorV0M; + + mSwingMovement = new SwingMovement(info); + + if (mSwingMovement->isLeft()) + initNerveAction(this, "MoveLeft", &NrvSwingMapParts.mCollector, 0); + else + initNerveAction(this, "MoveRight", &NrvSwingMapParts.mCollector, 0); + + tryInitSubActorKeeperChildStep(this, info); + initMapPartsActor(this, info, nullptr); + tryGetQuatPtr(this); + registerAreaHostMtx(this, info); + + mQuat = getQuat(this); + + createChildStep(info, this, true); + tryGetArg((s32*)&mRotateAxis, info, "RotateAxis"); + tryGetArg(&mIsFloorTouchStart, info, "IsFloorTouchStart"); + + if (mIsFloorTouchStart || + listenStageSwitchOnStart(this, SwingMapPartsFunctor(this, &SwingMapParts::start))) + startNerveAction(this, "StandBy"); + + rotateQuatLocalDirDegree(this, mQuat, (s32)mRotateAxis, mSwingMovement->getCurrentAngle()); + trySyncStageSwitchAppear(this); +} + +void SwingMapParts::start() { + if (!isNerve(this, NrvSwingMapParts.StandBy.data())) + return; + + if (mSwingMovement->isLeft()) + startNerveAction(this, "MoveLeft"); + else + startNerveAction(this, "MoveRight"); +} + +void SwingMapParts::initAfterPlacement() { + tryExpandClippingByDepthShadowLength(this, &mDepthShadowLength); +} + +bool SwingMapParts::receiveMsg(const SensorMsg* message, HitSensor* other, HitSensor* self) { + if (mIsFloorTouchStart && isMsgFloorTouch(message) && + isNerve(this, NrvSwingMapParts.StandBy.data())) { + if (mSwingMovement->isLeft()) + startNerveAction(this, "MoveLeft"); + else + startNerveAction(this, "MoveRight"); + + return true; + } + + if (isMsgShowModel(message)) { + showModelIfHide(this); + + return true; + } + + if (isMsgHideModel(message)) { + hideModelIfShow(this); + + return true; + } + + return false; +} + +void SwingMapParts::control() { + rotateQuatLocalDirDegree(this, mQuat, (s32)mRotateAxis, mSwingMovement->getCurrentAngle()); +} + +void SwingMapParts::exeStandBy() {} + +void SwingMapParts::exeMoveRight() { + mSwingMovement->updateNerve(); + + if (mSwingMovement->isStop()) + startNerveAction(this, "Stop"); +} + +void SwingMapParts::exeMoveLeft() { + mSwingMovement->updateNerve(); + + if (mSwingMovement->isStop()) + startNerveAction(this, "Stop"); +} + +void SwingMapParts::exeStop() { + mSwingMovement->updateNerve(); + + if (!mSwingMovement->isStop()) { + if (mSwingMovement->isLeft()) + startNerveAction(this, "MoveLeft"); + else + startNerveAction(this, "MoveRight"); + } +} +} // namespace al diff --git a/lib/al/Library/MapObj/SwingMapParts.h b/lib/al/Library/MapObj/SwingMapParts.h new file mode 100644 index 000000000..c31c2a63f --- /dev/null +++ b/lib/al/Library/MapObj/SwingMapParts.h @@ -0,0 +1,34 @@ +#pragma once + +#include "Library/LiveActor/LiveActor.h" +#include "Library/Math/Axis.h" + +namespace al { +class SwingMovement; + +class SwingMapParts : public LiveActor { +public: + SwingMapParts(const char* name); + + void init(const ActorInitInfo& info) override; + void initAfterPlacement() override; + bool receiveMsg(const SensorMsg* message, HitSensor* other, HitSensor* self) override; + void control() override; + + void start(); + + void exeStandBy(); + void exeMoveRight(); + void exeMoveLeft(); + void exeStop(); + +private: + sead::Quatf mQuat = sead::Quatf::unit; + SwingMovement* mSwingMovement = nullptr; + Axis mRotateAxis = Axis::None; + bool mIsFloorTouchStart = false; + sead::Vector3f mDepthShadowLength = {0.0f, 0.0f, 0.0f}; +}; + +static_assert(sizeof(SwingMapParts) == 0x138); +} // namespace al diff --git a/lib/al/Library/Movement/SwingMovement.h b/lib/al/Library/Movement/SwingMovement.h index c185ba1e4..3e02f2e10 100644 --- a/lib/al/Library/Movement/SwingMovement.h +++ b/lib/al/Library/Movement/SwingMovement.h @@ -18,6 +18,8 @@ class SwingMovement : public NerveExecutor { bool isLeft() const; bool isStop() const; + f32 getCurrentAngle() const { return mCurrentAngle; } + private: s32 mFrameInCycle = 0; s32 mDelayRate = 0; diff --git a/src/Scene/ProjectActorFactory.cpp b/src/Scene/ProjectActorFactory.cpp index c0fe8c230..55e3f70e3 100644 --- a/src/Scene/ProjectActorFactory.cpp +++ b/src/Scene/ProjectActorFactory.cpp @@ -19,6 +19,7 @@ #include "Library/MapObj/SlideMapParts.h" #include "Library/MapObj/SubActorLodMapParts.h" #include "Library/MapObj/SurfMapParts.h" +#include "Library/MapObj/SwingMapParts.h" #include "Library/MapObj/SwitchDitherMapParts.h" #include "Library/MapObj/SwitchOpenMapParts.h" #include "Library/MapObj/VisibleSwitchMapParts.h" @@ -597,7 +598,7 @@ static al::NameToCreator sProjectActorFactoryEntries[] {"SlideMapParts", al::createActorFunction}, {"SubActorLodMapParts", al::createActorFunction}, {"SurfMapParts", al::createActorFunction}, - {"SwingMapParts", nullptr}, + {"SwingMapParts", al::createActorFunction}, {"SwitchDitherMapParts", al::createActorFunction}, {"SwitchKeepOnWatcher", nullptr}, {"SwitchOpenMapParts", al::createActorFunction},