re3/src/core/Pad.cpp

2838 lines
55 KiB
C++
Raw Normal View History

2019-06-13 00:35:26 +00:00
#pragma warning( push )
#pragma warning( disable : 4005)
2020-04-26 10:25:03 +00:00
#if defined RW_D3D9 || defined RWLIBS
2019-06-13 00:35:26 +00:00
#define DIRECTINPUT_VERSION 0x0800
#include <dinput.h>
2020-04-26 10:25:03 +00:00
#endif
2019-06-13 00:35:26 +00:00
#pragma warning( pop )
2019-05-15 14:52:37 +00:00
#include "common.h"
2020-04-26 10:25:03 +00:00
#include "crossplatform.h"
2020-03-27 18:54:35 +00:00
#ifdef XINPUT
2020-04-19 16:34:08 +00:00
#include <xinput.h>
#pragma comment( lib, "Xinput9_1_0.lib" )
2020-03-27 18:54:35 +00:00
#endif
2020-04-17 13:31:11 +00:00
2019-05-15 14:52:37 +00:00
#include "Pad.h"
2019-06-13 00:35:26 +00:00
#include "ControllerConfig.h"
#include "Timer.h"
#include "Frontend.h"
#include "Camera.h"
#include "Game.h"
#include "CutsceneMgr.h"
#include "Font.h"
#include "Hud.h"
2019-06-13 00:35:26 +00:00
#include "Text.h"
#include "Timer.h"
2020-04-10 08:03:38 +00:00
#include "Record.h"
2019-06-13 00:35:26 +00:00
#include "World.h"
#include "Vehicle.h"
#include "Ped.h"
#include "Population.h"
2020-04-10 23:03:42 +00:00
#include "Record.h"
2019-06-13 00:35:26 +00:00
#include "Replay.h"
#include "Weather.h"
2020-04-08 21:16:29 +00:00
#include "Streaming.h"
#include "PathFind.h"
#include "Wanted.h"
#include "General.h"
2019-05-15 14:52:37 +00:00
2020-06-27 21:01:51 +00:00
#ifdef GTA_PS2
#include "eetypes.h"
#include "libpad.h"
#endif
2020-04-17 05:54:14 +00:00
CPad Pads[MAX_PADS];
2020-06-27 21:01:51 +00:00
#ifdef GTA_PS2
u_long128 pad_dma_buf[scePadDmaBufferMax] __attribute__((aligned(64)));
u_long128 pad2_dma_buf[scePadDmaBufferMax] __attribute__((aligned(64)));
#endif
2020-04-17 05:54:14 +00:00
CMousePointerStateHelper MousePointerStateHelper;
2020-04-17 05:54:14 +00:00
bool CPad::bDisplayNoControllerMessage;
bool CPad::bObsoleteControllerMessage;
bool CPad::bOldDisplayNoControllerMessage;
2020-04-17 05:54:14 +00:00
bool CPad::m_bMapPadOneToPadTwo;
2020-06-27 21:01:51 +00:00
#ifdef GTA_PS2
unsigned char act_direct[6];
unsigned char act_align[6];
#endif
2019-06-13 00:35:26 +00:00
2020-04-17 05:54:14 +00:00
CKeyboardState CPad::OldKeyState;
CKeyboardState CPad::NewKeyState;
CKeyboardState CPad::TempKeyState;
2019-05-15 14:52:37 +00:00
char CPad::KeyBoardCheatString[20];
2019-06-13 00:35:26 +00:00
2020-04-17 05:54:14 +00:00
CMouseControllerState CPad::OldMouseControllerState;
CMouseControllerState CPad::NewMouseControllerState;
CMouseControllerState CPad::PCTempMouseControllerState;
2019-05-15 14:52:37 +00:00
#ifdef DETECT_PAD_INPUT_SWITCH
bool CPad::IsAffectedByController = false;
#endif
2019-06-13 00:35:26 +00:00
_TODO("gbFastTime");
2020-04-17 05:54:14 +00:00
extern bool gbFastTime;
2019-05-31 17:02:26 +00:00
2020-04-08 21:16:29 +00:00
void WeaponCheat()
{
CHud::SetHelpMessage(TheText.Get("CHEAT2"), true);
FindPlayerPed()->GiveWeapon(WEAPONTYPE_BASEBALLBAT, 0);
FindPlayerPed()->GiveWeapon(WEAPONTYPE_COLT45, 100);
FindPlayerPed()->GiveWeapon(WEAPONTYPE_UZI, 100);
FindPlayerPed()->GiveWeapon(WEAPONTYPE_SHOTGUN, 20);
FindPlayerPed()->GiveWeapon(WEAPONTYPE_AK47, 200);
FindPlayerPed()->GiveWeapon(WEAPONTYPE_M16, 200);
FindPlayerPed()->GiveWeapon(WEAPONTYPE_SNIPERRIFLE, 5);
FindPlayerPed()->GiveWeapon(WEAPONTYPE_ROCKETLAUNCHER, 5);
FindPlayerPed()->GiveWeapon(WEAPONTYPE_MOLOTOV, 5);
FindPlayerPed()->GiveWeapon(WEAPONTYPE_GRENADE, 5);
FindPlayerPed()->GiveWeapon(WEAPONTYPE_FLAMETHROWER, 200);
}
void HealthCheat()
{
CHud::SetHelpMessage(TheText.Get("CHEAT3"), true);
FindPlayerPed()->m_fHealth = 100.0f;
if (FindPlayerVehicle()) {
FindPlayerVehicle()->m_fHealth = 1000.0f;
if (FindPlayerVehicle()->m_vehType == VEHICLE_TYPE_CAR)
((CAutomobile*)FindPlayerVehicle())->Damage.SetEngineStatus(0);
}
}
void TankCheat()
{
CHud::SetHelpMessage(TheText.Get("CHEAT1"), true);
CStreaming::RequestModel(MI_RHINO, 0);
CStreaming::LoadAllRequestedModels(false);
if (CStreaming::ms_aInfoForModel[MI_RHINO].m_loadState == STREAMSTATE_LOADED) {
CHud::SetHelpMessage(TheText.Get("CHEAT1"), true);
int32 node = ThePaths.FindNodeClosestToCoors(FindPlayerCoors(), PATH_CAR, 100.0f);
if (node < 0) return;
#ifdef FIX_BUGS
CAutomobile* tank = new CAutomobile(MI_RHINO, RANDOM_VEHICLE);
#else
CAutomobile *tank = new CAutomobile(MI_RHINO, MISSION_VEHICLE);
#endif
if (tank != nil) {
CVector pos = ThePaths.m_pathNodes[node].GetPosition();
2020-04-08 21:16:29 +00:00
pos.z += 4.0f;
2020-05-02 12:28:19 +00:00
tank->SetPosition(pos);
2020-04-08 21:16:29 +00:00
tank->SetOrientation(0.0f, 0.0f, DEGTORAD(200.0f));
tank->SetStatus(STATUS_ABANDONED);
2020-04-08 21:16:29 +00:00
tank->m_nDoorLock = CARLOCK_UNLOCKED;
CWorld::Add(tank);
}
}
}
void BlowUpCarsCheat()
{
CHud::SetHelpMessage(TheText.Get("CHEAT1"), true);
int i = CPools::GetVehiclePool()->GetSize();
while (i-- > 0) {
if (CVehicle *veh = CPools::GetVehiclePool()->GetSlot(i))
veh->BlowUpCar(nil);
}
}
void ChangePlayerCheat()
{
int modelId;
if (FindPlayerPed()->IsPedInControl() && CModelInfo::GetModelInfo("player", nil)) {
CHud::SetHelpMessage(TheText.Get("CHEAT1"), true);
CPlayerPed *ped = FindPlayerPed();
AssocGroupId AnimGrp = ped->m_animGroup;
do
{
do
modelId = CGeneral::GetRandomNumberInRange(0, MI_CAS_WOM+1);
while (!CModelInfo::GetModelInfo(modelId));
} while (modelId >= MI_SPECIAL01 && modelId <= MI_SPECIAL04 || modelId == MI_TAXI_D);
uint8 flags = CStreaming::ms_aInfoForModel[modelId].m_flags;
ped->DeleteRwObject();
CStreaming::RequestModel(modelId, STREAMFLAGS_DEPENDENCY| STREAMFLAGS_DONT_REMOVE);
CStreaming::LoadAllRequestedModels(false);
ped->m_modelIndex = -1;
ped->SetModelIndex(modelId);
ped->m_animGroup = AnimGrp;
if (modelId != MI_PLAYER) {
if (!(flags & STREAMFLAGS_DONT_REMOVE))
CStreaming::SetModelIsDeletable(modelId);
}
}
}
void MayhemCheat()
{
CHud::SetHelpMessage(TheText.Get("CHEAT1"), true);
for (int i = PEDTYPE_CIVMALE; i < PEDTYPE_SPECIAL; i++)
CPedType::SetThreats(i, PED_FLAG_PLAYER1 | PED_FLAG_PLAYER2 | PED_FLAG_PLAYER3 | PED_FLAG_PLAYER4 |
PED_FLAG_CIVMALE | PED_FLAG_CIVFEMALE | PED_FLAG_COP | PED_FLAG_GANG1 |
PED_FLAG_GANG2 | PED_FLAG_GANG3 | PED_FLAG_GANG4 | PED_FLAG_GANG5 |
PED_FLAG_GANG6 | PED_FLAG_GANG7 | PED_FLAG_GANG8 | PED_FLAG_GANG9 |
PED_FLAG_EMERGENCY | PED_FLAG_PROSTITUTE | PED_FLAG_CRIMINAL | PED_FLAG_SPECIAL );
}
void EverybodyAttacksPlayerCheat()
{
CHud::SetHelpMessage(TheText.Get("CHEAT1"), true);
for (int i = PEDTYPE_CIVMALE; i < PEDTYPE_SPECIAL; i++)
CPedType::AddThreat(i, PED_FLAG_PLAYER1);
}
void WeaponsForAllCheat()
{
CHud::SetHelpMessage(TheText.Get("CHEAT1"), true);
CPopulation::ms_bGivePedsWeapons = !CPopulation::ms_bGivePedsWeapons;
}
void FastTimeCheat()
{
CHud::SetHelpMessage(TheText.Get("CHEAT1"), true);
if (CTimer::GetTimeScale() < 4.0f)
CTimer::SetTimeScale(CTimer::GetTimeScale() * 2.0f);
}
void SlowTimeCheat()
{
CHud::SetHelpMessage(TheText.Get("CHEAT1"), true);
if (CTimer::GetTimeScale() > 0.25f)
CTimer::SetTimeScale(CTimer::GetTimeScale() * 0.5f);
}
void MoneyCheat()
{
CWorld::Players[CWorld::PlayerInFocus].m_nMoney += 250000;
CHud::SetHelpMessage(TheText.Get("CHEAT6"), true);
}
void ArmourCheat()
{
CHud::SetHelpMessage(TheText.Get("CHEAT4"), true);
FindPlayerPed()->m_fArmour = 100.0f;
}
void WantedLevelUpCheat()
{
CHud::SetHelpMessage(TheText.Get("CHEAT5"), true);
2020-04-19 16:34:08 +00:00
FindPlayerPed()->SetWantedLevel(Min(FindPlayerPed()->m_pWanted->m_nWantedLevel + 2, 6));
2020-04-08 21:16:29 +00:00
}
void WantedLevelDownCheat()
{
CHud::SetHelpMessage(TheText.Get("CHEAT5"), true);
FindPlayerPed()->SetWantedLevel(0);
}
void SunnyWeatherCheat()
{
CHud::SetHelpMessage(TheText.Get("CHEAT7"), true);
CWeather::ForceWeatherNow(WEATHER_SUNNY);
}
void CloudyWeatherCheat()
{
CHud::SetHelpMessage(TheText.Get("CHEAT7"), true);
CWeather::ForceWeatherNow(WEATHER_CLOUDY);
}
void RainyWeatherCheat()
{
CHud::SetHelpMessage(TheText.Get("CHEAT7"), true);
CWeather::ForceWeatherNow(WEATHER_RAINY);
}
void FoggyWeatherCheat()
{
CHud::SetHelpMessage(TheText.Get("CHEAT7"), true);
CWeather::ForceWeatherNow(WEATHER_FOGGY);
}
void FastWeatherCheat()
{
CHud::SetHelpMessage(TheText.Get("CHEAT1"), true);
gbFastTime = !gbFastTime;
}
void OnlyRenderWheelsCheat()
{
CHud::SetHelpMessage(TheText.Get("CHEAT1"), true);
CVehicle::bWheelsOnlyCheat = !CVehicle::bWheelsOnlyCheat;
}
void ChittyChittyBangBangCheat()
{
CHud::SetHelpMessage(TheText.Get("CHEAT1"), true);
CVehicle::bAllDodosCheat = !CVehicle::bAllDodosCheat;
}
void StrongGripCheat()
{
CHud::SetHelpMessage(TheText.Get("CHEAT1"), true);
CVehicle::bCheat3 = !CVehicle::bCheat3;
}
void NastyLimbsCheat()
{
CPed::bNastyLimbsCheat = !CPed::bNastyLimbsCheat;
}
2019-06-13 00:35:26 +00:00
//////////////////////////////////////////////////////////////////////////
#ifdef KANGAROO_CHEAT
void KangarooCheat()
{
wchar *string;
CPed *playerPed = FindPlayerPed();
int m_fMass;
if (playerPed->m_ped_flagI80) {
string = TheText.Get("CHEATOF");
m_fMass = 70.0f;
} else {
string = TheText.Get("CHEAT1");
m_fMass = 15.0f;
}
2020-04-08 21:16:29 +00:00
CHud::SetHelpMessage(string, true);
playerPed->m_ped_flagI80 = !playerPed->m_ped_flagI80;
playerPed->m_fMass = m_fMass;
playerPed->m_fAirResistance = 0.4f / m_fMass;
}
#endif
2020-04-25 18:25:14 +00:00
#ifdef ALLCARSHELI_CHEAT
void AllCarsHeliCheat(void)
{
wchar* string;
if (bAllCarCheat) {
string = TheText.Get("CHEATOF");
bAllCarCheat = false;
}
else {
string = TheText.Get("CHEAT1");
bAllCarCheat = true;
}
CHud::SetHelpMessage(string, true);
}
#endif
#ifdef ALT_DODO_CHEAT
void AltDodoCheat(void)
{
wchar* string;
if (CVehicle::bAltDodoCheat) {
string = TheText.Get("CHEATOF");
CVehicle::bAltDodoCheat = false;
}
else {
string = TheText.Get("CHEAT1");
CVehicle::bAltDodoCheat = true;
}
CHud::SetHelpMessage(string, true);
}
#endif
bool
CControllerState::IsAnyButtonPressed(void)
{
2020-06-27 21:01:51 +00:00
return !!RightStickX || !!RightStickY || !!LeftStickX || !!LeftStickY
|| !!DPadUp || !!DPadDown || !!DPadLeft || !!DPadRight
|| !!Triangle || !!Cross || !!Circle || !!Square
|| !!Start || !!Select
|| !!LeftShoulder1 || !!LeftShoulder2 || !!RightShoulder1 || !!RightShoulder2
|| !!LeftShock || !!RightShock
|| !!NetworkTalk;
}
2019-05-15 14:52:37 +00:00
void
CControllerState::Clear(void)
{
2019-06-13 00:35:26 +00:00
LeftStickX = LeftStickY = RightStickX = RightStickY = 0;
LeftShoulder1 = LeftShoulder2 = RightShoulder1 = RightShoulder2 = 0;
DPadUp = DPadDown = DPadLeft = DPadRight = 0;
Start = Select = 0;
Square = Triangle = Cross = Circle = 0;
LeftShock = RightShock = 0;
NetworkTalk = 0;
}
2019-06-13 00:35:26 +00:00
void CKeyboardState::Clear()
{
2019-06-16 22:16:38 +00:00
for ( int32 i = 0; i < 12; i++ )
2019-06-13 00:35:26 +00:00
F[i] = 0;
2019-06-16 22:16:38 +00:00
for ( int32 i = 0; i < 256; i++ )
2019-06-13 00:35:26 +00:00
VK_KEYS[i] = 0;
ESC = INS = DEL = HOME = END = PGUP = PGDN = 0;
UP = DOWN = LEFT = RIGHT = 0;
NUMLOCK = 0;
DIV = MUL = SUB = ADD = 0;
DECIMAL = NUM1 = NUM2 = NUM3 = NUM4 = 0;
NUM5 = NUM6 = NUM7 = NUM8 = 0;
NUM9 = NUM0 = SCROLLLOCK = PAUSE = 0;
BACKSP = TAB = CAPSLOCK = EXTENTER = 0;
LSHIFT = SHIFT = RSHIFT = LCTRL = RCTRL = LALT = RALT = 0;
LWIN = RWIN = APPS = 0;
}
2020-04-09 03:20:44 +00:00
#ifdef GTA_PS2_STUFF
void CPad::Initialise(void)
{
2020-06-27 21:01:51 +00:00
#ifdef GTA_PS2
scePadInit(0);
scePadPortOpen(0, 0, pad_dma_buf );
scePadPortOpen(1, 0, pad2_dma_buf );
#endif
for (int i = 0; i < MAX_PADS; i++)
{
CPad::GetPad(i)->Clear(true);
CPad::GetPad(i)->Mode = 0;
}
bObsoleteControllerMessage = false;
bOldDisplayNoControllerMessage = false;
bDisplayNoControllerMessage = false;
}
2020-04-09 03:20:44 +00:00
#endif
2019-06-16 22:16:38 +00:00
void CPad::Clear(bool bResetPlayerControls)
2019-06-13 00:35:26 +00:00
{
NewState.Clear();
OldState.Clear();
PCTempKeyState.Clear();
PCTempJoyState.Clear();
PCTempMouseState.Clear();
NewKeyState.Clear();
OldKeyState.Clear();
TempKeyState.Clear();
NewMouseControllerState.Clear();
OldMouseControllerState.Clear();
PCTempMouseControllerState.Clear();
Phase = 0;
ShakeFreq = 0;
ShakeDur = 0;
if ( bResetPlayerControls )
2019-07-15 12:11:40 +00:00
DisablePlayerControls = PLAYERCONTROL_ENABLED;
2019-06-13 00:35:26 +00:00
bApplyBrakes = false;
2020-04-09 03:20:44 +00:00
for ( int32 i = 0; i < HORNHISTORY_SIZE; i++ )
2019-06-13 00:35:26 +00:00
bHornHistory[i] = false;
iCurrHornHistory = 0;
2020-04-09 03:20:44 +00:00
for ( int32 i = 0; i < ARRAY_SIZE(CheatString); i++ )
CheatString[i] = ' ';
2019-06-13 00:35:26 +00:00
LastTimeTouched = CTimer::GetTimeInMilliseconds();
AverageWeapon = 0;
AverageEntries = 0;
}
void CPad::ClearMouseHistory()
{
PCTempMouseControllerState.Clear();
NewMouseControllerState.Clear();
OldMouseControllerState.Clear();
}
CMouseControllerState::CMouseControllerState()
{
LMB = 0;
RMB = 0;
MMB = 0;
WHEELUP = 0;
WHEELDN = 0;
MXB1 = 0;
MXB2 = 0;
x = 0.0f;
y = 0.0f;
}
void CMouseControllerState::Clear()
{
LMB = 0;
RMB = 0;
MMB = 0;
WHEELUP = 0;
WHEELDN = 0;
MXB1 = 0;
MXB2 = 0;
}
CMouseControllerState CMousePointerStateHelper::GetMouseSetUp()
{
2019-06-13 00:35:26 +00:00
CMouseControllerState state;
2020-04-26 10:25:03 +00:00
#if defined RW_D3D9 || defined RWLIBS
2019-06-30 10:53:39 +00:00
if ( PSGLOBAL(mouse) == nil )
2019-06-13 00:35:26 +00:00
_InputInitialiseMouse();
2019-06-30 10:53:39 +00:00
if ( PSGLOBAL(mouse) != nil )
2019-06-13 00:35:26 +00:00
{
DIDEVCAPS devCaps;
devCaps.dwSize = sizeof(DIDEVCAPS);
PSGLOBAL(mouse)->GetCapabilities(&devCaps);
switch ( devCaps.dwButtons )
{
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
state.MMB = true;
case 2:
state.RMB = true;
case 1:
state.LMB = true;
}
if ( devCaps.dwAxes == 3 )
{
state.WHEELDN = true;
state.WHEELUP = true;
}
}
2020-04-26 10:25:03 +00:00
#else
// It seems there is no way to get number of buttons on mouse, so assign all buttons if we have mouse.
double xpos = 1.0f, ypos;
glfwGetCursorPos(PSGLOBAL(window), &xpos, &ypos);
2020-05-11 23:24:57 +00:00
if (xpos != 0.f) {
2020-04-26 10:25:03 +00:00
state.MMB = true;
state.RMB = true;
state.LMB = true;
state.WHEELDN = true;
state.WHEELUP = true;
}
#endif
2019-06-13 00:35:26 +00:00
return state;
}
2019-06-13 00:35:26 +00:00
void CPad::UpdateMouse()
2019-05-31 17:02:26 +00:00
{
2019-06-13 00:35:26 +00:00
if ( IsForegroundApp() )
{
2020-04-26 10:25:03 +00:00
#if defined RW_D3D9 || defined RWLIBS
2019-06-30 10:53:39 +00:00
if ( PSGLOBAL(mouse) == nil )
2019-06-13 00:35:26 +00:00
_InputInitialiseMouse();
DIMOUSESTATE2 state;
2019-06-30 10:53:39 +00:00
if ( PSGLOBAL(mouse) != nil && SUCCEEDED(_InputGetMouseState(&state)) )
2019-06-13 00:35:26 +00:00
{
2019-06-16 22:16:38 +00:00
int32 signX = 1;
int32 signy = 1;
2019-06-13 00:35:26 +00:00
if ( !FrontEndMenuManager.m_bMenuActive )
{
if ( MousePointerStateHelper.bInvertVertically )
signy = -1;
if ( MousePointerStateHelper.bInvertHorizontally )
signX = -1;
}
PCTempMouseControllerState.Clear();
2019-06-16 22:16:38 +00:00
PCTempMouseControllerState.x = (float)(signX * state.lX);
PCTempMouseControllerState.y = (float)(signy * state.lY);
2019-06-13 00:35:26 +00:00
PCTempMouseControllerState.LMB = state.rgbButtons[0] & 128;
PCTempMouseControllerState.RMB = state.rgbButtons[1] & 128;
PCTempMouseControllerState.MMB = state.rgbButtons[2] & 128;
PCTempMouseControllerState.MXB1 = state.rgbButtons[3] & 128;
PCTempMouseControllerState.MXB2 = state.rgbButtons[4] & 128;
if ( state.lZ > 0 )
PCTempMouseControllerState.WHEELUP = 1;
else if ( state.lZ < 0 )
PCTempMouseControllerState.WHEELDN = 1;
OldMouseControllerState = NewMouseControllerState;
NewMouseControllerState = PCTempMouseControllerState;
}
2020-04-26 10:25:03 +00:00
#else
double xpos = 1.0f, ypos;
glfwGetCursorPos(PSGLOBAL(window), &xpos, &ypos);
2020-05-11 23:24:57 +00:00
if (xpos == 0.f)
2020-04-26 10:25:03 +00:00
return;
int32 signX = 1;
int32 signy = 1;
if (!FrontEndMenuManager.m_bMenuActive)
{
if (MousePointerStateHelper.bInvertVertically)
signy = -1;
if (MousePointerStateHelper.bInvertHorizontally)
signX = -1;
}
PCTempMouseControllerState.Clear();
PCTempMouseControllerState.x = (float)(signX * (xpos - PSGLOBAL(lastMousePos.x)));
PCTempMouseControllerState.y = (float)(signy * (ypos - PSGLOBAL(lastMousePos.y)));
PCTempMouseControllerState.LMB = glfwGetMouseButton(PSGLOBAL(window), GLFW_MOUSE_BUTTON_LEFT);
PCTempMouseControllerState.RMB = glfwGetMouseButton(PSGLOBAL(window), GLFW_MOUSE_BUTTON_RIGHT);
PCTempMouseControllerState.MMB = glfwGetMouseButton(PSGLOBAL(window), GLFW_MOUSE_BUTTON_MIDDLE);
PCTempMouseControllerState.MXB1 = glfwGetMouseButton(PSGLOBAL(window), GLFW_MOUSE_BUTTON_4);
PCTempMouseControllerState.MXB2 = glfwGetMouseButton(PSGLOBAL(window), GLFW_MOUSE_BUTTON_5);
if (PSGLOBAL(mouseWheel) > 0)
PCTempMouseControllerState.WHEELUP = 1;
else if (PSGLOBAL(mouseWheel) < 0)
PCTempMouseControllerState.WHEELDN = 1;
2020-04-29 15:53:05 +00:00
PSGLOBAL(lastMousePos.x) = xpos;
PSGLOBAL(lastMousePos.y) = ypos;
PSGLOBAL(mouseWheel) = 0.0f;
2020-04-26 10:25:03 +00:00
OldMouseControllerState = NewMouseControllerState;
NewMouseControllerState = PCTempMouseControllerState;
#endif
2019-06-13 00:35:26 +00:00
}
}
CControllerState CPad::ReconcileTwoControllersInput(CControllerState const &State1, CControllerState const &State2)
{
static CControllerState ReconState;
2019-05-31 17:02:26 +00:00
2019-06-13 00:35:26 +00:00
ReconState.Clear();
2019-05-31 17:02:26 +00:00
2019-06-13 00:35:26 +00:00
#define _RECONCILE_BUTTON(button) \
{ if ( State1.button || State2.button ) ReconState.button = 255; }
2019-05-31 17:02:26 +00:00
2019-06-13 00:35:26 +00:00
#define _RECONCILE_AXIS_POSITIVE(axis) \
2020-04-19 16:34:08 +00:00
{ if ( State1.axis >= 0 && State2.axis >= 0 ) ReconState.axis = Max(State1.axis, State2.axis); }
2019-06-13 00:35:26 +00:00
#define _RECONCILE_AXIS_NEGATIVE(axis) \
2020-04-19 16:34:08 +00:00
{ if ( State1.axis <= 0 && State2.axis <= 0 ) ReconState.axis = Min(State1.axis, State2.axis); }
2019-06-13 00:35:26 +00:00
#define _RECONCILE_AXIS(axis) \
{ _RECONCILE_AXIS_POSITIVE(axis); _RECONCILE_AXIS_NEGATIVE(axis); }
2019-05-31 17:02:26 +00:00
2019-06-13 00:35:26 +00:00
#define _FIX_AXIS_DIR(axis) \
{ if ( State1.axis > 0 && State2.axis < 0 || State1.axis < 0 && State2.axis > 0 ) ReconState.axis = 0; }
#define _FIX_RECON_DIR(pos, neg, axis) \
{ if ( (ReconState.pos || ReconState.axis < 0) && (ReconState.neg || ReconState.axis > 0) ) { ReconState.pos = 0; ReconState.neg = 0; ReconState.axis = 0; } }
_RECONCILE_BUTTON(LeftShoulder1);
_RECONCILE_BUTTON(LeftShoulder2);
_RECONCILE_BUTTON(RightShoulder1);
_RECONCILE_BUTTON(RightShoulder2);
_RECONCILE_BUTTON(Start);
_RECONCILE_BUTTON(Select);
_RECONCILE_BUTTON(Square);
_RECONCILE_BUTTON(Triangle);
_RECONCILE_BUTTON(Cross);
_RECONCILE_BUTTON(Circle);
_RECONCILE_BUTTON(LeftShock);
_RECONCILE_BUTTON(RightShock);
_RECONCILE_BUTTON(NetworkTalk);
_RECONCILE_AXIS(LeftStickX);
_RECONCILE_AXIS(LeftStickY);
_FIX_AXIS_DIR(LeftStickX);
_FIX_AXIS_DIR(LeftStickY);
_RECONCILE_AXIS(RightStickX);
_RECONCILE_AXIS(RightStickY);
_FIX_AXIS_DIR(RightStickX);
_FIX_AXIS_DIR(RightStickY);
_RECONCILE_BUTTON(DPadUp);
_RECONCILE_BUTTON(DPadDown);
_RECONCILE_BUTTON(DPadLeft);
_RECONCILE_BUTTON(DPadRight);
_FIX_RECON_DIR(DPadUp, DPadDown, LeftStickY);
_FIX_RECON_DIR(DPadLeft, DPadRight, LeftStickX);
return ReconState;
2019-05-31 17:02:26 +00:00
2019-06-13 00:35:26 +00:00
#undef _RECONCILE_BUTTON
#undef _RECONCILE_AXIS_POSITIVE
#undef _RECONCILE_AXIS_NEGATIVE
#undef _RECONCILE_AXIS
#undef _FIX_AXIS_DIR
#undef _FIX_RECON_DIR
}
2019-06-16 22:16:38 +00:00
void CPad::StartShake(int16 nDur, uint8 nFreq)
2019-06-13 00:35:26 +00:00
{
if ( !CMenuManager::m_PrefsUseVibration )
return;
2019-05-31 17:02:26 +00:00
2019-06-13 00:58:29 +00:00
if ( CCutsceneMgr::IsRunning() || CGame::playingIntro )
2019-06-13 00:35:26 +00:00
return;
2019-05-31 17:02:26 +00:00
2019-06-13 00:35:26 +00:00
if ( nFreq == 0 )
{
ShakeDur = 0;
ShakeFreq = 0;
return;
}
2019-05-31 17:02:26 +00:00
2019-06-13 00:35:26 +00:00
if ( nDur > ShakeDur )
{
ShakeDur = nDur;
ShakeFreq = nFreq;
}
}
2019-05-31 17:02:26 +00:00
2019-06-16 22:16:38 +00:00
void CPad::StartShake_Distance(int16 nDur, uint8 nFreq, float fX, float fY, float fZ)
2019-06-13 00:35:26 +00:00
{
if ( !CMenuManager::m_PrefsUseVibration )
return;
2019-06-13 00:58:29 +00:00
if ( CCutsceneMgr::IsRunning() || CGame::playingIntro )
2019-06-13 00:35:26 +00:00
return;
2019-06-16 22:16:38 +00:00
float fDist = ( TheCamera.GetPosition() - CVector(fX, fY, fZ) ).Magnitude();
2019-06-13 00:35:26 +00:00
if ( fDist < 70.0f )
{
if ( nFreq == 0 )
{
ShakeDur = 0;
ShakeFreq = 0;
return;
}
if ( nDur > ShakeDur )
{
ShakeDur = nDur;
ShakeFreq = nFreq;
}
}
}
2019-05-31 17:02:26 +00:00
2019-06-16 22:16:38 +00:00
void CPad::StartShake_Train(float fX, float fY)
2019-06-13 00:35:26 +00:00
{
if ( !CMenuManager::m_PrefsUseVibration )
return;
2019-06-13 00:58:29 +00:00
if ( CCutsceneMgr::IsRunning() || CGame::playingIntro )
2019-06-13 00:35:26 +00:00
return;
2019-06-30 10:53:39 +00:00
if (FindPlayerVehicle() != nil && FindPlayerVehicle()->IsTrain() )
2019-06-13 00:35:26 +00:00
return;
2019-06-16 22:16:38 +00:00
float fDist = ( TheCamera.GetPosition() - CVector(fX, fY, 0.0f) ).Magnitude2D();
2019-06-13 00:35:26 +00:00
if ( fDist < 70.0f )
{
2019-06-16 22:16:38 +00:00
int32 freq = (int32)((70.0f - fDist) * 70.0f / 70.0f + 30.0f);
2019-05-31 17:02:26 +00:00
2019-06-13 00:35:26 +00:00
if ( ShakeDur < 100 )
{
ShakeDur = 100;
ShakeFreq = freq;
}
}
2019-05-31 17:02:26 +00:00
}
2020-04-09 03:20:44 +00:00
#ifdef GTA_PS2_STUFF
void CPad::AddToCheatString(char c)
{
for ( int32 i = ARRAY_SIZE(CheatString) - 2; i >= 0; i-- )
CheatString[i + 1] = CheatString[i];
2020-04-15 05:03:53 +00:00
CheatString[0] = c;
2020-04-09 03:20:44 +00:00
#define _CHEATCMP(str) strncmp(str, CheatString, sizeof(str)-1)
// "4414LDRULDRU" - R2 R2 L1 R2 LEFT DOWN RIGHT UP LEFT DOWN RIGHT UP
if ( !_CHEATCMP("URDLURDL4144") )
WeaponCheat();
// "4411LDRULDRU" - R2 R2 L1 L1 LEFT DOWN RIGHT UP LEFT DOWN RIGHT UP
else if ( !_CHEATCMP("URDLURDL1144") )
MoneyCheat();
// "4412LDRULDRU" - R2 R2 L1 L2 LEFT DOWN RIGHT UP LEFT DOWN RIGHT UP
else if ( !_CHEATCMP("URDLURDL2144") )
ArmourCheat();
// "4413LDRULDRU" - R2 R2 L1 R1 LEFT DOWN RIGHT UP LEFT DOWN RIGHT UP
else if ( !_CHEATCMP("URDLURDL3144") )
HealthCheat();
// "4414LRLRLR" - R2 R2 L1 R2 LEFT RIGHT LEFT RIGHT LEFT RIGHT
else if ( !_CHEATCMP("RLRLRL4144") )
WantedLevelUpCheat();
// "4414UDUDUD" - R2 R2 L1 R2 UP DOWN UP DOWN UP DOWN
else if ( !_CHEATCMP("DUDUDU4144") )
WantedLevelDownCheat();
// "1234432T" - L1 L2 R1 R2 R2 R1 L2 TRIANGLE
else if ( !_CHEATCMP("T2344321") )
SunnyWeatherCheat();
// "1234432S" - L1 L2 R1 R2 R2 R1 L2 SQUARE
else if ( !_CHEATCMP("S2344321") )
CloudyWeatherCheat();
// "1234432C" - L1 L2 R1 R2 R2 R1 L2 CIRCLE
else if ( !_CHEATCMP("C2344321") )
RainyWeatherCheat();
// "1234432X" - L1 L2 R1 R2 R2 R1 L2 CROSS
else if ( !_CHEATCMP("X2344321") )
FoggyWeatherCheat();
// "CCCCCC321TCT" - CIRCLE CIRCLE CIRCLE CIRCLE CIRCLE CIRCLE R1 L2 L1 TRIANGLE CIRCLE TRIANGLE
else if ( !_CHEATCMP("TCT123CCCCCC") )
TankCheat();
// "CCCSSSSS1TCT" - CIRCLE CIRCLE CIRCLE SQUARE SQUARE SQUARE SQUARE SQUARE L1 TRIANGLE CIRCLE TRIANGLE
else if ( !_CHEATCMP("TCT1SSSSSCCC") )
FastWeatherCheat();
// "241324TSCT21" - L2 R2 L1 R1 L2 R2 TRIANGLE SQUARE CIRCLE TRIANGLE L2 L1
else if ( !_CHEATCMP("12TCST423142") )
BlowUpCarsCheat();
// "RDLU12ULDR" - RIGHT DOWN LEFT UP L1 L2 UP LEFT DOWN RIGHT
else if ( !_CHEATCMP("RDLU21ULDR") )
ChangePlayerCheat();
// "DULUX3421" - DOWN UP LEFT UP CROSS R1 R2 L2 L1
else if ( !_CHEATCMP("1243XULUD") )
MayhemCheat();
// "DULUX3412" - DOWN UP LEFT UP CROSS R1 R2 L1 L2
else if ( !_CHEATCMP("2143XULUD") )
EverybodyAttacksPlayerCheat();
// "43TX21UD" - R2 R1 TRIANGLE CROSS L2 L1 UP DOWN
else if ( !_CHEATCMP("DU12XT34") )
WeaponsForAllCheat();
// "TURDS12" - TRIANGLE UP RIGHT DOWN SQUARE L1 L2
else if ( !_CHEATCMP("21SDRUT") )
FastTimeCheat();
// "TURDS34" - TRIANGLE UP RIGHT DOWN SQUARE R1 R2
else if ( !_CHEATCMP("43SDRUT") )
SlowTimeCheat();
// "11S4T1T" - L1 L1 SQUARE R2 TRIANGLE L1 TRIANGLE
else if ( !_CHEATCMP("T1T4S11") )
OnlyRenderWheelsCheat();
// "R4C32D13" - RIGHT R2 CIRCLE R1 L2 DOWN L1 R1
else if ( !_CHEATCMP("31D23C4R") )
ChittyChittyBangBangCheat();
// "3141L33T" - R1 L1 R2 L1 LEFT R1 R1 TRIANGLE
else if ( !_CHEATCMP("T33L1413") )
StrongGripCheat();
// "S1CD13TR1X" - SQUARE L1 CIRCLE DOWN L1 R1 TRIANGLE RIGHT L1 CROSS
else if ( !_CHEATCMP("X1RT31DC1S") )
NastyLimbsCheat();
#undef _CHEATCMP
}
#endif
2019-06-16 22:16:38 +00:00
void CPad::AddToPCCheatString(char c)
{
for ( int32 i = ARRAY_SIZE(KeyBoardCheatString) - 2; i >= 0; i-- )
2019-06-13 00:35:26 +00:00
KeyBoardCheatString[i + 1] = KeyBoardCheatString[i];
KeyBoardCheatString[0] = c;
#define _CHEATCMP(str) strncmp(str, KeyBoardCheatString, sizeof(str)-1)
// "GUNSGUNSGUNS"
if ( !_CHEATCMP("SNUGSNUGSNUG") )
WeaponCheat();
// "IFIWEREARICHMAN"
if ( !_CHEATCMP("NAMHCIRAEREWIFI") )
MoneyCheat();
// "GESUNDHEIT"
if ( !_CHEATCMP("TIEHDNUSEG") )
HealthCheat();
// "MOREPOLICEPLEASE"
if ( !_CHEATCMP("ESAELPECILOPEROM") )
WantedLevelUpCheat();
// "NOPOLICEPLEASE"
if ( !_CHEATCMP("ESAELPECILOPON") )
WantedLevelDownCheat();
// "GIVEUSATANK"
if ( !_CHEATCMP("KNATASUEVIG") )
TankCheat();
// "BANGBANGBANG"
if ( !_CHEATCMP("GNABGNABGNAB") )
BlowUpCarsCheat();
// "ILIKEDRESSINGUP"
if ( !_CHEATCMP("PUGNISSERDEKILI") )
ChangePlayerCheat();
// "ITSALLGOINGMAAAD"
if ( !_CHEATCMP("DAAAMGNIOGLLASTI") )
MayhemCheat();
// "NOBODYLIKESME"
if ( !_CHEATCMP("EMSEKILYDOBON") )
EverybodyAttacksPlayerCheat();
// "WEAPONSFORALL"
if ( !_CHEATCMP("LLAROFSNOPAEW") )
WeaponsForAllCheat();
// "TIMEFLIESWHENYOU"
if ( !_CHEATCMP("UOYNEHWSEILFEMIT") )
FastTimeCheat();
// "BOOOOORING"
if ( !_CHEATCMP("GNIROOOOOB") )
SlowTimeCheat();
#ifndef GTA3_1_1_PATCH
// "TURTOISE"
if ( !_CHEATCMP("ESIOTRUT") )
ArmourCheat();
#else
// "TORTOISE"
if ( !_CHEATCMP("ESIOTROT") )
ArmourCheat();
#endif
// "SKINCANCERFORME"
if ( !_CHEATCMP("EMROFRECNACNIKS") )
SunnyWeatherCheat();
// "ILIKESCOTLAND"
if ( !_CHEATCMP("DNALTOCSEKILI") )
CloudyWeatherCheat();
// "ILOVESCOTLAND"
if ( !_CHEATCMP("DNALTOCSEVOLI") )
RainyWeatherCheat();
// "PEASOUP"
if ( !_CHEATCMP("PUOSAEP") )
FoggyWeatherCheat();
// "MADWEATHER"
if ( !_CHEATCMP("REHTAEWDAM") )
FastWeatherCheat();
// "ANICESETOFWHEELS"
if ( !_CHEATCMP("SLEEHWFOTESECINA") )
OnlyRenderWheelsCheat();
// "CHITTYCHITTYBB"
if ( !_CHEATCMP("BBYTTIHCYTTIHC") )
ChittyChittyBangBangCheat();
// "CORNERSLIKEMAD"
if ( !_CHEATCMP("DAMEKILSRENROC") )
StrongGripCheat();
// "NASTYLIMBSCHEAT"
if ( !_CHEATCMP("TAEHCSBMILYTSAN") )
NastyLimbsCheat();
2019-07-02 20:05:11 +00:00
#ifdef KANGAROO_CHEAT
// "KANGAROO"
if (!_CHEATCMP("OORAGNAK"))
KangarooCheat();
#endif
2019-08-16 16:25:02 +00:00
#ifndef MASTER
// "PEDDEBUG"
if (!_CHEATCMP("GUBEDDEP"))
CPed::SwitchDebugDisplay();
#endif
2020-04-25 18:25:14 +00:00
#ifdef ALLCARSHELI_CHEAT
// "CARSAREHELI"
if (!_CHEATCMP("ILEHERASRAC"))
AllCarsHeliCheat();
#endif
#ifdef ALT_DODO_CHEAT
// "IWANTTOMASTERDODO"
if (!_CHEATCMP("ODODRETSAMOTTNAWI"))
AltDodoCheat();
#endif
2019-06-13 00:35:26 +00:00
#undef _CHEATCMP
}
2020-03-27 18:54:35 +00:00
#ifdef XINPUT
void CPad::AffectFromXinput(uint32 pad)
{
XINPUT_STATE xstate;
memset(&xstate, 0, sizeof(XINPUT_STATE));
if (XInputGetState(pad, &xstate) == ERROR_SUCCESS)
{
PCTempJoyState.Circle = (xstate.Gamepad.wButtons & XINPUT_GAMEPAD_B) ? 255 : 0;
PCTempJoyState.Cross = (xstate.Gamepad.wButtons & XINPUT_GAMEPAD_A) ? 255 : 0;
PCTempJoyState.Square = (xstate.Gamepad.wButtons & XINPUT_GAMEPAD_X) ? 255 : 0;
PCTempJoyState.Triangle = (xstate.Gamepad.wButtons & XINPUT_GAMEPAD_Y) ? 255 : 0;
PCTempJoyState.DPadDown = (xstate.Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_DOWN) ? 255 : 0;
PCTempJoyState.DPadLeft = (xstate.Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_LEFT) ? 255 : 0;
PCTempJoyState.DPadRight = (xstate.Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_RIGHT) ? 255 : 0;
PCTempJoyState.DPadUp = (xstate.Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_UP) ? 255 : 0;
PCTempJoyState.LeftShock = (xstate.Gamepad.wButtons & XINPUT_GAMEPAD_LEFT_THUMB) ? 255 : 0;
PCTempJoyState.LeftShoulder1 = (xstate.Gamepad.wButtons & XINPUT_GAMEPAD_LEFT_SHOULDER) ? 255 : 0;
PCTempJoyState.LeftShoulder2 = xstate.Gamepad.bLeftTrigger;
PCTempJoyState.RightShock = (xstate.Gamepad.wButtons & XINPUT_GAMEPAD_RIGHT_THUMB) ? 255 : 0;
PCTempJoyState.RightShoulder1 = (xstate.Gamepad.wButtons & XINPUT_GAMEPAD_RIGHT_SHOULDER) ? 255 : 0;
PCTempJoyState.RightShoulder2 = xstate.Gamepad.bRightTrigger;
PCTempJoyState.Select = (xstate.Gamepad.wButtons & XINPUT_GAMEPAD_BACK) ? 255 : 0;
2020-03-28 14:47:52 +00:00
#ifdef REGISTER_START_BUTTON
2020-03-27 18:54:35 +00:00
PCTempJoyState.Start = (xstate.Gamepad.wButtons & XINPUT_GAMEPAD_START) ? 255 : 0;
2020-03-28 14:47:52 +00:00
#endif
2020-03-27 18:54:35 +00:00
float lx = (float)xstate.Gamepad.sThumbLX / (float)0x7FFF;
float ly = (float)xstate.Gamepad.sThumbLY / (float)0x7FFF;
float rx = (float)xstate.Gamepad.sThumbRX / (float)0x7FFF;
float ry = (float)xstate.Gamepad.sThumbRY / (float)0x7FFF;
if (Abs(lx) > 0.3f || Abs(ly) > 0.3f) {
PCTempJoyState.LeftStickX = (int32)(lx * 128.0f);
PCTempJoyState.LeftStickY = (int32)(-ly * 128.0f);
}
if (Abs(rx) > 0.3f || Abs(ry) > 0.3f) {
PCTempJoyState.RightStickX = (int32)(rx * 128.0f);
2020-05-02 22:42:05 +00:00
PCTempJoyState.RightStickY = (int32)(-ry * 128.0f);
2020-03-27 18:54:35 +00:00
}
XINPUT_VIBRATION VibrationState;
memset(&VibrationState, 0, sizeof(XINPUT_VIBRATION));
uint16 iLeftMotor = (uint16)((float)ShakeFreq / 255.0f * (float)0xffff);
uint16 iRightMotor = (uint16)((float)ShakeFreq / 255.0f * (float)0xffff);
if (ShakeDur < CTimer::GetTimeStepInMilliseconds())
ShakeDur = 0;
else
ShakeDur -= CTimer::GetTimeStepInMilliseconds();
if (ShakeDur == 0) ShakeFreq = 0;
VibrationState.wLeftMotorSpeed = iLeftMotor;
VibrationState.wRightMotorSpeed = iRightMotor;
XInputSetState(pad, &VibrationState);
2020-03-27 18:54:35 +00:00
}
}
#endif
2019-06-13 00:35:26 +00:00
void CPad::UpdatePads(void)
{
2019-06-16 22:16:38 +00:00
bool bUpdate = true;
2019-06-13 00:35:26 +00:00
GetPad(0)->UpdateMouse();
2020-03-27 18:54:35 +00:00
#ifdef XINPUT
GetPad(0)->AffectFromXinput(0);
GetPad(1)->AffectFromXinput(1);
#else
2019-06-13 00:35:26 +00:00
CapturePad(0);
2020-03-27 18:54:35 +00:00
#endif
#ifdef DETECT_PAD_INPUT_SWITCH
if (GetPad(0)->PCTempJoyState.IsAnyButtonPressed())
IsAffectedByController = true;
else {
#endif
ControlsManager.ClearSimButtonPressCheckers();
ControlsManager.AffectPadFromKeyBoard();
ControlsManager.AffectPadFromMouse();
2019-06-13 00:35:26 +00:00
#ifdef DETECT_PAD_INPUT_SWITCH
}
if (IsAffectedByController && (GetPad(0)->PCTempKeyState.IsAnyButtonPressed() || GetPad(0)->PCTempMouseState.IsAnyButtonPressed()))
IsAffectedByController = false;
#endif
2019-06-13 00:35:26 +00:00
2019-06-22 18:16:29 +00:00
if ( CReplay::IsPlayingBackFromFile() )
2019-06-13 00:35:26 +00:00
bUpdate = false;
if ( bUpdate )
{
GetPad(0)->Update(0);
GetPad(1)->Update(0);
}
2020-03-27 18:54:35 +00:00
#if defined(MASTER) && !defined(XINPUT)
2019-06-13 00:35:26 +00:00
GetPad(1)->NewState.Clear();
GetPad(1)->OldState.Clear();
2020-03-27 18:54:35 +00:00
#endif
2019-06-13 00:35:26 +00:00
OldKeyState = NewKeyState;
NewKeyState = TempKeyState;
}
2019-06-13 00:35:26 +00:00
void CPad::ProcessPCSpecificStuff(void)
{
2019-06-13 00:35:26 +00:00
;
}
2020-06-27 21:01:51 +00:00
void CPad::Update(int16 pad)
2019-06-13 00:35:26 +00:00
{
OldState = NewState;
2020-06-27 21:01:51 +00:00
#ifdef GTA_PS2
bObsoleteControllerMessage = false;
//int iPressureBtn;
int id;
int ext_id=0;
int state;
int rterm_id = 0;
unsigned short paddata, tpad;
unsigned char rdata[32];
state = scePadGetState(pad, 0);
switch(Phase)
{
case 0:
if (state != scePadStateStable && state != scePadStateFindCTP1)
break;
id = scePadInfoMode(pad, 0, InfoModeCurID, 0);
if (id==0) break;
ext_id = scePadInfoMode(pad, 0, InfoModeCurExID, 0);
if (ext_id>0) id = ext_id;
switch(id)
{
case 4: // Digital controller
Phase = 40; // Try for analog(dualshock)
break;
case 7: // Dualshock2 controller
Phase = 50;
break;
default:
Phase = 99;
break;
}
break;
// Analog Controller (old dualshock)
case 40: // Analog Contoller check valid (otherwise fail phase)
if (scePadInfoMode(pad, 0, InfoModeIdTable, -1)==0)
{
Phase = 99;
break;
}
Phase++;
case 41: // Analog controller: Request Lock analog mode (asynchronous)
if (scePadSetMainMode(pad, 0, 1, 3)==1) Phase++;
break;
case 42: // Analog controller: Check state of previous request
if (scePadGetReqState(pad, 0)==scePadReqStateFaild)
{
Phase--;
}
if (scePadGetReqState(pad, 0)==scePadReqStateComplete)
{
// Lock mode complete
Phase=0; // Accept normal dualshock
}
break;
// DualShock 2 Controller
case 50: // Analog Contoller check valid (otherwise fail phase)
if (scePadInfoMode(pad, 0, InfoModeIdTable, -1)==0)
{
Phase = 99;
break;
}
Phase++;
case 51: // Analog controller: Request Lock analog mode (asynchronous)
if (scePadSetMainMode(pad, 0, 1, 3)==1) Phase++;
break;
case 52: // Analog controller: Check state of previous request
if (scePadGetReqState(pad, 0)==scePadReqStateFaild)
{
Phase--;
}
if (scePadGetReqState(pad, 0)==scePadReqStateComplete)
{
// Lock mode complete
Phase=0; // Accept normal dualshock
}
break;
case 70: // DualShock 2 check pressure sensitive possible
if (scePadInfoPressMode(pad, 0)==1)
{
Phase = 76;
break;
}
Phase = 99;
break;
case 76: // DualShock2 enable pressure sensitive mode (asynchronous function)
if (scePadEnterPressMode(pad, 0)==1) Phase++;
break;
case 77: // Dualshock2 check status of request pressure sensitive mode
if (scePadGetReqState(pad, 0)==scePadReqStateFaild) Phase--;
if (scePadGetReqState(pad, 0)==scePadReqStateComplete)
{
Phase=80;
}
break;
// DualShock 2 Controller
case 80: // Set motors
if (scePadInfoAct(pad, 0, -1, 0)==0)
{
Phase = 99;
}
act_align[0] = 0; // Offset 0 for motor0
act_align[1] = 1; // Offset 1 for motor1
act_align[2] = 0xff;
act_align[3] = 0xff;
act_align[4] = 0xff;
act_align[5] = 0xff;
// Asynchronous function
if (scePadSetActAlign(pad, 0, act_align)==0) break;
Phase++;
break;
case 81:
if ( scePadGetState(pad, 0) != scePadStateExecCmd )
{
Phase = 99;
}
break;
default:
if ( state == scePadStateError ) break;
if ( state == scePadStateStable || state == scePadStateFindCTP1 )
{
if ( ShakeDur )
{
ShakeDur = Max(ShakeDur - CTimer::GetTimeStepInMilliseconds(), 0);
if ( ShakeDur == 0 )
{
act_direct[0] = 0;
act_direct[1] = 0;
scePadSetActDirect(pad, 0, act_direct);
}
else
{
act_direct[0] = 0;
act_direct[1] = (unsigned char) ShakeFreq;
scePadSetActDirect(pad, 0, act_direct);
}
}
if (scePadRead( pad, 0, rdata )==0)
{
NewState.Clear();
break;
}
if ((rdata[0] == 0))
{
paddata = (unsigned short) ( 0xffff ^ ((rdata[2]<<8)|rdata[3]) );
rterm_id = (rdata[1]);
if ( (rterm_id>>4) == 7 ) // DUALSHOCK
{
if (!CRecordDataForGame::IsPlayingBack() && !CRecordDataForChase::ShouldThisPadBeLeftAlone(pad))
{
tpad = paddata;
NewState.DPadUp = ( tpad & SCE_PADLup ) ? 255 : 0;
NewState.DPadDown = ( tpad & SCE_PADLdown ) ? 255 : 0;
NewState.DPadLeft = ( tpad & SCE_PADLleft ) ? 255 : 0;
NewState.DPadRight = ( tpad & SCE_PADLright ) ? 255 : 0;
NewState.Triangle = ( tpad & SCE_PADRup ) ? 255 : 0;
NewState.Cross = ( tpad & SCE_PADRdown ) ? 255 : 0;
NewState.Square = ( tpad & SCE_PADRleft ) ? 255 : 0;
NewState.Circle = ( tpad & SCE_PADRright ) ? 255 : 0;
NewState.Start = ( tpad & SCE_PADstart ) ? 255 : 0;
NewState.Select = ( tpad & SCE_PADselect ) ? 255 : 0;
NewState.LeftShoulder1 = ( tpad & SCE_PADL1 ) ? 255 : 0;
NewState.LeftShoulder2 = ( tpad & SCE_PADL2 ) ? 255 : 0;
NewState.RightShoulder1 = ( tpad & SCE_PADR1 ) ? 255 : 0;
NewState.RightShoulder2 = ( tpad & SCE_PADR2 ) ? 255 : 0;
NewState.LeftShock = ( tpad & SCE_PADi ) ? 255 : 0;
NewState.RightShock = ( tpad & SCE_PADj ) ? 255 : 0;
NewState.RightStickX = (short)rdata[4];
NewState.RightStickY = (short)rdata[5];
NewState.LeftStickX = (short)rdata[6];
NewState.LeftStickY = (short)rdata[7];
#define CLAMP_AXIS(x) (((x) < 43 && (x) >= -42) ? 0 : (((x) > 0) ? (Max((x)-42, 0)*127/85) : Min((x)+42, 0)*127/85))
#define FIX_AXIS(x) CLAMP_AXIS((x)-128)
NewState.RightStickX = FIX_AXIS(NewState.RightStickX);
NewState.RightStickY = FIX_AXIS(NewState.RightStickY);
NewState.LeftStickX = FIX_AXIS(NewState.LeftStickX);
NewState.LeftStickY = FIX_AXIS(NewState.LeftStickY);
#undef FIX_AXIS
#undef CLAMP_AXIS
}
}
else if ( (rterm_id>>4) == 4 ) // Controller (digital)
{
if ( pad == 0 )
bObsoleteControllerMessage = true;
NewState.Clear();
}
if ( NewState.IsAnyButtonPressed() )
LastTimeTouched = CTimer::GetTimeInMilliseconds();
break;
}
if ( ++iCurrHornHistory >= HORNHISTORY_SIZE )
iCurrHornHistory = 0;
bHornHistory[iCurrHornHistory] = GetHorn();
NewState.Clear();
return;
}
break;
}
if ( pad == 0 )
{
bOldDisplayNoControllerMessage = bDisplayNoControllerMessage;
if ( state == scePadStateDiscon )
{
bDisplayNoControllerMessage = true;
Phase = 0;
}
else
bDisplayNoControllerMessage = false;
}
if ( ++iCurrHornHistory >= HORNHISTORY_SIZE )
iCurrHornHistory = 0;
bHornHistory[iCurrHornHistory] = GetHorn();
if ( !bDisplayNoControllerMessage )
CGame::bDemoMode = false;
#endif
2019-06-13 00:35:26 +00:00
2020-04-10 08:03:38 +00:00
#if (defined GTA_PS2 || defined FIX_BUGS)
2020-06-27 21:01:51 +00:00
if (!CRecordDataForGame::IsPlayingBack() && !CRecordDataForChase::ShouldThisPadBeLeftAlone(pad))
2020-04-10 08:03:38 +00:00
#endif
{
NewState = ReconcileTwoControllersInput(PCTempKeyState, PCTempJoyState);
NewState = ReconcileTwoControllersInput(PCTempMouseState, NewState);
}
2019-06-13 00:35:26 +00:00
PCTempJoyState.Clear();
PCTempKeyState.Clear();
PCTempMouseState.Clear();
ProcessPCSpecificStuff();
2020-04-09 03:20:44 +00:00
if ( ++iCurrHornHistory >= HORNHISTORY_SIZE )
2019-06-13 00:35:26 +00:00
iCurrHornHistory = 0;
bHornHistory[iCurrHornHistory] = GetHorn();
if ( !bDisplayNoControllerMessage )
CGame::bDemoMode = false;
}
void CPad::DoCheats(void)
{
#ifdef DETECT_PAD_INPUT_SWITCH
if (IsAffectedByController)
#endif
GetPad(0)->DoCheats(0);
2019-06-13 00:35:26 +00:00
}
2019-06-16 22:16:38 +00:00
void CPad::DoCheats(int16 unk)
2019-06-13 00:35:26 +00:00
{
2020-04-09 03:20:44 +00:00
#ifdef GTA_PS2_STUFF
2019-06-13 00:35:26 +00:00
if ( GetTriangleJustDown() )
AddToCheatString('T');
if ( GetCircleJustDown() )
AddToCheatString('C');
if ( GetCrossJustDown() )
AddToCheatString('X');
if ( GetSquareJustDown() )
AddToCheatString('S');
if ( GetDPadUpJustDown() )
AddToCheatString('U');
if ( GetDPadDownJustDown() )
AddToCheatString('D');
if ( GetDPadLeftJustDown() )
AddToCheatString('L');
if ( GetDPadRightJustDown() )
AddToCheatString('R');
if ( GetLeftShoulder1JustDown() )
AddToCheatString('1');
if ( GetLeftShoulder2JustDown() )
AddToCheatString('2');
if ( GetRightShoulder1JustDown() )
AddToCheatString('3');
if ( GetRightShoulder2JustDown() )
AddToCheatString('4');
#endif
}
void CPad::StopPadsShaking(void)
{
GetPad(0)->StopShaking(0);
}
2020-06-27 21:01:51 +00:00
void CPad::StopShaking(int16 pad)
2019-06-13 00:35:26 +00:00
{
2020-06-27 21:01:51 +00:00
#ifdef GTA_PS2_STUFF
ShakeFreq = 0;
ShakeDur = 0;
#ifdef GTA_PS2
if ( Phase == 99 )
{
act_direct[0] = 0;
act_direct[1] = 0;
scePadSetActDirect(pad, 0, act_direct);
}
#endif
#endif
2019-06-13 00:35:26 +00:00
}
2019-06-16 22:16:38 +00:00
CPad *CPad::GetPad(int32 pad)
2019-06-13 00:35:26 +00:00
{
return &Pads[pad];
}
2020-05-02 21:11:02 +00:00
#ifdef DETECT_PAD_INPUT_SWITCH
#define CURMODE (IsAffectedByController ? Mode : 0)
#else
#define CURMODE (Mode)
#endif
2019-06-13 00:35:26 +00:00
2019-06-16 22:16:38 +00:00
int16 CPad::GetSteeringLeftRight(void)
2019-06-13 00:35:26 +00:00
{
2019-07-15 12:11:40 +00:00
if ( ArePlayerControlsDisabled() )
2019-06-13 00:35:26 +00:00
return 0;
2020-05-02 21:11:02 +00:00
switch (CURMODE)
2019-06-13 00:35:26 +00:00
{
case 0:
case 2:
{
2019-06-16 22:16:38 +00:00
int16 axis = NewState.LeftStickX;
int16 dpad = (NewState.DPadRight - NewState.DPadLeft) / 2;
2019-06-13 00:35:26 +00:00
2019-07-10 15:18:26 +00:00
if ( Abs(axis) > Abs(dpad) )
2019-06-13 00:35:26 +00:00
return axis;
else
return dpad;
break;
}
case 1:
case 3:
{
return NewState.LeftStickX;
break;
}
}
2019-06-13 00:35:26 +00:00
return 0;
}
2019-06-16 22:16:38 +00:00
int16 CPad::GetSteeringUpDown(void)
2019-06-13 00:35:26 +00:00
{
2019-07-15 12:11:40 +00:00
if ( ArePlayerControlsDisabled() )
2019-06-13 00:35:26 +00:00
return 0;
2020-05-02 21:11:02 +00:00
switch (CURMODE)
2019-06-13 00:35:26 +00:00
{
case 0:
case 2:
{
2019-06-16 22:16:38 +00:00
int16 axis = NewState.LeftStickY;
int16 dpad = (NewState.DPadUp - NewState.DPadDown) / 2;
2019-06-13 00:35:26 +00:00
2019-07-10 15:18:26 +00:00
if ( Abs(axis) > Abs(dpad) )
2019-06-13 00:35:26 +00:00
return axis;
else
return dpad;
break;
}
case 1:
case 3:
{
return NewState.LeftStickY;
break;
}
}
return 0;
}
2019-06-16 22:16:38 +00:00
int16 CPad::GetCarGunUpDown(void)
2019-06-13 00:35:26 +00:00
{
2019-07-15 12:11:40 +00:00
if ( ArePlayerControlsDisabled() )
2019-06-13 00:35:26 +00:00
return 0;
2020-05-02 21:11:02 +00:00
switch (CURMODE)
2019-06-13 00:35:26 +00:00
{
case 0:
case 1:
case 2:
{
return NewState.RightStickY;
break;
}
case 3:
{
return (NewState.DPadUp - NewState.DPadDown) / 2;
break;
}
}
return 0;
}
2019-06-16 22:16:38 +00:00
int16 CPad::GetCarGunLeftRight(void)
{
2019-07-15 12:11:40 +00:00
if ( ArePlayerControlsDisabled() )
2019-06-13 00:35:26 +00:00
return 0;
2020-05-02 21:11:02 +00:00
switch (CURMODE)
2019-06-13 00:35:26 +00:00
{
case 0:
case 1:
case 2:
{
return NewState.RightStickX;
break;
}
case 3:
{
return (NewState.DPadRight - NewState.DPadLeft) / 2;
break;
}
}
return 0;
}
2019-06-16 22:16:38 +00:00
int16 CPad::GetPedWalkLeftRight(void)
2019-06-13 00:35:26 +00:00
{
2019-07-15 12:11:40 +00:00
if ( ArePlayerControlsDisabled() )
2019-06-13 00:35:26 +00:00
return 0;
2020-05-02 21:11:02 +00:00
switch (CURMODE)
2019-06-13 00:35:26 +00:00
{
case 0:
case 2:
{
2019-06-16 22:16:38 +00:00
int16 axis = NewState.LeftStickX;
int16 dpad = (NewState.DPadRight - NewState.DPadLeft) / 2;
2019-06-13 00:35:26 +00:00
2019-07-10 15:18:26 +00:00
if ( Abs(axis) > Abs(dpad) )
2019-06-13 00:35:26 +00:00
return axis;
else
return dpad;
break;
}
case 1:
case 3:
{
return NewState.LeftStickX;
break;
}
}
return 0;
}
2019-06-16 22:16:38 +00:00
int16 CPad::GetPedWalkUpDown(void)
2019-06-13 00:35:26 +00:00
{
2019-07-15 12:11:40 +00:00
if ( ArePlayerControlsDisabled() )
2019-06-13 00:35:26 +00:00
return 0;
2020-05-02 21:11:02 +00:00
switch (CURMODE)
2019-06-13 00:35:26 +00:00
{
case 0:
case 2:
{
2019-06-16 22:16:38 +00:00
int16 axis = NewState.LeftStickY;
int16 dpad = (NewState.DPadDown - NewState.DPadUp) / 2;
2019-06-13 00:35:26 +00:00
2019-07-10 15:18:26 +00:00
if ( Abs(axis) > Abs(dpad) )
2019-06-13 00:35:26 +00:00
return axis;
else
return dpad;
break;
}
case 1:
case 3:
{
return NewState.LeftStickY;
break;
}
}
return 0;
}
2019-06-16 22:16:38 +00:00
int16 CPad::GetAnalogueUpDown(void)
2019-06-13 00:35:26 +00:00
{
2020-05-02 21:11:02 +00:00
switch (CURMODE)
2019-06-13 00:35:26 +00:00
{
case 0:
case 2:
{
2019-06-16 22:16:38 +00:00
int16 axis = NewState.LeftStickY;
int16 dpad = (NewState.DPadDown - NewState.DPadUp) / 2;
2019-06-13 00:35:26 +00:00
2019-07-10 15:18:26 +00:00
if ( Abs(axis) > Abs(dpad) )
2019-06-13 00:35:26 +00:00
return axis;
else
return dpad;
break;
}
case 1:
case 3:
{
return NewState.LeftStickY;
break;
}
}
return 0;
}
2019-06-16 22:16:38 +00:00
bool CPad::GetLookLeft(void)
2019-06-13 00:35:26 +00:00
{
2019-07-15 12:11:40 +00:00
if ( ArePlayerControlsDisabled() )
2019-06-13 00:35:26 +00:00
return false;
return !!(NewState.LeftShoulder2 && !NewState.RightShoulder2);
}
2019-06-16 22:16:38 +00:00
bool CPad::GetLookRight(void)
2019-06-13 00:35:26 +00:00
{
2019-07-15 12:11:40 +00:00
if ( ArePlayerControlsDisabled() )
return false;
2020-04-17 13:31:11 +00:00
2019-06-13 00:35:26 +00:00
return !!(NewState.RightShoulder2 && !NewState.LeftShoulder2);
}
2019-06-16 22:16:38 +00:00
bool CPad::GetLookBehindForCar(void)
2019-06-13 00:35:26 +00:00
{
2019-07-15 12:11:40 +00:00
if ( ArePlayerControlsDisabled() )
2019-06-13 00:35:26 +00:00
return false;
2020-04-17 13:31:11 +00:00
2019-06-13 00:35:26 +00:00
return !!(NewState.RightShoulder2 && NewState.LeftShoulder2);
}
2019-06-16 22:16:38 +00:00
bool CPad::GetLookBehindForPed(void)
{
2019-07-15 12:11:40 +00:00
if ( ArePlayerControlsDisabled() )
return false;
2019-06-13 00:35:26 +00:00
return !!NewState.RightShock;
}
2019-06-16 22:16:38 +00:00
bool CPad::GetHorn(void)
{
2019-07-15 12:11:40 +00:00
if ( ArePlayerControlsDisabled() )
return false;
2020-05-02 21:11:02 +00:00
switch (CURMODE)
2019-06-13 00:35:26 +00:00
{
case 0:
{
return !!NewState.LeftShock;
break;
}
case 1:
{
return !!NewState.LeftShoulder1;
break;
}
case 2:
{
return !!NewState.RightShoulder1;
break;
}
case 3:
{
return !!NewState.LeftShock;
break;
}
}
return false;
}
2019-06-16 22:16:38 +00:00
bool CPad::HornJustDown(void)
{
2019-07-15 12:11:40 +00:00
if ( ArePlayerControlsDisabled() )
return false;
2020-05-02 21:11:02 +00:00
switch (CURMODE)
2019-06-13 00:35:26 +00:00
{
case 0:
{
return !!(NewState.LeftShock && !OldState.LeftShock);
break;
}
case 1:
{
return !!(NewState.LeftShoulder1 && !OldState.LeftShoulder1);
break;
}
case 2:
{
return !!(NewState.RightShoulder1 && !OldState.RightShoulder1);
break;
}
case 3:
{
return !!(NewState.LeftShock && !OldState.LeftShock);
break;
}
}
return false;
2019-05-15 14:52:37 +00:00
}
2019-06-13 00:35:26 +00:00
2019-06-16 22:16:38 +00:00
bool CPad::GetCarGunFired(void)
2019-06-13 00:35:26 +00:00
{
2019-07-15 12:11:40 +00:00
if ( ArePlayerControlsDisabled() )
2019-06-13 00:35:26 +00:00
return false;
2020-05-02 21:11:02 +00:00
switch (CURMODE)
2019-06-13 00:35:26 +00:00
{
case 0:
case 1:
case 2:
{
return !!NewState.Circle;
break;
}
case 3:
{
return !!NewState.RightShoulder1;
break;
}
}
return false;
}
2019-06-16 22:16:38 +00:00
bool CPad::CarGunJustDown(void)
2019-06-13 00:35:26 +00:00
{
2019-07-15 12:11:40 +00:00
if ( ArePlayerControlsDisabled() )
2019-06-13 00:35:26 +00:00
return false;
2020-05-02 21:11:02 +00:00
switch (CURMODE)
2019-06-13 00:35:26 +00:00
{
case 0:
case 1:
case 2:
{
return !!(NewState.Circle && !OldState.Circle);
break;
}
case 3:
{
return !!(NewState.RightShoulder1 && !OldState.RightShoulder1);
break;
}
}
return false;
}
2019-06-16 22:16:38 +00:00
int16 CPad::GetHandBrake(void)
2019-06-13 00:35:26 +00:00
{
2019-07-15 12:11:40 +00:00
if ( ArePlayerControlsDisabled() )
2019-06-13 00:35:26 +00:00
return 0;
2020-05-02 21:11:02 +00:00
switch (CURMODE)
2019-06-13 00:35:26 +00:00
{
case 0:
case 1:
{
return NewState.RightShoulder1;
break;
}
case 2:
{
return NewState.Triangle;
break;
}
case 3:
{
return NewState.LeftShoulder1;
break;
}
}
return 0;
}
2019-06-16 22:16:38 +00:00
int16 CPad::GetBrake(void)
2019-06-13 00:35:26 +00:00
{
2019-07-15 12:11:40 +00:00
if ( ArePlayerControlsDisabled() )
2019-06-13 00:35:26 +00:00
return 0;
2020-05-02 21:11:02 +00:00
switch (CURMODE)
2019-06-13 00:35:26 +00:00
{
case 0:
case 2:
{
return NewState.Square;
break;
}
case 1:
{
return NewState.Square;
break;
}
case 3:
{
2019-06-16 22:16:38 +00:00
int16 axis = 2 * NewState.RightStickY;
2019-06-13 00:35:26 +00:00
if ( axis < 0 )
return 0;
else
return axis;
break;
}
}
return 0;
}
2019-06-16 22:16:38 +00:00
bool CPad::GetExitVehicle(void)
2019-06-13 00:35:26 +00:00
{
2019-07-15 12:11:40 +00:00
if ( ArePlayerControlsDisabled() )
2019-06-13 00:35:26 +00:00
return false;
2020-05-02 21:11:02 +00:00
switch (CURMODE)
2019-06-13 00:35:26 +00:00
{
case 0:
case 1:
case 3:
{
return !!NewState.Triangle;
break;
}
case 2:
{
return !!NewState.LeftShoulder1;
break;
}
}
return false;
}
2019-06-16 22:16:38 +00:00
bool CPad::ExitVehicleJustDown(void)
2019-06-13 00:35:26 +00:00
{
2019-07-15 12:11:40 +00:00
if ( ArePlayerControlsDisabled() )
2019-06-13 00:35:26 +00:00
return false;
2020-05-02 21:11:02 +00:00
switch (CURMODE)
2019-06-13 00:35:26 +00:00
{
case 0:
case 1:
case 3:
{
return !!(NewState.Triangle && !OldState.Triangle);
break;
}
case 2:
{
return !!(NewState.LeftShoulder1 && !OldState.LeftShoulder1);
break;
}
}
return false;
}
2019-06-16 22:16:38 +00:00
int32 CPad::GetWeapon(void)
2019-06-13 00:35:26 +00:00
{
2019-07-15 12:11:40 +00:00
if ( ArePlayerControlsDisabled() )
2019-06-13 00:35:26 +00:00
return false;
2020-05-02 21:11:02 +00:00
switch (CURMODE)
2019-06-13 00:35:26 +00:00
{
case 0:
case 1:
{
return NewState.Circle;
break;
}
case 2:
{
return NewState.Cross;
break;
}
case 3:
{
return NewState.RightShoulder1;
break;
}
}
return false;
}
2019-06-16 22:16:38 +00:00
bool CPad::WeaponJustDown(void)
2019-06-13 00:35:26 +00:00
{
2019-07-15 12:11:40 +00:00
if ( ArePlayerControlsDisabled() )
2019-06-13 00:35:26 +00:00
return false;
2020-05-02 21:11:02 +00:00
switch (CURMODE)
2019-06-13 00:35:26 +00:00
{
case 0:
case 1:
{
return !!(NewState.Circle && !OldState.Circle);
break;
}
case 2:
{
return !!(NewState.Cross && !OldState.Cross);
break;
}
case 3:
{
return !!(NewState.RightShoulder1 && !OldState.RightShoulder1);
break;
}
}
return false;
}
2019-06-16 22:16:38 +00:00
int16 CPad::GetAccelerate(void)
2019-06-13 00:35:26 +00:00
{
2019-07-15 12:11:40 +00:00
if ( ArePlayerControlsDisabled() )
2019-06-13 00:35:26 +00:00
return 0;
2020-05-02 21:11:02 +00:00
switch (CURMODE)
2019-06-13 00:35:26 +00:00
{
case 0:
case 2:
{
return NewState.Cross;
break;
}
case 1:
{
return NewState.Cross;
break;
}
case 3:
{
2019-06-16 22:16:38 +00:00
int16 axis = -2 * NewState.RightStickY;
2019-06-13 00:35:26 +00:00
if ( axis < 0 )
return 0;
else
return axis;
break;
}
}
return 0;
}
2019-06-16 22:16:38 +00:00
bool CPad::CycleCameraModeUpJustDown(void)
2019-06-13 00:35:26 +00:00
{
2020-05-02 21:11:02 +00:00
switch (CURMODE)
2019-06-13 00:35:26 +00:00
{
case 0:
case 2:
case 3:
{
return !!(NewState.Select && !OldState.Select);
break;
}
case 1:
{
return !!(NewState.DPadUp && !OldState.DPadUp);
break;
}
}
return false;
}
2019-06-16 22:16:38 +00:00
bool CPad::CycleCameraModeDownJustDown(void)
2019-06-13 00:35:26 +00:00
{
2020-05-02 21:11:02 +00:00
switch (CURMODE)
2019-06-13 00:35:26 +00:00
{
case 0:
case 2:
case 3:
{
return false;
break;
}
case 1:
{
return !!(NewState.DPadDown && !OldState.DPadDown);
break;
}
}
return false;
}
2019-06-16 22:16:38 +00:00
bool CPad::ChangeStationJustDown(void)
2019-06-13 00:35:26 +00:00
{
2019-07-15 12:11:40 +00:00
if ( ArePlayerControlsDisabled() )
2019-06-13 00:35:26 +00:00
return false;
2020-05-02 21:11:02 +00:00
switch (CURMODE)
2019-06-13 00:35:26 +00:00
{
case 0:
{
return !!(NewState.LeftShoulder1 && !OldState.LeftShoulder1);
break;
}
case 1:
{
return !!(NewState.Select && !OldState.Select);
break;
}
case 2:
{
return !!(NewState.LeftShock && !OldState.LeftShock);
break;
}
case 3:
{
return !!(NewState.Circle && !OldState.Circle);
break;
}
}
return false;
}
2019-06-16 22:16:38 +00:00
bool CPad::CycleWeaponLeftJustDown(void)
2019-06-13 00:35:26 +00:00
{
2019-07-15 12:11:40 +00:00
if ( ArePlayerControlsDisabled() )
2019-06-13 00:35:26 +00:00
return false;
return !!(NewState.LeftShoulder2 && !OldState.LeftShoulder2);
}
2019-06-16 22:16:38 +00:00
bool CPad::CycleWeaponRightJustDown(void)
2019-06-13 00:35:26 +00:00
{
2019-07-15 12:11:40 +00:00
if ( ArePlayerControlsDisabled() )
2019-06-13 00:35:26 +00:00
return false;
2020-04-17 13:31:11 +00:00
2019-06-13 00:35:26 +00:00
return !!(NewState.RightShoulder2 && !OldState.RightShoulder2);
}
2019-06-16 22:16:38 +00:00
bool CPad::GetTarget(void)
2019-06-13 00:35:26 +00:00
{
2019-07-15 12:11:40 +00:00
if ( ArePlayerControlsDisabled() )
2019-06-13 00:35:26 +00:00
return false;
2020-05-02 21:11:02 +00:00
switch (CURMODE)
2019-06-13 00:35:26 +00:00
{
case 0:
case 1:
case 2:
{
return !!NewState.RightShoulder1;
break;
}
case 3:
{
return !!NewState.LeftShoulder1;
break;
}
}
return false;
}
2019-06-16 22:16:38 +00:00
bool CPad::TargetJustDown(void)
2019-06-13 00:35:26 +00:00
{
2019-07-15 12:11:40 +00:00
if ( ArePlayerControlsDisabled() )
2019-06-13 00:35:26 +00:00
return false;
2020-05-02 21:11:02 +00:00
switch (CURMODE)
2019-06-13 00:35:26 +00:00
{
case 0:
case 1:
case 2:
{
return !!(NewState.RightShoulder1 && !OldState.RightShoulder1);
break;
}
case 3:
{
return !!(NewState.LeftShoulder1 && !OldState.LeftShoulder1);
break;
}
}
return false;
}
2019-06-16 22:16:38 +00:00
bool CPad::JumpJustDown(void)
2019-06-13 00:35:26 +00:00
{
2019-07-15 12:11:40 +00:00
if ( ArePlayerControlsDisabled() )
2019-06-13 00:35:26 +00:00
return false;
return !!(NewState.Square && !OldState.Square);
}
2019-06-16 22:16:38 +00:00
bool CPad::GetSprint(void)
2019-06-13 00:35:26 +00:00
{
2019-07-15 12:11:40 +00:00
if ( ArePlayerControlsDisabled() )
2019-06-13 00:35:26 +00:00
return false;
2020-05-02 21:11:02 +00:00
switch (CURMODE)
2019-06-13 00:35:26 +00:00
{
case 0:
case 1:
case 3:
{
return !!NewState.Cross;
break;
}
case 2:
{
return !!NewState.Circle;
break;
}
}
return false;
}
2019-06-16 22:16:38 +00:00
bool CPad::ShiftTargetLeftJustDown(void)
2019-06-13 00:35:26 +00:00
{
2019-07-15 12:11:40 +00:00
if ( ArePlayerControlsDisabled() )
2019-06-13 00:35:26 +00:00
return false;
2020-04-17 13:31:11 +00:00
2019-06-13 00:35:26 +00:00
return !!(NewState.LeftShoulder2 && !OldState.LeftShoulder2);
}
2019-06-16 22:16:38 +00:00
bool CPad::ShiftTargetRightJustDown(void)
2019-06-13 00:35:26 +00:00
{
2019-07-15 12:11:40 +00:00
if ( ArePlayerControlsDisabled() )
2019-06-13 00:35:26 +00:00
return false;
2020-04-17 13:31:11 +00:00
2019-06-13 00:35:26 +00:00
return !!(NewState.RightShoulder2 && !OldState.RightShoulder2);
}
2019-06-16 22:16:38 +00:00
bool CPad::GetAnaloguePadUp(void)
2019-06-13 00:35:26 +00:00
{
2019-06-16 22:16:38 +00:00
static int16 oldfStickY = 0;
2019-06-13 00:35:26 +00:00
2019-06-16 22:16:38 +00:00
int16 Y = CPad::GetPad(0)->GetAnalogueUpDown();
2019-06-13 00:35:26 +00:00
if ( Y < 0 && oldfStickY >= 0 )
{
oldfStickY = Y;
return true;
}
else
{
oldfStickY = Y;
return false;
}
}
2019-06-16 22:16:38 +00:00
bool CPad::GetAnaloguePadDown(void)
2019-06-13 00:35:26 +00:00
{
2019-06-16 22:16:38 +00:00
static int16 oldfStickY = 0;
2019-06-13 00:35:26 +00:00
2019-06-16 22:16:38 +00:00
int16 Y = CPad::GetPad(0)->GetAnalogueUpDown();
2019-06-13 00:35:26 +00:00
if ( Y > 0 && oldfStickY <= 0 )
{
oldfStickY = Y;
return true;
}
else
{
oldfStickY = Y;
return false;
}
}
2019-06-16 22:16:38 +00:00
bool CPad::GetAnaloguePadLeft(void)
2019-06-13 00:35:26 +00:00
{
2019-06-16 22:16:38 +00:00
static int16 oldfStickX = 0;
2019-06-13 00:35:26 +00:00
2019-06-16 22:16:38 +00:00
int16 X = CPad::GetPad(0)->GetPedWalkLeftRight();
2019-06-13 00:35:26 +00:00
if ( X < 0 && oldfStickX >= 0 )
{
oldfStickX = X;
return true;
}
else
{
oldfStickX = X;
return false;
}
}
2019-06-16 22:16:38 +00:00
bool CPad::GetAnaloguePadRight(void)
2019-06-13 00:35:26 +00:00
{
2019-06-16 22:16:38 +00:00
static int16 oldfStickX = 0;
2019-06-13 00:35:26 +00:00
2019-06-16 22:16:38 +00:00
int16 X = CPad::GetPad(0)->GetPedWalkLeftRight();
2019-06-13 00:35:26 +00:00
if ( X > 0 && oldfStickX <= 0 )
{
oldfStickX = X;
return true;
}
else
{
oldfStickX = X;
return false;
}
}
2019-06-16 22:16:38 +00:00
bool CPad::GetAnaloguePadLeftJustUp(void)
2019-06-13 00:35:26 +00:00
{
2019-06-16 22:16:38 +00:00
static int16 oldfStickX = 0;
2019-06-13 00:35:26 +00:00
2019-06-16 22:16:38 +00:00
int16 X = GetPad(0)->GetPedWalkLeftRight();
2019-06-13 00:35:26 +00:00
if ( X == 0 && oldfStickX < 0 )
{
oldfStickX = X;
return true;
}
else
{
oldfStickX = X;
return false;
}
}
2019-06-16 22:16:38 +00:00
bool CPad::GetAnaloguePadRightJustUp(void)
2019-06-13 00:35:26 +00:00
{
2019-06-16 22:16:38 +00:00
static int16 oldfStickX = 0;
2019-06-13 00:35:26 +00:00
2019-06-16 22:16:38 +00:00
int16 X = GetPad(0)->GetPedWalkLeftRight();
2019-06-13 00:35:26 +00:00
if ( X == 0 && oldfStickX > 0 )
{
oldfStickX = X;
return true;
}
else
{
oldfStickX = X;
return false;
}
}
2019-06-16 22:16:38 +00:00
bool CPad::ForceCameraBehindPlayer(void)
2019-06-13 00:35:26 +00:00
{
2019-07-15 12:11:40 +00:00
if ( ArePlayerControlsDisabled() )
2019-06-13 00:35:26 +00:00
return false;
2020-05-02 21:11:02 +00:00
switch (CURMODE)
2019-06-13 00:35:26 +00:00
{
case 0:
case 1:
{
return !!NewState.LeftShoulder1;
break;
}
case 2:
{
return !!NewState.Triangle;
break;
}
case 3:
{
return !!NewState.Circle;
break;
}
}
return false;
}
2019-06-16 22:16:38 +00:00
bool CPad::SniperZoomIn(void)
2019-06-13 00:35:26 +00:00
{
2019-07-15 12:11:40 +00:00
if ( ArePlayerControlsDisabled() )
2019-06-13 00:35:26 +00:00
return false;
2020-05-02 21:11:02 +00:00
switch (CURMODE)
2019-06-13 00:35:26 +00:00
{
case 0:
case 1:
case 3:
{
return !!NewState.Square;
break;
}
case 2:
{
return !!NewState.Triangle;
break;
}
}
return false;
}
2019-06-16 22:16:38 +00:00
bool CPad::SniperZoomOut(void)
2019-06-13 00:35:26 +00:00
{
2019-07-15 12:11:40 +00:00
if ( ArePlayerControlsDisabled() )
2019-06-13 00:35:26 +00:00
return false;
2020-05-02 21:11:02 +00:00
switch (CURMODE)
2019-06-13 00:35:26 +00:00
{
case 0:
case 1:
case 3:
{
return !!NewState.Cross;
break;
}
case 2:
{
return !!NewState.Square;
break;
}
}
return false;
}
2020-05-02 21:11:02 +00:00
#undef CURMODE
2019-06-13 00:35:26 +00:00
2019-06-16 22:16:38 +00:00
int16 CPad::SniperModeLookLeftRight(void)
2019-06-13 00:35:26 +00:00
{
2019-06-16 22:16:38 +00:00
int16 axis = NewState.LeftStickX;
int16 dpad = (NewState.DPadRight - NewState.DPadLeft) / 2;
2019-06-13 00:35:26 +00:00
2019-07-10 15:18:26 +00:00
if ( Abs(axis) > Abs(dpad) )
2019-06-13 00:35:26 +00:00
return axis;
else
return dpad;
}
2019-06-16 22:16:38 +00:00
int16 CPad::SniperModeLookUpDown(void)
2019-06-13 00:35:26 +00:00
{
2019-06-16 22:16:38 +00:00
int16 axis = NewState.LeftStickY;
2020-05-02 22:42:05 +00:00
#ifdef FIX_BUGS
axis = -axis;
#endif
2019-06-16 22:16:38 +00:00
int16 dpad = (NewState.DPadUp - NewState.DPadDown) / 2;
2019-06-13 00:35:26 +00:00
2019-07-10 15:18:26 +00:00
if ( Abs(axis) > Abs(dpad) )
2019-06-13 00:35:26 +00:00
return axis;
else
return dpad;
}
2019-06-16 22:16:38 +00:00
int16 CPad::LookAroundLeftRight(void)
2019-06-13 00:35:26 +00:00
{
2019-06-16 22:16:38 +00:00
float axis = GetPad(0)->NewState.RightStickX;
2019-06-13 00:35:26 +00:00
2019-07-10 15:18:26 +00:00
if ( Abs(axis) > 85 && !GetLookBehindForPed() )
return (int16) ( (axis + ( ( axis > 0 ) ? -85 : 85) )
2019-06-13 00:35:26 +00:00
* (127.0f / 32.0f) ); // 3.96875f
2019-07-10 15:18:26 +00:00
else if ( TheCamera.Cams[0].Using3rdPersonMouseCam() && Abs(axis) > 10 )
return (int16) ( (axis + ( ( axis > 0 ) ? -10 : 10) )
2019-06-13 00:35:26 +00:00
* (127.0f / 64.0f) ); // 1.984375f
return 0;
}
2019-06-16 22:16:38 +00:00
int16 CPad::LookAroundUpDown(void)
2019-06-13 00:35:26 +00:00
{
2019-06-16 22:16:38 +00:00
int16 axis = GetPad(0)->NewState.RightStickY;
2020-05-02 22:42:05 +00:00
#ifdef FIX_BUGS
axis = -axis;
#endif
2019-07-10 15:18:26 +00:00
if ( Abs(axis) > 85 && !GetLookBehindForPed() )
return (int16) ( (axis + ( ( axis > 0 ) ? -85 : 85) )
2019-06-13 00:35:26 +00:00
* (127.0f / 32.0f) ); // 3.96875f
2019-07-10 15:18:26 +00:00
else if ( TheCamera.Cams[0].Using3rdPersonMouseCam() && Abs(axis) > 40 )
return (int16) ( (axis + ( ( axis > 0 ) ? -40 : 40) )
2019-06-13 00:35:26 +00:00
* (127.0f / 64.0f) ); // 1.984375f
return 0;
}
void CPad::ResetAverageWeapon(void)
{
AverageWeapon = GetWeapon();
AverageEntries = 1;
}
void CPad::PrintErrorMessage(void)
{
if ( bDisplayNoControllerMessage && !CGame::playingIntro && !FrontEndMenuManager.m_bMenuActive )
{
CFont::SetScale(0.85f, 1.0f);
CFont::SetJustifyOff();
CFont::SetBackgroundOff();
CFont::SetCentreSize(SCREEN_WIDTH - 20);
CFont::SetCentreOn();
CFont::SetPropOn();
CFont::SetColor(CRGBA(255, 255, 200, 200));
CFont::SetFontStyle(FONT_BANK);
CFont::PrintString
(
SCREEN_WIDTH / 2,
SCREEN_HEIGHT / 2,
TheText.Get("NOCONT") // Please reconnect an analog controller (DUALSHOCK@) or analog controller (DUALSHOCK@2). to controller port 1 to continue
);
}
else if ( bObsoleteControllerMessage )
{
CFont::SetScale(0.85f, 1.0f);
CFont::SetJustifyOff();
CFont::SetBackgroundOff();
CFont::SetCentreSize(SCREEN_WIDTH - 20);
CFont::SetCentreOn();
CFont::SetPropOn();
CFont::SetColor(CRGBA(255, 255, 200, 200));
CFont::SetFontStyle(FONT_BANK);
CFont::PrintString
(
SCREEN_WIDTH / 2,
SCREEN_HEIGHT / 2,
TheText.Get("WRCONT") // The controller connected to controller port 1 is an unsupported controller. Grand Theft Auto III requires an analog controller (DUALSHOCK@) or analog controller (DUALSHOCK@2).
);
}
}
void LittleTest(void)
{
2019-06-16 22:16:38 +00:00
static int32 Cunt = 0;
2019-06-13 00:35:26 +00:00
Cunt++; // ???
}
void CPad::ResetCheats(void)
{
CWeather::ReleaseWeather();
CPopulation::ms_bGivePedsWeapons = false;
CPed::bNastyLimbsCheat = false;
CPed::bPedCheat2 = false;
CPed::bPedCheat3 = false;
CVehicle::bWheelsOnlyCheat = false;
CVehicle::bAllDodosCheat = false;
CVehicle::bCheat3 = false;
CVehicle::bCheat4 = false;
CVehicle::bCheat5 = false;
gbFastTime = false;
CTimer::SetTimeScale(1.0f);
}
2019-06-16 22:16:38 +00:00
char *CPad::EditString(char *pStr, int32 nSize)
2019-06-13 00:35:26 +00:00
{
2019-06-16 22:16:38 +00:00
int32 pos = strlen(pStr);
2019-06-13 00:35:26 +00:00
// letters
2019-06-16 22:16:38 +00:00
for ( int32 i = 0; i < ('Z' - 'A' + 1); i++ )
2019-06-13 00:35:26 +00:00
{
if ( GetPad(0)->GetCharJustDown(i + 'A') && pos < nSize - 1 )
{
pStr[pos++] = i + 'A';
pStr[pos] = '\0';
}
if ( GetPad(0)->GetCharJustDown(i + 'a') && pos < nSize - 1 )
{
pStr[pos++] = i + 'a';
pStr[pos] = '\0';
}
}
// numbers
2019-07-20 12:39:38 +00:00
for ( int32 i = 0; i < ('9' - '0' + 1); i++ )
2019-06-13 00:35:26 +00:00
{
if ( GetPad(0)->GetCharJustDown(i + '0') && pos < nSize - 1 )
{
pStr[pos++] = i + '0';
pStr[pos] = '\0';
}
}
// space
if ( GetPad(0)->GetCharJustDown(' ') && pos < nSize - 1 )
{
pStr[pos++] = ' ';
pStr[pos] = '\0';
}
// del
if ( GetPad(0)->GetDeleteJustDown() || GetPad(0)->GetBackspaceJustDown() )
{
if ( pos > 0 )
pStr[pos - 1] = '\0';
}
// extenter/up/down
2019-10-29 15:21:02 +00:00
if ( GetPad(0)->GetReturnJustDown() || GetPad(0)->GetUpJustDown() || GetPad(0)->GetDownJustDown() )
2019-06-30 10:53:39 +00:00
return nil;
2019-06-13 00:35:26 +00:00
return pStr;
}
2019-06-16 22:16:38 +00:00
int32 *CPad::EditCodesForControls(int32 *pRsKeys, int32 nSize)
2019-06-13 00:35:26 +00:00
{
*pRsKeys = rsNULL;
2019-06-16 22:16:38 +00:00
for ( int32 i = 0; i < 255; i++ )
2019-06-13 00:35:26 +00:00
{
if ( GetPad(0)->GetCharJustDown(i) )
*pRsKeys = i;
}
2019-06-16 23:32:34 +00:00
for ( int32 i = 0; i < 12; i++ )
2019-06-13 00:35:26 +00:00
{
if ( GetPad(0)->GetFJustDown(i) )
*pRsKeys = i + rsF1;
}
if ( GetPad(0)->GetEscapeJustDown() )
*pRsKeys = rsESC;
if ( GetPad(0)->GetInsertJustDown() )
*pRsKeys = rsINS;
if ( GetPad(0)->GetDeleteJustDown() )
*pRsKeys = rsDEL;
if ( GetPad(0)->GetHomeJustDown() )
*pRsKeys = rsHOME;
if ( GetPad(0)->GetEndJustDown() )
*pRsKeys = rsEND;
if ( GetPad(0)->GetPageUpJustDown() )
*pRsKeys = rsPGUP;
if ( GetPad(0)->GetPageDownJustDown() )
*pRsKeys = rsPGDN;
if ( GetPad(0)->GetUpJustDown() )
*pRsKeys = rsUP;
if ( GetPad(0)->GetDownJustDown() )
*pRsKeys = rsDOWN;
if ( GetPad(0)->GetLeftJustDown() )
*pRsKeys = rsLEFT;
if ( GetPad(0)->GetRightJustDown() )
*pRsKeys = rsRIGHT;
if ( GetPad(0)->GetScrollLockJustDown() )
*pRsKeys = rsSCROLL;
if ( GetPad(0)->GetPauseJustDown() )
*pRsKeys = rsPAUSE;
if ( GetPad(0)->GetNumLockJustDown() )
*pRsKeys = rsNUMLOCK;
if ( GetPad(0)->GetDivideJustDown() )
*pRsKeys = rsDIVIDE;
if ( GetPad(0)->GetTimesJustDown() )
*pRsKeys = rsTIMES;
if ( GetPad(0)->GetMinusJustDown() )
*pRsKeys = rsMINUS;
if ( GetPad(0)->GetPlusJustDown() )
*pRsKeys = rsPLUS;
if ( GetPad(0)->GetPadEnterJustDown() )
*pRsKeys = rsPADENTER;
if ( GetPad(0)->GetPadDelJustDown() )
*pRsKeys = rsPADDEL;
if ( GetPad(0)->GetPad1JustDown() )
*pRsKeys = rsPADEND;
if ( GetPad(0)->GetPad2JustDown() )
*pRsKeys = rsPADDOWN;
if ( GetPad(0)->GetPad3JustDown() )
*pRsKeys = rsPADPGDN;
if ( GetPad(0)->GetPad4JustDown() )
*pRsKeys = rsPADLEFT;
if ( GetPad(0)->GetPad5JustDown() )
*pRsKeys = rsPAD5;
if ( GetPad(0)->GetPad6JustDown() )
*pRsKeys = rsPADRIGHT;
if ( GetPad(0)->GetPad7JustDown() )
*pRsKeys = rsPADHOME;
if ( GetPad(0)->GetPad8JustDown() )
*pRsKeys = rsPADUP;
if ( GetPad(0)->GetPad9JustDown() )
*pRsKeys = rsPADPGUP;
if ( GetPad(0)->GetPad0JustDown() )
*pRsKeys = rsPADINS;
if ( GetPad(0)->GetBackspaceJustDown() )
*pRsKeys = rsBACKSP;
if ( GetPad(0)->GetTabJustDown() )
*pRsKeys = rsTAB;
if ( GetPad(0)->GetCapsLockJustDown() )
*pRsKeys = rsCAPSLK;
2019-10-29 15:21:02 +00:00
if ( GetPad(0)->GetReturnJustDown() )
2019-06-13 00:35:26 +00:00
*pRsKeys = rsENTER;
if ( GetPad(0)->GetLeftShiftJustDown() )
*pRsKeys = rsLSHIFT;
if ( GetPad(0)->GetShiftJustDown() )
*pRsKeys = rsSHIFT;
if ( GetPad(0)->GetRightShiftJustDown() )
*pRsKeys = rsRSHIFT;
if ( GetPad(0)->GetLeftCtrlJustDown() )
*pRsKeys = rsLCTRL;
if ( GetPad(0)->GetRightCtrlJustDown() )
*pRsKeys = rsRCTRL;
if ( GetPad(0)->GetLeftAltJustDown() )
*pRsKeys = rsLALT;
if ( GetPad(0)->GetRightAltJustDown() )
*pRsKeys = rsRALT;
if ( GetPad(0)->GetLeftWinJustDown() )
*pRsKeys = rsLWIN;
if ( GetPad(0)->GetRightWinJustDown() )
*pRsKeys = rsRWIN;
if ( GetPad(0)->GetAppsJustDown() )
*pRsKeys = rsAPPS;
return pRsKeys;
}