Files
2024-06-30 18:35:39 -04:00

131 lines
3.8 KiB
C++

#include "Game/MapObj/Banekiti.hpp"
Banekiti::Banekiti(const char *pName) : LiveActor(pName) {
mAnimScaleCtrl = nullptr;
mBindStarPointer = nullptr;
mRailMover = nullptr;
}
void Banekiti::init(const JMapInfoIter &rIter) {
MR::initDefaultPos(this, rIter);
initModelManagerWithAnm("Banekiti", nullptr, false);
MR::connectToSceneMapObjStrongLight(this);
MR::initLightCtrl(this);
initHitSensor(3);
MR::addHitSensorMapObjSimple(this, "body", 4, 80.0f, TVec3f(0.0f, 0.0f, 0.0f));
MR::addHitSensorMapObjSimple(this, "right", 4, 80.0f, TVec3f(-100.0f, 0.0f, 0.0f));
MR::addHitSensorMapObjSimple(this, "left", 4, 80.0f, TVec3f(100.0f, 0.0f, 0.0f));
initEffectKeeper(1, nullptr, false);
initSound(4, false);
initRailRider(rIter);
mRailMover = new MapPartsRailMover(this);
mRailMover->init(rIter);
mRailMover->start();
TVec3f offset;
MR::initStarPointerTarget(this, 120.0f, TVec3f(0.0f));
mAnimScaleCtrl = new AnimScaleController(nullptr);
mBindStarPointer = new WalkerStateBindStarPointer(this, mAnimScaleCtrl);
initNerve(&NrvBanekiti::BanekitiNrvWait::sInstance);
makeActorAppeared();
}
void Banekiti::exeWait() {
if (MR::isFirstStep(this)) {
MR::startBck(this, "Wait", nullptr);
}
MR::startLevelSound(this, "SE_OJ_LV_BANEKITI_MOVE", -1, -1, -1);
}
void Banekiti::exeRepel() {
if (MR::isFirstStep(this)) {
MR::tryRumblePadWeak(this, 0);
MR::shakeCameraWeak();
MR::startBck(this, "Repel", nullptr);
MR::startSound(this, "SE_OJ_BANEKITI_REPEL", -1, -1);
}
if (MR::isBckStopped(this)) {
setNerve(&NrvBanekiti::BanekitiNrvWait::sInstance);
}
}
void Banekiti::exeDPDSwoon() {
if (MR::isFirstStep(this)) {
mRailMover->_14 = false;
}
MR::updateActorStateAndNextNerve(this, mBindStarPointer, &NrvBanekiti::BanekitiNrvWait::sInstance);
}
void Banekiti::endDPDSwoon() {
mRailMover->_14 = true;
mBindStarPointer->kill();
}
void Banekiti::calcAndSetBaseMtx() {
TVec3f mtx;
LiveActor::calcAndSetBaseMtx();
mtx.multPS(mScale, mAnimScaleCtrl->_C);
MR::setBaseScale(this, mtx);
}
void Banekiti::control() {
mAnimScaleCtrl->updateNerve();
mRailMover->movement();
if (mRailMover->isWorking()) {
mPosition.x = mRailMover->_28.x;
mPosition.y = mRailMover->_28.y;
mPosition.z = mRailMover->_28.z;
}
if (!isNerve(&NrvBanekiti::BanekitiNrvDPDSwoon::sInstance)) {
if (mBindStarPointer->tryStartPointBind()) {
setNerve(&NrvBanekiti::BanekitiNrvDPDSwoon::sInstance);
}
}
}
bool Banekiti::receiveMsgPlayerAttack(u32 msg, HitSensor *pSender, HitSensor *pReceiver) {
if (MR::isMsgStarPieceAttack(msg)) {
mAnimScaleCtrl->startHitReaction();
return true;
}
return false;
}
bool Banekiti::receiveOtherMsg(u32 msg, HitSensor *pSender, HitSensor *pReceiver) {
if (!MR::isSensorPlayer(pSender)) {
return false;
}
if (isNerve(&NrvBanekiti::BanekitiNrvRepel::sInstance)) {
return false;
}
if (msg == 68) {
setNerve(&NrvBanekiti::BanekitiNrvRepel::sInstance);
return true;
}
return false;
}
namespace NrvBanekiti {
INIT_NERVE(BanekitiNrvWait);
INIT_NERVE(BanekitiNrvRepel);
INIT_NERVE(BanekitiNrvDPDSwoon);
void BanekitiNrvWait::execute(Spine *pSpine) const {
Banekiti *pActor = (Banekiti*)pSpine->mExecutor;
pActor->exeWait();
}
void BanekitiNrvRepel::execute(Spine *pSpine) const {
Banekiti *pActor = (Banekiti*)pSpine->mExecutor;
pActor->exeRepel();
}
void BanekitiNrvDPDSwoon::execute(Spine *pSpine) const {
Banekiti *pActor = (Banekiti*)pSpine->mExecutor;
pActor->exeDPDSwoon();
}
void BanekitiNrvDPDSwoon::executeOnEnd(Spine *pSpine) const {
Banekiti *pActor = (Banekiti*)pSpine->mExecutor;
pActor->endDPDSwoon();
}
};