From 42c4a5d8256581aec282015839ced142b4094528 Mon Sep 17 00:00:00 2001 From: LagoLunatic Date: Wed, 13 Dec 2023 00:45:11 -0500 Subject: [PATCH] d_a_bk work --- include/c/c_damagereaction.h | 3 +- include/d/actor/d_a_bk.h | 173 ++++++++++++++++++++++++++++++++++- include/d/actor/d_a_boko.h | 16 +++- src/d/actor/d_a_bk.cpp | 171 ++++++++++++++++++++++++++++++++-- 4 files changed, 347 insertions(+), 16 deletions(-) diff --git a/include/c/c_damagereaction.h b/include/c/c_damagereaction.h index b2850b545..5276619bc 100644 --- a/include/c/c_damagereaction.h +++ b/include/c/c_damagereaction.h @@ -164,7 +164,8 @@ public: /* 0x711 */ u8 m711[0x712 - 0x711]; /* 0x712 */ u8 m712; /* 0x713 */ u8 m713; - /* 0x714 */ u8 m714[0x71E - 0x714]; + /* 0x714 */ fopAc_ac_c* m714; + /* 0x718 */ u8 m718[0x71E - 0x718]; /* 0x71E */ s16 m71E; /* 0x720 */ f32 mMaxFallDistance; /* 0x724 */ dCcD_Stts mStts; diff --git a/include/d/actor/d_a_bk.h b/include/d/actor/d_a_bk.h index 2eef45fe1..37edf7556 100644 --- a/include/d/actor/d_a_bk.h +++ b/include/d/actor/d_a_bk.h @@ -14,7 +14,9 @@ public: /* 0x02B7 */ u8 m02B7; /* 0x02B8 */ u8 m02B8; /* 0x02B9 */ u8 m02B9; - /* 0x02BA */ u8 m02BA[0x02CC - 0x02BA]; + /* 0x02BA */ u8 m02BA[0x02BC - 0x02BA]; + /* 0x02BC */ mDoExt_McaMorf* mpMorf; + /* 0x02C0 */ u8 m02C0[0x02CC - 0x02C0]; /* 0x02CC */ s16 m02CC; /* 0x02CE */ u8 m02CE[0x0302 - 0x02CE]; /* 0x0302 */ s16 m0302; @@ -30,7 +32,10 @@ public: /* 0x034F */ u8 m034F; /* 0x0350 */ dPa_smokeEcallBack m0350; /* 0x0370 */ damagereaction mDamageReaction; - /* 0x0B2C */ u8 m0B2C[0x0B44 - 0x0B2C]; + /* 0x0B2C */ u8 m0B2C[0x0B30 - 0x0B2C]; + /* 0x0B30 */ int m0B30; + /* 0x0B34 */ int m0B34; + /* 0x0B38 */ u8 m0B38[0x0B44 - 0x0B38]; /* 0x0B44 */ cXyz m0B44[2]; /* 0x0B5C */ u8 m0B5C[0x0B88 - 0x0B5C]; /* 0x0B88 */ dCcD_Cyl m0B88; @@ -44,7 +49,9 @@ public: /* 0x1200 */ u32 m1200; /* 0x1204 */ u8 m1204[0x121C - 0x1204]; /* 0x121C */ u8 m121C; - /* 0x121D */ u8 m121D[0x1264 - 0x121D]; + /* 0x121D */ u8 m121D[0x121F - 0x121D]; + /* 0x121F */ s8 m121F; + /* 0x1220 */ u8 m1220[0x1264 - 0x1220]; /* 0x1264 */ enemyice mEnemyIce; /* 0x161C */ enemyfire mEnemyFire; /* 0x1844 */ JntHit_c* mpJntHit; @@ -54,11 +61,169 @@ class bkHIO_c { public: bkHIO_c() { /* Nonmatching */ + m005 = 0x0; + m006 = 0x0; + m007 = 0x0; + m008 = 0x1; + m009 = 0x0; + m00A = 0x0; + m01C = 1.0f; + m020 = 25.0f; + m00C = 0x4; + m024 = 25.0f; + m028 = 1000.0f; + m02C = 400.0f; + m030 = 240.0f; + m034 = 0x6590; + m038 = 300.0f; + m03C = 500.0f; + m040 = 300.0f; + m044 = 500.0f; + m048 = -125.0f; + m04C = 12.0f; + m050 = 60.0f; + m054 = 45.0f; + m058 = 70.0f; + m05C = 90.0f; + m068 = 90.0f; + m06C = 2.0f; + m070 = 1.0f; + m074 = 1.5f; + m060 = 20.0f; + m064 = 20.0f; + m078 = 0x23; + m07C = 50.0f; + m080 = 25.0f; + m084 = 25.0f; + m088 = 50.0f; + m08C = 0x1e; + m08E = 0x12c; + m090 = 1.2f; + m094 = 1.0f; + m098 = 1.0f; + m09C = 10.0f; + m0A0 = 0x17; + m0A2 = 0x1; + m0A4 = 0x1; + m0A6 = 0x0; + m0A8 = 1.0f; + m0AC = 1.0f; + m0B0 = 0.5f; + m0B4 = 1.0f; + m0B8 = 1.0f; + m0BC = 1.0f; + m0C0 = 1.0f; + m0C4 = 1.0f; + m0C8 = 1.0f; + m0CC = 1.0f; + m0D0 = 0x5; + m0D2 = 0x1; + m0D4 = 0x1; + m0D6 = 0x1; + m0D8 = 1.0f; + m0DC = 1.0f; + m0E0 = 1.0f; + m0E4 = 0.8f; + m0E8 = 0.5f; + m0EC = 1.0f; + m0F0 = 1.0f; + m0F4 = 1.0f; + m0F8 = 1.0f; + m0FC = 1.0f; + m100 = -60.0f; + m018 = 0.7f; + m104 = 0xc8; + m106 = 0x1f4; + m108 = 0x12c; + m10A = 0x258; + m010 = 0.0f; + m014 = 400.0f; } virtual ~bkHIO_c() {} public: - // TODO + /* 0x004 */ u8 m004[0x005 - 0x004]; + /* 0x005 */ u8 m005; + /* 0x006 */ u8 m006; + /* 0x007 */ u8 m007; + /* 0x008 */ u8 m008; + /* 0x009 */ u8 m009; + /* 0x00A */ u8 m00A; + /* 0x00B */ u8 m00B[0x00C - 0x00B]; + /* 0x00C */ s16 m00C; + /* 0x00E */ u8 m00E[0x010 - 0x00E]; + /* 0x010 */ f32 m010; + /* 0x014 */ f32 m014; + /* 0x018 */ f32 m018; + /* 0x01C */ f32 m01C; + /* 0x020 */ f32 m020; + /* 0x024 */ f32 m024; + /* 0x028 */ f32 m028; + /* 0x02C */ f32 m02C; + /* 0x030 */ f32 m030; + /* 0x034 */ s16 m034; + /* 0x036 */ u8 m036[0x038 - 0x036]; + /* 0x038 */ f32 m038; + /* 0x03C */ f32 m03C; + /* 0x040 */ f32 m040; + /* 0x044 */ f32 m044; + /* 0x048 */ f32 m048; + /* 0x04C */ f32 m04C; + /* 0x050 */ f32 m050; + /* 0x054 */ f32 m054; + /* 0x058 */ f32 m058; + /* 0x05C */ f32 m05C; + /* 0x060 */ f32 m060; + /* 0x064 */ f32 m064; + /* 0x068 */ f32 m068; + /* 0x06C */ f32 m06C; + /* 0x070 */ f32 m070; + /* 0x074 */ f32 m074; + /* 0x078 */ s16 m078; + /* 0x07A */ u8 m07A[0x07C - 0x07A]; + /* 0x07C */ f32 m07C; + /* 0x080 */ f32 m080; + /* 0x084 */ f32 m084; + /* 0x088 */ f32 m088; + /* 0x08C */ s16 m08C; + /* 0x08E */ s16 m08E; + /* 0x090 */ f32 m090; + /* 0x094 */ f32 m094; + /* 0x098 */ f32 m098; + /* 0x09C */ f32 m09C; + /* 0x0A0 */ s16 m0A0; + /* 0x0A2 */ s16 m0A2; + /* 0x0A4 */ s16 m0A4; + /* 0x0A6 */ s16 m0A6; + /* 0x0A8 */ f32 m0A8; + /* 0x0AC */ f32 m0AC; + /* 0x0B0 */ f32 m0B0; + /* 0x0B4 */ f32 m0B4; + /* 0x0B8 */ f32 m0B8; + /* 0x0BC */ f32 m0BC; + /* 0x0C0 */ f32 m0C0; + /* 0x0C4 */ f32 m0C4; + /* 0x0C8 */ f32 m0C8; + /* 0x0CC */ f32 m0CC; + /* 0x0D0 */ s16 m0D0; + /* 0x0D2 */ s16 m0D2; + /* 0x0D4 */ s16 m0D4; + /* 0x0D6 */ s16 m0D6; + /* 0x0D8 */ f32 m0D8; + /* 0x0DC */ f32 m0DC; + /* 0x0E0 */ f32 m0E0; + /* 0x0E4 */ f32 m0E4; + /* 0x0E8 */ f32 m0E8; + /* 0x0EC */ f32 m0EC; + /* 0x0F0 */ f32 m0F0; + /* 0x0F4 */ f32 m0F4; + /* 0x0F8 */ f32 m0F8; + /* 0x0FC */ f32 m0FC; + /* 0x100 */ f32 m100; + /* 0x104 */ s16 m104; + /* 0x106 */ s16 m106; + /* 0x108 */ s16 m108; + /* 0x10A */ s16 m10A; }; #endif /* D_A_BK_H */ diff --git a/include/d/actor/d_a_boko.h b/include/d/actor/d_a_boko.h index 70832013e..006294e34 100644 --- a/include/d/actor/d_a_boko.h +++ b/include/d/actor/d_a_boko.h @@ -32,12 +32,20 @@ public: void getJumpBlurRate() {} void getNowMode() {} void getSeType() {} - void moveStateInit(float, float, short) {} + void moveStateInit(f32 speedForward, f32 speedY, s16 angleY) { + speed.y = speedY; + speedF = speedForward; + current.angle.y = angleY; + } void onFloorFlg() {} - void setMatrix(float(*)[4]) {} + void setMatrix(Mtx mtx) { + if (mpModel) { + mpModel->setBaseTRMtx(mtx); + } + } void setNowMode(int) {} - void setRotAngleSpeed(short) {} - void setThrow(short) {} + void setRotAngleSpeed(s16 speed) { m2C2 = speed; } + void setThrow(s16) {} void getTopPos(cXyz *); void getBlurRootPos(cXyz *); diff --git a/src/d/actor/d_a_bk.cpp b/src/d/actor/d_a_bk.cpp index 98fb6a4a4..e9b6e53a4 100644 --- a/src/d/actor/d_a_bk.cpp +++ b/src/d/actor/d_a_bk.cpp @@ -11,17 +11,160 @@ #include "d/actor/d_a_obj_search.h" #include "d/actor/d_a_item.h" #include "d/d_item_data.h" +#include "d/actor/d_a_boko.h" +#include "d/d_bg_s_lin_chk.h" +#include "m_Do/m_Do_mtx.h" +#include "d/actor/d_a_player.h" static bkHIO_c l_bkHIO; +enum BK_RES_FILE_ID { // IDs and indexes are synced + /* BAS */ + BK_BAS_BK_AOMUKE=0x8, + BK_BAS_BK_ATTACK1=0x9, + BK_BAS_BK_ATTACK2=0xA, + BK_BAS_BK_ATTACK3=0xB, + BK_BAS_BK_BOKKURI=0xC, + BK_BAS_BK_CATCH=0xD, + BK_BAS_BK_HAKKEN=0xE, + BK_BAS_BK_IATTACK1=0xF, + BK_BAS_BK_JATTACK2=0x10, + BK_BAS_BK_JATTACK3=0x11, + BK_BAS_BK_JUMP1=0x12, + BK_BAS_BK_JUMP2=0x13, + BK_BAS_BK_KERI1=0x14, + BK_BAS_BK_KERI2=0x15, + BK_BAS_BK_KYORO1=0x16, + BK_BAS_BK_KYORO2=0x17, + BK_BAS_BK_NIGERU=0x18, + BK_BAS_BK_NOBI=0x19, + BK_BAS_BK_NOMWAIT=0x1A, + BK_BAS_BK_OKIRUA=0x1B, + BK_BAS_BK_OKIRUU=0x1C, + BK_BAS_BK_OTISOU1=0x1D, + BK_BAS_BK_OTISOU2=0x1E, + BK_BAS_BK_RUN=0x1F, + BK_BAS_BK_SLEEP=0x20, + BK_BAS_BK_SUWARI=0x21, + BK_BAS_BK_TUTUKU1=0x22, + BK_BAS_BK_UTUBUSE=0x23, + BK_BAS_BK_WAIT=0x24, + BK_BAS_BK_WALK=0x25, + BK_BAS_BK_WALK2=0x26, + + /* BCK */ + BK_BCK_BK_AOMUKE=0x29, + BK_BCK_BK_ATTACK1=0x2A, + BK_BCK_BK_ATTACK2=0x2B, + BK_BCK_BK_ATTACK3=0x2C, + BK_BCK_BK_BIKKURI=0x2D, + BK_BCK_BK_BOUGYO1=0x2E, + BK_BCK_BK_BOUGYO2=0x2F, + BK_BCK_BK_CATCH=0x30, + BK_BCK_BK_HAKKEN=0x31, + BK_BCK_BK_HAKOBI=0x32, + BK_BCK_BK_HIDARIROT=0x33, + BK_BCK_BK_JATTACK1=0x34, + BK_BCK_BK_JATTACK2=0x35, + BK_BCK_BK_JATTACK3=0x36, + BK_BCK_BK_JUMP1=0x37, + BK_BCK_BK_JUMP2=0x38, + BK_BCK_BK_KERI1=0x39, + BK_BCK_BK_KERI2=0x3A, + BK_BCK_BK_KIME=0x3B, + BK_BCK_BK_KOUKA=0x3C, + BK_BCK_BK_KYORO1=0x3D, + BK_BCK_BK_KYORO2=0x3E, + BK_BCK_BK_MIGIROT=0x3F, + BK_BCK_BK_NIGERU=0x40, + BK_BCK_BK_NOBI=0x41, + BK_BCK_BK_NOMWAIT=0x42, + BK_BCK_BK_NOZOKU=0x43, + BK_BCK_BK_OKIRUA=0x44, + BK_BCK_BK_OKIRUU=0x45, + BK_BCK_BK_OTISOU1=0x46, + BK_BCK_BK_OTISOU2=0x47, + BK_BCK_BK_RUN=0x48, + BK_BCK_BK_SLEEP=0x49, + BK_BCK_BK_SUWARI=0x4A, + BK_BCK_BK_TATAKU=0x4B, + BK_BCK_BK_TUTUKU1=0x4C, + BK_BCK_BK_TUTUKU2=0x4D, + BK_BCK_BK_TUTUKU3=0x4E, + BK_BCK_BK_TYAKU=0x4F, + BK_BCK_BK_UTUBUSE=0x50, + BK_BCK_BK_WAIT=0x51, + BK_BCK_BK_WALK=0x52, + BK_BCK_BK_WALK2=0x53, + + /* BDLM */ + BK_BDL_BK=0x56, + BK_BDL_BOUEN=0x57, + + /* BMD */ + BK_BMD_BK_KB=0x5A, + BK_BMD_BK_TATE=0x5B, + + /* BMT */ + BK_BMT_BK_BOKO=0x5E, + BK_BMT_BK_KEN=0x5F, + BK_BMT_GREEN=0x60, + BK_BMT_PINK=0x61, + + /* BTP */ + BK_BTP_TMABATAKI=0x64, +}; + /* 000000EC-00000234 .text anm_init__FP8bk_classifUcfi */ -static void anm_init(bk_class* i_this, int, f32, u8, f32, int) { - /* Nonmatching */ +static void anm_init(bk_class* i_this, int bckFileIdx, f32 morf, u8 loopMode, f32 speed, int soundFileIdx) { + if (i_this->mDamageReaction.mState == 0x13 && bckFileIdx != BK_BCK_BK_OTISOU1 && bckFileIdx != BK_BCK_BK_OTISOU2) { + return; + } + if (soundFileIdx >= 0) { + void* soundAnm = dComIfG_getObjectRes("AM2", soundFileIdx); + J3DAnmTransform* bckAnm = (J3DAnmTransform*)dComIfG_getObjectRes("AM2", bckFileIdx); + i_this->mpMorf->setAnm(bckAnm, loopMode, morf, speed, 0.0f, -1.0f, soundAnm); + } else { + J3DAnmTransform* bckAnm = (J3DAnmTransform*)dComIfG_getObjectRes("AM2", bckFileIdx); + i_this->mpMorf->setAnm(bckAnm, loopMode, morf, speed, 0.0f, -1.0f, NULL); + } } /* 00000234-000005A8 .text yari_off_check__FP8bk_class */ static void yari_off_check(bk_class* i_this) { - /* Nonmatching */ + if (i_this->m0B34 == 0) { + return; + } + + daBoko_c* boko = (daBoko_c*)fopAcM_SearchByID(i_this->m1200); + if (boko) { + daPy_py_c* player = (daPy_py_c*)dComIfGp_getPlayer(0); + fopAcM_cancelCarryNow(boko); + + if (i_this->m0B34 != 2) { + boko->setRotAngleSpeed(cM_rndFX(2000.0f)); + s16 angleY = i_this->shape_angle.y + 0x8000 + (s16)cM_rndFX(8000.0f); + f32 speedY = 20.0f + cM_rndF(20.0f); + f32 speedForward = 20.0f + cM_rndF(10.0f); + boko->moveStateInit(speedForward, speedY, angleY); + } + boko->current.angle.y = player->shape_angle.y; + + dBgS_LinChk linChk; + linChk.Set(&i_this->mEyePos, &boko->current.pos, i_this); + if (dComIfG_Bgsp()->LineCross(&linChk)) { + MtxP mtx = i_this->mpMorf->getModel()->getAnmMtx(0x10); // mune (chest) joint + cMtx_copy(mtx, *calc_mtx); + boko->setMatrix(*calc_mtx); + cXyz offset; + offset.set(0.0f, 0.0f, 0.0f); + MtxPosition(&offset, &boko->current.pos); + } + } + + i_this->m121F = 1; + i_this->m0B34 = 0; + i_this->m0B30 = 0; } /* 00000A1C-00000EE8 .text smoke_set_s__FP8bk_classf */ @@ -79,9 +222,22 @@ static void daBk_other_bg_check(bk_class* i_this, fopAc_ac_c*) { /* Nonmatching */ } +static fopAc_ac_c* target_info[10]; +static s32 target_info_count; + /* 00002C4C-00002CD4 .text s_w_sub__FPvPv */ -static void s_w_sub(void*, void*) { - /* Nonmatching */ +static void* s_w_sub(void* param_1, void*) { + if (fopAc_IsActor(param_1) && fopAcM_GetName(param_1) == PROC_BOKO) { + daBoko_c* boko = (daBoko_c*)param_1; + // TODO: enum for boko type + if (fopAcM_GetParam(boko) != 4 && !fopAcM_checkCarryNow(boko)) { + if (target_info_count < (s32)ARRAY_SIZE(target_info)) { + target_info[target_info_count] = boko; + target_info_count++; + } + } + } + return NULL; } /* 00002CD4-00002FB0 .text search_wepon__FP8bk_class */ @@ -327,8 +483,9 @@ static void rope_on(bk_class* i_this) { } /* 0000AC6C-0000AC84 .text search_target__FP8bk_class */ -static void search_target(bk_class* i_this) { - /* Nonmatching */ +static BOOL search_target(bk_class* i_this) { + i_this->mDamageReaction.m714 = dComIfGp_getPlayer(0); + return FALSE; } /* 0000AC84-0000B25C .text Bk_move__FP8bk_class */