From 0498f7ce251390f3a2e716bf98cc58cbf84f47cd Mon Sep 17 00:00:00 2001 From: GreenDev <32424793+ThatOneGreenGuy@users.noreply.github.com> Date: Fri, 11 Jan 2019 22:04:35 -0500 Subject: [PATCH] Working on input... working on the entry point --- .gitignore | 5 + Makefile | 4 + src/Input.cpp | 68 ++++++++++++++ src/Input.h | 12 +++ src/KeyControl.cpp | 1 - src/KeyControl.h | 11 ++- src/Main.cpp | 228 +++++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 325 insertions(+), 4 deletions(-) create mode 100644 src/Input.cpp create mode 100644 src/Input.h diff --git a/.gitignore b/.gitignore index 259148fa..3b38dc7c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,11 @@ # Prerequisites *.d +# Misc +/obj +Config.dat +Profile.dat + # Compiled Object files *.slo *.lo diff --git a/Makefile b/Makefile index 09c8cd1c..e402ae86 100644 --- a/Makefile +++ b/Makefile @@ -11,6 +11,9 @@ endif ifeq ($(JAPANESE), 1) CXXFLAGS += -DJAPANESE endif +ifeq ($(FIX_BUGS), 1) +CXXFLAGS += -DFIX_BUGS +endif CXXFLAGS += `sdl2-config --cflags` LIBS += `sdl2-config --static-libs` @@ -18,6 +21,7 @@ LIBS += `sdl2-config --static-libs` # For an accurate result to the original's code, compile in alphabetical order SOURCES = \ Config \ + Input \ KeyControl \ Main \ diff --git a/src/Input.cpp b/src/Input.cpp new file mode 100644 index 00000000..612dcfe5 --- /dev/null +++ b/src/Input.cpp @@ -0,0 +1,68 @@ +#include "Types.h" +#include +#include +#include "Input.h" + +#define JOYSTICK_DEADZONE 0x2000 + +bool gbUseJoystick; +int gJoystickButtonTable[8]; + +SDL_GameController *joystick; //This may be a name that was given by Simon, but it fits the rest of Pixel's names so it's fine. + +void ReleaseDirectInput() +{ + //Close opened joystick (if exists) + if (joystick) + { + SDL_GameControllerClose(joystick); + joystick = nullptr; + } +} + +bool InitDirectInput() +{ + //Open first available joystick + for (int i = 0; i < SDL_NumJoysticks(); ++i) + { + if (SDL_IsGameController(i)) + { + joystick = SDL_GameControllerOpen(i); + + //Break as soon as a joystick is properly opened + if (joystick) + break; + } + } + + return true; +} + +signed int GetJoystickStatus(JOYSTICK_STATUS *pStatus) +{ + //Clear status + memset(pStatus, 0, sizeof(JOYSTICK_STATUS)); + + if (joystick) + { + int32_t x = SDL_GameControllerGetAxis(joystick, SDL_CONTROLLER_AXIS_LEFTX); + int32_t y = SDL_GameControllerGetAxis(joystick, SDL_CONTROLLER_AXIS_LEFTY); + pStatus->bLeft = x <= -JOYSTICK_DEADZONE; + pStatus->bRight = x >= JOYSTICK_DEADZONE; + pStatus->bUp = v2 <= -JOYSTICK_DEADZONE; + pStatus->bDown = v2 >= JOYSTICK_DEADZONE; + + int numButtons = SDL_GameControllerNumButtons(joystick); + if (numButtons > 32) + numButtons = 32; + + for (int button = 0; button < numButtons; button++) + pStatus->bButton[button] = SDL_GameControllerGetButton(joystick, button) != 0; + } + return 1; +} + +signed int ResetJoystickStatus() +{ + return 1; +} diff --git a/src/Input.h b/src/Input.h new file mode 100644 index 00000000..b26d0a93 --- /dev/null +++ b/src/Input.h @@ -0,0 +1,12 @@ +#pragma once +extern bool gbUseJoystick; +extern int gJoystickButtonTable[8]; + +struct JOYSTICK_STATUS +{ + bool bLeft; + bool bRight; + bool bUp; + bool bDown; + bool bButton[32]; +}; diff --git a/src/KeyControl.cpp b/src/KeyControl.cpp index aa67f578..aa5f5c38 100644 --- a/src/KeyControl.cpp +++ b/src/KeyControl.cpp @@ -1,5 +1,4 @@ #include "KeyControl.h" - int gKey; int gKeyTrg; diff --git a/src/KeyControl.h b/src/KeyControl.h index e6e7a818..7eeaec37 100644 --- a/src/KeyControl.h +++ b/src/KeyControl.h @@ -8,12 +8,14 @@ enum KEYBIND KEY_DOWN = 0x00000008, //Map key KEY_MAP = 0x00000010, - //Okay and cancel keys + //Okay and cancel / Jump and Shoot keys KEY_X = 0x00000020, KEY_Z = 0x00000040, //Left and right weapon switch keys KEY_ARMS = 0x00000080, KEY_ARMSREV = 0x00000100, + //Unused? + KEY_SHIFT = 0x00000200, //Function keys KEY_F1 = 0x00000400, KEY_F2 = 0x00000800, @@ -23,9 +25,12 @@ enum KEYBIND KEY_ESCAPE = 0x00008000, //The alt movement keys go in the order of left, up, right and down KEY_ALT_LEFT = 0x00010000, - KEY_ALT_UP = 0x00020000, + KEY_ALT_DOWN = 0x00020000, KEY_ALT_RIGHT = 0x00040000, - KEY_ALT_DOWN = 0x00080000, + KEY_ALT_UP = 0x00180000, + //Alt up actually has 2 seperate keys, but they're kind of merged together (and also for some reason the second one is +/=) + KEY_L = 0x00080000, + KEY_PLUS = 0x00100000, }; extern int gKey; diff --git a/src/Main.cpp b/src/Main.cpp index 749e14e8..57b980b3 100644 --- a/src/Main.cpp +++ b/src/Main.cpp @@ -10,6 +10,7 @@ #include #include +#include "Input.h" #include "Config.h" #include "KeyControl.h" @@ -83,5 +84,232 @@ int main(int argc, char *argv[]) gKeyDown = KEY_DOWN; } + //Set gamepad inputs + for (int i = 0; i < 8; i++) + { + switch (config.joystick_button[i]) + { + case 1: + gJoystickButtonTable[i] = gKeyJump; + break; + + case 2: + gJoystickButtonTable[i] = gKeyShot; + break; + + case 3: + gJoystickButtonTable[i] = gKeyArms; + break; + + case 6: + gJoystickButtonTable[i] = gKeyArmsRev; + break; + + case 4: + gJoystickButtonTable[i] = gKeyItem; + break; + + case 5: + gJoystickButtonTable[i] = gKeyMap; + break; + + default: + continue; + } + } + return 0; } + + + + +bool SystemTask() +{ + SDL_Event event; + while (SDL_PollEvent(&event)) + { + switch (event.type) + { + case SDL_QUIT: + return false; + break; + + case SDL_KEYDOWN: + switch (event.key.keysym.scancode) + { + case SDL_SCANCODE_ESCAPE: + gKey |= KEY_ESCAPE; + break; + + case SDL_SCANCODE_W: + gKey |= KEY_MAP; + break; + + case SDL_SCANCODE_LEFT: + gKey |= KEY_LEFT; + break; + + case SDL_SCANCODE_RIGHT: + gKey |= KEY_RIGHT; + break; + + case SDL_SCANCODE_UP: + gKey |= KEY_UP; + break; + + case SDL_SCANCODE_DOWN: + gKey |= KEY_DOWN; + break; + + case SDL_SCANCODE_X: + gKey |= KEY_X; + break; + + case SDL_SCANCODE_Z: + gKey |= KEY_Z; + break; + + case SDL_SCANCODE_S: + gKey |= KEY_ARMS; + break; + + case SDL_SCANCODE_A: + gKey |= KEY_ARMSREV; + break; + + case SDL_SCANCODE_RSHIFT: + case SDL_SCANCODE_LSHIFT: + gKey |= KEY_SHIFT; + break; + + case SDL_SCANCODE_F1: + gKey |= KEY_F1; + break; + + case SDL_SCANCODE_F2: + gKey |= KEY_F2; + break; + + case SDL_SCANCODE_Q: + gKey |= KEY_ITEM; + break; + + case SDL_SCANCODE_COMMA: + gKey |= KEY_ALT_LEFT; + break; + + case SDL_SCANCODE_PERIOD: + gKey |= KEY_ALT_DOWN; + break; + + case SDL_SCANCODE_SLASH: + gKey |= KEY_ALT_RIGHT; + break; + + case SDL_SCANCODE_L: + gKey |= KEY_ALT_UP; + break; + + case SDL_SCANCODE_EQUALS: + gKey |= KEY_PLUS; + break; + + case SDL_SCANCODE_F5: + gbUseJoystick = false; + break; + + default: + return true; + } + break; + + case SDL_KEYUP: + switch (event.key.keysym.scancode) + { + case SDL_SCANCODE_ESCAPE: + gKey &= ~KEY_ESCAPE; + break; + + case SDL_SCANCODE_W: + gKey &= ~KEY_MAP; + break; + + case SDL_SCANCODE_LEFT: + gKey &= ~KEY_LEFT; + break; + + case SDL_SCANCODE_RIGHT: + gKey &= ~KEY_RIGHT; + break; + + case SDL_SCANCODE_UP: + gKey &= ~KEY_UP; + break; + + case SDL_SCANCODE_DOWN: + gKey &= ~KEY_DOWN; + break; + + case SDL_SCANCODE_X: + gKey &= ~KEY_X; + break; + + case SDL_SCANCODE_Z: + gKey &= ~KEY_Z; + break; + + case SDL_SCANCODE_S: + gKey &= ~KEY_ARMS; + break; + + case SDL_SCANCODE_A: + gKey &= ~KEY_ARMSREV; + break; + + case SDL_SCANCODE_RSHIFT: + case SDL_SCANCODE_LSHIFT: + gKey &= ~KEY_SHIFT; + break; + + case SDL_SCANCODE_F1: + gKey &= ~KEY_F1; + break; + + case SDL_SCANCODE_F2: + gKey &= ~KEY_F2; + break; + + case SDL_SCANCODE_Q: + gKey &= ~KEY_ITEM; + break; + + case SDL_SCANCODE_COMMA: + gKey &= ~KEY_ALT_LEFT; + break; + + case SDL_SCANCODE_PERIOD: + gKey &= ~KEY_ALT_DOWN; + break; + + case SDL_SCANCODE_SLASH: + gKey &= ~KEY_ALT_RIGHT; + break; + + case SDL_SCANCODE_L: + gKey &= ~KEY_ALT_UP; + break; + + case SDL_SCANCODE_EQUALS: + gKey &= ~KEY_PLUS; + break; + + default: + return true; + } + break; + } + } + + return true; +}