fixed dinput

This commit is contained in:
aap 2019-07-25 12:38:25 +02:00
parent ecf03d0f54
commit 60364f11da
3 changed files with 44 additions and 33 deletions

View File

@ -22,7 +22,7 @@ public:
int32 m_ContSetOrder; int32 m_ContSetOrder;
}; };
bool field_0; bool firstCapture;
char _pad0[3]; char _pad0[3];
DIJOYSTATE2 m_OldState; DIJOYSTATE2 m_OldState;
DIJOYSTATE2 m_NewState; DIJOYSTATE2 m_NewState;

View File

@ -115,7 +115,7 @@ enum Config {
# define CHATTYSPLASH // print what the game is loading # define CHATTYSPLASH // print what the game is loading
#endif #endif
//#define FIX_BUGS // fix bugs in the game, TODO: use this more #define FIX_BUGS // fix bugs in the game, TODO: use this more
#define KANGAROO_CHEAT #define KANGAROO_CHEAT
#define ASPECT_RATIO_SCALE #define ASPECT_RATIO_SCALE
#define USE_DEBUG_SCRIPT_LOADER #define USE_DEBUG_SCRIPT_LOADER

View File

@ -2265,9 +2265,6 @@ HRESULT _InputInitialiseMouse()
return S_OK; return S_OK;
} }
//#define SUCCEEDED(Status) ((HRESULT)(Status) >= 0)
//#define FAILED(Status) ((HRESULT)(Status)<0)
RwV2d leftStickPos; RwV2d leftStickPos;
RwV2d rightStickPos; RwV2d rightStickPos;
@ -2275,15 +2272,20 @@ HRESULT CapturePad(RwInt32 padID)
{ {
HRESULT hr; HRESULT hr;
DIJOYSTATE2 js; DIJOYSTATE2 js;
LPDIRECTINPUTDEVICE8 pPad = nil; LPDIRECTINPUTDEVICE8 *pPad = nil;
if( padID == 0 )
pPad = &PSGLOBAL(joy1);
else if( padID == 1)
pPad = &PSGLOBAL(joy2);
else
assert("invalid padID");
pPad = ( padID == 0 ) ? PSGLOBAL(joy1) : PSGLOBAL(joy2); if ( nil == (*pPad) )
if ( nil == pPad )
return S_OK; return S_OK;
// Poll the device to read the current state // Poll the device to read the current state
hr = pPad->Poll(); hr = (*pPad)->Poll();
if( FAILED(hr) ) if( FAILED(hr) )
{ {
@ -2291,9 +2293,9 @@ HRESULT CapturePad(RwInt32 padID)
// interrupted. We aren't tracking any state between polls, so // interrupted. We aren't tracking any state between polls, so
// we don't have any special reset that needs to be done. We // we don't have any special reset that needs to be done. We
// just re-acquire and try again. // just re-acquire and try again.
hr = pPad->Acquire(); hr = (*pPad)->Acquire();
while( hr == DIERR_INPUTLOST ) while( hr == DIERR_INPUTLOST )
hr = pPad->Acquire(); hr = (*pPad)->Acquire();
// hr may be DIERR_OTHERAPPHASPRIO or other errors. This // hr may be DIERR_OTHERAPPHASPRIO or other errors. This
// may occur when the app is minimized or in the process of // may occur when the app is minimized or in the process of
@ -2302,26 +2304,26 @@ HRESULT CapturePad(RwInt32 padID)
if( FAILED(hr) ) if( FAILED(hr) )
return hr; return hr;
hr = pPad->Poll(); hr = (*pPad)->Poll();
if( FAILED(hr) ) if( FAILED(hr) )
return hr; return hr;
} }
// Get the input's device state // Get the input's device state
if( FAILED( hr = pPad->GetDeviceState( sizeof(DIJOYSTATE2), &js ) ) ) if( FAILED( hr = (*pPad)->GetDeviceState( sizeof(DIJOYSTATE2), &js ) ) )
return hr; // The device should have been acquired during the Poll() return hr; // The device should have been acquired during the Poll()
if ( ControlsManager.field_0 == true ) if ( ControlsManager.firstCapture == true )
{ {
memcpy(&ControlsManager.m_OldState, &js, sizeof(DIJOYSTATE2)); memcpy(&ControlsManager.m_OldState, &js, sizeof(DIJOYSTATE2));
memcpy(&ControlsManager.m_NewState, &js, sizeof(DIJOYSTATE2)); memcpy(&ControlsManager.m_NewState, &js, sizeof(DIJOYSTATE2));
ControlsManager.field_0 = false; ControlsManager.firstCapture = false;
} }
else else
{ {
memcpy(&ControlsManager.m_OldState, &ControlsManager.m_NewState, sizeof(DIJOYSTATE2)); memcpy(&ControlsManager.m_OldState, &ControlsManager.m_NewState, sizeof(DIJOYSTATE2));
memcpy(&ControlsManager.m_NewState, &js, sizeof(DIJOYSTATE2)); memcpy(&ControlsManager.m_NewState, &js, sizeof(DIJOYSTATE2));
} }
RsPadButtonStatus bs; RsPadButtonStatus bs;
@ -2329,14 +2331,14 @@ HRESULT CapturePad(RwInt32 padID)
RsPadEventHandler(rsPADBUTTONUP, (void *)&bs); RsPadEventHandler(rsPADBUTTONUP, (void *)&bs);
bool deviceAvailable = pPad != nil; bool deviceAvailable = (*pPad) != nil;
if ( deviceAvailable ) if ( deviceAvailable )
{ {
leftStickPos.x = (float)js.lX / (float)((DEVICE_AXIS_MAX - DEVICE_AXIS_MIN) / 2); leftStickPos.x = (float)js.lX / (float)((DEVICE_AXIS_MAX - DEVICE_AXIS_MIN) / 2);
leftStickPos.y = (float)js.lY / (float)((DEVICE_AXIS_MAX - DEVICE_AXIS_MIN) / 2); leftStickPos.y = (float)js.lY / (float)((DEVICE_AXIS_MAX - DEVICE_AXIS_MIN) / 2);
if (LOWORD(js.rgdwPOV[0]) != -1) if (LOWORD(js.rgdwPOV[0]) != 0xFFFF)
{ {
float angle = DEGTORAD((float)js.rgdwPOV[0] / 100.0f); float angle = DEGTORAD((float)js.rgdwPOV[0] / 100.0f);
@ -2548,40 +2550,49 @@ BOOL CALLBACK _InputEnumDevicesCallback( const DIDEVICEINSTANCE* pdidInstance, V
static INT Count = 0; static INT Count = 0;
LPDIRECTINPUTDEVICE8 pJoystick = nil; LPDIRECTINPUTDEVICE8 *pJoystick = nil;
if ( Count == 0 ) if ( Count == 0 )
pJoystick = PSGLOBAL(joy1); pJoystick = &PSGLOBAL(joy1);
else if ( Count == 1 ) else if ( Count == 1 )
pJoystick = PSGLOBAL(joy2); pJoystick = &PSGLOBAL(joy2);
else
assert("too many pads");
// Obtain an interface to the enumerated joystick. // Obtain an interface to the enumerated joystick.
hr = PSGLOBAL(dinterface)->CreateDevice( pdidInstance->guidInstance, &pJoystick, nil ); hr = PSGLOBAL(dinterface)->CreateDevice( pdidInstance->guidInstance, pJoystick, nil );
// If it failed, then we can't use this joystick. (Maybe the user unplugged // If it failed, then we can't use this joystick. (Maybe the user unplugged
// it while we were in the middle of enumerating it.) // it while we were in the middle of enumerating it.)
if( FAILED(hr) ) if( hr != S_OK )
return DIENUM_CONTINUE; return DIENUM_CONTINUE;
if( FAILED( hr = pJoystick->SetDataFormat( &c_dfDIJoystick2 ) ) ) hr = (*pJoystick)->SetDataFormat( &c_dfDIJoystick2 );
if( hr != S_OK )
{ {
pJoystick->Release(); (*pJoystick)->Release();
return DIENUM_CONTINUE; return DIENUM_CONTINUE;
} }
++Count; ++Count;
if( FAILED( hr = pJoystick->SetCooperativeLevel( PSGLOBAL(window), DISCL_NONEXCLUSIVE) ) ) hr = (*pJoystick)->SetCooperativeLevel( PSGLOBAL(window), DISCL_NONEXCLUSIVE|DISCL_FOREGROUND );
if( hr != S_OK )
{ {
pJoystick->Release(); (*pJoystick)->Release();
#ifdef FIX_BUGS
// BUG: enum will be called with Count == 2, which will write to a null pointer
// So decrement count again since we're not using this pad
--Count;
#endif
return DIENUM_CONTINUE; return DIENUM_CONTINUE;
} }
// Stop enumeration. Note: we're just taking the first two joysticks we get. You
// could store all the enumerated joysticks and let the user pick.
if ( Count == 2 ) if ( Count == 2 )
return DIENUM_STOP; return DIENUM_STOP;
// Stop enumeration. Note: we're just taking the first joystick we get. You
// could store all the enumerated joysticks and let the user pick.
return DIENUM_CONTINUE; return DIENUM_CONTINUE;
} }