mirror of
https://github.com/encounter/Petari.git
synced 2026-03-30 11:34:15 -07:00
294 lines
9.2 KiB
C++
294 lines
9.2 KiB
C++
#include "Game/MapObj/CrystalCageMoving.h"
|
|
#include "JSystem/JMath/JMath.h"
|
|
|
|
CrystalCageMoving::CrystalCageMoving(const char *pName) : MapObjActor(pName) {
|
|
mTicoModel = NULL;
|
|
mCameraInfo = NULL;
|
|
_FC.x = 0.0f;
|
|
_FC.y = 0.0f;
|
|
_FC.z = 0.0f;
|
|
_108 = 0;
|
|
_C8.identity();
|
|
}
|
|
|
|
void CrystalCageMoving::init(const JMapInfoIter &rIter) {
|
|
MapObjActor::init(rIter);
|
|
MapObjActorInitInfo info;
|
|
info.setupHioNode("地形オブジェ");
|
|
info.setupDefaultPos();
|
|
info.setupConnectToScene();
|
|
info.setupEffect(0);
|
|
info.setupSound(4);
|
|
info.setupNerve(&NrvCrystalCageMoving::CrystalCageMovingNrvWaitBig::sInstance);
|
|
info.setupRailMover();
|
|
info.setupHitSensorCallBack();
|
|
|
|
TVec3f vec;
|
|
vec.x = 0.0f;
|
|
vec.y = 0.0f;
|
|
vec.z = 0.0f;
|
|
info.setupHitSensorParam(4, 350.0f, vec);
|
|
initialize(rIter, info);
|
|
_FC.set<f32>(mPosition);
|
|
initDummyModel(rIter);
|
|
MR::initActorCamera(this, rIter, &mCameraInfo);
|
|
MR::startBck(this, "Wait", NULL);
|
|
|
|
if (MR::isDemoExist("脱出スピドラ出現")) {
|
|
MR::registerDemoActionNerve(this, &NrvCrystalCageMoving::CrystalCageMovingNrvDemoTicoMove::sInstance, NULL);
|
|
}
|
|
}
|
|
|
|
void CrystalCageMoving::exeBreakBig() {
|
|
if (MR::isFirstStep(this)) {
|
|
MR::startBck(this, "CoreWait", NULL);
|
|
MR::startActorCameraNoTarget(this, mCameraInfo, -1);
|
|
MR::setSensorRadius(this, "body", 30.0f);
|
|
_108 = 1;
|
|
MR::emitEffect(this, "BreakOutside");
|
|
MR::startSound(this, "SE_OJ_CRY_CAGE_MV_BREAK_EDG", -1, -1);
|
|
}
|
|
|
|
if (MR::isStep(this, 10)) {
|
|
setNerve(&NrvCrystalCageMoving::CrystalCageMovingNrvWaitSmall::sInstance);
|
|
}
|
|
}
|
|
|
|
void CrystalCageMoving::exeBreakSmall() {
|
|
if (MR::isFirstStep(this)) {
|
|
startBreakDemo();
|
|
MR::emitEffect(this, "BreakInside");
|
|
MR::startSound(this, "SE_OJ_CRY_CAGE_MV_BREAK_OUT", -1, -1);
|
|
}
|
|
}
|
|
|
|
void CrystalCageMoving::exeBreakAll() {
|
|
if (MR::isFirstStep(this)) {
|
|
startBreakDemo();
|
|
MR::emitEffect(this, "BreakOutside");
|
|
MR::emitEffect(this, "BreakInside");
|
|
MR::startSound(this, "SE_OJ_CRY_CAGE_MV_BREAK_ALL", -1, -1);
|
|
}
|
|
}
|
|
|
|
void CrystalCageMoving::exeDemoTicoMove() {
|
|
if (MR::isFirstStep(this)) {
|
|
MR::startBck(mTicoModel, "Fly", NULL);
|
|
MR::startSound(mTicoModel, "SE_SM_TICO_SPIN", -1, -1);
|
|
}
|
|
|
|
TVec3f stack_14;
|
|
stack_14.subInline2(_FC, mPosition);
|
|
f32 nerveRate = MR::calcNerveRate(this, 0x1E);
|
|
TVec3f stack_8;
|
|
JMAVECScaleAdd(stack_14.toCVec(), mPosition.toCVec(), stack_8.toVec(), nerveRate);
|
|
_C8.setTrans(stack_8);
|
|
|
|
if (MR::isStep(this, 0x1E)) {
|
|
setNerve(&NrvCrystalCageMoving::CrystalCageMovingNrvDemoTicoStop::sInstance);
|
|
}
|
|
}
|
|
|
|
void CrystalCageMoving::exeDemoTicoStop() {
|
|
if (MR::isFirstStep(this)) {
|
|
_C8.set(getBaseMtx());
|
|
_C8.setTrans(_FC);
|
|
MR::setBckRate(mTicoModel, 1.5f);
|
|
}
|
|
|
|
if (MR::isStep(this, 30)) {
|
|
setNerve(&NrvCrystalCageMoving::CrystalCageMovingNrvDemoTicoChange::sInstance);
|
|
}
|
|
}
|
|
|
|
void CrystalCageMoving::exeDemoTicoChange() {
|
|
if (MR::isFirstStep(this)) {
|
|
MR::startBck(mTicoModel, "Metamorphosis", NULL);
|
|
MR::startSound(mTicoModel, "SE_SM_TICO_METAMORPHOSE", -1, -1);
|
|
MR::setBckRate(mTicoModel, 1.5f);
|
|
}
|
|
|
|
if (MR::isBckStopped(mTicoModel)) {
|
|
kill();
|
|
}
|
|
}
|
|
|
|
void CrystalCageMoving::kill() {
|
|
if (mTicoModel) {
|
|
mTicoModel->kill();
|
|
}
|
|
|
|
MapObjActor::kill();
|
|
}
|
|
|
|
void CrystalCageMoving::control() {
|
|
if (!isNerveTypeEnd()) {
|
|
MapObjActor::control();
|
|
_C8.set(MR::getJointMtx(this, 0));
|
|
TVec3f trans;
|
|
PSMTXMultVec(_C8.toMtxPtr(), sDummyModelOffset.toCVec(), trans.toVec());
|
|
_C8.setTrans(trans);
|
|
}
|
|
}
|
|
|
|
bool CrystalCageMoving::receiveOtherMsg(u32 msg, HitSensor *a2, HitSensor *a3) {
|
|
if (isNerveTypeEnd()) {
|
|
return false;
|
|
}
|
|
|
|
if (msg == 69) {
|
|
crashMario(a2, a3);
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
void CrystalCageMoving::crashMario(HitSensor *a1, HitSensor *a2) {
|
|
MR::tryRumblePadVeryStrong(this, 0);
|
|
MR::shakeCameraVeryStrong();
|
|
|
|
if (_108) {
|
|
setNerve(&NrvCrystalCageMoving::CrystalCageMovingNrvBreakSmall::sInstance);
|
|
}
|
|
else {
|
|
f32 sensorDist = PSVECDistance(a2->mPosition.toCVec(), a1->mPosition.toCVec());
|
|
f32 sensorObjDist = PSVECDistance(mPosition.toCVec(), a1->mPosition.toCVec());
|
|
|
|
if (sensorDist < 30.0f && sensorObjDist < 450.0f) {
|
|
setNerve(&NrvCrystalCageMoving::CrystalCageMovingNrvBreakAll::sInstance);
|
|
}
|
|
else {
|
|
setNerve(&NrvCrystalCageMoving::CrystalCageMovingNrvBreakBig::sInstance);
|
|
}
|
|
}
|
|
}
|
|
|
|
void CrystalCageMoving::updateHitSensor(HitSensor *pSensor) {
|
|
if (!_108) {
|
|
pSensor->mPosition.set<f32>(mPosition);
|
|
}
|
|
else {
|
|
f32 radius = pSensor->mRadius;
|
|
TMtx34f joint_mtx;
|
|
joint_mtx.set(MR::getJointMtx(this, NULL));
|
|
TVec3f joint_pos;
|
|
f32 z = joint_mtx.mMtx[2][1];
|
|
f32 y = joint_mtx.mMtx[1][1];
|
|
f32 x = joint_mtx.mMtx[0][1];
|
|
joint_pos.set<f32>(x, y, z);
|
|
TVec3f stack_14;
|
|
JMAVECScaleAdd(joint_pos.toCVec(), mPosition.toCVec(), stack_14.toVec(), (-450.0f + radius));
|
|
TVec3f stack_8;
|
|
JMAVECScaleAdd(joint_pos.toCVec(), mPosition.toCVec(), stack_8.toVec(), (450.0f - radius));
|
|
MR::calcPerpendicFootToLineInside(&pSensor->mPosition, *MR::getPlayerPos(), stack_14, stack_8);
|
|
}
|
|
}
|
|
|
|
void CrystalCageMoving::connectToScene(const MapObjActorInitInfo &rInfo) {
|
|
if (rInfo.mConnectToScene) {
|
|
MR::connectToSceneCrystal(this);
|
|
}
|
|
}
|
|
|
|
void CrystalCageMoving::initDummyModel(const JMapInfoIter &rIter) {
|
|
_C8.set(MR::getJointMtx(this, 0));
|
|
TVec3f stack_8;
|
|
PSMTXMultVec(_C8.toMtxPtr(), sDummyModelOffset.toCVec(), stack_8.toVec());
|
|
_C8.setTrans(stack_8);
|
|
mTicoModel = new ModelObj("動くクリスタルケージ中身", "Tico", _C8.toMtxPtr(), 0x21, -2, -2, false);
|
|
mTicoModel->initWithoutIter();
|
|
ModelObj* tico = mTicoModel;
|
|
tico->mScale.x = 3.0f;
|
|
tico->mScale.y = 3.0f;
|
|
tico->mScale.z = 3.0f;
|
|
MR::startBrk(mTicoModel, "ColorChange");
|
|
MR::setBrkFrameAndStop(mTicoModel, 0.0f);
|
|
|
|
if (MR::isDemoCast(this, NULL)) {
|
|
MR::tryRegisterDemoCast(mTicoModel, rIter);
|
|
}
|
|
}
|
|
|
|
void CrystalCageMoving::startBreakDemo() {
|
|
MR::startSound(this, "SE_OJ_CRY_CAGE_MV_TICO_APR", -1, -1);
|
|
MR::requestStartTimeKeepDemo(this, "脱出スピドラ出現", NULL, NULL, "クリスタル破壊");
|
|
MR::hideModel(this);
|
|
ModelObj* tico = mTicoModel;
|
|
tico->mScale.x = 1.0f;
|
|
tico->mScale.y = 1.0f;
|
|
tico->mScale.z = 1.0f;
|
|
}
|
|
|
|
bool CrystalCageMoving::isNerveTypeEnd() const {
|
|
bool ret = false;
|
|
|
|
if (isNerve(&NrvCrystalCageMoving::CrystalCageMovingNrvBreakBig::sInstance) ||
|
|
isNerve(&NrvCrystalCageMoving::CrystalCageMovingNrvBreakSmall::sInstance) ||
|
|
isNerve(&NrvCrystalCageMoving::CrystalCageMovingNrvBreakAll::sInstance) ||
|
|
isNerve(&NrvCrystalCageMoving::CrystalCageMovingNrvDemoTicoMove::sInstance) ||
|
|
isNerve(&NrvCrystalCageMoving::CrystalCageMovingNrvDemoTicoStop::sInstance) ||
|
|
isNerve(&NrvCrystalCageMoving::CrystalCageMovingNrvDemoTicoChange::sInstance)) {
|
|
ret = true;
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
CrystalCageMoving::~CrystalCageMoving() {
|
|
|
|
}
|
|
|
|
namespace NrvCrystalCageMoving {
|
|
INIT_NERVE(CrystalCageMovingNrvWaitBig);
|
|
INIT_NERVE(CrystalCageMovingNrvBreakBig);
|
|
INIT_NERVE(CrystalCageMovingNrvWaitSmall);
|
|
INIT_NERVE(CrystalCageMovingNrvBreakSmall);
|
|
INIT_NERVE(CrystalCageMovingNrvBreakAll);
|
|
INIT_NERVE(CrystalCageMovingNrvDemoTicoMove);
|
|
INIT_NERVE(CrystalCageMovingNrvDemoTicoStop);
|
|
INIT_NERVE(CrystalCageMovingNrvDemoTicoChange);
|
|
|
|
void CrystalCageMovingNrvDemoTicoChange::execute(Spine *pSpine) const {
|
|
CrystalCageMoving* cage = reinterpret_cast<CrystalCageMoving*>(pSpine->mExecutor);
|
|
cage->exeDemoTicoChange();
|
|
}
|
|
|
|
void CrystalCageMovingNrvDemoTicoStop::execute(Spine *pSpine) const {
|
|
CrystalCageMoving* cage = reinterpret_cast<CrystalCageMoving*>(pSpine->mExecutor);
|
|
cage->exeDemoTicoStop();
|
|
}
|
|
|
|
void CrystalCageMovingNrvDemoTicoMove::execute(Spine *pSpine) const {
|
|
CrystalCageMoving* cage = reinterpret_cast<CrystalCageMoving*>(pSpine->mExecutor);
|
|
cage->exeDemoTicoMove();
|
|
}
|
|
|
|
void CrystalCageMovingNrvBreakAll::execute(Spine *pSpine) const {
|
|
CrystalCageMoving* cage = reinterpret_cast<CrystalCageMoving*>(pSpine->mExecutor);
|
|
cage->exeBreakAll();
|
|
}
|
|
|
|
void CrystalCageMovingNrvBreakSmall::execute(Spine *pSpine) const {
|
|
CrystalCageMoving* cage = reinterpret_cast<CrystalCageMoving*>(pSpine->mExecutor);
|
|
cage->exeBreakSmall();
|
|
}
|
|
|
|
void CrystalCageMovingNrvWaitSmall::execute(Spine *) const {
|
|
|
|
}
|
|
|
|
void CrystalCageMovingNrvBreakBig::executeOnEnd(Spine *pSpine) const {
|
|
CrystalCageMoving* cage = reinterpret_cast<CrystalCageMoving*>(pSpine->mExecutor);
|
|
MR::endActorCamera(cage, cage->mCameraInfo, true, -1);
|
|
}
|
|
|
|
void CrystalCageMovingNrvBreakBig::execute(Spine *pSpine) const {
|
|
CrystalCageMoving* cage = reinterpret_cast<CrystalCageMoving*>(pSpine->mExecutor);
|
|
cage->exeBreakBig();
|
|
}
|
|
|
|
void CrystalCageMovingNrvWaitBig::execute(Spine *) const {
|
|
|
|
}
|
|
}; |