diff --git a/src/lindbergh/config.c b/src/lindbergh/config.c index 2e860b2..1d51879 100644 --- a/src/lindbergh/config.c +++ b/src/lindbergh/config.c @@ -416,40 +416,40 @@ int readConfig(FILE *configFile, EmulatorConfig *config) else if (strcmp(command, "DEBUG_MSGS") == 0) config->showDebugMessages = atoi(getNextToken(NULL, " ", &saveptr)); - else if (strcmp(command,"TEST_KEY") == 0) + else if (strcmp(command, "TEST_KEY") == 0) config->keymap.test = atoi(getNextToken(NULL, " ", &saveptr)); - //TODO: add config when supporting player2 - else if (strcmp(command,"PLAYER_1_START_KEY") == 0) + // TODO: add config when supporting player2 + else if (strcmp(command, "PLAYER_1_START_KEY") == 0) config->keymap.player1.start = atoi(getNextToken(NULL, " ", &saveptr)); - else if (strcmp(command,"PLAYER_1_SERVICE_KEY") == 0) + else if (strcmp(command, "PLAYER_1_SERVICE_KEY") == 0) config->keymap.player1.service = atoi(getNextToken(NULL, " ", &saveptr)); - else if (strcmp(command,"PLAYER_1_COIN_KEY") == 0) + else if (strcmp(command, "PLAYER_1_COIN_KEY") == 0) config->keymap.player1.coin = atoi(getNextToken(NULL, " ", &saveptr)); - else if (strcmp(command,"PLAYER_1_UP_KEY") == 0) + else if (strcmp(command, "PLAYER_1_UP_KEY") == 0) config->keymap.player1.up = atoi(getNextToken(NULL, " ", &saveptr)); - else if (strcmp(command,"PLAYER_1_DOWN_KEY") == 0) + else if (strcmp(command, "PLAYER_1_DOWN_KEY") == 0) config->keymap.player1.down = atoi(getNextToken(NULL, " ", &saveptr)); - else if (strcmp(command,"PLAYER_1_LEFT_KEY") == 0) + else if (strcmp(command, "PLAYER_1_LEFT_KEY") == 0) config->keymap.player1.left = atoi(getNextToken(NULL, " ", &saveptr)); - else if (strcmp(command,"PLAYER_1_RIGHT_KEY") == 0) + else if (strcmp(command, "PLAYER_1_RIGHT_KEY") == 0) config->keymap.player1.right = atoi(getNextToken(NULL, " ", &saveptr)); - else if (strcmp(command,"PLAYER_1_BUTTON_1_KEY") == 0) + else if (strcmp(command, "PLAYER_1_BUTTON_1_KEY") == 0) config->keymap.player1.button1 = atoi(getNextToken(NULL, " ", &saveptr)); - else if (strcmp(command,"PLAYER_1_BUTTON_2_KEY") == 0) + else if (strcmp(command, "PLAYER_1_BUTTON_2_KEY") == 0) config->keymap.player1.button2 = atoi(getNextToken(NULL, " ", &saveptr)); - else if (strcmp(command,"PLAYER_1_BUTTON_3_KEY") == 0) + else if (strcmp(command, "PLAYER_1_BUTTON_3_KEY") == 0) config->keymap.player1.button3 = atoi(getNextToken(NULL, " ", &saveptr)); - else if (strcmp(command,"PLAYER_1_BUTTON_4_KEY") == 0) + else if (strcmp(command, "PLAYER_1_BUTTON_4_KEY") == 0) config->keymap.player1.button4 = atoi(getNextToken(NULL, " ", &saveptr)); else @@ -459,34 +459,33 @@ int readConfig(FILE *configFile, EmulatorConfig *config) return 0; } -KeyMapping getDefualtKeymap() +KeyMapping getDefaultKeymap() { - KeyMapping a; - a.test = 28; - a.player1.start = 10; - a.player1.service = 39; - a.player1.coin = 14; - a.player1.up = 111; - a.player1.down = 116; - a.player1.left = 113; - a.player1.right = 114; - a.player1.button1 = 24; - a.player1.button2 = 25; - a.player1.button3 = 26; - a.player1.button4 = 27; - //TODO: Add keys when supporting player2 - a.player2.start = -1; - a.player2.service = -1; - a.player2.coin = -1; - a.player2.up = -1; - a.player2.down = -1; - a.player2.left = -1; - a.player2.right = -1; - a.player2.button1 = -1; - a.player2.button2 = -1; - a.player2.button3 = -1; - a.player2.button4 = -1; - return a; + KeyMapping defaultKeyMapping; + defaultKeyMapping.test = 28; + defaultKeyMapping.player1.start = 10; + defaultKeyMapping.player1.service = 39; + defaultKeyMapping.player1.coin = 14; + defaultKeyMapping.player1.up = 111; + defaultKeyMapping.player1.down = 116; + defaultKeyMapping.player1.left = 113; + defaultKeyMapping.player1.right = 114; + defaultKeyMapping.player1.button1 = 24; + defaultKeyMapping.player1.button2 = 25; + defaultKeyMapping.player1.button3 = 26; + defaultKeyMapping.player1.button4 = 27; + defaultKeyMapping.player2.start = -1; + defaultKeyMapping.player2.service = -1; + defaultKeyMapping.player2.coin = -1; + defaultKeyMapping.player2.up = -1; + defaultKeyMapping.player2.down = -1; + defaultKeyMapping.player2.left = -1; + defaultKeyMapping.player2.right = -1; + defaultKeyMapping.player2.button1 = -1; + defaultKeyMapping.player2.button2 = -1; + defaultKeyMapping.player2.button3 = -1; + defaultKeyMapping.player2.button4 = -1; + return defaultKeyMapping; } int initConfig() @@ -512,7 +511,7 @@ int initConfig() config.gameID = "XXXX"; config.gameDVP = "DVP-XXXX"; config.gameType = SHOOTING; - config.keymap = getDefualtKeymap(); + config.keymap = getDefaultKeymap(); if (detectGame(config.crc32) != 0) { printf("Warning: Unsure what game with CRC 0x%X is. Please submit this new game to the GitHub repository: https://github.com/bobbydilley/lindbergh-loader/issues/new?title=Please+add+new+game+0x%X&body=I+tried+to+launch+the+following+game:\n", config.crc32, config.crc32); diff --git a/src/lindbergh/config.h b/src/lindbergh/config.h index 51bb2b5..272f72b 100644 --- a/src/lindbergh/config.h +++ b/src/lindbergh/config.h @@ -56,7 +56,6 @@ #define VIRTUA_TENNIS_3 0xc4b7e89 #define VIRTUA_TENNIS_3_TEST 0xffe3b0fd - typedef enum { YELLOW, @@ -98,8 +97,6 @@ typedef struct unsigned int button4; } PlayerKeyMapping; -// All keycode can be found using `xev` binary's debug output -// NOTE: Maybe using tagged union for driving and shooting games typedef struct { unsigned int test; @@ -131,10 +128,10 @@ typedef struct int showDebugMessages; char *gameID; char *gameTitle; - char* gameDVP; + char *gameDVP; } EmulatorConfig; -KeyMapping getDefualtKeymap(); +KeyMapping getDefaultKeymap(); int initConfig(); EmulatorConfig *getConfig(); char *getGameName(); diff --git a/src/lindbergh/input.c b/src/lindbergh/input.c index e468abd..56fcdd9 100644 --- a/src/lindbergh/input.c +++ b/src/lindbergh/input.c @@ -29,108 +29,130 @@ int initInput() int XNextEventDriving(Display *display, XEvent *event_return, int returnValue) { KeyMapping keymap = getConfig()->keymap; - if (event_return->type == KeyPress || event_return->type == KeyRelease) + switch (event_return->type) + { + case KeyPress: + case KeyRelease: { if (event_return->xkey.keycode == keymap.test) setSwitch(SYSTEM, BUTTON_TEST, event_return->type == KeyPress); + else if (event_return->xkey.keycode == keymap.player1.service) setSwitch(PLAYER_1, BUTTON_SERVICE, event_return->type == KeyPress); + else if (event_return->xkey.keycode == keymap.player1.coin) incrementCoin(PLAYER_1, event_return->type == KeyPress); - else if (event_return->xkey.keycode == keymap.player2.coin) - incrementCoin(PLAYER_2, event_return->type == KeyPress); + else if (event_return->xkey.keycode == keymap.player1.up) - setAnalogue(ANALOGUE_2, - event_return->type == KeyPress ? pow(2, 10) - 1 : 0); + setAnalogue(ANALOGUE_2, event_return->type == KeyPress ? pow(2, 10) - 1 : 0); + else if (event_return->xkey.keycode == keymap.player1.down) - setAnalogue(ANALOGUE_3, - event_return->type == KeyPress ? pow(2, 10) - 1 : 0); + setAnalogue(ANALOGUE_3, event_return->type == KeyPress ? pow(2, 10) - 1 : 0); + else if (event_return->xkey.keycode == keymap.player1.left) - setAnalogue(ANALOGUE_1, event_return->type == KeyPress - ? pow(2, 10) * 0.2 - : pow(2, 10) * 0.5); + setAnalogue(ANALOGUE_1, event_return->type == KeyPress ? pow(2, 10) * 0.2 : pow(2, 10) * 0.5); + else if (event_return->xkey.keycode == keymap.player1.right) - setAnalogue(ANALOGUE_1, event_return->type == KeyPress - ? pow(2, 10) * 0.8 - : pow(2, 10) * 0.5); + setAnalogue(ANALOGUE_1, event_return->type == KeyPress ? pow(2, 10) * 0.8 : pow(2, 10) * 0.5); + else if (event_return->xkey.keycode == keymap.player1.start) setSwitch(PLAYER_1, BUTTON_START, event_return->type == KeyPress); + else if (event_return->xkey.keycode == keymap.player1.button1) setSwitch(PLAYER_1, BUTTON_1, event_return->type == KeyPress); + else if (event_return->xkey.keycode == keymap.player1.button2) setSwitch(PLAYER_1, BUTTON_2, event_return->type == KeyPress); + else if (event_return->xkey.keycode == keymap.player1.button3) setSwitch(PLAYER_1, BUTTON_3, event_return->type == KeyPress); + else if (event_return->xkey.keycode == keymap.player1.button4) setSwitch(PLAYER_1, BUTTON_4, event_return->type == KeyPress); - else if (event_return->xkey.keycode == keymap.player1.up) - setSwitch(PLAYER_1, BUTTON_UP, event_return->type == KeyPress); - else if (event_return->xkey.keycode == keymap.player1.down) - setSwitch(PLAYER_1, BUTTON_DOWN, event_return->type == KeyPress); - else if (event_return->xkey.keycode == keymap.player1.left) - setSwitch(PLAYER_1, BUTTON_LEFT, event_return->type == KeyPress); - else if (event_return->xkey.keycode == keymap.player1.right) - setSwitch(PLAYER_1, BUTTON_RIGHT, event_return->type == KeyPress); } + break; + + default: + break; + } + return returnValue; } /** * Button mapping used for shooting games */ -int XNextEventShooting(Display *display, XEvent *event_return, int returnValue) +int XNextEventShooting(Display *display, XEvent *event_return, int returnValue) { KeyMapping keymap = getConfig()->keymap; - if (event_return->type == KeyPress || event_return->type == KeyRelease) + switch (event_return->type) + { + case KeyPress: + case KeyRelease: { if (event_return->xkey.keycode == keymap.test) setSwitch(SYSTEM, BUTTON_TEST, event_return->type == KeyPress); + else if (event_return->xkey.keycode == keymap.player1.service) setSwitch(PLAYER_1, BUTTON_SERVICE, event_return->type == KeyPress); + else if (event_return->xkey.keycode == keymap.player1.coin) incrementCoin(PLAYER_1, event_return->type == KeyPress); - else if (event_return->xkey.keycode == keymap.player2.coin) - incrementCoin(PLAYER_2, event_return->type == KeyPress); + else if (event_return->xkey.keycode == keymap.player1.start) setSwitch(PLAYER_1, BUTTON_START, event_return->type == KeyPress); + else if (event_return->xkey.keycode == keymap.player1.button1) setSwitch(PLAYER_1, BUTTON_1, event_return->type == KeyPress); + else if (event_return->xkey.keycode == keymap.player1.button2) setSwitch(PLAYER_1, BUTTON_2, event_return->type == KeyPress); + else if (event_return->xkey.keycode == keymap.player1.button3) setSwitch(PLAYER_1, BUTTON_3, event_return->type == KeyPress); + else if (event_return->xkey.keycode == keymap.player1.button4) setSwitch(PLAYER_1, BUTTON_4, event_return->type == KeyPress); + else if (event_return->xkey.keycode == keymap.player1.up) setSwitch(PLAYER_1, BUTTON_UP, event_return->type == KeyPress); + else if (event_return->xkey.keycode == keymap.player1.down) setSwitch(PLAYER_1, BUTTON_DOWN, event_return->type == KeyPress); + else if (event_return->xkey.keycode == keymap.player1.left) setSwitch(PLAYER_1, BUTTON_LEFT, event_return->type == KeyPress); + else if (event_return->xkey.keycode == keymap.player1.right) setSwitch(PLAYER_1, BUTTON_RIGHT, event_return->type == KeyPress); - } - else if (event_return->type == MotionNotify) + } + break; + + case MotionNotify: { - setAnalogue(ANALOGUE_1, - ((double)event_return->xmotion.x / (double)getConfig()->width) * - pow(2, 10)); - setAnalogue(ANALOGUE_2, ((double)event_return->xmotion.y / - (double)getConfig()->height) * - pow(2, 10)); - } - else if (event_return->type == ButtonPress || event_return->type == ButtonRelease) + setAnalogue(ANALOGUE_1, ((double)event_return->xmotion.x / (double)getConfig()->width) * pow(2, 10)); + setAnalogue(ANALOGUE_2, ((double)event_return->xmotion.y / (double)getConfig()->height) * pow(2, 10)); + } + break; + + case ButtonPress: + case ButtonRelease: { - // Trigger - if (event_return->xbutton.button == 1) + if (event_return->xbutton.button == 1) // Trigger setSwitch(PLAYER_1, BUTTON_1, event_return->type == ButtonPress); - // Reload - else if (event_return->xbutton.button == 3) + + else if (event_return->xbutton.button == 3) // Reload setSwitch(PLAYER_1, BUTTON_2, event_return->type == ButtonPress); - // Gun button - else if (event_return->xbutton.button == 2) + + else if (event_return->xbutton.button == 2) // Extra Gun Button setSwitch(PLAYER_1, BUTTON_3, event_return->type == ButtonPress); } + break; + + default: + break; + } + return returnValue; }