diff --git a/include/d/actor/d_a_player.h b/include/d/actor/d_a_player.h index 19b170a63..5d4145e52 100644 --- a/include/d/actor/d_a_player.h +++ b/include/d/actor/d_a_player.h @@ -40,6 +40,7 @@ class daPy_demo_c { public: enum { DEMO_UNK1_e = 0x01, + DEMO_UNK11_e = 0x11, DEMO_UNK14_e = 0x14, DEMO_UNK18_e = 0x18, DEMO_UNK1D_e = 0x1D, diff --git a/include/d/actor/d_a_player_HIO.h b/include/d/actor/d_a_player_HIO.h index 9a56c3fe5..a7284d031 100644 --- a/include/d/actor/d_a_player_HIO.h +++ b/include/d/actor/d_a_player_HIO.h @@ -56,7 +56,7 @@ public: /* 0x68 */ f32 field_0x68; /* 0x6C */ f32 field_0x6C; /* 0x70 */ f32 field_0x70; - /* 0x74 */ f32 field_0x74; + /* 0x74 */ f32 field_0x74; /* 0x78 */ f32 field_0x78; /* 0x7C */ f32 field_0x7C; /* 0x80 */ f32 field_0x80; @@ -118,9 +118,9 @@ public: /* 0x00 */ s16 field_0x0; /* 0x02 */ s16 field_0x2; /* 0x04 */ s16 field_0x4; - /* 0x06 */ s16 field_0x6; - /* 0x08 */ s16 field_0x8; - /* 0x0A */ s16 field_0xA; + /* 0x06 */ s16 field_0x6; // 0x4 + /* 0x08 */ s16 field_0x8; // 0x1000 + /* 0x0A */ s16 field_0xA; // 0x200 /* 0x0C */ s16 field_0xC; /* 0x0E */ s16 field_0xE; /* 0x10 */ s16 field_0x10; @@ -705,39 +705,39 @@ public: class daPy_HIO_swim_c1 { public: - /* 0x00 */ s16 field_0x0; - /* 0x02 */ s16 field_0x2; - /* 0x04 */ s16 field_0x4; - /* 0x06 */ s16 field_0x6; - /* 0x08 */ s16 field_0x8; - /* 0x0C */ f32 field_0xC; - /* 0x10 */ f32 field_0x10; - /* 0x14 */ f32 field_0x14; - /* 0x18 */ f32 field_0x18; - /* 0x1C */ f32 field_0x1C; - /* 0x20 */ f32 field_0x20; - /* 0x24 */ f32 field_0x24; - /* 0x28 */ f32 field_0x28; - /* 0x2C */ f32 field_0x2C; - /* 0x30 */ f32 field_0x30; - /* 0x34 */ f32 field_0x34; - /* 0x38 */ f32 field_0x38; - /* 0x3C */ f32 field_0x3C; - /* 0x40 */ f32 field_0x40; - /* 0x44 */ f32 field_0x44; - /* 0x48 */ f32 field_0x48; - /* 0x4C */ f32 field_0x4C; - /* 0x50 */ f32 field_0x50; - /* 0x54 */ f32 field_0x54; - /* 0x58 */ f32 field_0x58; - /* 0x5C */ f32 field_0x5C; - /* 0x60 */ f32 field_0x60; - /* 0x64 */ f32 field_0x64; - /* 0x68 */ f32 field_0x68; + /* 0x00 */ s16 field_0x0; // 0x18 + /* 0x02 */ s16 field_0x2; // 0x91A + /* 0x04 */ s16 field_0x4; // 0x1388 + /* 0x06 */ s16 field_0x6; // 0x4B0 + /* 0x08 */ s16 field_0x8; // 0x11 + /* 0x0C */ f32 field_0xC; // 18.0f + /* 0x10 */ f32 field_0x10; // 1.0f + /* 0x14 */ f32 field_0x14; // -50.0f + /* 0x18 */ f32 field_0x18; // 0.02f + /* 0x1C */ f32 field_0x1C; // 2.0f + /* 0x20 */ f32 field_0x20; // 0.5f + /* 0x24 */ f32 field_0x24; // 90.0f + /* 0x28 */ f32 field_0x28; // 15.0f + /* 0x2C */ f32 field_0x2C; // 0.7f + /* 0x30 */ f32 field_0x30; // 0.0f + /* 0x34 */ f32 field_0x34; // 19.0f + /* 0x38 */ f32 field_0x38; // 3.0f + /* 0x3C */ f32 field_0x3C; // 0.0f + /* 0x40 */ f32 field_0x40; // 0.5f + /* 0x44 */ f32 field_0x44; // 18.0f + /* 0x48 */ f32 field_0x48; // 1.0f + /* 0x4C */ f32 field_0x4C; // 5.0f + /* 0x50 */ f32 field_0x50; // 0.6f + /* 0x54 */ f32 field_0x54; // 1.1f + /* 0x58 */ f32 field_0x58; // 5.3f + /* 0x5C */ f32 field_0x5C; // 0.0f + /* 0x60 */ f32 field_0x60; // 0.4f + /* 0x64 */ f32 field_0x64; // 6.0f + /* 0x68 */ f32 field_0x68; // 9.5f /* 0x6C */ f32 field_0x6C; - /* 0x70 */ f32 field_0x70; - /* 0x74 */ f32 field_0x74; - /* 0x78 */ f32 field_0x78; + /* 0x70 */ f32 field_0x70; // 2.5f + /* 0x74 */ f32 field_0x74; // 1.0f + /* 0x78 */ f32 field_0x78; // 30.0f /* 0x7C */ f32 field_0x7C; }; // Size: 0x80 @@ -923,7 +923,7 @@ public: /* 0x48 */ f32 field_0x48; /* 0x4C */ f32 field_0x4C; /* 0x50 */ f32 field_0x50; - /* 0x54 */ f32 field_0x54; + /* 0x54 */ f32 field_0x54; // 6.0f }; // Size: 0x58 class daPy_HIO_wallCatch_c0 { diff --git a/include/d/actor/d_a_player_main.h b/include/d/actor/d_a_player_main.h index ec6e74805..51fac0a4c 100644 --- a/include/d/actor/d_a_player_main.h +++ b/include/d/actor/d_a_player_main.h @@ -809,37 +809,37 @@ public: enum { ModeFlg_00000001 = 0x00000001, - ModeFlg_MIDAIR = 0x00000002, + ModeFlg_MIDAIR = 0x00000002, ModeFlg_00000004 = 0x00000004, - ModeFlg_DAMAGE = 0x00000008, - ModeFlg_WHIDE = 0x00000010, - ModeFlg_HANG = 0x00000020, + ModeFlg_DAMAGE = 0x00000008, + ModeFlg_WHIDE = 0x00000010, + ModeFlg_HANG = 0x00000020, ModeFlg_00000040 = 0x00000040, ModeFlg_00000080 = 0x00000080, ModeFlg_00000100 = 0x00000100, ModeFlg_HOOKSHOT = 0x00000200, ModeFlg_00000400 = 0x00000400, - ModeFlg_ROPE = 0x00000800, + ModeFlg_ROPE = 0x00000800, ModeFlg_00001000 = 0x00001000, - ModeFlg_IN_SHIP = 0x00002000, + ModeFlg_IN_SHIP = 0x00002000, ModeFlg_00004000 = 0x00004000, ModeFlg_00008000 = 0x00008000, - ModeFlg_CLIMB = 0x00010000, + ModeFlg_CLIMB = 0x00010000, ModeFlg_00020000 = 0x00020000, - ModeFlg_SWIM = 0x00040000, + ModeFlg_SWIM = 0x00040000, ModeFlg_00080000 = 0x00080000, - ModeFlg_GRAB = 0x00100000, + ModeFlg_GRAB = 0x00100000, ModeFlg_PUSHPULL = 0x00200000, - ModeFlg_LADDER = 0x00400000, - ModeFlg_CROUCH = 0x00800000, - ModeFlg_CRAWL = 0x01000000, + ModeFlg_LADDER = 0x00400000, + ModeFlg_CROUCH = 0x00800000, + ModeFlg_CRAWL = 0x01000000, ModeFlg_02000000 = 0x02000000, ModeFlg_04000000 = 0x04000000, ModeFlg_08000000 = 0x08000000, - ModeFlg_CAUGHT = 0x10000000, - ModeFlg_SUBJECT = 0x20000000, + ModeFlg_CAUGHT = 0x10000000, + ModeFlg_SUBJECT = 0x20000000, ModeFlg_40000000 = 0x40000000, - ModeFlg_PARRY = 0x80000000, + ModeFlg_PARRY = 0x80000000, }; enum { @@ -918,7 +918,7 @@ public: BOOL draw(); void setAtnList(); void setActorPointer(); - void setTalkStatus(); + BOOL setTalkStatus(); void setHintActor(); void setDoStatusBasic(); void setDoStatus(); @@ -973,7 +973,7 @@ public: BOOL checkNextMode(int); BOOL checkIceSlipFall(); void setFrontWallType(); - void changeFrontWallTypeProc(); + BOOL changeFrontWallTypeProc(); void changeSlideProc(); void changeWaitProc(); void changeLandProc(f32); @@ -1401,13 +1401,13 @@ public: BOOL procGrabRebound(); void setSpeedAndAngleSwim(); BOOL checkNextModeSwim(); - void changeSwimProc(); - void changeSwimUpProc(); + BOOL changeSwimProc(); + BOOL changeSwimUpProc(); void swimOutAfter(int); BOOL checkSwimFallCheck(); - void changeSwimOutProc(); + BOOL changeSwimOutProc(); void setSwimMoveAnime(daPy_ANM); - void getSwimTimerRate(); + f32 getSwimTimerRate(); void setSwimTimerStartStop(); BOOL procSwimUp_init(int); BOOL procSwimUp(); @@ -1782,7 +1782,7 @@ public: void otherWeaponTrigger() const {} void spBattleTrigger() const {} - void checkPlayerDemoMode() const {} + BOOL checkPlayerDemoMode() const { return mDemo.getDemoType(); } void checkSpecialDemoMode() const {} void checkAttentionLock() {} @@ -2122,7 +2122,7 @@ public: /* 0x35A4 */ f32 m35A4; /* 0x35A8 */ f32 m35A8; /* 0x35AC */ f32 m35AC; - /* 0x35B0 */ f32 m35B0; + /* 0x35B0 */ f32 mStickDistance; // /* 0x35B4 */ f32 m35B4; /* 0x35B8 */ f32 m35B8; /* 0x35BC */ f32 mVelocity; diff --git a/include/d/d_com_inf_game.h b/include/d/d_com_inf_game.h index 43ebaf378..a31319223 100644 --- a/include/d/d_com_inf_game.h +++ b/include/d/d_com_inf_game.h @@ -377,11 +377,15 @@ public: s16 getItemKeyNumCount() { return mItemKeyNumCount; } void setItemKeyNumCount(s16 num) { mItemKeyNumCount += num; } - void setItemBeastNumCount(int i_idx, s16 num) { mItemBeastNumCounts[i_idx] += num; } s16 getItemBeastNumCount(int i_idx) { return mItemBeastNumCounts[i_idx]; } + void setItemBeastNumCount(int i_idx, s16 num) { mItemBeastNumCounts[i_idx] += num; } + s32 getItemTimeCount() { return mAirMeter; } void setItemTimeCount(s32 time) { mAirMeter = time; } - void setItemTimeMax(s32 time) { field_0x4928 = time; } + void clearItemTimeCount() { mAirMeter = 0; } + + s32 getItemTimeMax() { return mItemTimeMax; } + void setItemTimeMax(s32 time) { mItemTimeMax = time; } u8 getScopeType() { return mScopeType; } void setScopeType(u8 type) { mScopeType = type; } @@ -657,7 +661,7 @@ public: /* 0x4922 */ s16 mItemTimer; /* 0x4924 */ s16 mItemNowLife; /* 0x4926 */ s16 mItemNowRupee; - /* 0x4928 */ u8 field_0x4928; + /* 0x4928 */ u8 mItemTimeMax; /* 0x4929 */ u8 field_0x4929; /* 0x492A */ u8 mMesgStatus; /* 0x492B */ u8 mbCamOverrideFarPlane; @@ -2228,14 +2232,26 @@ inline void dComIfGp_setItemKeyNumCount(s16 num) { g_dComIfG_gameInfo.play.setItemKeyNumCount(num); } +inline s32 dComIfGp_getItemTimeCount() { + return g_dComIfG_gameInfo.play.getItemTimeCount(); +} + inline void dComIfGp_setItemTimeCount(s32 time) { g_dComIfG_gameInfo.play.setItemTimeCount(time); } +inline void dComIfGp_clearItemTimeCount() { + g_dComIfG_gameInfo.play.clearItemTimeCount(); +} + inline void dComIfGp_setItemTimeMax(s32 time) { g_dComIfG_gameInfo.play.setItemTimeMax(time); } +inline u32 dComIfGp_getItemTimeMax() { + return g_dComIfG_gameInfo.play.getItemTimeMax(); +} + inline void dComIfGp_setMessageCountNumber(s16 num) { g_dComIfG_gameInfo.play.setMessageCountNumber(num); } diff --git a/src/d/actor/d_a_player_main.cpp b/src/d/actor/d_a_player_main.cpp index efd95fc20..9c7769ce1 100644 --- a/src/d/actor/d_a_player_main.cpp +++ b/src/d/actor/d_a_player_main.cpp @@ -1116,7 +1116,7 @@ void daPy_lk_c::setActorPointer() { } /* 80108564-80108634 .text setTalkStatus__9daPy_lk_cFv */ -void daPy_lk_c::setTalkStatus() { +BOOL daPy_lk_c::setTalkStatus() { /* Nonmatching */ } @@ -1217,7 +1217,7 @@ void daPy_lk_c::setSpeedAndAngleAtn() { /* 8010AA90-8010AB84 .text setSpeedAndAngleAtnBack__9daPy_lk_cFv */ void daPy_lk_c::setSpeedAndAngleAtnBack() { f32 f1; - if (m35B0 > 0.05f) { + if (mStickDistance > 0.05f) { if (getDirectionFromCurrentAngle() == 1) { current.angle.y += 0x8000; mVelocity *= -1.0f; @@ -1229,7 +1229,7 @@ void daPy_lk_c::setSpeedAndAngleAtnBack() { daPy_HIO_atnMoveB_c0::m.field_0x0, daPy_HIO_atnMoveB_c0::m.field_0x2 ); - f1 = (daPy_HIO_atnMoveB_c0::m.field_0x8 * m35B0) * cM_scos(current.angle.y - origAngleY); + f1 = (daPy_HIO_atnMoveB_c0::m.field_0x8 * mStickDistance) * cM_scos(current.angle.y - origAngleY); } else { f1 = 0.0f; } @@ -1728,7 +1728,7 @@ void daPy_lk_c::setFrontWallType() { } /* 8010F9AC-8010FEC4 .text changeFrontWallTypeProc__9daPy_lk_cFv */ -void daPy_lk_c::changeFrontWallTypeProc() { +BOOL daPy_lk_c::changeFrontWallTypeProc() { /* Nonmatching */ } @@ -3348,7 +3348,7 @@ BOOL daPy_lk_c::execute() { cXyz oldPos = old.pos; m34DE = shape_angle.y; - m35B4 = m35B0; + m35B4 = mStickDistance; m34EA = m34DC; dComIfGp_setDoStatus(0); diff --git a/src/d/actor/d_a_player_swim.inc b/src/d/actor/d_a_player_swim.inc index fd08d855c..65c911fad 100644 --- a/src/d/actor/d_a_player_swim.inc +++ b/src/d/actor/d_a_player_swim.inc @@ -11,85 +11,606 @@ */ #include "d/actor/d_a_player_main.h" +#include "d/actor/d_a_player_HIO.h" +#include "f_op/f_op_kankyo_mng.h" + +daPy_HIO_swim_c0 l_HIO_swim_c0; +daPy_HIO_wallCatch_c0 l_HIO_wallCatch_c0; +daPy_HIO_turn_c0 l_HIO_turn_c0; /* 8013CC64-8013CF2C .text setSpeedAndAngleSwim__9daPy_lk_cFv */ void daPy_lk_c::setSpeedAndAngleSwim() { - /* Nonmatching */ + float fVar1; + short oldAngleY; + + BOOL bVar3 = false; + + if (mCurProc != daPyProc_SWIM_UP_e) { + if (!mpAttention->Lockon()) { + if (mStickDistance > 0.05f) { + oldAngleY = shape_angle.y; + + if (getDirectionFromShapeAngle() == 1) { + mSwimTailEcallBack[0].onEnd(); + mSwimTailEcallBack[1].onEnd(); + + shape_angle.y = m34E8; + current.angle.y = m34E8; + } + else { + cLib_addCalcAngleS(&shape_angle.y, m34E8, l_HIO_swim_c0.m.field_0x8, l_HIO_swim_c0.m.field_0x4, l_HIO_swim_c0.m.field_0x6); + } + + fVar1 = mStickDistance * 3.0f * cM_scos(shape_angle.y - oldAngleY); + } + else { + fVar1 = 0.0f; + } + + cLib_addCalcAngleS(¤t.angle.y, shape_angle.y, 2, 0x2000, 0x1000); + + mMaxNormalSpeed = l_HIO_swim_c0.m.field_0xC; + } + else { + setShapeAngleToAtnActor(); + + if (mStickDistance > 0.05f) { + oldAngleY = current.angle.y; + + if (getDirectionFromCurrentAngle() == 1) { + mSwimTailEcallBack[0].onEnd(); + mSwimTailEcallBack[1].onEnd(); + + fVar1 = 0.0f; + bVar3 = TRUE; + } + else { + cLib_addCalcAngleS(¤t.angle.y, m34E8, l_HIO_swim_c0.m.field_0x8, l_HIO_swim_c0.m.field_0x4, l_HIO_swim_c0.m.field_0x6); + fVar1 = mStickDistance * 3.0f * cM_scos(current.angle.y - oldAngleY); + } + } + else { + fVar1 = 0.0f; + } + + mMaxNormalSpeed = ((cM_scos(current.angle.y - shape_angle.y) + 1.0f) * 0.25f + 0.5f) * l_HIO_swim_c0.m.field_0xC; + } + } + else { + fVar1 = 0.0f; + mMaxNormalSpeed = l_HIO_swim_c0.m.field_0xC; + } + + setNormalSpeedF(fVar1, l_HIO_swim_c0.m.field_0x18, l_HIO_swim_c0.m.field_0x1C, l_HIO_swim_c0.m.field_0x20); + + if (bVar3 && mVelocity < 5.0f) { + current.angle.y = m34E8; + mVelocity = 0.0f; + } + if (dComIfGp_checkPlayerStatus0(0, daPyStts0_UNK10_e)) { + mVelocity = 0.0f; + } } /* 8013CF2C-8013CFC0 .text checkNextModeSwim__9daPy_lk_cFv */ BOOL daPy_lk_c::checkNextModeSwim() { - /* Nonmatching */ + BOOL res; + + if (mpAttnEntryA && mpAttnEntryA->mType == 7) { //Action_Ship? fopAc_Attn_ACTION_SHIP_e is 0x80 so not sure why Ghidra is saying this + dComIfGp_setDoStatus(0x1C); // Show `Get In` on the A Button? Ghidra says `GetInShip` is the symbol + if (doTrigger()) { + return procShipReady_init(); + } + } + + if (setTalkStatus() && doTrigger()) { + res = fopAcM_orderTalkEvent(this, mpAttnActorA); + } + else { + res = FALSE; + } + return res; } /* 8013CFC0-8013D1B0 .text changeSwimProc__9daPy_lk_cFv */ -void daPy_lk_c::changeSwimProc() { - /* Nonmatching */ +BOOL daPy_lk_c::changeSwimProc() { + float fVar1; + BOOL res; + cXyz local_18; + + if (checkNoResetFlg0(daPyFlg0_UNK80) && !checkModeFlg(ModeFlg_IN_SHIP | ModeFlg_SWIM) && !checkNoControll() && mDemo.getDemoMode() != daPy_demo_c::DEMO_UNK11_e && m35D0 - current.pos.y > l_HIO_swim_c0.m.field_0x24) { + dComIfGp_setItemTimeCount(900); + dComIfGp_setItemTimeMax(1); + g_dComIfG_gameInfo.play.field_0x48c8 = 900; // Some inline? Debug maps make no mention of this function but perhaps it was used earlier? + + offNoResetFlg0(daPyFlg0_EQUIP_HEAVY_BOOTS); + offNoResetFlg1(daPyFlg1_EQUIP_DRAGON_SHIELD); + + endFlameDamageEmitter(); + + offNoResetFlg0(daPyFlg0_UNK100); + + mMaxNormalSpeed = l_HIO_swim_c0.m.field_0xC; + mVelocity *= 0.75f; + + if (mVelocity >= mMaxNormalSpeed) { + mVelocity = mMaxNormalSpeed; + } + + m35C4 = 0.0f; + + setSwimTimerStartStop(); + + if (checkModeFlg(ModeFlg_MIDAIR)) { + current.pos.y += l_HIO_swim_c0.m.field_0x24; + speed.y = mOldSpeed.y * l_HIO_swim_c0.m.field_0x10; + + if (speed.y < l_HIO_swim_c0.m.field_0x14) { + speed.y = l_HIO_swim_c0.m.field_0x14; + } + else if (speed.y > 0.0f) { + speed.y = 0.0f; + } + + float oldSpeedY = mOldSpeed.y * mOldSpeed.y * 0.0004f + 0.2f; + + if (oldSpeedY > 1.0f) { + oldSpeedY = 1.0f; + } + + local_18.x = current.pos.x; + local_18.y = m35D0; + local_18.z = current.pos.z; + fopKyM_createWpillar(&local_18, 1.0f, oldSpeedY, 0); + seStartOnlyReverb(JA_SE_LK_INTO_WATER); + res = procSwimWait_init(0); + } + else { + res = procSwimUp_init(0); + } + } + else { + res = 0; + } + return res; } /* 8013D1B0-8013D2AC .text changeSwimUpProc__9daPy_lk_cFv */ -void daPy_lk_c::changeSwimUpProc() { - /* Nonmatching */ +BOOL daPy_lk_c::changeSwimUpProc() { + if (speed.y < l_HIO_swim_c0.m.field_0x68) { + speed.y += l_HIO_swim_c0.m.field_0x64; + if (speed.y > l_HIO_swim_c0.m.field_0x68) { + speed.y = l_HIO_swim_c0.m.field_0x68; + } + if (speed.y > 0.0f && mEquipItem != daPyItem_NONE_e) { + deleteEquipItem(TRUE); + } + } + if (m35D0 - current.pos.y < 40.1f + l_HIO_swim_c0.m.field_0x28 && speed.y >= 0.0f) { + if (mCurProc == daPyProc_DEMO_DEAD_e) { + onNoResetFlg0(daPyFlg0_UNK100); + current.pos.y = m35D0; + return TRUE; + } + return procSwimUp_init(1); + } + return FALSE; } /* 8013D2AC-8013D314 .text swimOutAfter__9daPy_lk_cFi */ -void daPy_lk_c::swimOutAfter(int) { - /* Nonmatching */ +void daPy_lk_c::swimOutAfter(int param_1) { + onNoResetFlg0(daPyFlg0_UNK100); + m35C4 = 0.0f; + if (param_1) { + seStartOnlyReverb(JA_SE_LK_OUTOF_WATER); + } + dComIfGp_clearItemTimeCount(); + dComIfGp_setItemTimeMax(0); + resetPriTextureAnime(); } /* 8013D314-8013D354 .text checkSwimFallCheck__9daPy_lk_cFv */ BOOL daPy_lk_c::checkSwimFallCheck() { - /* Nonmatching */ + if (!checkNoResetFlg0(daPyFlg0_UNK80) || current.pos.y > m35D0 + 30.1f && !dPa_control_c::isStatus(1)) { + return TRUE; + } + return FALSE; } /* 8013D354-8013D530 .text changeSwimOutProc__9daPy_lk_cFv */ -void daPy_lk_c::changeSwimOutProc() { - /* Nonmatching */ +BOOL daPy_lk_c::changeSwimOutProc() { + cM3dGPla* pcVar1; + + if (mAcch.GetGroundH() != -1e+09f && dComIfG_Bgsp()->ChkPolySafe(mAcch.m_gnd)) { + pcVar1 = dComIfG_Bgsp()->GetTriPla(mAcch.m_gnd); + } + else { + pcVar1 = NULL; + } + + if (checkSwimFallCheck()) { + if (mCurProc == daPyProc_SWIM_MOVE_e && m34B8) { + current.pos.y += m35C4; + } + + swimOutAfter(1); + + return procFall_init(1, l_HIO_wallCatch_c0.m.field_0x54); + } + else { + if (!checkNoResetFlg0(daPyFlg0_UNK80) || pcVar1 && pcVar1->mNormal.y >= 0.5f && m35D0 - mAcch.GetGroundH() < l_HIO_swim_c0.m.field_0x24 - 5.0f) { + current.pos.y = m35D0; + + if (mCurProc == daPyProc_SWIM_MOVE_e && m34B8) { + current.pos.y += m35C4; + } + + swimOutAfter(1); + + return checkNextMode(0); + } + else { + if (dComIfGp_getItemTimeCount() <= 0 && startRestartRoom(5, 0xC9, -1.0f, 0)) { + voiceStart(0x21); + mFrameCtrlUnder[0].mRate = 0.0f; + onNoResetFlg1(daPyFlg1_UNK40000000); + } + return FALSE; + } + } } /* 8013D530-8013D638 .text setSwimMoveAnime__9daPy_lk_cFQ29daPy_lk_c8daPy_ANM */ -void daPy_lk_c::setSwimMoveAnime(daPy_ANM) { +void daPy_lk_c::setSwimMoveAnime(daPy_ANM swimMoveAnm) { /* Nonmatching */ + //float startFrame = mFrameCtrlUnder[0].getFrame(); + float endFrame = mFrameCtrlUnder[0].getEnd(); + setSingleMoveAnime(swimMoveAnm, (std::fabsf(mVelocity) * ((l_HIO_swim_c0.m.field_0x54 - l_HIO_swim_c0.m.field_0x50))) / mMaxNormalSpeed + l_HIO_swim_c0.m.field_0x50 + (float)(getSwimTimerRate() * l_HIO_swim_c0.m.field_0x74), 0.0f, -1, l_HIO_swim_c0.m.field_0x58); // Missing a `* currentFrame` in here? + mFrameCtrlUnder[0].setFrame(endFrame * mFrameCtrlUnder[0].getEnd()); + mAnmRatioUnder[0].getAnmTransform()->setFrame(mFrameCtrlUnder[0].getFrame()); } /* 8013D638-8013D6B8 .text getSwimTimerRate__9daPy_lk_cFv */ -void daPy_lk_c::getSwimTimerRate() { - /* Nonmatching */ +f32 daPy_lk_c::getSwimTimerRate() { + f32 swimTimerRate; + if (dComIfGp_getItemTimeMax() != 0 && dComIfGp_event_getMode() == dEvtMode_NONE_e) { + swimTimerRate = (1.0f - dComIfGp_getItemTimeCount() * 0.0011111111f); + } + else { + if (dComIfGp_getItemTimeCount() <= 0) { + swimTimerRate = 1.0f; + } + else { + swimTimerRate = 0.0f; + } + } + return swimTimerRate; } /* 8013D6B8-8013D814 .text setSwimTimerStartStop__9daPy_lk_cFv */ void daPy_lk_c::setSwimTimerStartStop() { - /* Nonmatching */ + float target = 0.0f; + + if (mAcch.GetGroundH() <= m35D0 - 175.0f) { + dComIfGp_setItemTimeMax(1); + + if (checkNoResetFlg0(daPyFlg0_UNK100)) { + float swimTimerRate = getSwimTimerRate(); + + if (swimTimerRate > 0.5f) { + target = cM_scos(cM_rad2s((1.0f - swimTimerRate) * M_PI)) * -l_HIO_swim_c0.m.field_0x78; + + if (mFrameCtrlUnder->checkPass(0.0f) && mCurProc != daPyProc_SWIM_UP_e) { + if (m3570 && !checkNoResetFlg0(daPyFlg0_UNK4000)) { + voiceStart(0x22); + m3570 = 0; + } + else { + m3570 = 1; + } + } + } + } + } + else { + dComIfGp_setItemTimeCount(900); + dComIfGp_setItemTimeMax(1); + dComIfGp_setItemTimeMax(0); //Fakematch? Seems nonsensical to set it to 1 then immediately to 0, also could be `dComIfGp_stopItemSwimTimer` and `dComIfGp_startItemSwimTimer` inlines mentioned in the debug maps + } + + cLib_chaseF(&m3608, target, 3.0f); } /* 8013D814-8013DA18 .text procSwimUp_init__9daPy_lk_cFi */ -BOOL daPy_lk_c::procSwimUp_init(int) { - /* Nonmatching */ - static JGeometry::TVec3 splash_scale; - static JGeometry::TVec3 ripple_scale; +BOOL daPy_lk_c::procSwimUp_init(int param_1) { + JPABaseEmitter* mEmitter; + + static JGeometry::TVec3 splash_scale(0.4f, 0.4f, 0.4f); + static JGeometry::TVec3 ripple_scale(0.3f, 0.3f, 0.3f); + + commonProcInit(daPyProc_SWIM_UP_e); + + gravity = 0.0f; + speed.y = 0.0f; + + current.pos.y = m35D0; + + setSingleMoveAnime(ANM_SWIMP, l_HIO_swim_c0.m.field_0x2C, l_HIO_swim_c0.m.field_0x30, l_HIO_swim_c0.m.field_0x0, l_HIO_swim_c0.m.field_0x38); + + dComIfGp_setPlayerStatus0(0, daPyStts0_SWIM_e); + + m35C4 = l_HIO_swim_c0.m.field_0x3C; + + onNoResetFlg0(daPyFlg0_UNK100); + + if (param_1) { + mEmitter = dComIfGp_particle_setP1(dPa_name::ID_COMMON_0040, ¤t.pos); + + if (mEmitter) { + mEmitter->setRate(15.0f); + mEmitter->setGlobalDynamicsScale(splash_scale); + mEmitter->setGlobalParticleScale(splash_scale); + } + + mEmitter = dComIfGp_particle_setShipTail(dPa_name::ID_COMMON_003D, ¤t.pos, NULL, NULL, 0xFF, &dPa_control_c::mSingleRippleEcallBack); + + if (mEmitter) { + mEmitter->setGlobalDynamicsScale(ripple_scale); + mEmitter->setGlobalParticleScale(ripple_scale); + } + } + m3570 = 0; + return TRUE; } /* 8013DA18-8013DB24 .text procSwimUp__9daPy_lk_cFv */ BOOL daPy_lk_c::procSwimUp() { - /* Nonmatching */ + int iVar1; + + J3DFrameCtrl* mFrameCtrl = mFrameCtrlUnder; + + setSpeedAndAngleSwim(); + + if (!changeSwimOutProc()) { + if (mFrameCtrl->getRate() < 0.01f) { + procSwimWait_init(0); + } + else { + if (mFrameCtrl->getFrame() > l_HIO_swim_c0.m.field_0x34) { + if (mStickDistance > 0.05f) { + procSwimMove_init(0); + } + } + else { + if (mFrameCtrl->checkPass(4.0f)) { + voiceStart(0x1A); + seStartOnlyReverb(JA_SE_LK_WALK_IN_WATER); + seStartOnlyReverb(JA_SE_LK_SWIM); + } + else { + m35C4 = l_HIO_swim_c0.m.field_0x3C; + current.pos.y = m35D0; + } + } + } + } + setSwimTimerStartStop(); + return TRUE; } /* 8013DB24-8013DCDC .text procSwimWait_init__9daPy_lk_cFi */ -BOOL daPy_lk_c::procSwimWait_init(int) { - /* Nonmatching */ +BOOL daPy_lk_c::procSwimWait_init(int param_1) { + float fVar2; + u32 uVar3; + + J3DFrameCtrl* mFrameCtrl = mFrameCtrlUnder; + + commonProcInit(daPyProc_SWIM_WAIT_e); + + if (param_1) { + fVar2 = mFrameCtrl->getFrame() / (float)mFrameCtrl->getEnd(); + uVar3 = cM_rad2s(fVar2 * M_PI); + mVelocity = speedF * (1.0f - l_HIO_swim_c0.m.field_0x60) + speedF * std::fabsf(cM_scos(uVar3)) * l_HIO_swim_c0.m.field_0x60; + } + else { + fVar2 = 0.0f; + } + + gravity = 0.0f; + setSingleMoveAnime(ANM_SWIMWAIT, (float)(getSwimTimerRate() * l_HIO_swim_c0.m.field_0x70) + l_HIO_swim_c0.m.field_0x40, 0.0f, -1, l_HIO_swim_c0.m.field_0x44); + mFrameCtrl->setFrame(fVar2 * mFrameCtrl->getEnd()); + mAnmRatioUnder[0].getAnmTransform()->setFrame(mFrameCtrl->getFrame()); + dComIfGp_setPlayerStatus0(0, daPyStts0_SWIM_e); + + if (checkNoResetFlg0(daPyFlg0_UNK100)) { + if (mEquipItem != daPyItem_NONE_e) { + deleteEquipItem(TRUE); + } + current.pos.y = m35D0; + speed.y = 0.0f; + } + + m35C4 = l_HIO_swim_c0.m.field_0x48; + m34D4 = 0; + m3570 = 0; + return TRUE; } /* 8013DCDC-8013DE8C .text procSwimWait__9daPy_lk_cFv */ BOOL daPy_lk_c::procSwimWait() { - /* Nonmatching */ + fopAc_ac_c* talkEventPartner; + short targetAngleY; + + setSpeedAndAngleSwim(); + m34D4 += (short)((cM_rndF(0.3f) + 0.85f) * l_HIO_swim_c0.m.field_0x2); + m35C4 = cM_ssin(m34D4) * l_HIO_swim_c0.m.field_0x4C + l_HIO_swim_c0.m.field_0x48; + + if (changeSwimOutProc()) { + return TRUE; + } + else { + if (!checkNoResetFlg0(daPyFlg0_UNK100)) { + if (changeSwimUpProc()) { + return TRUE; + } + } + else { + current.pos.y = m35D0; + } + if (checkNextModeSwim()) { + return TRUE; + } + else { + if (dComIfGp_checkPlayerStatus0(0, daPyStts0_UNK10_e)) { + talkEventPartner = fopAcM_getTalkEventPartner(this); + if (talkEventPartner) { + targetAngleY = cLib_targetAngleY(¤t.pos, &talkEventPartner->eyePos); + cLib_addCalcAngleS(&shape_angle.y, targetAngleY, l_HIO_turn_c0.m.field_0x6, l_HIO_turn_c0.m.field_0x8, l_HIO_turn_c0.m.field_0xA); + current.angle.y = shape_angle.y; + } + } + + mFrameCtrlUnder[0].setRate((float)(getSwimTimerRate() * l_HIO_swim_c0.m.field_0x70) + l_HIO_swim_c0.m.field_0x40); + + if (mStickDistance > 0.05f) { + procSwimMove_init(1); + } + + setSwimTimerStartStop(); + } + } + return TRUE; } /* 8013DE8C-8013DF60 .text procSwimMove_init__9daPy_lk_cFi */ -BOOL daPy_lk_c::procSwimMove_init(int) { - /* Nonmatching */ +BOOL daPy_lk_c::procSwimMove_init(int param_1) { + commonProcInit(daPyProc_SWIM_MOVE_e); + + if (param_1 == 0) { + mFrameCtrlUnder[0].setFrame(0.0f); + } + + gravity = 0.0f; + + setSwimMoveAnime(ANM_SWIMING); + + m34B8 = 0; + + if (checkNoResetFlg0(daPyFlg0_UNK100)) { + if (mEquipItem != daPyItem_NONE_e) { + deleteEquipItem(TRUE); + } + + current.pos.y = m35D0; + speed.y = 0.0f; + + setSwimTail(); + } + + dComIfGp_setPlayerStatus0(0, daPyStts0_SWIM_e); + + m35C4 = l_HIO_swim_c0.m.field_0x5C; + m3570 = 0; + + return TRUE; } /* 8013DF60-8013E250 .text procSwimMove__9daPy_lk_cFv */ BOOL daPy_lk_c::procSwimMove() { - /* Nonmatching */ + int iVar1; + daPy_ANM anm; + + setSpeedAndAngleSwim(); + + J3DFrameCtrl* mFrameCtrl = mFrameCtrlUnder; + + if (!mpAttention->Lockon()) { + iVar1 = 0; + } + else { + if (mStickDistance > 0.05f) { + iVar1 = getDirectionFromShapeAngle(); + } + else { + iVar1 = 0; + } + } + + if (m34B8 != iVar1) { + m34B8 = iVar1; + float fVar1 = m35C4; + + if (m34B8 == 0) { + anm = ANM_SWIMING; + m35C4 = l_HIO_swim_c0.m.field_0x5C; + } + else { + m35C4 = -80.0f; + + if (m34B8 == 2) { + anm = ANM_ATNDLS; + } + else if (m34B8 == 3) { + anm = ANM_ATNDRS; + } + else { + anm = ANM_ATNWB; + } + } + + m_old_fdata->getOldFrameTransInfo(0)->mTranslate.y -= m35C4 - fVar1; + setSwimMoveAnime(anm); + + if (m34B8) { + setTextureAnime(3, 0); + onModeFlg(ModeFlg_00000100); + offModeFlg(ModeFlg_00000400); + mpSeAnmFrameCtrl = NULL; + } + else { + offModeFlg(ModeFlg_00000100); + onModeFlg(ModeFlg_00000400); + } + } + else { + mFrameCtrl[0].setRate((std::fabsf(mVelocity) * (l_HIO_swim_c0.m.field_0x54 - l_HIO_swim_c0.m.field_0x50)) / mMaxNormalSpeed + l_HIO_swim_c0.m.field_0x50 + (float)(getSwimTimerRate() * l_HIO_swim_c0.m.field_0x74)); + } + + if (m34B8 == 1) { + mFrameCtrl[0].setRate(mFrameCtrl[0].getRate() * 0.5f); + } + + if (changeSwimOutProc()) { + return TRUE; + } + + if (!checkNoResetFlg0(daPyFlg0_UNK100)) { + if (changeSwimUpProc()) { + return TRUE; + } + } + else { + current.pos.y = m35D0; + setSwimTail(); + } + + if (checkNextModeSwim()) { + return TRUE; + } + + if (changeFrontWallTypeProc()) { + swimOutAfter(1); + return TRUE; + } + + if (mStickDistance <= 0.05f) { + procSwimWait_init(1); + } + else if ((!m34B8 && mFrameCtrl->checkPass(20.0f)) || (m34B8 && mFrameCtrl->checkPass(0.0f))) { + seStartOnlyReverb(JA_SE_LK_SWIM); + } + + setSwimTimerStartStop(); + + return TRUE; } diff --git a/src/d/actor/d_a_player_sword.inc b/src/d/actor/d_a_player_sword.inc index 87bf9542e..1b5aff51e 100644 --- a/src/d/actor/d_a_player_sword.inc +++ b/src/d/actor/d_a_player_sword.inc @@ -246,7 +246,7 @@ int daPy_lk_c::getCutDirection(){ int iVar1; s16 sVar2; - if (m35B0 <= 0.05f) { + if (mStickDistance <= 0.05f) { iVar1 = 4; } else { diff --git a/src/d/actor/d_a_player_tact.inc b/src/d/actor/d_a_player_tact.inc index 4b93d32ee..c88165f44 100644 --- a/src/d/actor/d_a_player_tact.inc +++ b/src/d/actor/d_a_player_tact.inc @@ -366,7 +366,7 @@ BOOL daPy_lk_c::procTactWait() { if (m3570 != -5) { rightDir = mDoAud_getTactDirection(1, m34D4); leftDir = mDoAud_getTactDirection(0, m34D6); - mDoAud_tact_setVolume(m35B0 * cM_scos(m34DC)); + mDoAud_tact_setVolume(mStickDistance * cM_scos(m34DC)); } else { rightDir = m34D4; leftDir = m34D6; diff --git a/src/d/d_com_inf_game.cpp b/src/d/d_com_inf_game.cpp index 772084363..089fc9d1f 100644 --- a/src/d/d_com_inf_game.cpp +++ b/src/d/d_com_inf_game.cpp @@ -99,7 +99,7 @@ void dComIfG_play_c::itemInit() { mItemTimer = 0; mItemNowLife = 0; mItemNowRupee = 0; - field_0x4928 = 0; + mItemTimeMax = 0; field_0x4929 = 0; mMesgStatus = 0; mbCamOverrideFarPlane = 0;