Merge pull request #656 from Aelire/d_a_obj_gryw

d_a_obj_gryw00
This commit is contained in:
LagoLunatic
2024-06-06 13:28:31 -04:00
committed by GitHub
4 changed files with 253 additions and 48 deletions
+1 -1
View File
@@ -1266,7 +1266,7 @@ config.libs = [
ActorRel(NonMatching, "d_a_obj_demo_barrel"),
ActorRel(NonMatching, "d_a_obj_doguu"),
ActorRel(Matching, "d_a_obj_doguu_demo"),
ActorRel(NonMatching, "d_a_obj_gryw00"),
ActorRel(Matching, "d_a_obj_gryw00", extra_cflags=['-pragma "nosyminline on"']),
ActorRel(Matching, "d_a_obj_hfuck1", extra_cflags=['-pragma "nosyminline on"']),
ActorRel(Matching, "d_a_obj_hole", extra_cflags=['-pragma "nosyminline on"']),
ActorRel(NonMatching, "d_a_obj_ice"),
+40 -9
View File
@@ -1,33 +1,64 @@
#ifndef D_A_OBJ_GRYW00_H
#define D_A_OBJ_GRYW00_H
#include "JSystem/JParticle/JPAEmitter.h"
#include "m_Do/m_Do_ext.h"
#include "f_op/f_op_actor.h"
class daObjGryw00_c : public fopAc_ac_c {
#include "d/d_a_obj.h"
#include "d/d_bg_s_movebg_actor.h"
class daObjGryw00_c : public dBgS_MoveBgActor {
public:
void param_get_swSave() const {}
enum Param_e {
PRM_SWSAVE_W = 0x08,
PRM_SWSAVE_S = 0x00,
};
typedef void (daObjGryw00_c::*ModeFunc)();
s32 param_get_swSave() const {
return daObj::PrmAbstract<Param_e>(this, PRM_SWSAVE_W, PRM_SWSAVE_S);
}
f32 get_draw_water_lv(void*);
void setup_high_water_level_btk_anm();
BOOL setup_high_water_level_btk_anm();
void particle_set();
void particle_move();
void particle_delete();
void set_se();
void CreateHeap();
s32 Create();
void Mthd_Create();
int CreateHeap();
int Create();
s32 Mthd_Create();
BOOL Delete();
void Mthd_Delete();
BOOL Mthd_Delete();
void switch_wait_act_proc();
void spread_water_face_act_proc();
void water_level_move_wait_act_proc();
void anime_loop_start_wait_act_proc();
void high_water_level_act_proc();
void Execute(float(**)[3][4]);
BOOL Execute(Mtx**);
BOOL Draw();
public:
/* Place member variables here */
/* 0x2C8 */ request_of_phase_process_class mPhs;
/* 0x2D0 */ J3DModel* mpModel;
/* 0x2D4 */ Mtx mMtx;
/* 0x304 */ mDoExt_btkAnm mBtk;
/* 0x318 */ mDoExt_bckAnm mBck;
/* 0x328 */ s32 mActivationSwitch;
/* 0x32C */ void (daObjGryw00_c::*modeFunc)();
/* 0x338 */ BOOL mIsHidden;
/* 0x33C */ f32 mWaterLv;
/* 0x340 */ f32 mWaterMaxLv;
/* 0x344 */ f32 mWaterLvIncrement;
/* 0x348 */ f32 mWaveAmplitude;
/* 0x34C */ f32 mWaveMaxAmplitude;
/* 0x350 */ f32 mWaveAmplitudeIncrement;
/* 0x354 */ f32 mWaterLvFinalYPos; // never read ? at least by this class
/* 0x358 */ BOOL mShouldPlaySe;
/* 0x35C */ s32 mGeyserSeRemaining;
/* 0x360 */ JPABaseEmitter* mpEmitters[2];
};
#endif /* D_A_OBJ_GRYW00_H */
+1
View File
@@ -28,6 +28,7 @@ public:
J3DFrameCtrl* getFrameCtrl() { return mFrameCtrl; }
f32 getPlaySpeed() { return mFrameCtrl->getRate(); }
void setPlaySpeed(f32 speed) { mFrameCtrl->setRate(speed); }
BOOL checkFrame(f32 frame) { return mFrameCtrl->checkPass(frame); }
f32 getFrame() { return mFrameCtrl->getFrame(); }
f32 getEndFrame() { return mFrameCtrl->getEnd(); }
void setFrame(f32 frame) { mFrameCtrl->setFrame(frame); }
+211 -38
View File
@@ -3,122 +3,295 @@
// Translation Unit: d_a_obj_gryw00.cpp
//
#include "d/actor/d_a_obj_gryw00.h"
#include "d/d_com_inf_game.h"
#include "d/d_particle.h"
#include "d/d_procname.h"
#include "d/actor/d_a_obj_gryw00.h"
#include "d/res/res_gryw00.h"
#define SPREAD_PHASE_ANIM_LEN 95
#define RISE_PHASE_ANIM_LEN 299
#define WATER_WAVE_GROWTH_SPEED 0.10526316
#define WATER_RISE_SPEED 1.6777408
#define WAVE_AMPLITUDE -10
#define HIGH_WATER_LEVEL 510
#define GEYSER_SOUND_LEN 310
namespace {
static const char l_arcname[] = "Gryw00";
}
/* 00000078-00000090 .text get_draw_water_lv__13daObjGryw00_cFPv */
f32 daObjGryw00_c::get_draw_water_lv(void*) {
/* Nonmatching */
f32 daObjGryw00_c::get_draw_water_lv(void* p) {
daObjGryw00_c* actr = static_cast<daObjGryw00_c*>(p);
return actr->home.pos.y + actr->mWaterLv + actr->mWaveAmplitude;
}
/* 00000090-00000168 .text setup_high_water_level_btk_anm__13daObjGryw00_cFv */
void daObjGryw00_c::setup_high_water_level_btk_anm() {
/* Nonmatching */
BOOL daObjGryw00_c::setup_high_water_level_btk_anm() {
BOOL ret = TRUE;
J3DAnmTextureSRTKey* btk_anm_p = static_cast<J3DAnmTextureSRTKey*>(dComIfG_getObjectRes(l_arcname, GRYW00_BTK_GRYW00));
JUT_ASSERT(223, btk_anm_p != 0);
if (!mBtk.init(mpModel->getModelData(), btk_anm_p, 1, J3DFrameCtrl::LOOP_REPEAT_e, 1.0f, 0x191, -1, -1, 0)) {
ret = FALSE;
}
return ret;
}
/* 00000168-000002D0 .text particle_set__13daObjGryw00_cFv */
void daObjGryw00_c::particle_set() {
/* Nonmatching */
cXyz homePos = this->home.pos;
dComIfGp_particle_set(0x8295U, &homePos, NULL, NULL, 0xff, NULL, -1, NULL, &tevStr.mColorK0, NULL);
dComIfGp_particle_set(0x8297U, &homePos, NULL, NULL, 0xff, NULL, -1, NULL, &tevStr.mColorK0, NULL);
mpEmitters[0] = dComIfGp_particle_set(0x8296U, &homePos, NULL, NULL, 0xff, NULL, -1, NULL,
&tevStr.mColorK0, NULL);
mpEmitters[1] = dComIfGp_particle_set(0x8298U, &homePos, NULL, NULL, 0xff, NULL, -1, NULL,
&tevStr.mColorK0, NULL);
}
/* 000002D0-00000338 .text particle_move__13daObjGryw00_cFv */
void daObjGryw00_c::particle_move() {
/* Nonmatching */
cXyz waterPos(this->home.pos.x, this->home.pos.y + mWaterLv, this->home.pos.z);
if (mpEmitters[0]) {
mpEmitters[0]->setGlobalTranslation(waterPos);
}
if (mpEmitters[1]) {
mpEmitters[1]->setGlobalTranslation(waterPos);
}
}
/* 00000338-0000038C .text particle_delete__13daObjGryw00_cFv */
void daObjGryw00_c::particle_delete() {
/* Nonmatching */
if (mpEmitters[0]) {
mpEmitters[0]->becomeInvalidEmitter();
mpEmitters[0] = NULL;
}
if (mpEmitters[1]) {
mpEmitters[1]->becomeInvalidEmitter();
mpEmitters[1] = NULL;
}
}
/* 0000038C-000004C4 .text set_se__13daObjGryw00_cFv */
void daObjGryw00_c::set_se() {
/* Nonmatching */
if (mShouldPlaySe != TRUE) {
return;
}
if (mWaterLv >= HIGH_WATER_LEVEL) {
mShouldPlaySe = FALSE;
}
if (mGeyserSeRemaining > 0) {
mGeyserSeRemaining--;
fopAcM_seStartCurrent(this, JA_SE_OBJ_RDUN_MAE_GEYSER, 0);
}
fopAcM_seStartCurrent(this, JA_SE_OBJ_RDUN_MAE_W_OUT, 0);
fopAcM_seStartCurrent(this, JA_SE_OBJ_RDUN_MAE_W_UP, 0);
}
/* 000004C4-00000654 .text CreateHeap__13daObjGryw00_cFv */
void daObjGryw00_c::CreateHeap() {
/* Nonmatching */
int daObjGryw00_c::CreateHeap() {
BOOL ret = TRUE;
J3DModelData* mdlData = static_cast<J3DModelData*>(dComIfG_getObjectRes(l_arcname, GRYW00_BDL_GRYW00));
J3DAnmTextureSRTKey* pbtk = static_cast<J3DAnmTextureSRTKey*>(dComIfG_getObjectRes(l_arcname, GRYW00_BTK_GRYW00));
J3DAnmTransform* pbck = static_cast<J3DAnmTransform*>(dComIfG_getObjectRes(l_arcname, GRYW00_BCK_GRYW00));
if (!mdlData || !pbtk || !pbck) {
JUT_PANIC(409);
ret = FALSE;
} else {
mpModel = mDoExt_J3DModel__create(mdlData, 0x80000U, 0x11000222U);
BOOL btk_inited = mBtk.init(mpModel->getModelData(), pbtk, TRUE,
J3DFrameCtrl::LOOP_ONCE_e, 0.0f, 0, 0x190, FALSE, 0);
BOOL bck_inited = mBck.init(mpModel->getModelData(), pbck, TRUE,
J3DFrameCtrl::LOOP_ONCE_e, 0.0f, 0, -1, FALSE);
if (!mpModel || !btk_inited || !bck_inited) {
ret = FALSE;
}
}
return ret;
}
/* 00000654-000007D4 .text Create__13daObjGryw00_cFv */
s32 daObjGryw00_c::Create() {
/* Nonmatching */
int daObjGryw00_c::Create() {
mActivationSwitch = param_get_swSave();
mWaterLvFinalYPos = HIGH_WATER_LEVEL + home.pos.y;
if (mActivationSwitch != 0xff && fopAcM_isSwitch(this, mActivationSwitch) == TRUE) {
/* Puzzle already solved on load, water already high, only static animation */
setup_high_water_level_btk_anm();
mBck.setFrame(RISE_PHASE_ANIM_LEN);
mIsHidden = FALSE;
modeFunc = &high_water_level_act_proc;
mWaterLv = HIGH_WATER_LEVEL;
mWaterMaxLv = HIGH_WATER_LEVEL;
mWaveAmplitude = WAVE_AMPLITUDE;
mWaveMaxAmplitude = WAVE_AMPLITUDE;
} else {
/* Waiting state until puzzle is solved */
mIsHidden = TRUE;
modeFunc = &switch_wait_act_proc;
mWaterLv = -5;
mWaterMaxLv = -5;
mWaveAmplitude = 0;
mWaveMaxAmplitude = 0;
}
mpModel->setBaseScale(this->scale);
mDoMtx_stack_c::transS(this->home.pos.x,
this->home.pos.y + mWaterLv + mWaveAmplitude,
this->home.pos.z);
mpModel->setBaseTRMtx(mDoMtx_stack_c::get());
fopAcM_SetMtx(this, mpModel->getBaseTRMtx());
return TRUE;
}
/* 000007D4-0000090C .text Mthd_Create__13daObjGryw00_cFv */
void daObjGryw00_c::Mthd_Create() {
/* Nonmatching */
s32 daObjGryw00_c::Mthd_Create() {
fopAcM_SetupActor(this, daObjGryw00_c);
s32 phase_state = dComIfG_resLoad(&mPhs, l_arcname);
if (phase_state == cPhs_COMPLEATE_e) {
phase_state = MoveBGCreate(l_arcname, 0xf, dBgS_MoveBGProc_Trans, 0x9a0);
JUT_ASSERT(519, (phase_state == cPhs_COMPLEATE_e) || (phase_state == cPhs_ERROR_e));
}
return phase_state;
}
/* 00000A0C-00000A30 .text Delete__13daObjGryw00_cFv */
BOOL daObjGryw00_c::Delete() {
/* Nonmatching */
particle_delete();
return TRUE;
}
/* 00000A30-00000A7C .text Mthd_Delete__13daObjGryw00_cFv */
void daObjGryw00_c::Mthd_Delete() {
/* Nonmatching */
BOOL daObjGryw00_c::Mthd_Delete() {
int res = MoveBGDelete();
dComIfG_resDelete(&mPhs, l_arcname);
return res;
}
/* 00000A7C-00000B50 .text switch_wait_act_proc__13daObjGryw00_cFv */
void daObjGryw00_c::switch_wait_act_proc() {
/* Nonmatching */
if (mActivationSwitch == 0xff) {
return;
}
if (!(fopAcM_isSwitch(this, mActivationSwitch) == TRUE)) {
return;
}
mBtk.setPlaySpeed(1.0f);
mBck.setPlaySpeed(1.0f);
/* Waves get larger, water spreads, but water level stays still */
mWaveAmplitudeIncrement = -WATER_WAVE_GROWTH_SPEED;
mWaveMaxAmplitude = WAVE_AMPLITUDE;
mWaterLvIncrement = WATER_WAVE_GROWTH_SPEED;
mWaterMaxLv = 5;
particle_set();
mGeyserSeRemaining = GEYSER_SOUND_LEN;
mShouldPlaySe = TRUE;
mIsHidden = FALSE;
modeFunc = &spread_water_face_act_proc;
}
/* 00000B50-00000BB0 .text spread_water_face_act_proc__13daObjGryw00_cFv */
void daObjGryw00_c::spread_water_face_act_proc() {
/* Nonmatching */
if (mBtk.checkFrame(SPREAD_PHASE_ANIM_LEN)) {
modeFunc = &water_level_move_wait_act_proc;
}
}
/* 00000BB0-00000C44 .text water_level_move_wait_act_proc__13daObjGryw00_cFv */
void daObjGryw00_c::water_level_move_wait_act_proc() {
/* Nonmatching */
if (mBtk.checkFrame(RISE_PHASE_ANIM_LEN)) {
mWaterLvIncrement = WATER_RISE_SPEED;
mWaterMaxLv = HIGH_WATER_LEVEL;
modeFunc = &anime_loop_start_wait_act_proc;
mBck.setPlaySpeed(0);
mBck.setFrame(RISE_PHASE_ANIM_LEN);
}
}
/* 00000C44-00000CD0 .text anime_loop_start_wait_act_proc__13daObjGryw00_cFv */
void daObjGryw00_c::anime_loop_start_wait_act_proc() {
/* Nonmatching */
if (mBtk.isStop()) {
particle_delete();
setup_high_water_level_btk_anm();
modeFunc = &high_water_level_act_proc;
}
}
/* 00000CD0-00000CD4 .text high_water_level_act_proc__13daObjGryw00_cFv */
void daObjGryw00_c::high_water_level_act_proc() {
/* Nonmatching */
}
void daObjGryw00_c::high_water_level_act_proc() {}
/* 00000CD4-00000E30 .text Execute__13daObjGryw00_cFPPA3_A4_f */
void daObjGryw00_c::Execute(float(**)[3][4]) {
/* Nonmatching */
int daObjGryw00_c::Execute(Mtx** pMtx) {
mWaveAmplitude += mWaveAmplitudeIncrement;
if (mWaveAmplitude < mWaveMaxAmplitude) {
mWaveAmplitude = mWaveMaxAmplitude;
mWaveAmplitudeIncrement = 0;
}
mWaterLv += mWaterLvIncrement;
if (mWaterLv > mWaterMaxLv) {
mWaterLv = mWaterMaxLv;
mWaterLvIncrement = 0;
}
f32 z_for_trans = this->home.pos.z;
f32 draw_water_lv = get_draw_water_lv(this);
mDoMtx_stack_c::transS(this->home.pos.x, draw_water_lv, z_for_trans);
mpModel->setBaseTRMtx(mDoMtx_stack_c::get());
mDoMtx_stack_c::transS(this->home.pos.x, this->home.pos.y + mWaterLv, this->home.pos.z);
mDoMtx_stack_c::scaleM(this->scale);
cMtx_copy(mDoMtx_stack_c::get(), mMtx);
*pMtx = &mMtx;
particle_move();
set_se();
mBtk.play();
mBck.play();
(this->*modeFunc)();
return TRUE;
}
/* 00000E30-00000ECC .text Draw__13daObjGryw00_cFv */
BOOL daObjGryw00_c::Draw() {
/* Nonmatching */
if (!mIsHidden) {
g_env_light.settingTevStruct(TEV_TYPE_BG1, &this->current.pos, &tevStr);
g_env_light.setLightTevColorType(mpModel, &tevStr);
mBtk.entry(mpModel->getModelData());
mBck.entry(mpModel->getModelData());
mDoExt_modelUpdateDL(mpModel);
}
return TRUE;
}
/* 00000ECC-00000EEC .text daObjGryw00_Create__FP13daObjGryw00_c */
static s32 daObjGryw00_Create(daObjGryw00_c*) {
/* Nonmatching */
static s32 daObjGryw00_Create(daObjGryw00_c* i_this) {
return i_this->Mthd_Create();
}
/* 00000EEC-00000F0C .text daObjGryw00_Delete__FP13daObjGryw00_c */
static BOOL daObjGryw00_Delete(daObjGryw00_c*) {
/* Nonmatching */
static BOOL daObjGryw00_Delete(daObjGryw00_c* i_this) {
return i_this->Mthd_Delete();
}
/* 00000F0C-00000F2C .text daObjGryw00_Execute__FP13daObjGryw00_c */
static BOOL daObjGryw00_Execute(daObjGryw00_c*) {
/* Nonmatching */
static BOOL daObjGryw00_Execute(daObjGryw00_c* i_this) {
return i_this->MoveBGExecute();
}
/* 00000F2C-00000F58 .text daObjGryw00_Draw__FP13daObjGryw00_c */
static BOOL daObjGryw00_Draw(daObjGryw00_c*) {
/* Nonmatching */
static BOOL daObjGryw00_Draw(daObjGryw00_c* i_this) {
return i_this->MoveBGDraw();
}
/* 00000F58-00000F84 .text daObjGryw00_IsDelete__FP13daObjGryw00_c */
static BOOL daObjGryw00_IsDelete(daObjGryw00_c*) {
/* Nonmatching */
static BOOL daObjGryw00_IsDelete(daObjGryw00_c* i_this) {
return i_this->MoveBGIsDelete();
}
static actor_method_class l_daObjGryw00_Method = {