From 4c7ea018516a092d8e45cdc513b572e8b40ad898 Mon Sep 17 00:00:00 2001 From: LagoLunatic Date: Tue, 9 Jan 2024 18:44:00 -0500 Subject: [PATCH] d_a_agb 99% --- configure.py | 2 +- include/d/actor/d_a_agb.h | 56 +++-- include/d/actor/d_a_player_main.h | 13 +- include/d/d_com_inf_game.h | 1 + include/d/d_kankyo_wether.h | 1 + include/d/d_stage.h | 2 + include/f_op/f_op_actor_mng.h | 5 + src/d/actor/d_a_agb.cpp | 368 +++++++++++++++++++++++++++--- src/d/actor/d_a_agbsw0.cpp | 4 +- src/d/actor/d_a_bomb3.inc | 9 +- src/d/d_stage.cpp | 8 +- 11 files changed, 399 insertions(+), 70 deletions(-) diff --git a/configure.py b/configure.py index 2e2daa6d8..ca1aebb28 100644 --- a/configure.py +++ b/configure.py @@ -419,7 +419,7 @@ config.libs = [ Object(NonMatching, "d/d_salvage.cpp"), Object(Matching, "d/d_snap.cpp"), Object(Matching, "d/d_point_wind.cpp"), - Object(NonMatching, "d/actor/d_a_agb.cpp"), + Object(NonMatching, "d/actor/d_a_agb.cpp", extra_cflags=['-pragma "nosyminline on"']), Object(Matching, "d/actor/d_a_arrow.cpp", extra_cflags=["-sym off"]), Object(Matching, "d/actor/d_a_bg.cpp"), Object(NonMatching, "d/actor/d_a_bomb.cpp"), diff --git a/include/d/actor/d_a_agb.h b/include/d/actor/d_a_agb.h index 7ed6df21b..349bfa00f 100644 --- a/include/d/actor/d_a_agb.h +++ b/include/d/actor/d_a_agb.h @@ -43,7 +43,9 @@ public: class daAgb_c : public fopAc_ac_c { public: - // daAgb_BmRp_c struct? + struct daAgb_BmRp_c { + // TODO + }; void NameConv(); int uploadInitCheck(); @@ -77,8 +79,6 @@ public: void modeDelete(); int createHeap(); - daAgb_c(); - inline void modeProcCall(); BOOL isMsgSend() { return mIsMsgSend; } @@ -89,17 +89,22 @@ public: void offBombDeny() { mBombDeny = false; } void setDenyMessage(u16 msg) { mDenyMessage = msg; } BOOL isFree() { return mIsFree; } - void offFree() {} - void isHold() {} + void offFree() { mIsFree = false; } + BOOL isHold() { return mHold; } s32 getFollowTarget() { return mFollowTarget; } void setFollowTarget(bool) {} void getTargetID() {} void setTargetID(unsigned int) {} struct daAgb_ItemBuy { - /* 0x0 */ u8 field_0x0; - /* 0x1 */ u8 field_0x1; - } ALIGN_DECL(4); + union { + u32 U32; + struct { + /* 0x0 */ u8 field_0x0; + /* 0x1 */ u8 field_0x1; + } U8; + }; + }; struct daAgb_GbaFlg { /* 0x0 */ u16 field_0x0; @@ -162,13 +167,30 @@ public: /* 0x5 */ u8 field_0x5_1 : 1; /* 0x5 */ u8 field_0x5_2 : 1; /* 0x5 */ u8 field_0x5_3 : 3; - /* 0x5 */ u8 field_0x5_6 : 1; - /* 0x5 */ u8 field_0x5_7 : 1; - /* 0x6 */ u8 field_0x6; - /* 0x7 */ u8 field_0x7; - /* 0x8 */ u8 field_0x8; - /* 0x9 */ u8 field_0x9; - /* 0xA */ u8 field_0xa; + /* 0x5 */ u8 field_0x5_6 : 2; + /* 0x6 */ u8 field_0x6_0 : 3; + /* 0x6 */ u8 field_0x6_3 : 5; + /* 0x7 */ u8 field_0x7_0 : 1; + /* 0x7 */ u8 field_0x7_1 : 1; + /* 0x7 */ u8 field_0x7_2 : 6; + /* 0x8 */ u8 field_0x8_0 : 1; + /* 0x8 */ u8 field_0x8_1 : 7; + /* 0x9 */ u8 field_0x9_0 : 1; + /* 0x9 */ u8 field_0x9_1 : 1; + /* 0x9 */ u8 field_0x9_2 : 1; + /* 0x9 */ u8 field_0x9_3 : 1; + /* 0x9 */ u8 field_0x9_4 : 1; + /* 0x9 */ u8 field_0x9_5 : 1; + /* 0x9 */ u8 field_0x9_6 : 1; + /* 0x9 */ u8 field_0x9_7 : 1; + /* 0xA */ u8 field_0xa_0 : 1; + /* 0xA */ u8 field_0xa_1 : 1; + /* 0xA */ u8 field_0xa_2 : 1; + /* 0xA */ u8 field_0xa_3 : 1; + /* 0xA */ u8 field_0xa_4 : 1; + /* 0xA */ u8 field_0xa_5 : 1; + /* 0xA */ u8 field_0xa_6 : 1; + /* 0xA */ u8 field_0xa_7 : 1; /* 0xB */ u8 field_0xb_0 : 1; /* 0xB */ u8 field_0xb_3 : 5; /* 0xB */ u8 field_0xb_6 : 1; @@ -199,7 +221,7 @@ public: /* 0x648 */ u64 mPlayerName; /* 0x650 */ u32 field_0x650; /* 0x654 */ int field_0x654; - /* 0x658 */ u16 field_0x658; + /* 0x658 */ s16 field_0x658; /* 0x65A */ u16 mPrevButtons; /* 0x65C */ u16 field_0x65c; /* 0x65E */ u16 field_0x65e; @@ -219,7 +241,7 @@ public: /* 0x671 */ bool mIsFree; /* 0x672 */ bool mIsActive; /* 0x673 */ u8 field_0x673; - /* 0x674 */ u8 field_0x674; + /* 0x674 */ bool mHold; /* 0x675 */ u8 field_0x675; /* 0x676 */ u8 field_0x676; /* 0x677 */ u8 mFollowTarget; diff --git a/include/d/actor/d_a_player_main.h b/include/d/actor/d_a_player_main.h index 8e867392e..f4be3c463 100644 --- a/include/d/actor/d_a_player_main.h +++ b/include/d/actor/d_a_player_main.h @@ -2307,9 +2307,10 @@ public: s16 checkTinkleShield() const { return mTinkleShieldTimer; } void setTinkleShield(s16 time) { mTinkleShieldTimer = time; } bool checkNoDamageMode() const { return checkEquipDragonShield() || checkTinkleShield() != 0; } + s16 checkTinkleHover() const { return mTinkleHoverTimer; } void setHoverBoots(s16 time) { onNoResetFlg0(daPyFlg0_HOVER_BOOTS); - m354C = time; + mTinkleHoverTimer = time; } void onShipTact() { onNoResetFlg1(daPyFlg1_SHIP_TACT); } void offShipTact() { offNoResetFlg1(daPyFlg1_SHIP_TACT); } @@ -2332,6 +2333,11 @@ public: void npcStartRestartRoom() {} void setDaiokutaEnd() {} void setWhirlId(unsigned int) {} + void decrementBombCnt() { + if (mActivePlayerBombs != 0) { + mActivePlayerBombs--; + } + } int getStartRoomNo() { return fopAcM_GetParam(this) & 0x3F; } int getStartMode() { return (fopAcM_GetParam(this) >> 0x0C) & 0xF; } @@ -2370,10 +2376,8 @@ public: void checkSpecialDemoMode() const {} void checkSwordEquip() const {} void checkSwordEquipAnime() const {} - void checkTinkleHover() const {} void checkUpperAnime(u16) const {} void checkUpperGuardAnime() const {} - void decrementBombCnt() {} void doButton() const {} void doTrigger() const {} void getAnmSpeedStickRate(f32, f32) {} @@ -2440,6 +2444,7 @@ public: virtual void changeTextureAnime(u16, u16, int); virtual void cancelChangeTextureAnime() { resetDemoTextureAnime(); } +public: /* 0x0320 */ request_of_phase_process_class mPhsLoad; /* 0x0328 */ J3DModelData* mpCLModelData; /* 0x032C */ J3DModel* mpCLModel; @@ -2665,7 +2670,7 @@ public: /* 0x3546 */ s16 mShieldFrontRangeYAngle; /* 0x3548 */ s16 m3548; /* 0x354A */ u8 m354A[0x354C - 0x354A]; - /* 0x354C */ s16 m354C; + /* 0x354C */ s16 mTinkleHoverTimer; /* 0x354E */ s16 mTinkleShieldTimer; /* 0x3550 */ s16 m3550; /* 0x3552 */ u16 mKeepItemType; diff --git a/include/d/d_com_inf_game.h b/include/d/d_com_inf_game.h index 56ba52f90..73a84f72a 100644 --- a/include/d/d_com_inf_game.h +++ b/include/d/d_com_inf_game.h @@ -44,6 +44,7 @@ enum daPy__PlayerStatus0 { daPyStts0_TELESCOPE_LOOK_e = 0x00200000, daPyStts0_BOOMERANG_WAIT_e = 0x00400000, daPyStts0_CRAWL_e = 0x08000000, + daPyStts0_UNK20000000_e = 0x20000000, daPyStts0_SPIN_ATTACK_e = 0x40000000, }; diff --git a/include/d/d_kankyo_wether.h b/include/d/d_kankyo_wether.h index 49b1cb7ab..ca5bcdf2a 100644 --- a/include/d/d_kankyo_wether.h +++ b/include/d/d_kankyo_wether.h @@ -365,5 +365,6 @@ void dKyw_pwind_cylinder_set(WIND_INFLUENCE*); void dKyw_evt_wind_set(s16 i_windX, s16 i_windY); void dKyw_evt_wind_set_go(); void dKyw_get_AllWind_vec(cXyz* param_0, cXyz* i_direction, f32* i_power); +BOOL dKyw_gbwind_use_check(); #endif /* D_KANKYO_WETHER_H */ diff --git a/include/d/d_stage.h b/include/d/d_stage.h index ba97edf4e..963202918 100644 --- a/include/d/d_stage.h +++ b/include/d/d_stage.h @@ -1083,6 +1083,8 @@ int dStage_changeScene(int i_exitId, f32 speed, u32 mode, s8 room_no); void dStage_restartRoom(u32 roomParam, u32 mode); +BOOL dStage_checkRestart(); + static inline u8 IkadaGetRoomNoArg0(fopAc_ac_c* i_actor) { return (fopAcM_GetParam(i_actor) >> 4) & 0x3F; } diff --git a/include/f_op/f_op_actor_mng.h b/include/f_op/f_op_actor_mng.h index bbc97c746..b897e72fb 100644 --- a/include/f_op/f_op_actor_mng.h +++ b/include/f_op/f_op_actor_mng.h @@ -141,6 +141,11 @@ inline void fopAcM_OffStatus(fopAc_ac_c* pActor, u32 flag) { pActor->mStatus &= ~flag; } +inline BOOL fopAcM_CheckStatusMap(fopAc_ac_c* pActor, u32) { + // TODO: This implementation probably isn't right, the u32 argument is likely used for something + return (pActor->mStatus & fopAcStts_SHOWMAP_e) && (pActor->mStatus & 0x1F) == 0; +} + inline void fopAcM_SetStatusMap(fopAc_ac_c* pActor, u32 flag) { pActor->mStatus = (pActor->mStatus & ~0x3F) | fopAcStts_SHOWMAP_e | flag; } diff --git a/src/d/actor/d_a_agb.cpp b/src/d/actor/d_a_agb.cpp index 4d224785e..644dd9dd5 100644 --- a/src/d/actor/d_a_agb.cpp +++ b/src/d/actor/d_a_agb.cpp @@ -13,23 +13,21 @@ #include "d/d_item_data.h" #include "d/d_meter.h" #include "d/d_procname.h" +#include "d/d_kankyo_wether.h" #include "m_Do/m_Do_controller_pad.h" #include "m_Do/m_Do_dvd_thread.h" #include "m_Do/m_Do_gba_com.h" #include "m_Do/m_Do_mtx.h" #include "d/actor/d_a_npc_md.h" +#include "d/actor/d_a_npc_cb1.h" #include "d/actor/d_a_bomb.h" +static u8 dummy_3569[0xC]; + // stripped or compiler generated? static u32 unused_lit_2100[] = {0x3F800000, 0x3F800000, 0x3F800000, 0x3F800000, 0x3F800000, 0x3F800000}; -// temp -class daNpc_Cb1_c { -public: - static bool m_flying; -}; - static mDoDvdThd_toMainRam_c* l_gbaCommand; int daAgb_c::mEffect; @@ -420,7 +418,7 @@ void daAgb_c::modeLookAttention() { se_flag = false; field_0x65c = 1; - if (field_0x674 == 0) { + if (mHold == 0) { shape_angle.x = 0; shape_angle.y = 0; shape_angle.z = 0; @@ -505,13 +503,13 @@ void daAgb_c::onFree() { /* 800D05F0-800D0608 .text onHold__7daAgb_cFv */ void daAgb_c::onHold() { - field_0x674 = 1; + mHold = true; mBrk.setPlaySpeed(6.0f); } /* 800D0608-800D0620 .text offHold__7daAgb_cFv */ void daAgb_c::offHold() { - field_0x674 = 0; + mHold = false; mBrk.setPlaySpeed(1.0f); } @@ -544,7 +542,7 @@ void daAgb_c::resetCursor(bool param_0) { field_0x676 = 0; } - field_0x674 = 0; + mHold = false; mBrk.setPlaySpeed(1.0f); } @@ -724,7 +722,7 @@ void daAgb_c::GbaItemUse() { temp_r29 = 15; } - fopAcM_create(0x128, daBomb_c::prm_make(daBomb_c::STATE_8, false, false), ¤t.pos); + fopAcM_create(PROC_BOMB, daBomb_c::prm_make(daBomb_c::STATE_8, false, false), ¤t.pos); field_0x65c = 0x78; } else { temp_r29 = 0xe; @@ -735,7 +733,7 @@ void daAgb_c::GbaItemUse() { break; case 0x15: resetCursor(false); - fopAcM_create(0x128, daBomb_c::prm_make(daBomb_c::STATE_8, false, false), ¤t.pos); + fopAcM_create(PROC_BOMB, daBomb_c::prm_make(daBomb_c::STATE_8, false, false), ¤t.pos); field_0x65c = 0x78; break; case 0x11: @@ -856,60 +854,171 @@ void daAgb_c::GbaItemUse() { /* 800D1188-800D12E4 .text Shopping__7daAgb_cFv */ void daAgb_c::Shopping() { daAgb_ItemBuy& itemBuy = mItemBuy; - mItemBuy.field_0x0 = mShop.field_0x0; + mItemBuy.U8.field_0x0 = mShop.field_0x0; // The usage of single | instead of double || here looks like a bug if (!(dComIfGp_event_runCheck() | dMenu_flag())) { if (dComIfGs_getRupee() < mShop.field_0x2) { - itemBuy.field_0x1 = 3; + itemBuy.U8.field_0x1 = 3; return; } else if (mShop.field_0x0 == 0) { if (dComIfGs_getArrowNum() < dComIfGs_getArrowMax()) { dComIfGp_setItemArrowNumCount(mShop.field_0x1); } else { - itemBuy.field_0x1 = 2; + itemBuy.U8.field_0x1 = 2; return; } } else if (mShop.field_0x0 == 1) { if (dComIfGs_getBombNum() < dComIfGs_getBombMax()) { dComIfGp_setItemBombNumCount(mShop.field_0x1); } else { - itemBuy.field_0x1 = 2; + itemBuy.U8.field_0x1 = 2; return; } } else { if (dComIfGs_checkBaitItemEmpty()) { dComIfGs_setBaitItem(BIRD_ESA_5); } else { - itemBuy.field_0x1 = 2; + itemBuy.U8.field_0x1 = 2; return; } } dComIfGp_setItemRupeeCount(-mShop.field_0x2); - itemBuy.field_0x1 = 1; + itemBuy.U8.field_0x1 = 1; } else { - itemBuy.field_0x1 = 0; + itemBuy.U8.field_0x1 = 0; } } /* 800D12E4-800D1A3C .text FlagsSend__7daAgb_cFUl */ -void daAgb_c::FlagsSend(u32) { - /* Nonmatching */ +void daAgb_c::FlagsSend(u32 stage_type) { + if (field_0x670 && + (stage_type == dSv_save_c::STAGE_SEA2 || + stage_type == dSv_save_c::STAGE_TOTG || + stage_type == dSv_save_c::STAGE_ET || + stage_type == dSv_save_c::STAGE_WT)) + { + mFlags.field_0xa_7 = 0; + } else { + mFlags.field_0xa_7 = 1; + } + mFlags.field_0xa_6 = dMenu_flag(); + mFlags.field_0xa_5 = dComIfGp_event_getMode() != dEvtMode_NONE_e; + if (dStage_checkRestart() || dComIfGp_checkPlayerStatus0(0, daPyStts0_UNK20000000_e)) { + mFlags.field_0xa_4 = 1; + } else { + mFlags.field_0xa_4 = 0; + } + mFlags.field_0x0 = BigLittleChange(dComIfGs_getRupee()) >> 16; + mFlags.field_0x5_6 = dComIfGs_getWalletSize(); + if (dKyw_gbwind_use_check()) { + mFlags.field_0xb_6 = 1; + s16 r3; + // Fakematch: using the dComIfGp_event_runCheck inline breaks the match + // if (dComIfGp_event_runCheck() && (dComIfGp_evmng_startCheck("TACT_WINDOW2_SHIP") || dComIfGp_evmng_startCheck("TACT_WINDOW2"))) { + if (g_dComIfG_gameInfo.play.getEvent().runCheck() && + (dComIfGp_evmng_startCheck("TACT_WINDOW2_SHIP") || dComIfGp_evmng_startCheck("TACT_WINDOW2"))) + { + r3 = field_0x658; + } else { + cXyz* wind_vec = dKyw_get_wind_vec(); + r3 = cM_atan2s(wind_vec->x, wind_vec->z); + } + mFlags.field_0x2 = (r3 & 0xFF00) >> 8; + field_0x658 = r3; + } else { + mFlags.field_0xb_6 = 0; + } + mFlags.field_0x3_4 = dComIfGs_isStageTbox(dSv_save_c::STAGE_DRC, 0xF) != FALSE; + mFlags.field_0x3_3 = dComIfGs_isStageTbox(dSv_save_c::STAGE_FW, 0xF) != FALSE; + mFlags.field_0x3_2 = dComIfGs_isStageTbox(dSv_save_c::STAGE_TOTG, 0xF) != FALSE; + mFlags.field_0x3_1 = dComIfGs_isStageTbox(dSv_save_c::STAGE_ET, 0xF) != FALSE; + mFlags.field_0x3_0 = dComIfGs_isStageTbox(dSv_save_c::STAGE_WT, 0xF) != FALSE; + mFlags.field_0x4 = (field_0x65c + 29) / 30; + mFlags.field_0x6_0 = dKy_get_dayofweek(); + mFlags.field_0x6_3 = dKy_getdaytime_hour(); + mFlags.field_0x7_2 = dKy_getdaytime_minute(); + mFlags.field_0x8_1 = dComIfGs_getLife(); + mFlags.field_0xa_1 = dComIfGs_isEventBit(0x1708); + mFlags.field_0x7_1 = dComIfGs_isEventBit(0x1A10); + mFlags.field_0x7_0 = dComIfGs_isEventBit(0x1A08); + + if (!dComIfGs_isEventBit(0x0F80) || dComIfGs_isEventBit(0x1E80)) { + mFlags.field_0x9_7 = 0; + mFlags.field_0x9_6 = 0; + mFlags.field_0x9_5 = 0; + } else if (dComIfGs_isSymbol(2)) { + mFlags.field_0x9_7 = 0; + mFlags.field_0x9_6 = 0; + mFlags.field_0x9_5 = 1; + } else if (dComIfGs_isSymbol(1)) { + mFlags.field_0x9_7 = 0; + mFlags.field_0x9_6 = 1; + mFlags.field_0x9_5 = 0; + } else { + mFlags.field_0x9_7 = 1; + mFlags.field_0x9_6 = 0; + mFlags.field_0x9_5 = 0; + } + + if (dComIfGs_isEventBit(0x3920)) { + mFlags.field_0x9_4 = !dComIfGs_isEventBit(0x1480); + mFlags.field_0x9_3 = !dComIfGs_isEventBit(0x1440); + mFlags.field_0x9_2 = !dComIfGs_isEventBit(0x1410); + } else { + mFlags.field_0x9_4 = 0; + mFlags.field_0x9_3 = 0; + mFlags.field_0x9_2 = 0; + } + + if (dComIfGs_isEventBit(0x1820)) { + mFlags.field_0x9_1 = !dComIfGs_isStageBossEnemy(dSv_save_c::STAGE_WT); + mFlags.field_0x9_0 = !dComIfGs_isStageBossEnemy(dSv_save_c::STAGE_ET); + } else { + mFlags.field_0x9_1 = 0; + mFlags.field_0x9_0 = 0; + } + mFlags.field_0xa_3 = dComIfGs_isEventBit(0x1E40); + mFlags.field_0xa_0 = mIsFree; + mFlags.field_0xb_7 = mFollowTarget; + if (stage_type == dSv_save_c::STAGE_ET) { + mFlags.field_0x8_0 = 1; + } else { + mFlags.field_0x8_0 = 0; + } + mFlags.field_0x3_7 = dComIfGs_isTact(0); + + if (*(u16*)&g_mDoCPd_cpadInfo[0].mButtonHold || // fakematch? is controller_pad_buttons supposed to be a u16? + g_mDoCPd_cpadInfo[0].mMainStickValue || + g_mDoCPd_cpadInfo[0].mCStickValue) + { + mFlags.field_0x3_6 = 1; + } else { + mFlags.field_0x3_6 = 0; + } + if (dComIfGs_getMaxMagic() != 0) { + mFlags.field_0xb_0 = 1; + } else { + mFlags.field_0xb_0 = 0; + } + mFlags.field_0x5_2 = field_0x675; + mFlags.field_0x5_1 = dComIfGs_checkGetItem(COTTAGE_PAPER) != FALSE; + mDoGac_SendDataSet((u32*)&mFlags, 0xC, 9, 0); } /* 800D1A3C-800D25D8 .text CursorMove__7daAgb_cFP10fopAc_ac_cUl */ -void daAgb_c::CursorMove(fopAc_ac_c* actor, u32 r17) { +void daAgb_c::CursorMove(fopAc_ac_c* actor, u32 stage_type) { daPy_py_c* player = daPy_getPlayerActorClass(); f32 f31; - if (r17 == 7) { + if (stage_type == dSv_save_c::STAGE_WT) { f31 = field_0x67e != 0 ? 50.0f : 781.25f; } else { f31 = 25.0f; } if (cLib_chaseF(&field_0x628, 2.5f, field_0x62c) && - field_0x673 != 0 && isActive() && field_0x674 == 0 && + field_0x673 != 0 && isActive() && !mHold && !CPad_CHECK_HOLD_L(mDoGaC_getPortNo()) ) { if (CPad_CHECK_HOLD_LEFT(mDoGaC_getPortNo())) { @@ -923,7 +1032,7 @@ void daAgb_c::CursorMove(fopAc_ac_c* actor, u32 r17) { actor->orig.pos.z += f31; } - if (r17 == 7 && field_0x67e == 0) { + if (stage_type == dSv_save_c::STAGE_WT && field_0x67e == 0) { if (actor->orig.pos.x < -350000.0f) { actor->orig.pos.x = -350000.0f; } else if (actor->orig.pos.x > 350000.0f) { @@ -1043,7 +1152,174 @@ void daAgb_c::CursorMove(fopAc_ac_c* actor, u32 r17) { /* 800D272C-800D303C .text modeMove__7daAgb_cFv */ void daAgb_c::modeMove() { - /* Nonmatching */ + /* Nonmatching - regalloc */ + daPy_py_c* player = daPy_getPlayerActorClass(); + + // single | instead of double ||: bug? + BOOL r26 = dComIfGp_event_runCheck() | dMenu_flag(); + + u32 stage_type = dStage_stagInfo_GetSTType(dComIfGp_getStageStagInfo()); + + if (mEvtInfo.checkCommandTalk()) { + mUploadAction = 0; + mMode = 2; + return; + } + + if (field_0x65c != 0) { + if (field_0x66b == 3 || field_0x66b == 12) { + field_0x65c = daPy_getPlayerLinkActorClass()->checkTinkleHover(); + if (field_0x65c == 0) { + mBrk.setPlaySpeed(1.0f); + } + } else if (field_0x66b == 4 || field_0x66b == 13) { + field_0x65c = daPy_getPlayerLinkActorClass()->checkTinkleShield(); + if (field_0x65c == 0) { + mBrk.setPlaySpeed(1.0f); + } + } else if (!r26) { + field_0x65c--; + + if (field_0x66b == 0xE) { + if (field_0x65c == 0x78) { + fopAcM_create(PROC_BOMB, daBomb_c::prm_make(daBomb_c::STATE_8, false, false), ¤t.pos); + } else if (field_0x65c == 0) { + resetCursor(false); + } + } + + if (field_0x66b == 15 && field_0x65c == 30) { + fopAcM_fastCreateItem(&field_0x634, field_0x640, -1, NULL, NULL, 5.0f, 50.0f, -7.0f); + } + } + } + if (field_0x673 != 0 && !r26 && field_0x65c == 0) { + mIsActive = true; + } else { + mIsActive = false; + } + + if (mDoGaC_GbaLink() && mDoGaC_RecvStatusCheck(6) && mDoGac_SendStatusCheck(7)) { + if (isActive() || mItem.field_0x0 == 0x15) { + GbaItemUse(); + } else { + mEffect = 0; + } + + mDoGaC_DataStatusReset(6); + mDoGac_SendDataSet((u32*)&mEffect, 4, 7, mEffect); + } + + if (field_0x67f != 0) { + field_0x67f = 0; + + if (field_0x67d == 0 && + !daPy_getPlayerLinkActorClass()->checkNoControll() && + !dComIfGp_checkPlayerStatus0(0, daPyStts0_CRAWL_e) && + ( + !daPy_getPlayerActorClass()->checkPlayerFly() || + dComIfGp_checkPlayerStatus0(0, daPyStts0_SWIM_e) || + dComIfGp_checkPlayerStatus0(0, daPyStts0_SHIP_RIDE_e) + ) + ) { + mMode = 1; + mIsActive = false; + mEyePos = current.pos; + + cXyz sp3c = mEyePos - player->current.pos; + if (sp3c.absXZ() < 10.0f) { + mEyePos.x += 10.0f * cM_ssin(player->shape_angle.y); + mEyePos.z += 10.0f * cM_scos(player->shape_angle.y); + } + mAttentionInfo.mPosition = mEyePos; + + if (isHold()) { + s16 angle = fopAcM_searchPlayerAngleY(this); + if (field_0x675 == 0) { + angle = -angle; + } + shape_angle.z = angle; + } else { + shape_angle.y = fopAcM_searchPlayerAngleY(this); + shape_angle.x = cM_atan2s((player->mEyePos - mEyePos).absXZ(), player->mEyePos.y - mEyePos.y); + field_0x628 = 50.0f; + } + + field_0x66b = 0x10; + field_0x65c = 3*30; + } + } + + if (mDoGaC_GbaLink() && mDoGaC_RecvStatusCheck(0xC) && mDoGac_SendStatusCheck(0xD)) { + Shopping(); + mDoGaC_DataStatusReset(0xC); + mDoGac_SendDataSet((u32*)&mItemBuy, 4, 0xD, mItemBuy.U32); + } + + if ((g_mDoCPd_cpadInfo[mDoGaC_getPortNo()].mGamepadErrorFlags == 0 && fopAcM_GetName(player) != PROC_NPC_KAM) && + ((isActive() && field_0x675 == 0 && CPad_CHECK_TRIG_R(mDoGaC_getPortNo())) || + (mFlags.field_0x3_5 != 0 && (CPad_CHECK_TRIG_R(mDoGaC_getPortNo()) || CPad_CHECK_TRIG_A(mDoGaC_getPortNo()))))) + { + offHold(); + mIsFree = false; + if (getFollowTarget() != 0) { + field_0x650 = -1; + mFollowTarget = 0; + } else if (stage_type != dSv_save_c::STAGE_ET) { + dAttList_c* attList = dComIfGp_getAttention().GetLockonList(0); + if (attList) { + fopAc_ac_c* r3 = attList->getActor(); + if (r3) { + if (fopAcM_CheckStatusMap(r3, 0) && !fopAcM_checkStatus(r3, fopAcStts_BOSS_e) && fopAcM_GetName(r3) != PROC_FGANON) { + current.pos = r3->current.pos; + orig.pos = r3->current.pos; + field_0x650 = attList->getPid(); + mFollowTarget = 1; + } + } + } + } + } + + if (!isFree()) { + if (getFollowTarget() == 1) { + fopAc_ac_c* r3 = fopAcM_SearchByID(field_0x650); + if (r3 == NULL || !fopAcM_CheckStatusMap(r3, 0)) { + field_0x650 = -1; + mFollowTarget = 0; + } + } + + if (getFollowTarget() == 0) { + if (fopAcM_GetName(player) == PROC_NPC_KAM) { + onFree(); + } else { + current.pos = player->current.pos; + orig.pos = player->current.pos; + } + } else { + fopAc_ac_c* r3 = fopAcM_SearchByID(field_0x650); + current.pos = r3->current.pos; + orig.pos = r3->current.pos; + } + + shape_angle.setall(0); + field_0x628 = 2.5f; + + if (g_mDoCPd_cpadInfo[mDoGaC_getPortNo()].mGamepadErrorFlags == 0 && !CPad_CHECK_HOLD_L(mDoGaC_getPortNo()) && ( + CPad_CHECK_HOLD_LEFT(mDoGaC_getPortNo()) | CPad_CHECK_HOLD_RIGHT(mDoGaC_getPortNo()) | + CPad_CHECK_HOLD_UP(mDoGaC_getPortNo()) | CPad_CHECK_HOLD_DOWN(mDoGaC_getPortNo()) + ) && isActive() && !mHold) + { + onFree(); + } + } else if (!mHold) { + CursorMove(this, stage_type); + } + + if (mMode == 0) { + mEvtInfo.onCondition(dEvtCnd_CANTALK_e); + } } /* 800D303C-800D30D4 .text modeDelete__7daAgb_cFv */ @@ -1081,10 +1357,10 @@ static int daAgb_Execute(daAgb_c* i_this) { g_mDoCPd_cpadInfo[mDoGaC_getPortNo()].mGamepadErrorFlags = 1; } - BOOL var_r27 = dComIfGp_event_runCheck() != 0; - var_r27 |= dMenu_flag(); + // single | instead of double ||: bug? + BOOL var_r27 = dComIfGp_event_runCheck() | dMenu_flag(); - u32 st_type = dStage_stagInfo_GetSTType(dComIfGp_getStageStagInfo()); + u32 stage_type = dStage_stagInfo_GetSTType(dComIfGp_getStageStagInfo()); if (mDoGaC_GbaLink()) { if (mDoGaC_RecvStatusCheck(8)) { @@ -1092,7 +1368,7 @@ static int daAgb_Execute(daAgb_c* i_this) { } if (mDoGac_SendStatusCheck(9)) { - i_this->FlagsSend(st_type); + i_this->FlagsSend(stage_type); } i_this->field_0x680 = 1; @@ -1132,7 +1408,7 @@ static int daAgb_Execute(daAgb_c* i_this) { daPy_lk_c* player_p2 = daPy_getPlayerLinkActorClass(); if ((dComIfGp_getPlayer(0) == player_p2 && !player->checkPlayerFly()) || ((fopAcM_GetName(player) == PROC_NPC_MD && !daNpc_Md_c::isFlying()) || - (fopAcM_GetName(player) == PROC_NPC_CB1 && !daNpc_Cb1_c::m_flying) || + (fopAcM_GetName(player) == PROC_NPC_CB1 && !daNpc_Cb1_c::isFlying()) || fopAcM_GetName(player) == PROC_NPC_OS)) { f32 speedF = fabs(player->speedF); @@ -1153,7 +1429,7 @@ static int daAgb_Execute(daAgb_c* i_this) { } } - if ((int)i_this->field_0x674 != 0 && var_r27 == 0 && i_this->mMode != 1) { + if (i_this->isHold() && !var_r27 && i_this->mMode != 1) { if (i_this->field_0x675 != 0) { if (i_this->field_0x676 != 0) { i_this->shape_angle.z += 0x1000; @@ -1201,7 +1477,7 @@ static int daAgb_Draw(daAgb_c* i_this) { u8 var_r6 = 1; if (mDoGaC_GbaLink()) { - if (i_this->field_0x66f != 0 && !(daAgb_c::mFlags.field_0xa & 1) && + if (i_this->field_0x66f != 0 && !daAgb_c::mFlags.field_0xa_7 && (!dComIfGp_event_runCheck() || dComIfGp_evmng_startCheck("DEFAULT_AGB_LOOK_ATTENTION") || i_this->mMode == 2) && @@ -1324,5 +1600,27 @@ static int daAgb_Create(fopAc_ac_c* i_this) { return phase; } -/* 800D3D2C-800D3DDC .text __ct__7daAgb_cFv */ -daAgb_c::daAgb_c() : field_0x684(0, 0) {} +actor_method_class l_daAgb_Method = { + (process_method_func)daAgb_Create, + (process_method_func)daAgb_Delete, + (process_method_func)daAgb_Execute, + (process_method_func)daAgb_IsDelete, + (process_method_func)daAgb_Draw, +}; + +actor_process_profile_definition g_profile_AGB = { + /* LayerID */ fpcLy_CURRENT_e, + /* ListID */ 7, + /* ListPrio */ fpcLy_CURRENT_e, + /* ProcName */ PROC_AGB, + /* Proc SubMtd */ &g_fpcLf_Method.mBase, + /* Size */ sizeof(daAgb_c), + /* SizeOther */ 0, + /* Parameters */ 0, + /* Leaf SubMtd */ &g_fopAc_Method.base, + /* Priority */ 0x000C, + /* Actor SubMtd */ &l_daAgb_Method, + /* Status */ fopAcStts_UNK4000_e | fopAcStts_NOPAUSE_e | fopAcStts_UNK40000_e, + /* Group */ fopAc_ACTOR_e, + /* CullType */ fopAc_CULLBOX_0_e, +}; diff --git a/src/d/actor/d_a_agbsw0.cpp b/src/d/actor/d_a_agbsw0.cpp index 1f20b286b..981e7b954 100644 --- a/src/d/actor/d_a_agbsw0.cpp +++ b/src/d/actor/d_a_agbsw0.cpp @@ -1196,7 +1196,7 @@ BOOL daAgbsw0_c::ExeSubR() { current.pos.y += mScale.y / 2.0f; } - fopAcM_fastCreateItem(¤t.pos, itemNo, fopAcM_GetHomeRoomNo(this), 0, 0, 0.0f, cM_rndF(10.0f) + 40.0f, -7.0f); + fopAcM_fastCreateItem(¤t.pos, itemNo, fopAcM_GetHomeRoomNo(this), NULL, NULL, 0.0f, cM_rndF(10.0f) + 40.0f, -7.0f); fopAcM_seStart(agb, JA_SE_CV_CHI_MEGAHORN, 0); MailSend(-1, 0, 0xFF, 0xFF, 0); @@ -1461,7 +1461,7 @@ BOOL daAgbsw0_c::ExeSubD() { if(0 <= itemNo && itemNo < 0x1F && itemNo != KAKERA_HEART && itemNo != UTUWA_HEART && itemNo != SMALL_KEY) { s8 roomNo = fopAcM_GetHomeRoomNo(this); f32 rnd = cM_rndF(10.0f) + 40.0f; - fopAcM_fastCreateItem(¤t.pos, itemNo, roomNo, 0, 0, 0.0f, rnd, -7.0f); + fopAcM_fastCreateItem(¤t.pos, itemNo, roomNo, NULL, NULL, 0.0f, rnd, -7.0f); MailSend(-1, 0, 0xFF, 0xFF, 0x11); } diff --git a/src/d/actor/d_a_bomb3.inc b/src/d/actor/d_a_bomb3.inc index def7f3f87..0602f8e17 100644 --- a/src/d/actor/d_a_bomb3.inc +++ b/src/d/actor/d_a_bomb3.inc @@ -799,10 +799,7 @@ int daBomb_c::procExplode_init() { mAttentionInfo.mFlags &= ~fopAc_Attn_ACTION_CARRY_e; if(field_0x6F0) { - if(daPy_getPlayerLinkActorClass()->mActivePlayerBombs != 0) { - daPy_getPlayerLinkActorClass()->mActivePlayerBombs -= 1; - } - + daPy_getPlayerLinkActorClass()->decrementBombCnt(); field_0x6F0 = 0; } @@ -1208,9 +1205,7 @@ bool daBomb_c::bombDelete() { mSparks.mpEmitter = 0; if(field_0x6F0) { - if(daPy_getPlayerLinkActorClass()->mActivePlayerBombs != 0) { - daPy_getPlayerLinkActorClass()->mActivePlayerBombs -= 1; - } + daPy_getPlayerLinkActorClass()->decrementBombCnt(); } se_cannon_fly_stop(); diff --git a/src/d/d_stage.cpp b/src/d/d_stage.cpp index ff02b3f9e..e459332bd 100644 --- a/src/d/d_stage.cpp +++ b/src/d/d_stage.cpp @@ -2350,18 +2350,18 @@ void dStage_escapeRestart() { } /* 80043C84-80043CD0 .text dStage_checkRestart__Fv */ -bool dStage_checkRestart() { +BOOL dStage_checkRestart() { if (dComIfGp_isEnableNextStage()) { if (dComIfGp_getStartStagePoint() == -2 || dComIfGp_getStartStagePoint() == -3) { - return false; + return FALSE; } if (dComIfGs_getRestartRoomParam() != 0) { - return true; + return TRUE; } } - return false; + return FALSE; } dStage_roomStatus_c dStage_roomControl_c::mStatus[64];