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 *----------------------------------------------------------*
14 * Letzte Aenderung: 15.06.1995 *
15 ***********************************************************/
27 if (XPending(display)) /* got an event */
31 XNextEvent(display, &event);
36 HandleExposeEvent((XExposeEvent *) &event);
42 HandleButtonEvent((XButtonEvent *) &event);
45 HandleButtonEvent((XButtonEvent *) &event);
48 HandleMotionEvent((XMotionEvent *) &event);
51 HandleKeyEvent((XKeyEvent *) &event);
54 HandleKeyEvent((XKeyEvent *) &event);
57 HandleFocusEvent(FOCUS_IN);
60 HandleFocusEvent(FOCUS_OUT);
66 else /* got no event, but don't be lazy... */
70 if (game_status!=PLAYING)
71 Delay(10000); /* don't use all CPU time when idle */
74 if (game_status==EXITGAME)
79 void ClearEventQueue()
81 while(XPending(display))
85 XNextEvent(display, &event);
90 HandleExposeEvent((XExposeEvent *) &event);
96 button_status = MB_RELEASED;
99 key_status = KEY_RELEASED;
102 HandleFocusEvent(FOCUS_IN);
105 HandleFocusEvent(FOCUS_OUT);
113 void SleepWhileUnmapped()
115 BOOL window_unmapped = TRUE;
117 XAutoRepeatOn(display);
119 while(window_unmapped)
123 XNextEvent(display, &event);
128 HandleExposeEvent((XExposeEvent *) &event);
131 button_status = MB_RELEASED;
134 key_status = KEY_RELEASED;
137 window_unmapped = FALSE;
144 if (game_status==PLAYING)
145 XAutoRepeatOff(display);
148 void HandleExposeEvent(XExposeEvent *event)
150 int x = event->x, y = event->y;
151 int width = event->width, height = event->height;
153 XCopyArea(display,drawto,window,gc, x,y, width,height, x,y);
155 if (direct_draw_on && game_status==PLAYING)
158 int x1 = (x-SX)/TILEX, y1 = (y-SY)/TILEY;
159 int x2 = (x-SX+width)/TILEX, y2 = (y-SY+height)/TILEY;
161 for(xx=0;xx<SCR_FIELDX;xx++)
162 for(yy=0;yy<SCR_FIELDY;yy++)
163 if (xx>=x1 && xx<=x2 && yy>=y1 && yy<=y2)
164 DrawScreenField(xx,yy);
165 DrawLevelElement(JX,JY,EL_SPIELFIGUR);
171 void HandleButtonEvent(XButtonEvent *event)
173 motion_status = FALSE;
175 if (event->type==ButtonPress)
176 button_status = event->button;
178 button_status = MB_RELEASED;
180 HandleButton(event->x, event->y, button_status);
183 void HandleMotionEvent(XMotionEvent *event)
185 motion_status = TRUE;
187 HandleButton(event->x, event->y, button_status);
190 void HandleKeyEvent(XKeyEvent *event)
192 static KeySym old_keycode = 0;
193 int new_keycode = event->keycode;
194 KeySym new_key = XLookupKeysym(event,event->state);
195 int new_key_status = (event->type==KeyPress ? KEY_PRESSED : KEY_RELEASED);
197 if (game_status==PLAYING &&
198 (old_keycode!=new_keycode || key_status!=new_key_status))
200 DigField(0,0,DF_NO_PUSH);
204 if (event->type==KeyPress)
206 key_status = KEY_PRESSED;
208 old_keycode = new_keycode;
210 else if (key_status==KEY_PRESSED && old_keycode==new_keycode)
211 key_status = KEY_RELEASED;
214 void HandleFocusEvent(int focus_status)
216 if (focus_status==FOCUS_OUT)
217 XAutoRepeatOn(display);
218 else if (game_status==PLAYING)
219 XAutoRepeatOff(display);
222 void HandleButton(int mx, int my, int button)
224 static int old_mx = 0, old_my = 0;
236 HandleVideoButtons(mx,my,button);
237 HandleSoundButtons(mx,my,button);
238 HandleGameButtons(mx,my,button);
244 HandleMainMenu(mx,my,0,0,button);
247 HandleTypeName(0,XK_Return);
250 HandleChooseLevel(mx,my,0,0,button);
253 HandleHallOfFame(button);
256 LevelEd(mx,my,button);
259 HandleHelpScreen(button);
262 HandleSetupScreen(mx,my,0,0,button);
267 switch(GameActions(mx,my,button))
270 game_status = MAINMENU;
275 game_status = PLAYING;
292 void HandleKey(KeySym key)
294 static KeySym old_key = 0;
301 if (key==XK_Escape && game_status!=MAINMENU) /* quick quit to MAINMENU */
303 CloseDoor(DOOR_CLOSE_1 | DOOR_NO_DELAY);
304 game_status = MAINMENU;
309 if (game_status==PLAYING && (tape.playing || tape.pausing))
315 HandleTypeName(0,key);
326 if (game_status==MAINMENU)
327 HandleMainMenu(0,0,0,0,MB_MENU_CHOICE);
328 else if (game_status==CHOOSELEVEL)
329 HandleChooseLevel(0,0,0,0,MB_MENU_CHOICE);
330 else if (game_status==SETUP)
331 HandleSetupScreen(0,0,0,0,MB_MENU_CHOICE);
375 if (game_status==MAINMENU)
376 HandleMainMenu(0,0,dx,dy,MB_MENU_MARK);
377 else if (game_status==CHOOSELEVEL)
378 HandleChooseLevel(0,0,dx,dy,MB_MENU_MARK);
379 else if (game_status==SETUP)
380 HandleSetupScreen(0,0,dx,dy,MB_MENU_MARK);
385 HandleHelpScreen(MB_RELEASED);
391 game_status = MAINMENU;
400 LevelNameTyping(key);
404 int mvx = 0, mvy = 0;
405 int sbx = 0, sby = 0;
408 BOOL moved = FALSE, snapped = FALSE, bombed = FALSE;
412 case XK_Left: /* normale Richtungen */
453 case XK_KP_Home: /* Diagonalrichtungen */
458 joy = JOY_UP | JOY_LEFT;
466 joy = JOY_UP | JOY_RIGHT;
474 joy = JOY_DOWN | JOY_LEFT;
476 #ifdef XK_KP_Page_Down
477 case XK_KP_Page_Down:
482 joy = JOY_DOWN | JOY_RIGHT;
484 case XK_S: /* Feld entfernen */
487 joy = JOY_BUTTON_1 | JOY_LEFT;
492 joy = JOY_BUTTON_1 | JOY_RIGHT;
497 joy = JOY_BUTTON_1 | JOY_UP;
502 joy = JOY_BUTTON_1 | JOY_DOWN;
504 case XK_B: /* Bombe legen */
517 moved = MoveFigure(mvx,mvy);
519 snapped = SnapField(sbx,sby);
521 bombed = PlaceBomb();
523 if (tape.recording && (moved || snapped || bombed))
524 TapeRecordAction(joy);
533 void HandleNoXEvent()
537 HandleButton(-1,-1,button_status);
554 if (game_status!=PLAYING)
559 switch(GameActions(0,0,MB_NOT_PRESSED))
562 game_status = MAINMENU;
567 game_status = PLAYING;
585 void HandleJoystick()
587 int joy = Joystick();
588 int left = joy & JOY_LEFT;
589 int right = joy & JOY_RIGHT;
590 int up = joy & JOY_UP;
591 int down = joy & JOY_DOWN;
592 int button = joy & JOY_BUTTON;
593 int button1 = joy & JOY_BUTTON_1;
594 int button2 = joy & JOY_BUTTON_2;
595 int newbutton = (JoystickButton()==JOY_BUTTON_NEW_PRESSED);
597 if (button_status || key_status)
607 static long joystickmove_delay = 0;
609 if (DelayReached(&joystickmove_delay,15) || button)
621 if (game_status==MAINMENU)
622 HandleMainMenu(0,0,dx,dy,newbutton ? MB_MENU_CHOICE : MB_MENU_MARK);
623 else if (game_status==CHOOSELEVEL)
624 HandleChooseLevel(0,0,dx,dy,newbutton ? MB_MENU_CHOICE : MB_MENU_MARK);
625 else if (game_status==SETUP)
626 HandleSetupScreen(0,0,dx,dy,newbutton ? MB_MENU_CHOICE : MB_MENU_MARK);
630 HandleHallOfFame(!newbutton);
633 HandleHelpScreen(!newbutton);
637 int mvx = 0, mvy = 0;
638 BOOL moved = FALSE, snapped = FALSE, bombed = FALSE;
642 joy = TapePlayAction();
644 left = joy & JOY_LEFT;
645 right = joy & JOY_RIGHT;
647 down = joy & JOY_DOWN;
648 button = joy & JOY_BUTTON;
649 button1 = joy & JOY_BUTTON_1;
650 button2 = joy & JOY_BUTTON_2;
652 else if (tape.pausing)
657 DigField(0,0,DF_NO_PUSH);
661 if ((GameOver || LevelSolved) && newbutton)
663 CloseDoor(DOOR_CLOSE_1);
664 game_status = MAINMENU;
679 snapped = SnapField(mvx,mvy);
683 bombed = PlaceBomb();
684 moved = MoveFigure(mvx,mvy);
687 if (tape.recording && (moved || snapped || bombed))
689 if (bombed && !moved)
691 TapeRecordAction(joy);
693 else if (tape.playing && snapped)