X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fjoystick.c;h=8f6a0d6a1e66230284b7bf098ac6bdf3b0aa0e77;hb=4bca9bc5f299a9b287134b06e41b147f506792b4;hp=5e1cc13275aa8cd5f5513de21e8eef561645593d;hpb=2357c391b4a587709627cc30316734b3c83c8134;p=rocksndiamonds.git diff --git a/src/joystick.c b/src/joystick.c index 5e1cc132..8f6a0d6a 100644 --- a/src/joystick.c +++ b/src/joystick.c @@ -18,6 +18,195 @@ #include "joystick.h" #include "misc.h" +#if !defined(PLATFORM_MSDOS) +static int JoystickPosition(int middle, int margin, int actual) +{ + long range, pos; + int percentage; + + if (margin < middle && actual > middle) + return 0; + if (margin > middle && actual < middle) + return 0; + + range = ABS(margin - middle); + pos = ABS(actual - middle); + percentage = (int)(pos * 100 / range); + + if (percentage > 100) + percentage = 100; + + return percentage; +} +#endif + +#if defined(TARGET_SDL) + +static SDL_Joystick *sdl_joystick[MAX_PLAYERS] = { NULL, NULL, NULL, NULL }; +static int sdl_js_axis[MAX_PLAYERS][2] = { {0, 0}, {0, 0}, {0, 0}, {0, 0} }; +static int sdl_js_button[MAX_PLAYERS][2] = { {0, 0}, {0, 0}, {0, 0}, {0, 0} }; + +SDL_Joystick *Get_SDL_Joystick(int nr) +{ + return sdl_joystick[nr]; +} + +boolean Open_SDL_Joystick(int nr) +{ + if (nr < 0 || nr > MAX_PLAYERS) + return FALSE; + + return ((sdl_joystick[nr] = SDL_JoystickOpen(nr)) == NULL ? FALSE : TRUE); +} + +void Close_SDL_Joystick(int nr) +{ + if (nr < 0 || nr > MAX_PLAYERS) + return; + + SDL_JoystickClose(sdl_joystick[nr]); +} + +boolean Check_SDL_JoystickOpened(int nr) +{ + if (nr < 0 || nr > MAX_PLAYERS) + return FALSE; + + return (SDL_JoystickOpened(nr) ? TRUE : FALSE); +} + +void HandleJoystickEvent(Event *event) +{ + switch(event->type) + { + case SDL_JOYAXISMOTION: + if (event->jaxis.axis < 2) + { + sdl_js_axis[event->jaxis.which][event->jaxis.axis]= event->jaxis.value; + +#if 0 + printf("js_%d %s-axis: %d\n", + event->jaxis.which, + (event->jaxis.axis == 0 ? "x" : "y"), + event->jaxis.value); +#endif + } + break; + + case SDL_JOYBUTTONDOWN: + if (event->jbutton.button < 2) + { + sdl_js_button[event->jbutton.which][event->jbutton.button] = TRUE; + +#if 0 + printf("js_%d button %d: pressed\n", + event->jbutton.which, + event->jbutton.button); +#endif + } + break; + + case SDL_JOYBUTTONUP: + if (event->jbutton.button < 2) + { + sdl_js_button[event->jbutton.which][event->jbutton.button] = FALSE; + +#if 0 + printf("js_%d button %d: released\n", + event->jbutton.which, + event->jbutton.button); +#endif + } + break; + + default: + break; + } +} + +int Get_SDL_Joystick_Axis(int nr, int axis) +{ + if (nr < 0 || nr > MAX_PLAYERS) + return 0; + + if (axis < 0 || axis > 1) + return 0; + + return sdl_js_axis[nr][axis]; +} + +void CheckJoystickData() +{ +} + +int Joystick(int player_nr) +{ + int joystick_nr = stored_player[player_nr].joystick_fd; + int js_x,js_y, js_b1,js_b2; + int left, right, up, down; + int result = 0; + + if (joystick_status == JOYSTICK_OFF) + return 0; + + if (game_status == SETUPINPUT) + return 0; + + if (!setup.input[player_nr].use_joystick || + !Check_SDL_JoystickOpened(joystick_nr)) + return 0; + + js_x = sdl_js_axis[joystick_nr][0]; + js_y = sdl_js_axis[joystick_nr][1]; + + js_b1 = sdl_js_button[joystick_nr][0]; + js_b2 = sdl_js_button[joystick_nr][1]; + + + +#if 0 + printf("JOYSTICK %d: js_x == %d, js_y == %d, js_b1 == %d, js_b2 == %d\n", + joystick_nr, js_x, js_y, js_b1, js_b2); +#endif + + + + left = JoystickPosition(setup.input[player_nr].joy.xmiddle, + setup.input[player_nr].joy.xleft, js_x); + right = JoystickPosition(setup.input[player_nr].joy.xmiddle, + setup.input[player_nr].joy.xright, js_x); + up = JoystickPosition(setup.input[player_nr].joy.ymiddle, + setup.input[player_nr].joy.yupper, js_y); + down = JoystickPosition(setup.input[player_nr].joy.ymiddle, + setup.input[player_nr].joy.ylower, js_y); + + if (left > JOYSTICK_PERCENT) + result |= JOY_LEFT; + else if (right > JOYSTICK_PERCENT) + result |= JOY_RIGHT; + if (up > JOYSTICK_PERCENT) + result |= JOY_UP; + else if (down > JOYSTICK_PERCENT) + result |= JOY_DOWN; + + if (js_b1) + result |= JOY_BUTTON_1; + if (js_b2) + result |= JOY_BUTTON_2; + + + +#if 0 + printf("result == 0x%08x\n", result); +#endif + + + + return result; +} + +#else /* !TARGET_SDL */ + void CheckJoystickData() { int i; @@ -42,26 +231,7 @@ void CheckJoystickData() } } -static int JoystickPosition(int middle, int margin, int actual) -{ - long range, pos; - int percentage; - - if (margin < middle && actual > middle) - return 0; - if (margin > middle && actual < middle) - return 0; - - range = ABS(margin - middle); - pos = ABS(actual - middle); - percentage = (int)(pos * 100 / range); - - if (percentage > 100) - percentage = 100; - - return percentage; -} - +#if defined(PLATFORM_UNIX) int Joystick(int player_nr) { #ifdef __FreeBSD__ @@ -83,10 +253,12 @@ int Joystick(int player_nr) if (joystick_status == JOYSTICK_OFF) return 0; - if (!setup.input[player_nr].use_joystick || joystick_fd < 0) + if (game_status == SETUPINPUT) + return 0; + + if (joystick_fd < 0 || !setup.input[player_nr].use_joystick) return 0; -#ifndef MSDOS if (read(joystick_fd, &joy_ctrl, sizeof(joy_ctrl)) != sizeof(joy_ctrl)) { Error(ERR_WARN, "cannot read joystick device '%s'", @@ -130,33 +302,91 @@ int Joystick(int player_nr) result |= JOY_BUTTON_2; return result; +} + +#else /* PLATFORM_MSDOS */ + +/* allegro global variables for joystick control */ +extern int num_joysticks; +extern JOYSTICK_INFO joy[]; + +int Joystick(int player_nr) +{ + int joystick_nr = stored_player[player_nr].joystick_fd; + int result = 0; + + if (joystick_status == JOYSTICK_OFF) + return 0; + + if (game_status == SETUPINPUT) + return 0; + + if (joystick_nr < 0) + return 0; + + /* the allegro global variable 'num_joysticks' contains the number + of joysticks found at initialization under MS-DOS / Windows */ + +#if 0 + if (joystick_nr >= num_joysticks || !setup.input[player_nr].use_joystick) + return 0; +#else + +#if 1 + if (joystick_nr >= num_joysticks || + (game_status == PLAYING && !setup.input[player_nr].use_joystick)) + return 0; #else - return 0; + if (joystick_nr >= num_joysticks) + return 0; +#endif + #endif + + poll_joystick(); + + if (joy[joystick_nr].stick[0].axis[0].d1) + result |= JOY_LEFT; + else if (joy[joystick_nr].stick[0].axis[0].d2) + result |= JOY_RIGHT; + if (joy[joystick_nr].stick[0].axis[1].d1) + result |= JOY_UP; + else if (joy[joystick_nr].stick[0].axis[1].d2) + result |= JOY_DOWN; + + if (joy[joystick_nr].button[0].b) + result |= JOY_BUTTON_1; + if (joy[joystick_nr].button[1].b) + result |= JOY_BUTTON_2; + + return result; } +#endif /* PLATFORM_MSDOS */ + +#endif /* !TARGET_SDL */ int JoystickButton(int player_nr) { - static int last_joy_button = 0; + static int last_joy_button[MAX_PLAYERS] = { 0, 0, 0, 0 }; int joy_button = (Joystick(player_nr) & JOY_BUTTON); int result; if (joy_button) { - if (last_joy_button) + if (last_joy_button[player_nr]) result = JOY_BUTTON_PRESSED; else result = JOY_BUTTON_NEW_PRESSED; } else { - if (last_joy_button) + if (last_joy_button[player_nr]) result = JOY_BUTTON_NEW_RELEASED; else result = JOY_BUTTON_NOT_PRESSED; } - last_joy_button = joy_button; + last_joy_button[player_nr] = joy_button; return result; } @@ -167,8 +397,12 @@ int AnyJoystick() for (i=0; i