Merge pull request #150 from retro-wertz/zapper
Add absolute zapper mode
This commit is contained in:
@@ -50,6 +50,8 @@ static bool use_par;
|
|||||||
int turbo_enabler;
|
int turbo_enabler;
|
||||||
int turbo_delay;
|
int turbo_delay;
|
||||||
static int regionoverride = -1;
|
static int regionoverride = -1;
|
||||||
|
static int t[2] = { 0, 0 };
|
||||||
|
static int zapper_mode = 0; /* 0=absolute 1=relative */
|
||||||
|
|
||||||
/* emulator-specific variables */
|
/* emulator-specific variables */
|
||||||
|
|
||||||
@@ -95,6 +97,7 @@ extern FCEUGI *GameInfo;
|
|||||||
extern uint8 *XBuf;
|
extern uint8 *XBuf;
|
||||||
extern CartInfo iNESCart;
|
extern CartInfo iNESCart;
|
||||||
extern CartInfo UNIFCart;
|
extern CartInfo UNIFCart;
|
||||||
|
extern int show_crosshair;
|
||||||
|
|
||||||
/* emulator-specific callback functions */
|
/* 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 */
|
if (port < 2) /* port #0 = player1/player3, port #1 = player2/player4 */
|
||||||
{
|
{
|
||||||
switch(device)
|
switch(device)
|
||||||
{
|
{
|
||||||
case RETRO_DEVICE_JOYPAD:
|
case RETRO_DEVICE_JOYPAD:
|
||||||
FCEUI_SetInput(port, SI_GAMEPAD, &JSReturn[0], 0);
|
t[port] = RETRO_DEVICE_JOYPAD;
|
||||||
break;
|
FCEUI_SetInput(port, SI_GAMEPAD, &JSReturn[0], 0);
|
||||||
case RETRO_DEVICE_MOUSE:
|
break;
|
||||||
FCEUI_SetInput(port, SI_ZAPPER, &MouseData[0], 1);
|
case RETRO_DEVICE_MOUSE:
|
||||||
break;
|
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_region", "Region Override; Auto|NTSC|PAL|Dendy" },
|
||||||
{ "fceumm_sndquality", "Sound Quality; Low|High|Very High" },
|
{ "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_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 },
|
{ NULL, NULL },
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct retro_controller_description pads[] = {
|
static const struct retro_controller_description pads[] = {
|
||||||
{ "NES Gamepad", RETRO_DEVICE_JOYPAD },
|
{ "Gamepad", RETRO_DEVICE_JOYPAD },
|
||||||
{ "Zapper", RETRO_DEVICE_MOUSE },
|
{ "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
|
#ifdef PSP
|
||||||
var.key = "fceumm_overscan";
|
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)
|
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;
|
right = 256;
|
||||||
bottom = 240;
|
bottom = 240;
|
||||||
offscreen = 0;
|
mzb = 0;
|
||||||
#ifdef PSP
|
|
||||||
adjx = adjy = use_overscan ? 8:0;
|
|
||||||
#else
|
|
||||||
adjx = overscan_h ? 8:0;
|
|
||||||
adjy = overscan_v ? 8:0;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (GameInfo->input[0] != SI_ZAPPER && GameInfo->input[1] != SI_ZAPPER)
|
if (zapper_mode) /* relative */
|
||||||
return;
|
{
|
||||||
|
/* 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 */
|
if (input_cb(port, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_LEFT))
|
||||||
mouse_x = input_cb(port, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_X);
|
mzb |= 0x1;
|
||||||
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_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;
|
if (input_cb(port, RETRO_DEVICE_POINTER, 0, RETRO_DEVICE_ID_POINTER_PRESSED))
|
||||||
mzy += mouse_y;
|
mzb |= 0x1;
|
||||||
|
}
|
||||||
/* 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;
|
|
||||||
|
|
||||||
zapdata[0] = mzx;
|
zapdata[0] = mzx;
|
||||||
zapdata[1] = mzy;
|
zapdata[1] = mzy;
|
||||||
zapdata[2] = input_cb(port, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_LEFT) ? 1 : 0
|
zapdata[2] = mzb;
|
||||||
| input_cb(port, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_RIGHT) ? 2 : 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -1154,7 +1183,8 @@ static void FCEUD_UpdateInput(void)
|
|||||||
|
|
||||||
JSReturn[0] = pad[0] | (pad[1] << 8) | (pad[2] << 16) | (pad[3] << 24);
|
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))
|
if (input_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_R2))
|
||||||
FCEU_VSUniCoin(); /* Insert Coin VS System */
|
FCEU_VSUniCoin(); /* Insert Coin VS System */
|
||||||
|
|||||||
@@ -36,6 +36,7 @@
|
|||||||
#include "vsuni.h"
|
#include "vsuni.h"
|
||||||
|
|
||||||
uint8 *XBuf = NULL;
|
uint8 *XBuf = NULL;
|
||||||
|
int show_crosshair = 0;
|
||||||
|
|
||||||
void FCEU_KillVirtualVideo(void)
|
void FCEU_KillVirtualVideo(void)
|
||||||
{
|
{
|
||||||
@@ -74,7 +75,8 @@ void FCEU_PutImage(void)
|
|||||||
FCEU_VSUniDraw(XBuf);
|
FCEU_VSUniDraw(XBuf);
|
||||||
}
|
}
|
||||||
if (howlong) howlong--;
|
if (howlong) howlong--;
|
||||||
FCEU_DrawInput(XBuf);
|
if (show_crosshair)
|
||||||
|
FCEU_DrawInput(XBuf);
|
||||||
}
|
}
|
||||||
|
|
||||||
void FCEU_PutImageDummy(void)
|
void FCEU_PutImageDummy(void)
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ int FCEU_InitVirtualVideo(void);
|
|||||||
void FCEU_KillVirtualVideo(void);
|
void FCEU_KillVirtualVideo(void);
|
||||||
int SaveSnapshot(void);
|
int SaveSnapshot(void);
|
||||||
extern uint8 *XBuf;
|
extern uint8 *XBuf;
|
||||||
|
extern int show_crosshair;
|
||||||
void FCEU_DrawNumberRow(uint8 *XBuf, int *nstatus, int cur);
|
void FCEU_DrawNumberRow(uint8 *XBuf, int *nstatus, int cur);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Reference in New Issue
Block a user