aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main.c11
-rwxr-xr-xsrc/sdl/graphics.c8
-rw-r--r--src/sdl/input.c127
-rw-r--r--src/sdl/input.h1
-rw-r--r--src/sdl/system.c14
5 files changed, 145 insertions, 16 deletions
diff --git a/src/main.c b/src/main.c
index 2e9fffc..475ba5c 100644
--- a/src/main.c
+++ b/src/main.c
@@ -45,6 +45,7 @@ int main(int argc, char **argv)
wantFullscreen = 0;
#endif
screenScale = 2;
+ useJoystick = 1;
// get command line arguments
for (int i=1; i<argc; i++)
{
@@ -60,8 +61,16 @@ int main(int argc, char **argv)
screenScale = 3;
if(!strcmp(argv[i], "-x4"))
screenScale = 4;
+ if(!strcmp(argv[i], "-j"))
+ useJoystick = 0;
+ if(!strcmp(argv[i], "--nojoy"))
+ useJoystick = 0;
+ if(!strcmp(argv[i], "-h") || !strcmp(argv[i], "--help")) {
+ printf("Quick help\n\t-f|--fullscreen\tUse fullscreen\n\t-x1|-x2|-x3|-x4\tUse screenScale of *1..*4 (default *2 = 640x480)\n\t-j|-nojoy\tdo not use Joystick\n");
+ exit(0);
+ }
}
- printf("Hydra Caslte Labyrinth, %s scale=x%d\n", wantFullscreen?"Fullscreen":"Windowed", screenScale);
+ printf("Hydra Caslte Labyrinth, %s scale=x%d, using Joystick=%d\n", wantFullscreen?"Fullscreen":"Windowed", screenScale, useJoystick);
#endif
srand(time(NULL));
diff --git a/src/sdl/graphics.c b/src/sdl/graphics.c
index b25d081..937fea6 100755
--- a/src/sdl/graphics.c
+++ b/src/sdl/graphics.c
@@ -13,6 +13,9 @@ int screenScale = 2;
static uint32_t tframe;
+extern void Input_InitJoystick();
+extern void Input_CloseJoystick();
+
SDL_Color PHL_NewRGB(uint8_t r, uint8_t g, uint8_t b)
{
SDL_Color ret = {.r = r, .b = b, .g = g};
@@ -21,13 +24,15 @@ SDL_Color PHL_NewRGB(uint8_t r, uint8_t g, uint8_t b)
void PHL_GraphicsInit()
{
- if ( SDL_Init(SDL_INIT_VIDEO) < 0) {
+ if ( SDL_Init(SDL_INIT_VIDEO | SDL_INIT_JOYSTICK ) < 0) {
fprintf(stderr, "Error");
SDL_Delay(5000);
exit(EXIT_FAILURE);
}
SDL_ShowCursor(SDL_DISABLE);
+
+ Input_InitJoystick();
uint32_t flags = SDL_HWSURFACE|SDL_DOUBLEBUF;
if(wantFullscreen)
@@ -40,6 +45,7 @@ void PHL_GraphicsInit()
void PHL_GraphicsExit()
{
+ Input_CloseJoystick();
SDL_FreeSurface(backbuffer);
SDL_Quit();
}
diff --git a/src/sdl/input.c b/src/sdl/input.c
index c5f5a65..adba574 100644
--- a/src/sdl/input.c
+++ b/src/sdl/input.c
@@ -13,6 +13,34 @@ int bFaceUp = 0, bFaceDown = 0, bFaceLeft = 0, bFaceRight = 0;
int bR = 0, bL = 0;
int bStart = 0, bSelect = 0;
int bAccept = 0, bDecline = 0;
+int jUp = 0, jDown = 0, jLeft = 0, jRight = 0;
+int jFaceUp = 0, jFaceDown = 0, jFaceLeft = 0, jFaceRight = 0;
+int jR = 0, jL = 0;
+int jStart = 0, jSelect = 0;
+int jAccept = 0, jDecline = 0;
+
+SDL_Joystick *joy1 = NULL;
+
+int useJoystick = 1;
+
+void Input_InitJoystick()
+{
+ int n = SDL_NumJoysticks();
+ if (n) {
+ joy1 = SDL_JoystickOpen(0);
+ SDL_JoystickEventState(SDL_ENABLE);
+ printf("Using %s\n", SDL_JoystickName(0));
+ } else {
+ joy1 = NULL;
+ }
+}
+
+void Input_CloseJoystick()
+{
+ if(joy1)
+ SDL_JoystickClose(joy1);
+ joy1 = NULL;
+}
void Input_KeyEvent(SDL_Event* evt)
{
@@ -45,6 +73,79 @@ void Input_KeyEvent(SDL_Event* evt)
}
}
+void Input_JoyAxisEvent(SDL_Event* evt) {
+ if(evt->jaxis.which!=0)
+ return;
+ #define DEADZONE 32
+ if(evt->jaxis.axis==0) {
+ int v = (evt->jaxis.value)/256;
+ if(v>-DEADZONE & v<DEADZONE) axisX = 0;
+ else if(v<0) axisX = -1;
+ else axisX = +1;
+ }
+ if(evt->jaxis.axis==1) {
+ int v = (evt->jaxis.value)/256;
+ if(v>-DEADZONE & v<DEADZONE) axisY = 0;
+ else if(v<0) axisY = -1;
+ else axisY = +1;
+ }
+}
+
+void Input_JoyEvent(SDL_Event* evt) {
+ if(evt->jbutton.which!=0)
+ return;
+ int w = (evt->type==SDL_JOYBUTTONDOWN)?1:0;
+/* XBox 360 based mapping here,
+ (would be better to switch to SDL2.0)
+ btn SDL1.2 SDL2.0
+ ---------------------------
+ A 0 10
+ B 1 11
+ X 2 12
+ Y 3 13
+ Home N/A 14
+ LB 4 8
+ RB 5 9
+ LT N/A N/A (axis)
+ RT N/A N/A (axis)
+ Select 6 5
+ Start 7 4
+ L3 9 6
+ R3 10 7
+ DPad Up N/A 0
+ DPad Down N/A 1
+ DPad Left N/A 2
+ DPad Right N/A 3
+*/
+ switch(evt->jbutton.button)
+ {
+ case 0: jFaceDown = w; break;
+ case 1: jFaceLeft = w; break;
+ case 2: jFaceRight = w; break;
+ case 3: jFaceUp = w; break;
+ case 4: jL = w; break;
+ case 5: jR = w; break;
+ case 6: jSelect = w; break;
+ case 7: jStart = w; break;
+ /*case 12:jUp = w; break;
+ case 13:jDown = w; break;
+ case 14:jLeft = w; break;
+ case 15:jRight = w; break;*/
+ }
+}
+
+void Input_JoyHatEvent(SDL_Event* evt) {
+ if(evt->jhat.which!=0)
+ return;
+ if(evt->jhat.hat!=0)
+ return;
+ int v=evt->jhat.value;
+ jUp = v&SDL_HAT_UP;
+ jDown = v&SDL_HAT_DOWN;
+ jLeft = v&SDL_HAT_LEFT;
+ jRight = v&SDL_HAT_RIGHT;
+}
+
void updateKey(Button* btn, int state)
{
if (state) {
@@ -68,21 +169,21 @@ void updateKey(Button* btn, int state)
void PHL_ScanInput()
{
- updateKey(&btnUp, bUp);
- updateKey(&btnDown, bDown);
- updateKey(&btnLeft, bLeft);
- updateKey(&btnRight, bRight);
+ updateKey(&btnUp, bUp|jUp|(axisY<0));
+ updateKey(&btnDown, bDown|jDown|(axisY>0));
+ updateKey(&btnLeft, bLeft|jLeft|(axisX<0));
+ updateKey(&btnRight, bRight|jRight|(axisX>0));
- updateKey(&btnStart, bStart);
- updateKey(&btnSelect, bSelect);
+ updateKey(&btnStart, bStart|jStart);
+ updateKey(&btnSelect, bSelect|jSelect);
- updateKey(&btnL, bL);
- updateKey(&btnR, bR);
+ updateKey(&btnL, bL|jL);
+ updateKey(&btnR, bR|jR);
- updateKey(&btnFaceLeft, bFaceLeft);
- updateKey(&btnFaceDown, bFaceDown);
- updateKey(&btnFaceRight, bFaceRight);
+ updateKey(&btnFaceLeft, bFaceLeft|jFaceLeft);
+ updateKey(&btnFaceDown, bFaceDown|jFaceDown);
+ updateKey(&btnFaceRight, bFaceRight|jFaceRight);
- updateKey(&btnAccept, bFaceLeft);
- updateKey(&btnDecline, bFaceDown);
+ updateKey(&btnAccept, bFaceLeft|jFaceLeft);
+ updateKey(&btnDecline, bFaceDown|jFaceDown);
}
diff --git a/src/sdl/input.h b/src/sdl/input.h
index ec627f6..b5c6507 100644
--- a/src/sdl/input.h
+++ b/src/sdl/input.h
@@ -15,6 +15,7 @@ extern Button btnL, btnR;
extern Button btnStart, btnSelect;
extern Button btnAccept, btnDecline;
extern int axisX, axisY;
+extern int useJoystick;
void PHL_ScanInput();
diff --git a/src/sdl/system.c b/src/sdl/system.c
index 7e27d05..610685d 100644
--- a/src/sdl/system.c
+++ b/src/sdl/system.c
@@ -5,6 +5,9 @@
char quitGame = 0;
void Input_KeyEvent(SDL_Event* evt);
+void Input_JoyEvent(SDL_Event* evt);
+void Input_JoyAxisEvent(SDL_Event* evt);
+void Input_JoyHatEvent(SDL_Event* evt);
int PHL_MainLoop()
{
@@ -19,7 +22,16 @@ int PHL_MainLoop()
case SDL_KEYUP:
Input_KeyEvent(&evt);
break;
- //TODO: joystick...
+ case SDL_JOYAXISMOTION:
+ Input_JoyAxisEvent(&evt);
+ break;
+ case SDL_JOYHATMOTION:
+ Input_JoyHatEvent(&evt);
+ break;
+ case SDL_JOYBUTTONDOWN:
+ case SDL_JOYBUTTONUP:
+ Input_JoyEvent(&evt);
+ break;
}
}
if (quitGame == 1)