From a5d5b4d76f4f363adf566087abb2813f6f32603f Mon Sep 17 00:00:00 2001 From: kiwi515 <49212064+kiwi515@users.noreply.github.com> Date: Mon, 7 Sep 2026 12:32:33 -0400 Subject: [PATCH 1/7] tmp --- .clangd | 3 + config/RSPE01_01/symbols.txt | 66 +-- configure.py | 45 +- include/Pack/RPGraphics/RPGrpCamera.h | 4 +- include/Pack/RPGraphics/RPGrpModelRfl.h | 6 +- include/Pack/RPGraphics/RPGrpRenderer.h | 9 + include/Pack/RPGraphics/RPGrpView.h | 11 +- include/Pack/RPKernel.h | 3 +- include/Pack/RPKernel/RPSysController.h | 40 +- include/Pack/RPKernel/RPSysCursorDrawMgr.h | 279 +++++++++ include/Pack/RPSystem/RPSysCommonObject.h | 6 + include/Pack/RPSystem/RPSysPlayerMgr.h | 7 + include/Pack/RPSystem/RPSysSaveDataMgr.h | 6 +- include/egg/core/eggController.h | 7 + include/egg/gfxe/eggFrustum.h | 10 +- include/egg/math/eggMath.h | 12 + include/revolution/BTE/decompctx_stubs.h | 32 + src/Pack/RPGraphics/RPGrpCamera.cpp | 4 +- src/Pack/RPGraphics/RPGrpModelRfl.cpp | 14 +- src/Pack/RPKernel/RPSysController.cpp | 18 +- src/Pack/RPKernel/RPSysControllerMgr.cpp | 2 +- src/Pack/RPKernel/RPSysCursorDrawMgr.cpp | 659 +++++++++++++++++++++ src/Pack/RPKernel/RPSysHomeMenuMgr.cpp | 4 +- 23 files changed, 1146 insertions(+), 101 deletions(-) create mode 100644 include/Pack/RPKernel/RPSysCursorDrawMgr.h create mode 100644 include/revolution/BTE/decompctx_stubs.h create mode 100644 src/Pack/RPKernel/RPSysCursorDrawMgr.cpp diff --git a/.clangd b/.clangd index 3ac0da921..aaf7ee0c7 100644 --- a/.clangd +++ b/.clangd @@ -1,2 +1,5 @@ +Completion: + HeaderInsertion: Never + CompileFlags: Add: -ferror-limit=100 diff --git a/config/RSPE01_01/symbols.txt b/config/RSPE01_01/symbols.txt index 7a57e3936..cf84d2ce6 100644 --- a/config/RSPE01_01/symbols.txt +++ b/config/RSPE01_01/symbols.txt @@ -7528,12 +7528,12 @@ isCoreBaseDevice__19RPSysCoreControllerCFv = .text:0x8019B740; // type:function rumble__19RPSysCoreControllerFQ219RPSysCoreController14ERumblePattern = .text:0x8019B794; // type:function size:0x48 stopMotorAll__19RPSysCoreControllerFv = .text:0x8019B7DC; // type:function size:0x44 shutdownSystem__19RPSysCoreControllerFb = .text:0x8019B820; // type:function size:0x4 -becomeMainController__19RPSysCoreControllerFv = .text:0x8019B824; // type:function size:0x38 +becomeActiveController__19RPSysCoreControllerFv = .text:0x8019B824; // type:function size:0x38 beginFrame__19RPSysCoreControllerFP9PADStatus = .text:0x8019B85C; // type:function size:0x28C getExCoreStatus__19RPSysCoreControllerFii = .text:0x8019BAE8; // type:function size:0x18 setExAccParam__19RPSysCoreControllerFiff = .text:0x8019BB00; // type:function size:0x14 __dt__19RPSysCoreControllerFv = .text:0x8019BB14; // type:function size:0x5C -__ct__19RPSysCoreControllerFUl = .text:0x8019BB70; // type:function size:0x310 +__ct__19RPSysCoreControllerFl = .text:0x8019BB70; // type:function size:0x310 initScene__19RPSysCoreControllerFv = .text:0x8019BE80; // type:function size:0x200 forceSensorBarPowerOn__19RPSysCoreControllerFv = .text:0x8019C080; // type:function size:0x8 sceneReset__19RPSysCoreControllerFv = .text:0x8019C088; // type:function size:0x8 @@ -7589,31 +7589,31 @@ Update__20RPSysKokeshiIteraterFv = .text:0x8019EBE4; // type:function size:0x120 Reset__20RPSysKokeshiIteraterFv = .text:0x8019ED04; // type:function size:0x10 __dt__20RPSysKokeshiIteraterFv = .text:0x8019ED14; // type:function size:0x40 __ct__20RPSysKokeshiIteraterF13RFLDataSource = .text:0x8019ED54; // type:function size:0x20 -fn_8019ED74 = .text:0x8019ED74; // type:function size:0x74 -fn_8019EDE8 = .text:0x8019EDE8; // type:function size:0x358 -fn_8019F140 = .text:0x8019F140; // type:function size:0x4 -fn_8019F144 = .text:0x8019F144; // type:function size:0x15C -fn_8019F2A0 = .text:0x8019F2A0; // type:function size:0x190 -fn_8019F430 = .text:0x8019F430; // type:function size:0x1A4 -fn_8019F5D4 = .text:0x8019F5D4; // type:function size:0x98 -fn_8019F66C = .text:0x8019F66C; // type:function size:0x420 -fn_8019FA8C = .text:0x8019FA8C; // type:function size:0x14 -fn_8019FAA0 = .text:0x8019FAA0; // type:function size:0x14 -fn_8019FAB4 = .text:0x8019FAB4; // type:function size:0xF0 -fn_8019FBA4 = .text:0x8019FBA4; // type:function size:0x70 -fn_8019FC14 = .text:0x8019FC14; // type:function size:0x54 -fn_8019FC68 = .text:0x8019FC68; // type:function size:0x50 -fn_8019FCB8 = .text:0x8019FCB8; // type:function size:0x58 -fn_8019FD10 = .text:0x8019FD10; // type:function size:0xFC -fn_8019FE0C = .text:0x8019FE0C; // type:function size:0x28 -fn_8019FE34 = .text:0x8019FE34; // type:function size:0x38 -fn_8019FE6C = .text:0x8019FE6C; // type:function size:0x38 -fn_8019FEA4 = .text:0x8019FEA4; // type:function size:0x68 -fn_8019FF0C = .text:0x8019FF0C; // type:function size:0xD4 -fn_8019FFE0 = .text:0x8019FFE0; // type:function size:0x11C -fn_801A00FC = .text:0x801A00FC; // type:function size:0x134 -fn_801A0230 = .text:0x801A0230; // type:function size:0x60 -fn_801A0290 = .text:0x801A0290; // type:function size:0x2C +__dt__18RPSysCursorDrawMgrFv = .text:0x8019ED74; // type:function size:0x74 +__ct__18RPSysCursorDrawMgrFPQ23EGG4Heap = .text:0x8019EDE8; // type:function size:0x358 +__ct__Q23EGG8Vector2fFv = .text:0x8019F140; // type:function size:0x4 +updateCursor__18RPSysCursorDrawMgrFll = .text:0x8019F144; // type:function size:0x15C +drawCursor__18RPSysCursorDrawMgrFlbb = .text:0x8019F2A0; // type:function size:0x190 +postUpdatePlayer__18RPSysCursorDrawMgrFv = .text:0x8019F430; // type:function size:0x1A4 +postUpdate__18RPSysCursorDrawMgrFv = .text:0x8019F5D4; // type:function size:0x98 +preUpdate__18RPSysCursorDrawMgrFv = .text:0x8019F66C; // type:function size:0x420 +getHorizon__Q23EGG10CoreStatusCFv = .text:0x8019FA8C; // type:function size:0x14 +getDpdPos__Q23EGG10CoreStatusCFv = .text:0x8019FAA0; // type:function size:0x14 +init__18RPSysCursorDrawMgrFv = .text:0x8019FAB4; // type:function size:0xF0 +setPlayerCursorPos__18RPSysCursorDrawMgrFRCQ23EGG8Vector2fQ218RPSysCursorDrawMgr7EPlayerb = .text:0x8019FBA4; // type:function size:0x70 +getPlayerCursorChannel__18RPSysCursorDrawMgrCFQ218RPSysCursorDrawMgr7EPlayer = .text:0x8019FC14; // type:function size:0x54 +getPlayerCursorPos__18RPSysCursorDrawMgrCFQ218RPSysCursorDrawMgr7EPlayer = .text:0x8019FC68; // type:function size:0x50 +setPlayerCursorOutOfScreen__18RPSysCursorDrawMgrFQ218RPSysCursorDrawMgr7EPlayer = .text:0x8019FCB8; // type:function size:0x58 +createPlayerCursor__18RPSysCursorDrawMgrFQ218RPSysCursorDrawMgr7EPlayer = .text:0x8019FD10; // type:function size:0xFC +getActiveCursorPlayer__18RPSysCursorDrawMgrCFv = .text:0x8019FE0C; // type:function size:0x28 +getActiveCursorType__18RPSysCursorDrawMgrCFv = .text:0x8019FE34; // type:function size:0x38 +getActiveCursorPos__18RPSysCursorDrawMgrCFv = .text:0x8019FE6C; // type:function size:0x38 +fadeActiveCursor__18RPSysCursorDrawMgrFv = .text:0x8019FEA4; // type:function size:0x68 +createActiveCursor__18RPSysCursorDrawMgrFv = .text:0x8019FF0C; // type:function size:0xD4 +finishDpdCheck__18RPSysCursorDrawMgrFv = .text:0x8019FFE0; // type:function size:0x11C +startDpdCheck__18RPSysCursorDrawMgrFv = .text:0x801A00FC; // type:function size:0x134 +CreateInstance__18RPSysCursorDrawMgrFPQ23EGG4Heap = .text:0x801A0230; // type:function size:0x60 +__sinit_\RPSysCursorDrawMgr_cpp = .text:0x801A0290; // type:function size:0x2C scope:weak ChangePointHalfFull__18RPSysStringUtilityFPw = .text:0x801A02BC; // type:function size:0xB4 ChangePoint__18RPSysStringUtilityFPw = .text:0x801A0370; // type:function size:0xA8 GetFloat__18RPSysStringUtilityFPCw = .text:0x801A0418; // type:function size:0x6C @@ -8198,7 +8198,7 @@ __dt__14RPSndStaticMgrFv = .text:0x801B9850; // type:function size:0x68 __ct__14RPSndStaticMgrFv = .text:0x801B98B8; // type:function size:0x58 GetMidPoint__12RPUtlDohMathFPQ34nw4r4math4VEC3PfRCQ34nw4r4math4VEC3RCQ34nw4r4math4VEC3RCQ34nw4r4math4VEC3ff = .text:0x801B9910; // type:function size:0x1FC MTX34Normalize__12RPUtlDohMathFPQ34nw4r4math5MTX34PCQ34nw4r4math5MTX34Q212RPUtlDohMath9AxisOrder = .text:0x801B9B0C; // type:function size:0x298 -__sinit_\RPUtlDohMath_cpp = .text:0x801B9DA4; // type:function size:0x11C +__sinit_\RPUtlDohMath_cpp = .text:0x801B9DA4; // type:function size:0x11C scope:weak fn_801B9EC0 = .text:0x801B9EC0; // type:function size:0x3C4 fn_801BA284 = .text:0x801BA284; // type:function size:0x198 fn_801BA41C = .text:0x801BA41C; // type:function size:0x218 @@ -18614,7 +18614,7 @@ __vt__13RPSysMiddleDB = .data:0x803B9D04; // type:object size:0xC __vt__17RPSysLytAllocator = .data:0x803B9D10; // type:object size:0x14 @17563 = .data:0x803B9D28; // type:object size:0x1C scope:local __vt__20RPSysKokeshiIterater = .data:0x803B9D44; // type:object size:0xC -lbl_803B9D50 = .data:0x803B9D50; // type:object size:0x18 +__vt__18RPSysCursorDrawMgr = .data:0x803B9D50; // type:object size:0x18 @wstringBase0 = .data:0x803B9D68; // type:object size:0x18 scope:local @17530 = .data:0x803B9D80; // type:object size:0x30 scope:local __vt__26RPSysKokeshiCtrlDataLoader = .data:0x803B9DB0; // type:object size:0xC @@ -21877,13 +21877,13 @@ spTextBuffer__19RPSysWideTextWriter = .sbss:0x804BF558; // type:object size:0x4 lbl_804BF560 = .sbss:0x804BF560; // type:object size:0x8 data:4byte spInstance__17RPSysTagProcessor = .sbss:0x804BF568; // type:object size:0x8 data:4byte sNextPlayerNo__19RPSysCoreController = .sbss:0x804BF570; // type:object size:0x2 data:2byte -spMainController__19RPSysCoreController = .sbss:0x804BF574; // type:object size:0x4 data:4byte -sMainAddress__19RPSysCoreController = .sbss:0x804BF578; // type:object size:0x6 data:byte +spActiveController__19RPSysCoreController = .sbss:0x804BF574; // type:object size:0x4 data:4byte +sActiveAddress__19RPSysCoreController = .sbss:0x804BF578; // type:object size:0x6 data:byte sDisconnectOccurred__19RPSysCoreController = .sbss:0x804BF57E; // type:object size:0x1 data:byte sAddrWork__16RPSysCoreAddress = .sbss:0x804BF580; // type:object size:0x6 data:byte lbl_804BF588 = .sbss:0x804BF588; // type:object size:0x8 align:4 data:4byte -lbl_804BF590 = .sbss:0x804BF590; // type:object size:0x8 align:4 data:float -lbl_804BF598 = .sbss:0x804BF598; // type:object size:0x8 data:4byte +OUT_OF_SCREEN_POS__18RPSysCursorDrawMgr = .sbss:0x804BF590; // type:object size:0x8 align:4 data:float +spInstance__18RPSysCursorDrawMgr = .sbss:0x804BF598; // type:object size:0x4 data:4byte lbl_804BF5A0 = .sbss:0x804BF5A0; // type:object size:0x8 data:4byte spInstance__16RPSysHomeMenuMgr = .sbss:0x804BF5A8; // type:object size:0x4 data:4byte spHomeMenuArcMgr__16RPSysHomeMenuMgr = .sbss:0x804BF5AC; // type:object size:0x4 data:4byte diff --git a/configure.py b/configure.py index 8ae0223b3..7dd1db1a6 100755 --- a/configure.py +++ b/configure.py @@ -406,13 +406,12 @@ def find_directories(root_path: str, recursive: bool) -> list[str]: "-i include/homeButtonMiniLib", ] -# RP flags -cflags_rp = [ +# Common RP flags +cflags_rp_base = [ *cflags_base, *cflags_pedantic, "-DPACK_SPORTS", "-enc SJIS", - "-inline deferred", "-fp_contract on", "-use_lmw_stmw on", "-str reuse,pool,readonly", @@ -421,10 +420,18 @@ def find_directories(root_path: str, recursive: bool) -> list[str]: "-i include/Pack", ] -# RP flags (include precompiled header) -cflags_rp_pch = [ - *cflags_rp, - "-prefix SportsPack.mch" +# RP flags +cflags_rp = [ + *cflags_rp_base, + "-inline deferred", + "-prefix SportsPack.mch", +] + +# RP flags (no inline deferred) +cflags_rp_no_deferred = [ + *cflags_rp_base, + "-inline auto", + "-prefix SportsPack.mch", ] config.linker_version = "GC/3.0a5.2" @@ -446,7 +453,7 @@ def MatchingFor(*versions): { "source": "SportsPack.pch", "mw_version": config.linker_version, - "cflags": ["-lang=c++", *cflags_rp], + "cflags": ["-lang=c++", *cflags_rp_base], }, ] config.libs = [ @@ -1157,7 +1164,7 @@ def MatchingFor(*versions): { "lib": "RP", "mw_version": config.linker_version, - "cflags": cflags_rp_pch, + "cflags": cflags_rp, "progress_category": "kernel", # str | List[str] "objects": [ Object(Matching, "main.cpp"), @@ -1215,7 +1222,7 @@ def MatchingFor(*versions): { "lib": "RP", "mw_version": config.linker_version, - "cflags": cflags_rp_pch, + "cflags": cflags_rp, "progress_category": "system", # str | List[str] "objects": [ Object(NonMatching, "Pack/RPSystem/RPSysSceneCreator.cpp"), @@ -1246,7 +1253,7 @@ def MatchingFor(*versions): { "lib": "RP", "mw_version": config.linker_version, - "cflags": cflags_rp_pch, + "cflags": cflags_rp, "progress_category": "graphics", # str | List[str] "objects": [ Object(Matching, "Pack/RPGraphics/RPGrpCamera.cpp"), @@ -1281,7 +1288,7 @@ def MatchingFor(*versions): { "lib": "RP", "mw_version": config.linker_version, - "cflags": cflags_rp_pch, + "cflags": cflags_rp, "progress_category": "audio", # str | List[str] "objects": [ Object(NonMatching, "Pack/RPAudio/RPSndAudioMgr.cpp"), @@ -1296,7 +1303,7 @@ def MatchingFor(*versions): { "lib": "RP", "mw_version": config.linker_version, - "cflags": cflags_rp_pch, + "cflags": cflags_rp, "progress_category": "utility", # str | List[str] "objects": [ Object(Matching, "Pack/RPUtility/RPUtlDohMath.cpp"), @@ -1322,7 +1329,7 @@ def MatchingFor(*versions): { "lib": "RP", "mw_version": config.linker_version, - "cflags": cflags_rp_pch, + "cflags": cflags_rp, "progress_category": "sports", # str | List[str] "objects": [ Object(NonMatching, "Pack/RPSports/RPSportsCommon/RPSportsCommon_unsplit.o"), @@ -1331,7 +1338,7 @@ def MatchingFor(*versions): { "lib": "RP", "mw_version": config.linker_version, - "cflags": cflags_rp_pch, + "cflags": cflags_rp, "progress_category": "tennis", # str | List[str] "objects": [ Object(NonMatching, "Pack/RPSports/RPTnsScene/RPTnsScene_unsplit.o"), @@ -1340,7 +1347,7 @@ def MatchingFor(*versions): { "lib": "RP", "mw_version": config.linker_version, - "cflags": cflags_rp_pch, + "cflags": cflags_rp, "progress_category": "baseball", # str | List[str] "objects": [ Object(NonMatching, "Pack/RPSports/RPBsbScene/RPBsbScene_unsplit.o"), @@ -1349,7 +1356,7 @@ def MatchingFor(*versions): { "lib": "RP", "mw_version": config.linker_version, - "cflags": cflags_rp_pch, + "cflags": cflags_rp, "progress_category": "golf", # str | List[str] "objects": [ Object(NonMatching, "Pack/RPSports/RPGolScene/RPGolScene.cpp"), @@ -1382,7 +1389,7 @@ def MatchingFor(*versions): { "lib": "RP", "mw_version": config.linker_version, - "cflags": cflags_rp_pch, + "cflags": cflags_rp, "progress_category": "boxing", # str | List[str] "objects": [ Object(NonMatching, "Pack/RPSports/RPBoxScene/RPBoxScene_unsplit.o"), @@ -1391,7 +1398,7 @@ def MatchingFor(*versions): { "lib": "RP", "mw_version": config.linker_version, - "cflags": cflags_rp_pch, + "cflags": cflags_rp, "progress_category": "bowling", # str | List[str] "objects": [ Object(NonMatching, "Pack/RPSports/RPBowScene/RPBow_80313028.cpp"), diff --git a/include/Pack/RPGraphics/RPGrpCamera.h b/include/Pack/RPGraphics/RPGrpCamera.h index 27f6d845b..2278a49d9 100644 --- a/include/Pack/RPGraphics/RPGrpCamera.h +++ b/include/Pack/RPGraphics/RPGrpCamera.h @@ -230,8 +230,8 @@ class RPGrpCamera { * @brief Camera state flags */ enum { - EFlag_5 = 1 << 5, - EFlag_7 = 1 << 7, + EFlag_Player2CursorValid = 1 << 5, + EFlag_Player4CursorValid = 1 << 7, }; private: diff --git a/include/Pack/RPGraphics/RPGrpModelRfl.h b/include/Pack/RPGraphics/RPGrpModelRfl.h index cc15f6746..04ed3354d 100644 --- a/include/Pack/RPGraphics/RPGrpModelRfl.h +++ b/include/Pack/RPGraphics/RPGrpModelRfl.h @@ -160,9 +160,9 @@ class RPGrpModelRfl : public RPGrpModel, public nw4r::g3d::IScnObjCallback { private: enum { EFlag_ReverseCulling = 1 << 4, - EFlag_5 = 1 << 5, - EFlag_6 = 1 << 6, - EFlag_7 = 1 << 7, + EFlag_Player2CursorValid = 1 << 5, + EFlag_Player3CursorValid = 1 << 6, + EFlag_Player4CursorValid = 1 << 7, EFlag_8 = 1 << 8, }; diff --git a/include/Pack/RPGraphics/RPGrpRenderer.h b/include/Pack/RPGraphics/RPGrpRenderer.h index 28e40563b..3f89e4912 100644 --- a/include/Pack/RPGraphics/RPGrpRenderer.h +++ b/include/Pack/RPGraphics/RPGrpRenderer.h @@ -35,6 +35,10 @@ class RPGrpRenderer { return spCurrentView; } + RPGrpView* GetView(int idx) const { + return mDrawViews[idx]; + } + /** * @brief Gets the screen currently being rendered to */ @@ -70,6 +74,11 @@ class RPGrpRenderer { static RPGrpView* spCurrentView; //! Screen currently being rendered to static RPGrpScreen* spCurrentScreen; + + char unk0[0xC]; + IRPGrpDrawObject* mpDrawList; // at 0xC + char unk10[0x14 - 0x10]; + RPGrpView* mDrawViews[MAX_VIEW]; // at 0x14 }; //! @} diff --git a/include/Pack/RPGraphics/RPGrpView.h b/include/Pack/RPGraphics/RPGrpView.h index 60f91dcb5..433a7f627 100644 --- a/include/Pack/RPGraphics/RPGrpView.h +++ b/include/Pack/RPGraphics/RPGrpView.h @@ -7,6 +7,7 @@ // Forward declarations class RPGrpCamera; +class RPGrpScreen; class RPGrpView { public: @@ -19,9 +20,11 @@ class RPGrpView { protected: u8 mViewNo; // at 0x0 u8 mDrawScene; // at 0x1 - char _02[0x8 - 0x2]; + char unk2[0x8 - 0x2]; EProjType mProjType; // at 0x8 - char _0C[0x1C - 0xC]; + char unkC[0x10 - 0xC]; + RPGrpScreen* mpScreen; // at 0x10 + char unk14[0x1C - 0x14]; public: virtual ~RPGrpView(); // at 0x8 @@ -36,6 +39,10 @@ class RPGrpView { return mProjType; } + RPGrpScreen* GetScreen() const { + return mpScreen; + } + private: ; }; diff --git a/include/Pack/RPKernel.h b/include/Pack/RPKernel.h index 17f7c4122..9efe4f2c9 100644 --- a/include/Pack/RPKernel.h +++ b/include/Pack/RPKernel.h @@ -8,6 +8,7 @@ #include #include #include +#include #include #include #include @@ -42,8 +43,8 @@ #include #include #include -#include #include +#include #include #include #include diff --git a/include/Pack/RPKernel/RPSysController.h b/include/Pack/RPKernel/RPSysController.h index cfe506684..ddde96a4b 100644 --- a/include/Pack/RPKernel/RPSysController.h +++ b/include/Pack/RPKernel/RPSysController.h @@ -273,6 +273,13 @@ class RPSysCoreController : public EGG::CoreController, EGG::CoreStatus status[KPAD_MAX_SAMPLES]; // at 0x8 }; + //! Buttons considered for cursor auto-repeat + static const u32 CURSOR_BUTTONS = + EGG::cCORE_BUTTON_UP | EGG::cCORE_BUTTON_DOWN | // + EGG::cCORE_BUTTON_LEFT | EGG::cCORE_BUTTON_RIGHT | // + EGG::cCORE_FSSTICK_UP | EGG::cCORE_FSSTICK_DOWN | // + EGG::cCORE_FSSTICK_LEFT | EGG::cCORE_FSSTICK_RIGHT; + public: /** * @brief Initializes the controller system @@ -309,7 +316,7 @@ class RPSysCoreController : public EGG::CoreController, * * @param playerNo Player ID */ - explicit RPSysCoreController(u32 playerNo); + explicit RPSysCoreController(s32 playerNo); /** * @brief Destructor @@ -475,6 +482,20 @@ class RPSysCoreController : public EGG::CoreController, */ bool requestCoreInfoAsync(); + /** + * @brief Accesses the active (main player) controller + */ + static RPSysCoreController* getActiveController() { + return spActiveController; + } + + /** + * @brief Gets this controller's player index + */ + s32 getPlayerNo() const { + return mPlayerNo; + } + /** * @brief Accesses this controller's MAC address */ @@ -525,13 +546,6 @@ class RPSysCoreController : public EGG::CoreController, //! Number of samples to use for the vertical Y acceleration average static const u32 ACC_VY_AVG_SAMPLES = 100; - //! Buttons considered for cursor auto-repeat - static const u32 CURSOR_BUTTONS = - EGG::cCORE_BUTTON_UP | EGG::cCORE_BUTTON_DOWN | // - EGG::cCORE_BUTTON_LEFT | EGG::cCORE_BUTTON_RIGHT | // - EGG::cCORE_FSSTICK_UP | EGG::cCORE_FSSTICK_DOWN | // - EGG::cCORE_FSSTICK_LEFT | EGG::cCORE_FSSTICK_RIGHT; - //! Cursor auto-repeat delay, in frames static const u32 CURSOR_REPEAT_DELAY = 40; //! Cursor auto-repeat rate, in frames @@ -544,9 +558,9 @@ class RPSysCoreController : public EGG::CoreController, static EGG::CoreController* createCoreController(); /** - * @brief Becomes the main (Player 1) controller + * @brief Becomes the active (main player) controller */ - void becomeMainController(); + void becomeActiveController(); /** * @brief Assigns a new WPAD channel and address to this controller @@ -579,9 +593,9 @@ class RPSysCoreController : public EGG::CoreController, static s16 sNextPlayerNo; //! Player 1's controller - static RPSysCoreController* spMainController; + static RPSysCoreController* spActiveController; //! Player 1's controller address - static RPSysCoreAddress sMainAddress; + static RPSysCoreAddress sActiveAddress; //! Whether a controller has disconnected in this scene static bool sDisconnectOccurred; @@ -594,7 +608,7 @@ class RPSysCoreController : public EGG::CoreController, //! Controller event EEvent mEvent; // at 0x904 //! Assigned player ID - u32 mPlayerNo; // at 0x908 + s32 mPlayerNo; // at 0x908 //! Held cursor buttons u32 mCursorHold; // at 0x90C diff --git a/include/Pack/RPKernel/RPSysCursorDrawMgr.h b/include/Pack/RPKernel/RPSysCursorDrawMgr.h new file mode 100644 index 000000000..29da4109b --- /dev/null +++ b/include/Pack/RPKernel/RPSysCursorDrawMgr.h @@ -0,0 +1,279 @@ +#ifndef RP_KERNEL_CURSOR_DRAW_MGR_H +#define RP_KERNEL_CURSOR_DRAW_MGR_H +#include + +#include +#include +#include + +#include +#include + +//! @addtogroup rp_kernel +//! @{ + +// Forward declarations +class RPSysEffect; + +/** + * @brief Cursor draw manager + */ +class RPSysCursorDrawMgr : IRPSysHostIOSocket { + RP_SINGLETON_DECL_EX(RPSysCursorDrawMgr); + +public: + /** + * @brief Player slot index + */ + enum EPlayer { + EPlayer_P1, //!< Player 1 + EPlayer_P2, //!< Player 2 + EPlayer_P3, //!< Player 3 + EPlayer_P4, //!< Player 4 + + EPlayer_Max + }; + + /** + * @brief DPD cursor type + */ + enum ECursorType { + ECursorType_Invalid, //!< DPD flag is invalid + ECursorType_1, + ECursorType_2, + }; + +public: + /** + * @brief Pushes a new DPD cursor configuration to the stack + */ + void startDpdCheck(); + + /** + * @brief Pops the top DPD cursor configuration from the stack + */ + void finishDpdCheck(); + + /** + * @brief Creates the active (main player) cursor + */ + void createActiveCursor(); + + /** + * @brief Fades away the active (main player) cursor + */ + void fadeActiveCursor(); + + /** + * @brief Gets the screen position of the active (main player) cursor + */ + const EGG::Vector2f& getActiveCursorPos() const; + + /** + * @brief Gets the DPD cursor type of the active (main player) cursor + */ + ECursorType getActiveCursorType() const; + + /** + * @brief Gets the player index of the active (main player) cursor + * + * @return Player slot index, or -1 if no such cursor exists + */ + s32 getActiveCursorPlayer() const; + + /** + * @brief Creates the cursor for the specified player + * + * @param player Player slot index + */ + void createPlayerCursor(EPlayer player) DECOMP_DONT_INLINE; + + /** + * @brief Moves the specified player cursor outside the screen + * + * @param player Player slot index + */ + void setPlayerCursorOutOfScreen(EPlayer player); + + /** + * @brief Gets the position of the specified player cursor + * + * @param player Player slot index + */ + const EGG::Vector2f& getPlayerCursorPos(EPlayer player) const; + + /** + * @brief Gets the controller channel used by the specified player cursor + * + * @param player Player slot index + * @return Controller channel, or -1 if no such cursor exists + */ + s32 getPlayerCursorChannel(EPlayer player) const; + + /** + * @brief Forces a player cursor to the specified screen position + * + * @param rPos New cursor position + * @param player Player slot index + * @param clearHorizon Whether to reset the cursor horizon to zero + */ + void setPlayerCursorPos(const EGG::Vector2f& rPos, EPlayer player, + bool clearHorizon); + + /** + * @brief Clears this manager's state + */ + void init(); + + /** + * @brief Performs logic that must occur before the scene is updated + */ + void preUpdate(); + + /** + * @brief Performs logic that must occur after the scene is updated + */ + void postUpdate(); + +private: + /** + * @brief Cursor flags + */ + enum { + EFlag_ActiveCursorEnable, + EFlag_Player1CursorValid = 4, + EFlag_Player2CursorValid, + EFlag_Player3CursorValid, + EFlag_Player4CursorValid, + EFlag_ActiveCursorValid, + EFlag_9, + EFlag_10, + EFlag_11, + }; + + //! Capacity of the cursor flag stack + static const int FLAG_STACK_SIZE = 5; + //! Default time before hidden cursors re-appear, in frames + static const u32 HIDE_TIME_MAX = 90; + //! Default alpha value for disabled cursors + static const u8 DISABLED_ALPHA = 96; + +private: + /** + * @brief Pushes the current controller parameter set to the stack + */ + void stackControllerSetting(); + + /** + * @brief Pops the top controller parameter set from the stack + */ + void popControllerSetting(); + + /** + * @brief Performs pre-update logic for the active (main player) cursor + */ + void preUpdateActive(); + + /** + * @brief Performs pre-update logic for player cursors + */ + void preUpdatePlayer(); + + /** + * @brief Performs post-update logic for the active (main player) cursor + */ + void postUpdateActive(); + + /** + * @brief Performs post-update logic for player cursors + */ + void postUpdatePlayer(); + + /** + * @brief Configures the effect draw settings of the specified cursor + * + * @param cursor Cursor index + * @param visible Whether the cursor should be visible + * @param enabled Whether the cursor should be enabled (not faded) + */ + void drawCursor(s32 cursor, bool visible, bool enabled); + + /** + * @brief Updates the specified cursor to match the latest DPD data + * + * @param cursor Cursor index + * @param player Player index + */ + void updateCursor(s32 cursor, s32 player); + + /** + * @brief Tests whether the active cursor exists + */ + bool checkActiveCursorEnable() const { + return mCursorFlagStack[0].onBit(EFlag_ActiveCursorEnable); + } + + /** + * @brief Tests whether any player cursor exists + */ + bool checkPlayerCursorEnable() { + return mCursorFlagStack[0] & + (1 << EFlag_Player1CursorValid | 1 << EFlag_Player2CursorValid | + 1 << EFlag_Player3CursorValid | 1 << EFlag_Player4CursorValid); + } + + /** + * @brief Tests whether the active cursor is in a valid state + */ + bool getActiveCursorValid() const { + return mCursorFlagStack[0] & 1 << EFlag_ActiveCursorValid; + } + + /** + * @brief Tests whether the specified player cursor is in a valid state + * + * @param player Player slot index + */ + bool getPlayerCursorValid(EPlayer player) const { + return mCursorFlagStack[0].onBit(EFlag_Player1CursorValid + player); + } + +private: + //! Position way outside of the screen boundaries + static const EGG::Vector2f OUT_OF_SCREEN_POS; + + //! Cursor flag stack + EGG::TBitFlag mCursorFlagStack[FLAG_STACK_SIZE]; // at 0x8 + + //! Index of the active (main player) cursor + s32 mActiveCursorIndex; // at 0x1C + //! Index of each player cursor + s32 mCursorIndex[EPlayer_Max]; // at 0x20 + + //! DPD cursor type + ECursorType mCursorType[EPlayer_Max]; // at 0x30 + //! Cursor horizon + f32 mCursorHorizon[EPlayer_Max]; // at 0x40 + + //! Hidden cursor timer + u32 mCursorHideTime[EPlayer_Max]; // at 0x50 + //! Time before hidden cursors re-appear, in frames + u32 mCursorHideTimeMax; // at 0x60 + + //! Alpha value for disabled cursors + u8 mDisabledAlpha; // at 0x64 + + //! Cursor screen position + EGG::Vector2f mCursorPos[EPlayer_Max]; // at 0x68 + + //! Normal cursor effect + RPSysEffect* mpEffCursorNormal[EPlayer_Max]; // at 0x88 + //! Blur cursor effect + RPSysEffect* mpEffCursorBlur[EPlayer_Max]; // at 0x98 + //! Shadow cursor effect + RPSysEffect* mpEffCursorShadow[EPlayer_Max]; // at 0xA8 +}; + +//! @} + +#endif diff --git a/include/Pack/RPSystem/RPSysCommonObject.h b/include/Pack/RPSystem/RPSysCommonObject.h index c81dc6244..7b7f94315 100644 --- a/include/Pack/RPSystem/RPSysCommonObject.h +++ b/include/Pack/RPSystem/RPSysCommonObject.h @@ -11,6 +11,12 @@ * @brief Encapsulates common object behavior/rendering */ class RPSysCommonObject : public IRPGrpDrawObject { +public: + enum EView { + EView_2D_Cursor = 29, + EView_2D_31 = 31, + }; + public: /** * @brief Constructor diff --git a/include/Pack/RPSystem/RPSysPlayerMgr.h b/include/Pack/RPSystem/RPSysPlayerMgr.h index fbc6107a5..191957fcc 100644 --- a/include/Pack/RPSystem/RPSysPlayerMgr.h +++ b/include/Pack/RPSystem/RPSysPlayerMgr.h @@ -106,6 +106,13 @@ class RPSysPlayerMgr { */ void setPlayerNum(s32 num); + /** + * @brief Gets the number of controllers + */ + s32 getRemoteNum() const { + return mRemoteNum; + } + /** * @brief Sets the number of controllers * diff --git a/include/Pack/RPSystem/RPSysSaveDataMgr.h b/include/Pack/RPSystem/RPSysSaveDataMgr.h index 7237105a1..ab737a901 100644 --- a/include/Pack/RPSystem/RPSysSaveDataMgr.h +++ b/include/Pack/RPSystem/RPSysSaveDataMgr.h @@ -263,9 +263,9 @@ class RPSysSaveDataMgr : public IRPSysHostIOSocket { EFlag_SaveFileExist, //!< The save file exists on the NAND EFlag_3, EFlag_DisableSave, //!< Saving is disabled - EFlag_5, - EFlag_6, - EFlag_7, + EFlag_Player2CursorValid, + EFlag_Player3CursorValid, + EFlag_Player4CursorValid, EFlag_NandAccess, //!< NAND operation is happening on another thread EFlag_AsyncSave, //!< Save file is being written on another thread EFlag_ErrorWindow, //!< System window error was displayed diff --git a/include/egg/core/eggController.h b/include/egg/core/eggController.h index ea59fde2c..25f91f54e 100644 --- a/include/egg/core/eggController.h +++ b/include/egg/core/eggController.h @@ -116,6 +116,13 @@ class CoreStatus : public KPADStatus { return Vector3f(acc.x, acc.y, acc.z); } + Vector2f getDpdPos() const { + return Vector2f(pos.x, pos.y); + } + Vector2f getHorizon() const { + return Vector2f(horizon.x, horizon.y); + } + eCoreDevType getDevType() const { return static_cast(dev_type); } diff --git a/include/egg/gfxe/eggFrustum.h b/include/egg/gfxe/eggFrustum.h index 18f58ec38..fba86ab20 100644 --- a/include/egg/gfxe/eggFrustum.h +++ b/include/egg/gfxe/eggFrustum.h @@ -68,7 +68,7 @@ class Frustum { const nw4r::math::VEC2& rPosScreen) const; void ConvertFromCanvasLU(f32 x, f32 y, f32* pX, f32* pY) const { - *pX = -(GetSize().x / 2.0f - x); + *pX = GetSize().x / 2.0f + x; *pY = -(-(GetSize().y / 2.0f - y)); } void ConvertFromCanvasCC(f32 x, f32 y, f32* pX, f32* pY) const { @@ -95,12 +95,12 @@ class Frustum { void ConvertFromNormalCC(f32 x, f32 y, f32* pX, f32* pY) const { if (mCanvasMode == CANVAS_LU) { - x *= GetSize().x / 2.0f; - y *= GetSize().y / 2.0f; + *pX = GetSize().x / 2.0f * x; + *pY = GetSize().y / 2.0f * y; ConvertFromCanvasLU(*pX, *pY, pX, pY); } else if (mCanvasMode == CANVAS_CC) { - *pX = x * (GetSize().x / 2.0f); - *pY = y * (GetSize().y / 2.0f); + *pX = (GetSize().x / 2.0f) * x; + *pY = (GetSize().y / 2.0f) * y; } } diff --git a/include/egg/math/eggMath.h b/include/egg/math/eggMath.h index 67c35c51d..7714e1605 100644 --- a/include/egg/math/eggMath.h +++ b/include/egg/math/eggMath.h @@ -50,6 +50,18 @@ template class Math { static T max(T t1, T t2) { return t1 > t2 ? t1 : t2; } + static T clamp2(T t, T min, T max) { + if (t < min) { + return min; + } + + if (t > max) { + return max; + } + + return t; + // return t < min ? min : (t > max ? max : t); + } }; typedef Math Mathi; diff --git a/include/revolution/BTE/decompctx_stubs.h b/include/revolution/BTE/decompctx_stubs.h new file mode 100644 index 000000000..ae527f18c --- /dev/null +++ b/include/revolution/BTE/decompctx_stubs.h @@ -0,0 +1,32 @@ +#ifndef RVL_SDK_BTE_DECOMP_STUBS_H +#define RVL_SDK_BTE_DECOMP_STUBS_H +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(DECOMPCTX) + +typedef u8 UINT8; +typedef u16 UINT16; +typedef u32 UINT32; + +#define BD_ADDR_LEN 6 +typedef UINT8 BD_ADDR[BD_ADDR_LEN]; +typedef BD_ADDR* BD_ADDR_PTR; + +#define LINK_KEY_LEN 16 +typedef UINT8 LINK_KEY[LINK_KEY_LEN]; + +typedef UINT16 tBTA_HH_ATTR_MASK; +typedef UINT16 tBTA_HH_EVT; +typedef void tBTA_HH; +typedef UINT32 tBTA_SERVICE_MASK; + +#endif + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/Pack/RPGraphics/RPGrpCamera.cpp b/src/Pack/RPGraphics/RPGrpCamera.cpp index 6395fc384..98a23f343 100644 --- a/src/Pack/RPGraphics/RPGrpCamera.cpp +++ b/src/Pack/RPGraphics/RPGrpCamera.cpp @@ -74,7 +74,7 @@ void RPGrpCamera::Identity() { mUp.y = 1.0f; CalcMatrix(); - mFlags &= ~EFlag_5; + mFlags &= ~EFlag_Player2CursorValid; } /** @@ -150,7 +150,7 @@ void RPGrpCamera::CalcMatrix() { mForward.y = mWorldMtx._12; mForward.z = mWorldMtx._22; - mFlags &= ~EFlag_7; + mFlags &= ~EFlag_Player4CursorValid; } /** diff --git a/src/Pack/RPGraphics/RPGrpModelRfl.cpp b/src/Pack/RPGraphics/RPGrpModelRfl.cpp index 7111faac3..ac82288f5 100644 --- a/src/Pack/RPGraphics/RPGrpModelRfl.cpp +++ b/src/Pack/RPGraphics/RPGrpModelRfl.cpp @@ -53,7 +53,8 @@ RPGrpModelRfl* RPGrpModelRfl::Construct(RFLDataSource src, u16 index, RPGrpModelRfl::RPGrpModelRfl(RFLResolution resolution, u32 exprFlags, u8 viewNo) : RPGrpModel(viewNo), - mFlagsRfl(EFlag_5 | EFlag_6 | EFlag_7), + mFlagsRfl(EFlag_Player2CursorValid | EFlag_Player3CursorValid | + EFlag_Player4CursorValid), mOutputAlpha(128), mMaterialType(MaterialType_0), mpRflParent(NULL), @@ -221,7 +222,7 @@ void RPGrpModelRfl::DrawGX(const RFLCharModel* pModel, u32 diffMask, diffMaskSub = diffMask; - if (!(mFlagsRfl & EFlag_5)) { + if (!(mFlagsRfl & EFlag_Player2CursorValid)) { diffMaskSub = 0; ambColor.a = 255; } @@ -232,10 +233,11 @@ void RPGrpModelRfl::DrawGX(const RFLCharModel* pModel, u32 diffMask, GXSetChanCtrl(GX_COLOR0, GX_TRUE, GX_SRC_REG, GX_SRC_REG, GX_LIGHT_NULL, GX_DF_CLAMP, GX_AF_SPOT); - GXSetChanCtrl(GX_ALPHA0, (mFlagsRfl & EFlag_5) ? GX_TRUE : GX_FALSE, - GX_SRC_REG, GX_SRC_REG, - static_cast(diffMaskSub), GX_DF_CLAMP, - GX_AF_SPOT); + GXSetChanCtrl( + GX_ALPHA0, + (mFlagsRfl & EFlag_Player2CursorValid) ? GX_TRUE : GX_FALSE, + GX_SRC_REG, GX_SRC_REG, static_cast(diffMaskSub), + GX_DF_CLAMP, GX_AF_SPOT); GXSetChanCtrl(GX_COLOR1A1, GX_FALSE, GX_SRC_REG, GX_SRC_REG, GX_LIGHT_NULL, GX_DF_NONE, GX_AF_NONE); diff --git a/src/Pack/RPKernel/RPSysController.cpp b/src/Pack/RPKernel/RPSysController.cpp index f1689240f..30cee08a4 100644 --- a/src/Pack/RPKernel/RPSysController.cpp +++ b/src/Pack/RPKernel/RPSysController.cpp @@ -46,12 +46,12 @@ s16 RPSysCoreController::sNextPlayerNo = 0; /** * @brief Player 1's controller */ -RPSysCoreController* RPSysCoreController::spMainController = NULL; +RPSysCoreController* RPSysCoreController::spActiveController = NULL; /** * @brief Player 1's controller address */ -RPSysCoreAddress RPSysCoreController::sMainAddress; +RPSysCoreAddress RPSysCoreController::sActiveAddress; /** * @brief Whether a controller has disconnected in this scene @@ -394,8 +394,8 @@ bool RPSysCoreInfo::isLowBattery() const { EGG::CoreController* RPSysCoreController::createCoreController() { RPSysCoreController* pController = new RPSysCoreController(sNextPlayerNo++); - if (spMainController == NULL) { - pController->becomeMainController(); + if (spActiveController == NULL) { + pController->becomeActiveController(); } return pController; @@ -480,7 +480,7 @@ void RPSysCoreController::initScene() { * * @param playerNo Player ID */ -RPSysCoreController::RPSysCoreController(u32 playerNo) { +RPSysCoreController::RPSysCoreController(s32 playerNo) { mWPADProbeResult = WPAD_ERR_NO_CONTROLLER; mEvent = EEvent_None; mPlayerNo = playerNo; @@ -608,11 +608,11 @@ void RPSysCoreController::beginFrame(PADStatus* pStatus) { } /** - * @brief Becomes the main (Player 1) controller + * @brief Becomes the active (main player) controller */ -void RPSysCoreController::becomeMainController() { - spMainController = this; - sMainAddress = mAddress; +void RPSysCoreController::becomeActiveController() { + spActiveController = this; + sActiveAddress = mAddress; } /** diff --git a/src/Pack/RPKernel/RPSysControllerMgr.cpp b/src/Pack/RPKernel/RPSysControllerMgr.cpp index 4f1df3624..43fb95269 100644 --- a/src/Pack/RPKernel/RPSysControllerMgr.cpp +++ b/src/Pack/RPKernel/RPSysControllerMgr.cpp @@ -306,7 +306,7 @@ void RPSysCoreControllerMgr::beginFrame() { pConnected->set(chan, addr); if (pConnected->mPlayerNo == 0) { - pConnected->becomeMainController(); + pConnected->becomeActiveController(); } pConnected->rumble( diff --git a/src/Pack/RPKernel/RPSysCursorDrawMgr.cpp b/src/Pack/RPKernel/RPSysCursorDrawMgr.cpp new file mode 100644 index 000000000..a6e3c50d1 --- /dev/null +++ b/src/Pack/RPKernel/RPSysCursorDrawMgr.cpp @@ -0,0 +1,659 @@ +#include +#include +#include + +#include + +//! Shadow offset from the normal cursor effect +#define SHADOW_OFFSET 3.0f + +/** + * @brief Position way outside of the screen boundaries + */ +const EGG::Vector2f RPSysCursorDrawMgr::OUT_OF_SCREEN_POS(0.0f, 12800.0f); + +RP_SINGLETON_IMPL_EX(RPSysCursorDrawMgr); + +/** + * @brief Pushes the current controller parameter set to the stack + */ +void RPSysCursorDrawMgr::stackControllerSetting() { + RPSysCoreController::pushDpdCtrlStackAll(true); + RPSysCoreController::pushKPADParamStackAll(); +} + +/** + * @brief Pops the top controller parameter set from the stack + */ +void RPSysCursorDrawMgr::popControllerSetting() { + RPSysCoreController::popDpdCtrlStackAll(); + RPSysCoreController::popKPADParamStackAll(); +} + +/** + * @brief Pushes a new DPD cursor configuration to the stack + */ +void RPSysCursorDrawMgr::startDpdCheck() { + mActiveCursorIndex = -1; + for (int i = 0; i < EPlayer_Max; i++) { + mCursorIndex[i] = -1; + } + + if (checkActiveCursorEnable()) { + for (int i = (FLAG_STACK_SIZE - 1) - 1; i >= 0; i--) { + mCursorFlagStack[i + 1] = mCursorFlagStack[i]; + } + } + + // Clear all other flags + mCursorFlagStack[0] = 1 << EFlag_ActiveCursorEnable; + + // Cursors draw in port priority + for (int i = EPlayer_P4; i >= EPlayer_P1; i--) { + mpEffCursorShadow[i]->create(); + mpEffCursorBlur[i]->create(); + mpEffCursorNormal[i]->create(); + + drawCursor(i, false, false); + } + + for (int i = 0; i < EPlayer_Max; i++) { + mCursorPos[i] = OUT_OF_SCREEN_POS; + mCursorHideTime[i] = mCursorHideTimeMax; + updateCursor(i, i); + } + + stackControllerSetting(); +} + +/** + * @brief Pops the top DPD cursor configuration from the stack + */ +void RPSysCursorDrawMgr::finishDpdCheck() { + // May need to create cursors from previous configuration + if (mCursorFlagStack[1].onBit(EFlag_ActiveCursorEnable)) { + for (int i = 0; i < FLAG_STACK_SIZE - 1; i++) { + mCursorFlagStack[i] = mCursorFlagStack[i + 1]; + } + + mCursorFlagStack[FLAG_STACK_SIZE - 1].makeAllZero(); + + if (mCursorFlagStack[0] & // + (1 << EFlag_ActiveCursorValid | 1 << EFlag_9 | 1 << EFlag_10 | + 1 << EFlag_11)) { + + createActiveCursor(); + + } else if (checkPlayerCursorEnable()) { + for (int i = 0; i < EPlayer_Max; i++) { + if (getPlayerCursorValid(static_cast(i))) { + createPlayerCursor(static_cast(i)); + } + } + } + + } else { + mCursorFlagStack[0].makeAllZero(); + + for (int i = 0; i < EPlayer_Max; i++) { + mpEffCursorShadow[i]->forceKill(); + mpEffCursorBlur[i]->forceKill(); + mpEffCursorNormal[i]->forceKill(); + } + } + + popControllerSetting(); +} + +/** + * @brief Creates the active (main player) cursor + */ +void RPSysCursorDrawMgr::createActiveCursor() { + if (checkActiveCursorEnable()) { + mActiveCursorIndex = + RPSysCoreController::getActiveController()->getPlayerNo(); + + for (int i = 0; i < EPlayer_Max; i++) { + mCursorIndex[i] = -1; + } + + mCursorFlagStack[0].makeAllZero(); + mCursorFlagStack[0].setBit(EFlag_ActiveCursorEnable); + mCursorFlagStack[0].setBit(EFlag_ActiveCursorValid); + + for (int i = 0; i < EPlayer_Max; i++) { + mCursorPos[i] = OUT_OF_SCREEN_POS; + + drawCursor(i, true, mActiveCursorIndex == i); + updateCursor(i, i); + } + } +} + +/** + * @brief Fades away the active (main player) cursor + */ +void RPSysCursorDrawMgr::fadeActiveCursor() { + if (checkActiveCursorEnable()) { + // Clear all other flags + mCursorFlagStack[0] = 1 << EFlag_ActiveCursorEnable; + + for (int i = 0; i < EPlayer_Max; i++) { + drawCursor(i, false, false); + } + } +} + +/** + * @brief Gets the screen position of the active (main player) cursor + */ +const EGG::Vector2f& RPSysCursorDrawMgr::getActiveCursorPos() const { + if (checkActiveCursorEnable() && getActiveCursorValid() && + mActiveCursorIndex >= 0) { + + return mCursorPos[mActiveCursorIndex]; + } + + return OUT_OF_SCREEN_POS; +} + +/** + * @brief Gets the DPD cursor type of the active (main player) cursor + */ +RPSysCursorDrawMgr::ECursorType +RPSysCursorDrawMgr::getActiveCursorType() const { + if (checkActiveCursorEnable() && getActiveCursorValid() && + mActiveCursorIndex >= 0) { + + return mCursorType[mActiveCursorIndex]; + } + + return ECursorType_Invalid; +} + +/** + * @brief Gets the player index of the active (main player) cursor + * + * @return Player slot index, or -1 if no such cursor exists + */ +s32 RPSysCursorDrawMgr::getActiveCursorPlayer() const { + if (checkActiveCursorEnable() && getActiveCursorValid()) { + return RPSysCoreController::getActiveController()->getPlayerNo(); + } + + return -1; +} + +/** + * @brief Creates the cursor for the specified player + * + * @param player Player slot index + */ +void RPSysCursorDrawMgr::createPlayerCursor(EPlayer player) { + if (checkActiveCursorEnable()) { + mActiveCursorIndex = -1; + mCursorIndex[player] = -1; + + RPSysPlayerMgr* pPlayerMgr = RP_GET_INSTANCE(RPSysPlayerMgr); + + if (player < pPlayerMgr->getPlayerNum()) { + mCursorIndex[player] = pPlayerMgr->getChannel(player); + mCursorFlagStack[0].setBit(EFlag_Player1CursorValid + player); + + for (int i = 0; i < EPlayer_Max; i++) { + mCursorPos[i] = OUT_OF_SCREEN_POS; + drawCursor(i, getPlayerCursorValid(player), true); + updateCursor(i, i); + } + } + } +} + +/** + * @brief Moves the specified player cursor outside the screen + * + * @param player Player slot index + */ +void RPSysCursorDrawMgr::setPlayerCursorOutOfScreen(EPlayer player) { + if (checkActiveCursorEnable()) { + mCursorFlagStack[0].resetBit(EFlag_Player1CursorValid + player); + mCursorPos[player] = OUT_OF_SCREEN_POS; + + drawCursor(player, false, false); + } +} + +/** + * @brief Gets the position of the specified player cursor + * + * @param player Player slot index + */ +const EGG::Vector2f& +RPSysCursorDrawMgr::getPlayerCursorPos(EPlayer player) const { + if (checkActiveCursorEnable() && getPlayerCursorValid(player) && + mCursorIndex[player] >= 0) { + + return mCursorPos[mCursorIndex[player]]; + } + + return OUT_OF_SCREEN_POS; +} + +/** + * @brief Gets the controller channel used by the specified player cursor + * + * @param player Player slot index + * @return Controller channel, or -1 if no such cursor exists + */ +s32 RPSysCursorDrawMgr::getPlayerCursorChannel(EPlayer player) const { + if (checkActiveCursorEnable() && getPlayerCursorValid(player)) { + return RP_GET_INSTANCE(RPSysPlayerMgr)->getChannel(player); + } + + return -1; +} + +/** + * @brief Forces a player cursor to the specified screen position + * + * @param rPos New cursor position + * @param player Player slot index + * @param clearHorizon Whether to reset the cursor horizon to zero + */ +void RPSysCursorDrawMgr::setPlayerCursorPos(const EGG::Vector2f& rPos, + EPlayer player, bool clearHorizon) { + if (checkActiveCursorEnable() && getPlayerCursorValid(player) && + mCursorIndex[player] >= 0) { + + mCursorPos[mCursorIndex[player]] = rPos; + + if (clearHorizon) { + mCursorHorizon[mCursorIndex[player]] = 0.0f; + } + } +} + +/** + * @brief Clears this manager's state + */ +void RPSysCursorDrawMgr::init() { + for (int i = 0; i < FLAG_STACK_SIZE; i++) { + mCursorFlagStack[i].makeAllZero(); + } + + mActiveCursorIndex = -1; + for (int i = 0; i < EPlayer_Max; i++) { + mCursorIndex[i] = -1; + } + + for (int i = 0; i < EPlayer_Max; i++) { + mCursorHideTime[i] = mCursorHideTimeMax; + } + + for (int i = 0; i < EPlayer_Max; i++) { + mCursorPos[i] = OUT_OF_SCREEN_POS; + + mpEffCursorShadow[i]->forceKill(); + mpEffCursorBlur[i]->forceKill(); + mpEffCursorNormal[i]->forceKill(); + } +} + +/** + * @brief Performs pre-update logic for the active (main player) cursor + */ +void RPSysCursorDrawMgr::preUpdateActive() { + // Hide active DPD cursor when buttons are pressed + if (getActiveCursorValid() && mActiveCursorIndex >= 0) { + if (RP_GET_CORE_CTRL(mActiveCursorIndex) + ->getCoreStatus() + ->down(RPSysCoreController::CURSOR_BUTTONS)) { + + mCursorHideTime[mActiveCursorIndex] = 0; + } + } +} + +/** + * @brief Performs pre-update logic for player cursors + */ +void RPSysCursorDrawMgr::preUpdatePlayer() { + // Hide player DPD cursor(s) when buttons are pressed + if (checkPlayerCursorEnable()) { + s32 playerNum = RP_GET_INSTANCE(RPSysPlayerMgr)->getPlayerNum(); + + for (int i = 0; i < playerNum; i++) { + if (mCursorIndex[i] < 0 || + !getPlayerCursorValid(static_cast(i))) { + + continue; + } + + if (RP_GET_CORE_CTRL(mCursorIndex[i]) + ->getCoreStatus() + ->down(RPSysCoreController::CURSOR_BUTTONS)) { + + mCursorHideTime[mCursorIndex[i]] = 0; + } + } + } +} + +/** + * @brief Performs logic that must occur before the scene is updated + */ +void RPSysCursorDrawMgr::preUpdate() { + if (!checkActiveCursorEnable()) { + return; + } + + s32 remoteNum = RP_GET_INSTANCE(RPSysPlayerMgr)->getRemoteNum(); + + if (remoteNum == 0) { + remoteNum = RP_GET_INSTANCE(RPSysProjectLocal)->getPack() == + RPSysSceneCreator::EPackID_SportsPack + ? RP_SPORTS_MAX_PLAYERS + : RP_PARTY_MAX_PLAYERS; + } + + // Hide active cursor if the device is not supported + if (getActiveCursorValid()) { + if (RPSysCoreController::getActiveController()->isCoreBaseDevice()) { + mActiveCursorIndex = + RPSysCoreController::getActiveController()->getPlayerNo(); + + } else if (mActiveCursorIndex >= 0) { + mCursorPos[mActiveCursorIndex] = OUT_OF_SCREEN_POS; + } + } + + // Hide player cursors if the device is not supported + if (checkPlayerCursorEnable()) { + s32 playerNum = RP_GET_INSTANCE(RPSysPlayerMgr)->getPlayerNum(); + + for (int i = 0; i < playerNum; i++) { + mCursorIndex[i] = RP_GET_INSTANCE(RPSysPlayerMgr)->getChannel(i); + + if (RP_GET_CORE_CTRL(mCursorIndex[i])->isCoreBaseDevice()) { + continue; + } + + mCursorPos[mCursorIndex[i]] = OUT_OF_SCREEN_POS; + } + } + + RPGrpView* pCursorView = RPGrpRenderer::GetCurrent() // + ->GetView(RPSysCommonObject::EView_2D_Cursor); + + if (pCursorView != NULL) { + RPGrpScreen* pScreen = pCursorView->GetScreen(); + + if (pScreen != NULL) { + preUpdateActive(); + preUpdatePlayer(); + + // Poll latest cursor state + for (int i = 0; i < remoteNum; i++) { + // Hidden cursor(s) wait to wake-up + if (mCursorHideTime[i] < mCursorHideTimeMax) { + mCursorType[i] = ECursorType_Invalid; + mCursorPos[i] = OUT_OF_SCREEN_POS; + + mCursorHideTime[i] += + RP_GET_INSTANCE(RPSysSystem)->getFrameRate(); + } + // Process valid cursor + else { + EGG::CoreStatus status = + *RP_GET_CORE_CTRL(i)->getCoreStatus(); + + mCursorType[i] = + static_cast(status.getDPDValidFlag()); + + if (mCursorType[i] > 0 && + RP_GET_CORE_CTRL(i)->isCoreBaseDevice()) { + + EGG::Vector2f pos = status.getDpdPos(); + pos.x = EGG::Mathf::clamp2(pos.x, -1.0f, 1.0f); + pos.y = EGG::Mathf::clamp2(pos.y, -1.0f, 1.0f); + + pScreen->ConvertFromNormalCC( + pos.x, -pos.y, &mCursorPos[i].x, &mCursorPos[i].y); + + EGG::Vector2f hori = status.getHorizon(); + mCursorHorizon[i] = EGG::Mathf::atan2(hori.y, hori.x); + } else { + mCursorPos[i] = OUT_OF_SCREEN_POS; + } + } + } + } + } +} + +/** + * @brief Performs logic that must occur after the scene is updated + */ +void RPSysCursorDrawMgr::postUpdate() { + if (checkActiveCursorEnable()) { + postUpdateActive(); + postUpdatePlayer(); + } +} + +/** + * @brief Performs post-update logic for the active (main player) cursor + */ +void RPSysCursorDrawMgr::postUpdateActive() { + if (mCursorFlagStack[0] & 1 << EFlag_ActiveCursorValid) { + s32 playerNum = RP_GET_INSTANCE(RPSysProjectLocal)->getPack() == + RPSysSceneCreator::EPackID_PartyPack + ? RP_PARTY_MAX_PLAYERS + : RP_MAX_PLAYERS; + + if (mCursorFlagStack[0] & 1 << EFlag_ActiveCursorValid) { + for (int i = 0; i < playerNum; i++) { + updateCursor(i, i); + } + } + } +} + +/** + * @brief Performs post-update logic for player cursors + */ +void RPSysCursorDrawMgr::postUpdatePlayer() { + if (!checkPlayerCursorEnable()) { + return; + } + + s32 playerNum = RP_GET_INSTANCE(RPSysPlayerMgr)->getPlayerNum(); + + // @bug Undefined behavior +#if defined(BUG_FIX) + bool update[EPlayer_Max] = {}; +#else + bool update[EPlayer_Max]; +#endif + + for (int i = 0; i < playerNum; i++) { + update[i] = true; + } + + for (int i = 0; i < playerNum; i++) { + if (mCursorIndex[i] < 0) { + continue; + } + + if (!update[mCursorIndex[i]]) { + continue; + } + + if (!getPlayerCursorValid(static_cast(i))) { + continue; + } + + update[mCursorIndex[i]] = false; + updateCursor(i, mCursorIndex[i]); + } + + for (int i = 0; i < playerNum; i++) { + if (mCursorIndex[i] < 0) { + continue; + } + + if (!update[mCursorIndex[i]]) { + continue; + } + + update[mCursorIndex[i]] = false; + updateCursor(i, mCursorIndex[i]); + } +} + +/** + * @brief Configures the effect draw settings of the specified cursor + * + * @param cursor Cursor index + * @param visible Whether the cursor should be visible + * @param enabled Whether the cursor should be enabled (not faded) + */ +void RPSysCursorDrawMgr::drawCursor(s32 cursor, bool visible, bool enabled) { + if (visible) { + if (enabled) { + mpEffCursorNormal[cursor]->setColor(255, 255, 255, 255); + mpEffCursorNormal[cursor]->setDisableDraw(false); + mpEffCursorBlur[cursor]->setDisableDraw(false); + mpEffCursorShadow[cursor]->setDisableDraw(false); + } else { + mpEffCursorNormal[cursor]->setColor(255, 255, 255, mDisabledAlpha); + mpEffCursorNormal[cursor]->setDisableDraw(false); + + mpEffCursorBlur[cursor]->setDisableDraw(true); + mpEffCursorShadow[cursor]->setDisableDraw(true); + } + } else { + mpEffCursorNormal[cursor]->setDisableDraw(true); + mpEffCursorBlur[cursor]->setDisableDraw(true); + mpEffCursorShadow[cursor]->setDisableDraw(true); + } +} + +/** + * @brief Updates the specified cursor to match the latest DPD data + * + * @param cursor Cursor index + * @param player Player index + */ +void RPSysCursorDrawMgr::updateCursor(s32 cursor, s32 player) { + EGG::Vector3f cursorPos( // + mCursorPos[player].x, // + mCursorPos[player].y, // + 0.0f // + ); + + EGG::Vector3f shadowPos( // + cursorPos.x + SHADOW_OFFSET, // + cursorPos.y - SHADOW_OFFSET, // + 0.0f // + ); + + EGG::Vector3f cursorRot( // + 0.0f, // + 0.0f, // + mCursorHorizon[player] // + ); + + mpEffCursorNormal[cursor]->setPos(cursorPos); + mpEffCursorNormal[cursor]->setParticleRotate(cursorRot); + mpEffCursorNormal[cursor]->update(); + + mpEffCursorBlur[cursor]->setPos(cursorPos); + mpEffCursorBlur[cursor]->setParticleRotate(cursorRot); + mpEffCursorBlur[cursor]->update(); + + mpEffCursorShadow[cursor]->setPos(shadowPos); + mpEffCursorShadow[cursor]->setParticleRotate(cursorRot); + mpEffCursorShadow[cursor]->update(); +} + +/** + * @brief Constructor + * + * @param pHeap Parent heap + */ +RPSysCursorDrawMgr::RPSysCursorDrawMgr(EGG::Heap* pHeap) + : IRPSysHostIOSocket("Cursor Manager"), mpParentHeap(pHeap) { + + for (int i = 0; i < FLAG_STACK_SIZE; i++) { + mCursorFlagStack[i].makeAllZero(); + } + + mActiveCursorIndex = -1; + for (int i = 0; i < EPlayer_Max; i++) { + mCursorIndex[i] = -1; + } + + mCursorHideTimeMax = HIDE_TIME_MAX; + for (int i = 0; i < EPlayer_Max; i++) { + mCursorHideTime[i] = mCursorHideTimeMax; + } + + mDisabledAlpha = DISABLED_ALPHA; + + const char* pNormalNames[EPlayer_Max][2] = { + // clang-format off + "def_cursor_normal_1p", + "def_cursor_normal_1p_n", + + "def_cursor_normal_2p", + "def_cursor_normal_2p_n", + + "def_cursor_normal_3p", + "def_cursor_normal_3p_n", + + "def_cursor_normal_4p", + "def_cursor_normal_4p_n", + // clang-format on + }; + + const char* pBlurNames[EPlayer_Max] = { + "def_cursor_normal_1p_blur", + "def_cursor_normal_2p_blur", + "def_cursor_normal_3p_blur", + "def_cursor_normal_4p_blur", + }; + + // Wii Sports uses the _n ("neon"?) version + int cursorType = 0; + if (RP_GET_INSTANCE(RPSysProjectLocal)->getPack() == + RPSysSceneCreator::EPackID_SportsPack) { + + cursorType = 1; + } + + for (int i = 0; i < EPlayer_Max; i++) { + mCursorType[i] = ECursorType_Invalid; + mCursorPos[i] = OUT_OF_SCREEN_POS; + + mpEffCursorNormal[i] = new (pHeap) RPSysEffect( // + pNormalNames[i][cursorType], // + RPSysEffectMgr::EDrawGroup_Cursor, // + RPSysEffectMgr::EDrawScene_Cursor); + + mpEffCursorBlur[i] = new (pHeap) RPSysEffect( // + pBlurNames[i], // + RPSysEffectMgr::EDrawGroup_Cursor, // + RPSysEffectMgr::EDrawScene_Cursor); + + mpEffCursorShadow[i] = new (pHeap) RPSysEffect( // + "def_cursor_normal_sd", // + RPSysEffectMgr::EDrawGroup_Cursor, // + RPSysEffectMgr::EDrawScene_Cursor); + } +} + +/** + * @brief Destructor + */ +RPSysCursorDrawMgr::~RPSysCursorDrawMgr() {} diff --git a/src/Pack/RPKernel/RPSysHomeMenuMgr.cpp b/src/Pack/RPKernel/RPSysHomeMenuMgr.cpp index 753e11f37..a92a1050e 100644 --- a/src/Pack/RPKernel/RPSysHomeMenuMgr.cpp +++ b/src/Pack/RPKernel/RPSysHomeMenuMgr.cpp @@ -343,8 +343,8 @@ void RPSysHomeMenuMgr::checkMenuStart() { bool pressedBtn = false; for (int index = 0; index < RP_MAX_CONTROLLERS; index++) { - if (RP_GET_CORE_CTRL(index)->getCoreStatus()->getTrigger() & - EGG::cCORE_BUTTON_HOME) { + if (RP_GET_CORE_CTRL(index)->getCoreStatus()->downTrigger( + EGG::cCORE_BUTTON_HOME)) { pressedBtn = true; break; From c4249607af8e22bf0b80d7d97519112c77fa6013 Mon Sep 17 00:00:00 2001 From: kiwi515 <49212064+kiwi515@users.noreply.github.com> Date: Mon, 7 Sep 2026 12:32:47 -0400 Subject: [PATCH 2/7] Update symbols.txt --- config/RSPE01_01/symbols.txt | 43 ++++++++++++++++++------------------ 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/config/RSPE01_01/symbols.txt b/config/RSPE01_01/symbols.txt index cf84d2ce6..019607a39 100644 --- a/config/RSPE01_01/symbols.txt +++ b/config/RSPE01_01/symbols.txt @@ -8184,7 +8184,7 @@ __ct__14RPSndMoveParamFQ214RPSndMoveParam13ParamCategoryRQ34nw4r3snd11SoundHandl update__17RPSndMoveValueF32Fv = .text:0x801B92A8; // type:function size:0x78 moveValue__17RPSndMoveValueF32FfUl = .text:0x801B9320; // type:function size:0x4C __ct__17RPSndMoveValueF32Fv = .text:0x801B936C; // type:function size:0x2C -@8@update__14RPSndMoveParamFv = .text:0x801B9398; // type:function size:0x8 +@8@update__14RPSndMoveParamFv = .text:0x801B9398; // type:function size:0x8 scope:weak calc__19RPSndHomeMenuArcMgrFv = .text:0x801B93A0; // type:function size:0x18 setupArchive__19RPSndHomeMenuArcMgrFPCv = .text:0x801B93B8; // type:function size:0x54 __dt__19RPSndHomeMenuArcMgrFv = .text:0x801B940C; // type:function size:0x90 @@ -8198,7 +8198,7 @@ __dt__14RPSndStaticMgrFv = .text:0x801B9850; // type:function size:0x68 __ct__14RPSndStaticMgrFv = .text:0x801B98B8; // type:function size:0x58 GetMidPoint__12RPUtlDohMathFPQ34nw4r4math4VEC3PfRCQ34nw4r4math4VEC3RCQ34nw4r4math4VEC3RCQ34nw4r4math4VEC3ff = .text:0x801B9910; // type:function size:0x1FC MTX34Normalize__12RPUtlDohMathFPQ34nw4r4math5MTX34PCQ34nw4r4math5MTX34Q212RPUtlDohMath9AxisOrder = .text:0x801B9B0C; // type:function size:0x298 -__sinit_\RPUtlDohMath_cpp = .text:0x801B9DA4; // type:function size:0x11C scope:weak +__sinit_\RPUtlDohMath_cpp = .text:0x801B9DA4; // type:function size:0x11C scope:local fn_801B9EC0 = .text:0x801B9EC0; // type:function size:0x3C4 fn_801BA284 = .text:0x801BA284; // type:function size:0x198 fn_801BA41C = .text:0x801BA41C; // type:function size:0x218 @@ -14835,7 +14835,7 @@ gRMO_Pal60_640x456Prog_16x9__Q23EGG22@unnamed@eggVideo_cpp@ = .rodata:0x8037AAC4 @stringBase0 = .rodata:0x8037ABB0; // type:object size:0x1B scope:local data:string_table @stringBase0 = .rodata:0x8037ABD0; // type:object size:0x2C scope:local data:string_table @stringBase0 = .rodata:0x8037AC00; // type:object size:0xB4 scope:local data:string_table -lbl_8037ACB8 = .rodata:0x8037ACB8; // type:object size:0x38 +@stringBase0 = .rodata:0x8037ACB8; // type:object size:0x37 scope:local data:string_table @stringBase0 = .rodata:0x8037ACF0; // type:object size:0x1E scope:local data:string_table @stringBase0 = .rodata:0x8037AD10; // type:object size:0x13F scope:local data:string_table @stringBase0 = .rodata:0x8037AE50; // type:object size:0x17 scope:local data:string_table @@ -18628,7 +18628,7 @@ __vt__15RPSysOfficialDB = .data:0x803B9E58; // type:object size:0xC __vt__23RPSysKokeshiCtrlDataMgr = .data:0x803B9E68; // type:object size:0xC __vt__19RPSysKokeshiCtrlMgr = .data:0x803B9E78; // type:object size:0xC __vt__Q219RPSysKokeshiCtrlMgr11T__Disposer = .data:0x803B9E84; // type:object size:0xC scope:weak -lbl_803B9E90 = .data:0x803B9E90; // type:object size:0x10 +__vt__18RPSysAppMiiManager = .data:0x803B9E90; // type:object size:0x10 lbl_803B9EA0 = .data:0x803B9EA0; // type:object size:0x10 @19267 = .data:0x803B9EB0; // type:object size:0x9C scope:local __vt__17RPSysNWC24Manager = .data:0x803B9F4C; // type:object size:0xC @@ -18711,7 +18711,7 @@ lbl_803BAA08 = .data:0x803BAA08; // type:object size:0x16 data:string @STRING@setCameraCount__Q23EGG19TAudioSound3DMgr<4>Fl = .data:0x803BAA50; // type:object size:0x10 data:string __vt__15RPSndSpeakerMgr = .data:0x803BAA60; // type:object size:0xC __vt__14RPSndMoveParam = .data:0x803BAA70; // type:object size:0x18 -lbl_803BAA88 = .data:0x803BAA88; // type:object size:0x10 +__vt__17RPSndMoveValueF32 = .data:0x803BAA88; // type:object size:0xC __vt__19RPSndHomeMenuArcMgr = .data:0x803BAA98; // type:object size:0x78 sStaticSoundArchive__14RPSndStaticMgr = .data:0x803BAB20; // type:object size:0x6BA0 align:32 noreloc __vt__14RPSndStaticMgr = .data:0x803C16C0; // type:object size:0x5C @@ -19875,8 +19875,9 @@ lbl_804A4608 = .bss:0x804A4608; // type:object size:0x30 align:4 data:float lbl_804A4638 = .bss:0x804A4638; // type:object size:0x28 data:byte smCommon3DManager__Q23EGG32AudioSoundActorBaseWithCamera<4> = .bss:0x804A4660; // type:object size:0x10 data:4byte sActorList__19RPSndAudioActorBase = .bss:0x804A4670; // type:object size:0xC -sMoveParamList__17RPSndMoveParamMgr = .bss:0x804A4680; // type:object size:0x10 +sMoveParamList__17RPSndMoveParamMgr = .bss:0x804A4680; // type:object size:0xC VEC3_ZERO__12RPUtlDohMath = .bss:0x804A4690; // type:object size:0xC align:4 data:float +...bss.0 = .bss:0x804A4690; // type:label scope:local AXIS_XP__12RPUtlDohMath = .bss:0x804A469C; // type:object size:0xC align:4 data:float AXIS_XN__12RPUtlDohMath = .bss:0x804A46A8; // type:object size:0xC align:4 data:float AXIS_YP__12RPUtlDohMath = .bss:0x804A46B4; // type:object size:0xC align:4 data:float @@ -21412,7 +21413,7 @@ sConnectCallback__Q23EGG17CoreControllerMgr = .sbss:0x804BECF0; // type:object s sAllocator__Q23EGG27@unnamed@eggController_cpp@ = .sbss:0x804BECF4; // type:object size:0x4 scope:global data:4byte sIsInitialized__Q23EGG7DvdFile = .sbss:0x804BECF8; // type:object size:0x1 scope:global data:byte sIsArchiveListInitialized__Q23EGG7Archive = .sbss:0x804BED00; // type:object size:0x1 scope:global data:byte -sWorkArea__Q23EGG6Decomp = .sbss:0x804BED08; // type:object size:0x8 scope:global data:4byte +sWorkArea__Q23EGG6Decomp = .sbss:0x804BED08; // type:object size:0x4 scope:global data:4byte sStreamBit__Q23EGG6Decomp = .sbss:0x804BED10; // type:object size:0x8 data:4byte sNextNodeID__Q23EGG6Decomp = .sbss:0x804BED18; // type:object size:0x8 data:4byte sStreamByte__Q23EGG6Decomp = .sbss:0x804BED20; // type:object size:0x8 data:4byte @@ -21881,7 +21882,7 @@ spActiveController__19RPSysCoreController = .sbss:0x804BF574; // type:object siz sActiveAddress__19RPSysCoreController = .sbss:0x804BF578; // type:object size:0x6 data:byte sDisconnectOccurred__19RPSysCoreController = .sbss:0x804BF57E; // type:object size:0x1 data:byte sAddrWork__16RPSysCoreAddress = .sbss:0x804BF580; // type:object size:0x6 data:byte -lbl_804BF588 = .sbss:0x804BF588; // type:object size:0x8 align:4 data:4byte +lbl_804BF588__18RPSysLytDynamicAnm = .sbss:0x804BF588; // type:object size:0x4 align:4 data:4byte OUT_OF_SCREEN_POS__18RPSysCursorDrawMgr = .sbss:0x804BF590; // type:object size:0x8 align:4 data:float spInstance__18RPSysCursorDrawMgr = .sbss:0x804BF598; // type:object size:0x4 data:4byte lbl_804BF5A0 = .sbss:0x804BF5A0; // type:object size:0x8 data:4byte @@ -23563,15 +23564,15 @@ lbl_804C1740 = .sdata2:0x804C1740; // type:object size:0x4 align:4 data:float lbl_804C1744 = .sdata2:0x804C1744; // type:object size:0x4 align:4 data:float lbl_804C1748 = .sdata2:0x804C1748; // type:object size:0x4 align:4 data:float lbl_804C174C = .sdata2:0x804C174C; // type:object size:0x4 align:4 data:float -lbl_804C1750 = .sdata2:0x804C1750; // type:object size:0x8 data:string -lbl_804C1758 = .sdata2:0x804C1758; // type:object size:0x4 align:4 data:float -lbl_804C175C = .sdata2:0x804C175C; // type:object size:0x4 align:4 data:float -lbl_804C1760 = .sdata2:0x804C1760; // type:object size:0x4 align:4 data:float -lbl_804C1764 = .sdata2:0x804C1764; // type:object size:0x4 align:4 data:float -lbl_804C1768 = .sdata2:0x804C1768; // type:object size:0x4 align:4 data:float +lbl_804C1750__18RPSysLytDynamicAnm = .sdata2:0x804C1750; // type:object size:0x8 data:string +@26912 = .sdata2:0x804C1758; // type:object size:0x4 scope:local align:4 data:float +@26913 = .sdata2:0x804C175C; // type:object size:0x4 scope:local align:4 data:float +@26914 = .sdata2:0x804C1760; // type:object size:0x4 scope:local align:4 data:float +@26915 = .sdata2:0x804C1764; // type:object size:0x4 scope:local align:4 data:float +@26916 = .sdata2:0x804C1768; // type:object size:0x4 scope:local align:4 data:float gap_12_804C176C_sdata2 = .sdata2:0x804C176C; // type:object size:0x4 scope:global -lbl_804C1770 = .sdata2:0x804C1770; // type:object size:0x8 align:8 data:double -lbl_804C1778 = .sdata2:0x804C1778; // type:object size:0x8 align:8 data:double +@26920 = .sdata2:0x804C1770; // type:object size:0x8 scope:local align:8 data:double +@26921 = .sdata2:0x804C1778; // type:object size:0x8 scope:local align:8 data:double lbl_804C1780 = .sdata2:0x804C1780; // type:object size:0x4 align:4 data:float lbl_804C1784 = .sdata2:0x804C1784; // type:object size:0x4 align:4 data:float lbl_804C1788 = .sdata2:0x804C1788; // type:object size:0x4 align:4 data:float @@ -23702,15 +23703,15 @@ lbl_804C1960 = .sdata2:0x804C1960; // type:object size:0x8 align:8 data:double @10670 = .sdata2:0x804C1974; // type:object size:0x4 scope:local align:4 data:float @10671 = .sdata2:0x804C1978; // type:object size:0x4 scope:local align:4 data:float @10672 = .sdata2:0x804C197C; // type:object size:0x4 scope:local align:4 data:float -lbl_804C1980 = .sdata2:0x804C1980; // type:object size:0x8 align:8 data:double -lbl_804C1988 = .sdata2:0x804C1988; // type:object size:0x8 align:4 data:float +@11032 = .sdata2:0x804C1980; // type:object size:0x8 scope:local align:8 data:double +@11125 = .sdata2:0x804C1988; // type:object size:0x4 scope:local align:4 data:float @10717 = .sdata2:0x804C1990; // type:object size:0x4 scope:local align:4 data:float gap_12_804C1994_sdata2 = .sdata2:0x804C1994; // type:object size:0x4 scope:global @10720 = .sdata2:0x804C1998; // type:object size:0x8 scope:local align:8 data:double FLOAT_EPSILON__12RPUtlDohMath = .sdata2:0x804C19A0; // type:object size:0x4 align:4 data:float -lbl_804C19A4 = .sdata2:0x804C19A4; // type:object size:0x4 align:4 data:float -lbl_804C19A8 = .sdata2:0x804C19A8; // type:object size:0x4 align:4 data:float -lbl_804C19AC = .sdata2:0x804C19AC; // type:object size:0x4 align:4 data:float +@26867 = .sdata2:0x804C19A4; // type:object size:0x4 scope:local align:4 data:float +@26868 = .sdata2:0x804C19A8; // type:object size:0x4 scope:local align:4 data:float +@27056 = .sdata2:0x804C19AC; // type:object size:0x4 scope:local align:4 data:float lbl_804C19B0 = .sdata2:0x804C19B0; // type:object size:0x4 align:4 data:float lbl_804C19B4 = .sdata2:0x804C19B4; // type:object size:0x4 align:4 data:float lbl_804C19B8 = .sdata2:0x804C19B8; // type:object size:0x4 align:4 data:float From c7a511a25eed51a84e19acf5eee24102f311711c Mon Sep 17 00:00:00 2001 From: kiwi515 <49212064+kiwi515@users.noreply.github.com> Date: Mon, 7 Sep 2026 12:33:26 -0400 Subject: [PATCH 3/7] Update RPSysCursorDrawMgr.h --- include/Pack/RPKernel/RPSysCursorDrawMgr.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/Pack/RPKernel/RPSysCursorDrawMgr.h b/include/Pack/RPKernel/RPSysCursorDrawMgr.h index 29da4109b..49d64164e 100644 --- a/include/Pack/RPKernel/RPSysCursorDrawMgr.h +++ b/include/Pack/RPKernel/RPSysCursorDrawMgr.h @@ -18,7 +18,7 @@ class RPSysEffect; /** * @brief Cursor draw manager */ -class RPSysCursorDrawMgr : IRPSysHostIOSocket { +class RPSysCursorDrawMgr : public IRPSysHostIOSocket { RP_SINGLETON_DECL_EX(RPSysCursorDrawMgr); public: From 92cac6c52f6e3a8fcca43c30bbbd54f1fbfa105c Mon Sep 17 00:00:00 2001 From: kiwi515 <49212064+kiwi515@users.noreply.github.com> Date: Mon, 7 Sep 2026 12:33:41 -0400 Subject: [PATCH 4/7] Delete decompctx_stubs.h --- include/revolution/BTE/decompctx_stubs.h | 32 ------------------------ 1 file changed, 32 deletions(-) delete mode 100644 include/revolution/BTE/decompctx_stubs.h diff --git a/include/revolution/BTE/decompctx_stubs.h b/include/revolution/BTE/decompctx_stubs.h deleted file mode 100644 index ae527f18c..000000000 --- a/include/revolution/BTE/decompctx_stubs.h +++ /dev/null @@ -1,32 +0,0 @@ -#ifndef RVL_SDK_BTE_DECOMP_STUBS_H -#define RVL_SDK_BTE_DECOMP_STUBS_H -#include - -#ifdef __cplusplus -extern "C" { -#endif - -#if defined(DECOMPCTX) - -typedef u8 UINT8; -typedef u16 UINT16; -typedef u32 UINT32; - -#define BD_ADDR_LEN 6 -typedef UINT8 BD_ADDR[BD_ADDR_LEN]; -typedef BD_ADDR* BD_ADDR_PTR; - -#define LINK_KEY_LEN 16 -typedef UINT8 LINK_KEY[LINK_KEY_LEN]; - -typedef UINT16 tBTA_HH_ATTR_MASK; -typedef UINT16 tBTA_HH_EVT; -typedef void tBTA_HH; -typedef UINT32 tBTA_SERVICE_MASK; - -#endif - -#ifdef __cplusplus -} -#endif -#endif From a3f50244e313249e22718935726abb313354ec50 Mon Sep 17 00:00:00 2001 From: kiwi515 <49212064+kiwi515@users.noreply.github.com> Date: Mon, 7 Sep 2026 12:38:18 -0400 Subject: [PATCH 5/7] oops --- configure.py | 43 ++++++++++-------------- include/Pack/RPGraphics/RPGrpCamera.h | 4 +-- include/Pack/RPGraphics/RPGrpModelRfl.h | 6 ++-- include/Pack/RPSystem/RPSysSaveDataMgr.h | 6 ++-- src/Pack/RPGraphics/RPGrpCamera.cpp | 4 +-- src/Pack/RPGraphics/RPGrpModelRfl.cpp | 14 ++++---- 6 files changed, 34 insertions(+), 43 deletions(-) diff --git a/configure.py b/configure.py index 7dd1db1a6..40db118c9 100755 --- a/configure.py +++ b/configure.py @@ -406,12 +406,13 @@ def find_directories(root_path: str, recursive: bool) -> list[str]: "-i include/homeButtonMiniLib", ] -# Common RP flags -cflags_rp_base = [ +# RP flags +cflags_rp = [ *cflags_base, *cflags_pedantic, "-DPACK_SPORTS", "-enc SJIS", + "-inline deferred", "-fp_contract on", "-use_lmw_stmw on", "-str reuse,pool,readonly", @@ -420,17 +421,9 @@ def find_directories(root_path: str, recursive: bool) -> list[str]: "-i include/Pack", ] -# RP flags -cflags_rp = [ - *cflags_rp_base, - "-inline deferred", - "-prefix SportsPack.mch", -] - -# RP flags (no inline deferred) -cflags_rp_no_deferred = [ - *cflags_rp_base, - "-inline auto", +# RP flags (include precompiled header) +cflags_rp_pch = [ + *cflags_rp, "-prefix SportsPack.mch", ] @@ -453,7 +446,7 @@ def MatchingFor(*versions): { "source": "SportsPack.pch", "mw_version": config.linker_version, - "cflags": ["-lang=c++", *cflags_rp_base], + "cflags": ["-lang=c++", *cflags_rp], }, ] config.libs = [ @@ -1164,7 +1157,7 @@ def MatchingFor(*versions): { "lib": "RP", "mw_version": config.linker_version, - "cflags": cflags_rp, + "cflags": cflags_rp_pch, "progress_category": "kernel", # str | List[str] "objects": [ Object(Matching, "main.cpp"), @@ -1222,7 +1215,7 @@ def MatchingFor(*versions): { "lib": "RP", "mw_version": config.linker_version, - "cflags": cflags_rp, + "cflags": cflags_rp_pch, "progress_category": "system", # str | List[str] "objects": [ Object(NonMatching, "Pack/RPSystem/RPSysSceneCreator.cpp"), @@ -1253,7 +1246,7 @@ def MatchingFor(*versions): { "lib": "RP", "mw_version": config.linker_version, - "cflags": cflags_rp, + "cflags": cflags_rp_pch, "progress_category": "graphics", # str | List[str] "objects": [ Object(Matching, "Pack/RPGraphics/RPGrpCamera.cpp"), @@ -1288,7 +1281,7 @@ def MatchingFor(*versions): { "lib": "RP", "mw_version": config.linker_version, - "cflags": cflags_rp, + "cflags": cflags_rp_pch, "progress_category": "audio", # str | List[str] "objects": [ Object(NonMatching, "Pack/RPAudio/RPSndAudioMgr.cpp"), @@ -1303,7 +1296,7 @@ def MatchingFor(*versions): { "lib": "RP", "mw_version": config.linker_version, - "cflags": cflags_rp, + "cflags": cflags_rp_pch, "progress_category": "utility", # str | List[str] "objects": [ Object(Matching, "Pack/RPUtility/RPUtlDohMath.cpp"), @@ -1329,7 +1322,7 @@ def MatchingFor(*versions): { "lib": "RP", "mw_version": config.linker_version, - "cflags": cflags_rp, + "cflags": cflags_rp_pch, "progress_category": "sports", # str | List[str] "objects": [ Object(NonMatching, "Pack/RPSports/RPSportsCommon/RPSportsCommon_unsplit.o"), @@ -1338,7 +1331,7 @@ def MatchingFor(*versions): { "lib": "RP", "mw_version": config.linker_version, - "cflags": cflags_rp, + "cflags": cflags_rp_pch, "progress_category": "tennis", # str | List[str] "objects": [ Object(NonMatching, "Pack/RPSports/RPTnsScene/RPTnsScene_unsplit.o"), @@ -1347,7 +1340,7 @@ def MatchingFor(*versions): { "lib": "RP", "mw_version": config.linker_version, - "cflags": cflags_rp, + "cflags": cflags_rp_pch, "progress_category": "baseball", # str | List[str] "objects": [ Object(NonMatching, "Pack/RPSports/RPBsbScene/RPBsbScene_unsplit.o"), @@ -1356,7 +1349,7 @@ def MatchingFor(*versions): { "lib": "RP", "mw_version": config.linker_version, - "cflags": cflags_rp, + "cflags": cflags_rp_pch, "progress_category": "golf", # str | List[str] "objects": [ Object(NonMatching, "Pack/RPSports/RPGolScene/RPGolScene.cpp"), @@ -1389,7 +1382,7 @@ def MatchingFor(*versions): { "lib": "RP", "mw_version": config.linker_version, - "cflags": cflags_rp, + "cflags": cflags_rp_pch, "progress_category": "boxing", # str | List[str] "objects": [ Object(NonMatching, "Pack/RPSports/RPBoxScene/RPBoxScene_unsplit.o"), @@ -1398,7 +1391,7 @@ def MatchingFor(*versions): { "lib": "RP", "mw_version": config.linker_version, - "cflags": cflags_rp, + "cflags": cflags_rp_pch, "progress_category": "bowling", # str | List[str] "objects": [ Object(NonMatching, "Pack/RPSports/RPBowScene/RPBow_80313028.cpp"), diff --git a/include/Pack/RPGraphics/RPGrpCamera.h b/include/Pack/RPGraphics/RPGrpCamera.h index 2278a49d9..27f6d845b 100644 --- a/include/Pack/RPGraphics/RPGrpCamera.h +++ b/include/Pack/RPGraphics/RPGrpCamera.h @@ -230,8 +230,8 @@ class RPGrpCamera { * @brief Camera state flags */ enum { - EFlag_Player2CursorValid = 1 << 5, - EFlag_Player4CursorValid = 1 << 7, + EFlag_5 = 1 << 5, + EFlag_7 = 1 << 7, }; private: diff --git a/include/Pack/RPGraphics/RPGrpModelRfl.h b/include/Pack/RPGraphics/RPGrpModelRfl.h index 04ed3354d..cc15f6746 100644 --- a/include/Pack/RPGraphics/RPGrpModelRfl.h +++ b/include/Pack/RPGraphics/RPGrpModelRfl.h @@ -160,9 +160,9 @@ class RPGrpModelRfl : public RPGrpModel, public nw4r::g3d::IScnObjCallback { private: enum { EFlag_ReverseCulling = 1 << 4, - EFlag_Player2CursorValid = 1 << 5, - EFlag_Player3CursorValid = 1 << 6, - EFlag_Player4CursorValid = 1 << 7, + EFlag_5 = 1 << 5, + EFlag_6 = 1 << 6, + EFlag_7 = 1 << 7, EFlag_8 = 1 << 8, }; diff --git a/include/Pack/RPSystem/RPSysSaveDataMgr.h b/include/Pack/RPSystem/RPSysSaveDataMgr.h index ab737a901..7237105a1 100644 --- a/include/Pack/RPSystem/RPSysSaveDataMgr.h +++ b/include/Pack/RPSystem/RPSysSaveDataMgr.h @@ -263,9 +263,9 @@ class RPSysSaveDataMgr : public IRPSysHostIOSocket { EFlag_SaveFileExist, //!< The save file exists on the NAND EFlag_3, EFlag_DisableSave, //!< Saving is disabled - EFlag_Player2CursorValid, - EFlag_Player3CursorValid, - EFlag_Player4CursorValid, + EFlag_5, + EFlag_6, + EFlag_7, EFlag_NandAccess, //!< NAND operation is happening on another thread EFlag_AsyncSave, //!< Save file is being written on another thread EFlag_ErrorWindow, //!< System window error was displayed diff --git a/src/Pack/RPGraphics/RPGrpCamera.cpp b/src/Pack/RPGraphics/RPGrpCamera.cpp index 98a23f343..6395fc384 100644 --- a/src/Pack/RPGraphics/RPGrpCamera.cpp +++ b/src/Pack/RPGraphics/RPGrpCamera.cpp @@ -74,7 +74,7 @@ void RPGrpCamera::Identity() { mUp.y = 1.0f; CalcMatrix(); - mFlags &= ~EFlag_Player2CursorValid; + mFlags &= ~EFlag_5; } /** @@ -150,7 +150,7 @@ void RPGrpCamera::CalcMatrix() { mForward.y = mWorldMtx._12; mForward.z = mWorldMtx._22; - mFlags &= ~EFlag_Player4CursorValid; + mFlags &= ~EFlag_7; } /** diff --git a/src/Pack/RPGraphics/RPGrpModelRfl.cpp b/src/Pack/RPGraphics/RPGrpModelRfl.cpp index ac82288f5..7111faac3 100644 --- a/src/Pack/RPGraphics/RPGrpModelRfl.cpp +++ b/src/Pack/RPGraphics/RPGrpModelRfl.cpp @@ -53,8 +53,7 @@ RPGrpModelRfl* RPGrpModelRfl::Construct(RFLDataSource src, u16 index, RPGrpModelRfl::RPGrpModelRfl(RFLResolution resolution, u32 exprFlags, u8 viewNo) : RPGrpModel(viewNo), - mFlagsRfl(EFlag_Player2CursorValid | EFlag_Player3CursorValid | - EFlag_Player4CursorValid), + mFlagsRfl(EFlag_5 | EFlag_6 | EFlag_7), mOutputAlpha(128), mMaterialType(MaterialType_0), mpRflParent(NULL), @@ -222,7 +221,7 @@ void RPGrpModelRfl::DrawGX(const RFLCharModel* pModel, u32 diffMask, diffMaskSub = diffMask; - if (!(mFlagsRfl & EFlag_Player2CursorValid)) { + if (!(mFlagsRfl & EFlag_5)) { diffMaskSub = 0; ambColor.a = 255; } @@ -233,11 +232,10 @@ void RPGrpModelRfl::DrawGX(const RFLCharModel* pModel, u32 diffMask, GXSetChanCtrl(GX_COLOR0, GX_TRUE, GX_SRC_REG, GX_SRC_REG, GX_LIGHT_NULL, GX_DF_CLAMP, GX_AF_SPOT); - GXSetChanCtrl( - GX_ALPHA0, - (mFlagsRfl & EFlag_Player2CursorValid) ? GX_TRUE : GX_FALSE, - GX_SRC_REG, GX_SRC_REG, static_cast(diffMaskSub), - GX_DF_CLAMP, GX_AF_SPOT); + GXSetChanCtrl(GX_ALPHA0, (mFlagsRfl & EFlag_5) ? GX_TRUE : GX_FALSE, + GX_SRC_REG, GX_SRC_REG, + static_cast(diffMaskSub), GX_DF_CLAMP, + GX_AF_SPOT); GXSetChanCtrl(GX_COLOR1A1, GX_FALSE, GX_SRC_REG, GX_SRC_REG, GX_LIGHT_NULL, GX_DF_NONE, GX_AF_NONE); From 72a52d7561f9b08d11d2c6a32a37d42f2527fdd7 Mon Sep 17 00:00:00 2001 From: kiwi515 <49212064+kiwi515@users.noreply.github.com> Date: Mon, 7 Sep 2026 12:39:22 -0400 Subject: [PATCH 6/7] Update eggMath.h --- include/egg/math/eggMath.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/egg/math/eggMath.h b/include/egg/math/eggMath.h index 7714e1605..7aeacf9f5 100644 --- a/include/egg/math/eggMath.h +++ b/include/egg/math/eggMath.h @@ -50,6 +50,7 @@ template class Math { static T max(T t1, T t2) { return t1 > t2 ? t1 : t2; } + static T clamp2(T t, T min, T max) { if (t < min) { return min; @@ -60,7 +61,6 @@ template class Math { } return t; - // return t < min ? min : (t > max ? max : t); } }; From df82238ea4853dc2eef4a89d71cecd4bd0b9e9ab Mon Sep 17 00:00:00 2001 From: kiwi515 <49212064+kiwi515@users.noreply.github.com> Date: Mon, 7 Sep 2026 12:40:03 -0400 Subject: [PATCH 7/7] docs --- include/Pack/RPKernel/RPSysController.h | 4 ++-- src/Pack/RPKernel/RPSysController.cpp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/include/Pack/RPKernel/RPSysController.h b/include/Pack/RPKernel/RPSysController.h index ddde96a4b..4dffe70f8 100644 --- a/include/Pack/RPKernel/RPSysController.h +++ b/include/Pack/RPKernel/RPSysController.h @@ -592,9 +592,9 @@ class RPSysCoreController : public EGG::CoreController, //! Next player index static s16 sNextPlayerNo; - //! Player 1's controller + //! Active (main player) controller static RPSysCoreController* spActiveController; - //! Player 1's controller address + //! Active (main player) controller address static RPSysCoreAddress sActiveAddress; //! Whether a controller has disconnected in this scene diff --git a/src/Pack/RPKernel/RPSysController.cpp b/src/Pack/RPKernel/RPSysController.cpp index 30cee08a4..844b48f20 100644 --- a/src/Pack/RPKernel/RPSysController.cpp +++ b/src/Pack/RPKernel/RPSysController.cpp @@ -44,12 +44,12 @@ const f32 RPSysCoreController::DEFAULT_EX_RATE[EExStatus_Max] = { s16 RPSysCoreController::sNextPlayerNo = 0; /** - * @brief Player 1's controller + * @brief Active (main player) controller */ RPSysCoreController* RPSysCoreController::spActiveController = NULL; /** - * @brief Player 1's controller address + * @brief Active (main player) controller address */ RPSysCoreAddress RPSysCoreController::sActiveAddress;