Files
2024-03-12 12:52:06 -04:00

158 lines
4.3 KiB
C++

#include "Game/MapObj/WaterLeakPipe.hpp"
IceStepNoSlip::~IceStepNoSlip() {
}
WaterLeakPipe::~WaterLeakPipe() {
}
IceStepNoSlip::IceStepNoSlip(MtxPtr mtx) : ModelObj("アイス床", "IceStepNoSlip", mtx, 0x1A, -2, -2, false) {
}
void IceStepNoSlip::init(const JMapInfoIter &rIter) {
ModelObj::init(rIter);
initHitSensor(1);
MR::addBodyMessageSensorMapObj(this);
MR::initCollisionParts(this, "IceStepNoSlip", getSensor(nullptr), nullptr);
initNerve(&NrvIceStepNoSlip::IceStepNoSlipNrvAppear::sInstance);
}
void IceStepNoSlip::appear() {
LiveActor::appear();
setNerve(&NrvIceStepNoSlip::IceStepNoSlipNrvAppear::sInstance);
}
void IceStepNoSlip::exeBreak() {
if (MR::isFirstStep(this)) {
MR::startBck(this, "End", nullptr);
}
if (MR::isBckStopped(this)) {
kill();
}
}
namespace NrvIceStepNoSlip {
INIT_NERVE(IceStepNoSlipNrvAppear);
INIT_NERVE(IceStepNoSlipNrvBreak);
};
WaterLeakPipe::WaterLeakPipe(const char *pName) : LiveActor(pName) {
mIceStep = nullptr;
mPipeHeight = 500.0f;
mTopMtx = nullptr;
mBottomMtx = nullptr;
_9C.x = 0.0f;
_9C.y = 0.0f;
_9C.z = 0.0f;
}
void WaterLeakPipe::init(const JMapInfoIter &rIter) {
TVec3f upVec, offs;
MR::initDefaultPos(this, rIter);
initModelManagerWithAnm("WaterLeakPipe", nullptr, false);
mTopMtx = MR::getJointMtx(this, "Top");
mBottomMtx = MR::getJointMtx(this, "Bottom");
MR::getJMapInfoArg0NoInit(rIter, &mPipeHeight);
initPipeHeight();
MR::connectToSceneMapObjNoCalcAnim(this);
initHitSensor(1);
offs.x = 0.0f;
offs.y = 0.0f;
offs.z = 0.0f;
MR::addHitSensorAtJointMapObj(this, "ice", "Top", 8, 120.0f, offs);
initEffectKeeper(0, nullptr, false);
initSound(4, false);
MR::calcUpVec(&upVec, this);
JMAVECScaleAdd(upVec.toCVec(), mPosition.toCVec(), _9C.toVec(), (0.5f * mPipeHeight));
MR::setClippingTypeSphere(this, (0.5f * mPipeHeight), &_9C);
mIceStep = new IceStepNoSlip(mTopMtx);
mIceStep->initWithoutIter();
mIceStep->makeActorDead();
initNerve(&NrvWaterLeakPipe::WaterLeakPipeNrvWait::sInstance);
makeActorAppeared();
}
void WaterLeakPipe::exeWait() {
if (MR::isFirstStep(this)) {
MR::emitEffect(this, "Splash");
}
MR::startLevelSound(this, "SE_OJ_LV_WATER_LEAK", -1, -1, -1);
}
void WaterLeakPipe::exeFreeze() {
if (MR::isFirstStep(this) && MR::isDead(mIceStep)) {
MR::forceDeleteEffect(this, "Splash");
mIceStep->appear();
MR::startSound(this, "SE_OJ_ICE_FLOOR_FREEZE", -1, -1);
MR::invalidateClipping(this);
}
else if (MR::isOnPlayer(mIceStep) && MR::isPlayerElementModeIce()) {
setNerve(&NrvWaterLeakPipe::WaterLeakPipeNrvFreeze::sInstance);
}
else if (MR::isStep(this, 15)) {
mIceStep->setNerve(&NrvIceStepNoSlip::IceStepNoSlipNrvBreak::sInstance);
MR::startSound(this, "SE_OJ_ICE_FLOOR_MELT", -1, -1);
MR::validateClipping(this);
setNerve(&NrvWaterLeakPipe::WaterLeakPipeNrvWait::sInstance);
}
}
bool WaterLeakPipe::receiveMsgPlayerAttack(u32 msg, HitSensor *a1, HitSensor *a2) {
if (!MR::isPlayerElementModeIce()) {
return false;
}
if (isNerve(&NrvWaterLeakPipe::WaterLeakPipeNrvFreeze::sInstance)) {
return false;
}
if (MR::isMsgPlayerTrample(msg) || MR::isMsgPlayerHipDrop(msg)) {
TVec3f upVec;
MR::calcUpVec(&upVec, this);
TVec3f v8;
v8.subInline2(*MR::getPlayerPos(), mPosition);
if (v8.dot(upVec) < 0.0f) {
return false;
}
if (MR::getPlayerVelocity()->dot(upVec) >= 0.0f) {
return false;
}
setNerve(&NrvWaterLeakPipe::WaterLeakPipeNrvFreeze::sInstance);
return false;
}
return false;
}
void WaterLeakPipe::initPipeHeight() {
TMtx34f mtx;
mtx.setInline(mTopMtx);
TVec3f upVec;
MR::calcUpVec(&upVec, this);
TVec3f v10;
JMAVECScaleAdd(upVec.toCVec(), mPosition.toCVec(),v10.toVec(), mPipeHeight);
mtx.mMtx[0][3] = v10.x;
mtx.mMtx[1][3] = v10.y;
mtx.mMtx[2][3] = v10.z;
PSMTXCopy(mtx.toMtxPtr(), mTopMtx);
calcAndSetBaseMtx();
}
namespace NrvWaterLeakPipe {
INIT_NERVE(WaterLeakPipeNrvWait);
INIT_NERVE(WaterLeakPipeNrvFreeze);
};
void WaterLeakPipe::calcAnim() {
}