Skip to content

Commit

Permalink
Fix up inputs MR!
Browse files Browse the repository at this point in the history
  • Loading branch information
bobbydilley committed Feb 24, 2024
1 parent b733693 commit 82341fc
Show file tree
Hide file tree
Showing 3 changed files with 105 additions and 87 deletions.
81 changes: 40 additions & 41 deletions src/lindbergh/config.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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()
Expand All @@ -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);
Expand Down
7 changes: 2 additions & 5 deletions src/lindbergh/config.h
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,6 @@
#define VIRTUA_TENNIS_3 0xc4b7e89
#define VIRTUA_TENNIS_3_TEST 0xffe3b0fd


typedef enum
{
YELLOW,
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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();
Expand Down
104 changes: 63 additions & 41 deletions src/lindbergh/input.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand Down

0 comments on commit 82341fc

Please sign in to comment.