1#include "Game/MapObj/RailMoveObj.hpp"
2#include "Game/MapObj/MapPartsRailMover.hpp"
3#include "Game/MapObj/MapPartsRailRotator.hpp"
4#include "Game/MapObj/StageEffectDataTable.hpp"
6RailMoveObj::RailMoveObj(
const char *pName) :
MapObjActor(pName) {
14 info.setupHioNode(
"地形オブジェ");
15 info.setupDefaultPos();
16 info.setupConnectToScene();
19 info.setupSoundPos(getSoundCalcPos());
20 info.setupGroupClipping(0x20);
22 info.setupRailMover();
23 info.setupRailPosture();
25 info.setupBaseMtxFollowTarget();
26 info.setupNerve(&NrvRailMoveObj::HostTypeMove::sInstance);
27 MapObjActorUtil::setupInitInfoTypical(&info, mObjectName);
28 setupInitInfo(rIter, &info);
29 initialize(rIter, info);
31 if (MR::isConnectedWithRail(rIter)) {
33 MR::calcModelBoundingRadius(&radius,
this);
34 MR::initAndSetRailClipping(&_C4,
this, 100.0f, radius);
37 setNerve(&NrvRailMoveObj::HostTypeDone::sInstance);
40 s32 condition_type = 0;
41 MR::getMapPartsArgMoveConditionType(&condition_type, rIter);
43 if (!MR::isMoveStartUnconditional(condition_type)) {
44 setNerve(&NrvRailMoveObj::HostTypeWaitForPlayerOn::sInstance);
47 if (MR::isDemoCast(
this, 0) && MR::tryRegisterDemoActionNerve(
this, &NrvRailMoveObj::HostTypeMove::sInstance, 0)) {
48 setNerve(&NrvRailMoveObj::HostTypeWait::sInstance);
52TVec3f* RailMoveObj::getSoundCalcPos() {
56void RailMoveObj::startClipped() {
57 MapObjActor::startClipped();
60 if (MR::StageEffect::isExistStageEffectData(mObjectName)) {
61 MR::StageEffect::stopShakingCameraMoving(
this, mObjectName);
66void RailMoveObj::endClipped() {
67 MapObjActor::endClipped();
70 if (MapObjActorUtil::isRailMoverWorking(
this)) {
71 if (!isNerve(&NrvRailMoveObj::HostTypeDone::sInstance)) {
72 if (MR::StageEffect::isExistStageEffectData(mObjectName)) {
73 MR::StageEffect::shakeCameraMoving(
this, mObjectName);
81 MapObjActor::initCaseUseSwitchB(rInitInfo);
82 setNerve(&NrvRailMoveObj::HostTypeWait::sInstance);
89void RailMoveObj::startMoveInner() {
90 MR::StageEffect::tryStageEffectStart(
this, mObjectName);
92 if (MR::isExistBck(
this, cMoveBckName)) {
93 MR::startBck(
this, cMoveBckName, 0);
96 if (MR::StageEffect::isExistStageEffectData(mObjectName)) {
97 MR::StageEffect::shakeCameraMoving(
this, mObjectName);
101void RailMoveObj::move() {
102 if (MapObjActorUtil::isRailMoverWorking(
this)) {
103 MR::StageEffect::tryStageEffectMoving(
this, mObjectName);
107void RailMoveObj::doAtEndPoint() {
108 MR::StageEffect::tryStageEffectStop(
this, mObjectName);
110 if (MR::isExistBck(
this, cMoveBckName) && MR::isBckPlaying(
this, cMoveBckName)) {
114 if (MR::StageEffect::isExistStageEffectData(mObjectName)) {
115 MR::StageEffect::stopShakingCameraMoving(
this, mObjectName);
119bool RailMoveObj::endMove() {
124bool RailMoveObj::isMoving()
const {
125 return MapObjActorUtil::isRailMoverWorking(
this);
129 if (msg == 0xCF && isNerve(&NrvRailMoveObj::HostTypeMove::sInstance)) {
137void RailMoveObj::exeWait() {
138 if (!isNerve(&NrvRailMoveObj::HostTypeDone::sInstance) && (!MR::isDemoCast(
this, 0) || !MR::isRegisteredDemoActionNerve(
this)) && (!MR::isValidSwitchB(
this) || MR::isOnSwitchB(
this)) && (!isNerve(&NrvRailMoveObj::HostTypeWaitForPlayerOn::sInstance) || MR::isOnPlayer(
this))) {
143bool RailMoveObj::tryStartMove() {
144 setNerve(&NrvRailMoveObj::HostTypeMove::sInstance);
148void RailMoveObj::exeMove() {
149 if (MR::isFirstStep(
this)) {
150 startMapPartsFunctions();
153 if (!_D0 && MapObjActorUtil::isRailMoverWorking(
this)) {
157 _D0 = MapObjActorUtil::isRailMoverWorking(
this);
160 if (mRailMover->isReachedEnd()) {
161 if (mRailMover->isDone() && endMove()) {
162 setNerve(&NrvRailMoveObj::HostTypeDone::sInstance);
170RailMoveObjPress::RailMoveObjPress(
const char *pName) :
RailMoveObj(pName) {
176 MR::setBodySensorType(
this, 0x76);
179RailMoveObjBreakAtEnd::RailMoveObjBreakAtEnd(
const char *pName) :
RailMoveObj(pName) {
183void RailMoveObjBreakAtEnd::doAtEndPoint() {
184 RailMoveObj::doAtEndPoint();
186 if (MR::isRegisteredEffect(
this,
"Break")) {
187 MR::emitEffect(
this,
"Break");
194 MR::connectToSceneIndirectMapObj(
this);
199 MR::invalidateShadow(
this, 0);
204 MR::listenStageSwitchOnA(
this, MR::Functor(
this, startFunc));
207void RailMoveObjSwitchShadow::startOnShadow() {
208 MR::validateShadow(
this, 0);
211RailDemoMoveObj::RailDemoMoveObj(
const char *pName) :
RailMoveObj(pName) {
218 mDemoControl->init(rIter);
222bool RailDemoMoveObj::tryStartMove() {
223 if (!mDemoControl->tryStart()) {
227 setNerve(&NrvRailMoveObj::HostTypeMove::sInstance);
231void RailDemoMoveObj::startMoveInner() {
232 const char* start_sound = MR::StageEffect::getStartSe(mObjectName);
235 MR::startSound(
this, start_sound, -1, -1);
239void RailDemoMoveObj::move() {
240 mDemoControl->update();
242 if (MapObjActorUtil::isRailMoverWorking(
this)) {
243 const char* moving_sound = MR::StageEffect::getMovingSe(mObjectName);
246 MR::startLevelSound(
this, moving_sound, -1, -1, -1);
251bool RailDemoMoveObj::endMove() {
252 MR::validateClipping(
this);
254 if (!mDemoControl->isExistEndFrame()) {
258 const char* stop_sound = MR::StageEffect::getStopSe(mObjectName);
260 MR::startSound(
this, stop_sound, -1, -1);
263 return mDemoControl->isDone();
266RailRotateMoveObj::RailRotateMoveObj(
const char *pName) :
RailMoveObj(pName) {
271 pInfo->setupRailRotator();
276 return tryStartRotateAtPoint();
280 mRailMover->endRotateAtPoint();
285 return tryStartRotateBetweenPoints();
288 return RailMoveObj::receiveOtherMsg(msg, a2, a3);
292 setNerve(&NrvRailMoveObj::HostTypeWait::sInstance);
294 MR::listenStageSwitchOffB(
this, MR::Functor(
this, pauseFunc));
297bool RailRotateMoveObj::tryStartRotateAtPoint() {
298 s32 cur_point = MR::getCurrentRailPointNo(
this);
299 if (!mRailRotator->hasRotation(cur_point)) {
303 if (mRailRotator->hasRotationBetweenPoints(cur_point)) {
307 mRailRotator->rotateAtPoint(cur_point);
311bool RailRotateMoveObj::tryStartRotateBetweenPoints() {
313 s32 cur_point = MR::getCurrentRailPointNo(
this);
315 if (!rail_rotator->hasRotationBetweenPoints(cur_point)) {
319 f32 next_time = 0.0f;
320 mRailMover->calcTimeToNextRailPoint(&next_time);
322 s32 new_point = MR::getCurrentRailPointNo(
this);
323 uhm->rotateBetweenPoints(new_point, next_time);
327namespace NrvRailMoveObj {
328 INIT_NERVE(HostTypeWait);
329 INIT_NERVE(HostTypeWaitForPlayerOn);
330 INIT_NERVE(HostTypeMove);
331 INIT_NERVE(HostTypeDone);
333 void HostTypeDone::execute(
Spine *pSpine)
const {
338 void HostTypeMove::execute(
Spine *pSpine)
const {
343 void HostTypeWaitForPlayerOn::execute(
Spine *pSpine)
const {
348 void HostTypeWait::execute(
Spine *pSpine)
const {
354RailMoveObjPress::~RailMoveObjPress() {
358RailMoveObjBreakAtEnd::~RailMoveObjBreakAtEnd() {
362RailMoveIndirectObj::~RailMoveIndirectObj() {
366RailMoveObjSwitchShadow::~RailMoveObjSwitchShadow() {
370RailDemoMoveObj::~RailDemoMoveObj() {
374RailRotateMoveObj::~RailRotateMoveObj() {
virtual void init(const JMapInfoIter &)
Intializes the NameObj and can set various settings and construct necessary classes.
virtual void init(const JMapInfoIter &)
Intializes the NameObj and can set various settings and construct necessary classes.
virtual void init(const JMapInfoIter &)
Intializes the NameObj and can set various settings and construct necessary classes.
virtual void init(const JMapInfoIter &)
Intializes the NameObj and can set various settings and construct necessary classes.
virtual void init(const JMapInfoIter &)
Intializes the NameObj and can set various settings and construct necessary classes.