Skip to content

Commit

Permalink
Library/MapObj: Implement SwingMapParts (#321)
Browse files Browse the repository at this point in the history
  • Loading branch information
Fuzzy2319 authored Jan 29, 2025
1 parent cb69230 commit 078ccd6
Show file tree
Hide file tree
Showing 5 changed files with 193 additions and 25 deletions.
48 changes: 24 additions & 24 deletions data/odyssey_functions.csv
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
131 changes: 131 additions & 0 deletions lib/al/Library/MapObj/SwingMapParts.cpp
Original file line number Diff line number Diff line change
@@ -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<SwingMapParts*, void (SwingMapParts::*)()>;

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
34 changes: 34 additions & 0 deletions lib/al/Library/MapObj/SwingMapParts.h
Original file line number Diff line number Diff line change
@@ -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
2 changes: 2 additions & 0 deletions lib/al/Library/Movement/SwingMovement.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
3 changes: 2 additions & 1 deletion src/Scene/ProjectActorFactory.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -597,7 +598,7 @@ static al::NameToCreator<al::ActorCreatorFunction> sProjectActorFactoryEntries[]
{"SlideMapParts", al::createActorFunction<al::SlideMapParts>},
{"SubActorLodMapParts", al::createActorFunction<al::SubActorLodMapParts>},
{"SurfMapParts", al::createActorFunction<al::SurfMapParts>},
{"SwingMapParts", nullptr},
{"SwingMapParts", al::createActorFunction<al::SwingMapParts>},
{"SwitchDitherMapParts", al::createActorFunction<al::SwitchDitherMapParts>},
{"SwitchKeepOnWatcher", nullptr},
{"SwitchOpenMapParts", al::createActorFunction<al::SwitchOpenMapParts>},
Expand Down

0 comments on commit 078ccd6

Please sign in to comment.