Match daObjMknjD_break

This commit is contained in:
Dylan Ascencio
2023-10-03 00:13:45 -04:00
parent 7921fd7c37
commit c02882a3de
4 changed files with 157 additions and 4 deletions
+16
View File
@@ -74,6 +74,22 @@ public:
JPASetRMtxTVecfromMtx(mtx, mGlobalRotation, mGlobalTranslation);
}
void setVolumeSweep(float i_volSweep) { mVolumeSweep = i_volSweep; }
void setLifeTime(s16 i_lifeTime) { mLifeTime = i_lifeTime; }
void setRate(float i_rate) { mRate = i_rate; }
void setMaxFrame(s32 i_maxFrame) { mMaxFrame = i_maxFrame; }
void setGlobalDynamicsScale(JGeometry::TVec3<float>& i_vec) {
mGlobalScale.x = i_vec.x;
mGlobalScale.y = i_vec.y;
mGlobalScale.z = i_vec.z;
}
void setGlobalParticleScale(JGeometry::TVec3<float>& i_vec) {
mGlobalScale2D.x = i_vec.x;
mGlobalScale2D.y = i_vec.y;
mGlobalScale2D.z = i_vec.z;
}
void stopCreateParticle() { setStatus(JPAEmtrStts_StopEmit); }
void becomeInvalidEmitter() {
+10
View File
@@ -1461,6 +1461,16 @@ inline JPABaseEmitter* dComIfGp_particle_set(u16 particleID, const cXyz* pos, co
pPrmColor, pEnvColor, pScale2D);
}
inline JPABaseEmitter* dComIfGp_particle_setProjection(u16 particleID, const cXyz* pos, const csXyz* angle,
const cXyz* scale, u8 alpha,
dPa_levelEcallBack* pCallBack, s8 setupInfo,
const GXColor* pPrmColor, const GXColor* pEnvColor,
const cXyz* pScale2D) {
dPa_control_c* pParticle = g_dComIfG_gameInfo.play.getParticle();
return pParticle->setProjection(particleID, pos, angle, scale, alpha, pCallBack, setupInfo,
pPrmColor, pEnvColor, pScale2D);
}
inline JPABaseEmitter* dComIfGp_particle_set(u16 particleID, const cXyz* pos, const csXyz* angle,
const cXyz* scale) {
return dComIfGp_particle_set(particleID, pos, angle, scale, 0xFF, NULL, -1, NULL, NULL, NULL);
+10 -1
View File
@@ -43,6 +43,8 @@ public:
virtual void draw(JPABaseEmitter*);
virtual void setup(JPABaseEmitter*, cXyz const*, csXyz const*, s8);
virtual void end();
void setRateOff(u8 i_rate) { field_0x11 = i_rate; }
JPABaseEmitter* getEmitter() { return mpEmitter; }
@@ -254,8 +256,15 @@ public:
const cXyz* scale, u8 alpha, dPa_levelEcallBack* pCallBack,
s8 setupInfo, const GXColor* pPrmColor, const GXColor* pEnvColor,
const cXyz* pScale2D) {
return set(1, particleID, pos, angle, scale, alpha, pCallBack, setupInfo, pPrmColor, pEnvColor, pScale2D);
return set(2, particleID, pos, angle, scale, alpha, pCallBack, setupInfo, pPrmColor, pEnvColor, pScale2D);
}
JPABaseEmitter* setProjection(u16 particleID, const cXyz* pos, const csXyz* angle,
const cXyz* scale, u8 alpha, dPa_levelEcallBack* pCallBack,
s8 setupInfo, const GXColor* pPrmColor, const GXColor* pEnvColor,
const cXyz* pScale2D) {
return set(4, particleID, pos, angle, scale, alpha, pCallBack, setupInfo, pPrmColor, pEnvColor, pScale2D);
}
void drawModelParticle() { mModelCtrl->draw(); }
+121 -3
View File
@@ -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, &current.pos, &current.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, &current.pos, &current.angle, NULL, 0xFF, NULL, current.roomNo, &mTevStr.mColorK0, &emitter2Color, NULL);
mEmitters[2] = dComIfGp_particle_setToon(0xA187, &current.pos, &current.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, &current.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 */