Rev 10 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
1 | pmbaty | 1 | /* |
2 | * src/sysevt.c |
||
3 | * |
||
4 | * Copyright (C) 1998-2002 BigOrno (bigorno@bigorno.net). All rights reserved. |
||
5 | * |
||
6 | * The use and distribution terms for this software are contained in the file |
||
7 | * named README, which can be found in the root of this distribution. By |
||
8 | * using this software in any fashion, you are agreeing to be bound by the |
||
9 | * terms of this license. |
||
10 | * |
||
11 | * You must not remove this notice, or any other, from this software. |
||
12 | */ |
||
13 | |||
11 | pmbaty | 14 | #include <SDL2/SDL.h> |
15 | #include <string.h> |
||
16 | #include <ctype.h> |
||
1 | pmbaty | 17 | |
18 | #include "system.h" |
||
19 | #include "game.h" |
||
20 | |||
21 | #include "control.h" |
||
22 | #include "draw.h" |
||
23 | |||
24 | #define SYSJOY_RANGE 3280 |
||
25 | |||
11 | pmbaty | 26 | static char character_ringbuffer[16] = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"; |
27 | static int character_ringbuffer_index = 0; |
||
28 | extern U8 want_infinitelives; |
||
29 | extern U8 want_infiniteammo; |
||
30 | |||
1 | pmbaty | 31 | static SDL_Event event; |
32 | extern U8 want_filter; |
||
33 | extern U8 want_fullscreen; |
||
10 | pmbaty | 34 | extern U8 enable_endkey; |
7 | pmbaty | 35 | extern U8 recreate_screen; |
1 | pmbaty | 36 | |
37 | |||
11 | pmbaty | 38 | static U8 has_accumulated (const char *str) |
39 | { |
||
40 | int len = (int) strlen (str); |
||
41 | for (int i = 0; i < len; i++) |
||
42 | if (character_ringbuffer[(sizeof (character_ringbuffer) + character_ringbuffer_index - len + i) % 16] != str[i]) |
||
43 | return 0; |
||
44 | return 1; |
||
45 | } |
||
46 | |||
47 | |||
1 | pmbaty | 48 | /* |
49 | * Process an event |
||
50 | */ |
||
51 | static void processEvent (void) |
||
52 | { |
||
53 | static U8 alt_pressed = FALSE; |
||
54 | |||
7 | pmbaty | 55 | U16 key = event.key.keysym.scancode; |
1 | pmbaty | 56 | |
57 | switch (event.type) |
||
58 | { |
||
59 | case SDL_KEYDOWN: |
||
7 | pmbaty | 60 | if (key == SDL_SCANCODE_LALT) |
1 | pmbaty | 61 | alt_pressed = TRUE; |
7 | pmbaty | 62 | else if (alt_pressed && key == SDL_SCANCODE_RETURN) |
1 | pmbaty | 63 | { |
64 | want_fullscreen ^= TRUE; |
||
7 | pmbaty | 65 | recreate_screen = TRUE; |
1 | pmbaty | 66 | } |
7 | pmbaty | 67 | else if (alt_pressed && key == SDL_SCANCODE_F4) |
1 | pmbaty | 68 | { |
69 | control_status |= CONTROL_EXIT; |
||
70 | control_last = CONTROL_EXIT; |
||
71 | } |
||
11 | pmbaty | 72 | else if ((key == SDL_SCANCODE_O || key == SDL_SCANCODE_UP) && !has_accumulated ("MAT") && !has_accumulated ("MATOSGRAT") && !has_accumulated (";QT") && !has_accumulated (";QTOSGRQT")) |
1 | pmbaty | 73 | { |
74 | control_status |= CONTROL_UP; |
||
75 | control_last = CONTROL_UP; |
||
76 | } |
||
7 | pmbaty | 77 | else if (key == SDL_SCANCODE_K || key == SDL_SCANCODE_DOWN) |
1 | pmbaty | 78 | { |
79 | control_status |= CONTROL_DOWN; |
||
80 | control_last = CONTROL_DOWN; |
||
81 | } |
||
7 | pmbaty | 82 | else if (key == SDL_SCANCODE_Z || key == SDL_SCANCODE_LEFT) |
1 | pmbaty | 83 | { |
84 | control_status |= CONTROL_LEFT; |
||
85 | control_last = CONTROL_LEFT; |
||
86 | } |
||
7 | pmbaty | 87 | else if (key == SDL_SCANCODE_X || key == SDL_SCANCODE_RIGHT) |
1 | pmbaty | 88 | { |
89 | control_status |= CONTROL_RIGHT; |
||
90 | control_last = CONTROL_RIGHT; |
||
91 | } |
||
11 | pmbaty | 92 | else if (((key == SDL_SCANCODE_PAUSE) || (key == SDL_SCANCODE_P)) && !has_accumulated ("MEME") && !has_accumulated (";E;E")) |
1 | pmbaty | 93 | { |
94 | control_status |= CONTROL_PAUSE; |
||
95 | control_last = CONTROL_PAUSE; |
||
96 | } |
||
10 | pmbaty | 97 | else if ((key == SDL_SCANCODE_END) && enable_endkey) |
1 | pmbaty | 98 | { |
99 | control_status |= CONTROL_END; |
||
100 | control_last = CONTROL_END; |
||
101 | } |
||
7 | pmbaty | 102 | else if (key == SDL_SCANCODE_ESCAPE) |
1 | pmbaty | 103 | { |
104 | control_status |= CONTROL_EXIT; |
||
105 | control_last = CONTROL_EXIT; |
||
106 | } |
||
7 | pmbaty | 107 | else if (key == SDL_SCANCODE_SPACE) |
1 | pmbaty | 108 | { |
109 | control_status |= CONTROL_FIRE; |
||
110 | control_last = CONTROL_FIRE; |
||
111 | } |
||
7 | pmbaty | 112 | else if (key == SDL_SCANCODE_F4) |
1 | pmbaty | 113 | syssnd_toggleMute(); |
7 | pmbaty | 114 | else if (key == SDL_SCANCODE_F5) |
1 | pmbaty | 115 | syssnd_vol(-1); |
7 | pmbaty | 116 | else if (key == SDL_SCANCODE_F6) |
1 | pmbaty | 117 | syssnd_vol(+1); |
7 | pmbaty | 118 | else if (key == SDL_SCANCODE_F7) |
1 | pmbaty | 119 | want_filter ^= TRUE; |
7 | pmbaty | 120 | else if (key == SDL_SCANCODE_F10) |
1 | pmbaty | 121 | { |
122 | control_status &= ~CONTROL_EXIT; |
||
123 | control_last = CONTROL_EXIT; |
||
124 | } |
||
125 | break; |
||
126 | case SDL_KEYUP: |
||
7 | pmbaty | 127 | if (key == SDL_SCANCODE_LALT) |
1 | pmbaty | 128 | alt_pressed = FALSE; |
7 | pmbaty | 129 | else if (key == SDL_SCANCODE_O || key == SDL_SCANCODE_UP) |
1 | pmbaty | 130 | { |
131 | control_status &= ~CONTROL_UP; |
||
132 | control_last = CONTROL_UP; |
||
133 | } |
||
7 | pmbaty | 134 | else if (key == SDL_SCANCODE_K || key == SDL_SCANCODE_DOWN) |
1 | pmbaty | 135 | { |
136 | control_status &= ~CONTROL_DOWN; |
||
137 | control_last = CONTROL_DOWN; |
||
138 | } |
||
7 | pmbaty | 139 | else if (key == SDL_SCANCODE_Z || key == SDL_SCANCODE_LEFT) |
1 | pmbaty | 140 | { |
141 | control_status &= ~CONTROL_LEFT; |
||
142 | control_last = CONTROL_LEFT; |
||
143 | } |
||
7 | pmbaty | 144 | else if (key == SDL_SCANCODE_X || key == SDL_SCANCODE_RIGHT) |
1 | pmbaty | 145 | { |
146 | control_status &= ~CONTROL_RIGHT; |
||
147 | control_last = CONTROL_RIGHT; |
||
148 | } |
||
10 | pmbaty | 149 | else if ((key == SDL_SCANCODE_PAUSE) || (key == SDL_SCANCODE_P)) |
1 | pmbaty | 150 | { |
151 | control_status &= ~CONTROL_PAUSE; |
||
152 | control_last = CONTROL_PAUSE; |
||
153 | } |
||
10 | pmbaty | 154 | else if ((key == SDL_SCANCODE_END) && enable_endkey) |
1 | pmbaty | 155 | { |
156 | control_status &= ~CONTROL_END; |
||
157 | control_last = CONTROL_END; |
||
158 | } |
||
7 | pmbaty | 159 | else if (key == SDL_SCANCODE_ESCAPE) |
1 | pmbaty | 160 | { |
161 | control_status &= ~CONTROL_EXIT; |
||
162 | control_last = CONTROL_EXIT; |
||
163 | } |
||
7 | pmbaty | 164 | else if (key == SDL_SCANCODE_SPACE) |
1 | pmbaty | 165 | { |
166 | control_status &= ~CONTROL_FIRE; |
||
167 | control_last = CONTROL_FIRE; |
||
168 | } |
||
11 | pmbaty | 169 | // cheat codes: |
170 | // 'MEMEPASMAL' -> infinite lives |
||
171 | // 'MATOSGRATOS' -> infinite ammo |
||
172 | { |
||
173 | const char *keyname = SDL_GetScancodeName (key); |
||
174 | character_ringbuffer[character_ringbuffer_index] = toupper (keyname[0]); |
||
175 | character_ringbuffer_index = (character_ringbuffer_index + 1) % 16; |
||
176 | if (has_accumulated ("MEMEPASMAL") || has_accumulated (";E;EPQS;QL")) |
||
177 | { |
||
178 | want_infinitelives = TRUE; |
||
179 | game_lives = 6; |
||
180 | syssnd_play (WAV_DIE, 1); |
||
181 | } |
||
182 | else if (has_accumulated ("MATOSGRATOS") || has_accumulated (";QTOSGRQTOS")) |
||
183 | { |
||
184 | want_infiniteammo = TRUE; |
||
185 | game_bullets = 6; |
||
186 | game_bombs = 6; |
||
187 | syssnd_play (WAV_DIE, 1); |
||
188 | } |
||
189 | } |
||
1 | pmbaty | 190 | break; |
191 | case SDL_QUIT: |
||
192 | /* player tries to close the window -- this is the same as pressing ESC */ |
||
193 | control_status |= CONTROL_EXIT; |
||
194 | control_last = CONTROL_EXIT; |
||
195 | break; |
||
196 | case SDL_JOYAXISMOTION: |
||
197 | if (event.jaxis.axis == 0) |
||
198 | { |
||
199 | /* left-right */ |
||
200 | if (event.jaxis.value < -SYSJOY_RANGE) |
||
201 | { /* left */ |
||
202 | control_status |= CONTROL_LEFT; |
||
203 | control_status &= ~CONTROL_RIGHT; |
||
204 | } |
||
205 | else if (event.jaxis.value > SYSJOY_RANGE) |
||
206 | { /* right */ |
||
207 | control_status |= CONTROL_RIGHT; |
||
208 | control_status &= ~CONTROL_LEFT; |
||
209 | } |
||
210 | else |
||
211 | { /* center */ |
||
212 | control_status &= ~CONTROL_RIGHT; |
||
213 | control_status &= ~CONTROL_LEFT; |
||
214 | } |
||
215 | } |
||
216 | if (event.jaxis.axis == 1) |
||
217 | { |
||
218 | /* up-down */ |
||
219 | if (event.jaxis.value < -SYSJOY_RANGE) |
||
220 | { /* up */ |
||
221 | control_status |= CONTROL_UP; |
||
222 | control_status &= ~CONTROL_DOWN; |
||
223 | } |
||
224 | else if (event.jaxis.value > SYSJOY_RANGE) |
||
225 | { /* down */ |
||
226 | control_status |= CONTROL_DOWN; |
||
227 | control_status &= ~CONTROL_UP; |
||
228 | } |
||
229 | else |
||
230 | { /* center */ |
||
231 | control_status &= ~CONTROL_DOWN; |
||
232 | control_status &= ~CONTROL_UP; |
||
233 | } |
||
234 | } |
||
235 | break; |
||
236 | case SDL_JOYBUTTONDOWN: |
||
237 | control_status |= CONTROL_FIRE; |
||
238 | break; |
||
239 | case SDL_JOYBUTTONUP: |
||
240 | control_status &= ~CONTROL_FIRE; |
||
241 | break; |
||
242 | default: |
||
243 | break; |
||
244 | } |
||
245 | } |
||
246 | |||
247 | |||
248 | /* |
||
249 | * Process events, if any, then return |
||
250 | */ |
||
251 | void sysevt_poll (void) |
||
252 | { |
||
253 | while (SDL_PollEvent (&event)) |
||
254 | processEvent (); |
||
255 | } |
||
256 | |||
257 | |||
258 | /* |
||
259 | * Wait for an event, then process it and return |
||
260 | */ |
||
261 | void sysevt_wait (void) |
||
262 | { |
||
263 | SDL_WaitEvent (&event); |
||
264 | processEvent (); |
||
265 | } |