From a1868a841a68c509182423fa4f0bbcc93b112a27 Mon Sep 17 00:00:00 2001 From: "Jasper St. Pierre" Date: Mon, 2 Oct 2023 20:29:16 -0700 Subject: [PATCH] d_s_open 99% --- include/SSystem/SComponent/c_node.h | 6 +- include/SSystem/SComponent/c_tag.h | 6 +- include/d/d_com_inf_game.h | 11 +++ include/d/d_drawlist.h | 21 +++-- include/f_op/f_op_scene_tag.h | 6 +- src/d/d_s_open.cpp | 129 +++++++++++++++++++++++----- src/f_op/f_op_scene_mng.cpp | 4 +- src/f_op/f_op_scene_req.cpp | 3 +- 8 files changed, 145 insertions(+), 41 deletions(-) diff --git a/include/SSystem/SComponent/c_node.h b/include/SSystem/SComponent/c_node.h index c7be81e4f..317dfded3 100644 --- a/include/SSystem/SComponent/c_node.h +++ b/include/SSystem/SComponent/c_node.h @@ -3,9 +3,9 @@ typedef struct node_class { - struct node_class* mpPrevNode; - void* mpData; - struct node_class* mpNextNode; + /* 0x00 */ struct node_class* mpPrevNode; + /* 0x04 */ void* mpData; + /* 0x08 */ struct node_class* mpNextNode; } node_class; void cNd_Join(node_class* pA, node_class* pB); diff --git a/include/SSystem/SComponent/c_tag.h b/include/SSystem/SComponent/c_tag.h index 4c536cd7c..e2dbf41db 100644 --- a/include/SSystem/SComponent/c_tag.h +++ b/include/SSystem/SComponent/c_tag.h @@ -8,9 +8,9 @@ typedef struct node_list_class node_list_class; typedef struct node_lists_tree_class node_lists_tree_class; typedef struct create_tag_class { - node_class mpNode; - void* mpTagData; - s8 mbIsUse; + /* 0x00 */ node_class mpNode; + /* 0x0C */ void* mpTagData; + /* 0x10 */ s8 mbIsUse; } create_tag_class; int cTg_IsUse(create_tag_class* pTag); diff --git a/include/d/d_com_inf_game.h b/include/d/d_com_inf_game.h index 4aee19fec..23aae5c94 100644 --- a/include/d/d_com_inf_game.h +++ b/include/d/d_com_inf_game.h @@ -1184,6 +1184,8 @@ inline u8 dComIfGp_getMiniGameType() { return g_dComIfG_gameInfo.play.mMiniGameType; } +inline dDlst_window_c * dComIfGp_getWindow(int idx) { return &g_dComIfG_gameInfo.play.mDlstWindow[idx]; } + /** * === EVENT ===*/ @@ -1440,6 +1442,13 @@ inline MtxP dComIfGd_getViewRotMtx() { return dComIfGd_getView()->mViewMtxNoTrans; } +inline void dComIfGd_set2DOpa(dDlst_base_c* pBase) { g_dComIfG_gameInfo.drawlist.set2DOpa(pBase); } +inline void dComIfGd_set2DXlu(dDlst_base_c* pBase) { g_dComIfG_gameInfo.drawlist.set2DXlu(pBase); } + +inline void dComIfGd_setWindow(dDlst_window_c* pWindow) { g_dComIfG_gameInfo.drawlist.setWindow(pWindow); } +inline void dComIfGd_setViewPort(view_port_class* pViewPort) { g_dComIfG_gameInfo.drawlist.setViewPort(pViewPort); } +inline void dComIfGd_setView(view_class* pView) { g_dComIfG_gameInfo.drawlist.setView(pView); } + /** * === RESOURCE === */ @@ -1583,4 +1592,6 @@ inline void dComIfG_TimerDeleteRequest() { dComIfG_getTimerPtr()->deleteRequest(); } +int dComIfG_changeOpeningScene(scene_class* i_scene, s16 i_procName); + #endif /* D_COM_D_COM_INF_GAME_H */ diff --git a/include/d/d_drawlist.h b/include/d/d_drawlist.h index a64207c1f..7c6ef0f20 100644 --- a/include/d/d_drawlist.h +++ b/include/d/d_drawlist.h @@ -11,6 +11,7 @@ class ResTIMG; class dDlst_base_c { public: dDlst_base_c() {} + virtual ~dDlst_base_c(); virtual void draw(); }; @@ -208,7 +209,6 @@ public: void wipeIn(f32, GXColor&); void wipeIn(f32); void calcWipe(); - void set2DOpa(dDlst_base_c*); J3DDrawBuffer* getOpaListFilter() { return mpWetherFxBuffer; } @@ -237,6 +237,9 @@ public: entryZSortXluDrawList(mpBufInvisibleModelXlu, i_packet, param_1); } + void set2DOpa(dDlst_base_c* pList) { set(mp2DOpa, mp2DOpaEnd, pList); } + void set2DXlu(dDlst_base_c* pList) { set(mp2DXlu, mp2DXluEnd, pList); } + int setSimpleShadow(cXyz* param_0, f32 param_1, f32 param_2, cXyz* param_3, s16 param_4, f32 param_5, _GXTexObj* param_6) { return mShadowControl.setSimple(param_0, param_1, param_2, param_3, param_4, param_5, @@ -253,6 +256,10 @@ public: s32 getSpotModelNum() { return mpSpotModel->getNum(); } s32 getLightModelNum() { return mpLightModel->getNum(); } + void setWindow(dDlst_window_c* pWindow) { mpWindow = pWindow; } + void setViewPort(view_port_class* pViewPort) { mpViewPort = pViewPort; } + void setView(view_class* pView) { mpCamera = (camera_class*)pView; } + static void offWipe() { mWipe = false; } static bool mWipe; @@ -279,13 +286,13 @@ public: /* 0x00098 */ void* field_0x00098; /* 0x0009C */ dDlst_base_c* mp2DArr[64]; /* 0x0019C */ dDlst_base_c** mp2DOpa; - /* 0x001A0 */ dDlst_base_c*** mp2DOpaEnd; + /* 0x001A0 */ dDlst_base_c** mp2DOpaEnd; /* 0x001A4 */ u8 field_0x001A4[0x00224 - 0x001A4]; - /* 0x00224 */ dDlst_base_c** field_0x00224; - /* 0x00228 */ dDlst_base_c*** field_0x00228; - /* 0x0022C */ dDlst_window_c* field_0x0022c; - /* 0x00230 */ dDlst_window_c* field_0x00230; - /* 0x00234 */ camera_class* mpCamera; + /* 0x00224 */ dDlst_base_c** mp2DXlu; + /* 0x00228 */ dDlst_base_c** mp2DXluEnd; + /* 0x0022C */ dDlst_window_c* mpWindow; + /* 0x00230 */ view_port_class* mpViewPort; + /* 0x00234 */ camera_class* mpCamera; // should be view_class* /* 0x00238 */ u8 field_0x00238[0x00244 - 0x00238]; /* 0x00244 */ dDlst_alphaModel_c* mpAlphaModel; /* 0x00248 */ dDlst_alphaModel_c* mpSpotModel; diff --git a/include/f_op/f_op_scene_tag.h b/include/f_op/f_op_scene_tag.h index 8d024f0c5..51ef174f6 100644 --- a/include/f_op/f_op_scene_tag.h +++ b/include/f_op/f_op_scene_tag.h @@ -2,12 +2,10 @@ #define F_F_OP_SCENE_TAG_H_ #include "SSystem/SComponent/c_phase.h" +#include "f_pc/f_pc_create_tag.h" #include "f_pc/f_pc_node.h" - -class scene_tag_class { -public: - u8 field_0x00[0x14]; +class scene_tag_class : public create_tag_class { }; void fopScnTg_QueueTo(scene_tag_class* pSceneTag); diff --git a/src/d/d_s_open.cpp b/src/d/d_s_open.cpp index 082eb712e..cdee88f18 100644 --- a/src/d/d_s_open.cpp +++ b/src/d/d_s_open.cpp @@ -3,56 +3,145 @@ // Translation Unit: d_s_open.cpp // -#include "d_s_open.h" -#include "dolphin/types.h" +#include "f_op/f_op_scene.h" +#include "f_op/f_op_draw_iter.h" +#include "f_op/f_op_scene_mng.h" +#include "f_op/f_op_overlap_mng.h" +#include "JSystem/JKernel/JKRSolidHeap.h" +#include "d/d_com_inf_game.h" +#include "d/d_procname.h" +#include "m_Do/m_Do_audio.h" +#include "m_Do/m_Do_controller_pad.h" + +class dScnOpen_message_c; +class J2DScreen; + +class dScnOpen_proc_c : public dDlst_base_c { +public: + dScnOpen_proc_c(); + virtual ~dScnOpen_proc_c(); + void proc_execute(); + + /* 0x004 */ JKRExpHeap* exp_heap; + /* 0x008 */ dScnOpen_message_c* m_message; + /* 0x00C */ J2DScreen* m_Screen; + /* 0x010 */ u8 pad[0x2a0]; + /* 0x2B0 */ s32 field_0x2b0; + /* 0x010 */ u8 pad2[0x014]; +}; + +class dScnOpen_c : public scene_class { +public: + ~dScnOpen_c(); + void changeGameScene(); + s32 create(); + BOOL draw(); + BOOL execute(); + + /* 0x1C4 */ request_of_phase_process_class mPhs; + /* 0x1CC */ JKRSolidHeap* solid_heap; + /* 0x1D0 */ dScnOpen_proc_c* mpProc; + /* 0x1D4 */ u8 field_0x1d4; +}; /* 80232A68-80232BC4 .text create__10dScnOpen_cFv */ -void dScnOpen_c::create() { - /* Nonmatching */ +s32 dScnOpen_c::create() { + dComIfGp_offEnableNextStage(); + mpProc = NULL; + + s32 rt = dComIfG_resLoad(&mPhs, "Opening"); + if (rt == cPhs_COMPLEATE_e) { + solid_heap = mDoExt_createSolidHeapFromGameToCurrent(0x20000, 0); + JUT_ASSERT(0x3b, solid_heap != 0); + mpProc = new dScnOpen_proc_c(); + field_0x1d4 = NULL; + mDoExt_restoreCurrentHeap(); + mDoExt_adjustSolidHeap(solid_heap); + // mDoGph_gInf_c::setTickRate(); + } else if (rt == cPhs_ERROR_e) { + JUT_ASSERT(0x48, rt == cPhs_COMPLEATE_e); + } + return rt; } /* 80232BC4-80232CAC .text execute__10dScnOpen_cFv */ -void dScnOpen_c::execute() { - /* Nonmatching */ +BOOL dScnOpen_c::execute() { + if (mpProc->field_0x2b0 >= 5 && !fopOvlpM_IsPeek() && !dComIfG_resetToOpening(this)) { + if (fpcM_GetName(this) == PROC_OPEN2_SCENE && (CPad_CHECK_TRIG_A(0) || CPad_CHECK_TRIG_B(0) || CPad_CHECK_TRIG_START(0))) { + field_0x1d4 = 1; + mDoAud_bgmStop(20); + } + + if (field_0x1d4 == 1 && !mDoAud_isUsedHeapForStreamBuffer()) + dComIfG_changeOpeningScene(this, PROC_OPENING2_SCENE); + } + + mpProc->proc_execute(); + if (mpProc->field_0x2b0 == 44) + changeGameScene(); + + return TRUE; } /* 80232CAC-80232D38 .text draw__10dScnOpen_cFv */ -void dScnOpen_c::draw() { - /* Nonmatching */ +BOOL dScnOpen_c::draw() { + dComIfGd_setWindow(dComIfGp_getWindow(0)); + dComIfGd_setViewPort(dComIfGp_getWindow(0)->getViewPort()); + for (create_tag_class* pTag = fopDwIt_Begin(); pTag != NULL; pTag = fopDwIt_Next(pTag)) + fpcM_Draw(pTag->mpTagData); + dComIfGd_set2DOpa(mpProc); + return TRUE; } /* 80232D38-80232DD8 .text __dt__10dScnOpen_cFv */ dScnOpen_c::~dScnOpen_c() { - /* Nonmatching */ + if (mpProc != NULL) + delete mpProc; + if (solid_heap != NULL) + mDoExt_destroySolidHeap(solid_heap); + dComIfG_resDelete(&mPhs, "Opening"); + g_dComIfG_gameInfo.play.field_0x4841 = 0; } /* 80232DD8-80232E6C .text changeGameScene__10dScnOpen_cFv */ void dScnOpen_c::changeGameScene() { - /* Nonmatching */ + if (fopOvlpM_IsPeek()) + return; + + if (fpcM_GetName(this) == PROC_OPEN2_SCENE) { + dComIfG_changeOpeningScene(this, PROC_OPENING2_SCENE); + } else { + if (fopScnM_ChangeReq(this, PROC_PLAY_SCENE, 0, 5)) { + dComIfGs_setRestartRoomParam(0); + mDoAud_setSceneName(dComIfGp_getNextStageName(), dComIfGp_getNextStageRoomNo(), dComIfGp_getNextStageLayer()); + } + } } /* 80232E6C-80232E8C .text dScnOpen_Draw__FP10dScnOpen_c */ -void dScnOpen_Draw(dScnOpen_c*) { - /* Nonmatching */ +BOOL dScnOpen_Draw(dScnOpen_c* i_this) { + return i_this->draw(); } /* 80232E8C-80232EAC .text dScnOpen_Execute__FP10dScnOpen_c */ -void dScnOpen_Execute(dScnOpen_c*) { - /* Nonmatching */ +BOOL dScnOpen_Execute(dScnOpen_c* i_this) { + return i_this->execute(); } /* 80232EAC-80232EB4 .text dScnOpen_IsDelete__FP10dScnOpen_c */ -void dScnOpen_IsDelete(dScnOpen_c*) { - /* Nonmatching */ +BOOL dScnOpen_IsDelete(dScnOpen_c* i_this) { + return TRUE; } /* 80232EB4-80232EDC .text dScnOpen_Delete__FP10dScnOpen_c */ -void dScnOpen_Delete(dScnOpen_c*) { - /* Nonmatching */ +BOOL dScnOpen_Delete(dScnOpen_c* i_this) { + i_this->~dScnOpen_c(); + return TRUE; } /* 80232EDC-80232EFC .text dScnOpen_Create__FP11scene_class */ -void dScnOpen_Create(scene_class*) { - /* Nonmatching */ +s32 dScnOpen_Create(scene_class* i_scn) { + dScnOpen_c* i_this = (dScnOpen_c*)i_scn; + return i_this->create(); } diff --git a/src/f_op/f_op_scene_mng.cpp b/src/f_op/f_op_scene_mng.cpp index dab07cd23..465c88600 100644 --- a/src/f_op/f_op_scene_mng.cpp +++ b/src/f_op/f_op_scene_mng.cpp @@ -15,8 +15,8 @@ scene_class* fopScnM_SearchByID(unsigned int id) { static u32 l_scnRqID = 0xFFFFFFFF; -int fopScnM_ChangeReq(scene_class* i_scene, s16 param_2, s16 param_3, u16 param_4) { - u32 sceneRequestID = fopScnRq_Request(2, i_scene, param_2, 0, param_3, param_4); +int fopScnM_ChangeReq(scene_class* i_scene, s16 procName, s16 fadeTime, u16 param_4) { + u32 sceneRequestID = fopScnRq_Request(2, i_scene, procName, 0, fadeTime, param_4); if (sceneRequestID == 0xFFFFFFFF) { return 0; diff --git a/src/f_op/f_op_scene_req.cpp b/src/f_op/f_op_scene_req.cpp index 505ebf378..0d6475df4 100644 --- a/src/f_op/f_op_scene_req.cpp +++ b/src/f_op/f_op_scene_req.cpp @@ -82,8 +82,7 @@ static scene_request_class* fopScnRq_FadeRequest(s16 param_1, u16 param_2) { return (scene_request_class*)req; } -s32 fopScnRq_Request(int param_1, scene_class* i_scene, s16 param_3, void* param_4, s16 param_5, - u16 param_6) { +s32 fopScnRq_Request(int param_1, scene_class* i_scene, s16 param_3, void* param_4, s16 param_5, u16 param_6) { static node_create_request_method_class submethod = { (process_method_func)fopScnRq_Execute, (process_method_func)fopScnRq_Cancel,