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 f99918ca..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 GTA_HANDHELD - 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 old mode 100644 new mode 100755 index e1e5913f..9469c3d7 --- 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,36 +1438,113 @@ void CPad::Update(int16 pad) #endif { #ifdef RW_DC - 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.X = state->x; - NewState.Y = state->y; - NewState.Start = state->start; - NewState.RightTrigger = state->rtrig; - NewState.LeftTrigger = state->ltrig; - NewState.LeftStickX = state->joyx; - NewState.LeftStickY = state->joyy; - NewState.RightShock = state->dpad_left; - } else { + 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) + { + 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 + { 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); NewState = ReconcileTwoControllersInput(PCTempMouseState, NewState); @@ -1480,11 +1562,18 @@ void CPad::Update(int16 pad) bHornHistory[iCurrHornHistory] = GetHorn(); +#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 ( !bDisplayNoControllerMessage ) CGame::bDemoMode = false; } + void CPad::DoCheats(void) { #ifdef DETECT_PAD_INPUT_SWITCH @@ -1567,22 +1656,101 @@ 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) //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() ) 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; + if (NewState.A && ((NewState.LeftStickX < -64) || (NewState.LeftStickX > 64))) + return 0; + return NewState.LeftStickX; + } + case 1: //PS2 Mode + if (CPad::GetPad(0)->IsDualAnalog) + { + return NewState.LeftStickX; + } + else + { + if (NewState.LeftTrigger > 128) + return 0; + if (NewState.A && ((NewState.RightTrigger > 128) || (NewState.LeftTrigger > 128))) + return 0; + return NewState.LeftStickX; + } + } +#else switch (CURMODE) { case 0: @@ -1607,6 +1775,7 @@ int16 CPad::GetSteeringLeftRight(void) break; } } +#endif return 0; } @@ -1617,10 +1786,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 +1837,7 @@ int16 CPad::GetSteeringUpDown(void) break; } } - +#endif return 0; } @@ -1655,29 +1847,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 +1893,8 @@ int16 CPad::GetCarGunUpDown(void) break; } -#endif } +#endif return 0; } @@ -1700,43 +1903,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; } @@ -1745,23 +1961,46 @@ int16 CPad::GetPedWalkLeftRight(void) { if ( ArePlayerControlsDisabled() ) return 0; + +int16 axis = 0; #ifdef RW_DC - if (NewState.X) - return 0; -#endif + switch (CPad::GetPad(0)->Mode) + { + case 0: //Xbox Mode + if (CPad::GetPad(0)->IsDualAnalog) + { + axis = NewState.LeftStickX; + } + else + { + if (CPad::CameraSinglePress()) + return 0; + axis = NewState.LeftStickX; + } + break; + case 1: //PS2 Mode + if (CPad::GetPad(0)->IsDualAnalog) + { + axis = NewState.LeftStickX; + } + else + { + if (NewState.LeftTrigger > 128) + return 0; + axis = NewState.LeftStickX; + } + break; + } + if (axis > DEADZONE || axis < -DEADZONE) + { + return axis; + } +#else switch (CURMODE) { case 0: -#ifdef RW_DC - case 2: - { - return NewState.LeftStickX; - - break; - } -#else case 2: { int16 axis = NewState.LeftStickX; @@ -1774,7 +2013,6 @@ int16 CPad::GetPedWalkLeftRight(void) break; } -#endif case 1: case 3: { @@ -1783,6 +2021,7 @@ int16 CPad::GetPedWalkLeftRight(void) break; } } +#endif return 0; } @@ -1792,23 +2031,46 @@ int16 CPad::GetPedWalkUpDown(void) { if ( ArePlayerControlsDisabled() ) return 0; - -#ifdef RW_DC - if (NewState.X) - return 0; -#endif +int16 axis = 0; + +#ifdef RW_DC + switch (CPad::GetPad(0)->Mode) + { + case 0: //Xbox Mode + if (CPad::GetPad(0)->IsDualAnalog) + { + axis = NewState.LeftStickY; + } + else + { + if (CPad::CameraSinglePress()) + return 0; + axis = NewState.LeftStickY; + } + break; + case 1: //PS2 Mode + if (CPad::GetPad(0)->IsDualAnalog) + { + axis = NewState.LeftStickY; + } + else + { + if (NewState.LeftTrigger > 128) + return 0; + axis = NewState.LeftStickY; + } + break; + } + + if (axis > DEADZONE || axis < -DEADZONE) + { + return axis; + } +#else switch (CURMODE) { case 0: -#ifdef RW_DC - case 2: - { - return NewState.LeftStickY; - - break; - } -#else case 2: { int16 axis = NewState.LeftStickY; @@ -1821,7 +2083,6 @@ int16 CPad::GetPedWalkUpDown(void) break; } -#endif case 1: case 3: { @@ -1830,6 +2091,7 @@ int16 CPad::GetPedWalkUpDown(void) break; } } +#endif return 0; } @@ -1873,11 +2135,46 @@ 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) + { + if (NewState.Z) + return true; + } + else + { + if (NewState.A && (NewState.LeftStickX < -64)) + return true; + } + break; + case 1: //PS2 Mode + if (CPad::GetPad(0)->IsDualAnalog) + { + if (NewState.LeftTrigger > 128) + return true; + } + else + { + if (NewState.B && (NewState.LeftTrigger > 128)) + return true; + } + break; + } +#else + return !!(NewState.LeftShoulder2 && !NewState.RightShoulder2); + +#endif + + return false; + } bool CPad::GetLookRight(void) @@ -1885,7 +2182,42 @@ 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) + { + if (NewState.C) + return true; + } + else + { + if (NewState.A && (NewState.LeftStickX > 64)) + return true; + } + break; + case 1: //PS2 Mode + if (CPad::GetPad(0)->IsDualAnalog) + { + if (NewState.RightTrigger > 128) + return true; + } + else + { + if (NewState.B && (NewState.RightTrigger > 128)) + return true; + } + break; + } +#else + return !!(NewState.RightShoulder2 && !NewState.LeftShoulder2); + +#endif + + return false; + } @@ -1894,18 +2226,78 @@ 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; + } + break; + 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; + } + break; + } +#else + return !!(NewState.RightShoulder2 && NewState.LeftShoulder2); + +#endif + +return false; + } 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 + +return false; } bool CPad::GetHorn(void) @@ -1913,34 +2305,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 +2357,8 @@ bool CPad::GetHorn(void) break; } -#endif } +#endif return false; } @@ -2019,25 +2408,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 +2449,10 @@ bool CPad::GetCarGunFired(void) break; } -#endif } +#endif + return false; } @@ -2062,25 +2461,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 +2502,8 @@ bool CPad::CarGunJustDown(void) break; } -#endif } +#endif return false; } @@ -2105,31 +2513,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 +2560,8 @@ int16 CPad::GetHandBrake(void) break; } -#endif } +#endif return 0; } @@ -2162,36 +2571,33 @@ 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) + { + if(NewState.X) + return 255; + } + else + { + if(NewState.X) + return 255; + } + } +#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 +2625,7 @@ int16 CPad::GetBrake(void) break; } #endif - } + return 0; } @@ -2316,34 +2722,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 +2766,10 @@ int32 CPad::GetWeapon(void) { return NewState.RightShoulder1; } -#endif } +#endif + return false; } @@ -2369,34 +2778,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 +2822,8 @@ bool CPad::WeaponJustDown(void) { return !!(NewState.RightShoulder1 && !OldState.RightShoulder1); } -#endif } +#endif return false; } @@ -2422,36 +2833,37 @@ 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) + { + if(NewState.A) + return 255; + } + else + { + if(NewState.A) + return 255; + } + } + +#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 +2889,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 +2950,17 @@ bool CPad::CycleCameraModeUpJustDown(void) break; } } +#endif return false; } bool CPad::CycleCameraModeDownJustDown(void) { + +#ifdef RW_DC + +#else switch (CURMODE) { case 0: @@ -2535,6 +2979,7 @@ bool CPad::CycleCameraModeDownJustDown(void) break; } } +#endif return false; } @@ -2543,7 +2988,33 @@ 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.DPadRight&& !OldState.DPadRight); + } + else + { + return !!(NewState.DPadRight && !OldState.DPadRight); + } + break; + case 1: //PS2 Mode + if (CPad::GetPad(0)->IsDualAnalog) + { + return NewState.Z; + } + else + { + return !!(NewState.DPadRight && !OldState.DPadRight); + } + break; + } + +#else switch (CURMODE) { case 0: @@ -2574,6 +3045,7 @@ bool CPad::ChangeStationJustDown(void) break; } } +#endif return false; } @@ -2606,25 +3078,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 +3120,10 @@ bool CPad::GetTarget(void) { return !!NewState.LeftShoulder1; break; - } -#endif + } } +#endif return false; } @@ -2646,25 +3132,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 +3178,8 @@ bool CPad::TargetJustDown(void) break; } -#endif } +#endif return false; } @@ -2689,7 +3189,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 +3220,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 +3263,8 @@ bool CPad::GetSprint(void) break; } -#endif } +#endif return false; } @@ -2744,7 +3275,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 +3309,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); @@ -2994,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: @@ -3021,7 +3598,7 @@ bool CPad::ForceCameraBehindPlayer(void) break; } } - +#endif return false; } @@ -3150,10 +3727,37 @@ 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 (!CPad::CameraSinglePress()) + return 0; + axis = NewState.LeftStickX; + } + break; + case 1: //PS2 Mode + if (CPad::GetPad(0)->IsDualAnalog) + { + axis = NewState.RightStickX; + } + else + { + if (!(NewState.LeftTrigger > 128)) + return 0; + axis = NewState.LeftStickX; + } + break; + } + #else float axis = GetPad(0)->NewState.RightStickX; #endif @@ -3165,16 +3769,42 @@ int16 CPad::LookAroundLeftRight(void) 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) { - 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 (!CPad::CameraSinglePress()) + return 0; + axis = NewState.LeftStickY; + } + break; + case 1: //PS2 Mode + if (CPad::GetPad(0)->IsDualAnalog) + { + axis = NewState.RightStickY; + } + else + { + if (!(NewState.LeftTrigger > 128)) + return 0; + axis = NewState.LeftStickY; + } + break; + } + #else int16 axis = GetPad(0)->NewState.RightStickY; #endif @@ -3195,11 +3825,9 @@ int16 CPad::LookAroundUpDown(void) 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) { AverageWeapon = GetWeapon(); diff --git a/src/core/Pad.h b/src/core/Pad.h index 0421c88e..507faa8a 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,13 @@ public: int32 LastTimeTouched; int32 AverageWeapon; int32 AverageEntries; + bool IsKeyboardMouse; + bool IsDualAnalog; + bool CameraJustDown; + bool CameraJustUp; + uint32 CameraJustUpTime; + uint32 CameraLastPressed; + bool CameraIsDoublePressed; #ifdef DETECT_PAD_INPUT_SWITCH static bool IsAffectedByController; @@ -211,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);