From 88a753265e537c7ee9b9b620f31e69f776b124ae Mon Sep 17 00:00:00 2001 From: TakaRikka <38417346+TakaRikka@users.noreply.github.com> Date: Sun, 28 Jun 2026 15:40:28 -0700 Subject: [PATCH] water_mark / wpillar done, minigame_starter wip (#1069) * d_minigame_starter attempt * water_mark / wpillar done * review changes --- configure.py | 4 +- include/d/actor/d_a_player_main.h | 4 +- include/d/d_minigame_starter.h | 46 ++-- include/d/d_water_mark.h | 20 +- include/d/d_wpillar.h | 12 +- src/d/d_minigame_starter.cpp | 367 +++++++++++++++++++++++++++--- src/d/d_water_mark.cpp | 173 ++++++++++++-- src/d/d_wpillar.cpp | 177 ++++++++++++-- 8 files changed, 711 insertions(+), 92 deletions(-) diff --git a/configure.py b/configure.py index d9208ada4..0c616adca 100755 --- a/configure.py +++ b/configure.py @@ -663,9 +663,9 @@ config.libs = [ Object(NonMatching, "d/d_scope.cpp"), Object(Matching, "d/d_throwstone.cpp"), Object(Matching, "d/d_timer.cpp"), - Object(NonMatching, "d/d_water_mark.cpp"), + Object(Matching, "d/d_water_mark.cpp"), Object(Matching, "d/d_wind_arrow.cpp"), - Object(NonMatching, "d/d_wpillar.cpp"), + Object(MatchingFor("GZLJ01", "GZLE01", "GZLP01"), "d/d_wpillar.cpp"), Object(Matching, "d/d_wpot_water.cpp"), ], }, diff --git a/include/d/actor/d_a_player_main.h b/include/d/actor/d_a_player_main.h index bd723e260..58fb19888 100644 --- a/include/d/actor/d_a_player_main.h +++ b/include/d/actor/d_a_player_main.h @@ -1865,8 +1865,8 @@ public: J3DAnmTextureSRTKey* getIceParticleBtk() { return mpGicer00Btk; } J3DAnmTextureSRTKey* getIceWaterParticleBtk() { return mpGicer01Btk; } - void getBombWaterPillarBrk() {} // mpGwp00BrkData? - void getBombWaterPillarBtk() {} // mpGwp00BtkData? + J3DAnmTevRegKey* getBombWaterPillarBrk() { return mpGwp00BrkData; } + J3DAnmTextureSRTKey* getBombWaterPillarBtk() { return mpGwp00BtkData; } BOOL checkSwordEquip() const { return dComIfGs_getSelectEquip(0) != dItemNo_NONE_e || checkSwordMiniGame(); diff --git a/include/d/d_minigame_starter.h b/include/d/d_minigame_starter.h index fba8c557a..121051d81 100644 --- a/include/d/d_minigame_starter.h +++ b/include/d/d_minigame_starter.h @@ -1,38 +1,56 @@ #ifndef D_MINIGAME_STARTER_H #define D_MINIGAME_STARTER_H -#include "dolphin/types.h" -#include "f_op/f_op_msg.h" +#include "f_op/f_op_msg_mng.h" +#include "d/d_drawlist.h" class JKRArchive; struct fopMsgM_pane_class; +class J2DScreen; -class dDlst_StarterScrnDraw_c { +class dDlst_StarterScrnDraw_c : public dDlst_base_c { public: void acc(s16, s16, s16) {} void setScreen(const char*, JKRArchive*); - void anime1(int); - void anime2(); + BOOL anime1(int); + BOOL anime2(); void scaleAnime(f32); void setRotate(fopMsgM_pane_class*, f32); - void draw(); + + virtual ~dDlst_StarterScrnDraw_c() {} + virtual void draw(); + + /* 0x004 */ J2DScreen* mpScrn; + #if VERSION > VERSION_JPN + /* 0x008 */ fopMsgM_pane_class field_0x008[7]; + #else + /* 0x008 */ fopMsgM_pane_class field_0x008[3]; + #endif + /* 0x190 */ fopMsgM_pane_class field_0x190; + /* 0x1C8 */ fopMsgM_pane_class field_0x1c8[3]; + /* 0x270 */ fopMsgM_pane_class field_0x270[3]; }; class dMinigame_Starter_c : public msg_class { public: - void countStart() { if (!field_0x111) field_0x111 = true; } + void countStart() { if (!mStatus) mStatus = 1; } - void _create(); - void _execute(); - void _draw(); - void _delete(); + cPhs_State _create(); + BOOL _execute(); + BOOL _draw(); + BOOL _delete(); BOOL startCheck(); BOOL deleteCheck(); + public: - /* 0x0FC */ u8 field_0x0FC[0x111 - 0x0FC]; - /* 0x111 */ bool field_0x111; - /* 0x112 */ u8 field_0x112[0x114 - 0x112]; + /* 0x0FC */ dDlst_StarterScrnDraw_c* mStarterScrn; + /* 0x100 */ request_of_phase_process_class mPhase; + /* 0x108 */ JKRSolidHeap* mHeap; + /* 0x10C */ s16 mTimer; + /* 0x10E */ s16 field_0x10e; + /* 0x110 */ u8 field_0x110; + /* 0x111 */ u8 mStatus; }; // Size: 0x114 #endif /* D_MINIGAME_STARTER_H */ diff --git a/include/d/d_water_mark.h b/include/d/d_water_mark.h index 22b0c818d..c33007069 100644 --- a/include/d/d_water_mark.h +++ b/include/d/d_water_mark.h @@ -2,19 +2,33 @@ #define D_WATER_MARK_H #include "SSystem/SComponent/c_phase.h" -#include "dolphin/types.h" +#include "d/d_bg_s_gnd_chk.h" #include "f_op/f_op_kankyo.h" +#include "m_Do/m_Do_ext.h" +#include "f_op/f_op_kankyo_mng.h" class dWaterMark_c : public kankyo_class { public: inline BOOL draw(); inline BOOL execute(); inline BOOL wm_delete(); - void setMatrix(); + BOOL setMatrix(); inline cPhs_State create(); + static s16 m_circle_cnt; + static s16 m_player_foot_now_id; + static dBgS_ObjGndChk m_ground_check; + public: - /* Place member variables here */ + /* 0x0F8 */ JKRSolidHeap* mpHeap; + /* 0x0FC */ J3DModel* mpModel; + /* 0x100 */ mDoExt_brkAnm mBrk; + /* 0x118 */ mDoExt_btpAnm mBtp; + /* 0x12C */ s16 field_0x12c; + /* 0x12E */ s16 field_0x12e; + /* 0x130 */ s16 field_0x130; + /* 0x132 */ s16 field_0x132; + /* 0x134 */ s16 field_0x134; }; #endif /* D_WATER_MARK_H */ diff --git a/include/d/d_wpillar.h b/include/d/d_wpillar.h index 5f4a1906e..31e1ba3f1 100644 --- a/include/d/d_wpillar.h +++ b/include/d/d_wpillar.h @@ -1,19 +1,25 @@ #ifndef D_WPILLAR_H #define D_WPILLAR_H -#include "dolphin/types.h" #include "f_op/f_op_kankyo.h" +#include "m_Do/m_Do_ext.h" +#include "f_op/f_op_kankyo_mng.h" class dWpillar_c : public kankyo_class { public: - void jointCallBack(int); + int jointCallBack(int); BOOL draw(); BOOL execute(); BOOL wp_delete(); cPhs_State create(); public: - /* Place member variables here */ + /* 0x0F8 */ J3DModel* mpModel; + /* 0x0FC */ mDoExt_bckAnm mBck; + /* 0x10C */ mDoExt_btkAnm mBtk; + /* 0x120 */ JKRSolidHeap* mpHeap; + /* 0x124 */ dKy_tevstr_c mTevstr; + /* 0x1D4 */ f32 mHeight; }; #endif /* D_WPILLAR_H */ diff --git a/src/d/d_minigame_starter.cpp b/src/d/d_minigame_starter.cpp index b383c345b..0f3a23a51 100644 --- a/src/d/d_minigame_starter.cpp +++ b/src/d/d_minigame_starter.cpp @@ -7,88 +7,393 @@ #include "d/d_minigame_starter.h" #include "f_op/f_op_msg.h" #include "f_op/f_op_msg_mng.h" +#include "JSystem/J2DGraph/J2DOrthoGraph.h" +#include "d/d_meter.h" +#include "stdio.h" + +static s16 cdFrame0 = 7; +static s16 cdFrame1 = 3; +static s16 tmFrame = 5; +static s16 cdFrame2 = 15; +static s16 cdFrame3 = 5; +static s16 cdFrame4 = 7; +static s16 cdFrame5 = 3; +static s16 cdFrame6 = 4; +static s16 cdFrame7 = 4; +static s16 cdFrame8 = 6; + +#if VERSION > VERSION_JPN +static s16 dMinigame_Starter_tex_number = 3; +#endif /* 80205FE8-80206124 .text _create__19dMinigame_Starter_cFv */ -void dMinigame_Starter_c::_create() { - /* Nonmatching */ +// NONMATCHING - missing b +cPhs_State dMinigame_Starter_c::_create() { + if (dComIfG_resLoad(&mPhase, "Mgst") == cPhs_COMPLEATE_e) { + dRes_info_c* resInfo = dComIfG_getObjectResInfo("Mgst"); + JUT_ASSERT(VERSION_SELECT(80, 80, 86, 86), resInfo != NULL); + + mHeap = mDoExt_createSolidHeapFromGameToCurrent(VERSION_SELECT(0x13E0, 0x13E0, 0x14C0, 0x1AC0), 0x20); + if (mHeap != NULL) { + mStarterScrn = new dDlst_StarterScrnDraw_c(); + +#if VERSION == VERSION_PAL + char resname[32]; + sprintf(resname, "ship_race1_%d.blo", dComIfGs_getPalLanguage()); + mStarterScrn->setScreen(resname, resInfo->getArchive()); +#else + mStarterScrn->setScreen("ship_race1.blo", resInfo->getArchive()); +#endif + mDoExt_restoreCurrentHeap(); + mDoExt_adjustSolidHeap(mHeap); + } else { + return cPhs_ERROR_e; + } + + mStatus = 0; + mTimer = 0; + field_0x10e = 3; + } + + return cPhs_COMPLEATE_e; } /* 80206124-8020629C .text _execute__19dMinigame_Starter_cFv */ -void dMinigame_Starter_c::_execute() { - /* Nonmatching */ +// NONMATCHING - instruction ordering +BOOL dMinigame_Starter_c::_execute() { + int var_r30 = (cdFrame0 + cdFrame1 + tmFrame + cdFrame2 + cdFrame3) - 30; + int var_r29 = (cdFrame4 + cdFrame5 + cdFrame6 + cdFrame7 + cdFrame8) - 23; + + if (mStatus == 0) { + return FALSE; + } + + int var_r31 = var_r30 * 3; + + if (mTimer < (var_r31 + var_r29) + 137) { + mTimer++; + if (mTimer >= (var_r31 + var_r29) + 89) { + mStatus = 2; + } + } else { + mStatus = 3; + } + + if (mTimer <= var_r30 + 30) { + mStarterScrn->anime1(2); + } + + if (mTimer >= var_r30 + 28 && mTimer <= (var_r30 * 2) + 57) { + mStarterScrn->anime1(1); + } + + if (mTimer >= (var_r30 * 2) + 55 && mTimer <= var_r31 + 84) { + mStarterScrn->anime1(0); + } + + if (mTimer >= var_r31 + 84 && mTimer <= (var_r31 + var_r29) + 107) { + mStarterScrn->anime2(); + } + + return TRUE; } /* 8020629C-802062DC .text _draw__19dMinigame_Starter_cFv */ -void dMinigame_Starter_c::_draw() { - /* Nonmatching */ +BOOL dMinigame_Starter_c::_draw() { + dComIfGd_set2DOpa(mStarterScrn); + return TRUE; } /* 802062DC-80206328 .text _delete__19dMinigame_Starter_cFv */ -void dMinigame_Starter_c::_delete() { - /* Nonmatching */ +BOOL dMinigame_Starter_c::_delete() { + if (mHeap != NULL) { + mDoExt_destroySolidHeap(mHeap); + } + + dComIfG_resDelete(&mPhase, "Mgst"); + return TRUE; } /* 80206328-8020634C .text startCheck__19dMinigame_Starter_cFv */ BOOL dMinigame_Starter_c::startCheck() { - /* Nonmatching */ + return mStatus == 3 || mStatus == 2; } /* 8020634C-80206360 .text deleteCheck__19dMinigame_Starter_cFv */ BOOL dMinigame_Starter_c::deleteCheck() { - /* Nonmatching */ + return mStatus == 3; } /* 80206360-802064DC .text setScreen__23dDlst_StarterScrnDraw_cFPCcP10JKRArchive */ -void dDlst_StarterScrnDraw_c::setScreen(const char*, JKRArchive*) { - /* Nonmatching */ +void dDlst_StarterScrnDraw_c::setScreen(const char* i_layoutName, JKRArchive* i_archive) { + mpScrn = new J2DScreen(); + mpScrn->set(i_layoutName, i_archive); + +#if VERSION == VERSION_PAL + if (dComIfGs_getPalLanguage() == 2) { + dMinigame_Starter_tex_number = 7; + for (int i = 0; i < dMinigame_Starter_tex_number; i++) { + static u32 label_t_fr[] = { + 'gog', + 'goo', + 'goex', + 'got', + 'goe2', + 'goz', + 'goe3', + }; + fopMsgM_setPaneData(&field_0x008[i], mpScrn, label_t_fr[i]); + } + } else if (dComIfGs_getPalLanguage() == 0) { + dMinigame_Starter_tex_number = 3; + for (int i = 0; i < dMinigame_Starter_tex_number; i++) { + static u32 label_t_uk[] = { + 'gog', + 'goo', + 'goex', + }; + fopMsgM_setPaneData(&field_0x008[i], mpScrn, label_t_uk[i]); + } + } else { + dMinigame_Starter_tex_number = 4; + for (int i = 0; i < dMinigame_Starter_tex_number; i++) { + static u32 label_t[] = { + 'gog', + 'goo', + 'goex', + 'goe2', + }; + fopMsgM_setPaneData(&field_0x008[i], mpScrn, label_t[i]); + } + } +#elif VERSION == VERSION_USA + for (int i = 0; i < dMinigame_Starter_tex_number; i++) { + static u32 label_t[] = { + 'gog', + 'goo', + 'goex', + }; + fopMsgM_setPaneData(&field_0x008[i], mpScrn, label_t[i]); + } +#else + fopMsgM_setPaneData(&field_0x008[0], mpScrn, 'gog'); + fopMsgM_setPaneData(&field_0x008[1], mpScrn, 'goo'); + fopMsgM_setPaneData(&field_0x008[2], mpScrn, 'goex'); +#endif + + fopMsgM_setPaneData(&field_0x190, mpScrn, 'dmgo'); + fopMsgM_setPaneData(&field_0x1c8[0], mpScrn, 'go1'); + fopMsgM_setPaneData(&field_0x1c8[1], mpScrn, 'go2'); + fopMsgM_setPaneData(&field_0x1c8[2], mpScrn, 'go3'); + fopMsgM_setPaneData(&field_0x270[0], mpScrn, 'go12'); + fopMsgM_setPaneData(&field_0x270[1], mpScrn, 'go22'); + fopMsgM_setPaneData(&field_0x270[2], mpScrn, 'go32'); } /* 802064DC-80206908 .text anime1__23dDlst_StarterScrnDraw_cFi */ -void dDlst_StarterScrnDraw_c::anime1(int) { - /* Nonmatching */ +// NONMATCHING - a lot of float math stuff +BOOL dDlst_StarterScrnDraw_c::anime1(int i_no) { + f32 temp_f1 = -8.0f; + int rt = 0; + + s16 var_r30 = cdFrame0; + s16 var_r31 = cdFrame0 + cdFrame1; + s16 temp_r6 = cdFrame0 + cdFrame1 + tmFrame; + s16 var_r27 = cdFrame2 + temp_r6; + s16 temp_r7 = cdFrame3 + var_r27; + + field_0x1c8[i_no].mUserArea++; + + s16 temp_r0 = field_0x1c8[i_no].mUserArea; + if (temp_r0 <= var_r30) { + fopMsgM_paneScaleXY(&field_0x270[i_no], ((f32)field_0x1c8[i_no].mUserArea * (f32)field_0x1c8[i_no].mUserArea) / ((f32)var_r31 * (f32)var_r31) * 0.3f + 0.7f); + fopMsgM_setNowAlpha(&field_0x270[i_no], ((f32)field_0x1c8[i_no].mUserArea * (f32)field_0x1c8[i_no].mUserArea) / ((f32)var_r30 * (f32)var_r30)); + } else if (temp_r0 <= var_r31) { + f32 var_f31 = ((f32)(temp_r0 - var_r30) * (f32)(temp_r0 - var_r30)) / ((f32)(var_r31 - var_r30) * (f32)(var_r31 - var_r30)); + fopMsgM_paneScaleXY(&field_0x1c8[i_no], var_f31 * 0.3f + 0.7f); + fopMsgM_setNowAlpha(&field_0x1c8[i_no], var_f31); + + fopMsgM_paneScaleXY(&field_0x270[i_no], ((f32)field_0x1c8[i_no].mUserArea * (f32)field_0x1c8[i_no].mUserArea) / ((f32)var_r31 * (f32)var_r31) * 0.3f + 0.7f); + fopMsgM_setNowAlpha(&field_0x270[i_no], 1.0f - var_f31); + + if (field_0x1c8[i_no].mUserArea == var_r31) { + mDoAud_seStart(JA_SE_SGAME_COUNTDOWN, NULL); + } + } else if (temp_r6 > temp_r0) { + if (temp_r0 <= var_r27) { + if (((temp_r6 - temp_r0) / ((var_r27 - temp_r0) / 4)) % 2) + temp_f1 *= -1.0f; + setRotate(&field_0x1c8[i_no], temp_f1); + } else if (temp_r0 < temp_r7) { + f32 var_f31 = temp_r0 - var_r27; + fopMsgM_paneScaleXY(&field_0x1c8[i_no], ((((f32)temp_r0 - var_r27) * ((f32)temp_r0 - var_r27)) / var_f31) * 2.0f + 1.0f); + + f32 temp_f1_2 = ((f32)(field_0x1c8[i_no].mUserArea - var_r27) * (f32)(field_0x1c8[i_no].mUserArea - var_r27)) / var_f31; + fopMsgM_setNowAlpha(&field_0x1c8[i_no], 1.0f - temp_f1_2); + } else { + fopMsgM_paneScaleXY(&field_0x1c8[i_no], 3.0f); + fopMsgM_setNowAlphaZero(&field_0x1c8[i_no]); + rt = 1; + } + } + + return rt; } /* 80206908-80206CB0 .text anime2__23dDlst_StarterScrnDraw_cFv */ -void dDlst_StarterScrnDraw_c::anime2() { - /* Nonmatching */ +// NONMATCHING - a lot of float math stuff +BOOL dDlst_StarterScrnDraw_c::anime2() { + int rt = 0; + + s16 var_r30 = cdFrame4; + s16 var_r31 = cdFrame4 + cdFrame5; + s16 temp_r6 = cdFrame4 + cdFrame5 + cdFrame6; + s16 var_r27 = cdFrame7 + temp_r6; + s16 temp_r7 = cdFrame8 + var_r27; + + field_0x008[0].mUserArea++; + + s16 temp_r0 = field_0x008[0].mUserArea; + if (temp_r0 <= var_r30) { + f32 var_f31 = ((f32)field_0x008[0].mUserArea * (f32)field_0x008[0].mUserArea) / ((f32)var_r30 * (f32)var_r30); + scaleAnime((3.0f - var_f31 * 2.2f) * g_menuHIO.field_0x14); + setRotate(&field_0x190, 90.0f - var_f31 * 65.0f); + fopMsgM_setNowAlpha(&field_0x008[0], var_f31); + } else if (temp_r0 <= var_r31) { + f32 var_f31 = ((f32)(temp_r0 - var_r30) * (f32)(temp_r0 - var_r30)) / ((f32)(var_r31 - var_r30) * (f32)(var_r31 - var_r30)); + scaleAnime((0.8f - var_f31 * -0.2f) * g_menuHIO.field_0x14); + + if (field_0x008[0].mUserArea == var_r31) { + mDoAud_seStart(JA_SE_SGAME_COUNT_GO, NULL); + } + } else if (temp_r6 > temp_r0) { + if (temp_r0 <= var_r27) { + f32 var_f31 = ((f32)(temp_r0 - temp_r6) * (f32)(temp_r0 - temp_r6)) / ((f32)(var_r27 - temp_r6) * (f32)(var_r27 - temp_r6)); + setRotate(&field_0x190, 25.0f - var_f31 * -35.0f); + } else if (temp_r0 < temp_r7) { + f32 var_f31 = ((f32)(temp_r0 - var_r27) * (f32)(temp_r0 - var_r27)) / ((f32)(temp_r0 - temp_r7) * (f32)(temp_r0 - temp_r7)); + f32 var_f30 = 1.0f - var_f31; + scaleAnime((1.0f - var_f31 * 0.5f) * g_menuHIO.field_0x14); + setRotate(&field_0x190, 60.0f - var_f31 * -210.0f); + fopMsgM_setNowAlpha(&field_0x008[0], var_f30); + } else { + scaleAnime(g_menuHIO.field_0x14 * 0.5f); + setRotate(&field_0x190, -90.0f); + fopMsgM_setNowAlphaZero(&field_0x008[0]); + rt = 1; + } + } + + return rt; } /* 80206CB0-80206DA4 .text scaleAnime__23dDlst_StarterScrnDraw_cFf */ -void dDlst_StarterScrnDraw_c::scaleAnime(f32) { - /* Nonmatching */ +void dDlst_StarterScrnDraw_c::scaleAnime(f32 i_scale) { + field_0x190.mSize.x = field_0x190.mSizeOrig.x * i_scale; + field_0x190.mSize.y = field_0x190.mSizeOrig.y * i_scale; + + #if VERSION > VERSION_JPN + for (int i = 0; i < dMinigame_Starter_tex_number; i++) { + field_0x008[i].mSize.x = field_0x008[i].mSizeOrig.x * i_scale; + field_0x008[i].mSize.y = field_0x008[i].mSizeOrig.y * i_scale; + } + #else + field_0x008[0].mSize.x = field_0x008[0].mSizeOrig.x * i_scale; + field_0x008[0].mSize.y = field_0x008[0].mSizeOrig.y * i_scale; + field_0x008[1].mSize.x = field_0x008[1].mSizeOrig.x * i_scale; + field_0x008[1].mSize.y = field_0x008[1].mSizeOrig.y * i_scale; + field_0x008[2].mSize.x = field_0x008[2].mSizeOrig.x * i_scale; + field_0x008[2].mSize.y = field_0x008[2].mSizeOrig.y * i_scale; + #endif + + field_0x190.mPosCenter.x = field_0x190.mPosCenterOrig.x; + field_0x190.mPosCenter.y = field_0x190.mPosCenterOrig.y; + fopMsgM_cposMove(&field_0x190); + + #if VERSION > VERSION_JPN + for (int i = 0; i < dMinigame_Starter_tex_number; i++) { + field_0x008[i].mPosCenter.x = field_0x008[i].mPosCenterOrig.x * i_scale; + field_0x008[i].mPosCenter.y = field_0x008[i].mPosCenterOrig.y * i_scale; + fopMsgM_cposMove(&field_0x008[i]); + } + #else + field_0x008[0].mPosCenter.x = field_0x008[0].mPosCenterOrig.x * i_scale; + field_0x008[0].mPosCenter.y = field_0x008[0].mPosCenterOrig.y * i_scale; + fopMsgM_cposMove(&field_0x008[0]); + + field_0x008[1].mPosCenter.x = field_0x008[1].mPosCenterOrig.x * i_scale; + field_0x008[1].mPosCenter.y = field_0x008[1].mPosCenterOrig.y * i_scale; + fopMsgM_cposMove(&field_0x008[1]); + + field_0x008[2].mPosCenter.x = field_0x008[2].mPosCenterOrig.x * i_scale; + field_0x008[2].mPosCenter.y = field_0x008[2].mPosCenterOrig.y * i_scale; + fopMsgM_cposMove(&field_0x008[2]); + #endif } /* 80206DA4-80206E44 .text setRotate__23dDlst_StarterScrnDraw_cFP18fopMsgM_pane_classf */ -void dDlst_StarterScrnDraw_c::setRotate(fopMsgM_pane_class*, f32) { - /* Nonmatching */ +void dDlst_StarterScrnDraw_c::setRotate(fopMsgM_pane_class* i_pane, f32 i_angle) { + i_pane->pane->rotate((int)(i_pane->mSize.x / 2), (int)(i_pane->mSize.y / 2), ROTATE_Z, i_angle); } /* 80206E44-80206EDC .text draw__23dDlst_StarterScrnDraw_cFv */ void dDlst_StarterScrnDraw_c::draw() { - /* Nonmatching */ + fopMsgM_setAlpha(&field_0x008[0]); + + for (int i = 0; i < 3; i++) { + fopMsgM_setAlpha(&field_0x1c8[i]); + fopMsgM_setAlpha(&field_0x270[i]); + } + + J2DOrthoGraph* graf = dComIfGp_getCurrentGrafPort(); + graf->setPort(); + mpScrn->draw(0.0f, 0.0f, graf); } /* 80206EDC-80206EFC .text dMinigame_Starter_Draw__FP19dMinigame_Starter_c */ -static BOOL dMinigame_Starter_Draw(dMinigame_Starter_c*) { - /* Nonmatching */ +static BOOL dMinigame_Starter_Draw(dMinigame_Starter_c* i_this) { + return i_this->_draw(); } /* 80206EFC-80206F1C .text dMinigame_Starter_Execute__FP19dMinigame_Starter_c */ -static BOOL dMinigame_Starter_Execute(dMinigame_Starter_c*) { - /* Nonmatching */ +static BOOL dMinigame_Starter_Execute(dMinigame_Starter_c* i_this) { + return i_this->_execute(); } /* 80206F1C-80206F24 .text dMinigame_Starter_IsDelete__FP19dMinigame_Starter_c */ -static BOOL dMinigame_Starter_IsDelete(dMinigame_Starter_c*) { - /* Nonmatching */ +static BOOL dMinigame_Starter_IsDelete(dMinigame_Starter_c* i_this) { + return TRUE; } /* 80206F24-80206F44 .text dMinigame_Starter_Delete__FP19dMinigame_Starter_c */ -static BOOL dMinigame_Starter_Delete(dMinigame_Starter_c*) { - /* Nonmatching */ +static BOOL dMinigame_Starter_Delete(dMinigame_Starter_c* i_this) { + return i_this->_delete(); } /* 80206F44-80206F64 .text dMinigame_Starter_Create__FP9msg_class */ -static cPhs_State dMinigame_Starter_Create(msg_class*) { - /* Nonmatching */ +static cPhs_State dMinigame_Starter_Create(msg_class* msg) { + dMinigame_Starter_c* i_this = (dMinigame_Starter_c*)msg; + return i_this->_create(); } + +msg_method_class l_dMinigame_Starter_Method = { + (process_method_func)dMinigame_Starter_Create, + (process_method_func)dMinigame_Starter_Delete, + (process_method_func)dMinigame_Starter_Execute, + (process_method_func)dMinigame_Starter_IsDelete, + (process_method_func)dMinigame_Starter_Draw, +}; + +msg_process_profile_definition g_profile_MINIGAME_STARTER = { + /* Layer ID */ fpcLy_CURRENT_e, + /* List ID */ 12, + /* List Prio */ fpcPi_CURRENT_e, + /* Proc Name */ fpcNm_MINIGAME_STARTER_e, + /* Proc SubMtd */ &g_fpcLf_Method.base, + /* Size */ sizeof(dMinigame_Starter_c), + /* Size Other */ 0, + /* Parameters */ 0, + /* Leaf SubMtd */ &g_fopMsg_Method, + /* Draw Prio */ fpcDwPi_MINIGAME_STARTER_e, + /* Msg SubMtd */ &l_dMinigame_Starter_Method, +}; diff --git a/src/d/d_water_mark.cpp b/src/d/d_water_mark.cpp index 77a00dca5..f42cd3e9d 100644 --- a/src/d/d_water_mark.cpp +++ b/src/d/d_water_mark.cpp @@ -1,61 +1,192 @@ -// -// Generated by dtk -// Translation Unit: d_water_mark.cpp -// - #include "d/dolzel.h" // IWYU pragma: keep #include "d/d_water_mark.h" -#include "f_op/f_op_kankyo.h" +#include "m_Do/m_Do_lib.h" + +s16 dWaterMark_c::m_circle_cnt; + +s16 dWaterMark_c::m_player_foot_now_id; + +dBgS_ObjGndChk dWaterMark_c::m_ground_check; BOOL dWaterMark_c::draw() { - /* Nonmatching */ + if (mDoLib_clipper::clip(j3dSys.getViewMtx(), mPos, mScale.x * 50.0f)) { + return TRUE; + } + + J3DModelData* modelData = mpModel->getModelData(); + mBrk.entry(modelData, mBrk.getFrame()); + mBtp.entry(mpModel->getModelData(), mParam); + mDoExt_modelUpdateDL(mpModel); + return TRUE; } /* 8023DB48-8023DBF8 .text dWaterMark_Draw__FP12dWaterMark_c */ static BOOL dWaterMark_Draw(dWaterMark_c* i_this) { - /* Nonmatching */ return i_this->draw(); } /* 8023DBF8-8023DE2C .text setMatrix__12dWaterMark_cFv */ -void dWaterMark_c::setMatrix() { - /* Nonmatching */ +BOOL dWaterMark_c::setMatrix() { + cXyz chk_pos(mPos.x, mPos.y + 10.0f, mPos.z); + m_ground_check.SetPos(&chk_pos); + + mPos.y = dComIfG_Bgsp()->GroundCross(&m_ground_check); + if (mPos.y != -G_CM3D_F_INF) { + cM3dGPla* tri = dComIfG_Bgsp()->GetTriPla(m_ground_check.GetBgIndex(), m_ground_check.GetPolyIndex()); + s16 tri_angle = cM_atan2s(tri->mNormal.x, tri->mNormal.z) - field_0x12e; + f32 norm_xz_mag = tri->mNormal.absXZ(); + + mDoMtx_stack_c::transS(mPos.x, mPos.y + 0.1f, mPos.z); + mDoMtx_stack_c::ZXYrotM( + cM_atan2s(norm_xz_mag * cM_scos(tri_angle), tri->mNormal.y), + field_0x12e, + cM_atan2s(norm_xz_mag * -cM_ssin(tri_angle), tri->mNormal.y) + ); + mpModel->setBaseTRMtx(mDoMtx_stack_c::get()); + + bool is_move_bg = dComIfG_Bgsp()->ChkMoveBG(m_ground_check); + if (is_move_bg) { + field_0x12c = 1; + } else { + field_0x12c = 0; + } + } else { + return FALSE; + } + + return TRUE; } BOOL dWaterMark_c::execute() { - /* Nonmatching */ + if (field_0x134 != -1) { + if (field_0x130 < field_0x132) { + if (field_0x130 <= dWaterMark_c::m_player_foot_now_id && field_0x132 > dWaterMark_c::m_player_foot_now_id) { + field_0x134 = -1; + } + } else { + if (field_0x130 <= dWaterMark_c::m_player_foot_now_id || field_0x132 > dWaterMark_c::m_player_foot_now_id) { + field_0x134 = -1; + } + } + } + + if (field_0x134 == -1) { + mBrk.play(); + } + + if (mBrk.isStop()) { + fopKyM_Delete(this); + } else if (field_0x12c == 1 && !setMatrix()) { + fopKyM_Delete(this); + } + + return TRUE; } /* 8023DE2C-8023DF24 .text dWaterMark_Execute__FP12dWaterMark_c */ -static BOOL dWaterMark_Execute(dWaterMark_c* i_this) { - /* Nonmatching */ +static BOOL dWaterMark_Execute(dWaterMark_c* i_this) { return i_this->execute(); } /* 8023DF24-8023DF2C .text dWaterMark_IsDelete__FP12dWaterMark_c */ -static BOOL dWaterMark_IsDelete(dWaterMark_c*) { +static BOOL dWaterMark_IsDelete(dWaterMark_c* i_this) { return TRUE; } BOOL dWaterMark_c::wm_delete() { - /* Nonmatching */ + if (mpHeap != NULL) { + mDoExt_destroySolidHeap(mpHeap); + } + + if ((int)mParam == 1) { + dWaterMark_c::m_circle_cnt--; + } + + return TRUE; } /* 8023DF2C-8023DF80 .text dWaterMark_Delete__FP12dWaterMark_c */ static BOOL dWaterMark_Delete(dWaterMark_c* i_this) { - /* Nonmatching */ return i_this->wm_delete(); } /* 8023DF80-8023DFA0 .text dWaterMark_Create__FP12kankyo_class */ -static cPhs_State dWaterMark_Create(kankyo_class* i_this) { - dWaterMark_c* a_this = (dWaterMark_c*)i_this; - return a_this->create(); +static cPhs_State dWaterMark_Create(kankyo_class* kankyo) { + dWaterMark_c* i_this = (dWaterMark_c*)kankyo; + return i_this->create(); } /* 8023DFA0-8023E29C .text create__12dWaterMark_cFv */ cPhs_State dWaterMark_c::create() { - /* Nonmatching */ + new (this) dWaterMark_c(); + + field_0x12e = mParam >> 0x10; + mParam &= 0xFFFF; + + if ((int)mParam != 0 && (int)mParam != 1 && (int)mParam != 2) { + return cPhs_ERROR_e; + } + + if ((int)mParam == 1 && ++m_circle_cnt > 10) { + return cPhs_ERROR_e; + } + + JKRSolidHeap* heap = mDoExt_createSolidHeapFromGameToCurrent(0x12A0, 0x20); + mpHeap = heap; + + BOOL is_anm_init; + if (mpHeap != NULL) { + J3DModelData* modelData = static_cast(dComIfG_getObjectRes("Always", dRes_INDEX_ALWAYS_BDL_MPA_SIMI_e)); + JUT_ASSERT(304, modelData != NULL); + mpModel = mDoExt_J3DModel__create(modelData, 0x80000, 0x11020022); + + J3DAnmTevRegKey* brk = (J3DAnmTevRegKey*)dComIfG_getObjectRes("Always", dRes_INDEX_ALWAYS_BRK_MPA_SIMI_e); + int brk_rt = mBrk.init(modelData, brk, TRUE, J3DFrameCtrl::EMode_NONE); + + J3DAnmTexPattern* btp = (J3DAnmTexPattern*)dComIfG_getObjectRes("Always", dRes_INDEX_ALWAYS_BTP_MPA_SIMI_e); + int btp_rt = mBtp.init(modelData, btp, FALSE, J3DFrameCtrl::EMode_NONE); + + is_anm_init = (brk_rt & btp_rt); + + mDoExt_restoreCurrentHeap(); + mDoExt_adjustSolidHeap(mpHeap); + } else { + return cPhs_ERROR_e; + } + + if (mpModel == NULL || !is_anm_init) { + return cPhs_ERROR_e; + } + + mpModel->setBaseScale(mScale); + + if (!setMatrix()) { + return cPhs_ERROR_e; + } + + if ((int)mParam == 2) { + field_0x134 = m_player_foot_now_id; + m_player_foot_now_id++; + if (m_player_foot_now_id == 40) { + m_player_foot_now_id = 0; + } + + field_0x130 = field_0x134 + 20; + if (field_0x130 >= 40) { + field_0x130 -= 40; + } + + field_0x132 = field_0x130 + 20; + if (field_0x132 >= 40) { + field_0x132 -= 40; + } + + mParam = 0; + } else { + field_0x134 = -1; + } + + return cPhs_COMPLEATE_e; } static kankyo_method_class l_dWaterMark_Method = { @@ -68,7 +199,7 @@ static kankyo_method_class l_dWaterMark_Method = { kankyo_process_profile_definition g_profile_WATER_MARK = { /* Layer ID */ fpcLy_CURRENT_e, - /* List ID */ 0x0009, + /* List ID */ 9, /* List Prio */ fpcPi_CURRENT_e, /* Proc Name */ fpcNm_WATER_MARK_e, /* Proc SubMtd */ &g_fpcLf_Method.base, diff --git a/src/d/d_wpillar.cpp b/src/d/d_wpillar.cpp index d04334a47..d5a9b0247 100644 --- a/src/d/d_wpillar.cpp +++ b/src/d/d_wpillar.cpp @@ -1,27 +1,84 @@ -// -// Generated by dtk -// Translation Unit: d_wpillar.cpp -// - #include "d/dolzel.h" // IWYU pragma: keep #include "d/d_wpillar.h" #include "f_op/f_op_kankyo.h" - -class J3DNode; +#include "d/actor/d_a_player_main.h" +#include "cstdint.h" /* 8023E968-8023E9E4 .text jointCallBack__10dWpillar_cFi */ -void dWpillar_c::jointCallBack(int) { - /* Nonmatching */ +int dWpillar_c::jointCallBack(int i_jointNo) { + static const f32 min_y[] = { + 0.1418457f, + 18.307327f, + 16.280472f, + }; + + MtxP m = mpModel->getAnmMtx(i_jointNo); + f32 var_f2 = mPos.y + mScale.x * min_y[i_jointNo - 1]; + m[1][3] = var_f2 + mHeight * (m[1][3] - var_f2); + cMtx_copy(m, J3DSys::mCurrentMtx); + return 1; } /* 8023E9E4-8023EA28 .text dWpillar_jointCallBack__FP7J3DNodei */ -static BOOL dWpillar_jointCallBack(J3DNode*, int) { - /* Nonmatching */ +static BOOL dWpillar_jointCallBack(J3DNode* i_node, int param_1) { + if (param_1 == 0) { + J3DJoint* joint = (J3DJoint*)i_node; + int jntNo = joint->getJntNo(); + J3DModel* model = j3dSys.getModel(); + + dWpillar_c* i_this = (dWpillar_c*)model->getUserArea(); + i_this->jointCallBack(jntNo); + } + + return TRUE; } /* 8023EA28-8023ECF8 .text draw__10dWpillar_cFv */ BOOL dWpillar_c::draw() { - /* Nonmatching */ + int matNo; + + g_env_light.settingTevStruct(TEV_TYPE_BG1, &mPos, &mTevstr); + g_env_light.setLightTevColorType(mpModel, &mTevstr); + + mBck.entry(mpModel->getModelData()); + + if ((int)mParam == 1) { + matNo = mpModel->getModelData()->getMaterialNum() - 1; + while (matNo >= 0) { + J3DMaterial* material = mpModel->getModelData()->getMaterialNodePointer(matNo); + + static const GXColorS10 calc_col = {0x00, 0x00, 0x00, 0x3C}; + material->setTevColor(2, (const J3DGXColorS10*)&calc_col); + matNo--; + } + + daPy_getPlayerLinkActorClass()->getBombWaterPillarBrk()->setFrame(mBck.getFrame()); + daPy_getPlayerLinkActorClass()->getBombWaterPillarBtk()->setFrame(mBck.getFrame()); + } else { + GXColorS10 color; + color.r = (u8)(mTevstr.mColorC0.r * 0.23529412f + 195.0f); + color.g = (u8)(mTevstr.mColorC0.g * 0.23529412f + 195.0f); + color.b = (u8)(mTevstr.mColorC0.b * 0.23529412f + 195.0f); + + GXColor kcolor; + kcolor.r = mTevstr.mColorK0.r * 0.92156863f + 20.0f; + kcolor.g = mTevstr.mColorK0.g * 0.92156863f + 20.0f; + kcolor.b = mTevstr.mColorK0.b * 0.92156863f + 20.0f; + + mBtk.entry(mpModel->getModelData(), mBck.getFrame()); + + matNo = mpModel->getModelData()->getMaterialNum() - 1; + while (matNo >= 0) { + J3DMaterial* material = mpModel->getModelData()->getMaterialNodePointer(matNo); + + material->setTevColor(0, (const J3DGXColorS10*)&color); + material->setTevKColor(0, (const J3DGXColor*)&kcolor); + matNo--; + } + } + + mDoExt_modelUpdateDL(mpModel); + return 1; } /* 8023ECF8-8023ED18 .text dWpillar_Draw__FP10dWpillar_c */ @@ -31,7 +88,19 @@ static BOOL dWpillar_Draw(dWpillar_c* i_this) { /* 8023ED18-8023EDB0 .text execute__10dWpillar_cFv */ BOOL dWpillar_c::execute() { - /* Nonmatching */ + mBck.play(); + + if (mBck.isStop()) { + fopKyM_Delete(this); + } else { + f32 water_y; + if (fopAcM_getWaterY(&mPos, &water_y)) { + mpModel->getBaseTRMtx()[1][3] = water_y; + mPos.y = water_y; + } + } + + return 1; } /* 8023EDB0-8023EDD0 .text dWpillar_Execute__FP10dWpillar_c */ @@ -46,7 +115,11 @@ static BOOL dWpillar_IsDelete(dWpillar_c*) { /* 8023EDD8-8023EE08 .text wp_delete__10dWpillar_cFv */ BOOL dWpillar_c::wp_delete() { - /* Nonmatching */ + if (mpHeap != NULL) { + mDoExt_destroySolidHeap(mpHeap); + } + + return TRUE; } /* 8023EE08-8023EE28 .text dWpillar_Delete__FP10dWpillar_c */ @@ -56,7 +129,79 @@ static BOOL dWpillar_Delete(dWpillar_c* i_this) { /* 8023EE28-8023F5B0 .text create__10dWpillar_cFv */ cPhs_State dWpillar_c::create() { - /* Nonmatching */ + new (this) dWpillar_c(); + + J3DModelData* modelData; + BOOL is_anm_init; + mpHeap = mDoExt_createSolidHeapFromGameToCurrent(0x3440, 0x20); + if (mpHeap != NULL) { + if ((int)mParam == 0) { + modelData = (J3DModelData*)dComIfG_getObjectRes("Always", dRes_INDEX_ALWAYS_BDL_W_PILLAR_A_e); + JUT_ASSERT(293, modelData != NULL); + mpModel = mDoExt_J3DModel__create(modelData, 0x80000, 0x11000202); + + J3DAnmTransform* bck = (J3DAnmTransform*)dComIfG_getObjectRes("Always", dRes_INDEX_ALWAYS_BCK_W_PILLAR_A_e); + is_anm_init = mBck.init(modelData, bck, TRUE, J3DFrameCtrl::EMode_NONE, 1.0f, 0, -1, false); + + J3DAnmTextureSRTKey* btk = (J3DAnmTextureSRTKey*)dComIfG_getObjectRes("Always", dRes_INDEX_ALWAYS_BTK_W_PILLAR_A_e); + is_anm_init &= mBtk.init(modelData, btk, FALSE, J3DFrameCtrl::EMode_LOOP, 1.0f, 0, -1); + } else { + modelData = static_cast(dComIfG_getObjectRes("Link", dRes_INDEX_LINK_BDL_GWP00_e)); + JUT_ASSERT(320, modelData != NULL); + mpModel = mDoExt_J3DModel__create(modelData, 0x80000, 0x11000202); + + J3DAnmTransform* bck = (J3DAnmTransform*)dComIfG_getObjectRes("Link", dRes_INDEX_LINK_BCK_GWP00_e); + is_anm_init = mBck.init(modelData, bck, TRUE, J3DFrameCtrl::EMode_NONE, 1.0f, 0, -1, false); + } + + mDoExt_restoreCurrentHeap(); + mDoExt_adjustSolidHeap(mpHeap); + } else { + return cPhs_ERROR_e; + } + + if (mpModel == NULL || !is_anm_init) { + return cPhs_ERROR_e; + } + + mHeight = mScale.y; + mScale.y = mScale.x; + mpModel->setBaseScale(mScale); + mDoMtx_stack_c::transS(mPos.x, mPos.y, mPos.z); + mpModel->setBaseTRMtx(mDoMtx_stack_c::get()); + + if ((int)mParam == 0) { + for (u16 i = 1; i < modelData->getJointNum(); i++) { + modelData->getJointNodePointer(i)->setCallBack(dWpillar_jointCallBack); + } + + mpModel->setUserArea((std::uintptr_t)this); + dComIfGp_particle_setShipTail(dPa_name::ID_IT_JN_WP_HAMON01, &mPos, NULL, &mScale, 0xFF, &dPa_control_c::mSingleRippleEcallBack); + dComIfGp_particle_setShipTail(dPa_name::ID_IT_JN_WP_HAMON02, &mPos, NULL, &mScale, 0xFF, &dPa_control_c::mSingleRippleEcallBack); + dComIfGp_particle_setShipTail(dPa_name::ID_IT_JN_WP_HAMON03, &mPos, NULL, &mScale, 0xFF, &dPa_control_c::mSingleRippleEcallBack); + dComIfGp_particle_set(dPa_name::ID_IT_JN_WP_SHIBUKI, &mPos, NULL, &mScale, 0xFF, NULL); + } else { + dComIfGp_particle_setBombSmoke(dPa_name::ID_IT_JT_BMEX_SMOKE02, &mPos); + dComIfGp_particle_setToonP1(dPa_name::ID_IT_JT_WATERSMOKE00, &mPos); + dComIfGp_particle_setP1(dPa_name::ID_IT_JN_MIZUSHIBUKI_A, &mPos); + } + + dBgS_ObjGndChk gndchk; + gndchk.SetPos(&mPos); + + int roomNo; + u8 polyColor; + f32 y = dComIfG_Bgsp()->GroundCross(&gndchk); + if (y != -G_CM3D_F_INF) { + roomNo = dComIfG_Bgsp()->GetRoomId(gndchk); + polyColor = dComIfG_Bgsp()->GetPolyColor(gndchk); + } else { + roomNo = dComIfGp_roomControl_getStayNo(); + polyColor = 0xFF; + } + + dKy_tevstr_init(&mTevstr, roomNo, polyColor); + return cPhs_COMPLEATE_e; } /* 8023F5B0-8023F5D0 .text dWpillar_Create__FP12kankyo_class */ @@ -75,7 +220,7 @@ static kankyo_method_class l_dWpillar_Method = { kankyo_process_profile_definition g_profile_WPILLAR = { /* Layer ID */ fpcLy_CURRENT_e, - /* List ID */ 0x0008, + /* List ID */ 8, /* List Prio */ fpcPi_CURRENT_e, /* Proc Name */ fpcNm_WPILLAR_e, /* Proc SubMtd */ &g_fpcLf_Method.base,