1 /*
2 * Copyright (c) 2000 Mark B. Allan. All rights reserved.
3 *
4 * "Chromium B.S.U." is free software; you can redistribute
5 * it and/or use it and/or modify it under the terms of the
6 * "Clarified Artistic License"
7 */
8
9 #ifdef HAVE_CONFIG_H
10 #include <chromium-bsu-config.h>
11 #endif
12
13 #include "gettext.h"
14
15 #include "MainSDL.h"
16
17 #ifdef USE_SDL
18
19 #include <cstdlib>
20 #include <cstdio>
21 #include <cstring>
22 #include <cmath>
23
24 #include "Config.h"
25
26 #include "Global.h"
27 #include "HeroAircraft.h"
28 #include "MenuGL.h"
29 #include "Audio.h"
30 #include "Ground.h"
31
32 #if SDL_VERSION_ATLEAST(2,0,0)
33 #define SDLK_KP1 SDLK_KP_1
34 #define SDLK_KP2 SDLK_KP_2
35 #define SDLK_KP3 SDLK_KP_3
36 #define SDLK_KP4 SDLK_KP_4
37 #define SDLK_KP5 SDLK_KP_5
38 #define SDLK_KP6 SDLK_KP_6
39 #define SDLK_KP7 SDLK_KP_7
40 #define SDLK_KP8 SDLK_KP_8
41 #define SDLK_KP9 SDLK_KP_9
42 #endif
43
44 //----------------------------------------------------------
process(SDL_Event * event)45 bool MainSDL::process(SDL_Event *event)
46 {
47 Global *game = Global::getInstance();
48 #if 0
49 static int cnt = 0;
50 cnt++;
51 switch( event->type )
52 {
53 case SDL_ACTIVEEVENT: fprintf(stderr, _("%-5d SDL_ACTIVEEVENT \n") , cnt); break;
54 case SDL_KEYDOWN: fprintf(stderr, _("%-5d SDL_KEYDOWN \n") , cnt); break;
55 case SDL_KEYUP: fprintf(stderr, _("%-5d SDL_KEYUP \n") , cnt); break;
56 case SDL_MOUSEMOTION: fprintf(stderr, _("%-5d SDL_MOUSEMOTION \n") , cnt); break;
57 case SDL_MOUSEBUTTONDOWN: fprintf(stderr, _("%-5d SDL_MOUSEBUTTONDOWN \n") , cnt); break;
58 case SDL_MOUSEBUTTONUP: fprintf(stderr, _("%-5d SDL_MOUSEBUTTONUP \n") , cnt); break;
59 case SDL_JOYBUTTONDOWN: fprintf(stderr, _("%-5d SDL_JOYBUTTONDOWN \n") , cnt); break;
60 case SDL_JOYBUTTONUP: fprintf(stderr, _("%-5d SDL_JOYBUTTONUP \n") , cnt); break;
61 default:
62 break;
63 }
64 #endif
65 bool shown, mouse, input, gain = false;
66 switch(event->type)
67 {
68 #if SDL_VERSION_ATLEAST(2,0,0)
69 case SDL_WINDOWEVENT:
70 switch (event->window.event) {
71 case SDL_WINDOWEVENT_RESTORED: shown = true; gain = true; break;
72 case SDL_WINDOWEVENT_MINIMIZED: shown = true; gain = false; break;
73 case SDL_WINDOWEVENT_ENTER: mouse = true; gain = true; break;
74 case SDL_WINDOWEVENT_LEAVE: mouse = true; gain = false; break;
75 case SDL_WINDOWEVENT_FOCUS_GAINED: input = true; gain = true; break;
76 case SDL_WINDOWEVENT_FOCUS_LOST: input = true; gain = false; break;
77 }
78 activation(shown, mouse, input, gain);
79 break;
80 #else
81 case SDL_ACTIVEEVENT:
82 shown = event->active.state & SDL_APPACTIVE ? true : false;
83 mouse = event->active.state & SDL_APPMOUSEFOCUS ? true : false;
84 input = event->active.state & SDL_APPINPUTFOCUS ? true : false;
85 gain = event->active.gain ? true : false;
86 activation(shown, mouse, input, gain);
87 break;
88 #endif
89 case SDL_KEYDOWN:
90 keyDown(event);
91 break;
92 case SDL_KEYUP:
93 keyUp(event);
94 break;
95 case SDL_MOUSEMOTION:
96 mouseMotion(event);
97 break;
98 case SDL_MOUSEBUTTONDOWN:
99 mouseButtonDown(event);
100 break;
101 case SDL_MOUSEBUTTONUP:
102 mouseButtonUp(event);
103 break;
104 // case SDL_JOYAXISMOTION:
105 // joystickMotion(event);
106 // break;
107 case SDL_JOYBUTTONDOWN:
108 joystickButtonDown(event);
109 break;
110 case SDL_JOYBUTTONUP:
111 joystickButtonUp(event);
112 break;
113 case SDL_QUIT:
114 return true;
115 default:
116 break;
117 }
118 return game->game_quit;
119 }
120
121 //----------------------------------------------------------
saveEvent(SDL_Event * event)122 void MainSDL::saveEvent(SDL_Event *event)
123 {
124 Global *game = Global::getInstance();
125 if(game->eventFile && game->gameMode == Global::Game)
126 {
127 #if SDL_VERSION_ATLEAST(2,0,0)
128 SDL_WindowEvent *evW = 0;
129 #else
130 SDL_ActiveEvent *evA = 0;
131 #endif
132 SDL_KeyboardEvent *evK = 0;
133 SDL_MouseMotionEvent *evM = 0;
134 SDL_MouseButtonEvent *evB = 0;
135 switch(event->type)
136 {
137 // case SDL_ACTIVEEVENT:
138 // evA = (SDL_ActiveEvent*)event;
139 // fprintf(game->eventFile, "%9d :%s: %5d %5d %5d %5d %5d %5d\n", game->gameFrame, "A",
140 // (int)evA->type, (int)evA->gain, (int)evA->state, 0, 0, 0);
141 // break;
142 // case SDL_KEYDOWN:
143 // case SDL_KEYUP:
144 // evK = (SDL_KeyboardEvent*)event;
145 // fprintf(game->eventFile, "%9d :%s: %5d %5d %5d %5d %5d %5d\n", game->gameFrame, "K",
146 // (int)evK->type, (int)evK->state,
147 // (int)evK->keysym.scancode, (int)evK->keysym.sym, (int)evK->keysym.mod, (int)evK->keysym.unicode);
148 // break;
149 // case SDL_MOUSEMOTION:
150 // evM = (SDL_MouseMotionEvent*)event;
151 // fprintf(game->eventFile, "%9d :%s: %5d %5d %5d %5d %5d %5d\n", game->gameFrame, "M",
152 // (int)evM->type, (int)evM->state, (int)evM->x, (int)evM->y, (int)evM->xrel, (int)evM->yrel);
153 // break;
154 // case SDL_MOUSEBUTTONDOWN:
155 // case SDL_MOUSEBUTTONUP:
156 // evB = (SDL_MouseButtonEvent*)event;
157 // fprintf(game->eventFile, "%9d :%s: %5d %5d %5d %5d %5d %5d\n", game->gameFrame, "B",
158 // (int)evB->type, (int)evB->button, (int)evB->state, (int)evB->x, (int)evB->y, 0);
159 // break;
160 // default:
161 // break;
162 #if SDL_VERSION_ATLEAST(2,0,0)
163 case SDL_WINDOWEVENT:
164 evW = (SDL_WindowEvent*)event;
165 fprintf(game->eventFile, "%9d :%s: %5d %5d %5d %5d %5d %5d\n", game->gameFrame, "W",
166 evW->type, evW->windowID, evW->event, evW->data1, evW->data2, 0);
167 break;
168 case SDL_KEYDOWN:
169 case SDL_KEYUP:
170 evK = (SDL_KeyboardEvent*)event;
171 fprintf(game->eventFile, "%9d :%s: %5d %5d %5d %5d %5d\n", game->gameFrame, "K",
172 evK->type, evK->state,
173 evK->keysym.scancode, evK->keysym.sym, evK->keysym.mod);
174 break;
175 #else
176 case SDL_ACTIVEEVENT:
177 evA = (SDL_ActiveEvent*)event;
178 fprintf(game->eventFile, "%9d :%s: %5d %5d %5d %5d %5d %5d\n", game->gameFrame, "A",
179 evA->type, evA->gain, evA->state, 0, 0, 0);
180 break;
181 case SDL_KEYDOWN:
182 case SDL_KEYUP:
183 evK = (SDL_KeyboardEvent*)event;
184 fprintf(game->eventFile, "%9d :%s: %5d %5d %5d %5d %5d %5d\n", game->gameFrame, "K",
185 evK->type, evK->state,
186 evK->keysym.scancode, evK->keysym.sym, evK->keysym.mod, evK->keysym.unicode);
187 break;
188 #endif
189 case SDL_MOUSEMOTION:
190 evM = (SDL_MouseMotionEvent*)event;
191 fprintf(game->eventFile, "%9d :%s: %5d %5d %5d %5d %5d %5d\n", game->gameFrame, "M",
192 evM->type, evM->state, evM->x, evM->y, evM->xrel, evM->yrel);
193 break;
194 case SDL_MOUSEBUTTONDOWN:
195 case SDL_MOUSEBUTTONUP:
196 evB = (SDL_MouseButtonEvent*)event;
197 fprintf(game->eventFile, "%9d :%s: %5d %5d %5d %5d %5d %5d\n", game->gameFrame, "B",
198 evB->type, evB->button, evB->state, evB->x, evB->y, 0);
199 break;
200 default:
201 break;
202 }
203 }
204 }
205
206 //----------------------------------------------------------
getEvent(FILE * infile)207 SDL_Event *MainSDL::getEvent(FILE *infile)
208 {
209 Global *game = Global::getInstance();
210 static int count = 0;
211 static SDL_Event ev;
212 static char buffer[256] = { "-1 :K: 2 0 0 0 0 0"};
213 SDL_Event *retVal = 0;
214
215 if(infile)
216 {
217 #if SDL_VERSION_ATLEAST(2,0,0)
218 SDL_WindowEvent *evW = (SDL_WindowEvent*)&ev;
219 #else
220 SDL_ActiveEvent *evA = (SDL_ActiveEvent*)&ev;
221 #endif
222 SDL_KeyboardEvent *evK = (SDL_KeyboardEvent*)&ev;
223 SDL_MouseMotionEvent *evM = (SDL_MouseMotionEvent*)&ev;
224 SDL_MouseButtonEvent *evB = (SDL_MouseButtonEvent*)&ev;
225 int frame;
226 int a,b,c,d,e,f;
227 char t;
228
229 sscanf(buffer, "%d :%c: %d %d %d %d %d %d", &frame, &t, &a, &b, &c, &d, &e, &f);
230 if(frame == game->gameFrame)
231 {
232 switch(t)
233 {
234 #if SDL_VERSION_ATLEAST(2,0,0)
235 case 'W':
236 evW->type = (Uint32)a;
237 evW->windowID = (Uint32)b;
238 evW->event = (Uint8)c;
239 evW->data1 = d;
240 evW->data2 = e;
241 retVal = &ev;
242 break;
243 #else
244 case 'A':
245 evA->type = (Uint8)a;
246 evA->gain = (Uint8)b;
247 evA->state = (Uint8)c;
248 retVal = &ev;
249 break;
250 #endif
251 case 'K':
252 evK->type = (Uint8)a;
253 evK->state = (Uint8)b;
254 #if SDL_VERSION_ATLEAST(2,0,0)
255 evK->keysym.scancode = (SDL_Scancode)c;
256 evK->keysym.sym = (SDL_Keycode)d;
257 evK->keysym.mod = (SDL_Keymod)e;
258 #else
259 evK->keysym.scancode = (Uint8)c;
260 evK->keysym.sym = (SDLKey)d;
261 evK->keysym.mod = (SDLMod)e;
262 evK->keysym.unicode = (Uint16)f;
263 #endif
264 retVal = &ev;
265 break;
266 case 'M':
267 evM->type = (Uint8)a;
268 evM->state = (Uint8)b;
269 evM->x = (Uint16)c;
270 evM->y = (Uint16)d;
271 evM->xrel = (Sint16)e;
272 evM->yrel = (Sint16)f;
273 retVal = &ev;
274 break;
275 case 'B':
276 evB->type = (Uint8)a;
277 evB->button = (Uint8)b;
278 evB->state = (Uint8)c;
279 evB->x = (Uint16)d;
280 evB->y = (Uint16)e;
281 retVal = &ev;
282 break;
283 default:
284 fprintf(stderr, _("MainSDL::getEvent HUH?\n"));
285 break;
286 }
287 count++;
288 }
289 bool ok = true;
290 if(frame <= game->gameFrame)
291 ok = fgets(buffer, 256, infile);
292 if(!ok)
293 {
294 fprintf(stderr, _("buffer = \"%s\n\""), buffer);
295 exit(1);
296 }
297 }
298 return retVal;
299 }
300
301 //----------------------------------------------------------
activation(bool shown,bool mouse,bool input,bool gain)302 void MainSDL::activation(bool shown, bool mouse, bool input, bool gain)
303 {
304 Global *game = Global::getInstance();
305 Config* config = Config::instance();
306 if( config->debug() ) fprintf(stderr, "app %s ", gain ? "gained" : "lost" );
307 bool grab_mouse = game->gameMode == Global::Game && !game->game_pause && gain ? true : false;
308 if ( shown )
309 {
310 grabMouse( grab_mouse, grab_mouse );
311 if( config->debug() ) fprintf(stderr, "app active " );
312 }
313 else if ( mouse )
314 {
315 if( config->debug() ) fprintf(stderr, "mouse active" );
316 SDL_GetMouseState(&xLast, &yLast);
317 }
318 else if ( input )
319 {
320 grabMouse( grab_mouse, grab_mouse );
321 if( config->debug() ) fprintf(stderr, "input active" );
322 }
323 if( config->debug() ) fprintf(stderr, "focus\n" );
324 }
325
326 //----------------------------------------------------------
keyUp(SDL_Event * event)327 void MainSDL::keyUp(SDL_Event *event)
328 {
329 Global *game = Global::getInstance();
330 switch(event->key.keysym.sym)
331 {
332 case SDLK_SPACE:
333 game->hero->fireGun(false);
334 break;
335 default:
336 break;
337 }
338 }
339
340 //----------------------------------------------------------
keyDown(SDL_Event * event)341 void MainSDL::keyDown(SDL_Event *event)
342 {
343 Global *game = Global::getInstance();
344 switch(event->key.keysym.sym)
345 {
346 case SDL_QUIT:
347 case SDLK_q:
348 game->game_quit = true;
349 break;
350 case SDLK_g:
351 grabMouse(!mouseToggle);
352 break;
353 case SDLK_0:
354 game->hero->useItem(0);
355 break;
356 case SDLK_9:
357 game->hero->useItem(1);
358 break;
359 case SDLK_ESCAPE:
360 if(game->gameMode == Global::Menu)
361 {
362 game->gameMode = Global::Game;
363 game->audio->setMusicMode(Audio::MusicGame);
364 grabMouse(!game->game_pause);
365 }
366 else
367 {
368 if(game->gameMode != Global::Game)
369 {
370 game->newGame();
371 }
372 game->gameMode = Global::Menu;
373 game->menu->startMenu();
374 game->audio->setMusicMode(Audio::MusicMenu);
375 grabMouse(false);
376 }
377 break;
378 default:
379 if(game->gameMode == Global::Game)
380 keyDownGame(event);
381 else if(game->gameMode == Global::LevelOver)
382 {
383 game->gotoNextLevel();
384 game->gameMode = Global::Game;
385 game->audio->setMusicMode(Audio::MusicGame);
386 }
387 else if(game->gameMode == Global::HeroDead)
388 {
389 game->gameMode = Global::Game;
390 game->newGame();
391 game->toolkit->grabMouse(true);
392 game->audio->setMusicMode(Audio::MusicGame);
393 }
394 else
395 {
396 MainToolkit::Key key;
397 switch(event->key.keysym.sym)
398 {
399 case SDLK_KP9: case SDLK_KP7: case SDLK_KP8: case SDLK_UP: key = MainToolkit::KeyUp; break;
400 case SDLK_KP1: case SDLK_KP3: case SDLK_KP2: case SDLK_DOWN: key = MainToolkit::KeyDown; break;
401 case SDLK_KP4: case SDLK_LEFT: key = MainToolkit::KeyLeft; break;
402 case SDLK_KP6: case SDLK_RIGHT: key = MainToolkit::KeyRight; break;
403 case SDLK_KP_ENTER: case SDLK_RETURN: key = MainToolkit::KeyEnter; break;
404 case SDLK_KP5: return;
405 default: key = MainToolkit::KeyEnter; break;
406 }
407 game->menu->keyHit(key);
408 }
409 break;
410 }
411 }
412
413 //----------------------------------------------------------
keyDownGame(SDL_Event * event)414 void MainSDL::keyDownGame(SDL_Event *event)
415 {
416 Global *game = Global::getInstance();
417 Config *config = Config::instance();
418 switch(event->key.keysym.sym)
419 {
420 case SDLK_KP_PLUS:
421 case SDLK_QUOTE:
422 game->hero->nextItem();
423 break;
424 case SDLK_KP_ENTER:
425 case SDLK_RETURN:
426 game->hero->useItem();
427 break;
428 case SDLK_PAUSE:
429 case SDLK_p:
430 grabMouse(game->game_pause);
431 game->game_pause = !game->game_pause;
432 game->audio->pauseGameMusic(game->game_pause);
433 break;
434 case SDLK_n:
435 game->audio->nextMusicIndex();
436 break;
437 case SDLK_KP7:
438 key_speed_x -= 5.0;
439 key_speed_y -= 5.0;
440 break;
441 case SDLK_KP9:
442 key_speed_x += 5.0;
443 key_speed_y -= 5.0;
444 break;
445 case SDLK_KP3:
446 key_speed_x += 5.0;
447 key_speed_y += 5.0;
448 break;
449 case SDLK_KP1:
450 key_speed_x -= 5.0;
451 key_speed_y += 5.0;
452 break;
453 case SDLK_KP4:
454 case SDLK_LEFT:
455 key_speed_x -= 5.0;
456 break;
457 case SDLK_KP6:
458 case SDLK_RIGHT:
459 key_speed_x += 5.0;
460 break;
461 case SDLK_KP8:
462 case SDLK_UP:
463 key_speed_y -= 5.0;
464 break;
465 case SDLK_KP2:
466 case SDLK_DOWN:
467 key_speed_y += 5.0;
468 break;
469 case SDLK_SPACE:
470 game->hero->fireGun(true);
471 break;
472 default:
473 if( config->debug() )
474 {
475 fprintf(stderr, _("key '%s' pressed\n"), SDL_GetKeyName(event->key.keysym.sym));
476 fprintf(stderr, _("game->gameFrame = %d\n"), game->gameFrame);
477 }
478 break;
479 }
480 }
481
482 //----------------------------------------------------------
keyMove()483 void MainSDL::keyMove()
484 {
485 Global *game = Global::getInstance();
486 if(game->gameMode == Global::Game){
487 #if SDL_VERSION_ATLEAST(2,0,0)
488 const Uint8 *keystate = SDL_GetKeyboardState(NULL);
489 #define LEFT SDL_SCANCODE_LEFT
490 #define RIGHT SDL_SCANCODE_RIGHT
491 #define UP SDL_SCANCODE_UP
492 #define DOWN SDL_SCANCODE_DOWN
493 #define KP1 SDL_SCANCODE_KP_1
494 #define KP2 SDL_SCANCODE_KP_2
495 #define KP3 SDL_SCANCODE_KP_3
496 #define KP4 SDL_SCANCODE_KP_4
497 #define KP5 SDL_SCANCODE_KP_5
498 #define KP6 SDL_SCANCODE_KP_6
499 #define KP7 SDL_SCANCODE_KP_7
500 #define KP8 SDL_SCANCODE_KP_8
501 #define KP9 SDL_SCANCODE_KP_9
502 #else
503 Uint8 *keystate = SDL_GetKeyState(NULL);
504 #define LEFT SDLK_LEFT
505 #define RIGHT SDLK_RIGHT
506 #define UP SDLK_UP
507 #define DOWN SDLK_DOWN
508 #define KP1 SDLK_KP1
509 #define KP2 SDLK_KP2
510 #define KP3 SDLK_KP3
511 #define KP4 SDLK_KP4
512 #define KP5 SDLK_KP5
513 #define KP6 SDLK_KP6
514 #define KP7 SDLK_KP7
515 #define KP8 SDLK_KP8
516 #define KP9 SDLK_KP9
517 #endif
518 if( keystate[LEFT] || keystate[KP4] ) key_speed_x -= 2.0 + abs(key_speed_x)*0.4;
519 if( keystate[RIGHT] || keystate[KP6] ) key_speed_x += 2.0 + abs(key_speed_x)*0.4;
520 if( keystate[UP] || keystate[KP8] ) key_speed_y -= 2.0 + abs(key_speed_y)*0.4;
521 if( keystate[DOWN] || keystate[KP2] ) key_speed_y += 2.0 + abs(key_speed_y)*0.4;
522 if( keystate[KP7] ){ key_speed_x -= 2.0 + abs(key_speed_x)*0.4; key_speed_y -= 2.0 + abs(key_speed_y)*0.4; }
523 if( keystate[KP9] ){ key_speed_x += 2.0 + abs(key_speed_x)*0.4; key_speed_y -= 2.0 + abs(key_speed_y)*0.4; }
524 if( keystate[KP3] ){ key_speed_x += 2.0 + abs(key_speed_x)*0.4; key_speed_y += 2.0 + abs(key_speed_y)*0.4; }
525 if( keystate[KP1] ){ key_speed_x -= 2.0 + abs(key_speed_x)*0.4; key_speed_y += 2.0 + abs(key_speed_y)*0.4; }
526 //float s = (1.0-game->speedAdj)+(game->speedAdj*0.7);
527 float s = 0.7;
528 key_speed_x *= s;
529 key_speed_y *= s;
530 game->hero->moveEvent(key_speed_x,key_speed_y);
531 }
532 }
533
534 //----------------------------------------------------------
mouseMotion(SDL_Event * event)535 void MainSDL::mouseMotion(SDL_Event *event)
536 {
537 Global *game = Global::getInstance();
538 int xNow;
539 int yNow;
540 int xDiff;
541 int yDiff;
542 if(mouseToggle)
543 {
544 xNow = event->motion.x;
545 yNow = event->motion.y;
546 if(xNow == xMid && yNow == yMid)
547 {
548 // ignore
549 }
550 else
551 {
552 xDiff = xNow - xLast;
553 yDiff = yNow - yLast;
554 if(xDiff || yDiff)
555 {
556 game->hero->moveEvent(xDiff, yDiff);
557 #if SDL_VERSION_ATLEAST(2,0,0)
558 SDL_WarpMouseInWindow(window, xMid, yMid);
559 #else
560 SDL_WarpMouse(xMid, yMid);
561 #endif
562 }
563 }
564 xLast = xNow;
565 yLast = yNow;
566 }
567 }
568
569 //----------------------------------------------------------
mouseButtonDown(SDL_Event * ev)570 void MainSDL::mouseButtonDown(SDL_Event *ev)
571 {
572 Global *game = Global::getInstance();
573 SDL_MouseButtonEvent *mEv = (SDL_MouseButtonEvent*)ev;
574 if(game->gameMode == Global::Game)
575 {
576 switch(mEv->button)
577 {
578 case SDL_BUTTON_LEFT:
579 // game->hero->fireGun(++fire);
580 game->hero->fireGun(true);
581 break;
582 case SDL_BUTTON_MIDDLE:
583 game->hero->nextItem();
584 break;
585 case SDL_BUTTON_RIGHT:
586 game->hero->useItem();
587 break;
588 default:
589 break;
590 }
591 }
592 else if(game->gameMode == Global::HeroDead)
593 {
594 game->menu->keyHit(MainToolkit::KeyEnter);
595 }
596
597 }
598
599 //----------------------------------------------------------
mouseButtonUp(SDL_Event * ev)600 void MainSDL::mouseButtonUp(SDL_Event *ev)
601 {
602 Global *game = Global::getInstance();
603 SDL_MouseButtonEvent *mEv = (SDL_MouseButtonEvent*)ev;
604 if(game->gameMode == Global::Menu)
605 {
606 switch(mEv->button)
607 {
608 case SDL_BUTTON_LEFT:
609 game->menu->mousePress(MainToolkit::Left, mEv->x, mEv->y);
610 break;
611 case SDL_BUTTON_MIDDLE:
612 game->menu->mousePress(MainToolkit::Middle, mEv->x, mEv->y);
613 break;
614 case SDL_BUTTON_RIGHT:
615 game->menu->mousePress(MainToolkit::Right, mEv->x, mEv->y);
616 break;
617 default:
618 break;
619 }
620 }
621 else
622 {
623 switch(mEv->button)
624 {
625 case SDL_BUTTON_LEFT:
626 // game->hero->fireGun(--fire);
627 // game->hero->fireGun(SDL_GetMouseState(NULL, NULL)&SDL_BUTTON(1));
628 game->hero->fireGun(false);
629 break;
630 default:
631 break;
632 }
633 }
634 }
635
636 //----------------------------------------------------------
grabMouse(bool status,bool warpmouse)637 void MainSDL::grabMouse(bool status, bool warpmouse)
638 {
639 Config *config = Config::instance();
640 if( config->debug() ) fprintf(stderr, _("MainSDL::grabMouse(%d)\n"), status);
641
642 mouseToggle = status;
643 if(status)
644 SDL_ShowCursor(0);
645 else
646 SDL_ShowCursor(1);
647 if(!warpmouse)
648 return;
649 xMid = config->screenW()/2;
650 yMid = config->screenH()/2;
651 #if SDL_VERSION_ATLEAST(2,0,0)
652 SDL_WarpMouseInWindow(window, xMid, yMid);
653 #else
654 SDL_WarpMouse(xMid, yMid);
655 #endif
656 xLast = xMid;
657 yLast = yMid;
658 }
659
660 //----------------------------------------------------------
joystickMotion(SDL_Event *)661 void MainSDL::joystickMotion(SDL_Event *)
662 {
663 // static int c = 0;
664 // if( config->debug() ) fprintf(stderr, _("joy %05d : axis(%d), value(%d)\n"), c++, event->jaxis.axis, event->jaxis.value);
665 // int xNow;
666 // int yNow;
667 // int xDiff;
668 // int yDiff;
669 // if(joystickToggle)
670 // {
671 // xNow = event->motion.x;
672 // yNow = event->motion.y;
673 // if(xNow == xMid && yNow == yMid)
674 // {
675 // // ignore
676 // }
677 // else
678 // {
679 // xDiff = xNow - xLast;
680 // yDiff = yNow - yLast;
681 // if(xDiff || yDiff)
682 // {
683 // game->hero->moveEvent(xDiff, yDiff);
684 // SDL_WarpMouse(xMid, yMid);
685 // }
686 // }
687 // xLast = xNow;
688 // yLast = yNow;
689 // }
690 }
691
692 //----------------------------------------------------------
joystickButtonDown(SDL_Event *)693 void MainSDL::joystickButtonDown(SDL_Event *)
694 {
695 Global *game = Global::getInstance();
696 game->hero->fireGun(++fire);
697 }
698
699 //----------------------------------------------------------
joystickButtonUp(SDL_Event *)700 void MainSDL::joystickButtonUp(SDL_Event *)
701 {
702 Global *game = Global::getInstance();
703 game->hero->fireGun(--fire);
704 }
705
706 //----------------------------------------------------------
joystickMove()707 void MainSDL::joystickMove()
708 {
709 #ifdef WITH_JOYSTICK
710 Global *game = Global::getInstance();
711 static int div = 32768/16;
712 if(joystick)
713 {
714 xjoy = SDL_JoystickGetAxis(joystick, 0)/div;
715 yjoy = SDL_JoystickGetAxis(joystick, 1)/div;
716 xjNow = 0.8*xjNow + 0.2*xjoy;
717 yjNow = 0.8*yjNow + 0.2*yjoy;
718 game->hero->moveEvent((int)xjNow, (int)yjNow);
719 }
720 #endif
721 }
722
723 #endif // USE_SDL
724