From 48e936269c5c3c843e1cf0f7f67ab132cce883d5 Mon Sep 17 00:00:00 2001 From: LagoLunatic Date: Wed, 10 Jan 2024 19:21:12 -0500 Subject: [PATCH] daPy_lk_c::changeDamageProc --- include/d/actor/d_a_player.h | 3 + include/d/actor/d_a_player_main.h | 22 ++- include/d/actor/d_a_ship.h | 6 +- include/m_Do/m_Do_audio.h | 8 +- src/d/actor/d_a_player_food.inc | 6 +- src/d/actor/d_a_player_main.cpp | 261 ++++++++++++++++++++++++++++-- src/d/actor/d_a_player_ship.inc | 2 +- src/d/actor/d_a_player_tact.inc | 2 +- 8 files changed, 279 insertions(+), 31 deletions(-) diff --git a/include/d/actor/d_a_player.h b/include/d/actor/d_a_player.h index 122008517..fe1caba62 100644 --- a/include/d/actor/d_a_player.h +++ b/include/d/actor/d_a_player.h @@ -114,6 +114,7 @@ public: daPyFlg0_SCOPE_CANCEL = 0x00080000, daPyFlg0_PHOTO_BOX_CANCEL = 0x00080000, // Same as scope cancel daPyFlg0_UNK200000 = 0x00200000, + daPyFlg0_UNK1000000 = 0x01000000, daPyFlg0_EQUIP_HEAVY_BOOTS = 0x02000000, daPyFlg0_NO_DRAW = 0x08000000, daPyFlg0_HEAVY_STATE = 0x40000000, @@ -122,6 +123,7 @@ public: enum daPy_FLG1 { daPyFlg1_EQUIP_DRAGON_SHIELD = 0x00000001, daPyFlg1_NPC_CALL_COMMAND = 0x00000002, + daPyFlg1_UNK4 = 0x00000004, daPyFlg1_CASUAL_CLOTHES = 0x00000008, daPyFlg1_FORCE_VOMIT_JUMP = 0x00000010, daPyFlg1_NPC_NOT_CHANGE = 0x00000040, @@ -156,6 +158,7 @@ public: daPyRFlg0_GRAB_UP_START = 0x00008000, daPyRFlg0_ATTENTION_LOCK = 0x00010000, daPyRFlg0_HAMMER_QUAKE = 0x00020000, + daPyRFlg0_UNK80000 = 0x00080000, daPyRFlg0_POISON_CURSE = 0x00100000, daPyRFlg0_GRAB_PUT_START = 0x00400000, daPyRFlg0_TACT_USE = 0x01000000, diff --git a/include/d/actor/d_a_player_main.h b/include/d/actor/d_a_player_main.h index f4be3c463..9fcffbf7f 100644 --- a/include/d/actor/d_a_player_main.h +++ b/include/d/actor/d_a_player_main.h @@ -169,7 +169,15 @@ public: static void setType(u16 type) { m_type = type; } static bool checkCurse() { return m_type == 1; } + static bool checkElec() { return m_type == 2; } + static void checkFlame() {} + static void decTimer() {} + static void getTimer() {} + static void setCurse(s16) {} + static void setElec(s16) {} + static void setFlame(s16) {} + static s16 m_timer; static u16 m_type; }; // Size: 0x0C @@ -1562,7 +1570,7 @@ public: BOOL checkSingleItemEquipAnime() const; BOOL checkItemEquipAnime() const; BOOL checkEquipAnime() const; - void deleteEquipItem(int); + void deleteEquipItem(BOOL); void setFallVoice(); void keepItemData(); void returnKeepItemData(); @@ -1587,17 +1595,17 @@ public: void changeSlideProc(); void changeWaitProc(); void changeLandProc(f32); - void setDamagePoint(f32); + BOOL setDamagePoint(f32); BOOL checkNormalDamage(int); void setDashDamage(); BOOL checkAtHitEnemy(dCcD_GObjInf*); BOOL checkElecReturnDamage(dCcD_GObjInf*, cXyz*); - BOOL checkWallAtributeDamage(dBgS_AcchCir*); - void changeDamageProc(); + s32 checkWallAtributeDamage(dBgS_AcchCir*); + BOOL changeDamageProc(); void changeAutoJumpProc(); void changeDemoProc(); void changeDeadProc(); - void getDamageVec(dCcD_GObjInf*); + cXyz* getDamageVec(dCcD_GObjInf*); void setOldRootQuaternion(s16, s16, s16); BOOL checkRestHPAnime(); BOOL checkHeavyStateOn(); @@ -2338,6 +2346,7 @@ public: mActivePlayerBombs--; } } + bool checkGuardSlip() const { return mCurProc == PROC_GUARD_SLIP_e || mCurProc == PROC_CROUCH_DEFENSE_SLIP_e; } int getStartRoomNo() { return fopAcM_GetParam(this) & 0x3F; } int getStartMode() { return (fopAcM_GetParam(this) >> 0x0C) & 0xF; } @@ -2364,7 +2373,6 @@ public: void checkDashDamageAnime() const {} void checkDoubleItemEquipAnime() const {} void checkFaceTypeNot() const {} - void checkGuardSlip() const {} void checkHookshotReadyAnime() const {} void checkIsland() const {} void checkMirrorShieldEquip() const {} @@ -2692,7 +2700,7 @@ public: /* 0x3578 */ int m3578; /* 0x357C */ u8 m357C[0x3580 - 0x357C]; /* 0x3580 */ int m3580; - /* 0x3584 */ int mCurrentGroundAttributeCode; + /* 0x3584 */ int mCurrAttributeCode; /* 0x3588 */ u8 m3588[0x358C - 0x3588]; /* 0x358C */ int mStaffIdx; /* 0x3590 */ int mEventIdx; diff --git a/include/d/actor/d_a_ship.h b/include/d/actor/d_a_ship.h index cc42bff0b..1022d10c3 100644 --- a/include/d/actor/d_a_ship.h +++ b/include/d/actor/d_a_ship.h @@ -18,6 +18,8 @@ public: bool checkStateFlg(daSHIP_SFLG flag) const { return m0358 & flag; } bool checkHeadNoDraw() const { return checkStateFlg(daSFLG_HEAD_NO_DRAW_e); } + bool unknown_inline_TODO() const { return m041C || m0424; } + void checkCraneMode() const {} void checkCraneUpEnd() const {} void checkForceMove() {} @@ -236,7 +238,9 @@ public: /* 0x0414 */ daGrid_c* mpGrid; /* 0x0418 */ int m0418; /* 0x041C */ fopAc_ac_c* m041C; - /* 0x0420 */ u8 m0420[0x042C - 0x0420]; + /* 0x0420 */ u32 m0420; + /* 0x0424 */ fopAc_ac_c* m0424; + /* 0x0428 */ u8 m0428[0x042C - 0x0428]; /* 0x042C */ u32 m042C; /* 0x0430 */ u8 m0430[0x0434 - 0x0430]; /* 0x0434 */ cXyz* m0434; diff --git a/include/m_Do/m_Do_audio.h b/include/m_Do/m_Do_audio.h index 03e50138f..23421b14c 100644 --- a/include/m_Do/m_Do_audio.h +++ b/include/m_Do/m_Do_audio.h @@ -137,12 +137,12 @@ inline u8 mDoAud_getLinkVoiceVowel(u32 param_1) { return mDoAud_zelAudio_c::getInterface()->getLinkVoiceVowel(param_1); } -inline void mDoAud_linkVoiceStart(u32 i_sfxID, Vec* i_sePos, u8 param_3, s8 param_4) { - mDoAud_zelAudio_c::getInterface()->linkVoiceStart(i_sfxID, i_sePos, param_3, param_4); +inline void mDoAud_linkVoiceStart(u32 param_0, Vec* i_sePos, u8 param_3, s8 param_4) { + mDoAud_zelAudio_c::getInterface()->linkVoiceStart(param_0, i_sePos, param_3, param_4); } -inline void mDoAud_monsSeStart(u32 param_0, Vec* param_1, u32 param_2, u32 param_3, s8 i_reverb) { - mDoAud_zelAudio_c::getInterface()->monsSeStart(param_0, param_1, param_2, param_3, i_reverb); +inline void mDoAud_monsSeStart(u32 sfxID, Vec* param_1, u32 param_2, u32 param_3, s8 i_reverb) { + mDoAud_zelAudio_c::getInterface()->monsSeStart(sfxID, param_1, param_2, param_3, i_reverb); } inline void mDoAud_onEnemyDamage() { diff --git a/src/d/actor/d_a_player_food.inc b/src/d/actor/d_a_player_food.inc index 5588a185c..0e531abcf 100644 --- a/src/d/actor/d_a_player_food.inc +++ b/src/d/actor/d_a_player_food.inc @@ -47,7 +47,7 @@ BOOL daPy_lk_c::procFoodThrow_init() { mDemo.setSpecialDemoType(); } } else { - deleteEquipItem(0); + deleteEquipItem(FALSE); } int temp = checkShipRideUseItem(1); @@ -162,7 +162,7 @@ BOOL daPy_lk_c::procFoodSet_init() { } } - deleteEquipItem(0); + deleteEquipItem(FALSE); } else { setHyoiModel(); } @@ -211,7 +211,7 @@ BOOL daPy_lk_c::procFoodSet() { dComIfGp_evmng_cutEnd(mStaffIdx); } else if (m34D0 < 0) { dComIfGp_event_reset(); - deleteEquipItem(0); + deleteEquipItem(FALSE); u32 playerPID = fopAcM_GetID(this); dCam_getBody()->EndEventCamera(playerPID); endDemoMode(); diff --git a/src/d/actor/d_a_player_main.cpp b/src/d/actor/d_a_player_main.cpp index e21ee0590..af6341a38 100644 --- a/src/d/actor/d_a_player_main.cpp +++ b/src/d/actor/d_a_player_main.cpp @@ -3890,9 +3890,9 @@ BOOL daPy_lk_c::checkEquipAnime() const { } /* 8010C570-8010C71C .text deleteEquipItem__9daPy_lk_cFi */ -void daPy_lk_c::deleteEquipItem(int param_1) { +void daPy_lk_c::deleteEquipItem(BOOL param_1) { fopAc_ac_c* equipActor = mActorKeepEquip.getActor(); - if (param_1 != 0 && (mHeldItemType != 0x100 && mHeldItemType != 0x101)) { + if (param_1 && (mHeldItemType != 0x100 && mHeldItemType != 0x101)) { if (mHeldItemType == 0x103) { seStartOnlyReverb(JA_SE_LK_SW_PUTIN_S); } else { @@ -3949,7 +3949,7 @@ void daPy_lk_c::setFallVoice() { void daPy_lk_c::keepItemData() { mKeepItemType = mHeldItemType; - deleteEquipItem(0); + deleteEquipItem(FALSE); if (mKeepItemType == 0x101) { mKeepItemType = 0x100; @@ -3965,7 +3965,7 @@ void daPy_lk_c::returnKeepItemData() { return; } - deleteEquipItem(0); + deleteEquipItem(FALSE); mHeldItemType = mKeepItemType; mKeepItemType = 0x100; @@ -4093,8 +4093,20 @@ void daPy_lk_c::changeLandProc(f32) { } /* 8011029C-80110338 .text setDamagePoint__9daPy_lk_cFf */ -void daPy_lk_c::setDamagePoint(f32) { - /* Nonmatching */ +BOOL daPy_lk_c::setDamagePoint(f32 amount) { + if (!checkNoDamageMode()) { + dComIfGp_setItemLifeCount(amount); + if (amount < 0.0f) { + offNoResetFlg1(daPyFlg1_UNK8000); + if (dComIfGs_getSelectEquip(0) != MASTER_SWORD_EX) { + offNoResetFlg1(daPyFlg1_UNK200000); + } + } + return TRUE; + } else { + seStartMapInfo(JA_SE_LK_MGC_SHIELD_DEF); + return FALSE; + } } /* 80110338-80110448 .text checkNormalDamage__9daPy_lk_cFi */ @@ -4118,13 +4130,234 @@ BOOL daPy_lk_c::checkElecReturnDamage(dCcD_GObjInf*, cXyz*) { } /* 801105D8-80110654 .text checkWallAtributeDamage__9daPy_lk_cFP12dBgS_AcchCir */ -BOOL daPy_lk_c::checkWallAtributeDamage(dBgS_AcchCir*) { +s32 daPy_lk_c::checkWallAtributeDamage(dBgS_AcchCir*) { /* Nonmatching */ } /* 80110654-80110F3C .text changeDamageProc__9daPy_lk_cFv */ -void daPy_lk_c::changeDamageProc() { - /* Nonmatching */ +BOOL daPy_lk_c::changeDamageProc() { + if (!checkModeFlg(0x8) && mDamageWaitTimer > 0) { + mDamageWaitTimer--; + if (mDamageWaitTimer == 0) { + if (m_anm_heap_upper[2].mIdx == LKANM_BCK_DAMDASH) { + resetActAnimeUpper(UPPER_UNK2, daPy_HIO_basic_c0::m.field_0xC); + } else if (checkModeFlg(0x40000)) { + resetPriTextureAnime(); + } + } + } + + if (checkNoResetFlg0(daPyFlg0_UNK1000000)) { + offNoResetFlg0(daPyFlg0_UNK1000000); + changePlayer(this); + return procLargeDamage_init(-5, 1, 0, 0); + } + + daShip_c* ship = (daShip_c*)dComIfGp_getShipActor(); + if (dComIfGp_event_runCheck() || + mDemo.getDemoType() != 0 || + checkNoControll() || + mCurProc == PROC_SHIP_READY_e || + ( + dComIfGp_checkPlayerStatus0(0, daPyStts0_SHIP_RIDE_e) && + ship && ship->unknown_inline_TODO() + ) + ) { + offNoResetFlg0(daPyFlg0_SHIP_DROP); + return FALSE; + } + + BOOL r30; + int r29; + s32 r28 = dBgS_Attr_NORMAL_e; + + if (checkNoResetFlg1(daPyFlg1_UNK4) || ( + mAcch.ChkGroundHit() && + !checkModeFlg(0x20) && + mCurrAttributeCode == dBgS_Attr_FREEZE_e + )) { + changePlayer(this); + return dProcFreezeDamage_init(); + } else if ( + dComIfGp_checkPlayerStatus0(0, daPyStts0_SHIP_RIDE_e) && + checkNoResetFlg0(daPyFlg0_SHIP_DROP) + ) { + offNoResetFlg0(daPyFlg0_SHIP_DROP); + changePlayer(this); + return procLargeDamage_init(-2, 1, 0, 0); + } else if (!checkModeFlg(0x8) && mDamageWaitTimer == 0) { + if (mAcch.ChkGroundHit() && ( + mCurrAttributeCode == dBgS_Attr_DAMAGE_e || + mCurrAttributeCode == dBgS_Attr_ELECTRICITY_e + )) { + r28 = mCurrAttributeCode; + } else { + for (int i = 0; r28 == dBgS_Attr_NORMAL_e && i < (s32)ARRAY_SIZE(mAcchCir); i++) { + r28 = checkWallAtributeDamage(&mAcchCir[i]); + } + } + } + + if (r28 != dBgS_Attr_NORMAL_e) { + r30 = TRUE; + r29 = 1; + } else { + r30 = FALSE; + r29 = mStts.GetDmg(); + if (mCyl.ChkTgHit() && mCyl.GetTgHitGObj() && mCyl.GetTgHitGObj()->GetAtType() == 0x20) { + r29 = 1; + } + } + + dCcG_At_Spl r27; + if (mCyl.ChkTgHit()) { + dCcD_GObjInf* gobj = mCyl.GetTgHitGObj(); + if (gobj) { + r27 = gobj->GetAtSpl(); + } else { + r27 = mStts.GetAtSpl(); + } + } else { + r27 = (dCcG_At_Spl)0; + } + + if (checkModeFlg(0x4000000)) { + if (r30 || mCyl.ChkTgHit() && !checkSuccessGuard(r27)) { + setDamagePoint(-r29); + mDamageWaitTimer = daPy_HIO_dam_c0::m.field_0x2; + + voiceStart(2); + + seStartOnlyReverb(JA_SE_LK_DAMAGE_NORMAL); + changePlayer(this); + if (mCyl.ChkTgHit() && !checkSuccessGuard(r27)) { + setDamageEmitter(); + } else if (r28 == dBgS_Attr_ELECTRICITY_e) { + setDamageElecEmitter(); + } + if (daPy_dmEcallBack_c::checkElec()) { + if (checkModeFlg(0x800)) { + return procElecDamage_init(NULL); + } else if (checkModeFlg(0x40000)) { + return procElecDamage_init(NULL); + } + } + if (checkModeFlg(0x40000) && !checkNoDamageMode()) { + setPriTextureAnime(0x40, 0); + } + } + } else { + if (mAtCps[0].GetAtType() != 0x80 && mAtCps[0].GetAtType() != 0x100) { + cXyz sp8; + if (checkElecReturnDamage(&mAtCps[0], &sp8) || + checkElecReturnDamage(&mAtCps[1], &sp8) || + checkElecReturnDamage(&mAtCps[2], &sp8) + ) { + setDamagePoint(-1.0f); + onResetFlg0(daPyRFlg0_UNK80000); + setDamageElecEmitter(); + changePlayer(this); + + if (procElecDamage_init(&sp8)) { + return TRUE; + } + + if (daPy_lk_c::checkPlayerFly()) { + return procLargeDamage_init(-1, 1, 0, 0); + } else { + return procDamage_init(); + } + } + } + + if (mCyl.ChkTgHit() && !checkGuardSlip() && + (!dComIfGp_checkPlayerStatus0(0, daPyStts0_SHIP_RIDE_e) || !checkNoDamageMode()) + ) { + freeRopeItem(); + freeHookshotItem(); + + if (!checkSuccessGuard(r27)) { + if (mHeldItemType == 0x101) { + deleteEquipItem(FALSE); + } + + setDamageEmitter(); + changePlayer(this); + setDamagePoint(-r29); + fopAc_ac_c* grabActor = mActorKeepGrab.getActor(); + if (daPy_dmEcallBack_c::checkElec()) { + if (procElecDamage_init(NULL)) { + return TRUE; + } + } + + if (checkModeFlg(0x2000)) { + return procLargeDamage_init(-9, 1, 0, 0); + } + + if (checkGrabWear() && + mCyl.GetTgHitAc() && fopAcM_GetName(mCyl.GetTgHitAc()) == PROC_NZ && + grabActor) + { + cXyz* r3 = getDamageVec(&mCyl); + grabActor->shape_angle.y = cM_atan2s(r3->x, r3->z); + grabActor->shape_angle.x = 0x2000; + return procLargeDamage_init(-4, 1, 0, 0); + } + if (r27 == 7 || r27 == 2 || r27 == 10) { + return procLargeDamage_init(-6, 0, 0, 0); + } + if (daPy_lk_c::checkPlayerFly() || r27 == 6 || r27 == 1 || r27 == 9) { + return procLargeDamage_init(-1, 1, 0, 0); + } + if (checkNormalDamage(r29)) { + return procDamage_init(); + } + setDashDamage(); + } else { + u8 hitSe = mCyl.GetTgHitObjSe(); + if (hitSe == 6) { + seStartOnlyReverb(JA_SE_OBJ_COL_N_BDY_MPLT); + } else if (hitSe == 2 || hitSe == 5) { + seStartOnlyReverb(JA_SE_OBJ_COL_SWS_NMTLP); + } else if (hitSe == 4) { + seStartOnlyReverb(JA_SE_OBJ_COL_NWHP_NMTL); + } else { + seStartOnlyReverb(JA_SE_OBJ_COL_SWM_NSWL); + } + + if (mCurProc == PROC_CROUCH_DEFENSE_e) { + return procCrouchDefenseSlip_init(); + } else { + return procGuardSlip_init(); + } + } + } else if (r30) { + changePlayer(this); + if (mHeldItemType == 0x101) { + deleteEquipItem(FALSE); + } + setDamagePoint(-r29); + + if (r28 == dBgS_Attr_ELECTRICITY_e) { + setDamageElecEmitter(); + if (procElecDamage_init(NULL)) { + return TRUE; + } + } + + if (checkNormalDamage(r29)) { + return procPolyDamage_init(); + } + + setDashDamage(); + } + } + + mStts.ClrTg(); + mStts.ClrAt(); + + return FALSE; } /* 80110F3C-80111424 .text changeAutoJumpProc__9daPy_lk_cFv */ @@ -4143,7 +4376,7 @@ void daPy_lk_c::changeDeadProc() { } /* 80111B80-80111D64 .text getDamageVec__9daPy_lk_cFP12dCcD_GObjInf */ -void daPy_lk_c::getDamageVec(dCcD_GObjInf*) { +cXyz* daPy_lk_c::getDamageVec(dCcD_GObjInf*) { /* Nonmatching */ } @@ -4249,7 +4482,7 @@ BOOL daPy_lk_c::commonProcInit(daPy_lk_c::daPy_PROC proc) { } else if (mCurProc == PROC_FAN_SWING_e) { setSmallFanModel(); } else if (mCurProc == PROC_FAN_GLIDE_e) { - deleteEquipItem(0); + deleteEquipItem(FALSE); mMaxFallSpeed = daPy_HIO_autoJump_c0::m.field_0x10; setSmallFanModel(); mHeldItemType = DEKU_LEAF; @@ -4273,7 +4506,7 @@ BOOL daPy_lk_c::commonProcInit(daPy_lk_c::daPy_PROC proc) { item->dead(); } } else if (mCurProc == DPROC_LETTER_READ_e) { - deleteEquipItem(0); + deleteEquipItem(FALSE); } else if (mCurProc == PROC_CUT_ROLL_END_e) { if (m33A8.getEmitter()) { m33A8.getEmitter()->setGlobalAlpha(0); @@ -5211,8 +5444,8 @@ BOOL daPy_lk_c::startRestartRoom(u32 param_1, int eventInfoIdx, f32 param_3, int } /* 80120BBC-80120BE0 .text checkSuccessGuard__9daPy_lk_cFi */ -BOOL daPy_lk_c::checkSuccessGuard(int param_1) { - if (!mCyl.ChkTgShieldHit() || param_1 >= 8) { +BOOL daPy_lk_c::checkSuccessGuard(int atSpl) { + if (!mCyl.ChkTgShieldHit() || atSpl >= 8) { return FALSE; } return TRUE; diff --git a/src/d/actor/d_a_player_ship.inc b/src/d/actor/d_a_player_ship.inc index b83b006f1..07258e77d 100644 --- a/src/d/actor/d_a_player_ship.inc +++ b/src/d/actor/d_a_player_ship.inc @@ -38,7 +38,7 @@ void daPy_lk_c::setShipRideArmAngle(int, J3DTransformInfo*) { int daPy_lk_c::checkShipRideUseItem(int param_1) { if (dComIfGp_checkPlayerStatus0(0, daPyStts0_SHIP_RIDE_e) && dComIfGp_getShipActor() != NULL) { if (param_1 != 0) { - deleteEquipItem(0); + deleteEquipItem(FALSE); } if (checkShipNotNormalMode()) { return 2; diff --git a/src/d/actor/d_a_player_tact.inc b/src/d/actor/d_a_player_tact.inc index f1c9769ce..581fe6d3b 100644 --- a/src/d/actor/d_a_player_tact.inc +++ b/src/d/actor/d_a_player_tact.inc @@ -33,7 +33,7 @@ void daPy_lk_c::setTactModel() { if (mHeldItemType == WIND_TACT) return; - deleteEquipItem(0); + deleteEquipItem(FALSE); mHeldItemType = WIND_TACT; JKRHeap* oldHeap = setItemHeap();