diff options
| author | Dylan Ascencio <empressglatia@gmail.com> | 2023-10-03 00:13:45 -0400 |
|---|---|---|
| committer | Dylan Ascencio <empressglatia@gmail.com> | 2023-10-03 00:13:45 -0400 |
| commit | c02882a3deca12dfb7aecec0eb1aa93fe0bbdfa6 (patch) | |
| tree | ae31abe457bf5cfec205cd64e4b81dae730ca48c /src | |
| parent | 7921fd7c37f65dd2355e44aae42763573f2a57e2 (diff) | |
Match daObjMknjD_break
Diffstat (limited to 'src')
| -rw-r--r-- | src/d/actor/d_a_obj_mknjd.cpp | 124 |
1 files changed, 121 insertions, 3 deletions
diff --git a/src/d/actor/d_a_obj_mknjd.cpp b/src/d/actor/d_a_obj_mknjd.cpp index 66ce0b9f..54cf9c29 100644 --- a/src/d/actor/d_a_obj_mknjd.cpp +++ b/src/d/actor/d_a_obj_mknjd.cpp @@ -123,7 +123,7 @@ namespace daObjMknjD { /* 0x0430 */ u16 m0430; /* 0x0432 */ u16 m0432; /* 0x0434 */ u16 m0434; - /* 0x0438 */ u32 mBreakTimer; + /* 0x0438 */ s32 mBreakTimer; /* 0x043C */ u8 mMainMdlAlpha; /* 0x043D */ bool m043D; @@ -133,7 +133,7 @@ namespace daObjMknjD { /* 0x0440 */ JPABaseEmitter* mEmitters[4]; /* 0x0450 */ dPa_smokeEcallBack mSmokeCBs[4]; - /* 0x04D0 */ cXyz m04D0; + /* 0x04D0 */ cXyz mBrokenPos; /* 0x04DC */ s16 mCheckEventIdx; /* 0x04DE */ s16 mDemoEventIdx; @@ -694,7 +694,125 @@ void daObjMknjD::manage_friend_draw(int i_param1) { /* 00001400-0000195C .text daObjMknjD_break__Q210daObjMknjD5Act_cFv */ bool daObjMknjD::Act_c::daObjMknjD_break() { - /* Nonmatching */ + bool ret = false; + mBreakTimer++; + + /* Statue splitting into left/right halves */ + // From 0 to 60 frames, the left and right halves of the statue split apart. + if (mBreakTimer < 60) { + mLeftHalfPos.x = -((mBreakTimer * 20.0) / 60.0); + mRightHalfPos.x = (mBreakTimer * 20.0) / 60.0; + } + // After 60 frames, the halves stay at +/- 20 units on the X axis. + else { + mLeftHalfPos.x = -20.0f; + mRightHalfPos.x = 20.0f; + } + + /* Particles and sound effects */ + // After 1 frame, the particles for the statue splitting in half spawn. + if (mBreakTimer == 1) { + mEmitters[0] = dComIfGp_particle_set(0x8185, ¤t.pos, ¤t.angle, NULL, 0xFF, NULL, -1, NULL, NULL, NULL); + + GXColor emitter2Color; + emitter2Color.r = mTevStr.mColorC0.r; + emitter2Color.g = mTevStr.mColorC0.g; + emitter2Color.b = mTevStr.mColorC0.b; + emitter2Color.a = mTevStr.mColorC0.a; + + mEmitters[1] = dComIfGp_particle_setProjection(0x8186, ¤t.pos, ¤t.angle, NULL, 0xFF, NULL, current.roomNo, &mTevStr.mColorK0, &emitter2Color, NULL); + + mEmitters[2] = dComIfGp_particle_setToon(0xA187, ¤t.pos, ¤t.angle, NULL, 0xFF, &mSmokeCBs[2], -1, NULL, NULL, NULL); + mSmokeCBs[2].setRateOff(0); + + fopAcM_seStartCurrent(this, JA_SE_OBJ_SAGE_GATE_CREAK, 0); + } + // After 30 frames, the sound effect for the light beam particles coming from the statue plays. + else if (mBreakTimer == 30) { + fopAcM_seStartCurrent(this, JA_SE_OBJ_SAGE_GATE_LIGHT, 0); + } + // After 60 frames, the shards that the statue will crumble into begin moving to their initial locations. + else if (mBreakTimer == 60) { + m043D = true; + + for (int i = 0; i < 20; i++) { + mShardPositions[i].setAll(0.0f); + + if (i == 0x02 || i == 0x03 || i == 0x06 || i == 0x07 || i == 0x0A || i == 0x0D || i == 0x0E || i == 0x12 || i == 0x13) { + mShardPositions[i].x += 20.0f; + } + else { + mShardPositions[i].x -= 20.0f; + } + } + } + // After 160 frames, the particles for the statue shattering spawn. + else if (mBreakTimer == 160) { + dComIfGp_getVibration().StartShock(6, -0x21, cXyz(0.0f, 1.0f, 0.0f)); + + fopAcM_seStartCurrent(this, JA_SE_OBJ_SAGE_GATE_BREAK, 0); + + mBrokenPos = current.pos; + mBrokenPos.y += 350.0f; + + mEmitters[3] = dComIfGp_particle_setToon(0x2027, &mBrokenPos, ¤t.angle, NULL, 0xFF, &mSmokeCBs[3], -1, NULL, NULL, NULL); + if (mEmitters[3] != NULL) { + mEmitters[3]->setVolumeSweep(0.5f); + mEmitters[3]->setLifeTime(0x2D); + mEmitters[3]->setRate(50.0f); + mEmitters[3]->setMaxFrame(1); + + JGeometry::TVec3<f32> vec; + + vec.set(3.0f, 3.0f, 3.0f); + mEmitters[3]->setGlobalDynamicsScale(vec); + + vec.set(6.0f, 6.0f, 6.0f); + mEmitters[3]->setGlobalParticleScale(vec); + } + } + // After 255 frames, the cutscene ends. + else if (mBreakTimer == 255) { + ret = true; + } + + /* Main (unbroken) model transparency */ + // From 0 to 60 frames, the main model is 100% visible. + if (mBreakTimer < 60) { + mMainMdlAlpha = 0xFF; + } + // From 60 to 160 frames, the main model's transparency is lowered to 0. + else if (mBreakTimer >= 60 && mBreakTimer < 160) { + f64 mdlAlpha = ((0xA0 - mBreakTimer) * 255.0) / 100.0; + + if (mdlAlpha >= 255.0) { + mMainMdlAlpha = 0xFF; + } + else { + mMainMdlAlpha = static_cast<u8>(mdlAlpha); + } + } + // After 160 frames, the main model's transparency is 0. + else { + mMainMdlAlpha = 0; + } + + /* Falling shards */ + // After 160 frames, the shards of the broken statue model begin to fall. + if (mBreakTimer >= 160) { + int fallingShardNum = 19 - (mBreakTimer - 160); + + if (fallingShardNum < 0) { + fallingShardNum = 0; + } + + for (fallingShardNum; fallingShardNum < 20; fallingShardNum++) { + mShardHeights[fallingShardNum] -= 2.0f; + mShardPositions[fallingShardNum].y += mShardHeights[fallingShardNum]; + } + } + + return ret; } /* 0000195C-000020E0 .text Execute__Q210daObjMknjD5Act_cFPPA3_A4_f */ |
