summaryrefslogtreecommitdiff
path: root/src/d/actor/d_a_obj_knBullet.cpp
diff options
context:
space:
mode:
authorTakaRikka <38417346+TakaRikka@users.noreply.github.com>2025-10-08 08:35:58 -0700
committerGitHub <noreply@github.com>2025-10-08 18:35:58 +0300
commit3077f6a9716c2be2475a31828c0212d9bd7777db (patch)
treef8293311bc947140af4e3d3220a5903b45080e34 /src/d/actor/d_a_obj_knBullet.cpp
parentfc6c0fd88c64a0f67f30547713088c7f93cd1566 (diff)
knBullet / lv6Lblock done, lv6ChangeGate equivalent (#2729)
* knBullet / lv6Lblock done, lv6ChangeGate equivalent * d_a_e_mm matching * debug fix * obj_kage matching
Diffstat (limited to 'src/d/actor/d_a_obj_knBullet.cpp')
-rw-r--r--src/d/actor/d_a_obj_knBullet.cpp398
1 files changed, 164 insertions, 234 deletions
diff --git a/src/d/actor/d_a_obj_knBullet.cpp b/src/d/actor/d_a_obj_knBullet.cpp
index 92f2cf145d..e0e8ffbd0d 100644
--- a/src/d/actor/d_a_obj_knBullet.cpp
+++ b/src/d/actor/d_a_obj_knBullet.cpp
@@ -6,85 +6,14 @@
#include "d/dolzel_rel.h" // IWYU pragma: keep
#include "d/actor/d_a_obj_knBullet.h"
-#include "d/d_cc_d.h"
-#include "dol2asm.h"
-
-
-//
-// Forward References:
-//
-
-extern "C" void Create__15daObjKnBullet_cFv();
-extern "C" void __dt__8cM3dGSphFv();
-extern "C" void __dt__8cM3dGAabFv();
-extern "C" void Execute__15daObjKnBullet_cFv();
-extern "C" bool Draw__15daObjKnBullet_cFv();
-extern "C" bool Delete__15daObjKnBullet_cFv();
-extern "C" void setBaseMtx__15daObjKnBullet_cFv();
-extern "C" void col_init__15daObjKnBullet_cFv();
-extern "C" void col_chk__15daObjKnBullet_cFv();
-extern "C" void hitPrtclSet__15daObjKnBullet_cFv();
-extern "C" static void daObjKnBullet_Execute__FP15daObjKnBullet_c();
-extern "C" static void daObjKnBullet_Draw__FP15daObjKnBullet_c();
-extern "C" static bool daObjKnBullet_IsDelete__FP15daObjKnBullet_c();
-extern "C" static void daObjKnBullet_Delete__FP15daObjKnBullet_c();
-extern "C" static void daObjKnBullet_create__FP10fopAc_ac_c();
-extern "C" void func_80C4792C(void* _this, s16*);
-
-//
-// External References:
-//
-
-extern "C" void mDoMtx_YrotS__FPA4_fs();
-extern "C" void XYZrotM__14mDoMtx_stack_cFRC5csXyz();
-extern "C" void __ct__10fopAc_ac_cFv();
-extern "C" void fopAcM_delete__FP10fopAc_ac_c();
-extern "C" void fopAcM_setCullSizeBox__FP10fopAc_ac_cffffff();
-extern "C" void fopAcM_posMove__FP10fopAc_ac_cPC4cXyz();
-extern "C" void fpcEx_SearchByID__FUi();
-extern "C" void dComIfGp_getReverb__Fi();
-extern "C" void getEmitter__Q213dPa_control_c7level_cFUl();
-extern "C" void
-set__13dPa_control_cFUcUsPC4cXyzPC12dKy_tevstr_cPC5csXyzPC4cXyzUcP18dPa_levelEcallBackScPC8_GXColorPC8_GXColorPC4cXyzf();
-extern "C" void
-set__13dPa_control_cFUlUcUsPC4cXyzPC12dKy_tevstr_cPC5csXyzPC4cXyzUcP18dPa_levelEcallBackScPC8_GXColorPC8_GXColorPC4cXyzf();
-extern "C" void __ct__10dCcD_GSttsFv();
-extern "C" void Init__9dCcD_SttsFiiP10fopAc_ac_c();
-extern "C" void __ct__12dCcD_GObjInfFv();
-extern "C" void ChkAtHit__12dCcD_GObjInfFv();
-extern "C" void Set__8dCcD_SphFRC11dCcD_SrcSph();
-extern "C" void Set__4cCcSFP8cCcD_Obj();
-extern "C" void __mi__4cXyzCFRC3Vec();
-extern "C" void normalizeZP__4cXyzFv();
-extern "C" void SetC__8cM3dGSphFRC4cXyz();
-extern "C" void SetR__8cM3dGSphFf();
-extern "C" void deleteAllParticle__14JPABaseEmitterFv();
-extern "C" void seStartLevel__7Z2SeMgrF10JAISoundIDPC3VecUlScffffUc();
-extern "C" void __dl__FPv();
-extern "C" void _savegpr_24();
-extern "C" void _savegpr_26();
-extern "C" void _savegpr_29();
-extern "C" void _restgpr_24();
-extern "C" void _restgpr_26();
-extern "C" void _restgpr_29();
-extern "C" extern void* __vt__8dCcD_Sph[36];
-extern "C" extern void* __vt__9dCcD_Stts[11];
-extern "C" extern void* __vt__12cCcD_SphAttr[25];
-extern "C" extern void* __vt__14cCcD_ShapeAttr[22];
-extern "C" extern void* __vt__9cCcD_Stts[8];
-extern "C" u8 now__14mDoMtx_stack_c[48];
-extern "C" u8 mAudioMgrPtr__10Z2AudioMgr[4 + 4 /* padding */];
-
-//
-// Declarations:
-//
-
-/* ############################################################################################## */
+#include "d/actor/d_a_npc_kn.h"
+
/* 80C47950-80C4795C 000000 000C+00 4/4 0/0 0/0 .rodata l_DATA */
-SECTION_RODATA static u8 const l_DATA[12] = {
- 0x41, 0xF0, 0x00, 0x00, 0x41, 0xA0, 0x00, 0x00, 0x00, 0x96, 0x00, 0x00,
+static const daObjKnBullet_Hio_Param_c l_DATA = {
+ 30.0f,
+ 20.0f,
+ 150
};
-COMPILER_STRIP_GATE(0x80C47950, &l_DATA);
/* 80C4795C-80C4799C 00000C 0040+00 1/1 0/0 0/0 .rodata l_sph_src */
const static dCcD_SrcSph l_sph_src = {
@@ -99,211 +28,212 @@ const static dCcD_SrcSph l_sph_src = {
} // mSphAttr
};
-/* 80C4799C-80C479A0 00004C 0004+00 0/1 0/0 0/0 .rodata @3907 */
-#pragma push
-#pragma force_active on
-SECTION_RODATA static f32 const lit_3907 = -300.0f;
-COMPILER_STRIP_GATE(0x80C4799C, &lit_3907);
-#pragma pop
-
-/* 80C479A0-80C479A4 000050 0004+00 0/1 0/0 0/0 .rodata @3908 */
-#pragma push
-#pragma force_active on
-SECTION_RODATA static f32 const lit_3908 = -50.0f;
-COMPILER_STRIP_GATE(0x80C479A0, &lit_3908);
-#pragma pop
-
-/* 80C479A4-80C479A8 000054 0004+00 0/1 0/0 0/0 .rodata @3909 */
-#pragma push
-#pragma force_active on
-SECTION_RODATA static f32 const lit_3909 = 300.0f;
-COMPILER_STRIP_GATE(0x80C479A4, &lit_3909);
-#pragma pop
-
-/* 80C479A8-80C479AC 000058 0004+00 0/1 0/0 0/0 .rodata @3910 */
-#pragma push
-#pragma force_active on
-SECTION_RODATA static f32 const lit_3910 = 450.0f;
-COMPILER_STRIP_GATE(0x80C479A8, &lit_3910);
-#pragma pop
-
-/* 80C479CC-80C479EC -00001 0020+00 1/0 0/0 0/0 .data l_daObjKnBullet_Method */
-static actor_method_class l_daObjKnBullet_Method = {
- (process_method_func)daObjKnBullet_create__FP10fopAc_ac_c,
- (process_method_func)daObjKnBullet_Delete__FP15daObjKnBullet_c,
- (process_method_func)daObjKnBullet_Execute__FP15daObjKnBullet_c,
- (process_method_func)daObjKnBullet_IsDelete__FP15daObjKnBullet_c,
- (process_method_func)daObjKnBullet_Draw__FP15daObjKnBullet_c,
-};
+/* 80C47118-80C47270 000078 0158+00 1/1 0/0 0/0 .text Create__15daObjKnBullet_cFv */
+int daObjKnBullet_c::Create() {
+ fopAcM_SetupActor(this, daObjKnBullet_c);
-/* 80C479EC-80C47A1C -00001 0030+00 0/0 0/0 1/0 .data g_profile_KN_BULLET */
-extern actor_process_profile_definition g_profile_KN_BULLET = {
- fpcLy_CURRENT_e, // mLayerID
- 7, // mListID
- fpcPi_CURRENT_e, // mListPrio
- PROC_KN_BULLET, // mProcName
- &g_fpcLf_Method.base, // sub_method
- sizeof(daObjKnBullet_c), // mSize
- 0, // mSizeOther
- 0, // mParameters
- &g_fopAc_Method.base, // sub_method
- 348, // mPriority
- &l_daObjKnBullet_Method, // sub_method
- 0x00044100, // mStatus
- fopAc_ACTOR_e, // mActorType
- fopAc_CULLBOX_CUSTOM_e, // cullType
-};
+ setBaseMtx();
+ fopAcM_SetMtx(this, mMtx);
+ mTimer = l_DATA.lifetime + 30;
+ fopAcM_setCullSizeBox(this, -300.0f, -50.0f, -300.0f, 300.0f, 450.0f, 300.0f);
-/* 80C47A1C-80C47A28 000050 000C+00 2/2 0/0 0/0 .data __vt__8cM3dGSph */
-SECTION_DATA extern void* __vt__8cM3dGSph[3] = {
- (void*)NULL /* RTTI */,
- (void*)NULL,
- (void*)__dt__8cM3dGSphFv,
-};
+ col_init();
+ mActionMode = 0;
-/* 80C47A28-80C47A34 00005C 000C+00 2/2 0/0 0/0 .data __vt__8cM3dGAab */
-SECTION_DATA extern void* __vt__8cM3dGAab[3] = {
- (void*)NULL /* RTTI */,
- (void*)NULL,
- (void*)__dt__8cM3dGAabFv,
-};
+ for (int i = 0; i < 3; i++) {
+ mEmtIds[i] = -1;
+ }
-/* 80C47118-80C47270 000078 0158+00 1/1 0/0 0/0 .text Create__15daObjKnBullet_cFv */
-void daObjKnBullet_c::Create() {
- // NONMATCHING
+ return cPhs_COMPLEATE_e;
}
-/* 80C47270-80C472B8 0001D0 0048+00 1/0 0/0 0/0 .text __dt__8cM3dGSphFv */
-// cM3dGSph::~cM3dGSph() {
-extern "C" void __dt__8cM3dGSphFv() {
- // NONMATCHING
-}
+/* 80C47300-80C47480 000260 0180+00 1/1 0/0 0/0 .text Execute__15daObjKnBullet_cFv */
+int daObjKnBullet_c::Execute() {
+ if (!col_chk()) {
+ return 1;
+ }
-/* 80C472B8-80C47300 000218 0048+00 1/0 0/0 0/0 .text __dt__8cM3dGAabFv */
-// cM3dGAab::~cM3dGAab() {
-extern "C" void __dt__8cM3dGAabFv() {
- // NONMATCHING
-}
+ fopAcM_posMove(this, NULL);
+ setBaseMtx();
-/* ############################################################################################## */
-/* 80C479AC-80C479B4 00005C 0006+02 0/1 0/0 0/0 .rodata l_prticles_id$3986 */
-#pragma push
-#pragma force_active on
-SECTION_RODATA static u8 const l_prticles_id_3986[6 + 2 /* padding */] = {
- 0x8B,
- 0x7F,
- 0x8B,
- 0x80,
- 0x8B,
- 0x81,
- /* padding */
- 0x00,
- 0x00,
-};
-COMPILER_STRIP_GATE(0x80C479AC, &l_prticles_id_3986);
-#pragma pop
+ if (cLib_calcTimer<s16>(&mTimer) == 0) {
+ fopAcM_delete(this);
+ return 1;
+ }
-/* 80C479B4-80C479B8 000064 0004+00 1/2 0/0 0/0 .rodata @4021 */
-SECTION_RODATA static f32 const lit_4021 = 1.0f;
-COMPILER_STRIP_GATE(0x80C479B4, &lit_4021);
+ for (int i = 0; i < 3; i++) {
+ static const u16 l_prticles_id[] = {
+ dPa_RM(ID_ZI_S_KN_MAGICBALL_A),
+ dPa_RM(ID_ZI_S_KN_MAGICBALL_B),
+ dPa_RM(ID_ZI_S_KN_MAGICBALL_C),
+ };
-/* 80C479B8-80C479BC 000068 0004+00 0/1 0/0 0/0 .rodata @4022 */
-#pragma push
-#pragma force_active on
-SECTION_RODATA static f32 const lit_4022 = -1.0f;
-COMPILER_STRIP_GATE(0x80C479B8, &lit_4022);
-#pragma pop
+ mEmtIds[i] = dComIfGp_particle_set(mEmtIds[i], l_prticles_id[i], &current.pos, &current.angle, NULL);
+ JPABaseEmitter* emt = dComIfGp_particle_getEmitter(mEmtIds[i]);
+ if (emt != NULL) {
+ emt->setGlobalTranslation(current.pos.x, current.pos.y, current.pos.z);
+ }
+ }
-/* 80C47300-80C47480 000260 0180+00 1/1 0/0 0/0 .text Execute__15daObjKnBullet_cFv */
-void daObjKnBullet_c::Execute() {
- // NONMATCHING
+ Z2GetAudioMgr()->seStartLevel(Z2SE_KN_BALL_LEVEL, &current.pos, 0, dComIfGp_getReverb(fopAcM_GetRoomNo(this)), 1.0f, 1.0f, -1.0f, -1.0f, 0);
+ return 1;
}
/* 80C47480-80C47488 0003E0 0008+00 1/1 0/0 0/0 .text Draw__15daObjKnBullet_cFv */
-bool daObjKnBullet_c::Draw() {
- return true;
+int daObjKnBullet_c::Draw() {
+ return 1;
}
/* 80C47488-80C47490 0003E8 0008+00 1/1 0/0 0/0 .text Delete__15daObjKnBullet_cFv */
-bool daObjKnBullet_c::Delete() {
- return true;
+int daObjKnBullet_c::Delete() {
+ return 1;
}
/* 80C47490-80C474E8 0003F0 0058+00 2/2 0/0 0/0 .text setBaseMtx__15daObjKnBullet_cFv */
void daObjKnBullet_c::setBaseMtx() {
- // NONMATCHING
+ mDoMtx_stack_c::transS(current.pos.x, current.pos.y, current.pos.z);
+ mDoMtx_stack_c::XYZrotM(shape_angle);
+ MTXCopy(mDoMtx_stack_c::get(), mMtx);
}
/* 80C474E8-80C47558 000448 0070+00 1/1 0/0 0/0 .text col_init__15daObjKnBullet_cFv */
void daObjKnBullet_c::col_init() {
- // NONMATCHING
+ mCcStts.Init(0xFF, 0xFF, this);
+ mCcSph.Set(l_sph_src);
+ mCcSph.SetStts(&mCcStts);
+ mCcSph.SetC(current.pos);
+ mCcSph.SetR(l_DATA.radius);
}
-/* ############################################################################################## */
-/* 80C479BC-80C479C0 00006C 0004+00 0/1 0/0 0/0 .rodata @4129 */
-#pragma push
-#pragma force_active on
-SECTION_RODATA static u8 const lit_4129[4] = {
- 0x00,
- 0x00,
- 0x00,
- 0x00,
-};
-COMPILER_STRIP_GATE(0x80C479BC, &lit_4129);
-#pragma pop
-
-/* 80C479C0-80C479C4 000070 0004+00 0/1 0/0 0/0 .rodata @4130 */
-#pragma push
-#pragma force_active on
-SECTION_RODATA static f32 const lit_4130 = 150.0f;
-COMPILER_STRIP_GATE(0x80C479C0, &lit_4130);
-#pragma pop
-
/* 80C47558-80C477B4 0004B8 025C+00 1/1 0/0 0/0 .text col_chk__15daObjKnBullet_cFv */
-void daObjKnBullet_c::col_chk() {
- // NONMATCHING
+BOOL daObjKnBullet_c::col_chk() {
+ if (mActionMode == 0) {
+ return TRUE;
+ }
+
+ if (mActionMode == 1) {
+ cXyz move_vec(0.0f, 0.0f, l_DATA.move_speed);
+ mDoMtx_stack_c::YrotS(shape_angle.y);
+ mDoMtx_stack_c::multVec(&move_vec, &speed);
+
+ if ((mCcSph.ChkTgShieldHit() || mCcSph.ChkAtShieldHit()) && daPy_getPlayerActorClass()->getCutType() == daPy_py_c::CUT_TYPE_GUARD_ATTACK) {
+ daNpc_Kn_c* parent = (daNpc_Kn_c*)fpcM_SearchByID(parentActorID);
+ if (parent != NULL) {
+ cXyz sp20(parent->current.pos);
+ sp20.y += 150.0f;
+ speed = sp20 - current.pos;
+ speed.normalizeZP();
+ speed *= l_DATA.move_speed;
+
+ mCcSph.SetAtSPrm(0x13);
+ mActionMode = 2;
+ mTimer = l_DATA.lifetime;
+ } else {
+ hitPrtclSet();
+ fopAcM_delete(this);
+ return FALSE;
+ }
+ } else if (mCcSph.ChkAtShieldHit()) {
+ daNpc_Kn_c* parent = (daNpc_Kn_c*)fpcM_SearchByID(parentActorID);
+ if (parent != NULL) {
+ parent->setTalkFlag(2);
+ hitPrtclSet();
+ fopAcM_delete(this);
+ return FALSE;
+ }
+ } else if (mCcSph.ChkAtHit()) {
+ daNpc_Kn_c* parent = (daNpc_Kn_c*)fpcM_SearchByID(parentActorID);
+ if (parent != NULL) {
+ parent->setTalkFlag(1);
+ hitPrtclSet();
+ fopAcM_delete(this);
+ return FALSE;
+ }
+ }
+ } else if (mActionMode == 2 && mCcSph.ChkAtHit()) {
+ hitPrtclSet();
+ fopAcM_delete(this);
+ speed.set(0.0f, 0.0f, 0.0f);
+ return FALSE;
+ }
+
+ mCcSph.SetC(current.pos);
+ mCcSph.SetR(l_DATA.radius);
+ dComIfG_Ccsp()->Set(&mCcSph);
+ return TRUE;
}
-/* ############################################################################################## */
-/* 80C479C4-80C479CA 000074 0006+00 1/1 0/0 0/0 .rodata l_prticles_id$4141 */
-SECTION_RODATA static u8 const l_prticles_id_4141[6] = {
- 0x8B, 0x82, 0x8B, 0x83, 0x8B, 0x84,
-};
-COMPILER_STRIP_GATE(0x80C479C4, &l_prticles_id_4141);
-
/* 80C477B4-80C478A4 000714 00F0+00 1/1 0/0 0/0 .text hitPrtclSet__15daObjKnBullet_cFv */
void daObjKnBullet_c::hitPrtclSet() {
- // NONMATCHING
+ for (int i = 0; i < 3; i++) {
+ JPABaseEmitter* emt = dComIfGp_particle_getEmitter(mEmtIds[i]);
+ if (emt != NULL) {
+ emt->becomeInvalidEmitter();
+ emt->deleteAllParticle();
+ }
+ }
+
+ for (int i = 0; i < 3; i++) {
+ static const u16 l_prticles_id[] = {
+ dPa_RM(ID_ZI_S_KN_MBHIT_A),
+ dPa_RM(ID_ZI_S_KN_MBHIT_B),
+ dPa_RM(ID_ZI_S_KN_MBHIT_C),
+ };
+
+ dComIfGp_particle_set(l_prticles_id[i], &current.pos, &current.angle, NULL);
+ }
}
/* 80C478A4-80C478C4 000804 0020+00 1/0 0/0 0/0 .text daObjKnBullet_Execute__FP15daObjKnBullet_c
*/
-static void daObjKnBullet_Execute(daObjKnBullet_c* param_0) {
- // NONMATCHING
+static int daObjKnBullet_Execute(daObjKnBullet_c* i_this) {
+ return i_this->Execute();
}
/* 80C478C4-80C478E4 000824 0020+00 1/0 0/0 0/0 .text daObjKnBullet_Draw__FP15daObjKnBullet_c */
-static void daObjKnBullet_Draw(daObjKnBullet_c* param_0) {
- // NONMATCHING
+static int daObjKnBullet_Draw(daObjKnBullet_c* i_this) {
+ return i_this->Draw();
}
/* 80C478E4-80C478EC 000844 0008+00 1/0 0/0 0/0 .text daObjKnBullet_IsDelete__FP15daObjKnBullet_c
*/
-static bool daObjKnBullet_IsDelete(daObjKnBullet_c* param_0) {
- return true;
+static int daObjKnBullet_IsDelete(daObjKnBullet_c* i_this) {
+ return 1;
}
/* 80C478EC-80C4790C 00084C 0020+00 1/0 0/0 0/0 .text daObjKnBullet_Delete__FP15daObjKnBullet_c */
-static void daObjKnBullet_Delete(daObjKnBullet_c* param_0) {
- // NONMATCHING
+static int daObjKnBullet_Delete(daObjKnBullet_c* i_this) {
+ return i_this->Delete();
}
/* 80C4790C-80C4792C 00086C 0020+00 1/0 0/0 0/0 .text daObjKnBullet_create__FP10fopAc_ac_c */
-static void daObjKnBullet_create(fopAc_ac_c* param_0) {
- // NONMATCHING
+static int daObjKnBullet_create(fopAc_ac_c* i_this) {
+ return ((daObjKnBullet_c*)i_this)->Create();
}
-/* 80C4792C-80C47948 00088C 001C+00 1/1 0/0 0/0 .text cLib_calcTimer<s>__FPs */
-extern "C" void func_80C4792C(void* _this, s16* param_0) {
- // NONMATCHING
-}
+/* 80C479CC-80C479EC -00001 0020+00 1/0 0/0 0/0 .data l_daObjKnBullet_Method */
+static actor_method_class l_daObjKnBullet_Method = {
+ (process_method_func)daObjKnBullet_create,
+ (process_method_func)daObjKnBullet_Delete,
+ (process_method_func)daObjKnBullet_Execute,
+ (process_method_func)daObjKnBullet_IsDelete,
+ (process_method_func)daObjKnBullet_Draw,
+};
+
+/* 80C479EC-80C47A1C -00001 0030+00 0/0 0/0 1/0 .data g_profile_KN_BULLET */
+extern actor_process_profile_definition g_profile_KN_BULLET = {
+ fpcLy_CURRENT_e, // mLayerID
+ 7, // mListID
+ fpcPi_CURRENT_e, // mListPrio
+ PROC_KN_BULLET, // mProcName
+ &g_fpcLf_Method.base, // sub_method
+ sizeof(daObjKnBullet_c), // mSize
+ 0, // mSizeOther
+ 0, // mParameters
+ &g_fopAc_Method.base, // sub_method
+ 348, // mPriority
+ &l_daObjKnBullet_Method, // sub_method
+ 0x00044100, // mStatus
+ fopAc_ACTOR_e, // mActorType
+ fopAc_CULLBOX_CUSTOM_e, // cullType
+};