mirror of
https://github.com/encounter/Petari.git
synced 2026-03-30 11:34:15 -07:00
131 lines
3.8 KiB
C++
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();
|
|
}
|
|
}; |