Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. #include "input.h"
  2. #include <SDL.h>
  3.  
  4. Button btnUp = {0}, btnDown = {0}, btnLeft = {0}, btnRight = {0};
  5. Button btnFaceUp = {0}, btnFaceDown = {0}, btnFaceLeft = {0}, btnFaceRight = {0};
  6. Button btnL = {0}, btnR = {0};
  7. Button btnStart = {0}, btnSelect = {0};
  8. Button btnAccept = {0}, btnDecline = {0};
  9. int axisX = 0, axisY = 0;
  10.  
  11. int bUp = 0, bDown = 0, bLeft = 0, bRight = 0;
  12. int bFaceUp = 0, bFaceDown = 0, bFaceLeft = 0, bFaceRight = 0;
  13. int bR = 0, bL = 0;
  14. int bStart = 0, bSelect = 0;
  15. int bAccept = 0, bDecline = 0;
  16. int jUp = 0, jDown = 0, jLeft = 0, jRight = 0;
  17. int jFaceUp = 0, jFaceDown = 0, jFaceLeft = 0, jFaceRight = 0;
  18. int jR = 0, jL = 0;
  19. int jStart = 0, jSelect = 0;
  20. int jAccept = 0, jDecline = 0;
  21.  
  22. SDL_Joystick *joy1 = NULL;
  23.  
  24. int useJoystick = 1;
  25.  
  26. void Input_InitJoystick()
  27. {
  28.         int n = SDL_NumJoysticks();
  29.         if (n) {
  30.                 joy1 = SDL_JoystickOpen(0);
  31.                 SDL_JoystickEventState(SDL_ENABLE);
  32.                 printf("Using %s\n", SDL_JoystickName(0));
  33.         } else {
  34.                 joy1 = NULL;
  35.         }
  36. }
  37.  
  38. void Input_CloseJoystick()
  39. {
  40.         if(joy1)
  41.                 SDL_JoystickClose(joy1);
  42.         joy1 = NULL;
  43. }
  44.  
  45. void Input_KeyEvent(SDL_Event* evt)
  46. {
  47.     int w = (evt->type==SDL_KEYDOWN)?1:0;
  48.     switch(evt->key.keysym.sym)
  49.     {
  50.         case SDLK_UP:       bUp = w; break;
  51.         case SDLK_DOWN:     bDown = w; break;
  52.         case SDLK_LEFT:     bLeft = w; break;
  53.         case SDLK_RIGHT:    bRight = w; break;
  54. #if defined(PANDORA) || defined(PYRA)
  55.         case SDLK_PAGEUP:   bFaceUp = w; break;
  56.         case SDLK_PAGEDOWN: bFaceDown = w; break;
  57.         case SDLK_END:      bFaceLeft = w; break;   // reversing, so (B) is sword
  58.         case SDLK_HOME:     bFaceRight = w; break;
  59.         case SDLK_RCTRL:    bR = w; break;
  60.         case SDLK_RSHIFT:   bL = w; break;
  61.         case SDLK_LCTRL:    bSelect = w; break;
  62.         case SDLK_LALT:     bStart = w; break;
  63. #elif defined(CHIP)
  64.         case SDLK_MINUS:        bFaceUp = w; break;
  65.         case SDLK_o:            bFaceDown = w; break;
  66.         case SDLK_0:            bFaceLeft = w; break;
  67.         case SDLK_EQUALS:       bFaceRight = w; break;
  68.         case SDLK_1:            bR = w; break;
  69.         case SDLK_2:            bL = w; break;
  70.         case SDLK_SPACE:        bSelect = w; break;
  71.         case SDLK_RETURN:       bStart = w; break;
  72. #elif defined(BITTBOY)
  73.         case SDLK_MINUS:        bFaceUp = w; break;
  74.         case SDLK_LCTRL:        bFaceDown = w; break;   // A - jump
  75.         case SDLK_SPACE:        bFaceLeft = w; break;   // B - slash
  76.         case SDLK_LALT:         bFaceRight = w; break;  // TA - secondary
  77.         case SDLK_LSHIFT:       bR = w; break;                  // TB - switch
  78.         case SDLK_ESCAPE:       bSelect = w; break;             // select - menu
  79.         case SDLK_RETURN:       bStart = w; break;              // start - inventory
  80.         case SDLK_RCTRL:        bSelect = w; break;             // reset - menu
  81. #elif defined(GAMESHELL)
  82.         case SDLK_i:        bFaceUp = w; break;
  83.         case SDLK_k:        bFaceDown = w; break; //jump
  84.         case SDLK_j:        bFaceLeft = w; break; //slash
  85.         case SDLK_u:        bFaceRight = w; break; //secondary weapon
  86.         case SDLK_SPACE:        bR = w; break; //switch weapon
  87.         // case SDLK_w:        bL = w; break; //switch weapon
  88.         // case SDLK_SPACE:    bSelect = w; break;
  89.         case SDLK_ESCAPE:   bSelect = w; break;
  90.         case SDLK_RETURN:   bStart = w; break;
  91. #else
  92.         case SDLK_e:        bFaceUp = w; break;
  93.         case SDLK_x:        bFaceDown = w; break;
  94.         case SDLK_s:        bFaceLeft = w; break;
  95.         case SDLK_d:        bFaceRight = w; break;
  96.         case SDLK_r:        bR = w; break;
  97.         case SDLK_w:        bL = w; break;
  98.                 case SDLK_SPACE:    bSelect = w; break;
  99.                 case SDLK_ESCAPE:   bSelect = w; break;
  100.         case SDLK_RETURN:   bStart = w; break;
  101. #endif
  102.     }
  103. }
  104.  
  105. void Input_JoyAxisEvent(SDL_Event* evt) {
  106.         if(evt->jaxis.which!=0)
  107.                 return;
  108.         #define DEADZONE 32
  109.         if(evt->jaxis.axis==0) {
  110.                 int v = (evt->jaxis.value)/256;
  111.                 if(v>-DEADZONE & v<DEADZONE) axisX = 0;
  112.                 else if(v<0) axisX = -1;
  113.                 else axisX = +1;
  114.         }
  115.         if(evt->jaxis.axis==1) {
  116.                 int v = (evt->jaxis.value)/256;
  117.                 if(v>-DEADZONE & v<DEADZONE) axisY = 0;
  118.                 else if(v<0) axisY = -1;
  119.                 else axisY = +1;
  120.         }
  121. }
  122.  
  123. void Input_JoyEvent(SDL_Event* evt) {
  124.         if(evt->jbutton.which!=0)
  125.                 return;
  126.         int w = (evt->type==SDL_JOYBUTTONDOWN)?1:0;
  127. /* XBox 360 based mapping here,
  128.         (would be better to switch to SDL2.0)
  129.         btn             SDL1.2  SDL2.0
  130.         ---------------------------
  131.         A                       0               10
  132.         B                       1               11
  133.         X                       2               12
  134.         Y                       3               13
  135.         Home            N/A     14
  136.         LB                      4               8
  137.         RB                      5               9
  138.         LT                      N/A             N/A (axis)
  139.         RT                      N/A             N/A (axis)
  140.         Select          6               5
  141.         Start           7               4
  142.         L3                      9               6
  143.         R3                      10              7
  144.         DPad Up         N/A             0
  145.         DPad Down       N/A             1
  146.         DPad Left       N/A             2
  147.         DPad Right      N/A             3
  148. */
  149.         switch(evt->jbutton.button)
  150.         {
  151.                 case 0: jFaceDown = w; break;
  152.                 case 1: jFaceLeft = w; break;
  153.                 case 2: jFaceRight = w; break;
  154.                 case 3: jFaceUp = w; break;
  155.                 case 4: jL = w; break;
  156.                 case 5: jR = w; break;
  157.                 case 6: jSelect = w; break;
  158.                 case 7: jStart = w; break;
  159.                 /*case 12:jUp = w; break;
  160.                 case 13:jDown = w; break;
  161.                 case 14:jLeft = w; break;
  162.                 case 15:jRight = w; break;*/
  163.         }
  164. }
  165.  
  166. void Input_JoyHatEvent(SDL_Event* evt) {
  167.         if(evt->jhat.which!=0)
  168.                 return;
  169.         if(evt->jhat.hat!=0)
  170.                 return;
  171.         int v=evt->jhat.value;
  172.         jUp = v&SDL_HAT_UP;
  173.         jDown = v&SDL_HAT_DOWN;
  174.         jLeft = v&SDL_HAT_LEFT;
  175.         jRight = v&SDL_HAT_RIGHT;
  176. }
  177.  
  178. void updateKey(Button* btn, int state)
  179. {
  180.         if (state) {
  181.                 if (btn->held == 1) {
  182.                         btn->pressed = 0;
  183.                 }else{
  184.                         btn->pressed = 1;
  185.                 }
  186.                 btn->held = 1;
  187.                 btn->released = 0;
  188.         }else{
  189.                 if (btn->held == 1) {
  190.                         btn->released = 1;
  191.                 }else{
  192.                         btn->released = 0;
  193.                 }
  194.                 btn->held = 0;
  195.                 btn->pressed = 0;
  196.         }
  197. }
  198.  
  199. void PHL_ScanInput()
  200. {
  201.         updateKey(&btnUp, bUp|jUp|(axisY<0));
  202.         updateKey(&btnDown, bDown|jDown|(axisY>0));
  203.         updateKey(&btnLeft, bLeft|jLeft|(axisX<0));
  204.         updateKey(&btnRight, bRight|jRight|(axisX>0));
  205.        
  206.         updateKey(&btnStart, bStart|jStart);
  207.         updateKey(&btnSelect, bSelect|jSelect);
  208.        
  209.         updateKey(&btnL, bL|jL);
  210.         updateKey(&btnR, bR|jR);
  211.        
  212.         updateKey(&btnFaceLeft, bFaceLeft|jFaceLeft);
  213.         updateKey(&btnFaceDown, bFaceDown|jFaceDown);
  214.         updateKey(&btnFaceRight, bFaceRight|jFaceRight);
  215.        
  216.         updateKey(&btnAccept, bFaceLeft|jFaceLeft);
  217.         updateKey(&btnDecline, bFaceDown|jFaceDown);
  218. }
  219.