diff options
| author | TakaRikka <38417346+TakaRikka@users.noreply.github.com> | 2026-06-28 15:40:28 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-06-28 18:40:28 -0400 |
| commit | 88a753265e537c7ee9b9b620f31e69f776b124ae (patch) | |
| tree | bd4568a88e8d5034470a0d1e632288e77fef8f49 /src | |
| parent | 1eb337da18c1001def3c91746fbaf4be8e045c1e (diff) | |
water_mark / wpillar done, minigame_starter wip (#1069)
* d_minigame_starter attempt
* water_mark / wpillar done
* review changes
Diffstat (limited to 'src')
| -rw-r--r-- | src/d/d_minigame_starter.cpp | 367 | ||||
| -rw-r--r-- | src/d/d_water_mark.cpp | 173 | ||||
| -rw-r--r-- | src/d/d_wpillar.cpp | 177 |
3 files changed, 649 insertions, 68 deletions
diff --git a/src/d/d_minigame_starter.cpp b/src/d/d_minigame_starter.cpp index b383c345..0f3a23a5 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 77a00dca..f42cd3e9 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<J3DModelData*>(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 d04334a4..d5a9b024 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<J3DModelData*>(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, |
