From 083991a8d08827a1185c8ad12a158bb7b021bee9 Mon Sep 17 00:00:00 2001 From: TakaRikka <38417346+TakaRikka@users.noreply.github.com> Date: Sat, 9 Nov 2024 02:09:36 -0800 Subject: [PATCH] all d_a_alink functions attempted (#2239) * more work on alink * alink wip * little more work * setEyeMove * 14 left * auto ground hit * all d_a_alink functions attempted --- include/SSystem/SComponent/c_m3d.h | 2 +- include/SSystem/SComponent/c_m3d_g_pla.h | 7 + include/d/actor/d_a_alink.h | 59 +- include/d/actor/d_a_b_mgn.h | 6 +- include/d/actor/d_a_midna.h | 2 +- include/d/actor/d_a_npc_bou.h | 66 +- include/d/actor/d_a_npc_kolin.h | 76 +- include/d/actor/d_a_player.h | 10 +- include/d/d_attention.h | 6 + include/d/d_bg_s_acch.h | 2 +- include/d/d_com_inf_game.h | 4 + include/d/d_kankyo.h | 1 + include/m_Do/m_Do_audio.h | 7 + include/m_Do/m_Do_ext.h | 3 +- include/m_Do/m_Do_mtx.h | 4 + src/SSystem/SComponent/c_m3d.cpp | 2 +- src/d/actor/d_a_alink.cpp | 5066 +++++++++++++++++++++- src/d/actor/d_a_npc_bou.cpp | 18 +- src/d/actor/d_a_npc_kolin.cpp | 22 +- 19 files changed, 5121 insertions(+), 242 deletions(-) diff --git a/include/SSystem/SComponent/c_m3d.h b/include/SSystem/SComponent/c_m3d.h index 028e85d6539..0f5c929f04a 100644 --- a/include/SSystem/SComponent/c_m3d.h +++ b/include/SSystem/SComponent/c_m3d.h @@ -85,7 +85,7 @@ void cM3d_CalcVecAngle(const Vec&, short*, short*); void cM3d_CalcVecZAngle(const Vec&, csXyz*); static void cM3d_PlaneCrossLineProcWork(f32, f32, f32, f32, f32, f32, f32, f32*, f32*); static int cM3d_2PlaneCrossLine(const cM3dGPla&, const cM3dGPla&, cM3dGLin*); -bool cM3d_3PlaneCrossPos(const cM3dGPla&, const cM3dGPla&, const cM3dGPla&, Vec*); +BOOL cM3d_3PlaneCrossPos(const cM3dGPla&, const cM3dGPla&, const cM3dGPla&, Vec*); f32 cM3d_lineVsPosSuisenCross(const cM3dGLin*, const Vec*, Vec*); f32 cM3d_lineVsPosSuisenCross(const Vec&, const Vec&, const Vec&, Vec*); int cM3d_2PlaneLinePosNearPos(const cM3dGPla&, const cM3dGPla&, const Vec*, Vec*); diff --git a/include/SSystem/SComponent/c_m3d_g_pla.h b/include/SSystem/SComponent/c_m3d_g_pla.h index ff4057b3365..2fc7463a4d6 100644 --- a/include/SSystem/SComponent/c_m3d_g_pla.h +++ b/include/SSystem/SComponent/c_m3d_g_pla.h @@ -26,15 +26,22 @@ public: cXyz* GetNP() { return &mNormal; } const cXyz* GetNP() const { return &mNormal; } f32 GetD() const { return mD; } + void SetupFrom3Vtx(const Vec* v1, const Vec* v2, const Vec* v3) { cM3d_CalcPla(v1, v2, v3, &mNormal, &mD); } + f32 getCrossY_NonIsZero(const cXyz *param_1) { return ((-mNormal.x * param_1->x - mNormal.z * param_1->z) - mD) / mNormal.y; } + bool cross(cM3dGLin const& line, Vec& point) { return cM3d_Cross_LinPla(&line, this, &point, true, true); } + + f32 getSignedLenPos(const cXyz* param_0) const { + return cM3d_SignedLenPlaAndPos(this, param_0); + } }; #endif diff --git a/include/d/actor/d_a_alink.h b/include/d/actor/d_a_alink.h index e7e38c8b9ca..3183e85cfc5 100644 --- a/include/d/actor/d_a_alink.h +++ b/include/d/actor/d_a_alink.h @@ -118,6 +118,7 @@ public: s16 getAppearFlg() const { return mAppearFlg; } s16 getHitFlg() const { return mHitFlg; } cXyz& getHitPos() { return mHitPos; } + f32 getKeepMinY() { return mKeepMinY; } void onAppearFlg() { mAppearFlg = true; } @@ -156,7 +157,18 @@ public: static void decMorfFrame() { cLib_calcTimer(&m_morf_frame); } static void setMorfFrame(u8 i_frame) { m_morf_frame = i_frame; } + static u8 getMorfFrame() { return m_morf_frame; } + + static void onEyeMoveFlg() { m_eye_move_flg = true; } + static void offEyeMoveFlg() { m_eye_move_flg = false; } + static bool getEyeMoveFlg() { return m_eye_move_flg; } + f32* getNowOffsetXP() { return &mNowOffsetX; } + f32* getNowOffsetYP() { return &mNowOffsetY; } + void setNowOffsetX(f32 i_offset) { mNowOffsetX = i_offset; } + void setNowOffsetY(f32 i_offset) { mNowOffsetY = i_offset; } + + static bool m_eye_move_flg; static u8 m_morf_frame; /* 0x0F4 */ f32 field_0xf4; @@ -669,8 +681,10 @@ public: enum daAlink_FTANM { FTANM_UNK_0 = 0, + FTANM_UNK_1 = 1, FTANM_UNK_3 = 3, FTANM_UNK_4 = 4, + FTANM_UNK_5 = 5, FTANM_UNK_8 = 8, FTANM_UNK_9 = 9, FTANM_UNK_13 = 0x13, @@ -681,6 +695,7 @@ public: FTANM_UNK_23 = 0x23, FTANM_UNK_27 = 0x27, FTANM_UNK_2D = 0x2D, + FTANM_UNK_39 = 0x39, FTANM_UNK_48 = 0x48, FTANM_UNK_75 = 0x75, FTANM_UNK_76 = 0x76, @@ -690,6 +705,7 @@ public: FTANM_UNK_7C = 0x7C, FTANM_UNK_8A = 0x8A, FTANM_UNK_8B = 0x8B, + FTANM_UNK_8C = 0x8C, FTANM_UNK_8D = 0x8D, FTANM_UNK_8E = 0x8E, FTANM_UNK_8F = 0x8F, @@ -700,6 +716,7 @@ public: FTANM_UNK_95 = 0x95, FTANM_UNK_96 = 0x96, FTANM_UNK_97 = 0x97, + FTANM_UNK_98 = 0x98, FTANM_UNK_99 = 0x99, FTANM_UNK_9A = 0x9A, FTANM_UNK_9B = 0x9B, @@ -1310,29 +1327,29 @@ public: /* 8009DA98 */ void tgHitCallback(fopAc_ac_c*, dCcD_GObjInf*, dCcD_GObjInf*); /* 8009DB64 */ void coHitCallback(fopAc_ac_c*, dCcD_GObjInf*); /* 8009DC6C */ void setMatrixWorldAxisRot(f32 (*)[4], s16, s16, s16, int, cXyz const*); - /* 8009DD90 */ void jointControll(int); + /* 8009DD90 */ int jointControll(int); /* 8009E7B8 */ void setUpperFront(); /* 8009E91C */ void changeBlendRate(int); /* 8009EB18 */ void resetRootMtx(); /* 8009EB58 */ bool modelCallBack(int); - /* 8009ECA0 */ void headModelCallBack(int); + /* 8009ECA0 */ int headModelCallBack(int); /* 8009EF7C */ int wolfModelCallBack(int); /* 8009F034 */ void setHatAngle(); /* 8009FFF8 */ void calcHairAngle(s16*); /* 800A002C */ void setHairAngle(cXyz*, f32, f32); /* 800A0744 */ void setLookPosFromOut(cXyz*); /* 800A07D8 */ bool checkAttentionPosAngle(cXyz*); - /* 800A0868 */ void checkActorPosAngle(fopAc_ac_c*, cXyz**); - /* 800A093C */ void getNeckAimPos(cXyz*, int*, int); - /* 800A142C */ void getNeckAimAngle(cXyz*, s16*, s16*, s16*, s16*); + /* 800A0868 */ bool checkActorPosAngle(fopAc_ac_c*, cXyz**); + /* 800A093C */ cXyz* getNeckAimPos(cXyz*, int*, int); + /* 800A142C */ s16 getNeckAimAngle(cXyz*, s16*, s16*, s16*, s16*); /* 800A1AEC */ void setEyeMove(cXyz*, s16, s16); /* 800A1F90 */ void setNeckAngle(); /* 800A2198 */ bool commonLineCheck(cXyz*, cXyz*); /* 800A21E0 */ static s16 getMoveBGActorName(cBgS_PolyInfo&, int); /* 800A2280 */ fopAc_ac_c* checkGoronRide(); /* 800A22E8 */ void setMoveSlantAngle(); - /* 800A2710 */ void setArmMatrix(); - /* 800A29DC */ void setFootMatrix(); + /* 800A2710 */ int setArmMatrix(); + /* 800A29DC */ int setFootMatrix(); /* 800A2C24 */ void setMatrixOffset(f32*, f32); /* 800A2CE0 */ int setLegAngle(f32, daAlink_footData_c*, s16*, s16*, int); /* 800A3430 */ void footBgCheck(); @@ -1362,7 +1379,7 @@ public: /* 800A7950 */ bool checkWindSpeedOnAngle() const; /* 800A79EC */ bool checkWindSpeedOnAngleAnime(int) const; /* 800A7A5C */ bool checkDashAnime() const; - /* 800A7ABC */ void checkWindWallRate(cXyz const&); + /* 800A7ABC */ f32 checkWindWallRate(cXyz const&); /* 800A7CB0 */ void setWindSpeed(); /* 800A8310 */ void setBodyPartPos(); /* 800A87F8 */ void setAttentionPos(); @@ -1409,9 +1426,9 @@ public: /* 800AD340 */ void setUpperAnimeBase(u16); /* 800AD374 */ void setUpperAnimeBaseMorf(u16, f32); /* 800AD3A8 */ void setUpperAnimeBaseSpeed(u16, f32, f32); - /* 800AD3D8 */ void setUpperAnime(u16, daAlink_c::daAlink_UPPER, f32, f32, s16, f32); + /* 800AD3D8 */ int setUpperAnime(u16, daAlink_c::daAlink_UPPER, f32, f32, s16, f32); /* 800AD6F0 */ void setUpperAnimeParam(u16, daAlink_c::daAlink_UPPER, daAlinkHIO_anm_c const*); - /* 800AD724 */ void resetUpperAnime(daAlink_c::daAlink_UPPER, f32); + /* 800AD724 */ int resetUpperAnime(daAlink_c::daAlink_UPPER, f32); /* 800AD8F4 */ void setUnderAnimeMorf(f32); /* 800AD964 */ int setUnderAnime(u16, daAlink_c::daAlink_UNDER, f32, f32, s16, f32); /* 800ADAB8 */ int setUnderAnimeParam(u16, daAlink_c::daAlink_UNDER, daAlinkHIO_anm_c const*); @@ -1426,7 +1443,7 @@ public: /* 800AF4B0 */ void setFaceBck(u16, int, u16); /* 800AF61C */ void setFaceBtp(u16, int, u16); /* 800AF7D0 */ void setFaceBtk(u16, int, u16); - /* 800AF8A0 */ void setFaceBasicTexture(daAlink_c::daAlink_FTANM); + /* 800AF8A0 */ daAlink_FTANM setFaceBasicTexture(daAlink_c::daAlink_FTANM); /* 800AF9A8 */ void setFaceBasicAnime(daAlink_c::daAlink_ANM); /* 800AFAA8 */ void setFacePriTexture(daAlink_c::daAlink_FTANM); /* 800AFB14 */ void setFacePriAnime(daAlink_c::daAlink_ANM); @@ -2191,7 +2208,7 @@ public: /* 800F3BEC */ f32 getCanoeCres() const; /* 800F3C18 */ f32 getCanoeSpeedRate() const; /* 800F3C44 */ s16 getCanoeMaxRotSpeed() const; - /* 800F3CCC */ cXyz* getCanoeLocalPaddleTop(); + /* 800F3CCC */ static cXyz* getCanoeLocalPaddleTop(); /* 800F3CF8 */ BOOL checkCanoeRideTandem(); /* 800F3D58 */ BOOL checkFishingRodAndLureItem() const; /* 800F3DA0 */ void initFishingRodHand(); @@ -3237,6 +3254,7 @@ public: BOOL checkCopyRodControllAnime() const { return checkUpperAnime(0x202); } BOOL checkWolfHeadDamageAnime() const { return checkUpperAnime(0x2A7); } BOOL checkExchangeRodAnime() const { return checkUpperAnime(0x68); } + BOOL checkReelAnime() const { return checkUpperAnime(0x1FB); } int checkWolfEyeUp() const { return mWolfEyeUp; } void onModeFlg(u32 flag) { mModeFlg |= flag; } @@ -3486,6 +3504,7 @@ public: bool checkRootTransZClearMode() { return field_0x2f99 & 4; } bool checkRootTransXClearMode() { return field_0x2f99 & 1; } bool checkRootTransYClearMode() { return field_0x2f99 & 2; } + bool checkRootTransClearContinueMode() { return field_0x2f99 & 8; } s16 checkWindStoneHowl() {return mProcVar4.field_0x3010; } u8 getCorrectCurveID() { return mZ2WolfHowlMgr.getCorrectCurveID(); } u8 getCorrectLineNum() { return mZ2WolfHowlMgr.getCorrectLineNum(); } @@ -3506,6 +3525,8 @@ public: u8 getBStatus() { return dComIfGp_getAStatus(); } void setRStatus(u8 param_0, u8 param_1) { dComIfGp_setRStatus(param_0, param_1); } + BOOL checkWindSpeedMoveXZ() const { return mWindSpeed.abs2XZ() > 1.0f; } + inline bool checkWindSpeedOnXZ() const; inline void startRestartRoomFromOut(int, u32, int); inline u16 getReadyItem(); @@ -3690,14 +3711,14 @@ public: /* 0x028F0 */ fpc_ProcID mMsgClassID; /* 0x028F4 */ int mAtnActorID; /* 0x028F8 */ fpc_ProcID field_0x28f8; - /* 0x028FC */ int field_0x28fc; + /* 0x028FC */ fpc_ProcID field_0x28fc; /* 0x02900 */ u32 field_0x2900; /* 0x02904 */ daAlink_footData_c mFootData1[2]; /* 0x02A4C */ daAlink_footData_c mFootData2[2]; /* 0x02B94 */ f32 field_0x2b94; /* 0x02B98 */ f32 field_0x2b98; /* 0x02B98 */ f32 field_0x2b9c; - /* 0x02BA0 */ f32* field_0x2ba0; + /* 0x02BA0 */ f32 field_0x2ba0; /* 0x02BA4 */ f32 field_0x2ba4; /* 0x02BA8 */ f32 mSinkShapeOffset; /* 0x02BAC */ f32 mAcchCirWallH[3]; @@ -3709,7 +3730,7 @@ public: /* 0x02CA8 */ Z2CreatureLink mZ2Link; /* 0x02D78 */ u8* field_0x2d78; /* 0x02D7C */ daPy_frameCtrl_c* field_0x2d7c; - /* 0x02D80 */ int field_0x2d80; + /* 0x02D80 */ void* field_0x2d80; /* 0x02D84 */ Z2WolfHowlMgr mZ2WolfHowlMgr; /* 0x02E44 */ dJntCol_c field_0x2e44; /* 0x02E54 */ dPaPoF_c field_0x2e54; @@ -3871,9 +3892,7 @@ public: /* 0x03060 */ s16 field_0x3060; /* 0x03062 */ s16 field_0x3062; /* 0x03064 */ s16 field_0x3064; - /* 0x03066 */ s16 field_0x3066; - /* 0x03068 */ u8 field_0x3068[2]; - /* 0x0306A */ s16 field_0x306a; + /* 0x03066 */ s16 field_0x3066[3]; /* 0x0306C */ s16 field_0x306c; /* 0x0306E */ s16 field_0x306e; /* 0x03070 */ s16 field_0x3070; @@ -3903,7 +3922,7 @@ public: /* 0x030A8 */ u16 field_0x30a8; /* 0x030AA */ u16 field_0x30aa; /* 0x030AC */ s16 mWolfEyeUp; - /* 0x030AE */ u16 field_0x30ae; + /* 0x030AE */ s16 field_0x30ae; /* 0x030B0 */ s16 field_0x30b0; /* 0x030B2 */ s16 field_0x30b2; /* 0x030B4 */ u16 field_0x30b4; @@ -3977,7 +3996,7 @@ public: /* 0x0319C */ int field_0x319c; /* 0x031A0 */ u32 mModeFlg; /* 0x031A4 */ int field_0x31a4; - /* 0x031A8 */ u8 field_0x31a8[8]; + /* 0x031A8 */ u32 field_0x31a8[2]; /* 0x031B0 */ u32 field_0x31b0[3]; /* 0x031BC */ u32 field_0x31bc; /* 0x031C0 */ u32 field_0x31c0; diff --git a/include/d/actor/d_a_b_mgn.h b/include/d/actor/d_a_b_mgn.h index 8a62c1b4c18..b9da6a5d34e 100644 --- a/include/d/actor/d_a_b_mgn.h +++ b/include/d/actor/d_a_b_mgn.h @@ -71,8 +71,12 @@ public: /* 8060EAE0 */ void CreateHeap(); /* 8060F0D0 */ void create(); + bool isDown() { return field_0xb01 != 0; } + private: - /* 0x5ac */ u8 field_0x5ac[0x26cc - 0x5ac]; + /* 0x05AC */ u8 field_0x5ac[0xB01 - 0x5AC]; + /* 0x0B01 */ u8 field_0xb01; + /* 0x0B02 */ u8 field_0xb02[0x26CC - 0xB02]; }; STATIC_ASSERT(sizeof(daB_MGN_c) == 0x26cc); diff --git a/include/d/actor/d_a_midna.h b/include/d/actor/d_a_midna.h index 2268e77782e..cc67587b7f1 100644 --- a/include/d/actor/d_a_midna.h +++ b/include/d/actor/d_a_midna.h @@ -212,7 +212,7 @@ public: /* 0x00 */ ANM_NONE = 0, }; - void onForcePanic(); + void onForcePanic() { onEndResetStateFlg0(ERFLG0_FORCE_PANIC); } u32 checkForceNormalColor() const; u32 checkForceTiredColor() const; static bool checkMidnaTired(); diff --git a/include/d/actor/d_a_npc_bou.h b/include/d/actor/d_a_npc_bou.h index 6f2c7357a30..ee383764b51 100644 --- a/include/d/actor/d_a_npc_bou.h +++ b/include/d/actor/d_a_npc_bou.h @@ -11,7 +11,7 @@ * @details * */ -class daNpc_Bou_c : public fopAc_ac_c { +class daNpc_Bou_c : public daNpcT_c { public: /* 8096CF8C */ ~daNpc_Bou_c(); /* 8096D0D8 */ void create(); @@ -26,20 +26,7 @@ public: /* 8096DA78 */ void getType(); /* 8096DADC */ void isDelete(); /* 8096DBBC */ void reset(); - /* 8096DD44 */ void afterJntAnm(int); - /* 8096DDC8 */ void setParam(); - /* 8096DF9C */ void checkChangeEvt(); - /* 8096E0EC */ void setAfterTalkMotion(); /* 8096E18C */ void srchActors(); - /* 8096E27C */ void evtTalk(); - /* 8096E31C */ bool evtEndProc(); - /* 8096E324 */ void evtCutProc(); - /* 8096E3EC */ void action(); - /* 8096E7E0 */ void beforeMove(); - /* 8096E8A4 */ void setAttnPos(); - /* 8096EB14 */ void setCollision(); - /* 8096EC6C */ bool drawDbgInfo(); - /* 8096EC74 */ void changeAnm(int*, int*); /* 8096ECC0 */ void selectAction(); /* 8096ED3C */ void chkAction(int (daNpc_Bou_c::*)(void*)); /* 8096ED68 */ void setAction(int (daNpc_Bou_c::*)(void*)); @@ -58,18 +45,55 @@ public: daNpcT_MotionSeqMngr_c::sequenceStepData_c const*, int, daNpcT_MotionSeqMngr_c::sequenceStepData_c const*, int, daNpcT_evtData_c const*, char**); - /* 809727B4 */ s32 getEyeballMaterialNo(); - /* 809727BC */ s32 getHeadJointNo(); - /* 809727C4 */ s32 getNeckJointNo(); - /* 809727CC */ bool getBackboneJointNo(); - /* 809727D4 */ void checkChangeJoint(int); - /* 809727E4 */ void checkRemoveJoint(int); + + /* 809727D4 */ virtual int checkChangeJoint(int); + /* 809727E4 */ virtual int checkRemoveJoint(int); + /* 809727CC */ virtual s32 getBackboneJointNo(); + /* 809727C4 */ virtual s32 getNeckJointNo(); + /* 809727BC */ virtual s32 getHeadJointNo(); + /* 809727B4 */ virtual s32 getEyeballMaterialNo(); + /* 8096DD44 */ virtual void afterJntAnm(int); + /* 8096DDC8 */ virtual void setParam(); + /* 8096DF9C */ virtual bool checkChangeEvt(); + /* 8096E27C */ virtual bool evtTalk(); + /* 8096E31C */ virtual bool evtEndProc(); + /* 8096E324 */ virtual bool evtCutProc(); + /* 8096E0EC */ virtual void setAfterTalkMotion(); + /* 8096E3EC */ virtual void action(); + /* 8096E7E0 */ virtual void beforeMove(); + /* 8096E8A4 */ virtual void setAttnPos(); + /* 8096EB14 */ virtual void setCollision(); + /* 8096EC6C */ virtual int drawDbgInfo(); + /* 8096EC74 */ virtual void changeAnm(int*, int*); static void* mCutNameList[9]; static u8 mCutList[108]; + BOOL speakTo() { + if (field_0xf80 == 4) { + if (current.pos.absXZ(daPy_getPlayerActorClass()->current.pos) < 1100.0f && strlen(field_0x570[5].eventName) != 0) { + u32 len = strlen(field_0x574[field_0x570[5].num]); + if (len != 0) { + eventInfo.setArchiveName(field_0x574[field_0x570[5].num]); + dComIfGp_getEventManager().setObjectArchive(eventInfo.getArchiveName()); + } + + field_0xe1c = dComIfGp_getEventManager().getEventIdx(this, field_0x570[5].eventName, 0xFF); + fopAcM_orderOtherEventId(this, field_0xe1c, 0xFF, 0xFFFF, 4, 1); + return 1; + } + } + + return 0; + } + private: - /* 0x568 */ u8 field_0x568[0xffc - 0x568]; + /* 0xE40 */ u8 field_0xE40[0xE44 - 0xE40]; + /* 0xE44 */ dCcD_Cyl field_0xe44; + /* 0xF80 */ u8 field_0xf80; + /* 0xF84 */ daNpcT_ActorMngr_c field_0xf84[3]; + /* 0xF9C */ daNpcT_Path_c field_0xf9c; + /* 0xFC4 */ u8 field_0xfc4[0xFFC - 0xFC4]; }; STATIC_ASSERT(sizeof(daNpc_Bou_c) == 0xffc); diff --git a/include/d/actor/d_a_npc_kolin.h b/include/d/actor/d_a_npc_kolin.h index 6e715ee89ed..a721455eefd 100644 --- a/include/d/actor/d_a_npc_kolin.h +++ b/include/d/actor/d_a_npc_kolin.h @@ -11,7 +11,7 @@ * @details * */ -class daNpc_Kolin_c : public fopAc_ac_c { +class daNpc_Kolin_c : public daNpcT_c { public: /* 80553FEC */ ~daNpc_Kolin_c(); /* 80554138 */ void create(); @@ -24,21 +24,7 @@ public: /* 80554A90 */ void getType(); /* 80554B30 */ void isDelete(); /* 80554CB0 */ void reset(); - /* 80554EBC */ void afterJntAnm(int); - /* 80554F48 */ void setParam(); - /* 80555118 */ void checkChangeEvt(); - /* 8055523C */ void setAfterTalkMotion(); /* 805552DC */ void srchActors(); - /* 80555448 */ void evtTalk(); - /* 805554E8 */ void evtCutProc(); - /* 805555B0 */ void action(); - /* 8055574C */ void beforeMove(); - /* 80555810 */ void setAttnPos(); - /* 80555B48 */ void setCollision(); - /* 80555CE4 */ bool drawDbgInfo(); - /* 80555CEC */ void drawOtherMdl(); - /* 80555DC4 */ void changeAnm(int*, int*); - /* 80555DEC */ void changeBck(int*, int*); /* 80555E38 */ void selectAction(); /* 80555F28 */ void chkAction(int (daNpc_Kolin_c::*)(void*)); /* 80555F54 */ void setAction(int (daNpc_Kolin_c::*)(void*)); @@ -64,20 +50,62 @@ public: daNpcT_MotionSeqMngr_c::sequenceStepData_c const*, int, daNpcT_MotionSeqMngr_c::sequenceStepData_c const*, int, daNpcT_evtData_c const*, char**); - /* 8055A498 */ s32 getEyeballMaterialNo(); - /* 8055A4A0 */ s32 getHeadJointNo(); - /* 8055A4A8 */ s32 getNeckJointNo(); - /* 8055A4B0 */ bool getBackboneJointNo(); - /* 8055A4B8 */ void checkChangeJoint(int); - /* 8055A4C8 */ void checkRemoveJoint(int); - /* 8055A4D8 */ s32 getFootLJointNo(); - /* 8055A4E0 */ s32 getFootRJointNo(); + + /* 8055A4B8 */ virtual int checkChangeJoint(int); + /* 8055A4C8 */ virtual int checkRemoveJoint(int); + /* 8055A4B0 */ virtual s32 getBackboneJointNo(); + /* 8055A4A8 */ virtual s32 getNeckJointNo(); + /* 8055A4A0 */ virtual s32 getHeadJointNo(); + /* 8055A4D8 */ virtual s32 getFootLJointNo(); + /* 8055A4E0 */ virtual s32 getFootRJointNo(); + /* 8055A498 */ virtual s32 getEyeballMaterialNo(); + /* 80554EBC */ virtual void afterJntAnm(int); + /* 80554F48 */ virtual void setParam(); + /* 80555118 */ virtual bool checkChangeEvt(); + /* 80555448 */ virtual bool evtTalk(); + /* 805554E8 */ virtual bool evtCutProc(); + /* 8055523C */ virtual void setAfterTalkMotion(); + /* 805555B0 */ virtual void action(); + /* 8055574C */ virtual void beforeMove(); + /* 80555810 */ virtual void setAttnPos(); + /* 80555B48 */ virtual void setCollision(); + /* 80555CE4 */ virtual int drawDbgInfo(); + /* 80555CEC */ virtual void drawOtherMdl(); + /* 80555DC4 */ virtual void changeAnm(int*, int*); + /* 80555DEC */ virtual void changeBck(int*, int*); static void* mCutNameList[11]; static u8 mCutList[132]; + BOOL orderNoRideEvt() { + if (field_0xf84 == 11) { + s16 var_r28 = (s16)(fopAcM_searchPlayerAngleY(this) - home.angle.y); + int var_r29 = 3; + + if (var_r28 < 0) { + var_r29 = 2; + } + + if (strlen(field_0x570[var_r29].eventName) != 0) { + u32 len = strlen(field_0x574[field_0x570[var_r29].num]); + if (len != 0) { + eventInfo.setArchiveName(field_0x574[field_0x570[var_r29].num]); + dComIfGp_getEventManager().setObjectArchive(eventInfo.getArchiveName()); + } + + field_0xe1c = dComIfGp_getEventManager().getEventIdx(this, field_0x570[var_r29].eventName, 0xFF); + fopAcM_orderOtherEventId(this, field_0xe1c, 0xFF, 0xFFFF, 4, 1); + return 1; + } + } + + return 0; + } + private: - /* 0x568 */ u8 field_0x568[0x1020 - 0x568]; + /* 0x0E40 */ u8 field_0xe40[0xF84 - 0xE40]; + /* 0x0F84 */ u8 field_0xf84; + /* 0x0F85 */ u8 field_0xf85[0x1020 - 0xF85]; }; STATIC_ASSERT(sizeof(daNpc_Kolin_c) == 0x1020); diff --git a/include/d/actor/d_a_player.h b/include/d/actor/d_a_player.h index 69b20617f3a..8f95de926d6 100644 --- a/include/d/actor/d_a_player.h +++ b/include/d/actor/d_a_player.h @@ -19,6 +19,7 @@ public: void onDrawFlg() { mDrawFlag = true; } void offDrawFlg() { mDrawFlag = false; } void setPos(const cXyz* i_pos) { mPos = *i_pos; } + cXyz* getPosP() { return &mPos; } /* 0x04 */ bool mDrawFlag; /* 0x05 */ u8 field_0x5[3]; @@ -79,6 +80,8 @@ public: u8* getBuffer() { return mBuffer; } bool checkNoSetIdx() const { return mIdx == 0xFFFF; } bool checkNoSetPriIdx() const { return mPriIdx == 0xFFFF; } + u16 getArcNo() const { return mArcNo; } + void setIdx(u16 i_idx) { mIdx = i_idx; } private: /* 0x00 */ u16 mIdx; @@ -213,7 +216,7 @@ public: /* 0x05D4 */ cXyz mRightHandPos; /* 0x05E0 */ cXyz mLeftFootPos; /* 0x05EC */ cXyz mRightFootPos; - /* 0x05F8 */ u8 field_0x5f8[0xC]; + /* 0x05F8 */ cXyz field_0x5f8; /* 0x0604 */ daPy_demo_c mDemo; public: @@ -258,12 +261,14 @@ public: FLG1_UNK_10000000 = 0x10000000, FLG1_UNK_4000000 = 0x4000000, FLG1_IS_WOLF = 0x2000000, + FLG1_UNK_1000000 = 0x1000000, FLG1_UNK_800000 = 0x800000, FLG1_DASH_MODE = 0x400000, FLG1_UNK_200000 = 0x200000, FLG1_UNK_100000 = 0x100000, FLG1_MIDNA_ATN_POS = 0x80000, FLG1_UNK_40000 = 0x40000, + FLG1_UNK_20000 = 0x20000, FLG1_UNK_10000 = 0x10000, FLG1_UNK_8000 = 0x8000, FLG1_THROW_DAMAGE = 0x4000, @@ -276,6 +281,7 @@ public: FLG1_UNK_40 = 0x40, FLG1_UNK_20 = 0x20, FLG1_UNK_10 = 0x10, + FLG1_UNK_8 = 8, FLG1_UNK_4 = 4, FLG1_UNK_2 = 2, FLG1_UNK_1 = 1, @@ -374,6 +380,7 @@ public: ERFLG0_UNK_40000 = 0x40000, ERFLG0_UNK_20000 = 0x20000, ERFLG0_UNK_10000 = 0x10000, + ERFLG0_UNK_4000 = 0x4000, ERFLG0_UNK_2000 = 0x2000, ERFLG0_UNK_1000 = 0x1000, ERFLG0_UNK_400 = 0x400, @@ -441,6 +448,7 @@ public: RFLG0_UNK_10000000 = 0x10000000, RFLG0_UNK_8000000 = 0x8000000, RFLG0_UNK_4000000 = 0x4000000, + RFLG0_UNK_2000000 = 0x2000000, RFLG0_GRAB_PUT_START = 0x400000, RFLG0_WOLF_GROWL = 0x200000, RFLG0_UNK_80000 = 0x80000, diff --git a/include/d/d_attention.h b/include/d/d_attention.h index c17aab2eb69..958a9f36839 100644 --- a/include/d/d_attention.h +++ b/include/d/d_attention.h @@ -85,6 +85,8 @@ public: /* 80073CEC */ void proc(); /* 80073D08 */ int request(fopAc_ac_c*, f32, f32, f32, s16, int); + fopAc_ac_c* getLookTarget() { return convPId(mLookTargetID); } + private: u32 field_0x0; s32 field_0x4; @@ -234,6 +236,10 @@ public: param_5); } + fopAc_ac_c* getLookTarget() { + return mLookTarget.getLookTarget(); + } + void Init(fopAc_ac_c* param_0, u32 i_padNo) { mpPlayer = param_0; mPadNo = i_padNo; diff --git a/include/d/d_bg_s_acch.h b/include/d/d_bg_s_acch.h index 9b1adf90951..264cf90850a 100644 --- a/include/d/d_bg_s_acch.h +++ b/include/d/d_bg_s_acch.h @@ -193,7 +193,7 @@ public: // inline dupe void i_ClrGroundHit() { m_flags &= ~GROUND_HIT; } - bool i_ChkGroundHit() const { return m_flags & GROUND_HIT; } + u32 i_ChkGroundHit() const { return m_flags & GROUND_HIT; } public: /* 0x02C */ u32 m_flags; diff --git a/include/d/d_com_inf_game.h b/include/d/d_com_inf_game.h index e839029c525..f884ae040a0 100644 --- a/include/d/d_com_inf_game.h +++ b/include/d/d_com_inf_game.h @@ -2060,6 +2060,10 @@ inline void dComIfGp_att_CatchRequest(fopAc_ac_c* param_0, u8 param_1, f32 i_hor i_downDist, i_angle, param_5); } +inline fopAc_ac_c* dComIfGp_att_getLookTarget() { + return dComIfGp_getAttention().getLookTarget(); +} + inline J2DGrafContext* dComIfGp_getCurrentGrafPort() { return g_dComIfG_gameInfo.play.getCurrentGrafPort(); } diff --git a/include/d/d_kankyo.h b/include/d/d_kankyo.h index 4f95c534635..ff4580d46f2 100644 --- a/include/d/d_kankyo.h +++ b/include/d/d_kankyo.h @@ -53,6 +53,7 @@ void dKy_actor_addcol_amb_set(s16 r, s16 g, s16 b, f32 factor); void dKy_bg_addcol_amb_set(s16 r, s16 g, s16 b, f32 factor); int dKy_WolfEyeLight_set(cXyz* param_0, f32 param_1, f32 param_2, f32 param_3, GXColor* param_4, f32 param_5, u8 param_6, u8 param_7); +BOOL dKy_TeachWind_existence_chk(); struct LIGHT_INFLUENCE { /* 0x00 */ cXyz mPosition; diff --git a/include/m_Do/m_Do_audio.h b/include/m_Do/m_Do_audio.h index 61e7883e5b0..f111436f98a 100644 --- a/include/m_Do/m_Do_audio.h +++ b/include/m_Do/m_Do_audio.h @@ -3,6 +3,7 @@ #include "Z2AudioLib/Z2AudioMgr.h" #include "Z2AudioLib/Z2EnvSeMgr.h" +#include "Z2AudioLib/Z2Creature.h" class mDoAud_zelAudio_c : public Z2AudioMgr { public: @@ -156,6 +157,12 @@ inline void mDoAud_setCameraGroupInfo(u8 param_0) { Z2AudioMgr::getInterface()->setCameraGroupInfo(param_0); } +inline void mDoAud_setLinkShieldType(s32 param_0, s32 param_1) { + if (Z2GetLink() != NULL) { + Z2GetLink()->setLinkShieldType(param_0, param_1); + } +} + inline void mDoAud_mEnvse_framework() { g_mEnvSeMgr.framework(); } diff --git a/include/m_Do/m_Do_ext.h b/include/m_Do/m_Do_ext.h index 2ccc09ee014..0d557415a7e 100644 --- a/include/m_Do/m_Do_ext.h +++ b/include/m_Do/m_Do_ext.h @@ -450,7 +450,8 @@ struct mDoExt_MtxCalcAnmBlendTbl } } - /* 800D00BC */ J3DAnmTransform* getAnm(int); + J3DAnmTransform* getAnm(int i) { return mAnmRatio[i].getAnmTransform(); } + f32 getRatio(int i) { return mAnmRatio[i].getRatio(); } /* 80014F3C */ virtual ~mDoExt_MtxCalcAnmBlendTbl() {} /* 8000F26C */ virtual void calc(); diff --git a/include/m_Do/m_Do_mtx.h b/include/m_Do/m_Do_mtx.h index 4a762c813b6..85824eee10b 100644 --- a/include/m_Do/m_Do_mtx.h +++ b/include/m_Do/m_Do_mtx.h @@ -212,6 +212,10 @@ public: */ /* 8000CF44 */ static void ZXYrotM(csXyz const& xyz); + static void quatS(const Quaternion* quat) { + MTXQuat(now, (PSQuaternion*)quat); + } + /* 8000CF7C */ static void quatM(Quaternion const*); /* 8000D070 */ ~mDoMtx_stack_c() {} // inline diff --git a/src/SSystem/SComponent/c_m3d.cpp b/src/SSystem/SComponent/c_m3d.cpp index 43c90e866ef..1e048cc8349 100644 --- a/src/SSystem/SComponent/c_m3d.cpp +++ b/src/SSystem/SComponent/c_m3d.cpp @@ -2150,7 +2150,7 @@ static int cM3d_2PlaneCrossLine(const cM3dGPla& pPlaneA, const cM3dGPla& pPlaneB /* 8026E8A0-8026E980 2691E0 00E0+00 0/0 1/1 0/0 .text * cM3d_3PlaneCrossPos__FRC8cM3dGPlaRC8cM3dGPlaRC8cM3dGPlaP3Vec */ -bool cM3d_3PlaneCrossPos(const cM3dGPla& pPlaneA, const cM3dGPla& pPlaneB, const cM3dGPla& pPlaneC, +BOOL cM3d_3PlaneCrossPos(const cM3dGPla& pPlaneA, const cM3dGPla& pPlaneB, const cM3dGPla& pPlaneC, Vec* pVecOut) { cM3dGLin lin; if (!cM3d_2PlaneCrossLine(pPlaneA, pPlaneB, &lin)) { diff --git a/src/d/actor/d_a_alink.cpp b/src/d/actor/d_a_alink.cpp index 2d4106e69d2..4823cd6053f 100644 --- a/src/d/actor/d_a_alink.cpp +++ b/src/d/actor/d_a_alink.cpp @@ -42,6 +42,13 @@ #include "d/d_bomb.h" #include "d/d_meter2_info.h" #include "d/actor/d_a_kytag05.h" +#include "d/actor/d_a_b_mgn.h" +#include "d/actor/d_a_npc_bou.h" +#include "d/actor/d_a_npc_kolin.h" +#include "f_op/f_op_kankyo_mng.h" +#include "d/actor/d_a_tag_mstop.h" +#include "d/actor/d_a_tag_mwait.h" +#include "d/actor/d_a_canoe.h" static fopAc_ac_c* daAlink_searchTagKandelaar(fopAc_ac_c* i_actor, void* i_data); @@ -108,13 +115,10 @@ static u8 struct_80450FC4[4]; /* 80450FC8-80450FCC -00001 0004+00 5/5 0/0 0/0 .sbss None */ /* 80450FC8 0001+00 data_80450FC8 None */ -static bool m_eye_move_flg; +bool daAlink_matAnm_c::m_eye_move_flg; /* 80450FC9 0003+00 data_80450FC9 None */ -#pragma push -#pragma force_active on u8 daAlink_matAnm_c::m_morf_frame; -#pragma pop // temporary for literal matching bool daAlink_c::checkWindSpeedOnXZ() const { @@ -244,18 +248,305 @@ void daAlink_c::setMatrixWorldAxisRot(MtxP param_0, s16 param_1, s16 param_2, s1 } /* 8009DD90-8009E7B8 0986D0 0A28+00 2/2 0/0 0/0 .text jointControll__9daAlink_cFi */ -void daAlink_c::jointControll(int param_0) { - // NONMATCHING +// NONMATCHING - stack issues +int daAlink_c::jointControll(int param_0) { + csXyz sp18(0, 0, 0); + int var_r27 = 0; + + mDoExt_MtxCalcOldFrame* temp = field_0x2060; + J3DTransformInfo* temp_r3 = temp->getOldFrameTransInfo(param_0); + J3DTransformInfo sp80 = *temp_r3; + + Quaternion sp50; + Quaternion sp40; + Quaternion sp30; + Quaternion sp20 = *temp->getOldFrameQuaternion(param_0); + + csXyz sp10(0, 1, 2); + + if (checkWolf()) { + if (param_0 == 0) { + if (mProcID == PROC_TOOL_DEMO) { + J3DTransformInfo* temp_r3_3 = field_0x2060->getOldFrameTransInfo(0); + temp_r3_3->mTranslate.x = 0.0f; + temp_r3_3->mTranslate.z = 0.0f; + } else if (checkRootTransClearMode()) { + J3DTransformInfo* temp_r28 = field_0x2060->getOldFrameTransInfo(0); + + if (checkRootTransZClearMode()) { + temp_r28->mTranslate.z = field_0x3588.z; + } + + if (checkRootTransXClearMode()) { + temp_r28->mTranslate.x = field_0x3588.x; + } + + if (checkRootTransYClearMode()) { + temp_r28->mTranslate.y = field_0x33b0; + } + } + + sp18.set(field_0x3080, 0, field_0x3082); + sp10.set(2, 1, 0); + sp80 = *field_0x2060->getOldFrameTransInfo(0); + var_r27 |= 2; + } else if (param_0 == 3) { + sp18.set((field_0x30d6 + field_0x30b2), 0, field_0x30b0); + sp10.set(2, 0, 1); + } else if (param_0 == 0x1A) { + sp18.set(0, -field_0x2fec, 0); + sp10.set(2, 1, 0); + } else if (param_0 >= 0x25 && param_0 <= 0x27) { + sp18.set(0, field_0x3040[param_0 + 5], 0); + sp10.set(2, 1, 0); + } else if (param_0 == 2) { + sp18.set(0, -field_0x2fec, 0); + sp10.set(2, 1, 0); + } else if (param_0 == 4) { + sp18.set(field_0x3124, -field_0x3126, field_0x3128); + sp10.set(2, 1, 0); + } + } else if (param_0 == 4) { + sp18.set(field_0x3124, -field_0x3126, field_0x3128); + sp10.set(2, 1, 0); + } else if (param_0 == 0x10) { + sp18.set(field_0x3088, 0, -field_0x308a); + sp10.set(2, 0, 1); + } else if (param_0 == 1) { + s16 sp8; + if (checkReinRide() && !checkHorseLieAnime() && mProcID != PROC_HORSE_RUN && mProcID != PROC_BOAR_RUN) { + sp8 = (s16)(mBodyAngle.x - shape_angle.x); + } else { + sp8 = mBodyAngle.x; + } + + if (sp8 || field_0x30c8 != 0 || mBodyAngle.z != 0) { + setMatrixWorldAxisRot(mpLinkModel->getAnmMtx(1), sp8, field_0x30c8, mBodyAngle.z, 1, NULL); + } + } else if (param_0 == 2) { + if (field_0x30c8 != 0) { + setMatrixWorldAxisRot(mpLinkModel->getAnmMtx(2), 0, field_0x30c8, 0, 1, NULL); + } + } else if (param_0 == 0) { + if (mProcID == PROC_TOOL_DEMO || mProcID == PROC_GANON_FINISH) { + J3DTransformInfo* temp_r3_4 = field_0x2060->getOldFrameTransInfo(0); + temp_r3_4->mTranslate.x = 0.0f; + temp_r3_4->mTranslate.z = 0.0f; + } else if (checkRootTransClearMode()) { + J3DTransformInfo* temp_r28_2 = field_0x2060->getOldFrameTransInfo(0); + if (checkRootTransZClearMode()) { + temp_r28_2->mTranslate.z = field_0x3588.z; + } + if (checkRootTransXClearMode()) { + temp_r28_2->mTranslate.x = field_0x3588.x; + } + if (checkRootTransYClearMode()) { + temp_r28_2->mTranslate.y = field_0x33b0; + } + } + + sp18.set(field_0x3080, 0, field_0x3082); + sp10.set(2, 0, 1); + + sp80 = *field_0x2060->getOldFrameTransInfo(0); + var_r27 |= 2; + if (field_0x2f99 == 0x60) { + sp80.mTranslate.x -= field_0x384c->x; + sp80.mTranslate.y -= field_0x384c->y; + sp80.mTranslate.z -= field_0x384c->z; + } + } else if (param_0 == 0x1B) { + setMatrixWorldAxisRot(mpLinkModel->getAnmMtx(param_0), mFootData1[0].field_0x6, 0, 0, 1, NULL); + } else if (param_0 == 0x1D) { + setMatrixWorldAxisRot(mpLinkModel->getAnmMtx(param_0), mFootData1[1].field_0x6, 0, 0, 1, NULL); + } else if (param_0 == 5) { + if (checkReinRide() && checkBowAnime()) { + var_r27 = 1; + sp50 = *field_0x2060->getOldFrameQuaternion(param_0); + JMAEulerToQuat(0, 0, 5000, &sp40); + mDoMtx_QuatConcat(&sp50, &sp40, &sp30); + } + } else if ((param_0 == 0xD || param_0 == 0xC) && (checkCanoeFishingWaitAnime() || checkUnderMove0BckNoArc(ANM_CANOE_FISH_LEFT) || checkUnderMove0BckNoArc(ANM_CANOE_FISH_RIGHT))) { + if (param_0 == 0xD) { + sp18 = field_0x3160; + } else { + sp18 = mFishingArm1Angle; + } + } + + if (sp18.x != 0 || sp18.y != 0 || sp18.z != 0) { + var_r27 |= 1; + if (sp18.y != 0) { + sp50 = *field_0x2060->getOldFrameQuaternion(param_0); + + if (sp10.y == 0) { + JMAEulerToQuat(sp18.y, 0, 0, &sp40); + } else if (sp10.y == 1) { + JMAEulerToQuat(0, sp18.y, 0, &sp40); + } else { + JMAEulerToQuat(0, 0, sp18.y, &sp40); + } + + mDoMtx_QuatConcat(&sp50, &sp40, &sp30); + } else { + sp30 = *field_0x2060->getOldFrameQuaternion(param_0); + } + + if (sp18.x != 0) { + sp50 = sp30; + + if (sp10.x == 0) { + JMAEulerToQuat(sp18.x, 0, 0, &sp40); + } else if (sp10.x == 1) { + JMAEulerToQuat(0, sp18.x, 0, &sp40); + } else { + JMAEulerToQuat(0, 0, sp18.x, &sp40); + } + + mDoMtx_QuatConcat(&sp50, &sp40, &sp30); + } + + if (sp18.z != 0) { + sp50 = sp30; + + if (sp10.z == 0) { + JMAEulerToQuat(sp18.z, 0, 0, &sp40); + } else if (sp10.z == 1) { + JMAEulerToQuat(0, sp18.z, 0, &sp40); + } else { + JMAEulerToQuat(0, 0, sp18.z, &sp40); + } + + mDoMtx_QuatConcat(&sp50, &sp40, &sp30); + } + } + + if (var_r27 != 0) { + MtxP temp_r26 = mpLinkModel->getAnmMtx(param_0); + + J3DTransformInfo* var_r25; + if ((var_r27 & 2)) { + var_r25 = &sp80; + } else { + var_r25 = field_0x2060->getOldFrameTransInfo(param_0); + } + + Quaternion* spC; + if ((var_r27 & 1)) { + spC = &sp30; + } else { + spC = field_0x2060->getOldFrameQuaternion(param_0); + } + + mDoMtx_stack_c::transS(sp80.mTranslate.x, sp80.mTranslate.y, sp80.mTranslate.z); + mDoMtx_stack_c::quatM(&sp20); + mDoMtx_stack_c::inverse(); + cMtx_concat(temp_r26, mDoMtx_stack_c::get(), J3DSys::mCurrentMtx); + + MTXQuat(temp_r26, (PSQuaternion*)spC); + + temp_r26[0][3] = var_r25->mTranslate.x; + temp_r26[1][3] = var_r25->mTranslate.y; + temp_r26[2][3] = var_r25->mTranslate.z; + + cMtx_concat(J3DSys::mCurrentMtx, temp_r26, J3DSys::mCurrentMtx); + cMtx_copy(J3DSys::mCurrentMtx, temp_r26); + } + + return 1; } /* 8009E7B8-8009E91C 0990F8 0164+00 1/1 0/0 0/0 .text setUpperFront__9daAlink_cFv */ void daAlink_c::setUpperFront() { - // NONMATCHING + if ((checkReinRide() && checkUpperReadyThrowAnime()) || (checkBoardRide() && !checkNoUpperAnime())) { + cMtx_copy(J3DSys::mCurrentMtx, mRootMtx); + + J3DAnmTransform* temp_r3 = getNowAnmPackUpper(UPPER_2); + if (temp_r3 != NULL) { + MtxP temp_r28 = mDoMtx_stack_c::get(); + + J3DTransformInfo sp18; + temp_r3->getTransform(0, &sp18); + + Quaternion sp8; + JMAEulerToQuat(sp18.mRotation.x, sp18.mRotation.y, sp18.mRotation.z, &sp8); + MTXQuat(temp_r28, (PSQuaternion*)&sp8); + + cMtx_concat(mpLinkModel->getBaseTRMtx(), temp_r28, J3DSys::mCurrentMtx); + J3DSys::mCurrentMtx[0][3] = mRootMtx[0][3]; + J3DSys::mCurrentMtx[1][3] = mRootMtx[1][3]; + J3DSys::mCurrentMtx[2][3] = mRootMtx[2][3]; + } else { + mDoMtx_stack_c::quatS(field_0x2060->getOldFrameQuaternion( 0)); + mDoMtx_stack_c::inverse(); + cMtx_concat(J3DSys::mCurrentMtx, mDoMtx_stack_c::get(), J3DSys::mCurrentMtx); + } + + field_0x2f90 = 1; + } } /* 8009E91C-8009EB18 09925C 01FC+00 1/1 0/0 0/0 .text changeBlendRate__9daAlink_cFi */ void daAlink_c::changeBlendRate(int param_0) { - // NONMATCHING + if (field_0x2fb6 == 5) { + if (param_0 == 0) { + mNowAnmPackUpper[2].setRatio(0.0f); + } else if (param_0 == 5) { + mNowAnmPackUpper[2].setRatio(field_0x3444); + } else if (param_0 == 0xA) { + mNowAnmPackUpper[2].setRatio(0.0f); + } else if (param_0 == 0xF) { + mNowAnmPackUpper[2].setRatio(field_0x3444); + } + } else if (field_0x2fb6 == 1) { + if (param_0 == 0) { + mNowAnmPackUpper[2].setRatio(0.0f); + } else if (param_0 == 5) { + mNowAnmPackUpper[2].setRatio(field_0x3444); + } + } else if (field_0x2fb6 == 2) { + if (param_0 == 0xA) { + mNowAnmPackUpper[2].setRatio(0.0f); + } else if (param_0 == 0xF) { + mNowAnmPackUpper[2].setRatio(field_0x3444); + } + } else if (field_0x2fb6 == 3) { + if (param_0 == 4) { + mNowAnmPackUpper[2].setRatio(0.0f); + } else if (param_0 == 5) { + mNowAnmPackUpper[2].setRatio(field_0x3444); + } + } else if (field_0x2fb6 == 7) { + if (param_0 == 0) { + mNowAnmPackUpper[2].setRatio(0.0f); + } else if (param_0 == 4) { + mNowAnmPackUpper[2].setRatio(1.0f); + } else if (param_0 == 5) { + mNowAnmPackUpper[2].setRatio(0.0f); + } else if (param_0 == 0xF) { + mNowAnmPackUpper[2].setRatio(1.0f); + } + } else if (field_0x2fb6 == 6) { + if (param_0 == 4) { + setDoubleAnimeBlendRatio(1.0f); + } else if (param_0 == 5) { + setDoubleAnimeBlendRatio(0.0f); + } + } else if (field_0x2fb6 == 8) { + if (param_0 == 4) { + mNowAnmPackUpper[2].setRatio(0.0f); + mNowAnmPackUpper[1].setRatio(1.0f); + } else if (param_0 == 5) { + mNowAnmPackUpper[2].setRatio(field_0x3444); + mNowAnmPackUpper[1].setRatio(0.0f); + } + } else if (field_0x2fb6 == 4) { + if (param_0 == 0) { + mNowAnmPackUpper[2].setRatio(0.0f); + } else if (param_0 == 0xD) { + mNowAnmPackUpper[2].setRatio(field_0x3444); + } + } } /* 8009EB18-8009EB58 099458 0040+00 1/1 0/0 0/0 .text resetRootMtx__9daAlink_cFv */ @@ -306,8 +597,49 @@ static const u8 lit_6848[8] = { }; /* 8009ECA0-8009EF38 0995E0 0298+00 1/1 0/0 0/0 .text headModelCallBack__9daAlink_cFi */ -void daAlink_c::headModelCallBack(int param_0) { - // NONMATCHING +int daAlink_c::headModelCallBack(int param_0) { + if (mpDemoHDTmpBck == NULL || !mpDemoHDTmpBck->getBckAnm() || (checkEndResetFlg1(ERFLG1_UNK_400000) && param_0 < 6)) { + if (checkNoResetFlg2(FLG2_STATUS_WINDOW_DRAW)) { + mDoMtx_stack_c::copy(J3DSys::mCurrentMtx); + mDoMtx_stack_c::ZrotM(-6500); + mpLinkHatModel->setAnmMtx(param_0, mDoMtx_stack_c::get()); + cMtx_copy(mDoMtx_stack_c::get(), J3DSys::mCurrentMtx); + } else if (param_0 >= 6) { + mDoMtx_stack_c::copy(J3DSys::mCurrentMtx); + + if (param_0 == 6) { + mDoMtx_stack_c::XYZrotM(0, (field_0x3040[7] >> 1), (field_0x302c[7] >> 1)); + } else { + int temp_r28 = param_0 - 7; + if (temp_r28 == 0) { + mDoMtx_stack_c::XYZrotM(0, (field_0x3040[7] >> 1), ((field_0x302c[7] >> 1) + field_0x3066[0])); + } else { + mDoMtx_stack_c::XYZrotM(0, field_0x3040[param_0], (field_0x302c[param_0] + field_0x3066[temp_r28])); + } + } + + if (mProcID == PROC_METAMORPHOSE) { + mDoMtx_stack_c::scaleM(field_0x347c, 1.0f, 1.0f); + } + + mpLinkHatModel->setAnmMtx(param_0, mDoMtx_stack_c::get()); + cMtx_copy(mDoMtx_stack_c::get(), J3DSys::mCurrentMtx); + } else { + s16 temp_r27 = shape_angle.y; + shape_angle.y = field_0x3062; + setMatrixWorldAxisRot(mpLinkHatModel->getAnmMtx(param_0), field_0x302c[param_0], 0, field_0x3040[param_0], 0, NULL); + shape_angle.y = temp_r27; + } + } + + if (checkZoraWearAbility() && param_0 == 6) { + mDoMtx_stack_c::copy(J3DSys::mCurrentMtx); + mDoMtx_stack_c::scaleM(1.2f, 1.0f, 1.0f); + mpLinkHatModel->setAnmMtx(param_0, mDoMtx_stack_c::get()); + cMtx_copy(mDoMtx_stack_c::get(), J3DSys::mCurrentMtx); + } + + return 1; } /* 8009EF38-8009EF7C 099878 0044+00 1/1 0/0 0/0 .text daAlink_headModelCallBack__FP8J3DJointi */ @@ -509,7 +841,256 @@ static const GXColorS10 waterColor = {0, 0, 0, 0}; /* 8009F034-8009FFF8 099974 0FC4+00 1/1 0/0 0/0 .text setHatAngle__9daAlink_cFv */ void daAlink_c::setHatAngle() { - // NONMATCHING + if (field_0x2060->getOldFrameFlg()) { + if (checkEndResetFlg0(ERFLG0_UNK_800000)) { + for (int i = 0; i < 3; i++) { + field_0x3054[i] = 0; + field_0x305a[i] = 0; + } + } + + cXyz spB4; + cXyz spA8; + cXyz sp9C; + cXyz sp90; + + int sp38; + if (checkNoResetFlg2(daPy_FLG2(FLG2_UNK_100000 | FLG2_UNK_80000))) { + sp38 = 0; + } else { + sp38 = 7; + } + + mDoMtx_multVecZero(mpLinkHatModel->getAnmMtx(sp38), &spA8); + + BOOL sp34; + if (!checkEndResetFlg1(ERFLG1_UNK_80000) && (field_0x35b8.abs2() > 100.0f || (checkEndResetFlg0(ERFLG0_UNK_8) && (field_0x3400 * field_0x3400) + (field_0x3404 * field_0x3404) > 100.0f))) { + sp34 = 1; + } else { + sp34 = 0; + } + + f32 sp40; + dKyw_get_AllWind_vec(&spA8, &spB4, &sp40); + + if (checkModeFlg(0x40000) || checkEndResetFlg1(ERFLG1_UNK_80000)) { + sp40 = 0.0f; + } else if (sp34 != 0) { + sp40 = 1.0f; + } + + f32 var_f29; + f32 var_f28; + f32 temp_f26 = 25.0f * (sp40 * sp40); + + s16 sp14 = field_0x3060; + s16 sp12 = field_0x3062; + cXyz sp84 = eyePos - field_0x34e0; + + if (checkMagneBootsOn()) { + mDoMtx_multVecSR(mMagneBootInvMtx, &sp84, &sp84); + mDoMtx_multVecZero(mpLinkHatModel->getAnmMtx(0), &sp90); + sp90 = field_0x34e0 - sp90; + mDoMtx_multVecSR(mMagneBootInvMtx, &sp90, &sp90); + } + + field_0x3062 = sp84.atan2sX_Z(); + + s16 spE; + if (mProcID == PROC_GOAT_CATCH) { + mDoMtx_multVecSR(mpLinkModel->getAnmMtx(1), &cXyz::BaseY, &sp90); + spE = sp90.atan2sX_Z(); + } else if (checkUnderMove0BckNoArc(ANM_HORSE_WAIT_B) && mUnderFrameCtrl[0].getFrame() < 77.0f) { + mDoMtx_multVecSR(mpLinkModel->getAnmMtx(4), &cXyz::BaseX, &sp90); + spE = sp90.atan2sX_Z(); + } else if (mProcID == PROC_HAND_PAT && mProcVar2.field_0x300c == 0) { + spE = shape_angle.y + mBodyAngle.y + 0x8000; + } else { + spE = (shape_angle.y + mBodyAngle.y); + } + + if (cLib_distanceAngleS(field_0x3062, spE) > 0x7000) { + field_0x3060 = cM_atan2s(-sp84.y, -sp84.absXZ()); + } else { + field_0x3060 = sp84.atan2sY_XZ(); + } + + f32 temp_f1 = sp84.absXZ(); + if (temp_f1 < 0.01f) { + var_f29 = cM_ssin(spE); + var_f28 = cM_scos(spE); + } else { + f32 temp_f31 = 1.0f / temp_f1; + var_f29 = sp84.x * temp_f31; + var_f28 = sp84.z * temp_f31; + } + + s16 spC; + s16 spA; + if (checkEndResetFlg0(ERFLG0_UNK_800000)) { + sp9C = cXyz::Zero; + spC = 0; + spA = 0; + } else { + spC = ((s16)(field_0x3060 - sp14) >> 1); + if (abs(field_0x3060) > 0x3000 && abs(field_0x3060) < 0x5000) { + spA = 0; + } else { + spA = ((s16)(field_0x3062 - sp12) >> 1); + } + + sp9C = field_0x34c8 - spA8; + } + + if (checkNoResetFlg0(FLG0_SWIM_UP)) { + sp9C += spB4 * temp_f26; + } else if (field_0x3798.abs2XZ(current.pos) < 1.0f) { + sp9C.x = 0.0f; + sp9C.z = 0.0f; + } + + sp9C += field_0x35b8; + + if (checkEndResetFlg0(ERFLG0_UNK_8)) { + sp9C.x += field_0x3400; + sp9C.z += field_0x3404; + } + + multVecMagneBootInvMtx(&sp9C); + + if (!checkNoResetFlg0(FLG0_SWIM_UP)) { + sp9C.y -= 2.0f; + } else if (checkMagneBootsOn() && getMoveBGActorName(mMagneLineChk, FALSE) == PROC_Obj_MagneArm) { + sp9C.y += 5.0f; + } else { + sp9C.y -= 5.0f; + } + + if (fabsf(sp9C.x) < 0.01f) { + sp9C.x = (f32) 0.0f; + } + + if (fabsf(sp9C.z) < 0.01f) { + sp9C.z = (f32) 0.0f; + } + + if (checkMagneBootsOn()) { + mDoMtx_stack_c::copy(mMagneBootInvMtx); + mDoMtx_stack_c::concat(mpLinkModel->getAnmMtx(2)); + } else { + mDoMtx_stack_c::copy(mpLinkModel->getAnmMtx(2)); + } + + cXyz sp78; + cXyz sp6C; + mDoMtx_stack_c::multVecSR(&cXyz::BaseY, &sp78); + mDoMtx_stack_c::multVec(&cXyz::BaseX, &sp6C); + + s16 sp18; + s16 sp16; + + int sp30; + if (sp6C.y < mDoMtx_stack_c::get()[1][3] && !checkUnderMove0BckNoArc(ANM_DIE)) { + sp30 = cM_atan2s(-sp78.y, -sp78.absXZ()); + } else { + sp30 = sp78.atan2sY_XZ(); + } + sp30 -= 0x3800; + + s16* temp_r29 = &field_0x302c[7]; + s16* temp_r28 = &field_0x3040[7]; + s16* sp2C = &field_0x3054[0]; + s16* sp28 = &field_0x305a[0]; + *temp_r29 -= spC; + *temp_r28 -= spA; + sp18 = *temp_r29; + sp16 = *temp_r28; + + f32 temp_f27 = (sp9C.z * var_f28) + (sp9C.x * var_f29); + s16 sp10 = cM_atan2s(sp9C.y, -temp_f27); + int sp24 = cLib_minMaxLimit(sp10 - field_0x3060, -0x3800, 0x3800); + + sp10 = (sp24 + field_0x3060); + if (sp10 < sp30) { + sp10 = sp30; + } + + sp24 = (sp10 - field_0x3060); + if (checkEndResetFlg0(ERFLG0_UNK_800000)) { + *temp_r29 = sp24; + } else { + cLib_addCalcAngleS2(temp_r29, sp24, 5, 0x400); + } + + *temp_r29 = cLib_minMaxLimit((*temp_r29 + *sp2C), -0x3800, 0x3800); + sp10 = cLib_minMaxLimit(cM_atan2s(-((sp9C.x * var_f28) - (sp9C.z * var_f29)), JMAFastSqrt((temp_f27 * temp_f27) + (sp9C.y * sp9C.y))), -0x2800, 0x2800); + + if (checkEndResetFlg0(ERFLG0_UNK_800000)) { + *temp_r28 = sp10; + } else { + cLib_addCalcAngleS2(temp_r28, sp10, 5, 0x400); + } + + *temp_r28 = cLib_minMaxLimit((*temp_r28 + *sp28), -0x2800, 0x2800); + + *sp2C = 0.2f * (*temp_r29 - sp18); + *sp28 = 0.2f * (*temp_r28 - sp16); + + sp10 = (*temp_r29 + field_0x3060); + temp_r29++; + temp_r28++; + sp2C++; + sp28++; + + for (int i = 1; i < 3; i++, temp_r29++, temp_r28++, sp2C++, sp28++) { + temp_r29[0] -= ((s16)(temp_r29[-1] - sp18) >> 1); + temp_r28[0] -= ((s16)(temp_r28[-1] - sp16) >> 1); + sp18 = temp_r29[0]; + sp16 = temp_r28[0]; + + if (checkEndResetFlg0(ERFLG0_UNK_800000)) { + temp_r29[0] = 0; + temp_r28[0] = 0; + } else { + cLib_addCalcAngleS2(temp_r29, 0, 5, 0x400); + cLib_addCalcAngleS2(temp_r28, 0, 5, 0x400); + } + + temp_r29[0] = cLib_minMaxLimit((temp_r29[0] + *sp2C), -0x1000, 0x1000); + + sp10 += temp_r29[0]; + if (sp10 < sp30) { + temp_r29[0] += (sp30 - sp10); + sp10 = sp30; + } + + temp_r28[0] = cLib_minMaxLimit((temp_r28[0] + *sp28), -0x2000, 0x2000); + + *sp2C = 0.2f * (temp_r29[0] - sp18); + *sp28 = 0.2f * (temp_r28[0] - sp16); + } + + f32 var_f30 = (temp_f26 + (0.65f * field_0x34c8.abs(spA8))) / 30.0f; + if (var_f30 > 1.0f) { + var_f30 = 1.0f; + } + + f32 var_f25 = var_f30; + if (sp34 != 0 && !checkNoResetFlg2(daPy_FLG2(FLG2_UNK_100000 | FLG2_UNK_80000))) { + var_f30 = 3.5f; + var_f25 = 1.0f; + } + + s16 sp8 = 1500.0f + (4060.0f * var_f30); + field_0x3064 += sp8; + + for (int i = 0; i < 3; i++) { + field_0x3066[i] = var_f25 * cM_deg2s(((i + 1) * 4)) * cM_scos((field_0x3064 - ((i + 3) * sp8))); + } + + field_0x34c8 = spA8; + setHairAngle(&sp9C, var_f29, var_f28); + } } /* 8009FFF8-800A002C 09A938 0034+00 1/1 0/0 0/0 .text calcHairAngle__9daAlink_cFPs */ @@ -520,7 +1101,76 @@ void daAlink_c::calcHairAngle(s16* o_angle) { /* 800A002C-800A0744 09A96C 0718+00 1/1 0/0 0/0 .text setHairAngle__9daAlink_cFP4cXyzff */ void daAlink_c::setHairAngle(cXyz* param_0, f32 param_1, f32 param_2) { - // NONMATCHING + f32 var_f31 = param_0->abs(); + f32 temp_f27 = param_0->absXZ(); + + if (var_f31 < 1.0f || temp_f27 < 1.0f) { + calcHairAngle(&field_0x302c[1]); + calcHairAngle(&field_0x3040[1]); + calcHairAngle(&field_0x302c[2]); + calcHairAngle(&field_0x3040[2]); + calcHairAngle(&field_0x302c[3]); + calcHairAngle(&field_0x3040[3]); + calcHairAngle(&field_0x302c[4]); + calcHairAngle(&field_0x3040[4]); + calcHairAngle(&field_0x302c[5]); + calcHairAngle(&field_0x3040[5]); + field_0x3070 = -0x8000; + field_0x3072 = -0x8000; + field_0x3074 = -0x8000; + field_0x3076 = -0x8000; + return; + } + + var_f31 *= 0.033333335f; + if (var_f31 > 1.0f) { + var_f31 = 1.0f; + } + + var_f31 = 0.15f + (0.85f * var_f31); + + field_0x3070 += (s16)(1000.0f + cM_rndF(500.0f) + (var_f31 * (3000.0f + cM_rndF(1000.0f)))); + field_0x3072 += (s16)(1000.0f + cM_rndF(500.0f) + (var_f31 * (3000.0f + cM_rndF(1000.0f)))); + field_0x3074 += (s16)(1000.0f + cM_rndF(500.0f) + (var_f31 * (5000.0f + cM_rndF(1500.0f)))); + field_0x3076 += (s16)(1000.0f + cM_rndF(500.0f) + (var_f31 * (5000.0f + cM_rndF(1500.0f)))); + + temp_f27 = 1.0f / temp_f27; + param_0->x *= temp_f27; + param_0->z *= temp_f27; + + f32 temp_f30 = (param_0->x * param_2) - (param_0->z * param_1); + f32 temp_f29 = (param_0->x * param_1) + (param_0->z * param_2); + f32 temp_f28 = var_f31 * (0.5f * (1.0f + cM_scos(field_0x3070))); + f32 sp10 = var_f31 * (0.5f * (1.0f + cM_scos(field_0x3072))); + f32 spC = var_f31 * (0.5f * (1.0f + cM_scos(field_0x3074))); + f32 sp8 = var_f31 * (0.5f * (1.0f + cM_scos(field_0x3076))); + + if (temp_f30 > 0.0f) { + field_0x3040[1] = 6000.0f * temp_f28 * temp_f30; + field_0x3040[2] = 8000.0f * temp_f28 * temp_f30; + field_0x3040[3] = 2000.0f * sp10 * temp_f30; + field_0x3040[4] = 7000.0f * spC * temp_f30; + field_0x3040[5] = 2500.0f * sp8 * temp_f30; + } else { + field_0x3040[1] = 10000.0f * temp_f28 * temp_f30; + field_0x3040[2] = 2000.0f * temp_f28 * temp_f30; + field_0x3040[3] = 8000.0f * sp10 * temp_f30; + field_0x3040[4] = 2500.0f * spC * temp_f30; + field_0x3040[5] = 7000.0f * sp8 * temp_f30; + } + + if (temp_f29 > 0.0f) { + field_0x302c[1] = -9000.0f * temp_f28 * temp_f29; + field_0x302c[2] = -15000.0f * temp_f28 * temp_f29; + field_0x302c[3] = -15000.0f * sp10 * temp_f29; + } else { + field_0x302c[1] = -1000.0f * temp_f28 * temp_f29; + field_0x302c[2] = -5000.0f * temp_f28 * temp_f29; + field_0x302c[3] = -5000.0f * sp10 * temp_f29; + } + + field_0x302c[4] = -7000.0f * spC * temp_f29; + field_0x302c[5] = -7000.0f * sp8 * temp_f29; } /* 800A0744-800A07D8 09B084 0094+00 0/0 1/1 0/0 .text setLookPosFromOut__9daAlink_cFP4cXyz */ @@ -562,31 +1212,503 @@ bool daAlink_c::checkAttentionPosAngle(cXyz* param_0) { /* 800A0868-800A093C 09B1A8 00D4+00 1/1 0/0 0/0 .text * checkActorPosAngle__9daAlink_cFP10fopAc_ac_cPP4cXyz */ -void daAlink_c::checkActorPosAngle(fopAc_ac_c* param_0, cXyz** param_1) { - // NONMATCHING +bool daAlink_c::checkActorPosAngle(fopAc_ac_c* param_0, cXyz** param_1) { + if (param_0 != NULL && checkAttentionPosAngle(¶m_0->eyePos)) { + s16 temp_r3 = fopAcM_GetName(param_0); + + if (checkEnemyGroup(param_0)) { + field_0x3504 = param_0->eyePos; + field_0x311c = 0x50; + } + + if (temp_r3 == PROC_Obj_Wchain || (temp_r3 == PROC_B_MGN && !((daB_MGN_c*)param_0)->isDown())) { + onNoResetFlg1(FLG1_MIDNA_HAIR_ATN_POS); + mMidnaHairAtnPos = param_0->eyePos; + } + + *param_1 = ¶m_0->eyePos; + return 1; + } + + return 0; } /* 800A093C-800A142C 09B27C 0AF0+00 1/1 0/0 0/0 .text getNeckAimPos__9daAlink_cFP4cXyzPii */ -void daAlink_c::getNeckAimPos(cXyz* param_0, int* param_1, int param_2) { - // NONMATCHING +cXyz* daAlink_c::getNeckAimPos(cXyz* param_0, int* param_1, int param_2) { + fopAc_ac_c* var_r29 = NULL; + s16 spA = field_0x311c; + field_0x311c = 0; + + if (mProcID == PROC_GOAT_CATCH || mProcID == PROC_GET_ITEM || mProcID == PROC_WOLF_GANON_CATCH || mProcID == PROC_NOT_USE_ITEM || mProcID == PROC_DUNGEON_WARP_READY || mProcID == PROC_GOAT_STROKE) { + var_r29 = field_0x280c.getActor(); + } else if (dComIfGp_checkPlayerStatus0(0, 0x10)) { + if (mProcID != PROC_NOD && mProcID != PROC_EYE_AWAY && mProcID != PROC_GLARE) { + var_r29 = fopAcM_getTalkEventPartner(this); + if (var_r29 != NULL) { + daMidna_c* sp18 = (daMidna_c*)getMidnaActor(); + s16 temp_r3_3 = fopAcM_GetName(var_r29); + + if (temp_r3_3 == PROC_MIDNA || temp_r3_3 == PROC_Tag_Wljump || (temp_r3_3 == PROC_Tag_Mhint && ((daTagMhint_c*)var_r29)->checkNoAttention()) || (temp_r3_3 == PROC_Tag_Mstop && ((daTagMstop_c*)var_r29)->checkNoAttention()) || (temp_r3_3 == PROC_Tag_Mwait && ((daTagMwait_c*)var_r29)->checkEndMessage())) { + *param_1 = 1; + return &sp18->eyePos; + } + + if (temp_r3_3 == PROC_Tag_Mhint || temp_r3_3 == PROC_Tag_Mstop) { + sp18->setForceNeckAimPos(var_r29->eyePos); + } + } + } + } else if (mProcID == PROC_BOTTLE_OPEN && mEquipItem == FAIRY) { + var_r29 = field_0x285c.getActor(); + } else if (mProcID == PROC_FISHING_CAST || mProcID == PROC_CANOE_FISHING_WAIT || mProcID == PROC_CANOE_FISHING_REEL || mProcID == PROC_CANOE_FISHING_GET) { + var_r29 = mItemAcKeep.getActor(); + } else { + var_r29 = mTargetedActor; + if (checkEnemyGroup(mTargetedActor)) { + fopAc_ac_c* sp14; + if (mAttention->GetLockonList(1) != NULL) { + sp14 = mAttention->GetLockonList(1)->getActor(); + } else { + sp14 = NULL; + } + + if (field_0x28fc != fpcM_ERROR_PROCESS_ID_e) { + fopAc_ac_c* sp10 = fopAcM_SearchByID(field_0x28fc); + field_0x30f8--; + + if (field_0x30f8 != 0 && sp10 != NULL && sp10 == sp14) { + var_r29 = sp10; + } else { + field_0x30f8 = 0; + field_0x28fc = fpcM_ERROR_PROCESS_ID_e; + } + } else if (checkEnemyGroup(sp14)) { + if (field_0x30f8 == -30) { + if (cM_rnd() < 0.02f) { + field_0x30f8 = 30.0f + cM_rndF(30.0f); + var_r29 = sp14; + field_0x28fc = fopAcM_GetID(sp14); + } + } else { + field_0x30f8 -= 1; + } + } + } else { + field_0x28fc = -1; + field_0x30f8 = 0; + } + } + + fopAc_ac_c* spC = mAttention->LockonTarget(0); + if (var_r29 == NULL) { + var_r29 = dCam_getBody()->GetForceLockOnActor(); + } + + cXyz* sp1C; + if (checkActorPosAngle(var_r29, &sp1C)) { + return sp1C; + } + + if (!checkModeFlg(0x08000100) && param_2 != 0) { + if (spA > 0) { + field_0x311c = spA - 1; + } + return NULL; + } + + if (!checkEventRun()) { + if (dComIfGp_checkPlayerStatus1(0, 0x02010000)) { + if (mSight.getDrawFlg()) { + return mSight.getPosP(); + } else { + return NULL; + } + } + + if (dComIfGp_att_getLookTarget() != NULL) { + if (fopAcM_GetName(dComIfGp_att_getLookTarget()) == PROC_E_NZ) { + *param_1 = 0; + } + return &dComIfGp_att_getLookTarget()->eyePos; + } + + if ((checkActorPosAngle(field_0x27f0, &sp1C) && (field_0x27f0 == NULL || fopAcM_GetName(field_0x27f0) != PROC_Tag_WaraHowl)) || checkActorPosAngle(spC, &sp1C) || checkActorPosAngle(field_0x27f8, &sp1C)) { + return sp1C; + } + + if (checkActorPosAngle(mThrowBoomerangAcKeep.getActor(), &sp1C)) { + return sp1C; + } + + if (checkActorPosAngle(mCopyRodAcKeep.getActor(), &sp1C)) { + return sp1C; + } + + if (checkEndResetFlg0(ERFLG0_UNK_4) && checkAttentionPosAngle(&mLookPosFromOut)) { + return &mLookPosFromOut; + } + + if (checkActorPosAngle(field_0x285c.getActor(), &sp1C)) { + return sp1C; + } + + if (mProcID == PROC_SPINNER_WAIT && mNormalSpeed > 0.0f) { + param_0->set(current.pos.x + (200.0f * cM_ssin(current.angle.y)), 100.0f + current.pos.y, current.pos.z + (200.0f * cM_scos(current.angle.y))); + return param_0; + } + + if (checkModeFlg(1) && checkCopyRodControllAnime() && checkActorPosAngle(getCopyRodControllActor(), &sp1C)) { + return sp1C; + } + + if (checkWindSpeedOnAngleAnime(1)) { + if (checkWolf()) { + s16 sp8 = ((field_0x30cc + 0x8000) - shape_angle.y); + if (sp8 >= 0) { + sp8 = (shape_angle.y - 0x4000); + } else { + sp8 = (shape_angle.y + 0x4000); + } + + param_0->set(current.pos.x + (100.0f * cM_ssin(sp8)), current.pos.y, current.pos.z + (100.0f * cM_scos(sp8))); + } else { + param_0->set(current.pos.x - (100.0f * field_0x35b8.x), 150.0f + current.pos.y, current.pos.z - (100.0f * field_0x35b8.z)); + } + + if (checkAttentionPosAngle(param_0)) { + if (checkWolf()) { + onEndResetFlg0(ERFLG0_UNK_4000); + } + *param_1 = 0; + return param_0; + } + } else if (field_0x35c4.abs2XZ() > 1.0f && checkModeFlg(1)) { + f32 var_f31; + if (checkWolf() != NULL) { + var_f31 = 80.0f; + } else { + var_f31 = 150.0f; + } + + param_0->set(current.pos.x + (100.0f * field_0x35c4.x), current.pos.y + var_f31, current.pos.z + (100.0f * field_0x35c4.z)); + return param_0; + } else if (field_0x3594.absXZ() > 1.0f && (checkUnderMove0BckNoArc(ANM_SWIM_WAIT) || checkUnderMove0BckNoArcWolf(WANM_SWIM_WAIT))) { + param_0->set(current.pos.x + (100.0f * field_0x3594.x), 30.0f + current.pos.y, current.pos.z + (100.0f * field_0x3594.z)); + return param_0; + } else if (checkWolf()) { + if (mProcID == PROC_WOLF_WAIT_SLIP) { + if (checkAttentionPosAngle(&field_0x37c8)) { + *param_1 = 0; + return &field_0x37c8; + } + } else if (mTargetedActor == NULL && ((checkAttentionState() && mProcID == PROC_WOLF_ATN_AC_MOVE) || mProcID == PROC_WOLF_ROLL_ATTACK_MOVE)) { + param_0->set(current.pos.x + (1000.0f * cM_ssin(field_0x2fe4)), eyePos.y, current.pos.z + (1000.0f * cM_scos(field_0x2fe4))); + + if (checkAttentionPosAngle(param_0)) { + *param_1 = 0; + return param_0; + } + } + } + } else { + u32 temp_r26 = mDemo.getDemoMode(); + spA = 0; + + if (checkEndResetFlg2(ERFLG2_PORTAL_WARP_MIDNA_ATN_KEEP) && daMidna_c::checkMidnaRealBody()) { + if (checkWolf()) { + *param_1 = 1; + return &getMidnaActor()->eyePos; + } + } + + if (mProcID == PROC_LOOK_WAIT || temp_r26 == 0x17 || checkDemoMoveMode(temp_r26) || temp_r26 == 1 || temp_r26 == 4 || temp_r26 == 0x2C || temp_r26 == 0x2F || temp_r26 == 0x30 || temp_r26 == 0x31 || temp_r26 == 0xC) { + spC = getDemoLookActor(); + if (spC != NULL && fopAcM_GetName(spC) == PROC_MIDNA) { + return &spC->eyePos; + } + + if (checkActorPosAngle(spC, &sp1C)) { + return sp1C; + } + } else if (checkActorPosAngle(field_0x285c.getActor(), &sp1C)) { + return sp1C; + } + } + + if (param_2 == 0) { + return NULL; + } + + if (spA > 0) { + field_0x311c = spA - 1; + if (checkAttentionPosAngle(&field_0x3504)) { + return &field_0x3504; + } + } + + return NULL; } /* 800A142C-800A1AEC 09BD6C 06C0+00 1/1 0/0 0/0 .text getNeckAimAngle__9daAlink_cFP4cXyzPsPsPsPs */ -void daAlink_c::getNeckAimAngle(cXyz* param_0, s16* param_1, s16* param_2, s16* param_3, +// NONMATCHING - regalloc / one clib_minMaxLimit instance with issues +s16 daAlink_c::getNeckAimAngle(cXyz* param_0, s16* param_1, s16* param_2, s16* param_3, s16* param_4) { - // NONMATCHING + s16 sp16 = field_0x2fe6 + mBodyAngle.y; + if ((mProcID == PROC_GOAT_CATCH && mProcVar1.field_0x300a == 0) || (mProcID == PROC_HAND_PAT && mProcVar2.field_0x300c == 0)) { + sp16 += 0x8000; + } + + cXyz sp28 = eyePos - field_0x34e0; + multVecMagneBootInvMtx(&sp28); + + s16 sp14 = sp28.atan2sY_XZ(); + s16 sp12 = sp28.atan2sX_Z(); + s16 sp1A = sp14 - field_0x3124; + s16 sp18 = (sp12 - sp16) - field_0x3126; + + if (checkModeFlg(0x08000100) && param_0 != NULL && !checkWolfHeadDamageAnime() && !checkDashDamageAnime()) { + cXyz sp1C = *param_0 - field_0x34e0; + multVecMagneBootInvMtx(&sp1C); + + s16 temp_r24 = sp1C.atan2sY_XZ(); + s16 var_r28 = sp1C.atan2sX_Z() - sp16; + if (((var_r28 > 0x7000) && (field_0x3126 < 0)) || ((var_r28 < -0x7000) && (field_0x3126 > 0))) { + var_r28 *= -1; + } + + s16 sp10 = temp_r24; + s16 spE = var_r28; + if (sp1C.absXZ() < 30.0f) { + var_r28 = field_0x3126; + } + + if (checkWolf()) { + if (mProcID == PROC_WOLF_TIRED_WAIT) { + temp_r24 = cLib_minMaxLimit((s16)temp_r24, daAlinkHIO_wolf_c0::m.mMaxTiredNeckTurnUp, daAlinkHIO_wolf_c0::m.mMaxTiredNeckTurnDown); + var_r28 = cLib_minMaxLimit((s16)var_r28, -daAlinkHIO_wolf_c0::m.mMaxTiredNeckTurnH, daAlinkHIO_wolf_c0::m.mMaxTiredNeckTurnH); + } else { + temp_r24 = cLib_minMaxLimit((s16)temp_r24, daAlinkHIO_wolf_c0::m.mMaxNeckTurnUp, daAlinkHIO_wolf_c0::m.mMaxNeckTurnDown); + var_r28 = cLib_minMaxLimit((s16)var_r28, -daAlinkHIO_wolf_c0::m.mMaxNeckTurnH, daAlinkHIO_wolf_c0::m.mMaxNeckTurnH); + } + } else { + temp_r24 = cLib_minMaxLimit((s16)temp_r24, daAlinkHIO_basic_c0::m.mNeckMaxUp, daAlinkHIO_basic_c0::m.mNeckMaxDown); + + s16 spC; + s16 spA; + if (dComIfGp_checkPlayerStatus1(0, 0x02000000)) { + if (field_0x3020 == 1) { + spC = -0x1000; + spA = daAlinkHIO_basic_c0::m.mNeckMaxHorizontal; + } else { + spC = -daAlinkHIO_basic_c0::m.mNeckMaxHorizontal; + spA = 0x1000; + } + } else { + if (checkGrabAnimeCarry()) { + spC = 0; + } else { + spC = -daAlinkHIO_basic_c0::m.mNeckMaxHorizontal; + } + spA = daAlinkHIO_basic_c0::m.mNeckMaxHorizontal; + } + + var_r28 = cLib_minMaxLimit((s16)var_r28, spC, spA); + } + + s16 temp_r23 = temp_r24 - sp1A; + s16 sp8 = (var_r28 - sp18); + + if (checkModeFlg(0x100)) { + if (checkWolf()) { + *param_1 = 0.9f * temp_r23; + *param_2 = 0.9f * sp8; + *param_3 = temp_r23 - *param_1; + *param_4 = sp8 - *param_2; + } else if (field_0x2fc8 != 0) { + *param_1 = 0.25f * temp_r23; + *param_2 = 0.5f * sp8; + *param_3 = temp_r23 - *param_1; + *param_4 = *param_2; + } else { + *param_3 = (temp_r23 >> 1); + *param_4 = (sp8 >> 1); + *param_1 = *param_3; + *param_2 = *param_4; + } + } else { + *param_3 = temp_r23; + *param_4 = sp8; + } + + *param_3 += (s16)(sp10 - temp_r24); + *param_4 += (s16)(spE - var_r28); + + if (checkEndResetFlg0(ERFLG0_UNK_4000)) { + *param_3 = (sp10 + 0x8000) - sp14; + *param_4 = (field_0x30cc + 0x8000) - sp12; + } + } else if (checkMagneBootsOn()) { + *param_1 = 0; + *param_2 = 0; + field_0x30d4 = 0; + } else { + *param_1 = field_0x30a0; + *param_2 = field_0x30a2; + + if (checkWolf() && *param_2 == 0) { + *param_2 = field_0x2fec; + } + + + field_0x30d4 = *param_2; + } + + return sp18; } /* 800A1AEC-800A1F90 09C42C 04A4+00 1/1 0/0 0/0 .text setEyeMove__9daAlink_cFP4cXyzss */ void daAlink_c::setEyeMove(cXyz* param_0, s16 param_1, s16 param_2) { - // NONMATCHING + u32 temp_r28 = field_0x2fa7; + f32 sp18 = field_0x3418; + f32 sp14 = field_0x341c; + + field_0x2fa7 = 75.0f + cM_rndF(30.0f); + field_0x3418 = 0.0f; + field_0x341c = 0.0f; + field_0x33f8 = 0.0f; + + f32 var_f31; + f32 var_f30; + if (param_0 != NULL) { + var_f30 = 0.00012207031f * param_1; + var_f31 = 0.00012207031f * param_2; + } else if (0.0f != field_0x33f0 || 0.0f != field_0x33f4) { + var_f30 = field_0x33f4; + var_f31 = field_0x33f0; + field_0x33f8 = field_0x33f0; + } else if ((mProcID == PROC_MOVE || mProcID == PROC_WOLF_MOVE) && !checkNoResetFlg1(FLG1_UNK_1000000) && field_0x2fee != 0) { + var_f30 = 0.0f; + var_f31 = 0.00024414062f * -field_0x2fee; + field_0x33f8 = var_f31; + } else if (checkSwimNeckUpDown()) { + if (field_0x3124 > 0) { + var_f30 = 0.5f; + } else if (field_0x3124 < 0) { + var_f30 = -0.5f; + } else { + var_f30 = 0.0f; + } + var_f31 = 0.0f; + } else if (!checkEventRun() && checkModeFlg(1) && checkNoResetFlg1(FLG1_UNK_2000) && (checkNoUpperAnime() || checkGrabAnime()) && (mProcID == PROC_WAIT || mProcID == PROC_GRAB_WAIT || mProcID == PROC_CROUCH || mProcID == PROC_HORSE_WAIT || mProcID == PROC_WOLF_WAIT)) { + if (temp_r28 != 0) { + field_0x2fa7 = temp_r28 - 1; + field_0x3418 = sp18; + field_0x341c = sp14; + } else if (0.0f != sp18 || 0.0f != sp14) { + if (checkGrabAnimeCarry() || cM_rnd() < 0.5f) { + field_0x3418 = 0.0f; + field_0x341c = 0.0f; + } else { + s16 temp_r29_2 = cM_atan2s(field_0x3418, field_0x341c); + temp_r29_2 += (s16)(((int)cM_rndF(3.0f) << 13) + 0x6000); + + field_0x3418 = cM_ssin(temp_r29_2); + field_0x341c = cM_scos(temp_r29_2); + } + } else if (checkGrabAnimeCarry() && mGrabItemAcKeep.getActor() != NULL) { + field_0x3418 = -1.0f; + } else { + s16 temp_r0 = (int)cM_rndF(8.0f) << 0xD; + field_0x3418 = cM_ssin(temp_r0); + field_0x341c = cM_scos(temp_r0); + } + var_f31 = field_0x3418; + var_f30 = field_0x341c; + } else { + field_0x2180[0]->setNowOffsetX(0.0f); + field_0x2180[1]->setNowOffsetX(0.0f); + field_0x2180[0]->setNowOffsetY(0.0f); + field_0x2180[1]->setNowOffsetY(0.0f); + + if (daAlink_matAnm_c::getEyeMoveFlg()) { + daAlink_matAnm_c::offEyeMoveFlg(); + daAlink_matAnm_c::setMorfFrame(3); + } + return; + } + + if (daAlink_matAnm_c::getMorfFrame() == 0) { + var_f31 = cLib_minMaxLimit(var_f31, -1.0f, 1.0f); + var_f30 = cLib_minMaxLimit(var_f30, -1.0f, 1.0f); + + f32 var_f29; + f32 var_f28; + if (var_f31 > 0.0f) { + var_f29 = 0.25f * var_f31; + var_f28 = 0.15f * var_f31; + } else { + var_f29 = 0.15f * var_f31; + var_f28 = 0.25f * var_f31; + } + + f32 sp10; + if (var_f30 > 0.0f) { + sp10 = 0.2f * var_f30; + } else { + sp10 = 0.1f * var_f30; + } + + if (checkWolf()) { + var_f29 *= -1.0f; + var_f28 *= -1.0f; + } + + daAlink_matAnm_c::onEyeMoveFlg(); + cLib_addCalc(field_0x2180[0]->getNowOffsetXP(), var_f29, 0.5f, 0.1f, 0.03f); + cLib_addCalc(field_0x2180[1]->getNowOffsetXP(), var_f28, 0.5f, 0.1f, 0.03f); + cLib_addCalc(field_0x2180[0]->getNowOffsetYP(), sp10, 0.5f, 0.08f, 0.02f); + field_0x2180[1]->setNowOffsetY(*field_0x2180[0]->getNowOffsetYP()); + } } /* 800A1F90-800A2160 09C8D0 01D0+00 1/1 0/0 0/0 .text setNeckAngle__9daAlink_cFv */ void daAlink_c::setNeckAngle() { - // NONMATCHING + cXyz sp18; + s16 sp10 = 0; + s16 spE = 0; + s16 spC = 0; + s16 spA = 0; + int sp14 = 2; + + offNoResetFlg1(FLG1_MIDNA_HAIR_ATN_POS); + cXyz* var_r30 = getNeckAimPos(&sp18, &sp14, 1); + + if (var_r30 != NULL && checkModeFlg(0x08000100)) { + onNoResetFlg1(FLG1_UNK_4); + + if (sp14 != 0) { + if (sp14 == 1) { + mMidnaAtnPos = eyePos; + onNoResetFlg1(FLG1_MIDNA_ATN_POS); + } else { + mMidnaAtnPos = *var_r30; + onNoResetFlg1(FLG1_MIDNA_ATN_POS); + } + } + } else { + offNoResetFlg1(daPy_FLG1(FLG1_MIDNA_ATN_POS | FLG1_UNK_4)); + } + + if (checkUnderMove0BckNoArcWolf(WANM_SMELL) || checkUnderMove0BckNoArc(ANM_HORSE_TURN_B) || checkUnderMove0BckNoArc(ANM_WAIT_INSECT) || checkUnderMove0BckNoArc(ANM_HORSE_TURN_LEFT) || checkUnderMove0BckNoArc(ANM_HORSE_TURN_RIGHT)) { + var_r30 = NULL; + } + + s16 sp8 = getNeckAimAngle(var_r30, &sp10, &spE, &spC, &spA); + daPy_addCalcShort(&field_0x3124, sp10, 3, 0x1000, 0x100); + daPy_addCalcShort(&field_0x3126, spE, 3, 0x1000, 0x100); + setEyeMove(var_r30, spC, spA); } /* 800A2160-800A2198 09CAA0 0038+00 1/0 0/0 0/0 .text getStickAngleFromPlayerShape__9daAlink_cCFPs @@ -638,7 +1760,98 @@ fopAc_ac_c* daAlink_c::checkGoronRide() { /* 800A22E8-800A2710 09CC28 0428+00 1/1 0/0 0/0 .text setMoveSlantAngle__9daAlink_cFv */ void daAlink_c::setMoveSlantAngle() { - // NONMATCHING + f32 temp_f31 = fabsf(speedF / field_0x594); + + if (checkModeFlg(0x02020400) || mProcID == PROC_WOLF_CARGO_CARRY) { + if (!checkBoardRide()) { + field_0x2fee = 0; + if (!checkCanoeRide()) { + mBodyAngle.z = 0; + } + } + + if (mProcID == PROC_SLIDE && field_0x3198 != 0) { + mBodyAngle.z = mProcVar4.field_0x3010 * 0.75f; + shape_angle.z += (0.25f * mProcVar4.field_0x3010); + } + + field_0x2fec = 0; + return; + } + + s16 var_r29; + s16 var_r28; + + if ((mProcID == PROC_MOVE && temp_f31 > daAlinkHIO_move_c0::m.mRunChangeRate) || (mProcID == PROC_WOLF_MOVE && temp_f31 > daAlinkHIO_wlMove_c0::m.field_0x84)) { + var_r28 = cLib_minMaxLimit((s16)(field_0x2fe6 - shape_angle.y) * 2, -0xC00, 0xC00); + if (abs(var_r28) > 0x800) { + int var_r27; + if (var_r28 > 0) { + var_r27 = var_r28 - 0x800; + } else { + var_r27 = var_r28 + 0x800; + } + + var_r29 = -3.9f * var_r27; + } else { + var_r29 = 0; + } + + if ((mProcID == PROC_WOLF_MOVE && checkAttentionState()) || temp_f31 < daAlinkHIO_wlMove_c0::m.field_0x8C) { + var_r28 = 0; + } + } else if ((mProcID == PROC_WOLF_WAIT || mProcID == PROC_WOLF_SWIM_MOVE) && shape_angle.y != field_0x2fe6) { + var_r28 = 0; + var_r29 = (s16)(shape_angle.y - field_0x2fe6); + + if (mProcID == PROC_WOLF_SWIM_MOVE) { + if (var_r29 >= 0) { + var_r29 -= 0x100; + if (var_r29 < 0) { + var_r29 = 0; + } + } else { + var_r29 += 0x100; + if (var_r29 > 0) { + var_r29 = 0; + } + } + } + + var_r29 = cLib_minMaxLimit((s16)var_r29, -0x300, 0x300); + var_r29 *= 8; + } else { + var_r28 = 0; + var_r29 = 0; + } + + cLib_addCalcAngleS(&field_0x2fee, var_r28, 4, 1200, 200); + + if (checkWolf()) { + shape_angle.z = field_0x2fee; + if (var_r29 == 0) { + cLib_addCalcAngleS(&field_0x2fec, 0, 2, 4000, 1000); + } else { + cLib_addCalcAngleS(&field_0x2fec, var_r29, 4, 1200, 200); + } + } else if (mProcID != PROC_CAUGHT) { + shape_angle.z = (field_0x2fee >> 1); + mBodyAngle.z = shape_angle.z; + + if (mProcID == PROC_MOVE || mProcID == PROC_WAIT) { + var_r29 = (s16)(shape_angle.y - field_0x2fe6) * 2; + if (mProcID == PROC_WAIT) { + var_r29 *= 2; + } + + var_r29 = cLib_minMaxLimit((s16)var_r29, -0xC00, 0xC00); + if (var_r29 == 0) { + cLib_addCalcAngleS(&field_0x30a2, 0, 2, 4000, 1000); + } else { + cLib_addCalcAngleS(&field_0x30a2, var_r29, 4, 1200, 200); + } + } + } } /* 8038FA10-8038FA20 01C070 0010+00 0/0 0/0 0/0 .rodata l_worldChangeEventName */ @@ -2244,8 +3457,66 @@ static const u16 armJointTable[] = { }; /* 800A2710-800A29DC 09D050 02CC+00 1/1 0/0 0/0 .text setArmMatrix__9daAlink_cFv */ -void daAlink_c::setArmMatrix() { - // NONMATCHING +int daAlink_c::setArmMatrix() { + daAlink_footData_c* var_r29 = mFootData2; + + int i; + for (i = 0; i < 2; i++, var_r29++) { + for (int j = 0; j < 3; j++) { + cMtx_copy(mpLinkModel->getAnmMtx(j + armJointTable[i]), var_r29->field_0x14[j]); + } + + } + + if (!field_0x2060->getOldFrameFlg()) { + return 0; + } + + var_r29 = mFootData2; + + cXyz sp2C; + csXyz* sp18 = field_0x312a; + csXyz* sp14 = field_0x3136; + + for (i = 0; i < 2; i++, var_r29++, sp18++, sp14++) { + u16 temp_r28 = armJointTable[i]; + s16 spA; + s16 sp8 = 0; + + if ((mProcID == PROC_HOOKSHOT_ROOF_SHOOT || mProcID == PROC_HOOKSHOT_WALL_SHOOT) && field_0x3020 == i) { + spA = mProcVar3.field_0x300e; + if (mProcID == PROC_HOOKSHOT_WALL_SHOOT) { + sp8 = (mProcVar4.field_0x3010 - shape_angle.y); + } + } else { + spA = 0; + } + + setMatrixWorldAxisRot(mpLinkModel->getAnmMtx(temp_r28), spA, sp8, var_r29->field_0x6, 0, NULL); + + mDoMtx_stack_c::ZXYrotM(*sp18); + mDoMtx_copy(mDoMtx_stack_c::get(), mpLinkModel->getAnmMtx(temp_r28)); + mDoMtx_stack_c::multVec(&arm1Vec, &sp2C); + temp_r28++; + + setMatrixWorldAxisRot(mpLinkModel->getAnmMtx(temp_r28), spA, sp8, var_r29->field_0x4, 0, &sp2C); + + mDoMtx_stack_c::ZXYrotM(*sp14); + mDoMtx_copy(mDoMtx_stack_c::get(), mpLinkModel->getAnmMtx(temp_r28)); + mDoMtx_stack_c::multVec(&arm2Vec, &sp2C); + temp_r28++; + + setMatrixWorldAxisRot(mpLinkModel->getAnmMtx(temp_r28), spA, sp8, var_r29->field_0x2, 0, &sp2C); + temp_r28++; + + J3DTransformInfo* temp_r3_3 = field_0x2060->getOldFrameTransInfo(temp_r28); + cXyz sp20(temp_r3_3->mTranslate.x, temp_r3_3->mTranslate.y, temp_r3_3->mTranslate.z); + mDoMtx_stack_c::multVec(&sp20, &sp2C); + + setMatrixWorldAxisRot(mpLinkModel->getAnmMtx(temp_r28), spA, sp8, var_r29->field_0x2, 0, &sp2C); + } + + return 1; } /* 80391ED8-80391EE4 01E538 000C+00 0/1 0/0 0/0 .rodata leg1Vec$56150 */ @@ -2282,8 +3553,56 @@ static const u16 footJointTable[] = { }; /* 800A29DC-800A2C24 09D31C 0248+00 1/1 0/0 0/0 .text setFootMatrix__9daAlink_cFv */ -void daAlink_c::setFootMatrix() { - // NONMATCHING +int daAlink_c::setFootMatrix() { + daAlink_footData_c* var_r30 = mFootData1; + + int i; + for (i = 0; i < 2; i++, var_r30++) { + for (int j = 0; j < 3; j++) { + cMtx_copy(mpLinkModel->getAnmMtx(j + footJointTable[i]), var_r30->field_0x14[j]); + } + + } + + if (!field_0x2060->getOldFrameFlg()) { + return 0; + } + + var_r30 = mFootData1; + cXyz sp10; + + if (mProcID == PROC_HORSE_GETOFF) { + current.angle.y = shape_angle.y; + if (field_0x2fc0 == 0) { + shape_angle.y -= 0x4000; + } else { + shape_angle.y += 0x4000; + } + } + + for (i = 0; i < 2; i++, var_r30++) { + u16 temp_r29 = footJointTable[i]; + + setMatrixWorldAxisRot(mpLinkModel->getAnmMtx(temp_r29), var_r30->field_0x6, 0, 0, 0, NULL); + mDoMtx_stack_c::multVec(&leg1Vec, &sp10); + temp_r29++; + + setMatrixWorldAxisRot(mpLinkModel->getAnmMtx(temp_r29), var_r30->field_0x4, 0, 0, 0, &sp10); + mDoMtx_stack_c::multVec(&leg2Vec, &sp10); + temp_r29++; + + setMatrixWorldAxisRot(mpLinkModel->getAnmMtx(temp_r29), var_r30->field_0x2, 0, 0, 0, &sp10); + temp_r29++; + mDoMtx_stack_c::multVec(&footVec, &sp10); + + setMatrixWorldAxisRot(mpLinkModel->getAnmMtx(temp_r29), var_r30->field_0x2, 0, 0, 0, &sp10); + } + + if (mProcID == PROC_HORSE_GETOFF) { + shape_angle.y = current.angle.y; + } + + return 1; } /* 800A2C24-800A2CE0 09D564 00BC+00 3/3 0/0 0/0 .text setMatrixOffset__9daAlink_cFPff */ @@ -2306,8 +3625,143 @@ void daAlink_c::setMatrixOffset(f32* param_0, f32 param_1) { * setLegAngle__9daAlink_cFfP18daAlink_footData_cPsPsi */ int daAlink_c::setLegAngle(f32 param_0, daAlink_footData_c* param_1, s16* param_2, s16* param_3, int param_4) { - // NONMATCHING - return 0; + cXyz spA4; + cXyz sp98; + cXyz sp8C; + cXyz sp80; + if (fabsf(param_0) < 0.1f) { + return 0; + } + + if (param_4 != 0) { + cMtx_concat(field_0x2be8, param_1->field_0x14[0], mDoMtx_stack_c::get()); + mDoMtx_stack_c::multVecZero(&spA4); + + cMtx_concat(field_0x2be8, param_1->field_0x14[1], mDoMtx_stack_c::get()); + mDoMtx_stack_c::multVecZero(&sp98); + + cMtx_concat(field_0x2be8, param_1->field_0x14[2], mDoMtx_stack_c::get()); + mDoMtx_stack_c::multVecZero(&sp8C); + + if (mProcID == PROC_HORSE_GETOFF) { + if (field_0x2fc0 == 0) { + spA4.z = -spA4.x; + sp98.z = -sp98.x; + sp8C.z = -sp8C.x; + } else { + spA4.z = spA4.x; + sp98.z = sp98.x; + sp8C.z = sp8C.x; + } + } + + spA4.x = 0.0f; + sp98.x = 0.0f; + sp8C.x = 0.0f; + } else { + cMtx_concat(mInvMtx, param_1->field_0x14[0], mDoMtx_stack_c::get()); + mDoMtx_stack_c::multVecZero(&spA4); + + cMtx_concat(mInvMtx, param_1->field_0x14[1], mDoMtx_stack_c::get()); + mDoMtx_stack_c::multVecZero(&sp98); + + cMtx_concat(mInvMtx, param_1->field_0x14[2], mDoMtx_stack_c::get()); + mDoMtx_stack_c::multVecZero(&sp8C); + + spA4.z = 0.0f; + sp98.z = 0.0f; + sp8C.z = 0.0f; + } + + cXyz sp74 = sp98 - spA4; + cXyz sp68 = sp8C - sp98; + cXyz sp5C(sp8C); + sp5C.y += param_0; + + if (param_4 != 0) { + if (sp5C.y >= spA4.y) { + return 0; + } + } + + if (param_4 == 0) { + if (sp5C.y <= spA4.y) { + sp5C.y = 1.0f + spA4.y; + } + } + + cXyz sp50 = sp5C - spA4; + f32 temp_f1 = sp50.abs2(); + if (cM3d_IsZero(temp_f1)) { + return 0; + } + + f32 temp_f28 = sp74.abs2(); + f32 temp_f26 = sp68.abs2(); + + if (JMAFastSqrt(temp_f28) + JMAFastSqrt(temp_f26) <= JMAFastSqrt(temp_f1)) { + return 0; + } + + f32 temp_f27 = ((temp_f1 + temp_f28) - temp_f26) / (2.0f * temp_f1); + cXyz sp44 = spA4 + (sp50 * temp_f27); + + f32 var_f30 = temp_f28 - (temp_f27 * (temp_f1 * temp_f27)); + if (var_f30 < 0.0f) { + var_f30 = 0.0f; + } + var_f30 = JMAFastSqrt(var_f30); + + if (param_4 != 0) { + if (checkWolf()) { + sp80.set(0.0f, -sp50.z, sp50.y); + } else { + sp80.set(0.0f, sp50.z, -sp50.y); + } + } else if (param_1 == mFootData2) { + sp80.set(sp50.y, -sp50.x, 0.0f); + } else { + sp80.set(-sp50.y, sp50.x, 0.0f); + } + + f32 temp_f1_2 = sp80.abs(); + if (cM3d_IsZero(temp_f1_2)) { + return 0; + } + + cXyz sp38 = sp44 + (sp80 * (var_f30 / temp_f1_2)); + + cXyz sp2C = sp38 - spA4; + cXyz sp20 = sp5C - sp38; + + if (param_4 != 0) { + s16 temp_r30 = cM_atan2s(sp2C.y, sp2C.z); + s16 var_r29 = cM_atan2s(sp20.y, sp20.z); + s16 temp_r0 = var_r29 - temp_r30; + + if (checkWolf()) { + if (temp_r0 < 0) { + var_r29 = temp_r30; + } else if (temp_r0 > 0x7000) { + var_r29 = temp_r30 + 0x7000; + } + } else if (temp_r0 > 0) { + var_r29 = temp_r30; + } else if (temp_r0 < -0x7000) { + var_r29 = temp_r30 - 0x7000; + } + + *param_2 = cM_atan2s(sp74.y, sp74.z) - temp_r30; + *param_3 = cM_atan2s(sp68.y, sp68.z) - var_r29; + } else { + s16 temp_r30_2 = cM_atan2s(sp2C.x, sp2C.y); + s16 temp_r29 = cM_atan2s(sp20.x, sp20.y); + + *param_2 = cM_atan2s(sp74.x, sp74.y) - temp_r30_2; + *param_3 = cM_atan2s(sp68.x, sp68.y) - temp_r29; + } + + return 1; } /* 80391EFC-80391F08 01E55C 000C+00 0/1 0/0 0/0 .rodata localLeftFootOffset$56542 */ @@ -2353,8 +3807,132 @@ SECTION_SDATA static f32 l_autoUpHeight = 30.010000228881836f; SECTION_SDATA static f32 l_autoDownHeight = -30.010000228881836f; /* 800A3430-800A39B8 09DD70 0588+00 1/1 0/0 0/0 .text footBgCheck__9daAlink_cFv */ +// NONMATCHING - regalloc void daAlink_c::footBgCheck() { - // NONMATCHING + if (field_0x2060->getOldFrameFlg()) { + f32 var_f31 = 0.0f; + cM3dGPla sp98; + f32 sp30[2]; + + u32 sp28 = checkModeFlg(1); + int i; + f32* sp24; + + daAlink_footData_c* var_r29 = mFootData1; + sp24 = sp30; + s16 sp20[2]; + + cXyz sp80[2]; + cXyz sp68[2]; + mDoMtx_multVec(mpLinkModel->getAnmMtx(0x14), &localLeftFootOffset, &sp68[0]); + mDoMtx_multVec(mpLinkModel->getAnmMtx(0x15), &localLeftToeOffset, &sp80[0]); + mDoMtx_multVec(mpLinkModel->getAnmMtx(0x19), &localRightFootOffset, &sp68[1]); + mDoMtx_multVec(mpLinkModel->getAnmMtx(0x1A), &localRightToeOffset, &sp80[1]); + + BOOL sp1C = (!mLinkAcch.i_ChkGroundHit() || checkMagneBootsOn()) || (mLinkAcch.i_ChkGroundHit() && mSinkShapeOffset < 0.0f) || checkModeFlg(0x78C52); + + for (i = 0; i < 2; i++, var_r29++, sp24++) { + cXyz sp5C = (sp80[i] + sp68[i]) * 0.5f; + + if (sp1C) { + var_r29->field_0x1 = 5; + } else { + cXyz sp50 = sp5C - var_r29->field_0x8; + if (sp50.abs2XZ() < 100.0f && sp28 != 0) { + if (var_r29->field_0x1 != 0) { + var_r29->field_0x1--; + } else { + sp5C = var_r29->field_0x8; + } + } else { + var_r29->field_0x1 = 5; + } + } + + var_r29->field_0x8 = sp5C; + cXyz sp44(sp5C.x, current.pos.y + l_autoUpHeight, sp5C.z); + mLinkGndChk.SetPos(&sp44); + + f32 temp_f1 = dComIfG_Bgsp().GroundCross(&mLinkGndChk); + if (-1000000000.0f != temp_f1) { + dComIfG_Bgsp().GetTriPla(mLinkGndChk, &sp98); + } + + if (-1000000000.0f != temp_f1 && cBgW_CheckBGround(sp98.mNormal.y) && sp44.y - temp_f1 < l_autoUpHeight - l_autoDownHeight) { + *sp24 = temp_f1; + var_r29->field_0x0 = 1; + sp20[i] = getGroundAngle(&mLinkGndChk, shape_angle.y); + } else { + *sp24 = current.pos.y; + var_r29->field_0x0 = 0; + } + } + + int sp2C; + if (sp1C != 0) { + sp2C = 2; + } else { + if (sp30[1] > sp30[0]) { + sp2C = 0; + } else { + sp2C = 1; + } + + var_f31 = sp30[sp2C];; + } + + setSandShapeOffset(); + setMatrixOffset(&mSinkShapeOffset, mSinkShapeOffset); + setSandDownBgCheckWallH(); + + if (mProcID == PROC_SERVICE_WAIT) { + var_f31 = field_0x2b94; + } else if (sp1C != 0 || sp28 == 0 || mProcID == PROC_TOOL_DEMO || mProcID == PROC_GANON_FINISH || fabsf(field_0x2b98) > 1.0f) { + var_f31 = 0.0f; + } else { + var_f31 -= current.pos.y; + } + + setMatrixOffset(&field_0x2b94, var_f31); + var_r29 = mFootData1; + + for (i = 0; i < 2; i++, var_r29++) { + s16 sp10; + s16 spE; + if (sp1C != 0) { + sp10 = 0; + spE = 0; + } else { + f32 var_f30 = sp30[i] - mpLinkModel->getBaseTRMtx()[1][3]; + if (var_f30 > l_autoUpHeight) { + var_f30 = l_autoUpHeight; + } + + if ((sp2C != i && !(var_f30 > 0.0f) && sp28 == 0) || !setLegAngle(var_f30, var_r29, &sp10, &spE, 1)) { + sp10 = 0; + spE = 0; + } + } + + if ((sp10 * var_r29->field_0x6) < 0 && abs(sp10 - var_r29->field_0x6) >= 0x8000) { + if (sp10 >= 0) { + sp10 -= 0x4000; + } else { + sp10 += 0x4000; + } + } + + cLib_addCalcAngleS(&var_r29->field_0x6, sp10, 2, 0x1800, 0x10); + cLib_addCalcAngleS(&var_r29->field_0x4, spE, 2, 0x1800, 0x10); + + s16 spC = 0; + if (sp2C != 2 && var_r29->field_0x0 != 0 && sp28 != 0 && field_0x3174 != 8) { + spC += sp20[i]; + } + + cLib_addCalcAngleS(&var_r29->field_0x2, spC, 2, 0x1800, 0x10); + } + } } /* 80391F2C-80391F44 01E58C 0018+00 1/1 0/0 0/0 .rodata localHandPos$56752 */ @@ -2365,8 +3943,80 @@ SECTION_RODATA static Vec const localHandPos[] = { COMPILER_STRIP_GATE(0x80391F2C, &localHandPos); /* 800A39B8-800A3C8C 09E2F8 02D4+00 1/1 0/0 0/0 .text handBgCheck__9daAlink_cFv */ +// NONMATCHING - stack / regalloc void daAlink_c::handBgCheck() { - // NONMATCHING + if (!field_0x2060->getOldFrameFlg() || !checkModeFlg(0x40)) { + return; + } + + if (mProcID == PROC_HANG_CLIMB) { + if (mUnderFrameCtrl[0].getFrame() >= 9.0f) { + setMatrixOffset(&field_0x2ba4, 0.0f); + return; + } + } + + cXyz sp38; + cXyz sp44; + f32 sp20[2]; + s16 sp18[2]; + + cXyz* var_r28 = &sp38; + s16* var_r29 = sp18; + f32* var_r25 = sp20; + + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::YrotM(shape_angle.y); + + for (int i = 0; i < 2; i++, var_r28++, var_r25++, var_r29++) { + mDoMtx_stack_c::multVec(&localHandPos[i], var_r28); + + cXyz sp28(var_r28->x, var_r28->y + l_autoUpHeight, var_r28->z); + mLinkGndChk.SetPos(&sp28); + + f32 temp_f1 = dComIfG_Bgsp().GroundCross(&mLinkGndChk); + if (-1000000000.0f != temp_f1 && (sp28.y - temp_f1 < l_autoUpHeight - l_autoDownHeight)) { + *var_r25 = temp_f1; + + if (dComIfG_Bgsp().GetGroundCode(mLinkGndChk) != 8) { + *var_r29 = getGroundAngle(&mLinkGndChk, (shape_angle.y - 0x4000)); + } else { + *var_r29 = 0; + } + } else { + *var_r25 = current.pos.y; + *var_r29 = 0; + } + } + + int sp14; + if (mProcID == PROC_HANG_FALL_START) { + sp14 = 0; + sp20[1] += 500.0f; + } else if (sp20[1] < sp20[0]) { + sp14 = 0; + } else { + sp14 = 1; + } + + setMatrixOffset(&field_0x2ba4, sp20[sp14] - current.pos.y); + + daAlink_footData_c* var_r26 = mFootData2; + s16* var_r29_2 = sp18; + s16 spA; + s16 sp8; + + for (int i = 0; i < 2; i++, var_r29_2++, var_r26++) { + f32 temp_f30 = sp20[i] - mpLinkModel->getBaseTRMtx()[1][3]; + if (!(temp_f30 < -1.0f) || !setLegAngle(temp_f30, var_r26, &spA, &sp8, 0)) { + spA = 0; + sp8 = 0; + } + + cLib_addCalcAngleS(&var_r26->field_0x6, spA, 2, 0x1800, 0x10); + cLib_addCalcAngleS(&var_r26->field_0x4, sp8, 2, 0x1800, 0x10); + cLib_addCalcAngleS(&var_r26->field_0x2, *var_r29_2, 2, 0x1800, 0x10); + } } /* 800A3C8C-800A3CE4 09E5CC 0058+00 11/11 0/0 0/0 .text setItemHeap__9daAlink_cFv */ @@ -2492,7 +4142,6 @@ int daAlink_c::initDemoBck(mDoExt_bckAnm** p_bck, char const* resName) { return 1; } - /* 80392094-80392094 01E6F4 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */ #pragma push #pragma force_active on @@ -3846,13 +5495,6 @@ int daAlink_c::createHeap() { return 1; } - -/* 800A4820-800A48F0 09F160 00D0+00 0/0 1/0 0/0 .text __dt__14J3DMaterialAnmFv */ -// J3DMaterialAnm::~J3DMaterialAnm() { -extern "C" void __dt__14J3DMaterialAnmFv() { - // NONMATCHING -} - /* 800A48F0-800A4910 09F230 0020+00 1/1 0/0 0/0 .text daAlink_createHeap__FP10fopAc_ac_c */ static int daAlink_createHeap(fopAc_ac_c* i_this) { @@ -4585,7 +6227,6 @@ int daAlink_c::create() { return cPhs_COMPLEATE_e; } - /* 800A660C-800A662C 0A0F4C 0020+00 1/0 0/0 0/0 .text daAlink_Create__FP10fopAc_ac_c */ static int daAlink_Create(fopAc_ac_c* i_this) { return static_cast(i_this)->create(); @@ -4643,12 +6284,99 @@ s32 daAlink_c::setRoomInfo() { /* 800A67E0-800A6B0C 0A1120 032C+00 1/1 0/0 0/0 .text setShapeAngleOnGround__9daAlink_cFv */ void daAlink_c::setShapeAngleOnGround() { - // NONMATCHING + field_0x33cc = cLib_minMaxLimit(field_0x33cc, 0.0f, 1.0f); + + if (checkModeFlg(0x01000000)) { + cXyz sp20; + cXyz sp14; + cM3dGPla sp2C; + + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::YrotM(shape_angle.y); + mDoMtx_stack_c::multVec(&l_crawlFrontUpOffset, &sp20); + mDoMtx_stack_c::multVec(&l_crawlBackUpOffset, &sp14); + + mLinkGndChk.SetPos(&sp20); + + sp20.y = dComIfG_Bgsp().GroundCross(&mLinkGndChk); + bool var_r29; + if (-1000000000.0f != sp20.y) { + var_r29 = dComIfG_Bgsp().GetTriPla(mLinkGndChk, &sp2C); + } else { + var_r29 = 0; + } + + f32 var_f31; + if (var_r29) { + var_f31 = sp2C.mNormal.y; + } else { + var_f31 = -1.0f; + } + + mLinkGndChk.SetPos(&sp14); + + sp14.y = dComIfG_Bgsp().GroundCross(&mLinkGndChk); + bool var_r29_2; + if (-1000000000.0f != sp14.y) { + var_r29_2 = dComIfG_Bgsp().GetTriPla(mLinkGndChk, &sp2C); + } else { + var_r29_2 = 0; + } + + f32 var_f30; + if (var_r29_2 != 0) { + var_f30 = sp2C.mNormal.y; + } else { + var_f30 = -1.0f; + } + + cXyz sp8 = sp20 - sp14; + s16 temp_r3 = sp8.atan2sY_XZ(); + + if (cLib_distanceAngleS(temp_r3, shape_angle.x) < 0x1000 && var_f31 > 0.0f && var_f30 > 0.0f && fabsf(var_f31 - var_f30) > 0.05f) { + shape_angle.x = temp_r3 * field_0x33cc; + } else { + shape_angle.x = field_0x2ff0 * field_0x33cc; + } + } else { + shape_angle.x = field_0x2ff0 * field_0x33cc; + } + + shape_angle.z = field_0x33cc * getGroundAngle(&mLinkAcch.m_gnd, (shape_angle.y - 0x4000)); + + if (mProcID == PROC_SLIDE) { + mBodyAngle.x = -shape_angle.x; + } } /* 800A6B0C-800A6DCC 0A144C 02C0+00 1/1 0/0 0/0 .text setStepsOffset__9daAlink_cFv */ void daAlink_c::setStepsOffset() { - // NONMATCHING + field_0x2b9c = 0.0f; + cLib_addCalc(&field_0x2b98, 0.0f, 0.5f, 25.0f, 5.0f); + + if (!(fabsf(speedF) < 1.0f)) { + s16 temp_r3 = getGroundAngle(&mLinkAcch.m_gnd, current.angle.y); + f32 temp_f30 = cM_ssin(temp_r3) / cM_scos(temp_r3); + + cXyz sp14(current.pos.x + (speedF * cM_ssin(current.angle.y)), current.pos.y + l_autoUpHeight, current.pos.z + (speedF * cM_scos(current.angle.y))); + mLinkGndChk.SetPos(&sp14); + + f32 temp_f1 = dComIfG_Bgsp().GroundCross(&mLinkGndChk); + f32 temp_f31 = (temp_f1 - current.pos.y) - (-speedF * temp_f30); + if (temp_f31 > 1.0f) { + field_0x2b9c = temp_f1 - current.pos.y; + field_0x2b98 -= 0.7f * temp_f31; + } else { + sp14 = field_0x3798 - current.pos; + + temp_f31 = sp14.y - (temp_f30 * sp14.absXZ()); + if (temp_f31 >= 0.0f) { + field_0x2b98 += 0.7f * temp_f31; + } + } + + field_0x2b98 = cLib_minMaxLimit(field_0x2b98, l_autoDownHeight, l_autoUpHeight); + } } /* 800A6DCC-800A7050 0A170C 0284+00 1/1 0/0 0/0 .text iceSlipBgCheck__9daAlink_cFv */ @@ -4679,7 +6407,6 @@ void daAlink_c::iceSlipBgCheck() { } } - /* 800A7050-800A7358 0A1990 0308+00 1/1 0/0 0/0 .text setIceSlipSpeed__9daAlink_cFv */ void daAlink_c::setIceSlipSpeed() { field_0x35d0 = field_0x35c4; @@ -4814,7 +6541,6 @@ void daAlink_c::setPolygonSpeed() { } } - /* 800A7950-800A79EC 0A2290 009C+00 4/4 0/0 0/0 .text checkWindSpeedOnAngle__9daAlink_cCFv */ bool daAlink_c::checkWindSpeedOnAngle() const { if (!checkWindSpeedOnXZ()) { @@ -4825,7 +6551,6 @@ bool daAlink_c::checkWindSpeedOnAngle() const { return tmp >= 0x6000 || (tmp >= 0x4000 && checkWindDashAnime()); } - /* 800A79EC-800A7A5C 0A232C 0070+00 2/2 0/0 0/0 .text checkWindSpeedOnAngleAnime__9daAlink_cCFi */ bool daAlink_c::checkWindSpeedOnAngleAnime(int param_0) const { return checkWindSpeedOnAngle() && @@ -4838,13 +6563,98 @@ bool daAlink_c::checkDashAnime() const { } /* 800A7ABC-800A7CB0 0A23FC 01F4+00 1/1 0/0 0/0 .text checkWindWallRate__9daAlink_cFRC4cXyz */ -void daAlink_c::checkWindWallRate(cXyz const& param_0) { - // NONMATCHING +f32 daAlink_c::checkWindWallRate(cXyz const& param_0) { + cXyz sp24(current.pos.x, current.pos.y + (0.5f * field_0x598), current.pos.z); + cXyz sp18 = sp24 - (param_0 * daAlinkHIO_basic_c0::m.mMaxWindInfluenceDist); + + f32 var_f31; + if (commonLineCheck(&sp24, &sp18) && dComIfG_Bgsp().GetWallCode(mLinkLinChk) != 0xA) { + var_f31 = (1.0f / (daAlinkHIO_basic_c0::m.mMaxWindInfluenceDist - daAlinkHIO_basic_c0::m.mNoWindInfluenceDist)) * (sp24.abs(mLinkLinChk.i_GetCross()) - daAlinkHIO_basic_c0::m.mNoWindInfluenceDist); + if (var_f31 < 0.0f) { + var_f31 = 0.0f; + } + } else { + var_f31 = 1.0f; + } + + return var_f31; } /* 800A7CB0-800A8310 0A25F0 0660+00 1/1 0/0 0/0 .text setWindSpeed__9daAlink_cFv */ void daAlink_c::setWindSpeed() { - // NONMATCHING + if (!checkModeFlg(0x40000) && !checkNoResetFlg0(FLG0_UNDERWATER)) { + cXyz sp3C; + f32 var_f31; + f32 sp8; + + if (field_0xC04[0].ChkTgHit() || field_0xC04[1].ChkTgHit() || field_0xC04[2].ChkTgHit()) { + int i = 0; + for (; i < 3; i++) { + if (field_0xC04[i].ChkTgHit()) { + break; + } + } + + sp3C = *field_0xC04[i].GetTgRVecP(); + f32 temp_f1 = sp3C.absXZ(); + + if (temp_f1 < 1.0f && !checkGrabGlide()) { + if (field_0xC04[i].GetTgHitAc() != NULL) { + sp3C = current.pos - field_0xC04[i].GetTgHitAc()->current.pos; + } else { + sp3C = current.pos - *field_0xC04[i].GetTgHitPosP(); + } + + sp3C.y = 0.0f; + sp3C.normalizeZP(); + sp3C *= field_0xC04[i].GetTgRVecP()->abs(); + } + + sp8 = sp3C.abs(); + + if (temp_f1 >= 1.0f) { + sp3C.normalizeZP(); + sp8 *= checkWindWallRate(sp3C); + sp3C *= sp8; + } + + if (mWindSpeed.abs2() > sp8 * sp8) { + var_f31 = 4.0f; + } else { + var_f31 = 2.5f; + } + } else { + dKyw_get_AllWind_vec(¤t.pos, &sp3C, &sp8); + + if (dKy_TeachWind_existence_chk() == 0 || sp8 < 0.3f) { + sp8 = 0.0f; + } else if (sp8 > 0.0f && dKy_TeachWind_existence_chk() != -1) { + sp8 *= checkWindWallRate(sp3C); + } + + sp8 *= daAlinkHIO_basic_c0::m.mMaxWindSpeed; + sp3C *= sp8; + + if (mWindSpeed.abs2() > sp8 * sp8) { + var_f31 = 3.0f; + } else { + var_f31 = 1.0f; + } + } + + cLib_addCalcPos(&field_0x35b8, sp3C, 0.5f, var_f31, 0.5f); + field_0x30cc = field_0x35b8.atan2sX_Z(); + + if (!checkHeavyStateOn(1, 1) && !checkNoCollisionCorret() && !checkEventRun() && !checkModeFlg(0x10)) { + cLib_addCalcPos(&mWindSpeed, sp3C, 0.5f, var_f31, 0.5f); + } else { + mWindSpeed = cXyz::Zero; + } + } else { + mWindSpeed = cXyz::Zero; + field_0x35b8 = cXyz::Zero; + field_0x30cc = 0; + } } /* 80391F44-80391F50 01E5A4 000C+00 0/1 0/0 0/0 .rodata localHeadCenter$59872 */ @@ -4939,7 +6749,71 @@ COMPILER_STRIP_GATE(0x80391FB0, &canoeLocalEyeFromRoot); /* 800A8310-800A87D8 0A2C50 04C8+00 2/2 0/0 0/0 .text setBodyPartPos__9daAlink_cFv */ void daAlink_c::setBodyPartPos() { - // NONMATCHING + if (checkWolf()) { + cMtx_multVec(mpLinkModel->getAnmMtx(4), &wlLocalEye, &eyePos); + field_0x3768 = eyePos; + cMtx_multVec(mpLinkModel->getAnmMtx(4), &wlLocalHeadCenter, &field_0x34e0); + cMtx_multVec(mpLinkModel->getAnmMtx(4), &wlLocalHeadTop, &mHeadTopPos); + mDoMtx_multVecZero(mpLinkModel->getAnmMtx(0x13), &mLeftHandPos); + mDoMtx_multVecZero(mpLinkModel->getAnmMtx(0x18), &mRightHandPos); + mDoMtx_multVecZero(mpLinkModel->getAnmMtx(0x1F), &mLeftFootPos); + mDoMtx_multVecZero(mpLinkModel->getAnmMtx(0x24), &mRightFootPos); + } else { + cMtx_multVec(mpLinkModel->getAnmMtx(field_0x30b4), &localEye, &eyePos); + + if (dComIfGp_checkPlayerStatus0(0, 0x2000) && !dComIfGp_checkPlayerStatus1(0, 0x02010000) && (!checkModeFlg(0x40000) || !checkNoResetFlg0(FLG0_SWIM_UP)) && !dComIfGp_checkPlayerStatus0(0, 0x08000000)) { + mDoMtx_stack_c::transS(current.pos.x, field_0x3834.y, current.pos.z); + concatMagneBootMtx(); + mDoMtx_stack_c::ZXYrotM(field_0x310a, field_0x310c, 0); + + if (checkCanoeRide()) { + mDoMtx_stack_c::multVec(&canoeLocalEyeFromRoot, &field_0x3768); + } else if (checkBoardRide()) { + mDoMtx_stack_c::multVec(&boardLocalEyeFromRoot, &field_0x3768); + } else if (checkReinRide()) { + mDoMtx_stack_c::multVec(&horseLocalEyeFromRoot, &field_0x3768); + } else { + mDoMtx_stack_c::multVec(&localEyeFromRoot, &field_0x3768); + } + } else { + field_0x3768 = eyePos; + } + + cMtx_multVec(mpLinkModel->getAnmMtx(field_0x30b4), &localHeadCenter, &field_0x34e0); + cMtx_multVec(mpLinkModel->getAnmMtx(field_0x30b4), &localHeadTop, &mHeadTopPos); + mDoMtx_multVecZero(mpLinkModel->getAnmMtx(field_0x30b8), &mLeftHandPos); + mDoMtx_multVecZero(mpLinkModel->getAnmMtx(field_0x30ba), &mRightHandPos); + mDoMtx_multVecZero(mpLinkModel->getAnmMtx(field_0x30bc), &mLeftFootPos); + mDoMtx_multVecZero(mpLinkModel->getAnmMtx(field_0x30be), &mRightFootPos); + } + + mDoMtx_multVecZero(mpLinkModel->getAnmMtx(0), &field_0x3834); + mItemPos = mHeadTopPos; + field_0x5f8 = current.pos; + + if (checkRootTransClearMode()) { + Vec sp8; + + if (checkRootTransZClearMode()) { + sp8.z = field_0x34d4.z - field_0x3588.z; + } else { + sp8.z = 0.0f; + } + + if (checkRootTransXClearMode()) { + sp8.x = field_0x34d4.x - field_0x3588.x; + } else { + sp8.x = 0.0f; + } + + if (checkRootTransYClearMode()) { + sp8.y = field_0x33b0 - field_0x3588.y; + } else { + sp8.y = 0.0f; + } + + field_0x5f8.set((current.pos.x - (sp8.z * cM_ssin(shape_angle.y))) - sp8.x * cM_scos(shape_angle.y), current.pos.y - sp8.y, (current.pos.z - (sp8.z * cM_scos(shape_angle.y))) + sp8.x * cM_ssin(shape_angle.y)); + } } /* 800A87D8-800A87F8 0A3118 0020+00 1/0 0/0 0/0 .text setRollJump__9daAlink_cFffs */ @@ -4998,12 +6872,181 @@ COMPILER_STRIP_GATE(0x80391FEC, &swimOffset); /* 800A87F8-800A8CE4 0A3138 04EC+00 2/2 0/0 0/0 .text setAttentionPos__9daAlink_cFv */ void daAlink_c::setAttentionPos() { - // NONMATCHING + if (mProcID == PROC_METAMORPHOSE) { + attention_info.position = field_0x34e0; + } else if (checkModeFlg(0x400)) { + fopAc_ac_c* temp_r29 = mRideAcKeep.getActor(); + + if (mProcID == PROC_CANOE_RIDE || mProcID == PROC_CANOE_GETOFF || (mProcID == PROC_CANOE_WAIT && mProcVar0.field_0x3008 != 0)) { + attention_info.position = field_0x34e0; + } else if (checkSpinnerRide() || checkBoardRide()) { + attention_info.position.set(current.pos.x, 150.0f + current.pos.y, current.pos.z); + } else if (temp_r29 != NULL) { + if (checkCanoeRide()) { + f32 var_f31 = l_canoeBaseAnime.z; + if (((daCanoe_c*)temp_r29)->checkTandem()) { + var_f31 += 175.0f; + } + + attention_info.position.set(temp_r29->current.pos.x + (var_f31 * cM_ssin(shape_angle.y)), 50.0f + (temp_r29->current.pos.y + l_canoeBaseAnime.y), temp_r29->current.pos.z + (var_f31 * cM_scos(shape_angle.y))); + } else { + attention_info.position.set(temp_r29->current.pos.x, 275.0f + temp_r29->current.pos.y, temp_r29->current.pos.z); + } + } else { + attention_info.position.set(current.pos.x, 50.0f + current.pos.y, current.pos.z); + } + } else if (checkWolf()) { + if (checkModeFlg(0x10000000)) { + attention_info.position = field_0x34e0; + } else { + Vec sp8; + sp8.x = 0.0f; + sp8.z = 70.0f; + + if (checkModeFlg(0x40000) || mProcID == PROC_LAVA_RETURN) { + sp8.y = 20.0f; + } else if (checkModeFlg(0x01000000)) { + sp8.y = 50.0f; + } else { + sp8.y = 80.0f; + } + + cMtx_multVec(mpLinkModel->getBaseTRMtx(), &sp8, &attention_info.position); + + if (checkModeFlg(0x40000)) { + attention_info.position.y = current.pos.y + sp8.y; + } + } + } else if (mProcID == PROC_HOOKSHOT_FLY) { + attention_info.position = eyePos; + } else if (dComIfGp_checkPlayerStatus1(0, 0x02000000)) { + attention_info.position.set(current.pos.x + (100.0f * cM_ssin(shape_angle.y)), -50.0f + current.pos.y, current.pos.z + (100.0f * cM_scos(shape_angle.y))); + } else if (dComIfGp_checkPlayerStatus1(0, 0x10000)) { + attention_info.position.set(current.pos.x, -100.0f + current.pos.y, current.pos.z); + } else if (checkModeFlg(0x800)) { + attention_info.position = current.pos; + } else if (checkModeFlg(0x40) || mProcID == PROC_BOSS_BODY_HANG) { + mDoMtx_multVecZero(mpLinkHatModel->getBaseTRMtx(), &attention_info.position); + } else if (mProcID == PROC_ROLL_JUMP) { + mDoMtx_multVecZero(mpLinkModel->getBaseTRMtx(), &attention_info.position); + attention_info.position.y += 150.0f; + } else { + const Vec* var_r28; + f32 var_f30; + if (checkModeFlg(0x800000)) { + var_r28 = &crouchOffset; + var_f30 = current.pos.y; + } else if (checkModeFlg(0x40000)) { + var_r28 = &swimOffset; + var_f30 = current.pos.y; + } else { + if (mProcID == PROC_LAVA_RETURN) { + var_r28 = &swimOffset; + } else if (checkModeFlg(0x01000000)) { + var_r28 = &crawlOffset; + } else { + var_r28 = &normalOffset; + } + + var_f30 = mpLinkModel->getBaseTRMtx()[1][3]; + } + + cMtx_multVecSR(mpLinkModel->getBaseTRMtx(), var_r28, &attention_info.position); + attention_info.position.x += current.pos.x; + attention_info.position.y += var_f30; + attention_info.position.z += current.pos.z; + + if (mProcID == PROC_CLIMB_MOVE_SIDE) { + attention_info.position.y = field_0x347c; + } else if (mProcID == PROC_SWIM_DIVE) { + attention_info.position.y = (field_0x3478 * attention_info.position.y) + (eyePos.y * (1.0f - field_0x3478)); + } + } + + if (mSinkShapeOffset < field_0x3458) { + attention_info.position.y += field_0x3458 - mSinkShapeOffset; + } } /* 800A8CE4-800A9248 0A3624 0564+00 3/3 0/0 0/0 .text setMatrix__9daAlink_cFv */ void daAlink_c::setMatrix() { - // NONMATCHING + f32 var_f31; + if (field_0x3174 == 8 && mLinkAcch.i_ChkGroundHit() && !checkModeFlg(0x70C52)) { + var_f31 = 20.0f; + } else { + var_f31 = 0.0f; + } + + cLib_addCalc(&field_0x2ba0, var_f31, 0.5f, 12.0f, 3.0f); + + f32 var_f30; + if (checkBoardRide()) { + var_f30 = 13.0f; + } else { + var_f30 = 0.0f; + } + + mDoMtx_stack_c::transS(current.pos.x, field_0x2ba0 + (field_0x2b9c + (var_f30 + (current.pos.y + field_0x2b98))), current.pos.z); + concatMagneBootMtx(); + mDoMtx_stack_c::ZXYrotM(shape_angle.x, (shape_angle.y + field_0x308c), shape_angle.z); + + if (mProcID == PROC_BOAR_RUN || mProcID == PROC_ZORA_MOVE) { + mDoMtx_stack_c::transM(0.0f, 50.0f, 100.0f); + mDoMtx_stack_c::ZXYrotM(mProcVar4.field_0x3010, mProcVar5.field_0x3012, (1.5f * mProcVar5.field_0x3012)); + mDoMtx_stack_c::transM(0.0f, -50.0f, -100.0f); + } else if (mProcID == PROC_HORSE_RUN) { + mDoMtx_stack_c::transM(0.0f, 20.0f, 70.0f); + mDoMtx_stack_c::ZXYrotM(mProcVar4.field_0x3010, mProcVar5.field_0x3012, (0.5f * mProcVar5.field_0x3012)); + mDoMtx_stack_c::transM(0.0f, -20.0f, -70.0f); + } else if (mProcID == PROC_WOLF_CHAIN_WAIT) { + mDoMtx_stack_c::transM(0.0f, 5.0f, -3.0f); + } + + if (mProcID == PROC_MAGNE_BOOTS_FLY) { + mDoMtx_stack_c::YrotM(mProcVar2.field_0x300c); + } + + mpLinkModel->setBaseTRMtx(mDoMtx_stack_c::get()); + mDoMtx_inverse(mDoMtx_stack_c::get(), mInvMtx); + mDoMtx_stack_c::XrotS(shape_angle.x); + mDoMtx_stack_c::concat(mInvMtx); + mDoMtx_copy(mDoMtx_stack_c::get(), field_0x2be8); + + field_0x2fb6 = 0; + + if (!checkWolf()) { + if (checkKandelaarEquipAnime() || checkSwordTwirlAnime() || checkNoResetFlg0(FLG0_UNK_1000000) || (checkModeFlg(0x10000) && checkEquipAnime()) || (checkBoardRide() && checkSwordEquipAnime()) || (checkUpperGuardAnime() && checkEquipAnime())) { + field_0x2fb6 = 5; + } else if (checkReelAnime()) { + field_0x2fb6 = 4; + } else if (checkEquipAnime() && !checkModeFlg(1)) { + if (checkSwordEquipAnime() && !i_checkShieldGet()) { + field_0x2fb6 = 5; + } else { + field_0x2fb6 = 1; + } + } else if (checkAnmEnd(&mUnderFrameCtrl[0]) && (checkUnderMove0BckNoArc(ANM_HORSE_TURN_LEFT) || checkUnderMove0BckNoArc(ANM_HORSE_TURN_B) || checkUnderMove0BckNoArc(ANM_HORSE_TURN_RIGHT))) { + field_0x2fb6 = 6; + } else if (checkCokkoGlide()) { + field_0x2fb6 = 8; + } else if ((mProcID == PROC_SLIDE && field_0x3198 != 0) || (checkWindDashAnime() && checkUnderMove1BckNoArc(ANM_WALK_HEAVY) && (checkModeFlg(1) || checkZeroSpeedF()))) { + field_0x2fb6 = 7; + } else if (checkUpperAnime(0x96) || checkCutDashChargeAnime() || (checkReinRide() && (checkUpperReadyThrowAnime() || checkGrabAnime()))) { + field_0x2fb6 = 3; + } else if (checkSwordEquipAnime() && !i_checkShieldGet()) { + field_0x2fb6 = 2; + } else if (checkIronBallWaitAnime()) { + if (checkUnderMove0BckNoArc(ANM_IRONBALL_WAIT)) { + mNowAnmPackUpper[2].setRatio(0.0f); + } else { + mNowAnmPackUpper[2].setRatio(1.0f); + } + } + + if (field_0x2fb6 != 0) { + field_0x3444 = mNowAnmPackUpper[2].getRatio(); + } + } } /* 800A9248-800A92F0 0A3B88 00A8+00 15/15 0/0 5/5 .text simpleAnmPlay__9daAlink_cFP10J3DAnmBase */ @@ -5029,7 +7072,6 @@ int daAlink_c::simpleAnmPlay(J3DAnmBase* i_anm) { return ret; } - /* 80391FF8-80392004 01E658 000C+00 0/1 0/0 0/0 .rodata swordMoveLocal0$60438 */ #pragma push #pragma force_active on @@ -5059,23 +7101,293 @@ COMPILER_STRIP_GATE(0x80392010, ©RodTop); /* 800A92F0-800A9450 0A3C30 0160+00 2/2 0/0 0/0 .text setSwordPos__9daAlink_cFv */ void daAlink_c::setSwordPos() { - // NONMATCHING + field_0x34b0 = mSwordTopPos; + field_0x34bc = field_0x3498; + mDoMtx_multVecZero(mSwordModel->getBaseTRMtx(), &field_0x3498); + + if (mCutType == CUT_TYPE_TWIRL || mCutType == CUT_TYPE_FINISH_RIGHT) { + mDoMtx_multVecSR(mSwordModel->getBaseTRMtx(), &swordMoveLocal1, &field_0x34a4); + } else { + mDoMtx_multVecSR(mSwordModel->getBaseTRMtx(), &swordMoveLocal0, &field_0x34a4); + } + + if (checkMasterSwordEquip()) { + mDoMtx_multVec(mSwordModel->getBaseTRMtx(), &l_swordTopLocalM, &mSwordTopPos); + } else { + mDoMtx_multVec(mSwordModel->getBaseTRMtx(), &l_swordTopLocalN, &mSwordTopPos); + } + + if (mEquipItem == 0x10B) { + mDoMtx_multVec(getCanoePaddleMatrix(), getCanoeLocalPaddleTop(), &field_0x3720); + } else if (mEquipItem == COPY_ROD) { + mDoMtx_multVec(mHeldItemModel->getBaseTRMtx(), ©RodTop, &field_0x3720); + } else { + field_0x3720 = mSwordTopPos; + } } /* 800A9450-800A9F4C 0A3D90 0AFC+00 4/4 0/0 0/0 .text setItemMatrix__9daAlink_cFi */ void daAlink_c::setItemMatrix(int param_0) { - // NONMATCHING -} + mSheathModel->setBaseTRMtx(mpLinkModel->getAnmMtx(field_0x30b6)); + modelCalc(mSheathModel); -/* 8039201C-80392028 01E67C 000C+00 1/1 0/0 0/0 .rodata @61047 */ -SECTION_RODATA static u8 const lit_61047[12] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; -COMPILER_STRIP_GATE(0x8039201C, &lit_61047); + int var_r26; + if (!checkNoResetFlg3(FLG3_UNK_4000000)) { + if (mEquipItem == 0x103 || param_0 != 0) { + mSwordModel->setBaseTRMtx(mpLinkModel->getAnmMtx(field_0x30c0)); + var_r26 = 1; + } else { + mDoMtx_stack_c::copy(mpLinkModel->getAnmMtx(field_0x30b6)); + mDoMtx_stack_c::transM(-18.5f, 0.14f, 12.2f); + mDoMtx_stack_c::XYZrotM(0, cM_deg2s(33.1f), 0); + mSwordModel->setBaseTRMtx(mDoMtx_stack_c::get()); + var_r26 = 2; + } + + modelCalc(mSwordModel); + } + + int var_r28; + if (!i_checkSwordGet()) { + var_r28 = 0; + } else if (checkLightMasterSwordEquip()) { + var_r28 = 3; + } else if (checkMasterSwordEquip()) { + var_r28 = 2; + } else { + var_r28 = 1; + } + + mZ2Link.setLinkSwordType(var_r28, var_r26); + + if (mShieldChangeWaitTimer == 0) { + if (param_0 != 0 || (checkPlayerGuardAndAttack() && mEquipItem != IRONBALL && !checkModeFlg(0x400)) || checkNoResetFlg0(FLG0_UNK_2) || (mProcID == PROC_TOOL_DEMO && mProcVar4.field_0x3010 != 0) || (mProcID == PROC_CUT_REVERSE && mProcVar2.field_0x300c != 0) || mProcID == PROC_GUARD_BREAK || (mEquipItem == 0x103 && !checkEndResetFlg1(ERFLG1_GANON_FINISH) && !checkModeFlg(0x400))) { + mShieldModel->setBaseTRMtx(mpLinkModel->getAnmMtx(field_0x30c2)); + + if (i_checkShieldGet()) { + field_0x2e44.offPassNum(0xF); + mDoAud_setLinkShieldType(1, 1); + } else { + field_0x2e44.onPassNum(0xF); + mDoAud_setLinkShieldType(0, 2); + } + + field_0x2e44.onPassNum(0x10); + + for (int i = 0; i < 16; i++) { + field_0x2f7c[i] = 0; + } + } else { + mDoMtx_stack_c::copy(mpLinkModel->getAnmMtx(field_0x30b6)); + mDoMtx_stack_c::transM(4.2f, -4.4f, -20.0f); + mDoMtx_stack_c::XYZrotM(cM_deg2s(91.0f), cM_deg2s(57.0f), cM_deg2s(180.0f)); + mShieldModel->setBaseTRMtx(mDoMtx_stack_c::get()); + + if (!i_checkShieldGet()) { + mDoAud_setLinkShieldType(0, 2); + field_0x2e44.onPassNum(0x10); + } else { + field_0x2e44.offPassNum(0x10); + mDoAud_setLinkShieldType(1, 2); + } + + field_0x2e44.onPassNum(0xF); + stickArrowIncrement(0); + clearWoodShieldBurnEffect(); + } + + modelCalc(mShieldModel); + } + + mpLinkFaceModel->setBaseTRMtx(mpLinkModel->getAnmMtx(4)); + modelCalc(mpLinkFaceModel); + mpLinkHatModel->setBaseTRMtx(mpLinkModel->getAnmMtx(4)); + + if ((mpDemoHDTmpBck != NULL) && mpLinkHatModel != NULL && mClothesChangeWaitTimer == 0) { + if (mpDemoHDTmpBck->getBckAnm() != NULL) { + mpDemoHDTmpBck->entry(mpLinkHatModel->getModelData()); + } else { + mpDemoHDTmpBck->remove(mpLinkHatModel->getModelData()); + } + } + + modelCalc(mpLinkHatModel); + + if (checkEquipHeavyBoots()) { + for (int i = 0; i < 2; i++) { + mpLinkBootModels[i]->setBaseTRMtx(mpLinkModel->getBaseTRMtx()); + modelCalc(mpLinkBootModels[i]); + } + + mpLinkBootModels[0]->setAnmMtx(1, mpLinkModel->getAnmMtx(0x13)); + mpLinkBootModels[0]->setAnmMtx(2, mpLinkModel->getAnmMtx(0x14)); + mpLinkBootModels[0]->setAnmMtx(3, mpLinkModel->getAnmMtx(0x15)); + + mDoMtx_stack_c::XrotS(-0x8000); + mDoMtx_concat(mpLinkModel->getAnmMtx(0x18), mDoMtx_stack_c::get(), mpLinkBootModels[1]->getAnmMtx(1)); + mDoMtx_concat(mpLinkModel->getAnmMtx(0x19), mDoMtx_stack_c::get(), mpLinkBootModels[1]->getAnmMtx(2)); + mDoMtx_concat(mpLinkModel->getAnmMtx(0x1A), mDoMtx_stack_c::get(), mpLinkBootModels[1]->getAnmMtx(3)); + } + + if (!checkNoResetFlg2(FLG2_STATUS_WINDOW_DRAW)) { + if (mpDemoFCBlendModel != NULL) { + mpDemoFCBlendModel->setBaseTRMtx(mpLinkModel->getAnmMtx(4)); + mpDemoFCBlendModel->calc(); + } + + if (mpDemoFCTongueModel != NULL) { + mpDemoFCTongueModel->setBaseTRMtx(mpLinkModel->getAnmMtx(4)); + if (mpDemoFCTmpBck != NULL) { + mpDemoFCTmpBck->entry(mpDemoFCTongueModel->getModelData()); + } + mpDemoFCTongueModel->calc(); + } + + if (mHeldItemModel != NULL) { + if (mEquipItem == 0x106) { + mHeldItemModel->setBaseTRMtx(mpLinkModel->getAnmMtx(4)); + } else if (checkOilBottleItemNotGet(mEquipItem)) { + mDoMtx_stack_c::copy(mpLinkModel->getAnmMtx(field_0x30c2)); + mDoMtx_stack_c::transM(1.5f, -7.5f, -1.0f); + mDoMtx_stack_c::XYZrotM(cM_deg2s(183.0f), cM_deg2s(176.0f), cM_deg2s(167.0f)); + mHeldItemModel->setBaseTRMtx(mDoMtx_stack_c::get()); + } else if (checkBottleItem(mEquipItem)) { + mDoMtx_stack_c::copy(mpLinkModel->getAnmMtx(field_0x30c0)); + mDoMtx_stack_c::transM(-10.0f,-0.5f, -5.5f); + mDoMtx_stack_c::XYZrotM(cM_deg2s(174.0f), cM_deg2s(-47.0f), cM_deg2s(94.0f)); + mHeldItemModel->setBaseTRMtx(mDoMtx_stack_c::get()); + + if (mpHookTipModel != NULL) { + simpleAnmPlay(mHookTipBck.getBckAnm()); + mpHookTipModel->setBaseTRMtx(mDoMtx_stack_c::get()); + mpHookTipModel->calc(); + } + } else if (checkBowAndSlingItem(mEquipItem)) { + if (checkBowGrabLeftHand()) { + mDoMtx_stack_c::copy(mpLinkModel->getAnmMtx(field_0x30c0)); + mDoMtx_stack_c::transM(-1.3f, 0.0f, -3.0f); + mDoMtx_stack_c::XYZrotM(cM_deg2s(-74.0f), cM_deg2s(43.6), cM_deg2s(1.9f)); + mHeldItemModel->setBaseTRMtx(mDoMtx_stack_c::get()); + } else { + mHeldItemModel->setBaseTRMtx(mpLinkModel->getAnmMtx(field_0x30c2)); + } + } else if (checkHookshotItem(mEquipItem)) { + setHookshotPos(); + } else if (mEquipItem == IRONBALL) { + setIronBallPos(); + } else { + if (mEquipItem == COPY_ROD && mProcID != PROC_COPY_ROD_REVIVE) { + if (checkCopyRodTopUse()) { + field_0x0724->setFrame(field_0x0724->getFrameMax() - 0.001f); + } else { + field_0x0724->setFrame(0.0f); + } + } + + mHeldItemModel->setBaseTRMtx(mpLinkModel->getAnmMtx(field_0x30c0)); + } + + if (mItemBck.getBckAnm() != NULL) { + if (field_0x33dc >= mItemBck.getBckAnm()->getFrameMax()) { + field_0x33dc = mItemBck.getBckAnm()->getFrameMax() - 0.001f; + } + + mItemBck.entry(mHeldItemModel->getModelData(), field_0x33dc); + } + + mHeldItemModel->calc(); + } + + if (checkNoResetFlg2(FLG2_UNK_1) || checkEndResetFlg1(ERFLG1_UNK_4)) { + simpleAnmPlay(mpKanteraGlowBtk); + + if (mProcID != PROC_OPEN_TREASURE && !checkEndResetFlg1(ERFLG1_UNK_4) && (mProcID != PROC_GET_ITEM || mProcVar4.field_0x3010 == 0)) { + if (mEquipItem == KANTERA || checkOilBottleItemNotGet(mEquipItem)) { + mDoMtx_stack_c::copy(mpLinkModel->getAnmMtx(field_0x30c0)); + mDoMtx_stack_c::transM(-2.0f, -0.1f, -0.7f); + mDoMtx_stack_c::XYZrotM(cM_deg2s(100.0f), cM_deg2s(9.3f), cM_deg2s(183.0f)); + mpKanteraModel->setBaseTRMtx(mDoMtx_stack_c::get()); + } else { + mDoMtx_stack_c::copy(mpLinkModel->getAnmMtx(0x10)); + mDoMtx_stack_c::transM(-1.0f, 4.5f, 9.0f); + mDoMtx_stack_c::XYZrotM(cM_deg2s(-75.0f), cM_deg2s(62.0f), cM_deg2s(89.0f)); + mpKanteraModel->setBaseTRMtx(mDoMtx_stack_c::get()); + } + } + + modelCalc(mpKanteraModel); + mDoMtx_stack_c::transS(mKandelaarFlamePos); + mpKanteraGlowModel->setBaseTRMtx(mDoMtx_stack_c::get()); + modelCalc(mpKanteraGlowModel); + } + + setSwordPos(); + simpleAnmPlay(m_mSwordBtk); + simpleAnmPlay(m_mSwordBrk); + setHorseStirrup(); + } +} /* 800A9F4C-800AA2BC 0A488C 0370+00 4/4 0/0 0/0 .text setWolfItemMatrix__9daAlink_cFv */ void daAlink_c::setWolfItemMatrix() { - // NONMATCHING + mDoMtx_stack_c::copy(mpLinkModel->getAnmMtx(2)); + mDoMtx_stack_c::transM(31.0f, -29.0f, 19.0f); + mDoMtx_stack_c::XYZrotM(0, cM_deg2s(32.0f), cM_deg2s(157.0f)); + mSwordModel->setBaseTRMtx(mDoMtx_stack_c::get()); + modelCalc(mSwordModel); + + mDoMtx_stack_c::copy(mpLinkModel->getAnmMtx(2)); + mDoMtx_stack_c::transM(13.0f, -21.0f, 7.0f); + mDoMtx_stack_c::XYZrotM(0, cM_deg2s(-0.8f), cM_deg2s(157.0f)); + mSheathModel->setBaseTRMtx(mDoMtx_stack_c::get()); + modelCalc(mSheathModel); + + mDoMtx_stack_c::copy(mpLinkModel->getAnmMtx(2)); + mDoMtx_stack_c::transM(11.0f, -18.0f, -13.0f); + mDoMtx_stack_c::XYZrotM(cM_deg2s(90.0f), cM_deg2s(58.0f), cM_deg2s(-24.0f)); + + if (mShieldChangeWaitTimer == 0) { + mShieldModel->setBaseTRMtx(mDoMtx_stack_c::get()); + modelCalc(mShieldModel); + } + + if (!checkNoResetFlg2(FLG2_STATUS_WINDOW_DRAW)) { + setSwordPos(); + + if (mHeldItemModel != NULL) { + if (mEquipItem == 0x109) { + f32 temp_f31 = 0.01f * mSearchBallScale; + Vec sp1C = {temp_f31, temp_f31, temp_f31}; + + mDoMtx_trans(mHeldItemModel->getBaseTRMtx(), current.pos.x, current.pos.y, current.pos.z); + mHeldItemModel->setBaseScale(sp1C); + + if (field_0x0718 != NULL) { + simpleAnmPlay(field_0x0718); + } + } else { + mDoMtx_stack_c::copy(mpLinkModel->getAnmMtx(4)); + mDoMtx_stack_c::transM(28.0f, 14.0f, 0.0f); + mDoMtx_copy(mDoMtx_stack_c::get(), mHeldItemModel->getBaseTRMtx()); + mIronBallCenterPos = mHookshotTopPos; + mHookshotTopPos = mHeldItemRootPos; + mDoMtx_stack_c::multVecZero(&mHeldItemRootPos); + + simpleAnmPlay(field_0x0718); + + mpHookSound->startLevelSound(Z2SE_EN_PO_SOUL, 0, -1); + mpHookSound->framework(0, mVoiceReverbIntensity); + + if (mProcID != PROC_WOLF_DOWN_AT_LAND) { + field_0x32d4 = dComIfGp_particle_set(field_0x32d4, 0x86CD, &mHeldItemRootPos, &tevStr, NULL, NULL, 0xFF, &field_0x2f38, -1, NULL, NULL, NULL); + } + } + + mHeldItemModel->calc(); + } + + setWolfChainPos(); + } } /* 800AA2BC-800AA2E0 0A4BFC 0024+00 3/3 0/0 0/0 .text @@ -5265,18 +7577,260 @@ void daAlink_c::resetAtCollision(int param_0) { } } -/* 80392028-80392034 01E688 000C+00 0/1 0/0 0/0 .rodata bottleTopPos$61387 */ -#pragma push -#pragma force_active on -SECTION_RODATA static Vec const bottleTopPos = { - 0.0f, 20.0f, 0.0f -}; -COMPILER_STRIP_GATE(0x80392028, &bottleTopPos); -#pragma pop - /* 800AAABC-800AB878 0A53FC 0DBC+00 1/1 0/0 0/0 .text setAtCollision__9daAlink_cFv */ void daAlink_c::setAtCollision() { - // NONMATCHING + static const Vec bottleTopPos = { + 0.0f, 20.0f, 0.0f + }; + + static Vec rodTopOffset = { + 0.0f, daCrod_c::getFlyInitY(), 0.0f + }; + + daPy_frameCtrl_c* temp_r29 = &mUnderFrameCtrl[0]; + + cXyz spC8; + cXyz spBC; + cXyz spB0; + cXyz spA4; + + if (mProcID == PROC_COPY_ROD_SWING) { + if (mProcVar3.field_0x300e != 0) { + mDoMtx_multVecZero(mHeldItemModel->getBaseTRMtx(), &spBC); + mAtCps[0].SetStartEnd(spBC, field_0x3720); + spA4.set(5.0f * cM_ssin(shape_angle.y), 0.0f, 5.0f * cM_scos(shape_angle.y)); + mAtCps[0].SetAtVec(spA4); + dComIfG_Ccsp()->Set(&mAtCps[0]); + } else { + mAtCps[0].ResetAtHit(); + } + } else if (mProcID == PROC_COPY_ROD_SUBJECT && checkCopyRodTopUse()) { + mDoMtx_stack_c::transS(field_0x3834); + mDoMtx_stack_c::ZXYrotM(mBodyAngle.x, (shape_angle.y + mBodyAngle.y), 0); + mDoMtx_stack_c::multVec(&rodTopOffset, &spBC); + + spC8.set(0.0f, 0.0f, getCopyRodBallDisMax() + daCrod_c::getFlyInitZ()); + mDoMtx_stack_c::multVecSR(&spC8, &spA4); + spB0 = spBC + spA4; + + mAtCps[0].SetStartEnd(spBC, spB0); + mAtCps[0].SetAtVec(spA4); + dComIfG_Ccsp()->Set(&mAtCps[0]); + } else if (mProcID == PROC_BOTTLE_OPEN) { + if (mEquipItem == WATER_BOTTLE && mProcVar4.field_0x3010 != 0) { + mDoMtx_multVec(mHeldItemModel->getBaseTRMtx(), &bottleTopPos, &spC8); + + if (field_0x27c8.getKeepMinY() < spC8.y) { + mAtCyl.SetH(spC8.y - field_0x27c8.getKeepMinY()); + spC8.y = field_0x27c8.getKeepMinY(); + + mAtCyl.SetC(spC8); + dComIfG_Ccsp()->Set(&mAtCyl); + } + } else { + mAtCyl.ResetAtHit(); + } + } else if (mProcID == PROC_GUARD_ATTACK) { + if (mProcVar5.field_0x3012 != 0) { + if (checkMagneBootsOn()) { + mDoMtx_stack_c::copy(mMagneBootMtx); + mDoMtx_stack_c::YrotM(shape_angle.y); + } else { + mDoMtx_stack_c::YrotS(shape_angle.y); + } + + mDoMtx_stack_c::multVecSR(&cXyz::BaseZ, &spA4); + + spBC = current.pos + (spA4 * daAlinkHIO_guard_c0::m.mAttackPosOffset); + mDoMtx_stack_c::multVecSR(&cXyz::BaseY, &spC8); + + spB0 = spBC + (spC8 * 130.0f); + mGuardAtCps.SetStartEnd(spBC, spB0); + + spA4 *= 5.0f; + mGuardAtCps.SetAtVec(spA4); + + dComIfG_Ccsp()->Set(&mGuardAtCps); + g_dComIfG_gameInfo.play.mCcs.mMass_Mng.Set(&mGuardAtCps, 1); + } else { + mGuardAtCps.ResetAtHit(); + } + } else if (mProcID == PROC_FRONT_ROLL) { + if (checkEquipHeavyBoots() && temp_r29->getFrame() >= daAlinkHIO_frontRoll_c0::m.mBootsAttackInitF && temp_r29->getFrame() < daAlinkHIO_frontRoll_c0::m.mBootsAttackEndF) { + cXyz sp98 = (mLeftFootPos + mRightFootPos) * 0.5f; + field_0xFB8.SetC(sp98); + sp98.set(mNormalSpeed * cM_ssin(shape_angle.y), 0.0f, mNormalSpeed * cM_scos(shape_angle.y)); + field_0xFB8.SetAtVec(sp98); + + dComIfG_Ccsp()->Set(&field_0xFB8); + } else { + field_0xFB8.ResetAtHit(); + } + } else if (checkHookshotItem(mEquipItem)) { + if (mItemMode == 3 || mItemMode == 1) { + f32 var_f30; + f32 var_f29; + if (checkLv7BossRoom()) { + var_f29 = daAlinkHIO_hookshot_c0::m.mBossShootSpeed; + var_f30 = daAlinkHIO_hookshot_c0::m.mBossMaxLength; + } else { + var_f29 = daAlinkHIO_hookshot_c0::m.mShootSpeed; + var_f30 = daAlinkHIO_hookshot_c0::m.mMaxLength; + } + + f32 var_f31; + if (mItemMode == 3) { + spC8 = mHookshotTopPos - mHeldItemRootPos; + + f32 temp_f1 = spC8.abs(); + var_f31 = 15.0f + var_f29; + if (var_f31 + temp_f1 > var_f30) { + var_f31 = var_f30 - temp_f1; + } + + if (cLib_distanceAngleS(spC8.atan2sX_Z(), field_0x301e) > 0x4000) { + var_f31 = -1.0f; + } + } else { + mRopeLinChk.Set(&field_0x3834, &mHeldItemRootPos, this); + if (dComIfG_Bgsp().LineCross(&mRopeLinChk)) { + var_f31 = -1.0f; + } else { + var_f31 = var_f30; + } + } + + if (var_f31 > 0.0f) { + spBC = mHookshotTopPos; + spB0 = mHookshotTopPos + (mIronBallCenterPos * var_f31); + + mRopeLinChk.Set(&spBC, &spB0, this); + if (dComIfG_Bgsp().LineCross(&mRopeLinChk)) { + spB0 = mRopeLinChk.i_GetCross(); + } + + mAtCps[0].SetStartEnd(spBC, spB0); + spA4 = spB0 - spBC; + mAtCps[0].SetAtVec(spA4); + dComIfG_Ccsp()->Set(&mAtCps[0]); + } else { + mAtCps[0].ResetAtHit(); + } + } else { + mAtCps[0].ResetAtHit(); + } + } else if (checkKandelaarSwing(1)) { + if (dComIfGs_getOil() != 0 && mUnderFrameCtrl[0].getFrame() >= field_0x347c && mUnderFrameCtrl[0].getFrame() <= field_0x3480) { + if (field_0xFB8.ChkAtSet()) { + field_0xFB8.MoveCAt(mKandelaarFlamePos); + } else { + field_0xFB8.OnAtSetBit(); + field_0xFB8.StartCAt(mKandelaarFlamePos); + } + + dComIfG_Ccsp()->Set(&field_0xFB8); + g_dComIfG_gameInfo.play.mCcs.mMass_Mng.Set(&field_0xFB8, 1); + } else { + field_0xFB8.ResetAtHit(); + } + } else if (mEquipItem == IRONBALL) { + if (mItemVar0.field_0x3018 == 2 || mItemVar0.field_0x3018 == 3 || mItemVar0.field_0x3018 == 4 || mItemVar0.field_0x3018 == 5 || mItemVar0.field_0x3018 == 7 || mItemVar0.field_0x3018 == 6) { + + if (field_0xFB8.ChkAtSet()) { + field_0xFB8.MoveCAt(mIronBallCenterPos); + } else { + field_0xFB8.StartCAt(mIronBallCenterPos); + field_0xFB8.OnAtSetBit(); + } + + dComIfG_Ccsp()->Set(&field_0xFB8); + g_dComIfG_gameInfo.play.mCcs.mMass_Mng.Set(&field_0xFB8, 1); + + if (mItemVar0.field_0x3018 == 5 || mItemVar0.field_0x3018 == 7 || mItemVar0.field_0x3018 == 6) { + field_0x1778.SetC(mIronBallCenterPos); + dComIfG_Ccsp()->Set(&field_0x1778); + } + } else { + field_0xFB8.ResetAtHit(); + field_0x1778.ResetAtHit(); + } + } + + if (checkResetFlg0(RFLG0_UNK_2)) { + if (!setSwordHitVibration(&mAtCps[0]) && !setSwordHitVibration(&mAtCps[1]) && !setSwordHitVibration(&mAtCps[2]) && !setSwordHitVibration(&mAtCyl)) { + setSwordHitVibration(&field_0xFB8); + } + + if (checkCutDashAnime()) { + m_swordBlur.field_0x20 = daAlinkHIO_cut_c0::m.mDashBlurAlpha; + spC8.set(current.pos.x + (50.0f * cM_ssin(shape_angle.y)), 20.0f + current.pos.y, current.pos.z + (50.0f * cM_scos(shape_angle.y))); + } else { + m_swordBlur.field_0x20 = daAlinkHIO_cut_c0::m.mBlurAlpha; + spC8.set(current.pos.x + (50.0f * cM_ssin(shape_angle.y)), field_0x3478, current.pos.z + (50.0f * cM_scos(shape_angle.y))); + } + + if (mProcID == PROC_CUT_TURN || (mProcID == PROC_CUT_LARGE_JUMP_LAND && mProcVar2.field_0x300c != 0) || mProcID == PROC_BOARD_CUT_TURN) { + if (!checkNoResetFlg0(FLG0_UNK_40)) { + onNoResetFlg0(FLG0_UNK_40); + } + + spC8 = current.pos + (mMagneBootsTopVec * 50.0f); + field_0xFB8.SetC(spC8); + + spC8 = cXyz::Zero; + field_0xFB8.SetAtVec(spC8); + dComIfG_Ccsp()->Set(&field_0xFB8); + g_dComIfG_gameInfo.play.mCcs.mMass_Mng.Set(&field_0xFB8, 1); + decSwordBlur(); + + if (mProcID == PROC_BOARD_CUT_TURN) { + mProcVar5.field_0x3012 = cM_atan2s(mRightFootPos.x - mLeftFootPos.x, mRightFootPos.z - mLeftFootPos.z) - shape_angle.y; + } + } else if (mProcID == PROC_HORSE_CUT_TURN) { + if (!checkNoResetFlg0(FLG0_UNK_40)) { + onNoResetFlg0(FLG0_UNK_40); + } + + spC8.set(current.pos.x, current.pos.y - 80.0f, current.pos.z); + mAtCyl.SetC(spC8); + dComIfG_Ccsp()->Set(&mAtCyl); + g_dComIfG_gameInfo.play.mCcs.mMass_Mng.Set(&mAtCyl, 1); + decSwordBlur(); + } else if (!checkNoResetFlg0(FLG0_UNK_40)) { + setSwordAtCollision(1); + onNoResetFlg0(FLG0_UNK_40); + + if (checkCutDashAnime()) { + mAtCyl.StartCAt(spC8); + dComIfG_Ccsp()->Set(&mAtCyl); + } + + if (!checkCutTypeNoBlur()) { + m_swordBlur.initBlur(0.0f, 0, &mSwordTopPos, &field_0x3498, &field_0x34a4); + return; + } + + decSwordBlur(); + } else { + setSwordAtCollision(0); + + if (checkCutDashAnime()) { + mAtCyl.MoveCAt(spC8); + dComIfG_Ccsp()->Set(&mAtCyl); + } + + if (!checkCutTypeNoBlur()) { + m_swordBlur.copyBlur(&mSwordTopPos, &field_0x3498, &field_0x34a4); + return; + } + + decSwordBlur(); + } + } else { + decSwordBlur(); + resetAtCollision(1); + mAtCyl.ResetAtHit(); + } } /* 80392034-80392040 01E694 000C+00 1/1 0/0 0/0 .rodata localHead$61779 */ @@ -5288,7 +7842,56 @@ COMPILER_STRIP_GATE(0x80392034, &localHead); /* 800AB878-800ABAE0 0A61B8 0268+00 1/1 0/0 0/0 .text setWolfCollisionPos__9daAlink_cFv */ void daAlink_c::setWolfCollisionPos() { - // NONMATCHING + cXyz sp44; + mDoMtx_multVec(mpLinkModel->getAnmMtx(4), &localHead, &sp44); + field_0xFB8.MoveCAt(sp44); + + cXyz sp38; + cXyz sp2C; + f32 sp20[3]; + mDoMtx_multVecZero(mpLinkModel->getAnmMtx(0x10), &sp38); + mDoMtx_multVecZero(mpLinkModel->getAnmMtx(0x15), &sp2C); + + sp44.x = 0.5f * (sp38.x + sp2C.x); + sp44.z = 0.5f * (sp38.z + sp2C.z); + + sp20[0] = field_0xFB8.GetC().y; + sp44.y = mLeftHandPos.y > mRightHandPos.y ? mRightHandPos.y : mLeftHandPos.y; + + if (sp20[0] < sp44.y) { + f32 temp_f31 = sp20[0]; + sp20[0] = sp44.y; + sp44.y = temp_f31; + } + + field_0x850[0].SetC(sp44); + mDoMtx_multVecZero(mpLinkModel->getAnmMtx(0x1C), &sp38); + mDoMtx_multVecZero(mpLinkModel->getAnmMtx(0x21), &sp2C); + + sp20[2] = 0.5f * (sp38.y + sp2C.y); + sp44.x = 0.5f * (sp38.x + sp2C.x); + sp44.z = 0.5f * (sp38.z + sp2C.z); + + sp44.y = mLeftFootPos.y > mRightFootPos.y ? mRightFootPos.y : mLeftFootPos.y; + + if (sp20[2] < sp44.y) { + f32 temp_f31_2 = sp20[2]; + sp20[2] = sp44.y; + sp44.y = temp_f31_2; + } + + field_0x850[2].SetC(sp44); + sp44 = (field_0x850[0].GetC() + field_0x850[2].GetC()) * 0.5f; + + sp20[1] = 0.5f * (sp20[0] + sp20[2]); + + field_0x850[1].SetC(sp44); + + for (int i = 0; i < 3; i++) { + field_0x850[i].SetH(20.0f + (sp20[i] - field_0x850[i].GetC().y)); + } + + field_0x3454 = field_0x850[0].GetC().y + (field_0x850[0].GetH() * 0.5f); } /* 800ABAE0-800ABB28 0A6420 0048+00 2/2 0/0 0/0 .text initLockAt__9daAlink_cFv */ @@ -5360,7 +7963,7 @@ void daAlink_c::setCollisionPos() { } /* 800ABDB8-800AC328 0A66F8 0570+00 1/1 0/0 0/0 .text setCollision__9daAlink_cFv */ -// NONMATCHING +// NONMATCHING - regalloc / minor issues void daAlink_c::setCollision() { field_0x814.Move(); field_0x173c.Move(); @@ -5511,7 +8114,6 @@ f32 daAlink_c::getBaseAnimeFrame() const { return mUnderFrameCtrl[0].getFrame(); } - /* 800AC378-800AC394 0A6CB8 001C+00 1/0 0/0 0/0 .text setAnimeFrame__9daAlink_cFf */ void daAlink_c::setAnimeFrame(f32 frame) { mUnderFrameCtrl[0].setFrame(frame); @@ -5646,7 +8248,60 @@ void daAlink_c::setDoubleAnimeBlendRatio(f32 param_0) { void daAlink_c::commonDoubleAnime(J3DAnmTransform* param_0, J3DAnmTransform* param_1, J3DAnmTransform* param_2, J3DAnmTransform* param_3, f32 param_4, f32 param_5, f32 param_6, int param_7) { - // NONMATCHING + daPy_frameCtrl_c* temp_r29 = &mUnderFrameCtrl[0]; + daPy_frameCtrl_c* temp_r24 = &mUnderFrameCtrl[1]; + + f32 var_f31; + if (field_0x2f8c == 0) { + var_f31 = 0.0f; + } else { + var_f31 = temp_r29->getFrame() / temp_r29->getEnd(); + } + + setDoubleAnimeBlendRatio(param_4); + + f32 temp_f30; + f32 temp_f29 = param_0->getFrameMax(); + f32 temp_f28 = param_2->getFrameMax(); + f32 temp_f27 = 1.0f / temp_f29; + temp_f30 = param_5 + (param_4 * (((param_6 * temp_f29) / temp_f28) - param_5)); + + setFrameCtrl(temp_r29, param_0->getAttribute(), 0, temp_f29, temp_f30, var_f31 * temp_f29); + param_0->setFrame(temp_r29->getFrame()); + + setFrameCtrl(temp_r24, param_2->getAttribute(), 0, temp_f28, temp_f27 * (temp_f30 * temp_f28), var_f31 * temp_f28); + param_2->setFrame(temp_r24->getFrame()); + + mNowAnmPackUnder[0].setAnmTransform(param_0); + mNowAnmPackUnder[1].setAnmTransform(param_2); + + if (param_1 != NULL) { + f32 temp_f26 = param_1->getFrameMax(); + mNowAnmPackUpper[0].setAnmTransform(param_1); + + setFrameCtrl(&mUpperFrameCtrl[0], param_1->getAttribute(), 0, temp_f26, temp_f27 * (temp_f30 * temp_f26), var_f31 * temp_f26); + param_1->setFrame(mUpperFrameCtrl[0].getFrame()); + } else { + mNowAnmPackUpper[0].setAnmTransform(param_0); + } + + if (param_3 != NULL) { + f32 temp_f25 = param_3->getFrameMax(); + mNowAnmPackUpper[1].setAnmTransform(param_3); + + setFrameCtrl(&mUpperFrameCtrl[1], param_3->getAttribute(), 0, temp_f25, temp_f27 * (temp_f30 * temp_f25), var_f31 * temp_f25); + param_3->setFrame(mUpperFrameCtrl[1].getFrame()); + } else { + mNowAnmPackUpper[1].setAnmTransform(param_2); + } + + if (param_7 == 4 || param_7 == 2) { + setBasAnime(UNDER_0); + } else { + setBasAnime(UNDER_1); + } + + field_0x2f8c = param_7; } /* 800ACA14-800ACD40 0A7354 032C+00 14/14 0/0 0/0 .text @@ -5731,12 +8386,66 @@ int daAlink_c::setDoubleAnime(f32 i_blendRate, f32 i_anmSpeedA, f32 i_anmSpeedB, return 1; } - /* 800ACD40-800ACF80 0A7680 0240+00 2/2 0/0 0/0 .text * commonSingleAnime__9daAlink_cFP15J3DAnmTransformP15J3DAnmTransformffs */ void daAlink_c::commonSingleAnime(J3DAnmTransform* param_0, J3DAnmTransform* param_1, f32 param_2, f32 param_3, s16 param_4) { - // NONMATCHING + mUnderAnmHeap[1].resetIdx(); + mUpperAnmHeap[1].resetIdx(); + setDoubleAnimeBlendRatio(0.0f); + + mNowAnmPackUnder[0].setAnmTransform(param_0); + mNowAnmPackUnder[1].setAnmTransform(NULL); + + s16 var_r30; + if (param_4 < 0) { + var_r30 = param_0->getFrameMax(); + } else { + var_r30 = param_4; + } + + f32 var_f31; + if (param_2 < 0.0f) { + var_f31 = var_r30; + } else { + var_f31 = param_3; + } + + if (checkNoResetFlg0(FLG0_UNDERWATER) && checkModeFlg(0x200)) { + if (checkZoraWearAbility() && mProcID != PROC_FRONT_ROLL && mEquipItem == 0x103) { + param_2 *= daAlinkHIO_magneBoots_c0::m.mWaterVelRateSword * (1.0f / daAlinkHIO_magneBoots_c0::m.mZoraWaterAnmSpeed); + } else if (!checkZoraWearAbility()) { + param_2 *= daAlinkHIO_magneBoots_c0::m.mWaterStartWalkAnmRate * (1.0f / daAlinkHIO_magneBoots_c0::m.mWaterWalkAnmRate); + } + } + + setFrameCtrl(&mUnderFrameCtrl[0], param_0->getAttribute(), param_3, var_r30, param_2, var_f31); + param_0->setFrame(var_f31); + + if (param_1 != NULL) { + mNowAnmPackUpper[0].setAnmTransform(param_1); + + if (param_4 < 0) { + var_r30 = param_1->getFrameMax(); + } else { + var_r30 = param_4; + } + + if (param_2 < 0.0f) { + var_f31 = var_r30; + } else { + var_f31 = param_3; + } + + setFrameCtrl(&mUpperFrameCtrl[0], param_1->getAttribute(), param_3, var_r30, param_2, var_f31); + param_1->setFrame(var_f31); + } else { + mNowAnmPackUpper[0].setAnmTransform(param_0); + } + + mNowAnmPackUpper[1].setAnmTransform(NULL); + setBasAnime(UNDER_0); + field_0x2f8c = 0; } /* 800ACF80-800ACFB0 0A78C0 0030+00 88/88 0/0 0/0 .text @@ -5887,9 +8596,71 @@ void daAlink_c::setUpperAnimeBaseSpeed(u16 i_anmResID, f32 i_speed, f32 i_morf) /* 800AD3D8-800AD6F0 0A7D18 0318+00 13/13 0/0 0/0 .text * setUpperAnime__9daAlink_cFUsQ29daAlink_c13daAlink_UPPERffsf */ -void daAlink_c::setUpperAnime(u16 i_anmResID, daAlink_c::daAlink_UPPER param_1, f32 i_speed, +int daAlink_c::setUpperAnime(u16 i_anmResID, daAlink_c::daAlink_UPPER param_1, f32 i_speed, f32 i_startFrame, s16 i_endFrame, f32 i_morf) { - // NONMATCHING + BOOL var_r28 = 0; + + if (param_1 == 2) { + resetFacePriAnime(); + offNoResetFlg1(daPy_FLG1(FLG1_UNK_10000000 | FLG1_UNK_4000000 | FLG1_UNK_100000 | FLG1_UNK_40000 | FLG1_UNK_20000 | FLG1_UNK_10000 | FLG1_UNK_40 | FLG1_UNK_8 | FLG1_UNK_2)); + cancelItemUseQuake(0); + + if (checkFmChainGrabAnime()) { + var_r28 = 1; + } + } + + if (checkDkCaught2Anime()) { + offNoResetFlg0(FLG0_UNK_20000); + } + + J3DAnmTransform* var_r30 = getAnimeResource(&mUpperAnmHeap[param_1], i_anmResID, 0x2C00); + if (var_r30 == NULL) { + var_r30 = getNowAnmPackUpper(param_1); + } + + mNowAnmPackUpper[param_1].setAnmTransform(var_r30); + mNowAnmPackUpper[param_1].setRatio(1.0f); + mUpperAnmHeap[param_1].setIdx(i_anmResID); + + if (i_endFrame < 0) { + i_endFrame = var_r30->getFrameMax(); + } + + f32 var_f31; + if (i_speed < 0.0f) { + var_f31 = i_endFrame; + } else { + var_f31 = i_startFrame; + } + + if (!checkZoraWearAbility() && (checkEquipAnime() || checkCutDashAnime()) && (checkNoResetFlg0(FLG0_UNDERWATER) || !checkNoResetFlg0(FLG0_SWIM_UP))) { + i_speed *= daAlinkHIO_magneBoots_c0::m.mWaterStartWalkAnmRate * (1.0f / daAlinkHIO_magneBoots_c0::m.mWaterWalkAnmRate); + } + + setFrameCtrl(&mUpperFrameCtrl[param_1], var_r30->getAttribute(), i_startFrame, i_endFrame, i_speed, var_f31); + var_r30->setFrame(var_f31); + setUpperAnimeMorf(i_morf); + + if (!checkBowAnime()) { + setBowNormalAnime(); + deleteArrow(); + } + + if (!checkGrabAnimeAndThrow() && !checkWolfGrabAnime()) { + freeGrabItem(); + } + + if (!checkWolfEnemyThrowAnime() && checkNoResetFlg2(FLG2_UNK_8)) { + resetWolfEnemyBiteAll(); + } + + if (var_r28 != 0 && !checkFmChainGrabAnime()) { + cancelFmChainGrabFromOut(); + } + + offNoResetFlg0(FLG0_UNK_1000000); + return 1; } /* 800AD6F0-800AD724 0A8030 0034+00 21/21 0/0 0/0 .text @@ -5902,8 +8673,44 @@ void daAlink_c::setUpperAnimeParam(u16 i_anmResID, daAlink_c::daAlink_UPPER para /* 800AD724-800AD8F4 0A8064 01D0+00 65/65 0/0 0/0 .text * resetUpperAnime__9daAlink_cFQ29daAlink_c13daAlink_UPPERf */ -void daAlink_c::resetUpperAnime(daAlink_c::daAlink_UPPER param_0, f32 param_1) { - // NONMATCHING +int daAlink_c::resetUpperAnime(daAlink_c::daAlink_UPPER param_0, f32 param_1) { + BOOL var_r29 = 0; + if (checkFmChainGrabAnime()) { + cancelFmChainGrabFromOut(); + } else if (!checkModeFlg(0x100000) && (checkGrabAnime() || checkWolfGrabAnime())) { + var_r29 = 1; + } + + if (checkDkCaught2Anime()) { + offNoResetFlg0(FLG0_UNK_20000); + } else if (checkWolfEnemyThrowAnime()) { + resetWolfEnemyBiteAll(); + } + + mNowAnmPackUpper[param_0].setAnmTransform(NULL); + mNowAnmPackUpper[param_0].setRatio(0.0f); + mUpperAnmHeap[param_0].resetIdx(); + mUpperFrameCtrl[param_0].init(0); + + setUpperAnimeMorf(param_1); + + if (param_0 == 2) { + resetFacePriAnime(); + } + + field_0x2f96 = 0xFF; + field_0x2f97 = 0xFF; + deleteArrow(); + setBowNormalAnime(); + offNoResetFlg1(daPy_FLG1(FLG1_UNK_10000000 | FLG1_UNK_4000000 | FLG1_UNK_100000 | FLG1_UNK_40000 | FLG1_UNK_20000 | FLG1_UNK_10000 | FLG1_UNK_40 | FLG1_UNK_8 | FLG1_UNK_2)); + + if (var_r29) { + freeGrabItem(); + } + + offNoResetFlg0(FLG0_UNK_1000000); + cancelItemUseQuake(0); + return 1; } /* 800AD8F4-800AD964 0A8234 0070+00 2/2 0/0 0/0 .text setUnderAnimeMorf__9daAlink_cFf */ @@ -5922,10 +8729,32 @@ void daAlink_c::setUnderAnimeMorf(f32 param_0) { /* 800AD964-800ADAB8 0A82A4 0154+00 5/5 0/0 0/0 .text * setUnderAnime__9daAlink_cFUsQ29daAlink_c13daAlink_UNDERffsf */ -int daAlink_c::setUnderAnime(u16 param_0, daAlink_c::daAlink_UNDER param_1, f32 param_2, - f32 param_3, s16 param_4, f32 param_5) { - // NONMATCHING - return 0; +int daAlink_c::setUnderAnime(u16 i_resID, daAlink_c::daAlink_UNDER i_packIdx, f32 i_speed, + f32 i_startF, s16 i_endF, f32 i_morf) { + J3DAnmTransform* var_r30 = getAnimeResource(&mUnderAnmHeap[i_packIdx], i_resID, 0x2C00); + if (var_r30 == NULL) { + var_r30 = getNowAnmPackUnder(i_packIdx); + } + + mNowAnmPackUnder[i_packIdx].setAnmTransform(var_r30); + mNowAnmPackUnder[i_packIdx].setRatio(1.0f); + mUnderAnmHeap[i_packIdx].setIdx(i_resID); + + if (i_endF < 0) { + i_endF = var_r30->getFrameMax(); + } + + f32 var_f31; + if (i_speed < 0.0f) { + var_f31 = i_endF; + } else { + var_f31 = i_startF; + } + + setFrameCtrl(&mUnderFrameCtrl[i_packIdx], var_r30->getAttribute(), i_startF, i_endF, i_speed, var_f31); + var_r30->setFrame(var_f31); + setUnderAnimeMorf(i_morf); + return 1; } /* 800ADAB8-800ADAEC 0A83F8 0034+00 2/2 0/0 0/0 .text @@ -6000,50 +8829,693 @@ f32 daAlink_c::getMoveGroundAngleSpeedRate() { /* 800ADE14-800AEA70 0A8754 0C5C+00 20/20 0/0 0/0 .text setBlendMoveAnime__9daAlink_cFf */ void daAlink_c::setBlendMoveAnime(f32 param_0) { - // NONMATCHING + daPy_frameCtrl_c* sp34 = &mUnderFrameCtrl[0]; + daPy_frameCtrl_c* sp30 = &mUnderFrameCtrl[1]; + f32 var_f31 = getMoveGroundAngleSpeedRate(); + + f32 sp2C; + f32 sp28 = daAlinkHIO_move_c0::m.mFootPositionRatio; + BOOL sp24 = checkEventRun(); + BOOL sp20 = checkBootsMoveAnime(1); + + f32 var_f29; + + if (sp20) { + var_f29 = 1.0f; + sp2C = 1.0f; + } else { + var_f29 = daAlinkHIO_move_c0::m.mWalkAnmSpeed; + sp2C = daAlinkHIO_move_c0::m.mRunAnmSpeed; + } + + if (field_0x2fb3 != 0) { + field_0x2fb3--; + } + + fopAc_ac_c* sp1C = mAttention->LockonTarget(0); + + daAlink_ANM var_r29; + if (checkDkCaught2Anime()) { + var_r29 = ANM_HORSE_WAIT_D_B; + } else if ((!sp24 && ((sp1C != NULL && (checkEnemyGroup(sp1C) || checkGoatCatchActor(sp1C))) || field_0x311c != 0)) || checkEndResetFlg0(ERFLG0_BOSS_ROOM_WAIT) || checkBootsOrArmorHeavy()) { + var_r29 = ANM_WAIT_B; + field_0x2fb3 = 0x2D; + } else if (!sp24 && (field_0x2fb3 != 0 || checkNoResetFlg3(FLG3_UNK_2000) || field_0x35c4.absXZ() > 1.0f || (checkUnderMove0BckNoArc(ANM_WAIT_B) && !sp34->checkPass(0.0f)))) { + var_r29 = ANM_WAIT_B; + } else { + if (checkRestHPAnime() && !checkUpperGuardAnime()) { + var_r29 = ANM_WAIT_TIRED; + } else { + var_r29 = ANM_WAIT; + } + field_0x2fb3 = 0; + } + + daAlink_ANM var_r28 = ANM_WALK; + daAlink_ANM sp18; + if (mDemo.getDemoMode() == 0x26) { + sp18 = ANM_RUN_B; + } else { + sp18 = ANM_RUN; + } + + f32 var_f27 = 15.0f; + f32 var_f26 = 3.0f; + + if (sp20) { + if (checkBootsMoveAnime(0)) { + var_r28 = ANM_WALK_HEAVY; + sp28 = daAlinkHIO_magneBoots_c0::m.mFeetPositionRatio; + var_f31 *= 1.0f / (mHeavySpeedMultiplier * mHeavySpeedMultiplier); + + f32 sp14; + if (checkHeavyStateOn(1, 0) && mSinkShapeOffset < -30.0f) { + sp14 = 0.5f * daAlinkHIO_magneBoots_c0::m.mWalkAnmSpeedMax; + } else { + sp14 = daAlinkHIO_magneBoots_c0::m.mWalkAnmSpeedMax; + } + + var_f29 = daAlinkHIO_magneBoots_c0::m.mWalkAnmSpeedMin + (var_f31 * (sp14 - daAlinkHIO_magneBoots_c0::m.mWalkAnmSpeedMin)); + var_f27 = 0.0f; + var_f26 = 23.0f; + } else { + var_r29 = ANM_IRONBALL_WAIT; + var_r28 = ANM_IRONBALL_WALK; + sp28 = daAlinkHIO_ironBall_c0::m.mFeetPosRatio; + var_f31 = var_f31 * (1.0f / (mHeavySpeedMultiplier * mHeavySpeedMultiplier)); + var_f29 = daAlinkHIO_ironBall_c0::m.mWalkAnmSpeedMin + (var_f31 * (daAlinkHIO_ironBall_c0::m.mWalkAnmSpeedMax - daAlinkHIO_ironBall_c0::m.mWalkAnmSpeedMin)); + var_f27 = 18.0f; + var_f26 = 3.0f; + } + + var_f31 = var_f31 * daAlinkHIO_move_c0::m.mWalkChangeRate; + if (var_f31 >= daAlinkHIO_move_c0::m.mWalkChangeRate) { + var_f31 = daAlinkHIO_move_c0::m.mWalkChangeRate - 0.001f; + } + } else if (checkSlope()) { + var_r28 = ANM_WALK_SLOPE; + sp18 = ANM_WALK_SLOPE; + var_f29 = daAlinkHIO_slide_c0::m.mClimbAnmMinSpeed + (var_f31 * (daAlinkHIO_slide_c0::m.mMaxClimbAnmSpeed - daAlinkHIO_slide_c0::m.mClimbAnmMinSpeed)); + sp2C = var_f29; + } + + int sp10; + f32 var_f28; + f32 var_f30; + + if (var_f31 < daAlinkHIO_move_c0::m.mWalkChangeRate) { + var_f28 = var_f31 / daAlinkHIO_move_c0::m.mWalkChangeRate; + + if (checkModeFlg(1) || checkZeroSpeedF()) { + mSpeedModifier = 0.0f; + + if (checkUpperGuardAnime() || (mEquipItem == 0x102 && checkAttentionLock()) || checkFmChainGrabAnime() || checkSmallUpperGuardAnime() || checkCopyRodThrowAnime() || checkBoomerangThrowAnime()) { + if ((!checkBoomerangThrowAnime() && !checkCopyRodThrowAnime() && (mEquipItem != 0x102 || !checkAttentionLock())) && (field_0x2f98 == 2 || checkAtnLeftAnime())) { + var_r29 = ANM_ATN_WAIT_LEFT; + if (mTargetedActor != NULL) { + var_r28 = ANM_ATN_LOCK_WALK_LEFT; + } else { + var_r28 = ANM_ATN_WALK_LEFT; + } + } else { + var_r29 = ANM_ATN_WAIT_RIGHT; + if (mTargetedActor != NULL) { + var_r28 = ANM_ATN_LOCK_WALK_RIGHT; + } else { + var_r28 = ANM_ATN_WALK_LEFT; + } + } + + if (mTargetedActor != NULL) { + var_f30 = daAlinkHIO_atnMove_c0::m.mWaitAnmSpeed; + var_f29 = daAlinkHIO_atnMove_c0::m.mWalkAnmSpeed; + } else { + var_f30 = daAlinkHIO_noActAtnMove_c0::m.mWaitAnmSpeed; + var_f29 = daAlinkHIO_noActAtnMove_c0::m.mWalkAnmSpeed; + } + + if (var_r29 == ANM_IRONBALL_WAIT) { + var_f30 = daAlinkHIO_ironBall_c0::m.mWaitAnmSpeed; + } + + setDoubleAnime(0.0f, var_f30, var_f29, var_r29, var_r28, 2, param_0); + return; + } + + sp10 = 2; + s16 sp8 = (shape_angle.y - field_0x2fe6); + + if (abs(sp8) > 100 && field_0x33a8 < 0.3f && checkInputOnR() && field_0x33a4 > 0.05f && field_0x33a4 < 0.3f && !checkAttentionLock()) { + if (var_r29 == ANM_WAIT_TIRED) { + if (sp8 > 0) { + var_r28 = ANM_STEP_TURN_TIRED; + } else { + var_r28 = ANM_SMALL_GUARD_TIRED; + } + + var_f30 = 1.0f; + } else { + if (var_r29 == ANM_IRONBALL_WAIT) { + var_r29 = ANM_WAIT; + } + + if (sp8 > 0) { + var_r28 = ANM_STEP_TURN; + } else { + var_r28 = ANM_SMALL_GUARD; + } + + var_f30 = daAlinkHIO_move_c0::m.mWaitAnmSpeed; + } + + if (sp8 > 0) { + var_f27 = 8.0f; + var_f26 = 19.0f; + } else { + var_f26 = 8.0f; + var_f27 = 19.0f; + } + + var_f29 = daAlinkHIO_basic_c0::m.mWaitTurnSpeed; + var_f28 = 0.85f + (0.001f * abs(sp8)); + if (var_f28 > 1.0f) { + var_f28 = 1.0f; + } + sp10 = 1; + } else if (checkWindSpeedMoveXZ() && !sp24 && (var_r29 == ANM_WAIT || var_r29 == ANM_WAIT_TIRED || var_r29 == ANM_WAIT_B)) { + var_r29 = ANM_WAIT_WIND; + var_f30 = 1.0f; + } else if (!sp24 && (checkEndResetFlg1(ERFLG1_UNK_40000) || (!checkSnowCode() && mSinkShapeOffset < -30.0f))) { + var_r29 = ANM_WAIT_INSECT; + voiceStartLevel(Z2SE_AL_V_INSECT_LOOP); + var_f30 = 1.0f; + } else { + var_f30 = daAlinkHIO_move_c0::m.mWaitAnmSpeed; + if (var_r29 == ANM_WAIT_TIRED) { + if (checkUnderMove1BckNoArc(ANM_STEP_TURN)) { + var_r28 = ANM_STEP_TURN_TIRED; + param_0 = 3.0f; + } else if (checkUnderMove1BckNoArc(ANM_SMALL_GUARD)) { + var_r28 = ANM_SMALL_GUARD_TIRED; + param_0 = 3.0f; + } + } + } + } else { + f32 spC; + if (var_r29 == ANM_WAIT_TIRED) { + spC = daAlinkHIO_move_c0::m.mMinTiredWalkRate; + } else { + spC = daAlinkHIO_move_c0::m.mMinWalkRate; + } + + var_f28 = spC + (var_f28 * (1.0f - spC)); + mSpeedModifier = 1.0f - ((1.0f - sp28) * var_f28); + sp10 = 1; + var_f30 = daAlinkHIO_move_c0::m.mWaitAnmSpeed; + } + + if (var_r29 == ANM_IRONBALL_WAIT) { + var_f30 = daAlinkHIO_ironBall_c0::m.mWaitAnmSpeed; + } else if (var_r29 == ANM_HORSE_WAIT_D_B || var_r29 == ANM_WAIT_TIRED) { + var_f30 = 1.0f; + } + + setDoubleAnime(var_f28, var_f30, var_f29,var_r29, var_r28, sp10, param_0); + + if (var_r28 == ANM_WALK_HEAVY && ((field_0x2f8c == 2 && checkWindSpeedOnXZ()) || checkWindSpeedOnAngle())) { + onEndResetFlg0(ERFLG0_UNK_2000); + + if (checkNoSetUpperAnime()) { + setUpperAnimeBase(0xCE); + field_0x2f96 = 1; + field_0x2f97 = 6; + } + } + } else if (var_f31 < daAlinkHIO_move_c0::m.mRunChangeRate) { + var_f28 = (var_f31 - daAlinkHIO_move_c0::m.mWalkChangeRate) / (daAlinkHIO_move_c0::m.mRunChangeRate - daAlinkHIO_move_c0::m.mWalkChangeRate); + setDoubleAnime(var_f28, var_f29, sp2C, var_r28, sp18, 1, param_0); + + mSpeedModifier = sp28 * (1.0f - var_f28); + if (checkNoResetFlg0(FLG0_UNDERWATER) && var_f28 > 0.5f) { + if (sp30->checkPass(var_f27)) { + field_0x2f9d = 0x20; + } else if (sp30->checkPass(var_f26)) { + field_0x2f9d = 0x40; + } + } + } else { + setDoubleAnime(1.0f, sp2C, sp2C, sp18, sp18, 1, param_0); + mSpeedModifier = 0.0f; + + if (sp30->checkPass(var_f27)) { + field_0x2f9d = 0x20; + } else if (sp30->checkPass(var_f26)) { + field_0x2f9d = 0x40; + } + + if (checkWindSpeedOnAngle()) { + onEndResetFlg0(ERFLG0_UNK_2000); + + if (checkNoSetUpperAnime()) { + setUpperAnimeBase(0xCE); + field_0x2f96 = 1; + field_0x2f97 = 6; + } + } + } + + if (field_0x2f8c != 2) { + if (sp30->checkPass(var_f27)) { + onResetFlg1(RFLG1_UNK_10); + + if (checkBootsOrArmorHeavy()) { + dComIfGp_getVibration().StartShock(1, 0xF, cXyz(0.0f, 1.0f, 0.0f)); + } + } else if (sp30->checkPass(var_f26)) { + onResetFlg1(RFLG1_UNK_20); + + if (checkBootsOrArmorHeavy()) { + dComIfGp_getVibration().StartShock(1, 0xF,cXyz(0.0f, 1.0f, 0.0f)); + } + } + } + + if (var_f31 < 0.69999999f) { + setHandIndex(var_r29); + } else { + setHandIndex(sp18); + } } /* 800AEA70-800AF11C 0A93B0 06AC+00 17/17 0/0 0/0 .text setBlendAtnMoveAnime__9daAlink_cFf */ void daAlink_c::setBlendAtnMoveAnime(f32 param_0) { - // NONMATCHING + s16 spA = (current.angle.y - shape_angle.y); + f32 sp44 = cM_ssin(spA); + f32 sp40 = cM_scos(spA); + u8 sp8 = field_0x2f98; + BOOL sp3C = 0; + + if (mDemo.getDemoMode() == 0x17) { + if (mDemo.getParam1() & 1) { + field_0x2f98 = 2; + } else { + field_0x2f98 = 3; + } + + if (!checkWolf() && !checkEquipAnime() && mEquipItem != 0x103 && (mDemo.getParam1() == 2 || mDemo.getParam1() == 3)) { + swordEquip(0); + } + } else if (checkInputOnR()) { + if (mTargetedActor == NULL && !checkGoatStopGame() && (sp40 <= -0.99f || sp40 >= 0.99f)) { + if (sp40 <= -0.99f) { + field_0x2f98 = 1; + } else { + field_0x2f98 = 0; + sp3C = 1; + } + } else { + if (checkFmChainGrabAnime()) { + field_0x594 = 13.0f; + } else if (mTargetedActor != 0) { + field_0x594 = daAlinkHIO_atnMove_c0::m.mMaxSpeed; + } else { + field_0x594 = daAlinkHIO_noActAtnMove_c0::m.mMaxSpeed; + } + + if (mTargetedActor != NULL && sp40 >= 0.866f) { + field_0x2f98 = 0; + } else if (sp40 < -0.866f) { + field_0x2f98 = 1; + } else if (sp44 > 0.0f) { + field_0x2f98 = 2; + } else if (sp44 < 0.0f) { + field_0x2f98 = 3; + } + } + } else if (checkModeFlg(1) && (checkGrabAnimeUp() || checkGrabAnimeSide() || field_0x2f98 == 0 || field_0x2f98 == 1)) { + field_0x2f98 = 3; + } + + daAlink_ANM var_r28; + daAlink_ANM var_r29; + + if (checkSetChainPullAnime(shape_angle.y)) { + daAlink_ANM var_r27; + if (checkEndResetFlg1(ERFLG1_UNK_2000000)) { + var_r27 = ANM_CHAIN_PULL_END; + } else { + var_r27 = ANM_CHAIN_PULL; + } + + if (!checkUnderMove0BckNoArc(var_r27)) { + f32 sp38; + if (checkChainBlockPushPull()) { + sp38 = 0.7f; + } else { + sp38 = 1.0f; + } + + setSingleAnimeBaseSpeed(var_r27, sp38, 3.0f); + } + + mSpeedModifier = 0.0f; + return; + } + + if (field_0x2f98 == 1) { + setBlendAtnBackMoveAnime(param_0); + return; + } + + if (sp3C) { + field_0x594 = daAlinkHIO_move_c0::m.mMaxSpeed; + setBlendMoveAnime(param_0); + return; + } + + f32 sp34 = getMoveGroundAngleSpeedRate(); + + f32 var_f31; + f32 sp30; + f32 sp2C; + f32 sp28; + f32 sp24; + f32 sp20; + f32 var_f30; + + if (mTargetedActor != NULL) { + sp30 = daAlinkHIO_atnMove_c0::m.mMinWalkFrame; + sp2C = daAlinkHIO_atnMove_c0::m.mWalkChangeRate; + sp28 = daAlinkHIO_atnMove_c0::m.mRunChangeRate; + sp24 = daAlinkHIO_atnMove_c0::m.mWaitAnmSpeed; + sp20 = daAlinkHIO_atnMove_c0::m.mWalkAnmSpeed; + var_f30 = daAlinkHIO_atnMove_c0::m.mRunAnmSpeed; + } else { + sp30 = daAlinkHIO_noActAtnMove_c0::m.mMinWalkFrame; + sp2C = daAlinkHIO_noActAtnMove_c0::m.mWalkChangeRate; + sp28 = daAlinkHIO_noActAtnMove_c0::m.mRunChangeRate; + sp24 = daAlinkHIO_noActAtnMove_c0::m.mWaitAnmSpeed; + sp20 = daAlinkHIO_noActAtnMove_c0::m.mWalkAnmSpeed; + var_f30 = daAlinkHIO_noActAtnMove_c0::m.mRunAnmSpeed; + } + + if (sp34 < sp2C) { + var_f31 = sp34 / sp2C; + + if (field_0x2f98 == 0) { + var_r28 = ANM_ATN_WAIT_RIGHT; + var_r29 = ANM_ATN_RETURN_FROM_WALK; + sp20 = daAlinkHIO_atnMove_c0::m.mWalkForwardAnmSpeed; + } else if (field_0x2f98 == 2) { + var_r28 = ANM_ATN_WAIT_LEFT; + if (mTargetedActor != NULL) { + var_r29 = ANM_ATN_LOCK_WALK_LEFT; + } else { + var_r29 = ANM_ATN_WALK_LEFT; + } + } else { + var_r28 = ANM_ATN_WAIT_RIGHT; + if (mTargetedActor != NULL) { + var_r29 = ANM_ATN_LOCK_WALK_RIGHT; + } else { + var_r29 = ANM_ATN_WALK_RIGHT; + } + } + + int sp1C; + if (checkModeFlg(1) || checkZeroSpeedF()) { + sp1C = 2; + mSpeedModifier = 0.0f; + } else { + var_f31 = sp30 + (var_f31 * (1.0f - sp30)); + sp1C = 3; + mSpeedModifier = 1.0f; + } + + setDoubleAnime(var_f31, sp24, sp20, var_r28, var_r29, sp1C, param_0); + } else if (sp34 < sp28) { + var_f31 = (sp34 - sp2C) / (sp28 - sp2C); + + if (field_0x2f98 == 0) { + var_r28 = ANM_ATN_RETURN_FROM_WALK; + var_r29 = ANM_ATN_RETURN_FROM_RUN; + sp20 = daAlinkHIO_atnMove_c0::m.mWalkForwardAnmSpeed; + var_f30 = daAlinkHIO_atnMove_c0::m.mRunForwardAnmSpeed; + } else if (field_0x2f98 == 2) { + if (mTargetedActor != NULL) { + var_r28 = ANM_ATN_LOCK_WALK_LEFT; + var_r29 = ANM_ATN_LOCK_RUN_LEFT; + } else { + var_r28 = ANM_ATN_WALK_LEFT; + var_r29 = ANM_ATN_RUN_LEFT; + } + } else if (mTargetedActor != NULL) { + var_r28 = ANM_ATN_LOCK_WALK_RIGHT; + var_r29 = ANM_ATN_LOCK_RUN_RIGHT; + } else { + var_r28 = ANM_ATN_WALK_RIGHT; + var_r29 = ANM_ATN_RUN_RIGHT; + } + + setDoubleAnime(var_f31, sp20, var_f30, var_r28, var_r29, 3, param_0); + mSpeedModifier = 1.0f - var_f31; + } else { + if (field_0x2f98 == 0) { + var_r29 = ANM_ATN_RETURN_FROM_RUN; + var_f30 = daAlinkHIO_atnMove_c0::m.mRunForwardAnmSpeed; + } else if (field_0x2f98 == 2) { + if (mTargetedActor != NULL) { + var_r29 = ANM_ATN_LOCK_RUN_LEFT; + } else { + var_r29 = ANM_ATN_RUN_LEFT; + } + } else if (mTargetedActor != NULL) { + var_r29 = ANM_ATN_LOCK_RUN_RIGHT; + } else { + var_r29 = ANM_ATN_RUN_RIGHT; + } + + setDoubleAnime(1.0f, var_f30, var_f30, var_r29, var_r29, 3, param_0); + mSpeedModifier = 0.0f; + } + + if (field_0x2f8c != 2) { + daPy_frameCtrl_c* sp18 = &mUnderFrameCtrl[0]; + + f32 sp14; + f32 sp10; + f32 spC; + if (field_0x2f98 == 0) { + sp10 = 0.0f; + sp14 = 11.0f; + } else { + if (mTargetedActor != NULL) { + sp10 = 6.0f; + sp14 = 11.0f; + } else { + sp10 = 9.0f; + sp14 = 1.0f; + } + + if (field_0x2f98 != 2) { + spC = sp14; + sp14 = sp10; + sp10 = spC; + } + } + + if (sp18->checkPass(sp14)) { + onResetFlg1(RFLG1_UNK_10); + } else if (sp18->checkPass(sp10)) { + onResetFlg1(RFLG1_UNK_20); + } + + if (checkBootsOrArmorHeavy() && sp34 > 0.1f && checkResetFlg1(RFLG1_UNK_30)) { + dComIfGp_getVibration().StartShock(1, 0xF, cXyz(0.0f, 1.0f, 0.0f)); + } + } } /* 800AF11C-800AF4B0 0A9A5C 0394+00 1/1 0/0 0/0 .text setBlendAtnBackMoveAnime__9daAlink_cFf */ void daAlink_c::setBlendAtnBackMoveAnime(f32 param_0) { - // NONMATCHING + f32 var_f27; + f32 var_f31; + f32 var_f26; + f32 var_f24; + f32 var_f25; + f32 var_f29; + daAlink_ANM var_r26; + daAlink_ANM var_r27; + daAlink_ANM var_r29; + + if (checkBootsMoveAnime(1)) { + field_0x594 = daAlinkHIO_atnMove_c0::m.mMaxBackwardsSpeed; + var_f27 = daAlinkHIO_atnMove_c0::m.mMinBackWalkFrame; + var_f31 = daAlinkHIO_atnMove_c0::m.mBackWalkChangeRate; + var_f26 = daAlinkHIO_atnMove_c0::m.mBackRunChangeRate; + var_f24 = daAlinkHIO_atnMove_c0::m.mWaitAnmSpeed; + var_f25 = 1.0f; + var_f29 = 1.0f; + var_r26 = ANM_ATN_WAIT_RIGHT; + var_r27 = ANM_ATN_BACK_WALK_HEAVY; + var_r29 = ANM_ATN_BACK_WALK_HEAVY; + } else if (mTargetedActor != NULL) { + field_0x594 = daAlinkHIO_atnMove_c0::m.mMaxBackwardsSpeed; + var_f27 = daAlinkHIO_atnMove_c0::m.mMinBackWalkFrame; + var_f31 = daAlinkHIO_atnMove_c0::m.mBackWalkChangeRate; + var_f26 = daAlinkHIO_atnMove_c0::m.mBackRunChangeRate; + var_f24 = daAlinkHIO_atnMove_c0::m.mWaitAnmSpeed; + var_f25 = daAlinkHIO_atnMove_c0::m.mBackWalkAnmSpeed; + var_f29 = daAlinkHIO_atnMove_c0::m.mBackRunAnmSpeed; + var_r26 = ANM_ATN_WAIT_RIGHT; + var_r27 = ANM_ATN_LOCK_BACK_WALK; + var_r29 = ANM_ATN_LOCK_BACK_RUN; + } else { + field_0x594 = daAlinkHIO_noActAtnMove_c0::m.mMaxBackwardsSpeed; + var_f27 = daAlinkHIO_noActAtnMove_c0::m.mMinBackWalkFrame; + var_f31 = daAlinkHIO_noActAtnMove_c0::m.mBackWalkChangeRate; + var_f26 = daAlinkHIO_noActAtnMove_c0::m.mBackRunChangeRate; + var_f24 = daAlinkHIO_move_c0::m.mWaitAnmSpeed; + var_f25 = daAlinkHIO_noActAtnMove_c0::m.mBackWalkAnmSpeed; + var_f29 = daAlinkHIO_noActAtnMove_c0::m.mBackRunAnmSpeed; + var_r26 = ANM_WAIT; + var_r27 = ANM_ATN_BACK_WALK; + var_r29 = ANM_ATN_BACK_RUN; + } + + f32 var_f30; + + f32 temp_f1 = getMoveGroundAngleSpeedRate(); + if (temp_f1 < var_f31) { + var_f30 = temp_f1 / var_f31; + + int var_r25; + if (checkModeFlg(1) || checkZeroSpeedF()) { + var_r25 = 2; + mSpeedModifier = 0.0f; + } else { + var_r25 = 3; + mSpeedModifier = 1.0f; + var_f30 = var_f27 + (var_f30 * (1.0f - var_f27)); + } + + setDoubleAnime(var_f30, var_f24, var_f25, var_r26, var_r27, var_r25, param_0); + } else if (temp_f1 < var_f26) { + var_f30 = (temp_f1 - var_f31) / (var_f26 - var_f31); + setDoubleAnime(var_f30, var_f25, var_f29, var_r27, var_r29, 3, param_0); + mSpeedModifier = 1.0f - var_f30; + } else { + setDoubleAnime(1.0f, var_f29, var_f29, var_r29, var_r29, 3, param_0); + mSpeedModifier = 0.0f; + } + + if (field_0x2f8c != 2) { + daPy_frameCtrl_c* temp_r28 = &mUnderFrameCtrl[0]; + + if (var_r29 == ANM_ATN_LOCK_BACK_RUN) { + if (temp_r28->checkPass(11.0f)) { + onResetFlg1(RFLG1_UNK_10); + } else if (temp_r28->checkPass(8.0f)) { + onResetFlg1(RFLG1_UNK_20); + } + } else if (temp_r28->checkPass(0.0f)) { + onResetFlg1(RFLG1_UNK_10); + } else if (temp_r28->checkPass(0.5f * temp_r28->getEnd())) { + onResetFlg1(RFLG1_UNK_20); + } + } + + if (checkBootsOrArmorHeavy() && temp_f1 > 0.1f && checkResetFlg1(RFLG1_UNK_30)) { + dComIfGp_getVibration().StartShock(1, 0xF, cXyz(0.0f, 1.0f, 0.0f)); + } } /* 800AF4B0-800AF61C 0A9DF0 016C+00 29/29 0/0 0/0 .text setFaceBck__9daAlink_cFUsiUs */ void daAlink_c::setFaceBck(u16 param_0, int param_1, u16 param_2) { - // NONMATCHING + if (!checkNoResetFlg0(FLG0_SWIM_UP) && mProcID != PROC_GET_ITEM) { + param_0 = 0x157; + } else if (param_0 == 0) { + fopAc_ac_c* temp_r28 = mAttention->LockonTarget(0); + if (checkAttentionState() || (checkHorseRide() && checkEnemyGroup(temp_r28)) || checkEndResetFlg0(ERFLG0_UNK_400)) { + param_0 = 0xE8; + } else { + param_0 = 0xDF; + } + } else { + setIdxMask(¶m_2, ¶m_0); + } + + J3DAnmTransform* var_r29; + if (param_2 != 0xFFFF) { + var_r29 = (J3DAnmTransform*)mFaceBckHeap.loadDataDemoRID(param_0, param_2); + } else if (param_1 != 0) { + var_r29 = (J3DAnmTransform*)mFaceBckHeap.loadDataPriIdx(param_0); + } else { + var_r29 = (J3DAnmTransform*)mFaceBckHeap.loadDataIdx(param_0); + } + + if (var_r29 != NULL) { + field_0x2164.init(var_r29, 0, var_r29->getAttribute(), 1.0f, 0, -1, 1); + var_r29->setFrame(0.0f); + } } /* 800AF61C-800AF7D0 0A9F5C 01B4+00 7/7 0/0 0/0 .text setFaceBtp__9daAlink_cFUsiUs */ void daAlink_c::setFaceBtp(u16 param_0, int param_1, u16 param_2) { - // NONMATCHING + setIdxMask(¶m_2, ¶m_0); + + J3DAnmTexPattern* var_r30; + if (param_2 != 0xFFFF) { + var_r30 = (J3DAnmTexPattern*)mFaceBtpHeap.loadDataDemoRID(param_0, param_2); + } else if (param_1 != 0) { + var_r30 = (J3DAnmTexPattern*)mFaceBtpHeap.loadDataPriIdx(param_0); + } else { + var_r30 = (J3DAnmTexPattern*)mFaceBtpHeap.loadDataIdx(param_0); + } + + if (var_r30 != NULL) { + field_0x2154 = var_r30; + field_0x2154->searchUpdateMaterialID(field_0x06c0); + field_0x06c0->entryTexNoAnimator(field_0x2154); + + if (param_2 == 0xFFFF) { + if (param_0 == 0x3E1 || (param_0 == 0x417 && checkUnderMove0BckNoArcWolf(WANM_WAIT_WIND))) { + field_0x3440 = 0.02f; + onNoResetFlg1(FLG1_UNK_2000); + } else if (param_0 == 0x417 || param_0 == 0x418 || param_0 == 0x3E2 || param_0 == 0x3DF || param_0 == 0x3E0) { + onNoResetFlg1(FLG1_UNK_2000); + field_0x3440 = 0.012f; + } else { + offNoResetFlg1(FLG1_UNK_2000); + } + } else { + offNoResetFlg1(FLG1_UNK_2000); + } + + field_0x2fea = 0; + field_0x2154->setFrame(0.0f); + } else if (param_2 == 0xFFFF && param_0 == 0x417) { + if (checkUnderMove0BckNoArcWolf(WANM_WAIT_WIND)) { + field_0x3440 = 0.02f; + } else { + field_0x3440 = 0.012f; + } + } } /* 800AF7D0-800AF8A0 0AA110 00D0+00 6/6 0/0 0/0 .text setFaceBtk__9daAlink_cFUsiUs */ -// NONMATCHING - swapped instructions void daAlink_c::setFaceBtk(u16 i_resID, int param_1, u16 i_arcNo) { - int var_r4; - u16 arc_no; - u16 res_id; - - res_id = i_resID; - var_r4 = param_1; - arc_no = i_arcNo; - - setIdxMask(&arc_no, &res_id); + setIdxMask(&i_arcNo, &i_resID); J3DAnmTextureSRTKey* btk; - if (arc_no != 0xFFFF) { - btk = (J3DAnmTextureSRTKey*)mFaceBtkHeap.loadDataDemoRID(res_id, arc_no); + if (i_arcNo != 0xFFFF) { + btk = (J3DAnmTextureSRTKey*)mFaceBtkHeap.loadDataDemoRID(i_resID, i_arcNo); offNoResetFlg1(FLG1_UNK_2000); - } else if (var_r4 != 0) { - btk = (J3DAnmTextureSRTKey*)mFaceBtkHeap.loadDataPriIdx(res_id); + } else if (param_1 != 0) { + btk = (J3DAnmTextureSRTKey*)mFaceBtkHeap.loadDataPriIdx(i_resID); } else { - btk = (J3DAnmTextureSRTKey*)mFaceBtkHeap.loadDataIdx(res_id); + btk = (J3DAnmTextureSRTKey*)mFaceBtkHeap.loadDataIdx(i_resID); } if (btk != NULL) { @@ -6057,14 +9529,49 @@ void daAlink_c::setFaceBtk(u16 i_resID, int param_1, u16 i_arcNo) { /* 800AF8A0-800AF9A8 0AA1E0 0108+00 31/31 0/0 0/0 .text * setFaceBasicTexture__9daAlink_cFQ29daAlink_c13daAlink_FTANM */ -void daAlink_c::setFaceBasicTexture(daAlink_c::daAlink_FTANM param_0) { - // NONMATCHING +daAlink_c::daAlink_FTANM daAlink_c::setFaceBasicTexture(daAlink_c::daAlink_FTANM param_0) { + if (checkWindSpeedOnAngleAnime(0)) { + if (param_0 == FTANM_UNK_0) { + param_0 = FTANM_UNK_39; + } else if (param_0 == FTANM_UNK_8B) { + param_0 = FTANM_UNK_98; + } + } else if ((!checkPlayerDemoMode() && dComIfGs_getLife() <= 4) || mDemo.getDemoMode() == 0x12) { + if (param_0 == FTANM_UNK_0) { + param_0 = FTANM_UNK_1; + } else if (param_0 == FTANM_UNK_8B) { + param_0 = FTANM_UNK_8C; + } + } + + if (checkWolf() && param_0 == FTANM_UNK_0) { + param_0 = FTANM_UNK_8B; + } + + setFaceBasicBtp(getFaceTexData(param_0)->m_btpID); + setFaceBasicBtk(getFaceTexData(param_0)->m_btkID); + return param_0; } /* 800AF9A8-800AFAA8 0AA2E8 0100+00 5/5 0/0 0/0 .text * setFaceBasicAnime__9daAlink_cFQ29daAlink_c11daAlink_ANM */ void daAlink_c::setFaceBasicAnime(daAlink_c::daAlink_ANM param_0) { - // NONMATCHING + const daAlink_AnmData* temp_r3 = getAnmData(param_0); + + daAlink_FTANM temp_r3_2 = setFaceBasicTexture((daAlink_c::daAlink_FTANM)temp_r3->m_faceTexID); + if ((temp_r3_2 != temp_r3->m_faceTexID) && !checkWolf()) { + if (temp_r3_2 == FTANM_UNK_39) { + setFaceBasicBck(0x126); + } else if (temp_r3_2 == FTANM_UNK_1) { + setFaceBasicBck(0x120); + } else if (temp_r3_2 == FTANM_UNK_5) { + setFaceBasicBck(0x137); + } else { + setFaceBasicBck(temp_r3->m_faceBckID); + } + } else { + setFaceBasicBck(temp_r3->m_faceBckID); + } } /* 800AFAA8-800AFB14 0AA3E8 006C+00 16/16 0/0 0/0 .text @@ -6144,7 +9651,100 @@ void daAlink_c::resetFacePriAnime() { /* 800AFCF0-800B0098 0AA630 03A8+00 2/2 0/0 0/0 .text playFaceTextureAnime__9daAlink_cFv */ void daAlink_c::playFaceTextureAnime() { - // NONMATCHING + if (checkNoResetFlg1(FLG1_UNK_200) && !mFaceBtpHeap.checkNoSetPriIdx()) { + simpleAnmPlay(field_0x2154); + simpleAnmPlay(mpFaceBtk); + } else { + u16 var_r29; + if (!mFaceBtpHeap.checkNoSetPriIdx()) { + var_r29 = mUpperFrameCtrl[2].getFrame(); + } else if (checkUnderMove0BckNoArc(ANM_HAWK_WAIT)) { + var_r29 = mpFaceBtk->getFrameMax(); + } else if (!checkNoResetFlg1(FLG1_UNK_2000)) { + if (getNowAnmPackUnder(UNDER_0) != getNowAnmPackUpper(UPPER_0)) { + var_r29 = mUpperFrameCtrl[0].getFrame(); + } else { + var_r29 = mUnderFrameCtrl[0].getFrame(); + } + } else { + int var_r24 = field_0x2154->getFrameMax() > mpFaceBtk->getFrameMax() ? field_0x2154->getFrameMax() : mpFaceBtk->getFrameMax(); + + if (field_0x2fea != 0) { + field_0x2fea++; + if (field_0x2fea > var_r24) { + field_0x2fea = 0; + } + } else if (cM_rnd() < field_0x3440) { + field_0x2fea++; + } + + var_r29 = field_0x2fea; + } + + u16 var_r26 = var_r29; + + if (var_r29 > field_0x2154->getFrameMax()) { + var_r29 = field_0x2154->getFrameMax(); + } + + if (var_r26 > mpFaceBtk->getFrameMax()) { + var_r26 = mpFaceBtk->getFrameMax(); + } + + field_0x2154->setFrame(var_r29); + mpFaceBtk->setFrame(var_r26); + } + + if (!checkWolf()) { + J3DAnmTransform* temp_r28 = field_0x2164.getBckAnm(); + + if (checkNoResetFlg1(FLG1_UNK_200)) { + if (!mFaceBckHeap.checkNoSetPriIdx()) { + simpleAnmPlay(temp_r28); + return; + } + } + + f32 var_f31; + if (checkUnderMove0BckNoArc(ANM_HAWK_WAIT)) { + var_f31 = temp_r28->getFrameMax(); + } else if (mFaceBckHeap.checkNoSetPriIdx()) { + u16 temp_r27 = mFaceBckHeap.getIdx(); + + if (mFaceBckHeap.checkNoSetArcNo()) { + if (temp_r27 == 0xE8) { + var_f31 = 1.0f; + } else if (temp_r27 == 0x157 || temp_r27 == 0x120 || (checkModeFlg(0x400) && temp_r27 == 0x160)) { + var_f31 = 1.0f + temp_r28->getFrame(); + if (var_f31 >= temp_r28->getFrameMax()) { + var_f31 -= temp_r28->getFrameMax(); + } + } else { + if (getNowAnmPackUnder(UNDER_0) != getNowAnmPackUpper(UPPER_0)) { + var_f31 = mUpperFrameCtrl[0].getFrame(); + } else { + var_f31 = mUnderFrameCtrl[0].getFrame(); + } + } + } else { + if (getNowAnmPackUnder(UNDER_0) != getNowAnmPackUpper(UPPER_0)) { + var_f31 = mUpperFrameCtrl[0].getFrame(); + } else { + var_f31 = mUnderFrameCtrl[0].getFrame(); + } + } + } else { + var_f31 = mUpperFrameCtrl[2].getFrame(); + } + + if (var_f31 > temp_r28->getFrameMax()) { + var_f31 = temp_r28->getFrameMax(); + } + + if (mClothesChangeWaitTimer == 0 && !checkZoraWearMaskDraw()) { + field_0x2164.entry(mpLinkFaceModel->getModelData(), var_f31); + } + } } /* 800B0098-800B0150 0AA9D8 00B8+00 14/14 0/0 0/0 .text @@ -6174,18 +9774,433 @@ s16 daAlink_c::getRoofAngle(cBgS_PolyInfo* param_0, s16 param_1) { return fopAcM_getPolygonAngle(&plane, param_1) + 0x8000; } - /* 800B01FC-800B02BC 0AAB3C 00C0+00 2/2 0/0 0/0 .text * getWallEdgePos__9daAlink_cFRC4cXyzP8cM3dGPlaP8cM3dGPlaP4cXyzi */ BOOL daAlink_c::getWallEdgePos(cXyz const& param_0, cM3dGPla* param_1, cM3dGPla* param_2, cXyz* param_3, int param_4) { - // NONMATCHING - return 0; + cXyz sp20(param_1->mNormal.z, 0.0f, -param_1->mNormal.x); + sp20.normalizeZP(); + + cM3dGPla sp2C(&sp20, -((sp20.z * param_0.z) + ((sp20.x * param_0.x) + (sp20.y * param_0.y)))); + + return cM3d_3PlaneCrossPos(*param_1, *param_2, sp2C, param_3); } /* 800B02BC-800B146C 0AABFC 11B0+00 9/9 0/0 0/0 .text setFrontWallType__9daAlink_cFv */ void daAlink_c::setFrontWallType() { - // NONMATCHING + f32 var_f31; + if (checkWolf()) { + var_f31 = 90.0f; + } else if (mProcID == PROC_HOOKSHOT_FLY) { + var_f31 = 50.0f; + } else if (checkModeFlg(0x200000)) { + var_f31 = 50.0f; + } else { + var_f31 = mAcchCir[0].GetWallR(); + } + + if (field_0x2f91 == 0) { + field_0x2f91 = 1; + if (!checkMagneBootsOn()) { + cXyz sp98; + cXyz sp8C; + f32 sp64 = cM_ssin(shape_angle.y); + f32 sp60 = cM_scos(shape_angle.y); + + int var_r27; + int i; + BOOL sp5C = 0; + BOOL sp58 = 0; + + f32 sp54; + f32 sp50; + + if (mProcID == PROC_HOOKSHOT_FLY) { + if (mProcVar2.field_0x300c == 4 && dComIfG_Bgsp().ChkPolySafe(mPolyInfo2)) { + cM3dGPla spF4; + dComIfG_Bgsp().GetTriPla(mPolyInfo2, &spF4); + + if (cBgW_CheckBWall(spF4.mNormal.y)) { + spF4.mNormal.y = 0.0f; + spF4.mNormal.normalizeZP(); + + sp64 = -spF4.mNormal.x; + sp60 = -spF4.mNormal.z; + } + } + + sp98.x = mHookshotTopPos.x - (sp64 * var_f31); + sp98.z = mHookshotTopPos.z - (sp60 * var_f31); + sp8C.x = (2.0f * mHookshotTopPos.x) - sp98.x; + sp8C.z = (2.0f * mHookshotTopPos.z) - sp98.z; + sp50 = mHookshotTopPos.y; + sp54 = 10.0f + mHookshotTopPos.y; + } else { + sp98.x = current.pos.x; + sp98.z = current.pos.z; + sp8C.x = sp98.x + (sp64 * (25.0f + var_f31)); + sp8C.z = sp98.z + (sp60 * (25.0f + var_f31)); + sp50 = current.pos.y; + sp54 = 100.0f + current.pos.y; + } + + BOOL sp4C = 0; + + + for (i = 0; i < 3; i++) { + sp98.y = sp50 + mAcchCir[i].GetWallH(); + sp8C.y = sp98.y; + + if (commonLineCheck(&sp98, &sp8C)) { + var_r27 = dComIfG_Bgsp().GetWallCode(mLinkLinChk); + + if (i == 0 && var_r27 == 3 && checkStageName("D_MN10") != 0 && fopAcM_GetRoomNo(this) == 6) { + sp4C = 1; + } else if (!checkWolf() && sp5C == 0 && ((i == 0 && mLinkAcch.i_ChkGroundHit() && !checkModeFlg(0x70C52)) || mProcID == PROC_HOOKSHOT_FLY) && var_r27 == 0) { + sp5C = 1; + sp98.y = sp54; + sp8C.y = sp98.y; + + if (commonLineCheck(&sp98, &sp8C) && checkClimbCode(mLinkLinChk)) { + sp58 = 1; + break; + } + + i = -1; + } else if (!checkWolf() || ((i != 0 && i != 1) || var_r27 != 7)) { + break; + } + } + } + + if (i == 3) { + if (sp4C == 0) { + offNoResetFlg3(FLG3_UNK_400000); + return; + } + + sp98.y = sp50 + mAcchCir[0].GetWallH(); + sp8C.y = sp98.y; + + if (!commonLineCheck(&sp98, &sp8C)) { + return; + } + } else { + sp4C = 0; + } + + cM3dGPla spE0; + dComIfG_Bgsp().GetTriPla(mLinkLinChk, &spE0); + + if ((fabsf(spE0.mNormal.y) > 0.05f)) { + return; + } + + field_0x306e = spE0.mNormal.atan2sX_Z(); + BOOL sp48 = 0; + + s16 spA; + if (mProcID == PROC_HOOKSHOT_FLY) { + spA = 0x7FFF; + } else if (mProcID == PROC_WOLF_JUMP_ATTACK || (checkWolf() && var_r27 == 3)) { + if (mProcID != PROC_WOLF_JUMP_ATTACK) { + sp48 = 1; + } + spA = 0x2000; + } else { + spA = field_0x30ae; + } + + int sp44 = cLib_distanceAngleS(field_0x306e, (shape_angle.y + 0x8000)); + if (sp44 > spA) { + return; + } + + cM3dGPla spCC; + f32 sp40; + + if (checkModeFlg(2)) { + field_0x34ec = mLinkLinChk.i_GetCross(); + } else { + sp40 = spE0.getSignedLenPos(¤t.pos); + field_0x34ec.set(current.pos.x - (sp40 * spE0.mNormal.x), current.pos.y, current.pos.z - (sp40 * spE0.mNormal.z)); + + int temp_r3 = dComIfG_Bgsp().GetWallCode(mLinkLinChk); + if (temp_r3 != 4 && temp_r3 != 5) { + sp98.x = current.pos.x; + sp98.z = current.pos.z; + sp8C.x = sp98.x - (2.0f * sp40 * spE0.mNormal.x); + sp8C.z = sp98.z - (2.0f * sp40 * spE0.mNormal.z); + + //int i; + for (i = 0; i < 3; i++) { + if (i == 0 && sp58 != 0) { + sp98.y = sp54; + } else { + sp98.y = current.pos.y + mAcchCir[i].GetWallH(); + } + + sp8C.y = sp98.y; + + if (commonLineCheck(&sp98, &sp8C)) { + dComIfG_Bgsp().GetTriPla(mLinkLinChk, &spCC); + cXyz sp80 = spE0.mNormal - spCC.mNormal; + + if (sp80.abs() < 0.001f) { + break; + } + } + } + + if (i == 3) { + offNoResetFlg3(FLG3_UNK_400000); + return; + } + } + } + + int var_r29 = dComIfG_Bgsp().GetWallCode(mLinkLinChk); + dBgW_Base* sp3C = dComIfG_Bgsp().GetBgWBasePointer(mLinkLinChk); + + if ((var_r29 == 3 || var_r29 == 1) && (sp4C != 0 || (sp3C != NULL && !sp3C->ChkPushPullOk()))) { + var_r29 = 0; + } else if (var_r29 == 1 && mSpecialMode == 0x2B) { + var_r29 = 0; + } + + if (sp48 != 0 && var_r29 != 3 && sp44 > field_0x30ae) { + return; + } + + cXyz sp74; + if (var_r29 != 1 && var_r29 != 5 && var_r29 != 4) { + offNoResetFlg3(FLG3_UNK_400000); + } + + if (!mLinkAcch.ChkWallHit() && !checkWolf() && (var_r29 != 1 || mProcID != PROC_HANG_READY) && (var_r29 != 3 || checkModeFlg(0x40000) || checkModeFlg(2) || !(sp40 <= 51.0f)) && mProcID != PROC_HOOKSHOT_FLY && !checkModeFlg(0x200000)) { + offNoResetFlg3(FLG3_UNK_400000); + return; + } + + if (var_r29 == 2) { + return; + } + + if (var_r29 == 3 && dComIfG_Bgsp().ChkMoveBG_NoDABg(mLinkLinChk)) { + field_0x27fc = dComIfG_Bgsp().GetActorPointer(mLinkLinChk); + } + + if (checkNoResetFlg0(daPy_FLG0(FLG0_UNDERWATER | FLG0_SWIM_UP))) { + if (var_r29 == 6 && !checkModeFlg(0x40002)) { + setDoStatus(7); + setLadderPosInit(); + return; + } + + if (var_r29 == 3 && !checkModeFlg(0x40000) && !checkModeFlg(2)) { + onResetFlg0(RFLG0_UNK_8); + mPolyInfo1.SetPolyInfo(mLinkLinChk); + + if (checkModeFlg(0x200000)) { + return; + } + + if (!mLinkAcch.ChkWallHit() && !checkWolf()) { + return; + } + } else if (!checkWolf()) { + if (var_r29 == 1) { + if (checkModeFlg(0x40002)) { + if (checkModeFlg(2) && mProcID != PROC_HOOKSHOT_FLY) { + setDoStatus(0x8E); + } + + f32 sp34; + if (checkModeFlg(0x40000)) { + sp34 = current.pos.y - 90.0f; + } else { + sp34 = current.pos.y; + } + + sp98.set(field_0x34ec.x - (15.0f * spE0.mNormal.x), 150.0f + sp34, field_0x34ec.z - (15.0f * spE0.mNormal.z)); + mLinkGndChk.SetPos(&sp98); + f32 sp38 = dComIfG_Bgsp().GroundCross(&mLinkGndChk); + + if (sp38 >= current.pos.y && dBgS_CheckBGroundPoly(mLinkGndChk)) { + cM3dGPla spB8; + dComIfG_Bgsp().GetTriPla(mLinkGndChk, &spB8); + + if (getWallEdgePos(field_0x34ec, &spE0, &spB8, &sp74, 0)) { + if (sp74.y - sp34 <= 150.0f) { + if (checkModeFlg(0x40000)) { + field_0x34ec = sp74; + field_0x2f91 = 7; + return; + } else if (mProcID != PROC_HOOKSHOT_FLY) { + field_0x34ec = sp74; + field_0x2f91 = 0xA; + return; + } else { + current.pos.y = sp74.y - 150.0f; + } + } + } + } + } + mPolyInfo1.SetPolyInfo(mLinkLinChk); + field_0x2f91 = 3; + return; + } + + if (var_r29 == 4 || (var_r29 == 5 && !checkModeFlg(2))) { + if (var_r29 == 4) { + field_0x2f91 = 4; + if (checkModeFlg(2)) { + setDoStatus(0x8E); + } + } else { + field_0x2f91 = 5; + } + setLadderPosInit(); + return; + } + } + } + + if (checkRoomOnly() && !checkWolf()) { + return; + } + + f32 var_f30; + f32 sp30; + f32 sp2C; + f32 sp28; + + if (checkWolf()) { + if (checkModeFlg(2)) { + var_f30 = daAlinkHIO_wlAutoJump_c0::m.field_0x78; + } else { + var_f30 = daAlinkHIO_wlWallHang_c0::m.field_0x84; + } + sp30 = daAlinkHIO_wlWallHang_c0::m.field_0x7C; + sp2C = daAlinkHIO_wlWallHang_c0::m.field_0x80; + } else { + if (checkModeFlg(2)) { + var_f30 = daAlinkHIO_autoJump_c0::m.mHangHeightLimit; + } else { + var_f30 = daAlinkHIO_wallHang_c0::m.field_0x14; + } + sp30 = daAlinkHIO_wallHang_c0::m.field_0x8; + sp2C = daAlinkHIO_wallHang_c0::m.field_0xC; + } + + sp28 = current.pos.y + mSinkShapeOffset; + sp98.set(current.pos.x, sp28 + (0.01f + var_f30), current.pos.z); + sp8C.set(sp98.x + (sp64 * (50.0f + var_f31)), sp98.y, sp98.z + (sp60 * (50.0f + var_f31))); + + BOOL sp24 = commonLineCheck(&sp98, &sp8C); + if (sp24) { + sp98 = mLinkLinChk.i_GetCross(); + dComIfG_Bgsp().GetTriPla(mLinkLinChk, &spCC); + sp98.x = (sp98.x + (25.0f * spCC.mNormal.x)); + sp98.z = (sp98.z + (25.0f * spCC.mNormal.z)); + mLinkGndChk.SetPos(&sp98); + + if (dComIfG_Bgsp().GroundCross(&mLinkGndChk) > current.pos.y + l_autoUpHeight) { + dComIfG_Bgsp().GetTriPla(mLinkGndChk, &spCC); + if (cBgW_CheckBGround(spCC.mNormal.y)) { + sp24 = 0; + } + } + } + + if (sp24 == 0) { + mLinkRoofChk.SetPos(current.pos); + sp24 = dComIfG_Bgsp().RoofChk(&mLinkRoofChk) - sp28 > 10.0f + var_f30 ? 0 : 1; + } + + if (sp24 != 0) { + return; + } + + cM3dGPla spA4; + bool sp8 = 0; + int sp20 = 0; + + sp98.set(field_0x34ec.x - (7.5f * spE0.mNormal.x), sp28 + (0.01f + var_f30), field_0x34ec.z - (7.5f * spE0.mNormal.z)); + mLinkGndChk.SetPos(&sp98); + f32 sp1C = dComIfG_Bgsp().GroundCross(&mLinkGndChk); + + sp98.set(field_0x34ec.x - (1.5f * spE0.mNormal.x), sp28 + (0.01f + var_f30), field_0x34ec.z - (1.5f * spE0.mNormal.z)); + mLinkGndChk.SetPos(&sp98); + f32 sp38 = dComIfG_Bgsp().GroundCross(&mLinkGndChk); + + if (-1000000000.0f != sp38 && fabsf(sp1C - sp38) < l_autoUpHeight) { + sp8 = dComIfG_Bgsp().GetTriPla(mLinkGndChk, &spA4); + } + if ((!checkModeFlg(0x40000) && sp38 < sp28) || sp8 == 0) { + return; + } + if (-1000000000.0f == sp38 || !cBgW_CheckBGround(spA4.mNormal.y)) { + return; + } + + if (!getWallEdgePos(field_0x34ec, &spE0, &spA4, &sp74, sp20)) { + return; + } + + if (dComIfG_Bgsp().GetGroundCode(mLinkGndChk) != 6) { + f32 sp18 = 36.5f; + sp98.set(sp74.x + (10.0f * spE0.mNormal.x), sp74.y + l_autoUpHeight, sp74.z + (10.0f * spE0.mNormal.z)); + sp8C.set(sp74.x - (spE0.mNormal.x * sp18), sp98.y, sp74.z - (spE0.mNormal.z * sp18)); + + if (commonLineCheck(&sp98, &sp8C)) { + return; + } + } + + field_0x34ec = sp74; + f32 temp_f29 = field_0x34ec.y - sp28; + + if (checkModeFlg(0x40000)) { + f32 sp14; + f32 sp10; + if (checkWolf()) { + sp14 = 0.01f + daAlinkHIO_wlSwim_c0::m.field_0x7C; + sp10 = daAlinkHIO_wlSwim_c0::m.field_0x94; + } else { + sp14 = 0.01f + daAlinkHIO_swim_c0::m.mClimbHeight; + sp10 = daAlinkHIO_swim_c0::m.mUnderwaterClimbHeight; + } + + if (checkNoResetFlg0(FLG0_SWIM_UP)) { + if (temp_f29 <= sp14) { + if (temp_f29 >= sp10) { + field_0x2f91 = 7; + } + } + } + } else if (checkModeFlg(2)) { + if (sp38 - mLinkAcch.GetGroundH() > field_0x598 && temp_f29 < var_f30) { + if (!checkWolf() && mProcID != PROC_HOOKSHOT_FLY && temp_f29 < daAlinkHIO_autoJump_c0::m.mGrabHeightLimit) { + field_0x2f91 = 0xB; + } else { + field_0x2f91 = 0xA; + } + } + } else if (!(temp_f29 >= 0.01f + var_f30) && (!checkGrabAnime() || !(temp_f29 >= 0.01f + sp30))) { + if (temp_f29 < 0.01f + sp30) { + field_0x2f91 = 6; + } else if (temp_f29 < 0.01f + sp2C) { + field_0x2f91 = 7; + } else if (checkWolf() || (temp_f29 < 0.01f + daAlinkHIO_wallHang_c0::m.field_0x10)) { + field_0x2f91 = 8; + } else { + field_0x2f91 = 9; + } + } + } + } } /* 800B146C-800B1488 0ABDAC 001C+00 1/1 0/0 0/0 .text SetPos__12dBgS_RoofChkFRC4cXyz */ @@ -6216,7 +10231,57 @@ void daAlink_c::setWaterY() { /* 800B154C-800B172C 0ABE8C 01E0+00 2/2 0/0 0/0 .text setHangWaterY__9daAlink_cFv */ void daAlink_c::setHangWaterY() { - // NONMATCHING + cXyz sp14; + mDoMtx_multVecZero(mpLinkModel->getAnmMtx(0), &sp14); + + u32 var_r29; + u32 var_r28; + if (checkWolf()) { + var_r29 = Z2SE_WL_OUTOF_WATER; + var_r28 = Z2SE_WL_INTO_WATER; + } else { + f32 var_f31; + if (mLeftFootPos.y < mRightFootPos.y) { + var_f31 = mLeftFootPos.y; + } else { + var_f31 = mRightFootPos.y; + } + + sp14.y = var_f31; + var_r29 = Z2SE_AL_OUTOF_WATER; + var_r28 = Z2SE_AL_INTO_WATER; + } + + if (fopAcM_wt_c::waterCheck(&sp14)) { + field_0x33b8 = fopAcM_wt_c::getWaterY(); + field_0x2fc5 = fopAcM_wt_c::getPolyAtt0(); + field_0x2fc6 = dKy_pol_argument_get(fopAcM_wt_c::getWaterCheck()); + + if (field_0x2fc5 != 6) { + if (checkModeFlg(0x40)) { + cXyz sp8(sp14.x, field_0x33b8, sp14.z); + + if (field_0x33bc < field_0x33b8 && sp14.y >= field_0x33b8) { + seStartMapInfo(var_r29); + } else if (field_0x33bc > field_0x33b8 && sp14.y <= field_0x33b8) { + seStartMapInfo(var_r28); + fopKyM_createWpillar(&sp8, field_0x3420, 0); + } + if (field_0x33bc < field_0x33b8) { + dComIfGp_particle_setWaterRipple(field_0x31a8, *fopAcM_wt_c::getWaterCheck(), &sp8, 0.0f, &tevStr, NULL, fopAcM_GetRoomNo(this)); + } + } + + checkWaterInKandelaar(field_0x33b8); + } + } else { + field_0x33b8 = -1000000000.0f; + field_0x2fc5 = 0x10; + field_0x2fc6 = 0; + } + + field_0x33bc = sp14.y; + } /* 800B172C-800B1770 0AC06C 0044+00 3/3 0/0 0/0 .text setSandDownBgCheckWallH__9daAlink_cFv */ @@ -6340,7 +10405,111 @@ BOOL daAlink_c::checkNotItemSinkLimit() { /* 800B1BAC-800B1FB8 0AC4EC 040C+00 2/2 0/0 0/0 .text setSandShapeOffset__9daAlink_cFv */ void daAlink_c::setSandShapeOffset() { - // NONMATCHING + f32 var_f30 = 0.0f; + f32 var_f31 = 0.0f; + f32 temp_f29 = mSinkShapeOffset; + BOOL temp_r29 = checkEventRun(); + + if (mLinkAcch.i_ChkGroundHit() && (field_0x2fbb == 3 || checkSnowCode()) && !checkModeFlg(0x440)) { + if (!temp_r29 && !checkModeFlg(0x02000000)) { + if (checkSnowCode()) { + if (!checkZeroSpeedF() || mProcID == PROC_TURN_MOVE) { + var_f31 = 1.0f; + if (mGndPolySpecialCode == dBgW_SPCODE_LIGHT_SNOW) { + var_f30 = -15.0f; + } else { + if (mSinkShapeOffset > -15.0f) { + var_f31 = 10.0f; + } + var_f30 = -35.0f; + } + } + } else if (field_0x2fbd == 4) { + var_f30 = -25.0f; + if (mSinkShapeOffset > -15.0f) { + var_f31 = 10.0f; + } else { + var_f31 = daAlinkHIO_basic_c0::m.mSandSinkSpeed; + } + } else if (field_0x2fbd == 2) { + var_f30 = field_0x345c; + var_f31 = 6.0f; + } else if (field_0x2fbd == 3) { + var_f30 = field_0x3458; + if (mSinkShapeOffset > -15.0f) { + var_f31 = 10.0f; + } else { + var_f31 = daAlinkHIO_basic_c0::m.mSandSinkSpeed; + if (checkWolf()) { + var_f31 *= 0.2142857f; + } + } + } else if (field_0x2fbd == 1) { + if (mNormalSpeed < 2.0f) { + var_f30 = field_0x3458; + if (mSinkShapeOffset > -15.0f) { + var_f31 = 10.0f; + } else { + var_f31 = daAlinkHIO_basic_c0::m.mSandSinkSpeed; + } + + if (checkWolf()) { + var_f31 *= 0.2142857f; + } + } else { + var_f30 = -15.0f; + var_f31 = daAlinkHIO_basic_c0::m.mSandSurfaceSpeed; + } + } else if (!(mNormalSpeed < 2.0f) || !(mSinkShapeOffset < -15.0f)) { + var_f30 = -15.0f; + if (mSinkShapeOffset < -15.0f) { + var_f31 = daAlinkHIO_basic_c0::m.mSandSurfaceSpeed; + } else { + var_f31 = daAlinkHIO_basic_c0::m.mSandSinkSpeed; + } + } + } + } else { + var_f30 = 0.0f; + var_f31 = 10.0f; + } + + if (var_f31 > 0.0f) { + cLib_chaseF(&mSinkShapeOffset, var_f30, var_f31); + } + + if (mSinkShapeOffset < -15.0f) { + field_0x2fc9 = field_0x2fbb; + + int var_r28; + if (mProcID == PROC_LAVA_RETURN) { + var_r28 = 0x7F; + } else { + var_r28 = cLib_minMaxLimit((128.0f * ((mSinkShapeOffset - -15.0f) / (field_0x3458 - -15.0f))) - 1.0f, -1, 0x7F); + } + + mZ2Link.setSinkDepth(var_r28); + + if (fabsf(temp_f29 - mSinkShapeOffset) > 0.01f) { + if (field_0x2fbb == 0xD) { + seStartOnlyReverbLevel(Z2SE_AL_SINK_SNOW_LEVEL); + } else { + seStartOnlyReverbLevel(Z2SE_AL_SINK_SAND_LEVEL); + } + } + } else if (field_0x2fc9 != 0x10) { + if (field_0x2fc9 == 0xD) { + seStartOnlyReverb(Z2SE_AL_SINK_SNOW_OUT); + } else { + seStartOnlyReverb(Z2SE_AL_SINK_SAND_OUT); + } + + field_0x2fc9 = 0x10; + } + + if (checkWolf() && !temp_r29 && mSinkShapeOffset < -30.0f) { + getMidnaActor()->onForcePanic(); + } } /* 800B1FB8-800B1FD8 0AC8F8 0020+00 2/2 0/0 0/0 .text checkLv2MiddleBossBgRide__9daAlink_cFs */ @@ -6350,7 +10519,23 @@ bool daAlink_c::checkLv2MiddleBossBgRide(s16 i_procName) { /* 800B1FD8-800B21EC 0AC918 0214+00 11/11 0/0 0/0 .text getSlidePolygon__9daAlink_cFP8cM3dGPla */ bool daAlink_c::getSlidePolygon(cM3dGPla* param_0) { - // NONMATCHING + if (!checkMagneBootsOn() && mLinkAcch.i_ChkGroundHit() && !checkModeFlg(0x40000) && (mGndPolySpecialCode != 6) && dComIfG_Bgsp().ChkPolySafe(mLinkAcch.m_gnd)) { + if ((checkEquipHeavyBoots() && daTagMagne_c::checkMagnetCode(mLinkAcch.m_gnd)) || mProcID == PROC_GORON_MOVE) { + return 0; + } + + s16 temp_r28 = getMoveBGActorName(mLinkAcch.m_gnd, 1); + if (dComIfG_Bgsp().GetTriPla(mLinkAcch.m_gnd, param_0) && + (!checkBootsOrArmorHeavy() || (temp_r28 != PROC_Obj_RotStair && temp_r28 != PROC_Obj_Lv3R10Saka)) && + ((field_0x3174 != 8 && (mGndPolySpecialCode == 1 || (param_0->mNormal.y < field_0x3470 && mGndPolySpecialCode != 2))) || + (mGndPolySpecialCode == 5 && !checkWolf() && (!checkInputOnR() || mProcID == PROC_SLIDE) && (param_0->mNormal.y < cM_scos(field_0x3122))) || + (!checkEquipHeavyBoots() && !dComIfGp_checkPlayerStatus0(0, 0x100) && checkLv2MiddleBossBgRide(temp_r28) && + (param_0->mNormal.y < cM_scos(cM_deg2s(daAlinkHIO_slide_c0::m.mLV2MinibossFloorSlideAngle)))))) + { + return 1; + } + } + return 0; } @@ -6681,7 +10866,6 @@ void daAlink_c::setStickData() { } } - /* 800B2EA4-800B3220 0AD7E4 037C+00 1/1 0/0 0/0 .text setAtnList__9daAlink_cFv */ void daAlink_c::setAtnList() { mAttList = NULL; @@ -6938,7 +11122,6 @@ void daAlink_c::initServiceWaitTime() { } } - /* 800B3904-800B3924 0AE244 0020+00 50/50 0/0 0/0 .text checkZeroSpeedF__9daAlink_cCFv */ bool daAlink_c::checkZeroSpeedF() const { return fabsf(mNormalSpeed) < 0.0010000000474974513f; @@ -7190,11 +11373,116 @@ void daAlink_c::setSpeedAndAngleNormal() { setNormalSpeedF(var_f31, daAlinkHIO_move_c0::m.mDeceleration); } - /* 800B444C-800B477C 0AED8C 0330+00 1/1 0/0 0/0 .text setSpeedAndAngleAtn__9daAlink_cFv */ void daAlink_c::setSpeedAndAngleAtn() { - // NONMATCHING + int var_r29 = field_0x2f98; + + if (checkInputOnR()) { + s16 temp_r0 = field_0x2fe2 - shape_angle.y; + f32 temp_f27 = cM_ssin(temp_r0); + f32 temp_f29 = cM_scos(temp_r0); + + if (mTargetedActor == NULL && !checkGoatStopGame() && (temp_f29 <= -0.99f || temp_f29 >= 0.99f)) { + if (temp_f29 <= -0.99f) { + var_r29 = 1; + } else { + var_r29 = 0; + } + } else if (temp_f29 < -0.866f) { + var_r29 = 1; + } else if (temp_f27 > 0.0f) { + var_r29 = 2; + } else if (temp_f27 < 0.0f) { + var_r29 = 3; + } + } + + s16 var_r27; + s16 var_r26; + s16 var_r25; + + f32 var_f31; + f32 var_f30; + f32 var_f28; + + if (mTargetedActor != NULL) { + var_r27 = daAlinkHIO_atnMove_c0::m.mTurnAngleRate; + var_r26 = daAlinkHIO_atnMove_c0::m.mMaxTurnAngle; + var_r25 = daAlinkHIO_atnMove_c0::m.mMinTurnAngle; + + if (var_r29 == 1) { + var_f31 = daAlinkHIO_atnMove_c0::m.mBackAcceleration; + var_f30 = daAlinkHIO_atnMove_c0::m.mBackDeceleration; + } else { + var_f31 = daAlinkHIO_atnMove_c0::m.mAcceleration; + var_f30 = daAlinkHIO_atnMove_c0::m.mDeceleration; + } + } else { + if (var_r29 == 0) { + if (checkInputOnR()) { + if (getDirectionFromCurrentAngle() == DIR_BACKWARD) { + current.angle.y += 0x8000; + mNormalSpeed *= -1.0f; + } + if (checkZeroSpeedF()) { + current.angle.y = field_0x2fe2; + } + } + + setSpeedAndAngleNormal(); + return; + } + + var_r27 = daAlinkHIO_noActAtnMove_c0::m.mTurnAngleRate; + var_r26 = daAlinkHIO_noActAtnMove_c0::m.mMaxTurnAngle; + var_r25 = daAlinkHIO_noActAtnMove_c0::m.mMinTurnAngle; + + if (var_r29 == 1) { + var_f31 = daAlinkHIO_noActAtnMove_c0::m.mBackAcceleration; + var_f30 = daAlinkHIO_noActAtnMove_c0::m.mBackDeceleration; + } else { + var_f31 = daAlinkHIO_noActAtnMove_c0::m.mAcceleration; + var_f30 = daAlinkHIO_noActAtnMove_c0::m.mDeceleration; + } + } + + if (checkInputOnR()) { + if (getDirectionFromCurrentAngle() == DIR_BACKWARD) { + current.angle.y += 0x8000; + mNormalSpeed *= -1.0f; + } + + s16 var_r28; + if (checkUnderMove0BckNoArc(ANM_CHAIN_PULL_END)) { + var_r28 = getChainStickAngleY(shape_angle.y); + } else { + var_r28 = field_0x2fe2; + } + + if (checkZeroSpeedF()) { + current.angle.y = var_r28; + } + + s16 temp_r23 = current.angle.y; + cLib_addCalcAngleS(¤t.angle.y, var_r28, var_r27, var_r26, var_r25); + + if (field_0x33a8 > (0.3f * (1.0f - fabsf(mNormalSpeed / field_0x594)))) { + var_f28 = var_f31 * field_0x33a8 * cM_scos((current.angle.y - temp_r23)); + } else { + var_f28 = 0.0f; + } + } else { + var_f28 = 0.0f; + } + + if (mTargetedActor != NULL) { + setShapeAngleToAtnActor(0); + } else { + shape_angle.y = field_0x2fe4; + } + + setNormalSpeedF(var_f28, var_f30); } /* 800B477C-800B47B4 0AF0BC 0038+00 2/2 0/0 0/0 .text @@ -7212,8 +11500,15 @@ int daAlink_c::checkRequestTalkActor(dAttList_c* param_0, fopAc_ac_c* param_1) { /* 800B47B4-800B48D0 0AF0F4 011C+00 4/4 0/0 0/0 .text checkServiceWaitMode__9daAlink_cFv */ bool daAlink_c::checkServiceWaitMode() { - // NONMATCHING - return 0; + return !checkEventRun() && + !checkEndResetFlg0(ERFLG0_BOSS_ROOM_WAIT) && + checkNoUpperAnime() && + !checkWindSpeedOnXZ() && + field_0x3126 == 0 && + field_0x3128 == 0 && + field_0x3124 == 0 && + !checkFishingRodAndLureItem() && + mSinkShapeOffset >= -30.0f; } /* 800B48D0-800B4908 0AF210 0038+00 18/18 0/0 0/0 .text setJumpMode__9daAlink_cFv */ @@ -7593,8 +11888,73 @@ void daAlink_c::decideDoStatus() { /* 800B58EC-800B5BC0 0B022C 02D4+00 25/25 0/0 0/0 .text checkWaitAction__9daAlink_cFv */ BOOL daAlink_c::checkWaitAction() { - // NONMATCHING - return 0; + if (checkWolf()) { + if (checkModeFlg(0x01000000)) { + if (mDemo.getDemoType() == 4) { + return 0; + } + return procWolfWaitInit(); + } + + if (checkNoUpperAnime() && checkRestHPAnime() && shape_angle.y == field_0x2fe6 && (!checkAttentionState() || shape_angle.y == field_0x2fe4)) { + return procWolfTiredWaitInit(); + } + + return procWolfWaitInit(); + } + + if (checkModeFlg(0x400) && mRideStatus != 0) { + if (checkCanoeRide()) { + if (checkGrabAnimeAndThrow()) { + return procCanoeGrabMoveInit(); + } + return procCanoeWaitInit(0); + } + + if (checkBoardRide()) { + return procBoardWaitInit(NULL); + } + + if (checkSpinnerRide()) { + return procSpinnerWaitInit(); + } + + if (checkGrabAnimeAndThrow()) { + return procHorseGrabMoveInit(); + } + + return procHorseWaitInit(); + } + + if (dComIfGp_checkPlayerStatus1(0, 0x10000)) { + return procHookshotRoofWaitInit(0, mCargoCarryAcKeep.getActor(), 0); + } + + if (dComIfGp_checkPlayerStatus1(0, 0x02000000)) { + return procHookshotWallWaitInit(0, 0, 0); + } + + if (checkModeFlg(0x40000) && !checkEndResetFlg1(ERFLG1_UNK_100)) { + return procSwimWaitInit(0); + } + + if (mSpecialMode == 1) { + return procSumouReadyInit(); + } + + if (checkGrabAnime()) { + return procGrabWaitInit(); + } + + if (checkModeFlg(0x01000000) && mDemo.getDemoType() == 4) { + return 0; + } + + if (checkRestHPAnime() && !checkPlayerGuardAndAttack() && shape_angle.y == field_0x2fe6 && !checkEndResetFlg0(ERFLG0_UNK_8000000) && !checkUnderMove0BckNoArc(ANM_WAIT_B) && !checkUnderMove0BckNoArc(ANM_WAIT_B_TO_A)) { + return procTiredWaitInit(); + } + + return procWaitInit(); } /* 800B5BC0-800B5C34 0B0500 0074+00 3/3 0/0 0/0 .text setFallVoice__9daAlink_cFv */ @@ -7629,7 +11989,6 @@ void daAlink_c::setStepLandVibration() { dComIfGp_getVibration().StartShock(shock, 15, cXyz(0.0f, 1.0f, 0.0f)); } - /* 800B5CCC-800B5F6C 0B060C 02A0+00 5/5 0/0 0/0 .text checkLandAction__9daAlink_cFi */ BOOL daAlink_c::checkLandAction(int param_0) { f32 temp_f31 = 0.0099999998f * (mFallHeight - current.pos.y); @@ -7901,7 +12260,6 @@ BOOL daAlink_c::checkAutoJumpAction() { return 0; } - /* 800B69CC-800B6A30 0B130C 0064+00 2/2 0/0 0/0 .text checkCutJumpInFly__9daAlink_cFv */ BOOL daAlink_c::checkCutJumpInFly() { if ((mEquipItem == EQUIP_SWORD && checkResetFlg0(RFLG0_UNK_80)) || checkForceSwordSwing()) { @@ -8034,7 +12392,6 @@ BOOL daAlink_c::checkFrontWallTypeAction() { return 0; } - /* 800B6F28-800B7090 0B1868 0168+00 3/3 0/0 0/0 .text checkItemActionInitStart__9daAlink_cFv */ int daAlink_c::checkItemActionInitStart() { if (checkBowAndSlingItem(mEquipItem)) { @@ -8135,7 +12492,6 @@ int daAlink_c::cancelUpperItemReadyAnime(int param_0) { return 0; } - /* 800B72E4-800B7390 0B1C24 00AC+00 8/8 0/0 0/0 .text checkItemActorPointer__9daAlink_cFv */ BOOL daAlink_c::checkItemActorPointer() { @@ -8190,7 +12546,6 @@ bool daAlink_c::checkSwordTwirlAction() { return true; } - /* 800B74B4-800B7528 0B1DF4 0074+00 3/3 0/0 0/0 .text checkUpperItemActionFly__9daAlink_cFv */ BOOL daAlink_c::checkUpperItemActionFly() { if (checkBowAndSlingItem(mEquipItem)) { @@ -8396,13 +12751,21 @@ int daAlink_c::orderTalk(int i_checkZTalk) { } /* 800B7D4C-800B7F84 0B268C 0238+00 1/1 0/0 0/0 .text daAlink_searchBouDoor__FP10fopAc_ac_cPv */ -static void daAlink_searchBouDoor(fopAc_ac_c* param_0, void* param_1) { - // NONMATCHING +static void* daAlink_searchBouDoor(fopAc_ac_c* i_actor, void* i_data) { + if (fopAcM_GetName(i_actor) == PROC_NPC_BOU && ((daNpc_Bou_c*)i_actor)->speakTo()) { + return i_actor; + } + + return NULL; } /* 800B7F84-800B80C4 0B28C4 0140+00 1/1 0/0 0/0 .text daAlink_searchKolin__FP10fopAc_ac_cPv */ -static void daAlink_searchKolin(fopAc_ac_c* param_0, void* param_1) { - // NONMATCHING +static void* daAlink_searchKolin(fopAc_ac_c* i_actor, void* i_data) { + if (fopAcM_GetName(i_actor) == PROC_NPC_KOLIN && ((daNpc_Kolin_c*)i_actor)->orderNoRideEvt()) { + return i_actor; + } + + return NULL; } /* 800B80C4-800B8374 0B2A04 02B0+00 2/2 0/0 0/0 .text orderZTalk__9daAlink_cFv */ @@ -8852,7 +13215,6 @@ BOOL daAlink_c::checkSideRollAction(int param_0) { return procTurnMoveInit(param_0); } - /* 800B9254-800B92D0 0B3B94 007C+00 35/35 0/0 0/0 .text checkNoUpperAnime__9daAlink_cCFv */ BOOL daAlink_c::checkNoUpperAnime() const { @@ -8928,7 +13290,6 @@ void daAlink_c::swordEquip(int param_0) { } } - /* 800B9580-800B9640 0B3EC0 00C0+00 1/1 0/0 0/0 .text swordUnequip__9daAlink_cFv */ void daAlink_c::swordUnequip() { f32 anm_speed; @@ -8996,7 +13357,6 @@ void daAlink_c::itemUnequip(u16 i_itemID, f32 i_playSpeed) { anm_data->mInterpolation); } - /* 800B97EC-800B983C 0B412C 0050+00 2/2 0/0 0/0 .text checkFastUnequip__9daAlink_cFv */ bool daAlink_c::checkFastUnequip() { return mProcID == PROC_PREACTION_UNEQUIP || mProcID == PROC_HORSE_GETOFF || checkEventRun(); @@ -9387,7 +13747,6 @@ void daAlink_c::commonChangeItem() { } } - /* 800BA914-800BAF08 0B5254 05F4+00 1/1 0/0 0/0 .text setItemAction__9daAlink_cFv */ void daAlink_c::setItemAction() { if (mEquipItem == IRONBALL) { @@ -9524,7 +13883,6 @@ void daAlink_c::setItemAction() { } } - /* 800BAF08-800BAF80 0B5848 0078+00 2/2 0/0 0/0 .text checkNextActionFromCrouch__9daAlink_cFi */ BOOL daAlink_c::checkNextActionFromCrouch(int param_0) { if (checkNextAction(param_0)) { @@ -9565,8 +13923,36 @@ void daAlink_c::getBodyAngleXBasePos(cXyz* o_pos) { /* 800BB084-800BB2B0 0B59C4 022C+00 3/3 0/0 0/0 .text getBodyAngleXAtnActor__9daAlink_cFi */ s16 daAlink_c::getBodyAngleXAtnActor(int param_0) { - // NONMATCHING - return 0; + s16 var_r30; + + if (mTargetedActor != NULL) { + cXyz sp18; + getBodyAngleXBasePos(&sp18); + + cXyz spC = mTargetedActor->eyePos - sp18; + multVecMagneBootInvMtx(&spC); + + spC.y -= 40.0f; + + if (spC.abs() < 1.0f) { + var_r30 = 0; + } else { + var_r30 = spC.atan2sY_XZ(); + if (param_0 != 0) { + var_r30 = cLib_minMaxLimit((s16)var_r30, daAlinkHIO_cut_c0::m.mUnkBodyUpwards, daAlinkHIO_cut_c0::m.mUnkBodyDownwards); + } else { + var_r30 = cLib_minMaxLimit((s16)var_r30, -0x2000, 0x2000); + } + } + } else { + var_r30 = 0; + } + + if (checkNotItemSinkLimit() && var_r30 > 0) { + var_r30 = 0; + } + + return var_r30; } /* 800BB2B0-800BB324 0B5BF0 0074+00 13/13 0/0 0/0 .text setBodyAngleXReadyAnime__9daAlink_cFi */ @@ -9687,12 +14073,172 @@ void daAlink_c::setSpecialGravity(f32 i_gravity, f32 i_speed, int i_offFlag) { /* 800BB7A0-800BBD40 0B60E0 05A0+00 1/1 0/0 0/0 .text transAnimeProc__9daAlink_cFP4cXyzff */ void daAlink_c::transAnimeProc(cXyz* param_0, f32 param_1, f32 param_2) { - // NONMATCHING + mDoExt_MtxCalcAnmBlendTbl* temp_r26 = field_0x1f20; + *param_0 = field_0x34d4; + + J3DTransformInfo sp60; + J3DTransformInfo sp40; + temp_r26->getAnm(0)->getTransform(0, &sp60); + + for (int i = 1; i < 3; i++) { + J3DAnmTransform* sp8 = temp_r26->getAnm(i); + if (sp8 != NULL) { + sp8->getTransform(0, &sp40); + + f32 temp_f1 = temp_r26->getRatio(i); + f32 temp_f30 = 1.0f - temp_f1; + sp60.mTranslate.x = (sp60.mTranslate.x * temp_f30) + (sp40.mTranslate.x * temp_f1); + sp60.mTranslate.y = (sp60.mTranslate.y * temp_f30) + (sp40.mTranslate.y * temp_f1); + sp60.mTranslate.z = (sp60.mTranslate.z * temp_f30) + (sp40.mTranslate.z * temp_f1); + } + } + + J3DTransformInfo* temp_r29 = field_0x2060->getOldFrameTransInfo(0); + cXyz sp30; + + if (field_0x2f99 == 0x50) { + sp30 = current.pos - field_0x3798; + + if (checkModeFlg(0x40) || mProcID == PROC_STEP_MOVE || mProcID == PROC_WOLF_STEP_MOVE) { + sp30.y = sp30.y - mSinkShapeOffset; + mSinkShapeOffset = 0.0f; + old.pos = current.pos; + field_0x3798 = current.pos; + } + + temp_r29->mTranslate.x -= (-param_1 * sp30.z) + (param_2 * sp30.x); + temp_r29->mTranslate.y -= sp30.y; + temp_r29->mTranslate.z -= (param_2 * sp30.z) + (param_1 * sp30.x); + } else if (field_0x2f99 == 0x40 || field_0x2f99 == 0x90 || field_0x2f99 == 0x80 || field_0x2f99 == 0xA0 || field_0x2f99 == 0x70) { + if (field_0x2f99 == 0x80) { + sp30.set(0.0f, sp60.mTranslate.y - temp_r29->mTranslate.y, 0.0f); + } else if (field_0x2f99 == 0xA0) { + sp30.set(field_0x384c->x + (sp60.mTranslate.x - temp_r29->mTranslate.x), field_0x384c->y + (sp60.mTranslate.y - temp_r29->mTranslate.y), field_0x384c->z + (sp60.mTranslate.z - temp_r29->mTranslate.z)); + } else if (field_0x2f99 == 0x90) { + sp30.set(sp60.mTranslate.x - temp_r29->mTranslate.x, 0.0f, sp60.mTranslate.z - temp_r29->mTranslate.z); + } else { + sp30.set(sp60.mTranslate.x - temp_r29->mTranslate.x, sp60.mTranslate.y - temp_r29->mTranslate.y, sp60.mTranslate.z - temp_r29->mTranslate.z); + } + + cXyz sp24; + sp24.x = (param_1 * sp30.z) + (param_2 * sp30.x); + sp24.y = sp30.y; + sp24.z = (param_2 * sp30.z) - (param_1 * sp30.x); + + if (checkMagneBootsOn()) { + mDoMtx_stack_c::copy(mMagneBootMtx); + mDoMtx_stack_c::YrotM(shape_angle.y); + mDoMtx_stack_c::multVec(&sp30, &sp24); + } + + current.pos -= sp24; + field_0x3798 -= sp24; + + if (field_0x2f99 == 0xA0 && mProcID == PROC_BACK_JUMP) { + mLastJumpPos -= sp24; + } + + if (field_0x2f99 == 0x70) { + cXyz sp18(current.pos.x, current.pos.y + sp24.y, current.pos.z); + mLinkGndChk.SetPos(&sp18); + + f32 temp_f1_2 = dComIfG_Bgsp().GroundCross(&mLinkGndChk); + if (current.pos.y < temp_f1_2) { + sp18.y = temp_f1_2 - current.pos.y; + current.pos.y += sp18.y; + field_0x3798.y += sp18.y; + } + } + + temp_r29->mTranslate.y = sp60.mTranslate.y; + + if (field_0x2f99 != 0x80) { + temp_r29->mTranslate.x = sp60.mTranslate.x; + temp_r29->mTranslate.z = sp60.mTranslate.z; + } + } else if ((field_0x2f99 == 0x20) || (field_0x2f99 == 0x30)) { + temp_r29->mTranslate.z = sp60.mTranslate.z; + if (field_0x2f99 != 0x20) { + temp_r29->mTranslate.x = sp60.mTranslate.x; + } + } else if (field_0x2f99 == 0x10) { + field_0x34d4.x = 0.0f; + field_0x34d4.z = 0.0f; + + param_0->x = 0.0f; + param_0->z = 0.0f; + param_0->y = sp60.mTranslate.y; + + temp_r29->mTranslate.x = 0.0f; + temp_r29->mTranslate.z = 0.0f; + temp_r29->mTranslate.y = sp60.mTranslate.y; + + field_0x33b0 = sp60.mTranslate.y; + + if (checkModeFlg(0x10000)) { + field_0x2f99 = 6; + } else { + field_0x2f99 = 7; + } + + if (mProcID == PROC_HORSE_RIDE || mProcID == PROC_SWIM_DIVE) { + param_0->y = 0.0f; + field_0x33b0 = 0.0f; + } else if (mProcID == PROC_OCTAIEAL_SPIT) { + field_0x33b0 = -45.0f; + param_0->y = -45.0f; + } + } else if (checkRootTransClearContinueMode()) { + param_0->x = sp60.mTranslate.x; + param_0->y = sp60.mTranslate.y; + param_0->z = sp60.mTranslate.z; + field_0x2f99 &= ~0x8; + } + + field_0x34d4.x = sp60.mTranslate.x; + field_0x34d4.y = sp60.mTranslate.y; + field_0x34d4.z = sp60.mTranslate.z; } /* 800BBD40-800BBF68 0B6680 0228+00 1/1 0/0 0/0 .text setFootSpeed__9daAlink_cFv */ void daAlink_c::setFootSpeed() { - // NONMATCHING + cXyz sp18[2]; + + f32 var_f31; + if (field_0x2060->getOldFrameFlg()) { + mDoMtx_concat(mInvMtx, mpLinkModel->getAnmMtx(field_0x30bc), mDoMtx_stack_c::get()); + mDoMtx_stack_c::multVecZero(&sp18[0]); + + mDoMtx_concat(mInvMtx, mpLinkModel->getAnmMtx(field_0x30be), mDoMtx_stack_c::get()); + mDoMtx_stack_c::multVecZero(&sp18[1]); + + int var_r28; + if (sp18[0].y < sp18[1].y) { + var_r28 = 0; + } else { + var_r28 = 1; + } + + cXyz sp8 = sp18[var_r28] - field_0x37b0[var_r28]; + s16 temp_r0 = current.angle.y - shape_angle.y; + var_f31 = fabsf(sp8.z * cM_scos(temp_r0)) + fabsf(sp8.x * cM_ssin(temp_r0)); + + if (fabsf(mSpeedModifier) < 1.0f && checkInputOnR() && fabsf(field_0x33a4 - field_0x33a8) < 0.2f) { + var_f31 = (0.3f * var_f31) + (0.7f * field_0x33a0); + } + } else { + var_f31 = 0.0f; + + for (int i = 0; i < 2; i++) { + sp18[i] = current.pos; + } + } + + for (int i = 0; i < 2; i++) { + field_0x37b0[i] = sp18[i]; + } + + field_0x33a0 = var_f31; } /* 800BBF68-800BD6FC 0B68A8 1794+00 1/1 0/0 0/0 .text posMove__9daAlink_cFv */ @@ -10083,7 +14629,110 @@ void daAlink_c::posMove() { /* 800BD6FC-800BDD70 0B803C 0674+00 1/1 0/0 0/0 .text autoGroundHit__9daAlink_cFv */ void daAlink_c::autoGroundHit() { - // NONMATCHING + offNoResetFlg0(FLG0_UNK_2000); + + if (checkMagneBootsOn()) { + cXyz sp68; + cXyz sp5C; + cXyz sp50; + + mDoMtx_stack_c::copy(mMagneBootMtx); + mDoMtx_stack_c::multVecSR(&cXyz::BaseY, &sp50); + sp68 = current.pos + (sp50 * 30.0f); + sp5C = current.pos + (sp50 * 100.0f); + + if (commonMagneLineCheck(&sp68, &sp5C)) { + current.pos = mMagneLineChk.i_GetCross(); + onNoResetFlg0(FLG0_UNK_2000); + + if (checkNoResetFlg1(FLG1_UNK_20000000)) { + mDoMtx_stack_c::YrotM(current.angle.y); + mDoMtx_stack_c::multVecSR(&cXyz::BaseZ, &sp50); + sp50 *= 10.0f; + sp68 += sp50; + sp5C += sp50; + + if (commonLineCheck(&sp68, &sp5C) && daTagMagne_c::checkMagnetCode(mLinkLinChk)) { + offNoResetFlg1(FLG1_UNK_20000000); + } else { + mNormalSpeed = 0.0f; + speedF = 0.0f; + } + } + } else if (!cBgW_CheckBGround(mMagneBootsTopVec.y)) { + sp50 = current.pos - field_0x3798; + sp68 -= sp50; + sp5C -= sp50; + + if (commonMagneLineCheck(&sp68, &sp5C)) { + onNoResetFlg0(FLG0_UNK_2000); + mNormalSpeed = 0.0f; + speedF = 0.0f; + onNoResetFlg1(FLG1_UNK_20000000); + field_0x3092 = current.angle.y + 0x8000; + current.pos = field_0x3798; + } + } + } else if (!checkModeFlg(0x70C52) || (checkBoardRide() && !checkModeFlg(2)) || checkModeFlg(0x40)) { + cM3dGPla sp74; + f32 temp_f30 = mLinkAcch.GetGroundH() - current.pos.y; + + if (!mLinkAcch.i_ChkGroundHit()) { + if (checkBoardRide() && shape_angle.x < 0) { + return; + } + + cXyz sp44 = current.pos - field_0x3798; + s16 var_r29; + + f32 temp_f1 = sp44.absXZ(); + if (temp_f1 > 1.0f) { + var_r29 = getGroundAngle(&mLinkAcch.m_gnd, sp44.atan2sX_Z()); + } else { + var_r29 = field_0x2ff0; + } + + f32 var_f31 = temp_f1 * cM_ssin(var_r29); + if (var_f31 < 0.0f) { + var_f31 = 0.0f; + } + + BOOL var_r28; + if (-1000000000.0f != mLinkAcch.GetGroundH()) { + dComIfG_Bgsp().GetTriPla(mLinkAcch.m_gnd, &sp74); + var_r28 = cBgW_CheckBGround(sp74.mNormal.y); + } else { + var_r28 = 0; + } + + if (var_r28 != 0) { + if (temp_f30 <= 0.000001f) { + if (temp_f30 >= l_autoDownHeight - var_f31) { + current.pos.y = mLinkAcch.GetGroundH(); + mLinkAcch.SetGroundHit(); + speed.y = 0.0f; + } + } + } + } + } else if (checkModeFlg(0x40000) && checkNoResetFlg0(FLG0_UNK_80) && current.pos.y > mWaterY && current.pos.y - mWaterY < 1000.0f) { + current.pos.y = mWaterY; + } + + if (checkReinRide() || checkSpinnerRide()) { + if ((current.pos.y - mLinkAcch.GetGroundH() > 1500.0f) || (checkSpinnerRide() && mRideAcKeep.getActor() != NULL && ((daSpinner_c*)mRideAcKeep.getActor())->getJumpFlg())) { + if (checkNoResetFlg3(FLG3_UNK_80000) == 0) { + onNoResetFlg3(FLG3_UNK_80000); + mLastJumpPos = current.pos; + mFallHeight = mLastJumpPos.y; + field_0x33c8 = mLastJumpPos.y; + } + } else { + offNoResetFlg3(FLG3_UNK_80000); + } + } else { + offNoResetFlg3(FLG3_UNK_80000); + } } /* 800BDD70-800BDE20 0B86B0 00B0+00 2/2 0/0 0/0 .text startPeepChange__9daAlink_cFv */ @@ -10097,8 +14746,7 @@ bool daAlink_c::startPeepChange() { } else { mode = 6; u32 param = fopAcM_GetParam(this); - s32 roomNo = fopAcM_GetRoomNo(this); - dComIfGs_setTurnRestart(current.pos, shape_angle.y, roomNo, param); + dComIfGs_setTurnRestart(current.pos, shape_angle.y, fopAcM_GetRoomNo(this), param); } dStage_changeScene(mPeepExitID, 0.0f, mode, fopAcM_GetRoomNo(this), @@ -10247,7 +14895,6 @@ void daAlink_c::checkRoofRestart() { } } - /* 80392094-80392094 01E6F4 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */ #pragma push #pragma force_active on @@ -10572,12 +15219,79 @@ void daAlink_c::seStartMapInfoLevel(u32 i_seID) { /* 800BF204-800BF37C 0B9B44 0178+00 3/3 0/0 0/0 .text * setBasAnime__9daAlink_cFQ29daAlink_c13daAlink_UNDER */ void daAlink_c::setBasAnime(daAlink_c::daAlink_UNDER param_0) { - // NONMATCHING + daPy_anmHeap_c* temp_r29 = &mUnderAnmHeap[param_0]; + daPy_frameCtrl_c* temp_r28 = &mUnderFrameCtrl[param_0]; + + if (!temp_r29->checkNoSetArcNo()) { + void* temp_r3 = ((mDoExt_transAnmBas*)getNowAnmPackUnder(UNDER_0))->getBas(); + if (temp_r3 == NULL) { + resetBasAnime(); + } else { + if (field_0x3084 == temp_r29->getIdx() && field_0x3086 == temp_r29->getArcNo()) { + if (field_0x33d4 * temp_r28->getRate() >= 0.0f) { + field_0x2d7c = temp_r28; + return; + } + } + + field_0x2d80 = temp_r3; + field_0x2d7c = temp_r28; + field_0x3084 = temp_r29->getIdx(); + field_0x3086 = temp_r29->getArcNo(); + field_0x33d4 = temp_r28->getRate(); + initBasAnime(); + } + } else { + u8* temp_r3_2 = temp_r29->getBuffer(); + if (*(u32*)(temp_r3_2 + 0x1C) == 0xFFFFFFFF) { + resetBasAnime(); + return; + } + + if (field_0x3084 == temp_r29->getIdx() && field_0x3086 == temp_r29->getArcNo()) { + if (field_0x33d4 * temp_r28->getRate() >= 0.0f) { + field_0x2d7c = temp_r28; + return; + } + } + + u32 dataSize = *(u32*)(temp_r3_2 + 0x8) - *(u32*)(temp_r3_2 + 0x1C); + + const u32 l_basAnmBufferSize = 0x800; + JUT_ASSERT(20661, dataSize < l_basAnmBufferSize); + + cLib_memCpy(field_0x2d78, temp_r29->getBuffer() + *(u32*)(temp_r3_2 + 0x1C), dataSize); + field_0x2d7c = temp_r28; + field_0x3084 = temp_r29->getIdx(); + field_0x3086 = temp_r29->getArcNo(); + field_0x33d4 = temp_r28->getRate(); + field_0x2d80 = 0; + initBasAnime(); + } } /* 800BF37C-800BF4E0 0B9CBC 0164+00 11/11 0/0 0/0 .text initBasAnime__9daAlink_cFv */ void daAlink_c::initBasAnime() { - // NONMATCHING + if (field_0x2d7c != NULL) { + f32 var_f31; + if (field_0x2d7c->getAttribute() == J3DFrameCtrl::LOOP_REPEAT_e) { + var_f31 = field_0x2d7c->getFrame() - field_0x2d7c->getRate(); + + if (var_f31 <= field_0x2d7c->getStart()) { + var_f31 = field_0x2d7c->getEnd() - var_f31; + } else if (var_f31 >= field_0x2d7c->getEnd()) { + var_f31 -= field_0x2d7c->getEnd(); + } + } else { + var_f31 = 0.0f; + } + + if (field_0x2d80 != NULL) { + mZ2Link.initAnime(field_0x2d80, field_0x2d7c->getRate() >= 0.0f, field_0x2d7c->getLoop(), var_f31); + } else { + mZ2Link.initAnime(field_0x2d78, field_0x2d7c->getRate() >= 0.0f, field_0x2d7c->getLoop(), var_f31); + } + } } /* 800BF4E0-800BF500 0B9E20 0020+00 6/6 0/0 0/0 .text resetBasAnime__9daAlink_cFv */ @@ -10585,14 +15299,67 @@ void daAlink_c::resetBasAnime() { field_0x3084 = 0xFFFF; field_0x3086 = 0xFFFF; field_0x2d7c = NULL; - field_0x2d80 = 0; + field_0x2d80 = NULL; } /* 800BF500-800BF79C 0B9E40 029C+00 5/5 0/0 0/0 .text checkSightLine__9daAlink_cFfP4cXyz */ BOOL daAlink_c::checkSightLine(f32 param_0, cXyz* param_1) { - // NONMATCHING - return 0; + camera_class* camera = dComIfGp_getCamera(field_0x317c); + cXyz* var_r29 = fopCamM_GetEye_p(camera); + cXyz sp3C; + cXyz sp30(mHeldItemRootPos); + + if (checkHookshotItem(mEquipItem) || mEquipItem == PACHINKO) { + var_r29 = &sp30; + } else if (checkBowItem(mEquipItem) && mItemAcKeep.getActor() != NULL) { + var_r29 = &mItemAcKeep.getActor()->current.pos; + } + + s16 temp_r27 = shape_angle.y + mBodyAngle.y; + f32 temp_f31 = cM_scos(mBodyAngle.x); + sp3C.set(temp_f31 * cM_ssin(temp_r27), -cM_ssin(mBodyAngle.x), temp_f31 * cM_scos(temp_r27)); + + if (checkMagneBootsOn()) { + mDoMtx_multVecSR(mMagneBootMtx, &sp3C, &sp3C); + } + + *param_1 = (sp3C * param_0) + *var_r29; + + if (checkHookshotItem(mEquipItem)) { + mRopeLinChk.Set(&field_0x3834, &mHeldItemRootPos, this); + + if (dComIfG_Bgsp().LineCross(&mRopeLinChk)) { + *param_1 = mRopeLinChk.i_GetCross(); + onResetFlg0(RFLG0_UNK_2000000); + return 1; + } + + sp30 -= sp3C * 100.0f; + } else if (mEquipItem == COPY_ROD) { + return 0; + } + + dBgS_LinChk* var_r30; + if (mEquipItem == BOOMERANG) { + var_r30 = &mBoomerangLinChk; + } else if (mProcID == PROC_HAWK_SUBJECT) { + var_r30 = &mLinkLinChk; + } else if (checkBowAndSlingItem(mEquipItem)) { + var_r30 = &mArrowLinChk; + } else { + var_r30 = &mRopeLinChk; + } + + var_r30->Set(var_r29, param_1, this); + + BOOL temp_r3 = dComIfG_Bgsp().LineCross(var_r30); + if (temp_r3) { + *param_1 = var_r30->i_GetCross(); + onResetFlg0(RFLG0_UNK_2000000); + } + + return temp_r3; } /* 800BF79C-800BF854 0BA0DC 00B8+00 2/2 0/0 0/0 .text setMetamorphoseModel__9daAlink_cFi @@ -10864,7 +15631,6 @@ void daAlink_c::changeItemBck(u16 i_resID, f32 param_1) { } } - /* 800C0114-800C0164 0BAA54 0050+00 2/2 0/0 0/0 .text checkGroupItem__9daAlink_cCFii */ int daAlink_c::checkGroupItem(int i_itemNo, int i_selItem) const { if (i_itemNo == 0x107) { diff --git a/src/d/actor/d_a_npc_bou.cpp b/src/d/actor/d_a_npc_bou.cpp index 8431426c1b2..40d64a5929d 100644 --- a/src/d/actor/d_a_npc_bou.cpp +++ b/src/d/actor/d_a_npc_bou.cpp @@ -1113,7 +1113,7 @@ void daNpc_Bou_c::setParam() { } /* 8096DF9C-8096E0EC 0010FC 0150+00 1/0 0/0 0/0 .text checkChangeEvt__11daNpc_Bou_cFv */ -void daNpc_Bou_c::checkChangeEvt() { +bool daNpc_Bou_c::checkChangeEvt() { // NONMATCHING } @@ -1138,7 +1138,7 @@ void daNpc_Bou_c::srchActors() { } /* 8096E27C-8096E31C 0013DC 00A0+00 1/0 0/0 0/0 .text evtTalk__11daNpc_Bou_cFv */ -void daNpc_Bou_c::evtTalk() { +bool daNpc_Bou_c::evtTalk() { // NONMATCHING } @@ -1148,7 +1148,7 @@ bool daNpc_Bou_c::evtEndProc() { } /* 8096E324-8096E3EC 001484 00C8+00 1/0 0/0 0/0 .text evtCutProc__11daNpc_Bou_cFv */ -void daNpc_Bou_c::evtCutProc() { +bool daNpc_Bou_c::evtCutProc() { // NONMATCHING } @@ -1233,7 +1233,7 @@ void daNpc_Bou_c::setCollision() { } /* 8096EC6C-8096EC74 001DCC 0008+00 1/0 0/0 0/0 .text drawDbgInfo__11daNpc_Bou_cFv */ -bool daNpc_Bou_c::drawDbgInfo() { +int daNpc_Bou_c::drawDbgInfo() { return false; } @@ -1678,13 +1678,13 @@ REGISTER_CTORS(0x809725A8, __sinit_d_a_npc_bou_cpp); /* 809726D4-809727B4 005834 00E0+00 1/1 0/0 0/0 .text * __ct__11daNpc_Bou_cFPC26daNpcT_faceMotionAnmData_cPC22daNpcT_motionAnmData_cPCQ222daNpcT_MotionSeqMngr_c18sequenceStepData_ciPCQ222daNpcT_MotionSeqMngr_c18sequenceStepData_ciPC16daNpcT_evtData_cPPc */ -daNpc_Bou_c::daNpc_Bou_c(daNpcT_faceMotionAnmData_c const* param_0, +/* daNpc_Bou_c::daNpc_Bou_c(daNpcT_faceMotionAnmData_c const* param_0, daNpcT_motionAnmData_c const* param_1, daNpcT_MotionSeqMngr_c::sequenceStepData_c const* param_2, int param_3, daNpcT_MotionSeqMngr_c::sequenceStepData_c const* param_4, int param_5, daNpcT_evtData_c const* param_6, char** param_7) { // NONMATCHING -} +} */ /* 809727B4-809727BC 005914 0008+00 1/0 0/0 0/0 .text getEyeballMaterialNo__11daNpc_Bou_cFv */ s32 daNpc_Bou_c::getEyeballMaterialNo() { @@ -1703,19 +1703,19 @@ s32 daNpc_Bou_c::getNeckJointNo() { /* 809727CC-809727D4 00592C 0008+00 1/0 0/0 0/0 .text getBackboneJointNo__11daNpc_Bou_cFv */ -bool daNpc_Bou_c::getBackboneJointNo() { +s32 daNpc_Bou_c::getBackboneJointNo() { return true; } /* 809727D4-809727E4 005934 0010+00 1/0 0/0 0/0 .text checkChangeJoint__11daNpc_Bou_cFi */ -void daNpc_Bou_c::checkChangeJoint(int param_0) { +int daNpc_Bou_c::checkChangeJoint(int param_0) { // NONMATCHING } /* 809727E4-809727F4 005944 0010+00 1/0 0/0 0/0 .text checkRemoveJoint__11daNpc_Bou_cFi */ -void daNpc_Bou_c::checkRemoveJoint(int param_0) { +int daNpc_Bou_c::checkRemoveJoint(int param_0) { // NONMATCHING } diff --git a/src/d/actor/d_a_npc_kolin.cpp b/src/d/actor/d_a_npc_kolin.cpp index 41edd177987..a3533ecf027 100644 --- a/src/d/actor/d_a_npc_kolin.cpp +++ b/src/d/actor/d_a_npc_kolin.cpp @@ -1254,7 +1254,7 @@ void daNpc_Kolin_c::setParam() { /* 80555118-8055523C 001218 0124+00 1/0 0/0 0/0 .text checkChangeEvt__13daNpc_Kolin_cFv */ -void daNpc_Kolin_c::checkChangeEvt() { +bool daNpc_Kolin_c::checkChangeEvt() { // NONMATCHING } @@ -1274,12 +1274,12 @@ void daNpc_Kolin_c::srchActors() { } /* 80555448-805554E8 001548 00A0+00 1/0 0/0 0/0 .text evtTalk__13daNpc_Kolin_cFv */ -void daNpc_Kolin_c::evtTalk() { +bool daNpc_Kolin_c::evtTalk() { // NONMATCHING } /* 805554E8-805555B0 0015E8 00C8+00 1/0 0/0 0/0 .text evtCutProc__13daNpc_Kolin_cFv */ -void daNpc_Kolin_c::evtCutProc() { +bool daNpc_Kolin_c::evtCutProc() { // NONMATCHING } @@ -1517,7 +1517,7 @@ void daNpc_Kolin_c::setCollision() { } /* 80555CE4-80555CEC 001DE4 0008+00 1/0 0/0 0/0 .text drawDbgInfo__13daNpc_Kolin_cFv */ -bool daNpc_Kolin_c::drawDbgInfo() { +int daNpc_Kolin_c::drawDbgInfo() { return false; } @@ -2133,14 +2133,14 @@ REGISTER_CTORS(0x8055A25C, __sinit_d_a_npc_kolin_cpp); /* 8055A3B8-8055A498 0064B8 00E0+00 1/1 0/0 0/0 .text * __ct__13daNpc_Kolin_cFPC26daNpcT_faceMotionAnmData_cPC22daNpcT_motionAnmData_cPCQ222daNpcT_MotionSeqMngr_c18sequenceStepData_ciPCQ222daNpcT_MotionSeqMngr_c18sequenceStepData_ciPC16daNpcT_evtData_cPPc */ -daNpc_Kolin_c::daNpc_Kolin_c(daNpcT_faceMotionAnmData_c const* param_0, +/* daNpc_Kolin_c::daNpc_Kolin_c(daNpcT_faceMotionAnmData_c const* param_0, daNpcT_motionAnmData_c const* param_1, daNpcT_MotionSeqMngr_c::sequenceStepData_c const* param_2, int param_3, daNpcT_MotionSeqMngr_c::sequenceStepData_c const* param_4, int param_5, daNpcT_evtData_c const* param_6, char** param_7) { // NONMATCHING -} +} */ /* 8055A498-8055A4A0 006598 0008+00 1/0 0/0 0/0 .text getEyeballMaterialNo__13daNpc_Kolin_cFv */ s32 daNpc_Kolin_c::getEyeballMaterialNo() { @@ -2160,19 +2160,19 @@ s32 daNpc_Kolin_c::getNeckJointNo() { } /* 8055A4B0-8055A4B8 0065B0 0008+00 1/0 0/0 0/0 .text getBackboneJointNo__13daNpc_Kolin_cFv */ -bool daNpc_Kolin_c::getBackboneJointNo() { - return true; +s32 daNpc_Kolin_c::getBackboneJointNo() { + return 1; } /* 8055A4B8-8055A4C8 0065B8 0010+00 1/0 0/0 0/0 .text checkChangeJoint__13daNpc_Kolin_cFi */ -void daNpc_Kolin_c::checkChangeJoint(int param_0) { +int daNpc_Kolin_c::checkChangeJoint(int param_0) { // NONMATCHING } /* 8055A4C8-8055A4D8 0065C8 0010+00 1/0 0/0 0/0 .text checkRemoveJoint__13daNpc_Kolin_cFi */ -void daNpc_Kolin_c::checkRemoveJoint(int param_0) { +int daNpc_Kolin_c::checkRemoveJoint(int param_0) { // NONMATCHING } @@ -2381,4 +2381,4 @@ static u8 data_8055B498[4]; static u8 data_8055B49C[4]; #pragma pop -/* 8055A77C-8055A77C 0001C8 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */ \ No newline at end of file +/* 8055A77C-8055A77C 0001C8 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */