int sdl_input_update()

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;
}