From c458e6c466989d4bb525b254b44c54b4de95310a Mon Sep 17 00:00:00 2001 From: Soniccd123 <> Date: Mon, 16 Dec 2024 22:25:03 -0300 Subject: [PATCH 01/10] Implement dual stick, new bindings Create bindings options for PS2 and Xbox like controll schemes, PS2 and Xbox bindings for dual stick --- src/core/Pad.cpp | 1115 ++++++++++++++++++++++++++++++++-------------- src/core/Pad.h | 4 +- 2 files changed, 788 insertions(+), 331 deletions(-) mode change 100644 => 100755 src/core/Pad.cpp diff --git a/src/core/Pad.cpp b/src/core/Pad.cpp old mode 100644 new mode 100755 index e1e5913f..f6bf68d1 --- a/src/core/Pad.cpp +++ b/src/core/Pad.cpp @@ -1433,35 +1433,52 @@ void CPad::Update(int16 pad) #endif { #ifdef RW_DC - if (pad == 0) { + + + CPad::IsDualAnalog = cont_has_capabilities(contMaple, CONT_CAPABILITIES_DUAL_ANALOG); //Query controller about Dual analog capabilities + + if (pad == 0) + { NewState.DPadUp = state->dpad_up; //This part could be inside a compiler directive to preserve the old code and just use this block if compil NewState.DPadDown = state->dpad_down; //I also changed CControllerState inside Pad.h and created these values for DC controllers NewState.DPadLeft = state->dpad_left; NewState.DPadRight = state->dpad_right; NewState.A = state->a; NewState.B = state->b; + NewState.C = state->c; + NewState.D = state->d; NewState.X = state->x; NewState.Y = state->y; + NewState.Z = state->z; NewState.Start = state->start; NewState.RightTrigger = state->rtrig; NewState.LeftTrigger = state->ltrig; NewState.LeftStickX = state->joyx; NewState.LeftStickY = state->joyy; + NewState.RightStickX = state->joy2x; + NewState.RightStickY = state->joy2y; NewState.RightShock = state->dpad_left; - } else { + } + + else + { NewState.DPadUp = 0; NewState.DPadDown = 0; NewState.DPadLeft = 0; NewState.DPadRight = 0; NewState.A = 0; NewState.B = 0; + NewState.C = 0; + NewState.D = 0; NewState.X = 0; NewState.Y = 0; + NewState.Z = 0; NewState.Start = 0; NewState.RightTrigger = 0; NewState.LeftTrigger = 0; NewState.LeftStickX = 0; NewState.LeftStickY = 0; + NewState.RightShock = 0; } #else NewState = ReconcileTwoControllersInput(PCTempKeyState, PCTempJoyState); @@ -1579,10 +1596,33 @@ int16 CPad::GetSteeringLeftRight(void) return 0; #ifdef RW_DC - if (NewState.X) - return 0; -#endif + switch (CPad::GetPad(0)->Mode) + { + case 0: //Xbox Mode + if (CPad::GetPad(0)->IsDualAnalog) + { + return NewState.LeftStickX; + } + else + { + if (NewState.X) + return 0; + return NewState.LeftStickX; + } + case 1: //PS2 Mode + if (CPad::GetPad(0)->IsDualAnalog) + { + return NewState.LeftStickX; + } + else + { + if (NewState.LeftTrigger > 128) + return 0; + return NewState.LeftStickX; + } + } +#else switch (CURMODE) { case 0: @@ -1607,6 +1647,7 @@ int16 CPad::GetSteeringLeftRight(void) break; } } +#endif return 0; } @@ -1617,10 +1658,33 @@ int16 CPad::GetSteeringUpDown(void) return 0; #ifdef RW_DC - if (NewState.X) - return 0; -#endif + switch (CPad::GetPad(0)->Mode) + { + case 0: //Xbox Mode + if (CPad::GetPad(0)->IsDualAnalog) + { + return NewState.LeftStickY; + } + else + { + if (NewState.X) + return 0; + return NewState.LeftStickY; + } + case 1: //PS2 Mode + if (CPad::GetPad(0)->IsDualAnalog) + { + return NewState.LeftStickY; + } + else + { + if (NewState.LeftTrigger > 128) + return 0; + return NewState.LeftStickY; + } + } +#else switch (CURMODE) { case 0: @@ -1645,7 +1709,7 @@ int16 CPad::GetSteeringUpDown(void) break; } } - +#endif return 0; } @@ -1655,29 +1719,40 @@ int16 CPad::GetCarGunUpDown(void) return 0; #ifdef RW_DC - if (!NewState.X) - return 0; -#endif + switch (CPad::GetPad(0)->Mode) + { + case 0: //Xbox Mode + if (CPad::GetPad(0)->IsDualAnalog) + { + return NewState.RightStickY; + } + else + { + if (!NewState.X) + return 0; + return NewState.LeftStickY; + break; + } + case 1: //PS2 Mode + if (CPad::GetPad(0)->IsDualAnalog) + { + return NewState.RightStickY; + } + else + { + if (NewState.LeftTrigger > 128) + return NewState.LeftStickY; + return 0; + break; + } + + } +#else switch (CURMODE) { case 0: - case 1: -#ifdef RW_DC - case 2: - { - return NewState.LeftStickY; - - break; - } - case 3: - { - return NewState.LeftStickY; - - break; - } - -#else + case 1: case 2: { return NewState.RightStickY; @@ -1690,8 +1765,8 @@ int16 CPad::GetCarGunUpDown(void) break; } -#endif } +#endif return 0; } @@ -1700,43 +1775,56 @@ int16 CPad::GetCarGunLeftRight(void) { if ( ArePlayerControlsDisabled() ) return 0; + #ifdef RW_DC - if (!NewState.X) - return 0; -#endif + switch (CPad::GetPad(0)->Mode) + { + case 0: //Xbox Mode + if (CPad::GetPad(0)->IsDualAnalog) + { + return NewState.RightStickX; + } + else + { + if (!NewState.X) + return 0; + return NewState.LeftStickX; + break; + } + case 1: //PS2 Mode + if (CPad::GetPad(0)->IsDualAnalog) + { + return NewState.RightStickX; + } + else + { + if (NewState.LeftTrigger > 128) + return NewState.LeftStickX; + return 0; + break; + } + + } +#else switch (CURMODE) { case 0: - case 1: -#ifdef RW_DC + case 1: case 2: { - return NewState.LeftStickX; - - break; - } - case 3: - { - return NewState.LeftStickX; - - break; - } -#else - case 2: - { - return NewState.RightStickX; + return NewState.RightStickY; break; } case 3: { - return (NewState.DPadRight - NewState.DPadLeft) / 2; + return (NewState.DPadUp - NewState.DPadDown) / 2; break; } -#endif } +#endif return 0; } @@ -1747,21 +1835,35 @@ int16 CPad::GetPedWalkLeftRight(void) return 0; #ifdef RW_DC - if (NewState.X) - return 0; -#endif - + switch (CPad::GetPad(0)->Mode) + { + case 0: //Xbox Mode + if (CPad::GetPad(0)->IsDualAnalog) + { + return NewState.LeftStickX; + } + else + { + if (NewState.X) + return 0; + return NewState.LeftStickX; + } + case 1: //PS2 Mode + if (CPad::GetPad(0)->IsDualAnalog) + { + return NewState.LeftStickX; + } + else + { + if (NewState.LeftTrigger > 128) + return 0; + return NewState.LeftStickX; + } + } +#else switch (CURMODE) { case 0: -#ifdef RW_DC - case 2: - { - return NewState.LeftStickX; - - break; - } -#else case 2: { int16 axis = NewState.LeftStickX; @@ -1774,7 +1876,6 @@ int16 CPad::GetPedWalkLeftRight(void) break; } -#endif case 1: case 3: { @@ -1783,6 +1884,7 @@ int16 CPad::GetPedWalkLeftRight(void) break; } } +#endif return 0; } @@ -1794,21 +1896,35 @@ int16 CPad::GetPedWalkUpDown(void) return 0; #ifdef RW_DC - if (NewState.X) - return 0; -#endif - + switch (CPad::GetPad(0)->Mode) + { + case 0: //Xbox Mode + if (CPad::GetPad(0)->IsDualAnalog) + { + return NewState.LeftStickY; + } + else + { + if (NewState.X) + return 0; + return NewState.LeftStickY; + } + case 1: //PS2 Mode + if (CPad::GetPad(0)->IsDualAnalog) + { + return NewState.LeftStickY; + } + else + { + if (NewState.LeftTrigger > 128) + return 0; + return NewState.LeftStickY; + } + } +#else switch (CURMODE) { case 0: -#ifdef RW_DC - case 2: - { - return NewState.LeftStickY; - - break; - } -#else case 2: { int16 axis = NewState.LeftStickY; @@ -1821,7 +1937,6 @@ int16 CPad::GetPedWalkUpDown(void) break; } -#endif case 1: case 3: { @@ -1830,6 +1945,7 @@ int16 CPad::GetPedWalkUpDown(void) break; } } +#endif return 0; } @@ -1873,11 +1989,41 @@ int16 CPad::GetAnalogueUpDown(void) } bool CPad::GetLookLeft(void) -{ +{ if ( ArePlayerControlsDisabled() ) return false; +#ifdef RW_DC + switch (CPad::GetPad(0)->Mode) + { + case 0: //Xbox Mode + if (CPad::GetPad(0)->IsDualAnalog) + { + return !!(NewState.Z && !NewState.Z); + } + else + { + if (NewState.A) + return CPad::GetPad(0)->GetAnaloguePadLeft(); + } + case 1: //PS2 Mode + if (CPad::GetPad(0)->IsDualAnalog) + { + if (NewState.LeftTrigger > 128) + return true; + } + else + { + if (NewState.B) + return CPad::GetPad(0)->GetAnaloguePadLeft(); + } + } +#else + return !!(NewState.LeftShoulder2 && !NewState.RightShoulder2); + +#endif + } bool CPad::GetLookRight(void) @@ -1885,7 +2031,37 @@ bool CPad::GetLookRight(void) if ( ArePlayerControlsDisabled() ) return false; +#ifdef RW_DC + switch (CPad::GetPad(0)->Mode) + { + case 0: //Xbox Mode + if (CPad::GetPad(0)->IsDualAnalog) + { + return !!(NewState.C && !NewState.C); + } + else + { + if (NewState.A) + return CPad::GetPad(0)->GetAnaloguePadRight(); + } + case 1: //PS2 Mode + if (CPad::GetPad(0)->IsDualAnalog) + { + if (NewState.RightTrigger > 128) + return true; + } + else + { + if (NewState.B) + return CPad::GetPad(0)->GetAnaloguePadRight(); + } + } +#else + return !!(NewState.RightShoulder2 && !NewState.LeftShoulder2); + +#endif + } @@ -1894,17 +2070,71 @@ bool CPad::GetLookBehindForCar(void) if ( ArePlayerControlsDisabled() ) return false; +#ifdef RW_DC + switch (CPad::GetPad(0)->Mode) + { + case 0: //Xbox Mode + if (CPad::GetPad(0)->IsDualAnalog) + { + if (NewState.C && NewState.Z) //Consider someway to make it work with RS or LS in dual analog + return true; + } + else + { + if (NewState.RightTrigger > 128 && NewState.LeftTrigger > 128) + return true; + } + case 1: //PS2 Mode + if (CPad::GetPad(0)->IsDualAnalog) + { + if (NewState.RightTrigger > 128 && NewState.LeftTrigger > 128) //Consider someway to make it work with RS or LS in dual analog + return true; + } + else + { + if (NewState.RightTrigger > 128 && NewState.LeftTrigger > 128) + return true; + } + } +#else + return !!(NewState.RightShoulder2 && NewState.LeftShoulder2); + +#endif + } bool CPad::GetLookBehindForPed(void) { if ( ArePlayerControlsDisabled() ) return false; + #ifdef RW_DC - return NewState.DPadDown; + switch (CPad::GetPad(0)->Mode) + { + case 0: //Xbox Mode + if (CPad::GetPad(0)->IsDualAnalog) + { + return NewState.DPadDown; //Consider someway to make it work with RS and LS + } + else + { + return NewState.DPadDown; + } + case 1: //PS2 Mode + if (CPad::GetPad(0)->IsDualAnalog) + { + return NewState.DPadDown; //Consider someway to make it work with RS and LS + } + else + { + return NewState.DPadDown; + } + } #else + return !!NewState.RightShock; + #endif } @@ -1913,34 +2143,31 @@ bool CPad::GetHorn(void) if ( ArePlayerControlsDisabled() ) return false; +#ifdef RW_DC + switch (CPad::GetPad(0)->Mode) + { + case 0: //Xbox Mode + if (CPad::GetPad(0)->IsDualAnalog) + { + return NewState.DPadDown; //Consider someway to make it work with RS and LS + } + else + { + return NewState.DPadDown; + } + case 1: //PS2 Mode + if (CPad::GetPad(0)->IsDualAnalog) + { + return NewState.DPadDown; //Consider someway to make it work with RS and LS + } + else + { + return NewState.DPadDown; + } + } +#else switch (CURMODE) { -#ifdef RW_DC - case 0: - { - return !!NewState.DPadRight; - - break; - } - case 1: - { - return !!NewState.DPadRight; - - break; - } - case 2: - { - return !!NewState.DPadRight; - - break; - } - case 3: - { - return !!NewState.DPadRight; - - break; - } -#else case 0: { return !!NewState.LeftShock; @@ -1968,8 +2195,8 @@ bool CPad::GetHorn(void) break; } -#endif } +#endif return false; } @@ -2019,25 +2246,34 @@ bool CPad::GetCarGunFired(void) if ( ArePlayerControlsDisabled() ) return false; +#ifdef RW_DC + switch (CPad::GetPad(0)->Mode) + { + case 0: //Xbox Mode + if (CPad::GetPad(0)->IsDualAnalog) + { + return NewState.A; + } + else + { + return NewState.A; + } + case 1: //PS2 Mode + if (CPad::GetPad(0)->IsDualAnalog) + { + return NewState.B; + } + else + { + return NewState.B; + } + } +#else + switch (CURMODE) { case 0: case 1: -#ifdef RW_DC - case 2: - { - return !!NewState.A; - - break; - } - - case 3: - { - return !!NewState.A; - - break; - } -#else case 2: { return !!NewState.Circle; @@ -2051,9 +2287,10 @@ bool CPad::GetCarGunFired(void) break; } -#endif } +#endif + return false; } @@ -2062,25 +2299,34 @@ bool CPad::CarGunJustDown(void) if ( ArePlayerControlsDisabled() ) return false; +#ifdef RW_DC + switch (CPad::GetPad(0)->Mode) + { + case 0: //Xbox Mode + if (CPad::GetPad(0)->IsDualAnalog) + { + return NewState.A; + } + else + { + return NewState.A; + } + case 1: //PS2 Mode + if (CPad::GetPad(0)->IsDualAnalog) + { + return NewState.B; + } + else + { + return NewState.B; + } + } + +#else switch (CURMODE) { case 0: case 1: -#ifdef RW_DC - case 2: - { - return !!NewState.A; - - break; - } - - case 3: - { - return !!NewState.A; - - break; - } -#else case 2: { return !!(NewState.Circle && !OldState.Circle); @@ -2094,8 +2340,8 @@ bool CPad::CarGunJustDown(void) break; } -#endif } +#endif return false; } @@ -2105,31 +2351,32 @@ int16 CPad::GetHandBrake(void) if ( ArePlayerControlsDisabled() ) return 0; +#ifdef RW_DC + switch (CPad::GetPad(0)->Mode) + { + case 0: //Xbox Mode + if (CPad::GetPad(0)->IsDualAnalog) + { + return NewState.B; + } + else + { + return NewState.B; + } + case 1: //PS2 Mode + if (CPad::GetPad(0)->IsDualAnalog) + { + return NewState.C; + } + else + { + if (NewState.RightTrigger > 128) + return true; + } + } +#else switch (CURMODE) { -#ifdef RW_DC - case 0: - case 1: - { - return NewState.B; - - break; - } - - case 2: - { - return NewState.B; - - break; - } - - case 3: - { - return NewState.B; - - break; - } -#else case 0: case 1: { @@ -2151,8 +2398,8 @@ int16 CPad::GetHandBrake(void) break; } -#endif } +#endif return 0; } @@ -2162,36 +2409,31 @@ int16 CPad::GetBrake(void) if ( ArePlayerControlsDisabled() ) return 0; +#ifdef RW_DC + switch (CPad::GetPad(0)->Mode) + { + case 0: //Xbox Mode + if (CPad::GetPad(0)->IsDualAnalog) + { + return NewState.LeftTrigger; + } + else + { + return NewState.LeftTrigger; + } + case 1: //PS2 Mode + if (CPad::GetPad(0)->IsDualAnalog) + { + return NewState.X; + } + else + { + return NewState.X; + } + } +#else switch (CURMODE) { -#ifdef RW_DC - case 0: - case 2: - { - return NewState.LeftTrigger; - - break; - } - - case 1: - { - return NewState.LeftTrigger; - - break; - } - - case 3: - { - int16 axis = 2 * NewState.LeftTrigger; - - if ( axis < 0 ) - return 0; - else - return axis; - - break; - } -#else case 0: case 2: { @@ -2219,7 +2461,7 @@ int16 CPad::GetBrake(void) break; } #endif - } + return 0; } @@ -2316,34 +2558,36 @@ int32 CPad::GetWeapon(void) if ( ArePlayerControlsDisabled() ) return false; +#ifdef RW_DC + + switch (CPad::GetPad(0)->Mode) + { + case 0: //Xbox Mode + if (CPad::GetPad(0)->IsDualAnalog) + { + if (NewState.RightTrigger > 128) + return true; + } + else + { + if (NewState.RightTrigger > 128) + return true; + } + case 1: //PS2 Mode + if (CPad::GetPad(0)->IsDualAnalog) + { + return NewState.B; + } + else + { + return NewState.B; + } + } + +#else switch (CURMODE) { case 0: -#ifdef RW_DC - case 1: - { - if (NewState.RightTrigger > 128) - return true; - - break; - } - - case 2: - { - if (NewState.RightTrigger > 128) - return true; - - break; - } - - case 3: - { - if (NewState.RightTrigger > 128) - return true; - - break; - } -#else case 1: { return NewState.Circle; @@ -2358,9 +2602,10 @@ int32 CPad::GetWeapon(void) { return NewState.RightShoulder1; } -#endif } +#endif + return false; } @@ -2369,34 +2614,36 @@ bool CPad::WeaponJustDown(void) if ( ArePlayerControlsDisabled() ) return false; +#ifdef RW_DC + + switch (CPad::GetPad(0)->Mode) + { + case 0: //Xbox Mode + if (CPad::GetPad(0)->IsDualAnalog) + { + if (NewState.RightTrigger > 128) + return true; + } + else + { + if (NewState.RightTrigger > 128) + return true; + } + case 1: //PS2 Mode + if (CPad::GetPad(0)->IsDualAnalog) + { + return NewState.B; + } + else + { + return NewState.B; + } + } + +#else switch (CURMODE) { case 0: -#ifdef RW_DC - case 1: - { - if (NewState.RightTrigger > 128) - return true; - - break; - } - - case 2: - { - if (NewState.RightTrigger > 128) - return true; - - break; - } - - case 3: - { - if (NewState.RightTrigger > 128) - return true; - - break; - } -#else case 1: { return !!(NewState.Circle && !OldState.Circle); @@ -2411,8 +2658,8 @@ bool CPad::WeaponJustDown(void) { return !!(NewState.RightShoulder1 && !OldState.RightShoulder1); } -#endif } +#endif return false; } @@ -2422,36 +2669,35 @@ int16 CPad::GetAccelerate(void) if ( ArePlayerControlsDisabled() ) return 0; +#ifdef RW_DC + + switch (CPad::GetPad(0)->Mode) + { + case 0: //Xbox Mode + if (CPad::GetPad(0)->IsDualAnalog) + { + return NewState.RightTrigger; + } + else + { + return NewState.RightTrigger; + } + case 1: //PS2 Mode + if (CPad::GetPad(0)->IsDualAnalog) + { + return NewState.A; + } + else + { + return NewState.A; + } + } + +#else + switch (CURMODE) { case 0: -#ifdef RW_DC - case 2: - { - return NewState.RightTrigger; - - break; - } - - case 1: - { - return NewState.RightTrigger; - - break; - } - - case 3: - { - int16 axis = -2 * NewState.RightTrigger; - - if ( axis < 0 ) - return 0; - else - return axis; - - break; - } -#else case 2: { return NewState.Cross; @@ -2477,14 +2723,41 @@ int16 CPad::GetAccelerate(void) break; } -#endif } +#endif + return 0; } bool CPad::CycleCameraModeUpJustDown(void) { + +#ifdef RW_DC + + switch (CPad::GetPad(0)->Mode) + { + case 0: //Xbox Mode + if (CPad::GetPad(0)->IsDualAnalog) + { + return NewState.D; + //return !!(NewState.DPadRight&& !OldState.DPadRight); + } + else + { + return !!(NewState.DPadUp && !OldState.DPadUp); + } + case 1: //PS2 Mode + if (CPad::GetPad(0)->IsDualAnalog) + { + return NewState.D; + } + else + { + return !!(NewState.DPadUp && !OldState.DPadUp); + } + } +#else switch (CURMODE) { case 0: @@ -2511,12 +2784,17 @@ bool CPad::CycleCameraModeUpJustDown(void) break; } } +#endif return false; } bool CPad::CycleCameraModeDownJustDown(void) { + +#ifdef RW_DC + +#else switch (CURMODE) { case 0: @@ -2535,6 +2813,7 @@ bool CPad::CycleCameraModeDownJustDown(void) break; } } +#endif return false; } @@ -2543,7 +2822,32 @@ bool CPad::ChangeStationJustDown(void) { if ( ArePlayerControlsDisabled() ) return false; +#ifdef RW_DC + switch (CPad::GetPad(0)->Mode) + { + case 0: //Xbox Mode + if (CPad::GetPad(0)->IsDualAnalog) + { + return NewState.Z; + //return !!(NewState.DPadRight&& !OldState.DPadRight); + } + else + { + return !!(NewState.DPadRight && !OldState.DPadRight); + } + case 1: //PS2 Mode + if (CPad::GetPad(0)->IsDualAnalog) + { + return NewState.Z; + } + else + { + return !!(NewState.DPadRight && !OldState.DPadRight); + } + } + +#else switch (CURMODE) { case 0: @@ -2574,6 +2878,7 @@ bool CPad::ChangeStationJustDown(void) break; } } +#endif return false; } @@ -2606,25 +2911,39 @@ bool CPad::GetTarget(void) if ( ArePlayerControlsDisabled() ) return false; +#ifdef RW_DC + + switch (CPad::GetPad(0)->Mode) + { + case 0: //Xbox Mode + if (CPad::GetPad(0)->IsDualAnalog) + { + if (NewState.LeftTrigger > 128) + return true; + } + else + { + if (NewState.LeftTrigger > 128) + return true; + } + case 1: //PS2 Mode + if (CPad::GetPad(0)->IsDualAnalog) + { + return NewState.C; + } + else + { + if (NewState.RightTrigger > 128) + return true; + } + } + +#else + switch (CURMODE) { case 0: case 1: -#ifdef RW_DC - case 2: - { - if (NewState.LeftTrigger > 128) - return true; - - break; - } - case 3: - { - if (NewState.LeftTrigger > 128) - return true; - break; - } -#else case 2: { return !!NewState.RightShoulder1; @@ -2634,10 +2953,10 @@ bool CPad::GetTarget(void) { return !!NewState.LeftShoulder1; break; - } -#endif + } } +#endif return false; } @@ -2646,25 +2965,39 @@ bool CPad::TargetJustDown(void) if ( ArePlayerControlsDisabled() ) return false; +#ifdef RW_DC + + switch (CPad::GetPad(0)->Mode) + { + case 0: //Xbox Mode + if (CPad::GetPad(0)->IsDualAnalog) + { + if (NewState.LeftTrigger > 128) + return true; + } + else + { + if (NewState.LeftTrigger > 128) + return true; + } + case 1: //PS2 Mode + if (CPad::GetPad(0)->IsDualAnalog) + { + return NewState.C; + } + else + { + if (NewState.RightTrigger > 128) + return true; + } + } + +#else + switch (CURMODE) { case 0: case 1: -#ifdef RW_DC - case 2: - { - if (NewState.LeftTrigger > 128) - return true; - - break; - } - case 3: - { - if (NewState.LeftTrigger > 128) - return true; - break; - } -#else case 2: { return !!(NewState.RightShoulder1 && !OldState.RightShoulder1); @@ -2678,8 +3011,8 @@ bool CPad::TargetJustDown(void) break; } -#endif } +#endif return false; } @@ -2689,7 +3022,28 @@ bool CPad::JumpJustDown(void) if ( ArePlayerControlsDisabled() ) return false; #ifdef RW_DC - return !!(NewState.B && !OldState.B); + switch (CPad::GetPad(0)->Mode) + { + case 0: //Xbox Mode + if (CPad::GetPad(0)->IsDualAnalog) + { + return NewState.X; + } + else + { + return NewState.B; + } + case 1: //PS2 Mode + if (CPad::GetPad(0)->IsDualAnalog) + { + return NewState.X; + } + else + { + return NewState.X; + } + } + #else return !!(NewState.Square && !OldState.Square); #endif @@ -2699,26 +3053,36 @@ bool CPad::GetSprint(void) { if ( ArePlayerControlsDisabled() ) return false; - + +#ifdef RW_DC + + switch (CPad::GetPad(0)->Mode) + { + case 0: //Xbox Mode + if (CPad::GetPad(0)->IsDualAnalog) + { + return NewState.A; + } + else + { + return NewState.A; + } + case 1: //PS2 Mode + if (CPad::GetPad(0)->IsDualAnalog) + { + return NewState.A; + } + else + { + return NewState.A; + } + } +#else + switch (CURMODE) { case 0: case 1: -#ifdef RW_DC - case 3: - { - return NewState.A; - - break; - } - - case 2: - { - return NewState.A; - - break; - } -#else case 3: { return !!NewState.Cross; @@ -2732,8 +3096,8 @@ bool CPad::GetSprint(void) break; } -#endif } +#endif return false; } @@ -2744,7 +3108,28 @@ bool CPad::ShiftTargetLeftJustDown(void) return false; #ifdef RW_DC - return !!(NewState.DPadLeft && !OldState.DPadLeft); + switch (CPad::GetPad(0)->Mode) + { + case 0: //Xbox Mode + if (CPad::GetPad(0)->IsDualAnalog) + { + return !!(NewState.DPadLeft && !OldState.DPadLeft); + } + else + { + return !!(NewState.DPadLeft && !OldState.DPadLeft); + } + case 1: //PS2 Mode + if (CPad::GetPad(0)->IsDualAnalog) + { + if (NewState.LeftTrigger > 128) + return true; + } + else + { + return !!(NewState.DPadLeft && !OldState.DPadLeft); + } + } #else return !!(NewState.LeftShoulder2 && !OldState.LeftShoulder2); @@ -2757,7 +3142,28 @@ bool CPad::ShiftTargetRightJustDown(void) return false; #ifdef RW_DC - return !!(NewState.DPadRight && !OldState.DPadRight); + switch (CPad::GetPad(0)->Mode) + { + case 0: //Xbox Mode + if (CPad::GetPad(0)->IsDualAnalog) + { + return !!(NewState.DPadRight && !OldState.DPadRight); + } + else + { + return !!(NewState.DPadRight && !OldState.DPadRight); + } + case 1: //PS2 Mode + if (CPad::GetPad(0)->IsDualAnalog) + { + if (NewState.RightTrigger > 128) + return true; + } + else + { + return !!(NewState.DPadRight && !OldState.DPadRight); + } + } #else return !!(NewState.RightShoulder2 && !OldState.RightShoulder2); @@ -3150,10 +3556,35 @@ int16 CPad::SniperModeLookUpDown(void) int16 CPad::LookAroundLeftRight(void) { - if (!NewState.X) - return 0; +float axis = 0; #ifdef RW_DC - float axis = GetPad(0)->NewState.LeftStickX; //I don't know why this is float and the UpDown is int16 + + switch (CPad::GetPad(0)->Mode) + { + case 0: //Xbox Mode + if (CPad::GetPad(0)->IsDualAnalog) + { + axis = NewState.RightStickX; + } + else + { + if (NewState.X) + return 0; + axis = NewState.LeftStickX; + } + case 1: //PS2 Mode + if (CPad::GetPad(0)->IsDualAnalog) + { + axis = NewState.RightStickX; + } + else + { + if (NewState.LeftTrigger > 128) + return 0; + axis = NewState.LeftStickX; + } + } + #else float axis = GetPad(0)->NewState.RightStickX; #endif @@ -3171,10 +3602,35 @@ int16 CPad::LookAroundLeftRight(void) int16 CPad::LookAroundUpDown(void) { - if (!NewState.X) - return 0; +int16 axis = 0; #ifdef RW_DC - int16 axis = GetPad(0)->NewState.LeftStickY; + + switch (CPad::GetPad(0)->Mode) + { + case 0: //Xbox Mode + if (CPad::GetPad(0)->IsDualAnalog) + { + axis = NewState.RightStickY; + } + else + { + if (NewState.X) + return 0; + axis = NewState.LeftStickY; + } + case 1: //PS2 Mode + if (CPad::GetPad(0)->IsDualAnalog) + { + axis = NewState.RightStickY; + } + else + { + if (NewState.LeftTrigger > 128) + return 0; + axis = NewState.LeftStickY; + } + } + #else int16 axis = GetPad(0)->NewState.RightStickY; #endif @@ -3199,7 +3655,6 @@ int16 CPad::LookAroundUpDown(void) return 0; } - void CPad::ResetAverageWeapon(void) { AverageWeapon = GetWeapon(); diff --git a/src/core/Pad.h b/src/core/Pad.h index 0421c88e..3156de19 100644 --- a/src/core/Pad.h +++ b/src/core/Pad.h @@ -23,7 +23,7 @@ public: int16 DPadUp, DPadDown, DPadLeft, DPadRight; int16 Start, Select; int16 Square, Triangle, Cross, Circle; - uint32_t A, B, C, X, Y, Z; + uint32_t A, B, C, D, X, Y, Z; int16 LeftShock, RightShock; int16 NetworkTalk; float GetLeftStickX(void) { return LeftStickX/32767.0f; }; @@ -161,6 +161,8 @@ public: int32 LastTimeTouched; int32 AverageWeapon; int32 AverageEntries; + bool IsKeyboardMouse; + bool IsDualAnalog; #ifdef DETECT_PAD_INPUT_SWITCH static bool IsAffectedByController; From 1e03ff65d8e96030caae10115fd430ac59ae25be Mon Sep 17 00:00:00 2001 From: Soniccd123 <> Date: Mon, 16 Dec 2024 23:56:45 -0300 Subject: [PATCH 02/10] Fixed controll bugs, Enabled controller config menu, PS2 like layout is finished, Testing is needed on Xbox and PS2 dual stick modes --- src/core/MenuScreensCustom.cpp | 2 +- src/core/Pad.cpp | 48 ++++++++++++++++++++++------------ 2 files changed, 33 insertions(+), 17 deletions(-) diff --git a/src/core/MenuScreensCustom.cpp b/src/core/MenuScreensCustom.cpp index f99918ca..90f2fca4 100644 --- a/src/core/MenuScreensCustom.cpp +++ b/src/core/MenuScreensCustom.cpp @@ -764,7 +764,7 @@ CMenuScreenCustom aScreens[MENUPAGES] = { // MENUPAGE_OPTIONS = 41 { "FET_OPT", MENUPAGE_NONE, MENUPAGE_NONE, nil, nil, -#ifdef GTA_HANDHELD +#ifdef RW_DC MENUACTION_CHANGEMENU, "FET_CTL", { nil, SAVESLOT_NONE, MENUPAGE_CONTROLLER_SETTINGS }, #else MENUACTION_CHANGEMENU, "FET_CTL", { nil, SAVESLOT_NONE, MENUPAGE_CONTROLLER_PC }, diff --git a/src/core/Pad.cpp b/src/core/Pad.cpp index f6bf68d1..a29a6d7d 100755 --- a/src/core/Pad.cpp +++ b/src/core/Pad.cpp @@ -1607,6 +1607,8 @@ int16 CPad::GetSteeringLeftRight(void) { if (NewState.X) return 0; + if (NewState.A && ((NewState.LeftStickX < -64) || (NewState.LeftStickX > 64))) + return 0; return NewState.LeftStickX; } case 1: //PS2 Mode @@ -1618,6 +1620,8 @@ int16 CPad::GetSteeringLeftRight(void) { if (NewState.LeftTrigger > 128) return 0; + if (NewState.A && ((NewState.RightTrigger > 128) || (NewState.LeftTrigger > 128))) + return 0; return NewState.LeftStickX; } } @@ -2003,8 +2007,8 @@ bool CPad::GetLookLeft(void) } else { - if (NewState.A) - return CPad::GetPad(0)->GetAnaloguePadLeft(); + if (NewState.A && (NewState.LeftStickX < -64)) + return true; } case 1: //PS2 Mode if (CPad::GetPad(0)->IsDualAnalog) @@ -2014,8 +2018,8 @@ bool CPad::GetLookLeft(void) } else { - if (NewState.B) - return CPad::GetPad(0)->GetAnaloguePadLeft(); + if (NewState.B && (NewState.LeftTrigger > 128)) + return true; } } #else @@ -2024,6 +2028,8 @@ bool CPad::GetLookLeft(void) #endif + return false; + } bool CPad::GetLookRight(void) @@ -2041,8 +2047,8 @@ bool CPad::GetLookRight(void) } else { - if (NewState.A) - return CPad::GetPad(0)->GetAnaloguePadRight(); + if (NewState.A && (NewState.LeftStickX > 64)) + return true; } case 1: //PS2 Mode if (CPad::GetPad(0)->IsDualAnalog) @@ -2052,8 +2058,8 @@ bool CPad::GetLookRight(void) } else { - if (NewState.B) - return CPad::GetPad(0)->GetAnaloguePadRight(); + if (NewState.B && (NewState.RightTrigger > 128)) + return true; } } #else @@ -2061,6 +2067,8 @@ bool CPad::GetLookRight(void) return !!(NewState.RightShoulder2 && !NewState.LeftShoulder2); #endif + + return false; } @@ -2102,6 +2110,8 @@ bool CPad::GetLookBehindForCar(void) #endif +return false; + } bool CPad::GetLookBehindForPed(void) @@ -2136,6 +2146,8 @@ bool CPad::GetLookBehindForPed(void) return !!NewState.RightShock; #endif + +return false; } bool CPad::GetHorn(void) @@ -2424,11 +2436,13 @@ int16 CPad::GetBrake(void) case 1: //PS2 Mode if (CPad::GetPad(0)->IsDualAnalog) { - return NewState.X; + if(NewState.X) + return 255; } else { - return NewState.X; + if(NewState.X) + return 255; } } #else @@ -2685,11 +2699,13 @@ int16 CPad::GetAccelerate(void) case 1: //PS2 Mode if (CPad::GetPad(0)->IsDualAnalog) { - return NewState.A; + if(NewState.A) + return 255; } else { - return NewState.A; + if(NewState.A) + return 255; } } @@ -3568,7 +3584,7 @@ float axis = 0; } else { - if (NewState.X) + if (!NewState.X) return 0; axis = NewState.LeftStickX; } @@ -3579,7 +3595,7 @@ float axis = 0; } else { - if (NewState.LeftTrigger > 128) + if (!(NewState.LeftTrigger > 128)) return 0; axis = NewState.LeftStickX; } @@ -3614,7 +3630,7 @@ int16 axis = 0; } else { - if (NewState.X) + if (!NewState.X) return 0; axis = NewState.LeftStickY; } @@ -3625,7 +3641,7 @@ int16 axis = 0; } else { - if (NewState.LeftTrigger > 128) + if (!(NewState.LeftTrigger > 128)) return 0; axis = NewState.LeftStickY; } From fcd2e4bb9142814ce04e3a2a531cc110fbc593eb Mon Sep 17 00:00:00 2001 From: Soniccd123 <> Date: Wed, 18 Dec 2024 01:23:36 -0300 Subject: [PATCH 03/10] Test new query method for Right Stick availability --- src/core/Game.cpp | 3 +++ src/core/MenuScreensCustom.cpp | 5 +---- src/core/Pad.cpp | 15 +++++++++------ 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/core/Game.cpp b/src/core/Game.cpp index 6521ac77..5f13720d 100644 --- a/src/core/Game.cpp +++ b/src/core/Game.cpp @@ -662,6 +662,9 @@ bool CGame::Initialise(const char* datFile) CCollision::ms_collisionInMemory = currLevel; for (int i = 0; i < MAX_PADS; i++) CPad::GetPad(i)->Clear(true); +#ifdef RW_DC + //CPad::GetPad(0)->IsDualAnalog = false; +#endif return true; } diff --git a/src/core/MenuScreensCustom.cpp b/src/core/MenuScreensCustom.cpp index 90f2fca4..abd7694d 100644 --- a/src/core/MenuScreensCustom.cpp +++ b/src/core/MenuScreensCustom.cpp @@ -764,11 +764,8 @@ CMenuScreenCustom aScreens[MENUPAGES] = { // MENUPAGE_OPTIONS = 41 { "FET_OPT", MENUPAGE_NONE, MENUPAGE_NONE, nil, nil, -#ifdef RW_DC - MENUACTION_CHANGEMENU, "FET_CTL", { nil, SAVESLOT_NONE, MENUPAGE_CONTROLLER_SETTINGS }, -#else + MENUACTION_CHANGEMENU, "FET_AGS", { nil, SAVESLOT_NONE, MENUPAGE_CONTROLLER_SETTINGS }, MENUACTION_CHANGEMENU, "FET_CTL", { nil, SAVESLOT_NONE, MENUPAGE_CONTROLLER_PC }, -#endif MENUACTION_LOADRADIO, "FET_AUD", { nil, SAVESLOT_NONE, MENUPAGE_SOUND_SETTINGS }, MENUACTION_CHANGEMENU, "FET_DIS", { nil, SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS }, #ifdef GRAPHICS_MENU_OPTIONS diff --git a/src/core/Pad.cpp b/src/core/Pad.cpp index a29a6d7d..57908928 100755 --- a/src/core/Pad.cpp +++ b/src/core/Pad.cpp @@ -1435,8 +1435,7 @@ void CPad::Update(int16 pad) #ifdef RW_DC - CPad::IsDualAnalog = cont_has_capabilities(contMaple, CONT_CAPABILITIES_DUAL_ANALOG); //Query controller about Dual analog capabilities - + //CPad::IsDualAnalog = cont_has_capabilities(contMaple, CONT_CAPABILITIES_DUAL_ANALOG); //Query controller about Dual analog capabilities if (pad == 0) { NewState.DPadUp = state->dpad_up; //This part could be inside a compiler directive to preserve the old code and just use this block if compil @@ -1480,6 +1479,7 @@ void CPad::Update(int16 pad) NewState.LeftStickY = 0; NewState.RightShock = 0; } + #else NewState = ReconcileTwoControllersInput(PCTempKeyState, PCTempJoyState); NewState = ReconcileTwoControllersInput(PCTempMouseState, NewState); @@ -1497,6 +1497,13 @@ void CPad::Update(int16 pad) bHornHistory[iCurrHornHistory] = GetHorn(); +#ifdef RW_DC + if (((NewState.RightStickX > 64) || (NewState.RightStickX < -64)) || ((NewState.RightStickY > 64) || (NewState.RightStickY < -64))) + { + CPad::GetPad(0)->IsDualAnalog = true; + } +#endif + if ( !bDisplayNoControllerMessage ) CGame::bDemoMode = false; @@ -3612,8 +3619,6 @@ float axis = 0; else if ( TheCamera.Cams[0].Using3rdPersonMouseCam() && Abs(axis) > 10 ) return (int16) ( (axis + ( ( axis > 0 ) ? -10 : 10) ) * (127.0f / 64.0f) ); // 1.984375f - - return 0; } int16 CPad::LookAroundUpDown(void) @@ -3667,8 +3672,6 @@ int16 axis = 0; else if ( TheCamera.Cams[0].Using3rdPersonMouseCam() && Abs(axis) > 40 ) return (int16) ( (axis + ( ( axis > 0 ) ? -40 : 40) ) * (127.0f / 64.0f) ); // 1.984375f - - return 0; } void CPad::ResetAverageWeapon(void) From 970ac8c691f586d72e0146af5210453d7248e228 Mon Sep 17 00:00:00 2001 From: Soniccd123 <> Date: Wed, 18 Dec 2024 02:00:00 -0300 Subject: [PATCH 04/10] Bug fix: Camera falling --- src/core/Pad.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/core/Pad.cpp b/src/core/Pad.cpp index 57908928..ac86310b 100755 --- a/src/core/Pad.cpp +++ b/src/core/Pad.cpp @@ -3595,6 +3595,7 @@ float axis = 0; return 0; axis = NewState.LeftStickX; } + break; case 1: //PS2 Mode if (CPad::GetPad(0)->IsDualAnalog) { @@ -3606,6 +3607,7 @@ float axis = 0; return 0; axis = NewState.LeftStickX; } + break; } #else @@ -3619,11 +3621,12 @@ float axis = 0; else if ( TheCamera.Cams[0].Using3rdPersonMouseCam() && Abs(axis) > 10 ) return (int16) ( (axis + ( ( axis > 0 ) ? -10 : 10) ) * (127.0f / 64.0f) ); // 1.984375f + return 0; } int16 CPad::LookAroundUpDown(void) { -int16 axis = 0; + int16 axis = 0; #ifdef RW_DC switch (CPad::GetPad(0)->Mode) @@ -3639,6 +3642,7 @@ int16 axis = 0; return 0; axis = NewState.LeftStickY; } + break; case 1: //PS2 Mode if (CPad::GetPad(0)->IsDualAnalog) { @@ -3650,6 +3654,7 @@ int16 axis = 0; return 0; axis = NewState.LeftStickY; } + break; } #else @@ -3672,6 +3677,7 @@ int16 axis = 0; else if ( TheCamera.Cams[0].Using3rdPersonMouseCam() && Abs(axis) > 40 ) return (int16) ( (axis + ( ( axis > 0 ) ? -40 : 40) ) * (127.0f / 64.0f) ); // 1.984375f + return 0; } void CPad::ResetAverageWeapon(void) From 8e6a952da3edec10981e2de3077041e92b54e4ec Mon Sep 17 00:00:00 2001 From: Soniccd123 <> Date: Wed, 18 Dec 2024 19:09:24 -0300 Subject: [PATCH 05/10] New RightStick querying code --- src/core/Pad.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/core/Pad.cpp b/src/core/Pad.cpp index ac86310b..ccd4ff2d 100755 --- a/src/core/Pad.cpp +++ b/src/core/Pad.cpp @@ -1435,7 +1435,7 @@ void CPad::Update(int16 pad) #ifdef RW_DC - //CPad::IsDualAnalog = cont_has_capabilities(contMaple, CONT_CAPABILITIES_DUAL_ANALOG); //Query controller about Dual analog capabilities + CPad::IsDualAnalog = cont_has_capabilities(contMaple, CONT_CAPABILITIES_DUAL_ANALOG); //Query controller about Dual analog capabilities if (pad == 0) { NewState.DPadUp = state->dpad_up; //This part could be inside a compiler directive to preserve the old code and just use this block if compil @@ -1477,6 +1477,8 @@ void CPad::Update(int16 pad) NewState.LeftTrigger = 0; NewState.LeftStickX = 0; NewState.LeftStickY = 0; + NewState.RightStickX = 0; + NewState.RightStickY = 0; NewState.RightShock = 0; } @@ -1498,7 +1500,7 @@ void CPad::Update(int16 pad) bHornHistory[iCurrHornHistory] = GetHorn(); #ifdef RW_DC - if (((NewState.RightStickX > 64) || (NewState.RightStickX < -64)) || ((NewState.RightStickY > 64) || (NewState.RightStickY < -64))) + if (((NewState.RightStickY > 64 && OldState.RightStickY)) || ((NewState.RightStickY) < -64 && (OldState.RightStickY < -64))) { CPad::GetPad(0)->IsDualAnalog = true; } From f179638f4672e5e37a42b262dce100d17bc427e5 Mon Sep 17 00:00:00 2001 From: Soniccd123 <> Date: Thu, 19 Dec 2024 03:56:00 -0300 Subject: [PATCH 06/10] More fixes, added dead zone for analogs --- src/core/Pad.cpp | 57 ++++++++++++++++++++++++++++++++++++------------ 1 file changed, 43 insertions(+), 14 deletions(-) diff --git a/src/core/Pad.cpp b/src/core/Pad.cpp index ccd4ff2d..0e928051 100755 --- a/src/core/Pad.cpp +++ b/src/core/Pad.cpp @@ -1435,7 +1435,7 @@ void CPad::Update(int16 pad) #ifdef RW_DC - CPad::IsDualAnalog = cont_has_capabilities(contMaple, CONT_CAPABILITIES_DUAL_ANALOG); //Query controller about Dual analog capabilities + //CPad::IsDualAnalog = cont_has_capabilities(contMaple, CONT_CAPABILITIES_DUAL_ANALOG); //Query controller about Dual analog capabilities if (pad == 0) { NewState.DPadUp = state->dpad_up; //This part could be inside a compiler directive to preserve the old code and just use this block if compil @@ -1593,6 +1593,10 @@ CPad *CPad::GetPad(int32 pad) #define CURMODE (Mode) #endif +#ifdef RW_DC +#define DEADZONE 10 +#endif + //The next are the actuall functions that are checked and produce the values that are used by engine to make the char run, the car turn, etc //Although initially I didn't want to change them, I think here is the best place to create the custom desired mapping and behavior for the DC inputs //The switch statement using CURMODE could be used in the future to define diferent control configurations, depending on the type of controller and desired mapping (e.g. Xbox like or PS2 like) @@ -1846,6 +1850,8 @@ int16 CPad::GetPedWalkLeftRight(void) { if ( ArePlayerControlsDisabled() ) return 0; + +int16 axis = 0; #ifdef RW_DC switch (CPad::GetPad(0)->Mode) @@ -1853,25 +1859,32 @@ int16 CPad::GetPedWalkLeftRight(void) case 0: //Xbox Mode if (CPad::GetPad(0)->IsDualAnalog) { - return NewState.LeftStickX; + axis = NewState.LeftStickX; } else { if (NewState.X) return 0; - return NewState.LeftStickX; + axis = NewState.LeftStickX; } + break; case 1: //PS2 Mode if (CPad::GetPad(0)->IsDualAnalog) { - return NewState.LeftStickX; + axis = NewState.LeftStickX; } else { if (NewState.LeftTrigger > 128) return 0; - return NewState.LeftStickX; + axis = NewState.LeftStickX; } + break; + } + + if (axis > DEADZONE || axis < -DEADZONE) + { + return axis; } #else switch (CURMODE) @@ -1907,32 +1920,41 @@ int16 CPad::GetPedWalkUpDown(void) { if ( ArePlayerControlsDisabled() ) return 0; - + +int16 axis = 0; + #ifdef RW_DC switch (CPad::GetPad(0)->Mode) { case 0: //Xbox Mode if (CPad::GetPad(0)->IsDualAnalog) { - return NewState.LeftStickY; + axis = NewState.LeftStickY; } else { if (NewState.X) return 0; - return NewState.LeftStickY; + axis = NewState.LeftStickY; } + break; case 1: //PS2 Mode if (CPad::GetPad(0)->IsDualAnalog) { - return NewState.LeftStickY; + axis = NewState.LeftStickY; } else { if (NewState.LeftTrigger > 128) return 0; - return NewState.LeftStickY; + axis = NewState.LeftStickY; } + break; + } + + if (axis > DEADZONE || axis < -DEADZONE) + { + return axis; } #else switch (CURMODE) @@ -2012,13 +2034,15 @@ bool CPad::GetLookLeft(void) case 0: //Xbox Mode if (CPad::GetPad(0)->IsDualAnalog) { - return !!(NewState.Z && !NewState.Z); + if (NewState.Z) + return true; } else { if (NewState.A && (NewState.LeftStickX < -64)) return true; } + break; case 1: //PS2 Mode if (CPad::GetPad(0)->IsDualAnalog) { @@ -2030,6 +2054,7 @@ bool CPad::GetLookLeft(void) if (NewState.B && (NewState.LeftTrigger > 128)) return true; } + break; } #else @@ -2052,13 +2077,15 @@ bool CPad::GetLookRight(void) case 0: //Xbox Mode if (CPad::GetPad(0)->IsDualAnalog) { - return !!(NewState.C && !NewState.C); + if (NewState.C) + return true; } else { if (NewState.A && (NewState.LeftStickX > 64)) return true; } + break; case 1: //PS2 Mode if (CPad::GetPad(0)->IsDualAnalog) { @@ -2070,6 +2097,7 @@ bool CPad::GetLookRight(void) if (NewState.B && (NewState.RightTrigger > 128)) return true; } + break; } #else @@ -2101,6 +2129,7 @@ bool CPad::GetLookBehindForCar(void) if (NewState.RightTrigger > 128 && NewState.LeftTrigger > 128) return true; } + break; case 1: //PS2 Mode if (CPad::GetPad(0)->IsDualAnalog) { @@ -2112,6 +2141,7 @@ bool CPad::GetLookBehindForCar(void) if (NewState.RightTrigger > 128 && NewState.LeftTrigger > 128) return true; } + break; } #else @@ -2854,8 +2884,7 @@ bool CPad::ChangeStationJustDown(void) case 0: //Xbox Mode if (CPad::GetPad(0)->IsDualAnalog) { - return NewState.Z; - //return !!(NewState.DPadRight&& !OldState.DPadRight); + return !!(NewState.DPadRight&& !OldState.DPadRight); } else { From 76c5fae015c17c91f78cd7d44545ff716df421a0 Mon Sep 17 00:00:00 2001 From: Soniccd123 <> Date: Sun, 22 Dec 2024 22:26:19 -0300 Subject: [PATCH 07/10] Fixes unplugging and pluggin back controller bug --- src/core/Pad.cpp | 38 +++++++++++++++++++++++++++++++++++--- 1 file changed, 35 insertions(+), 3 deletions(-) diff --git a/src/core/Pad.cpp b/src/core/Pad.cpp index 0e928051..27e8753d 100755 --- a/src/core/Pad.cpp +++ b/src/core/Pad.cpp @@ -1434,8 +1434,8 @@ void CPad::Update(int16 pad) { #ifdef RW_DC - //CPad::IsDualAnalog = cont_has_capabilities(contMaple, CONT_CAPABILITIES_DUAL_ANALOG); //Query controller about Dual analog capabilities + if (pad == 0) { NewState.DPadUp = state->dpad_up; //This part could be inside a compiler directive to preserve the old code and just use this block if compil @@ -1482,6 +1482,33 @@ void CPad::Update(int16 pad) NewState.RightShock = 0; } + auto contMaple = maple_enum_type(0, MAPLE_FUNC_CONTROLLER); + auto state = (cont_state_t *)maple_dev_status(contMaple); + + if (contMaple == nullptr) + { + //CPad::GetPad(0)->IsDualAnalog = false; + NewState.DPadUp = 0; + NewState.DPadDown = 0; + NewState.DPadLeft = 0; + NewState.DPadRight = 0; + NewState.A = 0; + NewState.B = 0; + NewState.C = 0; + NewState.D = 0; + NewState.X = 0; + NewState.Y = 0; + NewState.Z = 0; + NewState.Start = 0; + NewState.RightTrigger = 0; + NewState.LeftTrigger = 0; + NewState.LeftStickX = 0; + NewState.LeftStickY = 0; + NewState.RightStickX = 0; + NewState.RightStickY = 0; + NewState.RightShock = 0; + } + #else NewState = ReconcileTwoControllersInput(PCTempKeyState, PCTempJoyState); NewState = ReconcileTwoControllersInput(PCTempMouseState, NewState); @@ -1500,9 +1527,12 @@ void CPad::Update(int16 pad) bHornHistory[iCurrHornHistory] = GetHorn(); #ifdef RW_DC - if (((NewState.RightStickY > 64 && OldState.RightStickY)) || ((NewState.RightStickY) < -64 && (OldState.RightStickY < -64))) + if (((NewState.RightStickY > 64 && OldState.RightStickY > 64)) || ((NewState.RightStickY) < -64 && (OldState.RightStickY < -64))) { - CPad::GetPad(0)->IsDualAnalog = true; + if (contMaple == nullptr) + CPad::GetPad(0)->IsDualAnalog = false; + else + CPad::GetPad(0)->IsDualAnalog = true; } #endif @@ -2890,6 +2920,7 @@ bool CPad::ChangeStationJustDown(void) { return !!(NewState.DPadRight && !OldState.DPadRight); } + break; case 1: //PS2 Mode if (CPad::GetPad(0)->IsDualAnalog) { @@ -2899,6 +2930,7 @@ bool CPad::ChangeStationJustDown(void) { return !!(NewState.DPadRight && !OldState.DPadRight); } + break; } #else From 267f39b9fda9df114be76aae3d5771406f46ae23 Mon Sep 17 00:00:00 2001 From: Soniccd123 <> Date: Mon, 23 Dec 2024 02:59:36 -0300 Subject: [PATCH 08/10] Should actually fix the unpluggin problem, also reset Dual analog state when reconnected, in case a normal controller is connected --- src/core/Pad.cpp | 167 ++++++++++++++++++++++++++++++++--------------- 1 file changed, 113 insertions(+), 54 deletions(-) diff --git a/src/core/Pad.cpp b/src/core/Pad.cpp index 27e8753d..43e52119 100755 --- a/src/core/Pad.cpp +++ b/src/core/Pad.cpp @@ -1167,6 +1167,11 @@ void CPad::ProcessPCSpecificStuff(void) ; } +void attachtest (maple_device_t *dev) +{ + CPad::GetPad(0)->IsDualAnalog = false; +} + void CPad::Update(int16 pad) { OldState = NewState; @@ -1433,30 +1438,64 @@ void CPad::Update(int16 pad) #endif { #ifdef RW_DC + if (((NewState.RightStickY > 64 && OldState.RightStickY > 64)) || ((NewState.RightStickY) < -64 && (OldState.RightStickY < -64))) + { + // if (contMaple == nullptr) + // CPad::GetPad(0)->IsDualAnalog = false; + // else + CPad::GetPad(0)->IsDualAnalog = true; + } //CPad::IsDualAnalog = cont_has_capabilities(contMaple, CONT_CAPABILITIES_DUAL_ANALOG); //Query controller about Dual analog capabilities if (pad == 0) { - NewState.DPadUp = state->dpad_up; //This part could be inside a compiler directive to preserve the old code and just use this block if compil - NewState.DPadDown = state->dpad_down; //I also changed CControllerState inside Pad.h and created these values for DC controllers - NewState.DPadLeft = state->dpad_left; - NewState.DPadRight = state->dpad_right; - NewState.A = state->a; - NewState.B = state->b; - NewState.C = state->c; - NewState.D = state->d; - NewState.X = state->x; - NewState.Y = state->y; - NewState.Z = state->z; - NewState.Start = state->start; - NewState.RightTrigger = state->rtrig; - NewState.LeftTrigger = state->ltrig; - NewState.LeftStickX = state->joyx; - NewState.LeftStickY = state->joyy; - NewState.RightStickX = state->joy2x; - NewState.RightStickY = state->joy2y; - NewState.RightShock = state->dpad_left; + if (contMaple == NULL) + { + CPad::GetPad(0)->IsDualAnalog = false; + NewState.DPadUp = 0; + NewState.DPadDown = 0; + NewState.DPadLeft = 0; + NewState.DPadRight = 0; + NewState.A = 0; + NewState.B = 0; + NewState.C = 0; + NewState.D = 0; + NewState.X = 0; + NewState.Y = 0; + NewState.Z = 0; + NewState.Start = 0; + NewState.RightTrigger = 0; + NewState.LeftTrigger = 0; + NewState.LeftStickX = 0; + NewState.LeftStickY = 0; + NewState.RightStickX = 0; + NewState.RightStickY = 0; + NewState.RightShock = 0; + } + else + { + NewState.DPadUp = state->dpad_up; //This part could be inside a compiler directive to preserve the old code and just use this block if compil + NewState.DPadDown = state->dpad_down; //I also changed CControllerState inside Pad.h and created these values for DC controllers + NewState.DPadLeft = state->dpad_left; + NewState.DPadRight = state->dpad_right; + NewState.A = state->a; + NewState.B = state->b; + NewState.C = state->c; + NewState.D = state->d; + NewState.X = state->x; + NewState.Y = state->y; + NewState.Z = state->z; + NewState.Start = state->start; + NewState.RightTrigger = state->rtrig; + NewState.LeftTrigger = state->ltrig; + NewState.LeftStickX = state->joyx; + NewState.LeftStickY = state->joyy; + NewState.RightStickX = state->joy2x; + NewState.RightStickY = state->joy2y; + NewState.RightShock = state->dpad_left; + } + } else @@ -1482,32 +1521,29 @@ void CPad::Update(int16 pad) NewState.RightShock = 0; } - auto contMaple = maple_enum_type(0, MAPLE_FUNC_CONTROLLER); - auto state = (cont_state_t *)maple_dev_status(contMaple); - - if (contMaple == nullptr) - { - //CPad::GetPad(0)->IsDualAnalog = false; - NewState.DPadUp = 0; - NewState.DPadDown = 0; - NewState.DPadLeft = 0; - NewState.DPadRight = 0; - NewState.A = 0; - NewState.B = 0; - NewState.C = 0; - NewState.D = 0; - NewState.X = 0; - NewState.Y = 0; - NewState.Z = 0; - NewState.Start = 0; - NewState.RightTrigger = 0; - NewState.LeftTrigger = 0; - NewState.LeftStickX = 0; - NewState.LeftStickY = 0; - NewState.RightStickX = 0; - NewState.RightStickY = 0; - NewState.RightShock = 0; - } + // if (old_contMaple == nullptr && contMaple != nullptr) + // { + // CPad::GetPad(0)->IsDualAnalog = false; + // NewState.DPadUp = 0; + // NewState.DPadDown = 0; + // NewState.DPadLeft = 0; + // NewState.DPadRight = 0; + // NewState.A = 0; + // NewState.B = 0; + // NewState.C = 0; + // NewState.D = 0; + // NewState.X = 0; + // NewState.Y = 0; + // NewState.Z = 0; + // NewState.Start = 0; + // NewState.RightTrigger = 0; + // NewState.LeftTrigger = 0; + // NewState.LeftStickX = 0; + // NewState.LeftStickY = 0; + // NewState.RightStickX = 0; + // NewState.RightStickY = 0; + // NewState.RightShock = 0; + // } #else NewState = ReconcileTwoControllersInput(PCTempKeyState, PCTempJoyState); @@ -1526,21 +1562,44 @@ void CPad::Update(int16 pad) bHornHistory[iCurrHornHistory] = GetHorn(); -#ifdef RW_DC - if (((NewState.RightStickY > 64 && OldState.RightStickY > 64)) || ((NewState.RightStickY) < -64 && (OldState.RightStickY < -64))) - { - if (contMaple == nullptr) - CPad::GetPad(0)->IsDualAnalog = false; - else - CPad::GetPad(0)->IsDualAnalog = true; - } -#endif + +#ifdef RW_DC + auto old_contMaple = contMaple; + auto n_dev = maple_enum_count(); + contMaple = maple_enum_type(0, MAPLE_FUNC_CONTROLLER); + state = (cont_state_t *)maple_dev_status(contMaple); +#endif + // if (n_dev == 0) + // { + // CPad::GetPad(0)->IsDualAnalog = false; + // NewState.DPadUp = 0; + // NewState.DPadDown = 0; + // NewState.DPadLeft = 0; + // NewState.DPadRight = 0; + // NewState.A = 0; + // NewState.B = 0; + // NewState.C = 0; + // NewState.D = 0; + // NewState.X = 0; + // NewState.Y = 0; + // NewState.Z = 0; + // NewState.Start = 0; + // NewState.RightTrigger = 0; + // NewState.LeftTrigger = 0; + // NewState.LeftStickX = 0; + // NewState.LeftStickY = 0; + // NewState.RightStickX = 0; + // NewState.RightStickY = 0; + // NewState.RightShock = 0; + // } + if ( !bDisplayNoControllerMessage ) CGame::bDemoMode = false; } + void CPad::DoCheats(void) { #ifdef DETECT_PAD_INPUT_SWITCH From d0c97eedb5225263e1cc61e18b8b89f30dbbb45c Mon Sep 17 00:00:00 2001 From: Soniccd123 <> Date: Fri, 27 Dec 2024 18:00:52 -0300 Subject: [PATCH 09/10] Added command to center camera on player when walking, double click X button to do it --- src/core/Pad.cpp | 92 +++++++++++++++++++++++++++++++----------------- src/core/Pad.h | 11 +++++- 2 files changed, 69 insertions(+), 34 deletions(-) diff --git a/src/core/Pad.cpp b/src/core/Pad.cpp index 43e52119..08c178d2 100755 --- a/src/core/Pad.cpp +++ b/src/core/Pad.cpp @@ -1562,38 +1562,12 @@ void CPad::Update(int16 pad) bHornHistory[iCurrHornHistory] = GetHorn(); - - - #ifdef RW_DC - auto old_contMaple = contMaple; + //auto old_contMaple = contMaple; auto n_dev = maple_enum_count(); contMaple = maple_enum_type(0, MAPLE_FUNC_CONTROLLER); state = (cont_state_t *)maple_dev_status(contMaple); #endif - // if (n_dev == 0) - // { - // CPad::GetPad(0)->IsDualAnalog = false; - // NewState.DPadUp = 0; - // NewState.DPadDown = 0; - // NewState.DPadLeft = 0; - // NewState.DPadRight = 0; - // NewState.A = 0; - // NewState.B = 0; - // NewState.C = 0; - // NewState.D = 0; - // NewState.X = 0; - // NewState.Y = 0; - // NewState.Z = 0; - // NewState.Start = 0; - // NewState.RightTrigger = 0; - // NewState.LeftTrigger = 0; - // NewState.LeftStickX = 0; - // NewState.LeftStickY = 0; - // NewState.RightStickX = 0; - // NewState.RightStickY = 0; - // NewState.RightShock = 0; - // } if ( !bDisplayNoControllerMessage ) CGame::bDemoMode = false; @@ -1692,6 +1666,54 @@ CPad *CPad::GetPad(int32 pad) //While i think its possible, creating a system to configure custom mappings inside the game menus like in the PC game is out of my scope in the moment, I don't know if this is really necessary //Also, the interface controls are not defined here, they are defined in Frontend.cpp unfortunately, using CControllerState values like here; Because of that, the behavior of the Start button and the A button for selecting menu itens are not here +#ifdef RW_DC + +bool CPad::CameraSinglePress (void) +{ + if (CPad::CameraDoublePress() == false && NewState.X == true) + return true; + return 0; +} + +bool CPad::CameraDoublePress (void) +{ + if ( ArePlayerControlsDisabled() ) //Wont work driving, camera code isnt there + return false; + + if ((OldState.X == 1) && (NewState.X == 0) //Falling edge + && (CPad::GetPad(0)->CameraIsDoublePressed == false)) //Was not in double click state + { + //CPad::GetPad(0)->CameraJustUp = true; + CPad::GetPad(0)->CameraLastPressed = psTimer(); //Set timer to run + } + + if ((OldState.X == 1) && (NewState.X == 0) //Falling edge + && (CPad::GetPad(0)->CameraIsDoublePressed == true)) //Was in double click state + { + CPad::GetPad(0)->CameraIsDoublePressed = false; //ends double click state + return 0; + } + + + if ((OldState.X == 0) && (NewState.X == 1) //Rising edge + && ((psTimer() - CPad::GetPad(0)->CameraLastPressed) < 250)) //Checks timer on the Rising edge of X press + { + CPad::GetPad(0)->CameraIsDoublePressed = true; //Define that there was a double click + return true; + } + + + if ((OldState.X == 1) && (NewState.X == 1) //Button is keep pressed + && (CameraIsDoublePressed == true)) //The last state was double click + { + CPad::GetPad(0)->CameraIsDoublePressed = true; //Keep double click state + return true; + } + + return 0; +} +#endif + int16 CPad::GetSteeringLeftRight(void) { if ( ArePlayerControlsDisabled() ) @@ -1952,7 +1974,7 @@ int16 axis = 0; } else { - if (NewState.X) + if (CPad::CameraSinglePress()) return 0; axis = NewState.LeftStickX; } @@ -2022,7 +2044,7 @@ int16 axis = 0; } else { - if (NewState.X) + if (CPad::CameraSinglePress()) return 0; axis = NewState.LeftStickY; } @@ -3545,9 +3567,13 @@ bool CPad::GetAnaloguePadRightJustUp(void) bool CPad::ForceCameraBehindPlayer(void) { - if ( ArePlayerControlsDisabled() ) + if ( ArePlayerControlsDisabled() ) //Wont work driving, camera code isnt there return false; +#ifdef RW_DC + if (CPad::CameraDoublePress()) + return true; +#else switch (CURMODE) { case 0: @@ -3572,7 +3598,7 @@ bool CPad::ForceCameraBehindPlayer(void) break; } } - +#endif return false; } @@ -3713,7 +3739,7 @@ float axis = 0; } else { - if (!NewState.X) + if (!CPad::CameraSinglePress()) return 0; axis = NewState.LeftStickX; } @@ -3760,7 +3786,7 @@ int16 CPad::LookAroundUpDown(void) } else { - if (!NewState.X) + if (!CPad::CameraSinglePress()) return 0; axis = NewState.LeftStickY; } diff --git a/src/core/Pad.h b/src/core/Pad.h index 3156de19..507faa8a 100644 --- a/src/core/Pad.h +++ b/src/core/Pad.h @@ -163,6 +163,11 @@ public: int32 AverageEntries; bool IsKeyboardMouse; bool IsDualAnalog; + bool CameraJustDown; + bool CameraJustUp; + uint32 CameraJustUpTime; + uint32 CameraLastPressed; + bool CameraIsDoublePressed; #ifdef DETECT_PAD_INPUT_SWITCH static bool IsAffectedByController; @@ -213,7 +218,11 @@ public: void StopShaking(int16 pad); static CPad *GetPad(int32 pad); - + +#ifdef RW_DC + bool CameraSinglePress(void); //Checks if camera modifier was double clicked + bool CameraDoublePress(void); +#endif int16 GetSteeringLeftRight(void); int16 GetSteeringUpDown(void); int16 GetCarGunUpDown(void); From 2e0dcf9c3f299713e4d0aa33a373d88e04f32ff6 Mon Sep 17 00:00:00 2001 From: Soniccd123 <> Date: Sat, 28 Dec 2024 03:14:06 -0300 Subject: [PATCH 10/10] Try fix Sim building --- src/core/Pad.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/Pad.cpp b/src/core/Pad.cpp index 08c178d2..9469c3d7 100755 --- a/src/core/Pad.cpp +++ b/src/core/Pad.cpp @@ -1564,7 +1564,7 @@ void CPad::Update(int16 pad) #ifdef RW_DC //auto old_contMaple = contMaple; - auto n_dev = maple_enum_count(); + //auto n_dev = maple_enum_count(); contMaple = maple_enum_type(0, MAPLE_FUNC_CONTROLLER); state = (cont_state_t *)maple_dev_status(contMaple); #endif