cave-story-solaris/src/Input.cpp
Clownacy f6606b7748 Add some missing function names
These were retrieved from the Mac port (v0.0.7), which kept these
functions.

Unfortunately, this port is missing local variable names, so we can't
use it to make InitBack accurate.
2020-03-22 15:31:28 +00:00

116 lines
2.6 KiB
C++

#include "Input.h"
#include <stddef.h>
#include <stdio.h>
#include <string.h>
#include "SDL.h"
#include "WindowsWrapper.h"
// The original names for these variables are unknown
static SDL_Joystick *joystick = NULL;
static int joystick_neutral_x = 0;
static int joystick_neutral_y = 0;
void ReleaseDirectInput(void)
{
// Close opened joystick (if exists)
if (joystick != NULL)
{
SDL_JoystickClose(joystick);
joystick = NULL;
}
SDL_QuitSubSystem(SDL_INIT_JOYSTICK);
}
// It looks like Pixel declared his functions early, so he could forward-reference
BOOL FindAndOpenDirectInputDevice(void);
BOOL InitDirectInput(void)
{
SDL_InitSubSystem(SDL_INIT_JOYSTICK);
if (!FindAndOpenDirectInputDevice())
return FALSE;
return TRUE;
}
// The original name for this function and its variables are unknown.
// This function finds and hooks the first available DirectInput device (or SDL Joystick, in this case).
BOOL FindAndOpenDirectInputDevice(void)
{
int i;
for (i = 0; i < SDL_NumJoysticks(); ++i)
printf("Joystick #%d name: %s\n", i, SDL_JoystickNameForIndex(i));
// Open first available joystick
for (i = 0; i < SDL_NumJoysticks(); ++i)
{
joystick = SDL_JoystickOpen(i);
// Break as soon as a joystick is properly opened
if (joystick != NULL)
return TRUE;
}
return FALSE;
}
BOOL GetJoystickStatus(JOYSTICK_STATUS *status)
{
if (joystick == NULL)
return FALSE;
// The original Input.cpp assumed there were 32 buttons (because of DirectInput's 'DIJOYSTATE' struct)
int numButtons = SDL_JoystickNumButtons(joystick);
if (numButtons > 32)
numButtons = 32;
// Read whatever buttons actually exist
int i = 0;
for (; i < numButtons; ++i)
{
if (SDL_JoystickGetButton(joystick, i) != 0)
status->bButton[i] = TRUE;
else
status->bButton[i] = FALSE;
}
// Blank the buttons that do not
for (; i < 32; ++i)
status->bButton[i] = FALSE;
status->bDown = FALSE;
status->bRight = FALSE;
status->bUp = FALSE;
status->bLeft = FALSE;
const Sint16 joystick_x = SDL_JoystickGetAxis(joystick, 0);
if (joystick_x < joystick_neutral_x - 10000)
status->bLeft = TRUE;
else if (joystick_x > joystick_neutral_x + 10000)
status->bRight = TRUE;
const Sint16 joystick_y = SDL_JoystickGetAxis(joystick, 1);
if (joystick_y < joystick_neutral_y - 10000)
status->bUp = TRUE;
else if (joystick_y > joystick_neutral_y + 10000)
status->bDown = TRUE;
return TRUE;
}
BOOL ResetJoystickStatus(void)
{
if (joystick == NULL)
return FALSE;
joystick_neutral_x = SDL_JoystickGetAxis(joystick, 0);
joystick_neutral_y = SDL_JoystickGetAxis(joystick, 1);
return TRUE;
}