diff --git a/include/d/actor/d_a_player.h b/include/d/actor/d_a_player.h index 772f663ee..2134389f6 100644 --- a/include/d/actor/d_a_player.h +++ b/include/d/actor/d_a_player.h @@ -88,6 +88,7 @@ public: daPyFlg0_UNK4 = 0x00000004, daPyFlg0_UNK8 = 0x00000008, daPyFlg0_DEKU_SP_RETURN_FLG = 0x00000010, + daPyFlg0_UNK20 = 0x00000020, daPyFlg0_CUT_AT_FLG = 0x00000040, daPyFlg0_UNK80 = 0x00000080, daPyFlg0_UNK100 = 0x00000100, diff --git a/include/d/actor/d_a_player_main.h b/include/d/actor/d_a_player_main.h index 5a6eb35e6..21949ff72 100644 --- a/include/d/actor/d_a_player_main.h +++ b/include/d/actor/d_a_player_main.h @@ -1508,11 +1508,11 @@ public: BOOL procRopeUpHang(); BOOL checkBoomerangAnime() const; void throwBoomerang(); - void returnBoomerang(); + int returnBoomerang(); BOOL checkNextActionBoomerangReady(); BOOL checkNextActionBoomerangFly(); BOOL checkNextBoomerangMode(); - void changeBoomerangCatchProc(); + int changeBoomerangCatchProc(); BOOL procBoomerangSubject_init(); BOOL procBoomerangSubject(); BOOL procBoomerangMove_init(); diff --git a/src/d/actor/d_a_player_boomerang.inc b/src/d/actor/d_a_player_boomerang.inc index 2365a9bd6..81a6df010 100644 --- a/src/d/actor/d_a_player_boomerang.inc +++ b/src/d/actor/d_a_player_boomerang.inc @@ -2,56 +2,153 @@ * d_a_player_boomerang.inc * * Code relating to the Boomerang 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 not known, but a best guess was taken + * + * The original name of this file is not known, but a best guess was taken * based on the original names of the functions it contains. */ #include "d/actor/d_a_boomerang.h" -#include "d/actor/d_a_player_main.h" #include "d/actor/d_a_player_HIO.h" +#include "d/actor/d_a_player_main.h" /* 8014956C-80149590 .text checkBoomerangAnime__9daPy_lk_cCFv */ BOOL daPy_lk_c::checkBoomerangAnime() const { - /* Nonmatching */ + return ((checkBoomerangReadyAnime()) || (checkBoomerangThrowAnime())); } /* 80149590-80149698 .text throwBoomerang__9daPy_lk_cFv */ void daPy_lk_c::throwBoomerang() { - /* Nonmatching */ + daBoomerang_c *boomerang = (daBoomerang_c *)mActorKeepEquip.getActor(); + + fopAcM_SetParam(boomerang, 1); + if (mpAttnActorLockOn != NULL) { + boomerang->setAimActor(mpAttnActorLockOn); + } + boomerang->shape_angle.y = shape_angle.y; + mActorKeepThrow = mActorKeepEquip; + mActorKeepEquip.clearData(); + mEquipItem = daPyItem_NONE_e; + dComIfGp_setPlayerStatus0(0, daPyStts0_BOOMERANG_WAIT_e); + shape_angle.y += mBodyAngle.y; + current.angle.y = shape_angle.y; + mBodyAngle.y = 0; + voiceStart(0); + if (dComIfGp_checkPlayerStatus0(0, daPyStts0_SHIP_RIDE_e)) { + dComIfGp_clearPlayerStatus0(0, daPyStts0_BOOMERANG_AIM_e); + offModeFlg(ModeFlg_SUBJECT); + onModeFlg(ModeFlg_00000080); + } else { + if (mAcch.ChkGroundHit()) { + procWait_init(); + } + } + return; } /* 80149698-801497A4 .text returnBoomerang__9daPy_lk_cFv */ -void daPy_lk_c::returnBoomerang() { - /* Nonmatching */ +int daPy_lk_c::returnBoomerang() { + dComIfGp_clearPlayerStatus0(0, daPyStts0_BOOMERANG_WAIT_e); + if (mEquipItem == daPyItem_NONE_e) { + if (daPy_getPlayerActorClass() == this) { + if (!dComIfGp_event_runCheck()) { + if (mDemo.getDemoType() == 0) { + if ((m_anm_heap_upper[UPPER_MOVE2_e].mIdx == 0xffff || + (checkPlayerGuard())) || + ((m_anm_heap_upper[UPPER_MOVE2_e].mIdx == + LKANM_BCK_DAMDASH || + (checkBoomerangAnime())))) { + if ((!(checkModeFlg(ModeFlg_WHIDE | ModeFlg_ROPE | + ModeFlg_IN_SHIP | ModeFlg_CLIMB | + ModeFlg_SWIM | ModeFlg_00080000 | + ModeFlg_GRAB | ModeFlg_PUSHPULL | + ModeFlg_LADDER | ModeFlg_CROUCH | + ModeFlg_CRAWL)) || + (mCurProc == daPyProc_SHIP_BOOMERANG_e))) { + mActorKeepEquip = mActorKeepThrow; + mActorKeepThrow.clearData(); + mEquipItem = dItem_BOOMERANG_e; + onNoResetFlg0(daPyFlg0_UNK20); + return true; + } + } + } + } + } + } + mActorKeepThrow.clearData(); + return false; } /* 801497A4-8014984C .text checkNextActionBoomerangReady__9daPy_lk_cFv */ BOOL daPy_lk_c::checkNextActionBoomerangReady() { - /* Nonmatching */ + if ((!itemButton()) && + ((mpAttnActorLockOn != NULL || + (dComIfGp_checkCameraAttentionStatus(mCameraInfoIdx, 0x10))))) { + setActAnimeUpper( + LKANM_BCK_BOOMTHROW, UPPER_MOVE2_e, daPy_HIO_boom_c0::m.field_0x4, + daPy_HIO_boom_c0::m.field_0x8, daPy_HIO_boom_c0::m.field_0x0, + daPy_HIO_boom_c0::m.field_0xC); + setPriTextureAnime(0x48, 0); + return true; + } + return cancelItemUpperReadyAnime(); } /* 8014984C-801498D8 .text checkNextActionBoomerangFly__9daPy_lk_cFv */ BOOL daPy_lk_c::checkNextActionBoomerangFly() { - /* Nonmatching */ + if (checkBoomerangReadyAnime()) { + checkNextActionBoomerangReady(); + } else { + if ((itemTrigger()) && (mEquipItem == getReadyItem())) { + setActAnimeUpper(LKANM_BCK_BOOMWAIT, UPPER_MOVE2_e, + daPy_HIO_boom_c0::m.field_0x18, 0.0f, -1, + daPy_HIO_basic_c0::m.field_0xC); + } + } + return; } /* 801498D8-80149964 .text checkNextBoomerangMode__9daPy_lk_cFv */ BOOL daPy_lk_c::checkNextBoomerangMode() { - /* Nonmatching */ + if (!checkBoomerangAnime()) { + seStartOnlyReverb(JA_SE_LK_ITEM_TAKEOUT); + } + if (mpAttention->Lockon()) { + procBoomerangMove_init(); + } else { + procBoomerangSubject_init(); + } + return; } /* 80149964-80149A44 .text changeBoomerangCatchProc__9daPy_lk_cFv */ -void daPy_lk_c::changeBoomerangCatchProc() { - /* Nonmatching */ +int daPy_lk_c::changeBoomerangCatchProc() { + if (checkNoResetFlg0(daPyFlg0_UNK20)) { + if ((((!dComIfGp_event_runCheck()) && (mDemo.getDemoType() == 0)) && + (checkModeFlg(ModeFlg_00020000))) && + ((m_anm_heap_upper[UPPER_MOVE2_e].mIdx == 0xffff || + (checkBoomerangThrowAnime())))) { + setActAnimeUpper( + LKANM_BCK_BOOMCATCH, UPPER_MOVE2_e, + daPy_HIO_boom_c0::m.field_0x20, daPy_HIO_boom_c0::m.field_0x24, + daPy_HIO_boom_c0::m.field_0x2, daPy_HIO_boom_c0::m.field_0x28); + setPriTextureAnime(0x49, 0); + seStartOnlyReverb(JA_SE_LK_BOOM_CATCH); + if (checkModeFlg(ModeFlg_00000001)) { + return procBoomerangCatch_init(); + } + } + offNoResetFlg0(daPyFlg0_UNK20); + } + return false; } /* 80149A44-80149AF0 .text procBoomerangSubject_init__9daPy_lk_cFv */ BOOL daPy_lk_c::procBoomerangSubject_init() { - if(mCurProc == daPyProc_BOOMERANG_SUBJECT_e) { + if (mCurProc == daPyProc_BOOMERANG_SUBJECT_e) { return false; } @@ -60,7 +157,8 @@ BOOL daPy_lk_c::procBoomerangSubject_init() { mVelocity = 0.0f; setActAnimeUpper(LKANM_BCK_BOOMWAIT, UPPER_MOVE2_e, 0.0f, 0.0f, -1, -1.0f); - 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); dComIfGp_setPlayerStatus0(0, daPyStts0_BOOMERANG_AIM_e); @@ -71,32 +169,32 @@ BOOL daPy_lk_c::procBoomerangSubject_init() { /* 80149AF0-80149C00 .text procBoomerangSubject__9daPy_lk_cFv */ BOOL daPy_lk_c::procBoomerangSubject() { - if(!checkItemModeActorPointer()) { + if (!checkItemModeActorPointer()) { return true; } - if(checkBoomerangReadyAnime()) { + if (checkBoomerangReadyAnime()) { dComIfGp_setDoStatus(7); } setShapeAngleToAtnActor(); - if(mpAttention->Lockon()) { + if (mpAttention->Lockon()) { setSpeedAndAngleAtn(); } - if(checkNextMode(0) == 0) { - if(setBodyAngleToCamera()) { - daBoomerang_c* boomerang = (daBoomerang_c*)mActorKeepEquip.getActor(); - if(boomerang != NULL) { + if (checkNextMode(0) == 0) { + if (setBodyAngleToCamera()) { + daBoomerang_c *boomerang = + (daBoomerang_c *)mActorKeepEquip.getActor(); + if (boomerang != NULL) { cXyz sight; checkSightLine(boomerang->getFlyMax(), &sight); mSightPacket.setPos(&sight); mSightPacket.onDrawFlg(); } } - } - else { + } else { mSightPacket.offDrawFlg(); } @@ -105,20 +203,77 @@ BOOL daPy_lk_c::procBoomerangSubject() { /* 80149C00-80149CC8 .text procBoomerangMove_init__9daPy_lk_cFv */ BOOL daPy_lk_c::procBoomerangMove_init() { - /* Nonmatching */ + if (mCurProc == daPyProc_BOOMERANG_MOVE_e) { + return false; + } else { + commonProcInit(daPyProc_BOOMERANG_MOVE_e); + if (m34B8 == 2) { + current.angle.y = shape_angle.y + 0x4000; + } else { + m34B8 = 3; + current.angle.y = shape_angle.y + -0x4000; + } + setActAnimeUpper(LKANM_BCK_BOOMWAIT, UPPER_MOVE2_e, + daPy_HIO_boom_c0::m.field_0x18, 0.0f, -1, -1.0f); + setBlendAtnMoveAnime(daPy_HIO_basic_c0::m.field_0xC); + dComIfGp_setPlayerStatus0(0, daPyStts0_BOOMERANG_AIM_e); + return true; + } } /* 80149CC8-80149DA4 .text procBoomerangMove__9daPy_lk_cFv */ BOOL daPy_lk_c::procBoomerangMove() { - /* Nonmatching */ + if (!checkItemModeActorPointer()) { + return true; + } else { + if (mpAttnActorLockOn != NULL) { + setSpeedAndAngleAtnActor(); + } 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; + } + } else { + offModeFlg(ModeFlg_00000001); + } + setBlendAtnMoveAnime(fVar1); + setBodyAngleXReadyAnime(); + } + } + return true; } /* 80149DA4-80149E1C .text procBoomerangCatch_init__9daPy_lk_cFv */ BOOL daPy_lk_c::procBoomerangCatch_init() { - /* Nonmatching */ + if (mCurProc == daPyProc_BOOMERANG_CATCH_e) { + return false; + } else { + commonProcInit(daPyProc_BOOMERANG_CATCH_e); + setSingleMoveAnime(ANM_BOOMCATCH, daPy_HIO_boom_c0::m.field_0x20, + daPy_HIO_boom_c0::m.field_0x24, + daPy_HIO_boom_c0::m.field_0x2, + daPy_HIO_boom_c0::m.field_0x28); + offNoResetFlg0(daPyFlg0_UNK20); + } + return true; } /* 80149E1C-80149ECC .text procBoomerangCatch__9daPy_lk_cFv */ BOOL daPy_lk_c::procBoomerangCatch() { - /* Nonmatching */ + if (mpAttention->Lockon()) { + setSpeedAndAngleAtn(); + } else { + setSpeedAndAngleNormal(daPy_HIO_move_c0::m.field_0x0); + } + if (mFrameCtrlUnder[UNDER_MOVE0_e].getRate() < 0.01f) { + resetActAnimeUpper(UPPER_MOVE2_e, -1.0f); + } + checkNextMode(0); + return true; }