1 /***********************************************************
2 * Rocks'n'Diamonds -- McDuffin Strikes Back! *
3 *----------------------------------------------------------*
4 * ©1995 Artsoft Development *
6 * 33659 Bielefeld-Senne *
7 * Telefon: (0521) 493245 *
8 * eMail: aeglos@valinor.owl.de *
9 * aeglos@uni-paderborn.de *
10 * q99492@pbhrzx.uni-paderborn.de *
11 *----------------------------------------------------------*
13 ***********************************************************/
26 if (XPending(display)) /* got an event */
30 XNextEvent(display, &event);
35 HandleExposeEvent((XExposeEvent *) &event);
41 HandleButtonEvent((XButtonEvent *) &event);
44 HandleButtonEvent((XButtonEvent *) &event);
47 HandleMotionEvent((XMotionEvent *) &event);
50 HandleKeyEvent((XKeyEvent *) &event);
53 HandleKeyEvent((XKeyEvent *) &event);
56 HandleFocusEvent(FOCUS_IN);
59 HandleFocusEvent(FOCUS_OUT);
65 else /* got no event, but don't be lazy... */
71 if (game_status!=PLAYING)
72 Delay(10000); /* don't use all CPU time when idle */
75 if (game_status==EXITGAME)
80 void ClearEventQueue()
82 while(XPending(display))
86 XNextEvent(display, &event);
91 HandleExposeEvent((XExposeEvent *) &event);
97 button_status = MB_RELEASED;
100 key_status = KEY_RELEASED;
103 HandleFocusEvent(FOCUS_IN);
106 HandleFocusEvent(FOCUS_OUT);
114 void SleepWhileUnmapped()
116 BOOL window_unmapped = TRUE;
118 XAutoRepeatOn(display);
120 while(window_unmapped)
124 XNextEvent(display, &event);
129 HandleExposeEvent((XExposeEvent *) &event);
132 button_status = MB_RELEASED;
135 key_status = KEY_RELEASED;
138 window_unmapped = FALSE;
145 if (game_status==PLAYING)
146 XAutoRepeatOff(display);
149 void HandleExposeEvent(XExposeEvent *event)
151 int x = event->x, y = event->y;
152 int width = event->width, height = event->height;
154 XCopyArea(display,drawto,window,gc, x,y, width,height, x,y);
156 if (direct_draw_on && game_status==PLAYING)
159 int x1 = (x-SX)/TILEX, y1 = (y-SY)/TILEY;
160 int x2 = (x-SX+width)/TILEX, y2 = (y-SY+height)/TILEY;
162 for(xx=0;xx<SCR_FIELDX;xx++)
163 for(yy=0;yy<SCR_FIELDY;yy++)
164 if (xx>=x1 && xx<=x2 && yy>=y1 && yy<=y2)
165 DrawScreenField(xx,yy);
166 DrawLevelElement(JX,JY,EL_SPIELFIGUR);
172 void HandleButtonEvent(XButtonEvent *event)
174 motion_status = FALSE;
176 if (event->type==ButtonPress)
177 button_status = event->button;
179 button_status = MB_RELEASED;
181 HandleButton(event->x, event->y, button_status);
184 void HandleMotionEvent(XMotionEvent *event)
186 motion_status = TRUE;
188 HandleButton(event->x, event->y, button_status);
191 void HandleKeyEvent(XKeyEvent *event)
193 static KeySym old_keycode = 0;
194 int new_keycode = event->keycode;
195 KeySym new_key = XLookupKeysym(event,event->state);
196 int new_key_status = (event->type==KeyPress ? KEY_PRESSED : KEY_RELEASED);
198 if (game_status==PLAYING &&
199 (old_keycode!=new_keycode || key_status!=new_key_status))
201 DigField(0,0,DF_NO_PUSH);
205 if (event->type==KeyPress)
207 key_status = KEY_PRESSED;
209 old_keycode = new_keycode;
211 else if (key_status==KEY_PRESSED && old_keycode==new_keycode)
212 key_status = KEY_RELEASED;
215 void HandleFocusEvent(int focus_status)
217 if (focus_status==FOCUS_OUT)
218 XAutoRepeatOn(display);
219 else if (game_status==PLAYING)
220 XAutoRepeatOff(display);
223 void HandleButton(int mx, int my, int button)
225 static int old_mx = 0, old_my = 0;
237 HandleVideoButtons(mx,my,button);
238 HandleSoundButtons(mx,my,button);
239 HandleGameButtons(mx,my,button);
245 HandleMainMenu(mx,my,0,0,button);
248 HandleTypeName(0,XK_Return);
251 HandleChooseLevel(mx,my,0,0,button);
254 HandleHallOfFame(button);
257 LevelEd(mx,my,button);
260 HandleHelpScreen(button);
263 HandleSetupScreen(mx,my,0,0,button);
268 switch(GameActions(mx,my,button))
271 game_status = MAINMENU;
276 game_status = PLAYING;
293 void HandleKey(KeySym key)
295 static KeySym old_key = 0;
302 if (key==XK_Escape && game_status!=MAINMENU) /* quick quit to MAINMENU */
304 CloseDoor(DOOR_CLOSE_1 | DOOR_NO_DELAY);
305 game_status = MAINMENU;
310 if (game_status==PLAYING && (tape.playing || tape.pausing))
316 HandleTypeName(0,key);
327 if (game_status==MAINMENU)
328 HandleMainMenu(0,0,0,0,MB_MENU_CHOICE);
329 else if (game_status==CHOOSELEVEL)
330 HandleChooseLevel(0,0,0,0,MB_MENU_CHOICE);
331 else if (game_status==SETUP)
332 HandleSetupScreen(0,0,0,0,MB_MENU_CHOICE);
376 if (game_status==MAINMENU)
377 HandleMainMenu(0,0,dx,dy,MB_MENU_MARK);
378 else if (game_status==CHOOSELEVEL)
379 HandleChooseLevel(0,0,dx,dy,MB_MENU_MARK);
380 else if (game_status==SETUP)
381 HandleSetupScreen(0,0,dx,dy,MB_MENU_MARK);
386 HandleHelpScreen(MB_RELEASED);
392 game_status = MAINMENU;
401 LevelNameTyping(key);
405 int mvx = 0, mvy = 0;
406 int sbx = 0, sby = 0;
409 BOOL moved = FALSE, snapped = FALSE, bombed = FALSE;
413 case XK_Left: /* normale Richtungen */
454 case XK_KP_Home: /* Diagonalrichtungen */
459 joy = JOY_UP | JOY_LEFT;
467 joy = JOY_UP | JOY_RIGHT;
475 joy = JOY_DOWN | JOY_LEFT;
477 #ifdef XK_KP_Page_Down
478 case XK_KP_Page_Down:
483 joy = JOY_DOWN | JOY_RIGHT;
485 case XK_S: /* Feld entfernen */
488 joy = JOY_BUTTON_1 | JOY_LEFT;
493 joy = JOY_BUTTON_1 | JOY_RIGHT;
498 joy = JOY_BUTTON_1 | JOY_UP;
503 joy = JOY_BUTTON_1 | JOY_DOWN;
505 case XK_B: /* Bombe legen */
518 moved = MoveFigure(mvx,mvy);
520 snapped = SnapField(sbx,sby);
522 bombed = PlaceBomb();
524 if (tape.recording && (moved || snapped || bombed))
525 TapeRecordAction(joy);
534 void HandleNoXEvent()
538 HandleButton(-1,-1,button_status);
555 if (game_status!=PLAYING)
560 switch(GameActions(0,0,MB_NOT_PRESSED))
563 game_status = MAINMENU;
568 game_status = PLAYING;
586 void HandleJoystick()
588 int joy = Joystick();
589 int left = joy & JOY_LEFT;
590 int right = joy & JOY_RIGHT;
591 int up = joy & JOY_UP;
592 int down = joy & JOY_DOWN;
593 int button = joy & JOY_BUTTON;
594 int button1 = joy & JOY_BUTTON_1;
595 int button2 = joy & JOY_BUTTON_2;
596 int newbutton = (JoystickButton()==JOY_BUTTON_NEW_PRESSED);
598 if (button_status || key_status)
608 static long joystickmove_delay = 0;
610 if (DelayReached(&joystickmove_delay,15) || button)
622 if (game_status==MAINMENU)
623 HandleMainMenu(0,0,dx,dy,newbutton ? MB_MENU_CHOICE : MB_MENU_MARK);
624 else if (game_status==CHOOSELEVEL)
625 HandleChooseLevel(0,0,dx,dy,newbutton ? MB_MENU_CHOICE : MB_MENU_MARK);
626 else if (game_status==SETUP)
627 HandleSetupScreen(0,0,dx,dy,newbutton ? MB_MENU_CHOICE : MB_MENU_MARK);
631 HandleHallOfFame(!newbutton);
634 HandleHelpScreen(!newbutton);
638 int mvx = 0, mvy = 0;
639 BOOL moved = FALSE, snapped = FALSE, bombed = FALSE;
643 joy = TapePlayAction();
645 left = joy & JOY_LEFT;
646 right = joy & JOY_RIGHT;
648 down = joy & JOY_DOWN;
649 button = joy & JOY_BUTTON;
650 button1 = joy & JOY_BUTTON_1;
651 button2 = joy & JOY_BUTTON_2;
653 else if (tape.pausing)
658 DigField(0,0,DF_NO_PUSH);
662 if (GameOver && newbutton)
664 CloseDoor(DOOR_CLOSE_1);
665 game_status = MAINMENU;
680 snapped = SnapField(mvx,mvy);
684 bombed = PlaceBomb();
685 moved = MoveFigure(mvx,mvy);
688 if (tape.recording && (moved || snapped || bombed))
690 if (bombed && !moved)
692 TapeRecordAction(joy);
694 else if (tape.playing && snapped)