diff --git a/include/d/actor/d_a_npc_md.h b/include/d/actor/d_a_npc_md.h index 4d5c12f00..394ad6f36 100644 --- a/include/d/actor/d_a_npc_md.h +++ b/include/d/actor/d_a_npc_md.h @@ -206,13 +206,16 @@ public: bool chkPlayerAction(ActionFunc func) { return mCurrPlayerActionFunc == func; } bool chkNpcAction(ActionFunc func) { return mCurrNpcActionFunc == func; } - bool isOldLightBodyHit() { return m30F0 & 0x8000; } + bool isOldLightBodyHit() { return cLib_checkBit(m30F0, 0x00008000UL); } + void onDefaultTalkXY() { cLib_onBit(m30F0, 0x00010000UL); } + void offDefaultTalkXY() { cLib_offBit(m30F0, 0x00010000UL); } + bool isDefaultTalkXY() { return cLib_checkBit(m30F0, 0x00010000UL); } daNpc_Md_c() {} ~daNpc_Md_c(); - void XyCheckCB(int); - void XyEventCB(int); + s16 XyCheckCB(int); + s16 XyEventCB(int); s32 create(); BOOL createHeap(); BOOL setAction(ActionFunc*, ActionFunc, void*); @@ -222,8 +225,8 @@ public: void setPlayerAction(ActionFunc, void*); void getStickAngY(int); void calcStickPos(short, cXyz*); - void flyCheck(); - void mirrorCancelCheck(); + BOOL flyCheck(); + BOOL mirrorCancelCheck(); void setWingEmitter(); void setHane02Emitter(); void deleteHane02Emitter(); @@ -357,11 +360,11 @@ public: void emitterDelete(JPABaseEmitter**); virtual BOOL isTagCheckOK(); - virtual f32 getGroundY() {} - virtual MtxP getLeftHandMatrix() {} - virtual MtxP getRightHandMatrix() {} - virtual f32 getBaseAnimeFrameRate() {} - virtual f32 getBaseAnimeFrame() {} + virtual f32 getGroundY() { return mAcch.GetGroundH(); } + virtual MtxP getLeftHandMatrix() { return mCullMtx; } + virtual MtxP getRightHandMatrix() { return mCullMtx; } + virtual f32 getBaseAnimeFrameRate() { return 1.0f; } + virtual f32 getBaseAnimeFrame() { return 0.0f; } static bool m_flying; static bool m_mirror; @@ -380,7 +383,7 @@ public: /* 0x0504 */ mDoExt_McaMorf* mpWingMorf; /* 0x0508 */ u8 m0508[0x0520 - 0x0508]; /* 0x0520 */ mDoExt_btpAnm m0520; - /* 0x0534 */ mDoExt_btkAnm m0534; + /* 0x0534 */ mDoExt_btkAnm mLightBtkAnm; /* 0x0548 */ u8 m0548[0x054C - 0x0548]; /* 0x054C */ dBgS_AcchCir mAcchCir[2]; /* 0x05CC */ dBgS_MirLightLinChk mLinChk; diff --git a/include/d/actor/d_a_player.h b/include/d/actor/d_a_player.h index 7511745b9..565ba00e7 100644 --- a/include/d/actor/d_a_player.h +++ b/include/d/actor/d_a_player.h @@ -8,9 +8,7 @@ class daPy_matAnm_c : public J3DMaterialAnm { public: - daPy_matAnm_c() { init(); } - - void init(); + daPy_matAnm_c(); virtual ~daPy_matAnm_c() {} virtual void calc(J3DMaterial*) const; diff --git a/include/d/actor/d_a_player_main.h b/include/d/actor/d_a_player_main.h index ee85d9db7..ba4e8cdc8 100644 --- a/include/d/actor/d_a_player_main.h +++ b/include/d/actor/d_a_player_main.h @@ -159,6 +159,9 @@ public: void execute(JPABaseEmitter*); ~daPy_dmEcallBack_c() {} daPy_dmEcallBack_c() {} + + static s16 m_timer; + static u16 m_type; }; // Size: 0x0C class daPy_mtxPosFollowEcallBack_c : public daPy_mtxFollowEcallBack_c { @@ -1215,7 +1218,7 @@ public: UNDER_MOVE0_e = 0, }; - typedef BOOL (daPy_lk_c::*daPy_ProcFunc)(); + typedef BOOL (daPy_lk_c::*ProcFunc)(); void getBoomerangCatchPos() const; void getLineTopPos(); @@ -1223,11 +1226,11 @@ public: void seStartOnlyReverb(u32); void seStartMapInfo(u32); void seStartSwordCut(u32); - void itemButton() const; - void itemTrigger() const; + BOOL itemButton() const; + BOOL itemTrigger() const; void getReadyItem(); - void checkGroupItem(int, int); - void checkSetItemTrigger(int, int); + BOOL checkGroupItem(int, int); + BOOL checkSetItemTrigger(int, int); void auraJointCB0(int); BOOL jointBeforeCB(int, J3DTransformInfo*, Quaternion*); BOOL jointAfterCB(int, J3DTransformInfo*, Quaternion*); @@ -1241,9 +1244,9 @@ public: void getUnderUpperAnime(daPy_anmIndex_c const*, J3DAnmTransform**, J3DAnmTransform**, int, u32); void setTextureAnimeResource(J3DAnmTexPattern*, int); void loadTextureAnimeResource(u32, int); - void checkBossBgm(); - void checkMabaAnimeBtp(int); - void checkNormalFace(); + BOOL checkBossBgm(); + BOOL checkMabaAnimeBtp(int); + BOOL checkNormalFace(); void setTextureAnime(u16, int); void setPriTextureAnime(u16, int); void resetPriTextureAnime(); @@ -1255,9 +1258,9 @@ public: void checkSightLine(f32, cXyz*); void setBootsModel(J3DModel**); void setItemModel(); - void checkUpperReadyAnime() const; - void checkUpperReadyThrowAnime() const; - void checkNoCollisionCorret(); + BOOL checkUpperReadyAnime() const; + BOOL checkUpperReadyThrowAnime() const; + BOOL checkNoCollisionCorret(); void setDrawHandModel(); void entryDLSetLight(J3DModel*, u32); void updateDLSetLight(J3DModel*, u32); @@ -1281,7 +1284,7 @@ public: void posMove(); void setShapeAngleToAtnActor(); void cancelItemUpperReadyAnime(); - void checkBodyAngleX(s16); + BOOL checkBodyAngleX(s16); void setBodyAngleToCamera(); void setBodyAngleXReadyAnime(); void setSpeedAndAngleNormal(s16); @@ -1289,7 +1292,7 @@ public: void setSpeedAndAngleAtnBack(); void setSpeedAndAngleAtnActor(); void setFrameCtrl(J3DFrameCtrl*, u8, s16, s16, f32, f32); - void checkAtnWaitAnime(); + BOOL checkAtnWaitAnime(); void setBlendMoveAnime(f32); void setBlendAtnBackMoveAnime(f32); void setBlendAtnMoveAnime(f32); @@ -1311,18 +1314,18 @@ public: void setScopeModel(); void setPhotoBoxModel(); void changeDragonShield(int); - void checkNewItemChange(u8); - void checkItemChangeFromButton(); - void checkItemAction(); + BOOL checkNewItemChange(u8); + BOOL checkItemChangeFromButton(); + BOOL checkItemAction(); void getSlidePolygon(); - void checkJumpCutFromButton(); + BOOL checkJumpCutFromButton(); void orderTalk(); - void checkNextActionFromButton(); + BOOL checkNextActionFromButton(); void setShieldGuard(); - void checkItemModeActorPointer(); - void checkNextActionItemFly(); - void checkNextMode(int); - void checkIceSlipFall(); + BOOL checkItemModeActorPointer(); + BOOL checkNextActionItemFly(); + BOOL checkNextMode(int); + BOOL checkIceSlipFall(); void setFrontWallType(); void changeFrontWallTypeProc(); void changeSlideProc(); @@ -1343,14 +1346,14 @@ public: void checkRestHPAnime(); BOOL checkHeavyStateOn(); BOOL checkBottleItem(int) const; - void checkDrinkBottleItem(int) const; - void checkOpenBottleItem(int) const; + BOOL checkDrinkBottleItem(int) const; + BOOL checkOpenBottleItem(int) const; BOOL checkBowItem(int) const; - void checkPhotoBoxItem(int) const; - void checkScopeEnd(); + BOOL checkPhotoBoxItem(int) const; + BOOL checkScopeEnd(); void setSubjectMode(); - void checkMaskDraw(); - void checkSubjectEnd(int); + BOOL checkMaskDraw(); + BOOL checkSubjectEnd(int); BOOL checkGuardAccept(); void cancelNoDamageMode(); BOOL commonProcInit(daPy_lk_c::daPy_PROC procID); @@ -2214,7 +2217,7 @@ public: /* 0x31D0 */ void* mpTextureScrollResData; /* 0x31D4 */ JKRSolidHeap* mpTextureScrollResHeap; /* 0x31D8 */ int mCurProcID; - /* 0x31DC */ daPy_ProcFunc mCurProcFunc; + /* 0x31DC */ ProcFunc mCurProcFunc; /* 0x31E8 */ daPy_footEffect_c m31E8[2]; /* 0x3280 */ dPa_rippleEcallBack m3280; /* 0x3294 */ daPy_swimTailEcallBack_c mSwimTailEcallBack[2]; @@ -2280,7 +2283,7 @@ public: /* 0x34E8 */ s16 m34E8; /* 0x34EA */ s16 m34EA; /* 0x34EC */ s16 m34EC; - /* 0x34EE */ u16 m34EE; + /* 0x34EE */ u16 mSeAnmIdx; /* 0x34F0 */ u16 m34F0; /* 0x34F2 */ s16 m34F2; /* 0x34F4 */ s16 m34F4; @@ -2373,7 +2376,7 @@ public: /* 0x3600 */ f32 m3600; /* 0x3604 */ f32 m3604; /* 0x3608 */ f32 m3608; - /* 0x360C */ f32 m360C; + /* 0x360C */ f32 mSeAnmRate; /* 0x3610 */ f32 m3610; /* 0x3614 */ int m3614; /* 0x3618 */ u32 mProcFlags; @@ -2385,7 +2388,9 @@ public: /* 0x3630 */ int m3630; /* 0x3634 */ int m3634; /* 0x3638 */ int mMsgId; - /* 0x363C */ u8 m363C[0x3644 - 0x363C]; + /* 0x363C */ J3DFrameCtrl* mpSeAnmFrameCtrl; + /* 0x3640 */ s16 m3640; + /* 0x3642 */ u8 m3642[0x3644 - 0x3642]; /* 0x3644 */ f32 m3644; /* 0x3648 */ u8 m3648[0x3654 - 0x3648]; /* 0x3654 */ f32 m3654; @@ -2422,12 +2427,12 @@ public: /* 0x4AF0 */ dCcD_Cps mFanWindCps2; struct ProcInitTableEntry { - /* 0x00 */ daPy_ProcFunc mProcFunc; + /* 0x00 */ ProcFunc mProcFunc; /* 0x0C */ u32 mProcFlags; }; static ProcInitTableEntry mProcInitTable[0xDB]; - static daPy_ProcFunc mDemoProcInitFuncTable[0x4B]; + static ProcFunc mDemoProcInitFuncTable[0x4B]; }; // Size: 0x4C28 #endif /* D_A_PLAYER_MAIN */ diff --git a/src/d/actor/d_a_npc_kamome.cpp b/src/d/actor/d_a_npc_kamome.cpp index 987ce386e..2edca964d 100644 --- a/src/d/actor/d_a_npc_kamome.cpp +++ b/src/d/actor/d_a_npc_kamome.cpp @@ -173,7 +173,7 @@ static s16 daNpc_kam_XyEventCB(void* i_this, int param_1) { } /* 0000054C-00000568 .text XyEventCB__11daNpc_kam_cFi */ -s16 daNpc_kam_c::XyEventCB(int param_1) { +s16 daNpc_kam_c::XyEventCB(int equippedItemIdx) { onEventAccept(); mCurrEventIdxIdx = 1; // "kamome_call" return mEventIdxs[1]; diff --git a/src/d/actor/d_a_npc_md.cpp b/src/d/actor/d_a_npc_md.cpp index fe46a2104..62d7cdca2 100644 --- a/src/d/actor/d_a_npc_md.cpp +++ b/src/d/actor/d_a_npc_md.cpp @@ -7,6 +7,8 @@ #include "d/d_procname.h" #include "d/d_com_inf_game.h" #include "JSystem/JKernel/JKRHeap.h" +#include "d/d_item_data.h" +#include "m_Do/m_Do_controller_pad.h" // Needed for the .data section to match. static f32 dummy1[3] = {1.0f, 1.0f, 1.0f}; @@ -318,23 +320,48 @@ daNpc_Md_HIO_c::daNpc_Md_HIO_c() { } /* 000006DC-000006FC .text daNpc_Md_XyCheckCB__FPvi */ -static void daNpc_Md_XyCheckCB(void* i_this, int param_1) { +static s16 daNpc_Md_XyCheckCB(void* i_this, int param_1) { return static_cast(i_this)->XyCheckCB(param_1); } /* 000006FC-000007FC .text XyCheckCB__10daNpc_Md_cFi */ -void daNpc_Md_c::XyCheckCB(int) { - /* Nonmatching */ +s16 daNpc_Md_c::XyCheckCB(int equippedItemIdx) { + u8 selectItemNo = dComIfGp_getSelectItem(equippedItemIdx); + if (m3138 == 3) { + if (selectItemNo == WIND_TACT) { + return TRUE; + } + if (selectItemNo == GOLDEN_FEATHER) { + if (!dComIfGs_isEventBit(0x2E40) || (dComIfGs_isEventBit(0x2E40) && m_seaTalk)) { + return TRUE; + } + } + } else if (m3138 == 5 || m3138 == 4) { + if (selectItemNo == GOLDEN_FEATHER && !dComIfGs_isEventBit(0x3B80)) { + return TRUE; + } + } + if (selectItemNo == GOLDEN_FEATHER) { + dComIfGs_onEventBit(0x2C08); + } + return FALSE; } /* 000007FC-0000081C .text daNpc_Md_XyEventCB__FPvi */ -static void daNpc_Md_XyEventCB(void* i_this, int param_1) { +static s16 daNpc_Md_XyEventCB(void* i_this, int param_1) { return static_cast(i_this)->XyEventCB(param_1); } /* 0000081C-00000864 .text XyEventCB__10daNpc_Md_cFi */ -void daNpc_Md_c::XyEventCB(int) { - /* Nonmatching */ +s16 daNpc_Md_c::XyEventCB(int equippedItemIdx) { + u8 selectItemNo = dComIfGp_getSelectItem(equippedItemIdx); + if (selectItemNo == WIND_TACT) { + offDefaultTalkXY(); + return mEventIdxTable[5]; + } else if (selectItemNo == GOLDEN_FEATHER) { + onDefaultTalkXY(); + } + return -1; } /* 00000864-00000884 .text CheckCreateHeap__FP10fopAc_ac_c */ @@ -613,7 +640,8 @@ void daNpc_Md_c::playerAction(void* arg) { /* 00003360-000033C4 .text setPlayerAction__10daNpc_Md_cFM10daNpc_Md_cFPCvPvPv_iPv */ void daNpc_Md_c::setPlayerAction(ActionFunc actionFunc, void* arg) { - /* Nonmatching */ + mCurrNpcActionFunc = NULL; + setAction(&mCurrPlayerActionFunc, actionFunc, arg); } /* 000033C4-00003430 .text getStickAngY__10daNpc_Md_cFi */ @@ -627,13 +655,22 @@ void daNpc_Md_c::calcStickPos(short, cXyz*) { } /* 00003588-0000362C .text flyCheck__10daNpc_Md_cFv */ -void daNpc_Md_c::flyCheck() { - /* Nonmatching */ +BOOL daNpc_Md_c::flyCheck() { + if (!CPad_CHECK_TRIG_A(0)) { + return FALSE; + } + if (isOldLightBodyHit()) { + setPlayerAction(&mkamaePlayerAction, NULL); + } else { + setPlayerAction(&flyPlayerAction, NULL); + } + return TRUE; } /* 0000362C-00003648 .text mirrorCancelCheck__10daNpc_Md_cFv */ -void daNpc_Md_c::mirrorCancelCheck() { +BOOL daNpc_Md_c::mirrorCancelCheck() { /* Nonmatching */ + return CPad_CHECK_TRIG_B(0); } /* 00003648-00003674 .text setWingEmitter__10daNpc_Md_cFv */ @@ -838,7 +875,12 @@ int daNpc_Md_c::piyo2NpcAction(void*) { /* 00007824-0000786C .text deleteNpcAction__10daNpc_Md_cFPv */ int daNpc_Md_c::deleteNpcAction(void*) { - /* Nonmatching */ + if (mActionStatus == ACTION_STARTING) { + mActionStatus++; // ACTION_ONGOING + } else if (mActionStatus != ACTION_ENDING) { + fopAcM_delete(this); + } + return TRUE; } /* 0000786C-00007A98 .text demoFlyNpcAction__10daNpc_Md_cFPv */ @@ -1162,7 +1204,7 @@ BOOL daNpc_Md_c::initLightBtkAnm(bool) { /* 0000D0B8-0000D0DC .text playLightBtkAnm__10daNpc_Md_cFv */ void daNpc_Md_c::playLightBtkAnm() { - /* Nonmatching */ + mLightBtkAnm.play(); } /* 0000D0DC-0000D4CC .text setAnm__10daNpc_Md_cFi */ diff --git a/src/d/actor/d_a_player_main.cpp b/src/d/actor/d_a_player_main.cpp index 4790f2c7b..c6be309bf 100644 --- a/src/d/actor/d_a_player_main.cpp +++ b/src/d/actor/d_a_player_main.cpp @@ -18,6 +18,7 @@ #include "JSystem/JUtility/JUTAssert.h" #include "d/actor/d_a_itembase.h" #include "d/d_item_data.h" +#include "d/d_item.h" #include "d/actor/d_a_player_HIO.inc" @@ -308,7 +309,7 @@ daPy_lk_c::ProcInitTableEntry daPy_lk_c::mProcInitTable[0xDB] = { /* 0x5D */ {&daPy_lk_c::procBtJump, 0x88000402}, /* 0x5E */ {&daPy_lk_c::procBtJumpCut, 0x80000402}, /* 0x5F */ {&daPy_lk_c::procBtSlide, 0x80000000}, - /* 0x60 */ {&daPy_lk_c::procBtRoll, 0x80008400}, + /* 0x60 */ {&daPy_lk_c::procBtRoll, 0x00000000}, /* 0x61 */ {&daPy_lk_c::procBtRollCut, 0x88000402}, /* 0x62 */ {&daPy_lk_c::procBtVerticalJump, 0x88000402}, /* 0x63 */ {&daPy_lk_c::procBtVerticalJumpCut, 0x88000402}, @@ -433,7 +434,7 @@ daPy_lk_c::ProcInitTableEntry daPy_lk_c::mProcInitTable[0xDB] = { /* 0xDA */ {&daPy_lk_c::dProcIceSlip, 0x00000401}, }; -daPy_lk_c::daPy_ProcFunc daPy_lk_c::mDemoProcInitFuncTable[0x4B] = { +daPy_lk_c::ProcFunc daPy_lk_c::mDemoProcInitFuncTable[0x4B] = { NULL, NULL, NULL, @@ -511,11 +512,37 @@ daPy_lk_c::daPy_ProcFunc daPy_lk_c::mDemoProcInitFuncTable[0x4B] = { &daPy_lk_c::dProcIceSlip_init, }; +GXColor l_freeze_fade_color = {0xFF, 0xFF, 0xFF, 0xFF}; + +csXyz l_debug_current_angle; +csXyz l_debug_shape_angle; + +u8 daPy_matAnm_c::m_maba_flg; +u8 daPy_matAnm_c::m_eye_move_flg; +u8 daPy_matAnm_c::m_maba_timer; +u8 daPy_matAnm_c::m_morf_frame; + +s16 daPy_dmEcallBack_c::m_timer = 0; +u16 daPy_dmEcallBack_c::m_type = 3; + /* 80102E8C-80102EAC .text daPy_createHeap__FP10fopAc_ac_c */ static BOOL daPy_createHeap(fopAc_ac_c* i_this) { return static_cast(i_this)->createHeap(); } +/* 80102EAC-80102F1C .text __ct__13daPy_matAnm_cFv */ +daPy_matAnm_c::daPy_matAnm_c() { + mEyePosOld.x = 0.0f; + mEyePosOld.y = 0.0f; + mEyePos.x = 0.0f; + mEyePos.y = 0.0f; + + m_maba_flg = 0; + m_eye_move_flg = 0; + m_maba_timer = 0; + m_morf_frame = 0; +} + /* 80102F64-80103074 .text calc__13daPy_matAnm_cCFP11J3DMaterial */ void daPy_matAnm_c::calc(J3DMaterial* mat) const { daPy_matAnm_c* i_this = const_cast(this); @@ -560,13 +587,25 @@ void daPy_lk_c::voiceStart(u32 param_1) { } /* 801031A4-801031DC .text itemButton__9daPy_lk_cCFv */ -void daPy_lk_c::itemButton() const { - /* Nonmatching */ +BOOL daPy_lk_c::itemButton() const { + if (mLastUsedEquipItem == 0) { + return m34C9 & 0x04; + } else if (mLastUsedEquipItem == 1) { + return m34C9 & 0x08; + } else { + return m34C9 & 0x10; + } } /* 801031DC-80103214 .text itemTrigger__9daPy_lk_cCFv */ -void daPy_lk_c::itemTrigger() const { - /* Nonmatching */ +BOOL daPy_lk_c::itemTrigger() const { + if (mLastUsedEquipItem == 0) { + return mPressedButtonsBitfield & 0x04; + } else if (mLastUsedEquipItem == 1) { + return mPressedButtonsBitfield & 0x08; + } else { + return mPressedButtonsBitfield & 0x10; + } } /* 80103214-80103258 .text getReadyItem__9daPy_lk_cFv */ @@ -575,13 +614,39 @@ void daPy_lk_c::getReadyItem() { } /* 80103258-801032E4 .text checkGroupItem__9daPy_lk_cFii */ -void daPy_lk_c::checkGroupItem(int, int) { - /* Nonmatching */ +BOOL daPy_lk_c::checkGroupItem(int param_1, int itemNo) { + if (param_1 == 0x105) { + return checkDrinkBottleItem(itemNo); + } else if (param_1 == 0x106) { + return checkOpenBottleItem(itemNo); + } else if (param_1 == 0x107) { + return isEsa(itemNo); + } else if (param_1 == 0x108) { + return checkBowItem(itemNo); + } else if (param_1 == 0x109) { + return checkPhotoBoxItem(itemNo); + } else { + return param_1 == itemNo; + } } /* 801032E4-801033E4 .text checkSetItemTrigger__9daPy_lk_cFii */ -void daPy_lk_c::checkSetItemTrigger(int, int) { - /* Nonmatching */ +BOOL daPy_lk_c::checkSetItemTrigger(int param_1, int param_2) { + if (param_2 == 0 || daPy_dmEcallBack_c::m_type != 1) { + if (mPressedButtonsBitfield & 0x04 && checkGroupItem(param_1, dComIfGp_getSelectItem(0))) { + mLastUsedEquipItem = 0; + return TRUE; + } + if (mPressedButtonsBitfield & 0x08 && checkGroupItem(param_1, dComIfGp_getSelectItem(1))) { + mLastUsedEquipItem = 1; + return TRUE; + } + if (mPressedButtonsBitfield & 0x10 && checkGroupItem(param_1, dComIfGp_getSelectItem(2))) { + mLastUsedEquipItem = 2; + return TRUE; + } + } + return FALSE; } /* 801033E4-80103450 .text auraJointCB0__9daPy_lk_cFi */ @@ -680,17 +745,20 @@ void daPy_lk_c::loadTextureAnimeResource(u32, int) { } /* 80104600-801046CC .text checkBossBgm__9daPy_lk_cFv */ -void daPy_lk_c::checkBossBgm() { +BOOL daPy_lk_c::checkBossBgm() { /* Nonmatching */ } /* 801046CC-801046EC .text checkMabaAnimeBtp__9daPy_lk_cFi */ -void daPy_lk_c::checkMabaAnimeBtp(int) { - /* Nonmatching */ +BOOL daPy_lk_c::checkMabaAnimeBtp(int anmIdx) { + if (anmIdx >= LKANM_BTP_TMABAA && anmIdx <= LKANM_BTP_TMABAJ) { + return TRUE; + } + return FALSE; } /* 801046EC-80104A08 .text checkNormalFace__9daPy_lk_cFv */ -void daPy_lk_c::checkNormalFace() { +BOOL daPy_lk_c::checkNormalFace() { /* Nonmatching */ } @@ -760,17 +828,17 @@ void daPy_lk_c::setItemModel() { } /* 80106660-801066DC .text checkUpperReadyAnime__9daPy_lk_cCFv */ -void daPy_lk_c::checkUpperReadyAnime() const { +BOOL daPy_lk_c::checkUpperReadyAnime() const { /* Nonmatching */ } /* 801066DC-80106750 .text checkUpperReadyThrowAnime__9daPy_lk_cCFv */ -void daPy_lk_c::checkUpperReadyThrowAnime() const { +BOOL daPy_lk_c::checkUpperReadyThrowAnime() const { /* Nonmatching */ } /* 80106750-801067D8 .text checkNoCollisionCorret__9daPy_lk_cFv */ -void daPy_lk_c::checkNoCollisionCorret() { +BOOL daPy_lk_c::checkNoCollisionCorret() { /* Nonmatching */ } @@ -910,7 +978,7 @@ void daPy_lk_c::cancelItemUpperReadyAnime() { } /* 80109F4C-8010A204 .text checkBodyAngleX__9daPy_lk_cFs */ -void daPy_lk_c::checkBodyAngleX(s16) { +BOOL daPy_lk_c::checkBodyAngleX(s16) { /* Nonmatching */ } @@ -950,7 +1018,7 @@ void daPy_lk_c::setFrameCtrl(J3DFrameCtrl*, u8, s16, s16, f32, f32) { } /* 8010ACEC-8010AD2C .text checkAtnWaitAnime__9daPy_lk_cFv */ -void daPy_lk_c::checkAtnWaitAnime() { +BOOL daPy_lk_c::checkAtnWaitAnime() { /* Nonmatching */ } @@ -1001,7 +1069,12 @@ void daPy_lk_c::setAnimeUnequip() { /* 8010C430-8010C4A4 .text checkBossGomaStage__9daPy_lk_cFv */ BOOL daPy_lk_c::checkBossGomaStage() { - /* Nonmatching */ + if (strcmp(dComIfGp_getStartStageName(), "M_DragB") == 0 || + strcmp(dComIfGp_getStartStageName(), "Xboss0") == 0) + { + return TRUE; + } + return FALSE; } /* 8010C4A4-8010C4C8 .text checkSingleItemEquipAnime__9daPy_lk_cCFv */ @@ -1011,12 +1084,12 @@ BOOL daPy_lk_c::checkSingleItemEquipAnime() const { /* 8010C4C8-8010C528 .text checkItemEquipAnime__9daPy_lk_cCFv */ BOOL daPy_lk_c::checkItemEquipAnime() const { - /* Nonmatching */ + return m_anm_heap_upper[2].mIdx == LKANM_BCK_TAKE || checkSingleItemEquipAnime() || m_anm_heap_upper[2].mIdx == LKANM_BCK_TAKEBOTH; } /* 8010C528-8010C570 .text checkEquipAnime__9daPy_lk_cCFv */ BOOL daPy_lk_c::checkEquipAnime() const { - /* Nonmatching */ + return m_anm_heap_upper[2].mIdx == LKANM_BCK_REST || checkItemEquipAnime(); } /* 8010C570-8010C71C .text deleteEquipItem__9daPy_lk_cFi */ @@ -1084,17 +1157,17 @@ void daPy_lk_c::changeDragonShield(int) { } /* 8010CD34-8010CFB4 .text checkNewItemChange__9daPy_lk_cFUc */ -void daPy_lk_c::checkNewItemChange(u8) { +BOOL daPy_lk_c::checkNewItemChange(u8) { /* Nonmatching */ } /* 8010CFB4-8010D26C .text checkItemChangeFromButton__9daPy_lk_cFv */ -void daPy_lk_c::checkItemChangeFromButton() { +BOOL daPy_lk_c::checkItemChangeFromButton() { /* Nonmatching */ } /* 8010D26C-8010D754 .text checkItemAction__9daPy_lk_cFv */ -void daPy_lk_c::checkItemAction() { +BOOL daPy_lk_c::checkItemAction() { /* Nonmatching */ } @@ -1104,7 +1177,7 @@ void daPy_lk_c::getSlidePolygon() { } /* 8010D810-8010D8B0 .text checkJumpCutFromButton__9daPy_lk_cFv */ -void daPy_lk_c::checkJumpCutFromButton() { +BOOL daPy_lk_c::checkJumpCutFromButton() { /* Nonmatching */ } @@ -1114,7 +1187,7 @@ void daPy_lk_c::orderTalk() { } /* 8010DB58-8010E448 .text checkNextActionFromButton__9daPy_lk_cFv */ -void daPy_lk_c::checkNextActionFromButton() { +BOOL daPy_lk_c::checkNextActionFromButton() { /* Nonmatching */ } @@ -1124,22 +1197,22 @@ void daPy_lk_c::setShieldGuard() { } /* 8010E75C-8010E7C4 .text checkItemModeActorPointer__9daPy_lk_cFv */ -void daPy_lk_c::checkItemModeActorPointer() { +BOOL daPy_lk_c::checkItemModeActorPointer() { /* Nonmatching */ } /* 8010E7C4-8010E828 .text checkNextActionItemFly__9daPy_lk_cFv */ -void daPy_lk_c::checkNextActionItemFly() { +BOOL daPy_lk_c::checkNextActionItemFly() { /* Nonmatching */ } /* 8010E828-8010EC78 .text checkNextMode__9daPy_lk_cFi */ -void daPy_lk_c::checkNextMode(int) { +BOOL daPy_lk_c::checkNextMode(int) { /* Nonmatching */ } /* 8010EC78-8010ED68 .text checkIceSlipFall__9daPy_lk_cFv */ -void daPy_lk_c::checkIceSlipFall() { +BOOL daPy_lk_c::checkIceSlipFall() { /* Nonmatching */ } @@ -1249,27 +1322,27 @@ BOOL daPy_lk_c::checkBottleItem(int itemNo) const { } /* 80111F7C-80111FEC .text checkDrinkBottleItem__9daPy_lk_cCFi */ -void daPy_lk_c::checkDrinkBottleItem(int) const { - /* Nonmatching */ +BOOL daPy_lk_c::checkDrinkBottleItem(int itemNo) const { + return itemNo == RED_BOTTLE || itemNo == GREEN_BOTTLE || itemNo == BLUE_BOTTLE || itemNo == SOUP_BOTTLE || itemNo == BOTTLESHIP; } /* 80111FEC-8011201C .text checkOpenBottleItem__9daPy_lk_cCFi */ -void daPy_lk_c::checkOpenBottleItem(int) const { - /* Nonmatching */ +BOOL daPy_lk_c::checkOpenBottleItem(int itemNo) const { + return itemNo == FIREFLY_BOTTLE || itemNo == BIN_IN_WATER || itemNo == FWATER_BOTTLE || itemNo == FAIRY_BOTTLE; } /* 8011201C-80112044 .text checkBowItem__9daPy_lk_cCFi */ -BOOL daPy_lk_c::checkBowItem(int) const { - /* Nonmatching */ +BOOL daPy_lk_c::checkBowItem(int itemNo) const { + return itemNo == BOW || itemNo == MAGIC_ARROW || itemNo == LIGHT_ARROW; } /* 80112044-80112064 .text checkPhotoBoxItem__9daPy_lk_cCFi */ -void daPy_lk_c::checkPhotoBoxItem(int) const { - /* Nonmatching */ +BOOL daPy_lk_c::checkPhotoBoxItem(int itemNo) const { + return itemNo == CAMERA || itemNo == CAMERA2; } /* 80112064-80112100 .text checkScopeEnd__9daPy_lk_cFv */ -void daPy_lk_c::checkScopeEnd() { +BOOL daPy_lk_c::checkScopeEnd() { /* Nonmatching */ } @@ -1279,12 +1352,12 @@ void daPy_lk_c::setSubjectMode() { } /* 8011215C-801121C8 .text checkMaskDraw__9daPy_lk_cFv */ -void daPy_lk_c::checkMaskDraw() { +BOOL daPy_lk_c::checkMaskDraw() { /* Nonmatching */ } /* 801121C8-80112280 .text checkSubjectEnd__9daPy_lk_cFi */ -void daPy_lk_c::checkSubjectEnd(int) { +BOOL daPy_lk_c::checkSubjectEnd(int) { /* Nonmatching */ } @@ -2697,7 +2770,7 @@ void daPy_lk_c::playerInit() { m31CA = -1; m31CC = -1; m31CE = -1; - m34EE = -1; + mSeAnmIdx = -1; m34F0 = -1; mpItemHeaps[0] = mDoExt_createSolidHeapFromGameToCurrent(0xE600, 0x20); @@ -2887,18 +2960,52 @@ static s32 daPy_Create(fopAc_ac_c* i_this) { } /* 80127BA0-80127CC0 .text setSeAnime__9daPy_lk_cFPC14daPy_anmHeap_cP12J3DFrameCtrl */ -void daPy_lk_c::setSeAnime(const daPy_anmHeap_c*, J3DFrameCtrl*) { +void daPy_lk_c::setSeAnime(const daPy_anmHeap_c* anmHeap, J3DFrameCtrl* frameCtrl) { /* Nonmatching */ + u32 seAnmOffsetInBck = *reinterpret_cast(reinterpret_cast(anmHeap->m_buffer) + 0x1C); + if (seAnmOffsetInBck == -1) { + resetSeAnime(); + } else if (mSeAnmIdx == anmHeap->mIdx && m34F0 == anmHeap->field_0x6 && mSeAnmRate * frameCtrl->getRate() >= 0.0f) { + mpSeAnmFrameCtrl = frameCtrl; + } else { + u32 data_size = *reinterpret_cast(anmHeap->m_buffer); // TODO + const u32 l_sanm_buffer_size = 0x200; + JUT_ASSERT(22318, data_size < l_sanm_buffer_size); + + u32 seAnmPtr = *reinterpret_cast(anmHeap->m_buffer); // TODO + cLib_memCpy(m_sanm_buffer, anmHeap->m_buffer, seAnmPtr); + mpSeAnmFrameCtrl = frameCtrl; + mSeAnmIdx = anmHeap->mIdx; + m34F0 = anmHeap->field_0x6; + mSeAnmRate = frameCtrl->getRate(); + initSeAnime(); + } } /* 80127CC0-80127DEC .text initSeAnime__9daPy_lk_cFv */ void daPy_lk_c::initSeAnime() { - /* Nonmatching */ + if (mpSeAnmFrameCtrl) { + s16 loop = mpSeAnmFrameCtrl->getLoop(); + u32 direction = mpSeAnmFrameCtrl->getRate() >= 0.0f ? 1 : -1; + mJAIZelAnime.initActorAnimSound(m_sanm_buffer, direction, loop); + } + + if (mpSeAnmFrameCtrl->getAttribute() == J3DFrameCtrl::LOOP_REPEAT_e) { + f32 position = mpSeAnmFrameCtrl->getFrame() - mpSeAnmFrameCtrl->getRate(); + if (position <= mpSeAnmFrameCtrl->getStart()) { + position = mpSeAnmFrameCtrl->getEnd() - position; + } else if (position >= mpSeAnmFrameCtrl->getEnd()) { + position = position - mpSeAnmFrameCtrl->getEnd(); + } + mJAIZelAnime.setPlayPosition(position); + } } /* 80127DEC-80127E08 .text resetSeAnime__9daPy_lk_cFv */ void daPy_lk_c::resetSeAnime() { - /* Nonmatching */ + mSeAnmIdx = -1; + m34F0 = -1; + mpSeAnmFrameCtrl = NULL; } /* 80127E08-8012821C .text setMoveAnime__9daPy_lk_cFfffQ29daPy_lk_c8daPy_ANMQ29daPy_lk_c8daPy_ANMif */