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