diff --git a/src/drivers/libretro/libretro.c b/src/drivers/libretro/libretro.c index 29fbf75..bc79651 100644 --- a/src/drivers/libretro/libretro.c +++ b/src/drivers/libretro/libretro.c @@ -50,6 +50,8 @@ static bool use_par; int turbo_enabler; int turbo_delay; static int regionoverride = -1; +static int t[2] = { 0, 0 }; +static int zapper_mode = 0; /* 0=absolute 1=relative */ /* emulator-specific variables */ @@ -95,6 +97,7 @@ extern FCEUGI *GameInfo; extern uint8 *XBuf; extern CartInfo iNESCart; extern CartInfo UNIFCart; +extern int show_crosshair; /* emulator-specific callback functions */ @@ -535,14 +538,16 @@ void retro_set_controller_port_device(unsigned port, unsigned device) { if (port < 2) /* port #0 = player1/player3, port #1 = player2/player4 */ { - switch(device) - { - case RETRO_DEVICE_JOYPAD: - FCEUI_SetInput(port, SI_GAMEPAD, &JSReturn[0], 0); - break; - case RETRO_DEVICE_MOUSE: - FCEUI_SetInput(port, SI_ZAPPER, &MouseData[0], 1); - break; + switch(device) + { + case RETRO_DEVICE_JOYPAD: + t[port] = RETRO_DEVICE_JOYPAD; + FCEUI_SetInput(port, SI_GAMEPAD, &JSReturn[0], 0); + break; + case RETRO_DEVICE_MOUSE: + t[port] = RETRO_DEVICE_MOUSE; + FCEUI_SetInput(port, SI_ZAPPER, &MouseData[0], 1); + break; } } } @@ -566,11 +571,13 @@ void retro_set_environment(retro_environment_t cb) { "fceumm_region", "Region Override; Auto|NTSC|PAL|Dendy" }, { "fceumm_sndquality", "Sound Quality; Low|High|Very High" }, { "fceumm_sndvolume", "Sound Volume; 150|160|170|180|190|200|210|220|230|240|250|0|10|20|30|40|50|60|70|80|90|100|110|120|130|140" }, + { "fceumm_zapper_mode", "Zapper Mode; absolute|relative" }, + { "fceumm_show_crosshair", "Show Crosshair; enabled|disabled" }, { NULL, NULL }, }; static const struct retro_controller_description pads[] = { - { "NES Gamepad", RETRO_DEVICE_JOYPAD }, + { "Gamepad", RETRO_DEVICE_JOYPAD }, { "Zapper", RETRO_DEVICE_MOUSE }, }; @@ -895,6 +902,22 @@ static void check_variables(bool startup) } } + var.key = "fceumm_zapper_mode"; + + if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) + { + if (!strcmp(var.value, "relative")) zapper_mode = 1; + else if (!strcmp(var.value, "absolute")) zapper_mode = 0; + } + + var.key = "fceumm_show_crosshair"; + + if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) + { + if (!strcmp(var.value, "enabled")) show_crosshair = 1; + else if (!strcmp(var.value, "disabled")) show_crosshair = 0; + } + #ifdef PSP var.key = "fceumm_overscan"; @@ -1020,47 +1043,53 @@ static void check_variables(bool startup) } } -static int mouse_x, mouse_y, mzx, mzy; +static int mzx = 0, mzy = 0, mzb = 0; + void GetMouseData(uint32_t *zapdata) { - static int right, bottom, adjx, adjy, offscreen, port; + bool adjx = false, adjy = false; + int right, bottom, port; + +#ifdef PSP + adjx = adjy = use_overscan ? 1 : 0; +#else + adjx = overscan_h ? 1 : 0; + adjy = overscan_v ? 1 : 0; +#endif + port = (GameInfo->type == GIT_VSUNI) ? 0 : 1; right = 256; bottom = 240; - offscreen = 0; -#ifdef PSP - adjx = adjy = use_overscan ? 8:0; -#else - adjx = overscan_h ? 8:0; - adjy = overscan_v ? 8:0; -#endif + mzb = 0; - if (GameInfo->input[0] != SI_ZAPPER && GameInfo->input[1] != SI_ZAPPER) - return; + if (zapper_mode) /* relative */ + { + /* TODO: Add some sort of mouse sensitivity */ + mzx += input_cb(port, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_X); + mzy += input_cb(port, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_Y); - port = (GameInfo->type == GIT_VSUNI) ? 1 : 0; + /* Set crosshair within the limits of game's resolution */ + if (mzx > right - (adjx ? 8 : 0)) mzx = right - (adjx ? 8 : 0); + else if (mzx < 1 + (adjx ? 8 : 0)) mzx = 1 + (adjx ? 8 : 0); + if (mzy > bottom - (adjy ? 8 : 0)) mzy = bottom - (adjy ? 8 : 0); + else if (mzy < 1 + (adjy ? 8 : 0)) mzy = 1 + (adjy ? 8 : 0); - /* TODO: Add some sort of mouse sensitivity */ - mouse_x = input_cb(port, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_X); - mouse_y = input_cb(port, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_Y); + if (input_cb(port, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_LEFT)) + mzb |= 0x1; + if (input_cb(port, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_RIGHT)) + mzb |= 0x2; + } + else /* absolute */ + { + mzx = ((input_cb(port, RETRO_DEVICE_POINTER, 0, RETRO_DEVICE_ID_POINTER_X) + (0x7FFF + (adjx ? 0X8FF : 0))) * right) / (0XFFFE + (adjx ? 0X11FE : 0)); + mzy = ((input_cb(port, RETRO_DEVICE_POINTER, 0, RETRO_DEVICE_ID_POINTER_Y) + (0x7FFF + (adjy ? 0X999 : 0))) * bottom) / (0XFFFE + (adjy ? 0X1332 : 0)); - mzx += mouse_x; - mzy += mouse_y; - - /* Set crosshair within the limits of game's resolution */ - if (mzx > right - adjx + offscreen) - mzx = right - adjx + offscreen; - else if (mzx <= 1 + adjx) - mzx = 1 + adjx; - - if (mzy > bottom - adjy + offscreen) - mzy = bottom - adjy + offscreen; - else if (mzy <= 1 + adjy) - mzy = 1 + adjy; + if (input_cb(port, RETRO_DEVICE_POINTER, 0, RETRO_DEVICE_ID_POINTER_PRESSED)) + mzb |= 0x1; + } zapdata[0] = mzx; zapdata[1] = mzy; - zapdata[2] = input_cb(port, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_LEFT) ? 1 : 0 - | input_cb(port, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_RIGHT) ? 2 : 0; + zapdata[2] = mzb; } /* @@ -1154,7 +1183,8 @@ static void FCEUD_UpdateInput(void) JSReturn[0] = pad[0] | (pad[1] << 8) | (pad[2] << 16) | (pad[3] << 24); - GetMouseData(&MouseData[0]); + if (t[0] == RETRO_DEVICE_MOUSE || t[1] == RETRO_DEVICE_MOUSE) + GetMouseData(&MouseData[0]); if (input_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_R2)) FCEU_VSUniCoin(); /* Insert Coin VS System */ diff --git a/src/video.c b/src/video.c index 8de5a65..099ba80 100644 --- a/src/video.c +++ b/src/video.c @@ -36,6 +36,7 @@ #include "vsuni.h" uint8 *XBuf = NULL; +int show_crosshair = 0; void FCEU_KillVirtualVideo(void) { @@ -74,7 +75,8 @@ void FCEU_PutImage(void) FCEU_VSUniDraw(XBuf); } if (howlong) howlong--; - FCEU_DrawInput(XBuf); + if (show_crosshair) + FCEU_DrawInput(XBuf); } void FCEU_PutImageDummy(void) diff --git a/src/video.h b/src/video.h index 7b042bd..55a5189 100644 --- a/src/video.h +++ b/src/video.h @@ -5,6 +5,7 @@ int FCEU_InitVirtualVideo(void); void FCEU_KillVirtualVideo(void); int SaveSnapshot(void); extern uint8 *XBuf; +extern int show_crosshair; void FCEU_DrawNumberRow(uint8 *XBuf, int *nstatus, int cur); #endif