From 1b49cb3ce011f26d79faa10f3437debccec6462f Mon Sep 17 00:00:00 2001 From: Maide <34639600+Kelebek1@users.noreply.github.com> Date: Mon, 25 Aug 2025 23:55:36 +0100 Subject: [PATCH] d_a_canon (#865) --- configure.py | 2 +- include/d/actor/d_a_canon.h | 54 +++- include/d/actor/d_a_npc_kg2.h | 2 +- include/d/d_2dnumber.h | 19 +- include/d/d_com_inf_game.h | 11 +- include/d/res/res_bomber.h | 18 ++ src/d/actor/d_a_canon.cpp | 554 +++++++++++++++++++++++++++++++--- src/d/d_2dnumber.cpp | 24 +- 8 files changed, 605 insertions(+), 79 deletions(-) diff --git a/configure.py b/configure.py index 7cdb6e529..cf6674cd7 100755 --- a/configure.py +++ b/configure.py @@ -1490,7 +1490,7 @@ config.libs = [ ActorRel(MatchingFor("GZLJ01", "GZLE01", "GZLP01"), "d_a_arrow_lighteff"), ActorRel(MatchingFor("GZLJ01", "GZLE01", "GZLP01"), "d_a_beam"), ActorRel(NonMatching, "d_a_boko"), - ActorRel(NonMatching, "d_a_canon"), + ActorRel(Matching, "d_a_canon"), ActorRel(NonMatching, "d_a_cc"), ActorRel(NonMatching, "d_a_dai"), ActorRel(MatchingFor("GZLJ01", "GZLE01", "GZLP01"), "d_a_demo_item"), diff --git a/include/d/actor/d_a_canon.h b/include/d/actor/d_a_canon.h index d1ae345be..c1108bb04 100644 --- a/include/d/actor/d_a_canon.h +++ b/include/d/actor/d_a_canon.h @@ -2,22 +2,28 @@ #define D_A_CANON_H #include "f_op/f_op_actor.h" +#include "d/d_cc_d.h" + +class dDlst_2DObject_c; +class dDlst_2DBattery_c; class daCanon_c : public fopAc_ac_c { + typedef void (daCanon_c::*Func)(); + public: inline cPhs_State _create(); inline bool _delete(); inline bool _draw(); inline bool _execute(); - void checkProcess(void (daCanon_c::*)()) {} + bool checkProcess(Func func) { return m290 == func; } void getCanonPtr() {} - void setProcess(void (daCanon_c::*)()) {} + void setProcess(Func func) { m290 = func; } void set_mtx(); void bul_set_mtx(cXyz*); - void getGridPos(int, int); - void getBulEndPos(short, short); - void createCheck(int, int, int); + cXyz getGridPos(int, int); + cXyz getBulEndPos(short, short); + BOOL createCheck(int, int, int); void createTargetObj(); void breakAllObj(); void makeFireEffect(cXyz&, csXyz&, int); @@ -34,13 +40,45 @@ public: void end_proc_init(); void end_proc(); void PadMove(); - void CreateHeap(); + BOOL CreateHeap(); void GameInfo2DDraw(); static daCanon_c* canon_p; + static const char M_arcname[]; public: - /* Place member variables here */ -}; + /* 0x290 */ Func m290; + /* 0x29C */ dCcD_Stts mStts1; + /* 0x2D8 */ dCcD_Cyl mCyl1; + /* 0x408 */ dCcD_Stts mStts2; + /* 0x444 */ dCcD_Cyl mCyl2; + /* 0x574 */ request_of_phase_process_class mPhase; + /* 0x57C */ J3DModel* mpModel1; + /* 0x580 */ J3DModel* mpModel2; + /* 0x584 */ dDlst_2DObject_c* m584[10]; + /* 0x5AC */ dDlst_2DObject_c* m5AC[5]; + /* 0x5C0 */ dDlst_2DBattery_c* m5C0; + /* 0x5C4 */ Mtx m5C4; + /* 0x5F4 */ u8 m5F4[10]; + /* 0x600 */ fpc_ProcID m600[5]; + /* 0x614 */ cXyz m614; + /* 0x620 */ cXyz m620; + /* 0x62C */ cXyz m62C; + /* 0x638 */ f32 m638; + /* 0x63C */ cXyz m63C; + /* 0x648 */ csXyz m648; + /* 0x64E */ s16 m64E; + /* 0x650 */ s16 m650; + /* 0x652 */ s16 m652; + /* 0x654 */ s16 m654; + /* 0x656 */ s16 m656; + /* 0x658 */ u8 field_658[0x65A - 0x658]; + /* 0x65A */ s16 m65A; + /* 0x65C */ s16 m65C; + /* 0x65E */ s16 m65E; + /* 0x660 */ s16 m660; + /* 0x662 */ u8 field_662[0x664 - 0x662]; + /* 0x664 */ bool m664; +}; // size = 0x668 #endif /* D_A_CANON_H */ diff --git a/include/d/actor/d_a_npc_kg2.h b/include/d/actor/d_a_npc_kg2.h index 26744e305..09a0e2854 100644 --- a/include/d/actor/d_a_npc_kg2.h +++ b/include/d/actor/d_a_npc_kg2.h @@ -9,7 +9,7 @@ public: void getEyePos() {} void seStart(u32) {} void setAction(int (daNpc_Kg2_c::*)(void*), void*) {} - void setCanonGameResult(u8) {} + static void setCanonGameResult(u8 result) { canon_game_result = result; } void set_mtx(); void initTexPatternAnm(bool); diff --git a/include/d/d_2dnumber.h b/include/d/d_2dnumber.h index 9e93d2e9d..9839ce8e9 100644 --- a/include/d/d_2dnumber.h +++ b/include/d/d_2dnumber.h @@ -46,7 +46,7 @@ public: class dDlst_2DBattery_c : public dDlst_base_c { public: - bool init(ResTIMG*, ResTIMG*, ResTIMG*, ResTIMG*); + BOOL init(ResTIMG*, ResTIMG*, ResTIMG*, ResTIMG*); void setRotate(float); void draw(); @@ -62,21 +62,24 @@ public: /* 0x48 */ cXy mBatteryBaseSize; /* 0x50 */ cXy mNumSize; /* 0x58 */ f32 mRotation; - /* 0x5C */ f32 field_0x5c; -}; +}; // size = 0x5C class dDlst_2DObject_c : public dDlst_base_c { public: - bool init(ResTIMG*, ResTIMG*); + BOOL init(ResTIMG*, ResTIMG*); void draw(); + void setPosition(f32 x, f32 y) { mPos.x = x; mPos.y = y; } + void setScale(f32 scale) { mScale = scale; } + void onBeforeTex() { mCurrentNo = 0; } + void offBeforeTex() { mCurrentNo = 1; } public: /* 0x04 */ J2DPicture* mPicture[2]; /* 0x0C */ cXy mPos; - /* 0x10 */ cXy mSize[2]; - /* 0x18 */ f32 mScale; - /* 0x1C */ u8 mCurrentNo; -}; + /* 0x14 */ cXy mSize[2]; + /* 0x24 */ f32 mScale; + /* 0x28 */ u8 mCurrentNo; +}; // size = 0x2C class dDlst_2DOutFont_c { public: diff --git a/include/d/d_com_inf_game.h b/include/d/d_com_inf_game.h index 7d34a8b11..d857029b4 100644 --- a/include/d/d_com_inf_game.h +++ b/include/d/d_com_inf_game.h @@ -576,7 +576,10 @@ public: void endMiniGame(u16 i_gameType) { mMiniGameType = 0; mMinigameFlags ^= 1 << (i_gameType - 1); // toggle Nth bit - field_0x4A3E = 0; + mMinigameResult = 0; + } + void setMiniGameResult(u8 i_result) { + mMinigameResult = i_result; } void show2dOn() { m2dShow = true; } @@ -780,7 +783,7 @@ public: /* 0x4A38 */ u16 mMinigameFlags; /* 0x4A3A */ u8 mMiniGameType; /* 0x4A3C */ s16 mMiniGameRupee; - /* 0x4A3E */ u8 field_0x4A3E; + /* 0x4A3E */ u8 mMinigameResult; /* 0x4A40 */ __d_timer_info_c mTimerInfo; /* 0x4A54 */ dDlst_window_c* mCurrentWindow; /* 0x4A58 */ view_class* mCurrentView; @@ -2657,6 +2660,10 @@ inline void dComIfGp_endMiniGame(u16 i_gameType) { g_dComIfG_gameInfo.play.endMiniGame(i_gameType); } +inline u8 dComIfGp_setMiniGameResult(u8 result) { + g_dComIfG_gameInfo.play.setMiniGameResult(result); +} + enum dActionStatus_e { /* 0x00 */ dActStts_BLANK_e, /* 0x01 */ dActStts_LOOK_e, // "Look" diff --git a/include/d/res/res_bomber.h b/include/d/res/res_bomber.h index cbac6da1a..23272bb42 100644 --- a/include/d/res/res_bomber.h +++ b/include/d/res/res_bomber.h @@ -57,6 +57,24 @@ enum BOMBER_RES_FILE_ID { // IDs and indexes are synced BOMBER_BTI_GAME_SHIP_NODAMAGE=0x11, BOMBER_BTI_RUPY_NUM_DEGREE=0x12, }; + +enum BOMBER_RES_FILE_INDEX { + /* BMDC */ + BOMBER_INDEX_BMD_AISI=0x8, + + /* BDL */ + BOMBER_INDEX_BDL_VCANK=0x5, + + /* TEX */ + BOMBER_INDEX_BTI_GAME_BATTERY=0xB, + BOMBER_INDEX_BTI_GAME_BATTERY_BASE=0xC, + BOMBER_INDEX_BTI_GAME_BOMB_01=0xD, + BOMBER_INDEX_BTI_GAME_BOMB_02=0xE, + BOMBER_INDEX_BTI_GAME_HUNE_DAMAGE=0xF, + BOMBER_INDEX_BTI_GAME_RULE=0x10, + BOMBER_INDEX_BTI_GAME_SHIP_NODAMAGE=0x11, + BOMBER_INDEX_BTI_RUPY_NUM_DEGREE=0x12, +}; #endif #endif /* RES_BOMBER_H */ diff --git a/src/d/actor/d_a_canon.cpp b/src/d/actor/d_a_canon.cpp index 665cee949..05fec7f1d 100644 --- a/src/d/actor/d_a_canon.cpp +++ b/src/d/actor/d_a_canon.cpp @@ -5,10 +5,31 @@ #include "d/dolzel_rel.h" // IWYU pragma: keep #include "d/actor/d_a_canon.h" +#include "/d/actor/d_a_npc_kg2.h" +#include "/d/actor/d_a_player.h" +#include "/d/actor/d_a_bomb.h" +#include "/d/actor/d_a_sea.h" +#include "/d/res/res_bomber.h" #include "m_Do/m_Do_ext.h" #include "d/d_procname.h" +#include "d/d_2dnumber.h" +#include "d/d_kankyo.h" +#include "d/d_kankyo_wether.h" #include "d/d_priority.h" -#include "d/d_cc_d.h" +#include "d/d_s_play.h" +#include "d/d_com_inf_game.h" +#include "f_op/f_op_actor_mng.h" +#include "f_op/f_op_kankyo_mng.h" +#include "f_op/f_op_camera.h" +#include "f_op/f_op_camera_mng.h" +#include "m_Do/m_Do_controller_pad.h" + +static LIGHT_INFLUENCE plight; +static WIND_INFLUENCE pwind; + +const char daCanon_c::M_arcname[] = "Bomber"; +static const s16 angle_x_tbl[] = {0xF000, 0xF24A, 0xF493, 0xF6DC, 0xF925, 0xFB6E, 0xFDB7, 0x0000}; +static const s16 angle_y_tbl[] = {0xEE00, 0xF324, 0xF895, 0xFD6C, 0x294, 0x76B, 0xCDC, 0x1200}; static dCcD_SrcCyl canon_cyl_src = { // dCcD_SrcGObjInf @@ -40,7 +61,6 @@ static dCcD_SrcCyl canon_cyl_src = { }}, }; - static dCcD_SrcCyl canon_cyl2_src = { // dCcD_SrcGObjInf { @@ -71,140 +91,495 @@ static dCcD_SrcCyl canon_cyl2_src = { }}, }; - /* 000000EC-000002C8 .text set_mtx__9daCanon_cFv */ void daCanon_c::set_mtx() { - /* Nonmatching */ + cXyz sp14(REG10_F(26) + 0.65f, REG10_F(26) + 0.65f, REG10_F(26) + 0.65f); + mDoMtx_stack_c::transS(current.pos.x, current.pos.y + sp14.x * 100.0f, current.pos.z); + mDoMtx_stack_c::YrotM(shape_angle.y - -0x8000); + + if (checkProcess(&daCanon_c::fire_proc)) { + mDoMtx_stack_c::YrotM(m660 * cM_ssin(m65E)); + mDoMtx_stack_c::XrotM(m660 * cM_scos(m65E)); + mDoMtx_stack_c::transM(0.0f, m638, 0.0f); + } + + mpModel1->setBaseScale(sp14); + mpModel1->setBaseTRMtx(mDoMtx_stack_c::get()); + MTXCopy(mDoMtx_stack_c::get(), m5C4); } /* 000002C8-00000340 .text bul_set_mtx__9daCanon_cFP4cXyz */ -void daCanon_c::bul_set_mtx(cXyz*) { - /* Nonmatching */ +void daCanon_c::bul_set_mtx(cXyz* arg1) { + cXyz scale(1.0f, 1.0f, 1.0f); + mpModel2->setBaseScale(scale); + mDoMtx_stack_c::transS(arg1->x, arg1->y, arg1->z); + mpModel2->setBaseTRMtx(mDoMtx_stack_c::get()); } /* 00000340-00000448 .text getGridPos__9daCanon_cFii */ -void daCanon_c::getGridPos(int, int) { - /* Nonmatching */ +cXyz daCanon_c::getGridPos(int arg1, int arg2) { + cXyz sp08 = current.pos; + f32 fVar2 = arg2 * 1500.0f + 10500.0f + REG10_F(11); + sp08.x += fVar2 * cM_ssin(home.angle.y + angle_y_tbl[arg1]); + sp08.z += fVar2 * cM_scos(home.angle.y + angle_y_tbl[arg1]); + sp08.y = daSea_calcWave(sp08.x, sp08.z); + return sp08; } /* 00000448-00000554 .text getBulEndPos__9daCanon_cFss */ -void daCanon_c::getBulEndPos(short, short) { - /* Nonmatching */ +cXyz daCanon_c::getBulEndPos(short arg1, short arg2) { + cXyz sp08 = current.pos; + f32 fVar2 = (((home.angle.x + 0x1000) - arg2) / 4096.0f); + f32 fVar3 = fVar2 * 1500.0f * 7.0f + 10500.0f + REG10_F(10); + sp08.x += fVar3 * cM_ssin(arg1); + sp08.z += fVar3 * cM_scos(arg1); + sp08.y = daSea_calcWave(sp08.x, sp08.z); + return sp08; } /* 00000554-000005A0 .text createCheck__9daCanon_cFiii */ -void daCanon_c::createCheck(int, int, int) { - /* Nonmatching */ +BOOL daCanon_c::createCheck(int arg1, int arg2, int arg3) { + s32 idx = arg3; + while (idx != 0) { + if (arg1 == m5F4[--idx * 2]) { + return FALSE; + } + } + + m5F4[arg3 * 2] = arg1; + m5F4[arg3 * 2 + 1] = arg2; + return TRUE; } /* 000005A0-00000628 .text daCanon_nodeCallBack__FP7J3DNodei */ -static BOOL daCanon_nodeCallBack(J3DNode*, int) { - /* Nonmatching */ +static BOOL daCanon_nodeCallBack(J3DNode* node, int calcTiming) { + if (calcTiming == 0) { + J3DModel* pJVar2 = j3dSys.getModel(); + J3DJoint* joint = (J3DJoint*)node; + s32 uVar1 = joint->getJntNo(); + daCanon_c* pvVar3 = (daCanon_c*)pJVar2->getUserArea(); + mDoMtx_stack_c::copy(pJVar2->getAnmMtx(uVar1)); + mDoMtx_stack_c::YrotM(pvVar3->shape_angle.x); + pJVar2->setAnmMtx(uVar1, mDoMtx_stack_c::get()); + } + return TRUE; } /* 00000628-0000063C .text target_createCB__FPv */ -void target_createCB(void*) { - /* Nonmatching */ +BOOL target_createCB(void* v_this) { + fopAcM_OffStatus((daCanon_c*)v_this, fopAcStts_CULL_e | fopAcStts_NOCULLEXEC_e); + return TRUE; } /* 0000063C-0000074C .text createTargetObj__9daCanon_cFv */ void daCanon_c::createTargetObj() { - /* Nonmatching */ + int i = 5; + while (i != 0) { + int iVar1 = cM_rndF(8.0f); + int fVar5 = cM_rndF(8.0f); + if (createCheck(iVar1, fVar5, 5 - i)) { + cXyz sp1C = getGridPos(iVar1, fVar5); + m600[5 - i] = fopAcM_createChild(tk_Obj_Barrel2_e, fopAcM_GetID(this), 0x37f003f, &sp1C, -1, NULL, NULL, -1, target_createCB); + i--; + } + } } /* 0000074C-000007F4 .text daCanon_BreakTarget__FPvPv */ -void daCanon_BreakTarget(void*, void*) { - /* Nonmatching */ +void* daCanon_BreakTarget(void* arg1, void* arg2) { + if (fopAcM_IsActor(arg1) && fopAcM_GetName(arg1) == tk_Obj_Barrel2_e) { + fopAc_ac_c* ac1 = (fopAc_ac_c*)arg1; + if (fopAcM_GetID(arg2) == fopAcM_GetLinkId(ac1)) { + fopAcM_create(PROC_BOMB, daBomb_c::prm_make(daBomb_c::STATE_0, false, false), &ac1->current.pos, -1, NULL, NULL, -1, dEv_extra_createCB); + } + } + return NULL; } /* 000007F4-00000820 .text breakAllObj__9daCanon_cFv */ void daCanon_c::breakAllObj() { - /* Nonmatching */ + fopAcM_Search(daCanon_BreakTarget, this); } /* 00000820-00000A8C .text makeFireEffect__9daCanon_cFR4cXyzR5csXyzi */ -void daCanon_c::makeFireEffect(cXyz&, csXyz&, int) { - /* Nonmatching */ +void daCanon_c::makeFireEffect(cXyz& arg1, csXyz& arg2, int arg3) { + camera_class* camera = dComIfGp_getCamera(dComIfGp_getPlayerCameraID(0)); + cXyz sp2C(0.75f, 0.75f, 0.75f); + csXyz sp18; + sp18.x = -fopCamM_GetAngleX(camera); + sp18.y = fopCamM_GetAngleY(camera) - -0x8000; + sp18.z = 0; + + if (arg3 == 0) { + dComIfGp_particle_setBombSmoke(dPa_name::ID_COMMON_SMOKE_CIRCLE, &arg1, &arg2, &sp2C); + } else { + dComIfGp_particle_set(dPa_name::ID_COMMON_LIGHT_FLASH, &arg1, &sp18, &sp2C); + dComIfGp_particle_setBombSmoke(dPa_name::ID_COMMON_SMOKE_CLOUD, &arg1, &arg2, &sp2C); + dComIfGp_particle_setBombSmoke(dPa_name::ID_COMMON_SMOKE_CIRCLE, &arg1, &arg2, &sp2C); + dComIfGp_particle_setToon(dPa_name::ID_COMMON_SMOKE_DEBRIS, &arg1, &arg2, &sp2C); + } + + plight.mPos = arg1; + plight.mPos.y += 100.0f; + plight.mColor.r = 200; + plight.mColor.g = 200; + plight.mColor.b = 0xa0; + plight.mPower = 600.0f; + plight.mFluctuation = 100.0f; + dKy_efplight_set(&plight); + + pwind.mPos = arg1; + pwind.mDir.x = 0.0f; + pwind.mDir.y = 1.0f; + pwind.mDir.z = 0.0f; + pwind.mRadius = 1000.0f; + pwind.field_0x20 = 0.0f; + pwind.mStrength = 1.0f; + dKyw_pntwind_set(&pwind); + + m664 = true; + + fopAcM_seStart(this, JA_SE_OBJ_BOMB_EXPLODE, 0); + dComIfGp_getVibration().StartShock(7, -0x21, cXyz(0.0f, 1.0f, 0.0f)); } /* 00000A8C-00000AB8 .text wait_proc_init__9daCanon_cFv */ void daCanon_c::wait_proc_init() { - /* Nonmatching */ + attention_info.flags = fopAc_Attn_ACTION_SPEAK_e | fopAc_Attn_LOCKON_TALK_e; + setProcess(&daCanon_c::wait_proc); } /* 00000AB8-00000D14 .text wait_proc__9daCanon_cFv */ void daCanon_c::wait_proc() { - /* Nonmatching */ + static char* cut_name_tbl[] = {"Canon_game"}; + + f32 unused_abs = (dComIfGp_getPlayer(0)->current.pos - current.pos).absXZ(); + + int iVar2 = dComIfGp_evmng_getMyStaffId("Canon"); + if (iVar2 != -1) { + if (!dComIfGp_evmng_getMyActIdx(iVar2, cut_name_tbl, ARRAY_SSIZE(cut_name_tbl), 1, 0)) { + cXyz sp24 = current.pos; + daPy_py_c* player = (daPy_py_c*)dComIfGp_getPlayer(0); + createTargetObj(); + m65A = 0; + m65C = 10; + sp24.x -= cM_ssin(home.angle.y) * 200.0f; + sp24.z -= cM_scos(home.angle.y) * 200.0f; + player->setPlayerPosAndAngle(&sp24, home.angle.y); + dComIfGp_startMiniGame(3); + + for (s32 i = 0; i < ARRAY_SSIZE(m584); i++) { + m584[i]->onBeforeTex(); + } + + for (s32 i = 0; i < ARRAY_SSIZE(m5AC); i++) { + m5AC[i]->onBeforeTex(); + } + + game_start_proc_init(); + } else { + dComIfGp_evmng_cutEnd(iVar2); + } + } } /* 00000D14-00000DD4 .text game_start_proc_init__9daCanon_cFv */ void daCanon_c::game_start_proc_init() { - /* Nonmatching */ + m656 = 60; + shape_angle.y = home.angle.y; + shape_angle.x = 0x2aaa; + + if (daNpc_Kg2_c::l_kg2_pointer != NULL) { + fopAcM_seStart(daNpc_Kg2_c::l_kg2_pointer, JA_SE_PLAYSPOT_START, 0); + } + + setProcess(&daCanon_c::game_start_proc); } /* 00000DD4-00000E08 .text game_start_proc__9daCanon_cFv */ void daCanon_c::game_start_proc() { - /* Nonmatching */ + if (m656-- < 0) { + game_proc_init(); + } } /* 00000E08-00000E2C .text game_proc_init__9daCanon_cFv */ void daCanon_c::game_proc_init() { - /* Nonmatching */ + setProcess(&daCanon_c::game_proc); } /* 00000E2C-00000FA0 .text game_proc__9daCanon_cFv */ void daCanon_c::game_proc() { - /* Nonmatching */ + PadMove(); + + if (CPad_CHECK_TRIG_A(0)) { + cXyz sp08 = current.pos; + sp08.x += cM_ssin(shape_angle.x) * 200.0f * cM_ssin(shape_angle.y); + sp08.y += cM_scos(shape_angle.x) * 200.0f; + sp08.z += cM_ssin(shape_angle.x) * 200.0f * cM_scos(shape_angle.y); + + makeFireEffect(sp08, shape_angle, 0); + m614 = sp08; + + fopAcM_seStart(this, JA_SE_LK_SHIP_CANNON_FIRE, 0); + + fire_proc_init(); + } } /* 00000FA0-00001074 .text fire_proc_init__9daCanon_cFv */ void daCanon_c::fire_proc_init() { - /* Nonmatching */ + f32 tmp = (((home.angle.x + 0x1000) - shape_angle.x) / 4096.0f); + m652 = tmp * 8.0f * 7.0f + 64.0f; + m654 = m652; + m65E = 0; + m660 = 0x400; + m638 = -20.0f; + setProcess(&daCanon_c::fire_proc); + m65C--; + m584[m65C]->offBeforeTex(); } /* 00001074-000013AC .text fire_proc__9daCanon_cFv */ void daCanon_c::fire_proc() { - /* Nonmatching */ + cLib_addCalcAngleS2(&m660, 0, 4, 0x100); + m65E += 0x3800; + cLib_addCalc2(&m638, 0.0, 0.25, 5.0); + m620 = getBulEndPos(shape_angle.y, shape_angle.x); + if (m652-- != 0 && !mCyl2.ChkAtHit()) { + f32 fVar4 = (f32)m652 / m654; + f32 tmp2 = 1.0f - (fVar4 - 0.5f) * (fVar4 - 0.5f) * 4.0f; + + cXyz sp54 = m620 - m614; + s16 idx = 0x4000 - shape_angle.x; + f32 tmp1 = sp54.absXZ() * 0.25f * (cM_ssin(idx) / cM_scos(idx)); + + m62C = (m614 * fVar4) + (m620 * (1.0f - fVar4)); + m62C.y += tmp1 * tmp2; + bul_set_mtx(&m62C); + mCyl2.SetC(m62C); + dComIfG_Ccsp()->Set(&mCyl2); + + mDoAud_seStart(JA_SE_LK_SHIP_CANNON_FLY, &m62C, 0, dComIfGp_getReverb(fopAcM_GetRoomNo(this))); + } else { + mDoAud_seStopActor(&m62C); + fopKyM_createWpillar(&m62C, 2.0f, 1.0f, 1); + pause_proc_init(); + } } /* 000013AC-00001654 .text pause_proc_init__9daCanon_cFv */ void daCanon_c::pause_proc_init() { - /* Nonmatching */ + m656 = 30; + if (mCyl2.ChkAtHit()) { + m5AC[m65A]->offBeforeTex(); + csXyz sp08(csXyz::Zero); + makeFireEffect(m62C, sp08, 1); + m65A++; + dComIfGp_setMiniGameRupee(m65A); + dComIfGp_getVibration().StartShock(7, 0x3e, cXyz(cM_ssin(shape_angle.y), 0.0f, cM_scos(shape_angle.y))); + + if (m65A == 5) { + if (daNpc_Kg2_c::l_kg2_pointer != NULL) { + fopAcM_seStart(daNpc_Kg2_c::l_kg2_pointer, JA_SE_PLAYSPOT_END_S, 0); + } + } else if (m65C == 0) { + if (daNpc_Kg2_c::l_kg2_pointer != NULL) { + fopAcM_seStart(daNpc_Kg2_c::l_kg2_pointer, JA_SE_PLAYSPOT_END_F, 0); + } + } else if (daNpc_Kg2_c::l_kg2_pointer != NULL) { + fopAcM_seStart(daNpc_Kg2_c::l_kg2_pointer, JA_SE_PLAYSPOT_DESTROY, 0); + } + mCyl2.ClrAtHit(); + } else if (m65C == 0 && daNpc_Kg2_c::l_kg2_pointer != NULL) { + fopAcM_seStart(daNpc_Kg2_c::l_kg2_pointer, JA_SE_PLAYSPOT_END_F, 0); + } + + setProcess(&daCanon_c::pause_proc); } /* 00001654-000016A8 .text pause_proc__9daCanon_cFv */ void daCanon_c::pause_proc() { - /* Nonmatching */ + if (m656-- < 0) { + if (m65C > 0 && m65A < 5) { + game_proc_init(); + } else { + end_proc_init(); + } + } } /* 000016A8-00001714 .text end_proc_init__9daCanon_cFv */ void daCanon_c::end_proc_init() { - /* Nonmatching */ + m656 = 60; + + setProcess(&daCanon_c::end_proc); + + if (m65A == 5) { + dComIfGp_setMiniGameResult(1); + daNpc_Kg2_c::setCanonGameResult(1); + } else { + dComIfGp_setMiniGameResult(2); + daNpc_Kg2_c::setCanonGameResult(2); + } } /* 00001714-00001814 .text end_proc__9daCanon_cFv */ void daCanon_c::end_proc() { - /* Nonmatching */ + static char* cut_name_tbl[] = {"Canon_game"}; + + if (m656 > 0) { + if (m656 == 30) { + breakAllObj(); + } + m656--; + } else { + int staffIdx = dComIfGp_evmng_getMyStaffId("Canon"); + if (staffIdx == -1) { + wait_proc_init(); + } else if (!dComIfGp_evmng_getMyActIdx(staffIdx, cut_name_tbl, ARRAY_SIZE(cut_name_tbl), 1, 0)) { + dComIfGp_evmng_cutEnd(staffIdx); + if (dComIfGp_getMiniGameType() == 3) { + dComIfGp_endMiniGame(3); + } + wait_proc_init(); + } + } } /* 00001814-00001A18 .text PadMove__9daCanon_cFv */ void daCanon_c::PadMove() { - /* Nonmatching */ + interface_of_controller_pad* pad = &g_mDoCPd_cpadInfo[0]; + f32 stickX = pad->mMainStickPosX; + f32 stickY = pad->mMainStickPosY; + s16 target1 = shape_angle.y; + s16 target2 = shape_angle.x; + + if (stickX > 0.5f) { + target1 += (s16)((0.5f - stickX) * 1024.0f); + s16 sVar1 = home.angle.y + -0x1200; + if (shape_angle.y >= sVar1 && target1 < sVar1) { + target1 = sVar1; + } + } else if (stickX < -0.5f) { + target1 += (s16)((-0.5f - stickX) * 1024.0f); + s16 sVar1 = home.angle.y + 0x1200; + if (shape_angle.y <= sVar1 && target1 > sVar1) { + target1 = sVar1; + } + } + + if (stickY > 0.5f) { + target2 += (s16)((stickY - 0.5f) * 512.0f); + s16 sVar1 = home.angle.x + 0x1000; + if (shape_angle.x <= sVar1 && target2 > sVar1) { + target2 = sVar1; + } + } else if (stickY < -0.5f) { + target2 += (s16)((stickY + 0.5f) * 512.0f); + s16 sVar1 = home.angle.x; + if (shape_angle.x >= sVar1 && target2 < sVar1) { + target2 = sVar1; + } + } + + s16 sVar2 = cLib_addCalcAngleS(&shape_angle.y, target1, 4, 0x100, 0x10); + s16 sVar4 = cLib_addCalcAngleS(&shape_angle.x, target2, 4, 0x100, 0x10); + + if (sVar2 != 0 || sVar4 != 0) { + fopAcM_seStart(this, JA_SE_LK_SHIP_CANNON_MOVE, 0); + } } /* 00001A18-00001A38 .text CheckCreateHeap__FP10fopAc_ac_c */ -static BOOL CheckCreateHeap(fopAc_ac_c*) { - /* Nonmatching */ +static BOOL CheckCreateHeap(fopAc_ac_c* a_this) { + return ((daCanon_c*)a_this)->CreateHeap(); } /* 00001A38-00001E04 .text CreateHeap__9daCanon_cFv */ -void daCanon_c::CreateHeap() { - /* Nonmatching */ +BOOL daCanon_c::CreateHeap() { + J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes(M_arcname, BOMBER_INDEX_BDL_VCANK); + JUT_ASSERT(823, modelData != NULL); + + mpModel1 = mDoExt_J3DModel__create(modelData, 0, 0x11020203); + if (mpModel1 == NULL) { + return FALSE; + } + + J3DModelData* modelData2 = (J3DModelData*)dComIfG_getObjectRes(M_arcname, BOMBER_INDEX_BMD_AISI); + JUT_ASSERT(831, modelData2 != NULL); + + s8 cVar10 = modelData->getJointName()->getIndex("canon"); + modelData->getJointNodePointer(cVar10)->setCallBack(daCanon_nodeCallBack); + mpModel1->setUserArea((u32)this); + mpModel2 = mDoExt_J3DModel__create(modelData2, 0, 0x11020203); + if (mpModel2 == NULL) { + return FALSE; + } + + ResTIMG* pRVar3 = (ResTIMG*)dComIfG_getObjectRes("Bomber", BOMBER_INDEX_BTI_GAME_BOMB_01); + ResTIMG* pRVar4 = (ResTIMG*)dComIfG_getObjectRes("Bomber", BOMBER_INDEX_BTI_GAME_BOMB_02); + + for (s32 i = 0; i < ARRAY_SSIZE(m584); i++) { + m584[i] = new dDlst_2DObject_c(); + if (m584[i] == NULL) { + return FALSE; + } + + if (!m584[i]->init(pRVar3, pRVar4)) { + return FALSE; + } + } + + ResTIMG* pRVar5 = (ResTIMG*)dComIfG_getObjectRes("Bomber", BOMBER_INDEX_BTI_GAME_SHIP_NODAMAGE); + ResTIMG* pRVar6 = (ResTIMG*)dComIfG_getObjectRes("Bomber", BOMBER_INDEX_BTI_GAME_HUNE_DAMAGE); + + // Bug: m5AC only has 5 elements, copy-paste mistake. + for (s32 i = 0; i < ARRAY_SSIZE(m584); i++) { + m5AC[i] = new dDlst_2DObject_c(); + if (m5AC[i] == NULL) { + return FALSE; + } + + if (!m5AC[i]->init(pRVar5, pRVar6)) { + return FALSE; + } + } + + ResTIMG* pRVar7 = (ResTIMG*)dComIfG_getObjectRes("Bomber", BOMBER_INDEX_BTI_GAME_RULE); + ResTIMG* pRVar8 = (ResTIMG*)dComIfG_getObjectRes("Bomber", BOMBER_INDEX_BTI_GAME_BATTERY); + ResTIMG* pRVar9 = (ResTIMG*)dComIfG_getObjectRes("Bomber", BOMBER_INDEX_BTI_GAME_BATTERY_BASE); + ResTIMG* pRVar10 = (ResTIMG*)dComIfG_getObjectRes("Bomber", BOMBER_INDEX_BTI_RUPY_NUM_DEGREE); + m5C0 = new dDlst_2DBattery_c(); + + if (m5C0 == NULL) { + return FALSE; + } + + if (!m5C0->init(pRVar7, pRVar8, pRVar9, pRVar10)) { + return FALSE; + } + return TRUE; } +const f32 unused_4851[] = {0.8f, -0.8f, 0.1f}; + /* 00001E4C-00002074 .text GameInfo2DDraw__9daCanon_cFv */ void daCanon_c::GameInfo2DDraw() { - /* Nonmatching */ + for (s32 i = 0; i < ARRAY_SSIZE(m584); i++) { + m584[i]->setPosition(REG10_F(5) + 30.0f, (REG10_F(6) + 368.0f) + (REG10_F(7) + -27.0f) * i); + m584[i]->setScale(unused_4851[0] + REG10_F(20)); + dComIfGd_set2DOpa(m584[i]); + } + + for (s32 i = 0; i < ARRAY_SSIZE(m5AC); i++) { + m5AC[i]->setPosition(REG10_F(8) + 540.0f, (REG10_F(9) + 115.0f) + (REG10_F(10) + 47.0f) * i); + m5AC[i]->setScale(REG10_F(21) + 1.0f); + dComIfGd_set2DOpa(m5AC[i]); + } + + m5C0->setRotate(cM_sht2d((s16)(0x4000 - shape_angle.x))); + dComIfGd_set2DOpa(m5C0); } /* 00002074-00002094 .text daCanonCreate__FPv */ @@ -214,22 +589,107 @@ static cPhs_State daCanonCreate(void* i_this) { /* 00002094-000023C0 .text _create__9daCanon_cFv */ cPhs_State daCanon_c::_create() { - /* Nonmatching */ + fopAcM_SetupActor(this, daCanon_c); + + cPhs_State PVar1 = dComIfG_resLoad(&mPhase, M_arcname); + if (PVar1 == cPhs_COMPLEATE_e) { + if (!fopAcM_entrySolidHeap(this, CheckCreateHeap, 0x62E0)) { + return cPhs_ERROR_e; + } + + set_mtx(); + MTXCopy(mDoMtx_stack_c::get(), m5C4); + fopAcM_SetMtx(this, mpModel1->getBaseTRMtx()); + MTXCopy(mpModel1->getBaseTRMtx(), m5C4); + + mStts1.Init(0xff, 0xff, this); + mCyl1.Set(canon_cyl_src); + mCyl1.SetStts(&mStts1); + mCyl2.Set(canon_cyl2_src); + mCyl2.SetStts(&mStts1); + + shape_angle.x = 0x2AAA; + home.angle.x = 0x2000; + + wait_proc_init(); + + m64E = 0; + m650 = 3; + + m63C = current.pos; + m63C.x += cM_ssin(shape_angle.x) * 200.0f * cM_ssin(shape_angle.y); + m63C.z += cM_ssin(shape_angle.x) * 200.0f * cM_scos(shape_angle.y); + + m648 = csXyz::Zero; + m648.y = shape_angle.y; + + canon_p = this; + } + return PVar1; +} + +bool daCanon_c::_delete() { + dComIfG_resDeleteDemo(&mPhase, M_arcname); + if (dComIfGp_getMiniGameType() == 3) { + dComIfGp_endMiniGame(3); + } + mDoAud_seDeleteObject(&m62C); + daCanon_c::canon_p = NULL; + return true; } /* 00002578-00002600 .text daCanonDelete__FPv */ -static BOOL daCanonDelete(void*) { - /* Nonmatching */ +static BOOL daCanonDelete(void* i_this) { + return ((daCanon_c*)i_this)->_delete(); +} + +bool daCanon_c::_execute() { + if (m664) { + dKy_actor_addcol_set(0, 0, 0, 0.0); + dKy_efplight_cut(&plight); + dKyw_pntwind_cut(&pwind); + m664 = false; + } + + set_mtx(); + + (this->*m290)(); + + cXyz sp08 = current.pos; + sp08.x += REG10_F(12) * cM_ssin(shape_angle.y); + sp08.z += REG10_F(12) * cM_scos(shape_angle.y); + + mCyl1.SetC(sp08); + mCyl1.SetR(REG10_F(13) + 75.0f); + dComIfG_Ccsp()->Set(&mCyl1); + return false; } /* 00002600-0000274C .text daCanonExecute__FPv */ -static BOOL daCanonExecute(void*) { - /* Nonmatching */ +static BOOL daCanonExecute(void* i_this) { + return ((daCanon_c*)i_this)->_execute(); +} + +bool daCanon_c::_draw() { + g_env_light.settingTevStruct(TEV_TYPE_ACTOR, ¤t.pos, &tevStr); + g_env_light.setLightTevColorType(mpModel1, &tevStr); + mDoExt_modelUpdateDL(mpModel1); + + if (checkProcess(&daCanon_c::fire_proc)) { + g_env_light.settingTevStruct(TEV_TYPE_ACTOR, &m62C, &tevStr); + g_env_light.setLightTevColorType(mpModel2, &tevStr); + mDoExt_modelUpdateDL(mpModel2); + } + + if (dComIfGp_getMiniGameType() == 3) { + GameInfo2DDraw(); + } + return true; } /* 0000274C-0000283C .text daCanonDraw__FPv */ -static BOOL daCanonDraw(void*) { - /* Nonmatching */ +static BOOL daCanonDraw(void* i_this) { + return ((daCanon_c*)i_this)->_draw(); } /* 0000283C-00002844 .text daCanonIsDelete__FPv */ diff --git a/src/d/d_2dnumber.cpp b/src/d/d_2dnumber.cpp index f8bb69d73..46fafa692 100644 --- a/src/d/d_2dnumber.cpp +++ b/src/d/d_2dnumber.cpp @@ -93,24 +93,24 @@ void dDlst_2DMinigame_c::draw() { } /* 800C8A00-800C8FAC .text init__17dDlst_2DBattery_cFP7ResTIMGP7ResTIMGP7ResTIMGP7ResTIMG */ -bool dDlst_2DBattery_c::init(ResTIMG* rule, ResTIMG* battery, ResTIMG* batteryBase, ResTIMG* degree) { +BOOL dDlst_2DBattery_c::init(ResTIMG* rule, ResTIMG* battery, ResTIMG* batteryBase, ResTIMG* degree) { mRule = new J2DPicture(rule); if (mRule == NULL) - return false; + return FALSE; mRuleSize.x = rule->width; mRuleSize.y = rule->height; mBattery = new J2DPicture(battery); if (mBattery == NULL) - return false; + return FALSE; mBatterySize.x = battery->width; mBatterySize.y = battery->height; mBatteryBase = new J2DPicture(batteryBase); if (mBatteryBase == NULL) - return false; + return FALSE; mBatteryBaseSize.x = batteryBase->width; mBatteryBaseSize.y = batteryBase->height; @@ -118,15 +118,15 @@ bool dDlst_2DBattery_c::init(ResTIMG* rule, ResTIMG* battery, ResTIMG* batteryBa for (s32 i = 0; i < 2; i++) { mNum[0][i] = new J2DPicture(degree); if (mNum[0][i] == NULL) - return false; + return FALSE; mNum[1][i] = new J2DPicture("rupy_num_00.bti"); if (mNum[1][i] == NULL) - return false; + return FALSE; mNum[2][i] = new J2DPicture("rupy_num_00.bti"); if (mNum[2][i] == NULL) - return false; + return FALSE; } mBattery->setAlpha(200); @@ -155,7 +155,7 @@ bool dDlst_2DBattery_c::init(ResTIMG* rule, ResTIMG* battery, ResTIMG* batteryBa mNum[2][1]->setAlpha(80); mRotation = 20.0f; - return true; + return TRUE; } /* 800C8FAC-800C90F0 .text setRotate__17dDlst_2DBattery_cFf */ @@ -204,22 +204,22 @@ void dDlst_2DBattery_c::draw() { } /* 800C9348-800C946C .text init__16dDlst_2DObject_cFP7ResTIMGP7ResTIMG */ -bool dDlst_2DObject_c::init(ResTIMG* img1, ResTIMG* img2) { +BOOL dDlst_2DObject_c::init(ResTIMG* img1, ResTIMG* img2) { mPicture[0] = new J2DPicture(img1); if (mPicture[0] == NULL) - return false; + return FALSE; mSize[0].x = img1->width; mSize[0].y = img1->height; mPicture[1] = new J2DPicture(img2); if (mPicture[1] == NULL) - return false; + return FALSE; mSize[1].x = img2->width; mSize[1].y = img2->height; mScale = 1.0f; mCurrentNo = 0; - return true; + return TRUE; } /* 800C946C-800C9520 .text draw__16dDlst_2DObject_cFv */