in cores/genesis/gcw0/main.c [1869:2331]
int sdl_input_update(void)
{
uint8 *keystate = SDL_GetKeyState(NULL);
/* reset input */
input.pad[joynum] = 0;
if(show_lightgun)
input.pad[4] = 0; //player2:
switch (input.dev[4])
{
case DEVICE_LIGHTGUN:
show_lightgun = 1;
/* get mouse coordinates (absolute values) */
int x,y;
int state = SDL_GetMouseState(&x,&y);
if (config.gcw0_fullscreen)
{
input.analog[4][0] = x;
input.analog[4][1] = y;
} else
{
input.analog[4][0] = x - (VIDEO_WIDTH-bitmap.viewport.w)/2;
input.analog[4][1] = y - (VIDEO_HEIGHT-bitmap.viewport.h)/2;
}
if (config.smsmaskleftbar) x += 8;
/* TRIGGER, B, C (Menacer only), START (Menacer & Justifier only) */
if(keystate[SDLK_ESCAPE]) input.pad[4] |= INPUT_START;
default:
break;
}
switch (input.dev[joynum])
{
case DEVICE_LIGHTGUN:
{
#ifdef GCWZERO
show_lightgun = 2;
/* get mouse coordinates (absolute values) */
int x,y;
int state = SDL_GetMouseState(&x,&y);
if (config.gcw0_fullscreen)
{
input.analog[0][0] = x;
input.analog[0][1] = y;
} else
{
input.analog[0][0] = x - (VIDEO_WIDTH-bitmap.viewport.w)/2;
input.analog[0][1] = y - (VIDEO_HEIGHT-bitmap.viewport.h)/2;
}
if (config.smsmaskleftbar) x += 8;
/* TRIGGER, B, C (Menacer only), START (Menacer & Justifier only) */
if(state & SDL_BUTTON_LMASK) input.pad[joynum] |= INPUT_A;
if(state & SDL_BUTTON_RMASK) input.pad[joynum] |= INPUT_B;
if(state & SDL_BUTTON_MMASK) input.pad[joynum] |= INPUT_C;
if(keystate[SDLK_ESCAPE]) input.pad[0] |= INPUT_START;
#else
/* get mouse coordinates (absolute values) */
int x,y;
int state = SDL_GetMouseState(&x,&y);
/* X axis */
input.analog[joynum][0] = x - (VIDEO_WIDTH-bitmap.viewport.w)/2;
/* Y axis */
input.analog[joynum][1] = y - (VIDEO_HEIGHT-bitmap.viewport.h)/2;
/* TRIGGER, B, C (Menacer only), START (Menacer & Justifier only) */
if(state & SDL_BUTTON_LMASK) input.pad[joynum] |= INPUT_A;
if(state & SDL_BUTTON_RMASK) input.pad[joynum] |= INPUT_B;
if(state & SDL_BUTTON_MMASK) input.pad[joynum] |= INPUT_C;
if(keystate[SDLK_f]) input.pad[joynum] |= INPUT_START;
break;
#endif
}
#ifndef GCWZERO
case DEVICE_PADDLE:
{
/* get mouse (absolute values) */
int x;
int state = SDL_GetMouseState(&x, NULL);
/* Range is [0;256], 128 being middle position */
input.analog[joynum][0] = x * 256 /VIDEO_WIDTH;
/* Button I -> 0 0 0 0 0 0 0 I*/
if(state & SDL_BUTTON_LMASK) input.pad[joynum] |= INPUT_B;
break;
}
case DEVICE_SPORTSPAD:
{
/* get mouse (relative values) */
int x,y;
int state = SDL_GetRelativeMouseState(&x,&y);
/* Range is [0;256] */
input.analog[joynum][0] = (unsigned char)(-x & 0xFF);
input.analog[joynum][1] = (unsigned char)(-y & 0xFF);
/* Buttons I & II -> 0 0 0 0 0 0 II I*/
if(state & SDL_BUTTON_LMASK) input.pad[joynum] |= INPUT_B;
if(state & SDL_BUTTON_RMASK) input.pad[joynum] |= INPUT_C;
break;
}
case DEVICE_MOUSE:
{
SDL_ShowCursor(1);
/* get mouse (relative values) */
int x,y;
int state = SDL_GetRelativeMouseState(&x,&y);
/* Sega Mouse range is [-256;+256] */
input.analog[joynum][0] = x * 2;
input.analog[joynum][1] = y * 2;
/* Vertical movement is upsidedown */
if (!config.invert_mouse)
input.analog[joynum][1] = 0 - input.analog[joynum][1];
/* Start,Left,Right,Middle buttons -> 0 0 0 0 START MIDDLE RIGHT LEFT */
if(state & SDL_BUTTON_LMASK) input.pad[joynum] |= INPUT_B;
if(state & SDL_BUTTON_RMASK) input.pad[joynum] |= INPUT_C;
if(state & SDL_BUTTON_MMASK) input.pad[joynum] |= INPUT_A;
if(keystate[SDLK_f]) input.pad[joynum] |= INPUT_START;
break;
}
case DEVICE_XE_1AP:
{
/* A,B,C,D,Select,START,E1,E2 buttons -> E1(?) E2(?) START SELECT(?) A B C D */
if(keystate[SDLK_a]) input.pad[joynum] |= INPUT_START;
if(keystate[SDLK_s]) input.pad[joynum] |= INPUT_A;
if(keystate[SDLK_d]) input.pad[joynum] |= INPUT_C;
if(keystate[SDLK_f]) input.pad[joynum] |= INPUT_Y;
if(keystate[SDLK_z]) input.pad[joynum] |= INPUT_B;
if(keystate[SDLK_x]) input.pad[joynum] |= INPUT_X;
if(keystate[SDLK_c]) input.pad[joynum] |= INPUT_MODE;
if(keystate[SDLK_v]) input.pad[joynum] |= INPUT_Z;
/* Left Analog Stick (bidirectional) */
if(keystate[SDLK_UP]) input.analog[joynum][1]-=2;
else if(keystate[SDLK_DOWN]) input.analog[joynum][1]+=2;
else input.analog[joynum][1] = 128;
if(keystate[SDLK_LEFT]) input.analog[joynum][0]-=2;
else if(keystate[SDLK_RIGHT]) input.analog[joynum][0]+=2;
else input.analog[joynum][0] = 128;
/* Right Analog Stick (unidirectional) */
if(keystate[SDLK_KP8]) input.analog[joynum+1][0]-=2;
else if(keystate[SDLK_KP2]) input.analog[joynum+1][0]+=2;
else if(keystate[SDLK_KP4]) input.analog[joynum+1][0]-=2;
else if(keystate[SDLK_KP6]) input.analog[joynum+1][0]+=2;
else input.analog[joynum+1][0] = 128;
/* Limiters */
if (input.analog[joynum][0] > 0xFF) input.analog[joynum][0] = 0xFF;
else if (input.analog[joynum][0] < 0) input.analog[joynum][0] = 0;
if (input.analog[joynum][1] > 0xFF) input.analog[joynum][1] = 0xFF;
else if (input.analog[joynum][1] < 0) input.analog[joynum][1] = 0;
if (input.analog[joynum+1][0] > 0xFF) input.analog[joynum+1][0] = 0xFF;
else if (input.analog[joynum+1][0] < 0) input.analog[joynum+1][0] = 0;
if (input.analog[joynum+1][1] > 0xFF) input.analog[joynum+1][1] = 0xFF;
else if (input.analog[joynum+1][1] < 0) input.analog[joynum+1][1] = 0;
break;
}
case DEVICE_PICO:
{
/* get mouse (absolute values) */
int x,y;
int state = SDL_GetMouseState(&x,&y);
/* Calculate X Y axis values */
input.analog[0][0] = 0x3c + (x * (0x17c-0x03c+1)) / VIDEO_WIDTH;
input.analog[0][1] = 0x1fc + (y * (0x2f7-0x1fc+1)) / VIDEO_HEIGHT;
/* Map mouse buttons to player #1 inputs */
if(state & SDL_BUTTON_MMASK) pico_current = (pico_current + 1) & 7;
if(state & SDL_BUTTON_RMASK) input.pad[0] |= INPUT_PICO_RED;
if(state & SDL_BUTTON_LMASK) input.pad[0] |= INPUT_PICO_PEN;
break;
}
case DEVICE_TEREBI:
{
/* get mouse (absolute values) */
int x,y;
int state = SDL_GetMouseState(&x,&y);
/* Calculate X Y axis values */
input.analog[0][0] = (x * 250) / VIDEO_WIDTH;
input.analog[0][1] = (y * 250) / VIDEO_HEIGHT;
/* Map mouse buttons to player #1 inputs */
if(state & SDL_BUTTON_RMASK) input.pad[0] |= INPUT_B;
break;
}
case DEVICE_GRAPHIC_BOARD:
{
/* get mouse (absolute values) */
int x,y;
int state = SDL_GetMouseState(&x,&y);
/* Calculate X Y axis values */
input.analog[0][0] = (x * 255) / VIDEO_WIDTH;
input.analog[0][1] = (y * 255) / VIDEO_HEIGHT;
/* Map mouse buttons to player #1 inputs */
if(state & SDL_BUTTON_LMASK) input.pad[0] |= INPUT_GRAPHIC_PEN;
if(state & SDL_BUTTON_RMASK) input.pad[0] |= INPUT_GRAPHIC_MENU;
if(state & SDL_BUTTON_MMASK) input.pad[0] |= INPUT_GRAPHIC_DO;
break;
}
case DEVICE_ACTIVATOR:
{
if(keystate[SDLK_g]) input.pad[joynum] |= INPUT_ACTIVATOR_7L;
if(keystate[SDLK_h]) input.pad[joynum] |= INPUT_ACTIVATOR_7U;
if(keystate[SDLK_j]) input.pad[joynum] |= INPUT_ACTIVATOR_8L;
if(keystate[SDLK_k]) input.pad[joynum] |= INPUT_ACTIVATOR_8U;
}
#endif
default:
{
#ifdef GCWZERO
if(keystate[config.buttons[A]]) input.pad[joynum] |= INPUT_A;
if(keystate[config.buttons[B]]) input.pad[joynum] |= INPUT_B;
if(keystate[config.buttons[C]]) input.pad[joynum] |= INPUT_C;
if(keystate[config.buttons[START]]) input.pad[joynum] |= INPUT_START;
if (show_lightgun == 1)
{
if(keystate[config.buttons[X]]) input.pad[4] |= INPUT_A; //player 2
if(keystate[config.buttons[Y]]) input.pad[4] |= INPUT_B; //player 2
if(keystate[config.buttons[Z]]) input.pad[4] |= INPUT_C; //player 2
} else
if (show_lightgun == 2)
{
if(keystate[config.buttons[X]]) input.pad[4] |= INPUT_A; //player 2
if(keystate[config.buttons[Y]]) input.pad[4] |= INPUT_B; //player 2
if(keystate[config.buttons[Z]]) input.pad[4] |= INPUT_C; //player 2
} else
{
if(keystate[config.buttons[X]]) input.pad[joynum] |= INPUT_X;
if(keystate[config.buttons[Y]]) input.pad[joynum] |= INPUT_Y;
if(keystate[config.buttons[Z]]) input.pad[joynum] |= INPUT_Z;
}
if(keystate[config.buttons[MODE]]) input.pad[joynum] |= INPUT_MODE;
if (keystate[SDLK_ESCAPE] && keystate[SDLK_RETURN])
{
gotomenu=1;
}
if (keystate[SDLK_ESCAPE] && keystate[SDLK_TAB])
{
//save to quicksave slot
char save_state_file[256];
sprintf(save_state_file,"%s/%s.gp1", get_save_directory(), rom_filename);
FILE *f = fopen(save_state_file,"wb");
if (f)
{
uint8 buf[STATE_SIZE];
int len = state_save(buf);
fwrite(&buf, len, 1, f);
fclose(f);
}
//Save BMP screenshot
char save_state_screenshot[256];
sprintf(save_state_screenshot,"%s/%s.1.bmp", get_save_directory(), rom_filename);
SDL_Surface* screenshot;
if (!config.gcw0_fullscreen)
{
screenshot = SDL_CreateRGBSurface(SDL_HWSURFACE, sdl_video.srect.w, sdl_video.srect.h, 16, 0, 0, 0, 0);
SDL_Rect temp;
temp.x = 0;
temp.y = 0;
temp.w = sdl_video.srect.w;
temp.h = sdl_video.srect.h;
SDL_BlitSurface(sdl_video.surf_bitmap, &temp, screenshot, &temp);
SDL_SaveBMP(screenshot, save_state_screenshot);
SDL_FreeSurface(screenshot);
}
else
{
screenshot = SDL_CreateRGBSurface(SDL_HWSURFACE, gcw0_w, gcw0_h, 16, 0, 0, 0, 0);
SDL_Rect temp;
temp.x = 0;
temp.y = 0;
temp.w = gcw0_w;
temp.h = gcw0_h;
SDL_BlitSurface(sdl_video.surf_bitmap, &temp, screenshot, &temp);
SDL_SaveBMP(screenshot, save_state_screenshot);
SDL_FreeSurface(screenshot);
}
SDL_Delay(250);
}
if (keystate[SDLK_ESCAPE] && keystate[SDLK_BACKSPACE])
{
//load quicksave slot
char save_state_file[256];
sprintf(save_state_file,"%s/%s.gp1", get_save_directory(), rom_filename );
FILE *f = fopen(save_state_file,"rb");
if (f)
{
uint8 buf[STATE_SIZE];
fread(&buf, STATE_SIZE, 1, f);
state_load(buf);
fclose(f);
}
SDL_Delay(250);
}
#else
if(keystate[SDLK_a]) input.pad[joynum] |= INPUT_A;
if(keystate[SDLK_s]) input.pad[joynum] |= INPUT_B;
if(keystate[SDLK_d]) input.pad[joynum] |= INPUT_C;
if(keystate[SDLK_f]) input.pad[joynum] |= INPUT_START;
if(keystate[SDLK_z]) input.pad[joynum] |= INPUT_X;
if(keystate[SDLK_x]) input.pad[joynum] |= INPUT_Y;
if(keystate[SDLK_c]) input.pad[joynum] |= INPUT_Z;
if(keystate[SDLK_v]) input.pad[joynum] |= INPUT_MODE;
#endif
#ifdef GCWZERO //A-stick support
static int MoveLeft = 0;
static int MoveRight = 0;
static int MoveUp = 0;
static int MoveDown = 0;
Sint16 x_move = 0;
Sint16 y_move = 0;
static int lg_left = 0;
static int lg_right = 0;
static int lg_up = 0;
static int lg_down = 0;
SDL_Joystick* joy;
if(SDL_NumJoysticks() > 0)
{
joy = SDL_JoystickOpen(0);
x_move = SDL_JoystickGetAxis(joy, 0);
y_move = SDL_JoystickGetAxis(joy, 1);
}
// Control lightgun with A-stick if activated
if (show_lightgun)
{
lg_left = 0;
lg_right = 0;
lg_up = 0;
lg_down = 0;
if (x_move < -1000 || x_move > 1000)
{
if (x_move < -1000 ) lg_left = 1;
if (x_move < -20000) lg_left = 3;
if (x_move > 1000 ) lg_right = 1;
if (x_move > 20000) lg_right = 3;
current_time = time(NULL); //cursor disappears after 3 seconds...
}
if (y_move < -1000 || y_move > 1000)
{
if (y_move < -1000 ) lg_up = 1;
if (y_move < -20000) lg_up = 3;
if (y_move > 1000 ) lg_down = 1;
if (y_move > 20000) lg_down = 3;
current_time = time(NULL);
}
// Keep mouse within screen, wrap around!
int x,y;
int state = SDL_GetMouseState(&x,&y);
if (!config.gcw0_fullscreen)
{
if ((x - lg_left ) < sdl_video.drect.x ) x = VIDEO_WIDTH - sdl_video.drect.x;
if ((y - lg_up ) < sdl_video.drect.y ) y = VIDEO_HEIGHT - sdl_video.drect.y;
// if ((x + lg_right) > 288) x = 288;
// if ((y + lg_down ) > 216) y = 216;
// if ((x + lg_right) > 320) x = 320;
// if ((y + lg_down ) > 240) y = 240;
if ((x + lg_right) > VIDEO_WIDTH - sdl_video.drect.x) x = sdl_video.drect.x;
if ((y + lg_down ) > VIDEO_HEIGHT - sdl_video.drect.y) y = sdl_video.drect.y;
// sdl_video.drect.x = (VIDEO_WIDTH - sdl_video.drect.w) / 2;
// sdl_video.drect.y = (VIDEO_HEIGHT - sdl_video.drect.h) / 2;
} else //scaling on
{
if ((x - lg_left) < 0) x = gcw0_w;
if ((y - lg_up ) < 0) y = gcw0_h;
if ((x + lg_right) > gcw0_w) x = 0;
if ((y + lg_down ) > gcw0_h) y = 0;
}
SDL_WarpMouse( ( x+ ( ( lg_right - lg_left ) * config.lightgun_speed ) ) ,
( y+ ( ( lg_down - lg_up ) * config.lightgun_speed ) ) );
} else
// otherwise it's just mirroring the D-pad controls
if (config.a_stick)
{
MoveLeft = 0;
MoveRight = 0;
MoveUp = 0;
MoveDown = 0;
if (x_move < -1000 || x_move > 1000)
{
if (x_move < -1000) MoveLeft = 1;
if (x_move > 1000) MoveRight = 1;
}
if (y_move < -1000 || y_move > 1000)
{
if (y_move < -1000) MoveUp = 1;
if (y_move > 1000) MoveDown = 1;
}
}
if(show_lightgun == 1) //Genesis/MD D-pad controls player 2
{
if(MoveUp == 1) input.pad[4] |= INPUT_UP;
if(MoveDown == 1) input.pad[4] |= INPUT_DOWN;
if(MoveLeft == 1) input.pad[4] |= INPUT_LEFT;
if(MoveRight == 1) input.pad[4] |= INPUT_RIGHT;
if(keystate[SDLK_UP] == 1) input.pad[joynum] |= INPUT_UP;
if(keystate[SDLK_DOWN] == 1) input.pad[joynum] |= INPUT_DOWN;
if(keystate[SDLK_LEFT] == 1) input.pad[joynum] |= INPUT_LEFT;
if(keystate[SDLK_RIGHT]== 1) input.pad[joynum] |= INPUT_RIGHT;
} else
if(show_lightgun == 2) //SMS D-pad controls player 2
{
if(MoveUp == 1) input.pad[joynum] |= INPUT_UP;
if(MoveDown == 1) input.pad[joynum] |= INPUT_DOWN;
if(MoveLeft == 1) input.pad[joynum] |= INPUT_LEFT;
if(MoveRight == 1) input.pad[joynum] |= INPUT_RIGHT;
if(keystate[SDLK_UP] == 1) input.pad[4] |= INPUT_UP;
if(keystate[SDLK_DOWN] == 1) input.pad[4] |= INPUT_DOWN;
if(keystate[SDLK_LEFT] == 1) input.pad[4] |= INPUT_LEFT;
if(keystate[SDLK_RIGHT]== 1) input.pad[4] |= INPUT_RIGHT;
} else
{
if (keystate[SDLK_UP] || MoveUp == 1) input.pad[joynum] |= INPUT_UP;
else if(keystate[SDLK_DOWN] || MoveDown == 1) input.pad[joynum] |= INPUT_DOWN;
if (keystate[SDLK_LEFT] || MoveLeft == 1) input.pad[joynum] |= INPUT_LEFT;
else if(keystate[SDLK_RIGHT] || MoveRight == 1) input.pad[joynum] |= INPUT_RIGHT;
}
#else
if (keystate[SDLK_UP] ) input.pad[joynum] |= INPUT_UP;
else if(keystate[SDLK_DOWN] ) input.pad[joynum] |= INPUT_DOWN;
if (keystate[SDLK_LEFT] ) input.pad[joynum] |= INPUT_LEFT;
else if(keystate[SDLK_RIGHT]) input.pad[joynum] |= INPUT_RIGHT;
#endif
}
}
return 1;
}