Files
2024-03-23 14:47:46 -04:00

106 lines
2.5 KiB
C++

#include "Game/MapObj/BallOpener.hpp"
#include "Game/Util/GeometryBindUtil.hpp"
BallOpener::~BallOpener() {
}
BallOpener::BallOpener(const char *pName) : LiveActor(pName) {
mSensor = nullptr;
_A0.set(0, 0, 0);
_AC.set(0, 0, 0);
_B8.set(0, 0, 0);
_C4 = 0;
_8C = new BindCone(mPosition, TVec3f(0.0f, 1.0f, 0.0f), 400.0f, 200.0f);
}
void BallOpener::init(const JMapInfoIter &rIter) {
MR::initDefaultPos(this, rIter);
initModelManagerWithAnm("BallOpener", nullptr, false);
MR::connectToSceneMapObj(this);
initHitSensor(1);
MR::addHitSensor(this, "body", 121, 8, 200.0f, TVec3f(0.0f, 0.0f, 0.0f));
initEffectKeeper(1, nullptr, false);
initSound(4, false);
MR::initCollisionParts(this, "BallOpener", getSensor(nullptr), nullptr);
_8C->setPosition(mPosition);
initNerve(&NrvBallOpener::BallOpenerNrvWait::sInstance);
MR::useStageSwitchWriteA(this, rIter);
appear();
}
void BallOpener::initAfterPlacement() {
TVec3f grav;
MR::calcGravityVector(this, &_94, nullptr, 0);
_8C->setDirection(_94);
}
void BallOpener::control() {
}
// BallOpener::receiveOtherMsg
void BallOpener::exeWait() {
if (MR::isFirstStep(this)) {
MR::validateClipping(this);
}
if (mSensor != nullptr) {
bindHole();
setNerve(&NrvBallOpener::BallOpenerNrvSetCenter::sInstance);
}
}
void BallOpener::exeSetCenter() {
if (MR::isFirstStep(this)) {
_C4 = 0;
MR::invalidateClipping(this);
}
bindHole();
if (_B8.squared() < 0.000099999997f) {
_C4++;
}
else {
_C4 = 0;
}
if (_C4 == 1) {
MR::shakeCameraWeak();
}
MR::startLevelSound(this, "SE_OJ_LV_BALL_OPN_SETTING", -1, -1, -1);
if (_C4 > 20 || MR::isGreaterStep(this, 180)) {
setNerve(&NrvBallOpener::BallOpenerNrvOpen::sInstance);
}
}
void BallOpener::exeOpen() {
if (MR::isFirstStep(this)) {
mSensor->receiveMessage(0xAE, getSensor("body"));
}
if (MR::isStep(this, 45)) {
MR::zeroVelocity(mSensor->mActor);
mSensor->receiveMessage(0xB3, getSensor("body"));
mSensor = nullptr;
MR::startSound(this, "SE_OJ_BALL_OPN_OPEN", -1, -1);
MR::startSystemSE("SE_SY_TAMAKORO_GOAL", -1, -1);
if (MR::isValidSwitchA(this)) {
MR::onSwitchA(this);
}
setNerve(&NrvBallOpener::BallOpenerNrvWait::sInstance);
}
}
// BallOpener::bindHole
namespace NrvBallOpener {
INIT_NERVE(BallOpenerNrvWait);
INIT_NERVE(BallOpenerNrvSetCenter);
INIT_NERVE(BallOpenerNrvOpen);
};