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