1#include "Game/MapObj/MapObjActor.hpp"
2#include "Game/MapObj/MapPartsRotator.hpp"
3#include "Game/MapObj/MapPartsRailMover.hpp"
4#include "Game/MapObj/MapPartsRailGuideDrawer.hpp"
5#include "Game/MapObj/MapPartsRailPosture.hpp"
6#include "Game/MapObj/MapPartsRailRotator.hpp"
7#include "Game/LiveActor/MaterialCtrl.hpp"
8#include "Game/LiveActor/ModelObj.hpp"
9#include "Game/LiveActor/LodCtrl.hpp"
10#include "Game/MapObj/StageEffectDataTable.hpp"
11#include "Game/Util.hpp"
16NrvMapObjActor::HostTypeDone NrvMapObjActor::HostTypeDone::sInstance;
17NrvMapObjActor::HostTypeMove NrvMapObjActor::HostTypeMove::sInstance;
18NrvMapObjActor::HostTypeWait NrvMapObjActor::HostTypeWait::sInstance;
20MapObjActor::MapObjActor(
const char *pName) :
LiveActor(pName) {
34 mWaitNrv = &NrvMapObjActor::HostTypeWait::sInstance;
35 mMoveNrv = &NrvMapObjActor::HostTypeMove::sInstance;
36 mDoneNrv = &NrvMapObjActor::HostTypeDone::sInstance;
39MapObjActor::MapObjActor(
const char *pName,
const char *pObjName) :
LiveActor(pName) {
40 mObjectName = pObjName;
52 mWaitNrv = &NrvMapObjActor::HostTypeWait::sInstance;
53 mMoveNrv = &NrvMapObjActor::HostTypeMove::sInstance;
54 mDoneNrv = &NrvMapObjActor::HostTypeDone::sInstance;
62 MR::getObjectName(&mObjectName, rIter);
65void MapObjActor::initAfterPlacement() {
74 mMatrixSetter->updateMtxUseBaseMtx();
77void MapObjActor::appear() {
81 mBloomModel->appear();
84 if (MR::isExistEffectKeeper(
this)) {
85 const char* appearEffectName = cEffectNameAppear;
86 if (MR::isRegisteredEffect(
this, appearEffectName)) {
87 MR::emitEffect(
this, appearEffectName);
91 if (!MR::isEqualString(mObjectName,
"DarkHopperRotateStepA")) {
92 const char* startSound = MR::StageEffect::getStartSe(mObjectName);
95 MR::startSound(
this, startSound, -1, -1);
100 MR::startSystemSE(
"SE_SY_READ_RIDDLE_S", -1, -1);
104void MapObjActor::kill() {
105 if (MR::isValidSwitchDead(
this)) {
106 MR::onSwitchDead(
this);
120bool MapObjActor::isObjectName(
const char *pName)
const {
121 return MR::isEqualString(pName, mObjectName);
125 if (rInfo.mConnectToScene) {
126 if (MR::isExistCollisionResource(
this, mObjectName)) {
127 s32 type = rInfo._5C;
130 MR::connectToSceneCollisionMapObjStrongLight(
this);
132 else if (type == 2) {
133 MR::connectToSceneCollisionMapObjWeakLight(
this);
136 MR::connectToSceneCollisionMapObj(
this);
139 else if (rInfo._5C == 1) {
140 MR::connectToSceneMapObjStrongLight(
this);
143 MR::connectToSceneMapObj(
this);
159 MR::listenStageSwitchOnOffB(
this, MR::Functor(
this, end), MR::Functor(
this, start));
163 MapObjActorUtil::startAllMapPartsFunctions(
this);
166void MapObjActor::control() {
167 if (!tryEmitWaitEffect()) {
168 tryDeleteWaitEffect();
171 if (mPlanetLodCtrl) {
172 mPlanetLodCtrl->update();
176 mRailPosture->movement();
180 mRailMover->movement();
182 if (mRailMover->isWorking()) {
184 mRailMover->tryResetPositionRepeat();
189 mRotator->movement();
190 if (mRotator->isOnReverse()) {
191 const char* startSound = MR::StageEffect::getStartSe(mObjectName);
194 MR::startSound(
this, startSound, -1, -1);
200 mRailRotator->movement();
203 if (!mRailMover && !mRotator && !mRailRotator && !MR::isEqualString(mObjectName,
"OceanRingRuinsMove")) {
204 const char* movingSound = MR::StageEffect::getMovingSe(mObjectName);
206 MR::startLevelSound(
this, movingSound, -1, -1, -1);
210 if (mRailGuideDrawer) {
211 mRailGuideDrawer->movement();
218 if (MR::isExistMirrorCamera() && _B5) {
219 MR::setMirrorReflectionInfoFromModel(
this);
226 if (mRotator && mRotator->isWorking()) {
233 if (mRailRotator && mRailRotator->isWorking()) {
245 if (mRailPosture && mRailPosture->isWorking()) {
261 if (mRailPosture && mRailPosture->isWorking()) {
262 mtx.concat(mRailPosture->_18);
265 if (mRotator && mRotator->isWorking()) {
266 mtx.concat(mRotator->getRotateMtx());
269 if (mRailRotator && mRailRotator->isWorking()) {
270 mtx.concat(mRailRotator->_5C);
276 MR::setBaseTRMtx(
this, mtx);
280void MapObjActor::startClipped() {
282 LiveActor::startClipped();
285void MapObjActor::endClipped() {
286 LiveActor::endClipped();
287 tryDeleteWaitEffect();
294 snprintf(buf, 0x100,
"%s", rInfo._80);
297 snprintf(buf, 0x100,
"%sBreak", mObjectName);
300 if (!MR::isExistModel(buf)) {
304 if (MR::isEqualString(mObjectName,
"SandUpDownTowerBreakableWallB")) {
306 mModelObj = MR::createModelObjMapObj(
"壊れモデル", buf, baseMtx);
310 mModelObj = MR::createModelObjMapObjStrongLight(
"壊れモデル", buf, baseMtx);
313 mModelObj->makeActorDead();
318bool MapObjActor::tryEmitWaitEffect() {
319 if (!MR::isExistEffectKeeper(
this)) {
323 if (!MR::isRegisteredEffect(
this, mObjectName)) {
327 if (MR::calcCameraDistanceZ(
mPosition) > 4000.0f) {
331 if (MR::isEffectValid(
this, mObjectName)) {
335 MR::emitEffect(
this, mObjectName);
339bool MapObjActor::tryDeleteWaitEffect() {
340 if (!MR::isExistEffectKeeper(
this)) {
344 if (!MR::isRegisteredEffect(
this, mObjectName)) {
348 if (MR::calcCameraDistanceZ(
mPosition) <= 4000.0f) {
352 if (MR::isNearPlayer(
this, 4000.0f)) {
356 if (!MR::isEffectValid(
this, mObjectName)) {
360 MR::deleteEffect(
this, mObjectName);
364void MapObjActor::startMapPartsFunctions() {
365 MapObjActorUtil::startAllMapPartsFunctions(
this);
368void MapObjActor::endMapPartsFunctions() {
369 MapObjActorUtil::endAllMapPartsFunctions(
this);
372void MapObjActor::pauseMapPartsFunctions() {
373 MapObjActorUtil::pauseAllMapPartsFunctions(
this);
376void MapObjActor::setStateWait() {
380void MapObjActor::updateProjmapMtx() {
381 if (!mMatrixSetter) {
389 mMatrixSetter->updateMtxUseBaseMtx();
392void MapObjActor::exeWait() {
393 if (MR::isValidSwitchA(
this) && MR::isOnSwitchA(
this)) {
394 MapObjActorUtil::startAllMapPartsFunctions(
this);
399void MapObjActor::exeMove() {
400 if (MR::isFirstStep(
this)) {
401 const char* moveName = cBckNameMove;
402 if (MR::isExistBck(
this, moveName)) {
403 MR::startBck(
this, moveName, 0);
407 if (MR::isExistBck(
this, cBckNameMove) && MR::isBckStopped(
this)) {
412void MapObjActorUtil::startAllMapPartsFunctions(
const MapObjActor *pActor) {
413 if (pActor->mRotator) {
414 pActor->mRotator->start();
417 if (pActor->mRailMover) {
418 pActor->mRailMover->start();
421 if (pActor->mRailRotator) {
422 pActor->mRailRotator->start();
425 if (pActor->mRailPosture) {
426 pActor->mRailPosture->start();
429 if (pActor->mRailGuideDrawer) {
430 pActor->mRailGuideDrawer->start();
434void MapObjActorUtil::endAllMapPartsFunctions(
const MapObjActor *pActor) {
435 if (pActor->mRotator) {
436 pActor->mRotator->end();
439 if (pActor->mRailMover) {
440 pActor->mRailMover->end();
443 if (pActor->mRailRotator) {
444 pActor->mRailRotator->end();
447 if (pActor->mRailPosture) {
448 pActor->mRailPosture->end();
452void MapObjActorUtil::pauseAllMapPartsFunctions(
const MapObjActor *pActor) {
453 if (pActor->mRotator) {
454 pActor->mRotator->_14 = 0;
457 if (pActor->mRailMover) {
458 pActor->mRailMover->_14 = 0;
461 if (pActor->mRailRotator) {
462 pActor->mRailRotator->_14 = 0;
466void MapObjActorUtil::resumeAllMapPartsFunctions(
const MapObjActor *pActor) {
467 if (pActor->mRotator) {
468 pActor->mRotator->_14 = 1;
471 if (pActor->mRailMover) {
472 pActor->mRailMover->_14 = 1;
475 if (pActor->mRailRotator) {
476 pActor->mRailRotator->_14 = 1;
480bool MapObjActorUtil::isRotatorMoving(
const MapObjActor *pActor) {
481 return pActor->mRotator->isMoving();
484bool MapObjActorUtil::isRailMoverWorking(
const MapObjActor *pActor) {
485 return pActor->mRailMover->isWorking();
488bool MapObjActorUtil::isRailMoverReachedEnd(
const MapObjActor *pActor) {
489 return pActor->mRailMover->isReachedEnd();
492f32 MapObjActorUtil::getSeesaw1AxisAngularSpeed(
const MapObjActor *pActor) {
493 return pActor->mRotator->_40.mMtx[2][2];
496void MapObjActorUtil::forceRotateSeesaw1Axis(
const MapObjActor *pActor, f32 a2) {
497 pActor->mRotator->_40.mMtx[2][3] = a2;
500void MapObjActorUtil::startRotator(
const MapObjActor *pActor) {
501 pActor->mRotator->start();
504void MapObjActorUtil::startRailMover(
const MapObjActor *pActor) {
505 pActor->mRailMover->start();
508void MapObjActorUtil::endRotator(
const MapObjActor *pActor) {
509 pActor->mRotator->end();
512void MapObjActorUtil::pauseRotator(
const MapObjActor *pActor) {
513 pActor->mRotator->_14 = 0;
516void MapObjActorUtil::resetRailMoverToInitPos(
const MapObjActor *pActor) {
517 pActor->mRailMover->resetToInitPos();
520void MapObjActorUtil::startBreak(
MapObjActor *pActor) {
521 if (!MapObjActorUtil::tryStartBreak(pActor)) {
526bool MapObjActorUtil::tryStartBreak(
MapObjActor *pActor) {
527 const char* stopSe = MR::StageEffect::getStopSe(pActor->mObjectName);
529 MR::startSound(pActor, stopSe, -1, -1);
532 const char* breakEffect = cEffectNameBreak;
533 if (MR::isRegisteredEffect(pActor, breakEffect)) {
534 MR::emitEffect(pActor, breakEffect);
537 ModelObj* modelObj = pActor->mModelObj;
539 pActor->mModelObj->appear();
540 const char* breakName = (
const char *)cBckNameBreak;
541 MR::startAllAnim(modelObj, breakName);
543 if (MR::isExistBva(pActor, breakName)) {
544 MR::startBva(pActor, breakName);
545 MR::setBvaFrameAndStop(pActor, 1.0f);
548 MR::hideModel(pActor);
551 MR::invalidateClipping(modelObj);
555 const char* breakName = cBckNameBreak;
556 if (MR::isExistBck(pActor, breakName)) {
557 MR::startAllAnim(pActor, breakName);
558 MR::invalidateClipping(pActor);
566bool MapObjActorUtil::isBreakStopped(
const MapObjActor *pActor) {
567 const LiveActor* actor = pActor->mModelObj;
569 if (!pActor->mModelObj && MR::isExistBck(pActor, cBckNameBreak)) {
577 return MR::isBckOneTimeAndStopped(actor);
580void MapObjActorUtil::killBloomModel(
MapObjActor *pActor) {
581 pActor->mBloomModel->kill();
584void MapObjActorUtil::appearBloomModel(
MapObjActor *pActor) {
585 pActor->mBloomModel->appear();
587 snprintf(buf, 0x100,
"%sBloom", pActor->mObjectName);
588 MR::tryStartAllAnim(pActor->mBloomModel, buf);
591namespace NrvMapObjActor {
592 void HostTypeDone::execute(
Spine *pSpine)
const {
596 void HostTypeMove::execute(
Spine *pSpine)
const {
601 void HostTypeWait::execute(
Spine *pSpine)
const {
The basis of a drawable actor that can contain states (see: Nerve)
TVec3f mPosition
3D vector of the actor's position.
virtual void calcAndSetBaseMtx()
Calculates and sets the base matrix of the actor.
virtual MtxPtr getBaseMtx() const
Gets the base matrix of the model used for the actor.
virtual void init(const JMapInfoIter &)
Intializes the NameObj and can set various settings and construct necessary classes.
virtual void calcAndSetBaseMtx()
Calculates and sets the base matrix of the actor.