mirror of
https://github.com/encounter/Petari.git
synced 2026-03-30 11:34:15 -07:00
124 lines
3.0 KiB
C++
124 lines
3.0 KiB
C++
#include "Game/MapObj/IceStep.hpp"
|
|
|
|
IceStep::IceStep(const char *pName) : LiveActor(pName) {
|
|
|
|
}
|
|
|
|
IceStep::~IceStep() {
|
|
|
|
}
|
|
|
|
void IceStep::init(const JMapInfoIter &rIter) {
|
|
MR::initDefaultPos(this, rIter);
|
|
initModelManagerWithAnm("IceStep", nullptr, false);
|
|
MR::connectToSceneMapObjStrongLight(this);
|
|
initSound(4, false);
|
|
initEffectKeeper(1, nullptr, false);
|
|
f32 scale = 90.0f * mScale.x;
|
|
initHitSensor(1);
|
|
TVec3f offs;
|
|
offs.y = scale;
|
|
offs.x = 0.0f;
|
|
offs.z = 0.0f;
|
|
MR::addHitSensorMapObj(this, "body", 8, scale, offs);
|
|
PSMTXIdentity(_8C);
|
|
MR::initCollisionParts(this, "IceStep", getSensor("body"), nullptr);
|
|
MR::validateClipping(this);
|
|
initNerve(&NrvIceStep::IceStepNrvWait::sInstance);
|
|
kill();
|
|
mTimer = 0;
|
|
}
|
|
|
|
void IceStep::exeWait() {
|
|
if (mTimer != 0) {
|
|
mTimer--;
|
|
}
|
|
|
|
switch (mTimer) {
|
|
case 0x12C:
|
|
MR::startBpk(this, "TimeOutLong");
|
|
break;
|
|
case 0x78:
|
|
MR::startBpk(this, "TimeOutShort");
|
|
break;
|
|
case 1:
|
|
destroy();
|
|
break;
|
|
case 0:
|
|
if (MR::isBckStopped(this)) {
|
|
kill();
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
/* matching except for assembly floats not being correct but whatever*/
|
|
void IceStep::setOn(u32 stepIdx, const TVec3f &rPosition, const TVec3f &rRotation) {
|
|
mPosition = rPosition;
|
|
mRotation = rRotation;
|
|
MR::offUpdateCollisionParts(this);
|
|
MR::onUpdateCollisionPartsOnetimeImmediately(this);
|
|
s32 v8 = stepIdx >> 1;
|
|
|
|
if (stepIdx & 1) {
|
|
v8 -= 10;
|
|
}
|
|
|
|
TVec3f upVec;
|
|
MR::calcUpVec(&upVec, this);
|
|
TVec3f multVec(MR::multVecNoCtor(MR::multVecNoCtor(upVec, v8), 0.2f));
|
|
mPosition = MR::addVec(multVec, rPosition);
|
|
|
|
MR::startBck(this, "Start", nullptr);
|
|
MR::startBpk(this, "Start");
|
|
MR::startSound(this, "SE_OJ_ICE_FLOOR_FREEZE", -1, -1);
|
|
mTimer = 0x4B0;
|
|
MR::invalidateClipping(this);
|
|
MR::resetPosition(this);
|
|
setNerve(&NrvIceStep::IceStepNrvWait::sInstance);
|
|
MR::validateCollisionParts(this);
|
|
MR::showModel(this);
|
|
appear();
|
|
}
|
|
|
|
void IceStep::destroy() {
|
|
MR::startBck(this, "End", nullptr);
|
|
MR::startBpk(this, "End");
|
|
MR::startSound(this, "SE_OJ_ICE_FLOOR_MELT", -1, -1);
|
|
mTimer = 0;
|
|
}
|
|
|
|
void IceStep::doHit() {
|
|
MR::invalidateCollisionParts(this);
|
|
setNerve(&NrvIceStep::IceStepNrvHit::sInstance);
|
|
MR::emitEffect(this, "Break");
|
|
MR::startSound(this, "SE_OJ_ICE_FLOOR_BREAK", -1, -1);
|
|
MR::startBck(this, "End", nullptr);
|
|
mTimer = 0;
|
|
}
|
|
|
|
bool IceStep::receiveMsgPlayerAttack(u32 , HitSensor *, HitSensor *) {
|
|
return false;
|
|
}
|
|
|
|
bool IceStep::receiveMsgEnemyAttack(u32 msg, HitSensor *, HitSensor *) {
|
|
if (MR::isOnPlayer(this)) {
|
|
return false;
|
|
}
|
|
|
|
if (isNerve(&NrvIceStep::IceStepNrvWait::sInstance)) {
|
|
doHit();
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
void IceStep::control() {
|
|
|
|
}
|
|
|
|
namespace NrvIceStep {
|
|
INIT_NERVE(IceStepNrvHit);
|
|
INIT_NERVE(IceStepNrvWait);
|
|
};
|