1#include "Game/MapObj/CrystalCageMoving.hpp"
2#include "JSystem/JMath/JMath.hpp"
4CrystalCageMoving::CrystalCageMoving(
const char *pName) :
MapObjActor(pName) {
17 info.setupHioNode(
"地形オブジェ");
18 info.setupDefaultPos();
19 info.setupConnectToScene();
22 info.setupNerve(&NrvCrystalCageMoving::CrystalCageMovingNrvWaitBig::sInstance);
23 info.setupRailMover();
24 info.setupHitSensorCallBack();
30 info.setupHitSensorParam(4, 350.0f, vec);
31 initialize(rIter, info);
33 initDummyModel(rIter);
34 MR::initActorCamera(
this, rIter, &mCameraInfo);
35 MR::startBck(
this,
"Wait",
nullptr);
37 if (MR::isDemoExist(
"脱出スピドラ出現")) {
38 MR::registerDemoActionNerve(
this, &NrvCrystalCageMoving::CrystalCageMovingNrvDemoTicoMove::sInstance,
nullptr);
42void CrystalCageMoving::exeBreakBig() {
43 if (MR::isFirstStep(
this)) {
44 MR::startBck(
this,
"CoreWait",
nullptr);
45 MR::startActorCameraNoTarget(
this, mCameraInfo, -1);
46 MR::setSensorRadius(
this,
"body", 30.0f);
48 MR::emitEffect(
this,
"BreakOutside");
49 MR::startSound(
this,
"SE_OJ_CRY_CAGE_MV_BREAK_EDG", -1, -1);
52 if (MR::isStep(
this, 10)) {
53 setNerve(&NrvCrystalCageMoving::CrystalCageMovingNrvWaitSmall::sInstance);
57void CrystalCageMoving::exeBreakSmall() {
58 if (MR::isFirstStep(
this)) {
60 MR::emitEffect(
this,
"BreakInside");
61 MR::startSound(
this,
"SE_OJ_CRY_CAGE_MV_BREAK_OUT", -1, -1);
65void CrystalCageMoving::exeBreakAll() {
66 if (MR::isFirstStep(
this)) {
68 MR::emitEffect(
this,
"BreakOutside");
69 MR::emitEffect(
this,
"BreakInside");
70 MR::startSound(
this,
"SE_OJ_CRY_CAGE_MV_BREAK_ALL", -1, -1);
74void CrystalCageMoving::exeDemoTicoMove() {
75 if (MR::isFirstStep(
this)) {
76 MR::startBck(mTicoModel,
"Fly",
nullptr);
77 MR::startSound(mTicoModel,
"SE_SM_TICO_SPIN", -1, -1);
82 f32 nerveRate = MR::calcNerveRate(
this, 0x1E);
84 JMAVECScaleAdd(stack_14.toCVec(),
mPosition.toCVec(), stack_8.toVec(), nerveRate);
85 _C8.setTrans(stack_8);
87 if (MR::isStep(
this, 0x1E)) {
88 setNerve(&NrvCrystalCageMoving::CrystalCageMovingNrvDemoTicoStop::sInstance);
92void CrystalCageMoving::exeDemoTicoStop() {
93 if (MR::isFirstStep(
this)) {
96 MR::setBckRate(mTicoModel, 1.5f);
99 if (MR::isStep(
this, 30)) {
100 setNerve(&NrvCrystalCageMoving::CrystalCageMovingNrvDemoTicoChange::sInstance);
104void CrystalCageMoving::exeDemoTicoChange() {
105 if (MR::isFirstStep(
this)) {
106 MR::startBck(mTicoModel,
"Metamorphosis",
nullptr);
107 MR::startSound(mTicoModel,
"SE_SM_TICO_METAMORPHOSE", -1, -1);
108 MR::setBckRate(mTicoModel, 1.5f);
111 if (MR::isBckStopped(mTicoModel)) {
116void CrystalCageMoving::kill() {
124void CrystalCageMoving::control() {
125 if (!isNerveTypeEnd()) {
126 MapObjActor::control();
127 _C8.set(MR::getJointMtx(
this, 0));
129 PSMTXMultVec(_C8.toMtxPtr(), sDummyModelOffset.toCVec(), trans.toVec());
135 if (isNerveTypeEnd()) {
148 MR::tryRumblePadVeryStrong(
this, 0);
149 MR::shakeCameraVeryStrong();
152 setNerve(&NrvCrystalCageMoving::CrystalCageMovingNrvBreakSmall::sInstance);
155 f32 sensorDist = PSVECDistance(a2->mPosition.toCVec(), a1->mPosition.toCVec());
156 f32 sensorObjDist = PSVECDistance(
mPosition.toCVec(), a1->mPosition.toCVec());
158 if (sensorDist < 30.0f && sensorObjDist < 450.0f) {
159 setNerve(&NrvCrystalCageMoving::CrystalCageMovingNrvBreakAll::sInstance);
162 setNerve(&NrvCrystalCageMoving::CrystalCageMovingNrvBreakBig::sInstance);
167void CrystalCageMoving::updateHitSensor(
HitSensor *pSensor) {
172 f32 radius = pSensor->mRadius;
174 joint_mtx.set(MR::getJointMtx(
this,
nullptr));
176 f32 z = joint_mtx.mMtx[2][1];
177 f32 y = joint_mtx.mMtx[1][1];
178 f32 x = joint_mtx.mMtx[0][1];
179 joint_pos.set<f32>(x, y, z);
181 JMAVECScaleAdd(joint_pos.toCVec(),
mPosition.toCVec(), stack_14.toVec(), (-450.0f + radius));
183 JMAVECScaleAdd(joint_pos.toCVec(),
mPosition.toCVec(), stack_8.toVec(), (450.0f - radius));
184 MR::calcPerpendicFootToLineInside(&pSensor->mPosition, *MR::getPlayerPos(), stack_14, stack_8);
189 if (rInfo.mConnectToScene) {
190 MR::connectToSceneCrystal(
this);
194void CrystalCageMoving::initDummyModel(
const JMapInfoIter &rIter) {
195 _C8.set(MR::getJointMtx(
this, 0));
197 PSMTXMultVec(_C8.toMtxPtr(), sDummyModelOffset.toCVec(), stack_8.toVec());
198 _C8.setTrans(stack_8);
199 mTicoModel =
new ModelObj(
"動くクリスタルケージ中身",
"Tico", _C8.toMtxPtr(), 0x21, -2, -2,
false);
205 MR::startBrk(mTicoModel,
"ColorChange");
206 MR::setBrkFrameAndStop(mTicoModel, 0.0f);
208 if (MR::isDemoCast(
this,
nullptr)) {
209 MR::tryRegisterDemoCast(mTicoModel, rIter);
213void CrystalCageMoving::startBreakDemo() {
214 MR::startSound(
this,
"SE_OJ_CRY_CAGE_MV_TICO_APR", -1, -1);
215 MR::requestStartTimeKeepDemo(
this,
"脱出スピドラ出現",
nullptr,
nullptr,
"クリスタル破壊");
223bool CrystalCageMoving::isNerveTypeEnd()
const {
226 if (isNerve(&NrvCrystalCageMoving::CrystalCageMovingNrvBreakBig::sInstance) ||
227 isNerve(&NrvCrystalCageMoving::CrystalCageMovingNrvBreakSmall::sInstance) ||
228 isNerve(&NrvCrystalCageMoving::CrystalCageMovingNrvBreakAll::sInstance) ||
229 isNerve(&NrvCrystalCageMoving::CrystalCageMovingNrvDemoTicoMove::sInstance) ||
230 isNerve(&NrvCrystalCageMoving::CrystalCageMovingNrvDemoTicoStop::sInstance) ||
231 isNerve(&NrvCrystalCageMoving::CrystalCageMovingNrvDemoTicoChange::sInstance)) {
238CrystalCageMoving::~CrystalCageMoving() {
242namespace NrvCrystalCageMoving {
243 INIT_NERVE(CrystalCageMovingNrvWaitBig);
244 INIT_NERVE(CrystalCageMovingNrvBreakBig);
245 INIT_NERVE(CrystalCageMovingNrvWaitSmall);
246 INIT_NERVE(CrystalCageMovingNrvBreakSmall);
247 INIT_NERVE(CrystalCageMovingNrvBreakAll);
248 INIT_NERVE(CrystalCageMovingNrvDemoTicoMove);
249 INIT_NERVE(CrystalCageMovingNrvDemoTicoStop);
250 INIT_NERVE(CrystalCageMovingNrvDemoTicoChange);
252 void CrystalCageMovingNrvDemoTicoChange::execute(
Spine *pSpine)
const {
254 cage->exeDemoTicoChange();
257 void CrystalCageMovingNrvDemoTicoStop::execute(
Spine *pSpine)
const {
259 cage->exeDemoTicoStop();
262 void CrystalCageMovingNrvDemoTicoMove::execute(
Spine *pSpine)
const {
264 cage->exeDemoTicoMove();
267 void CrystalCageMovingNrvBreakAll::execute(
Spine *pSpine)
const {
272 void CrystalCageMovingNrvBreakSmall::execute(
Spine *pSpine)
const {
274 cage->exeBreakSmall();
277 void CrystalCageMovingNrvWaitSmall::execute(
Spine *)
const {
281 void CrystalCageMovingNrvBreakBig::executeOnEnd(
Spine *pSpine)
const {
283 MR::endActorCamera(cage, cage->mCameraInfo,
true, -1);
286 void CrystalCageMovingNrvBreakBig::execute(
Spine *pSpine)
const {
291 void CrystalCageMovingNrvWaitBig::execute(
Spine *)
const {
virtual void init(const JMapInfoIter &)
Intializes the NameObj and can set various settings and construct necessary classes.
TVec3f mPosition
3D vector of the actor's position.
TVec3f mScale
3D vector of the actor's scale.
virtual MtxPtr getBaseMtx() const
Gets the base matrix of the model used for the actor.
virtual void init(const JMapInfoIter &)
Intializes the NameObj and can set various settings and construct necessary classes.
void initWithoutIter()
Initializes a NameObj without a JMapInfoIter instance.