mirror of
https://github.com/MonsterDruide1/OdysseyDecomp
synced 2026-04-26 18:44:33 +00:00
112 lines
3.4 KiB
C++
112 lines
3.4 KiB
C++
#include "Library/MapObj/RailMoveMapParts.h"
|
|
|
|
#include "Library/Area/SwitchKeepOnAreaGroup.h"
|
|
#include "Library/Area/SwitchOnAreaGroup.h"
|
|
#include "Library/LiveActor/ActorActionFunction.h"
|
|
#include "Library/LiveActor/ActorAreaFunction.h"
|
|
#include "Library/LiveActor/ActorClippingFunction.h"
|
|
#include "Library/LiveActor/ActorInitUtil.h"
|
|
#include "Library/LiveActor/ActorModelFunction.h"
|
|
#include "Library/LiveActor/ActorPoseUtil.h"
|
|
#include "Library/LiveActor/ActorSensorUtil.h"
|
|
#include "Library/Movement/RailMoveMovement.h"
|
|
#include "Library/Nerve/NerveSetupUtil.h"
|
|
#include "Library/Nerve/NerveStateCtrl.h"
|
|
#include "Library/Nerve/NerveUtil.h"
|
|
#include "Library/Rail/RailUtil.h"
|
|
#include "Library/Stage/StageSwitchUtil.h"
|
|
#include "Library/Thread/FunctorV0M.h"
|
|
|
|
namespace al {
|
|
namespace {
|
|
NERVE_ACTION_IMPL(RailMoveMapParts, StandBy)
|
|
NERVE_ACTION_IMPL(RailMoveMapParts, MoveSign)
|
|
NERVE_ACTION_IMPL(RailMoveMapParts, Move)
|
|
|
|
NERVE_ACTIONS_MAKE_STRUCT(RailMoveMapParts, StandBy, MoveSign, Move)
|
|
} // namespace
|
|
|
|
RailMoveMapParts::RailMoveMapParts(const char* name) : LiveActor(name) {}
|
|
|
|
void RailMoveMapParts::init(const ActorInitInfo& info) {
|
|
using RailMoveMapPartsFunctor = FunctorV0M<RailMoveMapParts*, void (RailMoveMapParts::*)()>;
|
|
|
|
initNerveAction(this, "StandBy", &NrvRailMoveMapParts.collector, 1);
|
|
initMapPartsActor(this, info, nullptr);
|
|
registerAreaHostMtx(this, info);
|
|
|
|
if (isExistRail(this)) {
|
|
f32 radius = getClippingRadius(this);
|
|
setSyncRailToNearestPos(this);
|
|
mRailCoord = getRailCoord(this);
|
|
setRailClippingInfo(&mRailPos, this, 100.0f, radius);
|
|
}
|
|
|
|
RailMoveMovement* railMoveMovement = new RailMoveMovement(this, info);
|
|
initNerveState(this, railMoveMovement, NrvRailMoveMapParts.Move.data(), "レール移動");
|
|
initMaterialCode(this, info);
|
|
|
|
if (!listenStageSwitchOnStart(this, RailMoveMapPartsFunctor(this, &RailMoveMapParts::start)))
|
|
start();
|
|
|
|
if (listenStageSwitchOnStop(this, RailMoveMapPartsFunctor(this, &RailMoveMapParts::stop)))
|
|
stop();
|
|
|
|
mSwitchKeepOnAreaGroup = tryCreateSwitchKeepOnAreaGroup(this, info);
|
|
mSwitchOnAreaGroup = tryCreateSwitchOnAreaGroup(this, info);
|
|
|
|
trySyncStageSwitchAppear(this);
|
|
tryListenStageSwitchKill(this);
|
|
}
|
|
|
|
void RailMoveMapParts::start() {
|
|
if (isNerve(this, NrvRailMoveMapParts.StandBy.data()))
|
|
startNerveAction(this, "MoveSign");
|
|
}
|
|
|
|
void RailMoveMapParts::stop() {
|
|
if (isNerve(this, NrvRailMoveMapParts.Move.data()))
|
|
startNerveAction(this, "StandBy");
|
|
}
|
|
|
|
bool RailMoveMapParts::receiveMsg(const SensorMsg* message, HitSensor* other, HitSensor* self) {
|
|
if (isMsgShowModel(message)) {
|
|
showModelIfHide(this);
|
|
|
|
return true;
|
|
}
|
|
|
|
if (isMsgHideModel(message)) {
|
|
hideModelIfShow(this);
|
|
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
void RailMoveMapParts::control() {
|
|
if (mSwitchKeepOnAreaGroup)
|
|
mSwitchKeepOnAreaGroup->update(getTrans(this));
|
|
|
|
if (mSwitchOnAreaGroup)
|
|
mSwitchOnAreaGroup->update(getTrans(this));
|
|
}
|
|
|
|
void RailMoveMapParts::appearAndSetStart() {
|
|
setSyncRailToCoord(this, mRailCoord);
|
|
startNerveAction(this, "MoveSign");
|
|
}
|
|
|
|
void RailMoveMapParts::exeStandBy() {}
|
|
|
|
void RailMoveMapParts::exeMoveSign() {
|
|
if ((isFirstStep(this) && !tryStartAction(this, "MoveSign")) || isActionEnd(this))
|
|
startNerveAction(this, "Move");
|
|
}
|
|
|
|
void RailMoveMapParts::exeMove() {
|
|
updateNerveState(this);
|
|
}
|
|
} // namespace al
|