diff --git a/include/d/actor/d_a_player_main.h b/include/d/actor/d_a_player_main.h index fd95dc1c8..844528799 100644 --- a/include/d/actor/d_a_player_main.h +++ b/include/d/actor/d_a_player_main.h @@ -1519,7 +1519,7 @@ public: BOOL procBoomerangMove(); BOOL procBoomerangCatch_init(); BOOL procBoomerangCatch(); - void bowJointCB(int); + BOOL bowJointCB(int); BOOL bowButton() const; BOOL checkBowReadyAnime() const; BOOL checkBowAnime() const; diff --git a/src/d/actor/d_a_player_bow.inc b/src/d/actor/d_a_player_bow.inc index 7b6512cca..d250ebbf0 100644 --- a/src/d/actor/d_a_player_bow.inc +++ b/src/d/actor/d_a_player_bow.inc @@ -2,25 +2,49 @@ * d_a_player_bow.inc * * Code relating to the Bow item. - * - * This file is not a standalone translation unit and is instead directly + * + * This file is not a standalone translation unit and is instead directly * included into d_a_player_main.cpp. - * + * * The original name of this file is known because of an assert contained within * a function from this file. */ -#include "d/actor/d_a_player_main.h" +#include "d/actor/d_a_arrow.h" #include "d/actor/d_a_player_HIO.h" +#include "d/actor/d_a_player_main.h" +#include "d/d_procname.h" /* 80149ECC-80149F88 .text bowJointCB__9daPy_lk_cFi */ -void daPy_lk_c::bowJointCB(int) { - /* Nonmatching */ +BOOL daPy_lk_c::bowJointCB(int param_0) { + /* Nonmatching - floats */ + if (checkBowReadyAnime()) { + return true; + } else { + if (param_0 == 6) { + mDoMtx_trans(mDoMtx_stack_c::now, 0.0f, 4.5f, 4.5f); + mDoMtx_concat(mpEquipItemModel->getAnmMtx(6), mDoMtx_stack_c::now, + mDoMtx_stack_c::now); + mpEquipItemModel->setAnmMtx(param_0, mDoMtx_stack_c::now); + } else { + mpEquipItemModel->setAnmMtx(11, mpEquipItemModel->getAnmMtx(6)); + } + } + return true; } /* 80149F88-80149FD0 .text daPy_bowJointCB__FP7J3DNodei */ -static BOOL daPy_bowJointCB(J3DNode*, int) { - /* Nonmatching */ +static BOOL daPy_bowJointCB(J3DNode *node, int calcTiming) { + if (calcTiming == J3DNodeCBCalcTiming_In) { + J3DJoint *joint = static_cast(node); + s32 jntNo = joint->getJntNo(); + J3DModel *model = j3dSys.getModel(); + daPy_lk_c *i_this = reinterpret_cast(model->getUserArea()); + if (i_this != 0) { + i_this->bowJointCB(jntNo); + } + } + return TRUE; } /* 80149FD0-8014A008 .text bowButton__9daPy_lk_cCFv */ @@ -34,66 +58,206 @@ BOOL daPy_lk_c::bowButton() const { /* 8014A008-8014A02C .text checkBowReadyAnime__9daPy_lk_cCFv */ BOOL daPy_lk_c::checkBowReadyAnime() const { - /* Nonmatching */ + return (m_anm_heap_upper[UPPER_MOVE2_e].mIdx == LKANM_BCK_ARROWRELORD) || + (m_anm_heap_upper[UPPER_MOVE2_e].mIdx == LKANM_BCK_BOWWAIT); } /* 8014A02C-8014A080 .text checkBowAnime__9daPy_lk_cCFv */ BOOL daPy_lk_c::checkBowAnime() const { - /* Nonmatching */ + return (checkBowReadyAnime()) || + (m_anm_heap_upper[UPPER_MOVE2_e].mIdx == LKANM_BCK_ARROWSHOOT); } /* 8014A080-8014A180 .text makeArrow__9daPy_lk_cFv */ -void daPy_lk_c::makeArrow() { - /* Nonmatching */ +void daPy_lk_c::makeArrow() { + /* Nonmatching */ } /* 8014A180-8014A1CC .text deleteArrow__9daPy_lk_cFv */ void daPy_lk_c::deleteArrow() { - /* Nonmatching */ + fopAc_ac_c *pfVar1 = mActorKeepEquip.getActor(); + + if ((pfVar1 != NULL) && (fopAcM_GetName(pfVar1) == PROC_ARROW)) { + fopAcM_delete(pfVar1); + mActorKeepEquip.clearData(); + } + return; } /* 8014A1CC-8014A2A0 .text setBowReadyAnime__9daPy_lk_cFv */ void daPy_lk_c::setBowReadyAnime() { - /* Nonmatching */ + setActAnimeUpper(LKANM_BCK_ARROWSHOOT, UPPER_MOVE2_e, 1.0f, + daPy_HIO_bow_c0::m.field_0x0 - 0.001f, + daPy_HIO_bow_c0::m.field_0x0, 10.0f); + mSwordAnim.changeBckOnly(getItemAnimeResource(LKANM_BCK_ARROWSHOOTA)); + m35EC = daPy_HIO_bow_c0::m.field_0x0 - 0.001f; + setPriTextureAnime(0x70, 0); + m355E = 10; + seStartOnlyReverb(JA_SE_LK_ITEM_TAKEOUT); + return; } /* 8014A2A0-8014A328 .text setBowReloadAnime__9daPy_lk_cFv */ void daPy_lk_c::setBowReloadAnime() { - /* Nonmatching */ + setActAnimeUpper( + LKANM_BCK_ARROWRELORD, UPPER_MOVE2_e, daPy_HIO_bow_c0::m.field_0x10, + daPy_HIO_bow_c0::m.field_0x14, daPy_HIO_bow_c0::m.field_0x2, + daPy_HIO_bow_c0::m.field_0x18); + setPriTextureAnime(0x8d, 0); + mSwordAnim.changeBckOnly(getItemAnimeResource(LKANM_BCK_ARROWRELORDA)); + m35EC = 0.0f; + seStartOnlyReverb(JA_SE_LK_DRAW_BOW); + return; } /* 8014A328-8014A60C .text checkNextActionBowReady__9daPy_lk_cFv */ BOOL daPy_lk_c::checkNextActionBowReady() { - /* Nonmatching */ + /* Nonmatching - branching, regalloc */ + u16 uVar1 = m_anm_heap_upper[UPPER_MOVE2_e].mIdx; + if (uVar1 == LKANM_BCK_BOWWAIT) { + daArrow_c *bow = (daArrow_c *)mActorKeepEquip.getActor(); + if (m355C != 0) { + setActAnimeUpper( + LKANM_BCK_ARROWSHOOT, UPPER_MOVE2_e, + daPy_HIO_bow_c0::m.field_0x4, daPy_HIO_bow_c0::m.field_0x8, + daPy_HIO_bow_c0::m.field_0x0, daPy_HIO_bow_c0::m.field_0xC); + setPriTextureAnime(0x70, 0); + mSwordAnim.changeBckOnly( + getItemAnimeResource(LKANM_BCK_ARROWSHOOTA)); + m35EC = 0.0f; + } else { + if (bowButton() == NULL) { + if (bow != NULL) { + fopAcM_SetParam(bow, 1); + if (mDemo.getDemoMode() != 0x44) { + dComIfGp_setItemArrowNumCount(-1); + } + mActorKeepEquip.clearData(); + seStartOnlyReverb(JA_SE_LK_SHOOT_ARROW); + voiceStart(41); + onResetFlg0(daPyRFlg0_ARROW_SHOOT); + } + m355C = 1; + } else { + if (bow->changeArrowMp()) { + if (((mEquipItem != dItem_BOW_e) && + (dComIfGp_setRStatus(0x22), spActionTrigger())) && + (bow != NULL)) { + bow = bow->changeArrowType(); + mActorKeepEquip.setData(bow); + setBowReloadAnime(); + } + } + } + } + goto LAB_8014a5ec; + } + if (uVar1 == LKANM_BCK_ARROWRELORD) { + if (mFrameCtrlUpper[UPPER_MOVE2_e].getRate() < 0.01f) { + setActAnimeUpper(LKANM_BCK_BOWWAIT, UPPER_MOVE2_e, 1.0f, 0.0f, -1, + -1.0f); + mSwordAnim.changeBckOnly(getItemAnimeResource(LKANM_BCK_BOWWAITA)); + m35EC = 0.0f; + setPriTextureAnime(0x70, 0); + } + goto LAB_8014a5ec; + } + if (uVar1 != LKANM_BCK_ARROWSHOOT) + goto LAB_8014a5ec; + if (mFrameCtrlUpper[UPPER_MOVE2_e].getRate() < 0.01f) { + if ((m355E == 0) && (bowButton())) { + if (mDemo.getDemoMode() != 0x44) { + if (mEquipItem != getReadyItem()) + goto LAB_8014a5a0; + } + if (!checkNoResetFlg1(daPyFlg1_USE_ARROW_EFFECT)) { + setBowReloadAnime(); + makeArrow(); + if (mActorKeepEquip.getActor() == NULL) { + mDoAud_seStart(JA_SE_ITEM_TARGET_OUT); + } + goto LAB_8014a5d8; + } + } + LAB_8014a5a0: + daArrow_c *bow; + if (bow->changeArrowMp()) { + if ((mEquipItem != dItem_BOW_e) && + (dComIfGp_setRStatus(0x22), spActionTrigger())) { + bow->changeArrowTypeNotReady(); + } + } + } +LAB_8014a5d8: + if (m355E != 0) { + m355E--; + } +LAB_8014a5ec: + cancelItemUpperReadyAnime(); + return; } /* 8014A60C-8014A680 .text checkNextActionBowFly__9daPy_lk_cFv */ BOOL daPy_lk_c::checkNextActionBowFly() { - /* Nonmatching */ + if (checkBowAnime()) { + checkNextActionBowReady(); + } else { + if ((itemTrigger()) && (mEquipItem == getReadyItem())) { + setBowReadyAnime(); + m355E = 0; + } + } + return; } /* 8014A680-8014A6F4 .text checkNextBowMode__9daPy_lk_cFv */ BOOL daPy_lk_c::checkNextBowMode() { - /* Nonmatching */ + if (mpAttention->Lockon()) { + procBowMove_init(); + } else { + procBowSubject_init(); + } + return; } /* 8014A6F4-8014A834 .text setBowModel__9daPy_lk_cFv */ void daPy_lk_c::setBowModel() { - /* Nonmatching */ + /* Nonmatching - regalloc */ + J3DAnmTransform *bck = getItemAnimeResource(LKANM_BCK_ARROWRELORDA); + JKRHeap *oldHeap = setItemHeap(); + J3DModelData *tmp_modelData = + initModel(&mpEquipItemModel, LINK_BDL_BOW, 0x37221222); + int ret = mSwordAnim.init(tmp_modelData, bck, false, + J3DFrameCtrl::EMode_LOOP, 1.0f, 0, -1, false); + if (!ret) { + JUT_ASSERT(394, FALSE); + } + mDoExt_setCurrentHeap(oldHeap); + m35EC = 0.0f; + J3DMaterial *mesh = mpEquipItemModel->getModelData() + ->getJointNodePointer(0x00) + ->getMesh() + ->getNext(); + mesh->getNext()->getShape()->show(); + mesh->getShape()->hide(); + tmp_modelData->getJointNodePointer(6)->setCallBack(daPy_bowJointCB); + tmp_modelData->getJointNodePointer(11)->setCallBack(daPy_bowJointCB); + mpEquipItemModel->setUserArea(reinterpret_cast(this)); } /* 8014A834-8014A8D4 .text procBowSubject_init__9daPy_lk_cFv */ BOOL daPy_lk_c::procBowSubject_init() { - if(mCurProc == daPyProc_BOW_SUBJECT_e) { + if (mCurProc == daPyProc_BOW_SUBJECT_e) { return false; } commonProcInit(daPyProc_BOW_SUBJECT_e); - if(!checkBowAnime()) { + if (!checkBowAnime()) { setBowReadyAnime(); } - setSingleMoveAnime(ANM_ATNRS, 0.0f, 0.0f, -1, daPy_HIO_basic_c0::m.field_0xC); + setSingleMoveAnime(ANM_ATNRS, 0.0f, 0.0f, -1, + daPy_HIO_basic_c0::m.field_0xC); mVelocity = 0.0f; @@ -106,11 +270,11 @@ BOOL daPy_lk_c::procBowSubject_init() { BOOL daPy_lk_c::procBowSubject() { dComIfGp_setDoStatus(7); - if(mpAttention->Lockon()) { + if (mpAttention->Lockon()) { setSpeedAndAngleAtn(); } - if(checkNextMode(0) == 0) { + if (!checkNextMode(0)) { setBodyAngleToCamera(); m35EC = mFrameCtrlUpper[UPPER_MOVE2_e].getFrame(); } @@ -120,10 +284,51 @@ BOOL daPy_lk_c::procBowSubject() { /* 8014A974-8014AA2C .text procBowMove_init__9daPy_lk_cFv */ BOOL daPy_lk_c::procBowMove_init() { - /* Nonmatching */ + if (mCurProc == daPyProc_BOW_MOVE_e) { + return false; + } else { + commonProcInit(daPyProc_BOW_MOVE_e); + if (m34B8 == 2) { + current.angle.y = shape_angle.y + 0x4000; + } else { + m34B8 = 3; + current.angle.y = shape_angle.y + -0x4000; + } + if (!checkBowAnime()) { + setBowReadyAnime(); + } + setBlendAtnMoveAnime(daPy_HIO_basic_c0::m.field_0xC); + dComIfGp_setPlayerStatus0(0, daPyStts0_BOW_AIM_e); + return true; + } } /* 8014AA2C-8014AB5C .text procBowMove__9daPy_lk_cFv */ BOOL daPy_lk_c::procBowMove() { - /* Nonmatching */ + if (mpAttnActorLockOn != NULL) { + setSpeedAndAngleAtnActor(); + } else { + if ((!mpAttention->Lockon()) && (mActorKeepEquip.getActor() == NULL)) { + resetActAnimeUpper(UPPER_MOVE2_e, -1.0f); + } else { + setSpeedAndAngleAtn(); + } + } + if (!checkNextMode(0)) { + f32 fVar1 = -1.0f; + if (std::fabsf(mVelocity) < 0.001f) { + onModeFlg(ModeFlg_00000001); + if (m34B8 != 3) { + m34B8 = 3; + fVar1 = daPy_HIO_basic_c0::m.field_0xC; + } + current.angle.y = shape_angle.y + -0x4000; + } else { + offModeFlg(ModeFlg_00000001); + } + setBlendAtnMoveAnime(fVar1); + setBodyAngleXReadyAnime(); + m35EC = mFrameCtrlUpper[UPPER_MOVE2_e].getFrame(); + } + return true; }