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