From 1273e633f2389c13b77e439339ad1c7ecb923d95 Mon Sep 17 00:00:00 2001 From: Max Roncace Date: Fri, 13 Feb 2026 18:15:42 -0500 Subject: [PATCH] m_Re_controller_pad mostly matching (#3099) * Move m_Re_controller_pad to m_Re/ * m_Re_controller_pad mostly matching --- config/DZDE01/splits.txt | 6 +- config/DZDE01/symbols.txt | 2 +- config/RZDE01_00/splits.txt | 6 +- config/RZDE01_00/symbols.txt | 2 +- config/RZDE01_02/splits.txt | 6 +- config/RZDE01_02/symbols.txt | 2 +- config/RZDJ01/splits.txt | 6 +- config/RZDJ01/symbols.txt | 2 +- config/RZDP01/splits.txt | 6 +- config/RZDP01/symbols.txt | 2 +- config/Shield/symbols.txt | 2 +- configure.py | 2 +- include/d/d_cursor_mng.h | 2 +- include/{m_Do => m_Re}/m_Re_controller_pad.h | 88 +- include/revolution/kpad.h | 11 + .../SComponent/c_API_controller_pad.cpp | 4 +- src/d/d_home_button.cpp | 2 +- src/m_Do/m_Re_controller_pad.cpp | 350 ---- src/m_Re/m_Re_controller_pad.cpp | 1800 +++++++++++++++++ 19 files changed, 1886 insertions(+), 415 deletions(-) rename include/{m_Do => m_Re}/m_Re_controller_pad.h (72%) delete mode 100644 src/m_Do/m_Re_controller_pad.cpp create mode 100644 src/m_Re/m_Re_controller_pad.cpp diff --git a/config/DZDE01/splits.txt b/config/DZDE01/splits.txt index 998705545d8..c918f83e8c4 100644 --- a/config/DZDE01/splits.txt +++ b/config/DZDE01/splits.txt @@ -52,19 +52,19 @@ m_Do/m_Do_audio.cpp: .data start:0x803BD770 end:0x803BD9E8 .bss start:0x8040C0E0 end:0x8040D498 .sdata start:0x804F78B8 end:0x804F7924 - .sbss start:0x804FA92C end:0x804FA97C + .sbss start:0x804FA92C end:0x804FA978 m_Do/m_Do_controller_pad.cpp: .text start:0x8000B698 end:0x8000BAA8 .bss start:0x8040D498 end:0x8040D5A8 .sdata2 start:0x804FBB90 end:0x804FBBA8 -m_Do/m_Re_controller_pad.cpp: +m_Re/m_Re_controller_pad.cpp: .text start:0x8000BAA8 end:0x8000F56C .rodata start:0x803962C0 end:0x80396310 .data start:0x803BD9E8 end:0x803BDA00 .bss start:0x8040D5A8 end:0x80414E58 - .sbss start:0x804FA97C end:0x804FA988 + .sbss start:0x804FA978 end:0x804FA988 .sdata2 start:0x804FBBA8 end:0x804FBC50 m_Do/m_Do_graphic.cpp: diff --git a/config/DZDE01/symbols.txt b/config/DZDE01/symbols.txt index 1e1d37818a9..75f5dbb6534 100644 --- a/config/DZDE01/symbols.txt +++ b/config/DZDE01/symbols.txt @@ -26912,7 +26912,7 @@ sInstance__33JASGlobalInstance<12JAUSoundInfo> = .sbss:0x804FA964; // type:objec sInstance__32JASGlobalInstance<11Z2SoundInfo> = .sbss:0x804FA968; // type:object size:0x4 scope:global align:4 data:4byte sInstance__34JASGlobalInstance<13Z2SoundObjMgr> = .sbss:0x804FA96C; // type:object size:0x4 scope:global align:4 data:4byte sInstance__32JASGlobalInstance<11Z2FxLineMgr> = .sbss:0x804FA970; // type:object size:0x4 scope:global align:4 data:4byte -lbl_804FA978 = .sbss:0x804FA978; // type:object size:0x1 data:byte +l_reset_requested = .sbss:0x804FA978; // type:object size:0x1 data:byte m_cal_value__6mReCPd = .sbss:0x804FA97C; // type:object size:0x4 scope:global align:4 data:4byte wpad_heap = .sbss:0x804FA980; // type:object size:0x4 scope:global align:4 data:4byte mFader__13mDoGph_gInf_c = .sbss:0x804FA988; // type:object size:0x4 scope:global align:4 data:4byte diff --git a/config/RZDE01_00/splits.txt b/config/RZDE01_00/splits.txt index b7e09572c20..1c98da5554a 100644 --- a/config/RZDE01_00/splits.txt +++ b/config/RZDE01_00/splits.txt @@ -46,19 +46,19 @@ m_Do/m_Do_audio.cpp: .data start:0x803F5BE0 end:0x803F5E58 .bss start:0x8044A6A0 end:0x8044BA50 .sdata start:0x805375C0 end:0x8053762C - .sbss start:0x8053A780 end:0x8053A7D4 + .sbss start:0x8053A780 end:0x8053A7D0 m_Do/m_Do_controller_pad.cpp: .text start:0x80009F54 end:0x8000A364 .bss start:0x8044BA50 end:0x8044BB60 .sdata2 start:0x8053BA28 end:0x8053BA40 -m_Do/m_Re_controller_pad.cpp: +m_Re/m_Re_controller_pad.cpp: .text start:0x8000A364 end:0x8000DD80 .rodata start:0x803CE400 end:0x803CE450 .data start:0x803F5E58 end:0x803F5E70 .bss start:0x8044BB60 end:0x80453410 - .sbss start:0x8053A7D4 end:0x8053A7E0 + .sbss start:0x8053A7D0 end:0x8053A7E0 .sdata2 start:0x8053BA40 end:0x8053BAE8 m_Do/m_Do_graphic.cpp: diff --git a/config/RZDE01_00/symbols.txt b/config/RZDE01_00/symbols.txt index dedd6b1d157..f9f411aaa7a 100644 --- a/config/RZDE01_00/symbols.txt +++ b/config/RZDE01_00/symbols.txt @@ -28080,7 +28080,7 @@ sInstance__33JASGlobalInstance<12JAUSoundInfo> = .sbss:0x8053A7BC; // type:objec sInstance__32JASGlobalInstance<11Z2SoundInfo> = .sbss:0x8053A7C0; // type:object size:0x4 scope:global align:4 data:4byte sInstance__34JASGlobalInstance<13Z2SoundObjMgr> = .sbss:0x8053A7C4; // type:object size:0x4 scope:global align:4 data:4byte sInstance__32JASGlobalInstance<11Z2FxLineMgr> = .sbss:0x8053A7C8; // type:object size:0x4 scope:global align:4 data:4byte -lbl_8053A7D0 = .sbss:0x8053A7D0; // type:object size:0x1 data:byte +l_reset_requested = .sbss:0x8053A7D0; // type:object size:0x1 data:byte m_cal_value__6mReCPd = .sbss:0x8053A7D4; // type:object size:0x4 scope:global align:4 data:4byte wpad_heap = .sbss:0x8053A7D8; // type:object size:0x4 scope:global align:4 data:4byte mFader__13mDoGph_gInf_c = .sbss:0x8053A7E0; // type:object size:0x4 scope:global align:4 data:4byte diff --git a/config/RZDE01_02/splits.txt b/config/RZDE01_02/splits.txt index 2b9ad69111d..f9e7288cc10 100644 --- a/config/RZDE01_02/splits.txt +++ b/config/RZDE01_02/splits.txt @@ -47,19 +47,19 @@ m_Do/m_Do_audio.cpp: .data start:0x803E0E70 end:0x803E10E8 .bss start:0x80431CA0 end:0x80433058 .sdata start:0x8051D660 end:0x8051D6CC - .sbss start:0x80520780 end:0x805207D4 + .sbss start:0x80520780 end:0x805207D0 m_Do/m_Do_controller_pad.cpp: .text start:0x8000A0E0 end:0x8000A4F0 .bss start:0x80433058 end:0x80433168 .sdata2 start:0x80521A28 end:0x80521A40 -m_Do/m_Re_controller_pad.cpp: +m_Re/m_Re_controller_pad.cpp: .text start:0x8000A4F0 end:0x8000DF0C .rodata start:0x803B8E40 end:0x803B8E90 .data start:0x803E10E8 end:0x803E1100 .bss start:0x80433168 end:0x8043AA18 - .sbss start:0x805207D4 end:0x805207E0 + .sbss start:0x805207D0 end:0x805207E0 .sdata2 start:0x80521A40 end:0x80521AE8 m_Do/m_Do_graphic.cpp: diff --git a/config/RZDE01_02/symbols.txt b/config/RZDE01_02/symbols.txt index b12bf52937d..9a773a3912c 100644 --- a/config/RZDE01_02/symbols.txt +++ b/config/RZDE01_02/symbols.txt @@ -27604,7 +27604,7 @@ sInstance__33JASGlobalInstance<12JAUSoundInfo> = .sbss:0x805207BC; // type:objec sInstance__32JASGlobalInstance<11Z2SoundInfo> = .sbss:0x805207C0; // type:object size:0x4 scope:global align:4 data:4byte sInstance__34JASGlobalInstance<13Z2SoundObjMgr> = .sbss:0x805207C4; // type:object size:0x4 scope:global align:4 data:4byte sInstance__32JASGlobalInstance<11Z2FxLineMgr> = .sbss:0x805207C8; // type:object size:0x4 scope:global align:4 data:4byte -lbl_805207D0 = .sbss:0x805207D0; // type:object size:0x1 data:byte +l_reset_requested = .sbss:0x805207D0; // type:object size:0x1 data:byte m_cal_value__6mReCPd = .sbss:0x805207D4; // type:object size:0x4 scope:global align:4 data:4byte wpad_heap = .sbss:0x805207D8; // type:object size:0x4 scope:global align:4 data:4byte mFader__13mDoGph_gInf_c = .sbss:0x805207E0; // type:object size:0x4 scope:global align:4 data:4byte diff --git a/config/RZDJ01/splits.txt b/config/RZDJ01/splits.txt index a8fefcda669..79e43651524 100644 --- a/config/RZDJ01/splits.txt +++ b/config/RZDJ01/splits.txt @@ -47,19 +47,19 @@ m_Do/m_Do_audio.cpp: .data start:0x803DEE30 end:0x803DF0A8 .bss start:0x8042FB20 end:0x80430ED8 .sdata start:0x8051B4E0 end:0x8051B54C - .sbss start:0x8051E600 end:0x8051E654 + .sbss start:0x8051E600 end:0x8051E650 m_Do/m_Do_controller_pad.cpp: .text start:0x8000A0E0 end:0x8000A4F0 .bss start:0x80430ED8 end:0x80430FE8 .sdata2 start:0x8051F8A8 end:0x8051F8C0 -m_Do/m_Re_controller_pad.cpp: +m_Re/m_Re_controller_pad.cpp: .text start:0x8000A4F0 end:0x8000DF0C .rodata start:0x803BA900 end:0x803BA950 .data start:0x803DF0A8 end:0x803DF0C0 .bss start:0x80430FE8 end:0x80438898 - .sbss start:0x8051E654 end:0x8051E660 + .sbss start:0x8051E650 end:0x8051E660 .sdata2 start:0x8051F8C0 end:0x8051F968 m_Do/m_Do_graphic.cpp: diff --git a/config/RZDJ01/symbols.txt b/config/RZDJ01/symbols.txt index 0a05fcbb32d..6d0baef42ab 100644 --- a/config/RZDJ01/symbols.txt +++ b/config/RZDJ01/symbols.txt @@ -27610,7 +27610,7 @@ sInstance__33JASGlobalInstance<12JAUSoundInfo> = .sbss:0x8051E63C; // type:objec sInstance__32JASGlobalInstance<11Z2SoundInfo> = .sbss:0x8051E640; // type:object size:0x4 scope:global align:4 data:4byte sInstance__34JASGlobalInstance<13Z2SoundObjMgr> = .sbss:0x8051E644; // type:object size:0x4 scope:global align:4 data:4byte sInstance__32JASGlobalInstance<11Z2FxLineMgr> = .sbss:0x8051E648; // type:object size:0x4 scope:global align:4 data:4byte -lbl_8051E650 = .sbss:0x8051E650; // type:object size:0x1 data:byte +l_reset_requested = .sbss:0x8051E650; // type:object size:0x1 data:byte m_cal_value__6mReCPd = .sbss:0x8051E654; // type:object size:0x4 scope:global align:4 data:4byte wpad_heap = .sbss:0x8051E658; // type:object size:0x4 scope:global align:4 data:4byte mFader__13mDoGph_gInf_c = .sbss:0x8051E660; // type:object size:0x4 scope:global align:4 data:4byte diff --git a/config/RZDP01/splits.txt b/config/RZDP01/splits.txt index 9af9f07411e..e03e55be0d5 100644 --- a/config/RZDP01/splits.txt +++ b/config/RZDP01/splits.txt @@ -47,19 +47,19 @@ m_Do/m_Do_audio.cpp: .data start:0x803E1B90 end:0x803E1E08 .bss start:0x804325A0 end:0x80433958 .sdata start:0x8051DF60 end:0x8051DFCC - .sbss start:0x80520F40 end:0x80520F94 + .sbss start:0x80520F40 end:0x80520F90 m_Do/m_Do_controller_pad.cpp: .text start:0x8000A0A8 end:0x8000A4B8 .bss start:0x80433958 end:0x80433A68 .sdata2 start:0x805221E8 end:0x80522200 -m_Do/m_Re_controller_pad.cpp: +m_Re/m_Re_controller_pad.cpp: .text start:0x8000A4B8 end:0x8000DED4 .rodata start:0x803B92C0 end:0x803B9310 .data start:0x803E1E08 end:0x803E1E20 .bss start:0x80433A68 end:0x8043B318 - .sbss start:0x80520F94 end:0x80520FA0 + .sbss start:0x80520F90 end:0x80520FA0 .sdata2 start:0x80522200 end:0x805222A8 m_Do/m_Do_graphic.cpp: diff --git a/config/RZDP01/symbols.txt b/config/RZDP01/symbols.txt index 8b3bd7f9b40..68208818705 100644 --- a/config/RZDP01/symbols.txt +++ b/config/RZDP01/symbols.txt @@ -27495,7 +27495,7 @@ sInstance__33JASGlobalInstance<12JAUSoundInfo> = .sbss:0x80520F7C; // type:objec sInstance__32JASGlobalInstance<11Z2SoundInfo> = .sbss:0x80520F80; // type:object size:0x4 scope:global align:4 data:4byte sInstance__34JASGlobalInstance<13Z2SoundObjMgr> = .sbss:0x80520F84; // type:object size:0x4 scope:global align:4 data:4byte sInstance__32JASGlobalInstance<11Z2FxLineMgr> = .sbss:0x80520F88; // type:object size:0x4 scope:global align:4 data:4byte -lbl_80520F90 = .sbss:0x80520F90; // type:object size:0x1 data:byte +l_reset_requested = .sbss:0x80520F90; // type:object size:0x1 data:byte m_cal_value__6mReCPd = .sbss:0x80520F94; // type:object size:0x4 scope:global align:4 data:4byte wpad_heap = .sbss:0x80520F98; // type:object size:0x4 scope:global align:4 data:4byte mFader__13mDoGph_gInf_c = .sbss:0x80520FA0; // type:object size:0x4 scope:global align:4 data:4byte diff --git a/config/Shield/symbols.txt b/config/Shield/symbols.txt index de8b291e49b..a37929175a1 100644 --- a/config/Shield/symbols.txt +++ b/config/Shield/symbols.txt @@ -25169,7 +25169,7 @@ sInstance__32JASGlobalInstance<11Z2StatusMgr> = .sbss:0x8050898C; // type:object sInstance__31JASGlobalInstance<10Z2SceneMgr> = .sbss:0x80508990; // type:object size:0x4 scope:global data:4byte hash:0x8511856A dhash:0xF96D5E29 sInstance__28JASGlobalInstance<8Z2SeqMgr> = .sbss:0x80508994; // type:object size:0x4 scope:global data:4byte hash:0x1FD34E42 dhash:0xF7849050 sInstance__27JASGlobalInstance<7Z2SeMgr> = .sbss:0x80508998; // type:object size:0x4 scope:global data:4byte hash:0xD70A6533 dhash:0x234E9A61 -lbl_805089A0 = .sbss:0x805089A0; // type:object size:0x1 data:byte hash:0x4F2572D1 dhash:0x542D9327 +l_reset_requested = .sbss:0x805089A0; // type:object size:0x1 data:byte hash:0x4F2572D1 dhash:0x542D9327 m_cal_value__6mReCPd = .sbss:0x805089A4; // type:object size:0x4 scope:global data:4byte hash:0x93E53EB6 dhash:0x3F3CB220 wpad_heap = .sbss:0x805089A8; // type:object size:0x4 scope:global data:4byte hash:0x864CEC84 mFader__13mDoGph_gInf_c = .sbss:0x805089B0; // type:object size:0x4 scope:global data:4byte hash:0x794A05E2 dhash:0xFC47A8C0 diff --git a/configure.py b/configure.py index d5f189d8043..9157f65441a 100755 --- a/configure.py +++ b/configure.py @@ -587,7 +587,7 @@ config.libs = [ Object(MatchingFor(ALL_GCN), "m_Do/m_Do_printf.cpp"), Object(MatchingFor(ALL_GCN), "m_Do/m_Do_audio.cpp"), Object(MatchingFor(ALL_GCN), "m_Do/m_Do_controller_pad.cpp"), - Object(NonMatching, "m_Do/m_Re_controller_pad.cpp"), + Object(NonMatching, "m_Re/m_Re_controller_pad.cpp"), Object(MatchingFor(ALL_GCN), "m_Do/m_Do_graphic.cpp"), Object(MatchingFor(ALL_GCN), "m_Do/m_Do_machine.cpp"), Object(MatchingFor(ALL_GCN), "m_Do/m_Do_mtx.cpp"), diff --git a/include/d/d_cursor_mng.h b/include/d/d_cursor_mng.h index 59fcbe0ba16..459d747ffa5 100644 --- a/include/d/d_cursor_mng.h +++ b/include/d/d_cursor_mng.h @@ -1,7 +1,7 @@ #ifndef D_CURSOR_MNG_H #define D_CURSOR_MNG_H -#include "m_Do/m_Re_controller_pad.h" +#include "m_Re/m_Re_controller_pad.h" // TODO: putting this here until a more appropriate place is found extern u8 data_8053a730; diff --git a/include/m_Do/m_Re_controller_pad.h b/include/m_Re/m_Re_controller_pad.h similarity index 72% rename from include/m_Do/m_Re_controller_pad.h rename to include/m_Re/m_Re_controller_pad.h index b7470a1b192..ac77462a918 100644 --- a/include/m_Do/m_Re_controller_pad.h +++ b/include/m_Re/m_Re_controller_pad.h @@ -4,6 +4,12 @@ #include #include +#if PLATFORM_SHIELD +#define RECPD_SAMPLING_BUF_COUNT 16 +#else +#define RECPD_SAMPLING_BUF_COUNT 10 +#endif + class mReCPd { public: struct Pad { @@ -22,17 +28,18 @@ public: /* 0xB50 */ u8 field_0xb50; /* 0xB51 */ u8 field_0xb51; /* 0xB54 */ f32 field_0xb54; - /* 0xB58 */ u8 field_0xB58[0xB68 - 0xB58]; + /* 0xB58 */ Vec field_0xb58; + /* 0xB64 */ u32 field_0xb64; /* 0xB68 */ Mtx field_0xb68; /* 0xB98 */ f32 field_0xb98; /* 0xB9C */ int field_0xb9c; /* 0xBA0 */ f32 field_0xba0; /* 0xBA4 */ f32 field_0xba4; - /* 0xBA8 */ u8 field_0xBA8[0xBAC - 0xBA8]; + /* 0xBA8 */ u8 field_0xba8[0xBAC - 0xBA8]; /* 0xBAC */ int field_0xbac; /* 0xBB0 */ f32 field_0xbb0; /* 0xBB4 */ f32 field_0xbb4; - /* 0xBB8 */ u8 field_0xBB8[0xBBC - 0xBB8]; + /* 0xBB8 */ u8 field_0xbb8[0xBBC - 0xBB8]; /* 0xBBC */ int field_0xbbc; /* 0xBC0 */ int field_0xbc0; }; @@ -52,27 +59,29 @@ public: void calcDpdPlayCirPos(); void calcDpdPlayBoxPos(); - /* 0x0000 */ u32 field_0x0; - /* 0x0004 */ KPADStatus field_0x4[10]; + /* 0x0000 */ int field_0x0; +#if PLATFORM_SHIELD + /* 0x0004 */ u8 unk_shield_0x04[0x8 - 0x4]; +#endif + /* 0x0004 */ KPADStatus field_0x4[RECPD_SAMPLING_BUF_COUNT]; /* 0x0554 */ int field_0x554; +#if PLATFORM_SHIELD + /* 0x0558 */ u8 unk_shield_0x558[0x55c - 0x558]; +#endif /* 0x0558 */ KPADStatus field_0x558; /* 0x05E0 */ Acc m_remAcc; /* 0x11A4 */ Acc m_FSAcc; - /* 0x1D68 */ f32 m_stick3D; - /* 0x1D6C */ f32 field_0x1d6c; + /* 0x1D68 */ Vec2 m_stick3D; /* 0x1D70 */ f32 m_stickValue; /* 0x1D74 */ s16 m_stickAngle; /* 0x1D76 */ s16 m_stick3DAngle; /* 0x1D78 */ Vec2 field_0x1d78; /* 0x1D80 */ Vec2 field_0x1d80; - /* 0x1D88 */ f32 field_0x1d88; - /* 0x1D8C */ f32 field_0x1d8c; - /* 0x1D90 */ f32 field_0x1d90; - /* 0x1D94 */ f32 field_0x1d94; + /* 0x1D88 */ Vec2 m_dpd_2d_pos; + /* 0x1D90 */ Vec2 m_dpd_ratio_pos; /* 0x1D98 */ f32 field_0x1d98; /* 0x1D9C */ f32 field_0x1d9c; - /* 0x1DA0 */ f32 field_0x1da0; - /* 0x1DA4 */ f32 field_0x1da4; + /* 0x1DA0 */ Vec2 m_dpd_play_box_pos; /* 0x1DA8 */ Vec2 field_0x1da8; /* 0x1DB0 */ Vec2 field_0x1db0; /* 0x1DB8 */ f32 field_0x1db8; @@ -84,7 +93,7 @@ public: /* 0x1DD0 */ int field_0x1dd0; /* 0x1DD4 */ u8 field_0x1dd4; /* 0x1DD8 */ int field_0x1dd8; - /* 0x1DDC */ u8 field_0x1ddc; + /* 0x1DDC */ bool field_0x1ddc; /* 0x1DDD */ u8 field_0x1ddd; /* 0x1DE0 */ int field_0x1de0; /* 0x1DE4 */ int field_0x1de4; @@ -92,7 +101,7 @@ public: /* 0x1DEC */ int field_0x1dec; /* 0x1DF0 */ u8 field_0x1df0; /* 0x1DF4 */ int field_0x1df4; - /* 0x1DF8 */ u32 field_0x1df8; + /* 0x1DF8 */ u32 dev_type; /* 0x1DFC */ u32 field_0x1dfc; /* 0x1E00 */ int field_0x1e00; /* 0x1E04 */ u8 field_0x1e04; @@ -118,29 +127,29 @@ public: static void stopMoterWave(int); static void updateMoterWave(); static void stopMoter(); - static void getLowBat(u32); - static void setLowBat(u32, int); - static void onLowBatChk(u32); - static void procNoData(u32); + static BOOL getLowBat(u32 chan); + static void setLowBat(u32 chan, BOOL low_bat); + static void onLowBatChk(u32 chan); + static void procNoData(u32 chan); static void read(); - static void calibrateDist(int); - static void getDpd2DPos(u32); - static void getDpdRatioPos(u32); - static void getDpdRatioBoxPos(u32); - static void chkDpdOk(u32); - static void chkDpdValid(u32); - static void chkDpdPosIn(u32); - static void getKPADAcc(u32, Vec*, int); - static void getAngleXy(u32); - static void getAngleZy(u32); - static void getKPADAccValue(u32, int); - static void getKPADAccValueMax(u32); - static void getKPADAccSpeed(u32, int); - static void getKPADAccSpeedMax(u32); - static void getKPADFsAccValue(u32, int); - static void getKPADFsAccValueMax(u32); - static s16 getFSStickAngle3DRev(u32); - static void calcUnderVec(Pad::Acc*, f32); + static f32 calibrateDist(int); + static Vec2& getDpd2DPos(u32 chan); + static Vec2& getDpdRatioPos(u32 chan); + static Vec2& getDpdPlayBoxPos(u32 chan); + static BOOL chkDpdOk(u32 chan); + static BOOL chkDpdValid(u32 chan); + static BOOL chkDpdPosIn(u32 chan); + static void getKPADAcc(u32 chan, Vec*, int); + static s16 getAngleXy(u32 chan); + static s16 getAngleZy(u32 chan); + static f32 getKPADAccValue(u32 chan, int); + static f32 getKPADAccValueMax(u32 chan); + static f32 getKPADAccSpeed(u32 chan, int); + static f32 getKPADAccSpeedMax(u32 chan); + static f32 getKPADFSAccValue(u32 chan, int); + static f32 getKPADFSAccValueMax(u32 chan); + static s16 getFSStickAngle3DRev(u32 chan); + static void calcUnderVec(Pad::Acc* acc_p, f32); static u32 getHoldB(u32); static u32 getHoldMinus(u32); @@ -178,8 +187,9 @@ public: static u32 getTrigUp(u32 i_pad) { return getTrig(i_pad) & WPAD_BUTTON_UP; } static u32 getTrigStart(u32 i_pad) { return getTrig(i_pad) & WPAD_BUTTON_PLUS; } - static WPADInfo m_pad_info[4]; - static Pad m_pad[4]; + static WPADInfo m_pad_info[WPAD_MAX_CONTROLLERS]; + static Pad m_pad[WPAD_MAX_CONTROLLERS]; + static motorWave_t m_motorWave[WPAD_MAX_CONTROLLERS]; static int m_cal_value; }; diff --git a/include/revolution/kpad.h b/include/revolution/kpad.h index 984ffe826d5..ef6ac564704 100644 --- a/include/revolution/kpad.h +++ b/include/revolution/kpad.h @@ -71,10 +71,21 @@ typedef struct KPADStatus { /* 0x4C */ f32 dist_vec; /* 0x50 */ f32 dist_speed; /* 0x54 */ Vec2 acc_vertical; +#if PLATFORM_SHIELD + /* 0x5C */ u8 dev_type; + /* 0x5D */ s8 wpad_err; + /* 0x5E */ s8 dpd_valid_fg; + /* 0x5F */ u8 data_format; + /* 0x60 */ KPADEXStatus ex_status; + /* 0x84 */ u8 unk_shield_0x86[0xf0 - 0x84]; +#else /* 0x5C */ u32 dev_type; /* 0x60 */ KPADEXStatus ex_status; /* 0x84 */ s8 dpd_valid_fg; /* 0x85 */ s8 wpad_err; +#endif +#if PLATFORM_SHIELD +#endif } KPADStatus; // size 0x88 typedef struct KPADUnifiedWpadStatus { diff --git a/src/SSystem/SComponent/c_API_controller_pad.cpp b/src/SSystem/SComponent/c_API_controller_pad.cpp index 634ff74e4d0..91973eb14af 100644 --- a/src/SSystem/SComponent/c_API_controller_pad.cpp +++ b/src/SSystem/SComponent/c_API_controller_pad.cpp @@ -8,7 +8,7 @@ #include "global.h" #if PLATFORM_WII -#include "m_Do/m_Re_controller_pad.h" +#include "m_Re/m_Re_controller_pad.h" #endif void cAPICPad_recalibrate() { @@ -113,7 +113,7 @@ f32 cAPICPad_X_STICK(u32 i_padNo) { } f32 cAPICPad_X_STICK_3D(u32 i_padNo) { - return mReCPd::getPad(i_padNo).m_stick3D; + return mReCPd::getPad(i_padNo).m_stick3D.x; } f32 cAPICPad_Y_STICK(u32 i_padNo) { diff --git a/src/d/d_home_button.cpp b/src/d/d_home_button.cpp index bd11f303eb7..0719fcac9af 100644 --- a/src/d/d_home_button.cpp +++ b/src/d/d_home_button.cpp @@ -8,7 +8,7 @@ #include "m_Do/m_Do_Reset.h" #include "m_Do/m_Do_graphic.h" #include "m_Do/m_Do_lib.h" -#include "m_Do/m_Re_controller_pad.h" +#include "m_Re/m_Re_controller_pad.h" int SECallback(int param_0, int param_1) { if (param_0 == 5) { diff --git a/src/m_Do/m_Re_controller_pad.cpp b/src/m_Do/m_Re_controller_pad.cpp deleted file mode 100644 index 24a97449dd7..00000000000 --- a/src/m_Do/m_Re_controller_pad.cpp +++ /dev/null @@ -1,350 +0,0 @@ -#include "m_Do/m_Re_controller_pad.h" -#include "Z2AudioLib/Z2AudioCS.h" - -mReCPd::Pad mReCPd::m_pad[4]; -WPADInfo mReCPd::m_pad_info[4]; - -void mReCPd::Pad::Acc::clean() { - -} - -void mReCPd::Pad::Acc::changeStts(u32, bool) { - -} - -void mReCPd::Pad::Acc::calcSwingVec() { - -} - -void mReCPd::Pad::Acc::calcSttsRem() { - -} - -void mReCPd::Pad::Acc::calcSttsFs() { - -} - -void mReCPd::Pad::clean() { - -} - -void mReCPd::Pad::cleanOneTime() { - -} - -void mReCPd::Pad::copyRemAcc() { - -} - -void mReCPd::Pad::copyFSAcc() { - -} - -void mReCPd::Pad::cleanTrig() { - m_remAcc.m_swing = 0; - m_FSAcc.m_swing = 0; - - for (int i = 0; i < 10; i++) { - field_0x4[i].trig = 0; - } -} - -void mReCPd::Pad::cleanHold() { - for (int i = 0; i < 10; i++) { - field_0x4[i].hold = 0; - } -} - -void mReCPd::Pad::cleanRelease() { - for (int i = 0; i < 10; i++) { - field_0x4[i].release = 0; - } -} - -void mReCPd::Pad::clearUpDown() { - -} - -void mReCPd::Pad::calcDpdBox(Vec2*, Vec2*, f32, f32) { - -} - -void mReCPd::Pad::calcDpdOld() { - -} - -void mReCPd::enableDpd(u32 param_0) { - KPADEnableDPD(param_0); -} - -void mReCPd::disableDpd(u32 param_0) { - KPADDisableDPD(param_0); -} - -void mReCPd::Pad::calcDpd2DPos() { - -} - -void mReCPd::Pad::calcDpdRatioPos() { - -} - -void mReCPd::Pad::calcDpdPlayCirPos() { - -} - -void mReCPd::Pad::calcDpdPlayBoxPos() { - -} - -void mReCPd::onConnect(u32 i_padNo) { - m_pad[i_padNo].field_0x1dd4 = 1; - m_pad[i_padNo].field_0x1e04 = 1; -} - -static void l_mReCPd_extensionCallback(s32 i_padNo, s32 param_1) { - Z2AudioCS::extensionProcess(i_padNo, param_1); - mReCPd::m_pad[i_padNo].field_0x1dec = param_1; - mReCPd::m_pad[i_padNo].field_0x1df0 = 1; -} - -void mReCPd::setExtensionCallback() { - WPADSetExtensionCallback(0, l_mReCPd_extensionCallback); -} - -void mReCPd::onGetInfoAsync(u32 i_padNo) { - m_pad[i_padNo].field_0x1ddd = 1; - m_pad[i_padNo].field_0x1de0 = 1800; -} - -void mReCPd::create() { - -} - -void mReCPd::startMoterWave(motorWave_t*, u8*, bool) { - -} - -void mReCPd::startMoterWave(int, u8*, bool) { - -} - -void mReCPd::stopMoterWave(motorWave_t*) { - -} - -void mReCPd::stopMoterWave(int) { - -} - -void mReCPd::updateMoterWave() { - -} - -void mReCPd::stopMoter() { - -} - -void mReCPd::getLowBat(u32) { - -} - -void mReCPd::setLowBat(u32, int) { - -} - -void mReCPd::onLowBatChk(u32) { - -} - -void mReCPd::procNoData(u32) { - -} - -void mReCPd::read() { - -} - -void mReCPd::calibrateDist(int) { - -} - -void mReCPd::getDpd2DPos(u32) { - -} - -void mReCPd::getDpdRatioPos(u32) { - -} - -void mReCPd::getDpdRatioBoxPos(u32) { - -} - -void mReCPd::chkDpdOk(u32) { - -} - -void mReCPd::chkDpdValid(u32) { - -} - -void mReCPd::chkDpdPosIn(u32) { - -} - -void mReCPd::getKPADAcc(u32, Vec*, int) { - -} - -void mReCPd::getAngleXy(u32) { - -} - -void mReCPd::getAngleZy(u32) { - -} - -void mReCPd::getKPADAccValue(u32, int) { - -} - -void mReCPd::getKPADAccValueMax(u32) { - -} - -void mReCPd::getKPADAccSpeed(u32, int) { - -} - -void mReCPd::getKPADAccSpeedMax(u32) { - -} - -void mReCPd::getKPADFsAccValue(u32, int) { - -} - -void mReCPd::getKPADFsAccValueMax(u32) { - -} - -s16 mReCPd::getFSStickAngle3DRev(u32) { - -} - -void mReCPd::calcUnderVec(Pad::Acc*, f32) { - -} - -u32 mReCPd::getHoldB(u32 i_padNo) { - return m_pad[i_padNo].field_0x4[0].hold & WPAD_BUTTON_B; -} - -u32 mReCPd::getHoldMinus(u32 i_padNo) { - if (chkSwingBlock(i_padNo)) { - return 0; - } else { - return m_pad[i_padNo].field_0x4[0].hold & WPAD_BUTTON_MINUS; - } -} - -u32 mReCPd::getHoldPlus(u32 i_padNo) { - if (chkSwingBlock(i_padNo)) { - return 0; - } else { - return m_pad[i_padNo].field_0x4[0].hold & WPAD_BUTTON_PLUS; - } -} - -u32 mReCPd::getHoldZ1(u32 i_padNo) { - return m_pad[i_padNo].field_0x4[0].hold & WPAD_BUTTON_Z; -} - -u32 mReCPd::getTrigB(u32 i_padNo) { - return m_pad[i_padNo].field_0x4[0].trig & WPAD_BUTTON_B; -} - -u32 mReCPd::getTrigMinus(u32 i_padNo) { - if (chkSwingBlock(i_padNo)) { - return 0; - } else { - return m_pad[i_padNo].field_0x4[0].trig & WPAD_BUTTON_MINUS; - } -} - -u32 mReCPd::getTrigHome(u32 i_padNo) { - if (chkSwingBlock(i_padNo)) { - return 0; - } else { - return m_pad[i_padNo].field_0x4[0].trig & WPAD_BUTTON_HOME; - } -} - -u32 mReCPd::getTrigPlus(u32 i_padNo) { - if (chkSwingBlock(i_padNo)) { - return 0; - } else { - return m_pad[i_padNo].field_0x4[0].trig & WPAD_BUTTON_PLUS; - } -} - -u32 mReCPd::getTrigZ1(u32 i_padNo) { - return m_pad[i_padNo].field_0x4[0].trig & WPAD_BUTTON_Z; -} - -u32 mReCPd::chkSwingBlock(u32 i_padNo) { - return m_pad[i_padNo].m_swingBlock > 0; -} - -u32 mReCPd::getTrigSwing(u32 i_padNo) { - return m_pad[i_padNo].m_remAcc.m_swing; -} - -Vec2& mReCPd::getSwingVec(u32 i_padNo) { - return m_pad[i_padNo].m_remAcc.m_swingVec; -} - -u32 mReCPd::chkSimpleProbe(u32 i_padNo) { - if (m_pad[i_padNo].field_0x1dd4 == 0) { - return 0; - } else if (m_pad[i_padNo].field_0x1dfc + 3 <= 2) { - return 0; - } else if (m_pad[i_padNo].field_0x1df8 == 0xFD || m_pad[i_padNo].field_0x1df8 == 0xFF) { - return 0; - } else { - return 1; - } -} - -BOOL mReCPd::chkDevTypeValid(u32 i_padNo) { - if (!chkSimpleProbe(i_padNo)) { - return FALSE; - } - - if (m_pad[i_padNo].field_0x1df4 < 20 && m_pad[i_padNo].field_0x1de4 == 0xFF && m_pad[i_padNo].field_0x1de8 != 0) { - return FALSE; - } - - return TRUE; -} - -u32 mReCPd::getFSTrigSwing(u32 i_padNo) { - return m_pad[i_padNo].m_FSAcc.m_swing; -} - -int mReCPd::m_cal_value; - -void mReCPd::plusCalValue() { - m_cal_value++; - if (m_cal_value >= 2) { - m_cal_value = 2; - } -} - -void mReCPd::minusCalValue() { - m_cal_value--; - if (m_cal_value <= -2) { - m_cal_value = -2; - } -} diff --git a/src/m_Re/m_Re_controller_pad.cpp b/src/m_Re/m_Re_controller_pad.cpp new file mode 100644 index 00000000000..b51e069fd5f --- /dev/null +++ b/src/m_Re/m_Re_controller_pad.cpp @@ -0,0 +1,1800 @@ +#include "m_Re/m_Re_controller_pad.h" + +#include "JSystem/JKernel/JKRHeap.h" +#include "SSystem/SComponent/c_lib.h" +#include "SSystem/SComponent/c_m3d.h" +#include "Z2AudioLib/Z2AudioCS.h" +#include "d/actor/d_a_player.h" +#include "d/d_com_inf_game.h" +#include "m_Do/m_Do_Reset.h" +#include "m_Do/m_Do_graphic.h" +#include +#include + +bool l_reset_requested; + +mReCPd::Pad mReCPd::m_pad[WPAD_MAX_CONTROLLERS]; +WPADInfo mReCPd::m_pad_info[WPAD_MAX_CONTROLLERS]; +mReCPd::motorWave_t mReCPd::m_motorWave[WPAD_MAX_CONTROLLERS]; +int mReCPd::m_cal_value; + +JKRHeap* wpad_heap; + +f32 l_dif_y_tbl[5] = {-0.3f, -0.15f, 0.0f, 0.15f, 0.3f}; + +void mReCPd::Pad::Acc::clean() { + for (int i = 0; i < ARRAY_SIZE(field_0x0); i++) { + field_0x0[i].x = field_0x0[i].y = field_0x0[i].z = 0.0f; + field_0x5a0[i].x = field_0x5a0[i].y = field_0x5a0[i].z = 0.0f; + } + field_0xb40 = 0; + m_swing = 0; + field_0xb54 = 0.0f; + m_swingVec.x = 0.0f; + m_swingVec.y = 0.0f; + field_0xb50 = 0; + field_0xb51 = 1; + PSMTXIdentity(field_0xb68); + field_0xb98 = 0.0f; + field_0xb9c = 0; + field_0xbac = 0; + field_0xba0 = 0.0f; + field_0xba4 = 0.0f; + field_0xbb0 = 0.0f; + field_0xbb4 = 0.0f; + field_0xbbc = 0; + field_0xbc0 = 0; +} + +void mReCPd::Pad::Acc::changeStts(u32 param_0, bool param_1) { + if (param_1 != 0) { + if (field_0xb40 & param_0) { + m_swing &= ~param_0; + } else { + m_swing |= param_0; + } + field_0xb40 |= param_0; + return; + } + field_0xb40 &= ~param_0; + m_swing &= ~param_0; +} + +bool cM3d_IsZero(f32 f); + +// NONMATCHING - cM3d_IsZero inlining +void mReCPd::Pad::Acc::calcSwingVec() { + Vec sp2C; + Vec sp20; + Vec sp14; + Vec sp08; + + if (field_0xb51 != 0) { + u32 var_r0 = 0; + u32 var_r30 = 0; + sp2C.z = 0.0f; + sp2C.y = 0.0f; + sp2C.x = 0.0f; + field_0xb50 = 0; + for (int i = 1; i < 30; i++) { + if (field_0x0[i].z > 1.1f) { + sp20 = field_0x5a0[i]; + sp14 = field_0x5a0[i - 1]; + PSVECSubtract(&sp20, &sp14, &sp08); + PSVECScale(&sp08, &sp08, PSVECMag(&sp08)); + PSVECAdd(&sp2C, &sp08, &sp2C); + var_r0 = 1; + } else if (var_r0 == 1) { + var_r30 = 1; + break; + } + } + + if (var_r30 == 1 && cM3d_IsZero(PSVECSquareMag(&sp2C)) == 0) { + sp2C.z = 0.0f; + PSVECNormalize(&sp2C, &sp2C); + m_swingVec.x = sp2C.x; + m_swingVec.y = sp2C.y; + field_0xb50 = 1; + } + } +} + +void mReCPd::Pad::Acc::calcSttsRem() { + f32 var_f25 = 8.0f; + f32 var_f24 = -8.0f; + f32 var_f23 = 8.0f; + f32 var_f22 = -8.0f; + f32 var_f21 = 8.0f; + f32 var_f20 = -8.0f; + f32 var_f19 = 8.0f; + f32 var_f18 = -8.0f; + f32 var_f17 = 8.0f; + f32 var_f16 = -8.0f; + f32 var_f15 = 8.0f; + f32 var_f14 = -8.0f; + + bool x_over_2 = false; + bool x_under_2 = false; + bool y_over_2 = false; + bool y_under_2 = false; + bool z_over = false; + bool z_under = false; + bool var_r28 = false; + bool var_r27 = false; + bool var_r26 = false; + bool var_r25 = false; + bool var_r24 = false; + bool x_under = false; + bool x_over = false; + bool y_under = false; + bool y_over = false; + bool z_over_2 = false; + bool z_under_2 = false; + int var_r17 = 0; + + field_0xb54 = 0.0f; + + Vec sp14; + Vec sp8; + for (int i = 0; i < 30; i++) { + sp14 = field_0x5a0[i]; + sp8 = field_0x0[i]; + + if (sp14.x > 0.63f) { + x_over = true; + if (x_under) { + x_under = false; + } + x_over_2 = true; + if (x_under_2 == true) { + var_r17 = i; + var_r28 = true; + break; + } + } + + if (sp14.x < -0.63f) { + x_under = true; + if (x_over) { + x_over = false; + } + x_under_2 = true; + if (x_over_2 == true) { + var_r17 = i; + var_r27 = true; + break; + } + } + + if (sp14.y > 0.7f) { + y_over = true; + if (y_under) { + y_under = false; + } + y_over_2 = true; + if (y_under_2 == true) { + var_r17 = i; + var_r25 = true; + break; + } + } + + if (sp14.y < -0.4f) { + y_under = true; + if (y_over) { + y_over = false; + } + y_under_2 = true; + if (y_over_2 == true) { + var_r17 = i; + var_r26 = true; + break; + } + } + + if (sp14.z > 0.28f) { + z_over = true; + if (z_under == true) { + var_r17 = i; + break; + } + z_over_2 = true; + if (z_under_2) { + z_under_2 = false; + } + } + + if (sp14.z < -0.28f) { + z_under = true; + if (z_over == true) { + var_r17 = i; + var_r24 = true; + break; + } + z_under_2 = true; + if (z_over_2) { + z_over_2 = false; + } + } + + if (var_f25 > sp14.x) { + var_f25 = sp14.x; + } + if (var_f24 < sp14.x) { + var_f24 = sp14.x; + } + if (var_f23 > sp14.y) { + var_f23 = sp14.y; + } + if (var_f22 < sp14.y) { + var_f22 = sp14.y; + } + if (var_f21 > sp14.z) { + var_f21 = sp14.z; + } + if (var_f20 < sp14.z) { + var_f20 = sp14.z; + } + if (var_f19 > sp8.x) { + var_f19 = sp8.x; + } + if (var_f18 < sp8.x) { + var_f18 = sp8.x; + } + if (var_f17 > sp8.y) { + var_f17 = sp8.y; + } + if (var_f16 < sp8.y) { + var_f16 = sp8.y; + } + if (var_f15 > sp8.z) { + var_f15 = sp8.z; + } + if (var_f14 < sp8.z) { + var_f14 = sp8.z; + } + + f32 temp_f1_2 = sp14.z * sp14.z + (sp14.x * sp14.x + sp14.y * sp14.y); + if (field_0xb54 < temp_f1_2) { + field_0xb54 = temp_f1_2; + } + } + + f32 temp_f2 = 0.0f; + f32 temp_f1_3 = 0.0f; + f32 temp_f0 = 0.0f; + f32 var_f14_2 = 0.0f; + f32 var_f15_2 = 0.0f; + f32 var_f16_2 = 0.0f; + + for (int i = 0; i < 0x25; i++) { + temp_f2 += field_0x0[i].x * field_0x0[i].x; + temp_f1_3 += field_0x0[i].y * field_0x0[i].y; + temp_f0 += field_0x0[i].z * field_0x0[i].z; + var_f14_2 += field_0x5a0[i].x * field_0x5a0[i].x; + var_f15_2 += field_0x5a0[i].y * field_0x5a0[i].y; + var_f16_2 += field_0x5a0[i].z * field_0x5a0[i].z; + } + + var_f20 = 0.0f; + var_f19 = 0.0f; + var_f18 = 0.0f; + for (int i = 0; i < 29; i++) { + var_f20 += cM3d_VectorProduct2d(field_0x5a0[0].x, field_0x5a0[0].y, + field_0x5a0[i].x, field_0x5a0[i].y, + field_0x5a0[i + 1].x, field_0x5a0[i + 1].y); + var_f19 += cM3d_VectorProduct2d(field_0x5a0[0].x, field_0x5a0[0].z, + field_0x5a0[i].x, field_0x5a0[i].z, + field_0x5a0[i + 1].x, field_0x5a0[i + 1].z); + var_f18 += cM3d_VectorProduct2d(field_0x5a0[0].z, field_0x5a0[0].y, + field_0x5a0[i].z, field_0x5a0[i].y, + field_0x5a0[i + 1].z, field_0x5a0[i + 1].y); + } + + if (var_r17 < 0x25 && !(field_0xb40 & 0x100) && var_r27 == true && !(field_0xb40 & 0x8)) { + if (field_0xb40 & 0x1) { + m_swing &= ~0x1; + } else { + m_swing |= 0x1; + if (field_0xbc0 > 0) { + field_0xbc0 = 0; + } + field_0xbbc = 0x14; + } + field_0xb40 |= 0x1; + } else { + field_0xb40 &= ~0x1; + m_swing &= ~0x1; + } + + if (var_r17 < 0x25 && !(field_0xb40 & 0x100) && var_r28 == true && !(field_0xb40 & 0x8)) { + if (field_0xb40 & 0x2) { + m_swing &= ~0x2; + } else { + m_swing |= 0x2; + if (field_0xbbc > 0) { + field_0xbbc = 0; + } + field_0xbc0 = 0x14; + } + field_0xb40 |= 0x2; + } else { + field_0xb40 &= ~0x2; + m_swing &= ~0x2; + } + + bool var_r3_2 = y_over_2 == 1 && (int)y_under_2 == 0 && var_r24 == true && var_f17 < -1.3f; + if (var_r3_2) { + var_r24 = false; + } + + if (var_r17 < 0x25 && !(field_0xb40 & 0x100) && (var_r25 == true || var_r3_2)) { + if (field_0xb40 & 0x8) { + m_swing &= ~0x8; + } else { + m_swing |= 0x8; + } + field_0xb40 |= 0x8; + } else { + field_0xb40 &= ~0x8; + m_swing &= ~0x8; + } + + if (var_r17 < 0x25 && !(field_0xb40 & 0x100) && var_r26 == true) { + if (field_0xb40 & 0x4) { + m_swing &= ~0x4; + } else { + m_swing |= 0x4; + } + field_0xb40 |= 0x4; + } else { + field_0xb40 &= ~0x4; + m_swing &= ~0x4; + } + + changeStts(0x10, + var_f14_2 < 0.5f * var_f16_2 && + var_f15_2 < 0.45f * var_f16_2 && + var_f16_2 > 12.0f && + var_r17 < 0x25 && + var_r24); + calcSwingVec(); +} + +void mReCPd::Pad::Acc::calcSttsFs() { + f32 var_f25 = 8.0f; + f32 var_f24 = -8.0f; + f32 var_f23 = 8.0f; + f32 var_f22 = -8.0f; + f32 var_f21 = 8.0f; + f32 var_f20 = -8.0f; + f32 var_f19 = 8.0f; + f32 var_f18 = -8.0f; + f32 var_f17 = 8.0f; + f32 var_f16 = -8.0f; + f32 var_f15 = 8.0f; + f32 var_f14 = -8.0f; + + bool x_over_2 = false; + bool x_under_2 = false; + bool y_over_2 = false; + bool y_under_2 = false; + bool z_over = false; + bool z_under = false; + bool var_r28 = false; + bool var_r27 = false; + bool var_r26 = false; + bool var_r25 = false; + bool var_r24 = false; + bool x_under = false; + bool x_over = false; + bool y_under = false; + bool y_over = false; + bool z_over_2 = false; + bool z_under_2 = false; + + int var_r17 = 0; + + field_0xb54 = 0.0f; + + Vec sp14; + Vec sp8; + + for (int i = 0; i < 30; i++) { + sp14 = field_0x5a0[i]; + sp8 = field_0x0[i]; + + if (sp8.x > 0.5f) { + x_over = true; + if (x_under) { + x_under = false; + } + x_over_2 = true; + if (x_under_2 == true) { + var_r17 = i; + var_r28 = true; + break; + } + } + + if (sp8.x < -0.5f) { + x_under = true; + if (x_over) { + x_over = false; + } + x_under_2 = true; + if (x_over_2 == true) { + var_r17 = i; + var_r27 = true; + break; + } + } + + if (sp14.y > 0.7f) { + y_over = true; + if (y_under) { + y_under = false; + } + y_over_2 = true; + if (y_under_2 == true) { + var_r25 = true; + } + } + + if (sp14.y < -0.4f) { + y_under = true; + if (y_over) { + y_over = false; + } + y_under_2 = true; + if (y_over_2 == true) { + var_r26 = true; + } + } + + if (sp14.z > 0.28f) { + z_over = true; + if (z_under == true) { + var_r17 = i; + break; + } + z_over_2 = true; + if (z_under_2) { + z_under_2 = false; + } + } + + if (sp14.z < -0.28f) { + z_under = true; + if (z_over == true) { + var_r17 = i; + var_r24 = true; + break; + } + z_under_2 = true; + if (z_over_2) { + z_over_2 = false; + } + } + + if (var_f25 > sp14.x) { + var_f25 = sp14.x; + } + if (var_f24 < sp14.x) { + var_f24 = sp14.x; + } + if (var_f23 > sp14.y) { + var_f23 = sp14.y; + } + if (var_f22 < sp14.y) { + var_f22 = sp14.y; + } + if (var_f21 > sp14.z) { + var_f21 = sp14.z; + } + if (var_f20 < sp14.z) { + var_f20 = sp14.z; + } + if (var_f19 > sp8.x) { + var_f19 = sp8.x; + } + if (var_f18 < sp8.x) { + var_f18 = sp8.x; + } + if (var_f17 > sp8.y) { + var_f17 = sp8.y; + } + if (var_f16 < sp8.y) { + var_f16 = sp8.y; + } + if (var_f15 > sp8.z) { + var_f15 = sp8.z; + } + if (var_f14 < sp8.z) { + var_f14 = sp8.z; + } + + f32 temp_f1_2 = sp14.x * sp14.x + sp14.y * sp14.y + sp14.z * sp14.z; + if (field_0xb54 < temp_f1_2) { + field_0xb54 = temp_f1_2; + } + } + + f32 var_f16_2 = var_f16 - var_f17; + + f32 var_f18_2 = 0.0f; + f32 var_f6 = 0.0f; + f32 var_f17_2 = 0.0f; + f32 var_f19_2 = 0.0f; + f32 var_f7 = 0.0f; + f32 var_f20_2 = 0.0f; + for (int i = 0; i < 37; i++) { + var_f18_2 += field_0x0[i].x * field_0x0[i].x; + var_f6 += field_0x0[i].y * field_0x0[i].y; + var_f17_2 += field_0x0[i].z * field_0x0[i].z; + var_f19_2 += field_0x5a0[i].x * field_0x5a0[i].x; + var_f7 += field_0x5a0[i].y * field_0x5a0[i].y; + var_f20_2 += field_0x5a0[i].z * field_0x5a0[i].z; + } + + f32 var_f23_2 = 0.0f; + f32 var_f21_2 = 0.0f; + f32 var_f22_2 = 0.0f; + for (int i = 0; i < 29; i++) { + var_f23_2 += cM3d_VectorProduct2d(field_0x5a0[0].x, field_0x5a0[0].y, + field_0x5a0[i].x, field_0x5a0[i].y, + field_0x5a0[i + 1].x, field_0x5a0[i + 1].y); + var_f21_2 += cM3d_VectorProduct2d(field_0x5a0[0].x, field_0x5a0[0].z, + field_0x5a0[i].x, field_0x5a0[i].z, + field_0x5a0[i + 1].x, field_0x5a0[i + 1].z); + var_f22_2 += cM3d_VectorProduct2d(field_0x5a0[0].z, field_0x5a0[0].y, + field_0x5a0[i].z, field_0x5a0[i].y, + field_0x5a0[i + 1].z, field_0x5a0[i + 1].y); + } + + bool var_r14_3 = false; + if (var_r17 < 0x25 && + var_f19_2 > 0.5f * var_f20_2 && + !(field_0xb40 & 0x100) && + var_r27 == 1 && + !(field_0xb40 & 0x8)) { + if (field_0xb40 & 0x1) { + m_swing &= ~0x1; + } else { + m_swing |= 0x1; + if (field_0xbc0 > 0) { + var_r14_3 = true; + field_0xbc0 = 0; + } + field_0xbbc = 0x14; + } + field_0xb40 |= 0x1; + } else { + field_0xb40 &= ~0x1; + m_swing &= ~0x1; + } + + bool var_r16_2 = false; + if (var_r17 < 0x25 && + var_f19_2 > 0.5f * var_f20_2 && + !(field_0xb40 & 0x100) && + var_r28 == true && + !(field_0xb40 & 0x8)) { + if (field_0xb40 & 0x2) { + m_swing &= ~0x2; + } else { + m_swing |= 0x2; + if (field_0xbbc > 0) { + var_r16_2 = true; + field_0xbbc = 0; + } + field_0xbc0 = 0x14; + } + field_0xb40 |= 0x2; + } else { + field_0xb40 &= ~0x2; + m_swing &= ~0x2; + } + + if (!(field_0xb40 & 0x100) && + (var_r25 == 1 || + (y_over_2 == 1 && y_under_2 == 0 && var_r24 == 1 && var_f16_2 > 2.5f)) && + fabsf(var_f21_2) < 3.0f && + fabsf(var_f22_2) > 3.0f && + var_f22_2 > 0.0f) { + if (field_0xb40 & 8) { + m_swing &= ~0x8; + } else { + m_swing |= 8; + } + field_0xb40 |= 8; + } else { + field_0xb40 &= ~0x8; + m_swing &= ~0x8; + } + + if (!(field_0xb40 & 0x100) && + var_r26 == 1 && + fabsf(var_f21_2) < 3.0f && + fabsf(var_f22_2) > 3.0f && + var_f22_2 < 0.0f) { + if (field_0xb40 & 0x4) { + m_swing &= ~0x4; + } else { + m_swing |= 4; + } + field_0xb40 |= 4; + } else { + field_0xb40 &= ~0x4; + m_swing &= ~0x4; + } + + changeStts(0x10, var_f18_2 < 0.5f * var_f17_2 && + var_r17 < 0x25 && + ((field_0xb40 & 0x100 && field_0xb98 > 0.28f) || var_r24 != 0)); + bool temp_r5 = 0.5f * (var_f15 + var_f14) < -0.7f; + changeStts(0x100, temp_r5); + int temp_r0 = field_0xbbc - 1; + field_0xbbc = temp_r0; + if (temp_r0 < 0) { + field_0xbbc = 0; + } + + int temp_r0_2 = field_0xbc0 - 1; + field_0xbc0 = temp_r0_2; + if (temp_r0_2 < 0) { + field_0xbc0 = 0; + } + + if (var_r14_3) { + if (field_0xb40 & 0x80) { + m_swing &= ~0x80; + } else { + m_swing |= 0x80; + } + field_0xb40 |= 0x80; + } else { + field_0xb40 &= ~0x80; + m_swing &= ~0x80; + } + + if (var_r16_2 != 0) { + if (field_0xb40 & 0x40) { + m_swing &= ~0x40; + } else { + m_swing |= 0x40; + } + field_0xb40 |= 0x40; + } else { + field_0xb40 &= ~0x40; + m_swing &= ~0x40; + } +} + +void mReCPd::Pad::clean() { + field_0x554 = 0; + field_0x0 = 0; + m_stick3D.x = m_stick3D.y = 0.0f; + m_stickValue = 0.0f; + m_stickAngle = 0; + m_stick3DAngle = 0; + cLib_memSet(&field_0x4, 0, sizeof(field_0x4)); + cLib_memSet(&field_0x558, 0, sizeof(field_0x558)); + m_remAcc.clean(); + m_FSAcc.clean(); + field_0x1dd4 = 0; + field_0x1d78.x = field_0x1d78.y = 0.0f; + field_0x1d80.x = field_0x1d80.y = 0.0f; + m_dpd_2d_pos.x = m_dpd_2d_pos.y = 0.0f; + m_dpd_ratio_pos.x = m_dpd_ratio_pos.y = 0.0f; + field_0x1d98 = field_0x1d9c = 0.0f; + m_dpd_play_box_pos.x = m_dpd_play_box_pos.y = 0.0f; + field_0x1db0.x = field_0x1db0.y = 0.0f; + field_0x1db8 = field_0x1dbc = 0.0f; + field_0x1da8.x = field_0x1da8.y = 0.0f; + field_0x1dc0 = 0.0f; + field_0x1dc4 = 0; + field_0x1dc8 = 0; + m_swingBlock = 0; + field_0x1dd0 = 0; + field_0x1dd8 = 0; + field_0x1de0 = 0; + field_0x1de4 = 0; + field_0x1dec = 0; + field_0x1df4 = 0; + dev_type = WPAD_DEV_INITIALIZING; + field_0x1dfc = -1; + field_0x1e00 = 0; + field_0x1e04 = 0; +} + +void mReCPd::Pad::cleanOneTime() { +#if PLATFORM_SHIELD + field_0x1ddd = 0; + field_0x1de8 = 0; + field_0x1df0 = 0; +#else + field_0x1df0 = 0; + field_0x1ddd = 0; + field_0x1de8 = 0; +#endif + field_0x1ddc = false; + field_0x1e05 = 0; +} + +void mReCPd::Pad::copyRemAcc() { + for (int i = 0x77 - field_0x0; i >= 0; i--) { + m_remAcc.field_0x0[i + field_0x0] = m_remAcc.field_0x0[i]; + m_remAcc.field_0x5a0[i + field_0x0] = m_remAcc.field_0x5a0[i]; + } + + f32 var_f30 = -8.0f; + int var_r27 = 0; + for (int i = 0; i < field_0x0; i++) { + m_remAcc.field_0x0[i] = field_0x4[i].acc; + if (var_f30 < m_remAcc.field_0x0[i].y) { + var_f30 = m_remAcc.field_0x0[i].y; + var_r27 = 1; + } + PSMTXMultVec(m_remAcc.field_0xb68, &m_remAcc.field_0x0[i], &m_remAcc.field_0x5a0[i]); + m_remAcc.field_0x5a0[i].y += 1.0f; + } + + if (var_r27 != 0) { + m_remAcc.field_0xb98 = var_f30; + } +} + +void mReCPd::Pad::copyFSAcc() { + for (int i = 0x77 - field_0x0; i >= 0; i--) { + m_FSAcc.field_0x0[i + field_0x0] = m_FSAcc.field_0x0[i]; + m_FSAcc.field_0x5a0[i + field_0x0] = m_FSAcc.field_0x5a0[i]; + } + + f32 var_f30 = -8.0f; + int var_r27 = 0; + for (int i = 0; i < field_0x0; i++) { + m_FSAcc.field_0x0[i] = field_0x4[i].ex_status.fs.acc; + if (var_f30 < m_FSAcc.field_0x0[i].y) { + var_f30 = m_FSAcc.field_0x0[i].y; + var_r27 = 1; + } + PSMTXMultVec(m_FSAcc.field_0xb68, &m_FSAcc.field_0x0[i], &m_FSAcc.field_0x5a0[i]); + m_FSAcc.field_0x5a0[i].y += 1.0f; + } + + if (var_r27 != 0) { + m_FSAcc.field_0xb98 = var_f30; + } +} + +void mReCPd::Pad::cleanTrig() { + m_remAcc.m_swing = 0; + m_FSAcc.m_swing = 0; + + for (int i = 0; i < 10; i++) { + field_0x4[i].trig = 0; + } +} + +void mReCPd::Pad::cleanHold() { + for (int i = 0; i < 10; i++) { + field_0x4[i].hold = 0; + } +} + +void mReCPd::Pad::cleanRelease() { + for (int i = 0; i < 10; i++) { + field_0x4[i].release = 0; + } +} + +void mReCPd::Pad::clearUpDown() { + if (field_0x4[0].trig & 0x1 || field_0x4[0].trig & 0x2 || + field_0x4[0].hold & 0x1 || field_0x4[0].hold & 0x2) { + field_0x4[0].trig &= ~0xC; + field_0x4[0].hold = field_0x4[0].hold & ~0xC; + } +} + +void mReCPd::Pad::calcDpdBox(Vec2* arg0, Vec2* arg1, f32 arg2, f32 arg3) { + Vec2 sp8; + + f32 x_min; + f32 x_max; + x_max = arg1->x; + if (x_max > 0.0f) { + x_min = 0.0f; + } else { + x_min = x_max; + x_max = 0.0f; + } + + f32 y_min; + f32 y_max; + y_max = arg1->y; + if (y_max > 0.0f) { + y_min = 0.0f; + } else { + y_min = y_max; + y_max = 0.0f; + } + + sp8.x = (arg1->x * -arg3) / arg1->y; + sp8.y = -arg3 + 0.001f; + if (x_min < sp8.x && x_max > sp8.x && y_min < sp8.y && y_max > sp8.y && + -arg2 <= sp8.x && arg2 >= sp8.x && -arg3 <= sp8.y && arg3 >= sp8.y) { + arg0->x = sp8.x; + arg0->y = sp8.y; + return; + } + + sp8.x = arg2 - 0.001f; + sp8.y = (arg1->y * arg2) / arg1->x; + if (x_min < sp8.x && x_max > sp8.x && y_min < sp8.y && y_max > sp8.y && + -arg2 <= sp8.x && arg2 >= sp8.x && -arg3 <= sp8.y && arg3 >= sp8.y) { + *arg0 = sp8; + return; + } + + sp8.x = (arg1->x * arg3) / arg1->y; + sp8.y = arg3 - 0.001f; + if (x_min < sp8.x && x_max > sp8.x && y_min < sp8.y && y_max > sp8.y && + -arg2 <= sp8.x && arg2 >= sp8.x && -arg3 <= sp8.y && arg3 >= sp8.y) { + *arg0 = sp8; + return; + } + + sp8.x = 0.001f + -arg2; + sp8.y = (arg1->y * -arg2) / arg1->x; + *arg0 = sp8; +} + +// NONMATCHING - JMAFastSqrt inlining +void mReCPd::Pad::calcDpdOld() { + Vec2 sp8; + + field_0x1db0 = field_0x1da8; + sp8 = field_0x1db0; + if (field_0x0 != 0) { + bool var_r30 = false; + for (int i = 0; i < field_0x0; i++) { + if ((s32)(u32)field_0x4[i].dpd_valid_fg == 1 || (s32)(u32)field_0x4[i].dpd_valid_fg == 2) { + var_r30 = true; + sp8 = field_0x4[i].pos; + field_0x1d78 = sp8; + field_0x1d80 = field_0x4[i].vec; + break; + } + } + + if (var_r30 == 0) { + sp8.x = sp8.x + field_0x1d80.x; + sp8.y += field_0x1d80.y; + } + } + + f32 temp_f2 = mDoGph_gInf_c::getHeightF() / mDoGph_gInf_c::getWidthF(); + if (-1.0f < sp8.x && 1.0f > sp8.x && -temp_f2 < sp8.y && temp_f2 > sp8.y) { + field_0x1da8 = sp8; + } else { + calcDpdBox(&field_0x1da8, &sp8, 1.0f, temp_f2); + field_0x1d80.x = field_0x1d80.y = 0.0f; + } + + field_0x1db8 = field_0x1da8.x - field_0x1db0.x; + field_0x1dbc = field_0x1da8.y - field_0x1db0.y; + field_0x1dc0 = JMAFastSqrt(field_0x1db8 * field_0x1db8 + field_0x1dbc * field_0x1dbc); +} + +void mReCPd::enableDpd(u32 param_0) { + KPADEnableDPD(param_0); +} + +void mReCPd::disableDpd(u32 param_0) { + KPADDisableDPD(param_0); +} + +void mReCPd::Pad::calcDpd2DPos() { + Vec2 sp08 = field_0x1da8; + sp08.x += 1.0f; + f32 ratio = mDoGph_gInf_c::getWidthF() / mDoGph_gInf_c::getHeightF(); + int diff_x = (mDoGph_gInf_c::getMaxX() - mDoGph_gInf_c::getMinX()) >> 1; + m_dpd_2d_pos.x = diff_x * sp08.x + mDoGph_gInf_c::getMinX(); + int diff_y = (mDoGph_gInf_c::getMaxY() - mDoGph_gInf_c::getMinY()) >> 1; + m_dpd_2d_pos.y = diff_y + (ratio * (diff_y * sp08.y) + mDoGph_gInf_c::getMinY()); +} + +void mReCPd::Pad::calcDpdRatioPos() { + f32 ratio = mDoGph_gInf_c::getWidthF() / mDoGph_gInf_c::getHeightF(); + m_dpd_ratio_pos.x = field_0x1da8.x; + m_dpd_ratio_pos.y = field_0x1da8.y * ratio; +} + +void mReCPd::Pad::calcDpdPlayCirPos() { + Vec2 sp28 = field_0x1da8; + + f32 mag = JMAFastSqrt(sp28.x * sp28.x + sp28.y * sp28.y); + if (mag <= 0.3f) { + field_0x1d98 = 0.0f; + field_0x1d9c = 0.0f; + return; + } + + Vec2 sp20; + sp20.x = sp28.x / mag; + sp20.y = sp28.y / mag; + + Vec2 sp18; + sp18.x = fabsf(sp28.x / mag); + sp18.y = fabsf(sp20.y); + + f32 ratio = mDoGph_gInf_c::getHeightF() / mDoGph_gInf_c::getWidthF(); + + f32 var_f2; + if (cM3d_IsZero(sp18.x)) { + var_f2 = (mag - 0.3f) / (ratio - 0.3f); + } else if (sp18.y / sp18.x > ratio) { + Vec2 sp10; + sp10.x = ratio * (sp18.x / sp18.y); + sp10.y = ratio; + f32 mag2 = JMAFastSqrt(sp10.x * sp10.x + sp10.y * sp10.y); + var_f2 = (mag - 0.3f) / (mag2 - 0.3f); + if (var_f2 > 1.0f) { + var_f2 = 1.0f; + } + } else { + Vec2 sp08; + sp08.x = 1.0f; + sp08.y = sp18.y / sp18.x; + f32 mag2 = JMAFastSqrt(sp08.x * sp08.x + sp08.y * sp08.y); + var_f2 = (mag - 0.3f) / (mag2 - 0.3f); + if (var_f2 > 1.0f) { + var_f2 = 1.0f; + } + } + + field_0x1d98 = sp20.x * var_f2; + field_0x1d9c = sp20.y * var_f2; +} + +void mReCPd::Pad::calcDpdPlayBoxPos() { + Vec2 sp10 = m_dpd_ratio_pos; + Vec2 sp8 = sp10; + if (sp8.x < 0.0f) { + sp8.x *= -1.0f; + } + if (sp8.y < 0.0f) { + sp8.y *= -1.0f; + } + + f32 max; + if (sp8.x <= 0.5f && sp8.y <= 0.5f) { + max = 0.0f; + } else { + sp8.x = sp8.x - 0.5f; + sp8.y = sp8.y - 0.5f; + if (sp8.y > sp8.x) { + max = sp8.y / 0.5f; + } else { + max = sp8.x / 0.5f; + } + } + + f32 mag = JMAFastSqrt(sp10.x * sp10.x + sp10.y * sp10.y); + if (cM3d_IsZero(max) || cM3d_IsZero(mag)) { + mag = 1.0f; + } + + m_dpd_play_box_pos.x = sp10.x * max / mag; + m_dpd_play_box_pos.y = sp10.y * max / mag; +} + +void mReCPd::onConnect(u32 i_padNo) { + m_pad[i_padNo].field_0x1dd4 = 1; + m_pad[i_padNo].field_0x1e04 = 1; +} + +// NONMATCHING: stack restore order +static void l_mReCPd_extensionCallback(s32 i_padNo, s32 param_1) { + Z2AudioCS::extensionProcess(i_padNo, param_1); + mReCPd::m_pad[i_padNo].field_0x1dec = param_1; + mReCPd::m_pad[i_padNo].field_0x1df0 = 1; +} + +void mReCPd::setExtensionCallback() { + WPADSetExtensionCallback(0, l_mReCPd_extensionCallback); +} + +/*static*/ void l_mReCPd_connectCallback(s32 param_0, s32 param_1) { + switch (param_1) { + case 0: + mReCPd::m_pad[param_0].field_0x1e05 = 1; + WPADSetExtensionCallback(0, l_mReCPd_extensionCallback); + break; + case -1: + mReCPd::m_pad[param_0].field_0x1e05 = 0; + break; + } +} + +/*static*/ void l_mReCPd_connectCallbackForDisconnect(s32 param_0, s32 param_1) { + if (param_1 == 0) { + mReCPd::m_pad[param_0].field_0x1e05 = 1; + } +} + +void mReCPd::onGetInfoAsync(u32 i_padNo) { + m_pad[i_padNo].field_0x1ddd = 1; + m_pad[i_padNo].field_0x1de0 = 1800; +} + +static BOOL wpad_ok() { + OSThread* thread = OSGetCurrentThread(); + if (thread != NULL && thread->state == 2) { + return TRUE; + } else { + return FALSE; + } +} + +static void* wpad_alloc(u32 size) { + if (wpad_ok()) { + return wpad_heap->alloc(size, 0); + } + return FALSE; +} + +// NONMATCHING - string reference is wrong, probably needs -ipa program +static BOOL wpad_free(void* ptr) { + if (wpad_ok()) { + wpad_heap->free(ptr); + return TRUE; + } else { + OSReport_Warning("wpad_free %08x failed.\n", ptr); + return FALSE; + } +} + +void mReCPd::create() { + memset(m_pad_info, 0, 0x60); + wpad_heap = JKRHeap::sRootHeap2; + WPADRegisterAllocator(wpad_alloc, wpad_free); + KPADInit(); + KPADSetObjInterval(0.2f); + + for (int i = 0; i < 4; i++) { + KPADSetPosParam(i, 0.05f, 0.08f); + KPADSetAccParam(i, 0.1f, 0.55f); + } + + for (int i = 0; i < 4; i++) { + m_pad[i].clean(); + m_pad[i].cleanOneTime(); + m_pad[i].field_0x1dd0 = i; + } + + l_reset_requested = false; + m_cal_value = NULL; + + WPADSetConnectCallback(0, l_mReCPd_connectCallback); + WPADSetConnectCallback(1, l_mReCPd_connectCallbackForDisconnect); + WPADSetConnectCallback(2, l_mReCPd_connectCallbackForDisconnect); + WPADSetConnectCallback(3, l_mReCPd_connectCallbackForDisconnect); + WPADSetExtensionCallback(0, l_mReCPd_extensionCallback); + WPADSetAcceptConnection(1); + KPADSetFSStickClamp(0xF, 0x4E); + +#if PLATFORM_SHIELD + WPADSetAutoSleepTime(0); +#endif +} + +void mReCPd::startMoterWave(motorWave_t* wave, u8* param_1, bool param_2) { + wave->field_0x4 = ((param_1[0] << 8) & 0xFF00) | param_1[1]; + wave->field_0x0 = param_1 + 2; + wave->field_0x6 = 0; + wave->field_0x8 = param_2; +} + +void mReCPd::startMoterWave(int wave_idx, u8* param_1, bool param_2) { + startMoterWave(&m_motorWave[wave_idx], param_1, param_2); +} + +void mReCPd::stopMoterWave(motorWave_t* wave) { + if (wave->field_0x0 == 0) { + return; + } + + wave->field_0x6 = wave->field_0x4; + wave->field_0x8 = 0; +} + +void mReCPd::stopMoterWave(int wave_idx) { + stopMoterWave(&m_motorWave[wave_idx]); +} + +void mReCPd::updateMoterWave() { + motorWave_t* wave = &m_motorWave[0]; + for (int i = 0; i < WPAD_MAX_CONTROLLERS; i++, wave++) { + + if (wave->field_0x0 == NULL) { + break; + } + + if (wave->field_0x6 >= wave->field_0x4) { + if (wave->field_0x8 == 0) { + wave->field_0x0 = NULL; + WPADControlMotor(i, 0); + continue; + } + + wave->field_0x6 = 0; + } + + int temp1 = 0x80 >> (wave->field_0x6 & 0x7); + int temp2 = wave->field_0x0[wave->field_0x6 >> 3]; + int temp_r4 = temp1 & temp2; + WPADControlMotor(i, temp_r4 != 0); + wave->field_0x6++; + } +} + +void mReCPd::stopMoter() { + for (int i = 0; i < WPAD_MAX_CONTROLLERS; i++) { + WPADControlMotor(i, 0); + } +} + +BOOL mReCPd::getLowBat(u32 chan) { + return m_pad_info[chan].lowBat; +} + +void mReCPd::setLowBat(u32 chan, BOOL low_bat) { + m_pad_info[chan].lowBat = low_bat; +} + +void mReCPd::onLowBatChk(u32 chan) { + m_pad[chan].field_0x1ddc = true; +} + +void mReCPd_getInfoAsync(s32 chan, s32 param_1) { + mReCPd::onGetInfoAsync(chan); +} + +void mReCPd::procNoData(u32 chan) { + m_pad[chan].cleanTrig(); + + KPADStatus* status = &m_pad[chan].field_0x4[0]; + if (m_pad[chan].field_0x554 > 5) { + m_pad[chan].field_0x554 = 6; + status->ex_status.fs.stick.x = 0.0f; + status->ex_status.fs.stick.y = 0.0f; + } + + m_pad[chan].field_0x0 = 1; + f32 temp_x; + f32 temp_y; + f32 mult = 1.0f / 1.1f; + temp_x = status->pos.x * mult; + temp_y = status->pos.y * mult; + status->pos.x = temp_x + status->vec.x; + status->pos.y = temp_y + status->vec.y; +} + +// NONMATCHING - r17/r18 regswap, weird m_pad load issue +void mReCPd::read() { + if (m_pad[0].field_0x1e05 != 0) { + if (m_pad[0].field_0x1dd4 == 0) { + Z2AudioCS::connect(0); + onConnect(0); + } + } else { + if (m_pad[0].field_0x1dd4 != 0) { + Z2AudioCS::disconnect(0); + m_pad[0].clean(); + } + } + + for (int i = 1; i < WPAD_MAX_CONTROLLERS; i++) { + if (m_pad[i].field_0x1e05 != 0) { + if (m_pad[i].field_0x1dd4 == 0) { + onConnect(i); + } + m_pad[i].field_0x1e05 = 0; + } + } + + if (m_pad[0].field_0x1dd4 != 0) { + if (WPADGetAcceptConnection() != 0 && m_pad[0].field_0x1dd8 < 300) { + WPADSetAcceptConnection(FALSE); + } else { + if (WPADGetAcceptConnection() != 1) { + if (m_pad[0].field_0x1dd8 >= 300) { + WPADSetAcceptConnection(TRUE); + } + } + } + + if (m_pad[0].field_0x1ddc != 0) { + if ((m_pad[0].field_0x1e04 != 0 && m_pad[0].field_0x1e00 > 60) || m_pad[0].field_0x1e00 > 120) { + m_pad[0].field_0x1e00 = 0; + m_pad[0].field_0x1e04 = 0; + + if (WPADGetInfoAsync(0, &m_pad_info[0], mReCPd_getInfoAsync) != 0) { + onGetInfoAsync(0); + } + } else { + m_pad[0].field_0x1e00++; + } + } else { + m_pad[0].field_0x1e00 = 0; + } + + if (m_pad[0].field_0x1de0 <= 0) { + m_pad[0].field_0x1de0 = 0; + m_pad_info[0].lowBat = FALSE; + } else { + m_pad[0].field_0x1de0--; + } + } else { + if (WPADGetAcceptConnection() != TRUE) { + WPADSetAcceptConnection(TRUE); + } + } + + for (int i = 1; i < WPAD_MAX_CONTROLLERS; i++) { + if (m_pad[i].field_0x1dd4 != 0) { + m_pad[i].clean(); + WPADDisconnect(i); + } + } + + Pad* pad = &m_pad[0]; + u32* dev_type; + for (u32 i = 0; i < WPAD_MAX_CONTROLLERS; i++, pad++) { + dev_type = &m_pad[i].dev_type; + m_pad[i].field_0x1dfc = WPADProbe(i, dev_type); + if (m_pad[i].field_0x1dfc == 0 && *dev_type == WPAD_DEV_CORE) { + if (++m_pad[i].field_0x1df4 >= 20) { + m_pad[i].field_0x1df4 = 20; + } + } else { + m_pad[i].field_0x1df4 = 0; + } + + m_pad[i].field_0x1de4 = m_pad[i].field_0x1dec; + + if (m_pad[i].field_0x1df0 != 0) { + m_pad[i].field_0x1de8 = 1; + } + KPADSetSensorHeight(i, l_dif_y_tbl[m_cal_value + 2]); + KPADSetPosParam(i, 0.05f, 0.08f); + + daPy_py_c* player = static_cast(dComIfGp_getPlayer(0)); + if (player != NULL && player->checkWolfHowlDemoMode()) { + KPADSetAccParam(i, 0.1f, 0.35f); + } else { + KPADSetAccParam(i, 0.1f, 0.55f); + } + + // not sure if this aggregate is real, but it's the only way I can find to account for the + // extra stack space without breaking codegen + struct { + KPADStatus unused_0x0[RECPD_SAMPLING_BUF_COUNT]; + KPADStatus sampling_bufs[RECPD_SAMPLING_BUF_COUNT]; + } unk_buf_struct; + int read_count = KPADRead(i, unk_buf_struct.sampling_bufs, + ARRAY_SIZE(unk_buf_struct.sampling_bufs)); + m_pad[i].field_0x0 = 0; + for (int j = 0; j < read_count; j++) { + if (unk_buf_struct.sampling_bufs[j].wpad_err == WPAD_ERR_OK) { + m_pad[i].field_0x4[m_pad[i].field_0x0] = unk_buf_struct.sampling_bufs[j]; + m_pad[i].field_0x0++; + } + } + + if (m_pad[i].field_0x0 == 0) { + m_pad[i].field_0x554++; + procNoData(i); + } else { + m_pad[i].field_0x554 -= 2; + if (m_pad[i].field_0x554 > 0) { + procNoData(i); + } else { + m_pad[i].field_0x554 = 0; + m_pad[i].field_0x558 = m_pad[i].field_0x4[0]; + } + } + + if (m_pad[i].field_0x0 != 0) { + if (m_pad[i].field_0x1de4 != 1) { + for (int j = 0; j < m_pad[i].field_0x0; j++) { + KPADStatus* status = &m_pad[i].field_0x4[j]; + status->hold &= ~0x6000; + status->trig &= ~0x6000; + status->release &= ~0x6000; + status->ex_status.fs.stick.x = 0.0f; + status->ex_status.fs.stick.y = 0.0f; + status->ex_status.fs.acc.x = 0.0f; + status->ex_status.fs.acc.y = 0.0f; + status->ex_status.fs.acc_value = 0.0f; + status->ex_status.fs.acc_speed = 0.0f; + } + } + + for (int j = 0; j < m_pad[i].field_0x0; j++) { + KPADStatus* status = &m_pad[i].field_0x4[j]; + status->pos.x *= 1.1f; + status->pos.y *= 1.1f; + } + + if (--m_pad[i].m_swingBlock < 0) { + m_pad[i].m_swingBlock = 0; + } + + if (getKPADAccValueMax(i) > 1.3f) { + m_pad[i].m_swingBlock = 10; + } + + Pad::Acc* rem_acc = &m_pad[i].m_remAcc; + calcUnderVec(rem_acc, getKPADAccValueMax(i)); + m_pad[i].copyRemAcc(); + rem_acc->calcSttsRem(); + m_pad[i].calcDpdOld(); + m_pad[i].calcDpd2DPos(); + m_pad[i].calcDpdRatioPos(); + m_pad[i].calcDpdPlayCirPos(); + m_pad[i].calcDpdPlayBoxPos(); + + if (*dev_type == WPAD_DEV_FS) { + KPADEXStatus& ex_status = m_pad[i].field_0x4[0].ex_status; + + m_pad[i].m_stick3D = ex_status.fs.stick; + + m_pad[i].m_stick3D.x *= -1.0f; + Vec2& stick = ex_status.fs.stick; + m_pad[i].m_stickValue = JMAFastSqrt(stick.x * stick.x + stick.y * stick.y); + m_pad[i].m_stickValue *= 1.0005003f; + if (m_pad[i].m_stickValue > 1.0f) { + m_pad[i].m_stickValue = 1.0f; + } + + if (m_pad[i].m_stickValue > 0.0f) { + if (ex_status.fs.stick.y == 0.0f) { + if (ex_status.fs.stick.x > 0.0f) { + m_pad[i].m_stickAngle = 0x4000; + } else { + m_pad[i].m_stickAngle = -0x4000; + } + } else { + m_pad[i].m_stickAngle = + RAD2S((f32)atan2(ex_status.fs.stick.x, -ex_status.fs.stick.y)); + } + } + + m_pad[i].m_stick3DAngle = m_pad[i].m_stickAngle; + m_pad[i].m_stick3DAngle *= -1; + + Pad::Acc* fs_acc = &m_pad[i].m_FSAcc; + calcUnderVec(fs_acc, getKPADFSAccValueMax(i)); + m_pad[i].copyFSAcc(); + fs_acc->calcSttsFs(); + } else { + m_pad[i].m_stick3D.x = 0.0f; + m_pad[i].m_stick3D.y = 0.0f; + m_pad[i].m_stickValue = 0.0f; + } + } + + if (read_count != 0) { + m_pad[i].field_0x1dd8 = 0; + } else if (++m_pad[i].field_0x1dd8 > 300) { + m_pad[i].field_0x1dd8 = 300; + m_pad[i].cleanHold(); + m_pad[i].cleanRelease(); + + for (u32 j = 0; j < ARRAY_SIZE(m_pad[i].field_0x4); j++) { + m_pad[i].field_0x4[j].ex_status.fs.stick.x = 0.0f; + m_pad[i].field_0x4[j].ex_status.fs.stick.y = 0.0f; + m_pad[i].field_0x4[j].ex_status.fs.acc.x = 0.0f; + m_pad[i].field_0x4[j].ex_status.fs.acc.y = 0.0f; + m_pad[i].field_0x4[j].ex_status.fs.acc_value = 0.0f; + m_pad[i].field_0x4[j].ex_status.fs.acc_speed = 0.0f; + } + + m_pad[i].m_stick3D.x = 0.0f; + m_pad[i].m_stick3D.y = 0.0f; + m_pad[i].m_stickValue = 0.0f; + m_pad[i].cleanTrig(); + } + + m_pad[i].clearUpDown(); + } + + if (OSGetResetButtonState() != 0) { + l_reset_requested = true; + } else { + if (l_reset_requested == true) { + mDoRst_resetCallBack(-1, NULL); + } + l_reset_requested = false; + } +} + +// NONMATCHING - float regalloc +f32 mReCPd::calibrateDist(int param_0) { + f32 var_f31 = mDoGph_gInf_c::getWidthF() / (param_0 / (6.0f / 25.0f)); + f32 max = 10000.0f; + f32 min = 0.0f; + f32 temp_f1_0 = WPADGetDpdSensitivity() + 1.0f; + f32 var_f23 = (temp_f1_0 - 0.5f) / 50.0f; + f32 temp_f1_1 = 1.0f - fabsf(l_dif_y_tbl[m_cal_value + 2]); + + for (int i = 0; i < 50; i++) { + f32 var_f22 = i * var_f23; + f32 var_f26 = cM_atan2f(var_f31, var_f22); + f32 temp_f1_2 = cM_atan2f(temp_f1_1 * 0.2f / 2.0f, var_f22); + f32 var_f0_0 = fabsf(var_f26 - (DEG_TO_RAD(21) - temp_f1_2)); + if (max > var_f0_0) { + max = var_f0_0; + min = var_f22; + } + } + + if (min < 1.0f) { + min = 1.0f; + } + + return min; +} + +Vec2& mReCPd::getDpd2DPos(u32 chan) { + return m_pad[chan].m_dpd_2d_pos; +} + +Vec2& mReCPd::getDpdRatioPos(u32 chan) { + return m_pad[chan].m_dpd_ratio_pos; +} + +Vec2& mReCPd::getDpdPlayBoxPos(u32 chan) { + return m_pad[chan].m_dpd_play_box_pos; +} + +BOOL mReCPd::chkDpdOk(u32 chan) { + return TRUE; +} + +BOOL mReCPd::chkDpdValid(u32 chan) { + BOOL result = TRUE; + BOOL valid = m_pad[chan].field_0x4[0].dpd_valid_fg; + if (valid != 1 && valid != 2) { + result = FALSE; + } + return result; +} + +BOOL mReCPd::chkDpdPosIn(u32 chan) { + Pad* pad = &m_pad[chan]; + + if (pad->field_0x0 == 0) { + return 0; + } + + if (!chkDpdValid(chan)) { + return 0; + } + + f32 ratio = mDoGph_gInf_c::getHeightF() / mDoGph_gInf_c::getWidthF(); + Vec2 pos = pad->field_0x4[0].pos; + + if (pos.x < -1.0f) { + return 0; + } + if (pos.x > 1.0f) { + return 0; + } + if (pos.y < -ratio) { + return 0; + } + if (pos.y > ratio) { + return 0; + } + + return chkDpdValid(chan); +} + +void mReCPd::getKPADAcc(u32 chan, Vec* param_1, int param_2) { + if (m_pad[chan].field_0x0 == 0) { + param_1->x = 0.0f; + param_1->y = 0.0f; + param_1->z = 0.0f; + } else { + if (param_2 >= m_pad[chan].field_0x0) { + param_2 = m_pad[chan].field_0x0 - 1; + } + *param_1 = m_pad[chan].field_0x4[param_2].acc; + } +} + +s16 mReCPd::getAngleXy(u32 chan) { + f32 x = m_pad[chan].field_0x4[0].acc.x; + f32 y = m_pad[chan].field_0x4[0].acc.y; + if (x > 1.0f) { + x = 1.0f; + } else if (x < -1.0f) { + x = -1.0f; + } + if (y > 1.0f) { + y = 1.0f; + } else if (y < -1.0f) { + y = -1.0f; + } + return cM_atan2s(x, -y); +} + +s16 mReCPd::getAngleZy(u32 chan) { + f32 z = m_pad[chan].field_0x4[0].acc.z; + f32 y = m_pad[chan].field_0x4[0].acc.y; + if (z > 1.0f) { + z = 1.0f; + } else if (z < -1.0f) { + z = -1.0f; + } + if (y > 1.0f) { + y = 1.0f; + } else if (y < -1.0f) { + y = -1.0f; + } + return cM_atan2s(z, -y); +} + +f32 mReCPd::getKPADAccValue(u32 chan, int param_1) { + int temp_r3 = m_pad[chan].field_0x0; + if (temp_r3 == 0) { + return 0.0f; + } + + int status_idx = param_1; + if (status_idx >= temp_r3) { + status_idx = temp_r3 - 1; + } + + return m_pad[chan].field_0x4[status_idx].acc_value; +} + +f32 mReCPd::getKPADAccValueMax(u32 chan) { + f32 max = 0.0f; + if (m_pad[chan].field_0x0 == 0) { + return max; + } + + for (int i = 0; i < m_pad[chan].field_0x0; i++) { + f32 cur_val = getKPADAccValue(chan, i); + if (max < cur_val) { + max = cur_val; + } + } + + return max; +} + +f32 mReCPd::getKPADAccSpeed(u32 chan, int param_1) { + int temp_r3 = m_pad[chan].field_0x0; + if (temp_r3 == 0) { + return 0.0f; + } + + int status_idx = param_1; + if (status_idx >= temp_r3) { + status_idx = temp_r3 - 1; + } + + return m_pad[chan].field_0x4[status_idx].acc_speed; +} + +f32 mReCPd::getKPADAccSpeedMax(u32 chan) { + f32 max = 0.0f; + if (m_pad[chan].field_0x0 == 0) { + return max; + } + + for (int i = 0; i < m_pad[chan].field_0x0; i++) { + f32 cur_val = getKPADAccSpeed(chan, i); + if (max < cur_val) { + max = cur_val; + } + } + + return max; +} + +f32 mReCPd::getKPADFSAccValue(u32 chan, int param_1) { + int temp_r3 = m_pad[chan].field_0x0; + if (temp_r3 == 0) { + return 0.0f; + } + + int status_idx = param_1; + if (status_idx >= temp_r3) { + status_idx = temp_r3 - 1; + } + + return m_pad[chan].field_0x4[status_idx].ex_status.fs.acc_value; +} + +f32 mReCPd::getKPADFSAccValueMax(u32 chan) { + f32 max = 0.0f; + if (m_pad[chan].field_0x0 == 0) { + return max; + } + + for (int i = 0; i < m_pad[chan].field_0x0; i++) { + f32 cur_val = getKPADFSAccValue(chan, i); + if (max < cur_val) { + max = cur_val; + } + } + + return max; +} + +s16 mReCPd::getFSStickAngle3DRev(u32 chan) { + return m_pad[chan].m_stick3DAngle; +} + +void mReCPd::calcUnderVec(Pad::Acc* acc_p, f32 param_1) { + JMAFastSqrt(acc_p->field_0x0[0].x * acc_p->field_0x0[0].x + + acc_p->field_0x0[0].y * acc_p->field_0x0[0].y + + acc_p->field_0x0[0].z * acc_p->field_0x0[0].z); + + if (param_1 <= 1.1f && acc_p->field_0x0[0].y < 0.35f) { + int temp_r0 = acc_p->field_0xb64 + 1; + acc_p->field_0xb64 = temp_r0; + if (temp_r0 >= 6) { + acc_p->field_0xb64 = 6; + acc_p->field_0xb58 = acc_p->field_0x0[0]; + + Vec sp20 = {0.0f, -1.0f, 0.0f}; + if (cM3d_IsZero(PSVECSquareMag(&acc_p->field_0xb58)) == 0) { + Vec sp14; + Vec sp8 = acc_p->field_0xb58; + PSVECNormalize(&sp8, &sp8); + PSVECCrossProduct(&sp8, &sp20, &sp14); + f32 dot = PSVECDotProduct(&sp8, &sp20); + if (cM3d_IsZero(PSVECSquareMag(&sp14)) == 0) { + PSVECNormalize(&sp14, &sp14); + PSMTXRotAxisRad(acc_p->field_0xb68, &sp14, acos(dot)); + return; + } + PSMTXIdentity(acc_p->field_0xb68); + return; + } + PSMTXIdentity(acc_p->field_0xb68); + } + } else { + acc_p->field_0xb64 = 0; + } +} + +u32 mReCPd::getHoldB(u32 i_padNo) { + return m_pad[i_padNo].field_0x4[0].hold & WPAD_BUTTON_B; +} + +u32 mReCPd::getHoldMinus(u32 i_padNo) { + if (chkSwingBlock(i_padNo)) { + return 0; + } else { + return m_pad[i_padNo].field_0x4[0].hold & WPAD_BUTTON_MINUS; + } +} + +u32 mReCPd::getHoldPlus(u32 i_padNo) { + if (chkSwingBlock(i_padNo)) { + return 0; + } else { + return m_pad[i_padNo].field_0x4[0].hold & WPAD_BUTTON_PLUS; + } +} + +u32 mReCPd::getHoldZ1(u32 i_padNo) { + return m_pad[i_padNo].field_0x4[0].hold & WPAD_BUTTON_Z; +} + +u32 mReCPd::getTrigB(u32 i_padNo) { + return m_pad[i_padNo].field_0x4[0].trig & WPAD_BUTTON_B; +} + +u32 mReCPd::getTrigMinus(u32 i_padNo) { + if (chkSwingBlock(i_padNo)) { + return 0; + } else { + return m_pad[i_padNo].field_0x4[0].trig & WPAD_BUTTON_MINUS; + } +} + +u32 mReCPd::getTrigHome(u32 i_padNo) { + if (chkSwingBlock(i_padNo)) { + return 0; + } else { + return m_pad[i_padNo].field_0x4[0].trig & WPAD_BUTTON_HOME; + } +} + +u32 mReCPd::getTrigPlus(u32 i_padNo) { + if (chkSwingBlock(i_padNo)) { + return 0; + } else { + return m_pad[i_padNo].field_0x4[0].trig & WPAD_BUTTON_PLUS; + } +} + +u32 mReCPd::getTrigZ1(u32 i_padNo) { + return m_pad[i_padNo].field_0x4[0].trig & WPAD_BUTTON_Z; +} + +u32 mReCPd::chkSwingBlock(u32 i_padNo) { + if (m_pad[i_padNo].m_swingBlock > 0) { + return TRUE; + } else { + return FALSE; + } +} + +u32 mReCPd::getTrigSwing(u32 i_padNo) { + return m_pad[i_padNo].m_remAcc.m_swing; +} + +Vec2& mReCPd::getSwingVec(u32 i_padNo) { + return m_pad[i_padNo].m_remAcc.m_swingVec; +} + +u32 mReCPd::chkSimpleProbe(u32 i_padNo) { + if (m_pad[i_padNo].field_0x1dd4 == 0) { + return 0; + } else { + u32 field_0x1dfc = m_pad[i_padNo].field_0x1dfc; + u32 field_0x1df8 = m_pad[i_padNo].dev_type; + if (field_0x1dfc + 3 <= 2) { + return 0; + } else if (field_0x1df8 == 0xFD || field_0x1df8 == 0xFF) { + return 0; + } else { + return 1; + } + } +} + +BOOL mReCPd::chkDevTypeValid(u32 i_padNo) { + if (!chkSimpleProbe(i_padNo)) { + return FALSE; + } + + Pad* pad = &m_pad[i_padNo]; + if (pad->field_0x1df4 < 20 && + pad->field_0x1de4 == 0xFF && + pad->field_0x1de8 != 0) { + return FALSE; + } + + return TRUE; +} + +u32 mReCPd::getFSTrigSwing(u32 i_padNo) { + return m_pad[i_padNo].m_FSAcc.m_swing; +} + +void mReCPd::plusCalValue() { + m_cal_value++; + if (m_cal_value >= 2) { + m_cal_value = 2; + } +} + +void mReCPd::minusCalValue() { + m_cal_value--; + if (m_cal_value <= -2) { + m_cal_value = -2; + } +}