X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fevents.c;h=c669e5e7b5d24f189f297768a4c1c116515b31d8;hb=4b0c6356359ee52f98cee8fa578179c6c41d4ef1;hp=4fecf14437dd6b978217d74840d7f6fcc37734d0;hpb=afcc2462852f4f44f50b303d60f02b3c15c15f28;p=rocksndiamonds.git diff --git a/src/events.c b/src/events.c index 4fecf144..c669e5e7 100644 --- a/src/events.c +++ b/src/events.c @@ -13,6 +13,7 @@ ***********************************************************/ #include "events.h" +#include "init.h" #include "screens.h" #include "tools.h" #include "game.h" @@ -54,6 +55,9 @@ void EventLoop(void) case FocusOut: HandleFocusEvent((XFocusChangeEvent *) &event); break; + case ClientMessage: + HandleClientMessageEvent((XClientMessageEvent *) &event); + break; default: break; } @@ -61,12 +65,18 @@ void EventLoop(void) else /* got no event, but don't be lazy... */ { HandleNoXEvent(); - Delay(1000); /* don't use all CPU time when idle */ - } - XSync(display,FALSE); + /* don't use all CPU time when idle; the main loop while playing + has its own synchronization and is CPU friendly, too */ - if (game_status==EXITGAME) + if (game_status != PLAYING) + { + XSync(display, FALSE); + Delay(10000); + } + } + + if (game_status == EXITGAME) return; } } @@ -97,6 +107,9 @@ void ClearEventQueue() case FocusOut: HandleFocusEvent((XFocusChangeEvent *) &event); break; + case ClientMessage: + HandleClientMessageEvent((XClientMessageEvent *) &event); + break; default: break; } @@ -129,6 +142,9 @@ void SleepWhileUnmapped() case MapNotify: window_unmapped = FALSE; break; + case ClientMessage: + HandleClientMessageEvent((XClientMessageEvent *) &event); + break; default: break; } @@ -160,10 +176,17 @@ void HandleExposeEvent(XExposeEvent *event) SetDrawtoField(DRAW_DIRECT); } - if (soft_scrolling_on && game_status==PLAYING) + if (soft_scrolling_on && game_status == PLAYING) + { + int fx = FX, fy = FY; + + fx += (PlayerMovDir & (MV_LEFT|MV_RIGHT) ? ScreenMovPos : 0); + fy += (PlayerMovDir & (MV_UP|MV_DOWN) ? ScreenMovPos : 0); + XCopyArea(display,fieldbuffer,backbuffer,gc, - FX,FY, SXSIZE,SYSIZE, + fx,fy, SXSIZE,SYSIZE, SX,SY); + } XCopyArea(display,drawto,window,gc, x,y, width,height, x,y); @@ -218,6 +241,13 @@ void HandleFocusEvent(XFocusChangeEvent *event) } } +void HandleClientMessageEvent(XClientMessageEvent *event) +{ + if ((event->window == window) && + (event->data.l[0] == XInternAtom(display, "WM_DELETE_WINDOW", FALSE))) + CloseAll(); +} + void HandleButton(int mx, int my, int button) { static int old_mx = 0, old_my = 0; @@ -268,9 +298,6 @@ void HandleButton(int mx, int my, int button) } } -int GameSpeed = 2; -int MoveSpeed = 8; - void HandleKey(KeySym key, int key_status) { int joy = 0; @@ -284,7 +311,9 @@ void HandleKey(KeySym key, int key_status) case XK_KP_Left: #endif case XK_KP_4: +#ifndef MSDOS case XK_J: +#endif case XK_j: joy |= JOY_LEFT; break; @@ -293,7 +322,9 @@ void HandleKey(KeySym key, int key_status) case XK_KP_Right: #endif case XK_KP_6: +#ifndef MSDOS case XK_K: +#endif case XK_k: joy |= JOY_RIGHT; break; @@ -302,7 +333,9 @@ void HandleKey(KeySym key, int key_status) case XK_KP_Up: #endif case XK_KP_8: +#ifndef MSDOS case XK_I: +#endif case XK_i: joy |= JOY_UP; break; @@ -311,7 +344,9 @@ void HandleKey(KeySym key, int key_status) case XK_KP_Down: #endif case XK_KP_2: +#ifndef MSDOS case XK_M: +#endif case XK_m: joy |= JOY_DOWN; break; @@ -339,35 +374,47 @@ void HandleKey(KeySym key, int key_status) case XK_KP_3: joy |= JOY_DOWN | JOY_RIGHT; break; +#ifndef MSDOS case XK_S: /* Feld entfernen */ +#endif case XK_s: joy |= JOY_BUTTON_1 | JOY_LEFT; break; +#ifndef MSDOS case XK_D: +#endif case XK_d: joy |= JOY_BUTTON_1 | JOY_RIGHT; break; +#ifndef MSDOS case XK_E: +#endif case XK_e: joy |= JOY_BUTTON_1 | JOY_UP; break; +#ifndef MSDOS case XK_X: +#endif case XK_x: joy |= JOY_BUTTON_1 | JOY_DOWN; break; case XK_Shift_L: /* Linker Feuerknopf */ +#ifndef MSDOS case XK_Control_L: case XK_Alt_L: case XK_Meta_L: +#endif joy |= JOY_BUTTON_1; break; case XK_Shift_R: /* Rechter Feuerknopf */ +#ifndef MSDOS case XK_Control_R: case XK_Alt_R: case XK_Meta_R: case XK_Mode_switch: case XK_Multi_key: case XK_B: /* (Bombe legen) */ +#endif case XK_b: joy |= JOY_BUTTON_2; break; @@ -500,7 +547,9 @@ void HandleKey(KeySym key, int key_status) printf("ScrollStepSize == %d (1/1)\n", ScrollStepSize); break; +#ifndef MSDOS case XK_Q: +#endif case XK_q: Dynamite = 1000; break; @@ -658,6 +707,7 @@ void HandleJoystick() break; case PLAYING: { + static int player_frame_reset_delay = 0; BOOL moved = FALSE, snapped = FALSE, bombed = FALSE; if (GameOver && newbutton) @@ -673,6 +723,8 @@ void HandleJoystick() if (joy) { + player_frame_reset_delay = 0; + if (button1) snapped = SnapField(dx,dy); else @@ -695,7 +747,8 @@ void HandleJoystick() { DigField(0,0,0,0,DF_NO_PUSH); SnapField(0,0); - PlayerFrame = 0; + if (++player_frame_reset_delay > MoveSpeed) + PlayerFrame = 0; } if (tape.playing && !tape.pausing && !joy && tape.counter