From ee401fb19ffab997b72672e747a8edd632ee7785 Mon Sep 17 00:00:00 2001 From: TakaRikka Date: Sat, 23 Sep 2023 00:00:37 -0700 Subject: [PATCH] work on d_a_agb --- .../J3DGraphAnimator/J3DMaterialAttach.h | 7 +- .../JSystem/J3DGraphAnimator/J3DModelData.h | 1 - include/JSystem/JUtility/JUTGba.h | 4 +- include/SSystem/SComponent/c_bg_s_chk.h | 2 +- include/SSystem/SComponent/c_bg_s_gnd_chk.h | 1 + include/d/actor/d_a_agb.h | 186 +++ include/d/actor/d_a_player.h | 12 +- include/d/actor/d_a_player_link.h | 83 +- include/d/d_bg_s.h | 52 + include/d/d_bg_s_acch.h | 4 +- include/d/d_com_inf_game.h | 69 +- include/d/d_event_manager.h | 2 +- include/d/d_kankyo_wether.h | 3 +- include/d/d_map.h | 6 +- include/d/d_save.h | 13 +- include/f_op/f_op_actor_mng.h | 4 +- include/f_op/f_op_msg_mng.h | 1 + include/m_Do/m_Do_dvd_thread.h | 1 + include/m_Do/m_Do_gba_com.h | 4 +- include/m_Do/m_Do_lib.h | 5 - src/SSystem/SComponent/c_bg_s_gnd_chk.cpp | 2 +- src/SSystem/SComponent/c_bg_s_lin_chk.cpp | 4 +- src/d/actor/d_a_agb.cpp | 1218 ++++++++++++++--- src/d/d_kankyo_rain.cpp | 55 +- src/m_Do/m_Do_gba_com.cpp | 6 +- 25 files changed, 1484 insertions(+), 261 deletions(-) create mode 100644 include/d/actor/d_a_agb.h diff --git a/include/JSystem/J3DGraphAnimator/J3DMaterialAttach.h b/include/JSystem/J3DGraphAnimator/J3DMaterialAttach.h index 1891eedb9..2def459b7 100644 --- a/include/JSystem/J3DGraphAnimator/J3DMaterialAttach.h +++ b/include/JSystem/J3DGraphAnimator/J3DMaterialAttach.h @@ -35,7 +35,6 @@ public: JUTNameTab* getMaterialName() const { return mMaterialName; } u16 getMaterialNum() const { return mMaterialNum; } - bool isLocked() const { return field_0x1c == 1; } private: /* 0x04 */ u16 mMaterialNum; @@ -43,9 +42,9 @@ private: /* 0x08 */ J3DMaterial** mMaterialNodePointer; /* 0x0C */ JUTNameTab* mMaterialName; /* 0x10 */ u32 field_0x10; - /* 0x14 */ J3DTexture* mTexture; - /* 0x18 */ JUTNameTab* mTextureName; - /* 0x1C */ u16 field_0x1c; + /* 0x14 */ u32 field_0x14; + /* 0x18 */ J3DTexture* mTexture; + /* 0x1C */ JUTNameTab* mTextureName; }; // Size: 0x20 #endif /* J3DMATERIALATTACH_H */ diff --git a/include/JSystem/J3DGraphAnimator/J3DModelData.h b/include/JSystem/J3DGraphAnimator/J3DModelData.h index ce8018b1b..cd23e5294 100644 --- a/include/JSystem/J3DGraphAnimator/J3DModelData.h +++ b/include/JSystem/J3DGraphAnimator/J3DModelData.h @@ -59,7 +59,6 @@ public: u16 checkBumpFlag() const { return mbHasBumpArray; } void setBumpFlag(u32 flag) { mbHasBumpArray = flag; } bool checkBBoardFlag() const { return mbHasBillboard == 1; } - bool isLocked() { return mMaterialTable.isLocked(); } void entryTexMtxAnimator(J3DAnmTextureSRTKey* anm) { mMaterialTable.entryTexMtxAnimator(anm); } void entryTevRegAnimator(J3DAnmTevRegKey* anm) { mMaterialTable.entryTevRegAnimator(anm); } void entryTexNoAnimator(J3DAnmTexPattern* anm) { mMaterialTable.entryTexNoAnimator(anm); } diff --git a/include/JSystem/JUtility/JUTGba.h b/include/JSystem/JUtility/JUTGba.h index b9d520e5a..21577b6da 100644 --- a/include/JSystem/JUtility/JUTGba.h +++ b/include/JSystem/JUtility/JUTGba.h @@ -16,9 +16,9 @@ public: void result_common(int, u32, u32*); void resultStatus_common(int, u32, u8*); void doJoyBoot(int, s32, s32, u8*, u32, JUTGba_Func, void*); - void resultJoyBoot(int, u8*); + int resultJoyBoot(int, u8*); void doInitProbe(int, JUTGba_Func, void*); - void resultInitProbe(int, u32*); + int resultInitProbe(int, u32*); void doProbe(int, JUTGba_Func, void*); BOOL resultProbe(int, u32*); void doReset(int, JUTGba_Func, void*); diff --git a/include/SSystem/SComponent/c_bg_s_chk.h b/include/SSystem/SComponent/c_bg_s_chk.h index bb28ccce6..e8ffbd457 100644 --- a/include/SSystem/SComponent/c_bg_s_chk.h +++ b/include/SSystem/SComponent/c_bg_s_chk.h @@ -30,7 +30,7 @@ public: void SetExtChk(cBgS_Chk&); bool ChkSameActorPid(unsigned int) const; - void setActorPid(u32 pid) { mActorPid = pid; } + void SetActorPid(u32 pid) { mActorPid = pid; } u32 GetActorPid() const { return mActorPid; } void SetPolyPassChk(cBgS_PolyPassChk* p_chk) { mPolyPassChk = p_chk; } void SetGrpPassChk(cBgS_GrpPassChk* p_chk) { mGrpPassChk = p_chk; } diff --git a/include/SSystem/SComponent/c_bg_s_gnd_chk.h b/include/SSystem/SComponent/c_bg_s_gnd_chk.h index 192406a2a..8d482dd6d 100644 --- a/include/SSystem/SComponent/c_bg_s_gnd_chk.h +++ b/include/SSystem/SComponent/c_bg_s_gnd_chk.h @@ -20,6 +20,7 @@ public: void SetNowY(f32 y) { mNowY = y; } const cXyz& GetPointP() { return m_pos; } u32 GetWallPrecheck() const { return mWallPrecheck; } + void OffWall() { mFlags &= ~2; } private: /* 0x24 */ cXyz m_pos; diff --git a/include/d/actor/d_a_agb.h b/include/d/actor/d_a_agb.h new file mode 100644 index 000000000..2146f1b6a --- /dev/null +++ b/include/d/actor/d_a_agb.h @@ -0,0 +1,186 @@ +#ifndef D_A_AGB_H +#define D_A_AGB_H + +#include "d/d_bg_s.h" +#include "d/d_bg_s_acch.h" +#include "d/d_particle.h" +#include "f_op/f_op_actor_mng.h" +#include "m_Do/m_Do_ext.h" +#include "m_Do/m_Do_hostIO.h" + +class daAgb_HIO_c : public mDoHIO_entry_c { +public: + daAgb_HIO_c(); + virtual ~daAgb_HIO_c() {} + + /* 0x04 */ J3DGXColorS10 field_0x04[2]; + /* 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; +}; + +class msg_class; +class dMsgCtrl_c { +public: + int init(u16); + int execute(); + ~dMsgCtrl_c(); + + /* 0x00 */ u16 field_0x0; + /* 0x04 */ u32 mMsgID; + /* 0x08 */ msg_class* mpMsg; +}; + +class daAgb_c : public fopAc_ac_c { +public: + void NameConv(); + int uploadInitCheck(); + int uploadPortCheckWait(); + int uploadSelect(); + int uploadJoyboot1(); + int uploadJoyboot2(); + int uploadMessageLoad(); + int uploadMessageLoad2(); + int uploadConnect(); + int uploadMessageSend(); + int uploadRetryWait(); + int uploadMsgEndWait(); + int uploadMsgEndTimer(); + void modeLoad(); + void modeLookAttention(); + u8 DungeonNoGet(); + void MapNoSet(u8, u8, u8); + void onFree(); + void onHold(); + void offHold(); + void resetCursor(bool); + bool FlashCheck(); + void FlagsRecv(); + void SwitchOn(); + void GbaItemUse(); + void Shopping(); + void FlagsSend(u32); + void CursorMove(fopAc_ac_c*, u32); + void modeMove(); + void modeDelete(); + int createHeap(); + + daAgb_c(); + + inline void modeProcCall(); + + static int mEffect; + + struct daAgb_GbaFlg { + /* 0x0 */ u16 field_0x0; + /* 0x2 */ u8 field_0x2; + /* 0x3 */ u8 field_0x3; + /* 0x4 */ u16 field_0x4; + /* 0x6 */ u16 field_0x6; + }; + static daAgb_GbaFlg mGbaFlg; + + struct daAgb_Switch { + /* 0x0 */ u8 field_0x0; + /* 0x1 */ u8 field_0x1; + /* 0x1 */ u8 field_0x2; + /* 0x3 */ u8 field_0x3; + /* 0x4 */ u8 field_0x4; + u8 field_0x5[0x8 - 0x5]; + }; + static daAgb_Switch mSwitch; + + struct daAgb_Item { + /* 0x0 */ u8 field_0x0; + /* 0x1 */ u8 field_0x1; + }; + static daAgb_Item mItem; + static u8 mShop; + static u8 mItemBuy; + static u8 DungeonNoTable[]; + + struct daAgb_Flags { + /* 0x0 */ u16 field_0x0; + /* 0x2 */ u8 field_0x2; + /* 0x3 */ u8 field_0x3; + /* 0x4 */ u8 field_0x4; + /* 0x5 */ u8 field_0x5_0 : 1; + /* 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; + /* 0xB */ u8 field_0xb_0 : 1; + /* 0xB */ u8 field_0xb_3 : 5; + /* 0xB */ u8 field_0xb_6 : 1; + /* 0xB */ u8 field_0xb_7 : 1; + }; + + static daAgb_Flags mFlags; + + typedef int (daAgb_c::*uploadFunc)(); + static uploadFunc uploadFuncTable[]; + + /* 0x290 */ request_of_phase_process_class mPhase; + /* 0x298 */ J3DModel* mpModel; + /* 0x29C */ mDoExt_brkAnm mBrk; + /* 0x2B4 */ GXTexObj mTexObj; + /* 0x2D4 */ dBgS_LinkCrrPos mCrrPos; + /* 0x424 */ dBgS_LinkAcch mAcch; + /* 0x5E8 */ dBgS_AcchCir mAcchCir; + /* 0x628 */ f32 field_0x628; + /* 0x62C */ f32 field_0x62c; + /* 0x630 */ u16 field_0x630; + /* 0x632 */ u16 field_0x632; + /* 0x634 */ cXyz field_0x634; + /* 0x640 */ int field_0x640; + /* 0x648 */ u64 mPlayerName; + /* 0x650 */ u32 field_0x650; + /* 0x654 */ int field_0x654; + /* 0x658 */ u16 field_0x658; + /* 0x65A */ u16 field_0x65a; + /* 0x65C */ u16 field_0x65c; + /* 0x65E */ u16 field_0x65e; + /* 0x660 */ u16 field_0x660; + /* 0x662 */ u16 field_0x662; + /* 0x664 */ u16 field_0x664; + /* 0x666 */ u8 mPortNo; + /* 0x667 */ u8 field_0x667[0x669 - 0x667]; + /* 0x669 */ u8 mMode; + /* 0x66A */ u8 mUploadAction; + /* 0x66B */ u8 field_0x66b; + /* 0x66C */ u8 field_0x66c; + /* 0x66D */ u8 field_0x66d; + /* 0x66E */ u8 field_0x66e; + /* 0x66F */ s8 field_0x66f; + /* 0x670 */ u8 field_0x670; + /* 0x671 */ u8 field_0x671; + /* 0x672 */ u8 field_0x672; + /* 0x673 */ u8 field_0x673; + /* 0x674 */ u8 field_0x674; + /* 0x675 */ u8 field_0x675; + /* 0x676 */ u8 field_0x676; + /* 0x677 */ u8 field_0x677; + /* 0x678 */ u8 field_0x678; + /* 0x679 */ u8 field_0x679; + /* 0x67A */ bool field_0x67a; + /* 0x67B */ u8 field_0x67b; + /* 0x67C */ u8 field_0x67c; + /* 0x67D */ u8 field_0x67d; + /* 0x67E */ u8 field_0x67e; + /* 0x67F */ u8 field_0x67f; + /* 0x680 */ u8 field_0x680; + /* 0x684 */ dPa_followEcallBack field_0x684; +}; + +#endif /* D_A_AGB_H */ \ No newline at end of file diff --git a/include/d/actor/d_a_player.h b/include/d/actor/d_a_player.h index 1ea7d325d..b7635d71a 100644 --- a/include/d/actor/d_a_player.h +++ b/include/d/actor/d_a_player.h @@ -90,14 +90,14 @@ public: /* 0x300 */ f32 field_0x300; /* 0x304 */ daPy_demo_c mDemo; - virtual MtxP getLeftHandMatrix(); - virtual MtxP getRightHandMatrix(); - virtual void getGroundY(); + virtual MtxP getLeftHandMatrix() = 0; + virtual MtxP getRightHandMatrix() = 0; + virtual void getGroundY() = 0; virtual void getTactMusic() const; virtual void getTactTimerCancel() const; virtual void checkPlayerGuard() const; virtual void getGrabMissActor(); - virtual void checkPlayerFly() const; + virtual u32 checkPlayerFly() const; virtual void checkFrontRoll() const; virtual void checkBottleSwing() const; virtual void checkCutCharge() const; @@ -106,8 +106,8 @@ public: virtual void setTactZev(unsigned int, int, char*); virtual void onDekuSpReturnFlg(u8); virtual void checkComboCutTurn() const; - virtual f32 getBaseAnimeFrameRate(); - virtual void getBaseAnimeFrame(); + virtual f32 getBaseAnimeFrameRate() = 0; + virtual void getBaseAnimeFrame() = 0; virtual void getItemID() const; virtual void getThrowBoomerangID() const; virtual void getGrabActorID() const; diff --git a/include/d/actor/d_a_player_link.h b/include/d/actor/d_a_player_link.h index 05fa50c6f..7f7f75d54 100644 --- a/include/d/actor/d_a_player_link.h +++ b/include/d/actor/d_a_player_link.h @@ -97,11 +97,6 @@ public: /* 0x0 */ u8 field_0x0[0x28]; }; -class dPa_smokeEcallBack { -public: - /* 0x0 */ u8 field_0x0[0x20]; -}; - class dPa_cutTurnEcallBack_c { public: /* 0x0 */ u8 field_0x0[0x10]; @@ -189,11 +184,9 @@ public: void getBoomerangCatchPos() const; void getLineTopPos(); void getHookshotRootPos() const; - void getModelJointMtx(u16); void seStartOnlyReverb(u32); void seStartMapInfo(u32); void seStartSwordCut(u32); - void voiceStart(u32); void itemButton() const; void itemTrigger() const; void getReadyItem(); @@ -223,8 +216,6 @@ public: void setTextureScrollResource(J3DAnmTextureSRTKey*, int); void loadTextureScrollResource(u32, int); void playTextureAnime(); - void checkPlayerGuard() const; - void setOutPower(f32, s16, int); void checkSightLine(f32, cXyz*); void setBootsModel(J3DModel**); void setItemModel(); @@ -482,14 +473,7 @@ public: void setHandModel(daPy_lk_c::daPy_ANM); void getAnmData(daPy_lk_c::daPy_ANM) const; void checkGrabWeapon(int); - void onDekuSpReturnFlg(u8); - void changeTextureAnime(u16, u16, int); - void setThrowDamage(cXyz*, s16, f32, f32, int); - void setPlayerPosAndAngle(cXyz*, s16); - void setPlayerPosAndAngle(cXyz*, csXyz*); - void setPlayerPosAndAngle(float(*)[4]); void endDemoMode(); - void getBokoFlamePos(cXyz*); void setAuraEffect(); void setWaterRipple(); void setFootEffectType(int, cXyz*, int, int); @@ -708,7 +692,6 @@ public: void procCrawlEnd_init(int, s16, s16); void procCrawlEnd(); void checkGrabSpecialHeavyState(); - void getGrabMissActor(); void setWeaponBlur(); void checkGrabBarrelSearch(int); void setGrabItemPos(); @@ -835,27 +818,6 @@ public: void procRopeThrowCatch(); void procRopeUpHang_init(); void procRopeUpHang(); - void checkRopeReadyAnime() const; - void checkRopeTag(); - void checkPlayerNoDraw(); - void getGroundY(); - MtxP getLeftHandMatrix(); - MtxP getRightHandMatrix(); - void checkPlayerFly() const; - void checkFrontRoll() const; - void checkBottleSwing() const; - void checkCutCharge() const; - void checkTactWait() const; - f32 getBaseAnimeFrameRate(); - void getBaseAnimeFrame(); - void getItemID() const; - void getThrowBoomerangID() const; - void getGrabActorID() const; - void checkGrabBarrel(); - void onFrollCrashFlg(u32); - void getOldSpeedY(); - void checkComboCutTurn() const; - void cancelChangeTextureAnime(); void checkBoomerangAnime() const; void throwBoomerang(); void returnBoomerang(); @@ -886,7 +848,6 @@ public: void procBowMove_init(); void procBowMove(); void checkHookshotReturn(); - void setHookshotCarryOffset(unsigned int, const cXyz*); void setHookshotModel(); void setHookshotSight(); void freeHookshotItem(); @@ -919,11 +880,8 @@ public: void checkEndTactMusic() const; void getTactMetronomeRate(); void checkTactLastInput(); - void setTactZev(unsigned int, int, char*); void getTactTopPos(cXyz*); void getTactNormalWait() const; - void getTactMusic() const; - void getTactTimerCancel() const; void checkTactPlayMelody(); void resetTactCount(); void procTactWait_init(int); @@ -1043,6 +1001,44 @@ public: void procCutKesa(); void checkNoControll() const; + virtual MtxP getLeftHandMatrix(); + virtual MtxP getRightHandMatrix(); + virtual void getGroundY(); + virtual void getTactMusic() const; + virtual void getTactTimerCancel() const; + virtual void checkPlayerGuard() const; + virtual void getGrabMissActor(); + virtual u32 checkPlayerFly() const; + virtual void checkFrontRoll() const; + virtual void checkBottleSwing() const; + virtual void checkCutCharge() const; + virtual void getBokoFlamePos(cXyz*); + virtual void checkTactWait() const; + virtual void setTactZev(unsigned int, int, char*); + virtual void onDekuSpReturnFlg(u8); + virtual void checkComboCutTurn() const; + virtual f32 getBaseAnimeFrameRate(); + virtual void getBaseAnimeFrame(); + virtual void getItemID() const; + virtual void getThrowBoomerangID() const; + virtual void getGrabActorID() const; + virtual void checkGrabBarrel(); + virtual void checkPlayerNoDraw(); + virtual void checkRopeTag(); + virtual void checkRopeReadyAnime() const; + virtual void voiceStart(u32); + virtual void setOutPower(f32, s16, int); + virtual void onFrollCrashFlg(u32); + virtual void getModelJointMtx(u16); + virtual void getOldSpeedY(); + virtual void setHookshotCarryOffset(unsigned int, const cXyz*); + virtual void setPlayerPosAndAngle(cXyz*, s16); + virtual void setPlayerPosAndAngle(cXyz*, csXyz*); + virtual void setPlayerPosAndAngle(float (*)[4]); + virtual void setThrowDamage(cXyz*, s16, f32, f32, int); + virtual void changeTextureAnime(u16, u16, int); + virtual void cancelChangeTextureAnime(); + /* 0x0320 */ request_of_phase_process_class mPhsLoad; /* 0x0328 */ J3DModelData* mpModelData; /* 0x032C */ J3DModel* mpCLModel; @@ -1218,7 +1214,8 @@ public: /* 0x3532 */ s16 field_0x3532; /* 0x3534 */ u8 field_0x3534[0x3544 - 0x3534]; /* 0x3544 */ s16 field_0x3544; - /* 0x3546 */ u8 field_0x3546[0x354E - 0x3546]; + /* 0x3546 */ u8 field_0x3546[0x354C - 0x3546]; + /* 0x354C */ s16 field_0x354c; /* 0x354E */ s16 field_0x354e; /* 0x3550 */ u8 field_0x3550[0x3554 - 0x3550]; /* 0x3554 */ s16 field_0x3554; diff --git a/include/d/d_bg_s.h b/include/d/d_bg_s.h index 6e04b5a6a..db8171b31 100644 --- a/include/d/d_bg_s.h +++ b/include/d/d_bg_s.h @@ -3,6 +3,10 @@ #include "SSystem/SComponent/c_sxyz.h" #include "SSystem/SComponent/c_xyz.h" +#include "SSystem/SComponent/c_bg_s_gnd_chk.h" +#include "SSystem/SComponent/c_bg_s_lin_chk.h" +#include "SSystem/SComponent/c_m3d_g_cyl.h" +#include "d/d_bg_s_chk.h" #include "d/d_bg_w.h" #include "global.h" @@ -122,4 +126,52 @@ public: bool WaterChk(dBgS_SplGrpChk* chk) { return SplGrpChk(chk); } }; // Size: 0x1404 +class dBgS_CrrPos : public cBgS_PolyInfo, public dBgS_Chk, public cBgS_Chk { +public: + dBgS_CrrPos(); + void CrrPos(dBgS&); + + virtual ~dBgS_CrrPos() {} + + void Set(cXyz* i_pos, cXyz* i_line, void* param_2, cXyz* param_3) { + mpLine0 = i_line; + pm_pos = i_pos; + field_0x058 = param_2; + SetActorPid(-1); + field_0x3c = param_3->y; + field_0x40 = param_3->z; + } + + void SetGndUpY(f32 param_0) { mOffsY2 = param_0; } + + void ClrNoRoof() { + mGndChk.OffWall(); + field_0x38 &= ~8; + } + + /* 0x038 */ u32 field_0x38; + /* 0x03C */ f32 field_0x3c; + /* 0x040 */ f32 field_0x40; + /* 0x044 */ cXyz* pm_pos; + /* 0x048 */ cXyz* mpLine0; + /* 0x04C */ u8 field_0x04C[0x058 - 0x04C]; + /* 0x058 */ void* field_0x058; + /* 0x05C */ f32 field_0x05c; + /* 0x060 */ u8 field_0x060; + /* 0x064 */ f32 mOffsY2; + /* 0x068 */ f32 field_0x068; + /* 0x06C */ cM3dGCyl mCyl0; + /* 0x084 */ cM3dGCyl mCyl1; + /* 0x09C */ cM3dGLin mLin; + /* 0x0B8 */ cBgS_GndChk mGndChk; + /* 0x0F8 */ cBgS_LinChk mLinChk; +}; // Size: 0x150 + +class dBgS_LinkCrrPos : public dBgS_CrrPos { +public: + dBgS_LinkCrrPos(); + + virtual ~dBgS_LinkCrrPos() {} +}; + #endif /* D_BG_D_BG_S_H */ \ No newline at end of file diff --git a/include/d/d_bg_s_acch.h b/include/d/d_bg_s_acch.h index a79861f78..a1125fd00 100644 --- a/include/d/d_bg_s_acch.h +++ b/include/d/d_bg_s_acch.h @@ -194,9 +194,9 @@ STATIC_ASSERT(sizeof(dBgS_Acch) == 0x1C4); class dBgS_LinkAcch : public dBgS_Acch { public: - dBgS_LinkAcch() { /* SetLink(); */ } + dBgS_LinkAcch() { SetLink(); } - /* 80140F30 */ virtual ~dBgS_LinkAcch(); + /* 80140F30 */ virtual ~dBgS_LinkAcch() {} }; class dBgS_ObjAcch : public dBgS_Acch { diff --git a/include/d/d_com_inf_game.h b/include/d/d_com_inf_game.h index 5b2677374..d8607ad30 100644 --- a/include/d/d_com_inf_game.h +++ b/include/d/d_com_inf_game.h @@ -165,7 +165,7 @@ public: s8 getPlayerCameraID(int idx) { return mCurCamera[idx]; } int getItemRupeeCount() { return mItemRupeeCount; } - void setItemRupeeCount(int count) { mItemRupeeCount += count; } + void setItemRupeeCount(s32 count) { mItemRupeeCount += count; } void setMessageCountNumber(s16 num) { mMsgCountNumber = num; } void setLkDemoAnmArchive(JKRArchive* i_arc) { mpLkDArc = i_arc; } @@ -189,7 +189,17 @@ public: s32 getTimerMode() { return mTimerInfo.mTimerMode; } s16 getItemMagicCount() { return mItemMagicCount; } - void setItemMagicCount(s16 magic) { mItemMagicCount = magic; } + void setItemMagicCount(s16 magic) { mItemMagicCount += magic; } + + void setItemLifeCount(f32 num) { + mItemLifeCount += num; + } + + u8 checkMesgCancelButton() { return field_0x4949; } + + void setPlayerStatus(int param_0, int i, u32 flag) { mPlayerStatus[param_0][i] |= flag; } + void clearPlayerStatus(int param_0, int i, u32 flag) { mPlayerStatus[param_0][i] &= ~flag; } + bool checkPlayerStatus(int param_0, int i, u32 flag) { return flag & mPlayerStatus[param_0][i]; } /* 0x0000 */ dBgS mBgS; /* 0x1404 */ dCcS mCcS; @@ -572,6 +582,10 @@ inline BOOL dComIfGs_isSwitch(s32 i_no, s32 i_roomNo) { return g_dComIfG_gameInfo.save.isSwitch(i_no, i_roomNo); } +inline void dComIfGs_revSwitch(int i_no, int i_roomNo) { + g_dComIfG_gameInfo.save.revSwitch(i_no, i_roomNo); +} + inline void dComIfGs_onItem(int bitNo, int roomNo) { g_dComIfG_gameInfo.save.onItem(bitNo, roomNo); } @@ -676,6 +690,38 @@ inline void dComIfGs_setWindX(s16 i_windX) { g_dComIfG_gameInfo.save.getPlayer().getPlayerStatusB().setWindX(i_windX); } +inline const char* dComIfGs_getPlayerName() { + return g_dComIfG_gameInfo.save.getPlayer().getPlayerInfo().getPlayerName(); +} + +inline u8 dComIfGs_getGbaRupeeCount() { + return g_dComIfG_gameInfo.save.getDan().getGbaRupeeCount(); +} + +inline void dComIfGs_incGbaRupeeCount() { + g_dComIfG_gameInfo.save.getDan().incGbaRupeeCount(); +} + +inline u8 dComIfGs_checkBaitItemEmpty() { + return g_dComIfG_gameInfo.save.getPlayer().getBagItem().checkBaitItemEmpty(); +} + +inline u8 dComIfGs_getBombMax() { + return g_dComIfG_gameInfo.save.getPlayer().getItemMax().getBombNum(); +} + +inline u8 dComIfGs_getArrowMax() { + return g_dComIfG_gameInfo.save.getPlayer().getItemMax().getArrowNum(); +} + +inline u16 dComIfGs_getMaxLife() { + return g_dComIfG_gameInfo.save.getPlayer().getPlayerStatusA().getMaxLife(); +} + +inline u8 dComIfGs_getMaxMagic() { + return g_dComIfG_gameInfo.save.getPlayer().getPlayerStatusA().getMaxMagic(); +} + /** * === PLAY === */ @@ -996,10 +1042,14 @@ inline int dComIfGp_getItemRupeeCount() { return g_dComIfG_gameInfo.play.getItemRupeeCount(); } -inline void dComIfGp_setItemRupeeCount(int count) { +inline void dComIfGp_setItemRupeeCount(s32 count) { g_dComIfG_gameInfo.play.setItemRupeeCount(count); } +inline void dComIfGp_setItemLifeCount(f32 amount) { + g_dComIfG_gameInfo.play.setItemLifeCount(amount); +} + inline void dComIfGp_setMessageCountNumber(s16 num) { g_dComIfG_gameInfo.play.setMessageCountNumber(num); } @@ -1016,6 +1066,19 @@ inline void dComIfGp_setItemMagicCount(s16 magic) { g_dComIfG_gameInfo.play.setItemMagicCount(magic); } +inline u8 dComIfGp_checkMesgCancelButton() { + return g_dComIfG_gameInfo.play.checkMesgCancelButton(); +} + +inline bool dComIfGp_checkPlayerStatus0(int param_0, u32 flag) { + return g_dComIfG_gameInfo.play.checkPlayerStatus(param_0, 0, flag); +} + +inline bool dComIfGp_checkPlayerStatus1(int param_0, u32 flag) { + return g_dComIfG_gameInfo.play.checkPlayerStatus(param_0, 1, flag); +} + + /** * === EVENT ===*/ diff --git a/include/d/d_event_manager.h b/include/d/d_event_manager.h index b9df33a52..e3044c15d 100644 --- a/include/d/d_event_manager.h +++ b/include/d/d_event_manager.h @@ -38,7 +38,7 @@ public: s16 getEventIdx(const char*, u8); void order(s16); void startCheck(s16); - void startCheckOld(const char*); + BOOL startCheckOld(const char*); BOOL endCheck(s16); BOOL endCheckOld(const char*); int getMyStaffId(const char*, fopAc_ac_c*, int); diff --git a/include/d/d_kankyo_wether.h b/include/d/d_kankyo_wether.h index 6fd6189b8..e4041dbeb 100644 --- a/include/d/d_kankyo_wether.h +++ b/include/d/d_kankyo_wether.h @@ -297,7 +297,8 @@ struct KAMOME_EFF { /* 0x10 */ s16 field_0x10; /* 0x12 */ s16 field_0x12; /* 0x14 */ f32 field_0x14; - /* 0x18 */ u8 field_0x18[0x1E - 0x18]; + /* 0x18 */ f32 field_0x18; + /* 0x1C */ s16 field_0x1c; /* 0x1E */ u8 field_0x1e; }; diff --git a/include/d/d_map.h b/include/d/d_map.h index bbb0695ee..d66d314e9 100644 --- a/include/d/d_map.h +++ b/include/d/d_map.h @@ -6,7 +6,7 @@ class dMap_c { public: static void create(); void isEnableEnlargementScroll(); - void isEnableDispMap(); + static bool isEnableDispMap(); void getKindMapType(); static void remove(); void setImage(int, int, f32); @@ -17,7 +17,7 @@ public: void mapDrawFrame(u8); void mapDrawEnlargementSize(f32, f32, f32, f32, u8); void mapDrawRealSize(f32, f32, u8); - void mapAGBSendIslandData(); + static void mapAGBSendIslandData(); void setPlayerStayAgbMapTypeNow(f32, f32); void agbMapNoSet(u8, u8); void agbMapNoSetCall(); @@ -62,7 +62,7 @@ public: void drawPointMain(u8, u8, f32, f32, f32, s8, s16, u8, u8, u8, u8); void drawPointAgb(u8, f32, f32, f32, s8, s16, u8, u8, u8, u8); void getTypeAgbGcFromTypeAcs(u8, u8*, u8*); - void drawPointSingle(u8, f32, f32, f32, s8, s16, u8, u8, u8); + static void drawPointSingle(u8, f32, f32, f32, s8, s16, u8, u8, u8); void drawActorPointMiniMap(fopAc_ac_c*); void mapBufferSendAGB_commonCursor(); void mapBufferSendAGB_ocean(); diff --git a/include/d/d_save.h b/include/d/d_save.h index 8fe301f3a..1500beb42 100644 --- a/include/d/d_save.h +++ b/include/d/d_save.h @@ -12,6 +12,8 @@ public: u8 getWalletSize() { return mWalletSize; } int getRupee() const { return mRupee; } u8 getMagic() { return mMagic; } + u8 getMaxMagic() { return mMaxMagic; } + u16 getMaxLife() { return mMaxLife; } /* 0x00 */ u16 mMaxLife; /* 0x02 */ u16 mLife; @@ -128,6 +130,9 @@ class dSv_player_item_max_c { public: /* 800598D8 */ void init(); + u8 getArrowNum() const { return mArrowNum; } + u8 getBombNum() const { return mBombNum; } + /* 0x0 */ u8 field_0x0; /* 0x1 */ u8 mArrowNum; /* 0x2 */ u8 mBombNum; @@ -260,6 +265,8 @@ class dSv_player_info_c { public: /* 8005BE84 */ void init(); + const char* getPlayerName() const { return mPlayerName; } + /* 0x00 */ u8 field_0x0[0x10]; /* 0x10 */ u16 field_0x10; /* 0x10 */ u16 field_0x12; @@ -492,8 +499,11 @@ public: /* 8005CD60 */ BOOL isSwitch(int); /* 8005CE10 */ BOOL revSwitch(int); + u8 getGbaRupeeCount() { return mGbaRupeeCount; } + void incGbaRupeeCount() { mGbaRupeeCount++; } + /* 0x0 */ s8 mStageNo; - /* 0x1 */ u8 field_0x1; + /* 0x1 */ u8 mGbaRupeeCount; /* 0x4 */ u32 mSwitch[2]; }; // Size: 0xC @@ -645,6 +655,7 @@ public: dSv_restart_c& getRestart() { return mRestart; } dSv_turnRestart_c& getTurnRestart() { return mTurnRestart; } dSv_memory_c& getMemory() { return mMemory; } + dSv_danBit_c& getDan() { return mDan; } dSv_zone_c& getZone(int id) { return mZone[id]; } void removeZone(int zoneNo) { mZone[zoneNo].reset(); } diff --git a/include/f_op/f_op_actor_mng.h b/include/f_op/f_op_actor_mng.h index 85f10094b..6e944808b 100644 --- a/include/f_op/f_op_actor_mng.h +++ b/include/f_op/f_op_actor_mng.h @@ -548,8 +548,8 @@ inline void fopAcM_seStartCurrent(fopAc_ac_c* actor, u32 sfxID, u32 param_2) { } inline void fopAcM_seStart(fopAc_ac_c* actor, u32 sfxID, u32 param_2) { - s8 roomNo = fopAcM_GetRoomNo(actor); - // mDoAud_seStart(sfxID, &actor->mEyePos, param_2, dComIfGp_getReverb(roomNo)); + s32 roomNo = fopAcM_GetRoomNo(actor); + mDoAud_seStart(sfxID, &actor->mEyePos, param_2, dComIfGp_getReverb(roomNo)); } extern "C" { diff --git a/include/f_op/f_op_msg_mng.h b/include/f_op/f_op_msg_mng.h index 80a69df88..77f584b3f 100644 --- a/include/f_op/f_op_msg_mng.h +++ b/include/f_op/f_op_msg_mng.h @@ -67,5 +67,6 @@ inline s32 fopMsgM_Timer_create(s16 param_0, u8 param_1, u32 param_2, u8 param_3 } u32 fopMsgM_searchMessageNumber(u32); +void fopMsgM_messageSendOn(); #endif diff --git a/include/m_Do/m_Do_dvd_thread.h b/include/m_Do/m_Do_dvd_thread.h index f118bde03..3cc236728 100644 --- a/include/m_Do/m_Do_dvd_thread.h +++ b/include/m_Do/m_Do_dvd_thread.h @@ -31,6 +31,7 @@ public: /* 800164BC */ virtual s32 execute(); void* getMemAddress() const { return mData; } + s32 getMemSize() const { return mDataSize; } private: /* 0x14 */ u8 mMountDirection; diff --git a/include/m_Do/m_Do_gba_com.h b/include/m_Do/m_Do_gba_com.h index fa925c341..9a3750be2 100644 --- a/include/m_Do/m_Do_gba_com.h +++ b/include/m_Do/m_Do_gba_com.h @@ -36,7 +36,7 @@ public: int mDoGaC_SendEntry(u8, u32); int mDoGaC_SendStatusCheck(u8); int mDoGaC_SendEndCheck(u8); - bool mDoGaC_RecvStatusCheck(u8); + BOOL mDoGaC_RecvStatusCheck(u8); void mDoGaC_DataStatusReset(u8); int mDoGaC_StatusSendSet(u8); void mDoGaC_ProbeCheck0(); @@ -96,6 +96,8 @@ public: extern mDoGaC_agbCom_c g_mDoGaC_gbaCom; extern mDoGaC_DataManag_c TestDataManager[16]; +u32 BigLittleChange(u32); + inline u8 mDoGaC_getPortNo() { return g_mDoGaC_gbaCom.getPortNo(); } diff --git a/include/m_Do/m_Do_lib.h b/include/m_Do/m_Do_lib.h index 894aacdd5..9b2044915 100644 --- a/include/m_Do/m_Do_lib.h +++ b/include/m_Do/m_Do_lib.h @@ -44,9 +44,4 @@ u8 mDoLib_setResTimgObj(ResTIMG const* res, GXTexObj* o_texObj, u32 tlut_name, GXTlutObj* o_tlutObj); void mDoLib_pos2camera(Vec* src, Vec* dst); -// was causing redefinition issues -//inline u32 calcAlphaCmpID(u32 param_1, u32 param_2, u32 param_3) { -// return ((param_1 & 0xff) << 5) + ((param_2 & 0xff) << 3) + (param_3 & 0xff); -//} - #endif /* M_DO_M_DO_LIB_H */ diff --git a/src/SSystem/SComponent/c_bg_s_gnd_chk.cpp b/src/SSystem/SComponent/c_bg_s_gnd_chk.cpp index 8356377c0..67101fd9c 100644 --- a/src/SSystem/SComponent/c_bg_s_gnd_chk.cpp +++ b/src/SSystem/SComponent/c_bg_s_gnd_chk.cpp @@ -9,6 +9,6 @@ /* 8024738C-80247418 .text __ct__11cBgS_GndChkFv */ cBgS_GndChk::cBgS_GndChk() { m_pos = cXyz::Zero; - setActorPid(0xFFFFFFFF); + SetActorPid(0xFFFFFFFF); mFlags = 2; } diff --git a/src/SSystem/SComponent/c_bg_s_lin_chk.cpp b/src/SSystem/SComponent/c_bg_s_lin_chk.cpp index e35a2f9fd..cdd092f08 100644 --- a/src/SSystem/SComponent/c_bg_s_lin_chk.cpp +++ b/src/SSystem/SComponent/c_bg_s_lin_chk.cpp @@ -12,7 +12,7 @@ void cBgS_LinChk::ct() { mLin.mStart = zero; mLin.mEnd = zero; field_0x40 = zero; - setActorPid(-1); + SetActorPid(-1); field_0x4c = 0; mFrontFlag = 1; mBackFlag = 0; @@ -23,7 +23,7 @@ void cBgS_LinChk::Set2(cXyz* pStart, cXyz* pEnd, unsigned int actorPid) { mLin.mStart.set(*pStart); mLin.mEnd.set(*pEnd); field_0x40 = *pEnd; - setActorPid(actorPid); + SetActorPid(actorPid); field_0x4c &= ~0x10; ClearPi(); } diff --git a/src/d/actor/d_a_agb.cpp b/src/d/actor/d_a_agb.cpp index e67c04c9d..6e8a671b4 100644 --- a/src/d/actor/d_a_agb.cpp +++ b/src/d/actor/d_a_agb.cpp @@ -3,157 +3,875 @@ // Translation Unit: d_a_agb.cpp // -#include "d_a_agb.h" -#include "dolphin/types.h" +#include "d/actor/d_a_agb.h" +#include "JSystem/JKernel/JKRHeap.h" +#include "JSystem/JUtility/JUTAssert.h" +#include "JSystem/JUtility/JUTGba.h" +#include "d/actor/d_a_player_link.h" +#include "d/d_bg_s_lin_chk.h" +#include "d/d_com_inf_game.h" +#include "d/d_item_data.h" +#include "d/d_meter.h" +#include "d/d_procname.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" + +// stripped or compiler generated? +static u32 unused_lit_2100[] = {0x3F800000, 0x3F800000, 0x3F800000, + 0x3F800000, 0x3F800000, 0x3F800000}; + +// temp +class daNpc_Md_c { +public: + static bool m_flying; +}; + +class daNpc_Cb1_c { +public: + static bool m_flying; +}; + +class daBomb_c { +public: + enum State_e { + STATE_8_e = 8, + }; + + static u32 prm_make(State_e, bool, bool); +}; + +static mDoDvdThd_toMainRam_c* l_gbaCommand; + +int daAgb_c::mEffect; +u8 daAgb_c::mItemBuy; +daAgb_c::daAgb_GbaFlg daAgb_c::mGbaFlg; +daAgb_c::daAgb_Switch daAgb_c::mSwitch; +daAgb_c::daAgb_Item daAgb_c::mItem; +u8 daAgb_c::mShop; /* 800CF5EC-800CF6B8 .text __ct__11daAgb_HIO_cFv */ daAgb_HIO_c::daAgb_HIO_c() { - /* Nonmatching */ + field_0x04[0].r = 0; + field_0x04[0].g = 255; + field_0x04[0].b = 0; + field_0x04[0].a = 255; + + field_0x04[1].r = 0; + field_0x04[1].g = 30; + field_0x04[1].b = 0; + field_0x04[1].a = 0; + + field_0x14 = 24.0f; + field_0x18 = 50.0f; + field_0x1c = 781.25f; + field_0x20 = 170.0f; + field_0x24 = 0.0f; + field_0x28 = 5.0f; + field_0x2c = 10.0f; + field_0x30 = 15.0f; } -/* 800CF6B8-800CF700 .text __dt__14mDoHIO_entry_cFv */ -mDoHIO_entry_c::~mDoHIO_entry_c() { - /* Nonmatching */ -} +static daAgb_HIO_c l_HIO; /* 800CF700-800CF71C .text init__10dMsgCtrl_cFUs */ -void dMsgCtrl_c::init(unsigned short) { - /* Nonmatching */ +int dMsgCtrl_c::init(u16 param_0) { + field_0x0 = param_0; + mMsgID = -1; + mpMsg = NULL; + return 1; } /* 800CF71C-800CF7B4 .text execute__10dMsgCtrl_cFv */ -void dMsgCtrl_c::execute() { - /* Nonmatching */ +int dMsgCtrl_c::execute() { + if (mMsgID == -1) { + mMsgID = fopMsgM_messageSet(field_0x0); + } else if (mpMsg == NULL) { + mpMsg = fopMsgM_SearchByID(mMsgID); + } else { + if (mpMsg->mMode == 18) { + mpMsg->mMode = 19; + dComIfGp_event_onEventFlag(8); + } + + return mpMsg->mMode; + } + + return -1; } +static dMsgCtrl_c l_msgCtrl; + /* 800CF7B4-800CF7F8 .text sjis2chrNo__FUc */ -void sjis2chrNo(unsigned char) { - /* Nonmatching */ +u8 sjis2chrNo(u8 i_chr) { + static u8 l_sjis2chrNo[] = { + ' ', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', + 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', + 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', + 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', + '7', '8', '9', ' ', 0xf8, 0xd8, 0xfe, 0xde, 0x9c, 0x8c, 0xe6, 0xc6, 0xf0, 0xd0, 0xc7, + 0xe7, 0xdf, ' ', ' ', '+', 0xbf, 0xa1, 0xab, 0xbb, 0x84, 0x93, '!', ' ', '-', '?', + ' ', ' ', '(', ')', ' ', '.', ' ', 0xd7, 0xf7, '\'', '\"', 0x85, '/', 0xc0, 0xc8, + 0xcc, 0xd2, 0xd9, 0xe0, 0xe8, 0xec, 0xf2, 0xf9, 0xc1, 0xc9, 0xcd, 0xd3, 0xda, 0xdd, 0xe1, + 0xe9, 0xed, 0xf3, 0xfa, 0xfd, 0xc2, 0xca, 0xce, 0xd4, 0xdb, 0xe2, 0xea, 0xee, 0xf4, 0xfb, + 0xc3, 0xd1, 0xd5, 0xe3, 0xf1, 0xf5, 0xc4, 0xcb, 0xcf, 0xd6, 0xdc, 0x9f, 0xe4, 0xeb, 0xef, + 0xf6, 0xfc, 0xff, 0xc5, 0xe5, 0x8a, 0x9a, 0xba, 0xaa, + }; + + for (u8 i = 0; i < 159; i++) { + if (i_chr == l_sjis2chrNo[i]) { + return i; + } + } + + return 0xFF; } /* 800CF7F8-800CF894 .text NameConv__7daAgb_cFv */ void daAgb_c::NameConv() { - /* Nonmatching */ + int i; + const char* name = dComIfGs_getPlayerName(); + mPlayerName = 0; + + for (i = 0; i < 8; i++) { + u8 chr = sjis2chrNo(*name); + mPlayerName |= chr; + name++; + + if (i < 7) { + mPlayerName <<= 8; + } + } } /* 800CF894-800CFA30 .text uploadInitCheck__7daAgb_cFv */ -void daAgb_c::uploadInitCheck() { - /* Nonmatching */ +int daAgb_c::uploadInitCheck() { + s32 roomNo = dComIfGp_roomControl_getStayNo(); + dStage_FileList_dt_c* fili_p = + dComIfGp_roomControl_getStatusRoomDt(roomNo)->mRoomDt.getFileListInfo(); + + if ((dStage_stagInfo_GetSTType(dComIfGp_getStageStagInfo()) != 7 && + !dMap_c::isEnableDispMap()) || + (fili_p != NULL && (fili_p->mParam & 2))) + { + l_msgCtrl.init(1); + mUploadAction = 10; + } else if (g_mDoGaC_gbaCom.field_0x0 == 0) { + field_0x66f = 0; + field_0x678 = 0; + JUTGba::getManager()->doInitProbe(1, NULL, NULL); + JUTGba::getManager()->doInitProbe(2, NULL, NULL); + JUTGba::getManager()->doInitProbe(3, NULL, NULL); + mUploadAction = 1; + } else if (g_mDoGaC_gbaCom.mDoGaC_GbaLink()) { + l_msgCtrl.init(2); + mUploadAction = 10; + } else { + JUTGba::getManager()->doInitProbe(1, NULL, NULL); + JUTGba::getManager()->doInitProbe(2, NULL, NULL); + JUTGba::getManager()->doInitProbe(3, NULL, NULL); + mUploadAction = 1; + g_mDoGaC_gbaCom.mDoGaC_ConnectSleep(); + } + + return 1; } /* 800CFA30-800CFB68 .text uploadPortCheckWait__7daAgb_cFv */ -void daAgb_c::uploadPortCheckWait() { - /* Nonmatching */ +int daAgb_c::uploadPortCheckWait() { + u32 sp14[3]; + int sp8[3]; + + for (int i = 0; i < 3; i++) { + sp8[i] = JUTGba::getManager()->resultInitProbe(i + 1, &sp14[i]); + if (sp8[i] == -2) { + return 1; + } + } + + if (g_mDoGaC_gbaCom.mDoGaC_GbaLink()) { + l_msgCtrl.init(2); + mUploadAction = 10; + } else { + for (int i = 0; i < 3; i++) { + if (sp8[i] == 0 && sp14[i] == 0x40000) { + mPortNo = i + 1; + l_msgCtrl.init(5); + mUploadAction = 2; + return 1; + } + } + + l_msgCtrl.init(3); + mUploadAction = 10; + g_mDoGaC_gbaCom.mDoGaC_ConnectWake(); + } + + return 1; } +extern JKRHeap* dMsg_getAgbWorkArea(); + /* 800CFB68-800CFC94 .text uploadSelect__7daAgb_cFv */ -void daAgb_c::uploadSelect() { - /* Nonmatching */ +int daAgb_c::uploadSelect() { + if (l_msgCtrl.execute() == 14) { + if (dComIfGp_checkMesgCancelButton() || (int)l_msgCtrl.mpMsg->mSelectedChoiceIdx != 0) { + l_msgCtrl.mpMsg->mMode = 16; + g_mDoGaC_gbaCom.mDoGaC_ConnectWake(); + } else { + l_msgCtrl.mpMsg->mMode = 15; + fopMsgM_messageSet(6); // "Now calling Tingle..." + mUploadAction = 3; + + l_gbaCommand = + mDoDvdThd_toMainRam_c::create("/res/Gba/client_u.bin", 0, dMsg_getAgbWorkArea()); + JUT_ASSERT(860, l_gbaCommand != 0); + + g_mDoGaC_gbaCom.mDoGaC_GbaReboot(); + g_mDoGaC_gbaCom.mPortNo = mPortNo; + field_0x66f = 0; + field_0x678 = 0; + } + } + + return 1; } /* 800CFC94-800CFD60 .text uploadJoyboot1__7daAgb_cFv */ -void daAgb_c::uploadJoyboot1() { - /* Nonmatching */ +int daAgb_c::uploadJoyboot1() { + if (l_gbaCommand->sync()) { + void* programp = l_gbaCommand->getMemAddress(); + JUT_ASSERT(891, programp != 0); + + JUTGba::getManager()->doJoyBoot(mDoGaC_getPortNo(), 3, -1, (u8*)programp, + l_gbaCommand->getMemSize() - 4, NULL, NULL); + mUploadAction = 4; + field_0x664 = 450; + } + + return 1; } /* 800CFD60-800CFEA0 .text uploadJoyboot2__7daAgb_cFv */ -void daAgb_c::uploadJoyboot2() { - /* Nonmatching */ +int daAgb_c::uploadJoyboot2() { + u8 sp8[16]; + + int result = JUTGba::getManager()->resultJoyBoot(mDoGaC_getPortNo(), sp8); + if (result != -2) { + JKRHeap::free(l_gbaCommand->getMemAddress(), NULL); + delete l_gbaCommand; + + if (result == 0) { + field_0x664 = 15; + mUploadAction = 6; + } else { + l_msgCtrl.mpMsg->mMode = 15; + fopMsgM_messageSet(7); // "An error has occurred." + fopMsgM_messageSendOn(); + mUploadAction = 10; + } + } else { + field_0x664--; + if (field_0x664 == 0) { + l_msgCtrl.mpMsg->mMode = 15; + fopMsgM_messageSet(7); // "An error has occurred." + fopMsgM_messageSendOn(); + mUploadAction = 10; + + JKRHeap::free(l_gbaCommand->getMemAddress(), NULL); + delete l_gbaCommand; + } + } + + return 1; } /* 800CFEA0-800CFF58 .text uploadMessageLoad__7daAgb_cFv */ -void daAgb_c::uploadMessageLoad() { - /* Nonmatching */ +int daAgb_c::uploadMessageLoad() { + field_0x664--; + if (field_0x664 == 0) { + l_gbaCommand = mDoDvdThd_toMainRam_c::create("/res/Gba/msg_LZ.bin", 0, NULL); + JUT_ASSERT(1000, l_gbaCommand != 0); + + mUploadAction = 7; + g_mDoGaC_gbaCom.field_0x0 = 1; + g_mDoGaC_gbaCom.mDoGaC_ComStart(); + } + + return 1; } /* 800CFF58-800CFF78 .text uploadMessageLoad2__7daAgb_cFv */ -void daAgb_c::uploadMessageLoad2() { - /* Nonmatching */ +int daAgb_c::uploadMessageLoad2() { + if (l_gbaCommand->sync()) { + mUploadAction = 5; + } + + return 1; } /* 800CFF78-800D00C8 .text uploadConnect__7daAgb_cFv */ -void daAgb_c::uploadConnect() { - /* Nonmatching */ +int daAgb_c::uploadConnect() { + if (g_mDoGaC_gbaCom.field_0x0 != 0 && g_mDoGaC_gbaCom.mDoGaC_GbaLink()) { + void* programp = l_gbaCommand->getMemAddress(); + JUT_ASSERT(1045, programp != 0); + g_mDoGaC_gbaCom.mDoGaC_SendDataSet((u32*)programp, l_gbaCommand->getMemSize(), 0, 0); + + mUploadAction = 8; + NameConv(); + g_mDoGaC_gbaCom.mDoGaC_SendDataSet((u32*)&mPlayerName, sizeof(mPlayerName), 10, 0); + + dMap_c::mapAGBSendIslandData(); + } else { + g_mDoGaC_gbaCom.mDoGaC_GbaReboot(); + l_msgCtrl.mpMsg->mMode = 15; + fopMsgM_messageSet(7); // "An error has occurred." + fopMsgM_messageSendOn(); + mUploadAction = 10; + + JKRHeap::free(l_gbaCommand->getMemAddress(), NULL); + delete l_gbaCommand; + } + + return 1; } /* 800D00C8-800D01F4 .text uploadMessageSend__7daAgb_cFv */ -void daAgb_c::uploadMessageSend() { - /* Nonmatching */ +int daAgb_c::uploadMessageSend() { + if (g_mDoGaC_gbaCom.field_0x110->field_0x4 == 0) { + field_0x678 = 1; + if (field_0x67a != 0) { + l_msgCtrl.mpMsg->mMode = 15; + fopMsgM_messageSet(8); // "Tingle appeared on your Game Boy Advance!" + fopMsgM_messageSendOn(); + mUploadAction = 11; + field_0x664 = 60; + + dComIfGs_onEventBit(0x1A20); + dComIfGp_particle_set(0x2E7, ¤t.pos, NULL, NULL, 255, &field_0x684, -1, NULL, + NULL, NULL); + + JKRHeap::free(l_gbaCommand->getMemAddress(), NULL); + delete l_gbaCommand; + } + } else if (g_mDoGaC_gbaCom.field_0x110->field_0x4 == 9) { + field_0x664 = 5; + mUploadAction = 9; + } + + return 1; } /* 800D01F4-800D021C .text uploadRetryWait__7daAgb_cFv */ -void daAgb_c::uploadRetryWait() { - /* Nonmatching */ +int daAgb_c::uploadRetryWait() { + field_0x664--; + if (field_0x664 == 0) { + mUploadAction = 5; + } + + return 1; } /* 800D021C-800D0264 .text uploadMsgEndWait__7daAgb_cFv */ -void daAgb_c::uploadMsgEndWait() { - /* Nonmatching */ +int daAgb_c::uploadMsgEndWait() { + if (l_msgCtrl.execute() == 14) { + l_msgCtrl.mpMsg->mMode = 16; + } + + return 1; } /* 800D0264-800D02E8 .text uploadMsgEndTimer__7daAgb_cFv */ -void daAgb_c::uploadMsgEndTimer() { - /* Nonmatching */ +int daAgb_c::uploadMsgEndTimer() { + l_msgCtrl.execute(); + if (field_0x664 != 0) { + field_0x664--; + + if (field_0x664 == 0) { + l_msgCtrl.mpMsg->mMode = 16; + fopMsgM_messageSendOn(); + } else if (field_0x664 == 30) { + field_0x66f = 1; + } + } + + return 1; } +daAgb_c::uploadFunc daAgb_c::uploadFuncTable[] = { + &daAgb_c::uploadInitCheck, &daAgb_c::uploadPortCheckWait, &daAgb_c::uploadSelect, + &daAgb_c::uploadJoyboot1, &daAgb_c::uploadJoyboot2, &daAgb_c::uploadConnect, + &daAgb_c::uploadMessageLoad, &daAgb_c::uploadMessageLoad2, &daAgb_c::uploadMessageSend, + &daAgb_c::uploadRetryWait, &daAgb_c::uploadMsgEndWait, &daAgb_c::uploadMsgEndTimer, +}; + /* 800D02E8-800D0364 .text modeLoad__7daAgb_cFv */ void daAgb_c::modeLoad() { - /* Nonmatching */ + if (mEvtInfo.checkCommandTalk()) { + uploadFunc func = uploadFuncTable[mUploadAction]; + (this->*func)(); + } else { + mUploadAction = 0; + mEvtInfo.onCondition(1); + mMode = 0; + } } /* 800D0364-800D0490 .text modeLookAttention__7daAgb_cFv */ void daAgb_c::modeLookAttention() { - /* Nonmatching */ + static bool se_flag = false; + + if (mEvtInfo.checkCommandDemoAccrpt()) { + if (!se_flag) { + fopAcM_seStart(this, JA_SE_CV_CHI_MEGAHORN, 0); + se_flag = true; + } + + if (dComIfGp_getEventManager().endCheckOld("DEFAULT_AGB_LOOK_ATTENTION")) { + dComIfGp_event_onEventFlag(8); + mMode = 0; + se_flag = false; + + field_0x65c = 1; + if (field_0x674 == 0) { + shape_angle.x = 0; + shape_angle.y = 0; + shape_angle.z = 0; + field_0x628 = 2.5f; + } + } + } else { + fopAcM_orderOtherEvent2(this, "DEFAULT_AGB_LOOK_ATTENTION", 4, 0xFFFF); + } } +u8 daAgb_c::DungeonNoTable[] = { + 0, 11, 11, 1, 2, 3, 4, 5, 17, 17, 17, 17, 17, 17, 17, 17, +}; + /* 800D0490-800D0580 .text DungeonNoGet__7daAgb_cFv */ -void daAgb_c::DungeonNoGet() { - /* Nonmatching */ +u8 daAgb_c::DungeonNoGet() { + u8 var_r0 = DungeonNoTable[field_0x66c]; + + u8 dungeon_no = var_r0; + if (dungeon_no == 0) { + if (field_0x67e != 0) { + switch (field_0x66d) { + case 1: + dungeon_no = 10; + break; + case 11: + dungeon_no = 6; + break; + case 13: + dungeon_no = 7; + break; + case 41: + dungeon_no = 8; + break; + case 44: + dungeon_no = 9; + break; + case 4: + dungeon_no = 14; + break; + case 20: + dungeon_no = 15; + break; + case 23: + dungeon_no = 12; + break; + case 40: + dungeon_no = 16; + break; + case 45: + dungeon_no = 13; + break; + } + } + + if (field_0x66d != field_0x66e) { + resetCursor(true); + } + } + + field_0x66e = field_0x66d; + return dungeon_no; } /* 800D0580-800D05D4 .text MapNoSet__7daAgb_cFUcUcUc */ -void daAgb_c::MapNoSet(unsigned char, unsigned char, unsigned char) { - /* Nonmatching */ +void daAgb_c::MapNoSet(u8 param_0, u8 param_1, u8 param_2) { + field_0x66c = param_0; + field_0x66d = param_1; + field_0x67e = param_2 != 0; + field_0x670 = 1; + + mFlags.field_0xb_3 = DungeonNoGet(); } /* 800D05D4-800D05F0 .text onFree__7daAgb_cFv */ void daAgb_c::onFree() { - /* Nonmatching */ + field_0x671 = 1; + field_0x650 = -1; + field_0x677 = 0; } /* 800D05F0-800D0608 .text onHold__7daAgb_cFv */ void daAgb_c::onHold() { - /* Nonmatching */ + field_0x674 = 1; + mBrk.setPlaySpeed(6.0f); } /* 800D0608-800D0620 .text offHold__7daAgb_cFv */ void daAgb_c::offHold() { - /* Nonmatching */ + field_0x674 = 0; + mBrk.setPlaySpeed(1.0f); } /* 800D0620-800D070C .text resetCursor__7daAgb_cFb */ -void daAgb_c::resetCursor(bool) { - /* Nonmatching */ +void daAgb_c::resetCursor(bool param_0) { + fopAc_ac_c* player_p = dComIfGp_getPlayer(0); + field_0x671 = 0; + field_0x677 = 0; + field_0x650 = -1; + + if (fopAcM_GetName(player_p) != PROC_NPC_KAM) { + current.pos = player_p->current.pos; + orig.pos = player_p->current.pos; + } else { + current.pos = daPy_getPlayerLinkActorClass()->current.pos; + orig.pos = daPy_getPlayerLinkActorClass()->current.pos; + } + + field_0x628 = 2.5f; + shape_angle.x = 0; + shape_angle.y = 0; + shape_angle.z = 0; + + if (param_0) { + if (field_0x66b == 14) { + field_0x65c = 0; + } + + field_0x675 = 0; + field_0x676 = 0; + } + + field_0x674 = 0; + mBrk.setPlaySpeed(1.0f); } /* 800D070C-800D0734 .text FlashCheck__7daAgb_cFv */ -void daAgb_c::FlashCheck() { - /* Nonmatching */ +bool daAgb_c::FlashCheck() { + if (field_0x671 != 0 || field_0x677 == 1) { + return true; + } + + return false; } /* 800D0734-800D0978 .text FlagsRecv__7daAgb_cFv */ +// NONMATCHING - a lot of issues, not really sure what's going on here void daAgb_c::FlagsRecv() { - /* Nonmatching */ + int portNo = mDoGaC_getPortNo(); + interface_of_controller_pad* pad_p = &g_mDoCPd_cpadInfo[portNo]; + u32 temp_r3 = BigLittleChange(mGbaFlg.field_0x0); + + u32 temp_r0 = temp_r3 >> 0x10U; + pad_p->mButtonHold0 = (u8)((pad_p->mButtonHold0 & ~0x10) | ((temp_r3 >> 0x12) & 0x10)); + pad_p->mButtonHold0 = (u8)((pad_p->mButtonHold0 & ~0x20) | ((temp_r3 >> 0x12) & 0x20)); + pad_p->mButtonHold0 = (u8)((pad_p->mButtonHold0 & ~0x80) | ((temp_r3 >> 0xE) & 0x80)); + pad_p->mButtonHold0 = (u8)((pad_p->mButtonHold0 & ~0x40) | ((temp_r3 >> 0xE) & 0x40)); + pad_p->mButtonHold0 = (u8)((pad_p->mButtonHold0 & ~1) | ((temp_r3 >> 0x10) & 1)); + pad_p->mButtonHold1 = (u8)((pad_p->mButtonHold1 & ~0x80) | ((temp_r3 >> 0xA) & 0x80)); + pad_p->mButtonHold0 = (u8)((pad_p->mButtonHold0 & ~4) | ((temp_r3 >> 0x16) & 4)); + pad_p->mButtonHold0 = (u8)((pad_p->mButtonHold0 & ~2) | ((temp_r3 >> 0x18) & 2)); + pad_p->mButtonHold1 = + (u8)((pad_p->mButtonHold1 & ~0x10) | ((((temp_r3 >> 0x13) & 1) << 4) & 0x10)); + + u32 temp_r5 = temp_r0 & (temp_r0 ^ field_0x65a); + pad_p->mButtonTrig0 = (u8)((pad_p->mButtonTrig0 & ~0x10) | ((temp_r5 >> 2) & 0x10)); + pad_p->mButtonTrig0 = (u8)((pad_p->mButtonTrig0 & ~0x20) | ((temp_r5 >> 2) & 0x20)); + pad_p->mButtonTrig0 = (u8)((pad_p->mButtonTrig0 & ~0x80) | ((temp_r5 << 2) & 0x80)); + pad_p->mButtonTrig0 = (u8)((pad_p->mButtonTrig0 & ~0x40) | ((temp_r5 << 2) & 0x40)); + pad_p->mButtonTrig0 = (u8)((pad_p->mButtonTrig0 & ~1) | (temp_r5 & 1)); + pad_p->mButtonTrig1 = (u8)((pad_p->mButtonTrig1 & ~0x80) | ((temp_r5 << 6) & 0x80)); + pad_p->mButtonTrig0 = (u8)((pad_p->mButtonTrig0 & ~4) | ((temp_r5 >> 6) & 4)); + pad_p->mButtonTrig0 = (u8)((pad_p->mButtonTrig0 & ~2) | ((temp_r5 >> 8) & 2)); + pad_p->mButtonTrig1 = (u8)((pad_p->mButtonTrig1 & ~0x10) | ((temp_r5 << 1) & 0x10)); + + g_mDoCPd_cpadInfo[portNo].mGamepadErrorFlags = 0; + + field_0x65a = temp_r0; + field_0x673 = mGbaFlg.field_0x3 != 0; + field_0x630 = BigLittleChange(mGbaFlg.field_0x4) >> 0x10; + field_0x632 = BigLittleChange(mGbaFlg.field_0x6) >> 0x10; + field_0x67a = (mGbaFlg.field_0x2 >> 2); + + if (!dComIfGs_isEventBit(0x1708) && ((mGbaFlg.field_0x2 >> 3) & 1)) { + dComIfGs_onEventBit(0x1708); + } + + if (!dComIfGs_isEventBit(0x1A10) && ((mGbaFlg.field_0x2 >> 4) & 1)) { + dComIfGs_onEventBit(0x1A10); + } + + if (!dComIfGs_isEventBit(0x1A08) && ((mGbaFlg.field_0x2 >> 5) & 1)) { + dComIfGs_onEventBit(0x1A08); + } } /* 800D0978-800D0A54 .text SwitchOn__7daAgb_cFv */ void daAgb_c::SwitchOn() { - /* Nonmatching */ + if (mSwitch.field_0x1 == (u8)dStage_stagInfo_GetSaveTbl(dComIfGp_getStageStagInfo())) { + u8 var_r31 = mSwitch.field_0x3 - 1; + + if (mSwitch.field_0x0 != 0xFF) { + dComIfGs_revSwitch(mSwitch.field_0x0, mSwitch.field_0x2); + } + + if (var_r31 != 9) { + u8 sw = mSwitch.field_0x4; + if (sw != 0xFF) { + if (var_r31 <= 1 || var_r31 == 8) { + dComIfGs_onSwitch(sw, mSwitch.field_0x2); + } else { + dComIfGs_revSwitch(sw, mSwitch.field_0x2); + } + } + } + } + + g_mDoGaC_gbaCom.mDoGaC_DataStatusReset(8); } /* 800D0A54-800D1188 .text GbaItemUse__7daAgb_cFv */ +// NONMATCHING - mostly done, some regswaps void daAgb_c::GbaItemUse() { - /* Nonmatching */ + u32 temp_r29 = mItem.field_0x0; + u32 var_r28 = 0; + + u32 temp_r0 = temp_r29 - 3; + if (temp_r0 == 0 || temp_r0 == 1 || temp_r0 == 2 || temp_r29 == 0x11 || temp_r29 == 0x12) { + s32 roomNo = dComIfGp_roomControl_getStayNo(); + dStage_FileList_dt_c* fili_p = + dComIfGp_roomControl_getStatusRoomDt(roomNo)->mRoomDt.getFileListInfo(); + + if (fili_p != NULL && fili_p->mParam & 4) { + if (field_0x67c != 0) { + mEffect = BigLittleChange((field_0x660 << 0x10) | 0x300); + return; + } else if (temp_r29 == 5) { + f32 temp_f1 = cM_rndF(100.0f); + + if (temp_f1 < 10.0f) { + var_r28 = 0x13; + } else if (temp_f1 < 40.0) { + var_r28 = 0xA; + } else if (temp_f1 < 70.0) { + var_r28 = 0xD; + } else if (dComIfGs_isEventBit(0x2E08)) { + var_r28 = 0xC; + } else { + var_r28 = 0xD; + } + + if ((var_r28 == 0xC || var_r28 == 0xD) && + (daPy_getPlayerLinkActorClass()->field_0x2a0 & 1)) + { + var_r28 = 0xA; + } + } + } else { + mEffect = 0x20000; + return; + } + } + + if (dComIfGs_getRupee() < mItem.field_0x1) { + mEffect = 0x10000; + return; + } + + switch (temp_r29) { + case 16: + if (daPy_getPlayerLinkActorClass() != dComIfGp_getPlayer(0) || + dComIfGp_checkPlayerStatus0(0, 0x8000000) || + (daPy_getPlayerLinkActorClass()->checkPlayerFly() && + !dComIfGp_checkPlayerStatus0(0, 0x100000) && !dComIfGp_checkPlayerStatus0(0, 0x10000))) + { + mEffect = BigLittleChange(0x1F0300); + return; + } else if (field_0x67d != 0) { + mEffect = BigLittleChange((field_0x662 << 0x10) | 0x300); + return; + } + field_0x67f = 1; + break; + case 2: + if (field_0x67b != 0) { + mEffect = BigLittleChange((field_0x65e << 0x10) | 0x300); + return; + } + + if (daPy_getPlayerLinkActorClass() != dComIfGp_getPlayer(0) && + fopAcM_searchPlayerDistanceXZ(this) < 232.0f) + { + mEffect = 0; + return; + } + + if ((int)field_0x671 != 0 || (int)field_0x677 == 1) { + if ((int)field_0x671 == 0 && dComIfGs_getGbaRupeeCount() < 24 && + fopAcM_IsExecuting(field_0x650)) + { + fopAc_ac_c* actor_p = fopAcM_SearchByID(field_0x650); + + if (cM_rndF(5.0f) < 4.0) { + field_0x640 = 3; + } else { + field_0x640 = 4; + } + + field_0x634 = actor_p->current.pos; + dComIfGs_incGbaRupeeCount(); + temp_r29 = 15; + } + + fopAcM_create(0x128, daBomb_c::prm_make(daBomb_c::STATE_8_e, false, false), + ¤t.pos, -1, NULL, NULL, -1, NULL); + field_0x65c = 0x78; + } else { + temp_r29 = 0xe; + onFree(); + field_0x65c = 0x10e; + mBrk.setPlaySpeed(6.0f); + } + break; + case 0x15: + resetCursor(false); + fopAcM_create(0x128, daBomb_c::prm_make(daBomb_c::STATE_8_e, false, false), ¤t.pos, + -1, NULL, NULL, -1, NULL); + field_0x65c = 0x78; + break; + case 0x11: + mEffect = BigLittleChange(temp_r29); + return; + case 3: + daPy_lk_c* temp_r3 = daPy_getPlayerLinkActorClass(); + temp_r3->field_0x29c |= 0x1000; + temp_r3->field_0x354c = 0x96; + resetCursor(false); + field_0x65c = 0x96; + mBrk.setPlaySpeed(6.0f); + break; + case 0x12: + if (daPy_getPlayerLinkActorClass()->field_0x2a0 & 1) { + mEffect = 0; + return; + } else { + mEffect = BigLittleChange(temp_r29); + return; + } + break; + case 4: + if (daPy_getPlayerLinkActorClass()->field_0x2a0 & 1) { + mEffect = 0; + return; + } else { + daPy_getPlayerLinkActorClass()->field_0x354e = 300; + resetCursor(false); + field_0x65c = 300; + mBrk.setPlaySpeed(6.0f); + } + break; + case 12: + if (field_0x67c != 0) { + mEffect = BigLittleChange((field_0x660 << 0x10) | 0x300); + return; + } else { + daPy_lk_c* temp_r4 = daPy_getPlayerLinkActorClass(); + temp_r4->field_0x29c |= 0x1000; + temp_r4->field_0x354c = 300; + if (!(daPy_getPlayerLinkActorClass()->field_0x2a0 & 1)) { + temp_r4->field_0x354e = 300; + } + + resetCursor(false); + field_0x65c = 300; + mBrk.setPlaySpeed(6.0f); + } + break; + case 13: + if (field_0x67c != 0) { + mEffect = BigLittleChange((field_0x660 << 0x10) | 0x300); + return; + } else { + if ((daPy_getPlayerLinkActorClass()->field_0x2a0 & 1)) { + mEffect = 0; + return; + } + + daPy_getPlayerLinkActorClass()->field_0x354e = 600; + + resetCursor(false); + field_0x65c = 600; + mBrk.setPlaySpeed(6.0f); + } + break; + case 5: + temp_r29 |= (var_r28 << 8); + resetCursor(false); + break; + case 0x13: + resetCursor(false); + field_0x65c = 30; + break; + case 7: + if (dComIfGs_checkGetItem(ESA_BAG)) { + if (dComIfGs_checkBaitItemEmpty()) { + temp_r29 |= 0x1000000; + } + + if (dComIfGs_checkGetItem(BOMB_BAG) && dComIfGs_getBombNum() < dComIfGs_getBombMax()) { + temp_r29 |= 0x10000; + } + + if (dComIfGs_getItem(12) != NO_ITEM && dComIfGs_getArrowNum() < dComIfGs_getArrowMax()) + { + temp_r29 |= 0x100; + } + } + break; + case 0x14: + resetCursor(false); + break; + case 8: + dComIfGp_setItemLifeCount(12.0f); + resetCursor(false); + field_0x65c = 60; + break; + case 9: + dComIfGp_setItemMagicCount(8); + resetCursor(false); + field_0x65c = 60; + break; + case 10: + dComIfGp_setItemLifeCount(dComIfGs_getMaxLife()); + dComIfGp_setItemMagicCount(dComIfGs_getMaxMagic()); + resetCursor(false); + field_0x65c = 60; + break; + default: + mEffect = 0; + return; + } + + field_0x672 = 0; + dComIfGp_setItemRupeeCount(-mItem.field_0x1); + mEffect = BigLittleChange(temp_r29); + field_0x66b = temp_r29; } /* 800D1188-800D12E4 .text Shopping__7daAgb_cFv */ @@ -162,17 +880,12 @@ void daAgb_c::Shopping() { } /* 800D12E4-800D1A3C .text FlagsSend__7daAgb_cFUl */ -void daAgb_c::FlagsSend(unsigned long) { +void daAgb_c::FlagsSend(u32) { /* Nonmatching */ } /* 800D1A3C-800D25D8 .text CursorMove__7daAgb_cFP10fopAc_ac_cUl */ -void daAgb_c::CursorMove(fopAc_ac_c*, unsigned long) { - /* Nonmatching */ -} - -/* 800D25D8-800D272C .text __dt__15dBgS_LinkLinChkFv */ -dBgS_LinkLinChk::~dBgS_LinkLinChk() { +void daAgb_c::CursorMove(fopAc_ac_c*, u32) { /* Nonmatching */ } @@ -183,146 +896,299 @@ void daAgb_c::modeMove() { /* 800D303C-800D30D4 .text modeDelete__7daAgb_cFv */ void daAgb_c::modeDelete() { - /* Nonmatching */ + if (field_0x664 == 0 && g_mDoGaC_gbaCom.mDoGaC_GbaLink() && + g_mDoGaC_gbaCom.mDoGaC_SendStatusCheck(1)) + { + mPlayerName = 0x1000000; + g_mDoGaC_gbaCom.mDoGaC_SendDataSet((u32*)&mPlayerName, 4, 1, 0); + field_0x664++; + } +} + +void daAgb_c::modeProcCall() { + typedef void (daAgb_c::*modeProc)(); + static modeProc mode_proc[] = { + &daAgb_c::modeMove, + &daAgb_c::modeLookAttention, + &daAgb_c::modeLoad, + &daAgb_c::modeDelete, + }; + + (this->*mode_proc[mMode])(); } /* 800D30D4-800D36F4 .text daAgb_Execute__FP7daAgb_c */ -void daAgb_Execute(daAgb_c*) { - /* Nonmatching */ +// NONMATCHING - regswap +int daAgb_Execute(daAgb_c* i_this) { + daPy_lk_c* temp_r29 = (daPy_lk_c*)dComIfGp_getPlayer(0); + i_this->field_0x679 = 0; + + if (g_mDoGaC_gbaCom.mDoGaC_GbaLink() && g_mDoGaC_gbaCom.mDoGaC_RecvStatusCheck(4)) { + i_this->FlagsRecv(); + g_mDoGaC_gbaCom.mDoGaC_DataStatusReset(4); + } else { + g_mDoCPd_cpadInfo[mDoGaC_getPortNo()].mGamepadErrorFlags = 1; + } + + BOOL var_r27 = dComIfGp_event_runCheck() != 0; + var_r27 |= dMenu_flag(); + + u32 st_type = dStage_stagInfo_GetSTType(dComIfGp_getStageStagInfo()); + + if (g_mDoGaC_gbaCom.mDoGaC_GbaLink()) { + if (g_mDoGaC_gbaCom.mDoGaC_RecvStatusCheck(8)) { + i_this->SwitchOn(); + } + + if (g_mDoGaC_gbaCom.mDoGaC_SendStatusCheck(9)) { + i_this->FlagsSend(st_type); + } + + i_this->field_0x680 = 1; + } else if (i_this->field_0x680) { + i_this->field_0x680 = 0; + i_this->resetCursor(true); + i_this->field_0x672 = 0; + + if (i_this->field_0x65c != 0) { + if (i_this->field_0x66b == 3 || i_this->field_0x66b == 12) { + daPy_lk_c* player_p = daPy_getPlayerLinkActorClass(); + player_p->field_0x29c |= 0x1000; + player_p->field_0x354c = 10; + } else if (i_this->field_0x66b == 4 || i_this->field_0x66b == 13 || + i_this->field_0x66b == 12) + { + daPy_lk_c* player_p = daPy_getPlayerLinkActorClass(); + player_p->field_0x354e = 10; + } + + i_this->field_0x65c = 0; + } + + i_this->field_0x66b = 0; + i_this->field_0x630 = 0; + i_this->field_0x632 = 0; + i_this->field_0x684.end(); + } + + i_this->modeProcCall(); + + if (g_mDoGaC_gbaCom.mDoGaC_GbaLink()) { + if ((int)i_this->field_0x671 != 0) { + if (i_this->current.pos.x != i_this->next.pos.x || + i_this->current.pos.z != i_this->next.pos.z) + { + daAgb_c::mFlags.field_0x5_3 = 1; + } else { + daAgb_c::mFlags.field_0x5_3 = 0; + } + } else { + daPy_lk_c* player_p2 = daPy_getPlayerLinkActorClass(); + if ((dComIfGp_getPlayer(0) == player_p2 && !temp_r29->checkPlayerFly()) || + ((fopAcM_GetName(temp_r29) == PROC_NPC_MD && !daNpc_Md_c::m_flying) || + (fopAcM_GetName(temp_r29) == PROC_NPC_CB1 && !daNpc_Cb1_c::m_flying) || + fopAcM_GetName(temp_r29) == PROC_NPC_OS)) + { + f32 speedF = fabs(temp_r29->speedF); + + if (speedF <= 0.0f) { + daAgb_c::mFlags.field_0x5_3 = 0; + } else if (speedF < 5.0f) { + daAgb_c::mFlags.field_0x5_3 = 1; + } else if (speedF < 10.0f) { + daAgb_c::mFlags.field_0x5_3 = 2; + } else if (speedF < 15.0f) { + daAgb_c::mFlags.field_0x5_3 = 3; + } else { + daAgb_c::mFlags.field_0x5_3 = 4; + } + } else { + daAgb_c::mFlags.field_0x5_3 = 0; + } + } + + if ((int)i_this->field_0x674 != 0 && var_r27 == 0 && i_this->mMode != 1) { + if (i_this->field_0x675 != 0) { + if (i_this->field_0x676 != 0) { + i_this->shape_angle.z += 0x1000; + } else { + i_this->shape_angle.z = fopAcM_searchPlayerAngleY(i_this); + } + } else { + i_this->shape_angle.z += 0x200; + } + } + + mDoMtx_stack_c::transS(i_this->current.pos.x, i_this->current.pos.y + i_this->field_0x628, + i_this->current.pos.z); + mDoMtx_stack_c::YrotM(i_this->shape_angle.y); + mDoMtx_stack_c::XrotM(i_this->shape_angle.x); + mDoMtx_stack_c::ZrotM(i_this->shape_angle.z); + i_this->mpModel->setBaseTRMtx(mDoMtx_stack_c::get()); + + if (i_this->mMode == 1) { + i_this->mBrk.setFrame(15.0f); + } else if (i_this->field_0x65c != 0 && + (i_this->field_0x66b == 4 || i_this->field_0x66b == 13 || + i_this->field_0x66b == 12 || i_this->field_0x66b == 3)) + { + if (i_this->field_0x65c > 60) { + i_this->mBrk.setFrame(19.0f); + } else { + i_this->mBrk.play(); + } + } else if ((((int)i_this->field_0x672 != 0 || i_this->field_0x676 != 0) && + ((int)i_this->field_0x671 != 0 || (int)i_this->field_0x677 == 1)) || + (i_this->field_0x66b == 14 && i_this->field_0x65c > 120)) + { + i_this->mBrk.play(); + } else { + i_this->mBrk.setFrame(0.0f); + } + } + + return 1; } /* 800D36F4-800D38EC .text daAgb_Draw__FP7daAgb_c */ -void daAgb_Draw(daAgb_c*) { - /* Nonmatching */ +int daAgb_Draw(daAgb_c* i_this) { + u8 var_r6 = 1; + + if (g_mDoGaC_gbaCom.mDoGaC_GbaLink()) { + if (i_this->field_0x66f != 0 && !(daAgb_c::mFlags.field_0xa & 1) && + (!dComIfGp_event_runCheck() || + dComIfGp_getEventManager().startCheckOld("DEFAULT_AGB_LOOK_ATTENTION") || + i_this->mMode == 2) && + (i_this->field_0x65c == 0 || i_this->mMode == 1 || i_this->field_0x66b == 0x10 || + i_this->field_0x66b == 3 || i_this->field_0x66b == 12 || i_this->field_0x66b == 4 || + i_this->field_0x66b == 13 || (i_this->field_0x66b == 14 && i_this->field_0x65c > 120))) + { + i_this->mBrk.getBrkAnm()->setFrame(i_this->mBrk.getFrame()); + + J3DModelData* modelData = i_this->mpModel->getModelData(); + for (u16 i = 0; i < modelData->getMaterialNum(); i++) { + J3DMaterial* mat_p = modelData->getMaterialNodePointer(i); + mat_p->setTevColor(1, &l_HIO.field_0x04[0]); + mat_p->setTevColor(2, &l_HIO.field_0x04[1]); + } + + mDoExt_modelUpdateDL(i_this->mpModel); + + if (i_this->field_0x679 != 0 && + i_this->current.pos.y - i_this->mCrrPos.field_0x05c > 2.5f) + { + dComIfGd_setSimpleShadow2(&i_this->current.pos, i_this->mCrrPos.field_0x05c, 50.0f, + i_this->mCrrPos.mGndChk, 0, 1.0f, &i_this->mTexObj); + } + + var_r6 = 0; + } + } + + dMap_c::drawPointSingle(3, i_this->current.pos.x, i_this->current.pos.y, i_this->current.pos.z, + i_this->current.roomNo, -0x8000, var_r6, 0, 0); + return 1; } /* 800D38EC-800D38F0 .text setTevColor__11J3DTevBlockFUlPC13J3DGXColorS10 */ -void J3DTevBlock::setTevColor(unsigned long, const J3DGXColorS10*) { +void J3DTevBlock::setTevColor(u32, const J3DGXColorS10*) { /* Nonmatching */ } /* 800D38F0-800D38F8 .text daAgb_IsDelete__FP7daAgb_c */ -void daAgb_IsDelete(daAgb_c*) { - /* Nonmatching */ +int daAgb_IsDelete(daAgb_c* i_this) { + return 1; } /* 800D38F8-800D394C .text daAgb_Delete__FP7daAgb_c */ -void daAgb_Delete(daAgb_c*) { - /* Nonmatching */ +int daAgb_Delete(daAgb_c* i_this) { + dComIfG_resDelete(&i_this->mPhase, "Agb"); + i_this->field_0x684.end(); + return 1; } /* 800D394C-800D396C .text createHeap_CB__FP10fopAc_ac_c */ -void createHeap_CB(fopAc_ac_c*) { - /* Nonmatching */ +int createHeap_CB(fopAc_ac_c* i_this) { + return static_cast(i_this)->createHeap(); } /* 800D396C-800D3B58 .text createHeap__7daAgb_cFv */ -void daAgb_c::createHeap() { - /* Nonmatching */ +int daAgb_c::createHeap() { + J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes("Agb", 4); + JUT_ASSERT(3277, modelData != 0); + + mpModel = mDoExt_J3DModel__create(modelData, 0x80000, 0x11000002); + if (mpModel == NULL) { + return 0; + } + + J3DAnmTevRegKey* pbrk = (J3DAnmTevRegKey*)dComIfG_getObjectRes("Agb", 7); + if (!mBrk.init(modelData, pbrk, TRUE, J3DFrameCtrl::LOOP_REPEAT_e, 1.0f, 0, -1, false, 1)) { + return 0; + } + + ResTIMG* img_p = modelData->getTexture()->getResTIMG(1); + GXInitTexObj(&mTexObj, (u8*)img_p + img_p->imageOffset, img_p->width, img_p->height, + (GXTexFmt)img_p->format, (GXTexWrapMode)img_p->wrapS, (GXTexWrapMode)img_p->wrapT, + (GXBool)(img_p->mipmapCount > 1)); + GXInitTexObjLOD(&mTexObj, (GXTexFilter)img_p->minFilter, (GXTexFilter)img_p->magFilter, + img_p->minLOD * 0.125f, img_p->maxLOD * 0.125f, img_p->LODBias * 0.01f, + img_p->biasClamp, img_p->doEdgeLOD, (GXAnisotropy)img_p->maxAnisotropy); + + return 1; } /* 800D3B58-800D3D2C .text daAgb_Create__FP10fopAc_ac_c */ -void daAgb_Create(fopAc_ac_c*) { - /* Nonmatching */ +// NONMATCHING - dBgS_CrrPos::Set needs works +int daAgb_Create(fopAc_ac_c* i_this) { + fopAcM_SetupActor(i_this, daAgb_c); + daAgb_c* a_this = (daAgb_c*)i_this; + + int phase = dComIfG_resLoad(&a_this->mPhase, "Agb"); + if (phase == cPhs_COMPLEATE_e) { + dComIfGp_setAgb(a_this); + if (!fopAcM_entrySolidHeap(a_this, createHeap_CB, 0x500)) { + return cPhs_ERROR_e; + } + + // a_this->mCrrPos.Set(&a_this->current.pos, &a_this->next.pos, NULL, ); + a_this->mCrrPos.mpLine0 = &a_this->current.pos; + a_this->mCrrPos.pm_pos = &a_this->next.pos; + a_this->mCrrPos.field_0x058 = NULL; + a_this->mCrrPos.SetActorPid(-1); + a_this->mCrrPos.field_0x3c = 171.0f; + a_this->mCrrPos.field_0x40 = 50.0f; + + a_this->mCrrPos.SetGndUpY(170.0f); + a_this->mCrrPos.ClrNoRoof(); + a_this->mAcch.Set(&a_this->current.pos, &a_this->next.pos, a_this, 1, &a_this->mAcchCir, + NULL, NULL, NULL); + a_this->mAcch.OnLineCheck(); + a_this->mAcch.SetGrndNone(); + a_this->mAcchCir.SetWall(171.01f, 40.0f); + + TestDataManager[4].field_0x0 = (u32)&daAgb_c::mGbaFlg; + TestDataManager[8].field_0x0 = (u32)&daAgb_c::mSwitch; + TestDataManager[6].field_0x0 = (u32)&daAgb_c::mItem; + TestDataManager[12].field_0x0 = (u32)&daAgb_c::mShop; + + a_this->field_0x670 = 0; + a_this->field_0x65c = 0; + a_this->field_0x66b = 0; + a_this->field_0x66f = g_mDoGaC_gbaCom.field_0x0; + a_this->field_0x678 = g_mDoGaC_gbaCom.field_0x0 > 0; + a_this->field_0x654 = 0; + a_this->field_0x650 = -1; + a_this->field_0x677 = 0; + a_this->field_0x67b = 0; + a_this->field_0x680 = 1; + + fopAcM_setStageLayer(a_this); + a_this->mEvtInfo.setEventName("DEFAULT_AGB_USE"); + } + + return phase; } /* 800D3D2C-800D3DDC .text __ct__7daAgb_cFv */ -daAgb_c::daAgb_c() { - /* Nonmatching */ -} - -/* 800D3DDC-800D3E4C .text __dt__13dBgS_LinkAcchFv */ -dBgS_LinkAcch::~dBgS_LinkAcch() { - /* Nonmatching */ -} - -/* 800D3E4C-800D3EC4 .text __dt__15dBgS_LinkCrrPosFv */ -dBgS_LinkCrrPos::~dBgS_LinkCrrPos() { - /* Nonmatching */ -} - -/* 800D3EC4-800D4088 .text __dt__11dBgS_CrrPosFv */ -dBgS_CrrPos::~dBgS_CrrPos() { - /* Nonmatching */ -} - -/* 800D4088-800D40E4 .text __ct__15dBgS_LinkCrrPosFv */ -dBgS_LinkCrrPos::dBgS_LinkCrrPos() { - /* Nonmatching */ -} - -/* 800D40E4-800D42D8 .text __ct__11dBgS_CrrPosFv */ -dBgS_CrrPos::dBgS_CrrPos() { - /* Nonmatching */ -} - -/* 800D42D8-800D4334 .text __dt__11daAgb_HIO_cFv */ -daAgb_HIO_c::~daAgb_HIO_c() { - /* Nonmatching */ -} - -/* 800D44C0-800D44FC .text __dt__10dMsgCtrl_cFv */ -dMsgCtrl_c::~dMsgCtrl_c() { - /* Nonmatching */ -} - -/* 800D44FC-800D4504 .text @20@__dt__15dBgS_LinkLinChkFv */ -void @20@__dt__15dBgS_LinkLinChkFv { - /* Nonmatching */ -} - -/* 800D4504-800D450C .text @100@__dt__15dBgS_LinkLinChkFv */ -void @100@__dt__15dBgS_LinkLinChkFv { - /* Nonmatching */ -} - -/* 800D450C-800D4514 .text @88@__dt__15dBgS_LinkLinChkFv */ -void @88@__dt__15dBgS_LinkLinChkFv { - /* Nonmatching */ -} - -/* 800D4514-800D451C .text @32@__dt__13dBgS_LinkAcchFv */ -void @32@__dt__13dBgS_LinkAcchFv { - /* Nonmatching */ -} - -/* 800D451C-800D4524 .text @20@__dt__13dBgS_LinkAcchFv */ -void @20@__dt__13dBgS_LinkAcchFv { - /* Nonmatching */ -} - -/* 800D4524-800D452C .text @28@__dt__15dBgS_LinkCrrPosFv */ -void @28@__dt__15dBgS_LinkCrrPosFv { - /* Nonmatching */ -} - -/* 800D452C-800D4534 .text @16@__dt__15dBgS_LinkCrrPosFv */ -void @16@__dt__15dBgS_LinkCrrPosFv { - /* Nonmatching */ -} - -/* 800D4534-800D453C .text @36@__dt__15dBgS_LinkCrrPosFv */ -void @36@__dt__15dBgS_LinkCrrPosFv { - /* Nonmatching */ -} - -/* 800D453C-800D4544 .text @28@__dt__11dBgS_CrrPosFv */ -void @28@__dt__11dBgS_CrrPosFv { - /* Nonmatching */ -} - -/* 800D4544-800D454C .text @16@__dt__11dBgS_CrrPosFv */ -void @16@__dt__11dBgS_CrrPosFv { - /* Nonmatching */ -} - -/* 800D454C-800D4554 .text @36@__dt__11dBgS_CrrPosFv */ -void @36@__dt__11dBgS_CrrPosFv { - /* Nonmatching */ -} - -/* 800D4554-800D455C .text checkPlayerFly__9daPy_py_cCFv */ -void daPy_py_c::checkPlayerFly() const { - /* Nonmatching */ -} - +daAgb_c::daAgb_c() : field_0x684(0, 0) {} diff --git a/src/d/d_kankyo_rain.cpp b/src/d/d_kankyo_rain.cpp index 102c3b01d..ab5386f9d 100644 --- a/src/d/d_kankyo_rain.cpp +++ b/src/d/d_kankyo_rain.cpp @@ -7,7 +7,9 @@ #include "d/d_bg_s_gnd_chk.h" #include "d/d_com_inf_game.h" #include "d/d_kankyo.h" +#include "d/d_kankyo_wether.h" #include "f_op/f_op_camera_mng.h" +#include "m_Do/m_Do_lib.h" /* 8008AA30-8008AB3C .text vectle_calc__FP10DOUBLE_POSP4cXyz */ void vectle_calc(DOUBLE_POS* i_pos, cXyz* o_out) { @@ -93,7 +95,15 @@ void dKyr_kamome_move() { /* 8008B44C-8008B504 .text dKyr_wind_init__Fv */ void dKyr_wind_init() { - /* Nonmatching */ + g_env_light.mpWind->mbHasCustomWindPower = false; + g_env_light.mpWind->field_0x759 = 0; + + for (int i = 0; i < 2; i++) { + g_env_light.mpWind->mKamomeEff[i].field_0x1e = 0; + g_env_light.mpWind->mKamomeEff[i].field_0x18 = 0.0f; + g_env_light.mpWind->mKamomeEff[i].field_0x1c = cM_rndF(1800.0f); + g_env_light.mpWind->mKamomeEff[i].mpBaseEmitter = NULL; + } } /* 8008B504-8008C4BC .text dKyr_wind_move__Fv */ @@ -102,8 +112,49 @@ void dKyr_wind_move() { } /* 8008C624-8008C888 .text dKyr_lenzflare_move__Fv */ +// NONMATCHING void dKyr_lenzflare_move() { - /* Nonmatching */ + dKankyo_sun_Packet* sun_p = g_env_light.mpSunPacket; + dKankyo_sunlenz_Packet* lenz_p = g_env_light.mpSunlenzPacket; + camera_class* camera_p = dComIfGp_getCamera(0); + + if (!(g_env_light.mpSunPacket->mVisibility < 0.0001f)) { + cXyz eyeVect; + dKy_set_eyevect_calc(dComIfGp_getCamera(0), &eyeVect, 7200.0005f, 7200.0005f); + + cXyz sunDirSmth; + dKyr_get_vectle_calc(&eyeVect, sun_p->mPos, &sunDirSmth); + lenz_p->mPositions[0] = sun_p->mPos[0]; + lenz_p->mPositions[1] = sun_p->mPos[0]; + + cXyz projected; + mDoLib_project(lenz_p->mPositions, &projected); + + cXyz center; + center.x = 320.0f; + center.y = 240.0f; + center.z = 0.0f; + + cXyz vectle; + dKyr_get_vectle_calc(¢er, &projected, &vectle); + s16 angle = cM_atan2s(vectle.x, vectle.y); + + lenz_p->mAngleDeg = angle; + lenz_p->mAngleDeg *= 0.005493164f; + lenz_p->mAngleDeg += 180.0f; + + cXyz camFwd; + dKyr_get_vectle_calc(&camera_p->mLookat.mEye, &camera_p->mLookat.mCenter, &camFwd); + + f32 var_f4 = sunDirSmth.abs(camFwd); + var_f4 = (var_f4 * 350.0f) + 250.0f; + + for (int i = 2; i < 8; i++) { + lenz_p->mPositions[i].x = sun_p->mPos[0].x - i * sunDirSmth.x * var_f4; + lenz_p->mPositions[i].y = sun_p->mPos[0].y - i * sunDirSmth.y * var_f4; + lenz_p->mPositions[i].z = sun_p->mPos[0].z - i * sunDirSmth.z * var_f4; + } + } } /* 8008C888-8008C8B8 .text dKyr_moon_arrival_check__Fv */ diff --git a/src/m_Do/m_Do_gba_com.cpp b/src/m_Do/m_Do_gba_com.cpp index e2cc16248..9cd46f88a 100644 --- a/src/m_Do/m_Do_gba_com.cpp +++ b/src/m_Do/m_Do_gba_com.cpp @@ -11,8 +11,6 @@ mDoGaC_agbCom_c g_mDoGaC_gbaCom; mDoGaC_DataManag_c TestDataManager[16]; -static u32 BigLittleChange(u32); - /* 8001A498-8001A4C0 .text ProbeCheck_0__FP11JUTGbaParamPv */ void ProbeCheck_0(JUTGbaParam*, void*) { g_mDoGaC_gbaCom.mDoGaC_ProbeCheck0(); @@ -358,8 +356,8 @@ int mDoGaC_agbCom_c::mDoGaC_SendEndCheck(u8 param_0) { } /* 8001ADE4-8001AE04 .text mDoGaC_RecvStatusCheck__15mDoGaC_agbCom_cFUc */ -bool mDoGaC_agbCom_c::mDoGaC_RecvStatusCheck(u8 param_0) { - return field_0x110[param_0].field_0x4 == 8; +BOOL mDoGaC_agbCom_c::mDoGaC_RecvStatusCheck(u8 param_0) { + return field_0x110[param_0].field_0x4 == 8 ? TRUE : FALSE; } /* 8001AE04-8001AE44 .text mDoGaC_DataStatusReset__15mDoGaC_agbCom_cFUc */