- /* 
-  * src/sysevt.c 
-  * 
-  * Copyright (C) 1998-2002 BigOrno (bigorno@bigorno.net). All rights reserved. 
-  * 
-  * The use and distribution terms for this software are contained in the file 
-  * named README, which can be found in the root of this distribution. By 
-  * using this software in any fashion, you are agreeing to be bound by the 
-  * terms of this license. 
-  * 
-  * You must not remove this notice, or any other, from this software. 
-  */ 
-   
- #include <SDL2/SDL.h> 
- #include <string.h> 
- #include <ctype.h> 
-   
- #include "system.h" 
- #include "game.h" 
-   
- #include "control.h" 
- #include "draw.h" 
-   
- #define SYSJOY_RANGE 3280 
-   
- static char character_ringbuffer[16] = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"; 
- static int character_ringbuffer_index = 0; 
- extern U8 want_infinitelives; 
- extern U8 want_infiniteammo; 
-   
- static SDL_Event event; 
- extern U8 want_filter; 
- extern U8 want_fullscreen; 
- extern U8 enable_endkey; 
- extern U8 recreate_screen; 
-   
-   
- static U8 has_accumulated (const char *str) 
- { 
-    for (int i = 0; i < len; i++) 
-       if (character_ringbuffer[(sizeof (character_ringbuffer) + character_ringbuffer_index - len + i) % 16] != str[i]) 
-          return 0; 
-    return 1; 
- } 
-   
-   
- /* 
-  * Process an event 
-  */ 
- static void processEvent (void) 
- { 
-    static U8 alt_pressed = FALSE; 
-   
-    U16 key = event.key.keysym.scancode; 
-   
-    switch (event.type) 
-    { 
-    case SDL_KEYDOWN: 
-       if (key == SDL_SCANCODE_LALT) 
-          alt_pressed = TRUE; 
-       else if (alt_pressed && key == SDL_SCANCODE_RETURN) 
-       { 
-          want_fullscreen ^= TRUE; 
-          recreate_screen = TRUE; 
-       } 
-       else if (alt_pressed && key == SDL_SCANCODE_F4) 
-       { 
-          control_status |= CONTROL_EXIT; 
-          control_last = CONTROL_EXIT; 
-       } 
-       else if ((key == SDL_SCANCODE_O || key == SDL_SCANCODE_UP) && !has_accumulated ("MAT") && !has_accumulated ("MATOSGRAT") && !has_accumulated (";QT") && !has_accumulated (";QTOSGRQT")) 
-       { 
-          control_status |= CONTROL_UP; 
-          control_last = CONTROL_UP; 
-       } 
-       else if (key == SDL_SCANCODE_K || key == SDL_SCANCODE_DOWN) 
-       { 
-          control_status |= CONTROL_DOWN; 
-          control_last = CONTROL_DOWN; 
-       } 
-       else if (key == SDL_SCANCODE_Z || key == SDL_SCANCODE_LEFT) 
-       { 
-          control_status |= CONTROL_LEFT; 
-          control_last = CONTROL_LEFT; 
-       } 
-       else if (key == SDL_SCANCODE_X || key == SDL_SCANCODE_RIGHT) 
-       { 
-          control_status |= CONTROL_RIGHT; 
-          control_last = CONTROL_RIGHT; 
-       } 
-       else if (((key == SDL_SCANCODE_PAUSE) || (key == SDL_SCANCODE_P)) && !has_accumulated ("MEME") && !has_accumulated (";E;E")) 
-       { 
-          control_status |= CONTROL_PAUSE; 
-          control_last = CONTROL_PAUSE; 
-       } 
-       else if ((key == SDL_SCANCODE_END) && enable_endkey) 
-       { 
-          control_status |= CONTROL_END; 
-          control_last = CONTROL_END; 
-       } 
-       else if (key == SDL_SCANCODE_ESCAPE) 
-       { 
-          control_status |= CONTROL_EXIT; 
-          control_last = CONTROL_EXIT; 
-       } 
-       else if (key == SDL_SCANCODE_SPACE) 
-       { 
-          control_status |= CONTROL_FIRE; 
-          control_last = CONTROL_FIRE; 
-       } 
-       else if (key == SDL_SCANCODE_F4) 
-          syssnd_toggleMute(); 
-       else if (key == SDL_SCANCODE_F5) 
-          syssnd_vol(-1); 
-       else if (key == SDL_SCANCODE_F6) 
-          syssnd_vol(+1); 
-       else if (key == SDL_SCANCODE_F7) 
-          want_filter ^= TRUE; 
-       else if (key == SDL_SCANCODE_F10) 
-       { 
-          control_status &= ~CONTROL_EXIT; 
-          control_last = CONTROL_EXIT; 
-       } 
-       break; 
-    case SDL_KEYUP: 
-       if (key == SDL_SCANCODE_LALT) 
-          alt_pressed = FALSE; 
-       else if (key == SDL_SCANCODE_O || key == SDL_SCANCODE_UP) 
-       { 
-          control_status &= ~CONTROL_UP; 
-          control_last = CONTROL_UP; 
-       } 
-       else if (key == SDL_SCANCODE_K || key == SDL_SCANCODE_DOWN) 
-       { 
-          control_status &= ~CONTROL_DOWN; 
-          control_last = CONTROL_DOWN; 
-       } 
-       else if (key == SDL_SCANCODE_Z || key == SDL_SCANCODE_LEFT) 
-       { 
-          control_status &= ~CONTROL_LEFT; 
-          control_last = CONTROL_LEFT; 
-       } 
-       else if (key == SDL_SCANCODE_X || key == SDL_SCANCODE_RIGHT) 
-       { 
-          control_status &= ~CONTROL_RIGHT; 
-          control_last = CONTROL_RIGHT; 
-       } 
-       else if ((key == SDL_SCANCODE_PAUSE) || (key == SDL_SCANCODE_P)) 
-       { 
-          control_status &= ~CONTROL_PAUSE; 
-          control_last = CONTROL_PAUSE; 
-       } 
-       else if ((key == SDL_SCANCODE_END) && enable_endkey) 
-       { 
-          control_status &= ~CONTROL_END; 
-          control_last = CONTROL_END; 
-       } 
-       else if (key == SDL_SCANCODE_ESCAPE) 
-       { 
-          control_status &= ~CONTROL_EXIT; 
-          control_last = CONTROL_EXIT; 
-       } 
-       else if (key == SDL_SCANCODE_SPACE) 
-       { 
-          control_status &= ~CONTROL_FIRE; 
-          control_last = CONTROL_FIRE; 
-       } 
-       // cheat codes: 
-       // 'MEMEPASMAL' -> infinite lives 
-       // 'MATOSGRATOS' -> infinite ammo 
-       { 
-          const char *keyname = SDL_GetScancodeName (key); 
-          character_ringbuffer [- character_ringbuffer_index ] = toupper (- keyname [0]);
-          character_ringbuffer_index = (character_ringbuffer_index + 1) % 16; 
-          if (has_accumulated ("MEMEPASMAL") || has_accumulated (";E;EPQS;QL")) 
-          { 
-             want_infinitelives = TRUE; 
-             game_lives = 6; 
-             syssnd_play (WAV_DIE, 1); 
-          } 
-          else if (has_accumulated ("MATOSGRATOS") || has_accumulated (";QTOSGRQTOS")) 
-          { 
-             want_infiniteammo = TRUE; 
-             game_bullets = 6; 
-             game_bombs = 6; 
-             syssnd_play (WAV_DIE, 1); 
-          } 
-       } 
-       break; 
-    case SDL_QUIT: 
-       /* player tries to close the window -- this is the same as pressing ESC */ 
-       control_status |= CONTROL_EXIT; 
-       control_last = CONTROL_EXIT; 
-       break; 
-    case SDL_JOYAXISMOTION: 
-       if (event.jaxis.axis == 0) 
-       { 
-          /* left-right */ 
-          if (event.jaxis.value < -SYSJOY_RANGE) 
-          {   /* left */ 
-             control_status |= CONTROL_LEFT; 
-             control_status &= ~CONTROL_RIGHT; 
-          } 
-          else if (event.jaxis.value > SYSJOY_RANGE) 
-          {   /* right */ 
-             control_status |= CONTROL_RIGHT; 
-             control_status &= ~CONTROL_LEFT; 
-          } 
-          else 
-          {   /* center */ 
-             control_status &= ~CONTROL_RIGHT; 
-             control_status &= ~CONTROL_LEFT; 
-          } 
-       } 
-       if (event.jaxis.axis == 1) 
-       { 
-          /* up-down */ 
-          if (event.jaxis.value < -SYSJOY_RANGE) 
-          {   /* up */ 
-             control_status |= CONTROL_UP; 
-             control_status &= ~CONTROL_DOWN; 
-          } 
-          else if (event.jaxis.value > SYSJOY_RANGE) 
-          {   /* down */ 
-             control_status |= CONTROL_DOWN; 
-             control_status &= ~CONTROL_UP; 
-          } 
-          else 
-          {   /* center */ 
-             control_status &= ~CONTROL_DOWN; 
-             control_status &= ~CONTROL_UP; 
-          } 
-       } 
-       break; 
-    case SDL_JOYBUTTONDOWN: 
-       control_status |= CONTROL_FIRE; 
-       break; 
-    case SDL_JOYBUTTONUP: 
-       control_status &= ~CONTROL_FIRE; 
-       break; 
-    default: 
-       break; 
-    } 
- } 
-   
-   
- /* 
-  * Process events, if any, then return 
-  */ 
- void sysevt_poll (void) 
- { 
-    while (SDL_PollEvent (&event)) 
-       processEvent (); 
- } 
-   
-   
- /* 
-  * Wait for an event, then process it and return 
-  */ 
- void sysevt_wait (void) 
- { 
-    SDL_WaitEvent (&event); 
-    processEvent (); 
- } 
-